From a0ab3552a95ebe5fb50bcf089ad9beb1375539da Mon Sep 17 00:00:00 2001 From: fern-api <115122769+fern-api[bot]@users.noreply.github.com> Date: Mon, 30 Oct 2023 14:25:03 +0000 Subject: [PATCH 1/3] SDK regeneration --- .eslintrc | 18 - .fernignore | 1 + .github/workflows/ci.yml | 42 + .github/workflows/release.yaml | 22 - .github/workflows/test.yaml | 37 - .gitignore | 35 +- .npmignore | 13 +- .prettierignore | 1 - .prettierrc.json | 1 - .prettierrc.yml | 2 + DEV.md | 35 - LICENSE | 21 - README.md | 114 - cohere.ts | 163 - dist/cohere.d.ts | 40 - dist/cohere.js | 324 -- dist/cohere.js.map | 1 - dist/models/index.ts | 275 -- index.js | 1 - models/index.ts | 275 -- package-lock.json | 4170 ----------------- package.json | 83 +- services/api_service.ts | 81 - services/error_service.ts | 30 - src/Client.ts | 559 +++ src/api/client/index.ts | 1 + src/api/client/requests/ChatRequest.ts | 81 + src/api/client/requests/ClassifyRequest.ts | 25 + .../client/requests/DetectLanguageRequest.ts | 8 + src/api/client/requests/DetokenizeRequest.ts | 10 + src/api/client/requests/EmbedRequest.ts | 27 + src/api/client/requests/GenerateRequest.ts | 102 + src/api/client/requests/RerankRequest.ts | 27 + src/api/client/requests/SummarizeRequest.ts | 22 + src/api/client/requests/TokenizeRequest.ts | 10 + src/api/client/requests/index.ts | 9 + src/api/errors/BadRequestError.ts | 15 + src/api/errors/InternalServerError.ts | 15 + src/api/errors/index.ts | 2 + src/api/index.ts | 3 + src/api/types/ApiMeta.ts | 10 + src/api/types/ApiMetaApiVersion.ts | 9 + src/api/types/ChatCitation.ts | 30 + src/api/types/ChatCitationGenerationEvent.ts | 13 + src/api/types/ChatConnector.ts | 29 + src/api/types/ChatDocument.ts | 15 + src/api/types/ChatMessage.ts | 15 + src/api/types/ChatMessageRole.ts | 10 + src/api/types/ChatRequestCitationQuality.ts | 15 + src/api/types/ChatRequestPromptTruncation.ts | 17 + src/api/types/ChatResponse.ts | 10 + .../types/ChatSearchQueriesGenerationEvent.ts | 10 + src/api/types/ChatSearchQuery.ts | 20 + src/api/types/ChatSearchResult.ts | 19 + src/api/types/ChatSearchResultsEvent.ts | 18 + src/api/types/ChatStreamEndEvent.ts | 22 + .../types/ChatStreamEndEventFinishReason.ts | 21 + src/api/types/ChatStreamEndEventResponse.ts | 11 + src/api/types/ChatStreamEvent.ts | 5 + src/api/types/ChatStreamStartEvent.ts | 13 + src/api/types/ChatTextGenerationEvent.ts | 13 + src/api/types/ClassifyRequestExamplesItem.ts | 8 + src/api/types/ClassifyRequestTruncate.ts | 16 + src/api/types/ClassifyResponse.ts | 11 + .../ClassifyResponseClassificationsItem.ts | 23 + ...seClassificationsItemClassificationType.ts | 13 + ...yResponseClassificationsItemLabelsValue.ts | 7 + src/api/types/DetectLanguageResponse.ts | 11 + .../DetectLanguageResponseResultsItem.ts | 8 + src/api/types/DetokenizeResponse.ts | 11 + src/api/types/EmbedRequestTruncate.ts | 18 + src/api/types/EmbedResponse.ts | 14 + src/api/types/FinishReason.ts | 14 + .../types/GenerateRequestReturnLikelihoods.ts | 18 + src/api/types/GenerateRequestTruncate.ts | 18 + src/api/types/Generation.ts | 14 + src/api/types/GenerationFinalResponse.ts | 11 + .../types/GenerationFinalResponseResponse.ts | 10 + src/api/types/GenerationStream.ts | 11 + src/api/types/NonStreamedChatResponse.ts | 20 + src/api/types/RerankRequestDocumentsItem.ts | 8 + src/api/types/RerankResponse.ts | 12 + src/api/types/RerankResponseResultsItem.ts | 14 + .../RerankResponseResultsItemDocument.ts | 11 + src/api/types/SearchQueriesOnlyResponse.ts | 10 + src/api/types/SingleGeneration.ts | 15 + src/api/types/SingleGenerationInStream.ts | 14 + .../SingleGenerationTokenLikelihoodsItem.ts | 8 + src/api/types/StreamedChatResponse.ts | 42 + src/api/types/StreamedGeneration.ts | 10 + src/api/types/StreamedGenerationItem.ts | 7 + .../types/SummarizeRequestExtractiveness.ts | 14 + src/api/types/SummarizeRequestFormat.ts | 13 + src/api/types/SummarizeRequestLength.ts | 14 + src/api/types/SummarizeRequestModel.ts | 13 + src/api/types/SummarizeResponse.ts | 11 + src/api/types/SummarizeResponseResultsItem.ts | 10 + src/api/types/TokenizeResponse.ts | 12 + src/api/types/index.ts | 58 + src/core/auth/BasicAuth.ts | 31 + src/core/auth/BearerToken.ts | 15 + src/core/auth/index.ts | 2 + src/core/fetcher/APIResponse.ts | 11 + src/core/fetcher/Fetcher.ts | 134 + src/core/fetcher/Supplier.ts | 11 + src/core/fetcher/index.ts | 4 + src/core/index.ts | 3 + src/core/schemas/Schema.ts | 93 + src/core/schemas/builders/date/date.ts | 65 + src/core/schemas/builders/date/index.ts | 1 + src/core/schemas/builders/enum/enum.ts | 43 + src/core/schemas/builders/enum/index.ts | 1 + src/core/schemas/builders/index.ts | 13 + src/core/schemas/builders/lazy/index.ts | 3 + src/core/schemas/builders/lazy/lazy.ts | 34 + src/core/schemas/builders/lazy/lazyObject.ts | 20 + src/core/schemas/builders/list/index.ts | 1 + src/core/schemas/builders/list/list.ts | 74 + src/core/schemas/builders/literals/index.ts | 1 + .../builders/literals/stringLiteral.ts | 29 + .../object-like/getObjectLikeUtils.ts | 79 + .../schemas/builders/object-like/index.ts | 2 + .../schemas/builders/object-like/types.ts | 11 + src/core/schemas/builders/object/index.ts | 17 + src/core/schemas/builders/object/object.ts | 333 ++ src/core/schemas/builders/object/property.ts | 23 + src/core/schemas/builders/object/types.ts | 72 + src/core/schemas/builders/primitives/any.ts | 4 + .../schemas/builders/primitives/boolean.ts | 25 + src/core/schemas/builders/primitives/index.ts | 5 + .../schemas/builders/primitives/number.ts | 25 + .../schemas/builders/primitives/string.ts | 25 + .../schemas/builders/primitives/unknown.ts | 4 + src/core/schemas/builders/record/index.ts | 2 + src/core/schemas/builders/record/record.ts | 131 + src/core/schemas/builders/record/types.ts | 17 + .../builders/schema-utils/JsonError.ts | 9 + .../builders/schema-utils/ParseError.ts | 9 + .../builders/schema-utils/getSchemaUtils.ts | 99 + .../schemas/builders/schema-utils/index.ts | 4 + .../schema-utils/stringifyValidationErrors.ts | 8 + src/core/schemas/builders/set/index.ts | 1 + src/core/schemas/builders/set/set.ts | 43 + .../builders/undiscriminated-union/index.ts | 6 + .../builders/undiscriminated-union/types.ts | 10 + .../undiscriminatedUnion.ts | 61 + .../schemas/builders/union/discriminant.ts | 14 + src/core/schemas/builders/union/index.ts | 10 + src/core/schemas/builders/union/types.ts | 26 + src/core/schemas/builders/union/union.ts | 173 + src/core/schemas/index.ts | 2 + src/core/schemas/utils/MaybePromise.ts | 1 + .../addQuestionMarksToNullableProperties.ts | 15 + .../utils/createIdentitySchemaCreator.ts | 21 + src/core/schemas/utils/entries.ts | 3 + src/core/schemas/utils/filterObject.ts | 10 + .../utils/getErrorMessageForIncorrectType.ts | 21 + src/core/schemas/utils/isPlainObject.ts | 17 + src/core/schemas/utils/keys.ts | 3 + src/core/schemas/utils/maybeSkipValidation.ts | 39 + src/core/schemas/utils/partition.ts | 12 + src/environments.ts | 9 + src/errors/CohereError.ts | 45 + src/errors/CohereTimeoutError.ts | 10 + src/errors/index.ts | 2 + src/index.ts | 4 + src/serialization/client/index.ts | 1 + .../client/requests/ChatRequest.ts | 55 + .../client/requests/ClassifyRequest.ts | 28 + .../client/requests/DetectLanguageRequest.ts | 20 + .../client/requests/DetokenizeRequest.ts | 20 + .../client/requests/EmbedRequest.ts | 22 + .../client/requests/GenerateRequest.ts | 60 + .../client/requests/RerankRequest.ts | 30 + .../client/requests/SummarizeRequest.ts | 32 + .../client/requests/TokenizeRequest.ts | 20 + src/serialization/client/requests/index.ts | 9 + src/serialization/index.ts | 2 + src/serialization/types/ApiMeta.ts | 23 + src/serialization/types/ApiMetaApiVersion.ts | 24 + src/serialization/types/ChatCitation.ts | 24 + .../types/ChatCitationGenerationEvent.ts | 24 + src/serialization/types/ChatConnector.ts | 20 + src/serialization/types/ChatDocument.ts | 18 + src/serialization/types/ChatMessage.ts | 22 + src/serialization/types/ChatMessageRole.ts | 14 + .../types/ChatRequestCitationQuality.ts | 16 + .../types/ChatRequestPromptTruncation.ts | 16 + src/serialization/types/ChatResponse.ts | 21 + .../types/ChatSearchQueriesGenerationEvent.ts | 25 + src/serialization/types/ChatSearchQuery.ts | 20 + src/serialization/types/ChatSearchResult.ts | 27 + .../types/ChatSearchResultsEvent.ts | 29 + src/serialization/types/ChatStreamEndEvent.ts | 27 + .../types/ChatStreamEndEventFinishReason.ts | 16 + .../types/ChatStreamEndEventResponse.ts | 19 + src/serialization/types/ChatStreamEvent.ts | 14 + .../types/ChatStreamStartEvent.ts | 22 + .../types/ChatTextGenerationEvent.ts | 22 + .../types/ClassifyRequestExamplesItem.ts | 22 + .../types/ClassifyRequestTruncate.ts | 16 + src/serialization/types/ClassifyResponse.ts | 26 + .../ClassifyResponseClassificationsItem.ts | 40 + ...seClassificationsItemClassificationType.ts | 16 + ...yResponseClassificationsItemLabelsValue.ts | 20 + .../types/DetectLanguageResponse.ts | 24 + .../DetectLanguageResponseResultsItem.ts | 22 + src/serialization/types/DetokenizeResponse.ts | 22 + .../types/EmbedRequestTruncate.ts | 16 + src/serialization/types/EmbedResponse.ts | 24 + src/serialization/types/FinishReason.ts | 14 + .../types/GenerateRequestReturnLikelihoods.ts | 16 + .../types/GenerateRequestTruncate.ts | 16 + src/serialization/types/Generation.ts | 26 + .../types/GenerationFinalResponse.ts | 27 + .../types/GenerationFinalResponseResponse.ts | 22 + src/serialization/types/GenerationStream.ts | 24 + .../types/NonStreamedChatResponse.ts | 44 + .../types/RerankRequestDocumentsItem.ts | 20 + src/serialization/types/RerankResponse.ts | 24 + .../types/RerankResponseResultsItem.ts | 26 + .../RerankResponseResultsItemDocument.ts | 20 + .../types/SearchQueriesOnlyResponse.ts | 23 + src/serialization/types/SingleGeneration.ts | 33 + .../types/SingleGenerationInStream.ts | 29 + .../SingleGenerationTokenLikelihoodsItem.ts | 22 + .../types/StreamedChatResponse.ts | 62 + src/serialization/types/StreamedGeneration.ts | 16 + .../types/StreamedGenerationItem.ts | 19 + .../types/SummarizeRequestExtractiveness.ts | 16 + .../types/SummarizeRequestFormat.ts | 16 + .../types/SummarizeRequestLength.ts | 16 + .../types/SummarizeRequestModel.ts | 16 + src/serialization/types/SummarizeResponse.ts | 24 + .../types/SummarizeResponseResultsItem.ts | 22 + src/serialization/types/TokenizeResponse.ts | 24 + src/serialization/types/index.ts | 58 + test/classify.ts | 137 - test/detectlanguage.ts | 30 - test/detokenize.ts | 27 - test/embed.ts | 51 - test/generate.ts | 184 - test/summarize.ts | 40 - test/test.ts | 12 - test/tokenize.ts | 28 - tsconfig.json | 40 +- webpack.config.js | 65 - yarn.lock | 89 + 248 files changed, 5705 insertions(+), 6292 deletions(-) delete mode 100644 .eslintrc create mode 100644 .fernignore create mode 100644 .github/workflows/ci.yml delete mode 100644 .github/workflows/release.yaml delete mode 100644 .github/workflows/test.yaml delete mode 100644 .prettierignore delete mode 100644 .prettierrc.json create mode 100644 .prettierrc.yml delete mode 100644 DEV.md delete mode 100644 LICENSE delete mode 100644 README.md delete mode 100644 cohere.ts delete mode 100644 dist/cohere.d.ts delete mode 100644 dist/cohere.js delete mode 100644 dist/cohere.js.map delete mode 100644 dist/models/index.ts delete mode 100644 index.js delete mode 100644 models/index.ts delete mode 100644 package-lock.json delete mode 100644 services/api_service.ts delete mode 100644 services/error_service.ts create mode 100644 src/Client.ts create mode 100644 src/api/client/index.ts create mode 100644 src/api/client/requests/ChatRequest.ts create mode 100644 src/api/client/requests/ClassifyRequest.ts create mode 100644 src/api/client/requests/DetectLanguageRequest.ts create mode 100644 src/api/client/requests/DetokenizeRequest.ts create mode 100644 src/api/client/requests/EmbedRequest.ts create mode 100644 src/api/client/requests/GenerateRequest.ts create mode 100644 src/api/client/requests/RerankRequest.ts create mode 100644 src/api/client/requests/SummarizeRequest.ts create mode 100644 src/api/client/requests/TokenizeRequest.ts create mode 100644 src/api/client/requests/index.ts create mode 100644 src/api/errors/BadRequestError.ts create mode 100644 src/api/errors/InternalServerError.ts create mode 100644 src/api/errors/index.ts create mode 100644 src/api/index.ts create mode 100644 src/api/types/ApiMeta.ts create mode 100644 src/api/types/ApiMetaApiVersion.ts create mode 100644 src/api/types/ChatCitation.ts create mode 100644 src/api/types/ChatCitationGenerationEvent.ts create mode 100644 src/api/types/ChatConnector.ts create mode 100644 src/api/types/ChatDocument.ts create mode 100644 src/api/types/ChatMessage.ts create mode 100644 src/api/types/ChatMessageRole.ts create mode 100644 src/api/types/ChatRequestCitationQuality.ts create mode 100644 src/api/types/ChatRequestPromptTruncation.ts create mode 100644 src/api/types/ChatResponse.ts create mode 100644 src/api/types/ChatSearchQueriesGenerationEvent.ts create mode 100644 src/api/types/ChatSearchQuery.ts create mode 100644 src/api/types/ChatSearchResult.ts create mode 100644 src/api/types/ChatSearchResultsEvent.ts create mode 100644 src/api/types/ChatStreamEndEvent.ts create mode 100644 src/api/types/ChatStreamEndEventFinishReason.ts create mode 100644 src/api/types/ChatStreamEndEventResponse.ts create mode 100644 src/api/types/ChatStreamEvent.ts create mode 100644 src/api/types/ChatStreamStartEvent.ts create mode 100644 src/api/types/ChatTextGenerationEvent.ts create mode 100644 src/api/types/ClassifyRequestExamplesItem.ts create mode 100644 src/api/types/ClassifyRequestTruncate.ts create mode 100644 src/api/types/ClassifyResponse.ts create mode 100644 src/api/types/ClassifyResponseClassificationsItem.ts create mode 100644 src/api/types/ClassifyResponseClassificationsItemClassificationType.ts create mode 100644 src/api/types/ClassifyResponseClassificationsItemLabelsValue.ts create mode 100644 src/api/types/DetectLanguageResponse.ts create mode 100644 src/api/types/DetectLanguageResponseResultsItem.ts create mode 100644 src/api/types/DetokenizeResponse.ts create mode 100644 src/api/types/EmbedRequestTruncate.ts create mode 100644 src/api/types/EmbedResponse.ts create mode 100644 src/api/types/FinishReason.ts create mode 100644 src/api/types/GenerateRequestReturnLikelihoods.ts create mode 100644 src/api/types/GenerateRequestTruncate.ts create mode 100644 src/api/types/Generation.ts create mode 100644 src/api/types/GenerationFinalResponse.ts create mode 100644 src/api/types/GenerationFinalResponseResponse.ts create mode 100644 src/api/types/GenerationStream.ts create mode 100644 src/api/types/NonStreamedChatResponse.ts create mode 100644 src/api/types/RerankRequestDocumentsItem.ts create mode 100644 src/api/types/RerankResponse.ts create mode 100644 src/api/types/RerankResponseResultsItem.ts create mode 100644 src/api/types/RerankResponseResultsItemDocument.ts create mode 100644 src/api/types/SearchQueriesOnlyResponse.ts create mode 100644 src/api/types/SingleGeneration.ts create mode 100644 src/api/types/SingleGenerationInStream.ts create mode 100644 src/api/types/SingleGenerationTokenLikelihoodsItem.ts create mode 100644 src/api/types/StreamedChatResponse.ts create mode 100644 src/api/types/StreamedGeneration.ts create mode 100644 src/api/types/StreamedGenerationItem.ts create mode 100644 src/api/types/SummarizeRequestExtractiveness.ts create mode 100644 src/api/types/SummarizeRequestFormat.ts create mode 100644 src/api/types/SummarizeRequestLength.ts create mode 100644 src/api/types/SummarizeRequestModel.ts create mode 100644 src/api/types/SummarizeResponse.ts create mode 100644 src/api/types/SummarizeResponseResultsItem.ts create mode 100644 src/api/types/TokenizeResponse.ts create mode 100644 src/api/types/index.ts create mode 100644 src/core/auth/BasicAuth.ts create mode 100644 src/core/auth/BearerToken.ts create mode 100644 src/core/auth/index.ts create mode 100644 src/core/fetcher/APIResponse.ts create mode 100644 src/core/fetcher/Fetcher.ts create mode 100644 src/core/fetcher/Supplier.ts create mode 100644 src/core/fetcher/index.ts create mode 100644 src/core/index.ts create mode 100644 src/core/schemas/Schema.ts create mode 100644 src/core/schemas/builders/date/date.ts create mode 100644 src/core/schemas/builders/date/index.ts create mode 100644 src/core/schemas/builders/enum/enum.ts create mode 100644 src/core/schemas/builders/enum/index.ts create mode 100644 src/core/schemas/builders/index.ts create mode 100644 src/core/schemas/builders/lazy/index.ts create mode 100644 src/core/schemas/builders/lazy/lazy.ts create mode 100644 src/core/schemas/builders/lazy/lazyObject.ts create mode 100644 src/core/schemas/builders/list/index.ts create mode 100644 src/core/schemas/builders/list/list.ts create mode 100644 src/core/schemas/builders/literals/index.ts create mode 100644 src/core/schemas/builders/literals/stringLiteral.ts create mode 100644 src/core/schemas/builders/object-like/getObjectLikeUtils.ts create mode 100644 src/core/schemas/builders/object-like/index.ts create mode 100644 src/core/schemas/builders/object-like/types.ts create mode 100644 src/core/schemas/builders/object/index.ts create mode 100644 src/core/schemas/builders/object/object.ts create mode 100644 src/core/schemas/builders/object/property.ts create mode 100644 src/core/schemas/builders/object/types.ts create mode 100644 src/core/schemas/builders/primitives/any.ts create mode 100644 src/core/schemas/builders/primitives/boolean.ts create mode 100644 src/core/schemas/builders/primitives/index.ts create mode 100644 src/core/schemas/builders/primitives/number.ts create mode 100644 src/core/schemas/builders/primitives/string.ts create mode 100644 src/core/schemas/builders/primitives/unknown.ts create mode 100644 src/core/schemas/builders/record/index.ts create mode 100644 src/core/schemas/builders/record/record.ts create mode 100644 src/core/schemas/builders/record/types.ts create mode 100644 src/core/schemas/builders/schema-utils/JsonError.ts create mode 100644 src/core/schemas/builders/schema-utils/ParseError.ts create mode 100644 src/core/schemas/builders/schema-utils/getSchemaUtils.ts create mode 100644 src/core/schemas/builders/schema-utils/index.ts create mode 100644 src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts create mode 100644 src/core/schemas/builders/set/index.ts create mode 100644 src/core/schemas/builders/set/set.ts create mode 100644 src/core/schemas/builders/undiscriminated-union/index.ts create mode 100644 src/core/schemas/builders/undiscriminated-union/types.ts create mode 100644 src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts create mode 100644 src/core/schemas/builders/union/discriminant.ts create mode 100644 src/core/schemas/builders/union/index.ts create mode 100644 src/core/schemas/builders/union/types.ts create mode 100644 src/core/schemas/builders/union/union.ts create mode 100644 src/core/schemas/index.ts create mode 100644 src/core/schemas/utils/MaybePromise.ts create mode 100644 src/core/schemas/utils/addQuestionMarksToNullableProperties.ts create mode 100644 src/core/schemas/utils/createIdentitySchemaCreator.ts create mode 100644 src/core/schemas/utils/entries.ts create mode 100644 src/core/schemas/utils/filterObject.ts create mode 100644 src/core/schemas/utils/getErrorMessageForIncorrectType.ts create mode 100644 src/core/schemas/utils/isPlainObject.ts create mode 100644 src/core/schemas/utils/keys.ts create mode 100644 src/core/schemas/utils/maybeSkipValidation.ts create mode 100644 src/core/schemas/utils/partition.ts create mode 100644 src/environments.ts create mode 100644 src/errors/CohereError.ts create mode 100644 src/errors/CohereTimeoutError.ts create mode 100644 src/errors/index.ts create mode 100644 src/index.ts create mode 100644 src/serialization/client/index.ts create mode 100644 src/serialization/client/requests/ChatRequest.ts create mode 100644 src/serialization/client/requests/ClassifyRequest.ts create mode 100644 src/serialization/client/requests/DetectLanguageRequest.ts create mode 100644 src/serialization/client/requests/DetokenizeRequest.ts create mode 100644 src/serialization/client/requests/EmbedRequest.ts create mode 100644 src/serialization/client/requests/GenerateRequest.ts create mode 100644 src/serialization/client/requests/RerankRequest.ts create mode 100644 src/serialization/client/requests/SummarizeRequest.ts create mode 100644 src/serialization/client/requests/TokenizeRequest.ts create mode 100644 src/serialization/client/requests/index.ts create mode 100644 src/serialization/index.ts create mode 100644 src/serialization/types/ApiMeta.ts create mode 100644 src/serialization/types/ApiMetaApiVersion.ts create mode 100644 src/serialization/types/ChatCitation.ts create mode 100644 src/serialization/types/ChatCitationGenerationEvent.ts create mode 100644 src/serialization/types/ChatConnector.ts create mode 100644 src/serialization/types/ChatDocument.ts create mode 100644 src/serialization/types/ChatMessage.ts create mode 100644 src/serialization/types/ChatMessageRole.ts create mode 100644 src/serialization/types/ChatRequestCitationQuality.ts create mode 100644 src/serialization/types/ChatRequestPromptTruncation.ts create mode 100644 src/serialization/types/ChatResponse.ts create mode 100644 src/serialization/types/ChatSearchQueriesGenerationEvent.ts create mode 100644 src/serialization/types/ChatSearchQuery.ts create mode 100644 src/serialization/types/ChatSearchResult.ts create mode 100644 src/serialization/types/ChatSearchResultsEvent.ts create mode 100644 src/serialization/types/ChatStreamEndEvent.ts create mode 100644 src/serialization/types/ChatStreamEndEventFinishReason.ts create mode 100644 src/serialization/types/ChatStreamEndEventResponse.ts create mode 100644 src/serialization/types/ChatStreamEvent.ts create mode 100644 src/serialization/types/ChatStreamStartEvent.ts create mode 100644 src/serialization/types/ChatTextGenerationEvent.ts create mode 100644 src/serialization/types/ClassifyRequestExamplesItem.ts create mode 100644 src/serialization/types/ClassifyRequestTruncate.ts create mode 100644 src/serialization/types/ClassifyResponse.ts create mode 100644 src/serialization/types/ClassifyResponseClassificationsItem.ts create mode 100644 src/serialization/types/ClassifyResponseClassificationsItemClassificationType.ts create mode 100644 src/serialization/types/ClassifyResponseClassificationsItemLabelsValue.ts create mode 100644 src/serialization/types/DetectLanguageResponse.ts create mode 100644 src/serialization/types/DetectLanguageResponseResultsItem.ts create mode 100644 src/serialization/types/DetokenizeResponse.ts create mode 100644 src/serialization/types/EmbedRequestTruncate.ts create mode 100644 src/serialization/types/EmbedResponse.ts create mode 100644 src/serialization/types/FinishReason.ts create mode 100644 src/serialization/types/GenerateRequestReturnLikelihoods.ts create mode 100644 src/serialization/types/GenerateRequestTruncate.ts create mode 100644 src/serialization/types/Generation.ts create mode 100644 src/serialization/types/GenerationFinalResponse.ts create mode 100644 src/serialization/types/GenerationFinalResponseResponse.ts create mode 100644 src/serialization/types/GenerationStream.ts create mode 100644 src/serialization/types/NonStreamedChatResponse.ts create mode 100644 src/serialization/types/RerankRequestDocumentsItem.ts create mode 100644 src/serialization/types/RerankResponse.ts create mode 100644 src/serialization/types/RerankResponseResultsItem.ts create mode 100644 src/serialization/types/RerankResponseResultsItemDocument.ts create mode 100644 src/serialization/types/SearchQueriesOnlyResponse.ts create mode 100644 src/serialization/types/SingleGeneration.ts create mode 100644 src/serialization/types/SingleGenerationInStream.ts create mode 100644 src/serialization/types/SingleGenerationTokenLikelihoodsItem.ts create mode 100644 src/serialization/types/StreamedChatResponse.ts create mode 100644 src/serialization/types/StreamedGeneration.ts create mode 100644 src/serialization/types/StreamedGenerationItem.ts create mode 100644 src/serialization/types/SummarizeRequestExtractiveness.ts create mode 100644 src/serialization/types/SummarizeRequestFormat.ts create mode 100644 src/serialization/types/SummarizeRequestLength.ts create mode 100644 src/serialization/types/SummarizeRequestModel.ts create mode 100644 src/serialization/types/SummarizeResponse.ts create mode 100644 src/serialization/types/SummarizeResponseResultsItem.ts create mode 100644 src/serialization/types/TokenizeResponse.ts create mode 100644 src/serialization/types/index.ts delete mode 100644 test/classify.ts delete mode 100644 test/detectlanguage.ts delete mode 100644 test/detokenize.ts delete mode 100644 test/embed.ts delete mode 100644 test/generate.ts delete mode 100644 test/summarize.ts delete mode 100644 test/test.ts delete mode 100644 test/tokenize.ts delete mode 100644 webpack.config.js create mode 100644 yarn.lock diff --git a/.eslintrc b/.eslintrc deleted file mode 100644 index 153548b..0000000 --- a/.eslintrc +++ /dev/null @@ -1,18 +0,0 @@ -{ - "parserOptions": { - "ecmaVersion": 6, - "sourceType": "module" - }, - "parser": "@typescript-eslint/parser", - "plugins": ["@typescript-eslint"], - "rules": { - "no-empty": 0 - }, - "extends": [ - "eslint:recommended", - "plugin:@typescript-eslint/eslint-recommended", - "plugin:@typescript-eslint/recommended", - "prettier" - ], - "ignorePatterns": ["dist/"] -} diff --git a/.fernignore b/.fernignore new file mode 100644 index 0000000..084a8eb --- /dev/null +++ b/.fernignore @@ -0,0 +1 @@ +# Specify files that shouldn't be modified by Fern diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..e2b82d1 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,42 @@ +name: ci + +on: [push] + +jobs: + compile: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Set up node + uses: actions/setup-node@v3 + + - name: Compile + run: yarn && yarn build + + publish: + needs: [ compile ] + if: github.event_name == 'push' && contains(github.ref, 'refs/tags/') + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v3 + + - name: Set up node + uses: actions/setup-node@v3 + + - name: Install dependencies + run: yarn install + + - name: Build + run: yarn build + + - name: Publish to npm + run: | + npm config set //registry.npmjs.org/:_authToken ${NPM_TOKEN} + npm publish --access public + env: + NPM_TOKEN: ${{ secrets.NPM_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/release.yaml b/.github/workflows/release.yaml deleted file mode 100644 index eb36bf4..0000000 --- a/.github/workflows/release.yaml +++ /dev/null @@ -1,22 +0,0 @@ -name: Release -on: - push: - branches: [main] -jobs: - publish: - runs-on: ubuntu-latest - name: Publish to npm - steps: - - name: Check out code - uses: actions/checkout@v3 - - - name: Install Dependencies - run: npm ci - - - name: Build - run: npm run build - - - name: Publish - uses: JS-DevTools/npm-publish@v1 - with: - token: ${{ secrets.NPM_TOKEN }} diff --git a/.github/workflows/test.yaml b/.github/workflows/test.yaml deleted file mode 100644 index be40615..0000000 --- a/.github/workflows/test.yaml +++ /dev/null @@ -1,37 +0,0 @@ -name: Lint and Test -on: push -jobs: - build: - runs-on: ubuntu-latest - name: "Lint and Test" - steps: - - name: Checkout Code - id: checkout - uses: actions/checkout@v2 - - - name: Install Dependencies - id: install - run: npm ci - - - name: Run Linter - id: lint - run: npm run lint - - - name: Run Tests - id: test - run: npm run test - env: - COHERE_API_KEY: ${{ secrets.COHERE_API_KEY }} - - - name: Build - id: build - run: npm run build - - - name: Check that ./dist is up to date - run: | - if [ -z "$(git status --porcelain)" ]; then - echo "./dist is up to date!" - else - echo "./dist is out of date with source code. Run npm run build and check in the changes." - exit 1 - fi diff --git a/.gitignore b/.gitignore index 7bf54a0..1498321 100644 --- a/.gitignore +++ b/.gitignore @@ -1,24 +1,13 @@ -.DS_Store node_modules -dev.ts - -# local env files -.env.local -.env.*.local -.env.test -.env - -# Log files -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* - -# Editor directories and files -.idea -.vscode -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? +.DS_Store +/dist +/Client.d.ts +/Client.js +/environments.d.ts +/environments.js +/index.d.ts +/index.js +/api +/core +/errors +/serialization \ No newline at end of file diff --git a/.npmignore b/.npmignore index 7ddc04e..e62938d 100644 --- a/.npmignore +++ b/.npmignore @@ -1,7 +1,8 @@ -**/.* -.mochaarc.json -test/ +node_modules +src +.gitignore +.github +.fernignore +.prettierrc.yml tsconfig.json -webpack.config.js -node_modules/ -DEV.md \ No newline at end of file +yarn.lock \ No newline at end of file diff --git a/.prettierignore b/.prettierignore deleted file mode 100644 index 849ddff..0000000 --- a/.prettierignore +++ /dev/null @@ -1 +0,0 @@ -dist/ diff --git a/.prettierrc.json b/.prettierrc.json deleted file mode 100644 index 0967ef4..0000000 --- a/.prettierrc.json +++ /dev/null @@ -1 +0,0 @@ -{} diff --git a/.prettierrc.yml b/.prettierrc.yml new file mode 100644 index 0000000..0c06786 --- /dev/null +++ b/.prettierrc.yml @@ -0,0 +1,2 @@ +tabWidth: 4 +printWidth: 120 diff --git a/DEV.md b/DEV.md deleted file mode 100644 index cf18fb8..0000000 --- a/DEV.md +++ /dev/null @@ -1,35 +0,0 @@ -# SDK Local Development Instructions - -### Get Started: - -```bash -npm install -``` - -### Build for production (including generation of `./index.d.ts`) - -```bash -npm run build -``` - -### Run a local dev server (in node) to test. - -```bash -npm run dev -``` - -### Set the following environment variable: - -``` -COHERE_API_KEY=YOUR_KEY -``` - -### Run tests - -```bash -npm run test -``` - -### Publish to npm - -Changes merged to main will automatically be published to npm. diff --git a/LICENSE b/LICENSE deleted file mode 100644 index b56baf3..0000000 --- a/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2021 Cohere - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/README.md b/README.md deleted file mode 100644 index 976cceb..0000000 --- a/README.md +++ /dev/null @@ -1,114 +0,0 @@ -> ⚠️ This repository is not officially maintained so it may not support the latest API features. The only currently supported sdk is [cohere-ai/cohere-python](https://github.com/cohere-ai/cohere-python). Official SDK support for node coming soon! ⚠️ - -# Welcome to the Cohere AI Node.js SDK. - -This package provides functionality developed to simplify interfacing with the [cohere.ai](https://cohere.ai) natural language API. This SDK provides support for both TypeScript and JavaScript Node.js projects. For a full description of the API please visit the [Cohere Docs](https://docs.cohere.ai/). - -## Installation - -### Install the package as a dependency. - -```bash -npm install cohere-ai -``` - -## Usage - -### Import the library to your node.js project. - -```js -const cohere = require("cohere-ai"); -``` - -### Initialize the library using the latest version of the API. - -```js -cohere.init("YOUR_API_KEY"); -``` - -### Call the endpoint function you'd like to hit to interact with the Cohere API. - -```js -cohere.generate("MODEL_NAME", config); -``` - -## Endpoints - -For a full breakdown of endpoints and their config objects please consult the [Cohere Docs](https://docs.cohere.ai/). - -| Cohere Endpoint | Function | -| ---------------- | ----------------------- | -| /generate | cohere.generate() | -| /embed | cohere.embed() | -| /classify | cohere.classify() | -| /tokenize | cohere.tokenize() | -| /detokenize | cohere.detokenize() | -| /summarize | cohere.summarize() | -| /detect-language | cohere.detectLanguage() | - -## Models - -To view an up to date list of available models please consult the [Cohere CLI](https://docs.cohere.ai/command/). To get started try out `large`. - -## Responses - -All of the endpoint functions will return a response structure. For a detailed breakdown of the response body visit the [Cohere Docs](https://docs.cohere.ai/). - -```js -{ - statusCode: STATUS, - body: RESPONSE_OBJ -} -``` - -## _Code Examples:_ - -```js -(async () => { - cohere.init(process.env.COHERE_API_KEY); - - // Hit the `generate` endpoint on the `large` model - const generateResponse = await cohere.generate({ - model: "large", - prompt: "Once upon a time in a magical land called", - max_tokens: 50, - temperature: 1, - }); - - /* - { - statusCode: 200, - body: { - text: "Eldorado, the anointed monarchs of the ancient world and the ruling family were divided into three kingdoms, each of which was ruled by an individual leader." - } - } - */ -})(); -``` - -### Example error response: - -```js -// error response from cohere.generate() where api key was not previously provided. -{ - statusCode: 403, - body: { - message: "Whoops! You need to provide an API key before making requests. Try cohere.init(YOUR_KEY)." - } -} - -``` - -## TypeScript support - -Import the package as a class. - -```ts -import cohere = require("cohere-ai"); -``` - -Require the `cohere` package as usual, and the `./index.d.ts` file will be imported by typescript automatically. - -## cohere-node package readme - -If you'd like to help contribute to the package library itself or modify it locally, please check the development instructions [readme](https://github.com/cohere-ai/cohere-node/blob/main/DEV.md). diff --git a/cohere.ts b/cohere.ts deleted file mode 100644 index 482afeb..0000000 --- a/cohere.ts +++ /dev/null @@ -1,163 +0,0 @@ -import * as models from "./models"; -import API from "./services/api_service"; - -enum ENDPOINT { - GENERATE = "/generate", - EMBED = "/embed", - CLASSIFY = "/classify", - TOKENIZE = "/tokenize", - DETOKENIZE = "/detokenize", - DETECT_LANGUAGE = "/detect-language", - SUMMARIZE = "/summarize", -} - -const COHERE_EMBED_BATCH_SIZE = 5; - -interface CohereService { - init(key: string): void; - generate( - config: models.generateRequest - ): Promise>; - classify( - config: models.classifyRequest - ): Promise>; - tokenize( - config: models.tokenizeRequest - ): Promise>; - detokenize( - config: models.detokenizeRequest - ): Promise>; - embed( - config: models.embedRequest - ): Promise>; - detectLanguage( - config: models.detectLanguageRequest - ): Promise>; -} - -class Cohere implements CohereService { - public init(key: string): void { - API.init(key); - } - - private makeRequest( - endpoint: string, - data: models.cohereParameters - ): Promise> { - return API.post(endpoint, data); - } - - /** Generates realistic text conditioned on a given input. - * See: https://docs.cohere.ai/generate-reference - */ - public generate( - config: models.generateRequest - ): Promise> { - return this.makeRequest(ENDPOINT.GENERATE, config) as Promise< - models.cohereResponse - >; - } - - /** Returns a list of tokens for the specified text. - * See: https://docs.cohere.ai/tokenize-reference - */ - public tokenize({ - text, - }: models.tokenizeRequest): Promise< - models.cohereResponse - > { - return this.makeRequest(ENDPOINT.TOKENIZE, { - text, - }) as Promise>; - } - - /** Returns a string for the specified list of tokens. - * See: https://docs.cohere.ai/detokenize-reference - */ - public detokenize({ - tokens, - }: models.detokenizeRequest): Promise< - models.cohereResponse - > { - return this.makeRequest(ENDPOINT.DETOKENIZE, { - tokens, - }) as Promise>; - } - - /** Returns text embeddings. An embedding is a list of floating point numbers that captures semantic - * information about the text that it represents. - * See: https://docs.cohere.ai/embed-reference - */ - public embed( - config: models.embedRequest - ): Promise> { - const createBatches = (array: string[]) => { - const result = []; - for (const value of array) { - const lastArray = result[result.length - 1]; - if (!lastArray || lastArray.length === COHERE_EMBED_BATCH_SIZE) { - result.push([value]); - } else { - lastArray.push(value); - } - } - return result; - }; - - return Promise.all( - createBatches(config.texts).map( - (texts) => - this.makeRequest(ENDPOINT.EMBED, { - ...config, - texts, - }) as Promise> - ) - ).then((results) => { - let embeddings: number[][] = []; - results.forEach((result) => { - embeddings = embeddings.concat(result.body.embeddings); - }); - - const meta = results[0].body.meta || undefined; - const response: models.cohereResponse = { - statusCode: results[0].statusCode, - body: { - embeddings, - meta, - }, - }; - - return response; - }); - } - - /** - * Classifies text as one of the given labels. Returns a confidence score for each label. - * See: https://docs.cohere.ai/classify-reference - */ - public classify( - config: models.classifyRequest - ): Promise> { - return this.makeRequest(ENDPOINT.CLASSIFY, config) as Promise< - models.cohereResponse - >; - } - - public detectLanguage( - config: models.detectLanguageRequest - ): Promise> { - return this.makeRequest(ENDPOINT.DETECT_LANGUAGE, config) as Promise< - models.cohereResponse - >; - } - - public summarize( - config: models.summarizeRequest - ): Promise> { - return this.makeRequest(ENDPOINT.SUMMARIZE, config) as Promise< - models.cohereResponse - >; - } -} -const cohere = new Cohere(); -export = cohere; diff --git a/dist/cohere.d.ts b/dist/cohere.d.ts deleted file mode 100644 index 3eb52c9..0000000 --- a/dist/cohere.d.ts +++ /dev/null @@ -1,40 +0,0 @@ -import * as models from "./models"; -interface CohereService { - init(key: string): void; - generate(config: models.generateRequest): Promise>; - classify(config: models.classifyRequest): Promise>; - tokenize(config: models.tokenizeRequest): Promise>; - detokenize(config: models.detokenizeRequest): Promise>; - embed(config: models.embedRequest): Promise>; - detectLanguage(config: models.detectLanguageRequest): Promise>; -} -declare class Cohere implements CohereService { - init(key: string): void; - private makeRequest; - /** Generates realistic text conditioned on a given input. - * See: https://docs.cohere.ai/generate-reference - */ - generate(config: models.generateRequest): Promise>; - /** Returns a list of tokens for the specified text. - * See: https://docs.cohere.ai/tokenize-reference - */ - tokenize({ text, }: models.tokenizeRequest): Promise>; - /** Returns a string for the specified list of tokens. - * See: https://docs.cohere.ai/detokenize-reference - */ - detokenize({ tokens, }: models.detokenizeRequest): Promise>; - /** Returns text embeddings. An embedding is a list of floating point numbers that captures semantic - * information about the text that it represents. - * See: https://docs.cohere.ai/embed-reference - */ - embed(config: models.embedRequest): Promise>; - /** - * Classifies text as one of the given labels. Returns a confidence score for each label. - * See: https://docs.cohere.ai/classify-reference - */ - classify(config: models.classifyRequest): Promise>; - detectLanguage(config: models.detectLanguageRequest): Promise>; - summarize(config: models.summarizeRequest): Promise>; -} -declare const cohere: Cohere; -export = cohere; diff --git a/dist/cohere.js b/dist/cohere.js deleted file mode 100644 index 6c220fe..0000000 --- a/dist/cohere.js +++ /dev/null @@ -1,324 +0,0 @@ -(function webpackUniversalModuleDefinition(root, factory) { - if(typeof exports === 'object' && typeof module === 'object') - module.exports = factory(); - else if(typeof define === 'function' && define.amd) - define([], factory); - else if(typeof exports === 'object') - exports["cohere"] = factory(); - else - root["cohere"] = factory(); -})(global, () => { -return /******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ 828: -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - -var __assign = (this && this.__assign) || function () { - __assign = Object.assign || function(t) { - for (var s, i = 1, n = arguments.length; i < n; i++) { - s = arguments[i]; - for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) - t[p] = s[p]; - } - return t; - }; - return __assign.apply(this, arguments); -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -var api_service_1 = __importDefault(__webpack_require__(836)); -var ENDPOINT; -(function (ENDPOINT) { - ENDPOINT["GENERATE"] = "/generate"; - ENDPOINT["EMBED"] = "/embed"; - ENDPOINT["CLASSIFY"] = "/classify"; - ENDPOINT["TOKENIZE"] = "/tokenize"; - ENDPOINT["DETOKENIZE"] = "/detokenize"; - ENDPOINT["DETECT_LANGUAGE"] = "/detect-language"; - ENDPOINT["SUMMARIZE"] = "/summarize"; -})(ENDPOINT || (ENDPOINT = {})); -var COHERE_EMBED_BATCH_SIZE = 5; -var Cohere = /** @class */ (function () { - function Cohere() { - } - Cohere.prototype.init = function (key) { - api_service_1.default.init(key); - }; - Cohere.prototype.makeRequest = function (endpoint, data) { - return api_service_1.default.post(endpoint, data); - }; - /** Generates realistic text conditioned on a given input. - * See: https://docs.cohere.ai/generate-reference - */ - Cohere.prototype.generate = function (config) { - return this.makeRequest(ENDPOINT.GENERATE, config); - }; - /** Returns a list of tokens for the specified text. - * See: https://docs.cohere.ai/tokenize-reference - */ - Cohere.prototype.tokenize = function (_a) { - var text = _a.text; - return this.makeRequest(ENDPOINT.TOKENIZE, { - text: text, - }); - }; - /** Returns a string for the specified list of tokens. - * See: https://docs.cohere.ai/detokenize-reference - */ - Cohere.prototype.detokenize = function (_a) { - var tokens = _a.tokens; - return this.makeRequest(ENDPOINT.DETOKENIZE, { - tokens: tokens, - }); - }; - /** Returns text embeddings. An embedding is a list of floating point numbers that captures semantic - * information about the text that it represents. - * See: https://docs.cohere.ai/embed-reference - */ - Cohere.prototype.embed = function (config) { - var _this = this; - var createBatches = function (array) { - var result = []; - for (var _i = 0, array_1 = array; _i < array_1.length; _i++) { - var value = array_1[_i]; - var lastArray = result[result.length - 1]; - if (!lastArray || lastArray.length === COHERE_EMBED_BATCH_SIZE) { - result.push([value]); - } - else { - lastArray.push(value); - } - } - return result; - }; - return Promise.all(createBatches(config.texts).map(function (texts) { - return _this.makeRequest(ENDPOINT.EMBED, __assign(__assign({}, config), { texts: texts })); - })).then(function (results) { - var embeddings = []; - results.forEach(function (result) { - embeddings = embeddings.concat(result.body.embeddings); - }); - var meta = results[0].body.meta || undefined; - var response = { - statusCode: results[0].statusCode, - body: { - embeddings: embeddings, - meta: meta, - }, - }; - return response; - }); - }; - /** - * Classifies text as one of the given labels. Returns a confidence score for each label. - * See: https://docs.cohere.ai/classify-reference - */ - Cohere.prototype.classify = function (config) { - return this.makeRequest(ENDPOINT.CLASSIFY, config); - }; - Cohere.prototype.detectLanguage = function (config) { - return this.makeRequest(ENDPOINT.DETECT_LANGUAGE, config); - }; - Cohere.prototype.summarize = function (config) { - return this.makeRequest(ENDPOINT.SUMMARIZE, config); - }; - return Cohere; -}()); -var cohere = new Cohere(); -module.exports = cohere; - - -/***/ }), - -/***/ 836: -/***/ (function(module, __unused_webpack_exports, __webpack_require__) { - - -var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { - function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } - return new (P || (P = Promise))(function (resolve, reject) { - function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } - function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } - function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } - step((generator = generator.apply(thisArg, _arguments || [])).next()); - }); -}; -var __generator = (this && this.__generator) || function (thisArg, body) { - var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g; - return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g; - function verb(n) { return function (v) { return step([n, v]); }; } - function step(op) { - if (f) throw new TypeError("Generator is already executing."); - while (g && (g = 0, op[0] && (_ = 0)), _) try { - if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t; - if (y = 0, t) op = [op[0] & 2, t.value]; - switch (op[0]) { - case 0: case 1: t = op; break; - case 4: _.label++; return { value: op[1], done: false }; - case 5: _.label++; y = op[1]; op = [0]; continue; - case 7: op = _.ops.pop(); _.trys.pop(); continue; - default: - if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; } - if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; } - if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; } - if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; } - if (t[2]) _.ops.pop(); - _.trys.pop(); continue; - } - op = body.call(thisArg, _); - } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; } - if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true }; - } -}; -var __importDefault = (this && this.__importDefault) || function (mod) { - return (mod && mod.__esModule) ? mod : { "default": mod }; -}; -var https = __webpack_require__(687); -var error_service_1 = __importDefault(__webpack_require__(959)); -var URL; -(function (URL) { - URL["COHERE_API"] = "api.cohere.ai"; -})(URL || (URL = {})); -var APIImpl = /** @class */ (function () { - function APIImpl() { - this.COHERE_API_KEY = ""; - this.COHERE_VERSION = "1"; - } - APIImpl.prototype.init = function (key) { - this.COHERE_API_KEY = key; - }; - APIImpl.prototype.post = function (endpoint, data) { - return __awaiter(this, void 0, void 0, function () { - var _this = this; - return __generator(this, function (_a) { - return [2 /*return*/, new Promise(function (resolve, reject) { - try { - // workaround for js projects that pass json strings. - data = JSON.parse("".concat(data)); - } - catch (e) { } - var reqData = JSON.stringify(data); - var req = https.request({ - hostname: URL.COHERE_API, - path: "/v".concat(_this.COHERE_VERSION).concat(endpoint), - method: "POST", - headers: { - "Content-Type": "application/json; charset=utf-8", - "Content-Length": Buffer.byteLength(reqData, "utf8"), - Authorization: "Bearer ".concat(_this.COHERE_API_KEY), - "Request-Source": "node-sdk", - }, - timeout: 5000, - }, function (res) { - var data = []; - res.on("data", function (chunk) { return data.push(chunk); }); - res.on("end", function () { - if ("x-api-warning" in res.headers) { - var warnHeader = res.headers["x-api-warning"]; - if (typeof warnHeader === "string") { - console.warn("\x1b[33mWarning: %s\x1b[0m", warnHeader); - } - else { - for (var warning in warnHeader) { - console.warn("\x1b[33mWarning: %s\x1b[0m", warning); - } - } - } - resolve({ - statusCode: res.statusCode, - body: JSON.parse(Buffer.concat(data).toString()), - }); - }); - }); - req.on("error", function (error) { - return reject(error_service_1.default.handleError(error)); - }); - req.write(reqData, "utf8"); - req.end(); - })]; - }); - }); - }; - return APIImpl; -}()); -var API = new APIImpl(); -module.exports = API; - - -/***/ }), - -/***/ 959: -/***/ ((module) => { - - -var errorImpl = /** @class */ (function () { - function errorImpl() { - } - errorImpl.prototype.handleError = function (error) { - var _a, _b, _c; - var status = ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) || 500; - var message = ((_c = (_b = error.response) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.message) || error.message; - return { - statusCode: status, - body: { - message: message, - }, - }; - }; - return errorImpl; -}()); -var errors = new errorImpl(); -module.exports = errors; - - -/***/ }), - -/***/ 687: -/***/ ((module) => { - -module.exports = require("https"); - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -/******/ -/******/ // startup -/******/ // Load entry module and return exports -/******/ // This entry module is referenced by other modules so it can't be inlined -/******/ var __webpack_exports__ = __webpack_require__(828); -/******/ -/******/ return __webpack_exports__; -/******/ })() -; -}); -//# sourceMappingURL=cohere.js.map \ No newline at end of file diff --git a/dist/cohere.js.map b/dist/cohere.js.map deleted file mode 100644 index e27d0a9..0000000 --- a/dist/cohere.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"cohere.js","mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD,O;;;;;;;ACVa;AACb;AACA;AACA,iDAAiD,OAAO;AACxD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,oCAAoC,mBAAO,CAAC,GAAwB;AACpE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC,4BAA4B;AAC7B;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,8CAA8C,qBAAqB;AACnE;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,yEAAyE,aAAa,cAAc;AACpG,SAAS;AACT;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA;AACA;AACA;AACA,iBAAiB;AACjB;AACA;AACA,SAAS;AACT;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CAAC;AACD;AACA;;;;;;;;AClHa;AACb;AACA,4BAA4B,+DAA+D,iBAAiB;AAC5G;AACA,oCAAoC,MAAM,+BAA+B,YAAY;AACrF,mCAAmC,MAAM,mCAAmC,YAAY;AACxF,gCAAgC;AAChC;AACA,KAAK;AACL;AACA;AACA,cAAc,6BAA6B,0BAA0B,cAAc,qBAAqB;AACxG,iBAAiB,oDAAoD,qEAAqE,cAAc;AACxJ,uBAAuB,sBAAsB;AAC7C;AACA;AACA;AACA;AACA;AACA;AACA,wCAAwC;AACxC,mCAAmC,SAAS;AAC5C,mCAAmC,WAAW,UAAU;AACxD,0CAA0C,cAAc;AACxD;AACA,8GAA8G,OAAO;AACrH,iFAAiF,iBAAiB;AAClG,yDAAyD,gBAAgB,QAAQ;AACjF,+CAA+C,gBAAgB,gBAAgB;AAC/E;AACA,kCAAkC;AAClC;AACA;AACA,UAAU,YAAY,aAAa,SAAS,UAAU;AACtD,oCAAoC,SAAS;AAC7C;AACA;AACA;AACA,6CAA6C;AAC7C;AACA,YAAY,mBAAO,CAAC,GAAO;AAC3B,sCAAsC,mBAAO,CAAC,GAAiB;AAC/D;AACA;AACA;AACA,CAAC,kBAAkB;AACnB;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,mEAAmE;AACnE;AACA;AACA;AACA,6BAA6B;AAC7B;AACA,yBAAyB;AACzB;AACA,8DAA8D,0BAA0B;AACxF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,iCAAiC;AACjC,6BAA6B;AAC7B,yBAAyB;AACzB;AACA;AACA,yBAAyB;AACzB;AACA;AACA,qBAAqB;AACrB,aAAa;AACb,SAAS;AACT;AACA;AACA,CAAC;AACD;AACA;;;;;;;;AC7Ga;AACb;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,aAAa;AACb;AACA;AACA;AACA,CAAC;AACD;AACA;;;;;;;;AClBA;;;;;;UCAA;UACA;;UAEA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;UACA;;UAEA;UACA;;UAEA;UACA;UACA;;;;UEtBA;UACA;UACA;UACA","sources":["webpack://cohere/webpack/universalModuleDefinition","webpack://cohere/./cohere.ts","webpack://cohere/./services/api_service.ts","webpack://cohere/./services/error_service.ts","webpack://cohere/external node-commonjs \"https\"","webpack://cohere/webpack/bootstrap","webpack://cohere/webpack/before-startup","webpack://cohere/webpack/startup","webpack://cohere/webpack/after-startup"],"sourcesContent":["(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"cohere\"] = factory();\n\telse\n\t\troot[\"cohere\"] = factory();\n})(global, () => {\nreturn ","\"use strict\";\nvar __assign = (this && this.__assign) || function () {\n __assign = Object.assign || function(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))\n t[p] = s[p];\n }\n return t;\n };\n return __assign.apply(this, arguments);\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar api_service_1 = __importDefault(require(\"./services/api_service\"));\nvar ENDPOINT;\n(function (ENDPOINT) {\n ENDPOINT[\"GENERATE\"] = \"/generate\";\n ENDPOINT[\"EMBED\"] = \"/embed\";\n ENDPOINT[\"CLASSIFY\"] = \"/classify\";\n ENDPOINT[\"TOKENIZE\"] = \"/tokenize\";\n ENDPOINT[\"DETOKENIZE\"] = \"/detokenize\";\n ENDPOINT[\"DETECT_LANGUAGE\"] = \"/detect-language\";\n ENDPOINT[\"SUMMARIZE\"] = \"/summarize\";\n})(ENDPOINT || (ENDPOINT = {}));\nvar COHERE_EMBED_BATCH_SIZE = 5;\nvar Cohere = /** @class */ (function () {\n function Cohere() {\n }\n Cohere.prototype.init = function (key) {\n api_service_1.default.init(key);\n };\n Cohere.prototype.makeRequest = function (endpoint, data) {\n return api_service_1.default.post(endpoint, data);\n };\n /** Generates realistic text conditioned on a given input.\n * See: https://docs.cohere.ai/generate-reference\n */\n Cohere.prototype.generate = function (config) {\n return this.makeRequest(ENDPOINT.GENERATE, config);\n };\n /** Returns a list of tokens for the specified text.\n * See: https://docs.cohere.ai/tokenize-reference\n */\n Cohere.prototype.tokenize = function (_a) {\n var text = _a.text;\n return this.makeRequest(ENDPOINT.TOKENIZE, {\n text: text,\n });\n };\n /** Returns a string for the specified list of tokens.\n * See: https://docs.cohere.ai/detokenize-reference\n */\n Cohere.prototype.detokenize = function (_a) {\n var tokens = _a.tokens;\n return this.makeRequest(ENDPOINT.DETOKENIZE, {\n tokens: tokens,\n });\n };\n /** Returns text embeddings. An embedding is a list of floating point numbers that captures semantic\n * information about the text that it represents.\n * See: https://docs.cohere.ai/embed-reference\n */\n Cohere.prototype.embed = function (config) {\n var _this = this;\n var createBatches = function (array) {\n var result = [];\n for (var _i = 0, array_1 = array; _i < array_1.length; _i++) {\n var value = array_1[_i];\n var lastArray = result[result.length - 1];\n if (!lastArray || lastArray.length === COHERE_EMBED_BATCH_SIZE) {\n result.push([value]);\n }\n else {\n lastArray.push(value);\n }\n }\n return result;\n };\n return Promise.all(createBatches(config.texts).map(function (texts) {\n return _this.makeRequest(ENDPOINT.EMBED, __assign(__assign({}, config), { texts: texts }));\n })).then(function (results) {\n var embeddings = [];\n results.forEach(function (result) {\n embeddings = embeddings.concat(result.body.embeddings);\n });\n var meta = results[0].body.meta || undefined;\n var response = {\n statusCode: results[0].statusCode,\n body: {\n embeddings: embeddings,\n meta: meta,\n },\n };\n return response;\n });\n };\n /**\n * Classifies text as one of the given labels. Returns a confidence score for each label.\n * See: https://docs.cohere.ai/classify-reference\n */\n Cohere.prototype.classify = function (config) {\n return this.makeRequest(ENDPOINT.CLASSIFY, config);\n };\n Cohere.prototype.detectLanguage = function (config) {\n return this.makeRequest(ENDPOINT.DETECT_LANGUAGE, config);\n };\n Cohere.prototype.summarize = function (config) {\n return this.makeRequest(ENDPOINT.SUMMARIZE, config);\n };\n return Cohere;\n}());\nvar cohere = new Cohere();\nmodule.exports = cohere;\n","\"use strict\";\nvar __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n};\nvar __generator = (this && this.__generator) || function (thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;\n return g = { next: verb(0), \"throw\": verb(1), \"return\": verb(2) }, typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n};\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nvar https = require(\"https\");\nvar error_service_1 = __importDefault(require(\"./error_service\"));\nvar URL;\n(function (URL) {\n URL[\"COHERE_API\"] = \"api.cohere.ai\";\n})(URL || (URL = {}));\nvar APIImpl = /** @class */ (function () {\n function APIImpl() {\n this.COHERE_API_KEY = \"\";\n this.COHERE_VERSION = \"1\";\n }\n APIImpl.prototype.init = function (key) {\n this.COHERE_API_KEY = key;\n };\n APIImpl.prototype.post = function (endpoint, data) {\n return __awaiter(this, void 0, void 0, function () {\n var _this = this;\n return __generator(this, function (_a) {\n return [2 /*return*/, new Promise(function (resolve, reject) {\n try {\n // workaround for js projects that pass json strings.\n data = JSON.parse(\"\".concat(data));\n }\n catch (e) { }\n var reqData = JSON.stringify(data);\n var req = https.request({\n hostname: URL.COHERE_API,\n path: \"/v\".concat(_this.COHERE_VERSION).concat(endpoint),\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json; charset=utf-8\",\n \"Content-Length\": Buffer.byteLength(reqData, \"utf8\"),\n Authorization: \"Bearer \".concat(_this.COHERE_API_KEY),\n \"Request-Source\": \"node-sdk\",\n },\n timeout: 5000,\n }, function (res) {\n var data = [];\n res.on(\"data\", function (chunk) { return data.push(chunk); });\n res.on(\"end\", function () {\n if (\"x-api-warning\" in res.headers) {\n var warnHeader = res.headers[\"x-api-warning\"];\n if (typeof warnHeader === \"string\") {\n console.warn(\"\\x1b[33mWarning: %s\\x1b[0m\", warnHeader);\n }\n else {\n for (var warning in warnHeader) {\n console.warn(\"\\x1b[33mWarning: %s\\x1b[0m\", warning);\n }\n }\n }\n resolve({\n statusCode: res.statusCode,\n body: JSON.parse(Buffer.concat(data).toString()),\n });\n });\n });\n req.on(\"error\", function (error) {\n return reject(error_service_1.default.handleError(error));\n });\n req.write(reqData, \"utf8\");\n req.end();\n })];\n });\n });\n };\n return APIImpl;\n}());\nvar API = new APIImpl();\nmodule.exports = API;\n","\"use strict\";\nvar errorImpl = /** @class */ (function () {\n function errorImpl() {\n }\n errorImpl.prototype.handleError = function (error) {\n var _a, _b, _c;\n var status = ((_a = error.response) === null || _a === void 0 ? void 0 : _a.status) || 500;\n var message = ((_c = (_b = error.response) === null || _b === void 0 ? void 0 : _b.data) === null || _c === void 0 ? void 0 : _c.message) || error.message;\n return {\n statusCode: status,\n body: {\n message: message,\n },\n };\n };\n return errorImpl;\n}());\nvar errors = new errorImpl();\nmodule.exports = errors;\n","module.exports = require(\"https\");","// The module cache\nvar __webpack_module_cache__ = {};\n\n// The require function\nfunction __webpack_require__(moduleId) {\n\t// Check if module is in cache\n\tvar cachedModule = __webpack_module_cache__[moduleId];\n\tif (cachedModule !== undefined) {\n\t\treturn cachedModule.exports;\n\t}\n\t// Create a new module (and put it into the cache)\n\tvar module = __webpack_module_cache__[moduleId] = {\n\t\t// no module.id needed\n\t\t// no module.loaded needed\n\t\texports: {}\n\t};\n\n\t// Execute the module function\n\t__webpack_modules__[moduleId].call(module.exports, module, module.exports, __webpack_require__);\n\n\t// Return the exports of the module\n\treturn module.exports;\n}\n\n","","// startup\n// Load entry module and return exports\n// This entry module is referenced by other modules so it can't be inlined\nvar __webpack_exports__ = __webpack_require__(828);\n",""],"names":[],"sourceRoot":""} \ No newline at end of file diff --git a/dist/models/index.ts b/dist/models/index.ts deleted file mode 100644 index 25dfd98..0000000 --- a/dist/models/index.ts +++ /dev/null @@ -1,275 +0,0 @@ -export interface cohereResponse { - statusCode: number | undefined; - body: T; -} - -/*-- requests --*/ -interface generateBaseRequest { - /** Denotes the model to be used. Defaults to the best performing model */ - model?: string; - /** Represents the prompt or text to be completed. */ - prompt?: string; - /** Denotes the number of tokens to predict per generation. */ - max_tokens?: number; - /** An optional string representing the ID of a custom playground preset. */ - preset?: string; - /** Denotes the maximum number of generations that will be returned. Defaults to 1, max value of 5. */ - num_generations?: number; - /** A non-negative float that tunes the degree of randomness in generation. */ - temperature?: number; - /** If set to a positive integer, it ensures only the top k most likely tokens are considered for generation at each step. */ - k?: number; - /** If set to a probability 0.0 < p < 1.0, it ensures that only the most likely tokens, - * with total probability mass of p, are considered for generation at each step. If both k and - * p are enabled, p acts after k. Max value of 1.0. - */ - p?: number; - /** Can be used to reduce repetitiveness of generated tokens. Similar to frequency_penalty, - * except that this penalty is applied equally to all tokens that have already appeared, regardless - * of their exact frequencies. Max value of 1.0. - */ - presence_penalty?: number; - /** Can be used to reduce repetitiveness of generated tokens. The higher the value, - * the stronger a penalty is applied to previously present tokens, proportional to how many - * times they have already appeared in the prompt or prior generation. Max value of 1.0. - */ - frequency_penalty?: number; - /** The generated text will be cut at the beginning of the earliest occurence of an end sequence. - * The sequence will be excluded from the text. - */ - end_sequences?: string[]; - /** The generated text will be cut at the end of the earliest occurence of a stop sequence. The sequence - * will be included the text. - */ - stop_sequences?: string[]; - /** One of GENERATION|ALL|NONE to specify how and if the token likelihoods are returned with - * the response. If GENERATION is selected, the token likelihoods will only be provided for generated - * text. If ALL is selected, the token likelihoods will be provided both for the prompt and the generated - * text. - */ - return_likelihoods?: "GENERATION" | "ALL" | "NONE"; - - /** Used to prevent the model from generating unwanted tokens or to incentivize it to include desired tokens - * A map of token ids to biases where bias is a float between -10 and +10 - * Negative values will disincentivize that token from appearing while positivse values will encourage them - * Token ids can be obtained from text using the tokenizer - * Note: logit bias may not be supported for all finetune models - */ - logit_bias?: { [token_id: number]: number }; - - /** Specifies how the API will handle inputs longer than the maximum token length. - * Passing START will discard the start of the input and END will discard the end of the input. - * Defaults to NONE, which will return an error if the input is too long. */ - truncate?: "NONE" | "START" | "END"; -} - -interface generateWithPromptRequest extends generateBaseRequest { - prompt: string; - max_tokens: number; -} - -interface generateWithPresetRequest extends generateBaseRequest { - preset: string; -} - -export type generateRequest = - | generateWithPromptRequest - | generateWithPresetRequest; - -export interface embedRequest { - /** Denotes the model to be used. Defaults to the best performing model */ - model?: string; - /** An array of strings for the model to embed. */ - texts: string[]; - /** Specifies how the API will handle inputs longer than the maximum token length. */ - truncate?: "NONE" | "START" | "END"; -} - -interface classifyBaseRequest { - /** Denotes the model to be used. Defaults to the best performing model */ - model?: string; - /** An array of strings that you would like to classify. */ - inputs?: string[]; - /** An array of examples representing examples and the corresponding label. */ - examples?: { text: string; label: string }[]; - /** An optional string representing the ID of a custom playground preset. */ - preset?: string; - /** Specifies how the API will handle inputs longer than the maximum token length. - * Passing START will discard the start of the input and END will discard the end of the input. - * Defaults to NONE, which will return an error if the input is too long. */ - truncate?: "NONE" | "START" | "END"; -} - -interface classifyWithInputsRequest extends classifyBaseRequest { - inputs: string[]; - examples: { text: string; label: string }[]; -} - -interface classifyWithPresetRequest extends classifyBaseRequest { - preset: string; -} - -export type classifyRequest = - | classifyWithInputsRequest - | classifyWithPresetRequest; - -export interface tokenizeRequest { - /** The text to be tokenized */ - text: string; -} - -export interface detokenizeRequest { - /** The list of tokens to be detokenized */ - tokens: number[]; -} - -export interface detectLanguageRequest { - /** Texts to identify the language for */ - texts: string[]; -} - -export enum summaryLength { - SHORT = "SHORT", - MEDIUM = "MEDIUM", - LONG = "LONG", -} - -export enum summaryFormat { - PARAGRAPH = "PARAGRAPH", - BULLET_POINTS = "BULLETS", -} - -export enum summaryExtractiveness { - LOW = "LOW", - MEDIUM = "MEDIUM", - HIGH = "HIGH", -} - -export interface summarizeRequest { - /** Text to summarize */ - text: string; - /** Denotes the summarization model to be used. Defaults to the best performing model */ - model?: string; - /** One of `short`, `medium` or `long`, defaults to `medium`. Indicates the approximate length of the summary.' */ - length?: summaryLength | string; - /** 'One of `paragraph` or `bullets`, defaults to `paragraph`. - * Indicates the style in which the summary will be delivered - in a free form - * paragraph or in bullet points.' - */ - format?: summaryFormat | string; - /** One of `low`, `medium` or `high`, defaults to `low`. Controls how close to the original text the summary is. - * `high` extractiveness summaries will lean towards reusing sentences verbatim, while `low` extractiveness - * summaries will tend to paraphrase more.' - */ - extractiveness?: summaryExtractiveness | string; - /** Ranges from 0 to 5. Controls the randomness of the output. Lower values tend to generate more “predictable” output, - * while higher values tend to generate more “creative” output. The sweet spot is typically between 0 and 1. - */ - temperature?: number; - /** A free-form instruction for modifying how the summaries get generated. Should complete the sentence "Generate a summary _". - * Eg. "focusing on the next steps" or "written by Yoda" - */ - additional_command?: string; -} - -export type cohereParameters = - | generateRequest - | embedRequest - | classifyRequest - | classifyWithPresetRequest - | tokenizeRequest - | detokenizeRequest - | detectLanguageRequest; - -/* -- responses -- */ -export interface generateResponse { - generations: { - text: string; - likelihood?: number; - token_likelihoods?: [ - { - token: string; - likelihood: number; - } - ]; - }[]; - meta?: metaResponse; -} - -export interface tokenizeResponse { - /** An array of integers, representing the token ids for the specified text. */ - tokens: number[]; - /** An array of string representations for each token */ - token_strings: string[]; - meta?: metaResponse; -} - -export interface detokenizeResponse { - /** A string representing the list of tokens. */ - text: string; - meta?: metaResponse; -} - -export interface embedResponse { - /** An array of embeddings, where each embedding is an array of floats. The length of the embeddings - * array will be the same as the length of the original texts array. - */ - embeddings: number[][]; - meta?: metaResponse; -} - -export interface classifyResponse { - classifications: { - /** The input that is being classified. */ - input: string; - /** The predicted label for the input. */ - prediction: string; - /** Confidence score for the predicted label. */ - confidence: number; - /** A map of predictions for each option. */ - labels: { [label: string]: { confidence: number } }; - }[]; - meta?: metaResponse; -} - -export interface detectLanguageResponse { - results: { - /** Code of the language eg. "fr". */ - language_code: string; - /** Name of the language eg. "French". */ - language_name: string; - }[]; - meta?: metaResponse; -} - -export interface summarizeResponse { - id: string; - summary: string; - meta?: metaResponse; -} - -export interface metaResponse { - api_version: APIVersionMeta; - warnings?: string[]; -} - -export interface APIVersionMeta { - version: string; - is_deprecated?: boolean; - is_experimental?: boolean; -} - -export interface error { - /** Text explaining what went wrong. */ - message?: string; -} - -export type responseBody = - | generateResponse - | embedResponse - | classifyResponse - | tokenizeResponse - | detokenizeResponse - | detectLanguageResponse - | summarizeResponse - | error; diff --git a/index.js b/index.js deleted file mode 100644 index 58ab725..0000000 --- a/index.js +++ /dev/null @@ -1 +0,0 @@ -module.exports = require("./dist/cohere"); diff --git a/models/index.ts b/models/index.ts deleted file mode 100644 index 25dfd98..0000000 --- a/models/index.ts +++ /dev/null @@ -1,275 +0,0 @@ -export interface cohereResponse { - statusCode: number | undefined; - body: T; -} - -/*-- requests --*/ -interface generateBaseRequest { - /** Denotes the model to be used. Defaults to the best performing model */ - model?: string; - /** Represents the prompt or text to be completed. */ - prompt?: string; - /** Denotes the number of tokens to predict per generation. */ - max_tokens?: number; - /** An optional string representing the ID of a custom playground preset. */ - preset?: string; - /** Denotes the maximum number of generations that will be returned. Defaults to 1, max value of 5. */ - num_generations?: number; - /** A non-negative float that tunes the degree of randomness in generation. */ - temperature?: number; - /** If set to a positive integer, it ensures only the top k most likely tokens are considered for generation at each step. */ - k?: number; - /** If set to a probability 0.0 < p < 1.0, it ensures that only the most likely tokens, - * with total probability mass of p, are considered for generation at each step. If both k and - * p are enabled, p acts after k. Max value of 1.0. - */ - p?: number; - /** Can be used to reduce repetitiveness of generated tokens. Similar to frequency_penalty, - * except that this penalty is applied equally to all tokens that have already appeared, regardless - * of their exact frequencies. Max value of 1.0. - */ - presence_penalty?: number; - /** Can be used to reduce repetitiveness of generated tokens. The higher the value, - * the stronger a penalty is applied to previously present tokens, proportional to how many - * times they have already appeared in the prompt or prior generation. Max value of 1.0. - */ - frequency_penalty?: number; - /** The generated text will be cut at the beginning of the earliest occurence of an end sequence. - * The sequence will be excluded from the text. - */ - end_sequences?: string[]; - /** The generated text will be cut at the end of the earliest occurence of a stop sequence. The sequence - * will be included the text. - */ - stop_sequences?: string[]; - /** One of GENERATION|ALL|NONE to specify how and if the token likelihoods are returned with - * the response. If GENERATION is selected, the token likelihoods will only be provided for generated - * text. If ALL is selected, the token likelihoods will be provided both for the prompt and the generated - * text. - */ - return_likelihoods?: "GENERATION" | "ALL" | "NONE"; - - /** Used to prevent the model from generating unwanted tokens or to incentivize it to include desired tokens - * A map of token ids to biases where bias is a float between -10 and +10 - * Negative values will disincentivize that token from appearing while positivse values will encourage them - * Token ids can be obtained from text using the tokenizer - * Note: logit bias may not be supported for all finetune models - */ - logit_bias?: { [token_id: number]: number }; - - /** Specifies how the API will handle inputs longer than the maximum token length. - * Passing START will discard the start of the input and END will discard the end of the input. - * Defaults to NONE, which will return an error if the input is too long. */ - truncate?: "NONE" | "START" | "END"; -} - -interface generateWithPromptRequest extends generateBaseRequest { - prompt: string; - max_tokens: number; -} - -interface generateWithPresetRequest extends generateBaseRequest { - preset: string; -} - -export type generateRequest = - | generateWithPromptRequest - | generateWithPresetRequest; - -export interface embedRequest { - /** Denotes the model to be used. Defaults to the best performing model */ - model?: string; - /** An array of strings for the model to embed. */ - texts: string[]; - /** Specifies how the API will handle inputs longer than the maximum token length. */ - truncate?: "NONE" | "START" | "END"; -} - -interface classifyBaseRequest { - /** Denotes the model to be used. Defaults to the best performing model */ - model?: string; - /** An array of strings that you would like to classify. */ - inputs?: string[]; - /** An array of examples representing examples and the corresponding label. */ - examples?: { text: string; label: string }[]; - /** An optional string representing the ID of a custom playground preset. */ - preset?: string; - /** Specifies how the API will handle inputs longer than the maximum token length. - * Passing START will discard the start of the input and END will discard the end of the input. - * Defaults to NONE, which will return an error if the input is too long. */ - truncate?: "NONE" | "START" | "END"; -} - -interface classifyWithInputsRequest extends classifyBaseRequest { - inputs: string[]; - examples: { text: string; label: string }[]; -} - -interface classifyWithPresetRequest extends classifyBaseRequest { - preset: string; -} - -export type classifyRequest = - | classifyWithInputsRequest - | classifyWithPresetRequest; - -export interface tokenizeRequest { - /** The text to be tokenized */ - text: string; -} - -export interface detokenizeRequest { - /** The list of tokens to be detokenized */ - tokens: number[]; -} - -export interface detectLanguageRequest { - /** Texts to identify the language for */ - texts: string[]; -} - -export enum summaryLength { - SHORT = "SHORT", - MEDIUM = "MEDIUM", - LONG = "LONG", -} - -export enum summaryFormat { - PARAGRAPH = "PARAGRAPH", - BULLET_POINTS = "BULLETS", -} - -export enum summaryExtractiveness { - LOW = "LOW", - MEDIUM = "MEDIUM", - HIGH = "HIGH", -} - -export interface summarizeRequest { - /** Text to summarize */ - text: string; - /** Denotes the summarization model to be used. Defaults to the best performing model */ - model?: string; - /** One of `short`, `medium` or `long`, defaults to `medium`. Indicates the approximate length of the summary.' */ - length?: summaryLength | string; - /** 'One of `paragraph` or `bullets`, defaults to `paragraph`. - * Indicates the style in which the summary will be delivered - in a free form - * paragraph or in bullet points.' - */ - format?: summaryFormat | string; - /** One of `low`, `medium` or `high`, defaults to `low`. Controls how close to the original text the summary is. - * `high` extractiveness summaries will lean towards reusing sentences verbatim, while `low` extractiveness - * summaries will tend to paraphrase more.' - */ - extractiveness?: summaryExtractiveness | string; - /** Ranges from 0 to 5. Controls the randomness of the output. Lower values tend to generate more “predictable” output, - * while higher values tend to generate more “creative” output. The sweet spot is typically between 0 and 1. - */ - temperature?: number; - /** A free-form instruction for modifying how the summaries get generated. Should complete the sentence "Generate a summary _". - * Eg. "focusing on the next steps" or "written by Yoda" - */ - additional_command?: string; -} - -export type cohereParameters = - | generateRequest - | embedRequest - | classifyRequest - | classifyWithPresetRequest - | tokenizeRequest - | detokenizeRequest - | detectLanguageRequest; - -/* -- responses -- */ -export interface generateResponse { - generations: { - text: string; - likelihood?: number; - token_likelihoods?: [ - { - token: string; - likelihood: number; - } - ]; - }[]; - meta?: metaResponse; -} - -export interface tokenizeResponse { - /** An array of integers, representing the token ids for the specified text. */ - tokens: number[]; - /** An array of string representations for each token */ - token_strings: string[]; - meta?: metaResponse; -} - -export interface detokenizeResponse { - /** A string representing the list of tokens. */ - text: string; - meta?: metaResponse; -} - -export interface embedResponse { - /** An array of embeddings, where each embedding is an array of floats. The length of the embeddings - * array will be the same as the length of the original texts array. - */ - embeddings: number[][]; - meta?: metaResponse; -} - -export interface classifyResponse { - classifications: { - /** The input that is being classified. */ - input: string; - /** The predicted label for the input. */ - prediction: string; - /** Confidence score for the predicted label. */ - confidence: number; - /** A map of predictions for each option. */ - labels: { [label: string]: { confidence: number } }; - }[]; - meta?: metaResponse; -} - -export interface detectLanguageResponse { - results: { - /** Code of the language eg. "fr". */ - language_code: string; - /** Name of the language eg. "French". */ - language_name: string; - }[]; - meta?: metaResponse; -} - -export interface summarizeResponse { - id: string; - summary: string; - meta?: metaResponse; -} - -export interface metaResponse { - api_version: APIVersionMeta; - warnings?: string[]; -} - -export interface APIVersionMeta { - version: string; - is_deprecated?: boolean; - is_experimental?: boolean; -} - -export interface error { - /** Text explaining what went wrong. */ - message?: string; -} - -export type responseBody = - | generateResponse - | embedResponse - | classifyResponse - | tokenizeResponse - | detokenizeResponse - | detectLanguageResponse - | summarizeResponse - | error; diff --git a/package-lock.json b/package-lock.json deleted file mode 100644 index b5ed330..0000000 --- a/package-lock.json +++ /dev/null @@ -1,4170 +0,0 @@ -{ - "name": "cohere-ai", - "version": "6.1.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "cohere-ai", - "version": "6.1.0", - "license": "MIT", - "devDependencies": { - "@types/chai": "^4.2.18", - "@types/mocha": "^8.2.2", - "@typescript-eslint/eslint-plugin": "^5.53.0", - "@typescript-eslint/parser": "^5.53.0", - "chai": "^4.3.4", - "clean-webpack-plugin": "^4.0.0-alpha.0", - "copy-webpack-plugin": "^8.1.1", - "eslint": "^7.27.0", - "eslint-config-prettier": "^8.5.0", - "eslint-webpack-plugin": "^2.5.4", - "mocha": "^10.0.0", - "nodemon-webpack-plugin": "^4.5.2", - "prettier": "^2.7.1", - "ts-loader": "^9.1.2", - "ts-node": "^10.8.1", - "typescript": "^4.9.5", - "webpack": "^5.37.0", - "webpack-cli": "^4.9.1" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.12.11", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.11.tgz", - "integrity": "sha512-Zt1yodBx1UcyiePMSkWnU4hPqhwq7hGi2nFL1LeA3EUl+q2LQx16MISgJ0+z7dnmgvP9QtIleuETGOiOH1RcIw==", - "dev": true, - "dependencies": { - "@babel/highlight": "^7.10.4" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.19.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.19.1.tgz", - "integrity": "sha512-awrNfaMtnHUr653GgGEs++LlAvW6w+DcPrOliSMXWCKo597CwL5Acf/wWdNkf/tfEQE3mjkeD1YOVZOUV/od1w==", - "dev": true, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight": { - "version": "7.18.6", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.18.6.tgz", - "integrity": "sha512-u7stbOuYjaPezCuLj29hNW1v64M2Md2qupEKP1fHc7WdOA3DgLh37suiSrZYY7haUB7iBeQZ9P1uiRF359do3g==", - "dev": true, - "dependencies": { - "@babel/helper-validator-identifier": "^7.18.6", - "chalk": "^2.0.0", - "js-tokens": "^4.0.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@discoveryjs/json-ext": { - "version": "0.5.7", - "resolved": "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.7.tgz", - "integrity": "sha512-dBVuXR082gk3jsFp7Rd/JI4kytwGHecnCoTtXFb7DB6CNHp4rg5k1bhg0nWdLGLnOV71lmDzGQaLMy8iPLY0pw==", - "dev": true, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.3.0.tgz", - "integrity": "sha512-v3oplH6FYCULtFuCeqyuTd9D2WKO937Dxdq+GmHOLL72TTRriLxz2VLlNfkZRsvj6PKnOPAtuT6dwrs/pA5DvA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz", - "integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-0.4.3.tgz", - "integrity": "sha512-J6KFFz5QCYUJq3pf0mjEcCJVERbzv71PUIDczuh9JkwGEzced6CO5ADLHB1rbf/+oPBtoPfMYNOpGDzCANlbXw==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.1.1", - "espree": "^7.3.0", - "globals": "^13.9.0", - "ignore": "^4.0.6", - "import-fresh": "^3.2.1", - "js-yaml": "^3.13.1", - "minimatch": "^3.0.4", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/@eslint/eslintrc/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.5.0.tgz", - "integrity": "sha512-FagtKFz74XrTl7y6HCzQpwDfXP0yhxe9lHLD1UZxjvZIcbyRz8zTFF/yYNfSfzU414eDwZ1SrO0Qvtyf+wFMQg==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.0", - "debug": "^4.1.1", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.2.tgz", - "integrity": "sha512-mh65xKQAzI6iBcFzwv28KVWSmCkdRBWoOh+bYQGW3+6OZvbbN3TqMGo5hqYxQniRcH9F2VZIoJCm4pa3BPDK/A==", - "dev": true, - "dependencies": { - "@jridgewell/set-array": "^1.0.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.9" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.0.tgz", - "integrity": "sha512-F2msla3tad+Mfht5cJq7LSXcdudKTWCVYUgw6pLFOOHSTtZlj6SWNYAp+AhuqLmWdBO2X5hPrLcu8cVP8fy28w==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.1.2.tgz", - "integrity": "sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/source-map": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/@jridgewell/source-map/-/source-map-0.3.2.tgz", - "integrity": "sha512-m7O9o2uR8k2ObDysZYzdfhb08VuEml5oWGiosa1VdaPZ/A6QyPkAJuwN0Q1lhULOf6B7MtQmHENS743hWtCrgw==", - "dev": true, - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.0", - "@jridgewell/trace-mapping": "^0.3.9" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.14", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.14.tgz", - "integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.3.tgz", - "integrity": "sha512-yOlFc+7UtL/89t2ZhjPvvB/DeAr3r+Dq58IgzsFkOAvVC6NMJXmCGjbptdXdR9qsX7pKcTL+s87FtYREi2dEEQ==", - "dev": true - }, - "node_modules/@types/chai": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/@types/chai/-/chai-4.3.4.tgz", - "integrity": "sha512-KnRanxnpfpjUTqTCXslZSEdLfXExwgNxYPdiO2WGUj8+HDjFi8R3k5RVKPeSCzLjCcshCAtVO2QBbVuAV4kTnw==", - "dev": true - }, - "node_modules/@types/eslint": { - "version": "7.29.0", - "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-7.29.0.tgz", - "integrity": "sha512-VNcvioYDH8/FxaeTKkM4/TiTwt6pBV9E3OfGmvaw8tPl0rrHCJ4Ll15HRT+pMiFAf/MLQvAzC+6RzUMEL9Ceng==", - "dev": true, - "dependencies": { - "@types/estree": "*", - "@types/json-schema": "*" - } - }, - "node_modules/@types/eslint-scope": { - "version": "3.7.4", - "resolved": "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.4.tgz", - "integrity": "sha512-9K4zoImiZc3HlIp6AVUDE4CWYx22a+lhSZMYNpbjW04+YF0KWj4pJXnEMjdnFTiQibFFmElcsasJXDbdI/EPhA==", - "dev": true, - "dependencies": { - "@types/eslint": "*", - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.0.tgz", - "integrity": "sha512-WulqXMDUTYAXCjZnk6JtIHPigp55cVtDgDrO2gHRwhyJto21+1zbVCtOYB2L1F9w4qCQ0rOGWBnBe0FNTiEJIQ==", - "dev": true - }, - "node_modules/@types/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/@types/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==", - "dev": true, - "dependencies": { - "@types/minimatch": "*", - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.11", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.11.tgz", - "integrity": "sha512-wOuvG1SN4Us4rez+tylwwwCV1psiNVOkJeM3AUWUNWg/jDQY2+HE/444y5gc+jBmRqASOm2Oeh5c1axHobwRKQ==", - "dev": true - }, - "node_modules/@types/minimatch": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-5.1.2.tgz", - "integrity": "sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==", - "dev": true - }, - "node_modules/@types/mocha": { - "version": "8.2.3", - "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-8.2.3.tgz", - "integrity": "sha512-ekGvFhFgrc2zYQoX4JeZPmVzZxw6Dtllga7iGHzfbYIYkAMUx/sAFP2GdFpLff+vdHXu5fl7WX9AT+TtqYcsyw==", - "dev": true - }, - "node_modules/@types/node": { - "version": "18.15.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-18.15.3.tgz", - "integrity": "sha512-p6ua9zBxz5otCmbpb5D3U4B5Nanw6Pk3PPyX05xnxbB/fRv71N7CPmORg7uAD5P70T0xmx1pzAx/FUfa5X+3cw==", - "dev": true - }, - "node_modules/@types/nodemon": { - "version": "1.19.2", - "resolved": "https://registry.npmjs.org/@types/nodemon/-/nodemon-1.19.2.tgz", - "integrity": "sha512-4GWiTN3HevkxMIxEQ7OpD3MAHhlVsX2tairCMRmf8oYZxmhHw9+UpQpIdGdJrjsMT2Ty26FtJzUUcP/qM5fR8A==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/semver": { - "version": "7.3.13", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.3.13.tgz", - "integrity": "sha512-21cFJr9z3g5dW8B0CVI9g2O9beqaThGQ6ZFBqHfwhzLDKUxaqTIy3vnfah/UPkfOiF2pLq+tGz+W8RyCskuslw==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.55.0.tgz", - "integrity": "sha512-IZGc50rtbjk+xp5YQoJvmMPmJEYoC53SiKPXyqWfv15XoD2Y5Kju6zN0DwlmaGJp1Iw33JsWJcQ7nw0lGCGjVg==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/type-utils": "5.55.0", - "@typescript-eslint/utils": "5.55.0", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.55.0.tgz", - "integrity": "sha512-ppvmeF7hvdhUUZWSd2EEWfzcFkjJzgNQzVST22nzg958CR+sphy8A6K7LXQZd6V75m1VKjp+J4g/PCEfSCmzhw==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.55.0.tgz", - "integrity": "sha512-OK+cIO1ZGhJYNCL//a3ROpsd83psf4dUJ4j7pdNVzd5DmIk+ffkuUIX2vcZQbEW/IR41DYsfJTB19tpCboxQuw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.55.0.tgz", - "integrity": "sha512-ObqxBgHIXj8rBNm0yh8oORFrICcJuZPZTqtAFh0oZQyr5DnAHZWfyw54RwpEEH+fD8suZaI0YxvWu5tYE/WswA==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.55.0", - "@typescript-eslint/utils": "5.55.0", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.55.0.tgz", - "integrity": "sha512-M4iRh4AG1ChrOL6Y+mETEKGeDnT7Sparn6fhZ5LtVJF1909D5O4uqK+C5NPbLmpfZ0XIIxCdwzKiijpZUOvOug==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.55.0.tgz", - "integrity": "sha512-I7X4A9ovA8gdpWMpr7b1BN9eEbvlEtWhQvpxp/yogt48fy9Lj3iE3ild/1H3jKBBIYj5YYJmS2+9ystVhC7eaQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/visitor-keys": "5.55.0", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.55.0.tgz", - "integrity": "sha512-FkW+i2pQKcpDC3AY6DU54yl8Lfl14FVGYDgBTyGKB75cCwV3KpkpTMFi9d9j2WAJ4271LR2HeC5SEWF/CZmmfw==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.55.0", - "@typescript-eslint/types": "5.55.0", - "@typescript-eslint/typescript-estree": "5.55.0", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.55.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.55.0.tgz", - "integrity": "sha512-q2dlHHwWgirKh1D3acnuApXG+VNXpEY5/AwRxDVuEQpxWaB0jCDe0jFMVMALJ3ebSfuOVE8/rMS+9ZOYGg1GWw==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.55.0", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@webassemblyjs/ast": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.1.tgz", - "integrity": "sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==", - "dev": true, - "dependencies": { - "@webassemblyjs/helper-numbers": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1" - } - }, - "node_modules/@webassemblyjs/floating-point-hex-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.1.tgz", - "integrity": "sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-api-error": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.1.tgz", - "integrity": "sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-buffer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.1.tgz", - "integrity": "sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-numbers": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.1.tgz", - "integrity": "sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==", - "dev": true, - "dependencies": { - "@webassemblyjs/floating-point-hex-parser": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/helper-wasm-bytecode": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.1.tgz", - "integrity": "sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==", - "dev": true - }, - "node_modules/@webassemblyjs/helper-wasm-section": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.1.tgz", - "integrity": "sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1" - } - }, - "node_modules/@webassemblyjs/ieee754": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.1.tgz", - "integrity": "sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==", - "dev": true, - "dependencies": { - "@xtuc/ieee754": "^1.2.0" - } - }, - "node_modules/@webassemblyjs/leb128": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.1.tgz", - "integrity": "sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==", - "dev": true, - "dependencies": { - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webassemblyjs/utf8": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.1.tgz", - "integrity": "sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==", - "dev": true - }, - "node_modules/@webassemblyjs/wasm-edit": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.1.tgz", - "integrity": "sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/helper-wasm-section": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-opt": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "@webassemblyjs/wast-printer": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-gen": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.1.tgz", - "integrity": "sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-opt": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.1.tgz", - "integrity": "sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-buffer": "1.11.1", - "@webassemblyjs/wasm-gen": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wasm-parser": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.1.tgz", - "integrity": "sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/helper-api-error": "1.11.1", - "@webassemblyjs/helper-wasm-bytecode": "1.11.1", - "@webassemblyjs/ieee754": "1.11.1", - "@webassemblyjs/leb128": "1.11.1", - "@webassemblyjs/utf8": "1.11.1" - } - }, - "node_modules/@webassemblyjs/wast-printer": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.1.tgz", - "integrity": "sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==", - "dev": true, - "dependencies": { - "@webassemblyjs/ast": "1.11.1", - "@xtuc/long": "4.2.2" - } - }, - "node_modules/@webpack-cli/configtest": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.2.0.tgz", - "integrity": "sha512-4FB8Tj6xyVkyqjj1OaTqCjXYULB9FMkqQ8yGrZjRDrYh0nOE+7Lhs45WioWQQMV+ceFlE368Ukhe6xdvJM9Egg==", - "dev": true, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x", - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/info": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/info/-/info-1.5.0.tgz", - "integrity": "sha512-e8tSXZpw2hPl2uMJY6fsMswaok5FdlGNRTktvFk2sD8RjH0hE2+XistawJx1vmKteh4NmGmNUrp+Tb2w+udPcQ==", - "dev": true, - "dependencies": { - "envinfo": "^7.7.3" - }, - "peerDependencies": { - "webpack-cli": "4.x.x" - } - }, - "node_modules/@webpack-cli/serve": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.7.0.tgz", - "integrity": "sha512-oxnCNGj88fL+xzV+dacXs44HcDwf1ovs3AuEzvP7mqXw7fQntqIhQ1BRmynh4qEKQSSSRSWVyXRjmTbZIX9V2Q==", - "dev": true, - "peerDependencies": { - "webpack-cli": "4.x.x" - }, - "peerDependenciesMeta": { - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/@xtuc/ieee754": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz", - "integrity": "sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==", - "dev": true - }, - "node_modules/@xtuc/long": { - "version": "4.2.2", - "resolved": "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz", - "integrity": "sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==", - "dev": true - }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "dev": true - }, - "node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-keywords": { - "version": "3.5.2", - "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", - "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "peerDependencies": { - "ajv": "^6.9.1" - } - }, - "node_modules/ansi-colors": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", - "integrity": "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/array-uniq": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", - "integrity": "sha512-MNha4BWQ6JbwhFhj03YK552f7cb3AzoE8SzeljgChvL1dl3IcvggXVz1DilzySZkCja+CXuZbdW7yATchWn8/Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/arrify": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/arrify/-/arrify-2.0.1.tgz", - "integrity": "sha512-3duEwti880xqi4eAMN8AyR4a0ByT90zoYdLlevfrvU43vb0YZwZVfxOgxWrLXXXpyugL0hNZc9G6BiB5B3nUug==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/assertion-error": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/assertion-error/-/assertion-error-1.1.0.tgz", - "integrity": "sha512-jgsaNduz+ndvGyFt3uSuWqvy4lCnIJiovtouQN5JZHOKCS2QuhEdbcQHFhVksz2N2U9hXJo8odG7ETyWlEeuDw==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/astral-regex": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/astral-regex/-/astral-regex-2.0.0.tgz", - "integrity": "sha512-Z7tMw1ytTXt5jqMcOP+OQteU1VuNK9Y02uuJtKQ1Sv69jXQKKg5cibLwGJow8yzZP+eAc18EmLGPal0bp36rvQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/binary-extensions": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-stdout": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", - "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", - "dev": true - }, - "node_modules/browserslist": { - "version": "4.21.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.5.tgz", - "integrity": "sha512-tUkiguQGW7S3IhB7N+c2MV/HZPSCPAAiYBZXLsBhFB/PCy6ZKKsZrmBayHV9fdGV/ARIfJ14NkxKzRDjvp7L6w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "caniuse-lite": "^1.0.30001449", - "electron-to-chromium": "^1.4.284", - "node-releases": "^2.0.8", - "update-browserslist-db": "^1.0.10" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "dev": true - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001468", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001468.tgz", - "integrity": "sha512-zgAo8D5kbOyUcRAgSmgyuvBkjrGk5CGYG5TYgFdpQv+ywcyEpo1LOWoG8YmoflGnh+V+UsNuKYedsoYs0hzV5A==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - } - ] - }, - "node_modules/chai": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.7.tgz", - "integrity": "sha512-HLnAzZ2iupm25PlN0xFreAlBA5zaBSv3og0DdeGA4Ar6h6rJ3A0rolRUKJhSF2V10GZKDgWF/VmAEsNWjCRB+A==", - "dev": true, - "dependencies": { - "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", - "pathval": "^1.1.1", - "type-detect": "^4.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/chokidar": { - "version": "3.5.3", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", - "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://paulmillr.com/funding/" - } - ], - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/chrome-trace-event": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz", - "integrity": "sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==", - "dev": true, - "engines": { - "node": ">=6.0" - } - }, - "node_modules/clean-webpack-plugin": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/clean-webpack-plugin/-/clean-webpack-plugin-4.0.0.tgz", - "integrity": "sha512-WuWE1nyTNAyW5T7oNyys2EN0cfP2fdRxhxnIQWiAp0bMabPdHhoGxM8A6YL2GhqwgrPnnaemVE7nv5XJ2Fhh2w==", - "dev": true, - "dependencies": { - "del": "^4.1.1" - }, - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "webpack": ">=4.0.0 <6.0.0" - } - }, - "node_modules/cliui": { - "version": "7.0.4", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-7.0.4.tgz", - "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", - "dev": true, - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.0", - "wrap-ansi": "^7.0.0" - } - }, - "node_modules/clone-deep": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz", - "integrity": "sha512-neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==", - "dev": true, - "dependencies": { - "is-plain-object": "^2.0.4", - "kind-of": "^6.0.2", - "shallow-clone": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/colorette": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/colorette/-/colorette-2.0.19.tgz", - "integrity": "sha512-3tlv/dIP7FWvj3BsbHrGLJ6l/oKh1O3TcgBqMn+yyCagOxc23fyzDS6HypQbgxWbkpDnf52p1LuR4eWDQ/K9WQ==", - "dev": true - }, - "node_modules/commander": { - "version": "2.20.3", - "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", - "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", - "dev": true - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/copy-webpack-plugin": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-8.1.1.tgz", - "integrity": "sha512-rYM2uzRxrLRpcyPqGceRBDpxxUV8vcDqIKxAUKfcnFpcrPxT5+XvhTxv7XLjo5AvEJFPdAE3zCogG2JVahqgSQ==", - "dev": true, - "dependencies": { - "fast-glob": "^3.2.5", - "glob-parent": "^5.1.1", - "globby": "^11.0.3", - "normalize-path": "^3.0.0", - "p-limit": "^3.1.0", - "schema-utils": "^3.0.0", - "serialize-javascript": "^5.0.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decamelize": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-4.0.0.tgz", - "integrity": "sha512-9iE1PgSik9HeIIw2JO94IidnE3eBoQrFJ3w7sFuzSX4DpmZ3v5sZpUiV5Swcf6mQEF+Y0ru8Neo+p+nyh2J+hQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/deep-eql": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/deep-eql/-/deep-eql-4.1.3.tgz", - "integrity": "sha512-WaEtAOpRA1MQ0eohqZjpGD8zdI0Ovsm8mmFhaDN8dvDZzyoUMcYDnf5Y6iu7HTXxf8JDS23qWa4a+hKCDyOPzw==", - "dev": true, - "dependencies": { - "type-detect": "^4.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/del": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/del/-/del-4.1.1.tgz", - "integrity": "sha512-QwGuEUouP2kVwQenAsOof5Fv8K9t3D8Ca8NxcXKrIpEHjTXK5J2nXLdP+ALI1cgv8wj7KuwBhTwBkOZSJKM5XQ==", - "dev": true, - "dependencies": { - "@types/glob": "^7.1.1", - "globby": "^6.1.0", - "is-path-cwd": "^2.0.0", - "is-path-in-cwd": "^2.0.0", - "p-map": "^2.0.0", - "pify": "^4.0.1", - "rimraf": "^2.6.3" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/del/node_modules/array-union": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", - "integrity": "sha512-Dxr6QJj/RdU/hCaBjOfxW+q6lyuVE6JFWIrAUpuOOhoJJoQ99cUn3igRaHVB5P9WrgFVN0FfArM3x0cueOU8ng==", - "dev": true, - "dependencies": { - "array-uniq": "^1.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-6.1.0.tgz", - "integrity": "sha512-KVbFv2TQtbzCoxAnfD6JcHZTYCzyliEaaeM/gH8qQdkKr5s0OP9scEgvdcngyk7AVdY6YVW/TJHd+lQ/Df3Daw==", - "dev": true, - "dependencies": { - "array-union": "^1.0.1", - "glob": "^7.0.3", - "object-assign": "^4.0.1", - "pify": "^2.0.0", - "pinkie-promise": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/del/node_modules/globby/node_modules/pify": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", - "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/diff": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/diff/-/diff-5.0.0.tgz", - "integrity": "sha512-/VTCrvm5Z0JGty/BWHljh+BAiw3IK+2j87NGMu8Nwc/f48WoDAC395uomO9ZD117ZOBaHmkX1oyLvkVM/aIT3w==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.4.333", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.333.tgz", - "integrity": "sha512-YyE8+GKyGtPEP1/kpvqsdhD6rA/TP1DUFDN4uiU/YI52NzDxmwHkEb3qjId8hLBa5siJvG0sfC3O66501jMruQ==", - "dev": true - }, - "node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true - }, - "node_modules/enhanced-resolve": { - "version": "5.12.0", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.12.0.tgz", - "integrity": "sha512-QHTXI/sZQmko1cbDoNAa3mJ5qhWUUNAq3vR0/YiD379fWQrcfuoX1+HW2S0MTt7XmoPLapdaDKUtelUSPic7hQ==", - "dev": true, - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/enquirer": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz", - "integrity": "sha512-yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==", - "dev": true, - "dependencies": { - "ansi-colors": "^4.1.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/envinfo": { - "version": "7.8.1", - "resolved": "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz", - "integrity": "sha512-/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==", - "dev": true, - "bin": { - "envinfo": "dist/cli.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/es-module-lexer": { - "version": "0.9.3", - "resolved": "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.9.3.tgz", - "integrity": "sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==", - "dev": true - }, - "node_modules/escalade": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz", - "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "7.32.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-7.32.0.tgz", - "integrity": "sha512-VHZ8gX+EDfz+97jGcgyGCyRia/dPOd6Xh9yPv8Bl1+SoaIwD+a/vlrOmGRUyOYu7MwUhc7CxqeaDZU13S4+EpA==", - "dev": true, - "dependencies": { - "@babel/code-frame": "7.12.11", - "@eslint/eslintrc": "^0.4.3", - "@humanwhocodes/config-array": "^0.5.0", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.0.1", - "doctrine": "^3.0.0", - "enquirer": "^2.3.5", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^5.1.1", - "eslint-utils": "^2.1.0", - "eslint-visitor-keys": "^2.0.0", - "espree": "^7.3.1", - "esquery": "^1.4.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "functional-red-black-tree": "^1.0.1", - "glob-parent": "^5.1.2", - "globals": "^13.6.0", - "ignore": "^4.0.6", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "js-yaml": "^3.13.1", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.0.4", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "progress": "^2.0.0", - "regexpp": "^3.1.0", - "semver": "^7.2.1", - "strip-ansi": "^6.0.0", - "strip-json-comments": "^3.1.0", - "table": "^6.0.9", - "text-table": "^0.2.0", - "v8-compile-cache": "^2.0.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-config-prettier": { - "version": "8.7.0", - "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.7.0.tgz", - "integrity": "sha512-HHVXLSlVUhMSmyW4ZzEuvjpwqamgmlfkutD53cYXLikh4pt/modINRcCIApJ84czDxM4GZInwUrromsDdTImTA==", - "dev": true, - "bin": { - "eslint-config-prettier": "bin/cli.js" - }, - "peerDependencies": { - "eslint": ">=7.0.0" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-utils": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz", - "integrity": "sha512-w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^1.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.3.0.tgz", - "integrity": "sha512-mQ+suqKJVyeuwGYHAdjMFqjCyfl8+Ldnxuyp3ldiMBFKkvytrXUZWaiPCEav8qDHKty44bD+qV1IP4T+w+xXRA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/eslint-webpack-plugin": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/eslint-webpack-plugin/-/eslint-webpack-plugin-2.7.0.tgz", - "integrity": "sha512-bNaVVUvU4srexGhVcayn/F4pJAz19CWBkKoMx7aSQ4wtTbZQCnG5O9LHCE42mM+JSKOUp7n6vd5CIwzj7lOVGA==", - "dev": true, - "dependencies": { - "@types/eslint": "^7.29.0", - "arrify": "^2.0.1", - "jest-worker": "^27.5.1", - "micromatch": "^4.0.5", - "normalize-path": "^3.0.0", - "schema-utils": "^3.1.1" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "eslint": "^7.0.0 || ^8.0.0", - "webpack": "^4.0.0 || ^5.0.0" - } - }, - "node_modules/eslint/node_modules/eslint-visitor-keys": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", - "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/eslint/node_modules/ignore": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz", - "integrity": "sha512-cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/espree": { - "version": "7.3.1", - "resolved": "https://registry.npmjs.org/espree/-/espree-7.3.1.tgz", - "integrity": "sha512-v3JCNCE64umkFpmkFGqzVKsOT0tN1Zr+ueqLZfpV1Ob8e+CEgPWa+OxCoGH3tnhimMKIaBm4m/vaRpJ/krRz2g==", - "dev": true, - "dependencies": { - "acorn": "^7.4.0", - "acorn-jsx": "^5.3.1", - "eslint-visitor-keys": "^1.3.0" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/espree/node_modules/eslint-visitor-keys": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz", - "integrity": "sha512-6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/events": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz", - "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==", - "dev": true, - "engines": { - "node": ">=0.8.x" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastest-levenshtein": { - "version": "1.0.16", - "resolved": "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.16.tgz", - "integrity": "sha512-eRnCtTTtGZFpQCwhJiUOuxPQWRXVKYDn0b2PeHfXL6/Zi53SLAzAHfVhVWK2AryC/WH05kGfxhFIPvTF0SXQzg==", - "dev": true, - "engines": { - "node": ">= 4.9.1" - } - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat": { - "version": "5.0.2", - "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", - "integrity": "sha512-b6suED+5/3rTpUBdG1gupIl8MPFCAMA0QXwmljLhvCUKcUvdE4gWky9zpuGCcXHOsz4J9wPGNWq6OKpmIzz3hQ==", - "dev": true, - "bin": { - "flat": "cli.js" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flat-cache/node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/fsevents": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", - "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, - "hasInstallScript": true, - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, - "node_modules/functional-red-black-tree": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", - "integrity": "sha512-dsKNQNdj6xA3T+QlADDA7mOSlX0qiMINjn0cgr+eGHGsbSHzTabcIogz2+p/iqP1Xs6EP/sS2SbqH+brGTbq0g==", - "dev": true - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/glob": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.0.tgz", - "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/glob-to-regexp": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz", - "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", - "dev": true - }, - "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "dependencies": { - "function-bind": "^1.1.1" - }, - "engines": { - "node": ">= 0.4.0" - } - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/he": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", - "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", - "dev": true, - "bin": { - "he": "bin/he" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/import-local": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.1.0.tgz", - "integrity": "sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==", - "dev": true, - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/interpret": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz", - "integrity": "sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==", - "dev": true, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-core-module": { - "version": "2.11.0", - "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.11.0.tgz", - "integrity": "sha512-RRjxlvLDkD1YJwDbroBHMb+cukurkDWNyHx7D3oNB5x9rb5ogcksMC5wHCadcXoo67gVr/+3GFySh3134zi6rw==", - "dev": true, - "dependencies": { - "has": "^1.0.3" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-cwd": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", - "integrity": "sha512-w942bTcih8fdJPJmQHFzkS76NEP8Kzzvmw92cXsazb8intwLqPibPPdXf4ANdKV3rYMuuQYGIWtvz9JilB3NFQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-in-cwd": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz", - "integrity": "sha512-rNocXHgipO+rvnP6dk3zI20RpOtrAM/kzbB258Uw5BWr3TpXi861yzjo16Dn4hUox07iw5AyeMLHWsujkjzvRQ==", - "dev": true, - "dependencies": { - "is-path-inside": "^2.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-path-inside": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-2.1.0.tgz", - "integrity": "sha512-wiyhTzfDWsvwAW53OBWF5zuvaOGlZ6PwYxAbPVDhpm+gM09xKQGjBq/8uYN12aDvMxnAnq3dxTyoSoRNmg5YFg==", - "dev": true, - "dependencies": { - "path-is-inside": "^1.0.2" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/is-plain-obj": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-2.1.0.tgz", - "integrity": "sha512-YWnfyRwxL/+SsrWYfOpUtz5b3YD+nyfkHvjbcanzk8zgyO4ASD67uVMRt8k5bM4lLMDnXfriRhOpemw+NfT1eA==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-plain-object": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", - "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", - "dev": true, - "dependencies": { - "isobject": "^3.0.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-unicode-supported": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", - "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/isobject": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", - "integrity": "sha512-WhB9zCku7EGTj/HQQRz5aUQEUeoQZH2bWcltRErOpymJ4boYE6wL9Tbr23krRPSZ+C5zqNSrSw+Cc7sZZ4b7vg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/jest-worker": { - "version": "27.5.1", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-27.5.1.tgz", - "integrity": "sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==", - "dev": true, - "dependencies": { - "@types/node": "*", - "merge-stream": "^2.0.0", - "supports-color": "^8.0.0" - }, - "engines": { - "node": ">= 10.13.0" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/kind-of": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz", - "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/loader-runner": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/loader-runner/-/loader-runner-4.3.0.tgz", - "integrity": "sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==", - "dev": true, - "engines": { - "node": ">=6.11.5" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/lodash.truncate": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.truncate/-/lodash.truncate-4.4.2.tgz", - "integrity": "sha512-jttmRe7bRse52OsWIMDLaXxWqRAmtIUccAQ3garviCqJjafXOfNMO0yMfNpdD6zbGaTU0P5Nz7e7gAT6cKmJRw==", - "dev": true - }, - "node_modules/log-symbols": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/loupe": { - "version": "2.3.6", - "resolved": "https://registry.npmjs.org/loupe/-/loupe-2.3.6.tgz", - "integrity": "sha512-RaPMZKiMy8/JruncMU5Bt6na1eftNoo++R4Y+N2FrxkDVTrGvcyzFTsaGif4QTeKESheMGegbhw6iUAq+5A8zA==", - "dev": true, - "dependencies": { - "get-func-name": "^2.0.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/mocha": { - "version": "10.2.0", - "resolved": "https://registry.npmjs.org/mocha/-/mocha-10.2.0.tgz", - "integrity": "sha512-IDY7fl/BecMwFHzoqF2sg/SHHANeBoMMXFlS9r0OXKDssYE1M5O43wUY/9BVPeIvfH2zmEbBfseqN9gBQZzXkg==", - "dev": true, - "dependencies": { - "ansi-colors": "4.1.1", - "browser-stdout": "1.3.1", - "chokidar": "3.5.3", - "debug": "4.3.4", - "diff": "5.0.0", - "escape-string-regexp": "4.0.0", - "find-up": "5.0.0", - "glob": "7.2.0", - "he": "1.2.0", - "js-yaml": "4.1.0", - "log-symbols": "4.1.0", - "minimatch": "5.0.1", - "ms": "2.1.3", - "nanoid": "3.3.3", - "serialize-javascript": "6.0.0", - "strip-json-comments": "3.1.1", - "supports-color": "8.1.1", - "workerpool": "6.2.1", - "yargs": "16.2.0", - "yargs-parser": "20.2.4", - "yargs-unparser": "2.0.0" - }, - "bin": { - "_mocha": "bin/_mocha", - "mocha": "bin/mocha.js" - }, - "engines": { - "node": ">= 14.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/mochajs" - } - }, - "node_modules/mocha/node_modules/ansi-colors": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz", - "integrity": "sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/mocha/node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/mocha/node_modules/brace-expansion": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", - "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/mocha/node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/mocha/node_modules/minimatch": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.0.1.tgz", - "integrity": "sha512-nLDxIFRyhDblz3qMuq+SoRZED4+miJ/G+tdDrjkkkRnjAsBexeGpgjLEQ0blJy7rHhR2b93rhQY4SvyWu9v03g==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/mocha/node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true - }, - "node_modules/mocha/node_modules/serialize-javascript": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.0.tgz", - "integrity": "sha512-Qr3TosvguFt8ePWqsvRfrKyQXIiW+nGbYpy8XK24NQHE83caxWt+mIymTT19DGFbNWNLfEwsrkSmN64lVWB9ag==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/mocha/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/nanoid": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz", - "integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==", - "dev": true, - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true - }, - "node_modules/node-releases": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.10.tgz", - "integrity": "sha512-5GFldHPXVG/YZmFzJvKK2zDSzPKhEp0+ZR5SVaoSag9fsL5YgHbUHDfnG5494ISANDcK4KwPXAx2xqVEydmd7w==", - "dev": true - }, - "node_modules/nodemon": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-2.0.19.tgz", - "integrity": "sha512-4pv1f2bMDj0Eeg/MhGqxrtveeQ5/G/UVe9iO6uTZzjnRluSA4PVWf8CW99LUPwGB3eNIA7zUFoP77YuI7hOc0A==", - "dev": true, - "hasInstallScript": true, - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^3.2.7", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.0.4", - "pstree.remy": "^1.1.8", - "semver": "^5.7.1", - "simple-update-notifier": "^1.0.7", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=8.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon-webpack-plugin": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/nodemon-webpack-plugin/-/nodemon-webpack-plugin-4.8.1.tgz", - "integrity": "sha512-i6xTucitBolVAueD4OASt4jL5gNsAFuTuyn+y6O+NXUqHRVrsOFgOau49iLcjCJJaWAEXMVWpTc5Os79mp7IvQ==", - "dev": true, - "dependencies": { - "@types/nodemon": "latest", - "nodemon": "2.0.19" - }, - "engines": { - "node": ">=8.10.0" - }, - "peerDependencies": { - "webpack": "4 || 5" - } - }, - "node_modules/nodemon/node_modules/debug": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", - "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", - "dev": true, - "dependencies": { - "ms": "^2.1.1" - } - }, - "node_modules/nodemon/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/nodemon/node_modules/semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", - "dev": true, - "bin": { - "semver": "bin/semver" - } - }, - "node_modules/nodemon/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/nopt": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz", - "integrity": "sha512-NWmpvLSqUrgrAC9HCuxEvb+PSloHpqVu+FqcO4eeF2h5qYRhA7ev6KvelyQAKtegUbC6RypJnlEOhd8vloNKYg==", - "dev": true, - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-map": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/p-map/-/p-map-2.1.0.tgz", - "integrity": "sha512-y3b8Kpd8OAN444hxfBbFfj1FY/RjtTd8tzYwhUqNYXx0fXx2iX4maP4Qr6qhIKbQXI02wTLAda4fYUbDagTUFw==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-is-inside": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", - "integrity": "sha512-DUWJr3+ULp4zXmol/SZkFf3JGsS9/SIv+Y3Rt93/UjPpDpklB5f1er4O3POIbUuUJ3FXgqte2Q7SrU6zAqwk8w==", - "dev": true - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-parse": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", - "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==", - "dev": true - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/pathval": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/pathval/-/pathval-1.1.1.tgz", - "integrity": "sha512-Dp6zGqpTdETdR63lehJYPeIOqpiNBNtc7BpWSLrOje7UaIsE5aY92r/AunQA7rsXvet3lrJ3JnZX29UPTKXyKQ==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", - "dev": true - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pify": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz", - "integrity": "sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/pinkie": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", - "integrity": "sha512-MnUuEycAemtSaeFSjXKW/aroV7akBbY+Sv+RkyqFjgAe73F+MR0TBWKBRDkmfWq/HiFmdavfZ1G7h4SPZXaCSg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pinkie-promise": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", - "integrity": "sha512-0Gni6D4UcLTbv9c57DfxDGdr41XfgUjqWZu492f0cIGr16zDU06BWP/RAEvOuo7CQ0CNjHaLlM59YJJFm3NWlw==", - "dev": true, - "dependencies": { - "pinkie": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/pkg-dir/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/pkg-dir/node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/prettier": { - "version": "2.8.4", - "resolved": "https://registry.npmjs.org/prettier/-/prettier-2.8.4.tgz", - "integrity": "sha512-vIS4Rlc2FNh0BySk3Wkd6xmwxB0FpOndW5fisM5H8hsZSxU2VWVB5CWIkIjWvrHjIhxk2g3bfMKM87zNTrZddw==", - "dev": true, - "bin": { - "prettier": "bin-prettier.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "url": "https://github.com/prettier/prettier?sponsor=1" - } - }, - "node_modules/progress": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", - "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/randombytes": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz", - "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==", - "dev": true, - "dependencies": { - "safe-buffer": "^5.1.0" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/rechoir": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.7.1.tgz", - "integrity": "sha512-/njmZ8s1wVeR6pjTZ+0nCnv8SpZNRMT2D1RLOJQESlYFDBvwpTA4KWJpZ+sBJ4+vhjILRcK7JIFdGCdxEAAitg==", - "dev": true, - "dependencies": { - "resolve": "^1.9.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/regexpp": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/regexpp/-/regexpp-3.2.0.tgz", - "integrity": "sha512-pq2bWo9mVD43nbts2wGv17XLiNLya+GklZ8kaDLV2Z08gDCsGpnKn9BFMepvWuHCbyVvY7J5o5+BVvoQbmlJLg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/mysticatea" - } - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve": { - "version": "1.22.1", - "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.1.tgz", - "integrity": "sha512-nBpuuYuY5jFsli/JIs1oldw6fOQCBioohqWZg/2hiaOybXOft4lonv85uDOKXdf8rhyK159cxU5cDcK/NKk8zw==", - "dev": true, - "dependencies": { - "is-core-module": "^2.9.0", - "path-parse": "^1.0.7", - "supports-preserve-symlinks-flag": "^1.0.0" - }, - "bin": { - "resolve": "bin/resolve" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-cwd/node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/schema-utils": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-3.1.1.tgz", - "integrity": "sha512-Y5PQxS4ITlC+EahLuXaY86TXfR7Dc5lw294alXOq86JAHCihAIZfqv8nNCWvaEJvaC51uN9hbLGeV0cFBdH+Fw==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.8", - "ajv": "^6.12.5", - "ajv-keywords": "^3.5.2" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - } - }, - "node_modules/semver": { - "version": "7.3.8", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.8.tgz", - "integrity": "sha512-NB1ctGL5rlHrPJtFDVIVzTyQylMLu9N9VICA6HSFJo8MCGVTMW6gfpicwKmmK/dAjTOrqu5l63JJOpDSrAis3A==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/serialize-javascript": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz", - "integrity": "sha512-SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/shallow-clone": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz", - "integrity": "sha512-/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==", - "dev": true, - "dependencies": { - "kind-of": "^6.0.2" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/simple-update-notifier": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-1.1.0.tgz", - "integrity": "sha512-VpsrsJSUcJEseSbMHkrsrAVSdvVS5I96Qo1QAQ4FxQ9wXFcB+pjj7FB7/us9+GcgfW4ziHtYMc1J0PLczb55mg==", - "dev": true, - "dependencies": { - "semver": "~7.0.0" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/simple-update-notifier/node_modules/semver": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.0.0.tgz", - "integrity": "sha512-+GB6zVA9LWh6zovYQLALHwv5rb2PHGlJi3lfiqIHxR0uuwCgefcOJc59v9fv1w8GbStwxuuqqAjI9NMAOOgq1A==", - "dev": true, - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slice-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-4.0.0.tgz", - "integrity": "sha512-qMCMfhY040cVHT43K9BFygqYbUPFZKHOg7K73mtTWJRb8pyP3fzf4Ixd5SzdEJQ6MRUg/WBnOLxghZtKKurENQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "astral-regex": "^2.0.0", - "is-fullwidth-code-point": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.21", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", - "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", - "dev": true, - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, - "node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-preserve-symlinks-flag": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", - "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", - "dev": true, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/table": { - "version": "6.8.1", - "resolved": "https://registry.npmjs.org/table/-/table-6.8.1.tgz", - "integrity": "sha512-Y4X9zqrCftUhMeH2EptSSERdVKt/nEdijTOacGD/97EKjhQ/Qs8RTlEGABSJNNN8lac9kheH+af7yAkEWlgneA==", - "dev": true, - "dependencies": { - "ajv": "^8.0.1", - "lodash.truncate": "^4.4.2", - "slice-ansi": "^4.0.0", - "string-width": "^4.2.3", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/table/node_modules/ajv": { - "version": "8.12.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", - "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/table/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "dev": true - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/terser": { - "version": "5.16.6", - "resolved": "https://registry.npmjs.org/terser/-/terser-5.16.6.tgz", - "integrity": "sha512-IBZ+ZQIA9sMaXmRZCUMDjNH0D5AQQfdn4WUjHL0+1lF4TP1IHRJbrhb6fNaXWikrYQTSkb7SLxkeXAiy1p7mbg==", - "dev": true, - "dependencies": { - "@jridgewell/source-map": "^0.3.2", - "acorn": "^8.5.0", - "commander": "^2.20.0", - "source-map-support": "~0.5.20" - }, - "bin": { - "terser": "bin/terser" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/terser-webpack-plugin": { - "version": "5.3.7", - "resolved": "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.7.tgz", - "integrity": "sha512-AfKwIktyP7Cu50xNjXF/6Qb5lBNzYaWpU6YfoX3uZicTx0zTy0stDDCsvjDapKsSDvOeWo5MEq4TmdBy2cNoHw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.17", - "jest-worker": "^27.4.5", - "schema-utils": "^3.1.1", - "serialize-javascript": "^6.0.1", - "terser": "^5.16.5" - }, - "engines": { - "node": ">= 10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "^5.1.0" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "uglify-js": { - "optional": true - } - } - }, - "node_modules/terser-webpack-plugin/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.17", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.17.tgz", - "integrity": "sha512-MCNzAp77qzKca9+W/+I0+sEpaUnZoeasnghNeVc41VZCEKaCH73Vq3BZZ/SzWIgrqE4H4ceI+p+b6C0mHf9T4g==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "3.1.0", - "@jridgewell/sourcemap-codec": "1.4.14" - } - }, - "node_modules/terser-webpack-plugin/node_modules/serialize-javascript": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz", - "integrity": "sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==", - "dev": true, - "dependencies": { - "randombytes": "^2.1.0" - } - }, - "node_modules/terser/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/touch": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.0.tgz", - "integrity": "sha512-WBx8Uy5TLtOSRtIq+M03/sKDrXCLHxwDcquSP2c43Le03/9serjQBIztjRz6FkJez9D/hleyAXTBGLwwZUw9lA==", - "dev": true, - "dependencies": { - "nopt": "~1.0.10" - }, - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/ts-loader": { - "version": "9.4.2", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.4.2.tgz", - "integrity": "sha512-OmlC4WVmFv5I0PpaxYb+qGeGOdm5giHU7HwDDUjw59emP2UYMHy9fFSDcYgSNoH8sXcj4hGCSEhlDZ9ULeDraA==", - "dev": true, - "dependencies": { - "chalk": "^4.1.0", - "enhanced-resolve": "^5.0.0", - "micromatch": "^4.0.0", - "semver": "^7.3.4" - }, - "engines": { - "node": ">=12.0.0" - }, - "peerDependencies": { - "typescript": "*", - "webpack": "^5.0.0" - } - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/ts-node/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ts-node/node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true - }, - "node_modules/update-browserslist-db": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.10.tgz", - "integrity": "sha512-OztqDenkfFkbSG+tRxBeAnCVPckDBcvibKd35yDONx6OU8N7sqgwc7rCbkJ/WcYtVRZ4ba68d6byhC21GFh7sQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - } - ], - "dependencies": { - "escalade": "^3.1.1", - "picocolors": "^1.0.0" - }, - "bin": { - "browserslist-lint": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/v8-compile-cache": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz", - "integrity": "sha512-l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==", - "dev": true - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/watchpack": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz", - "integrity": "sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==", - "dev": true, - "dependencies": { - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.1.2" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack": { - "version": "5.76.2", - "resolved": "https://registry.npmjs.org/webpack/-/webpack-5.76.2.tgz", - "integrity": "sha512-Th05ggRm23rVzEOlX8y67NkYCHa9nTNcwHPBhdg+lKG+mtiW7XgggjAeeLnADAe7mLjJ6LUNfgHAuRRh+Z6J7w==", - "dev": true, - "dependencies": { - "@types/eslint-scope": "^3.7.3", - "@types/estree": "^0.0.51", - "@webassemblyjs/ast": "1.11.1", - "@webassemblyjs/wasm-edit": "1.11.1", - "@webassemblyjs/wasm-parser": "1.11.1", - "acorn": "^8.7.1", - "acorn-import-assertions": "^1.7.6", - "browserslist": "^4.14.5", - "chrome-trace-event": "^1.0.2", - "enhanced-resolve": "^5.10.0", - "es-module-lexer": "^0.9.0", - "eslint-scope": "5.1.1", - "events": "^3.2.0", - "glob-to-regexp": "^0.4.1", - "graceful-fs": "^4.2.9", - "json-parse-even-better-errors": "^2.3.1", - "loader-runner": "^4.2.0", - "mime-types": "^2.1.27", - "neo-async": "^2.6.2", - "schema-utils": "^3.1.0", - "tapable": "^2.1.1", - "terser-webpack-plugin": "^5.1.3", - "watchpack": "^2.4.0", - "webpack-sources": "^3.2.3" - }, - "bin": { - "webpack": "bin/webpack.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependenciesMeta": { - "webpack-cli": { - "optional": true - } - } - }, - "node_modules/webpack-cli": { - "version": "4.10.0", - "resolved": "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.10.0.tgz", - "integrity": "sha512-NLhDfH/h4O6UOy+0LSso42xvYypClINuMNBVVzX4vX98TmTaTUxwRbXdhucbFMd2qLaCTcLq/PdYrvi8onw90w==", - "dev": true, - "dependencies": { - "@discoveryjs/json-ext": "^0.5.0", - "@webpack-cli/configtest": "^1.2.0", - "@webpack-cli/info": "^1.5.0", - "@webpack-cli/serve": "^1.7.0", - "colorette": "^2.0.14", - "commander": "^7.0.0", - "cross-spawn": "^7.0.3", - "fastest-levenshtein": "^1.0.12", - "import-local": "^3.0.2", - "interpret": "^2.2.0", - "rechoir": "^0.7.0", - "webpack-merge": "^5.7.3" - }, - "bin": { - "webpack-cli": "bin/cli.js" - }, - "engines": { - "node": ">=10.13.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/webpack" - }, - "peerDependencies": { - "webpack": "4.x.x || 5.x.x" - }, - "peerDependenciesMeta": { - "@webpack-cli/generators": { - "optional": true - }, - "@webpack-cli/migrate": { - "optional": true - }, - "webpack-bundle-analyzer": { - "optional": true - }, - "webpack-dev-server": { - "optional": true - } - } - }, - "node_modules/webpack-cli/node_modules/commander": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", - "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", - "dev": true, - "engines": { - "node": ">= 10" - } - }, - "node_modules/webpack-merge": { - "version": "5.8.0", - "resolved": "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.8.0.tgz", - "integrity": "sha512-/SaI7xY0831XwP6kzuwhKWVKDP9t1QY1h65lAFLbZqMPIuYcD9QAW4u9STIbU9kaJbPBB/geU/gLr1wDjOhQ+Q==", - "dev": true, - "dependencies": { - "clone-deep": "^4.0.1", - "wildcard": "^2.0.0" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/webpack-sources": { - "version": "3.2.3", - "resolved": "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.3.tgz", - "integrity": "sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==", - "dev": true, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/webpack/node_modules/@types/estree": { - "version": "0.0.51", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.51.tgz", - "integrity": "sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==", - "dev": true - }, - "node_modules/webpack/node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/webpack/node_modules/acorn-import-assertions": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", - "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "peerDependencies": { - "acorn": "^8" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/wildcard": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz", - "integrity": "sha512-JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==", - "dev": true - }, - "node_modules/word-wrap": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz", - "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/workerpool": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/workerpool/-/workerpool-6.2.1.tgz", - "integrity": "sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==", - "dev": true - }, - "node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yargs": { - "version": "16.2.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-16.2.0.tgz", - "integrity": "sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==", - "dev": true, - "dependencies": { - "cliui": "^7.0.2", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.0", - "y18n": "^5.0.5", - "yargs-parser": "^20.2.2" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-parser": { - "version": "20.2.4", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-20.2.4.tgz", - "integrity": "sha512-WOkpgNhPTlE73h4VFAFsOnomJVaovO8VqLDzy5saChRBFQFBoMYirowyW+Q9HB4HFF4Z7VZTiG3iSzJJA29yRA==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/yargs-unparser": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/yargs-unparser/-/yargs-unparser-2.0.0.tgz", - "integrity": "sha512-7pRTIA9Qc1caZ0bZ6RYRGbHJthJWuakf+WmHK0rVeLkNrrGhfoabBNdue6kdINI6r4if7ocq9aD/n7xwKOdzOA==", - "dev": true, - "dependencies": { - "camelcase": "^6.0.0", - "decamelize": "^4.0.0", - "flat": "^5.0.2", - "is-plain-obj": "^2.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/package.json b/package.json index 6487c88..31c8724 100644 --- a/package.json +++ b/package.json @@ -1,60 +1,25 @@ { - "name": "cohere-ai", - "version": "6.2.2", - "description": "A Node.js SDK with TypeScript support for the Cohere API.", - "homepage": "https://docs.cohere.ai", - "main": "index.js", - "types": "dist/cohere.d.ts", - "typings": "dist/cohere.d.ts", - "scripts": { - "build": "webpack --env production && mv cohere.d.ts dist/cohere.d.ts && rm services/*.d.ts && rm models/*.d.ts", - "dev": "webpack --progress --env development --env nodemon", - "test": "mocha -r ts-node/register test/test.ts", - "lint": "eslint . --ext .ts && prettier --check .", - "lint:fix": "prettier --write ." - }, - "files": [ - "/dist" - ], - "keywords": [ - "sdk", - "cohere", - "cohere.ai", - "javascript", - "node.js", - "typescript", - "sdk", - "api", - "natural", - "language" - ], - "author": "Cohere AI", - "license": "MIT", - "repository": { - "type": "git", - "url": "git+https://github.com/cohere-ai/cohere-node.git" - }, - "bugs": { - "url": "https://github.com/cohere-ai/cohere-node/issues" - }, - "devDependencies": { - "@types/chai": "^4.2.18", - "@types/mocha": "^8.2.2", - "@typescript-eslint/eslint-plugin": "^5.53.0", - "@typescript-eslint/parser": "^5.53.0", - "chai": "^4.3.4", - "clean-webpack-plugin": "^4.0.0-alpha.0", - "copy-webpack-plugin": "^8.1.1", - "eslint": "^7.27.0", - "eslint-config-prettier": "^8.5.0", - "eslint-webpack-plugin": "^2.5.4", - "mocha": "^10.0.0", - "nodemon-webpack-plugin": "^4.5.2", - "prettier": "^2.7.1", - "ts-loader": "^9.1.2", - "ts-node": "^10.8.1", - "typescript": "^4.9.5", - "webpack": "^5.37.0", - "webpack-cli": "^4.9.1" - } -} + "name": "cohere-ai", + "version": "7.0.0", + "private": false, + "repository": "https://github.com/cohere-ai/cohere-typescript", + "main": "./index.js", + "types": "./index.d.ts", + "scripts": { + "format": "prettier --write 'src/**/*.ts'", + "build": "tsc", + "prepack": "cp -rv dist/. ." + }, + "dependencies": { + "url-join": "4.0.1", + "@types/url-join": "4.0.1", + "axios": "0.27.2", + "@ungap/url-search-params": "0.2.2", + "js-base64": "3.7.2" + }, + "devDependencies": { + "@types/node": "17.0.33", + "prettier": "2.7.1", + "typescript": "4.6.4" + } +} \ No newline at end of file diff --git a/services/api_service.ts b/services/api_service.ts deleted file mode 100644 index 5aed293..0000000 --- a/services/api_service.ts +++ /dev/null @@ -1,81 +0,0 @@ -import https = require("https"); -import { cohereResponse, cohereParameters, responseBody } from "../models"; -import errors from "./error_service"; - -interface APIService { - init(key: string): void; - post( - endpoint: string, - data: cohereParameters - ): Promise>; -} - -enum URL { - COHERE_API = "api.cohere.ai", -} - -class APIImpl implements APIService { - private COHERE_API_KEY = ""; - private COHERE_VERSION = "1"; - - public init(key: string): void { - this.COHERE_API_KEY = key; - } - - public async post( - endpoint: string, - data: cohereParameters - ): Promise> { - return new Promise((resolve, reject) => { - try { - // workaround for js projects that pass json strings. - data = JSON.parse(`${data}`); - } catch (e) {} - const reqData = JSON.stringify(data); - const req = https.request( - { - hostname: URL.COHERE_API, - path: `/v${this.COHERE_VERSION}${endpoint}`, - method: "POST", - headers: { - "Content-Type": "application/json; charset=utf-8", - "Content-Length": Buffer.byteLength(reqData, "utf8"), - Authorization: `Bearer ${this.COHERE_API_KEY}`, - "Request-Source": "node-sdk", - }, - timeout: 5000, - }, - (res) => { - const data: Uint8Array[] = []; - res.on("data", (chunk) => data.push(chunk)); - res.on("end", () => { - if ("x-api-warning" in res.headers) { - const warnHeader = res.headers["x-api-warning"]; - if (typeof warnHeader === "string") { - console.warn("\x1b[33mWarning: %s\x1b[0m", warnHeader); - } else { - for (const warning in warnHeader) { - console.warn("\x1b[33mWarning: %s\x1b[0m", warning); - } - } - } - resolve({ - statusCode: res.statusCode, - body: JSON.parse(Buffer.concat(data).toString()), - }); - }); - } - ); - - req.on("error", (error: Record) => - reject(errors.handleError(error)) - ); - - req.write(reqData, "utf8"); - req.end(); - }); - } -} - -const API = new APIImpl(); -export = API; diff --git a/services/error_service.ts b/services/error_service.ts deleted file mode 100644 index 826ac4c..0000000 --- a/services/error_service.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { cohereResponse, error } from "../models"; -interface cohereError { - response?: { - status?: number; - data?: { - message?: string; - }; - }; - message?: string; -} - -interface errorService { - handleError(error: cohereError): cohereResponse; -} - -class errorImpl implements errorService { - public handleError(error: cohereError): cohereResponse { - const status = error.response?.status || 500; - const message = error.response?.data?.message || error.message; - return { - statusCode: status, - body: { - message: message, - }, - }; - } -} - -const errors = new errorImpl(); -export = errors; diff --git a/src/Client.ts b/src/Client.ts new file mode 100644 index 0000000..425d1b5 --- /dev/null +++ b/src/Client.ts @@ -0,0 +1,559 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as environments from "./environments"; +import * as core from "./core"; +import * as Cohere from "./api"; +import * as serializers from "./serialization"; +import urlJoin from "url-join"; +import * as errors from "./errors"; + +export declare namespace CohereClient { + interface Options { + environment?: core.Supplier; + token: core.Supplier; + } + + interface RequestOptions { + timeoutInSeconds?: number; + } +} + +export class CohereClient { + constructor(protected readonly _options: CohereClient.Options) {} + + /** + * This endpoint generates realistic text conditioned on a given input. + * @throws {@link Cohere.BadRequestError} + * @throws {@link Cohere.InternalServerError} + */ + public async generate( + request: Cohere.GenerateRequest, + requestOptions?: CohereClient.RequestOptions + ): Promise { + const _response = await core.fetcher({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.CohereEnvironment.Production, + "v1/generate" + ), + method: "POST", + headers: { + Authorization: await this._getAuthorizationHeader(), + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "cohere-ai", + "X-Fern-SDK-Version": "7.0.0", + }, + contentType: "application/json", + body: await serializers.GenerateRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }), + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + }); + if (_response.ok) { + return await serializers.Generation.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }); + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new Cohere.BadRequestError(_response.error.body); + case 500: + throw new Cohere.InternalServerError(_response.error.body); + default: + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.CohereTimeoutError(); + case "unknown": + throw new errors.CohereError({ + message: _response.error.errorMessage, + }); + } + } + + /** + * This endpoint returns text embeddings. An embedding is a list of floating point numbers that captures semantic information about the text that it represents. + * + * Embeddings can be used to create text classifiers as well as empower semantic search. To learn more about embeddings, see the embedding page. + * + * If you want to learn more how to use the embedding model, have a look at the [Semantic Search Guide](/docs/semantic-search). + * @throws {@link Cohere.BadRequestError} + * @throws {@link Cohere.InternalServerError} + */ + public async embed( + request: Cohere.EmbedRequest, + requestOptions?: CohereClient.RequestOptions + ): Promise { + const _response = await core.fetcher({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.CohereEnvironment.Production, + "v1/embed" + ), + method: "POST", + headers: { + Authorization: await this._getAuthorizationHeader(), + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "cohere-ai", + "X-Fern-SDK-Version": "7.0.0", + }, + contentType: "application/json", + body: await serializers.EmbedRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }), + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + }); + if (_response.ok) { + return await serializers.EmbedResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }); + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new Cohere.BadRequestError(_response.error.body); + case 500: + throw new Cohere.InternalServerError(_response.error.body); + default: + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.CohereTimeoutError(); + case "unknown": + throw new errors.CohereError({ + message: _response.error.errorMessage, + }); + } + } + + /** + * This endpoint makes a prediction about which label fits the specified text inputs best. To make a prediction, Classify uses the provided `examples` of text + label pairs as a reference. + * Note: [Custom Models](/training-representation-models) trained on classification examples don't require the `examples` parameter to be passed in explicitly. + * @throws {@link Cohere.BadRequestError} + * @throws {@link Cohere.InternalServerError} + */ + public async classify( + request: Cohere.ClassifyRequest, + requestOptions?: CohereClient.RequestOptions + ): Promise { + const _response = await core.fetcher({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.CohereEnvironment.Production, + "v1/classify" + ), + method: "POST", + headers: { + Authorization: await this._getAuthorizationHeader(), + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "cohere-ai", + "X-Fern-SDK-Version": "7.0.0", + }, + contentType: "application/json", + body: await serializers.ClassifyRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }), + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + }); + if (_response.ok) { + return await serializers.ClassifyResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }); + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new Cohere.BadRequestError(_response.error.body); + case 500: + throw new Cohere.InternalServerError(_response.error.body); + default: + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.CohereTimeoutError(); + case "unknown": + throw new errors.CohereError({ + message: _response.error.errorMessage, + }); + } + } + + /** + * The `chat` endpoint allows users to have conversations with a Large Language Model (LLM) from Cohere. Users can send messages as part of a persisted conversation using the `conversation_id` parameter, or they can pass in their own conversation history using the `chat_history` parameter. + * The endpoint features additional parameters such as `connectors` and `documents` that enable conversations enriched by external knowledge. We call this "Retrieval Augmented Generation", or "RAG". + * If you have questions or require support, we're here to help! Reach out to your Cohere partner to enable access to this API. + * + */ + public async chat( + request: Cohere.ChatRequest, + requestOptions?: CohereClient.RequestOptions + ): Promise { + const _response = await core.fetcher({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.CohereEnvironment.Production, + "v1/chat" + ), + method: "POST", + headers: { + Authorization: await this._getAuthorizationHeader(), + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "cohere-ai", + "X-Fern-SDK-Version": "7.0.0", + }, + contentType: "application/json", + body: await serializers.ChatRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }), + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + }); + if (_response.ok) { + return await serializers.ChatResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }); + } + + if (_response.error.reason === "status-code") { + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.CohereTimeoutError(); + case "unknown": + throw new errors.CohereError({ + message: _response.error.errorMessage, + }); + } + } + + /** + * This endpoint splits input text into smaller units called tokens using byte-pair encoding (BPE). To learn more about tokenization and byte pair encoding, see the tokens page. + * @throws {@link Cohere.BadRequestError} + * @throws {@link Cohere.InternalServerError} + */ + public async tokenize( + request: Cohere.TokenizeRequest, + requestOptions?: CohereClient.RequestOptions + ): Promise { + const _response = await core.fetcher({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.CohereEnvironment.Production, + "v1/tokenize" + ), + method: "POST", + headers: { + Authorization: await this._getAuthorizationHeader(), + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "cohere-ai", + "X-Fern-SDK-Version": "7.0.0", + }, + contentType: "application/json", + body: await serializers.TokenizeRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }), + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + }); + if (_response.ok) { + return await serializers.TokenizeResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }); + } + + if (_response.error.reason === "status-code") { + switch (_response.error.statusCode) { + case 400: + throw new Cohere.BadRequestError(_response.error.body); + case 500: + throw new Cohere.InternalServerError(_response.error.body); + default: + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.CohereTimeoutError(); + case "unknown": + throw new errors.CohereError({ + message: _response.error.errorMessage, + }); + } + } + + /** + * This endpoint takes tokens using byte-pair encoding and returns their text representation. To learn more about tokenization and byte pair encoding, see the tokens page. + */ + public async detokenize( + request: Cohere.DetokenizeRequest, + requestOptions?: CohereClient.RequestOptions + ): Promise { + const _response = await core.fetcher({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.CohereEnvironment.Production, + "v1/detokenize" + ), + method: "POST", + headers: { + Authorization: await this._getAuthorizationHeader(), + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "cohere-ai", + "X-Fern-SDK-Version": "7.0.0", + }, + contentType: "application/json", + body: await serializers.DetokenizeRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }), + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + }); + if (_response.ok) { + return await serializers.DetokenizeResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }); + } + + if (_response.error.reason === "status-code") { + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.CohereTimeoutError(); + case "unknown": + throw new errors.CohereError({ + message: _response.error.errorMessage, + }); + } + } + + /** + * This endpoint identifies which language each of the provided texts is written in. + */ + public async detectLanguage( + request: Cohere.DetectLanguageRequest, + requestOptions?: CohereClient.RequestOptions + ): Promise { + const _response = await core.fetcher({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.CohereEnvironment.Production, + "v1/detect-language" + ), + method: "POST", + headers: { + Authorization: await this._getAuthorizationHeader(), + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "cohere-ai", + "X-Fern-SDK-Version": "7.0.0", + }, + contentType: "application/json", + body: await serializers.DetectLanguageRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }), + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + }); + if (_response.ok) { + return await serializers.DetectLanguageResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }); + } + + if (_response.error.reason === "status-code") { + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.CohereTimeoutError(); + case "unknown": + throw new errors.CohereError({ + message: _response.error.errorMessage, + }); + } + } + + /** + * This endpoint generates a summary in English for a given text. + */ + public async summarize( + request: Cohere.SummarizeRequest, + requestOptions?: CohereClient.RequestOptions + ): Promise { + const _response = await core.fetcher({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.CohereEnvironment.Production, + "v1/summarize" + ), + method: "POST", + headers: { + Authorization: await this._getAuthorizationHeader(), + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "cohere-ai", + "X-Fern-SDK-Version": "7.0.0", + }, + contentType: "application/json", + body: await serializers.SummarizeRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }), + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + }); + if (_response.ok) { + return await serializers.SummarizeResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }); + } + + if (_response.error.reason === "status-code") { + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.CohereTimeoutError(); + case "unknown": + throw new errors.CohereError({ + message: _response.error.errorMessage, + }); + } + } + + /** + * This endpoint takes in a query and a list of texts and produces an ordered array with each text assigned a relevance score. + */ + public async rerank( + request: Cohere.RerankRequest, + requestOptions?: CohereClient.RequestOptions + ): Promise { + const _response = await core.fetcher({ + url: urlJoin( + (await core.Supplier.get(this._options.environment)) ?? environments.CohereEnvironment.Production, + "v1/rerank" + ), + method: "POST", + headers: { + Authorization: await this._getAuthorizationHeader(), + "X-Fern-Language": "JavaScript", + "X-Fern-SDK-Name": "cohere-ai", + "X-Fern-SDK-Version": "7.0.0", + }, + contentType: "application/json", + body: await serializers.RerankRequest.jsonOrThrow(request, { unrecognizedObjectKeys: "strip" }), + timeoutMs: requestOptions?.timeoutInSeconds != null ? requestOptions.timeoutInSeconds * 1000 : 60000, + }); + if (_response.ok) { + return await serializers.RerankResponse.parseOrThrow(_response.body, { + unrecognizedObjectKeys: "passthrough", + allowUnrecognizedUnionMembers: true, + allowUnrecognizedEnumValues: true, + breadcrumbsPrefix: ["response"], + }); + } + + if (_response.error.reason === "status-code") { + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.body, + }); + } + + switch (_response.error.reason) { + case "non-json": + throw new errors.CohereError({ + statusCode: _response.error.statusCode, + body: _response.error.rawBody, + }); + case "timeout": + throw new errors.CohereTimeoutError(); + case "unknown": + throw new errors.CohereError({ + message: _response.error.errorMessage, + }); + } + } + + protected async _getAuthorizationHeader() { + return `Bearer ${await core.Supplier.get(this._options.token)}`; + } +} diff --git a/src/api/client/index.ts b/src/api/client/index.ts new file mode 100644 index 0000000..415726b --- /dev/null +++ b/src/api/client/index.ts @@ -0,0 +1 @@ +export * from "./requests"; diff --git a/src/api/client/requests/ChatRequest.ts b/src/api/client/requests/ChatRequest.ts new file mode 100644 index 0000000..d6d6973 --- /dev/null +++ b/src/api/client/requests/ChatRequest.ts @@ -0,0 +1,81 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from "../.."; + +export interface ChatRequest { + /** + * Accepts a string. + * The chat message from the user to the model. + * + */ + message: string; + /** + * Defaults to `command`. + * The identifier of the model, which can be one of the existing Cohere models or the full ID for a [finetuned custom model](/docs/training-custom-models). + * Compatible Cohere models are `command` and `command-light` as well as the experimental `command-nightly` and `command-light-nightly` variants. Read more about [Cohere models](https://docs.cohere.com/docs/models). + * + */ + model?: string; + /** + * Defaults to `false`. + * When `true`, the response will be a JSON stream of events. The final event will contain the complete response, and will have an `event_type` of `"stream-end"`. + * Streaming is beneficial for user interfaces that render the contents of the response piece by piece, as it gets generated. + * + */ + stream?: boolean; + /** + * When specified, the default Cohere preamble will be replaced with the provided one. + * + */ + preambleOverride?: string; + /** + * A list of previous messages between the user and the model, meant to give the model conversational context for responding to the user's `message`. + * + */ + chatHistory?: Cohere.ChatMessage[]; + /** + * An alternative to `chat_history`. Previous conversations can be resumed by providing the conversation's identifier. The contents of `message` and the model's response will be stored as part of this conversation. + * If a conversation with this id does not already exist, a new conversation will be created. + * + */ + conversationId?: string; + /** + * Defaults to `AUTO` when `connectors` are specified and `OFF` in all other cases. + * Dictates how the prompt will be constructed. + * With `prompt_truncation` set to "AUTO", some elements from `chat_history` and `documents` will be dropped in an attempt to construct a prompt that fits within the model's context length limit. + * With `prompt_truncation` set to "OFF", no elements will be dropped. If the sum of the inputs exceeds the model's context length limit, a `TooManyTokens` error will be returned. + * + */ + promptTruncation?: Cohere.ChatRequestPromptTruncation; + /** + * Currently only accepts `{"id": "web-search"}`. + * When specified, the model's reply will be enriched with information found by quering each of the connectors (RAG). + * + */ + connectors?: Cohere.ChatConnector[]; + /** + * Defaults to `false`. + * When `true`, the response will only contain a list of generated search queries, but no search will take place, and no reply from the model to the user's `message` will be generated. + * + */ + searchQueriesOnly?: boolean; + /** + * A list of relevant documents that the model can use to enrich its reply (RAG). + * + */ + documents?: Cohere.ChatDocument[]; + /** + * Defaults to `"accurate"`. + * Dictates the approach taken to generating citations as part of the RAG flow by allowing the user to specify whether they want `"accurate"` results or `"fast"` results. + * + */ + citationQuality?: Cohere.ChatRequestCitationQuality; + /** + * Defaults to `0.3` + * A non-negative float that tunes the degree of randomness in generation. Lower temperatures mean less random generations, and higher temperatures mean more random generations. + * + */ + temperature?: number; +} diff --git a/src/api/client/requests/ClassifyRequest.ts b/src/api/client/requests/ClassifyRequest.ts new file mode 100644 index 0000000..e39c962 --- /dev/null +++ b/src/api/client/requests/ClassifyRequest.ts @@ -0,0 +1,25 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from "../.."; + +export interface ClassifyRequest { + /** Represents a list of queries to be classified, each entry must not be empty. The maximum is 96 inputs. */ + inputs: string[]; + /** + * An array of examples to provide context to the model. Each example is a text string and its associated label/class. Each unique label requires at least 2 examples associated with it; the maximum number of examples is 2500, and each example has a maximum length of 512 tokens. The values should be structured as `{text: "...",label: "..."}`. + * Note: [Custom Models](/training-representation-models) trained on classification examples don't require the `examples` parameter to be passed in explicitly. + */ + examples: Cohere.ClassifyRequestExamplesItem[]; + /** The identifier of the model. Currently available models are `embed-multilingual-v2.0`, `embed-english-light-v2.0`, and `embed-english-v2.0` (default). Smaller "light" models are faster, while larger models will perform better. [Custom models](/docs/training-custom-models) can also be supplied with their full ID. */ + model?: string; + /** The ID of a custom playground preset. You can create presets in the [playground](https://dashboard.cohere.ai/playground/classify?model=large). If you use a preset, all other parameters become optional, and any included parameters will override the preset's parameters. */ + preset?: string; + /** + * One of `NONE|START|END` to specify how the API will handle inputs longer than the maximum token length. + * Passing `START` will discard the start of the input. `END` will discard the end of the input. In both cases, input is discarded until the remaining input is exactly the maximum input token length for the model. + * If `NONE` is selected, when the input exceeds the maximum input token length an error will be returned. + */ + truncate?: Cohere.ClassifyRequestTruncate; +} diff --git a/src/api/client/requests/DetectLanguageRequest.ts b/src/api/client/requests/DetectLanguageRequest.ts new file mode 100644 index 0000000..3ccaf55 --- /dev/null +++ b/src/api/client/requests/DetectLanguageRequest.ts @@ -0,0 +1,8 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface DetectLanguageRequest { + /** List of strings to run the detection on. */ + texts: string[]; +} diff --git a/src/api/client/requests/DetokenizeRequest.ts b/src/api/client/requests/DetokenizeRequest.ts new file mode 100644 index 0000000..fa20aa9 --- /dev/null +++ b/src/api/client/requests/DetokenizeRequest.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface DetokenizeRequest { + /** The list of tokens to be detokenized. */ + tokens: number[]; + /** An optional parameter to provide the model name. This will ensure that the detokenization is done by the tokenizer used by that model. */ + model?: string; +} diff --git a/src/api/client/requests/EmbedRequest.ts b/src/api/client/requests/EmbedRequest.ts new file mode 100644 index 0000000..1a60aa9 --- /dev/null +++ b/src/api/client/requests/EmbedRequest.ts @@ -0,0 +1,27 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from "../.."; + +export interface EmbedRequest { + /** An array of strings for the model to embed. Maximum number of texts per call is `96`. We recommend reducing the length of each text to be under `512` tokens for optimal quality. */ + texts: string[]; + /** + * The identifier of the model. Smaller "light" models are faster, while larger models will perform better. [Custom models](/docs/training-custom-models) can also be supplied with their full ID. + * + * Available models and corresponding embedding dimensions: + * * `embed-english-v2.0` (default) 4096 + * * `embed-english-light-v2.0` 1024 + * * `embed-multilingual-v2.0` 768 + */ + model?: string; + /** + * One of `NONE|START|END` to specify how the API will handle inputs longer than the maximum token length. + * + * Passing `START` will discard the start of the input. `END` will discard the end of the input. In both cases, input is discarded until the remaining input is exactly the maximum input token length for the model. + * + * If `NONE` is selected, when the input exceeds the maximum input token length an error will be returned. + */ + truncate?: Cohere.EmbedRequestTruncate; +} diff --git a/src/api/client/requests/GenerateRequest.ts b/src/api/client/requests/GenerateRequest.ts new file mode 100644 index 0000000..cef54a5 --- /dev/null +++ b/src/api/client/requests/GenerateRequest.ts @@ -0,0 +1,102 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from "../.."; + +export interface GenerateRequest { + /** + * The input text that serves as the starting point for generating the response. + * Note: The prompt will be pre-processed and modified before reaching the model. + * + */ + prompt: string; + /** + * The identifier of the model to generate with. Currently available models are `command` (default), `command-nightly` (experimental), `command-light`, and `command-light-nightly` (experimental). + * Smaller, "light" models are faster, while larger models will perform better. [Custom models](/docs/training-custom-models) can also be supplied with their full ID. + */ + model?: string; + /** + * The maximum number of generations that will be returned. Defaults to `1`, min value of `1`, max value of `5`. + * + */ + numGenerations?: number; + /** + * When `true`, the response will be a JSON stream of events. Streaming is beneficial for user interfaces that render the contents of the response piece by piece, as it gets generated. + * + * The final event will contain the complete response, and will contain an `is_finished` field set to `true`. The event will also contain a `finish_reason`, which can be one of the following: + * - `COMPLETE` - the model sent back a finished reply + * - `MAX_TOKENS` - the reply was cut off because the model reached the maximum number of tokens for its context length + * - `ERROR` - something went wrong when generating the reply + * - `ERROR_TOXIC` - the model generated a reply that was deemed toxic + * + */ + stream?: boolean; + /** + * The maximum number of tokens the model will generate as part of the response. Note: Setting a low value may result in incomplete generations. + * Defaults to `20`. See [BPE Tokens](/bpe-tokens-wiki) for more details. + * + * Can only be set to `0` if `return_likelihoods` is set to `ALL` to get the likelihood of the prompt. + * + */ + maxTokens?: number; + /** + * One of `NONE|START|END` to specify how the API will handle inputs longer than the maximum token length. + * + * Passing `START` will discard the start of the input. `END` will discard the end of the input. In both cases, input is discarded until the remaining input is exactly the maximum input token length for the model. + * + * If `NONE` is selected, when the input exceeds the maximum input token length an error will be returned. + */ + truncate?: Cohere.GenerateRequestTruncate; + /** + * A non-negative float that tunes the degree of randomness in generation. Lower temperatures mean less random generations. See [Temperature](/temperature-wiki) for more details. + * Defaults to `0.75`, min value of `0.0`, max value of `5.0`. + * + */ + temperature?: number; + /** + * Identifier of a custom preset. A preset is a combination of parameters, such as prompt, temperature etc. You can create presets in the [playground](https://dashboard.cohere.ai/playground/generate). + * When a preset is specified, the `prompt` parameter becomes optional, and any included parameters will override the preset's parameters. + * + */ + preset?: string; + /** The generated text will be cut at the beginning of the earliest occurence of an end sequence. The sequence will be excluded from the text. */ + endSequences?: string[]; + /** The generated text will be cut at the end of the earliest occurence of a stop sequence. The sequence will be included the text. */ + stopSequences?: string[]; + /** + * Ensures only the top `k` most likely tokens are considered for generation at each step. + * Defaults to `0`, min value of `0`, max value of `500`. + * + */ + k?: number; + /** + * Ensures that only the most likely tokens, with total probability mass of `p`, are considered for generation at each step. If both `k` and `p` are enabled, `p` acts after `k`. + * Defaults to `0`. min value of `0.01`, max value of `0.99`. + * + */ + p?: number; + /** + * Used to reduce repetitiveness of generated tokens. The higher the value, the stronger a penalty is applied to previously present tokens, proportional to how many times they have already appeared in the prompt or prior generation.' + * + */ + frequencyPenalty?: number; + /** Defaults to `0.0`, min value of `0.0`, max value of `1.0`. Can be used to reduce repetitiveness of generated tokens. Similar to `frequency_penalty`, except that this penalty is applied equally to all tokens that have already appeared, regardless of their exact frequencies. */ + presencePenalty?: number; + /** + * One of `GENERATION|ALL|NONE` to specify how and if the token likelihoods are returned with the response. Defaults to `NONE`. + * + * If `GENERATION` is selected, the token likelihoods will only be provided for generated text. + * + * If `ALL` is selected, the token likelihoods will be provided both for the prompt and the generated text. + */ + returnLikelihoods?: Cohere.GenerateRequestReturnLikelihoods; + /** + * Used to prevent the model from generating unwanted tokens or to incentivize it to include desired tokens. The format is `{token_id: bias}` where bias is a float between -10 and 10. Tokens can be obtained from text using [Tokenize](/reference/tokenize). + * + * For example, if the value `{'11': -10}` is provided, the model will be very unlikely to include the token 11 (`"\n"`, the newline character) anywhere in the generated text. In contrast `{'11': 10}` will result in generations that nearly only contain that token. Values between -10 and 10 will proportionally affect the likelihood of the token appearing in the generated text. + * + * Note: logit bias may not be supported for all custom models. + */ + logitBias?: Record; +} diff --git a/src/api/client/requests/RerankRequest.ts b/src/api/client/requests/RerankRequest.ts new file mode 100644 index 0000000..799085a --- /dev/null +++ b/src/api/client/requests/RerankRequest.ts @@ -0,0 +1,27 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from "../.."; + +export interface RerankRequest { + /** The identifier of the model to use, one of : `rerank-english-v2.0`, `rerank-multilingual-v2.0` */ + model?: string; + /** The search query */ + query: string; + /** + * A list of document objects or strings to rerank. + * If a document is provided the text fields is required and all other fields will be preserved in the response. + * The total max chunks (length of documents * max_chunks_per_doc) must be less than 10000. + */ + documents: Cohere.RerankRequestDocumentsItem[]; + /** The number of most relevant documents or indices to return, defaults to the length of the documents */ + topN?: number; + /** + * - If false, returns results without the doc text - the api will return a list of {index, relevance score} where index is inferred from the list passed into the request. + * - If true, returns results with the doc text passed in - the api will return an ordered list of {index, text, relevance score} where index + text refers to the list passed into the request. + */ + returnDocuments?: boolean; + /** The maximum number of chunks to produce internally from a document */ + maxChunksPerDoc?: number; +} diff --git a/src/api/client/requests/SummarizeRequest.ts b/src/api/client/requests/SummarizeRequest.ts new file mode 100644 index 0000000..8d4ea13 --- /dev/null +++ b/src/api/client/requests/SummarizeRequest.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from "../.."; + +export interface SummarizeRequest { + /** The text to generate a summary for. Can be up to 100,000 characters long. Currently the only supported language is English. */ + text: string; + /** One of `short`, `medium`, `long`, or `auto` defaults to `auto`. Indicates the approximate length of the summary. If `auto` is selected, the best option will be picked based on the input text. */ + length?: Cohere.SummarizeRequestLength; + /** One of `paragraph`, `bullets`, or `auto`, defaults to `auto`. Indicates the style in which the summary will be delivered - in a free form paragraph or in bullet points. If `auto` is selected, the best option will be picked based on the input text. */ + format?: Cohere.SummarizeRequestFormat; + /** The identifier of the model to generate the summary with. Currently available models are `command` (default), `command-nightly` (experimental), `command-light`, and `command-light-nightly` (experimental). Smaller, "light" models are faster, while larger models will perform better. */ + model?: Cohere.SummarizeRequestModel; + /** One of `low`, `medium`, `high`, or `auto`, defaults to `auto`. Controls how close to the original text the summary is. `high` extractiveness summaries will lean towards reusing sentences verbatim, while `low` extractiveness summaries will tend to paraphrase more. If `auto` is selected, the best option will be picked based on the input text. */ + extractiveness?: Cohere.SummarizeRequestExtractiveness; + /** Ranges from 0 to 5. Controls the randomness of the output. Lower values tend to generate more “predictable” output, while higher values tend to generate more “creative” output. The sweet spot is typically between 0 and 1. */ + temperature?: number; + /** A free-form instruction for modifying how the summaries get generated. Should complete the sentence "Generate a summary _". Eg. "focusing on the next steps" or "written by Yoda" */ + additionalCommand?: string; +} diff --git a/src/api/client/requests/TokenizeRequest.ts b/src/api/client/requests/TokenizeRequest.ts new file mode 100644 index 0000000..0411de4 --- /dev/null +++ b/src/api/client/requests/TokenizeRequest.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface TokenizeRequest { + /** The string to be tokenized, the minimum text length is 1 character, and the maximum text length is 65536 characters. */ + text: string; + /** An optional parameter to provide the model name. This will ensure that the tokenization uses the tokenizer used by that model. */ + model?: string; +} diff --git a/src/api/client/requests/index.ts b/src/api/client/requests/index.ts new file mode 100644 index 0000000..dc6691f --- /dev/null +++ b/src/api/client/requests/index.ts @@ -0,0 +1,9 @@ +export { GenerateRequest } from "./GenerateRequest"; +export { EmbedRequest } from "./EmbedRequest"; +export { ClassifyRequest } from "./ClassifyRequest"; +export { ChatRequest } from "./ChatRequest"; +export { TokenizeRequest } from "./TokenizeRequest"; +export { DetokenizeRequest } from "./DetokenizeRequest"; +export { DetectLanguageRequest } from "./DetectLanguageRequest"; +export { SummarizeRequest } from "./SummarizeRequest"; +export { RerankRequest } from "./RerankRequest"; diff --git a/src/api/errors/BadRequestError.ts b/src/api/errors/BadRequestError.ts new file mode 100644 index 0000000..d53bf5f --- /dev/null +++ b/src/api/errors/BadRequestError.ts @@ -0,0 +1,15 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as errors from "../../errors"; + +export class BadRequestError extends errors.CohereError { + constructor(body?: unknown) { + super({ + statusCode: 400, + body: body, + }); + Object.setPrototypeOf(this, BadRequestError.prototype); + } +} diff --git a/src/api/errors/InternalServerError.ts b/src/api/errors/InternalServerError.ts new file mode 100644 index 0000000..e52c7fc --- /dev/null +++ b/src/api/errors/InternalServerError.ts @@ -0,0 +1,15 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as errors from "../../errors"; + +export class InternalServerError extends errors.CohereError { + constructor(body?: unknown) { + super({ + statusCode: 500, + body: body, + }); + Object.setPrototypeOf(this, InternalServerError.prototype); + } +} diff --git a/src/api/errors/index.ts b/src/api/errors/index.ts new file mode 100644 index 0000000..ae53904 --- /dev/null +++ b/src/api/errors/index.ts @@ -0,0 +1,2 @@ +export * from "./BadRequestError"; +export * from "./InternalServerError"; diff --git a/src/api/index.ts b/src/api/index.ts new file mode 100644 index 0000000..9dc8224 --- /dev/null +++ b/src/api/index.ts @@ -0,0 +1,3 @@ +export * from "./types"; +export * from "./errors"; +export * from "./client"; diff --git a/src/api/types/ApiMeta.ts b/src/api/types/ApiMeta.ts new file mode 100644 index 0000000..2f0de32 --- /dev/null +++ b/src/api/types/ApiMeta.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface ApiMeta { + apiVersion?: Cohere.ApiMetaApiVersion; + warnings?: string[]; +} diff --git a/src/api/types/ApiMetaApiVersion.ts b/src/api/types/ApiMetaApiVersion.ts new file mode 100644 index 0000000..44f1591 --- /dev/null +++ b/src/api/types/ApiMetaApiVersion.ts @@ -0,0 +1,9 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface ApiMetaApiVersion { + version: string; + isDeprecated?: boolean; + isExperimental?: boolean; +} diff --git a/src/api/types/ChatCitation.ts b/src/api/types/ChatCitation.ts new file mode 100644 index 0000000..a1791b2 --- /dev/null +++ b/src/api/types/ChatCitation.ts @@ -0,0 +1,30 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * A section of the generated reply which cites external knowledge. + * + */ +export interface ChatCitation { + /** + * The index of text that the citation starts at, counting from zero. For example, a generation of `Hello, world!` with a citation on `world` would have a start value of `7`. This is because the citation starts at `w`, which is the seventh character. + * + */ + start: number; + /** + * The index of text that the citation ends after, counting from zero. For example, a generation of `Hello, world!` with a citation on `world` would have an end value of `11`. This is because the citation ends after `d`, which is the eleventh character. + * + */ + end: number; + /** + * The text of the citation. For example, a generation of `Hello, world!` with a citation of `world` would have a text value of `world`. + * + */ + text: string; + /** + * Identifiers of documents cited by this section of the generated reply. + * + */ + documentIds: string[]; +} diff --git a/src/api/types/ChatCitationGenerationEvent.ts b/src/api/types/ChatCitationGenerationEvent.ts new file mode 100644 index 0000000..13fe719 --- /dev/null +++ b/src/api/types/ChatCitationGenerationEvent.ts @@ -0,0 +1,13 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface ChatCitationGenerationEvent extends Cohere.ChatStreamEvent { + /** + * Citations for the generated reply. + * + */ + citations: Cohere.ChatCitation[]; +} diff --git a/src/api/types/ChatConnector.ts b/src/api/types/ChatConnector.ts new file mode 100644 index 0000000..cafe289 --- /dev/null +++ b/src/api/types/ChatConnector.ts @@ -0,0 +1,29 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * The connector used for fetching documents. + * + */ +export interface ChatConnector { + /** + * The identifier of the connector. Currently only 'web-search' is supported. + * + */ + id: string; + /** + * Provides the connector with different settings at request time. The key/value pairs of this object are specific to each connector. + * + * The supported options are: + * + * **web-search** + * + * **site** - The web search results will be restricted to this domain (and TLD) when specified. Only a single domain is specified, and subdomains are also accepted. + * Examples: + * * `{"options": {"site": "cohere.com"}}` would restrict the results to all subdomains at cohere.com + * * `{"options": {"site": "txt.cohere.com"}}` would restrict the results to `txt.cohere.com` + * + */ + options?: Record; +} diff --git a/src/api/types/ChatDocument.ts b/src/api/types/ChatDocument.ts new file mode 100644 index 0000000..62d55e7 --- /dev/null +++ b/src/api/types/ChatDocument.ts @@ -0,0 +1,15 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * Relevant information that could be used by the model to generate a more accurate reply. + * The contents of each document are generally short (under 300 words), and are passed in the form of a + * dictionary of strings. Some suggested keys are "text", "author", "date". Both the key name and the value will be + * passed to the model. + * + */ +export interface ChatDocument { + /** Unique identifier for this document. */ + id?: string; +} diff --git a/src/api/types/ChatMessage.ts b/src/api/types/ChatMessage.ts new file mode 100644 index 0000000..4444225 --- /dev/null +++ b/src/api/types/ChatMessage.ts @@ -0,0 +1,15 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +/** + * A single message in a chat history. Contains the role of the sender, the text contents of the message, and optionally a username. + * + */ +export interface ChatMessage { + role: Cohere.ChatMessageRole; + message: string; + userName?: string; +} diff --git a/src/api/types/ChatMessageRole.ts b/src/api/types/ChatMessageRole.ts new file mode 100644 index 0000000..e624547 --- /dev/null +++ b/src/api/types/ChatMessageRole.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export type ChatMessageRole = "CHATBOT" | "USER"; + +export const ChatMessageRole = { + Chatbot: "CHATBOT", + User: "USER", +} as const; diff --git a/src/api/types/ChatRequestCitationQuality.ts b/src/api/types/ChatRequestCitationQuality.ts new file mode 100644 index 0000000..321d604 --- /dev/null +++ b/src/api/types/ChatRequestCitationQuality.ts @@ -0,0 +1,15 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * Defaults to `"accurate"`. + * Dictates the approach taken to generating citations as part of the RAG flow by allowing the user to specify whether they want `"accurate"` results or `"fast"` results. + * + */ +export type ChatRequestCitationQuality = "fast" | "accurate"; + +export const ChatRequestCitationQuality = { + Fast: "fast", + Accurate: "accurate", +} as const; diff --git a/src/api/types/ChatRequestPromptTruncation.ts b/src/api/types/ChatRequestPromptTruncation.ts new file mode 100644 index 0000000..18f0858 --- /dev/null +++ b/src/api/types/ChatRequestPromptTruncation.ts @@ -0,0 +1,17 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * Defaults to `AUTO` when `connectors` are specified and `OFF` in all other cases. + * Dictates how the prompt will be constructed. + * With `prompt_truncation` set to "AUTO", some elements from `chat_history` and `documents` will be dropped in an attempt to construct a prompt that fits within the model's context length limit. + * With `prompt_truncation` set to "OFF", no elements will be dropped. If the sum of the inputs exceeds the model's context length limit, a `TooManyTokens` error will be returned. + * + */ +export type ChatRequestPromptTruncation = "OFF" | "AUTO"; + +export const ChatRequestPromptTruncation = { + Off: "OFF", + Auto: "AUTO", +} as const; diff --git a/src/api/types/ChatResponse.ts b/src/api/types/ChatResponse.ts new file mode 100644 index 0000000..dd590fb --- /dev/null +++ b/src/api/types/ChatResponse.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export type ChatResponse = + | Cohere.NonStreamedChatResponse + | Cohere.StreamedChatResponse + | Cohere.SearchQueriesOnlyResponse; diff --git a/src/api/types/ChatSearchQueriesGenerationEvent.ts b/src/api/types/ChatSearchQueriesGenerationEvent.ts new file mode 100644 index 0000000..fbf5450 --- /dev/null +++ b/src/api/types/ChatSearchQueriesGenerationEvent.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface ChatSearchQueriesGenerationEvent extends Cohere.ChatStreamEvent { + /** Generated search queries, meant to be used as part of the RAG flow. */ + searchQueries: Cohere.ChatSearchQuery[]; +} diff --git a/src/api/types/ChatSearchQuery.ts b/src/api/types/ChatSearchQuery.ts new file mode 100644 index 0000000..528a92f --- /dev/null +++ b/src/api/types/ChatSearchQuery.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * The generated search query. Contains the text of the query and a unique identifier for the query. + * + */ +export interface ChatSearchQuery { + /** + * The text of the search query. + * + */ + text: string; + /** + * Unique identifier for the generated search query. Useful for submitting feedback. + * + */ + generationId: string; +} diff --git a/src/api/types/ChatSearchResult.ts b/src/api/types/ChatSearchResult.ts new file mode 100644 index 0000000..abdbfde --- /dev/null +++ b/src/api/types/ChatSearchResult.ts @@ -0,0 +1,19 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface ChatSearchResult { + searchQuery: Cohere.ChatSearchQuery; + /** + * The connector from which this result comes from. + * + */ + connector: Cohere.ChatConnector; + /** + * Identifiers of documents found by this search query. + * + */ + documentIds: string[]; +} diff --git a/src/api/types/ChatSearchResultsEvent.ts b/src/api/types/ChatSearchResultsEvent.ts new file mode 100644 index 0000000..3128659 --- /dev/null +++ b/src/api/types/ChatSearchResultsEvent.ts @@ -0,0 +1,18 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface ChatSearchResultsEvent extends Cohere.ChatStreamEvent { + /** + * Conducted searches and the ids of documents retrieved from each of them. + * + */ + searchResults: Cohere.ChatSearchResult[]; + /** + * Documents fetched from searches or provided by the user. + * + */ + documents: Cohere.ChatDocument[]; +} diff --git a/src/api/types/ChatStreamEndEvent.ts b/src/api/types/ChatStreamEndEvent.ts new file mode 100644 index 0000000..6413e46 --- /dev/null +++ b/src/api/types/ChatStreamEndEvent.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface ChatStreamEndEvent extends Cohere.ChatStreamEvent { + /** + * - `COMPLETE` - the model sent back a finished reply + * - `ERROR_LIMIT` - the reply was cut off because the model reached the maximum number of tokens for its context length + * - `MAX_TOKENS` - the reply was cut off because the model reached the maximum number of tokens specified by the max_tokens parameter + * - `ERROR` - something went wrong when generating the reply + * - `ERROR_TOXIC` - the model generated a reply that was deemed toxic + * + */ + finishReason: Cohere.ChatStreamEndEventFinishReason; + /** + * The consolidated response from the model. Contains the generated reply and all the other information streamed back in the previous events. + * + */ + response: Cohere.ChatStreamEndEventResponse; +} diff --git a/src/api/types/ChatStreamEndEventFinishReason.ts b/src/api/types/ChatStreamEndEventFinishReason.ts new file mode 100644 index 0000000..62a4390 --- /dev/null +++ b/src/api/types/ChatStreamEndEventFinishReason.ts @@ -0,0 +1,21 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * - `COMPLETE` - the model sent back a finished reply + * - `ERROR_LIMIT` - the reply was cut off because the model reached the maximum number of tokens for its context length + * - `MAX_TOKENS` - the reply was cut off because the model reached the maximum number of tokens specified by the max_tokens parameter + * - `ERROR` - something went wrong when generating the reply + * - `ERROR_TOXIC` - the model generated a reply that was deemed toxic + * + */ +export type ChatStreamEndEventFinishReason = "COMPLETE" | "ERROR_LIMIT" | "MAX_TOKENS" | "ERROR" | "ERROR_TOXIC"; + +export const ChatStreamEndEventFinishReason = { + Complete: "COMPLETE", + ErrorLimit: "ERROR_LIMIT", + MaxTokens: "MAX_TOKENS", + Error: "ERROR", + ErrorToxic: "ERROR_TOXIC", +} as const; diff --git a/src/api/types/ChatStreamEndEventResponse.ts b/src/api/types/ChatStreamEndEventResponse.ts new file mode 100644 index 0000000..dd5a740 --- /dev/null +++ b/src/api/types/ChatStreamEndEventResponse.ts @@ -0,0 +1,11 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +/** + * The consolidated response from the model. Contains the generated reply and all the other information streamed back in the previous events. + * + */ +export type ChatStreamEndEventResponse = Cohere.NonStreamedChatResponse | Cohere.SearchQueriesOnlyResponse; diff --git a/src/api/types/ChatStreamEvent.ts b/src/api/types/ChatStreamEvent.ts new file mode 100644 index 0000000..7fb7327 --- /dev/null +++ b/src/api/types/ChatStreamEvent.ts @@ -0,0 +1,5 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface ChatStreamEvent {} diff --git a/src/api/types/ChatStreamStartEvent.ts b/src/api/types/ChatStreamStartEvent.ts new file mode 100644 index 0000000..fbb7280 --- /dev/null +++ b/src/api/types/ChatStreamStartEvent.ts @@ -0,0 +1,13 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface ChatStreamStartEvent extends Cohere.ChatStreamEvent { + /** + * Unique identifier for the generated reply. Useful for submitting feedback. + * + */ + generationId: string; +} diff --git a/src/api/types/ChatTextGenerationEvent.ts b/src/api/types/ChatTextGenerationEvent.ts new file mode 100644 index 0000000..9e3ca9f --- /dev/null +++ b/src/api/types/ChatTextGenerationEvent.ts @@ -0,0 +1,13 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface ChatTextGenerationEvent extends Cohere.ChatStreamEvent { + /** + * The next batch of text generated by the model. + * + */ + text: string; +} diff --git a/src/api/types/ClassifyRequestExamplesItem.ts b/src/api/types/ClassifyRequestExamplesItem.ts new file mode 100644 index 0000000..afc0207 --- /dev/null +++ b/src/api/types/ClassifyRequestExamplesItem.ts @@ -0,0 +1,8 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface ClassifyRequestExamplesItem { + text?: string; + label?: string; +} diff --git a/src/api/types/ClassifyRequestTruncate.ts b/src/api/types/ClassifyRequestTruncate.ts new file mode 100644 index 0000000..8e5e9a1 --- /dev/null +++ b/src/api/types/ClassifyRequestTruncate.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * One of `NONE|START|END` to specify how the API will handle inputs longer than the maximum token length. + * Passing `START` will discard the start of the input. `END` will discard the end of the input. In both cases, input is discarded until the remaining input is exactly the maximum input token length for the model. + * If `NONE` is selected, when the input exceeds the maximum input token length an error will be returned. + */ +export type ClassifyRequestTruncate = "NONE" | "START" | "END"; + +export const ClassifyRequestTruncate = { + None: "NONE", + Start: "START", + End: "END", +} as const; diff --git a/src/api/types/ClassifyResponse.ts b/src/api/types/ClassifyResponse.ts new file mode 100644 index 0000000..4ac7d89 --- /dev/null +++ b/src/api/types/ClassifyResponse.ts @@ -0,0 +1,11 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface ClassifyResponse { + id: string; + classifications: Cohere.ClassifyResponseClassificationsItem[]; + meta?: Cohere.ApiMeta; +} diff --git a/src/api/types/ClassifyResponseClassificationsItem.ts b/src/api/types/ClassifyResponseClassificationsItem.ts new file mode 100644 index 0000000..11fd953 --- /dev/null +++ b/src/api/types/ClassifyResponseClassificationsItem.ts @@ -0,0 +1,23 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface ClassifyResponseClassificationsItem { + id: string; + /** The input text that was classified */ + input?: string; + /** The predicted label for the associated query (only filled for single-label models) */ + prediction?: string; + /** An array containing the predicted labels for the associated query */ + predictions: string[]; + /** The confidence score for the top predicted class (only filled for single-label classification) */ + confidence?: number; + /** An array containing the confidence scores of all the predictions in the same order */ + confidences: number[]; + /** A map containing each label and its confidence score according to the classifier. All the confidence scores add up to 1. */ + labels: Record; + /** The type of classification performed */ + classificationType: Cohere.ClassifyResponseClassificationsItemClassificationType; +} diff --git a/src/api/types/ClassifyResponseClassificationsItemClassificationType.ts b/src/api/types/ClassifyResponseClassificationsItemClassificationType.ts new file mode 100644 index 0000000..c588edc --- /dev/null +++ b/src/api/types/ClassifyResponseClassificationsItemClassificationType.ts @@ -0,0 +1,13 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * The type of classification performed + */ +export type ClassifyResponseClassificationsItemClassificationType = "single-label" | "multi-label"; + +export const ClassifyResponseClassificationsItemClassificationType = { + SingleLabel: "single-label", + MultiLabel: "multi-label", +} as const; diff --git a/src/api/types/ClassifyResponseClassificationsItemLabelsValue.ts b/src/api/types/ClassifyResponseClassificationsItemLabelsValue.ts new file mode 100644 index 0000000..7d5cfa5 --- /dev/null +++ b/src/api/types/ClassifyResponseClassificationsItemLabelsValue.ts @@ -0,0 +1,7 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface ClassifyResponseClassificationsItemLabelsValue { + confidence?: number; +} diff --git a/src/api/types/DetectLanguageResponse.ts b/src/api/types/DetectLanguageResponse.ts new file mode 100644 index 0000000..86d1691 --- /dev/null +++ b/src/api/types/DetectLanguageResponse.ts @@ -0,0 +1,11 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface DetectLanguageResponse { + /** List of languages, one per input text */ + results?: Cohere.DetectLanguageResponseResultsItem[]; + meta?: Cohere.ApiMeta; +} diff --git a/src/api/types/DetectLanguageResponseResultsItem.ts b/src/api/types/DetectLanguageResponseResultsItem.ts new file mode 100644 index 0000000..b69d103 --- /dev/null +++ b/src/api/types/DetectLanguageResponseResultsItem.ts @@ -0,0 +1,8 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface DetectLanguageResponseResultsItem { + languageName?: string; + languageCode?: string; +} diff --git a/src/api/types/DetokenizeResponse.ts b/src/api/types/DetokenizeResponse.ts new file mode 100644 index 0000000..f3a14ec --- /dev/null +++ b/src/api/types/DetokenizeResponse.ts @@ -0,0 +1,11 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface DetokenizeResponse { + /** A string representing the list of tokens. */ + text: string; + meta?: Cohere.ApiMeta; +} diff --git a/src/api/types/EmbedRequestTruncate.ts b/src/api/types/EmbedRequestTruncate.ts new file mode 100644 index 0000000..8786bd6 --- /dev/null +++ b/src/api/types/EmbedRequestTruncate.ts @@ -0,0 +1,18 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * One of `NONE|START|END` to specify how the API will handle inputs longer than the maximum token length. + * + * Passing `START` will discard the start of the input. `END` will discard the end of the input. In both cases, input is discarded until the remaining input is exactly the maximum input token length for the model. + * + * If `NONE` is selected, when the input exceeds the maximum input token length an error will be returned. + */ +export type EmbedRequestTruncate = "NONE" | "START" | "END"; + +export const EmbedRequestTruncate = { + None: "NONE", + Start: "START", + End: "END", +} as const; diff --git a/src/api/types/EmbedResponse.ts b/src/api/types/EmbedResponse.ts new file mode 100644 index 0000000..74469c5 --- /dev/null +++ b/src/api/types/EmbedResponse.ts @@ -0,0 +1,14 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface EmbedResponse { + id: string; + /** An array of embeddings, where each embedding is an array of floats. The length of the `embeddings` array will be the same as the length of the original `texts` array. */ + embeddings: number[][]; + /** The text entries for which embeddings were returned. */ + texts: string[]; + meta?: Cohere.ApiMeta; +} diff --git a/src/api/types/FinishReason.ts b/src/api/types/FinishReason.ts new file mode 100644 index 0000000..8313cb7 --- /dev/null +++ b/src/api/types/FinishReason.ts @@ -0,0 +1,14 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export type FinishReason = "COMPLETE" | "ERROR" | "ERROR_TOXIC" | "ERROR_LIMIT" | "USER_CANCEL" | "MAX_TOKENS"; + +export const FinishReason = { + Complete: "COMPLETE", + Error: "ERROR", + ErrorToxic: "ERROR_TOXIC", + ErrorLimit: "ERROR_LIMIT", + UserCancel: "USER_CANCEL", + MaxTokens: "MAX_TOKENS", +} as const; diff --git a/src/api/types/GenerateRequestReturnLikelihoods.ts b/src/api/types/GenerateRequestReturnLikelihoods.ts new file mode 100644 index 0000000..aaacd88 --- /dev/null +++ b/src/api/types/GenerateRequestReturnLikelihoods.ts @@ -0,0 +1,18 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * One of `GENERATION|ALL|NONE` to specify how and if the token likelihoods are returned with the response. Defaults to `NONE`. + * + * If `GENERATION` is selected, the token likelihoods will only be provided for generated text. + * + * If `ALL` is selected, the token likelihoods will be provided both for the prompt and the generated text. + */ +export type GenerateRequestReturnLikelihoods = "GENERATION" | "ALL" | "NONE"; + +export const GenerateRequestReturnLikelihoods = { + Generation: "GENERATION", + All: "ALL", + None: "NONE", +} as const; diff --git a/src/api/types/GenerateRequestTruncate.ts b/src/api/types/GenerateRequestTruncate.ts new file mode 100644 index 0000000..7e6654f --- /dev/null +++ b/src/api/types/GenerateRequestTruncate.ts @@ -0,0 +1,18 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * One of `NONE|START|END` to specify how the API will handle inputs longer than the maximum token length. + * + * Passing `START` will discard the start of the input. `END` will discard the end of the input. In both cases, input is discarded until the remaining input is exactly the maximum input token length for the model. + * + * If `NONE` is selected, when the input exceeds the maximum input token length an error will be returned. + */ +export type GenerateRequestTruncate = "NONE" | "START" | "END"; + +export const GenerateRequestTruncate = { + None: "NONE", + Start: "START", + End: "END", +} as const; diff --git a/src/api/types/Generation.ts b/src/api/types/Generation.ts new file mode 100644 index 0000000..de51102 --- /dev/null +++ b/src/api/types/Generation.ts @@ -0,0 +1,14 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface Generation { + id: string; + /** Prompt used for generations. */ + prompt?: string; + /** List of generated results */ + generations: Cohere.SingleGeneration[]; + meta?: Cohere.ApiMeta; +} diff --git a/src/api/types/GenerationFinalResponse.ts b/src/api/types/GenerationFinalResponse.ts new file mode 100644 index 0000000..ed98265 --- /dev/null +++ b/src/api/types/GenerationFinalResponse.ts @@ -0,0 +1,11 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface GenerationFinalResponse { + isFinished: boolean; + finishReason?: Cohere.FinishReason; + response: Cohere.GenerationFinalResponseResponse; +} diff --git a/src/api/types/GenerationFinalResponseResponse.ts b/src/api/types/GenerationFinalResponseResponse.ts new file mode 100644 index 0000000..26bf537 --- /dev/null +++ b/src/api/types/GenerationFinalResponseResponse.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface GenerationFinalResponseResponse { + id: string; + generations?: Cohere.SingleGenerationInStream; +} diff --git a/src/api/types/GenerationStream.ts b/src/api/types/GenerationStream.ts new file mode 100644 index 0000000..d73d158 --- /dev/null +++ b/src/api/types/GenerationStream.ts @@ -0,0 +1,11 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface GenerationStream { + /** A segment of text of the generation. */ + text: string; + /** Refers to the nth generation. Only present when `num_generations` is greater than zero. */ + index?: number; + isFinished: boolean; +} diff --git a/src/api/types/NonStreamedChatResponse.ts b/src/api/types/NonStreamedChatResponse.ts new file mode 100644 index 0000000..f3275a8 --- /dev/null +++ b/src/api/types/NonStreamedChatResponse.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface NonStreamedChatResponse { + /** Contents of the reply generated by the model. */ + text: string; + /** Unique identifier for the generated reply. Useful for submitting feedback. */ + generationId: string; + /** Inline citations for the generated reply. */ + citations?: Cohere.ChatCitation[]; + /** Documents seen by the model when generating the reply. */ + documents?: Cohere.ChatDocument[]; + /** Generated search queries, meant to be used as part of the RAG flow. */ + searchQueries?: Cohere.ChatSearchQuery[]; + /** Documents retrieved from each of the conducted searches. */ + searchResults?: Cohere.ChatSearchResult[]; +} diff --git a/src/api/types/RerankRequestDocumentsItem.ts b/src/api/types/RerankRequestDocumentsItem.ts new file mode 100644 index 0000000..c75f707 --- /dev/null +++ b/src/api/types/RerankRequestDocumentsItem.ts @@ -0,0 +1,8 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface RerankRequestDocumentsItem { + /** The text of the document to rerank. */ + text: string; +} diff --git a/src/api/types/RerankResponse.ts b/src/api/types/RerankResponse.ts new file mode 100644 index 0000000..412d910 --- /dev/null +++ b/src/api/types/RerankResponse.ts @@ -0,0 +1,12 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface RerankResponse { + id?: string; + /** An ordered list of ranked documents */ + results: Cohere.RerankResponseResultsItem[]; + meta?: Cohere.ApiMeta; +} diff --git a/src/api/types/RerankResponseResultsItem.ts b/src/api/types/RerankResponseResultsItem.ts new file mode 100644 index 0000000..d55985f --- /dev/null +++ b/src/api/types/RerankResponseResultsItem.ts @@ -0,0 +1,14 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface RerankResponseResultsItem { + /** The doc object which was ranked */ + document?: Cohere.RerankResponseResultsItemDocument; + /** The index of the input document */ + index: number; + /** A relevance score assigned to the ranking */ + relevanceScore: number; +} diff --git a/src/api/types/RerankResponseResultsItemDocument.ts b/src/api/types/RerankResponseResultsItemDocument.ts new file mode 100644 index 0000000..261dfaf --- /dev/null +++ b/src/api/types/RerankResponseResultsItemDocument.ts @@ -0,0 +1,11 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * The doc object which was ranked + */ +export interface RerankResponseResultsItemDocument { + /** The text of the document to rerank */ + text: string; +} diff --git a/src/api/types/SearchQueriesOnlyResponse.ts b/src/api/types/SearchQueriesOnlyResponse.ts new file mode 100644 index 0000000..e104f41 --- /dev/null +++ b/src/api/types/SearchQueriesOnlyResponse.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface SearchQueriesOnlyResponse { + /** Generated search queries, meant to be used as part of the RAG flow. */ + searchQueries: Cohere.ChatSearchQuery[]; +} diff --git a/src/api/types/SingleGeneration.ts b/src/api/types/SingleGeneration.ts new file mode 100644 index 0000000..8df1569 --- /dev/null +++ b/src/api/types/SingleGeneration.ts @@ -0,0 +1,15 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface SingleGeneration { + id: string; + text: string; + /** Refers to the nth generation. Only present when `num_generations` is greater than zero. */ + index?: number; + likelihood?: number; + /** Only returned if `return_likelihoods` is set to `GENERATION` or `ALL`. The likelihood refers to the average log-likelihood of the entire specified string, which is useful for [evaluating the performance of your model](likelihood-eval), especially if you've created a [custom model](/docs/training-custom-models). Individual token likelihoods provide the log-likelihood of each token. The first token will not have a likelihood. */ + tokenLikelihoods?: Cohere.SingleGenerationTokenLikelihoodsItem[]; +} diff --git a/src/api/types/SingleGenerationInStream.ts b/src/api/types/SingleGenerationInStream.ts new file mode 100644 index 0000000..74a1644 --- /dev/null +++ b/src/api/types/SingleGenerationInStream.ts @@ -0,0 +1,14 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface SingleGenerationInStream { + id: string; + /** Full text of the generation. */ + text: string; + /** Refers to the nth generation. Only present when `num_generations` is greater than zero. */ + index?: number; + finishReason: Cohere.FinishReason; +} diff --git a/src/api/types/SingleGenerationTokenLikelihoodsItem.ts b/src/api/types/SingleGenerationTokenLikelihoodsItem.ts new file mode 100644 index 0000000..533d9d8 --- /dev/null +++ b/src/api/types/SingleGenerationTokenLikelihoodsItem.ts @@ -0,0 +1,8 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface SingleGenerationTokenLikelihoodsItem { + token: string; + likelihood: number; +} diff --git a/src/api/types/StreamedChatResponse.ts b/src/api/types/StreamedChatResponse.ts new file mode 100644 index 0000000..4f7e0bb --- /dev/null +++ b/src/api/types/StreamedChatResponse.ts @@ -0,0 +1,42 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +/** + * StreamedChatResponse is returned in streaming mode (specified with `stream=True` in the request). + */ +export type StreamedChatResponse = + | Cohere.StreamedChatResponse.StreamStart + | Cohere.StreamedChatResponse.SearchQueriesGeneration + | Cohere.StreamedChatResponse.SearchResults + | Cohere.StreamedChatResponse.TextGeneration + | Cohere.StreamedChatResponse.CitationGeneration + | Cohere.StreamedChatResponse.StreamEnd; + +export declare namespace StreamedChatResponse { + interface StreamStart extends Cohere.ChatStreamStartEvent { + eventType: "stream-start"; + } + + interface SearchQueriesGeneration extends Cohere.ChatSearchQueriesGenerationEvent { + eventType: "search-queries-generation"; + } + + interface SearchResults extends Cohere.ChatSearchResultsEvent { + eventType: "search-results"; + } + + interface TextGeneration extends Cohere.ChatTextGenerationEvent { + eventType: "text-generation"; + } + + interface CitationGeneration extends Cohere.ChatCitationGenerationEvent { + eventType: "citation-generation"; + } + + interface StreamEnd extends Cohere.ChatStreamEndEvent { + eventType: "stream-end"; + } +} diff --git a/src/api/types/StreamedGeneration.ts b/src/api/types/StreamedGeneration.ts new file mode 100644 index 0000000..6c807e8 --- /dev/null +++ b/src/api/types/StreamedGeneration.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +/** + * Response in content type stream when `stream` is `true` in the request parameters. Generation tokens are streamed with the GenerationStream response. The final response is of type GenerationFinalResponse. + */ +export type StreamedGeneration = Cohere.StreamedGenerationItem[]; diff --git a/src/api/types/StreamedGenerationItem.ts b/src/api/types/StreamedGenerationItem.ts new file mode 100644 index 0000000..6ccc484 --- /dev/null +++ b/src/api/types/StreamedGenerationItem.ts @@ -0,0 +1,7 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export type StreamedGenerationItem = Cohere.GenerationStream | Cohere.GenerationFinalResponse; diff --git a/src/api/types/SummarizeRequestExtractiveness.ts b/src/api/types/SummarizeRequestExtractiveness.ts new file mode 100644 index 0000000..d09b35c --- /dev/null +++ b/src/api/types/SummarizeRequestExtractiveness.ts @@ -0,0 +1,14 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * One of `low`, `medium`, `high`, or `auto`, defaults to `auto`. Controls how close to the original text the summary is. `high` extractiveness summaries will lean towards reusing sentences verbatim, while `low` extractiveness summaries will tend to paraphrase more. If `auto` is selected, the best option will be picked based on the input text. + */ +export type SummarizeRequestExtractiveness = "low" | "medium" | "high"; + +export const SummarizeRequestExtractiveness = { + Low: "low", + Medium: "medium", + High: "high", +} as const; diff --git a/src/api/types/SummarizeRequestFormat.ts b/src/api/types/SummarizeRequestFormat.ts new file mode 100644 index 0000000..0f69ec0 --- /dev/null +++ b/src/api/types/SummarizeRequestFormat.ts @@ -0,0 +1,13 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * One of `paragraph`, `bullets`, or `auto`, defaults to `auto`. Indicates the style in which the summary will be delivered - in a free form paragraph or in bullet points. If `auto` is selected, the best option will be picked based on the input text. + */ +export type SummarizeRequestFormat = "paragraph" | "bullets"; + +export const SummarizeRequestFormat = { + Paragraph: "paragraph", + Bullets: "bullets", +} as const; diff --git a/src/api/types/SummarizeRequestLength.ts b/src/api/types/SummarizeRequestLength.ts new file mode 100644 index 0000000..b801f59 --- /dev/null +++ b/src/api/types/SummarizeRequestLength.ts @@ -0,0 +1,14 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * One of `short`, `medium`, `long`, or `auto` defaults to `auto`. Indicates the approximate length of the summary. If `auto` is selected, the best option will be picked based on the input text. + */ +export type SummarizeRequestLength = "short" | "medium" | "long"; + +export const SummarizeRequestLength = { + Short: "short", + Medium: "medium", + Long: "long", +} as const; diff --git a/src/api/types/SummarizeRequestModel.ts b/src/api/types/SummarizeRequestModel.ts new file mode 100644 index 0000000..285db94 --- /dev/null +++ b/src/api/types/SummarizeRequestModel.ts @@ -0,0 +1,13 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +/** + * The identifier of the model to generate the summary with. Currently available models are `command` (default), `command-nightly` (experimental), `command-light`, and `command-light-nightly` (experimental). Smaller, "light" models are faster, while larger models will perform better. + */ +export type SummarizeRequestModel = "command" | "command-light"; + +export const SummarizeRequestModel = { + Command: "command", + CommandLight: "command-light", +} as const; diff --git a/src/api/types/SummarizeResponse.ts b/src/api/types/SummarizeResponse.ts new file mode 100644 index 0000000..64ad95a --- /dev/null +++ b/src/api/types/SummarizeResponse.ts @@ -0,0 +1,11 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface SummarizeResponse { + /** List of languages, one per input text */ + results?: Cohere.SummarizeResponseResultsItem[]; + meta?: Cohere.ApiMeta; +} diff --git a/src/api/types/SummarizeResponseResultsItem.ts b/src/api/types/SummarizeResponseResultsItem.ts new file mode 100644 index 0000000..5e868a6 --- /dev/null +++ b/src/api/types/SummarizeResponseResultsItem.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export interface SummarizeResponseResultsItem { + /** Generated ID for the summary */ + id?: string; + /** Generated summary for the text */ + summary?: string; +} diff --git a/src/api/types/TokenizeResponse.ts b/src/api/types/TokenizeResponse.ts new file mode 100644 index 0000000..5374803 --- /dev/null +++ b/src/api/types/TokenizeResponse.ts @@ -0,0 +1,12 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as Cohere from ".."; + +export interface TokenizeResponse { + /** An array of tokens, where each token is an integer. */ + tokens: number[]; + tokenStrings: string[]; + meta?: Cohere.ApiMeta; +} diff --git a/src/api/types/index.ts b/src/api/types/index.ts new file mode 100644 index 0000000..7eb610f --- /dev/null +++ b/src/api/types/index.ts @@ -0,0 +1,58 @@ +export * from "./GenerateRequestTruncate"; +export * from "./GenerateRequestReturnLikelihoods"; +export * from "./EmbedRequestTruncate"; +export * from "./EmbedResponse"; +export * from "./ClassifyRequestExamplesItem"; +export * from "./ClassifyRequestTruncate"; +export * from "./ClassifyResponse"; +export * from "./ClassifyResponseClassificationsItem"; +export * from "./ClassifyResponseClassificationsItemLabelsValue"; +export * from "./ClassifyResponseClassificationsItemClassificationType"; +export * from "./ChatRequestPromptTruncation"; +export * from "./ChatRequestCitationQuality"; +export * from "./ChatResponse"; +export * from "./TokenizeResponse"; +export * from "./DetokenizeResponse"; +export * from "./DetectLanguageResponse"; +export * from "./DetectLanguageResponseResultsItem"; +export * from "./SummarizeRequestLength"; +export * from "./SummarizeRequestFormat"; +export * from "./SummarizeRequestModel"; +export * from "./SummarizeRequestExtractiveness"; +export * from "./SummarizeResponse"; +export * from "./SummarizeResponseResultsItem"; +export * from "./RerankRequestDocumentsItem"; +export * from "./RerankResponse"; +export * from "./RerankResponseResultsItem"; +export * from "./RerankResponseResultsItemDocument"; +export * from "./SingleGeneration"; +export * from "./SingleGenerationTokenLikelihoodsItem"; +export * from "./ApiMeta"; +export * from "./ApiMetaApiVersion"; +export * from "./Generation"; +export * from "./GenerationStream"; +export * from "./FinishReason"; +export * from "./SingleGenerationInStream"; +export * from "./GenerationFinalResponse"; +export * from "./GenerationFinalResponseResponse"; +export * from "./StreamedGeneration"; +export * from "./StreamedGenerationItem"; +export * from "./ChatMessage"; +export * from "./ChatMessageRole"; +export * from "./ChatConnector"; +export * from "./ChatDocument"; +export * from "./ChatCitation"; +export * from "./ChatSearchQuery"; +export * from "./ChatSearchResult"; +export * from "./NonStreamedChatResponse"; +export * from "./ChatStreamEvent"; +export * from "./ChatStreamStartEvent"; +export * from "./ChatSearchQueriesGenerationEvent"; +export * from "./ChatSearchResultsEvent"; +export * from "./ChatTextGenerationEvent"; +export * from "./ChatCitationGenerationEvent"; +export * from "./SearchQueriesOnlyResponse"; +export * from "./ChatStreamEndEvent"; +export * from "./ChatStreamEndEventFinishReason"; +export * from "./ChatStreamEndEventResponse"; +export * from "./StreamedChatResponse"; diff --git a/src/core/auth/BasicAuth.ts b/src/core/auth/BasicAuth.ts new file mode 100644 index 0000000..146df21 --- /dev/null +++ b/src/core/auth/BasicAuth.ts @@ -0,0 +1,31 @@ +import { Base64 } from "js-base64"; + +export interface BasicAuth { + username: string; + password: string; +} + +const BASIC_AUTH_HEADER_PREFIX = /^Basic /i; + +export const BasicAuth = { + toAuthorizationHeader: (basicAuth: BasicAuth | undefined): string | undefined => { + if (basicAuth == null) { + return undefined; + } + const token = Base64.encode(`${basicAuth.username}:${basicAuth.password}`); + return `Basic ${token}`; + }, + fromAuthorizationHeader: (header: string): BasicAuth => { + const credentials = header.replace(BASIC_AUTH_HEADER_PREFIX, ""); + const decoded = Base64.decode(credentials); + const [username, password] = decoded.split(":", 2); + + if (username == null || password == null) { + throw new Error("Invalid basic auth"); + } + return { + username, + password, + }; + }, +}; diff --git a/src/core/auth/BearerToken.ts b/src/core/auth/BearerToken.ts new file mode 100644 index 0000000..fe987fc --- /dev/null +++ b/src/core/auth/BearerToken.ts @@ -0,0 +1,15 @@ +export type BearerToken = string; + +const BEARER_AUTH_HEADER_PREFIX = /^Bearer /i; + +export const BearerToken = { + toAuthorizationHeader: (token: BearerToken | undefined): string | undefined => { + if (token == null) { + return undefined; + } + return `Bearer ${token}`; + }, + fromAuthorizationHeader: (header: string): BearerToken => { + return header.replace(BEARER_AUTH_HEADER_PREFIX, "").trim() as BearerToken; + }, +}; diff --git a/src/core/auth/index.ts b/src/core/auth/index.ts new file mode 100644 index 0000000..ee293b3 --- /dev/null +++ b/src/core/auth/index.ts @@ -0,0 +1,2 @@ +export { BasicAuth } from "./BasicAuth"; +export { BearerToken } from "./BearerToken"; diff --git a/src/core/fetcher/APIResponse.ts b/src/core/fetcher/APIResponse.ts new file mode 100644 index 0000000..ea838f3 --- /dev/null +++ b/src/core/fetcher/APIResponse.ts @@ -0,0 +1,11 @@ +export type APIResponse = SuccessfulResponse | FailedResponse; + +export interface SuccessfulResponse { + ok: true; + body: T; +} + +export interface FailedResponse { + ok: false; + error: T; +} diff --git a/src/core/fetcher/Fetcher.ts b/src/core/fetcher/Fetcher.ts new file mode 100644 index 0000000..6af0fb1 --- /dev/null +++ b/src/core/fetcher/Fetcher.ts @@ -0,0 +1,134 @@ +import { default as URLSearchParams } from "@ungap/url-search-params"; +import axios, { AxiosAdapter, AxiosError } from "axios"; +import { APIResponse } from "./APIResponse"; + +export type FetchFunction = (args: Fetcher.Args) => Promise>; + +export declare namespace Fetcher { + export interface Args { + url: string; + method: string; + contentType?: string; + headers?: Record; + queryParameters?: URLSearchParams; + body?: unknown; + timeoutMs?: number; + withCredentials?: boolean; + responseType?: "json" | "blob"; + adapter?: AxiosAdapter; + onUploadProgress?: (event: ProgressEvent) => void; + } + + export type Error = FailedStatusCodeError | NonJsonError | TimeoutError | UnknownError; + + export interface FailedStatusCodeError { + reason: "status-code"; + statusCode: number; + body: unknown; + } + + export interface NonJsonError { + reason: "non-json"; + statusCode: number; + rawBody: string; + } + + export interface TimeoutError { + reason: "timeout"; + } + + export interface UnknownError { + reason: "unknown"; + errorMessage: string; + } +} + +async function fetcherImpl(args: Fetcher.Args): Promise> { + const headers: Record = {}; + if (args.body !== undefined && args.contentType != null) { + headers["Content-Type"] = args.contentType; + } + + if (args.headers != null) { + for (const [key, value] of Object.entries(args.headers)) { + if (value != null) { + headers[key] = value; + } + } + } + + try { + const response = await axios({ + url: args.url, + params: args.queryParameters, + method: args.method, + headers, + data: args.body, + validateStatus: () => true, + transformResponse: (response) => response, + timeout: args.timeoutMs, + transitional: { + clarifyTimeoutError: true, + }, + withCredentials: args.withCredentials, + adapter: args.adapter, + onUploadProgress: args.onUploadProgress, + maxBodyLength: Infinity, + maxContentLength: Infinity, + responseType: args.responseType ?? "json", + }); + + let body: unknown; + if (args.responseType === "blob") { + body = response.data; + } else if (response.data != null && response.data.length > 0) { + try { + body = JSON.parse(response.data) ?? undefined; + } catch { + return { + ok: false, + error: { + reason: "non-json", + statusCode: response.status, + rawBody: response.data, + }, + }; + } + } + + if (response.status >= 200 && response.status < 400) { + return { + ok: true, + body: body as R, + }; + } else { + return { + ok: false, + error: { + reason: "status-code", + statusCode: response.status, + body, + }, + }; + } + } catch (error) { + if ((error as AxiosError).code === "ETIMEDOUT") { + return { + ok: false, + error: { + reason: "timeout", + }, + }; + } + + return { + ok: false, + error: { + reason: "unknown", + errorMessage: (error as AxiosError).message, + }, + }; + } +} + +export const fetcher: FetchFunction = fetcherImpl; diff --git a/src/core/fetcher/Supplier.ts b/src/core/fetcher/Supplier.ts new file mode 100644 index 0000000..867c931 --- /dev/null +++ b/src/core/fetcher/Supplier.ts @@ -0,0 +1,11 @@ +export type Supplier = T | Promise | (() => T | Promise); + +export const Supplier = { + get: async (supplier: Supplier): Promise => { + if (typeof supplier === "function") { + return (supplier as () => T)(); + } else { + return supplier; + } + }, +}; diff --git a/src/core/fetcher/index.ts b/src/core/fetcher/index.ts new file mode 100644 index 0000000..6becab2 --- /dev/null +++ b/src/core/fetcher/index.ts @@ -0,0 +1,4 @@ +export type { APIResponse } from "./APIResponse"; +export { fetcher } from "./Fetcher"; +export type { Fetcher, FetchFunction } from "./Fetcher"; +export { Supplier } from "./Supplier"; diff --git a/src/core/index.ts b/src/core/index.ts new file mode 100644 index 0000000..e2eb66e --- /dev/null +++ b/src/core/index.ts @@ -0,0 +1,3 @@ +export * from "./fetcher"; +export * from "./auth"; +export * as serialization from "./schemas"; diff --git a/src/core/schemas/Schema.ts b/src/core/schemas/Schema.ts new file mode 100644 index 0000000..3211fa4 --- /dev/null +++ b/src/core/schemas/Schema.ts @@ -0,0 +1,93 @@ +import { SchemaUtils } from "./builders"; +import { MaybePromise } from "./utils/MaybePromise"; + +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) => MaybePromise>; + json: (parsed: unknown, opts?: SchemaOptions) => MaybePromise>; + getType: () => SchemaType | Promise; +} + +export const SchemaType = { + DATE: "date", + ENUM: "enum", + LIST: "list", + STRING_LITERAL: "stringLiteral", + OBJECT: "object", + ANY: "any", + BOOLEAN: "boolean", + NUMBER: "number", + STRING: "string", + UNKNOWN: "unknown", + RECORD: "record", + SET: "set", + UNION: "union", + UNDISCRIMINATED_UNION: "undiscriminatedUnion", + OPTIONAL: "optional", +} 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[]; +} diff --git a/src/core/schemas/builders/date/date.ts b/src/core/schemas/builders/date/date.ts new file mode 100644 index 0000000..b70f24b --- /dev/null +++ b/src/core/schemas/builders/date/date.ts @@ -0,0 +1,65 @@ +import { BaseSchema, Schema, SchemaType } from "../../Schema"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { getSchemaUtils } from "../schema-utils"; + +// 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/src/core/schemas/builders/date/index.ts b/src/core/schemas/builders/date/index.ts new file mode 100644 index 0000000..187b290 --- /dev/null +++ b/src/core/schemas/builders/date/index.ts @@ -0,0 +1 @@ +export { date } from "./date"; diff --git a/src/core/schemas/builders/enum/enum.ts b/src/core/schemas/builders/enum/enum.ts new file mode 100644 index 0000000..c1e24d6 --- /dev/null +++ b/src/core/schemas/builders/enum/enum.ts @@ -0,0 +1,43 @@ +import { 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/src/core/schemas/builders/enum/index.ts b/src/core/schemas/builders/enum/index.ts new file mode 100644 index 0000000..fe6faed --- /dev/null +++ b/src/core/schemas/builders/enum/index.ts @@ -0,0 +1 @@ +export { enum_ } from "./enum"; diff --git a/src/core/schemas/builders/index.ts b/src/core/schemas/builders/index.ts new file mode 100644 index 0000000..050cd2c --- /dev/null +++ b/src/core/schemas/builders/index.ts @@ -0,0 +1,13 @@ +export * from "./date"; +export * from "./enum"; +export * from "./lazy"; +export * from "./list"; +export * from "./literals"; +export * from "./object"; +export * from "./object-like"; +export * from "./primitives"; +export * from "./record"; +export * from "./schema-utils"; +export * from "./set"; +export * from "./undiscriminated-union"; +export * from "./union"; diff --git a/src/core/schemas/builders/lazy/index.ts b/src/core/schemas/builders/lazy/index.ts new file mode 100644 index 0000000..77420fb --- /dev/null +++ b/src/core/schemas/builders/lazy/index.ts @@ -0,0 +1,3 @@ +export { lazy } from "./lazy"; +export type { SchemaGetter } from "./lazy"; +export { lazyObject } from "./lazyObject"; diff --git a/src/core/schemas/builders/lazy/lazy.ts b/src/core/schemas/builders/lazy/lazy.ts new file mode 100644 index 0000000..a665472 --- /dev/null +++ b/src/core/schemas/builders/lazy/lazy.ts @@ -0,0 +1,34 @@ +import { BaseSchema, Schema } from "../../Schema"; +import { getSchemaUtils } from "../schema-utils"; + +export type SchemaGetter> = () => SchemaType | Promise; + +export function lazy(getter: SchemaGetter>): Schema { + const baseSchema = constructLazyBaseSchema(getter); + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function constructLazyBaseSchema( + getter: SchemaGetter> +): BaseSchema { + return { + parse: async (raw, opts) => (await getMemoizedSchema(getter)).parse(raw, opts), + json: async (parsed, opts) => (await getMemoizedSchema(getter)).json(parsed, opts), + getType: async () => (await getMemoizedSchema(getter)).getType(), + }; +} + +type MemoizedGetter> = SchemaGetter & { __zurg_memoized?: SchemaType }; + +export async function getMemoizedSchema>( + getter: SchemaGetter +): Promise { + const castedGetter = getter as MemoizedGetter; + if (castedGetter.__zurg_memoized == null) { + castedGetter.__zurg_memoized = await getter(); + } + return castedGetter.__zurg_memoized; +} diff --git a/src/core/schemas/builders/lazy/lazyObject.ts b/src/core/schemas/builders/lazy/lazyObject.ts new file mode 100644 index 0000000..e48c016 --- /dev/null +++ b/src/core/schemas/builders/lazy/lazyObject.ts @@ -0,0 +1,20 @@ +import { getObjectUtils } from "../object"; +import { getObjectLikeUtils } from "../object-like"; +import { BaseObjectSchema, ObjectSchema } from "../object/types"; +import { getSchemaUtils } from "../schema-utils"; +import { constructLazyBaseSchema, getMemoizedSchema, SchemaGetter } from "./lazy"; + +export function lazyObject(getter: SchemaGetter>): ObjectSchema { + const baseSchema: BaseObjectSchema = { + ...constructLazyBaseSchema(getter), + _getRawProperties: async () => (await getMemoizedSchema(getter))._getRawProperties(), + _getParsedProperties: async () => (await getMemoizedSchema(getter))._getParsedProperties(), + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; +} diff --git a/src/core/schemas/builders/list/index.ts b/src/core/schemas/builders/list/index.ts new file mode 100644 index 0000000..25f4bcc --- /dev/null +++ b/src/core/schemas/builders/list/index.ts @@ -0,0 +1 @@ +export { list } from "./list"; diff --git a/src/core/schemas/builders/list/list.ts b/src/core/schemas/builders/list/list.ts new file mode 100644 index 0000000..b333321 --- /dev/null +++ b/src/core/schemas/builders/list/list.ts @@ -0,0 +1,74 @@ +import { BaseSchema, MaybeValid, Schema, SchemaType, ValidationError } from "../../Schema"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { MaybePromise } from "../../utils/MaybePromise"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { getSchemaUtils } from "../schema-utils"; + +export function list(schema: Schema): Schema { + const baseSchema: BaseSchema = { + parse: async (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), + }; +} + +async function validateAndTransformArray( + value: unknown, + transformItem: (item: Raw, index: number) => MaybePromise> +): Promise> { + if (!Array.isArray(value)) { + return { + ok: false, + errors: [ + { + message: getErrorMessageForIncorrectType(value, "list"), + path: [], + }, + ], + }; + } + + const maybeValidItems = await Promise.all(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/src/core/schemas/builders/literals/index.ts b/src/core/schemas/builders/literals/index.ts new file mode 100644 index 0000000..a4cd05c --- /dev/null +++ b/src/core/schemas/builders/literals/index.ts @@ -0,0 +1 @@ +export { stringLiteral } from "./stringLiteral"; diff --git a/src/core/schemas/builders/literals/stringLiteral.ts b/src/core/schemas/builders/literals/stringLiteral.ts new file mode 100644 index 0000000..3939b76 --- /dev/null +++ b/src/core/schemas/builders/literals/stringLiteral.ts @@ -0,0 +1,29 @@ +import { 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/src/core/schemas/builders/object-like/getObjectLikeUtils.ts b/src/core/schemas/builders/object-like/getObjectLikeUtils.ts new file mode 100644 index 0000000..270ea17 --- /dev/null +++ b/src/core/schemas/builders/object-like/getObjectLikeUtils.ts @@ -0,0 +1,79 @@ +import { BaseSchema } from "../../Schema"; +import { filterObject } from "../../utils/filterObject"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { isPlainObject } from "../../utils/isPlainObject"; +import { getSchemaUtils } from "../schema-utils"; +import { 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: async (raw, opts) => { + const parsedObject = await 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/src/core/schemas/builders/object-like/index.ts b/src/core/schemas/builders/object-like/index.ts new file mode 100644 index 0000000..c342e72 --- /dev/null +++ b/src/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/src/core/schemas/builders/object-like/types.ts b/src/core/schemas/builders/object-like/types.ts new file mode 100644 index 0000000..75b3698 --- /dev/null +++ b/src/core/schemas/builders/object-like/types.ts @@ -0,0 +1,11 @@ +import { 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/src/core/schemas/builders/object/index.ts b/src/core/schemas/builders/object/index.ts new file mode 100644 index 0000000..e6db5b5 --- /dev/null +++ b/src/core/schemas/builders/object/index.ts @@ -0,0 +1,17 @@ +export { getObjectUtils, object } from "./object"; +export { isProperty, property } from "./property"; +export type { Property } from "./property"; +export type { + BaseObjectSchema, + inferObjectSchemaFromPropertySchemas, + inferParsedObject, + inferParsedObjectFromPropertySchemas, + inferParsedPropertySchema, + inferRawKey, + inferRawObject, + inferRawObjectFromPropertySchemas, + inferRawPropertySchema, + ObjectSchema, + ObjectUtils, + PropertySchemas, +} from "./types"; diff --git a/src/core/schemas/builders/object/object.ts b/src/core/schemas/builders/object/object.ts new file mode 100644 index 0000000..4abadfb --- /dev/null +++ b/src/core/schemas/builders/object/object.ts @@ -0,0 +1,333 @@ +import { MaybeValid, Schema, SchemaType, 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 { MaybePromise } from "../../utils/MaybePromise"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { partition } from "../../utils/partition"; +import { getObjectLikeUtils } from "../object-like"; +import { getSchemaUtils } from "../schema-utils"; +import { isProperty } from "./property"; +import { + 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: () => + Promise.resolve( + Object.entries(schemas).map(([parsedKey, propertySchema]) => + isProperty(propertySchema) ? propertySchema.rawKey : parsedKey + ) as unknown as (keyof inferRawObjectFromPropertySchemas)[] + ), + _getParsedProperties: () => + Promise.resolve(keys(schemas) as unknown as (keyof inferParsedObjectFromPropertySchemas)[]), + + parse: async (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 (await 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, + }); + }, + + json: async (parsed, opts) => { + const requiredKeys: string[] = []; + + for (const [parsedKey, schemaOrObjectProperty] of entries(schemas)) { + const valueSchema: Schema = isProperty(schemaOrObjectProperty) + ? schemaOrObjectProperty.valueSchema + : schemaOrObjectProperty; + + if (await isSchemaRequired(valueSchema)) { + requiredKeys.push(parsedKey as string); + } + } + + return validateAndTransformObject({ + value: parsed, + requiredKeys, + getProperty: ( + parsedKey + ): + | { transformedKey: string; transform: (propertyValue: unknown) => MaybePromise> } + | 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, + }); + }, + + getType: () => SchemaType.OBJECT, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; +} + +async function validateAndTransformObject({ + value, + requiredKeys, + getProperty, + unrecognizedObjectKeys = "fail", + skipValidation = false, + breadcrumbsPrefix = [], +}: { + value: unknown; + requiredKeys: string[]; + getProperty: ( + preTransformedKey: string + ) => { transformedKey: string; transform: (propertyValue: unknown) => MaybePromise> } | undefined; + unrecognizedObjectKeys: "fail" | "passthrough" | "strip" | undefined; + skipValidation: boolean | undefined; + breadcrumbsPrefix: string[] | undefined; +}): Promise> { + 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 = await property.transform(preTransformedItemValue); + 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: async () => [ + ...(await schema._getParsedProperties()), + ...(await extension._getParsedProperties()), + ], + _getRawProperties: async () => [ + ...(await schema._getRawProperties()), + ...(await extension._getRawProperties()), + ], + parse: async (raw, opts) => { + return validateAndTransformExtendedObject({ + extensionKeys: await extension._getRawProperties(), + value: raw, + transformBase: (rawBase) => schema.parse(rawBase, opts), + transformExtension: (rawExtension) => extension.parse(rawExtension, opts), + }); + }, + json: async (parsed, opts) => { + return validateAndTransformExtendedObject({ + extensionKeys: await extension._getParsedProperties(), + value: parsed, + transformBase: (parsedBase) => schema.json(parsedBase, opts), + transformExtension: (parsedExtension) => extension.json(parsedExtension, opts), + }); + }, + getType: () => SchemaType.OBJECT, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + ...getObjectLikeUtils(baseSchema), + ...getObjectUtils(baseSchema), + }; + }, + }; +} + +async function validateAndTransformExtendedObject({ + extensionKeys, + value, + transformBase, + transformExtension, +}: { + extensionKeys: (keyof PreTransformedExtension)[]; + value: unknown; + transformBase: (value: unknown) => MaybePromise>; + transformExtension: (value: unknown) => MaybePromise>; +}): Promise> { + const extensionPropertiesSet = new Set(extensionKeys); + const [extensionProperties, baseProperties] = partition(keys(value), (key) => + extensionPropertiesSet.has(key as keyof PreTransformedExtension) + ); + + const transformedBase = await transformBase(filterObject(value, baseProperties)); + const transformedExtension = await 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), + ], + }; + } +} + +async function isSchemaRequired(schema: Schema): Promise { + return !(await isSchemaOptional(schema)); +} + +async function isSchemaOptional(schema: Schema): Promise { + switch (await schema.getType()) { + case SchemaType.ANY: + case SchemaType.UNKNOWN: + case SchemaType.OPTIONAL: + return true; + default: + return false; + } +} diff --git a/src/core/schemas/builders/object/property.ts b/src/core/schemas/builders/object/property.ts new file mode 100644 index 0000000..d245c4b --- /dev/null +++ b/src/core/schemas/builders/object/property.ts @@ -0,0 +1,23 @@ +import { 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/src/core/schemas/builders/object/types.ts b/src/core/schemas/builders/object/types.ts new file mode 100644 index 0000000..17cff4f --- /dev/null +++ b/src/core/schemas/builders/object/types.ts @@ -0,0 +1,72 @@ +import { BaseSchema, inferParsed, inferRaw, Schema } from "../../Schema"; +import { addQuestionMarksToNullableProperties } from "../../utils/addQuestionMarksToNullableProperties"; +import { ObjectLikeUtils } from "../object-like"; +import { SchemaUtils } from "../schema-utils"; +import { Property } from "./property"; + +export type ObjectSchema = BaseObjectSchema & + ObjectLikeUtils & + ObjectUtils & + SchemaUtils; + +export interface BaseObjectSchema extends BaseSchema { + _getRawProperties: () => Promise<(keyof Raw)[]>; + _getParsedProperties: () => Promise<(keyof Parsed)[]>; +} + +export interface ObjectUtils { + extend: ( + schemas: ObjectSchema + ) => 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/src/core/schemas/builders/primitives/any.ts b/src/core/schemas/builders/primitives/any.ts new file mode 100644 index 0000000..fcaeb04 --- /dev/null +++ b/src/core/schemas/builders/primitives/any.ts @@ -0,0 +1,4 @@ +import { SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; + +export const any = createIdentitySchemaCreator(SchemaType.ANY, (value) => ({ ok: true, value })); diff --git a/src/core/schemas/builders/primitives/boolean.ts b/src/core/schemas/builders/primitives/boolean.ts new file mode 100644 index 0000000..fad6056 --- /dev/null +++ b/src/core/schemas/builders/primitives/boolean.ts @@ -0,0 +1,25 @@ +import { SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; + +export const boolean = 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/src/core/schemas/builders/primitives/index.ts b/src/core/schemas/builders/primitives/index.ts new file mode 100644 index 0000000..788f941 --- /dev/null +++ b/src/core/schemas/builders/primitives/index.ts @@ -0,0 +1,5 @@ +export { any } from "./any"; +export { boolean } from "./boolean"; +export { number } from "./number"; +export { string } from "./string"; +export { unknown } from "./unknown"; diff --git a/src/core/schemas/builders/primitives/number.ts b/src/core/schemas/builders/primitives/number.ts new file mode 100644 index 0000000..c268945 --- /dev/null +++ b/src/core/schemas/builders/primitives/number.ts @@ -0,0 +1,25 @@ +import { SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; + +export const number = 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/src/core/schemas/builders/primitives/string.ts b/src/core/schemas/builders/primitives/string.ts new file mode 100644 index 0000000..949f1f2 --- /dev/null +++ b/src/core/schemas/builders/primitives/string.ts @@ -0,0 +1,25 @@ +import { SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; + +export const string = 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/src/core/schemas/builders/primitives/unknown.ts b/src/core/schemas/builders/primitives/unknown.ts new file mode 100644 index 0000000..4d52495 --- /dev/null +++ b/src/core/schemas/builders/primitives/unknown.ts @@ -0,0 +1,4 @@ +import { SchemaType } from "../../Schema"; +import { createIdentitySchemaCreator } from "../../utils/createIdentitySchemaCreator"; + +export const unknown = createIdentitySchemaCreator(SchemaType.UNKNOWN, (value) => ({ ok: true, value })); diff --git a/src/core/schemas/builders/record/index.ts b/src/core/schemas/builders/record/index.ts new file mode 100644 index 0000000..82e25c5 --- /dev/null +++ b/src/core/schemas/builders/record/index.ts @@ -0,0 +1,2 @@ +export { record } from "./record"; +export type { BaseRecordSchema, RecordSchema } from "./types"; diff --git a/src/core/schemas/builders/record/record.ts b/src/core/schemas/builders/record/record.ts new file mode 100644 index 0000000..ac1cd22 --- /dev/null +++ b/src/core/schemas/builders/record/record.ts @@ -0,0 +1,131 @@ +import { MaybeValid, Schema, SchemaType, ValidationError } from "../../Schema"; +import { entries } from "../../utils/entries"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { isPlainObject } from "../../utils/isPlainObject"; +import { MaybePromise } from "../../utils/MaybePromise"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { getSchemaUtils } from "../schema-utils"; +import { BaseRecordSchema, RecordSchema } from "./types"; + +export function record( + keySchema: Schema, + valueSchema: Schema +): RecordSchema { + const baseSchema: BaseRecordSchema = { + parse: async (raw, opts) => { + return validateAndTransformRecord({ + value: raw, + isKeyNumeric: (await 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: async (parsed, opts) => { + return validateAndTransformRecord({ + value: parsed, + isKeyNumeric: (await 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), + }; +} + +async function validateAndTransformRecord({ + value, + isKeyNumeric, + transformKey, + transformValue, + breadcrumbsPrefix = [], +}: { + value: unknown; + isKeyNumeric: boolean; + transformKey: (key: string | number) => MaybePromise>; + transformValue: (value: unknown, key: string | number) => MaybePromise>; + breadcrumbsPrefix: string[] | undefined; +}): Promise>> { + if (!isPlainObject(value)) { + return { + ok: false, + errors: [ + { + path: breadcrumbsPrefix, + message: getErrorMessageForIncorrectType(value, "object"), + }, + ], + }; + } + + return entries(value).reduce>>>( + async (accPromise, [stringKey, value]) => { + // skip nullish keys + if (value == null) { + return accPromise; + } + + const acc = await accPromise; + + let key: string | number = stringKey; + if (isKeyNumeric) { + const numberKey = stringKey.length > 0 ? Number(stringKey) : NaN; + if (!isNaN(numberKey)) { + key = numberKey; + } + } + const transformedKey = await transformKey(key); + + const transformedValue = await 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, + }; + }, + Promise.resolve({ ok: true, value: {} as Record }) + ); +} diff --git a/src/core/schemas/builders/record/types.ts b/src/core/schemas/builders/record/types.ts new file mode 100644 index 0000000..eb82cc7 --- /dev/null +++ b/src/core/schemas/builders/record/types.ts @@ -0,0 +1,17 @@ +import { BaseSchema } from "../../Schema"; +import { SchemaUtils } from "../schema-utils"; + +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/src/core/schemas/builders/schema-utils/JsonError.ts b/src/core/schemas/builders/schema-utils/JsonError.ts new file mode 100644 index 0000000..2b89ca0 --- /dev/null +++ b/src/core/schemas/builders/schema-utils/JsonError.ts @@ -0,0 +1,9 @@ +import { 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/src/core/schemas/builders/schema-utils/ParseError.ts b/src/core/schemas/builders/schema-utils/ParseError.ts new file mode 100644 index 0000000..d056eb4 --- /dev/null +++ b/src/core/schemas/builders/schema-utils/ParseError.ts @@ -0,0 +1,9 @@ +import { 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/src/core/schemas/builders/schema-utils/getSchemaUtils.ts b/src/core/schemas/builders/schema-utils/getSchemaUtils.ts new file mode 100644 index 0000000..0c0d379 --- /dev/null +++ b/src/core/schemas/builders/schema-utils/getSchemaUtils.ts @@ -0,0 +1,99 @@ +import { BaseSchema, Schema, SchemaOptions, SchemaType } from "../../Schema"; +import { JsonError } from "./JsonError"; +import { ParseError } from "./ParseError"; + +export interface SchemaUtils { + optional: () => Schema; + transform: (transformer: SchemaTransformer) => Schema; + parseOrThrow: (raw: unknown, opts?: SchemaOptions) => Promise; + jsonOrThrow: (raw: unknown, opts?: SchemaOptions) => Promise; +} + +export interface SchemaTransformer { + transform: (parsed: Parsed) => Transformed; + untransform: (transformed: any) => Parsed; +} + +export function getSchemaUtils(schema: BaseSchema): SchemaUtils { + return { + optional: () => optional(schema), + transform: (transformer) => transform(schema, transformer), + parseOrThrow: async (raw, opts) => { + const parsed = await schema.parse(raw, opts); + if (parsed.ok) { + return parsed.value; + } + throw new ParseError(parsed.errors); + }, + jsonOrThrow: async (parsed, opts) => { + const raw = await 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 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 (parsed == null) { + return { + ok: true, + value: null, + }; + } + return schema.json(parsed, opts); + }, + getType: () => SchemaType.OPTIONAL, + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} + +export function transform( + schema: BaseSchema, + transformer: SchemaTransformer +): Schema { + const baseSchema: BaseSchema = { + parse: async (raw, opts) => { + const parsed = await schema.parse(raw, opts); + if (!parsed.ok) { + return parsed; + } + return { + ok: true, + value: transformer.transform(parsed.value), + }; + }, + json: async (transformed, opts) => { + const parsed = await transformer.untransform(transformed); + return schema.json(parsed, opts); + }, + getType: () => schema.getType(), + }; + + return { + ...baseSchema, + ...getSchemaUtils(baseSchema), + }; +} diff --git a/src/core/schemas/builders/schema-utils/index.ts b/src/core/schemas/builders/schema-utils/index.ts new file mode 100644 index 0000000..aa04e05 --- /dev/null +++ b/src/core/schemas/builders/schema-utils/index.ts @@ -0,0 +1,4 @@ +export { getSchemaUtils, optional, transform } from "./getSchemaUtils"; +export type { SchemaUtils } from "./getSchemaUtils"; +export { JsonError } from "./JsonError"; +export { ParseError } from "./ParseError"; diff --git a/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts b/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts new file mode 100644 index 0000000..4160f0a --- /dev/null +++ b/src/core/schemas/builders/schema-utils/stringifyValidationErrors.ts @@ -0,0 +1,8 @@ +import { 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/src/core/schemas/builders/set/index.ts b/src/core/schemas/builders/set/index.ts new file mode 100644 index 0000000..f3310e8 --- /dev/null +++ b/src/core/schemas/builders/set/index.ts @@ -0,0 +1 @@ +export { set } from "./set"; diff --git a/src/core/schemas/builders/set/set.ts b/src/core/schemas/builders/set/set.ts new file mode 100644 index 0000000..3113bcb --- /dev/null +++ b/src/core/schemas/builders/set/set.ts @@ -0,0 +1,43 @@ +import { BaseSchema, Schema, SchemaType } from "../../Schema"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { list } from "../list"; +import { getSchemaUtils } from "../schema-utils"; + +export function set(schema: Schema): Schema> { + const listSchema = list(schema); + const baseSchema: BaseSchema> = { + parse: async (raw, opts) => { + const parsedList = await listSchema.parse(raw, opts); + if (parsedList.ok) { + return { + ok: true, + value: new Set(parsedList.value), + }; + } else { + return parsedList; + } + }, + json: async (parsed, opts) => { + if (!(parsed instanceof Set)) { + return { + ok: false, + errors: [ + { + path: opts?.breadcrumbsPrefix ?? [], + message: getErrorMessageForIncorrectType(parsed, "Set"), + }, + ], + }; + } + const jsonList = await listSchema.json([...parsed], opts); + return jsonList; + }, + getType: () => SchemaType.SET, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} diff --git a/src/core/schemas/builders/undiscriminated-union/index.ts b/src/core/schemas/builders/undiscriminated-union/index.ts new file mode 100644 index 0000000..75b71cb --- /dev/null +++ b/src/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/src/core/schemas/builders/undiscriminated-union/types.ts b/src/core/schemas/builders/undiscriminated-union/types.ts new file mode 100644 index 0000000..43e7108 --- /dev/null +++ b/src/core/schemas/builders/undiscriminated-union/types.ts @@ -0,0 +1,10 @@ +import { inferParsed, inferRaw, Schema } from "../../Schema"; + +export type UndiscriminatedUnionSchema = Schema< + inferRawUnidiscriminatedUnionSchema, + inferParsedUnidiscriminatedUnionSchema +>; + +export type inferRawUnidiscriminatedUnionSchema = inferRaw; + +export type inferParsedUnidiscriminatedUnionSchema = inferParsed; diff --git a/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts b/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts new file mode 100644 index 0000000..771dc6a --- /dev/null +++ b/src/core/schemas/builders/undiscriminated-union/undiscriminatedUnion.ts @@ -0,0 +1,61 @@ +import { BaseSchema, MaybeValid, Schema, SchemaOptions, SchemaType, ValidationError } from "../../Schema"; +import { MaybePromise } from "../../utils/MaybePromise"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { getSchemaUtils } from "../schema-utils"; +import { inferParsedUnidiscriminatedUnionSchema, inferRawUnidiscriminatedUnionSchema } from "./types"; + +export function undiscriminatedUnion, ...Schema[]]>( + schemas: Schemas +): Schema, inferParsedUnidiscriminatedUnionSchema> { + const baseSchema: BaseSchema< + inferRawUnidiscriminatedUnionSchema, + inferParsedUnidiscriminatedUnionSchema + > = { + parse: async (raw, opts) => { + return validateAndTransformUndiscriminatedUnion>( + (schema, opts) => schema.parse(raw, opts), + schemas, + opts + ); + }, + json: async (parsed, opts) => { + return validateAndTransformUndiscriminatedUnion>( + (schema, opts) => schema.json(parsed, opts), + schemas, + opts + ); + }, + getType: () => SchemaType.UNDISCRIMINATED_UNION, + }; + + return { + ...maybeSkipValidation(baseSchema), + ...getSchemaUtils(baseSchema), + }; +} + +async function validateAndTransformUndiscriminatedUnion( + transform: (schema: Schema, opts: SchemaOptions) => MaybePromise>, + schemas: Schema[], + opts: SchemaOptions | undefined +): Promise> { + const errors: ValidationError[] = []; + for (const [index, schema] of schemas.entries()) { + const transformed = await 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/src/core/schemas/builders/union/discriminant.ts b/src/core/schemas/builders/union/discriminant.ts new file mode 100644 index 0000000..55065bc --- /dev/null +++ b/src/core/schemas/builders/union/discriminant.ts @@ -0,0 +1,14 @@ +export function discriminant( + parsedDiscriminant: ParsedDiscriminant, + rawDiscriminant: RawDiscriminant +): Discriminant { + return { + parsedDiscriminant, + rawDiscriminant, + }; +} + +export interface Discriminant { + parsedDiscriminant: ParsedDiscriminant; + rawDiscriminant: RawDiscriminant; +} diff --git a/src/core/schemas/builders/union/index.ts b/src/core/schemas/builders/union/index.ts new file mode 100644 index 0000000..85fc008 --- /dev/null +++ b/src/core/schemas/builders/union/index.ts @@ -0,0 +1,10 @@ +export { discriminant } from "./discriminant"; +export type { Discriminant } from "./discriminant"; +export type { + inferParsedDiscriminant, + inferParsedUnion, + inferRawDiscriminant, + inferRawUnion, + UnionSubtypes, +} from "./types"; +export { union } from "./union"; diff --git a/src/core/schemas/builders/union/types.ts b/src/core/schemas/builders/union/types.ts new file mode 100644 index 0000000..6f82c86 --- /dev/null +++ b/src/core/schemas/builders/union/types.ts @@ -0,0 +1,26 @@ +import { inferParsedObject, inferRawObject, ObjectSchema } from "../object"; +import { 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/src/core/schemas/builders/union/union.ts b/src/core/schemas/builders/union/union.ts new file mode 100644 index 0000000..ed659be --- /dev/null +++ b/src/core/schemas/builders/union/union.ts @@ -0,0 +1,173 @@ +import { BaseSchema, MaybeValid, SchemaType } from "../../Schema"; +import { getErrorMessageForIncorrectType } from "../../utils/getErrorMessageForIncorrectType"; +import { isPlainObject } from "../../utils/isPlainObject"; +import { keys } from "../../utils/keys"; +import { MaybePromise } from "../../utils/MaybePromise"; +import { maybeSkipValidation } from "../../utils/maybeSkipValidation"; +import { enum_ } from "../enum"; +import { ObjectSchema } from "../object"; +import { getObjectLikeUtils, ObjectLikeSchema } from "../object-like"; +import { getSchemaUtils } from "../schema-utils"; +import { Discriminant } from "./discriminant"; +import { 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: async (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: async (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), + }; +} + +async 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) => MaybePromise>; + getAdditionalPropertiesSchema: (discriminantValue: string) => ObjectSchema | undefined; + allowUnrecognizedUnionMembers: boolean | undefined; + transformAdditionalProperties: ( + additionalProperties: unknown, + additionalPropertiesSchema: ObjectSchema + ) => MaybePromise>; + breadcrumbsPrefix: string[] | undefined; +}): Promise< + 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 = await 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 = await transformAdditionalProperties( + additionalProperties, + additionalPropertiesSchema + ); + if (!transformedAdditionalProperties.ok) { + return transformedAdditionalProperties; + } + + return { + ok: true, + value: { + [transformedDiscriminant]: discriminantValue, + ...transformedAdditionalProperties.value, + } as Record & TransformedAdditionalProperties, + }; +} diff --git a/src/core/schemas/index.ts b/src/core/schemas/index.ts new file mode 100644 index 0000000..5429d8b --- /dev/null +++ b/src/core/schemas/index.ts @@ -0,0 +1,2 @@ +export * from "./builders"; +export type { inferParsed, inferRaw, Schema, SchemaOptions } from "./Schema"; diff --git a/src/core/schemas/utils/MaybePromise.ts b/src/core/schemas/utils/MaybePromise.ts new file mode 100644 index 0000000..9cd354b --- /dev/null +++ b/src/core/schemas/utils/MaybePromise.ts @@ -0,0 +1 @@ +export type MaybePromise = T | Promise; diff --git a/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts b/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts new file mode 100644 index 0000000..4111d70 --- /dev/null +++ b/src/core/schemas/utils/addQuestionMarksToNullableProperties.ts @@ -0,0 +1,15 @@ +export type addQuestionMarksToNullableProperties = { + [K in OptionalKeys]?: T[K]; +} & Pick>; + +export type OptionalKeys = { + [K in keyof T]-?: undefined extends T[K] + ? K + : null extends T[K] + ? K + : 1 extends (any extends T[K] ? 0 : 1) + ? never + : K; +}[keyof T]; + +export type RequiredKeys = Exclude>; diff --git a/src/core/schemas/utils/createIdentitySchemaCreator.ts b/src/core/schemas/utils/createIdentitySchemaCreator.ts new file mode 100644 index 0000000..de107cf --- /dev/null +++ b/src/core/schemas/utils/createIdentitySchemaCreator.ts @@ -0,0 +1,21 @@ +import { getSchemaUtils } from "../builders/schema-utils"; +import { 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/src/core/schemas/utils/entries.ts b/src/core/schemas/utils/entries.ts new file mode 100644 index 0000000..e122952 --- /dev/null +++ b/src/core/schemas/utils/entries.ts @@ -0,0 +1,3 @@ +export function entries(object: T): [keyof T, T[keyof T]][] { + return Object.entries(object) as [keyof T, T[keyof T]][]; +} diff --git a/src/core/schemas/utils/filterObject.ts b/src/core/schemas/utils/filterObject.ts new file mode 100644 index 0000000..2c25a34 --- /dev/null +++ b/src/core/schemas/utils/filterObject.ts @@ -0,0 +1,10 @@ +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; + } + return acc; + // eslint-disable-next-line @typescript-eslint/prefer-reduce-type-parameter + }, {} as Pick); +} diff --git a/src/core/schemas/utils/getErrorMessageForIncorrectType.ts b/src/core/schemas/utils/getErrorMessageForIncorrectType.ts new file mode 100644 index 0000000..438012d --- /dev/null +++ b/src/core/schemas/utils/getErrorMessageForIncorrectType.ts @@ -0,0 +1,21 @@ +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"; + } + switch (typeof value) { + case "string": + return `"${value}"`; + case "number": + case "boolean": + case "undefined": + return `${value}`; + } + return typeof value; +} diff --git a/src/core/schemas/utils/isPlainObject.ts b/src/core/schemas/utils/isPlainObject.ts new file mode 100644 index 0000000..db82a72 --- /dev/null +++ b/src/core/schemas/utils/isPlainObject.ts @@ -0,0 +1,17 @@ +// borrowed from https://github.com/lodash/lodash/blob/master/isPlainObject.js +export function isPlainObject(value: unknown): value is Record { + if (typeof value !== "object" || value === null) { + return false; + } + + if (Object.getPrototypeOf(value) === null) { + return true; + } + + let proto = value; + while (Object.getPrototypeOf(proto) !== null) { + proto = Object.getPrototypeOf(proto); + } + + return Object.getPrototypeOf(value) === proto; +} diff --git a/src/core/schemas/utils/keys.ts b/src/core/schemas/utils/keys.ts new file mode 100644 index 0000000..0186709 --- /dev/null +++ b/src/core/schemas/utils/keys.ts @@ -0,0 +1,3 @@ +export function keys(object: T): (keyof T)[] { + return Object.keys(object) as (keyof T)[]; +} diff --git a/src/core/schemas/utils/maybeSkipValidation.ts b/src/core/schemas/utils/maybeSkipValidation.ts new file mode 100644 index 0000000..99c02c3 --- /dev/null +++ b/src/core/schemas/utils/maybeSkipValidation.ts @@ -0,0 +1,39 @@ +import { BaseSchema, MaybeValid, SchemaOptions } from "../Schema"; +import { MaybePromise } from "./MaybePromise"; + +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) => MaybePromise> +): (value: unknown, opts?: SchemaOptions) => MaybePromise> { + return async (value, opts): Promise> => { + const transformed = await transform(value, opts); + const { skipValidation = false } = opts ?? {}; + if (!transformed.ok && skipValidation) { + // eslint-disable-next-line no-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/src/core/schemas/utils/partition.ts b/src/core/schemas/utils/partition.ts new file mode 100644 index 0000000..f58d6f3 --- /dev/null +++ b/src/core/schemas/utils/partition.ts @@ -0,0 +1,12 @@ +export function partition(items: readonly T[], predicate: (item: T) => boolean): [T[], T[]] { + const trueItems: T[] = [], + falseItems: T[] = []; + for (const item of items) { + if (predicate(item)) { + trueItems.push(item); + } else { + falseItems.push(item); + } + } + return [trueItems, falseItems]; +} diff --git a/src/environments.ts b/src/environments.ts new file mode 100644 index 0000000..081ded8 --- /dev/null +++ b/src/environments.ts @@ -0,0 +1,9 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export const CohereEnvironment = { + Production: "https://api.cohere.ai", +} as const; + +export type CohereEnvironment = typeof CohereEnvironment.Production; diff --git a/src/errors/CohereError.ts b/src/errors/CohereError.ts new file mode 100644 index 0000000..fba48dc --- /dev/null +++ b/src/errors/CohereError.ts @@ -0,0 +1,45 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export class CohereError extends Error { + readonly statusCode?: number; + readonly body?: unknown; + + constructor({ message, statusCode, body }: { message?: string; statusCode?: number; body?: unknown }) { + super(buildMessage({ message, statusCode, body })); + Object.setPrototypeOf(this, CohereError.prototype); + if (statusCode != null) { + this.statusCode = statusCode; + } + + if (body !== undefined) { + this.body = body; + } + } +} + +function buildMessage({ + message, + statusCode, + body, +}: { + message: string | undefined; + statusCode: number | undefined; + body: unknown | undefined; +}): string { + let lines: string[] = []; + if (message != null) { + lines.push(message); + } + + if (statusCode != null) { + lines.push(`Status code: ${statusCode.toString()}`); + } + + if (body != null) { + lines.push(`Body: ${JSON.stringify(body, undefined, 2)}`); + } + + return lines.join("\n"); +} diff --git a/src/errors/CohereTimeoutError.ts b/src/errors/CohereTimeoutError.ts new file mode 100644 index 0000000..6d1b46e --- /dev/null +++ b/src/errors/CohereTimeoutError.ts @@ -0,0 +1,10 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +export class CohereTimeoutError extends Error { + constructor() { + super("Timeout"); + Object.setPrototypeOf(this, CohereTimeoutError.prototype); + } +} diff --git a/src/errors/index.ts b/src/errors/index.ts new file mode 100644 index 0000000..5155e66 --- /dev/null +++ b/src/errors/index.ts @@ -0,0 +1,2 @@ +export { CohereError } from "./CohereError"; +export { CohereTimeoutError } from "./CohereTimeoutError"; diff --git a/src/index.ts b/src/index.ts new file mode 100644 index 0000000..063313f --- /dev/null +++ b/src/index.ts @@ -0,0 +1,4 @@ +export * as Cohere from "./api"; +export { CohereClient } from "./Client"; +export { CohereEnvironment } from "./environments"; +export { CohereError, CohereTimeoutError } from "./errors"; diff --git a/src/serialization/client/index.ts b/src/serialization/client/index.ts new file mode 100644 index 0000000..415726b --- /dev/null +++ b/src/serialization/client/index.ts @@ -0,0 +1 @@ +export * from "./requests"; diff --git a/src/serialization/client/requests/ChatRequest.ts b/src/serialization/client/requests/ChatRequest.ts new file mode 100644 index 0000000..2438697 --- /dev/null +++ b/src/serialization/client/requests/ChatRequest.ts @@ -0,0 +1,55 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from "../.."; +import * as Cohere from "../../../api"; +import * as core from "../../../core"; + +export const ChatRequest: core.serialization.Schema = + core.serialization.object({ + message: core.serialization.string(), + model: core.serialization.string().optional(), + stream: core.serialization.boolean().optional(), + preambleOverride: core.serialization.property("preamble_override", core.serialization.string().optional()), + chatHistory: core.serialization.property( + "chat_history", + core.serialization + .list(core.serialization.lazyObject(async () => (await import("../..")).ChatMessage)) + .optional() + ), + conversationId: core.serialization.property("conversation_id", core.serialization.string().optional()), + promptTruncation: core.serialization.property( + "prompt_truncation", + core.serialization.lazy(async () => (await import("../..")).ChatRequestPromptTruncation).optional() + ), + connectors: core.serialization + .list(core.serialization.lazyObject(async () => (await import("../..")).ChatConnector)) + .optional(), + searchQueriesOnly: core.serialization.property("search_queries_only", core.serialization.boolean().optional()), + documents: core.serialization + .list(core.serialization.lazyObject(async () => (await import("../..")).ChatDocument)) + .optional(), + citationQuality: core.serialization.property( + "citation_quality", + core.serialization.lazy(async () => (await import("../..")).ChatRequestCitationQuality).optional() + ), + temperature: core.serialization.number().optional(), + }); + +export declare namespace ChatRequest { + interface Raw { + message: string; + model?: string | null; + stream?: boolean | null; + preamble_override?: string | null; + chat_history?: serializers.ChatMessage.Raw[] | null; + conversation_id?: string | null; + prompt_truncation?: serializers.ChatRequestPromptTruncation.Raw | null; + connectors?: serializers.ChatConnector.Raw[] | null; + search_queries_only?: boolean | null; + documents?: serializers.ChatDocument.Raw[] | null; + citation_quality?: serializers.ChatRequestCitationQuality.Raw | null; + temperature?: number | null; + } +} diff --git a/src/serialization/client/requests/ClassifyRequest.ts b/src/serialization/client/requests/ClassifyRequest.ts new file mode 100644 index 0000000..e9ca21d --- /dev/null +++ b/src/serialization/client/requests/ClassifyRequest.ts @@ -0,0 +1,28 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from "../.."; +import * as Cohere from "../../../api"; +import * as core from "../../../core"; + +export const ClassifyRequest: core.serialization.Schema = + core.serialization.object({ + inputs: core.serialization.list(core.serialization.string()), + examples: core.serialization.list( + core.serialization.lazyObject(async () => (await import("../..")).ClassifyRequestExamplesItem) + ), + model: core.serialization.string().optional(), + preset: core.serialization.string().optional(), + truncate: core.serialization.lazy(async () => (await import("../..")).ClassifyRequestTruncate).optional(), + }); + +export declare namespace ClassifyRequest { + interface Raw { + inputs: string[]; + examples: serializers.ClassifyRequestExamplesItem.Raw[]; + model?: string | null; + preset?: string | null; + truncate?: serializers.ClassifyRequestTruncate.Raw | null; + } +} diff --git a/src/serialization/client/requests/DetectLanguageRequest.ts b/src/serialization/client/requests/DetectLanguageRequest.ts new file mode 100644 index 0000000..1c3c280 --- /dev/null +++ b/src/serialization/client/requests/DetectLanguageRequest.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from "../.."; +import * as Cohere from "../../../api"; +import * as core from "../../../core"; + +export const DetectLanguageRequest: core.serialization.Schema< + serializers.DetectLanguageRequest.Raw, + Cohere.DetectLanguageRequest +> = core.serialization.object({ + texts: core.serialization.list(core.serialization.string()), +}); + +export declare namespace DetectLanguageRequest { + interface Raw { + texts: string[]; + } +} diff --git a/src/serialization/client/requests/DetokenizeRequest.ts b/src/serialization/client/requests/DetokenizeRequest.ts new file mode 100644 index 0000000..5984b7c --- /dev/null +++ b/src/serialization/client/requests/DetokenizeRequest.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from "../.."; +import * as Cohere from "../../../api"; +import * as core from "../../../core"; + +export const DetokenizeRequest: core.serialization.Schema = + core.serialization.object({ + tokens: core.serialization.list(core.serialization.number()), + model: core.serialization.string().optional(), + }); + +export declare namespace DetokenizeRequest { + interface Raw { + tokens: number[]; + model?: string | null; + } +} diff --git a/src/serialization/client/requests/EmbedRequest.ts b/src/serialization/client/requests/EmbedRequest.ts new file mode 100644 index 0000000..38e6a0b --- /dev/null +++ b/src/serialization/client/requests/EmbedRequest.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from "../.."; +import * as Cohere from "../../../api"; +import * as core from "../../../core"; + +export const EmbedRequest: core.serialization.Schema = + core.serialization.object({ + texts: core.serialization.list(core.serialization.string()), + model: core.serialization.string().optional(), + truncate: core.serialization.lazy(async () => (await import("../..")).EmbedRequestTruncate).optional(), + }); + +export declare namespace EmbedRequest { + interface Raw { + texts: string[]; + model?: string | null; + truncate?: serializers.EmbedRequestTruncate.Raw | null; + } +} diff --git a/src/serialization/client/requests/GenerateRequest.ts b/src/serialization/client/requests/GenerateRequest.ts new file mode 100644 index 0000000..3f361d0 --- /dev/null +++ b/src/serialization/client/requests/GenerateRequest.ts @@ -0,0 +1,60 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from "../.."; +import * as Cohere from "../../../api"; +import * as core from "../../../core"; + +export const GenerateRequest: core.serialization.Schema = + core.serialization.object({ + prompt: core.serialization.string(), + model: core.serialization.string().optional(), + numGenerations: core.serialization.property("num_generations", core.serialization.number().optional()), + stream: core.serialization.boolean().optional(), + maxTokens: core.serialization.property("max_tokens", core.serialization.number().optional()), + truncate: core.serialization.lazy(async () => (await import("../..")).GenerateRequestTruncate).optional(), + temperature: core.serialization.number().optional(), + preset: core.serialization.string().optional(), + endSequences: core.serialization.property( + "end_sequences", + core.serialization.list(core.serialization.string()).optional() + ), + stopSequences: core.serialization.property( + "stop_sequences", + core.serialization.list(core.serialization.string()).optional() + ), + k: core.serialization.number().optional(), + p: core.serialization.number().optional(), + frequencyPenalty: core.serialization.property("frequency_penalty", core.serialization.number().optional()), + presencePenalty: core.serialization.property("presence_penalty", core.serialization.number().optional()), + returnLikelihoods: core.serialization.property( + "return_likelihoods", + core.serialization.lazy(async () => (await import("../..")).GenerateRequestReturnLikelihoods).optional() + ), + logitBias: core.serialization.property( + "logit_bias", + core.serialization.record(core.serialization.string(), core.serialization.number()).optional() + ), + }); + +export declare namespace GenerateRequest { + interface Raw { + prompt: string; + model?: string | null; + num_generations?: number | null; + stream?: boolean | null; + max_tokens?: number | null; + truncate?: serializers.GenerateRequestTruncate.Raw | null; + temperature?: number | null; + preset?: string | null; + end_sequences?: string[] | null; + stop_sequences?: string[] | null; + k?: number | null; + p?: number | null; + frequency_penalty?: number | null; + presence_penalty?: number | null; + return_likelihoods?: serializers.GenerateRequestReturnLikelihoods.Raw | null; + logit_bias?: Record | null; + } +} diff --git a/src/serialization/client/requests/RerankRequest.ts b/src/serialization/client/requests/RerankRequest.ts new file mode 100644 index 0000000..97f3dea --- /dev/null +++ b/src/serialization/client/requests/RerankRequest.ts @@ -0,0 +1,30 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from "../.."; +import * as Cohere from "../../../api"; +import * as core from "../../../core"; + +export const RerankRequest: core.serialization.Schema = + core.serialization.object({ + model: core.serialization.string().optional(), + query: core.serialization.string(), + documents: core.serialization.list( + core.serialization.lazyObject(async () => (await import("../..")).RerankRequestDocumentsItem) + ), + topN: core.serialization.property("top_n", core.serialization.number().optional()), + returnDocuments: core.serialization.property("return_documents", core.serialization.boolean().optional()), + maxChunksPerDoc: core.serialization.property("max_chunks_per_doc", core.serialization.number().optional()), + }); + +export declare namespace RerankRequest { + interface Raw { + model?: string | null; + query: string; + documents: serializers.RerankRequestDocumentsItem.Raw[]; + top_n?: number | null; + return_documents?: boolean | null; + max_chunks_per_doc?: number | null; + } +} diff --git a/src/serialization/client/requests/SummarizeRequest.ts b/src/serialization/client/requests/SummarizeRequest.ts new file mode 100644 index 0000000..f73f63f --- /dev/null +++ b/src/serialization/client/requests/SummarizeRequest.ts @@ -0,0 +1,32 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from "../.."; +import * as Cohere from "../../../api"; +import * as core from "../../../core"; + +export const SummarizeRequest: core.serialization.Schema = + core.serialization.object({ + text: core.serialization.string(), + length: core.serialization.lazy(async () => (await import("../..")).SummarizeRequestLength).optional(), + format: core.serialization.lazy(async () => (await import("../..")).SummarizeRequestFormat).optional(), + model: core.serialization.lazy(async () => (await import("../..")).SummarizeRequestModel).optional(), + extractiveness: core.serialization + .lazy(async () => (await import("../..")).SummarizeRequestExtractiveness) + .optional(), + temperature: core.serialization.number().optional(), + additionalCommand: core.serialization.property("additional_command", core.serialization.string().optional()), + }); + +export declare namespace SummarizeRequest { + interface Raw { + text: string; + length?: serializers.SummarizeRequestLength.Raw | null; + format?: serializers.SummarizeRequestFormat.Raw | null; + model?: serializers.SummarizeRequestModel.Raw | null; + extractiveness?: serializers.SummarizeRequestExtractiveness.Raw | null; + temperature?: number | null; + additional_command?: string | null; + } +} diff --git a/src/serialization/client/requests/TokenizeRequest.ts b/src/serialization/client/requests/TokenizeRequest.ts new file mode 100644 index 0000000..ca1fa76 --- /dev/null +++ b/src/serialization/client/requests/TokenizeRequest.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from "../.."; +import * as Cohere from "../../../api"; +import * as core from "../../../core"; + +export const TokenizeRequest: core.serialization.Schema = + core.serialization.object({ + text: core.serialization.string(), + model: core.serialization.string().optional(), + }); + +export declare namespace TokenizeRequest { + interface Raw { + text: string; + model?: string | null; + } +} diff --git a/src/serialization/client/requests/index.ts b/src/serialization/client/requests/index.ts new file mode 100644 index 0000000..dc6691f --- /dev/null +++ b/src/serialization/client/requests/index.ts @@ -0,0 +1,9 @@ +export { GenerateRequest } from "./GenerateRequest"; +export { EmbedRequest } from "./EmbedRequest"; +export { ClassifyRequest } from "./ClassifyRequest"; +export { ChatRequest } from "./ChatRequest"; +export { TokenizeRequest } from "./TokenizeRequest"; +export { DetokenizeRequest } from "./DetokenizeRequest"; +export { DetectLanguageRequest } from "./DetectLanguageRequest"; +export { SummarizeRequest } from "./SummarizeRequest"; +export { RerankRequest } from "./RerankRequest"; diff --git a/src/serialization/index.ts b/src/serialization/index.ts new file mode 100644 index 0000000..c9240f8 --- /dev/null +++ b/src/serialization/index.ts @@ -0,0 +1,2 @@ +export * from "./types"; +export * from "./client"; diff --git a/src/serialization/types/ApiMeta.ts b/src/serialization/types/ApiMeta.ts new file mode 100644 index 0000000..44bda46 --- /dev/null +++ b/src/serialization/types/ApiMeta.ts @@ -0,0 +1,23 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ApiMeta: core.serialization.ObjectSchema = + core.serialization.object({ + apiVersion: core.serialization.property( + "api_version", + core.serialization.lazyObject(async () => (await import("..")).ApiMetaApiVersion).optional() + ), + warnings: core.serialization.list(core.serialization.string()).optional(), + }); + +export declare namespace ApiMeta { + interface Raw { + api_version?: serializers.ApiMetaApiVersion.Raw | null; + warnings?: string[] | null; + } +} diff --git a/src/serialization/types/ApiMetaApiVersion.ts b/src/serialization/types/ApiMetaApiVersion.ts new file mode 100644 index 0000000..986e8a1 --- /dev/null +++ b/src/serialization/types/ApiMetaApiVersion.ts @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ApiMetaApiVersion: core.serialization.ObjectSchema< + serializers.ApiMetaApiVersion.Raw, + Cohere.ApiMetaApiVersion +> = core.serialization.object({ + version: core.serialization.string(), + isDeprecated: core.serialization.property("is_deprecated", core.serialization.boolean().optional()), + isExperimental: core.serialization.property("is_experimental", core.serialization.boolean().optional()), +}); + +export declare namespace ApiMetaApiVersion { + interface Raw { + version: string; + is_deprecated?: boolean | null; + is_experimental?: boolean | null; + } +} diff --git a/src/serialization/types/ChatCitation.ts b/src/serialization/types/ChatCitation.ts new file mode 100644 index 0000000..09d1350 --- /dev/null +++ b/src/serialization/types/ChatCitation.ts @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatCitation: core.serialization.ObjectSchema = + core.serialization.object({ + start: core.serialization.number(), + end: core.serialization.number(), + text: core.serialization.string(), + documentIds: core.serialization.property("document_ids", core.serialization.list(core.serialization.string())), + }); + +export declare namespace ChatCitation { + interface Raw { + start: number; + end: number; + text: string; + document_ids: string[]; + } +} diff --git a/src/serialization/types/ChatCitationGenerationEvent.ts b/src/serialization/types/ChatCitationGenerationEvent.ts new file mode 100644 index 0000000..5a83e7c --- /dev/null +++ b/src/serialization/types/ChatCitationGenerationEvent.ts @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatCitationGenerationEvent: core.serialization.ObjectSchema< + serializers.ChatCitationGenerationEvent.Raw, + Cohere.ChatCitationGenerationEvent +> = core.serialization + .object({ + citations: core.serialization.list( + core.serialization.lazyObject(async () => (await import("..")).ChatCitation) + ), + }) + .extend(core.serialization.lazyObject(async () => (await import("..")).ChatStreamEvent)); + +export declare namespace ChatCitationGenerationEvent { + interface Raw extends serializers.ChatStreamEvent.Raw { + citations: serializers.ChatCitation.Raw[]; + } +} diff --git a/src/serialization/types/ChatConnector.ts b/src/serialization/types/ChatConnector.ts new file mode 100644 index 0000000..3766ab1 --- /dev/null +++ b/src/serialization/types/ChatConnector.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatConnector: core.serialization.ObjectSchema = + core.serialization.object({ + id: core.serialization.string(), + options: core.serialization.record(core.serialization.string(), core.serialization.unknown()).optional(), + }); + +export declare namespace ChatConnector { + interface Raw { + id: string; + options?: Record | null; + } +} diff --git a/src/serialization/types/ChatDocument.ts b/src/serialization/types/ChatDocument.ts new file mode 100644 index 0000000..de1dabc --- /dev/null +++ b/src/serialization/types/ChatDocument.ts @@ -0,0 +1,18 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatDocument: core.serialization.ObjectSchema = + core.serialization.object({ + id: core.serialization.string().optional(), + }); + +export declare namespace ChatDocument { + interface Raw { + id?: string | null; + } +} diff --git a/src/serialization/types/ChatMessage.ts b/src/serialization/types/ChatMessage.ts new file mode 100644 index 0000000..0c00964 --- /dev/null +++ b/src/serialization/types/ChatMessage.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatMessage: core.serialization.ObjectSchema = + core.serialization.object({ + role: core.serialization.lazy(async () => (await import("..")).ChatMessageRole), + message: core.serialization.string(), + userName: core.serialization.property("user_name", core.serialization.string().optional()), + }); + +export declare namespace ChatMessage { + interface Raw { + role: serializers.ChatMessageRole.Raw; + message: string; + user_name?: string | null; + } +} diff --git a/src/serialization/types/ChatMessageRole.ts b/src/serialization/types/ChatMessageRole.ts new file mode 100644 index 0000000..0913e32 --- /dev/null +++ b/src/serialization/types/ChatMessageRole.ts @@ -0,0 +1,14 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatMessageRole: core.serialization.Schema = + core.serialization.enum_(["CHATBOT", "USER"]); + +export declare namespace ChatMessageRole { + type Raw = "CHATBOT" | "USER"; +} diff --git a/src/serialization/types/ChatRequestCitationQuality.ts b/src/serialization/types/ChatRequestCitationQuality.ts new file mode 100644 index 0000000..f1d95b3 --- /dev/null +++ b/src/serialization/types/ChatRequestCitationQuality.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatRequestCitationQuality: core.serialization.Schema< + serializers.ChatRequestCitationQuality.Raw, + Cohere.ChatRequestCitationQuality +> = core.serialization.enum_(["fast", "accurate"]); + +export declare namespace ChatRequestCitationQuality { + type Raw = "fast" | "accurate"; +} diff --git a/src/serialization/types/ChatRequestPromptTruncation.ts b/src/serialization/types/ChatRequestPromptTruncation.ts new file mode 100644 index 0000000..2ca0e3f --- /dev/null +++ b/src/serialization/types/ChatRequestPromptTruncation.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatRequestPromptTruncation: core.serialization.Schema< + serializers.ChatRequestPromptTruncation.Raw, + Cohere.ChatRequestPromptTruncation +> = core.serialization.enum_(["OFF", "AUTO"]); + +export declare namespace ChatRequestPromptTruncation { + type Raw = "OFF" | "AUTO"; +} diff --git a/src/serialization/types/ChatResponse.ts b/src/serialization/types/ChatResponse.ts new file mode 100644 index 0000000..689f647 --- /dev/null +++ b/src/serialization/types/ChatResponse.ts @@ -0,0 +1,21 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatResponse: core.serialization.Schema = + core.serialization.undiscriminatedUnion([ + core.serialization.lazyObject(async () => (await import("..")).NonStreamedChatResponse), + core.serialization.lazy(async () => (await import("..")).StreamedChatResponse), + core.serialization.lazyObject(async () => (await import("..")).SearchQueriesOnlyResponse), + ]); + +export declare namespace ChatResponse { + type Raw = + | serializers.NonStreamedChatResponse.Raw + | serializers.StreamedChatResponse.Raw + | serializers.SearchQueriesOnlyResponse.Raw; +} diff --git a/src/serialization/types/ChatSearchQueriesGenerationEvent.ts b/src/serialization/types/ChatSearchQueriesGenerationEvent.ts new file mode 100644 index 0000000..7eac14f --- /dev/null +++ b/src/serialization/types/ChatSearchQueriesGenerationEvent.ts @@ -0,0 +1,25 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatSearchQueriesGenerationEvent: core.serialization.ObjectSchema< + serializers.ChatSearchQueriesGenerationEvent.Raw, + Cohere.ChatSearchQueriesGenerationEvent +> = core.serialization + .object({ + searchQueries: core.serialization.property( + "search_queries", + core.serialization.list(core.serialization.lazyObject(async () => (await import("..")).ChatSearchQuery)) + ), + }) + .extend(core.serialization.lazyObject(async () => (await import("..")).ChatStreamEvent)); + +export declare namespace ChatSearchQueriesGenerationEvent { + interface Raw extends serializers.ChatStreamEvent.Raw { + search_queries: serializers.ChatSearchQuery.Raw[]; + } +} diff --git a/src/serialization/types/ChatSearchQuery.ts b/src/serialization/types/ChatSearchQuery.ts new file mode 100644 index 0000000..3f6fa37 --- /dev/null +++ b/src/serialization/types/ChatSearchQuery.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatSearchQuery: core.serialization.ObjectSchema = + core.serialization.object({ + text: core.serialization.string(), + generationId: core.serialization.property("generation_id", core.serialization.string()), + }); + +export declare namespace ChatSearchQuery { + interface Raw { + text: string; + generation_id: string; + } +} diff --git a/src/serialization/types/ChatSearchResult.ts b/src/serialization/types/ChatSearchResult.ts new file mode 100644 index 0000000..478dbc7 --- /dev/null +++ b/src/serialization/types/ChatSearchResult.ts @@ -0,0 +1,27 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatSearchResult: core.serialization.ObjectSchema< + serializers.ChatSearchResult.Raw, + Cohere.ChatSearchResult +> = core.serialization.object({ + searchQuery: core.serialization.property( + "search_query", + core.serialization.lazyObject(async () => (await import("..")).ChatSearchQuery) + ), + connector: core.serialization.lazyObject(async () => (await import("..")).ChatConnector), + documentIds: core.serialization.property("document_ids", core.serialization.list(core.serialization.string())), +}); + +export declare namespace ChatSearchResult { + interface Raw { + search_query: serializers.ChatSearchQuery.Raw; + connector: serializers.ChatConnector.Raw; + document_ids: string[]; + } +} diff --git a/src/serialization/types/ChatSearchResultsEvent.ts b/src/serialization/types/ChatSearchResultsEvent.ts new file mode 100644 index 0000000..ea97a2b --- /dev/null +++ b/src/serialization/types/ChatSearchResultsEvent.ts @@ -0,0 +1,29 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatSearchResultsEvent: core.serialization.ObjectSchema< + serializers.ChatSearchResultsEvent.Raw, + Cohere.ChatSearchResultsEvent +> = core.serialization + .object({ + searchResults: core.serialization.property( + "search_results", + core.serialization.list(core.serialization.lazyObject(async () => (await import("..")).ChatSearchResult)) + ), + documents: core.serialization.list( + core.serialization.lazyObject(async () => (await import("..")).ChatDocument) + ), + }) + .extend(core.serialization.lazyObject(async () => (await import("..")).ChatStreamEvent)); + +export declare namespace ChatSearchResultsEvent { + interface Raw extends serializers.ChatStreamEvent.Raw { + search_results: serializers.ChatSearchResult.Raw[]; + documents: serializers.ChatDocument.Raw[]; + } +} diff --git a/src/serialization/types/ChatStreamEndEvent.ts b/src/serialization/types/ChatStreamEndEvent.ts new file mode 100644 index 0000000..9d5876b --- /dev/null +++ b/src/serialization/types/ChatStreamEndEvent.ts @@ -0,0 +1,27 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatStreamEndEvent: core.serialization.ObjectSchema< + serializers.ChatStreamEndEvent.Raw, + Cohere.ChatStreamEndEvent +> = core.serialization + .object({ + finishReason: core.serialization.property( + "finish_reason", + core.serialization.lazy(async () => (await import("..")).ChatStreamEndEventFinishReason) + ), + response: core.serialization.lazy(async () => (await import("..")).ChatStreamEndEventResponse), + }) + .extend(core.serialization.lazyObject(async () => (await import("..")).ChatStreamEvent)); + +export declare namespace ChatStreamEndEvent { + interface Raw extends serializers.ChatStreamEvent.Raw { + finish_reason: serializers.ChatStreamEndEventFinishReason.Raw; + response: serializers.ChatStreamEndEventResponse.Raw; + } +} diff --git a/src/serialization/types/ChatStreamEndEventFinishReason.ts b/src/serialization/types/ChatStreamEndEventFinishReason.ts new file mode 100644 index 0000000..0f152fb --- /dev/null +++ b/src/serialization/types/ChatStreamEndEventFinishReason.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatStreamEndEventFinishReason: core.serialization.Schema< + serializers.ChatStreamEndEventFinishReason.Raw, + Cohere.ChatStreamEndEventFinishReason +> = core.serialization.enum_(["COMPLETE", "ERROR_LIMIT", "MAX_TOKENS", "ERROR", "ERROR_TOXIC"]); + +export declare namespace ChatStreamEndEventFinishReason { + type Raw = "COMPLETE" | "ERROR_LIMIT" | "MAX_TOKENS" | "ERROR" | "ERROR_TOXIC"; +} diff --git a/src/serialization/types/ChatStreamEndEventResponse.ts b/src/serialization/types/ChatStreamEndEventResponse.ts new file mode 100644 index 0000000..380c023 --- /dev/null +++ b/src/serialization/types/ChatStreamEndEventResponse.ts @@ -0,0 +1,19 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatStreamEndEventResponse: core.serialization.Schema< + serializers.ChatStreamEndEventResponse.Raw, + Cohere.ChatStreamEndEventResponse +> = core.serialization.undiscriminatedUnion([ + core.serialization.lazyObject(async () => (await import("..")).NonStreamedChatResponse), + core.serialization.lazyObject(async () => (await import("..")).SearchQueriesOnlyResponse), +]); + +export declare namespace ChatStreamEndEventResponse { + type Raw = serializers.NonStreamedChatResponse.Raw | serializers.SearchQueriesOnlyResponse.Raw; +} diff --git a/src/serialization/types/ChatStreamEvent.ts b/src/serialization/types/ChatStreamEvent.ts new file mode 100644 index 0000000..2a32b88 --- /dev/null +++ b/src/serialization/types/ChatStreamEvent.ts @@ -0,0 +1,14 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatStreamEvent: core.serialization.ObjectSchema = + core.serialization.object({}); + +export declare namespace ChatStreamEvent { + interface Raw {} +} diff --git a/src/serialization/types/ChatStreamStartEvent.ts b/src/serialization/types/ChatStreamStartEvent.ts new file mode 100644 index 0000000..8aa1d70 --- /dev/null +++ b/src/serialization/types/ChatStreamStartEvent.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatStreamStartEvent: core.serialization.ObjectSchema< + serializers.ChatStreamStartEvent.Raw, + Cohere.ChatStreamStartEvent +> = core.serialization + .object({ + generationId: core.serialization.property("generation_id", core.serialization.string()), + }) + .extend(core.serialization.lazyObject(async () => (await import("..")).ChatStreamEvent)); + +export declare namespace ChatStreamStartEvent { + interface Raw extends serializers.ChatStreamEvent.Raw { + generation_id: string; + } +} diff --git a/src/serialization/types/ChatTextGenerationEvent.ts b/src/serialization/types/ChatTextGenerationEvent.ts new file mode 100644 index 0000000..2ec854a --- /dev/null +++ b/src/serialization/types/ChatTextGenerationEvent.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ChatTextGenerationEvent: core.serialization.ObjectSchema< + serializers.ChatTextGenerationEvent.Raw, + Cohere.ChatTextGenerationEvent +> = core.serialization + .object({ + text: core.serialization.string(), + }) + .extend(core.serialization.lazyObject(async () => (await import("..")).ChatStreamEvent)); + +export declare namespace ChatTextGenerationEvent { + interface Raw extends serializers.ChatStreamEvent.Raw { + text: string; + } +} diff --git a/src/serialization/types/ClassifyRequestExamplesItem.ts b/src/serialization/types/ClassifyRequestExamplesItem.ts new file mode 100644 index 0000000..283ae94 --- /dev/null +++ b/src/serialization/types/ClassifyRequestExamplesItem.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ClassifyRequestExamplesItem: core.serialization.ObjectSchema< + serializers.ClassifyRequestExamplesItem.Raw, + Cohere.ClassifyRequestExamplesItem +> = core.serialization.object({ + text: core.serialization.string().optional(), + label: core.serialization.string().optional(), +}); + +export declare namespace ClassifyRequestExamplesItem { + interface Raw { + text?: string | null; + label?: string | null; + } +} diff --git a/src/serialization/types/ClassifyRequestTruncate.ts b/src/serialization/types/ClassifyRequestTruncate.ts new file mode 100644 index 0000000..ccf48a6 --- /dev/null +++ b/src/serialization/types/ClassifyRequestTruncate.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ClassifyRequestTruncate: core.serialization.Schema< + serializers.ClassifyRequestTruncate.Raw, + Cohere.ClassifyRequestTruncate +> = core.serialization.enum_(["NONE", "START", "END"]); + +export declare namespace ClassifyRequestTruncate { + type Raw = "NONE" | "START" | "END"; +} diff --git a/src/serialization/types/ClassifyResponse.ts b/src/serialization/types/ClassifyResponse.ts new file mode 100644 index 0000000..cd752a9 --- /dev/null +++ b/src/serialization/types/ClassifyResponse.ts @@ -0,0 +1,26 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ClassifyResponse: core.serialization.ObjectSchema< + serializers.ClassifyResponse.Raw, + Cohere.ClassifyResponse +> = core.serialization.object({ + id: core.serialization.string(), + classifications: core.serialization.list( + core.serialization.lazyObject(async () => (await import("..")).ClassifyResponseClassificationsItem) + ), + meta: core.serialization.lazyObject(async () => (await import("..")).ApiMeta).optional(), +}); + +export declare namespace ClassifyResponse { + interface Raw { + id: string; + classifications: serializers.ClassifyResponseClassificationsItem.Raw[]; + meta?: serializers.ApiMeta.Raw | null; + } +} diff --git a/src/serialization/types/ClassifyResponseClassificationsItem.ts b/src/serialization/types/ClassifyResponseClassificationsItem.ts new file mode 100644 index 0000000..b78fd25 --- /dev/null +++ b/src/serialization/types/ClassifyResponseClassificationsItem.ts @@ -0,0 +1,40 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ClassifyResponseClassificationsItem: core.serialization.ObjectSchema< + serializers.ClassifyResponseClassificationsItem.Raw, + Cohere.ClassifyResponseClassificationsItem +> = core.serialization.object({ + id: core.serialization.string(), + input: core.serialization.string().optional(), + prediction: core.serialization.string().optional(), + predictions: core.serialization.list(core.serialization.string()), + confidence: core.serialization.number().optional(), + confidences: core.serialization.list(core.serialization.number()), + labels: core.serialization.record( + core.serialization.string(), + core.serialization.lazyObject(async () => (await import("..")).ClassifyResponseClassificationsItemLabelsValue) + ), + classificationType: core.serialization.property( + "classification_type", + core.serialization.lazy(async () => (await import("..")).ClassifyResponseClassificationsItemClassificationType) + ), +}); + +export declare namespace ClassifyResponseClassificationsItem { + interface Raw { + id: string; + input?: string | null; + prediction?: string | null; + predictions: string[]; + confidence?: number | null; + confidences: number[]; + labels: Record; + classification_type: serializers.ClassifyResponseClassificationsItemClassificationType.Raw; + } +} diff --git a/src/serialization/types/ClassifyResponseClassificationsItemClassificationType.ts b/src/serialization/types/ClassifyResponseClassificationsItemClassificationType.ts new file mode 100644 index 0000000..cb57ac7 --- /dev/null +++ b/src/serialization/types/ClassifyResponseClassificationsItemClassificationType.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ClassifyResponseClassificationsItemClassificationType: core.serialization.Schema< + serializers.ClassifyResponseClassificationsItemClassificationType.Raw, + Cohere.ClassifyResponseClassificationsItemClassificationType +> = core.serialization.enum_(["single-label", "multi-label"]); + +export declare namespace ClassifyResponseClassificationsItemClassificationType { + type Raw = "single-label" | "multi-label"; +} diff --git a/src/serialization/types/ClassifyResponseClassificationsItemLabelsValue.ts b/src/serialization/types/ClassifyResponseClassificationsItemLabelsValue.ts new file mode 100644 index 0000000..c70f5e9 --- /dev/null +++ b/src/serialization/types/ClassifyResponseClassificationsItemLabelsValue.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const ClassifyResponseClassificationsItemLabelsValue: core.serialization.ObjectSchema< + serializers.ClassifyResponseClassificationsItemLabelsValue.Raw, + Cohere.ClassifyResponseClassificationsItemLabelsValue +> = core.serialization.object({ + confidence: core.serialization.number().optional(), +}); + +export declare namespace ClassifyResponseClassificationsItemLabelsValue { + interface Raw { + confidence?: number | null; + } +} diff --git a/src/serialization/types/DetectLanguageResponse.ts b/src/serialization/types/DetectLanguageResponse.ts new file mode 100644 index 0000000..15e09d4 --- /dev/null +++ b/src/serialization/types/DetectLanguageResponse.ts @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const DetectLanguageResponse: core.serialization.ObjectSchema< + serializers.DetectLanguageResponse.Raw, + Cohere.DetectLanguageResponse +> = core.serialization.object({ + results: core.serialization + .list(core.serialization.lazyObject(async () => (await import("..")).DetectLanguageResponseResultsItem)) + .optional(), + meta: core.serialization.lazyObject(async () => (await import("..")).ApiMeta).optional(), +}); + +export declare namespace DetectLanguageResponse { + interface Raw { + results?: serializers.DetectLanguageResponseResultsItem.Raw[] | null; + meta?: serializers.ApiMeta.Raw | null; + } +} diff --git a/src/serialization/types/DetectLanguageResponseResultsItem.ts b/src/serialization/types/DetectLanguageResponseResultsItem.ts new file mode 100644 index 0000000..61653bc --- /dev/null +++ b/src/serialization/types/DetectLanguageResponseResultsItem.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const DetectLanguageResponseResultsItem: core.serialization.ObjectSchema< + serializers.DetectLanguageResponseResultsItem.Raw, + Cohere.DetectLanguageResponseResultsItem +> = core.serialization.object({ + languageName: core.serialization.property("language_name", core.serialization.string().optional()), + languageCode: core.serialization.property("language_code", core.serialization.string().optional()), +}); + +export declare namespace DetectLanguageResponseResultsItem { + interface Raw { + language_name?: string | null; + language_code?: string | null; + } +} diff --git a/src/serialization/types/DetokenizeResponse.ts b/src/serialization/types/DetokenizeResponse.ts new file mode 100644 index 0000000..0aaebc4 --- /dev/null +++ b/src/serialization/types/DetokenizeResponse.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const DetokenizeResponse: core.serialization.ObjectSchema< + serializers.DetokenizeResponse.Raw, + Cohere.DetokenizeResponse +> = core.serialization.object({ + text: core.serialization.string(), + meta: core.serialization.lazyObject(async () => (await import("..")).ApiMeta).optional(), +}); + +export declare namespace DetokenizeResponse { + interface Raw { + text: string; + meta?: serializers.ApiMeta.Raw | null; + } +} diff --git a/src/serialization/types/EmbedRequestTruncate.ts b/src/serialization/types/EmbedRequestTruncate.ts new file mode 100644 index 0000000..05c607b --- /dev/null +++ b/src/serialization/types/EmbedRequestTruncate.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const EmbedRequestTruncate: core.serialization.Schema< + serializers.EmbedRequestTruncate.Raw, + Cohere.EmbedRequestTruncate +> = core.serialization.enum_(["NONE", "START", "END"]); + +export declare namespace EmbedRequestTruncate { + type Raw = "NONE" | "START" | "END"; +} diff --git a/src/serialization/types/EmbedResponse.ts b/src/serialization/types/EmbedResponse.ts new file mode 100644 index 0000000..c7c6d0f --- /dev/null +++ b/src/serialization/types/EmbedResponse.ts @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const EmbedResponse: core.serialization.ObjectSchema = + core.serialization.object({ + id: core.serialization.string(), + embeddings: core.serialization.list(core.serialization.list(core.serialization.number())), + texts: core.serialization.list(core.serialization.string()), + meta: core.serialization.lazyObject(async () => (await import("..")).ApiMeta).optional(), + }); + +export declare namespace EmbedResponse { + interface Raw { + id: string; + embeddings: number[][]; + texts: string[]; + meta?: serializers.ApiMeta.Raw | null; + } +} diff --git a/src/serialization/types/FinishReason.ts b/src/serialization/types/FinishReason.ts new file mode 100644 index 0000000..15dd9e9 --- /dev/null +++ b/src/serialization/types/FinishReason.ts @@ -0,0 +1,14 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const FinishReason: core.serialization.Schema = + core.serialization.enum_(["COMPLETE", "ERROR", "ERROR_TOXIC", "ERROR_LIMIT", "USER_CANCEL", "MAX_TOKENS"]); + +export declare namespace FinishReason { + type Raw = "COMPLETE" | "ERROR" | "ERROR_TOXIC" | "ERROR_LIMIT" | "USER_CANCEL" | "MAX_TOKENS"; +} diff --git a/src/serialization/types/GenerateRequestReturnLikelihoods.ts b/src/serialization/types/GenerateRequestReturnLikelihoods.ts new file mode 100644 index 0000000..f0b2c50 --- /dev/null +++ b/src/serialization/types/GenerateRequestReturnLikelihoods.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const GenerateRequestReturnLikelihoods: core.serialization.Schema< + serializers.GenerateRequestReturnLikelihoods.Raw, + Cohere.GenerateRequestReturnLikelihoods +> = core.serialization.enum_(["GENERATION", "ALL", "NONE"]); + +export declare namespace GenerateRequestReturnLikelihoods { + type Raw = "GENERATION" | "ALL" | "NONE"; +} diff --git a/src/serialization/types/GenerateRequestTruncate.ts b/src/serialization/types/GenerateRequestTruncate.ts new file mode 100644 index 0000000..129c1c0 --- /dev/null +++ b/src/serialization/types/GenerateRequestTruncate.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const GenerateRequestTruncate: core.serialization.Schema< + serializers.GenerateRequestTruncate.Raw, + Cohere.GenerateRequestTruncate +> = core.serialization.enum_(["NONE", "START", "END"]); + +export declare namespace GenerateRequestTruncate { + type Raw = "NONE" | "START" | "END"; +} diff --git a/src/serialization/types/Generation.ts b/src/serialization/types/Generation.ts new file mode 100644 index 0000000..37ca7bf --- /dev/null +++ b/src/serialization/types/Generation.ts @@ -0,0 +1,26 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const Generation: core.serialization.ObjectSchema = + core.serialization.object({ + id: core.serialization.string(), + prompt: core.serialization.string().optional(), + generations: core.serialization.list( + core.serialization.lazyObject(async () => (await import("..")).SingleGeneration) + ), + meta: core.serialization.lazyObject(async () => (await import("..")).ApiMeta).optional(), + }); + +export declare namespace Generation { + interface Raw { + id: string; + prompt?: string | null; + generations: serializers.SingleGeneration.Raw[]; + meta?: serializers.ApiMeta.Raw | null; + } +} diff --git a/src/serialization/types/GenerationFinalResponse.ts b/src/serialization/types/GenerationFinalResponse.ts new file mode 100644 index 0000000..91b7620 --- /dev/null +++ b/src/serialization/types/GenerationFinalResponse.ts @@ -0,0 +1,27 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const GenerationFinalResponse: core.serialization.ObjectSchema< + serializers.GenerationFinalResponse.Raw, + Cohere.GenerationFinalResponse +> = core.serialization.object({ + isFinished: core.serialization.property("is_finished", core.serialization.boolean()), + finishReason: core.serialization.property( + "finish_reason", + core.serialization.lazy(async () => (await import("..")).FinishReason).optional() + ), + response: core.serialization.lazyObject(async () => (await import("..")).GenerationFinalResponseResponse), +}); + +export declare namespace GenerationFinalResponse { + interface Raw { + is_finished: boolean; + finish_reason?: serializers.FinishReason.Raw | null; + response: serializers.GenerationFinalResponseResponse.Raw; + } +} diff --git a/src/serialization/types/GenerationFinalResponseResponse.ts b/src/serialization/types/GenerationFinalResponseResponse.ts new file mode 100644 index 0000000..6b3720b --- /dev/null +++ b/src/serialization/types/GenerationFinalResponseResponse.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const GenerationFinalResponseResponse: core.serialization.ObjectSchema< + serializers.GenerationFinalResponseResponse.Raw, + Cohere.GenerationFinalResponseResponse +> = core.serialization.object({ + id: core.serialization.string(), + generations: core.serialization.lazyObject(async () => (await import("..")).SingleGenerationInStream).optional(), +}); + +export declare namespace GenerationFinalResponseResponse { + interface Raw { + id: string; + generations?: serializers.SingleGenerationInStream.Raw | null; + } +} diff --git a/src/serialization/types/GenerationStream.ts b/src/serialization/types/GenerationStream.ts new file mode 100644 index 0000000..104cba8 --- /dev/null +++ b/src/serialization/types/GenerationStream.ts @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const GenerationStream: core.serialization.ObjectSchema< + serializers.GenerationStream.Raw, + Cohere.GenerationStream +> = core.serialization.object({ + text: core.serialization.string(), + index: core.serialization.number().optional(), + isFinished: core.serialization.property("is_finished", core.serialization.boolean()), +}); + +export declare namespace GenerationStream { + interface Raw { + text: string; + index?: number | null; + is_finished: boolean; + } +} diff --git a/src/serialization/types/NonStreamedChatResponse.ts b/src/serialization/types/NonStreamedChatResponse.ts new file mode 100644 index 0000000..ddc3c6d --- /dev/null +++ b/src/serialization/types/NonStreamedChatResponse.ts @@ -0,0 +1,44 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const NonStreamedChatResponse: core.serialization.ObjectSchema< + serializers.NonStreamedChatResponse.Raw, + Cohere.NonStreamedChatResponse +> = core.serialization.object({ + text: core.serialization.string(), + generationId: core.serialization.property("generation_id", core.serialization.string()), + citations: core.serialization + .list(core.serialization.lazyObject(async () => (await import("..")).ChatCitation)) + .optional(), + documents: core.serialization + .list(core.serialization.lazyObject(async () => (await import("..")).ChatDocument)) + .optional(), + searchQueries: core.serialization.property( + "search_queries", + core.serialization + .list(core.serialization.lazyObject(async () => (await import("..")).ChatSearchQuery)) + .optional() + ), + searchResults: core.serialization.property( + "search_results", + core.serialization + .list(core.serialization.lazyObject(async () => (await import("..")).ChatSearchResult)) + .optional() + ), +}); + +export declare namespace NonStreamedChatResponse { + interface Raw { + text: string; + generation_id: string; + citations?: serializers.ChatCitation.Raw[] | null; + documents?: serializers.ChatDocument.Raw[] | null; + search_queries?: serializers.ChatSearchQuery.Raw[] | null; + search_results?: serializers.ChatSearchResult.Raw[] | null; + } +} diff --git a/src/serialization/types/RerankRequestDocumentsItem.ts b/src/serialization/types/RerankRequestDocumentsItem.ts new file mode 100644 index 0000000..140a7c3 --- /dev/null +++ b/src/serialization/types/RerankRequestDocumentsItem.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const RerankRequestDocumentsItem: core.serialization.ObjectSchema< + serializers.RerankRequestDocumentsItem.Raw, + Cohere.RerankRequestDocumentsItem +> = core.serialization.object({ + text: core.serialization.string(), +}); + +export declare namespace RerankRequestDocumentsItem { + interface Raw { + text: string; + } +} diff --git a/src/serialization/types/RerankResponse.ts b/src/serialization/types/RerankResponse.ts new file mode 100644 index 0000000..b07c30e --- /dev/null +++ b/src/serialization/types/RerankResponse.ts @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const RerankResponse: core.serialization.ObjectSchema = + core.serialization.object({ + id: core.serialization.string().optional(), + results: core.serialization.list( + core.serialization.lazyObject(async () => (await import("..")).RerankResponseResultsItem) + ), + meta: core.serialization.lazyObject(async () => (await import("..")).ApiMeta).optional(), + }); + +export declare namespace RerankResponse { + interface Raw { + id?: string | null; + results: serializers.RerankResponseResultsItem.Raw[]; + meta?: serializers.ApiMeta.Raw | null; + } +} diff --git a/src/serialization/types/RerankResponseResultsItem.ts b/src/serialization/types/RerankResponseResultsItem.ts new file mode 100644 index 0000000..9a3a25c --- /dev/null +++ b/src/serialization/types/RerankResponseResultsItem.ts @@ -0,0 +1,26 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const RerankResponseResultsItem: core.serialization.ObjectSchema< + serializers.RerankResponseResultsItem.Raw, + Cohere.RerankResponseResultsItem +> = core.serialization.object({ + document: core.serialization + .lazyObject(async () => (await import("..")).RerankResponseResultsItemDocument) + .optional(), + index: core.serialization.number(), + relevanceScore: core.serialization.property("relevance_score", core.serialization.number()), +}); + +export declare namespace RerankResponseResultsItem { + interface Raw { + document?: serializers.RerankResponseResultsItemDocument.Raw | null; + index: number; + relevance_score: number; + } +} diff --git a/src/serialization/types/RerankResponseResultsItemDocument.ts b/src/serialization/types/RerankResponseResultsItemDocument.ts new file mode 100644 index 0000000..961e4bb --- /dev/null +++ b/src/serialization/types/RerankResponseResultsItemDocument.ts @@ -0,0 +1,20 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const RerankResponseResultsItemDocument: core.serialization.ObjectSchema< + serializers.RerankResponseResultsItemDocument.Raw, + Cohere.RerankResponseResultsItemDocument +> = core.serialization.object({ + text: core.serialization.string(), +}); + +export declare namespace RerankResponseResultsItemDocument { + interface Raw { + text: string; + } +} diff --git a/src/serialization/types/SearchQueriesOnlyResponse.ts b/src/serialization/types/SearchQueriesOnlyResponse.ts new file mode 100644 index 0000000..84e3ad9 --- /dev/null +++ b/src/serialization/types/SearchQueriesOnlyResponse.ts @@ -0,0 +1,23 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const SearchQueriesOnlyResponse: core.serialization.ObjectSchema< + serializers.SearchQueriesOnlyResponse.Raw, + Cohere.SearchQueriesOnlyResponse +> = core.serialization.object({ + searchQueries: core.serialization.property( + "search_queries", + core.serialization.list(core.serialization.lazyObject(async () => (await import("..")).ChatSearchQuery)) + ), +}); + +export declare namespace SearchQueriesOnlyResponse { + interface Raw { + search_queries: serializers.ChatSearchQuery.Raw[]; + } +} diff --git a/src/serialization/types/SingleGeneration.ts b/src/serialization/types/SingleGeneration.ts new file mode 100644 index 0000000..5d56e62 --- /dev/null +++ b/src/serialization/types/SingleGeneration.ts @@ -0,0 +1,33 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const SingleGeneration: core.serialization.ObjectSchema< + serializers.SingleGeneration.Raw, + Cohere.SingleGeneration +> = core.serialization.object({ + id: core.serialization.string(), + text: core.serialization.string(), + index: core.serialization.number().optional(), + likelihood: core.serialization.number().optional(), + tokenLikelihoods: core.serialization.property( + "token_likelihoods", + core.serialization + .list(core.serialization.lazyObject(async () => (await import("..")).SingleGenerationTokenLikelihoodsItem)) + .optional() + ), +}); + +export declare namespace SingleGeneration { + interface Raw { + id: string; + text: string; + index?: number | null; + likelihood?: number | null; + token_likelihoods?: serializers.SingleGenerationTokenLikelihoodsItem.Raw[] | null; + } +} diff --git a/src/serialization/types/SingleGenerationInStream.ts b/src/serialization/types/SingleGenerationInStream.ts new file mode 100644 index 0000000..409c965 --- /dev/null +++ b/src/serialization/types/SingleGenerationInStream.ts @@ -0,0 +1,29 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const SingleGenerationInStream: core.serialization.ObjectSchema< + serializers.SingleGenerationInStream.Raw, + Cohere.SingleGenerationInStream +> = core.serialization.object({ + id: core.serialization.string(), + text: core.serialization.string(), + index: core.serialization.number().optional(), + finishReason: core.serialization.property( + "finish_reason", + core.serialization.lazy(async () => (await import("..")).FinishReason) + ), +}); + +export declare namespace SingleGenerationInStream { + interface Raw { + id: string; + text: string; + index?: number | null; + finish_reason: serializers.FinishReason.Raw; + } +} diff --git a/src/serialization/types/SingleGenerationTokenLikelihoodsItem.ts b/src/serialization/types/SingleGenerationTokenLikelihoodsItem.ts new file mode 100644 index 0000000..79c922e --- /dev/null +++ b/src/serialization/types/SingleGenerationTokenLikelihoodsItem.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const SingleGenerationTokenLikelihoodsItem: core.serialization.ObjectSchema< + serializers.SingleGenerationTokenLikelihoodsItem.Raw, + Cohere.SingleGenerationTokenLikelihoodsItem +> = core.serialization.object({ + token: core.serialization.string(), + likelihood: core.serialization.number(), +}); + +export declare namespace SingleGenerationTokenLikelihoodsItem { + interface Raw { + token: string; + likelihood: number; + } +} diff --git a/src/serialization/types/StreamedChatResponse.ts b/src/serialization/types/StreamedChatResponse.ts new file mode 100644 index 0000000..ad49b41 --- /dev/null +++ b/src/serialization/types/StreamedChatResponse.ts @@ -0,0 +1,62 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const StreamedChatResponse: core.serialization.Schema< + serializers.StreamedChatResponse.Raw, + Cohere.StreamedChatResponse +> = core.serialization + .union(core.serialization.discriminant("eventType", "event_type"), { + "stream-start": core.serialization.lazyObject(async () => (await import("..")).ChatStreamStartEvent), + "search-queries-generation": core.serialization.lazyObject( + async () => (await import("..")).ChatSearchQueriesGenerationEvent + ), + "search-results": core.serialization.lazyObject(async () => (await import("..")).ChatSearchResultsEvent), + "text-generation": core.serialization.lazyObject(async () => (await import("..")).ChatTextGenerationEvent), + "citation-generation": core.serialization.lazyObject( + async () => (await import("..")).ChatCitationGenerationEvent + ), + "stream-end": core.serialization.lazyObject(async () => (await import("..")).ChatStreamEndEvent), + }) + .transform({ + transform: (value) => value, + untransform: (value) => value, + }); + +export declare namespace StreamedChatResponse { + type Raw = + | StreamedChatResponse.StreamStart + | StreamedChatResponse.SearchQueriesGeneration + | StreamedChatResponse.SearchResults + | StreamedChatResponse.TextGeneration + | StreamedChatResponse.CitationGeneration + | StreamedChatResponse.StreamEnd; + + interface StreamStart extends serializers.ChatStreamStartEvent.Raw { + event_type: "stream-start"; + } + + interface SearchQueriesGeneration extends serializers.ChatSearchQueriesGenerationEvent.Raw { + event_type: "search-queries-generation"; + } + + interface SearchResults extends serializers.ChatSearchResultsEvent.Raw { + event_type: "search-results"; + } + + interface TextGeneration extends serializers.ChatTextGenerationEvent.Raw { + event_type: "text-generation"; + } + + interface CitationGeneration extends serializers.ChatCitationGenerationEvent.Raw { + event_type: "citation-generation"; + } + + interface StreamEnd extends serializers.ChatStreamEndEvent.Raw { + event_type: "stream-end"; + } +} diff --git a/src/serialization/types/StreamedGeneration.ts b/src/serialization/types/StreamedGeneration.ts new file mode 100644 index 0000000..791e3ff --- /dev/null +++ b/src/serialization/types/StreamedGeneration.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const StreamedGeneration: core.serialization.Schema< + serializers.StreamedGeneration.Raw, + Cohere.StreamedGeneration +> = core.serialization.list(core.serialization.lazy(async () => (await import("..")).StreamedGenerationItem)); + +export declare namespace StreamedGeneration { + type Raw = serializers.StreamedGenerationItem.Raw[]; +} diff --git a/src/serialization/types/StreamedGenerationItem.ts b/src/serialization/types/StreamedGenerationItem.ts new file mode 100644 index 0000000..3e49e6d --- /dev/null +++ b/src/serialization/types/StreamedGenerationItem.ts @@ -0,0 +1,19 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const StreamedGenerationItem: core.serialization.Schema< + serializers.StreamedGenerationItem.Raw, + Cohere.StreamedGenerationItem +> = core.serialization.undiscriminatedUnion([ + core.serialization.lazyObject(async () => (await import("..")).GenerationStream), + core.serialization.lazyObject(async () => (await import("..")).GenerationFinalResponse), +]); + +export declare namespace StreamedGenerationItem { + type Raw = serializers.GenerationStream.Raw | serializers.GenerationFinalResponse.Raw; +} diff --git a/src/serialization/types/SummarizeRequestExtractiveness.ts b/src/serialization/types/SummarizeRequestExtractiveness.ts new file mode 100644 index 0000000..abd30eb --- /dev/null +++ b/src/serialization/types/SummarizeRequestExtractiveness.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const SummarizeRequestExtractiveness: core.serialization.Schema< + serializers.SummarizeRequestExtractiveness.Raw, + Cohere.SummarizeRequestExtractiveness +> = core.serialization.enum_(["low", "medium", "high"]); + +export declare namespace SummarizeRequestExtractiveness { + type Raw = "low" | "medium" | "high"; +} diff --git a/src/serialization/types/SummarizeRequestFormat.ts b/src/serialization/types/SummarizeRequestFormat.ts new file mode 100644 index 0000000..a42816c --- /dev/null +++ b/src/serialization/types/SummarizeRequestFormat.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const SummarizeRequestFormat: core.serialization.Schema< + serializers.SummarizeRequestFormat.Raw, + Cohere.SummarizeRequestFormat +> = core.serialization.enum_(["paragraph", "bullets"]); + +export declare namespace SummarizeRequestFormat { + type Raw = "paragraph" | "bullets"; +} diff --git a/src/serialization/types/SummarizeRequestLength.ts b/src/serialization/types/SummarizeRequestLength.ts new file mode 100644 index 0000000..04498c5 --- /dev/null +++ b/src/serialization/types/SummarizeRequestLength.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const SummarizeRequestLength: core.serialization.Schema< + serializers.SummarizeRequestLength.Raw, + Cohere.SummarizeRequestLength +> = core.serialization.enum_(["short", "medium", "long"]); + +export declare namespace SummarizeRequestLength { + type Raw = "short" | "medium" | "long"; +} diff --git a/src/serialization/types/SummarizeRequestModel.ts b/src/serialization/types/SummarizeRequestModel.ts new file mode 100644 index 0000000..35d25ec --- /dev/null +++ b/src/serialization/types/SummarizeRequestModel.ts @@ -0,0 +1,16 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const SummarizeRequestModel: core.serialization.Schema< + serializers.SummarizeRequestModel.Raw, + Cohere.SummarizeRequestModel +> = core.serialization.enum_(["command", "command-light"]); + +export declare namespace SummarizeRequestModel { + type Raw = "command" | "command-light"; +} diff --git a/src/serialization/types/SummarizeResponse.ts b/src/serialization/types/SummarizeResponse.ts new file mode 100644 index 0000000..534a090 --- /dev/null +++ b/src/serialization/types/SummarizeResponse.ts @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const SummarizeResponse: core.serialization.ObjectSchema< + serializers.SummarizeResponse.Raw, + Cohere.SummarizeResponse +> = core.serialization.object({ + results: core.serialization + .list(core.serialization.lazyObject(async () => (await import("..")).SummarizeResponseResultsItem)) + .optional(), + meta: core.serialization.lazyObject(async () => (await import("..")).ApiMeta).optional(), +}); + +export declare namespace SummarizeResponse { + interface Raw { + results?: serializers.SummarizeResponseResultsItem.Raw[] | null; + meta?: serializers.ApiMeta.Raw | null; + } +} diff --git a/src/serialization/types/SummarizeResponseResultsItem.ts b/src/serialization/types/SummarizeResponseResultsItem.ts new file mode 100644 index 0000000..9aa64fc --- /dev/null +++ b/src/serialization/types/SummarizeResponseResultsItem.ts @@ -0,0 +1,22 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const SummarizeResponseResultsItem: core.serialization.ObjectSchema< + serializers.SummarizeResponseResultsItem.Raw, + Cohere.SummarizeResponseResultsItem +> = core.serialization.object({ + id: core.serialization.string().optional(), + summary: core.serialization.string().optional(), +}); + +export declare namespace SummarizeResponseResultsItem { + interface Raw { + id?: string | null; + summary?: string | null; + } +} diff --git a/src/serialization/types/TokenizeResponse.ts b/src/serialization/types/TokenizeResponse.ts new file mode 100644 index 0000000..b9b8486 --- /dev/null +++ b/src/serialization/types/TokenizeResponse.ts @@ -0,0 +1,24 @@ +/** + * This file was auto-generated by Fern from our API Definition. + */ + +import * as serializers from ".."; +import * as Cohere from "../../api"; +import * as core from "../../core"; + +export const TokenizeResponse: core.serialization.ObjectSchema< + serializers.TokenizeResponse.Raw, + Cohere.TokenizeResponse +> = core.serialization.object({ + tokens: core.serialization.list(core.serialization.number()), + tokenStrings: core.serialization.property("token_strings", core.serialization.list(core.serialization.string())), + meta: core.serialization.lazyObject(async () => (await import("..")).ApiMeta).optional(), +}); + +export declare namespace TokenizeResponse { + interface Raw { + tokens: number[]; + token_strings: string[]; + meta?: serializers.ApiMeta.Raw | null; + } +} diff --git a/src/serialization/types/index.ts b/src/serialization/types/index.ts new file mode 100644 index 0000000..7eb610f --- /dev/null +++ b/src/serialization/types/index.ts @@ -0,0 +1,58 @@ +export * from "./GenerateRequestTruncate"; +export * from "./GenerateRequestReturnLikelihoods"; +export * from "./EmbedRequestTruncate"; +export * from "./EmbedResponse"; +export * from "./ClassifyRequestExamplesItem"; +export * from "./ClassifyRequestTruncate"; +export * from "./ClassifyResponse"; +export * from "./ClassifyResponseClassificationsItem"; +export * from "./ClassifyResponseClassificationsItemLabelsValue"; +export * from "./ClassifyResponseClassificationsItemClassificationType"; +export * from "./ChatRequestPromptTruncation"; +export * from "./ChatRequestCitationQuality"; +export * from "./ChatResponse"; +export * from "./TokenizeResponse"; +export * from "./DetokenizeResponse"; +export * from "./DetectLanguageResponse"; +export * from "./DetectLanguageResponseResultsItem"; +export * from "./SummarizeRequestLength"; +export * from "./SummarizeRequestFormat"; +export * from "./SummarizeRequestModel"; +export * from "./SummarizeRequestExtractiveness"; +export * from "./SummarizeResponse"; +export * from "./SummarizeResponseResultsItem"; +export * from "./RerankRequestDocumentsItem"; +export * from "./RerankResponse"; +export * from "./RerankResponseResultsItem"; +export * from "./RerankResponseResultsItemDocument"; +export * from "./SingleGeneration"; +export * from "./SingleGenerationTokenLikelihoodsItem"; +export * from "./ApiMeta"; +export * from "./ApiMetaApiVersion"; +export * from "./Generation"; +export * from "./GenerationStream"; +export * from "./FinishReason"; +export * from "./SingleGenerationInStream"; +export * from "./GenerationFinalResponse"; +export * from "./GenerationFinalResponseResponse"; +export * from "./StreamedGeneration"; +export * from "./StreamedGenerationItem"; +export * from "./ChatMessage"; +export * from "./ChatMessageRole"; +export * from "./ChatConnector"; +export * from "./ChatDocument"; +export * from "./ChatCitation"; +export * from "./ChatSearchQuery"; +export * from "./ChatSearchResult"; +export * from "./NonStreamedChatResponse"; +export * from "./ChatStreamEvent"; +export * from "./ChatStreamStartEvent"; +export * from "./ChatSearchQueriesGenerationEvent"; +export * from "./ChatSearchResultsEvent"; +export * from "./ChatTextGenerationEvent"; +export * from "./ChatCitationGenerationEvent"; +export * from "./SearchQueriesOnlyResponse"; +export * from "./ChatStreamEndEvent"; +export * from "./ChatStreamEndEventFinishReason"; +export * from "./ChatStreamEndEventResponse"; +export * from "./StreamedChatResponse"; diff --git a/test/classify.ts b/test/classify.ts deleted file mode 100644 index a7c65d5..0000000 --- a/test/classify.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { expect } from "chai"; -import cohere from "../cohere"; -import { cohereResponse, classifyResponse } from "../models/index"; - -const KEY: string = process.env.COHERE_API_KEY || ""; - -describe("The classify endpoint", () => { - let response: cohereResponse; - cohere.init(KEY); - - it("Should should have a statusCode of 200", async () => { - response = await cohere.classify({ - model: "small", - examples: [ - { text: "apple", label: "food" }, - { text: "pizza", label: "food" }, - { text: "hamburger", label: "food" }, - { text: "taco", label: "food" }, - { text: "onion", label: "food" }, - { text: "purple", label: "color" }, - { text: "yellow", label: "color" }, - { text: "red", label: "color" }, - { text: "black", label: "color" }, - { text: "white", label: "color" }, - ], - inputs: ["orange"], - }); - - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); - it("Should contain a body property that contains a classifications property", async () => { - response = await cohere.classify({ - model: "small", - examples: [ - { text: "apple", label: "food" }, - { text: "pizza", label: "food" }, - { text: "hamburger", label: "food" }, - { text: "taco", label: "food" }, - { text: "onion", label: "food" }, - { text: "purple", label: "color" }, - { text: "yellow", label: "color" }, - { text: "red", label: "color" }, - { text: "black", label: "color" }, - { text: "white", label: "color" }, - ], - inputs: ["orange"], - truncate: "NONE", - }); - expect(response).to.have.property("body"); - expect(response.body.classifications).to.be.an("array"); - }); - it("Should contain prediction for food and color", async () => { - response = await cohere.classify({ - model: "small", - examples: [ - { text: "apple", label: "food" }, - { text: "pizza", label: "food" }, - { text: "hamburger", label: "food" }, - { text: "taco", label: "food" }, - { text: "onion", label: "food" }, - { text: "purple", label: "color" }, - { text: "yellow", label: "color" }, - { text: "red", label: "color" }, - { text: "black", label: "color" }, - { text: "white", label: "color" }, - ], - inputs: ["pink", "eggplant", "pasta"], - truncate: "START", - }); - - expect(response.body.classifications[0].prediction).to.equal("color"); // pink - expect(response.body.classifications[1].prediction).to.equal("food"); // eggplant - expect(response.body.classifications[2].prediction).to.equal("food"); // pasta - }); - - it("Should contain labels", async () => { - response = await cohere.classify({ - model: "small", - examples: [ - { text: "apple", label: "food" }, - { text: "pizza", label: "food" }, - { text: "hamburger", label: "food" }, - { text: "taco", label: "food" }, - { text: "onion", label: "food" }, - { text: "purple", label: "color" }, - { text: "yellow", label: "color" }, - { text: "red", label: "color" }, - { text: "black", label: "color" }, - { text: "white", label: "color" }, - ], - inputs: ["brown"], - truncate: "END", - }); - expect(response.body.classifications[0].labels).to.be.an("object"); - expect(response.body.classifications[0].labels["color"]).to.have.property( - "confidence" - ); - expect(Object.keys(response.body.classifications[0].labels)).to.have.length( - 2 - ); - }); - - it("Should classify for all params", async () => { - response = await cohere.classify({ - model: "small", - examples: [ - { text: "apple", label: "food" }, - { text: "pizza", label: "food" }, - { text: "hamburger", label: "food" }, - { text: "taco", label: "food" }, - { text: "onion", label: "food" }, - { text: "purple", label: "color" }, - { text: "yellow", label: "color" }, - { text: "red", label: "color" }, - { text: "black", label: "color" }, - { text: "white", label: "color" }, - ], - inputs: ["blue", "hamburger", "pasta"], - }); - expect(response.body.classifications[0].prediction).to.equal("color"); // blue - expect(response.body.classifications[1].prediction).to.equal("food"); // hamburger - expect(response.body.classifications[2].prediction).to.equal("food"); // pasta - }); - - it("Should should have a statusCode of 200 with a preset", async () => { - response = await cohere.classify({ preset: "SDK-TESTS-PRESET-rfa6h3" }); - - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); - it("Should contain a body property that contains meta information", () => { - expect(response.body).to.have.property("meta"); - expect(response.body.meta).to.have.property("api_version"); - expect(response.body.meta?.api_version).to.have.property("version"); - }); -}).timeout(5000); diff --git a/test/detectlanguage.ts b/test/detectlanguage.ts deleted file mode 100644 index a5bd618..0000000 --- a/test/detectlanguage.ts +++ /dev/null @@ -1,30 +0,0 @@ -import { expect } from "chai"; -import cohere from "../cohere"; -import { cohereResponse, detectLanguageResponse } from "../models/index"; - -const KEY: string = process.env.COHERE_API_KEY || ""; - -describe("The detect-language endpoint", () => { - let response: cohereResponse; - cohere.init(KEY); - before(async () => { - const en = "Hello world"; - const ru = "Здравствуй, Мир"; - response = await cohere.detectLanguage({ texts: [en, ru] }); - }); - it("Should should have a statusCode of 200", () => { - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); - it("Should contain the correct text", () => { - expect(response).to.have.property("body"); - expect(response.body).to.have.property("results"); - expect(response.body.results[0].language_code).to.equal("en"); - expect(response.body.results[1].language_code).to.equal("ru"); - }); - it("Should contain a body property that contains meta information", () => { - expect(response.body).to.have.property("meta"); - expect(response.body.meta).to.have.property("api_version"); - expect(response.body.meta?.api_version).to.have.property("version"); - }); -}); diff --git a/test/detokenize.ts b/test/detokenize.ts deleted file mode 100644 index 0cdfa76..0000000 --- a/test/detokenize.ts +++ /dev/null @@ -1,27 +0,0 @@ -import { expect } from "chai"; -import cohere from "../cohere"; -import { cohereResponse, detokenizeResponse } from "../models/index"; - -const KEY: string = process.env.COHERE_API_KEY || ""; - -describe("The detokenize endpoint", () => { - let response: cohereResponse; - cohere.init(KEY); - before(async () => { - response = await cohere.detokenize({ tokens: [25736, 2552] }); - }); - it("Should should have a statusCode of 200", () => { - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); - it("Should contain the correct text", () => { - expect(response).to.have.property("body"); - expect(response.body).to.have.property("text"); - expect(response.body.text).to.equal("hello world"); - }); - it("Should contain a body property that contains meta information", () => { - expect(response.body).to.have.property("meta"); - expect(response.body.meta).to.have.property("api_version"); - expect(response.body.meta?.api_version).to.have.property("version"); - }); -}); diff --git a/test/embed.ts b/test/embed.ts deleted file mode 100644 index 9fa5627..0000000 --- a/test/embed.ts +++ /dev/null @@ -1,51 +0,0 @@ -import { expect } from "chai"; -import cohere from "../cohere"; -import { cohereResponse, embedResponse } from "../models/index"; - -const KEY: string = process.env.COHERE_API_KEY || ""; - -describe("The embed endpoint", () => { - let response: cohereResponse; - cohere.init(KEY); - const texts = [ - "co:here", - "cohere", - "embed", - "python", - "golang", - "typescript", - "rust?", - "ai", - "nlp", - "neural", - "nets", - ]; - before(async function () { - this.timeout(5000); - response = await cohere.embed({ - texts: texts, - truncate: "NONE", - }); - }); - it("Should should have a statusCode of 200", () => { - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); - it("Should contain a body object that contains an embeddings property", () => { - expect(response).to.have.property("body"); - expect(response.body).to.have.property("embeddings"); - }); - it("Should contain an embeddings array with a length matching the provided amount of embeddings", () => { - expect(response.body.embeddings).to.be.an("array").of.length(texts.length); - }); - it("Should contain an embeddings array containing arrays", () => { - response.body.embeddings.forEach((item: number[]) => { - expect(item).to.be.an("array"); - }); - }); - it("Should contain a body property that contains meta information", () => { - expect(response.body).to.have.property("meta"); - expect(response.body.meta).to.have.property("api_version"); - expect(response.body.meta?.api_version).to.have.property("version"); - }); -}); diff --git a/test/generate.ts b/test/generate.ts deleted file mode 100644 index b5e81dd..0000000 --- a/test/generate.ts +++ /dev/null @@ -1,184 +0,0 @@ -import { expect } from "chai"; -import cohere from "../cohere"; -import { cohereResponse, generateResponse } from "../models/index"; - -const KEY: string = process.env.COHERE_API_KEY || ""; -const TIMEOUT = 5000; -cohere.init(KEY); - -describe("The generate endpoint successfully completes", () => { - let response: cohereResponse; - before(async function () { - this.timeout(TIMEOUT); - response = await cohere.generate({ - model: "medium", - prompt: "hello what is your name. £ symbols sometimes cause problems.", - max_tokens: 20, - temperature: 1, - k: 5, - p: 1, - }); - }); - it("Should should have a statusCode of 200", () => { - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); - it("Should contain a body property that contains a generations array of length one that contains a text property", () => { - expect(response).to.have.property("body"); - expect(response.body).to.have.property("generations"); - expect(response.body.generations).to.have.lengthOf(1); - expect(response.body.generations[0]).to.have.property("text"); - }); - it("Should contain a body property that contains meta information", () => { - expect(response.body).to.have.property("meta"); - expect(response.body.meta).to.have.property("api_version"); - expect(response.body.meta?.api_version).to.have.property("version"); - }); - it("Should contain text property with a string of length > 20", () => { - expect(response.body.generations[0].text).to.have.length.greaterThan(20); - }); -}); - -describe("The generate endpoint successfully completes with multiple generations", () => { - let response: cohereResponse; - before(async function () { - this.timeout(TIMEOUT); - response = await cohere.generate({ - model: "medium", - prompt: "hello what is your name", - max_tokens: 20, - temperature: 1, - k: 5, - num_generations: 2, - p: 1, - }); - }); - it("Should contain a body property that contains a generations array of length two", () => { - expect(response).to.have.property("body"); - expect(response.body).to.have.property("generations"); - expect(response.body.generations).to.have.lengthOf(2); - }); -}); - -describe("The generate endpoint with generation return likelihoods successfully returns a likelihood", () => { - let response: cohereResponse; - before(async function () { - this.timeout(TIMEOUT); - response = await cohere.generate({ - model: "medium", - prompt: "hello what is your name", - max_tokens: 20, - temperature: 1, - k: 5, - p: 1, - return_likelihoods: "GENERATION", - }); - }); - it("Should contain a body property that contains a likelihood", () => { - expect(response.body.generations[0]).to.have.property("likelihood"); - }); -}); - -describe("The generate endpoint with all return likelihoods successfully returns a likelihood", () => { - let response: cohereResponse; - before(async function () { - this.timeout(TIMEOUT); - response = await cohere.generate({ - model: "medium", - prompt: "hello what is your name", - max_tokens: 20, - temperature: 1, - k: 5, - p: 1, - return_likelihoods: "ALL", - }); - }); - it("Should contain a body property that contains a likelihood", () => { - expect(response.body.generations[0]).to.have.property("likelihood"); - }); -}); - -describe("The generate endpoint with no return likelihoods does not return a likelihood", () => { - let response: cohereResponse; - before(async function () { - this.timeout(TIMEOUT); - response = await cohere.generate({ - model: "medium", - prompt: "hello what is your name", - max_tokens: 20, - temperature: 1, - k: 5, - p: 1, - return_likelihoods: "NONE", - }); - }); - it("Should not contain a body property that contains a likelihood", () => { - expect(response.body.generations[0]).to.not.have.property("likelihood"); - }); -}); - -describe("The generate endpoint successfully completes with a preset", () => { - let response: cohereResponse; - before(async function () { - this.timeout(TIMEOUT); - response = await cohere.generate({ - preset: "SDK-TESTS-PRESET-cq2r57", - }); - }); - it("Should should have a statusCode of 200", () => { - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); -}); - -describe("The generate endpoint successfully completes with logit bias ", () => { - let response: cohereResponse; - before(async function () { - this.timeout(TIMEOUT); - response = await cohere.generate({ - model: "medium", - prompt: "hello what is your name", - max_tokens: 20, - logit_bias: { 11: -5.5 }, - }); - }); - it("Should should have a statusCode of 200", () => { - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); -}); - -describe("The generate endpoint fails when text is too long without truncate argument", () => { - let response: cohereResponse; - before(async function () { - this.timeout(TIMEOUT); - response = await cohere.generate({ - model: "medium", - prompt: "hello what is your name ".repeat(10000), - max_tokens: 20, - }); - }); - it("Should should have a statusCode of 400", () => { - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(400); - }); -}); - -describe("The generate endpoint successfully completes with truncate", () => { - let response: cohereResponse; - before(async function () { - this.timeout(TIMEOUT); - response = await cohere.generate({ - model: "medium", - prompt: "hello what is your name ".repeat(10000), - max_tokens: 20, - truncate: "END", - }); - }); - it("Should should have a statusCode of 200", () => { - console.log(response.body); - console.log(response.statusCode); - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); -}); diff --git a/test/summarize.ts b/test/summarize.ts deleted file mode 100644 index 343a23d..0000000 --- a/test/summarize.ts +++ /dev/null @@ -1,40 +0,0 @@ -import { expect } from "chai"; -import cohere from "../cohere"; -import { - cohereResponse, - summarizeResponse, - summaryExtractiveness, - summaryFormat, - summaryLength, -} from "../models/index"; - -const KEY: string = process.env.COHERE_API_KEY || ""; - -describe("The summarize endpoint", () => { - let response: cohereResponse; - cohere.init(KEY); - before(async () => { - response = await cohere.summarize({ - text: "If you want to get classic Angry Birds from Google Play — the version that costs just a buck and isn’t laden with microtransactions — you’d better get it quick. Rovio Classics: Angry Birds, a rebuilt version of the original mobile hit, will be delisted from Google’s app store on Thursday due to “the game’s impact on our wider games portfolio,” developer Rovio announced on Tuesday. Oddly, the App Store version will still be available, though Rovio’s plan is to change the game’s name to Red’s First Flight.\n\nMy guess is that Rovio is delisting this remake of Angry Birds to push people toward its free-to-play games in the series that make money off microtransactions. As a $1 one-time purchase, the Rovio Classics version of the game likely doesn’t make nearly the same amount of money as its other Angry Birds titles do. That $1 price may also be enough to keep players away from other games in the series, which means Rovio might feel like it’s leaving money on the table by still offering Rovio Classics: Angry Birds on Google Play.\n\nThat said, I don’t know why Rovio isn’t just changing the name of the game on Google Play like it is on the App Store. While the change to Red’s First Flight will likely make the game much harder to find unless you know exactly what you’re looking for, it will at least still be there as an option. Rovio didn’t immediately respond to a request for comment.\n\nHere is a transcribed version of Rovio’s full Twitter message about the change, which is a little difficult to read in the tweet:\n\nWe have reviewed the business case of Rovio Classics: Angry Birds, and due to the game’s impact on our wider games portfolio, we have decided that Rovio Classics: Angry Birds will be unlisted from the Google Play Store on Thursday, February 23. Additionally, the game will be renamed to Red’s First Flight in the App Store pending further review. Rovio Classics: Angry Birds will remain playable on devices on which the game has been downloaded, even after it has been unlisted.\n\nWe understand that this is sad news for many fans, as well as the team that has worked hard to make Rovio Classics: Angry Birds a reality. We are extremely grateful to the Angry Birds fans who have shown their love of the brand and this game from the beginning. We hope those fans can continue to bring that passion to our live Angry Birds slingshot games such as Angry Birds 2, Angry Birds Friends, and Angry Birds Journey, where our goal every day is to craft the best possible experience for players.\n\nIf you want to get Rovio Classics: Angry Birds before the changes, you can still buy it as of this writing on Google Play and the App Store. On both app stores, it’s technically listed as Rovio Classics: AB — which, to me, feels like a further attempt from Rovio to bury the game.", - length: summaryLength.MEDIUM, - format: summaryFormat.PARAGRAPH, - extractiveness: summaryExtractiveness.MEDIUM, - }); - }); - it("Should should have a statusCode of 200", () => { - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); - it("Should contain a summary", () => { - expect(response).to.have.property("body"); - expect(response.body).to.have.property("id"); - expect(response.body).to.have.property("summary"); - expect(response.body.summary).to.not.be.empty; - expect(response.body.id).to.not.be.empty; - }); - it("Should contain a body property that contains meta information", () => { - expect(response.body).to.have.property("meta"); - expect(response.body.meta).to.have.property("api_version"); - expect(response.body.meta?.api_version).to.have.property("version"); - }); -}); diff --git a/test/test.ts b/test/test.ts deleted file mode 100644 index d7c997d..0000000 --- a/test/test.ts +++ /dev/null @@ -1,12 +0,0 @@ -function importTest(name: string, path: string) { - describe(name, function () { - require(path); - }); -} - -describe("The `medium` model", () => { - importTest("generate", "./generate.ts"); - importTest("embed", "./embed.ts"); - importTest("classify", "./classify.ts"); - importTest("tokenize", "./tokenize.ts"); -}); diff --git a/test/tokenize.ts b/test/tokenize.ts deleted file mode 100644 index 56cb980..0000000 --- a/test/tokenize.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { expect } from "chai"; -import cohere from "../cohere"; -import { cohereResponse, tokenizeResponse } from "../models/index"; - -const KEY: string = process.env.COHERE_API_KEY || ""; - -describe("The tokenize endpoint", () => { - let response: cohereResponse; - cohere.init(KEY); - before(async () => { - response = await cohere.tokenize({ text: "hello world" }); - }); - it("Should should have a statusCode of 200", () => { - expect(response).to.have.property("statusCode"); - expect(response.statusCode).to.equal(200); - }); - it("Should contain the correct tokens", () => { - expect(response).to.have.property("body"); - expect(response.body).to.have.property("tokens"); - expect(response.body.tokens).to.deep.equal([25736, 2552]); - expect(response.body.token_strings).to.deep.equal(["hello", " world"]); - }); - it("Should contain a body property that contains meta information", () => { - expect(response.body).to.have.property("meta"); - expect(response.body.meta).to.have.property("api_version"); - expect(response.body.meta?.api_version).to.have.property("version"); - }); -}); diff --git a/tsconfig.json b/tsconfig.json index a30b759..e65fa53 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,22 +1,20 @@ { - "compilerOptions": { - "module": "commonjs", - "target": "es5", - "strict": true, - "noImplicitAny": true, - "strictNullChecks": true, - "esModuleInterop": true, - "declaration": true, - "moduleResolution": "node", - "removeComments": false, - "lib": ["es5", "es2018"], - "allowJs": true, - "typeRoots": ["node_modules/@types"], - "baseUrl": ".", - "paths": { - "@/*": ["services/*"] - } - }, - "exclude": ["node_modules"], - "include": ["cohere.ts"] -} + "compilerOptions": { + "extendedDiagnostics": true, + "strict": true, + "target": "ES6", + "module": "CommonJS", + "moduleResolution": "node", + "esModuleInterop": true, + "skipLibCheck": true, + "declaration": true, + "noUnusedParameters": true, + "outDir": "dist", + "rootDir": "src", + "baseUrl": "src" + }, + "include": [ + "src" + ], + "exclude": [] +} \ No newline at end of file diff --git a/webpack.config.js b/webpack.config.js deleted file mode 100644 index 3b258dd..0000000 --- a/webpack.config.js +++ /dev/null @@ -1,65 +0,0 @@ -const CopyPlugin = require("copy-webpack-plugin"); -const { CleanWebpackPlugin } = require("clean-webpack-plugin"); -const NodemonPlugin = require("nodemon-webpack-plugin"); -const ESLintPlugin = require("eslint-webpack-plugin"); -const path = require("path"); - -module.exports = (env = {}) => { - const config = { - mode: env.production ? "production" : "development", - entry: "./cohere.ts", - devtool: "source-map", - target: "node", - resolve: { - extensions: [".tsx", ".ts", ".js"], - alias: { - "@": path.join(__dirname, "src"), - }, - }, - output: { - filename: "cohere.js", - path: path.resolve(__dirname, "dist"), - library: { - name: "cohere", - type: "umd", - }, - }, - optimization: { - minimize: false, - }, - module: { - rules: [ - { - test: /\.tsx?$/, - use: "ts-loader", - exclude: /node_modules/, - }, - ], - }, - devServer: { - contentBase: path.join(__dirname, "dist"), - compress: true, - port: 9000, - }, - plugins: [ - new CleanWebpackPlugin(), - new ESLintPlugin({ - extensions: [".tsx", ".ts", ".js"], - }), - new CopyPlugin({ - patterns: [ - { - from: "models/index.ts", - to: "models", - }, - ], - }), - ], - }; - if (env.nodemon) { - config.watch = true; - config.plugins.push(new NodemonPlugin()); - } - - return config; -}; diff --git a/yarn.lock b/yarn.lock new file mode 100644 index 0000000..e3d7ca2 --- /dev/null +++ b/yarn.lock @@ -0,0 +1,89 @@ +# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY. +# yarn lockfile v1 + + +"@types/node@17.0.33": + version "17.0.33" + resolved "https://registry.yarnpkg.com/@types/node/-/node-17.0.33.tgz#3c1879b276dc63e73030bb91165e62a4509cd506" + integrity sha512-miWq2m2FiQZmaHfdZNcbpp9PuXg34W5JZ5CrJ/BaS70VuhoJENBEQybeiYSaPBRNq6KQGnjfEnc/F3PN++D+XQ== + +"@types/url-join@4.0.1": + version "4.0.1" + resolved "https://registry.yarnpkg.com/@types/url-join/-/url-join-4.0.1.tgz#4989c97f969464647a8586c7252d97b449cdc045" + integrity sha512-wDXw9LEEUHyV+7UWy7U315nrJGJ7p1BzaCxDpEoLr789Dk1WDVMMlf3iBfbG2F8NdWnYyFbtTxUn2ZNbm1Q4LQ== + +"@ungap/url-search-params@0.2.2": + version "0.2.2" + resolved "https://registry.yarnpkg.com/@ungap/url-search-params/-/url-search-params-0.2.2.tgz#2de3bdec21476a9b70ef11fd7b794752f9afa04c" + integrity sha512-qQsguKXZVKdCixOHX9jqnX/K/1HekPDpGKyEcXHT+zR6EjGA7S4boSuelL4uuPv6YfhN0n8c4UxW+v/Z3gM2iw== + +asynckit@^0.4.0: + version "0.4.0" + resolved "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz#c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79" + integrity sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q== + +axios@0.27.2: + version "0.27.2" + resolved "https://registry.yarnpkg.com/axios/-/axios-0.27.2.tgz#207658cc8621606e586c85db4b41a750e756d972" + integrity sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ== + dependencies: + follow-redirects "^1.14.9" + form-data "^4.0.0" + +combined-stream@^1.0.8: + version "1.0.8" + resolved "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz#c3d45a8b34fd730631a110a8a2520682b31d5a7f" + integrity sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg== + dependencies: + delayed-stream "~1.0.0" + +delayed-stream@~1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz#df3ae199acadfb7d440aaae0b29e2272b24ec619" + integrity sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ== + +follow-redirects@^1.14.9: + version "1.15.3" + resolved "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.15.3.tgz#fe2f3ef2690afce7e82ed0b44db08165b207123a" + integrity sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q== + +form-data@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/form-data/-/form-data-4.0.0.tgz#93919daeaf361ee529584b9b31664dc12c9fa452" + integrity sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww== + dependencies: + asynckit "^0.4.0" + combined-stream "^1.0.8" + mime-types "^2.1.12" + +js-base64@3.7.2: + version "3.7.2" + resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.2.tgz#816d11d81a8aff241603d19ce5761e13e41d7745" + integrity sha512-NnRs6dsyqUXejqk/yv2aiXlAvOs56sLkX6nUdeaNezI5LFFLlsZjOThmwnrcwh5ZZRwZlCMnVAY3CvhIhoVEKQ== + +mime-db@1.52.0: + version "1.52.0" + resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70" + integrity sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg== + +mime-types@^2.1.12: + version "2.1.35" + resolved "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.35.tgz#381a871b62a734450660ae3deee44813f70d959a" + integrity sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw== + dependencies: + mime-db "1.52.0" + +prettier@2.7.1: + version "2.7.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.7.1.tgz#e235806850d057f97bb08368a4f7d899f7760c64" + integrity sha512-ujppO+MkdPqoVINuDFDRLClm7D78qbDt0/NR+wp5FqEZOoTNAjPHWj17QRhu7geIHJfcNhRk1XVQmF8Bp3ye+g== + +typescript@4.6.4: + version "4.6.4" + resolved "https://registry.yarnpkg.com/typescript/-/typescript-4.6.4.tgz#caa78bbc3a59e6a5c510d35703f6a09877ce45e9" + integrity sha512-9ia/jWHIEbo49HfjrLGfKbZSuWo9iTMwXO+Ca3pRsSpbsMbc7/IU8NKdCZVRRBafVPGnoJeFL76ZOAA84I9fEg== + +url-join@4.0.1: + version "4.0.1" + resolved "https://registry.yarnpkg.com/url-join/-/url-join-4.0.1.tgz#b642e21a2646808ffa178c4c5fda39844e12cde7" + integrity sha512-jk1+QP6ZJqyOiuEI9AEWQfju/nB2Pw466kbA0LEZljHwKeMgd9WrAEgEGxjPDD2+TNbbb37rTyhEfrCXfuKXnA== From cacd8f790d7864a6e7109a02ae473390e147db92 Mon Sep 17 00:00:00 2001 From: Billy Trend Date: Fri, 3 Nov 2023 11:37:37 +0000 Subject: [PATCH 2/3] Add readme --- .fernignore | 1 + README.md | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++ banner.png | Bin 0 -> 1095099 bytes 3 files changed, 104 insertions(+) create mode 100644 README.md create mode 100644 banner.png diff --git a/.fernignore b/.fernignore index 084a8eb..694283c 100644 --- a/.fernignore +++ b/.fernignore @@ -1 +1,2 @@ # Specify files that shouldn't be modified by Fern +README.md \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7091fd8 --- /dev/null +++ b/README.md @@ -0,0 +1,103 @@ +![](banner.png) + +# Cohere Typescript Library + +[![npm shield](https://img.shields.io/npm/v/cohere-ai)](https://www.npmjs.com/package/cohere-ai) +[![fern shield](https://img.shields.io/badge/%F0%9F%8C%BF-SDK%20generated%20by%20Fern-brightgreen)](https://github.com/fern-api/fern) + +The Cohere typescript library provides access to the Cohere API from JavaScript/TypeScript. + +## Documentation + +API reference documentation is available [here](https://docs.cohere.com/). + +## Usage + +[![Try it out](https://developer.stackblitz.com/img/open_in_stackblitz.svg)](https://stackblitz.com/edit/typescript-example-using-sdk-built-with-fern-az8lrn?file=app.ts&view=editor) + +```typescript +import { CohereClient } from "cohere-ai"; + +const cohere = new CohereClient({ + apiKey: "YOUR_API_KEY", +}); + +const prediction = cohere.generate({ + model: "large", + prompt: "co:here", + max_tokens: 10, +}); + +console.log("Received prediction", prediction); +``` + +## Streaming + +The SDK supports streaming from the chat endpoint. To take advantage of this feature, +pass stream: true with your request and a callback to handle the events. + +```ts +const stream = await cohere.chatStream({ + model: "command", + message: "Tell me a story in 5 parts!", +}); +for await (const chat of stream) { + if (chat.type === "text-generation") { + process.stdout.write(chat.text); + } +} +``` + +## Errors + +When the API returns a non-success status code (4xx or 5xx response), +a subclass of [CohereError](./src/errors/CohereError.ts) will be thrown: + +```typescript +import { CohereError, CohereTimeoutError } from "cohere-ai"; + +try { + await cohere.generate(/* ... */); +} catch (err) { + if (err instanceof CohereTimeoutError) { + console.log("Request timed out", err); + } else if (err instanceof CohereError) { + // catch all errros + console.log(err.statusCode); + console.log(err.message); + console.log(err.body); + } +} +``` + +## Retries + +409 Conflict, 429 Rate Limit, and >=500 Internal errors will all be retried twice with exponential bakcoff. +You can use the maxRetries option to configure this behavior: + +```typescript +await cohere.detectLanguage(..., { + maxRetries: 0, // disable retries +}); +``` + +## Timeouts + +By default, the SDK has a timeout of 60s. You can use the `timeoutInSeconds` option to configure +this behavior + +```typescript +await cohere.detectLanguage(..., { + timeoutInSeconds: 10, // timeout after 10 seconds +}); +``` + +## Beta status + +This SDK is in beta, and there may be breaking changes between versions without a major version update. Therefore, we recommend pinning the package version to a specific version in your package.json file. This way, you can install the same version each time without breaking changes unless you are intentionally looking for the latest version. + +## Contributing + +While we value open-source contributions to this SDK, this library is generated programmatically. Additions made directly to this library would have to be moved over to our generation code, otherwise they would be overwritten upon the next generated release. Feel free to open a PR as a proof of concept, but know that we will not be able to merge it as-is. We suggest opening an issue first to discuss with us! + +On the other hand, contributions to the README are always very welcome! \ No newline at end of file diff --git a/banner.png b/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..322a84b38261438ad590c04798267a8bf8cbc806 GIT binary patch literal 1095099 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�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

UST>9rLi>;CJX`-sZT?wMt?Cc`vwY7*Y8Q$e&| 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
VdCub+ImCd-z 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∓UCXnY@MtF3pfm99qj1J(Ci+7-aqGjBkL%-6(1M9G^?NYZ^u5++D(iao zW2xR<0O^oS7tvk4<5?brrc$Wg1r-Z$f`l#d>n2&#dQ)Tjz;uWj7x%K;BEaP6aJ36a zJR(Ih=CkJ-q`cOUOO(;}x%y7Pt

    ZQfLsbd1|jn3`ef^EdgrBXHJepviCDP#gKv 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