diff --git a/generators/typescript/sdk/generator/src/SdkGenerator.ts b/generators/typescript/sdk/generator/src/SdkGenerator.ts index fed6e785d4e1..872ec4a0cdcb 100644 --- a/generators/typescript/sdk/generator/src/SdkGenerator.ts +++ b/generators/typescript/sdk/generator/src/SdkGenerator.ts @@ -1216,21 +1216,19 @@ export class SdkGenerator { if (service.endpoints.length === 0) { return; } - let serviceReference = this.referenceConfigBuilder.addSection({ - title: - service.displayName ?? - service.name.fernFilepath.allParts.map((part) => part.pascalCase.unsafeName).join(" ") - }); + const serviceReference = packageId.isRoot + ? this.referenceConfigBuilder.addRootSection() + : this.referenceConfigBuilder.addSection({ + title: + service.displayName ?? + service.name.fernFilepath.allParts.map((part) => part.pascalCase.unsafeName).join(" ") + }); const exportedFilepath = this.sdkClientClassDeclarationReferencer.getExportedFilepath(packageId); exportedFilepath.rootDir = this.relativePackagePath; const serviceFilepath = this.exportsManager.convertExportedFilePathToFilePath(exportedFilepath); for (const endpoint of service.endpoints) { - if (packageId.isRoot) { - serviceReference = this.referenceConfigBuilder.addRootSection(); - } - let examplesForEndpoint: ExampleEndpointCall[] = []; for (const userDefinedExample of endpoint.userSpecifiedExamples) { if (userDefinedExample.example != null) { diff --git a/generators/typescript/sdk/versions.yml b/generators/typescript/sdk/versions.yml index 963f7448961c..1e97fd9086c8 100644 --- a/generators/typescript/sdk/versions.yml +++ b/generators/typescript/sdk/versions.yml @@ -1,4 +1,14 @@ # yaml-language-server: $schema=../../../fern-versions-yml.schema.json +- version: 3.39.2 + changelogEntry: + - summary: | + Fix reference.md generation for APIs with multiple root-level endpoints. + Previously, only the last root endpoint appeared in the reference documentation because `addRootSection()` was called inside the endpoint loop, replacing the root section each time. + The fix moves section creation before the endpoint loop, ensuring all root endpoints are included and removing the empty `##` section header that was being generated. + type: fix + createdAt: "2025-12-10" + irVersion: 62 + - version: 3.39.1 changelogEntry: - summary: | diff --git a/seed/ts-express/alias-extends/core/schemas/builders/primitives/never.ts b/seed/ts-express/alias-extends/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/alias-extends/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/alias-extends/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/alias/core/schemas/builders/primitives/never.ts b/seed/ts-express/alias/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/alias/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/alias/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/any-auth/core/schemas/builders/primitives/never.ts b/seed/ts-express/any-auth/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/any-auth/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/any-auth/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/audiences/core/schemas/builders/primitives/never.ts b/seed/ts-express/audiences/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/audiences/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/audiences/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/basic-auth-environment-variables/core/schemas/builders/primitives/never.ts b/seed/ts-express/basic-auth-environment-variables/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/basic-auth-environment-variables/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/basic-auth-environment-variables/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/basic-auth/core/schemas/builders/primitives/never.ts b/seed/ts-express/basic-auth/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/basic-auth/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/basic-auth/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/bearer-token-environment-variable/core/schemas/builders/primitives/never.ts b/seed/ts-express/bearer-token-environment-variable/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/bearer-token-environment-variable/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/bearer-token-environment-variable/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/circular-references-advanced/core/schemas/builders/primitives/never.ts b/seed/ts-express/circular-references-advanced/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/circular-references-advanced/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/circular-references-advanced/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/circular-references/core/schemas/builders/primitives/never.ts b/seed/ts-express/circular-references/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/circular-references/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/circular-references/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/client-side-params/core/schemas/builders/primitives/never.ts b/seed/ts-express/client-side-params/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/client-side-params/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/client-side-params/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/content-type/core/schemas/builders/primitives/never.ts b/seed/ts-express/content-type/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/content-type/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/content-type/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/cross-package-type-names/core/schemas/builders/primitives/never.ts b/seed/ts-express/cross-package-type-names/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/cross-package-type-names/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/cross-package-type-names/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/empty-clients/core/schemas/builders/primitives/never.ts b/seed/ts-express/empty-clients/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/empty-clients/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/empty-clients/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/error-property/core/schemas/builders/primitives/never.ts b/seed/ts-express/error-property/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/error-property/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/error-property/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/errors/core/schemas/builders/primitives/never.ts b/seed/ts-express/errors/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/errors/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/errors/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/examples/core/schemas/builders/primitives/never.ts b/seed/ts-express/examples/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/examples/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/examples/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/exhaustive/allow-extra-fields/core/schemas/builders/primitives/never.ts b/seed/ts-express/exhaustive/allow-extra-fields/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/exhaustive/allow-extra-fields/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/exhaustive/allow-extra-fields/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/exhaustive/no-custom-config/core/schemas/builders/primitives/never.ts b/seed/ts-express/exhaustive/no-custom-config/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/exhaustive/no-custom-config/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/exhaustive/no-custom-config/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/exhaustive/no-optional-properties/core/schemas/builders/primitives/never.ts b/seed/ts-express/exhaustive/no-optional-properties/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/exhaustive/no-optional-properties/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/exhaustive/no-optional-properties/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/exhaustive/retain-original-casing/core/schemas/builders/primitives/never.ts b/seed/ts-express/exhaustive/retain-original-casing/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/exhaustive/retain-original-casing/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/exhaustive/retain-original-casing/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/exhaustive/test-package-path/test-packagePath/core/schemas/builders/primitives/never.ts b/seed/ts-express/exhaustive/test-package-path/test-packagePath/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/exhaustive/test-package-path/test-packagePath/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/exhaustive/test-package-path/test-packagePath/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/exhaustive/union-utils/core/schemas/builders/primitives/never.ts b/seed/ts-express/exhaustive/union-utils/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/exhaustive/union-utils/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/exhaustive/union-utils/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/extends/core/schemas/builders/primitives/never.ts b/seed/ts-express/extends/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/extends/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/extends/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/extra-properties/core/schemas/builders/primitives/never.ts b/seed/ts-express/extra-properties/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/extra-properties/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/extra-properties/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/folders/core/schemas/builders/primitives/never.ts b/seed/ts-express/folders/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/folders/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/folders/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/header-auth-environment-variable/core/schemas/builders/primitives/never.ts b/seed/ts-express/header-auth-environment-variable/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/header-auth-environment-variable/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/header-auth-environment-variable/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/header-auth/core/schemas/builders/primitives/never.ts b/seed/ts-express/header-auth/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/header-auth/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/header-auth/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/http-head/core/schemas/builders/primitives/never.ts b/seed/ts-express/http-head/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/http-head/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/http-head/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/idempotency-headers/core/schemas/builders/primitives/never.ts b/seed/ts-express/idempotency-headers/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/idempotency-headers/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/idempotency-headers/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/imdb/no-custom-config/core/schemas/builders/primitives/never.ts b/seed/ts-express/imdb/no-custom-config/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/imdb/no-custom-config/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/imdb/no-custom-config/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/imdb/output-compiled/core/schemas/builders/primitives/never.d.ts b/seed/ts-express/imdb/output-compiled/core/schemas/builders/primitives/never.d.ts index c2f2a1399889..a21dd827ef48 100644 --- a/seed/ts-express/imdb/output-compiled/core/schemas/builders/primitives/never.d.ts +++ b/seed/ts-express/imdb/output-compiled/core/schemas/builders/primitives/never.d.ts @@ -1,2 +1,2 @@ -import { type Schema } from "../../Schema.js"; +import { type Schema } from "../../Schema"; export declare const never: () => Schema; diff --git a/seed/ts-express/imdb/output-compiled/core/schemas/builders/primitives/never.js b/seed/ts-express/imdb/output-compiled/core/schemas/builders/primitives/never.js index 441dd886d4d2..bdf25a2465b6 100644 --- a/seed/ts-express/imdb/output-compiled/core/schemas/builders/primitives/never.js +++ b/seed/ts-express/imdb/output-compiled/core/schemas/builders/primitives/never.js @@ -1,9 +1,9 @@ "use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.never = void 0; -const Schema_js_1 = require("../../Schema.js"); -const createIdentitySchemaCreator_js_1 = require("../../utils/createIdentitySchemaCreator.js"); -exports.never = (0, createIdentitySchemaCreator_js_1.createIdentitySchemaCreator)(Schema_js_1.SchemaType.NEVER, (_value, { breadcrumbsPrefix = [] } = {}) => ({ +const Schema_1 = require("../../Schema"); +const createIdentitySchemaCreator_1 = require("../../utils/createIdentitySchemaCreator"); +exports.never = (0, createIdentitySchemaCreator_1.createIdentitySchemaCreator)(Schema_1.SchemaType.NEVER, (_value, { breadcrumbsPrefix = [] } = {}) => ({ ok: false, errors: [ { diff --git a/seed/ts-express/imdb/skip-request-validation/core/schemas/builders/primitives/never.ts b/seed/ts-express/imdb/skip-request-validation/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/imdb/skip-request-validation/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/imdb/skip-request-validation/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/imdb/skip-response-validation/core/schemas/builders/primitives/never.ts b/seed/ts-express/imdb/skip-response-validation/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/imdb/skip-response-validation/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/imdb/skip-response-validation/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/imdb/validation-status-code/core/schemas/builders/primitives/never.ts b/seed/ts-express/imdb/validation-status-code/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/imdb/validation-status-code/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/imdb/validation-status-code/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/inferred-auth-explicit/core/schemas/builders/primitives/never.ts b/seed/ts-express/inferred-auth-explicit/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/inferred-auth-explicit/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/inferred-auth-explicit/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/inferred-auth-implicit-no-expiry/core/schemas/builders/primitives/never.ts b/seed/ts-express/inferred-auth-implicit-no-expiry/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/inferred-auth-implicit-no-expiry/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/inferred-auth-implicit-no-expiry/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/inferred-auth-implicit/core/schemas/builders/primitives/never.ts b/seed/ts-express/inferred-auth-implicit/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/inferred-auth-implicit/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/inferred-auth-implicit/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/license/core/schemas/builders/primitives/never.ts b/seed/ts-express/license/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/license/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/license/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/literal/core/schemas/builders/primitives/never.ts b/seed/ts-express/literal/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/literal/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/literal/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/literals-unions/core/schemas/builders/primitives/never.ts b/seed/ts-express/literals-unions/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/literals-unions/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/literals-unions/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/mixed-case/no-custom-config/core/schemas/builders/primitives/never.ts b/seed/ts-express/mixed-case/no-custom-config/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/mixed-case/no-custom-config/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/mixed-case/no-custom-config/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/mixed-case/retain-original-casing/core/schemas/builders/primitives/never.ts b/seed/ts-express/mixed-case/retain-original-casing/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/mixed-case/retain-original-casing/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/mixed-case/retain-original-casing/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/mixed-file-directory/core/schemas/builders/primitives/never.ts b/seed/ts-express/mixed-file-directory/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/mixed-file-directory/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/mixed-file-directory/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/multi-line-docs/core/schemas/builders/primitives/never.ts b/seed/ts-express/multi-line-docs/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/multi-line-docs/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/multi-line-docs/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/multi-url-environment-no-default/core/schemas/builders/primitives/never.ts b/seed/ts-express/multi-url-environment-no-default/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/multi-url-environment-no-default/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/multi-url-environment-no-default/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/multi-url-environment/core/schemas/builders/primitives/never.ts b/seed/ts-express/multi-url-environment/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/multi-url-environment/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/multi-url-environment/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/no-environment/core/schemas/builders/primitives/never.ts b/seed/ts-express/no-environment/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/no-environment/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/no-environment/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/no-retries/core/schemas/builders/primitives/never.ts b/seed/ts-express/no-retries/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/no-retries/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/no-retries/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/nullable-allof-extends/core/schemas/builders/primitives/never.ts b/seed/ts-express/nullable-allof-extends/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/nullable-allof-extends/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/nullable-allof-extends/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/nullable-optional/core/schemas/builders/primitives/never.ts b/seed/ts-express/nullable-optional/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/nullable-optional/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/nullable-optional/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/nullable-request-body/core/schemas/builders/primitives/never.ts b/seed/ts-express/nullable-request-body/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/nullable-request-body/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/nullable-request-body/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/nullable/core/schemas/builders/primitives/never.ts b/seed/ts-express/nullable/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/nullable/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/nullable/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/oauth-client-credentials-custom/core/schemas/builders/primitives/never.ts b/seed/ts-express/oauth-client-credentials-custom/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/oauth-client-credentials-custom/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/oauth-client-credentials-custom/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/oauth-client-credentials-default/core/schemas/builders/primitives/never.ts b/seed/ts-express/oauth-client-credentials-default/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/oauth-client-credentials-default/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/oauth-client-credentials-default/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/oauth-client-credentials-environment-variables/core/schemas/builders/primitives/never.ts b/seed/ts-express/oauth-client-credentials-environment-variables/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/oauth-client-credentials-environment-variables/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/oauth-client-credentials-environment-variables/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/index.ts new file mode 100644 index 000000000000..3e5335fe4215 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/index.ts @@ -0,0 +1 @@ +export * from "./resources"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/index.ts new file mode 100644 index 000000000000..4593a61f8b42 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/index.ts @@ -0,0 +1,2 @@ +export * from "./service"; +export * from "./types"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/AuthService.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/AuthService.ts new file mode 100644 index 000000000000..4b533eb55886 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/AuthService.ts @@ -0,0 +1,148 @@ +// This file was auto-generated by Fern from our API Definition. + +import express from "express"; +import * as errors from "../../../../errors/index"; +import * as serializers from "../../../../serialization/index"; +import type * as SeedOauthClientCredentialsMandatoryAuth from "../../../index"; + +export interface AuthServiceMethods { + getTokenWithClientCredentials( + req: express.Request< + never, + SeedOauthClientCredentialsMandatoryAuth.TokenResponse, + SeedOauthClientCredentialsMandatoryAuth.GetTokenRequest, + never + >, + res: { + send: (responseBody: SeedOauthClientCredentialsMandatoryAuth.TokenResponse) => Promise; + cookie: (cookie: string, value: string, options?: express.CookieOptions) => void; + locals: any; + }, + next: express.NextFunction, + ): void | Promise; + refreshToken( + req: express.Request< + never, + SeedOauthClientCredentialsMandatoryAuth.TokenResponse, + SeedOauthClientCredentialsMandatoryAuth.RefreshTokenRequest, + never + >, + res: { + send: (responseBody: SeedOauthClientCredentialsMandatoryAuth.TokenResponse) => Promise; + cookie: (cookie: string, value: string, options?: express.CookieOptions) => void; + locals: any; + }, + next: express.NextFunction, + ): void | Promise; +} + +export class AuthService { + private router; + + constructor( + private readonly methods: AuthServiceMethods, + middleware: express.RequestHandler[] = [], + ) { + this.router = express.Router({ mergeParams: true }).use( + express.json({ + strict: false, + }), + ...middleware, + ); + } + + public addMiddleware(handler: express.RequestHandler): this { + this.router.use(handler); + return this; + } + + public toRouter(): express.Router { + this.router.post("/token", async (req, res, next) => { + const request = serializers.GetTokenRequest.parse(req.body); + if (request.ok) { + req.body = request.value; + try { + await this.methods.getTokenWithClientCredentials( + req as any, + { + send: async (responseBody) => { + res.json( + serializers.TokenResponse.jsonOrThrow(responseBody, { + unrecognizedObjectKeys: "strip", + }), + ); + }, + cookie: res.cookie.bind(res), + locals: res.locals, + }, + next, + ); + if (!res.writableEnded) { + next(); + } + } catch (error) { + if (error instanceof errors.SeedOauthClientCredentialsMandatoryAuthError) { + console.warn( + `Endpoint 'getTokenWithClientCredentials' unexpectedly threw ${error.constructor.name}. If this was intentional, please add ${error.constructor.name} to the endpoint's errors list in your Fern Definition.`, + ); + await error.send(res); + } else { + res.status(500).json("Internal Server Error"); + } + next(error); + } + } else { + res.status(422).json({ + errors: request.errors.map( + (error) => `${["request", ...error.path].join(" -> ")}: ${error.message}`, + ), + }); + next(request.errors); + } + }); + this.router.post("/token", async (req, res, next) => { + const request = serializers.RefreshTokenRequest.parse(req.body); + if (request.ok) { + req.body = request.value; + try { + await this.methods.refreshToken( + req as any, + { + send: async (responseBody) => { + res.json( + serializers.TokenResponse.jsonOrThrow(responseBody, { + unrecognizedObjectKeys: "strip", + }), + ); + }, + cookie: res.cookie.bind(res), + locals: res.locals, + }, + next, + ); + if (!res.writableEnded) { + next(); + } + } catch (error) { + if (error instanceof errors.SeedOauthClientCredentialsMandatoryAuthError) { + console.warn( + `Endpoint 'refreshToken' unexpectedly threw ${error.constructor.name}. If this was intentional, please add ${error.constructor.name} to the endpoint's errors list in your Fern Definition.`, + ); + await error.send(res); + } else { + res.status(500).json("Internal Server Error"); + } + next(error); + } + } else { + res.status(422).json({ + errors: request.errors.map( + (error) => `${["request", ...error.path].join(" -> ")}: ${error.message}`, + ), + }); + next(request.errors); + } + }); + return this.router; + } +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/index.ts new file mode 100644 index 000000000000..415726b7fea4 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/index.ts @@ -0,0 +1 @@ +export * from "./requests"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/requests/GetTokenRequest.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/requests/GetTokenRequest.ts new file mode 100644 index 000000000000..97de7e16bfac --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/requests/GetTokenRequest.ts @@ -0,0 +1,9 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface GetTokenRequest { + clientId: string; + clientSecret: string; + audience: "https://api.example.com"; + grantType: "client_credentials"; + scope?: string; +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/requests/RefreshTokenRequest.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/requests/RefreshTokenRequest.ts new file mode 100644 index 000000000000..6ed3b8d62fc6 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/requests/RefreshTokenRequest.ts @@ -0,0 +1,10 @@ +// This file was auto-generated by Fern from our API Definition. + +export interface RefreshTokenRequest { + clientId: string; + clientSecret: string; + refreshToken: string; + audience: "https://api.example.com"; + grantType: "refresh_token"; + scope?: string; +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/requests/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/requests/index.ts new file mode 100644 index 000000000000..a2f7c78eef14 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/service/requests/index.ts @@ -0,0 +1,2 @@ +export { GetTokenRequest } from "./GetTokenRequest"; +export { RefreshTokenRequest } from "./RefreshTokenRequest"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/types/TokenResponse.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/types/TokenResponse.ts new file mode 100644 index 000000000000..e61d1b3e971d --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/types/TokenResponse.ts @@ -0,0 +1,10 @@ +// This file was auto-generated by Fern from our API Definition. + +/** + * An OAuth token response. + */ +export interface TokenResponse { + accessToken: string; + expiresIn: number; + refreshToken?: string; +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/types/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/types/index.ts new file mode 100644 index 000000000000..6848a730c911 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/auth/types/index.ts @@ -0,0 +1 @@ +export * from "./TokenResponse"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/index.ts new file mode 100644 index 000000000000..ada42e134dc5 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/index.ts @@ -0,0 +1,5 @@ +export * as auth from "./auth"; +export * from "./auth/service/requests"; +export * from "./auth/types"; +export * as nested from "./nested"; +export * as simple from "./simple"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/index.ts new file mode 100644 index 000000000000..3e5335fe4215 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/index.ts @@ -0,0 +1 @@ +export * from "./resources"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/api/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/api/index.ts new file mode 100644 index 000000000000..6261f8963643 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/api/index.ts @@ -0,0 +1 @@ +export * from "./service"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/api/service/ApiService.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/api/service/ApiService.ts new file mode 100644 index 000000000000..35353b6ebc12 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/api/service/ApiService.ts @@ -0,0 +1,69 @@ +// This file was auto-generated by Fern from our API Definition. + +import express from "express"; +import * as errors from "../../../../../../errors/index"; + +export interface ApiServiceMethods { + getSomething( + req: express.Request, + res: { + send: () => Promise; + cookie: (cookie: string, value: string, options?: express.CookieOptions) => void; + locals: any; + }, + next: express.NextFunction, + ): void | Promise; +} + +export class ApiService { + private router; + + constructor( + private readonly methods: ApiServiceMethods, + middleware: express.RequestHandler[] = [], + ) { + this.router = express.Router({ mergeParams: true }).use( + express.json({ + strict: false, + }), + ...middleware, + ); + } + + public addMiddleware(handler: express.RequestHandler): this { + this.router.use(handler); + return this; + } + + public toRouter(): express.Router { + this.router.get("/get-something", async (req, res, next) => { + try { + await this.methods.getSomething( + req as any, + { + send: async () => { + res.sendStatus(204); + }, + cookie: res.cookie.bind(res), + locals: res.locals, + }, + next, + ); + if (!res.writableEnded) { + next(); + } + } catch (error) { + if (error instanceof errors.SeedOauthClientCredentialsMandatoryAuthError) { + console.warn( + `Endpoint 'getSomething' unexpectedly threw ${error.constructor.name}. If this was intentional, please add ${error.constructor.name} to the endpoint's errors list in your Fern Definition.`, + ); + await error.send(res); + } else { + res.status(500).json("Internal Server Error"); + } + next(error); + } + }); + return this.router; + } +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/api/service/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/api/service/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/api/service/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/index.ts new file mode 100644 index 000000000000..d7f360220400 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/nested/resources/index.ts @@ -0,0 +1 @@ +export * as api from "./api"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/simple/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/simple/index.ts new file mode 100644 index 000000000000..6261f8963643 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/simple/index.ts @@ -0,0 +1 @@ +export * from "./service"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/simple/service/SimpleService.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/simple/service/SimpleService.ts new file mode 100644 index 000000000000..db7077f27e53 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/simple/service/SimpleService.ts @@ -0,0 +1,69 @@ +// This file was auto-generated by Fern from our API Definition. + +import express from "express"; +import * as errors from "../../../../errors/index"; + +export interface SimpleServiceMethods { + getSomething( + req: express.Request, + res: { + send: () => Promise; + cookie: (cookie: string, value: string, options?: express.CookieOptions) => void; + locals: any; + }, + next: express.NextFunction, + ): void | Promise; +} + +export class SimpleService { + private router; + + constructor( + private readonly methods: SimpleServiceMethods, + middleware: express.RequestHandler[] = [], + ) { + this.router = express.Router({ mergeParams: true }).use( + express.json({ + strict: false, + }), + ...middleware, + ); + } + + public addMiddleware(handler: express.RequestHandler): this { + this.router.use(handler); + return this; + } + + public toRouter(): express.Router { + this.router.get("/get-something", async (req, res, next) => { + try { + await this.methods.getSomething( + req as any, + { + send: async () => { + res.sendStatus(204); + }, + cookie: res.cookie.bind(res), + locals: res.locals, + }, + next, + ); + if (!res.writableEnded) { + next(); + } + } catch (error) { + if (error instanceof errors.SeedOauthClientCredentialsMandatoryAuthError) { + console.warn( + `Endpoint 'getSomething' unexpectedly threw ${error.constructor.name}. If this was intentional, please add ${error.constructor.name} to the endpoint's errors list in your Fern Definition.`, + ); + await error.send(res); + } else { + res.status(500).json("Internal Server Error"); + } + next(error); + } + }); + return this.router; + } +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/simple/service/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/simple/service/index.ts new file mode 100644 index 000000000000..cb0ff5c3b541 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/api/resources/simple/service/index.ts @@ -0,0 +1 @@ +export {}; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/index.ts new file mode 100644 index 000000000000..3ae53c06d387 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/index.ts @@ -0,0 +1 @@ +export * as serialization from "./schemas"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/Schema.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/Schema.ts new file mode 100644 index 000000000000..cce732a2ee12 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/Schema.ts @@ -0,0 +1,103 @@ +import type { SchemaUtils } from "./builders/index"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/bigint/bigint.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/bigint/bigint.ts new file mode 100644 index 000000000000..9d8a63d450eb --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/bigint/bigint.ts @@ -0,0 +1,55 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { getSchemaUtils } from "../schema-utils/index"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/bigint/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/bigint/index.ts new file mode 100644 index 000000000000..e5843043fcbf --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/bigint/index.ts @@ -0,0 +1 @@ +export { bigint } from "./bigint"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/date/date.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/date/date.ts new file mode 100644 index 000000000000..bc507e08539c --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/date/date.ts @@ -0,0 +1,65 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { getSchemaUtils } from "../schema-utils/index"; + +// 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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/date/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/date/index.ts new file mode 100644 index 000000000000..187b29040f6e --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/date/index.ts @@ -0,0 +1 @@ +export { date } from "./date"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/enum/enum.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/enum/enum.ts new file mode 100644 index 000000000000..c2c49a323e1c --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/enum/enum.ts @@ -0,0 +1,43 @@ +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/enum/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/enum/index.ts new file mode 100644 index 000000000000..fe6faed93e3f --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/enum/index.ts @@ -0,0 +1 @@ +export { enum_ } from "./enum"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/index.ts new file mode 100644 index 000000000000..be23de25800d --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/index.ts @@ -0,0 +1,14 @@ +export * from "./bigint/index"; +export * from "./date/index"; +export * from "./enum/index"; +export * from "./lazy/index"; +export * from "./list/index"; +export * from "./literals/index"; +export * from "./object/index"; +export * from "./object-like/index"; +export * from "./primitives/index"; +export * from "./record/index"; +export * from "./schema-utils/index"; +export * from "./set/index"; +export * from "./undiscriminated-union/index"; +export * from "./union/index"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/lazy/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/lazy/index.ts new file mode 100644 index 000000000000..2221abd8806b --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/lazy/index.ts @@ -0,0 +1,3 @@ +export type { SchemaGetter } from "./lazy"; +export { lazy } from "./lazy"; +export { lazyObject } from "./lazyObject"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/lazy/lazy.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/lazy/lazy.ts new file mode 100644 index 000000000000..a72735184f38 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/lazy/lazy.ts @@ -0,0 +1,32 @@ +import type { BaseSchema, Schema } from "../../Schema"; +import { getSchemaUtils } from "../schema-utils/index"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/lazy/lazyObject.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/lazy/lazyObject.ts new file mode 100644 index 000000000000..2a58a2abb203 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/lazy/lazyObject.ts @@ -0,0 +1,20 @@ +import { getObjectUtils } from "../object/index"; +import type { BaseObjectSchema, ObjectSchema } from "../object/types"; +import { getObjectLikeUtils } from "../object-like/index"; +import { getSchemaUtils } from "../schema-utils/index"; +import { constructLazyBaseSchema, getMemoizedSchema, type SchemaGetter } from "./lazy"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/list/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/list/index.ts new file mode 100644 index 000000000000..25f4bcc17377 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/list/index.ts @@ -0,0 +1 @@ +export { list } from "./list"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/list/list.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/list/list.ts new file mode 100644 index 000000000000..7c8fd6e87db9 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/list/list.ts @@ -0,0 +1,73 @@ +import { type BaseSchema, type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { getSchemaUtils } from "../schema-utils/index"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/literals/booleanLiteral.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/literals/booleanLiteral.ts new file mode 100644 index 000000000000..fb06cc00f0de --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/literals/booleanLiteral.ts @@ -0,0 +1,29 @@ +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/literals/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/literals/index.ts new file mode 100644 index 000000000000..ae7389065564 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/literals/index.ts @@ -0,0 +1,2 @@ +export { booleanLiteral } from "./booleanLiteral"; +export { stringLiteral } from "./stringLiteral"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/literals/stringLiteral.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/literals/stringLiteral.ts new file mode 100644 index 000000000000..98fe06223fe4 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/literals/stringLiteral.ts @@ -0,0 +1,29 @@ +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object-like/getObjectLikeUtils.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object-like/getObjectLikeUtils.ts new file mode 100644 index 000000000000..ed96cf771cbb --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object-like/getObjectLikeUtils.ts @@ -0,0 +1,79 @@ +import type { BaseSchema } from "../../Schema"; +import { filterObject } from "../../utils/filterObject"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { isPlainObject } from "../../utils/isPlainObject"; +import { getSchemaUtils } from "../schema-utils/index"; +import type { ObjectLikeSchema, ObjectLikeUtils } from "./types"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object-like/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object-like/index.ts new file mode 100644 index 000000000000..c342e72cf9d1 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object-like/index.ts @@ -0,0 +1,2 @@ +export { getObjectLikeUtils, withParsedProperties } from "./getObjectLikeUtils"; +export type { ObjectLikeSchema, ObjectLikeUtils } from "./types"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object-like/types.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object-like/types.ts new file mode 100644 index 000000000000..a8401d7cf01e --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object-like/types.ts @@ -0,0 +1,13 @@ +import type { BaseSchema, Schema } from "../../Schema"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/index.ts new file mode 100644 index 000000000000..58ce0b48b23c --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/index.ts @@ -0,0 +1,22 @@ +export { getObjectUtils, object } from "./object"; +export type { + inferObjectWithoutOptionalPropertiesSchemaFromPropertySchemas, + inferParsedObjectWithoutOptionalPropertiesFromPropertySchemas, +} from "./objectWithoutOptionalProperties"; +export { objectWithoutOptionalProperties } from "./objectWithoutOptionalProperties"; +export type { Property } from "./property"; +export { isProperty, property } from "./property"; +export type { + BaseObjectSchema, + inferObjectSchemaFromPropertySchemas, + inferParsedObject, + inferParsedObjectFromPropertySchemas, + inferParsedPropertySchema, + inferRawKey, + inferRawObject, + inferRawObjectFromPropertySchemas, + inferRawPropertySchema, + ObjectSchema, + ObjectUtils, + PropertySchemas, +} from "./types"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/object.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/object.ts new file mode 100644 index 000000000000..bdad8076717c --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/object.ts @@ -0,0 +1,382 @@ +import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema"; +import { entries } from "../../utils/entries"; +import { filterObject } from "../../utils/filterObject"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { isPlainObject } from "../../utils/isPlainObject"; +import { keys } from "../../utils/keys"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { partition } from "../../utils/partition"; +import { getObjectLikeUtils } from "../object-like/index"; +import { getSchemaUtils } from "../schema-utils/index"; +import { isProperty } from "./property"; +import type { + BaseObjectSchema, + inferObjectSchemaFromPropertySchemas, + inferParsedObjectFromPropertySchemas, + inferRawObjectFromPropertySchemas, + ObjectSchema, + ObjectUtils, + PropertySchemas, +} from "./types"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/objectWithoutOptionalProperties.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/objectWithoutOptionalProperties.ts new file mode 100644 index 000000000000..bac2e1e1af0f --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/objectWithoutOptionalProperties.ts @@ -0,0 +1,23 @@ +import { object } from "./object"; +import type { + inferParsedPropertySchema, + inferRawObjectFromPropertySchemas, + ObjectSchema, + PropertySchemas, +} from "./types"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/property.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/property.ts new file mode 100644 index 000000000000..ef07c2a7952f --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/property.ts @@ -0,0 +1,23 @@ +import type { Schema } from "../../Schema"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/types.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/types.ts new file mode 100644 index 000000000000..57f87486910a --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/object/types.ts @@ -0,0 +1,73 @@ +import type { BaseSchema, inferParsed, inferRaw, Schema } from "../../Schema"; +import type { addQuestionMarksToNullableProperties } from "../../utils/addQuestionMarksToNullableProperties"; +import type { ObjectLikeUtils } from "../object-like/index"; +import type { SchemaUtils } from "../schema-utils/index"; +import type { Property } from "./property"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/any.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/any.ts new file mode 100644 index 000000000000..0652f8934269 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/any.ts @@ -0,0 +1,7 @@ +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; + +export const any: () => Schema = createIdentitySchemaCreator(SchemaType.ANY, (value) => ({ + ok: true, + value, +})); diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/boolean.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/boolean.ts new file mode 100644 index 000000000000..d90a6924f1fe --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/boolean.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/index.ts new file mode 100644 index 000000000000..a60b5e5ad81c --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/index.ts @@ -0,0 +1,6 @@ +export { any } from "./any"; +export { boolean } from "./boolean"; +export { never } from "./never"; +export { number } from "./number"; +export { string } from "./string"; +export { unknown } from "./unknown"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/never.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/never.ts new file mode 100644 index 000000000000..3de77c3fd7a0 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/never.ts @@ -0,0 +1,15 @@ +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; + +export const never: () => Schema = createIdentitySchemaCreator( + SchemaType.NEVER, + (_value, { breadcrumbsPrefix = [] } = {}) => ({ + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: "Expected never", + }, + ], + }), +); diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/number.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/number.ts new file mode 100644 index 000000000000..8b3b32cdca0c --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/number.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/string.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/string.ts new file mode 100644 index 000000000000..f9f8e4779c1b --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/string.ts @@ -0,0 +1,25 @@ +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/unknown.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/unknown.ts new file mode 100644 index 000000000000..41c9d770b10c --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/primitives/unknown.ts @@ -0,0 +1,7 @@ +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; + +export const unknown: () => Schema = createIdentitySchemaCreator( + SchemaType.UNKNOWN, + (value) => ({ ok: true, value }), +); diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/record/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/record/index.ts new file mode 100644 index 000000000000..82e25c5c2af9 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/record/index.ts @@ -0,0 +1,2 @@ +export { record } from "./record"; +export type { BaseRecordSchema, RecordSchema } from "./types"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/record/record.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/record/record.ts new file mode 100644 index 000000000000..ba5307a6a45c --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/record/record.ts @@ -0,0 +1,129 @@ +import { type MaybeValid, type Schema, SchemaType, type ValidationError } from "../../Schema"; +import { entries } from "../../utils/entries"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { isPlainObject } from "../../utils/isPlainObject"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { getSchemaUtils } from "../schema-utils/index"; +import type { BaseRecordSchema, RecordSchema } from "./types"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/record/types.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/record/types.ts new file mode 100644 index 000000000000..b99bb9d8786b --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/record/types.ts @@ -0,0 +1,17 @@ +import type { BaseSchema } from "../../Schema"; +import type { SchemaUtils } from "../schema-utils/index"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/JsonError.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/JsonError.ts new file mode 100644 index 000000000000..7573c76be2aa --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/JsonError.ts @@ -0,0 +1,9 @@ +import type { ValidationError } from "../../Schema"; +import { stringifyValidationError } from "./stringifyValidationErrors"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/ParseError.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/ParseError.ts new file mode 100644 index 000000000000..f1914b5965e6 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/ParseError.ts @@ -0,0 +1,9 @@ +import type { ValidationError } from "../../Schema"; +import { stringifyValidationError } from "./stringifyValidationErrors"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/getSchemaUtils.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/getSchemaUtils.ts new file mode 100644 index 000000000000..91381a1d6626 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/getSchemaUtils.ts @@ -0,0 +1,181 @@ +import { type BaseSchema, type Schema, type SchemaOptions, SchemaType } from "../../Schema"; +import { JsonError } from "./JsonError"; +import { ParseError } from "./ParseError"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/index.ts new file mode 100644 index 000000000000..9d0eed7ae843 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/index.ts @@ -0,0 +1,4 @@ +export type { SchemaUtils } from "./getSchemaUtils"; +export { getSchemaUtils, optional, transform } from "./getSchemaUtils"; +export { JsonError } from "./JsonError"; +export { ParseError } from "./ParseError"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/stringifyValidationErrors.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/stringifyValidationErrors.ts new file mode 100644 index 000000000000..1066d00384aa --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/schema-utils/stringifyValidationErrors.ts @@ -0,0 +1,8 @@ +import type { ValidationError } from "../../Schema"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/set/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/set/index.ts new file mode 100644 index 000000000000..f3310e8bdade --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/set/index.ts @@ -0,0 +1 @@ +export { set } from "./set"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/set/set.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/set/set.ts new file mode 100644 index 000000000000..bf31bc5fdb43 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/set/set.ts @@ -0,0 +1,43 @@ +import { type BaseSchema, type Schema, SchemaType } from "../../Schema"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { list } from "../list/index"; +import { getSchemaUtils } from "../schema-utils/index"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/undiscriminated-union/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/undiscriminated-union/index.ts new file mode 100644 index 000000000000..75b71cb35656 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/undiscriminated-union/index.ts @@ -0,0 +1,6 @@ +export type { + inferParsedUnidiscriminatedUnionSchema, + inferRawUnidiscriminatedUnionSchema, + UndiscriminatedUnionSchema, +} from "./types"; +export { undiscriminatedUnion } from "./undiscriminatedUnion"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/undiscriminated-union/types.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/undiscriminated-union/types.ts new file mode 100644 index 000000000000..3ef19e2c09e1 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/undiscriminated-union/types.ts @@ -0,0 +1,10 @@ +import type { inferParsed, inferRaw, Schema } from "../../Schema"; + +export type UndiscriminatedUnionSchema = Schema< + inferRawUnidiscriminatedUnionSchema, + inferParsedUnidiscriminatedUnionSchema +>; + +export type inferRawUnidiscriminatedUnionSchema = inferRaw; + +export type inferParsedUnidiscriminatedUnionSchema = inferParsed; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts new file mode 100644 index 000000000000..26ad5f9b9112 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/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"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { getSchemaUtils } from "../schema-utils/index"; +import type { inferParsedUnidiscriminatedUnionSchema, inferRawUnidiscriminatedUnionSchema } from "./types"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/discriminant.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/discriminant.ts new file mode 100644 index 000000000000..73cd62adeba5 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/index.ts new file mode 100644 index 000000000000..22289b66715c --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/index.ts @@ -0,0 +1,10 @@ +export type { Discriminant } from "./discriminant"; +export { discriminant } from "./discriminant"; +export type { + inferParsedDiscriminant, + inferParsedUnion, + inferRawDiscriminant, + inferRawUnion, + UnionSubtypes, +} from "./types"; +export { union } from "./union"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/types.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/types.ts new file mode 100644 index 000000000000..79753436d6cf --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/types.ts @@ -0,0 +1,26 @@ +import type { inferParsedObject, inferRawObject, ObjectSchema } from "../object/index"; +import type { Discriminant } from "./discriminant"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/union.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/union.ts new file mode 100644 index 000000000000..7da4271a27c0 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/builders/union/union.ts @@ -0,0 +1,176 @@ +import { type BaseSchema, type MaybeValid, SchemaType } from "../../Schema"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { isPlainObject } from "../../utils/isPlainObject"; +import { keys } from "../../utils/keys"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { enum_ } from "../enum/index"; +import type { ObjectSchema } from "../object/index"; +import { getObjectLikeUtils, type ObjectLikeSchema } from "../object-like"; +import { getSchemaUtils } from "../schema-utils/index"; +import type { Discriminant } from "./discriminant"; +import type { + inferParsedDiscriminant, + inferParsedUnion, + inferRawDiscriminant, + inferRawUnion, + UnionSubtypes, +} from "./types"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/index.ts new file mode 100644 index 000000000000..60c0b5988d32 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/index.ts @@ -0,0 +1,2 @@ +export * from "./builders/index"; +export type { inferParsed, inferRaw, Schema, SchemaOptions } from "./Schema"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/MaybePromise.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/MaybePromise.ts new file mode 100644 index 000000000000..9cd354b3418e --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/MaybePromise.ts @@ -0,0 +1 @@ +export type MaybePromise = T | Promise; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/addQuestionMarksToNullableProperties.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/addQuestionMarksToNullableProperties.ts new file mode 100644 index 000000000000..59f9e658867b --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/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-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/createIdentitySchemaCreator.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/createIdentitySchemaCreator.ts new file mode 100644 index 000000000000..d299ada74c11 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/createIdentitySchemaCreator.ts @@ -0,0 +1,21 @@ +import { getSchemaUtils } from "../builders/schema-utils/index"; +import type { BaseSchema, MaybeValid, Schema, SchemaOptions, SchemaType } from "../Schema"; +import { maybeSkipValidation } from "./maybeSkipValidation"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/entries.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/entries.ts new file mode 100644 index 000000000000..2d5c93d657ce --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/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-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/filterObject.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/filterObject.ts new file mode 100644 index 000000000000..70527d10013b --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/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-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/getErrorMessageForIncorrectType.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/getErrorMessageForIncorrectType.ts new file mode 100644 index 000000000000..1a5c31027ce9 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/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-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/isPlainObject.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/isPlainObject.ts new file mode 100644 index 000000000000..db82a722c35b --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/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-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/keys.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/keys.ts new file mode 100644 index 000000000000..2e0930e2d70b --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/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-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/maybeSkipValidation.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/maybeSkipValidation.ts new file mode 100644 index 000000000000..70be6478ba43 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/maybeSkipValidation.ts @@ -0,0 +1,38 @@ +import type { BaseSchema, MaybeValid, SchemaOptions } from "../Schema"; + +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-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/partition.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/core/schemas/utils/partition.ts new file mode 100644 index 000000000000..f58d6f3d35f3 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/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-express/oauth-client-credentials-mandatory-auth/errors/SeedOauthClientCredentialsMandatoryAuthError.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/errors/SeedOauthClientCredentialsMandatoryAuthError.ts new file mode 100644 index 000000000000..a9c89758dd9b --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/errors/SeedOauthClientCredentialsMandatoryAuthError.ts @@ -0,0 +1,17 @@ +// This file was auto-generated by Fern from our API Definition. + +import type express from "express"; + +export abstract class SeedOauthClientCredentialsMandatoryAuthError extends Error { + constructor(public readonly errorName?: string) { + super(); + Object.setPrototypeOf(this, new.target.prototype); + if (Error.captureStackTrace) { + Error.captureStackTrace(this, this.constructor); + } + + this.name = this.constructor.name; + } + + public abstract send(res: express.Response): Promise; +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/errors/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/errors/index.ts new file mode 100644 index 000000000000..1e0f31b0f26c --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/errors/index.ts @@ -0,0 +1 @@ +export { SeedOauthClientCredentialsMandatoryAuthError } from "./SeedOauthClientCredentialsMandatoryAuthError"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/index.ts new file mode 100644 index 000000000000..fe2aa29013e7 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/index.ts @@ -0,0 +1,3 @@ +export * as SeedOauthClientCredentialsMandatoryAuth from "./api"; +export { SeedOauthClientCredentialsMandatoryAuthError } from "./errors"; +export { register } from "./register"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/register.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/register.ts new file mode 100644 index 000000000000..578246204464 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/register.ts @@ -0,0 +1,21 @@ +// This file was auto-generated by Fern from our API Definition. + +import type express from "express"; +import type { AuthService } from "./api/resources/auth/service/AuthService"; +import type { ApiService as nested_ApiService } from "./api/resources/nested/resources/api/service/ApiService"; +import type { SimpleService } from "./api/resources/simple/service/SimpleService"; + +export function register( + expressApp: express.Express | express.Router, + services: { + auth: AuthService; + simple: SimpleService; + nested: { + api: nested_ApiService; + }; + }, +): void { + (expressApp as any).use("/", services.auth.toRouter()); + (expressApp as any).use("/nested", services.nested.api.toRouter()); + (expressApp as any).use("/", services.simple.toRouter()); +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/index.ts new file mode 100644 index 000000000000..3e5335fe4215 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/index.ts @@ -0,0 +1 @@ +export * from "./resources"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/index.ts new file mode 100644 index 000000000000..4593a61f8b42 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/index.ts @@ -0,0 +1,2 @@ +export * from "./service"; +export * from "./types"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/index.ts new file mode 100644 index 000000000000..415726b7fea4 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/index.ts @@ -0,0 +1 @@ +export * from "./requests"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/requests/GetTokenRequest.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/requests/GetTokenRequest.ts new file mode 100644 index 000000000000..f73472afe030 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/requests/GetTokenRequest.ts @@ -0,0 +1,26 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedOauthClientCredentialsMandatoryAuth from "../../../../../api/index"; +import * as core from "../../../../../core"; +import type * as serializers from "../../../../index"; + +export const GetTokenRequest: core.serialization.Schema< + serializers.GetTokenRequest.Raw, + SeedOauthClientCredentialsMandatoryAuth.GetTokenRequest +> = core.serialization.object({ + clientId: core.serialization.property("client_id", core.serialization.string()), + clientSecret: core.serialization.property("client_secret", core.serialization.string()), + audience: core.serialization.stringLiteral("https://api.example.com"), + grantType: core.serialization.property("grant_type", core.serialization.stringLiteral("client_credentials")), + scope: core.serialization.string().optional(), +}); + +export declare namespace GetTokenRequest { + export interface Raw { + client_id: string; + client_secret: string; + audience: "https://api.example.com"; + grant_type: "client_credentials"; + scope?: string | null; + } +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/requests/RefreshTokenRequest.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/requests/RefreshTokenRequest.ts new file mode 100644 index 000000000000..cfe416b71721 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/requests/RefreshTokenRequest.ts @@ -0,0 +1,28 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedOauthClientCredentialsMandatoryAuth from "../../../../../api/index"; +import * as core from "../../../../../core"; +import type * as serializers from "../../../../index"; + +export const RefreshTokenRequest: core.serialization.Schema< + serializers.RefreshTokenRequest.Raw, + SeedOauthClientCredentialsMandatoryAuth.RefreshTokenRequest +> = core.serialization.object({ + clientId: core.serialization.property("client_id", core.serialization.string()), + clientSecret: core.serialization.property("client_secret", core.serialization.string()), + refreshToken: core.serialization.property("refresh_token", core.serialization.string()), + audience: core.serialization.stringLiteral("https://api.example.com"), + grantType: core.serialization.property("grant_type", core.serialization.stringLiteral("refresh_token")), + scope: core.serialization.string().optional(), +}); + +export declare namespace RefreshTokenRequest { + export interface Raw { + client_id: string; + client_secret: string; + refresh_token: string; + audience: "https://api.example.com"; + grant_type: "refresh_token"; + scope?: string | null; + } +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/requests/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/requests/index.ts new file mode 100644 index 000000000000..a2f7c78eef14 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/service/requests/index.ts @@ -0,0 +1,2 @@ +export { GetTokenRequest } from "./GetTokenRequest"; +export { RefreshTokenRequest } from "./RefreshTokenRequest"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/types/TokenResponse.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/types/TokenResponse.ts new file mode 100644 index 000000000000..74afe0688af9 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/types/TokenResponse.ts @@ -0,0 +1,22 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedOauthClientCredentialsMandatoryAuth from "../../../../api/index"; +import * as core from "../../../../core"; +import type * as serializers from "../../../index"; + +export const TokenResponse: core.serialization.ObjectSchema< + serializers.TokenResponse.Raw, + SeedOauthClientCredentialsMandatoryAuth.TokenResponse +> = core.serialization.object({ + accessToken: core.serialization.property("access_token", core.serialization.string()), + expiresIn: core.serialization.property("expires_in", core.serialization.number()), + refreshToken: core.serialization.property("refresh_token", core.serialization.string().optional()), +}); + +export declare namespace TokenResponse { + export interface Raw { + access_token: string; + expires_in: number; + refresh_token?: string | null; + } +} diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/types/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/types/index.ts new file mode 100644 index 000000000000..6848a730c911 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/auth/types/index.ts @@ -0,0 +1 @@ +export * from "./TokenResponse"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/index.ts b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/index.ts new file mode 100644 index 000000000000..7d23df42dac1 --- /dev/null +++ b/seed/ts-express/oauth-client-credentials-mandatory-auth/serialization/resources/index.ts @@ -0,0 +1,3 @@ +export * as auth from "./auth"; +export * from "./auth/service/requests"; +export * from "./auth/types"; diff --git a/seed/ts-express/oauth-client-credentials-mandatory-auth/snippet.json b/seed/ts-express/oauth-client-credentials-mandatory-auth/snippet.json new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/seed/ts-express/oauth-client-credentials-nested-root/core/schemas/builders/primitives/never.ts b/seed/ts-express/oauth-client-credentials-nested-root/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/oauth-client-credentials-nested-root/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/oauth-client-credentials-nested-root/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/oauth-client-credentials-with-variables/core/schemas/builders/primitives/never.ts b/seed/ts-express/oauth-client-credentials-with-variables/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/oauth-client-credentials-with-variables/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/oauth-client-credentials-with-variables/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/oauth-client-credentials/core/schemas/builders/primitives/never.ts b/seed/ts-express/oauth-client-credentials/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/oauth-client-credentials/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/oauth-client-credentials/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/object/core/schemas/builders/primitives/never.ts b/seed/ts-express/object/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/object/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/object/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/objects-with-imports/core/schemas/builders/primitives/never.ts b/seed/ts-express/objects-with-imports/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/objects-with-imports/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/objects-with-imports/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/optional/core/schemas/builders/primitives/never.ts b/seed/ts-express/optional/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/optional/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/optional/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/package-yml/core/schemas/builders/primitives/never.ts b/seed/ts-express/package-yml/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/package-yml/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/package-yml/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/pagination-custom/core/schemas/builders/primitives/never.ts b/seed/ts-express/pagination-custom/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/pagination-custom/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/pagination-custom/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/pagination/api/resources/users/service/UsersService.ts b/seed/ts-express/pagination/api/resources/users/service/UsersService.ts index eddd384a659e..d8d66a95ab05 100644 --- a/seed/ts-express/pagination/api/resources/users/service/UsersService.ts +++ b/seed/ts-express/pagination/api/resources/users/service/UsersService.ts @@ -223,6 +223,22 @@ export interface UsersServiceMethods { }, next: express.NextFunction, ): void | Promise; + listWithOptionalData( + req: express.Request< + never, + SeedPagination.ListUsersOptionalDataPaginationResponse, + never, + { + page?: number; + } + >, + res: { + send: (responseBody: SeedPagination.ListUsersOptionalDataPaginationResponse) => Promise; + cookie: (cookie: string, value: string, options?: express.CookieOptions) => void; + locals: any; + }, + next: express.NextFunction, + ): void | Promise; } export class UsersService { @@ -684,6 +700,38 @@ export class UsersService { next(error); } }); + this.router.get("/optional-data", async (req, res, next) => { + try { + await this.methods.listWithOptionalData( + req as any, + { + send: async (responseBody) => { + res.json( + serializers.ListUsersOptionalDataPaginationResponse.jsonOrThrow(responseBody, { + unrecognizedObjectKeys: "strip", + }), + ); + }, + cookie: res.cookie.bind(res), + locals: res.locals, + }, + next, + ); + if (!res.writableEnded) { + next(); + } + } catch (error) { + if (error instanceof errors.SeedPaginationError) { + console.warn( + `Endpoint 'listWithOptionalData' unexpectedly threw ${error.constructor.name}. If this was intentional, please add ${error.constructor.name} to the endpoint's errors list in your Fern Definition.`, + ); + await error.send(res); + } else { + res.status(500).json("Internal Server Error"); + } + next(error); + } + }); return this.router; } } diff --git a/seed/ts-express/pagination/api/resources/users/types/ListUsersOptionalDataPaginationResponse.ts b/seed/ts-express/pagination/api/resources/users/types/ListUsersOptionalDataPaginationResponse.ts new file mode 100644 index 000000000000..112431df2ba2 --- /dev/null +++ b/seed/ts-express/pagination/api/resources/users/types/ListUsersOptionalDataPaginationResponse.ts @@ -0,0 +1,11 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedPagination from "../../../index"; + +export interface ListUsersOptionalDataPaginationResponse { + hasNextPage?: boolean; + page?: SeedPagination.Page; + /** The totall number of /users */ + totalCount: number; + data?: SeedPagination.User[]; +} diff --git a/seed/ts-express/pagination/api/resources/users/types/index.ts b/seed/ts-express/pagination/api/resources/users/types/index.ts index 75c3e7ad50a5..c2e82073fe17 100644 --- a/seed/ts-express/pagination/api/resources/users/types/index.ts +++ b/seed/ts-express/pagination/api/resources/users/types/index.ts @@ -1,6 +1,7 @@ export * from "./ListUsersExtendedOptionalListResponse"; export * from "./ListUsersExtendedResponse"; export * from "./ListUsersMixedTypePaginationResponse"; +export * from "./ListUsersOptionalDataPaginationResponse"; export * from "./ListUsersPaginationResponse"; export * from "./NextPage"; export * from "./Order"; diff --git a/seed/ts-express/pagination/core/schemas/builders/primitives/never.ts b/seed/ts-express/pagination/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/pagination/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/pagination/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/pagination/serialization/resources/users/types/ListUsersOptionalDataPaginationResponse.ts b/seed/ts-express/pagination/serialization/resources/users/types/ListUsersOptionalDataPaginationResponse.ts new file mode 100644 index 000000000000..a411f5408d6d --- /dev/null +++ b/seed/ts-express/pagination/serialization/resources/users/types/ListUsersOptionalDataPaginationResponse.ts @@ -0,0 +1,24 @@ +// This file was auto-generated by Fern from our API Definition. + +import type * as SeedPagination from "../../../../api/index"; +import * as core from "../../../../core"; +import * as serializers from "../../../index"; + +export const ListUsersOptionalDataPaginationResponse: core.serialization.ObjectSchema< + serializers.ListUsersOptionalDataPaginationResponse.Raw, + SeedPagination.ListUsersOptionalDataPaginationResponse +> = core.serialization.object({ + hasNextPage: core.serialization.boolean().optional(), + page: core.serialization.lazyObject(() => serializers.Page).optional(), + totalCount: core.serialization.property("total_count", core.serialization.number()), + data: core.serialization.list(core.serialization.lazyObject(() => serializers.User)).optional(), +}); + +export declare namespace ListUsersOptionalDataPaginationResponse { + export interface Raw { + hasNextPage?: boolean | null; + page?: serializers.Page.Raw | null; + total_count: number; + data?: serializers.User.Raw[] | null; + } +} diff --git a/seed/ts-express/pagination/serialization/resources/users/types/index.ts b/seed/ts-express/pagination/serialization/resources/users/types/index.ts index 75c3e7ad50a5..c2e82073fe17 100644 --- a/seed/ts-express/pagination/serialization/resources/users/types/index.ts +++ b/seed/ts-express/pagination/serialization/resources/users/types/index.ts @@ -1,6 +1,7 @@ export * from "./ListUsersExtendedOptionalListResponse"; export * from "./ListUsersExtendedResponse"; export * from "./ListUsersMixedTypePaginationResponse"; +export * from "./ListUsersOptionalDataPaginationResponse"; export * from "./ListUsersPaginationResponse"; export * from "./NextPage"; export * from "./Order"; diff --git a/seed/ts-express/path-parameters/core/schemas/builders/primitives/never.ts b/seed/ts-express/path-parameters/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/path-parameters/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/path-parameters/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/property-access/core/schemas/builders/primitives/never.ts b/seed/ts-express/property-access/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/property-access/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/property-access/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/query-parameters-openapi-as-objects/core/schemas/builders/primitives/never.ts b/seed/ts-express/query-parameters-openapi-as-objects/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/query-parameters-openapi-as-objects/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/query-parameters-openapi-as-objects/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/query-parameters-openapi/core/schemas/builders/primitives/never.ts b/seed/ts-express/query-parameters-openapi/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/query-parameters-openapi/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/query-parameters-openapi/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/query-parameters/core/schemas/builders/primitives/never.ts b/seed/ts-express/query-parameters/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/query-parameters/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/query-parameters/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/request-parameters/core/schemas/builders/primitives/never.ts b/seed/ts-express/request-parameters/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/request-parameters/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/request-parameters/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/required-nullable/core/schemas/builders/primitives/never.ts b/seed/ts-express/required-nullable/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/required-nullable/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/required-nullable/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/reserved-keywords/core/schemas/builders/primitives/never.ts b/seed/ts-express/reserved-keywords/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/reserved-keywords/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/reserved-keywords/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/response-property/core/schemas/builders/primitives/never.ts b/seed/ts-express/response-property/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/response-property/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/response-property/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/simple-api/core/schemas/builders/primitives/never.ts b/seed/ts-express/simple-api/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/simple-api/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/simple-api/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/simple-fhir/core/schemas/builders/primitives/never.ts b/seed/ts-express/simple-fhir/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/simple-fhir/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/simple-fhir/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/single-url-environment-default/core/schemas/builders/primitives/never.ts b/seed/ts-express/single-url-environment-default/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/single-url-environment-default/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/single-url-environment-default/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/single-url-environment-no-default/core/schemas/builders/primitives/never.ts b/seed/ts-express/single-url-environment-no-default/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/single-url-environment-no-default/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/single-url-environment-no-default/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/trace/no-custom-config/core/schemas/builders/primitives/never.ts b/seed/ts-express/trace/no-custom-config/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/trace/no-custom-config/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/trace/no-custom-config/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/ts-express-casing/no-custom-config/core/schemas/builders/primitives/never.ts b/seed/ts-express/ts-express-casing/no-custom-config/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/ts-express-casing/no-custom-config/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/ts-express-casing/no-custom-config/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/ts-inline-types/core/schemas/builders/primitives/never.ts b/seed/ts-express/ts-inline-types/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/ts-inline-types/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/ts-inline-types/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/undiscriminated-union-with-response-property/core/schemas/builders/primitives/never.ts b/seed/ts-express/undiscriminated-union-with-response-property/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/undiscriminated-union-with-response-property/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/undiscriminated-union-with-response-property/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/undiscriminated-unions/core/schemas/builders/primitives/never.ts b/seed/ts-express/undiscriminated-unions/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/undiscriminated-unions/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/undiscriminated-unions/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/unions-with-local-date/core/schemas/builders/primitives/never.ts b/seed/ts-express/unions-with-local-date/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/unions-with-local-date/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/unions-with-local-date/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/unions/core/schemas/builders/primitives/never.ts b/seed/ts-express/unions/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/unions/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/unions/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/unknown/core/schemas/builders/primitives/never.ts b/seed/ts-express/unknown/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/unknown/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/unknown/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/url-form-encoded/core/schemas/builders/primitives/never.ts b/seed/ts-express/url-form-encoded/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/url-form-encoded/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/url-form-encoded/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/validation/core/schemas/builders/primitives/never.ts b/seed/ts-express/validation/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/validation/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/validation/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/version-no-default/core/schemas/builders/primitives/never.ts b/seed/ts-express/version-no-default/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/version-no-default/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/version-no-default/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/version/core/schemas/builders/primitives/never.ts b/seed/ts-express/version/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/version/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/version/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/websocket-bearer-auth/core/schemas/builders/primitives/never.ts b/seed/ts-express/websocket-bearer-auth/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/websocket-bearer-auth/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/websocket-bearer-auth/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/websocket-inferred-auth/core/schemas/builders/primitives/never.ts b/seed/ts-express/websocket-inferred-auth/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/websocket-inferred-auth/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/websocket-inferred-auth/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-express/websocket/core/schemas/builders/primitives/never.ts b/seed/ts-express/websocket/core/schemas/builders/primitives/never.ts index 91f85d74c01b..3de77c3fd7a0 100644 --- a/seed/ts-express/websocket/core/schemas/builders/primitives/never.ts +++ b/seed/ts-express/websocket/core/schemas/builders/primitives/never.ts @@ -1,5 +1,5 @@ -import { type Schema, SchemaType } from "../../Schema.js"; -import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator.js"; +import { type Schema, SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; export const never: () => Schema = createIdentitySchemaCreator( SchemaType.NEVER, diff --git a/seed/ts-sdk/alias-extends/reference.md b/seed/ts-sdk/alias-extends/reference.md index e8a2c51d61ea..f42c2f0696b2 100644 --- a/seed/ts-sdk/alias-extends/reference.md +++ b/seed/ts-sdk/alias-extends/reference.md @@ -50,5 +50,3 @@ await client.extendedInlineRequestBody({ - -## \ No newline at end of file diff --git a/seed/ts-sdk/alias/reference.md b/seed/ts-sdk/alias/reference.md index 05186e52c635..5d647df4cfaa 100644 --- a/seed/ts-sdk/alias/reference.md +++ b/seed/ts-sdk/alias/reference.md @@ -47,5 +47,3 @@ await client.get("typeId"); - -## \ No newline at end of file diff --git a/seed/ts-sdk/examples/examples-with-api-reference/reference.md b/seed/ts-sdk/examples/examples-with-api-reference/reference.md index 732c2f00a272..ecb4c196d071 100644 --- a/seed/ts-sdk/examples/examples-with-api-reference/reference.md +++ b/seed/ts-sdk/examples/examples-with-api-reference/reference.md @@ -1,4 +1,53 @@ # Reference +

client.echo({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.echo("Hello world!\\n\\nwith\\n\\tnewlines"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `SeedExamplesClient.RequestOptions` + +
+
+
+
+ + +
+
+
+
client.createType({ ...params }) -> SeedExamples.Identifier
@@ -48,7 +97,6 @@ await client.createType("primitive");
-## ## File Notification Service
client.file.notification.service.getException(notificationId) -> SeedExamples.Exception
diff --git a/seed/ts-sdk/examples/retain-original-casing/reference.md b/seed/ts-sdk/examples/retain-original-casing/reference.md index 732c2f00a272..ecb4c196d071 100644 --- a/seed/ts-sdk/examples/retain-original-casing/reference.md +++ b/seed/ts-sdk/examples/retain-original-casing/reference.md @@ -1,4 +1,53 @@ # Reference +
client.echo({ ...params }) -> string +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.echo("Hello world!\\n\\nwith\\n\\tnewlines"); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `string` + +
+
+ +
+
+ +**requestOptions:** `SeedExamplesClient.RequestOptions` + +
+
+
+
+ + +
+
+
+
client.createType({ ...params }) -> SeedExamples.Identifier
@@ -48,7 +97,6 @@ await client.createType("primitive");
-## ## File Notification Service
client.file.notification.service.getException(notificationId) -> SeedExamples.Exception
diff --git a/seed/ts-sdk/extends/reference.md b/seed/ts-sdk/extends/reference.md index 3cbf34fa99f9..63dbea7b9ab3 100644 --- a/seed/ts-sdk/extends/reference.md +++ b/seed/ts-sdk/extends/reference.md @@ -51,5 +51,3 @@ await client.extendedInlineRequestBody({
- -## \ No newline at end of file diff --git a/seed/ts-sdk/folders/reference.md b/seed/ts-sdk/folders/reference.md index cbffd9378d0a..37e67dbdd1e0 100644 --- a/seed/ts-sdk/folders/reference.md +++ b/seed/ts-sdk/folders/reference.md @@ -40,7 +40,6 @@ await client.foo();
-## ## A B
client.a.b.foo() -> void
diff --git a/seed/ts-sdk/license/reference.md b/seed/ts-sdk/license/reference.md index e4653b8030cf..09876b67f328 100644 --- a/seed/ts-sdk/license/reference.md +++ b/seed/ts-sdk/license/reference.md @@ -39,5 +39,3 @@ await client.get();
- -## \ No newline at end of file diff --git a/seed/ts-sdk/multiple-request-bodies/reference.md b/seed/ts-sdk/multiple-request-bodies/reference.md index d099151c4667..3e0f6abb8c7f 100644 --- a/seed/ts-sdk/multiple-request-bodies/reference.md +++ b/seed/ts-sdk/multiple-request-bodies/reference.md @@ -1,2 +1,49 @@ # Reference -## \ No newline at end of file +
client.uploadJsonDocument({ ...params }) -> SeedApi.UploadDocumentResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.uploadJsonDocument(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedApi.UploadDocumentRequest` + +
+
+ +
+
+ +**requestOptions:** `SeedApiClient.RequestOptions` + +
+
+
+
+ + +
+
+
diff --git a/seed/ts-sdk/nullable-allof-extends/reference.md b/seed/ts-sdk/nullable-allof-extends/reference.md index 2ffe4847129c..818795f0ee0b 100644 --- a/seed/ts-sdk/nullable-allof-extends/reference.md +++ b/seed/ts-sdk/nullable-allof-extends/reference.md @@ -1,4 +1,59 @@ # Reference +
client.getTest() -> SeedApi.RootObject +
+
+ +#### 📝 Description + +
+
+ +
+
+ +Returns a RootObject which inherits from a nullable schema. +
+
+
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.getTest(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `SeedApiClient.RequestOptions` + +
+
+
+
+ + +
+
+
+
client.createTest({ ...params }) -> SeedApi.RootObject
@@ -61,5 +116,3 @@ await client.createTest({});
- -## \ No newline at end of file diff --git a/seed/ts-sdk/package-yml/reference.md b/seed/ts-sdk/package-yml/reference.md index 909e7711afd6..710f7e6e2fe2 100644 --- a/seed/ts-sdk/package-yml/reference.md +++ b/seed/ts-sdk/package-yml/reference.md @@ -51,7 +51,6 @@ await client.echo({ -## ## Service
client.service.nop(nestedId) -> void
diff --git a/seed/ts-sdk/property-access/generate-read-write-only-types/reference.md b/seed/ts-sdk/property-access/generate-read-write-only-types/reference.md index e27f26d44d10..03a399290c11 100644 --- a/seed/ts-sdk/property-access/generate-read-write-only-types/reference.md +++ b/seed/ts-sdk/property-access/generate-read-write-only-types/reference.md @@ -54,5 +54,3 @@ await client.createUser({
- -## \ No newline at end of file diff --git a/seed/ts-sdk/property-access/no-custom-config/reference.md b/seed/ts-sdk/property-access/no-custom-config/reference.md index 8877605b0d7c..ababa8cbd566 100644 --- a/seed/ts-sdk/property-access/no-custom-config/reference.md +++ b/seed/ts-sdk/property-access/no-custom-config/reference.md @@ -58,5 +58,3 @@ await client.createUser({ - -## \ No newline at end of file diff --git a/seed/ts-sdk/query-parameters-openapi-as-objects/reference.md b/seed/ts-sdk/query-parameters-openapi-as-objects/reference.md index 5e27b13db101..83984be4797a 100644 --- a/seed/ts-sdk/query-parameters-openapi-as-objects/reference.md +++ b/seed/ts-sdk/query-parameters-openapi-as-objects/reference.md @@ -90,5 +90,3 @@ await client.search({ - -## \ No newline at end of file diff --git a/seed/ts-sdk/query-parameters-openapi/reference.md b/seed/ts-sdk/query-parameters-openapi/reference.md index 5e27b13db101..83984be4797a 100644 --- a/seed/ts-sdk/query-parameters-openapi/reference.md +++ b/seed/ts-sdk/query-parameters-openapi/reference.md @@ -90,5 +90,3 @@ await client.search({ - -## \ No newline at end of file diff --git a/seed/ts-sdk/required-nullable/reference.md b/seed/ts-sdk/required-nullable/reference.md index 0c143b2b53fe..1e3ddbce6e96 100644 --- a/seed/ts-sdk/required-nullable/reference.md +++ b/seed/ts-sdk/required-nullable/reference.md @@ -1,4 +1,56 @@ # Reference +
client.getFoo({ ...params }) -> SeedApi.Foo +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.getFoo({ + required_baz: "required_baz", + required_nullable_baz: "required_nullable_baz" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedApi.GetFooRequest` + +
+
+ +
+
+ +**requestOptions:** `SeedApiClient.RequestOptions` + +
+
+
+
+ + +
+
+
+
client.updateFoo(id, { ...params }) -> SeedApi.Foo
@@ -60,5 +112,3 @@ await client.updateFoo("id", {
- -## \ No newline at end of file diff --git a/seed/ts-sdk/simple-fhir/reference.md b/seed/ts-sdk/simple-fhir/reference.md index f9ba6f044fb9..c6b29ae45af5 100644 --- a/seed/ts-sdk/simple-fhir/reference.md +++ b/seed/ts-sdk/simple-fhir/reference.md @@ -47,5 +47,3 @@ await client.getAccount("account_id"); - -## \ No newline at end of file diff --git a/seed/ts-sdk/ts-inline-types/inline/reference.md b/seed/ts-sdk/ts-inline-types/inline/reference.md index abbf60cffa6f..5e5ed1b4a8d2 100644 --- a/seed/ts-sdk/ts-inline-types/inline/reference.md +++ b/seed/ts-sdk/ts-inline-types/inline/reference.md @@ -1,4 +1,122 @@ # Reference +
client.getRoot({ ...params }) -> SeedObject.RootType1 +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.getRoot({ + bar: { + foo: "foo" + }, + foo: "foo" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedObject.PostRootRequest` + +
+
+ +
+
+ +**requestOptions:** `SeedObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.getDiscriminatedUnion({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.getDiscriminatedUnion({ + bar: { + type: "type1", + foo: "foo", + bar: { + foo: "foo", + ref: { + foo: "foo" + } + }, + ref: { + foo: "foo" + } + }, + foo: "foo" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedObject.GetDiscriminatedUnionRequest` + +
+
+ +
+
+ +**requestOptions:** `SeedObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+
client.getUndiscriminatedUnion({ ...params }) -> void
@@ -61,5 +179,3 @@ await client.getUndiscriminatedUnion({
- -## \ No newline at end of file diff --git a/seed/ts-sdk/ts-inline-types/no-inline/reference.md b/seed/ts-sdk/ts-inline-types/no-inline/reference.md index abbf60cffa6f..5e5ed1b4a8d2 100644 --- a/seed/ts-sdk/ts-inline-types/no-inline/reference.md +++ b/seed/ts-sdk/ts-inline-types/no-inline/reference.md @@ -1,4 +1,122 @@ # Reference +
client.getRoot({ ...params }) -> SeedObject.RootType1 +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.getRoot({ + bar: { + foo: "foo" + }, + foo: "foo" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedObject.PostRootRequest` + +
+
+ +
+
+ +**requestOptions:** `SeedObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+ +
client.getDiscriminatedUnion({ ...params }) -> void +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.getDiscriminatedUnion({ + bar: { + type: "type1", + foo: "foo", + bar: { + foo: "foo", + ref: { + foo: "foo" + } + }, + ref: { + foo: "foo" + } + }, + foo: "foo" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedObject.GetDiscriminatedUnionRequest` + +
+
+ +
+
+ +**requestOptions:** `SeedObjectClient.RequestOptions` + +
+
+
+
+ + +
+
+
+
client.getUndiscriminatedUnion({ ...params }) -> void
@@ -61,5 +179,3 @@ await client.getUndiscriminatedUnion({
- -## \ No newline at end of file diff --git a/seed/ts-sdk/undiscriminated-union-with-response-property/reference.md b/seed/ts-sdk/undiscriminated-union-with-response-property/reference.md index 050dd415ca2e..7c09bece2f36 100644 --- a/seed/ts-sdk/undiscriminated-union-with-response-property/reference.md +++ b/seed/ts-sdk/undiscriminated-union-with-response-property/reference.md @@ -1,4 +1,45 @@ # Reference +
client.getUnion() -> SeedUndiscriminatedUnionWithResponseProperty.UnionResponse +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.getUnion(); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**requestOptions:** `SeedUndiscriminatedUnionWithResponsePropertyClient.RequestOptions` + +
+
+
+
+ + +
+
+
+
client.listUnions() -> SeedUndiscriminatedUnionWithResponseProperty.UnionListResponse
@@ -39,5 +80,3 @@ await client.listUnions();
- -## \ No newline at end of file diff --git a/seed/ts-sdk/url-form-encoded/reference.md b/seed/ts-sdk/url-form-encoded/reference.md index ab8381ef4267..4c2ca330d179 100644 --- a/seed/ts-sdk/url-form-encoded/reference.md +++ b/seed/ts-sdk/url-form-encoded/reference.md @@ -50,5 +50,3 @@ await client.submitFormData({ - -## \ No newline at end of file diff --git a/seed/ts-sdk/validation/reference.md b/seed/ts-sdk/validation/reference.md index e827fa827770..2101c90fcd8a 100644 --- a/seed/ts-sdk/validation/reference.md +++ b/seed/ts-sdk/validation/reference.md @@ -1,4 +1,58 @@ # Reference +
client.create({ ...params }) -> SeedValidation.Type +
+
+ +#### 🔌 Usage + +
+
+ +
+
+ +```typescript +await client.create({ + decimal: 2.2, + even: 100, + name: "fern", + shape: "SQUARE" +}); + +``` +
+
+
+
+ +#### ⚙️ Parameters + +
+
+ +
+
+ +**request:** `SeedValidation.CreateRequest` + +
+
+ +
+
+ +**requestOptions:** `SeedValidationClient.RequestOptions` + +
+
+
+
+ + +
+
+
+
client.get({ ...params }) -> SeedValidation.Type
@@ -51,5 +105,3 @@ await client.get({
- -## \ No newline at end of file