From 7b641fe7cb2904bf411c19d5b76021f0d1eec56d Mon Sep 17 00:00:00 2001 From: Qiaoqiao Zhang <55688292+qiaozha@users.noreply.github.com> Date: Sat, 4 Nov 2023 09:13:15 +0800 Subject: [PATCH] Support hierarchy subpath (#2080) * inital-commit-of-hierarchy-support * add model namespace name * reserve work * revert change in openai modular as of openai generic * generate operations * add classical operation hierarchy layers and reserve work * organize classic operation as hierarchy layered * change typespec to have simpler names * resolve operation conflicts with full namespace path * add namespace prefix for model only when conflicts * add edge case for model and operation name conflicts and resolve model conflicts if detect * enableModelNamespace as true for anomaly detector * fix hierarchy layer info bug * do not rename in Modular but rename in RLC if hierarchy client and conflict exists * fix model conflicts detect condition * update edge case generation * update package.json with hierarchy subpath * manual change for export the operation interface * reserve work * generate options in a centralized place * update generated code for edge case * loadtesting-with-hierarchy-false (#9) * loadtesting-with-hierarchy-false * do not return namespace hierarchies * use interface name when enable operation group in rlc * fix package.json * update generic generated files with just pure import order change (#10) * loadtesting-with-hierarchy-false * do not return namespace hierarchies * use interface name when enable operation group in rlc * fix package.json * update generic generated files just import order chaneg * disable-hierarchy-client-and-not-introduce-extra-changes (#11) * disable-hierarchy-client-and-not-introduce-extra-changes * fix model import issues * reserve work * reserve work * fix hierarchy layer overload * fix generation failure * fall back to enableOperationGroup logic if hierarchyClient is false * fix package.json and api layer export * fix smoke-test * fix lint error * tryfix ci * add operation group name back if hierarchy client is false * use operation group name if hierarchy client is false * rename operation if enableOperationGroup true and hierarchyClient false * do not include operation group name duplicated * only return interface name when enableOperationGroup true and hierarchyClient false * disable hierarchyClient for chatApi * Update packages/typespec-test/test/chatApi_modular/generated/typespec-ts/package.json * Update packages/typespec-test/test/loadtesting_modular/tspconfig.yaml * enableOperationGroup for service with operationGroup decorator * to not get namespace hierarchy if hierarchyClient is false (#12) * hierarchy-namespace-in-client-tsp * fix client structure with operations * update smoke-test * undo enable operation group for clients --- packages/rlc-common/src/interfaces.ts | 2 + .../review/ai-anomaly-detector.api.md | 334 ++-- .../generated/typespec-ts/src/models.ts | 38 +- .../generated/typespec-ts/src/outputModels.ts | 76 +- .../generated/typespec-ts/src/parameters.ts | 22 +- .../generated/typespec-ts/src/responses.ts | 56 +- .../test/anomalyDetector/tspconfig.yaml | 1 + .../test/batch_modular/tspconfig.yaml | 1 + .../test/chatApi_modular/tspconfig.yaml | 1 + .../test/contentsafety_modular/tspconfig.yaml | 1 + .../generated/typespec-ts/.eslintrc.json | 11 + .../generated/typespec-ts/README.md | 56 + .../generated/typespec-ts/api-extractor.json | 18 + .../generated/typespec-ts/karma.conf.js | 133 ++ .../generated/typespec-ts/package.json | 141 ++ .../review/hierarchy-generic.api.md | 99 + .../generated/typespec-ts/rollup.config.js | 118 ++ .../generated/typespec-ts/src/FooClient.ts | 33 + .../typespec-ts/src/api/FooContext.ts | 18 + .../typespec-ts/src/api/b/c/index.ts | 40 + .../typespec-ts/src/api/b/e/c/index.ts | 45 + .../generated/typespec-ts/src/api/b/index.ts | 40 + .../generated/typespec-ts/src/api/d/index.ts | 40 + .../generated/typespec-ts/src/api/index.ts | 5 + .../typespec-ts/src/api/operations.ts | 40 + .../typespec-ts/src/classic/b/c/index.ts | 23 + .../typespec-ts/src/classic/b/e/c/index.ts | 23 + .../typespec-ts/src/classic/b/e/index.ts | 15 + .../typespec-ts/src/classic/b/index.ts | 29 + .../typespec-ts/src/classic/d/index.ts | 23 + .../typespec-ts/src/classic/index.ts | 8 + .../generated/typespec-ts/src/index.ts | 21 + .../generated/typespec-ts/src/logger.ts | 5 + .../generated/typespec-ts/src/models/index.ts | 11 + .../typespec-ts/src/models/models.ts | 14 + .../typespec-ts/src/models/options.ts | 14 + .../typespec-ts/src/rest/clientDefinitions.ts | 55 + .../typespec-ts/src/rest/fooClient.ts | 37 + .../generated/typespec-ts/src/rest/index.ts | 12 + .../generated/typespec-ts/src/rest/models.ts | 14 + .../typespec-ts/src/rest/parameters.ts | 35 + .../typespec-ts/src/rest/responses.ts | 29 + .../test/public/sampleTest.spec.ts | 23 + .../test/public/utils/env.browser.ts | 2 + .../typespec-ts/test/public/utils/env.ts | 6 + .../test/public/utils/recordedClient.ts | 29 + .../generated/typespec-ts/tsconfig.json | 27 + .../test/hierarchy_generic/spec/main.tsp | 39 + .../test/hierarchy_generic/tspconfig.yaml | 10 + .../test/loadtesting_modular/tspconfig.yaml | 1 + .../generated/typespec-ts/package.json | 48 + .../typespec-ts/review/openai-generic.api.md | 415 ++-- .../generated/typespec-ts/src/OpenAIClient.ts | 361 +--- .../src/api/audio/transcriptions/index.ts | 65 + .../src/api/audio/translations/index.ts | 63 + .../src/api/chat/completions/index.ts | 109 ++ .../typespec-ts/src/api/completions/index.ts | 95 + .../typespec-ts/src/api/edits/index.ts | 67 + .../typespec-ts/src/api/embeddings/index.ts | 68 + .../typespec-ts/src/api/files/index.ts | 217 +++ .../typespec-ts/src/api/fineTunes/index.ts | 446 +++++ .../src/api/fineTuning/jobs/index.ts | 332 ++++ .../typespec-ts/src/api/images/index.ts | 180 ++ .../generated/typespec-ts/src/api/index.ts | 30 - .../typespec-ts/src/api/models/index.ts | 133 ++ .../typespec-ts/src/api/moderations/index.ts | 84 + .../typespec-ts/src/api/operations.ts | 1711 ----------------- .../typespec-ts/src/classic/audio/index.ts | 24 + .../src/classic/audio/transcriptions/index.ts | 34 + .../src/classic/audio/translations/index.ts | 34 + .../src/classic/chat/completions/index.ts | 34 + .../typespec-ts/src/classic/chat/index.ts | 18 + .../src/classic/completions/index.ts | 34 + .../typespec-ts/src/classic/edits/index.ts | 27 + .../src/classic/embeddings/index.ts | 34 + .../typespec-ts/src/classic/files/index.ts | 61 + .../src/classic/fineTunes/index.ts | 68 + .../src/classic/fineTuning/index.ts | 20 + .../src/classic/fineTuning/jobs/index.ts | 74 + .../typespec-ts/src/classic/images/index.ts | 52 + .../typespec-ts/src/classic/index.ts | 18 + .../typespec-ts/src/classic/models/index.ts | 40 + .../src/classic/moderations/index.ts | 34 + .../generated/typespec-ts/src/index.ts | 73 +- .../generated/typespec-ts/src/models/index.ts | 56 +- .../typespec-ts/src/models/options.ts | 56 +- .../typespec-ts/src/rest/clientDefinitions.ts | 379 ++-- .../typespec-ts/src/rest/isUnexpected.ts | 414 ++-- .../typespec-ts/src/rest/parameters.ts | 132 +- .../typespec-ts/src/rest/responses.ts | 113 +- .../openai_generic/spec/audio/operations.tsp | 4 +- .../spec/completions/chat-meta.tsp | 2 +- .../spec/completions/operations.tsp | 4 +- .../openai_generic/spec/edits/operations.tsp | 2 +- .../spec/embeddings/operations.tsp | 2 +- .../openai_generic/spec/files/operations.tsp | 10 +- .../spec/fine-tuning/operations.tsp | 22 +- .../openai_generic/spec/images/operations.tsp | 6 +- .../spec/moderation/operations.tsp | 2 +- .../test/openai_modular/spec/tspconfig.yaml | 1 + .../generated/typespec-ts/package.json | 4 + .../typespec-ts/review/widget_dpg.api.md | 75 +- .../generated/src/WidgetServiceClient.ts | 97 +- .../sources/generated/src/api/index.ts | 8 - .../api/{operations.ts => widgets/index.ts} | 42 +- .../sources/generated/src/classic/index.ts | 4 + .../generated/src/classic/widgets/index.ts | 98 + .../sources/generated/src/index.ts | 13 +- .../sources/generated/src/models/index.ts | 12 +- .../sources/generated/src/models/options.ts | 12 +- .../typespec-ts/src/WidgetServiceClient.ts | 97 +- .../generated/typespec-ts/src/api/index.ts | 8 - .../api/{operations.ts => widgets/index.ts} | 42 +- .../typespec-ts/src/classic/index.ts | 4 + .../typespec-ts/src/classic/widgets/index.ts | 98 + .../generated/typespec-ts/src/index.ts | 13 +- .../generated/typespec-ts/src/models/index.ts | 12 +- .../typespec-ts/src/models/options.ts | 12 +- packages/typespec-ts/src/index.ts | 15 +- packages/typespec-ts/src/lib.ts | 4 +- .../src/modular/buildClassicalClient.ts | 146 +- .../modular/buildClassicalOperationGroups.ts | 151 ++ .../typespec-ts/src/modular/buildCodeModel.ts | 89 +- .../src/modular/buildOperations.ts | 45 +- .../src/modular/buildProjectFiles.ts | 30 +- .../typespec-ts/src/modular/buildRootIndex.ts | 39 +- .../src/modular/buildSubpathIndex.ts | 47 +- .../helpers/classicalOperationHelpers.ts | 212 ++ .../src/modular/helpers/namingHelpers.ts | 26 +- .../src/modular/helpers/operationHelpers.ts | 10 +- .../src/modular/modularCodeModel.ts | 2 + .../src/transform/transfromRLCOptions.ts | 40 +- packages/typespec-ts/src/utils/modelUtils.ts | 12 +- .../typespec-ts/src/utils/namespaceUtils.ts | 74 + .../typespec-ts/src/utils/operationUtil.ts | 29 +- .../authentication/api-key/tspconfig.yaml | 1 + .../authentication/http-custom/tspconfig.yaml | 1 + .../authentication/oauth2/tspconfig.yaml | 1 + .../authentication/union/tspconfig.yaml | 1 + .../generated/azure/core/src/BasicClient.ts | 16 +- .../azure/core/src/api/operations.ts | 20 +- .../generated/azure/core/src/index.ts | 4 +- .../generated/azure/core/src/models/index.ts | 4 +- .../azure/core/src/models/options.ts | 4 +- .../generated/azure/core/tspconfig.yaml | 1 + .../client/structure/default/tspconfig.yaml | 1 + .../structure/multi-client/tspconfig.yaml | 1 + .../src/RenamedOperationClient.ts | 21 +- .../src/api/{group.ts => group/index.ts} | 22 +- .../renamed-operation/src/api/index.ts | 2 +- .../src/classic/group/index.ts | 33 + .../renamed-operation/src/classic/index.ts | 4 + .../structure/renamed-operation/src/index.ts | 7 +- .../renamed-operation/src/models/index.ts | 6 +- .../renamed-operation/src/models/options.ts | 6 +- .../renamed-operation/tspconfig.yaml | 1 + .../src/TwoOperationGroupClient.ts | 48 +- .../src/api/{group1.ts => group1/index.ts} | 20 +- .../src/api/{group2.ts => group2/index.ts} | 20 +- .../two-operation-group/src/api/index.ts | 4 +- .../src/classic/group1/index.ts | 30 + .../src/classic/group2/index.ts | 30 + .../two-operation-group/src/classic/index.ts | 5 + .../two-operation-group/src/index.ts | 13 +- .../two-operation-group/src/models/index.ts | 12 +- .../two-operation-group/src/models/options.ts | 12 +- .../two-operation-group/tspconfig.yaml | 1 + .../generated/encode/bytes/src/BytesClient.ts | 217 +-- .../src/api/{header.ts => header/index.ts} | 4 +- .../generated/encode/bytes/src/api/index.ts | 10 +- .../api/{property.ts => property/index.ts} | 6 +- .../src/api/{query.ts => query/index.ts} | 4 +- .../{requestBody.ts => requestBody/index.ts} | 4 +- .../index.ts} | 4 +- .../encode/bytes/src/classic/header/index.ts | 50 + .../encode/bytes/src/classic/index.ts | 8 + .../bytes/src/classic/property/index.ts | 66 + .../encode/bytes/src/classic/query/index.ts | 50 + .../bytes/src/classic/requestBody/index.ts | 66 + .../bytes/src/classic/responseBody/index.ts | 53 + .../generated/encode/bytes/src/index.ts | 7 + .../generated/encode/bytes/tspconfig.yaml | 1 + .../encode/datetime/src/DatetimeClient.ts | 162 +- .../src/api/{header.ts => header/index.ts} | 4 +- .../encode/datetime/src/api/index.ts | 8 +- .../api/{property.ts => property/index.ts} | 6 +- .../src/api/{query.ts => query/index.ts} | 4 +- .../index.ts} | 4 +- .../datetime/src/classic/header/index.ts | 57 + .../encode/datetime/src/classic/index.ts | 7 + .../datetime/src/classic/property/index.ts | 81 + .../datetime/src/classic/query/index.ts | 55 + .../src/classic/responseHeader/index.ts | 46 + .../generated/encode/datetime/src/index.ts | 6 + .../generated/encode/datetime/tspconfig.yaml | 1 + .../encode/duration/src/DurationClient.ts | 143 +- .../src/api/{header.ts => header/index.ts} | 4 +- .../encode/duration/src/api/index.ts | 6 +- .../api/{property.ts => property/index.ts} | 6 +- .../src/api/{query.ts => query/index.ts} | 4 +- .../duration/src/classic/header/index.ts | 58 + .../encode/duration/src/classic/index.ts | 6 + .../duration/src/classic/property/index.ts | 81 + .../duration/src/classic/query/index.ts | 58 + .../generated/encode/duration/src/index.ts | 5 + .../generated/encode/duration/tspconfig.yaml | 1 + .../headers/client-request-id/tspconfig.yaml | 1 + .../generated/models/usage/tspconfig.yaml | 1 + .../src/CollectionFormatClient.ts | 47 +- .../src/api/{header.ts => header/index.ts} | 4 +- .../collection-format/src/api/index.ts | 4 +- .../src/api/{query.ts => query/index.ts} | 4 +- .../src/classic/header/index.ts | 25 + .../collection-format/src/classic/index.ts | 5 + .../src/classic/query/index.ts | 49 + .../parameters/collection-format/src/index.ts | 1 + .../collection-format/tspconfig.yaml | 1 + .../parameters/spread/src/SpreadClient.ts | 73 +- .../src/api/{alias.ts => alias/index.ts} | 4 +- .../parameters/spread/src/api/index.ts | 12 +- .../src/api/{model.ts => model/index.ts} | 6 +- .../spread/src/classic/alias/index.ts | 83 + .../parameters/spread/src/classic/index.ts | 5 + .../spread/src/classic/model/index.ts | 29 + .../generated/parameters/spread/src/index.ts | 1 + .../parameters/spread/tspconfig.yaml | 1 + .../server/path/multiple/tspconfig.yaml | 1 + .../server/path/single/tspconfig.yaml | 1 + 228 files changed, 7595 insertions(+), 4282 deletions(-) create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/.eslintrc.json create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/README.md create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/api-extractor.json create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/karma.conf.js create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/package.json create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/review/hierarchy-generic.api.md create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/rollup.config.js create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/FooClient.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/FooContext.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/c/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/e/c/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/d/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/operations.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/c/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/e/c/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/e/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/d/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/logger.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/models.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/options.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/clientDefinitions.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/fooClient.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/index.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/models.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/parameters.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/responses.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/sampleTest.spec.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/env.browser.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/env.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/recordedClient.ts create mode 100644 packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/tsconfig.json create mode 100644 packages/typespec-test/test/hierarchy_generic/spec/main.tsp create mode 100644 packages/typespec-test/test/hierarchy_generic/tspconfig.yaml create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/audio/transcriptions/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/audio/translations/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/chat/completions/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/completions/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/edits/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/embeddings/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/files/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/fineTunes/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/fineTuning/jobs/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/images/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/models/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/moderations/index.ts delete mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/operations.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/transcriptions/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/translations/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/chat/completions/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/chat/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/completions/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/edits/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/embeddings/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/files/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTunes/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTuning/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTuning/jobs/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/images/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/models/index.ts create mode 100644 packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/moderations/index.ts rename packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/{operations.ts => widgets/index.ts} (88%) create mode 100644 packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/classic/index.ts create mode 100644 packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/classic/widgets/index.ts rename packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/{operations.ts => widgets/index.ts} (88%) create mode 100644 packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/classic/index.ts create mode 100644 packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/classic/widgets/index.ts create mode 100644 packages/typespec-ts/src/modular/buildClassicalOperationGroups.ts create mode 100644 packages/typespec-ts/src/modular/helpers/classicalOperationHelpers.ts create mode 100644 packages/typespec-ts/src/utils/namespaceUtils.ts rename packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/{group.ts => group/index.ts} (78%) create mode 100644 packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/classic/group/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/classic/index.ts rename packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/{group1.ts => group1/index.ts} (79%) rename packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/{group2.ts => group2/index.ts} (79%) create mode 100644 packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/group1/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/group2/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/index.ts rename packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/{header.ts => header/index.ts} (98%) rename packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/{property.ts => property/index.ts} (98%) rename packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/{query.ts => query/index.ts} (98%) rename packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/{requestBody.ts => requestBody/index.ts} (98%) rename packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/{responseBody.ts => responseBody/index.ts} (98%) create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/header/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/property/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/query/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/requestBody/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/responseBody/index.ts rename packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/{header.ts => header/index.ts} (98%) rename packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/{property.ts => property/index.ts} (98%) rename packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/{query.ts => query/index.ts} (98%) rename packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/{responseHeader.ts => responseHeader/index.ts} (98%) create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/header/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/property/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/query/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/responseHeader/index.ts rename packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/{header.ts => header/index.ts} (98%) rename packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/{property.ts => property/index.ts} (98%) rename packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/{query.ts => query/index.ts} (98%) create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/header/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/property/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/query/index.ts rename packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/{header.ts => header/index.ts} (92%) rename packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/{query.ts => query/index.ts} (98%) create mode 100644 packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/header/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/query/index.ts rename packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/{alias.ts => alias/index.ts} (98%) rename packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/{model.ts => model/index.ts} (87%) create mode 100644 packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/alias/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/index.ts create mode 100644 packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/model/index.ts diff --git a/packages/rlc-common/src/interfaces.ts b/packages/rlc-common/src/interfaces.ts index 2b15d1cbfa..d815f2ea0a 100644 --- a/packages/rlc-common/src/interfaces.ts +++ b/packages/rlc-common/src/interfaces.ts @@ -185,6 +185,8 @@ export interface RLCOptions { sourceFrom?: "TypeSpec" | "Swagger"; isModularLibrary?: boolean; enableOperationGroup?: boolean; + enableModelNamespace?: boolean; + hierarchyClient?: boolean; } export interface ServiceInfo { diff --git a/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/review/ai-anomaly-detector.api.md b/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/review/ai-anomaly-detector.api.md index e455a6e4bb..cae2846141 100644 --- a/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/review/ai-anomaly-detector.api.md +++ b/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/review/ai-anomaly-detector.api.md @@ -14,28 +14,6 @@ import { RawHttpHeaders } from '@azure/core-rest-pipeline'; import { RequestParameters } from '@azure-rest/core-client'; import { StreamableMethod } from '@azure-rest/core-client'; -// @public -export interface AlignPolicy { - alignMode?: "Inner" | "Outer"; - fillNAMethod?: string; - paddingValue?: number; -} - -// @public -export interface AlignPolicyOutput { - alignMode?: "Inner" | "Outer"; - fillNAMethod?: string; - paddingValue?: number; -} - -// @public -export interface AnomalyDetectionModelOutput { - createdTime: string; - lastUpdatedTime: string; - readonly modelId: string; - modelInfo?: ModelInfoOutput; -} - // @public (undocumented) export type AnomalyDetectorClient = Client & { path: Routes; @@ -47,39 +25,6 @@ export interface AnomalyDetectorClientOptions extends ClientOptions { apiVersion?: string; } -// @public -export interface AnomalyDetectorErrorOutput { - code?: string; - message?: string; -} - -// @public -export interface AnomalyInterpretationOutput { - contributionScore?: number; - correlationChanges?: CorrelationChangesOutput; - variable?: string; -} - -// @public -export interface AnomalyStateOutput { - errors?: Array; - timestamp: string; - value?: AnomalyValueOutput; -} - -// @public -export interface AnomalyValueOutput { - interpretation?: Array; - isAnomaly: boolean; - score: number; - severity: number; -} - -// @public -export interface CorrelationChangesOutput { - changedVariables?: string[]; -} - // @public function createClient(endpoint: string, credentials: KeyCredential, options?: AnomalyDetectorClientOptions): AnomalyDetectorClient; export default createClient; @@ -104,7 +49,7 @@ export interface DeleteMultivariateModelDefaultHeaders { // @public (undocumented) export interface DeleteMultivariateModelDefaultResponse extends HttpResponse { // (undocumented) - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; // (undocumented) headers: RawHttpHeaders & DeleteMultivariateModelDefaultHeaders; // (undocumented) @@ -128,7 +73,7 @@ export interface DetectMultivariateBatchAnomaly202Headers { // @public export interface DetectMultivariateBatchAnomaly202Response extends HttpResponse { // (undocumented) - body: MultivariateDetectionResultOutput; + body: MultivariateMultivariateDetectionResultOutput; // (undocumented) headers: RawHttpHeaders & DetectMultivariateBatchAnomaly202Headers; // (undocumented) @@ -137,7 +82,7 @@ export interface DetectMultivariateBatchAnomaly202Response extends HttpResponse // @public (undocumented) export interface DetectMultivariateBatchAnomalyBodyParam { - body: MultivariateBatchDetectionOptions; + body: MultivariateMultivariateBatchDetectionOptions; } // @public (undocumented) @@ -148,7 +93,7 @@ export interface DetectMultivariateBatchAnomalyDefaultHeaders { // @public (undocumented) export interface DetectMultivariateBatchAnomalyDefaultResponse extends HttpResponse { // (undocumented) - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; // (undocumented) headers: RawHttpHeaders & DetectMultivariateBatchAnomalyDefaultHeaders; // (undocumented) @@ -166,14 +111,14 @@ export interface DetectMultivariateLastAnomaly { // @public export interface DetectMultivariateLastAnomaly200Response extends HttpResponse { // (undocumented) - body: MultivariateLastDetectionResultOutput; + body: MultivariateMultivariateLastDetectionResultOutput; // (undocumented) status: "200"; } // @public (undocumented) export interface DetectMultivariateLastAnomalyBodyParam { - body: MultivariateLastDetectionOptions; + body: MultivariateMultivariateLastDetectionOptions; } // @public (undocumented) @@ -184,7 +129,7 @@ export interface DetectMultivariateLastAnomalyDefaultHeaders { // @public (undocumented) export interface DetectMultivariateLastAnomalyDefaultResponse extends HttpResponse { // (undocumented) - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; // (undocumented) headers: RawHttpHeaders & DetectMultivariateLastAnomalyDefaultHeaders; // (undocumented) @@ -202,14 +147,14 @@ export interface DetectUnivariateChangePoint { // @public export interface DetectUnivariateChangePoint200Response extends HttpResponse { // (undocumented) - body: UnivariateChangePointDetectionResultOutput; + body: UnivariateUnivariateChangePointDetectionResultOutput; // (undocumented) status: "200"; } // @public (undocumented) export interface DetectUnivariateChangePointBodyParam { - body: UnivariateChangePointDetectionOptions; + body: UnivariateUnivariateChangePointDetectionOptions; } // @public (undocumented) @@ -220,7 +165,7 @@ export interface DetectUnivariateChangePointDefaultHeaders { // @public (undocumented) export interface DetectUnivariateChangePointDefaultResponse extends HttpResponse { // (undocumented) - body: AnomalyDetectorErrorOutput; + body: UnivariateAnomalyDetectorErrorOutput; // (undocumented) headers: RawHttpHeaders & DetectUnivariateChangePointDefaultHeaders; // (undocumented) @@ -238,14 +183,14 @@ export interface DetectUnivariateEntireSeries { // @public export interface DetectUnivariateEntireSeries200Response extends HttpResponse { // (undocumented) - body: UnivariateEntireDetectionResultOutput; + body: UnivariateUnivariateEntireDetectionResultOutput; // (undocumented) status: "200"; } // @public (undocumented) export interface DetectUnivariateEntireSeriesBodyParam { - body: UnivariateDetectionOptions; + body: UnivariateUnivariateDetectionOptions; } // @public (undocumented) @@ -256,7 +201,7 @@ export interface DetectUnivariateEntireSeriesDefaultHeaders { // @public (undocumented) export interface DetectUnivariateEntireSeriesDefaultResponse extends HttpResponse { // (undocumented) - body: AnomalyDetectorErrorOutput; + body: UnivariateAnomalyDetectorErrorOutput; // (undocumented) headers: RawHttpHeaders & DetectUnivariateEntireSeriesDefaultHeaders; // (undocumented) @@ -274,14 +219,14 @@ export interface DetectUnivariateLastPoint { // @public export interface DetectUnivariateLastPoint200Response extends HttpResponse { // (undocumented) - body: UnivariateLastDetectionResultOutput; + body: UnivariateUnivariateLastDetectionResultOutput; // (undocumented) status: "200"; } // @public (undocumented) export interface DetectUnivariateLastPointBodyParam { - body: UnivariateDetectionOptions; + body: UnivariateUnivariateDetectionOptions; } // @public (undocumented) @@ -292,7 +237,7 @@ export interface DetectUnivariateLastPointDefaultHeaders { // @public (undocumented) export interface DetectUnivariateLastPointDefaultResponse extends HttpResponse { // (undocumented) - body: AnomalyDetectorErrorOutput; + body: UnivariateAnomalyDetectorErrorOutput; // (undocumented) headers: RawHttpHeaders & DetectUnivariateLastPointDefaultHeaders; // (undocumented) @@ -302,30 +247,6 @@ export interface DetectUnivariateLastPointDefaultResponse extends HttpResponse { // @public (undocumented) export type DetectUnivariateLastPointParameters = DetectUnivariateLastPointBodyParam & RequestParameters; -// @public -export interface DiagnosticsInfo { - modelState?: ModelState; - variableStates?: Array; -} - -// @public -export interface DiagnosticsInfoOutput { - modelState?: ModelStateOutput; - variableStates?: Array; -} - -// @public -export interface ErrorResponse { - code: string; - message: string; -} - -// @public -export interface ErrorResponseOutput { - code: string; - message: string; -} - // @public export type GetArrayType = T extends Array ? TData : never; @@ -337,7 +258,7 @@ export interface GetMultivariateBatchDetectionResult { // @public export interface GetMultivariateBatchDetectionResult200Response extends HttpResponse { // (undocumented) - body: MultivariateDetectionResultOutput; + body: MultivariateMultivariateDetectionResultOutput; // (undocumented) status: "200"; } @@ -350,7 +271,7 @@ export interface GetMultivariateBatchDetectionResultDefaultHeaders { // @public (undocumented) export interface GetMultivariateBatchDetectionResultDefaultResponse extends HttpResponse { // (undocumented) - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; // (undocumented) headers: RawHttpHeaders & GetMultivariateBatchDetectionResultDefaultHeaders; // (undocumented) @@ -363,7 +284,7 @@ export type GetMultivariateBatchDetectionResultParameters = RequestParameters; // @public export interface GetMultivariateModel200Response extends HttpResponse { // (undocumented) - body: AnomalyDetectionModelOutput; + body: MultivariateAnomalyDetectionModelOutput; // (undocumented) status: "200"; } @@ -376,7 +297,7 @@ export interface GetMultivariateModelDefaultHeaders { // @public (undocumented) export interface GetMultivariateModelDefaultResponse extends HttpResponse { // (undocumented) - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; // (undocumented) headers: RawHttpHeaders & GetMultivariateModelDefaultHeaders; // (undocumented) @@ -425,7 +346,7 @@ export function isUnexpected(response: DetectMultivariateLastAnomaly200Response // @public export interface ListMultivariateModels200Response extends HttpResponse { // (undocumented) - body: ModelListOutput; + body: MultivariateModelListOutput; // (undocumented) status: "200"; } @@ -438,7 +359,7 @@ export interface ListMultivariateModelsDefaultHeaders { // @public (undocumented) export interface ListMultivariateModelsDefaultResponse extends HttpResponse { // (undocumented) - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; // (undocumented) headers: RawHttpHeaders & ListMultivariateModelsDefaultHeaders; // (undocumented) @@ -461,11 +382,84 @@ export interface ListMultivariateModelsQueryParamProperties { } // @public -export interface ModelInfo { - alignPolicy?: AlignPolicy; +export interface MultivariateAlignPolicy { + alignMode?: "Inner" | "Outer"; + fillNAMethod?: string; + paddingValue?: number; +} + +// @public +export interface MultivariateAlignPolicyOutput { + alignMode?: "Inner" | "Outer"; + fillNAMethod?: string; + paddingValue?: number; +} + +// @public +export interface MultivariateAnomalyDetectionModelOutput { + createdTime: string; + lastUpdatedTime: string; + readonly modelId: string; + modelInfo?: MultivariateModelInfoOutput; +} + +// @public +export interface MultivariateAnomalyInterpretationOutput { + contributionScore?: number; + correlationChanges?: MultivariateCorrelationChangesOutput; + variable?: string; +} + +// @public +export interface MultivariateAnomalyStateOutput { + errors?: Array; + timestamp: string; + value?: MultivariateAnomalyValueOutput; +} + +// @public +export interface MultivariateAnomalyValueOutput { + interpretation?: Array; + isAnomaly: boolean; + score: number; + severity: number; +} + +// @public +export interface MultivariateCorrelationChangesOutput { + changedVariables?: string[]; +} + +// @public +export interface MultivariateDiagnosticsInfo { + modelState?: MultivariateModelState; + variableStates?: Array; +} + +// @public +export interface MultivariateDiagnosticsInfoOutput { + modelState?: MultivariateModelStateOutput; + variableStates?: Array; +} + +// @public +export interface MultivariateErrorResponse { + code: string; + message: string; +} + +// @public +export interface MultivariateErrorResponseOutput { + code: string; + message: string; +} + +// @public +export interface MultivariateModelInfo { + alignPolicy?: MultivariateAlignPolicy; dataSchema?: string; dataSource: string; - diagnosticsInfo?: DiagnosticsInfo; + diagnosticsInfo?: MultivariateDiagnosticsInfo; displayName?: string; endTime: Date | string; slidingWindow?: number; @@ -474,29 +468,29 @@ export interface ModelInfo { } // @public -export interface ModelInfoOutput { - alignPolicy?: AlignPolicyOutput; +export interface MultivariateModelInfoOutput { + alignPolicy?: MultivariateAlignPolicyOutput; dataSchema?: string; dataSource: string; - diagnosticsInfo?: DiagnosticsInfoOutput; + diagnosticsInfo?: MultivariateDiagnosticsInfoOutput; displayName?: string; endTime: string; - readonly errors?: Array; + readonly errors?: Array; slidingWindow?: number; startTime: string; status?: "CREATED" | "RUNNING" | "READY" | "FAILED"; } // @public -export interface ModelListOutput { +export interface MultivariateModelListOutput { currentCount: number; maxCount: number; - models: Array; + models: Array; nextLink?: string; } // @public -export interface ModelState { +export interface MultivariateModelState { epochIds?: number[]; latenciesInSeconds?: number[]; trainLosses?: number[]; @@ -504,7 +498,7 @@ export interface ModelState { } // @public -export interface ModelStateOutput { +export interface MultivariateModelStateOutput { epochIds?: number[]; latenciesInSeconds?: number[]; trainLosses?: number[]; @@ -512,7 +506,7 @@ export interface ModelStateOutput { } // @public -export interface MultivariateBatchDetectionOptions { +export interface MultivariateMultivariateBatchDetectionOptions { dataSource: string; endTime: Date | string; startTime: Date | string; @@ -520,7 +514,7 @@ export interface MultivariateBatchDetectionOptions { } // @public -export interface MultivariateBatchDetectionOptionsOutput { +export interface MultivariateMultivariateBatchDetectionOptionsOutput { dataSource: string; endTime: string; startTime: string; @@ -528,30 +522,55 @@ export interface MultivariateBatchDetectionOptionsOutput { } // @public -export interface MultivariateBatchDetectionResultSummaryOutput { - errors?: Array; - setupInfo: MultivariateBatchDetectionOptionsOutput; +export interface MultivariateMultivariateBatchDetectionResultSummaryOutput { + errors?: Array; + setupInfo: MultivariateMultivariateBatchDetectionOptionsOutput; status: "CREATED" | "RUNNING" | "READY" | "FAILED"; - variableStates?: Array; + variableStates?: Array; } // @public -export interface MultivariateDetectionResultOutput { +export interface MultivariateMultivariateDetectionResultOutput { readonly resultId: string; - results: Array; - summary: MultivariateBatchDetectionResultSummaryOutput; + results: Array; + summary: MultivariateMultivariateBatchDetectionResultSummaryOutput; } // @public -export interface MultivariateLastDetectionOptions { +export interface MultivariateMultivariateLastDetectionOptions { topContributorCount: number; - variables: Array; + variables: Array; } // @public -export interface MultivariateLastDetectionResultOutput { - results?: Array; - variableStates?: Array; +export interface MultivariateMultivariateLastDetectionResultOutput { + results?: Array; + variableStates?: Array; +} + +// @public +export interface MultivariateVariableState { + effectiveCount?: number; + filledNARatio?: number; + firstTimestamp?: Date | string; + lastTimestamp?: Date | string; + variable?: string; +} + +// @public +export interface MultivariateVariableStateOutput { + effectiveCount?: number; + filledNARatio?: number; + firstTimestamp?: string; + lastTimestamp?: string; + variable?: string; +} + +// @public +export interface MultivariateVariableValues { + timestamps: string[]; + values: number[]; + variable: string; } // @public @@ -585,12 +604,6 @@ export interface Routes { (path: "/multivariate/models/{modelId}:detect-last", modelId: string): DetectMultivariateLastAnomaly; } -// @public -export interface TimeSeriesPoint { - timestamp?: Date | string; - value: number; -} - // @public (undocumented) export interface TrainMultivariateModel { get(options?: ListMultivariateModelsParameters): StreamableMethod; @@ -605,7 +618,7 @@ export interface TrainMultivariateModel201Headers { // @public export interface TrainMultivariateModel201Response extends HttpResponse { // (undocumented) - body: AnomalyDetectionModelOutput; + body: MultivariateAnomalyDetectionModelOutput; // (undocumented) headers: RawHttpHeaders & TrainMultivariateModel201Headers; // (undocumented) @@ -614,7 +627,7 @@ export interface TrainMultivariateModel201Response extends HttpResponse { // @public (undocumented) export interface TrainMultivariateModelBodyParam { - body: ModelInfo; + body: MultivariateModelInfo; } // @public (undocumented) @@ -625,7 +638,7 @@ export interface TrainMultivariateModelDefaultHeaders { // @public (undocumented) export interface TrainMultivariateModelDefaultResponse extends HttpResponse { // (undocumented) - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; // (undocumented) headers: RawHttpHeaders & TrainMultivariateModelDefaultHeaders; // (undocumented) @@ -636,24 +649,36 @@ export interface TrainMultivariateModelDefaultResponse extends HttpResponse { export type TrainMultivariateModelParameters = TrainMultivariateModelBodyParam & RequestParameters; // @public -export interface UnivariateChangePointDetectionOptions { +export interface UnivariateAnomalyDetectorErrorOutput { + code?: string; + message?: string; +} + +// @public +export interface UnivariateTimeSeriesPoint { + timestamp?: Date | string; + value: number; +} + +// @public +export interface UnivariateUnivariateChangePointDetectionOptions { customInterval?: number; granularity: "yearly" | "monthly" | "weekly" | "daily" | "hourly" | "minutely" | "secondly" | "microsecond" | "none"; period?: number; - series: Array; + series: Array; stableTrendWindow?: number; threshold?: number; } // @public -export interface UnivariateChangePointDetectionResultOutput { +export interface UnivariateUnivariateChangePointDetectionResultOutput { confidenceScores?: number[]; isChangePoint?: boolean[]; readonly period?: number; } // @public -export interface UnivariateDetectionOptions { +export interface UnivariateUnivariateDetectionOptions { customInterval?: number; granularity?: "yearly" | "monthly" | "weekly" | "daily" | "hourly" | "minutely" | "secondly" | "microsecond" | "none"; imputeFixedValue?: number; @@ -661,11 +686,11 @@ export interface UnivariateDetectionOptions { maxAnomalyRatio?: number; period?: number; sensitivity?: number; - series: Array; + series: Array; } // @public -export interface UnivariateEntireDetectionResultOutput { +export interface UnivariateUnivariateEntireDetectionResultOutput { expectedValues: number[]; isAnomaly: boolean[]; isNegativeAnomaly: boolean[]; @@ -677,7 +702,7 @@ export interface UnivariateEntireDetectionResultOutput { } // @public -export interface UnivariateLastDetectionResultOutput { +export interface UnivariateUnivariateLastDetectionResultOutput { expectedValue: number; isAnomaly: boolean; isNegativeAnomaly: boolean; @@ -689,31 +714,6 @@ export interface UnivariateLastDetectionResultOutput { upperMargin: number; } -// @public -export interface VariableState { - effectiveCount?: number; - filledNARatio?: number; - firstTimestamp?: Date | string; - lastTimestamp?: Date | string; - variable?: string; -} - -// @public -export interface VariableStateOutput { - effectiveCount?: number; - filledNARatio?: number; - firstTimestamp?: string; - lastTimestamp?: string; - variable?: string; -} - -// @public -export interface VariableValues { - timestamps: string[]; - values: number[]; - variable: string; -} - // (No @packageDocumentation comment for this package) ``` diff --git a/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/models.ts b/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/models.ts index dc9d9ad378..7da007b015 100644 --- a/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/models.ts +++ b/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/models.ts @@ -2,14 +2,14 @@ // Licensed under the MIT license. /** The request of entire or last anomaly detection. */ -export interface UnivariateDetectionOptions { +export interface UnivariateUnivariateDetectionOptions { /** * Time series data points. Points should be sorted by timestamp in ascending * order to match the anomaly detection result. If the data is not sorted * correctly or there is duplicated timestamp, the API will not work. In such * case, an error message will be returned. */ - series: Array; + series: Array; /** * Optional argument, can be one of yearly, monthly, weekly, daily, hourly, * minutely, secondly, microsecond or none. If granularity is not present, it will @@ -60,7 +60,7 @@ export interface UnivariateDetectionOptions { } /** The definition of input timeseries points. */ -export interface TimeSeriesPoint { +export interface UnivariateTimeSeriesPoint { /** Optional argument, timestamp of a data point (ISO8601 format). */ timestamp?: Date | string; /** The measurement of that point, should be float. */ @@ -68,12 +68,12 @@ export interface TimeSeriesPoint { } /** The request of change point detection. */ -export interface UnivariateChangePointDetectionOptions { +export interface UnivariateUnivariateChangePointDetectionOptions { /** * Time series data points. Points should be sorted by timestamp in ascending * order to match the change point detection result. */ - series: Array; + series: Array; /** * Can only be one of yearly, monthly, weekly, daily, hourly, minutely or * secondly. Granularity is used for verify whether input series is valid. @@ -113,7 +113,7 @@ export interface UnivariateChangePointDetectionOptions { } /** ErrorResponse contains code and message that shows the error information. */ -export interface ErrorResponse { +export interface MultivariateErrorResponse { /** The error code. */ code: string; /** The message explaining the error reported by the service. */ @@ -121,7 +121,7 @@ export interface ErrorResponse { } /** Variable Status. */ -export interface VariableState { +export interface MultivariateVariableState { /** Variable name in variable states. */ variable?: string; /** Proportion of missing values that need to be filled by fillNAMethod. */ @@ -138,7 +138,7 @@ export interface VariableState { * Detection request for batch inference. This is an asynchronous inference which * will need another API to get detection results. */ -export interface MultivariateBatchDetectionOptions { +export interface MultivariateMultivariateBatchDetectionOptions { /** * Source link to the input data to indicate an accessible Azure storage Uri, * either pointed to an Azure blob storage folder, or pointed to a CSV file in @@ -168,7 +168,7 @@ export interface MultivariateBatchDetectionOptions { * Training result of a model including its status, errors and diagnostics * information. */ -export interface ModelInfo { +export interface MultivariateModelInfo { /** * Source link to the input data to indicate an accessible Azure storage Uri, * either pointed to an Azure blob storage folder, or pointed to a CSV file in @@ -203,15 +203,15 @@ export interface ModelInfo { */ slidingWindow?: number; /** An optional field, indicating the manner to align multiple variables. */ - alignPolicy?: AlignPolicy; + alignPolicy?: MultivariateAlignPolicy; /** Model status. One of CREATED, RUNNING, READY, and FAILED. */ status?: "CREATED" | "RUNNING" | "READY" | "FAILED"; /** Diagnostics information to help inspect the states of model or variable. */ - diagnosticsInfo?: DiagnosticsInfo; + diagnosticsInfo?: MultivariateDiagnosticsInfo; } /** An optional field, indicating the manner to align multiple variables. */ -export interface AlignPolicy { +export interface MultivariateAlignPolicy { /** * An optional field, indicating how to align different variables to the same * time-range. Either Inner or Outer. @@ -229,15 +229,15 @@ export interface AlignPolicy { } /** Diagnostics information to help inspect the states of model or variable. */ -export interface DiagnosticsInfo { +export interface MultivariateDiagnosticsInfo { /** Model status. */ - modelState?: ModelState; + modelState?: MultivariateModelState; /** Variable Status. */ - variableStates?: Array; + variableStates?: Array; } /** Model status. */ -export interface ModelState { +export interface MultivariateModelState { /** * This indicates the number of passes of the entire training dataset the * algorithm has completed. @@ -258,12 +258,12 @@ export interface ModelState { } /** Request of last detection. */ -export interface MultivariateLastDetectionOptions { +export interface MultivariateMultivariateLastDetectionOptions { /** * This contains the inference data, including the name, timestamps(ISO 8601) and * values of variables. */ - variables: Array; + variables: Array; /** * An optional field, which is used to specify the number of top contributed * variables for one anomalous timestamp in the response. The default number is @@ -273,7 +273,7 @@ export interface MultivariateLastDetectionOptions { } /** Variable values. */ -export interface VariableValues { +export interface MultivariateVariableValues { /** Variable name of last detection request. */ variable: string; /** Timestamps of last detection request */ diff --git a/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/outputModels.ts b/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/outputModels.ts index ed764cbce8..9c397a13b2 100644 --- a/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/outputModels.ts +++ b/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/outputModels.ts @@ -2,7 +2,7 @@ // Licensed under the MIT license. /** The response of entire anomaly detection. */ -export interface UnivariateEntireDetectionResultOutput { +export interface UnivariateUnivariateEntireDetectionResultOutput { /** * Frequency extracted from the series, zero means no recurrent pattern has been * found. @@ -58,7 +58,7 @@ export interface UnivariateEntireDetectionResultOutput { } /** Error information returned by the API. */ -export interface AnomalyDetectorErrorOutput { +export interface UnivariateAnomalyDetectorErrorOutput { /** * The error code. * @@ -70,7 +70,7 @@ export interface AnomalyDetectorErrorOutput { } /** The response of last anomaly detection. */ -export interface UnivariateLastDetectionResultOutput { +export interface UnivariateUnivariateLastDetectionResultOutput { /** * Frequency extracted from the series, zero means no recurrent pattern has been * found. @@ -117,7 +117,7 @@ export interface UnivariateLastDetectionResultOutput { } /** The response of change point detection. */ -export interface UnivariateChangePointDetectionResultOutput { +export interface UnivariateUnivariateChangePointDetectionResultOutput { /** * Frequency extracted from the series, zero means no recurrent pattern has been * found. @@ -134,32 +134,32 @@ export interface UnivariateChangePointDetectionResultOutput { } /** Detection results for the given resultId. */ -export interface MultivariateDetectionResultOutput { +export interface MultivariateMultivariateDetectionResultOutput { /** Result identifier, which is used to fetch the results of an inference call. */ readonly resultId: string; /** Multivariate anomaly detection status. */ - summary: MultivariateBatchDetectionResultSummaryOutput; + summary: MultivariateMultivariateBatchDetectionResultSummaryOutput; /** Detection result for each timestamp. */ - results: Array; + results: Array; } /** Multivariate anomaly detection status. */ -export interface MultivariateBatchDetectionResultSummaryOutput { +export interface MultivariateMultivariateBatchDetectionResultSummaryOutput { /** Status of detection results. One of CREATED, RUNNING, READY, and FAILED. */ status: "CREATED" | "RUNNING" | "READY" | "FAILED"; /** Error message when detection is failed. */ - errors?: Array; + errors?: Array; /** Variable Status. */ - variableStates?: Array; + variableStates?: Array; /** * Detection request for batch inference. This is an asynchronous inference which * will need another API to get detection results. */ - setupInfo: MultivariateBatchDetectionOptionsOutput; + setupInfo: MultivariateMultivariateBatchDetectionOptionsOutput; } /** ErrorResponse contains code and message that shows the error information. */ -export interface ErrorResponseOutput { +export interface MultivariateErrorResponseOutput { /** The error code. */ code: string; /** The message explaining the error reported by the service. */ @@ -167,7 +167,7 @@ export interface ErrorResponseOutput { } /** Variable Status. */ -export interface VariableStateOutput { +export interface MultivariateVariableStateOutput { /** Variable name in variable states. */ variable?: string; /** Proportion of missing values that need to be filled by fillNAMethod. */ @@ -184,7 +184,7 @@ export interface VariableStateOutput { * Detection request for batch inference. This is an asynchronous inference which * will need another API to get detection results. */ -export interface MultivariateBatchDetectionOptionsOutput { +export interface MultivariateMultivariateBatchDetectionOptionsOutput { /** * Source link to the input data to indicate an accessible Azure storage Uri, * either pointed to an Azure blob storage folder, or pointed to a CSV file in @@ -211,17 +211,17 @@ export interface MultivariateBatchDetectionOptionsOutput { } /** Anomaly status and information. */ -export interface AnomalyStateOutput { +export interface MultivariateAnomalyStateOutput { /** The timestamp for this anomaly. */ timestamp: string; /** The detailed value of this anomalous timestamp. */ - value?: AnomalyValueOutput; + value?: MultivariateAnomalyValueOutput; /** Error message for the current timestamp. */ - errors?: Array; + errors?: Array; } /** Detailed information of the anomalous timestamp. */ -export interface AnomalyValueOutput { +export interface MultivariateAnomalyValueOutput { /** True if an anomaly is detected at the current timestamp. */ isAnomaly: boolean; /** @@ -235,11 +235,11 @@ export interface AnomalyValueOutput { */ score: number; /** Interpretation of this anomalous timestamp. */ - interpretation?: Array; + interpretation?: Array; } /** Interpretation of the anomalous timestamp. */ -export interface AnomalyInterpretationOutput { +export interface MultivariateAnomalyInterpretationOutput { /** Variable. */ variable?: string; /** @@ -248,11 +248,11 @@ export interface AnomalyInterpretationOutput { */ contributionScore?: number; /** Correlation changes among the anomalous variables */ - correlationChanges?: CorrelationChangesOutput; + correlationChanges?: MultivariateCorrelationChangesOutput; } /** Correlation changes among the anomalous variables */ -export interface CorrelationChangesOutput { +export interface MultivariateCorrelationChangesOutput { /** The correlated variables that have correlation changes under an anomaly. */ changedVariables?: string[]; } @@ -261,7 +261,7 @@ export interface CorrelationChangesOutput { * Training result of a model including its status, errors and diagnostics * information. */ -export interface ModelInfoOutput { +export interface MultivariateModelInfoOutput { /** * Source link to the input data to indicate an accessible Azure storage Uri, * either pointed to an Azure blob storage folder, or pointed to a CSV file in @@ -296,17 +296,17 @@ export interface ModelInfoOutput { */ slidingWindow?: number; /** An optional field, indicating the manner to align multiple variables. */ - alignPolicy?: AlignPolicyOutput; + alignPolicy?: MultivariateAlignPolicyOutput; /** Model status. One of CREATED, RUNNING, READY, and FAILED. */ status?: "CREATED" | "RUNNING" | "READY" | "FAILED"; /** Error messages when failed to create a model. */ - readonly errors?: Array; + readonly errors?: Array; /** Diagnostics information to help inspect the states of model or variable. */ - diagnosticsInfo?: DiagnosticsInfoOutput; + diagnosticsInfo?: MultivariateDiagnosticsInfoOutput; } /** An optional field, indicating the manner to align multiple variables. */ -export interface AlignPolicyOutput { +export interface MultivariateAlignPolicyOutput { /** * An optional field, indicating how to align different variables to the same * time-range. Either Inner or Outer. @@ -324,15 +324,15 @@ export interface AlignPolicyOutput { } /** Diagnostics information to help inspect the states of model or variable. */ -export interface DiagnosticsInfoOutput { +export interface MultivariateDiagnosticsInfoOutput { /** Model status. */ - modelState?: ModelStateOutput; + modelState?: MultivariateModelStateOutput; /** Variable Status. */ - variableStates?: Array; + variableStates?: Array; } /** Model status. */ -export interface ModelStateOutput { +export interface MultivariateModelStateOutput { /** * This indicates the number of passes of the entire training dataset the * algorithm has completed. @@ -353,7 +353,7 @@ export interface ModelStateOutput { } /** Response of getting a model. */ -export interface AnomalyDetectionModelOutput { +export interface MultivariateAnomalyDetectionModelOutput { /** Model identifier. */ readonly modelId: string; /** Date and time (UTC) when the model was created. */ @@ -364,13 +364,13 @@ export interface AnomalyDetectionModelOutput { * Training result of a model including its status, errors and diagnostics * information. */ - modelInfo?: ModelInfoOutput; + modelInfo?: MultivariateModelInfoOutput; } /** Response of listing models. */ -export interface ModelListOutput { +export interface MultivariateModelListOutput { /** List of models. */ - models: Array; + models: Array; /** Number of trained multivariate models. */ currentCount: number; /** Maximum number of models that can be trained for this Anomaly Detector resource. */ @@ -380,9 +380,9 @@ export interface ModelListOutput { } /** Results of last detection. */ -export interface MultivariateLastDetectionResultOutput { +export interface MultivariateMultivariateLastDetectionResultOutput { /** Variable Status. */ - variableStates?: Array; + variableStates?: Array; /** Anomaly status and information. */ - results?: Array; + results?: Array; } diff --git a/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/parameters.ts b/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/parameters.ts index 05c290ed4c..adc44ac304 100644 --- a/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/parameters.ts +++ b/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/parameters.ts @@ -3,16 +3,16 @@ import { RequestParameters } from "@azure-rest/core-client"; import { - UnivariateDetectionOptions, - UnivariateChangePointDetectionOptions, - ModelInfo, - MultivariateBatchDetectionOptions, - MultivariateLastDetectionOptions, + UnivariateUnivariateDetectionOptions, + UnivariateUnivariateChangePointDetectionOptions, + MultivariateModelInfo, + MultivariateMultivariateBatchDetectionOptions, + MultivariateMultivariateLastDetectionOptions, } from "./models"; export interface DetectUnivariateEntireSeriesBodyParam { /** Method of univariate anomaly detection. */ - body: UnivariateDetectionOptions; + body: UnivariateUnivariateDetectionOptions; } export type DetectUnivariateEntireSeriesParameters = @@ -20,7 +20,7 @@ export type DetectUnivariateEntireSeriesParameters = export interface DetectUnivariateLastPointBodyParam { /** Method of univariate anomaly detection. */ - body: UnivariateDetectionOptions; + body: UnivariateUnivariateDetectionOptions; } export type DetectUnivariateLastPointParameters = @@ -28,7 +28,7 @@ export type DetectUnivariateLastPointParameters = export interface DetectUnivariateChangePointBodyParam { /** Method of univariate anomaly detection. */ - body: UnivariateChangePointDetectionOptions; + body: UnivariateUnivariateChangePointDetectionOptions; } export type DetectUnivariateChangePointParameters = @@ -37,7 +37,7 @@ export type GetMultivariateBatchDetectionResultParameters = RequestParameters; export interface TrainMultivariateModelBodyParam { /** Model information. */ - body: ModelInfo; + body: MultivariateModelInfo; } export type TrainMultivariateModelParameters = TrainMultivariateModelBodyParam & @@ -61,7 +61,7 @@ export type GetMultivariateModelParameters = RequestParameters; export interface DetectMultivariateBatchAnomalyBodyParam { /** Request of multivariate anomaly detection. */ - body: MultivariateBatchDetectionOptions; + body: MultivariateMultivariateBatchDetectionOptions; } export type DetectMultivariateBatchAnomalyParameters = @@ -69,7 +69,7 @@ export type DetectMultivariateBatchAnomalyParameters = export interface DetectMultivariateLastAnomalyBodyParam { /** Request of last detection. */ - body: MultivariateLastDetectionOptions; + body: MultivariateMultivariateLastDetectionOptions; } export type DetectMultivariateLastAnomalyParameters = diff --git a/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/responses.ts b/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/responses.ts index 36b7dacfdc..4e65770593 100644 --- a/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/responses.ts +++ b/packages/typespec-test/test/anomalyDetector/generated/typespec-ts/src/responses.ts @@ -4,21 +4,21 @@ import { RawHttpHeaders } from "@azure/core-rest-pipeline"; import { HttpResponse } from "@azure-rest/core-client"; import { - UnivariateEntireDetectionResultOutput, - AnomalyDetectorErrorOutput, - UnivariateLastDetectionResultOutput, - UnivariateChangePointDetectionResultOutput, - MultivariateDetectionResultOutput, - ErrorResponseOutput, - AnomalyDetectionModelOutput, - ModelListOutput, - MultivariateLastDetectionResultOutput, + UnivariateUnivariateEntireDetectionResultOutput, + UnivariateAnomalyDetectorErrorOutput, + UnivariateUnivariateLastDetectionResultOutput, + UnivariateUnivariateChangePointDetectionResultOutput, + MultivariateMultivariateDetectionResultOutput, + MultivariateErrorResponseOutput, + MultivariateAnomalyDetectionModelOutput, + MultivariateModelListOutput, + MultivariateMultivariateLastDetectionResultOutput, } from "./outputModels"; /** The request has succeeded. */ export interface DetectUnivariateEntireSeries200Response extends HttpResponse { status: "200"; - body: UnivariateEntireDetectionResultOutput; + body: UnivariateUnivariateEntireDetectionResultOutput; } export interface DetectUnivariateEntireSeriesDefaultHeaders { @@ -29,14 +29,14 @@ export interface DetectUnivariateEntireSeriesDefaultHeaders { export interface DetectUnivariateEntireSeriesDefaultResponse extends HttpResponse { status: string; - body: AnomalyDetectorErrorOutput; + body: UnivariateAnomalyDetectorErrorOutput; headers: RawHttpHeaders & DetectUnivariateEntireSeriesDefaultHeaders; } /** The request has succeeded. */ export interface DetectUnivariateLastPoint200Response extends HttpResponse { status: "200"; - body: UnivariateLastDetectionResultOutput; + body: UnivariateUnivariateLastDetectionResultOutput; } export interface DetectUnivariateLastPointDefaultHeaders { @@ -46,14 +46,14 @@ export interface DetectUnivariateLastPointDefaultHeaders { export interface DetectUnivariateLastPointDefaultResponse extends HttpResponse { status: string; - body: AnomalyDetectorErrorOutput; + body: UnivariateAnomalyDetectorErrorOutput; headers: RawHttpHeaders & DetectUnivariateLastPointDefaultHeaders; } /** The request has succeeded. */ export interface DetectUnivariateChangePoint200Response extends HttpResponse { status: "200"; - body: UnivariateChangePointDetectionResultOutput; + body: UnivariateUnivariateChangePointDetectionResultOutput; } export interface DetectUnivariateChangePointDefaultHeaders { @@ -64,7 +64,7 @@ export interface DetectUnivariateChangePointDefaultHeaders { export interface DetectUnivariateChangePointDefaultResponse extends HttpResponse { status: string; - body: AnomalyDetectorErrorOutput; + body: UnivariateAnomalyDetectorErrorOutput; headers: RawHttpHeaders & DetectUnivariateChangePointDefaultHeaders; } @@ -72,7 +72,7 @@ export interface DetectUnivariateChangePointDefaultResponse export interface GetMultivariateBatchDetectionResult200Response extends HttpResponse { status: "200"; - body: MultivariateDetectionResultOutput; + body: MultivariateMultivariateDetectionResultOutput; } export interface GetMultivariateBatchDetectionResultDefaultHeaders { @@ -83,7 +83,7 @@ export interface GetMultivariateBatchDetectionResultDefaultHeaders { export interface GetMultivariateBatchDetectionResultDefaultResponse extends HttpResponse { status: string; - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; headers: RawHttpHeaders & GetMultivariateBatchDetectionResultDefaultHeaders; } @@ -95,7 +95,7 @@ export interface TrainMultivariateModel201Headers { /** The request has succeeded and a new resource has been created as a result. */ export interface TrainMultivariateModel201Response extends HttpResponse { status: "201"; - body: AnomalyDetectionModelOutput; + body: MultivariateAnomalyDetectionModelOutput; headers: RawHttpHeaders & TrainMultivariateModel201Headers; } @@ -106,14 +106,14 @@ export interface TrainMultivariateModelDefaultHeaders { export interface TrainMultivariateModelDefaultResponse extends HttpResponse { status: string; - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; headers: RawHttpHeaders & TrainMultivariateModelDefaultHeaders; } /** The request has succeeded. */ export interface ListMultivariateModels200Response extends HttpResponse { status: "200"; - body: ModelListOutput; + body: MultivariateModelListOutput; } export interface ListMultivariateModelsDefaultHeaders { @@ -123,7 +123,7 @@ export interface ListMultivariateModelsDefaultHeaders { export interface ListMultivariateModelsDefaultResponse extends HttpResponse { status: string; - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; headers: RawHttpHeaders & ListMultivariateModelsDefaultHeaders; } @@ -139,14 +139,14 @@ export interface DeleteMultivariateModelDefaultHeaders { export interface DeleteMultivariateModelDefaultResponse extends HttpResponse { status: string; - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; headers: RawHttpHeaders & DeleteMultivariateModelDefaultHeaders; } /** The request has succeeded. */ export interface GetMultivariateModel200Response extends HttpResponse { status: "200"; - body: AnomalyDetectionModelOutput; + body: MultivariateAnomalyDetectionModelOutput; } export interface GetMultivariateModelDefaultHeaders { @@ -156,7 +156,7 @@ export interface GetMultivariateModelDefaultHeaders { export interface GetMultivariateModelDefaultResponse extends HttpResponse { status: string; - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; headers: RawHttpHeaders & GetMultivariateModelDefaultHeaders; } @@ -171,7 +171,7 @@ export interface DetectMultivariateBatchAnomaly202Headers { export interface DetectMultivariateBatchAnomaly202Response extends HttpResponse { status: "202"; - body: MultivariateDetectionResultOutput; + body: MultivariateMultivariateDetectionResultOutput; headers: RawHttpHeaders & DetectMultivariateBatchAnomaly202Headers; } @@ -183,14 +183,14 @@ export interface DetectMultivariateBatchAnomalyDefaultHeaders { export interface DetectMultivariateBatchAnomalyDefaultResponse extends HttpResponse { status: string; - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; headers: RawHttpHeaders & DetectMultivariateBatchAnomalyDefaultHeaders; } /** The request has succeeded. */ export interface DetectMultivariateLastAnomaly200Response extends HttpResponse { status: "200"; - body: MultivariateLastDetectionResultOutput; + body: MultivariateMultivariateLastDetectionResultOutput; } export interface DetectMultivariateLastAnomalyDefaultHeaders { @@ -201,6 +201,6 @@ export interface DetectMultivariateLastAnomalyDefaultHeaders { export interface DetectMultivariateLastAnomalyDefaultResponse extends HttpResponse { status: string; - body: ErrorResponseOutput; + body: MultivariateErrorResponseOutput; headers: RawHttpHeaders & DetectMultivariateLastAnomalyDefaultHeaders; } diff --git a/packages/typespec-test/test/anomalyDetector/tspconfig.yaml b/packages/typespec-test/test/anomalyDetector/tspconfig.yaml index b095d536d9..39b94f3703 100644 --- a/packages/typespec-test/test/anomalyDetector/tspconfig.yaml +++ b/packages/typespec-test/test/anomalyDetector/tspconfig.yaml @@ -7,6 +7,7 @@ options: generateTest: true generateSample: true azureSdkForJs: false + enableModelNamespace: true "emitter-output-dir": "{project-root}/generated/typespec-ts" packageDetails: name: "@msinternal/ai-anomaly-detector" diff --git a/packages/typespec-test/test/batch_modular/tspconfig.yaml b/packages/typespec-test/test/batch_modular/tspconfig.yaml index 901a17e4ba..cfc7b06238 100644 --- a/packages/typespec-test/test/batch_modular/tspconfig.yaml +++ b/packages/typespec-test/test/batch_modular/tspconfig.yaml @@ -7,6 +7,7 @@ options: generateTest: true azureSdkForJs: false isModularLibrary: true + hierarchyClient: false "emitter-output-dir": "{project-root}/generated/typespec-ts" packageDetails: name: "@azure-rest/batch" diff --git a/packages/typespec-test/test/chatApi_modular/tspconfig.yaml b/packages/typespec-test/test/chatApi_modular/tspconfig.yaml index 4e5a7fa833..36f5e2f8ec 100644 --- a/packages/typespec-test/test/chatApi_modular/tspconfig.yaml +++ b/packages/typespec-test/test/chatApi_modular/tspconfig.yaml @@ -5,5 +5,6 @@ options: azureSdkForJs: false isModularLibrary: true "emitter-output-dir": "{project-root}/generated/typespec-ts" + hierarchyClient: false packageDetails: name: "@azure/ai-chat-protocol" diff --git a/packages/typespec-test/test/contentsafety_modular/tspconfig.yaml b/packages/typespec-test/test/contentsafety_modular/tspconfig.yaml index f727765703..a5626b4357 100644 --- a/packages/typespec-test/test/contentsafety_modular/tspconfig.yaml +++ b/packages/typespec-test/test/contentsafety_modular/tspconfig.yaml @@ -7,6 +7,7 @@ options: generateTest: false azureSdkForJs: false isModularLibrary: true + hierarchyClient: false "emitter-output-dir": "{project-root}/generated/typespec-ts" packageDetails: name: "@azure-rest/ai-content-safety" diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/.eslintrc.json b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/.eslintrc.json new file mode 100644 index 0000000000..619797ac39 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/.eslintrc.json @@ -0,0 +1,11 @@ +{ + "plugins": ["@azure/azure-sdk"], + "extends": ["plugin:@azure/azure-sdk/azure-sdk-base"], + "rules": { + "@azure/azure-sdk/ts-modules-only-named": "warn", + "@azure/azure-sdk/ts-apiextractor-json-types": "warn", + "@azure/azure-sdk/ts-package-json-types": "warn", + "@azure/azure-sdk/ts-package-json-engine-is-present": "warn", + "tsdoc/syntax": "warn" + } +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/README.md b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/README.md new file mode 100644 index 0000000000..7dcb14c3e9 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/README.md @@ -0,0 +1,56 @@ +# Foo REST client library for JavaScript + +OpenAI + +**Please rely heavily on our [REST client docs](https://github.com/Azure/azure-sdk-for-js/blob/main/documentation/rest-clients.md) to use this library** + +Key links: + +- [Package (NPM)](https://www.npmjs.com/package/@msinternal/hierarchy-generic) + +## Getting started + +### Currently supported environments + +- LTS versions of Node.js + +### Prerequisites + +- You must have an [Azure subscription](https://azure.microsoft.com/free/) to use this package. + +### Install the `@msinternal/hierarchy-generic` package + +Install the Foo REST client REST client library for JavaScript with `npm`: + +```bash +npm install @msinternal/hierarchy-generic +``` + +### Create and authenticate a `FooClient` + +To use an [Azure Active Directory (AAD) token credential](https://github.com/Azure/azure-sdk-for-js/blob/main/sdk/identity/identity/samples/AzureIdentityExamples.md#authenticating-with-a-pre-fetched-access-token), +provide an instance of the desired credential type obtained from the +[@azure/identity](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/identity/identity#credentials) library. + +To authenticate with AAD, you must first `npm` install [`@azure/identity`](https://www.npmjs.com/package/@azure/identity) + +After setup, you can choose which type of [credential](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/identity/identity#credentials) from `@azure/identity` to use. +As an example, [DefaultAzureCredential](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/identity/identity#defaultazurecredential) +can be used to authenticate the client. + +Set the values of the client ID, tenant ID, and client secret of the AAD application as environment variables: +AZURE_CLIENT_ID, AZURE_TENANT_ID, AZURE_CLIENT_SECRET + +## Troubleshooting + +### Logging + +Enabling logging may help uncover useful information about failures. In order to see a log of HTTP requests and responses, set the `AZURE_LOG_LEVEL` environment variable to `info`. Alternatively, logging can be enabled at runtime by calling `setLogLevel` in the `@azure/logger`: + +```javascript +const { setLogLevel } = require("@azure/logger"); + +setLogLevel("info"); +``` + +For more detailed instructions on how to enable logs, you can look at the [@azure/logger package docs](https://github.com/Azure/azure-sdk-for-js/tree/main/sdk/core/logger). diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/api-extractor.json b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/api-extractor.json new file mode 100644 index 0000000000..e27bbf2acb --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/api-extractor.json @@ -0,0 +1,18 @@ +{ + "$schema": "https://developer.microsoft.com/json-schemas/api-extractor/v7/api-extractor.schema.json", + "mainEntryPointFilePath": "./types/src/index.d.ts", + "docModel": { "enabled": true }, + "apiReport": { "enabled": true, "reportFolder": "./review" }, + "dtsRollup": { + "enabled": true, + "untrimmedFilePath": "", + "publicTrimmedFilePath": "./types/hierarchy-generic.d.ts" + }, + "messages": { + "tsdocMessageReporting": { "default": { "logLevel": "none" } }, + "extractorMessageReporting": { + "ae-missing-release-tag": { "logLevel": "none" }, + "ae-unresolved-link": { "logLevel": "none" } + } + } +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/karma.conf.js b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/karma.conf.js new file mode 100644 index 0000000000..a9d5f1b5fc --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/karma.conf.js @@ -0,0 +1,133 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +// https://github.com/karma-runner/karma-chrome-launcher +process.env.CHROME_BIN = require("puppeteer").executablePath(); +require("dotenv").config(); +const { relativeRecordingsPath } = require("@azure-tools/test-recorder"); +process.env.RECORDINGS_RELATIVE_PATH = relativeRecordingsPath(); + +module.exports = function (config) { + config.set({ + // base path that will be used to resolve all patterns (eg. files, exclude) + basePath: "./", + + // frameworks to use + // available frameworks: https://npmjs.org/browse/keyword/karma-adapter + frameworks: ["source-map-support", "mocha"], + + plugins: [ + "karma-mocha", + "karma-mocha-reporter", + "karma-chrome-launcher", + "karma-firefox-launcher", + "karma-env-preprocessor", + "karma-coverage", + "karma-sourcemap-loader", + "karma-junit-reporter", + "karma-source-map-support", + ], + + // list of files / patterns to load in the browser + files: [ + "dist-test/index.browser.js", + { + pattern: "dist-test/index.browser.js.map", + type: "html", + included: false, + served: true, + }, + ], + + // list of files / patterns to exclude + exclude: [], + + // preprocess matching files before serving them to the browser + // available preprocessors: https://npmjs.org/browse/keyword/karma-preprocessor + preprocessors: { + "**/*.js": ["sourcemap", "env"], + // IMPORTANT: COMMENT following line if you want to debug in your browsers!! + // Preprocess source file to calculate code coverage, however this will make source file unreadable + // "dist-test/index.js": ["coverage"] + }, + + envPreprocessor: [ + "TEST_MODE", + "ENDPOINT", + "AZURE_CLIENT_SECRET", + "AZURE_CLIENT_ID", + "AZURE_TENANT_ID", + "SUBSCRIPTION_ID", + "RECORDINGS_RELATIVE_PATH", + ], + + // test results reporter to use + // possible values: 'dots', 'progress' + // available reporters: https://npmjs.org/browse/keyword/karma-reporter + reporters: ["mocha", "coverage", "junit"], + + coverageReporter: { + // specify a common output directory + dir: "coverage-browser/", + reporters: [ + { type: "json", subdir: ".", file: "coverage.json" }, + { type: "lcovonly", subdir: ".", file: "lcov.info" }, + { type: "html", subdir: "html" }, + { type: "cobertura", subdir: ".", file: "cobertura-coverage.xml" }, + ], + }, + + junitReporter: { + outputDir: "", // results will be saved as $outputDir/$browserName.xml + outputFile: "test-results.browser.xml", // if included, results will be saved as $outputDir/$browserName/$outputFile + suite: "", // suite will become the package name attribute in xml testsuite element + useBrowserName: false, // add browser name to report and classes names + nameFormatter: undefined, // function (browser, result) to customize the name attribute in xml testcase element + classNameFormatter: undefined, // function (browser, result) to customize the classname attribute in xml testcase element + properties: {}, // key value pair of properties to add to the section of the report + }, + + // web server port + port: 9876, + + // enable / disable colors in the output (reporters and logs) + colors: true, + + // level of logging + // possible values: config.LOG_DISABLE || config.LOG_ERROR || config.LOG_WARN || config.LOG_INFO || config.LOG_DEBUG + logLevel: config.LOG_INFO, + + // enable / disable watching file and executing tests whenever any file changes + autoWatch: false, + + // --no-sandbox allows our tests to run in Linux without having to change the system. + // --disable-web-security allows us to authenticate from the browser without having to write tests using interactive auth, which would be far more complex. + browsers: ["ChromeHeadlessNoSandbox"], + customLaunchers: { + ChromeHeadlessNoSandbox: { + base: "ChromeHeadless", + flags: ["--no-sandbox", "--disable-web-security"], + }, + }, + + // Continuous Integration mode + // if true, Karma captures browsers, runs the tests and exits + singleRun: false, + + // Concurrency level + // how many browser should be started simultaneous + concurrency: 1, + + browserNoActivityTimeout: 60000000, + browserDisconnectTimeout: 10000, + browserDisconnectTolerance: 3, + + client: { + mocha: { + // change Karma's debug.html to the mocha web reporter + reporter: "html", + timeout: "600000", + }, + }, + }); +}; diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/package.json b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/package.json new file mode 100644 index 0000000000..f61dd4f859 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/package.json @@ -0,0 +1,141 @@ +{ + "name": "@msinternal/hierarchy-generic", + "sdk-type": "client", + "author": "Microsoft Corporation", + "version": "1.0.0-beta.1", + "description": "OpenAI", + "keywords": ["node", "azure", "cloud", "typescript", "browser", "isomorphic"], + "license": "MIT", + "type": "module", + "main": "dist/index.js", + "module": "./dist-esm/src/index.js", + "types": "./types/hierarchy-generic.d.ts", + "exports": { + ".": { + "types": "./types/src/index.d.ts", + "require": "./dist/index.cjs", + "import": "./dist-esm/src/index.js" + }, + "./api": { + "types": "./types/src/api/index.d.ts", + "import": "./dist-esm/src/api/index.js" + }, + "./models": { + "types": "./types/src/models/index.d.ts", + "import": "./dist-esm/src/models/index.js" + }, + "./api/b": { + "types": "./types/src/api/b/index.d.ts", + "import": "./dist-esm/src/api/b/index.js" + }, + "./api/b/e/c": { + "types": "./types/src/api/b/e/c/index.d.ts", + "import": "./dist-esm/src/api/b/e/c/index.js" + }, + "./api/b/c": { + "types": "./types/src/api/b/c/index.d.ts", + "import": "./dist-esm/src/api/b/c/index.js" + }, + "./api/d": { + "types": "./types/src/api/d/index.d.ts", + "import": "./dist-esm/src/api/d/index.js" + } + }, + "repository": "github:Azure/azure-sdk-for-js", + "bugs": { "url": "https://github.com/Azure/azure-sdk-for-js/issues" }, + "files": [ + "dist/", + "dist-esm/src/", + "types/hierarchy-generic.d.ts", + "README.md", + "LICENSE", + "review/*" + ], + "engines": { "node": ">=18.0.0" }, + "scripts": { + "audit": "node ../../../common/scripts/rush-audit.js && rimraf node_modules package-lock.json && npm i --package-lock-only 2>&1 && npm audit", + "build:browser": "tsc -p . && cross-env ONLY_BROWSER=true rollup -c 2>&1", + "build:node": "tsc -p . && cross-env ONLY_NODE=true rollup -c 2>&1", + "build:samples": "echo skipped.", + "build:test": "tsc -p . && rollup -c 2>&1", + "build:debug": "echo skipped.", + "check-format": "prettier --list-different --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"*.{js,json}\" \"test/**/*.ts\"", + "clean": "rimraf --glob dist dist-browser dist-esm test-dist temp types *.tgz *.log", + "execute:samples": "echo skipped", + "extract-api": "rimraf review && mkdirp ./review && api-extractor run --local", + "format": "prettier --write --config ../../../.prettierrc.json --ignore-path ../../../.prettierignore \"src/**/*.ts\" \"*.{js,json}\" \"test/**/*.ts\"", + "generate:client": "echo skipped", + "integration-test:browser": "karma start --single-run", + "integration-test:node": "nyc mocha --require source-map-support/register.js --timeout 5000000 --full-trace \"dist-esm/test/{,!(browser)/**/}*.spec.js\"", + "integration-test": "npm run integration-test:node && npm run integration-test:browser", + "lint:fix": "eslint package.json api-extractor.json src test --ext .ts --fix --fix-type [problem,suggestion]", + "lint": "eslint package.json api-extractor.json src test --ext .ts", + "pack": "npm pack 2>&1", + "test:browser": "npm run clean && npm run build:test && npm run unit-test:browser", + "test:node": "npm run clean && npm run build:test && npm run unit-test:node", + "test": "npm run clean && npm run build:test && npm run unit-test", + "unit-test": "npm run unit-test:node && npm run unit-test:browser", + "unit-test:node": "mocha --full-trace \"test/{,!(browser)/**/}*.spec.ts\"", + "unit-test:browser": "karma start --single-run", + "build": "npm run clean && tsc && rollup -c 2>&1 && npm run minify && mkdirp ./review && npm run extract-api", + "minify": "uglifyjs -c -m --comments --source-map \"content='./dist/index.js.map'\" -o ./dist/index.min.js ./dist/index.js" + }, + "sideEffects": false, + "autoPublish": false, + "dependencies": { + "@azure/core-auth": "^1.3.0", + "@azure-rest/core-client": "^1.1.4", + "@azure/core-rest-pipeline": "^1.12.0", + "@azure/logger": "^1.0.0", + "tslib": "^2.2.0", + "@azure/core-util": "^1.4.0" + }, + "devDependencies": { + "@microsoft/api-extractor": "^7.31.1", + "autorest": "latest", + "@types/node": "^18.0.0", + "dotenv": "^16.0.0", + "eslint": "^8.0.0", + "mkdirp": "^2.1.2", + "prettier": "^2.5.1", + "rimraf": "^5.0.0", + "source-map-support": "^0.5.9", + "typescript": "~5.2.0", + "@rollup/plugin-commonjs": "^24.0.0", + "@rollup/plugin-json": "^6.0.0", + "@rollup/plugin-multi-entry": "^6.0.0", + "@rollup/plugin-node-resolve": "^13.1.3", + "rollup": "^2.66.1", + "rollup-plugin-sourcemaps": "^0.6.3", + "uglify-js": "^3.4.9", + "@azure-tools/test-credential": "^1.0.0", + "@azure/identity": "^3.3.0", + "@azure-tools/test-recorder": "^3.0.0", + "mocha": "^10.0.0", + "@types/mocha": "^10.0.0", + "mocha-junit-reporter": "^1.18.0", + "cross-env": "^7.0.2", + "@types/chai": "^4.2.8", + "chai": "^4.2.0", + "karma-chrome-launcher": "^3.0.0", + "karma-coverage": "^2.0.0", + "karma-env-preprocessor": "^0.1.1", + "karma-firefox-launcher": "^2.1.2", + "karma-junit-reporter": "^2.0.1", + "karma-mocha-reporter": "^2.2.5", + "karma-mocha": "^2.0.1", + "karma-source-map-support": "~1.4.0", + "karma-sourcemap-loader": "^0.4.0", + "karma": "^6.2.0", + "c8": "^8.0.0", + "ts-node": "^10.0.0" + }, + "browser": { + "./dist-esm/test/public/utils/env.js": "./dist-esm/test/public/utils/env.browser.js" + }, + "mocha": { + "extension": ["ts"], + "timeout": "1200000", + "loader": "ts-node/esm" + } +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/review/hierarchy-generic.api.md b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/review/hierarchy-generic.api.md new file mode 100644 index 0000000000..5002df2158 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/review/hierarchy-generic.api.md @@ -0,0 +1,99 @@ +## API Report File for "@msinternal/hierarchy-generic" + +> Do not edit this file. It is a report generated by [API Extractor](https://api-extractor.com/). + +```ts + +import { ClientOptions } from '@azure-rest/core-client'; +import { OperationOptions } from '@azure-rest/core-client'; +import { Pipeline } from '@azure/core-rest-pipeline'; + +// @public (undocumented) +export interface A { + // (undocumented) + prop1: string; +} + +// @public (undocumented) +export interface BA { + // (undocumented) + prop2: string; +} + +// @public (undocumented) +export interface BCOp1Options extends OperationOptions { +} + +// @public (undocumented) +export interface BCOperations { + // (undocumented) + op1: (body: BA, options?: BCOp1Options) => Promise; +} + +// @public (undocumented) +export interface BEA { + // (undocumented) + prop3: string; +} + +// @public (undocumented) +export interface BECOp1Options extends OperationOptions { +} + +// @public (undocumented) +export interface BECOperations { + // (undocumented) + op1: (body: BEA, options?: BECOp1Options) => Promise; +} + +// @public (undocumented) +export interface BEOperations { + // (undocumented) + c: BECOperations; +} + +// @public (undocumented) +export interface BOp1Options extends OperationOptions { +} + +// @public (undocumented) +export interface BOperations { + // (undocumented) + c: BCOperations; + // (undocumented) + e: BEOperations; + // (undocumented) + op1: (body: BA, options?: BOp1Options) => Promise; +} + +// @public (undocumented) +export interface DOp1Options extends OperationOptions { +} + +// @public (undocumented) +export interface DOperations { + // (undocumented) + op1: (body: A, options?: DOp1Options) => Promise; +} + +// @public (undocumented) +export class FooClient { + constructor(endpoint: string, options?: FooClientOptions); + readonly b: BOperations; + readonly d: DOperations; + // (undocumented) + op1(body: A, options?: Op1Options): Promise; + readonly pipeline: Pipeline; +} + +// @public (undocumented) +export interface FooClientOptions extends ClientOptions { +} + +// @public (undocumented) +export interface Op1Options extends OperationOptions { +} + +// (No @packageDocumentation comment for this package) + +``` diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/rollup.config.js b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/rollup.config.js new file mode 100644 index 0000000000..61251d7a8d --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/rollup.config.js @@ -0,0 +1,118 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import nodeResolve from "@rollup/plugin-node-resolve"; +import cjs from "@rollup/plugin-commonjs"; +import sourcemaps from "rollup-plugin-sourcemaps"; +import multiEntry from "@rollup/plugin-multi-entry"; +import json from "@rollup/plugin-json"; + +import nodeBuiltins from "builtin-modules"; + +// #region Warning Handler + +/** + * A function that can determine whether a rollup warning should be ignored. If + * the function returns `true`, then the warning will not be displayed. + */ + +function ignoreNiseSinonEval(warning) { + return ( + warning.code === "EVAL" && + warning.id && + (warning.id.includes("node_modules/nise") || + warning.id.includes("node_modules/sinon")) === true + ); +} + +function ignoreChaiCircularDependency(warning) { + return ( + warning.code === "CIRCULAR_DEPENDENCY" && + warning.importer && + warning.importer.includes("node_modules/chai") === true + ); +} + +const warningInhibitors = [ignoreChaiCircularDependency, ignoreNiseSinonEval]; + +/** + * Construct a warning handler for the shared rollup configuration + * that ignores certain warnings that are not relevant to testing. + */ +function makeOnWarnForTesting() { + return (warning, warn) => { + // If every inhibitor returns false (i.e. no inhibitors), then show the warning + if (warningInhibitors.every((inhib) => !inhib(warning))) { + warn(warning); + } + }; +} + +// #endregion + +function makeBrowserTestConfig() { + const config = { + input: { + include: ["dist-esm/test/**/*.spec.js"], + exclude: ["dist-esm/test/**/node/**"], + }, + output: { + file: `dist-test/index.browser.js`, + format: "umd", + sourcemap: true, + }, + preserveSymlinks: false, + plugins: [ + multiEntry({ exports: false }), + nodeResolve({ + mainFields: ["module", "browser"], + }), + cjs(), + json(), + sourcemaps(), + //viz({ filename: "dist-test/browser-stats.html", sourcemap: true }) + ], + onwarn: makeOnWarnForTesting(), + // Disable tree-shaking of test code. In rollup-plugin-node-resolve@5.0.0, + // rollup started respecting the "sideEffects" field in package.json. Since + // our package.json sets "sideEffects=false", this also applies to test + // code, which causes all tests to be removed by tree-shaking. + treeshake: false, + }; + + return config; +} + +const defaultConfigurationOptions = { + disableBrowserBundle: false, +}; + +export function makeConfig(pkg, options) { + options = { + ...defaultConfigurationOptions, + ...(options || {}), + }; + + const baseConfig = { + // Use the package's module field if it has one + input: pkg["module"] || "dist-esm/src/index.js", + external: [ + ...nodeBuiltins, + ...Object.keys(pkg.dependencies), + ...Object.keys(pkg.devDependencies), + ], + output: { file: "dist/index.js", format: "cjs", sourcemap: true }, + preserveSymlinks: false, + plugins: [sourcemaps(), nodeResolve()], + }; + + const config = [baseConfig]; + + if (!options.disableBrowserBundle) { + config.push(makeBrowserTestConfig()); + } + + return config; +} + +export default makeConfig(require("./package.json")); diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/FooClient.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/FooClient.ts new file mode 100644 index 0000000000..4f847016a8 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/FooClient.ts @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { Pipeline } from "@azure/core-rest-pipeline"; +import { A } from "./models/models.js"; +import { Op1Options } from "./models/options.js"; +import { getBOperations, BOperations } from "./classic/b/index.js"; +import { getDOperations, DOperations } from "./classic/d/index.js"; +import { createFoo, FooClientOptions, FooContext, op1 } from "./api/index.js"; + +export { FooClientOptions } from "./api/FooContext.js"; + +export class FooClient { + private _client: FooContext; + /** The pipeline used by this client to make requests */ + public readonly pipeline: Pipeline; + + constructor(endpoint: string, options: FooClientOptions = {}) { + this._client = createFoo(endpoint, options); + this.pipeline = this._client.pipeline; + this.b = getBOperations(this._client); + this.d = getDOperations(this._client); + } + + op1(body: A, options: Op1Options = { requestOptions: {} }): Promise { + return op1(this._client, body, options); + } + + /** The operation groups for B */ + public readonly b: BOperations; + /** The operation groups for D */ + public readonly d: DOperations; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/FooContext.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/FooContext.ts new file mode 100644 index 0000000000..672421e8b5 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/FooContext.ts @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { ClientOptions } from "@azure-rest/core-client"; +import { FooContext } from "../rest/index.js"; +import getClient from "../rest/index.js"; + +export interface FooClientOptions extends ClientOptions {} + +export { FooContext } from "../rest/index.js"; + +export function createFoo( + endpoint: string, + options: FooClientOptions = {} +): FooContext { + const clientContext = getClient(endpoint, options); + return clientContext; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/c/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/c/index.ts new file mode 100644 index 0000000000..5f57695d81 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/c/index.ts @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { BA } from "../../../models/models.js"; +import { BcOp1204Response, FooContext as Client } from "../../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { BCOp1Options } from "../../../models/options.js"; + +export function _op1Send( + context: Client, + body: BA, + options: BCOp1Options = { requestOptions: {} } +): StreamableMethod { + return context + .path("/b/c") + .post({ + ...operationOptionsToRequestParameters(options), + body: { prop2: body["prop2"] }, + }); +} + +export async function _op1Deserialize(result: BcOp1204Response): Promise { + if (result.status !== "204") { + throw result.body; + } + + return; +} + +export async function op1( + context: Client, + body: BA, + options: BCOp1Options = { requestOptions: {} } +): Promise { + const result = await _op1Send(context, body, options); + return _op1Deserialize(result); +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/e/c/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/e/c/index.ts new file mode 100644 index 0000000000..dcd769a127 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/e/c/index.ts @@ -0,0 +1,45 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { BEA } from "../../../../models/models.js"; +import { + BecOp1204Response, + FooContext as Client, +} from "../../../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { BECOp1Options } from "../../../../models/options.js"; + +export function _op1Send( + context: Client, + body: BEA, + options: BECOp1Options = { requestOptions: {} } +): StreamableMethod { + return context + .path("/b/e") + .post({ + ...operationOptionsToRequestParameters(options), + body: { prop3: body["prop3"] }, + }); +} + +export async function _op1Deserialize( + result: BecOp1204Response +): Promise { + if (result.status !== "204") { + throw result.body; + } + + return; +} + +export async function op1( + context: Client, + body: BEA, + options: BECOp1Options = { requestOptions: {} } +): Promise { + const result = await _op1Send(context, body, options); + return _op1Deserialize(result); +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/index.ts new file mode 100644 index 0000000000..3aa74d2a23 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/b/index.ts @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { BA } from "../../models/models.js"; +import { BOp1204Response, FooContext as Client } from "../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { BOp1Options } from "../../models/options.js"; + +export function _op1Send( + context: Client, + body: BA, + options: BOp1Options = { requestOptions: {} } +): StreamableMethod { + return context + .path("/b") + .post({ + ...operationOptionsToRequestParameters(options), + body: { prop2: body["prop2"] }, + }); +} + +export async function _op1Deserialize(result: BOp1204Response): Promise { + if (result.status !== "204") { + throw result.body; + } + + return; +} + +export async function op1( + context: Client, + body: BA, + options: BOp1Options = { requestOptions: {} } +): Promise { + const result = await _op1Send(context, body, options); + return _op1Deserialize(result); +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/d/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/d/index.ts new file mode 100644 index 0000000000..753f91cefc --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/d/index.ts @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { A } from "../../models/models.js"; +import { DOp1204Response, FooContext as Client } from "../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { DOp1Options } from "../../models/options.js"; + +export function _op1Send( + context: Client, + body: A, + options: DOp1Options = { requestOptions: {} } +): StreamableMethod { + return context + .path("/d") + .post({ + ...operationOptionsToRequestParameters(options), + body: { prop1: body["prop1"] }, + }); +} + +export async function _op1Deserialize(result: DOp1204Response): Promise { + if (result.status !== "204") { + throw result.body; + } + + return; +} + +export async function op1( + context: Client, + body: A, + options: DOp1Options = { requestOptions: {} } +): Promise { + const result = await _op1Send(context, body, options); + return _op1Deserialize(result); +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/index.ts new file mode 100644 index 0000000000..8a27e7596f --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { createFoo, FooClientOptions, FooContext } from "./FooContext.js"; +export { op1 } from "./operations.js"; diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/operations.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/operations.ts new file mode 100644 index 0000000000..d8a9fcb8e7 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/api/operations.ts @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { A } from "../models/models.js"; +import { FooContext as Client, Op1204Response } from "../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { Op1Options } from "../models/options.js"; + +export function _op1Send( + context: Client, + body: A, + options: Op1Options = { requestOptions: {} } +): StreamableMethod { + return context + .path("/") + .post({ + ...operationOptionsToRequestParameters(options), + body: { prop1: body["prop1"] }, + }); +} + +export async function _op1Deserialize(result: Op1204Response): Promise { + if (result.status !== "204") { + throw result.body; + } + + return; +} + +export async function op1( + context: Client, + body: A, + options: Op1Options = { requestOptions: {} } +): Promise { + const result = await _op1Send(context, body, options); + return _op1Deserialize(result); +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/c/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/c/index.ts new file mode 100644 index 0000000000..7f1ebaad08 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/c/index.ts @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { FooContext } from "../../../api/FooContext.js"; +import { BA } from "../../../models/models.js"; +import { op1 } from "../../../api/b/c/index.js"; +import { BCOp1Options } from "../../../models/options.js"; + +export interface BCOperations { + op1: (body: BA, options?: BCOp1Options) => Promise; +} + +export function getBC(context: FooContext) { + return { + op1: (body: BA, options?: BCOp1Options) => op1(context, body, options), + }; +} + +export function getBCOperations(context: FooContext): BCOperations { + return { + ...getBC(context), + }; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/e/c/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/e/c/index.ts new file mode 100644 index 0000000000..97f1f55ebc --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/e/c/index.ts @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { FooContext } from "../../../../api/FooContext.js"; +import { BEA } from "../../../../models/models.js"; +import { op1 } from "../../../../api/b/e/c/index.js"; +import { BECOp1Options } from "../../../../models/options.js"; + +export interface BECOperations { + op1: (body: BEA, options?: BECOp1Options) => Promise; +} + +export function getBEC(context: FooContext) { + return { + op1: (body: BEA, options?: BECOp1Options) => op1(context, body, options), + }; +} + +export function getBECOperations(context: FooContext): BECOperations { + return { + ...getBEC(context), + }; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/e/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/e/index.ts new file mode 100644 index 0000000000..a1c6c7f874 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/e/index.ts @@ -0,0 +1,15 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { FooContext } from "../../../api/FooContext.js"; +import { BECOperations, getBECOperations } from "./c/index.js"; + +export interface BEOperations { + c: BECOperations; +} + +export function getBEOperations(context: FooContext): BEOperations { + return { + c: getBECOperations(context), + }; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/index.ts new file mode 100644 index 0000000000..4bf0686286 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/b/index.ts @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { FooContext } from "../../api/FooContext.js"; +import { BA } from "../../models/models.js"; +import { op1 } from "../../api/b/index.js"; +import { BOp1Options } from "../../models/options.js"; +import { BCOperations, getBCOperations } from "./c/index.js"; +import { BEOperations, getBEOperations } from "./e/index.js"; + +export interface BOperations { + op1: (body: BA, options?: BOp1Options) => Promise; + e: BEOperations; + c: BCOperations; +} + +export function getB(context: FooContext) { + return { + op1: (body: BA, options?: BOp1Options) => op1(context, body, options), + }; +} + +export function getBOperations(context: FooContext): BOperations { + return { + ...getB(context), + e: getBEOperations(context), + c: getBCOperations(context), + }; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/d/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/d/index.ts new file mode 100644 index 0000000000..848d9f5a1d --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/d/index.ts @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { FooContext } from "../../api/FooContext.js"; +import { A } from "../../models/models.js"; +import { op1 } from "../../api/d/index.js"; +import { DOp1Options } from "../../models/options.js"; + +export interface DOperations { + op1: (body: A, options?: DOp1Options) => Promise; +} + +export function getD(context: FooContext) { + return { + op1: (body: A, options?: DOp1Options) => op1(context, body, options), + }; +} + +export function getDOperations(context: FooContext): DOperations { + return { + ...getD(context), + }; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/index.ts new file mode 100644 index 0000000000..84b18b7f5c --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/classic/index.ts @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { BOperations } from "./b/index.js"; +export { DOperations } from "./d/index.js"; +export { BCOperations } from "./b/c/index.js"; +export { BEOperations } from "./b/e/index.js"; +export { BECOperations } from "./b/e/c/index.js"; diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/index.ts new file mode 100644 index 0000000000..0275fe2f92 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/index.ts @@ -0,0 +1,21 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { FooClient, FooClientOptions } from "./FooClient.js"; +export { + A, + BA, + BEA, + Op1Options, + BOp1Options, + BECOp1Options, + BCOp1Options, + DOp1Options, +} from "./models/index.js"; +export { + BOperations, + DOperations, + BCOperations, + BEOperations, + BECOperations, +} from "./classic/index.js"; diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/logger.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/logger.ts new file mode 100644 index 0000000000..e5bd48e237 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/logger.ts @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { createClientLogger } from "@azure/logger"; +export const logger = createClientLogger("hierarchy-generic"); diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/index.ts new file mode 100644 index 0000000000..fa5f0b95dd --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/index.ts @@ -0,0 +1,11 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { A, BA, BEA } from "./models.js"; +export { + Op1Options, + BOp1Options, + BECOp1Options, + BCOp1Options, + DOp1Options, +} from "./options.js"; diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/models.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/models.ts new file mode 100644 index 0000000000..06f3b30381 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/models.ts @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export interface A { + prop1: string; +} + +export interface BA { + prop2: string; +} + +export interface BEA { + prop3: string; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/options.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/options.ts new file mode 100644 index 0000000000..5a35173cfe --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/models/options.ts @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OperationOptions } from "@azure-rest/core-client"; + +export interface Op1Options extends OperationOptions {} + +export interface BOp1Options extends OperationOptions {} + +export interface BECOp1Options extends OperationOptions {} + +export interface BCOp1Options extends OperationOptions {} + +export interface DOp1Options extends OperationOptions {} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/clientDefinitions.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/clientDefinitions.ts new file mode 100644 index 0000000000..f20488a681 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/clientDefinitions.ts @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + Op1Parameters, + BOp1Parameters, + BecOp1Parameters, + BcOp1Parameters, + DOp1Parameters, +} from "./parameters.js"; +import { + Op1204Response, + BOp1204Response, + BecOp1204Response, + BcOp1204Response, + DOp1204Response, +} from "./responses.js"; +import { Client, StreamableMethod } from "@azure-rest/core-client"; + +export interface Op1 { + post(options: Op1Parameters): StreamableMethod; +} + +export interface BOp1 { + post(options: BOp1Parameters): StreamableMethod; +} + +export interface BECOp1 { + post(options: BecOp1Parameters): StreamableMethod; +} + +export interface BCOp1 { + post(options: BcOp1Parameters): StreamableMethod; +} + +export interface DOp1 { + post(options: DOp1Parameters): StreamableMethod; +} + +export interface Routes { + /** Resource for '/' has methods for the following verbs: post */ + (path: "/"): Op1; + /** Resource for '/b' has methods for the following verbs: post */ + (path: "/b"): BOp1; + /** Resource for '/b/e' has methods for the following verbs: post */ + (path: "/b/e"): BECOp1; + /** Resource for '/b/c' has methods for the following verbs: post */ + (path: "/b/c"): BCOp1; + /** Resource for '/d' has methods for the following verbs: post */ + (path: "/d"): DOp1; +} + +export type FooContext = Client & { + path: Routes; +}; diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/fooClient.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/fooClient.ts new file mode 100644 index 0000000000..5daabf9b8b --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/fooClient.ts @@ -0,0 +1,37 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { getClient, ClientOptions } from "@azure-rest/core-client"; +import { logger } from "../logger.js"; +import { FooContext } from "./clientDefinitions.js"; + +/** + * Initialize a new instance of `FooContext` + * @param endpoint - The parameter endpoint + * @param options - the parameter for all optional parameters + */ +export default function createClient( + endpoint: string, + options: ClientOptions = {} +): FooContext { + const baseUrl = options.baseUrl ?? `${endpoint}`; + + const userAgentInfo = `azsdk-js-hierarchy-generic-rest/1.0.0-beta.1`; + const userAgentPrefix = + options.userAgentOptions && options.userAgentOptions.userAgentPrefix + ? `${options.userAgentOptions.userAgentPrefix} ${userAgentInfo}` + : `${userAgentInfo}`; + options = { + ...options, + userAgentOptions: { + userAgentPrefix, + }, + loggingOptions: { + logger: options.loggingOptions?.logger ?? logger.info, + }, + }; + + const client = getClient(baseUrl, options) as FooContext; + + return client; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/index.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/index.ts new file mode 100644 index 0000000000..6763226d1d --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/index.ts @@ -0,0 +1,12 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import FooClient from "./fooClient.js"; + +export * from "./fooClient.js"; +export * from "./parameters.js"; +export * from "./responses.js"; +export * from "./clientDefinitions.js"; +export * from "./models.js"; + +export default FooClient; diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/models.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/models.ts new file mode 100644 index 0000000000..c4d8cd39aa --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/models.ts @@ -0,0 +1,14 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export interface A { + prop1: string; +} + +export interface Ba { + prop2: string; +} + +export interface Bea { + prop3: string; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/parameters.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/parameters.ts new file mode 100644 index 0000000000..cee60a3044 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/parameters.ts @@ -0,0 +1,35 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { RequestParameters } from "@azure-rest/core-client"; +import { A, Ba, Bea } from "./models.js"; + +export interface Op1BodyParam { + body: A; +} + +export type Op1Parameters = Op1BodyParam & RequestParameters; + +export interface BOp1BodyParam { + body: Ba; +} + +export type BOp1Parameters = BOp1BodyParam & RequestParameters; + +export interface BecOp1BodyParam { + body: Bea; +} + +export type BecOp1Parameters = BecOp1BodyParam & RequestParameters; + +export interface BcOp1BodyParam { + body: Ba; +} + +export type BcOp1Parameters = BcOp1BodyParam & RequestParameters; + +export interface DOp1BodyParam { + body: A; +} + +export type DOp1Parameters = DOp1BodyParam & RequestParameters; diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/responses.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/responses.ts new file mode 100644 index 0000000000..6874b6ff94 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/src/rest/responses.ts @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { HttpResponse } from "@azure-rest/core-client"; + +/** There is no content to send for this request, but the headers may be useful. */ +export interface Op1204Response extends HttpResponse { + status: "204"; +} + +/** There is no content to send for this request, but the headers may be useful. */ +export interface BOp1204Response extends HttpResponse { + status: "204"; +} + +/** There is no content to send for this request, but the headers may be useful. */ +export interface BecOp1204Response extends HttpResponse { + status: "204"; +} + +/** There is no content to send for this request, but the headers may be useful. */ +export interface BcOp1204Response extends HttpResponse { + status: "204"; +} + +/** There is no content to send for this request, but the headers may be useful. */ +export interface DOp1204Response extends HttpResponse { + status: "204"; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/sampleTest.spec.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/sampleTest.spec.ts new file mode 100644 index 0000000000..97b8e8a02b --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/sampleTest.spec.ts @@ -0,0 +1,23 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { Recorder } from "@azure-tools/test-recorder"; +import { assert } from "chai"; +import { createRecorder } from "./utils/recordedClient.js"; +import { Context } from "mocha"; + +describe("My test", () => { + let recorder: Recorder; + + beforeEach(async function (this: Context) { + recorder = await createRecorder(this); + }); + + afterEach(async function () { + await recorder.stop(); + }); + + it("sample test", async function () { + assert.equal(1, 1); + }); +}); diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/env.browser.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/env.browser.ts new file mode 100644 index 0000000000..fd2aca680c --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/env.browser.ts @@ -0,0 +1,2 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/env.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/env.ts new file mode 100644 index 0000000000..0e06855b73 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/env.ts @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import * as dotenv from "dotenv"; + +dotenv.config(); diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/recordedClient.ts b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/recordedClient.ts new file mode 100644 index 0000000000..6cc58bc15e --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/test/public/utils/recordedClient.ts @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { Context } from "mocha"; +import { Recorder, RecorderStartOptions } from "@azure-tools/test-recorder"; +import "./env"; + +const envSetupForPlayback: Record = { + ENDPOINT: "https://endpoint", + AZURE_CLIENT_ID: "azure_client_id", + AZURE_CLIENT_SECRET: "azure_client_secret", + AZURE_TENANT_ID: "88888888-8888-8888-8888-888888888888", + SUBSCRIPTION_ID: "azure_subscription_id", +}; + +const recorderEnvSetup: RecorderStartOptions = { + envSetupForPlayback, +}; + +/** + * creates the recorder and reads the environment variables from the `.env` file. + * Should be called first in the test suite to make sure environment variables are + * read before they are being used. + */ +export async function createRecorder(context: Context): Promise { + const recorder = new Recorder(context.currentTest); + await recorder.start(recorderEnvSetup); + return recorder; +} diff --git a/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/tsconfig.json b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/tsconfig.json new file mode 100644 index 0000000000..c1c30102d9 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/generated/typespec-ts/tsconfig.json @@ -0,0 +1,27 @@ +{ + "compilerOptions": { + "target": "ES2017", + "module": "NodeNext", + "lib": ["esnext", "dom"], + "declaration": true, + "declarationMap": true, + "inlineSources": true, + "sourceMap": true, + "importHelpers": true, + "strict": true, + "alwaysStrict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitReturns": true, + "noFallthroughCasesInSwitch": true, + "forceConsistentCasingInFileNames": true, + "moduleResolution": "NodeNext", + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "outDir": "./dist-esm", + "declarationDir": "./types", + "rootDir": "." + }, + "ts-node": { "esm": true }, + "include": ["./src/**/*.ts", "./test/**/*.ts"] +} diff --git a/packages/typespec-test/test/hierarchy_generic/spec/main.tsp b/packages/typespec-test/test/hierarchy_generic/spec/main.tsp new file mode 100644 index 0000000000..472e66bf29 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/spec/main.tsp @@ -0,0 +1,39 @@ +import "@typespec/rest"; +import "@typespec/http"; + +using TypeSpec.Rest; +using TypeSpec.Http; + +@service({}) +namespace Foo; + +model A { + prop1: string; +} + +@route("b") +namespace B { + model A { + prop2: string; + } + @route("c") + interface C { + op op1(@body body: A): void; + } + @route("e") + namespace E { + model A { + prop3: string; + } + interface C { + op op1(@body body: A): void + } + } + op op1(@body body: A): void; +} + +@route("/d") +interface D { + op op1(@body body: A): void; +} +op op1(@body body: A): void; diff --git a/packages/typespec-test/test/hierarchy_generic/tspconfig.yaml b/packages/typespec-test/test/hierarchy_generic/tspconfig.yaml new file mode 100644 index 0000000000..008c5a7e19 --- /dev/null +++ b/packages/typespec-test/test/hierarchy_generic/tspconfig.yaml @@ -0,0 +1,10 @@ +emit: + - "@azure-tools/typespec-ts" +options: + "@azure-tools/typespec-ts": + azureSdkForJs: false + isModularLibrary: true + "emitter-output-dir": "{project-root}/generated/typespec-ts" + packageDetails: + name: "@msinternal/hierarchy-generic" + description: "OpenAI" diff --git a/packages/typespec-test/test/loadtesting_modular/tspconfig.yaml b/packages/typespec-test/test/loadtesting_modular/tspconfig.yaml index 76f9e8ecd8..180c5d487a 100644 --- a/packages/typespec-test/test/loadtesting_modular/tspconfig.yaml +++ b/packages/typespec-test/test/loadtesting_modular/tspconfig.yaml @@ -11,6 +11,7 @@ options: azureSdkForJs: false enableOperationGroup: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@azure/load-testing" description: This package contains Microsoft Azure LoadTestingClient client library. diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/package.json b/packages/typespec-test/test/openai_generic/generated/typespec-ts/package.json index ff6b4ffdd5..f37077ff35 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/package.json +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/package.json @@ -23,6 +23,54 @@ "./models": { "types": "./types/src/models/index.d.ts", "import": "./dist-esm/src/models/index.js" + }, + "./api/audio/transcriptions": { + "types": "./types/src/api/audio/transcriptions/index.d.ts", + "import": "./dist-esm/src/api/audio/transcriptions/index.js" + }, + "./api/audio/translations": { + "types": "./types/src/api/audio/translations/index.d.ts", + "import": "./dist-esm/src/api/audio/translations/index.js" + }, + "./api/chat/completions": { + "types": "./types/src/api/chat/completions/index.d.ts", + "import": "./dist-esm/src/api/chat/completions/index.js" + }, + "./api/fineTuning/jobs": { + "types": "./types/src/api/fineTuning/jobs/index.d.ts", + "import": "./dist-esm/src/api/fineTuning/jobs/index.js" + }, + "./api/completions": { + "types": "./types/src/api/completions/index.d.ts", + "import": "./dist-esm/src/api/completions/index.js" + }, + "./api/edits": { + "types": "./types/src/api/edits/index.d.ts", + "import": "./dist-esm/src/api/edits/index.js" + }, + "./api/embeddings": { + "types": "./types/src/api/embeddings/index.d.ts", + "import": "./dist-esm/src/api/embeddings/index.js" + }, + "./api/files": { + "types": "./types/src/api/files/index.d.ts", + "import": "./dist-esm/src/api/files/index.js" + }, + "./api/fineTunes": { + "types": "./types/src/api/fineTunes/index.d.ts", + "import": "./dist-esm/src/api/fineTunes/index.js" + }, + "./api/models": { + "types": "./types/src/api/models/index.d.ts", + "import": "./dist-esm/src/api/models/index.js" + }, + "./api/images": { + "types": "./types/src/api/images/index.d.ts", + "import": "./dist-esm/src/api/images/index.js" + }, + "./api/moderations": { + "types": "./types/src/api/moderations/index.d.ts", + "import": "./dist-esm/src/api/moderations/index.js" } }, "repository": "github:Azure/azure-sdk-for-js", diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/review/openai-generic.api.md b/packages/typespec-test/test/openai_generic/generated/typespec-ts/review/openai-generic.api.md index 9ea95689f7..6b7f08191b 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/review/openai-generic.api.md +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/review/openai-generic.api.md @@ -10,11 +10,35 @@ import { OperationOptions } from '@azure-rest/core-client'; import { Pipeline } from '@azure/core-rest-pipeline'; // @public (undocumented) -export interface CancelFineTuneOptions extends OperationOptions { +export interface AudioOperations { + // (undocumented) + transcriptions: AudioTranscriptionsOperations; + // (undocumented) + translations: AudioTranslationsOperations; +} + +// @public (undocumented) +export interface AudioTranscriptionsCreateOptions extends OperationOptions { + // (undocumented) + contentType?: string; +} + +// @public (undocumented) +export interface AudioTranscriptionsOperations { + // (undocumented) + create: (audio: CreateTranscriptionRequest, options?: AudioTranscriptionsCreateOptions) => Promise; } // @public (undocumented) -export interface CancelFineTuningJobOptions extends OperationOptions { +export interface AudioTranslationsCreateOptions extends OperationOptions { + // (undocumented) + contentType?: string; +} + +// @public (undocumented) +export interface AudioTranslationsOperations { + // (undocumented) + create: (audio: CreateTranslationRequest, options?: AudioTranslationsCreateOptions) => Promise; } // @public (undocumented) @@ -50,6 +74,32 @@ export interface ChatCompletionResponseMessage { role: "system" | "user" | "assistant" | "function"; } +// @public (undocumented) +export interface ChatCompletionsCreateOptions extends OperationOptions { +} + +// @public (undocumented) +export interface ChatCompletionsOperations { + // (undocumented) + create: (body: CreateChatCompletionRequest, options?: ChatCompletionsCreateOptions) => Promise; +} + +// @public (undocumented) +export interface ChatOperations { + // (undocumented) + completions: ChatCompletionsOperations; +} + +// @public (undocumented) +export interface CompletionsCreateOptions extends OperationOptions { +} + +// @public (undocumented) +export interface CompletionsOperations { + // (undocumented) + create: (body: CreateCompletionRequest, options?: CompletionsCreateOptions) => Promise; +} + // @public export interface CompletionUsage { completionTokens: number; @@ -57,10 +107,6 @@ export interface CompletionUsage { totalTokens: number; } -// @public (undocumented) -export interface CreateChatCompletionOptions extends OperationOptions { -} - // @public (undocumented) export interface CreateChatCompletionRequest { frequencyPenalty?: number | null; @@ -94,10 +140,6 @@ export interface CreateChatCompletionResponse { usage?: CompletionUsage; } -// @public (undocumented) -export interface CreateCompletionOptions extends OperationOptions { -} - // @public (undocumented) export interface CreateCompletionRequest { bestOf?: number | null; @@ -139,10 +181,6 @@ export interface CreateCompletionResponse { usage?: CompletionUsage; } -// @public (undocumented) -export interface CreateEditOptions extends OperationOptions { -} - // @public (undocumented) export interface CreateEditRequest { input?: string | null; @@ -166,10 +204,6 @@ export interface CreateEditResponse { usage: CompletionUsage; } -// @public (undocumented) -export interface CreateEmbeddingOptions extends OperationOptions { -} - // @public (undocumented) export interface CreateEmbeddingRequest { input: string | string[] | number[] | number[][]; @@ -189,22 +223,12 @@ export interface CreateEmbeddingResponse { }; } -// @public (undocumented) -export interface CreateFileOptions extends OperationOptions { - // (undocumented) - contentType?: string; -} - // @public (undocumented) export interface CreateFileRequest { file: Uint8Array; purpose: string; } -// @public (undocumented) -export interface CreateFineTuneOptions extends OperationOptions { -} - // @public (undocumented) export interface CreateFineTuneRequest { batchSize?: number | null; @@ -221,10 +245,6 @@ export interface CreateFineTuneRequest { validationFile?: string | null; } -// @public (undocumented) -export interface CreateFineTuningJobOptions extends OperationOptions { -} - // @public (undocumented) export interface CreateFineTuningJobRequest { hyperparameters?: { @@ -236,12 +256,6 @@ export interface CreateFineTuningJobRequest { validationFile?: string | null; } -// @public (undocumented) -export interface CreateImageEditOptions extends OperationOptions { - // (undocumented) - contentType?: string; -} - // @public (undocumented) export interface CreateImageEditRequest { image: Uint8Array; @@ -254,10 +268,6 @@ export interface CreateImageEditRequest { user?: string; } -// @public (undocumented) -export interface CreateImageOptions extends OperationOptions { -} - // @public (undocumented) export interface CreateImageRequest { n?: number | null; @@ -268,12 +278,6 @@ export interface CreateImageRequest { user?: string; } -// @public (undocumented) -export interface CreateImageVariationOptions extends OperationOptions { - // (undocumented) - contentType?: string; -} - // @public (undocumented) export interface CreateImageVariationRequest { image: Uint8Array; @@ -284,10 +288,6 @@ export interface CreateImageVariationRequest { user?: string; } -// @public (undocumented) -export interface CreateModerationOptions extends OperationOptions { -} - // @public (undocumented) export interface CreateModerationRequest { input: string | string[]; @@ -329,12 +329,6 @@ export interface CreateModerationResponse { }[]; } -// @public (undocumented) -export interface CreateTranscriptionOptions extends OperationOptions { - // (undocumented) - contentType?: string; -} - // @public (undocumented) export interface CreateTranscriptionRequest { file: Uint8Array; @@ -351,12 +345,6 @@ export interface CreateTranscriptionResponse { text: string; } -// @public (undocumented) -export interface CreateTranslationOptions extends OperationOptions { - // (undocumented) - contentType?: string; -} - // @public (undocumented) export interface CreateTranslationRequest { file: Uint8Array; @@ -372,10 +360,6 @@ export interface CreateTranslationResponse { text: string; } -// @public (undocumented) -export interface DeleteFileOptions extends OperationOptions { -} - // @public (undocumented) export interface DeleteFileResponse { // (undocumented) @@ -397,11 +381,13 @@ export interface DeleteModelResponse { } // @public (undocumented) -export interface DeleteOptions extends OperationOptions { +export interface EditsCreateOptions extends OperationOptions { } // @public (undocumented) -export interface DownloadFileOptions extends OperationOptions { +export interface EditsOperations { + // (undocumented) + create: (edit: CreateEditRequest, options?: EditsCreateOptions) => Promise; } // @public @@ -411,6 +397,16 @@ export interface Embedding { object: "embedding"; } +// @public (undocumented) +export interface EmbeddingsCreateOptions extends OperationOptions { +} + +// @public (undocumented) +export interface EmbeddingsOperations { + // (undocumented) + create: (embedding: CreateEmbeddingRequest, options?: EmbeddingsCreateOptions) => Promise; +} + // @public (undocumented) interface Error_2 { // (undocumented) @@ -424,6 +420,42 @@ interface Error_2 { } export { Error_2 as Error } +// @public (undocumented) +export interface FilesCreateOptions extends OperationOptions { + // (undocumented) + contentType?: string; +} + +// @public (undocumented) +export interface FilesDeleteOperationOptions extends OperationOptions { +} + +// @public (undocumented) +export interface FilesDownloadOptions extends OperationOptions { +} + +// @public (undocumented) +export interface FilesListOptions extends OperationOptions { +} + +// @public (undocumented) +export interface FilesOperations { + // (undocumented) + create: (file: CreateFileRequest, options?: FilesCreateOptions) => Promise; + // (undocumented) + deleteOperation: (fileId: string, options?: FilesDeleteOperationOptions) => Promise; + // (undocumented) + download: (fileId: string, options?: FilesDownloadOptions) => Promise; + // (undocumented) + list: (options?: FilesListOptions) => Promise; + // (undocumented) + retrieve: (fileId: string, options?: FilesRetrieveOptions) => Promise; +} + +// @public (undocumented) +export interface FilesRetrieveOptions extends OperationOptions { +} + // @public export interface FineTune { createdAt: Date; @@ -461,6 +493,41 @@ export interface FineTuneEvent { object: string; } +// @public (undocumented) +export interface FineTunesCancelOptions extends OperationOptions { +} + +// @public (undocumented) +export interface FineTunesCreateOptions extends OperationOptions { +} + +// @public (undocumented) +export interface FineTunesListEventsOptions extends OperationOptions { + stream?: boolean; +} + +// @public (undocumented) +export interface FineTunesListOptions extends OperationOptions { +} + +// @public (undocumented) +export interface FineTunesOperations { + // (undocumented) + cancel: (fineTuneId: string, options?: FineTunesCancelOptions) => Promise; + // (undocumented) + create: (fineTune: CreateFineTuneRequest, options?: FineTunesCreateOptions) => Promise; + // (undocumented) + list: (options?: FineTunesListOptions) => Promise; + // (undocumented) + listEvents: (fineTuneId: string, options?: FineTunesListEventsOptions) => Promise; + // (undocumented) + retrieve: (fineTuneId: string, options?: FineTunesRetrieveOptions) => Promise; +} + +// @public (undocumented) +export interface FineTunesRetrieveOptions extends OperationOptions { +} + // @public (undocumented) export interface FineTuningJob { createdAt: Date; @@ -499,6 +566,50 @@ export interface FineTuningJobEvent { object: string; } +// @public (undocumented) +export interface FineTuningJobsCancelOptions extends OperationOptions { +} + +// @public (undocumented) +export interface FineTuningJobsCreateOptions extends OperationOptions { +} + +// @public (undocumented) +export interface FineTuningJobsListEventsOptions extends OperationOptions { + after?: string; + limit?: number; +} + +// @public (undocumented) +export interface FineTuningJobsListOptions extends OperationOptions { + after?: string; + limit?: number; +} + +// @public (undocumented) +export interface FineTuningJobsOperations { + // (undocumented) + cancel: (fineTuningJobId: string, options?: FineTuningJobsCancelOptions) => Promise; + // (undocumented) + create: (job: CreateFineTuningJobRequest, options?: FineTuningJobsCreateOptions) => Promise; + // (undocumented) + list: (options?: FineTuningJobsListOptions) => Promise; + // (undocumented) + listEvents: (fineTuningJobId: string, options?: FineTuningJobsListEventsOptions) => Promise; + // (undocumented) + retrieve: (fineTuningJobId: string, options?: FineTuningJobsRetrieveOptions) => Promise; +} + +// @public (undocumented) +export interface FineTuningJobsRetrieveOptions extends OperationOptions { +} + +// @public (undocumented) +export interface FineTuningOperations { + // (undocumented) + jobs: FineTuningJobsOperations; +} + // @public interface Image_2 { b64Json?: Uint8Array; @@ -507,40 +618,53 @@ interface Image_2 { export { Image_2 as Image } // @public (undocumented) -export interface ImagesResponse { +export interface ImagesCreateEditOptions extends OperationOptions { // (undocumented) - created: Date; - // (undocumented) - data: Image_2[]; + contentType?: string; } // @public (undocumented) -export interface ListFilesOptions extends OperationOptions { +export interface ImagesCreateOptions extends OperationOptions { } // @public (undocumented) -export interface ListFilesResponse { +export interface ImagesCreateVariationOptions extends OperationOptions { // (undocumented) - data: OpenAIFile[]; + contentType?: string; +} + +// @public (undocumented) +export interface ImagesOperations { // (undocumented) - object: string; + create: (image: CreateImageRequest, options?: ImagesCreateOptions) => Promise; + // (undocumented) + createEdit: (image: CreateImageEditRequest, options?: ImagesCreateEditOptions) => Promise; + // (undocumented) + createVariation: (image: CreateImageVariationRequest, options?: ImagesCreateVariationOptions) => Promise; } // @public (undocumented) -export interface ListFineTuneEventsOptions extends OperationOptions { - stream?: boolean; +export interface ImagesResponse { + // (undocumented) + created: Date; + // (undocumented) + data: Image_2[]; } // @public (undocumented) -export interface ListFineTuneEventsResponse { +export interface ListFilesResponse { // (undocumented) - data: FineTuneEvent[]; + data: OpenAIFile[]; // (undocumented) object: string; } // @public (undocumented) -export interface ListFineTunesOptions extends OperationOptions { +export interface ListFineTuneEventsResponse { + // (undocumented) + data: FineTuneEvent[]; + // (undocumented) + object: string; } // @public (undocumented) @@ -551,12 +675,6 @@ export interface ListFineTunesResponse { object: string; } -// @public (undocumented) -export interface ListFineTuningEventsOptions extends OperationOptions { - after?: string; - limit?: number; -} - // @public (undocumented) export interface ListFineTuningJobEventsResponse { // (undocumented) @@ -565,10 +683,6 @@ export interface ListFineTuningJobEventsResponse { object: string; } -// @public (undocumented) -export interface ListModelsOptions extends OperationOptions { -} - // @public (undocumented) export interface ListModelsResponse { // (undocumented) @@ -577,12 +691,6 @@ export interface ListModelsResponse { object: string; } -// @public (undocumented) -export interface ListPaginatedFineTuningJobsOptions extends OperationOptions { - after?: string; - limit?: number; -} - // @public (undocumented) export interface ListPaginatedFineTuningJobsResponse { // (undocumented) @@ -602,63 +710,52 @@ export interface Model { } // @public (undocumented) -export class OpenAIClient { - constructor(credential: KeyCredential, options?: OpenAIClientOptions); - // (undocumented) - cancelFineTune(fineTuneId: string, options?: CancelFineTuneOptions): Promise; - // (undocumented) - cancelFineTuningJob(fineTuningJobId: string, options?: CancelFineTuningJobOptions): Promise; - // (undocumented) - createChatCompletion(body: CreateChatCompletionRequest, options?: CreateChatCompletionOptions): Promise; - // (undocumented) - createCompletion(body: CreateCompletionRequest, options?: CreateCompletionOptions): Promise; - // (undocumented) - createEdit(edit: CreateEditRequest, options?: CreateEditOptions): Promise; - // (undocumented) - createEmbedding(embedding: CreateEmbeddingRequest, options?: CreateEmbeddingOptions): Promise; - // (undocumented) - createFile(file: CreateFileRequest, options?: CreateFileOptions): Promise; - // (undocumented) - createFineTune(fineTune: CreateFineTuneRequest, options?: CreateFineTuneOptions): Promise; - createFineTuningJob(job: CreateFineTuningJobRequest, options?: CreateFineTuningJobOptions): Promise; - // (undocumented) - createImage(image: CreateImageRequest, options?: CreateImageOptions): Promise; - // (undocumented) - createImageEdit(image: CreateImageEditRequest, options?: CreateImageEditOptions): Promise; - // (undocumented) - createImageVariation(image: CreateImageVariationRequest, options?: CreateImageVariationOptions): Promise; - // (undocumented) - createModeration(content: CreateModerationRequest, options?: CreateModerationOptions): Promise; - // (undocumented) - createTranscription(audio: CreateTranscriptionRequest, options?: CreateTranscriptionOptions): Promise; - // (undocumented) - createTranslation(audio: CreateTranslationRequest, options?: CreateTranslationOptions): Promise; - // (undocumented) - deleteFile(fileId: string, options?: DeleteFileOptions): Promise; - deleteOperation(model: string, options?: DeleteOptions): Promise; - // (undocumented) - downloadFile(fileId: string, options?: DownloadFileOptions): Promise; - // (undocumented) - listFiles(options?: ListFilesOptions): Promise; - // (undocumented) - listFineTuneEvents(fineTuneId: string, options?: ListFineTuneEventsOptions): Promise; +export interface ModelsDeleteOperationOptions extends OperationOptions { +} + +// @public (undocumented) +export interface ModelsListOptions extends OperationOptions { +} + +// @public (undocumented) +export interface ModelsOperations { // (undocumented) - listFineTunes(options?: ListFineTunesOptions): Promise; + deleteOperation: (model: string, options?: ModelsDeleteOperationOptions) => Promise; // (undocumented) - listFineTuningEvents(fineTuningJobId: string, options?: ListFineTuningEventsOptions): Promise; + list: (options?: ModelsListOptions) => Promise; // (undocumented) - listModels(options?: ListModelsOptions): Promise; + retrieve: (model: string, options?: ModelsRetrieveOptions) => Promise; +} + +// @public (undocumented) +export interface ModelsRetrieveOptions extends OperationOptions { +} + +// @public (undocumented) +export interface ModerationsCreateOptions extends OperationOptions { +} + +// @public (undocumented) +export interface ModerationsOperations { // (undocumented) - listPaginatedFineTuningJobs(options?: ListPaginatedFineTuningJobsOptions): Promise; + create: (content: CreateModerationRequest, options?: ModerationsCreateOptions) => Promise; +} + +// @public (undocumented) +export class OpenAIClient { + constructor(credential: KeyCredential, options?: OpenAIClientOptions); + readonly audio: AudioOperations; + readonly chat: ChatOperations; + readonly completions: CompletionsOperations; + readonly edits: EditsOperations; + readonly embeddings: EmbeddingsOperations; + readonly files: FilesOperations; + readonly fineTunes: FineTunesOperations; + readonly fineTuning: FineTuningOperations; + readonly images: ImagesOperations; + readonly models: ModelsOperations; + readonly moderations: ModerationsOperations; readonly pipeline: Pipeline; - // (undocumented) - retrieve(model: string, options?: RetrieveOptions): Promise; - // (undocumented) - retrieveFile(fileId: string, options?: RetrieveFileOptions): Promise; - // (undocumented) - retrieveFineTune(fineTuneId: string, options?: RetrieveFineTuneOptions): Promise; - // (undocumented) - retrieveFineTuningJob(fineTuningJobId: string, options?: RetrieveFineTuningJobOptions): Promise; } // @public (undocumented) @@ -677,22 +774,6 @@ export interface OpenAIFile { statusDetails?: string | null; } -// @public (undocumented) -export interface RetrieveFileOptions extends OperationOptions { -} - -// @public (undocumented) -export interface RetrieveFineTuneOptions extends OperationOptions { -} - -// @public (undocumented) -export interface RetrieveFineTuningJobOptions extends OperationOptions { -} - -// @public (undocumented) -export interface RetrieveOptions extends OperationOptions { -} - // (No @packageDocumentation comment for this package) ``` diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/OpenAIClient.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/OpenAIClient.ts index 8fba8fed4f..6867aff1b4 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/OpenAIClient.ts +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/OpenAIClient.ts @@ -3,103 +3,42 @@ import { KeyCredential } from "@azure/core-auth"; import { Pipeline } from "@azure/core-rest-pipeline"; +import { getAudioOperations, AudioOperations } from "./classic/audio/index.js"; +import { getChatOperations, ChatOperations } from "./classic/chat/index.js"; import { - CreateTranscriptionRequest, - CreateTranscriptionResponse, - CreateTranslationRequest, - CreateTranslationResponse, - CreateChatCompletionRequest, - CreateChatCompletionResponse, - CreateFineTuningJobRequest, - FineTuningJob, - ListPaginatedFineTuningJobsResponse, - ListFineTuningJobEventsResponse, - CreateCompletionRequest, - CreateCompletionResponse, - CreateEditRequest, - CreateEditResponse, - CreateEmbeddingRequest, - CreateEmbeddingResponse, - ListFilesResponse, - OpenAIFile, - CreateFileRequest, - DeleteFileResponse, - CreateFineTuneRequest, - FineTune, - ListFineTunesResponse, - ListFineTuneEventsResponse, - ListModelsResponse, - Model, - DeleteModelResponse, - CreateImageRequest, - ImagesResponse, - CreateImageEditRequest, - CreateImageVariationRequest, - CreateModerationRequest, - CreateModerationResponse, -} from "./models/models.js"; + getFineTuningOperations, + FineTuningOperations, +} from "./classic/fineTuning/index.js"; import { - CreateTranscriptionOptions, - CreateTranslationOptions, - CreateChatCompletionOptions, - CreateFineTuningJobOptions, - ListPaginatedFineTuningJobsOptions, - RetrieveFineTuningJobOptions, - ListFineTuningEventsOptions, - CancelFineTuningJobOptions, - CreateCompletionOptions, - CreateEditOptions, - CreateEmbeddingOptions, - ListFilesOptions, - CreateFileOptions, - RetrieveFileOptions, - DeleteFileOptions, - DownloadFileOptions, - CreateFineTuneOptions, - ListFineTunesOptions, - RetrieveFineTuneOptions, - ListFineTuneEventsOptions, - CancelFineTuneOptions, - ListModelsOptions, - RetrieveOptions, - DeleteOptions, - CreateImageOptions, - CreateImageEditOptions, - CreateImageVariationOptions, - CreateModerationOptions, -} from "./models/options.js"; + getCompletionsOperations, + CompletionsOperations, +} from "./classic/completions/index.js"; +import { getEditsOperations, EditsOperations } from "./classic/edits/index.js"; +import { + getEmbeddingsOperations, + EmbeddingsOperations, +} from "./classic/embeddings/index.js"; +import { getFilesOperations, FilesOperations } from "./classic/files/index.js"; +import { + getFineTunesOperations, + FineTunesOperations, +} from "./classic/fineTunes/index.js"; +import { + getModelsOperations, + ModelsOperations, +} from "./classic/models/index.js"; +import { + getImagesOperations, + ImagesOperations, +} from "./classic/images/index.js"; +import { + getModerationsOperations, + ModerationsOperations, +} from "./classic/moderations/index.js"; import { createOpenAI, OpenAIClientOptions, OpenAIContext, - createTranscription, - createTranslation, - createChatCompletion, - createFineTuningJob, - listPaginatedFineTuningJobs, - retrieveFineTuningJob, - listFineTuningEvents, - cancelFineTuningJob, - createCompletion, - createEdit, - createEmbedding, - listFiles, - createFile, - retrieveFile, - deleteFile, - downloadFile, - createFineTune, - listFineTunes, - retrieveFineTune, - listFineTuneEvents, - cancelFineTune, - listModels, - retrieve, - deleteOperation, - createImage, - createImageEdit, - createImageVariation, - createModeration, } from "./api/index.js"; export { OpenAIClientOptions } from "./api/OpenAIContext.js"; @@ -113,209 +52,39 @@ export class OpenAIClient { constructor(credential: KeyCredential, options: OpenAIClientOptions = {}) { this._client = createOpenAI(credential, options); this.pipeline = this._client.pipeline; - } - - createTranscription( - audio: CreateTranscriptionRequest, - options: CreateTranscriptionOptions = { requestOptions: {} } - ): Promise { - return createTranscription(this._client, audio, options); - } - - createTranslation( - audio: CreateTranslationRequest, - options: CreateTranslationOptions = { requestOptions: {} } - ): Promise { - return createTranslation(this._client, audio, options); - } - - createChatCompletion( - body: CreateChatCompletionRequest, - options: CreateChatCompletionOptions = { requestOptions: {} } - ): Promise { - return createChatCompletion(this._client, body, options); - } - - /** - * Creates a job that fine-tunes a specified model from a given dataset. - * - * Response includes details of the enqueued job including job status and the name of the - * fine-tuned models once complete. - * - * [Learn more about fine-tuning](/docs/guides/fine-tuning) - */ - createFineTuningJob( - job: CreateFineTuningJobRequest, - options: CreateFineTuningJobOptions = { requestOptions: {} } - ): Promise { - return createFineTuningJob(this._client, job, options); - } - - listPaginatedFineTuningJobs( - options: ListPaginatedFineTuningJobsOptions = { requestOptions: {} } - ): Promise { - return listPaginatedFineTuningJobs(this._client, options); - } - - retrieveFineTuningJob( - fineTuningJobId: string, - options: RetrieveFineTuningJobOptions = { requestOptions: {} } - ): Promise { - return retrieveFineTuningJob(this._client, fineTuningJobId, options); - } - - listFineTuningEvents( - fineTuningJobId: string, - options: ListFineTuningEventsOptions = { requestOptions: {} } - ): Promise { - return listFineTuningEvents(this._client, fineTuningJobId, options); - } - - cancelFineTuningJob( - fineTuningJobId: string, - options: CancelFineTuningJobOptions = { requestOptions: {} } - ): Promise { - return cancelFineTuningJob(this._client, fineTuningJobId, options); - } - - createCompletion( - body: CreateCompletionRequest, - options: CreateCompletionOptions = { requestOptions: {} } - ): Promise { - return createCompletion(this._client, body, options); - } - - createEdit( - edit: CreateEditRequest, - options: CreateEditOptions = { requestOptions: {} } - ): Promise { - return createEdit(this._client, edit, options); - } - - createEmbedding( - embedding: CreateEmbeddingRequest, - options: CreateEmbeddingOptions = { requestOptions: {} } - ): Promise { - return createEmbedding(this._client, embedding, options); - } - - listFiles( - options: ListFilesOptions = { requestOptions: {} } - ): Promise { - return listFiles(this._client, options); - } - - createFile( - file: CreateFileRequest, - options: CreateFileOptions = { requestOptions: {} } - ): Promise { - return createFile(this._client, file, options); - } - - retrieveFile( - fileId: string, - options: RetrieveFileOptions = { requestOptions: {} } - ): Promise { - return retrieveFile(this._client, fileId, options); - } - - deleteFile( - fileId: string, - options: DeleteFileOptions = { requestOptions: {} } - ): Promise { - return deleteFile(this._client, fileId, options); - } - - downloadFile( - fileId: string, - options: DownloadFileOptions = { requestOptions: {} } - ): Promise { - return downloadFile(this._client, fileId, options); - } - - createFineTune( - fineTune: CreateFineTuneRequest, - options: CreateFineTuneOptions = { requestOptions: {} } - ): Promise { - return createFineTune(this._client, fineTune, options); - } - - listFineTunes( - options: ListFineTunesOptions = { requestOptions: {} } - ): Promise { - return listFineTunes(this._client, options); - } - - retrieveFineTune( - fineTuneId: string, - options: RetrieveFineTuneOptions = { requestOptions: {} } - ): Promise { - return retrieveFineTune(this._client, fineTuneId, options); - } - - listFineTuneEvents( - fineTuneId: string, - options: ListFineTuneEventsOptions = { requestOptions: {} } - ): Promise { - return listFineTuneEvents(this._client, fineTuneId, options); - } - - cancelFineTune( - fineTuneId: string, - options: CancelFineTuneOptions = { requestOptions: {} } - ): Promise { - return cancelFineTune(this._client, fineTuneId, options); - } - - listModels( - options: ListModelsOptions = { requestOptions: {} } - ): Promise { - return listModels(this._client, options); - } - - retrieve( - model: string, - options: RetrieveOptions = { requestOptions: {} } - ): Promise { - return retrieve(this._client, model, options); - } - - /** - * @fixme delete is a reserved word that cannot be used as an operation name. Please add @projectedName( - * "javascript", "") to the operation to override the generated name. - */ - deleteOperation( - model: string, - options: DeleteOptions = { requestOptions: {} } - ): Promise { - return deleteOperation(this._client, model, options); - } - - createImage( - image: CreateImageRequest, - options: CreateImageOptions = { requestOptions: {} } - ): Promise { - return createImage(this._client, image, options); - } - - createImageEdit( - image: CreateImageEditRequest, - options: CreateImageEditOptions = { requestOptions: {} } - ): Promise { - return createImageEdit(this._client, image, options); - } - - createImageVariation( - image: CreateImageVariationRequest, - options: CreateImageVariationOptions = { requestOptions: {} } - ): Promise { - return createImageVariation(this._client, image, options); - } - - createModeration( - content: CreateModerationRequest, - options: CreateModerationOptions = { requestOptions: {} } - ): Promise { - return createModeration(this._client, content, options); - } + this.audio = getAudioOperations(this._client); + this.chat = getChatOperations(this._client); + this.fineTuning = getFineTuningOperations(this._client); + this.completions = getCompletionsOperations(this._client); + this.edits = getEditsOperations(this._client); + this.embeddings = getEmbeddingsOperations(this._client); + this.files = getFilesOperations(this._client); + this.fineTunes = getFineTunesOperations(this._client); + this.models = getModelsOperations(this._client); + this.images = getImagesOperations(this._client); + this.moderations = getModerationsOperations(this._client); + } + + /** The operation groups for AudioTranscriptions */ + public readonly audio: AudioOperations; + /** The operation groups for ChatCompletions */ + public readonly chat: ChatOperations; + /** The operation groups for FineTuningJobs */ + public readonly fineTuning: FineTuningOperations; + /** The operation groups for Completions */ + public readonly completions: CompletionsOperations; + /** The operation groups for Edits */ + public readonly edits: EditsOperations; + /** The operation groups for Embeddings */ + public readonly embeddings: EmbeddingsOperations; + /** The operation groups for Files */ + public readonly files: FilesOperations; + /** The operation groups for FineTunes */ + public readonly fineTunes: FineTunesOperations; + /** The operation groups for Models */ + public readonly models: ModelsOperations; + /** The operation groups for Images */ + public readonly images: ImagesOperations; + /** The operation groups for Moderations */ + public readonly moderations: ModerationsOperations; } diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/audio/transcriptions/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/audio/transcriptions/index.ts new file mode 100644 index 0000000000..fd76d73bd8 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/audio/transcriptions/index.ts @@ -0,0 +1,65 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + CreateTranscriptionRequest, + CreateTranscriptionResponse, +} from "../../../models/models.js"; +import { + AudioTranscriptionsCreate200Response, + AudioTranscriptionsCreateDefaultResponse, + isUnexpected, + OpenAIContext as Client, +} from "../../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { AudioTranscriptionsCreateOptions } from "../../../models/options.js"; + +export function _createSend( + context: Client, + audio: CreateTranscriptionRequest, + options: AudioTranscriptionsCreateOptions = { requestOptions: {} } +): StreamableMethod< + | AudioTranscriptionsCreate200Response + | AudioTranscriptionsCreateDefaultResponse +> { + return context + .path("/audio/transcriptions") + .post({ + ...operationOptionsToRequestParameters(options), + contentType: (options.contentType as any) ?? "multipart/form-data", + body: { + file: audio["file"], + model: audio["model"], + prompt: audio["prompt"], + response_format: audio["responseFormat"], + temperature: audio["temperature"], + language: audio["language"], + }, + }); +} + +export async function _createDeserialize( + result: + | AudioTranscriptionsCreate200Response + | AudioTranscriptionsCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + text: result.body["text"], + }; +} + +export async function create( + context: Client, + audio: CreateTranscriptionRequest, + options: AudioTranscriptionsCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, audio, options); + return _createDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/audio/translations/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/audio/translations/index.ts new file mode 100644 index 0000000000..1e0ac17a33 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/audio/translations/index.ts @@ -0,0 +1,63 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + CreateTranslationRequest, + CreateTranslationResponse, +} from "../../../models/models.js"; +import { + AudioTranslationsCreate200Response, + AudioTranslationsCreateDefaultResponse, + isUnexpected, + OpenAIContext as Client, +} from "../../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { AudioTranslationsCreateOptions } from "../../../models/options.js"; + +export function _createSend( + context: Client, + audio: CreateTranslationRequest, + options: AudioTranslationsCreateOptions = { requestOptions: {} } +): StreamableMethod< + AudioTranslationsCreate200Response | AudioTranslationsCreateDefaultResponse +> { + return context + .path("/audio/translations") + .post({ + ...operationOptionsToRequestParameters(options), + contentType: (options.contentType as any) ?? "multipart/form-data", + body: { + file: audio["file"], + model: audio["model"], + prompt: audio["prompt"], + response_format: audio["responseFormat"], + temperature: audio["temperature"], + }, + }); +} + +export async function _createDeserialize( + result: + | AudioTranslationsCreate200Response + | AudioTranslationsCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + text: result.body["text"], + }; +} + +export async function create( + context: Client, + audio: CreateTranslationRequest, + options: AudioTranslationsCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, audio, options); + return _createDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/chat/completions/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/chat/completions/index.ts new file mode 100644 index 0000000000..a92399c7ff --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/chat/completions/index.ts @@ -0,0 +1,109 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + CreateChatCompletionRequest, + CreateChatCompletionResponse, +} from "../../../models/models.js"; +import { + ChatCompletionsCreate200Response, + ChatCompletionsCreateDefaultResponse, + isUnexpected, + OpenAIContext as Client, +} from "../../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { ChatCompletionsCreateOptions } from "../../../models/options.js"; + +export function _createSend( + context: Client, + body: CreateChatCompletionRequest, + options: ChatCompletionsCreateOptions = { requestOptions: {} } +): StreamableMethod< + ChatCompletionsCreate200Response | ChatCompletionsCreateDefaultResponse +> { + return context + .path("/chat/completions") + .post({ + ...operationOptionsToRequestParameters(options), + body: { + model: body["model"], + messages: (body["messages"] ?? []).map((p) => ({ + role: p["role"], + content: p["content"], + name: p["name"], + function_call: !p.functionCall + ? undefined + : { + name: p.functionCall?.["name"], + arguments: p.functionCall?.["arguments"], + }, + })), + functions: (body["functions"] ?? []).map((p) => ({ + name: p["name"], + description: p["description"], + parameters: p["parameters"], + })), + function_call: body["functionCall"], + temperature: body["temperature"], + top_p: body["topP"], + n: body["n"], + max_tokens: body["maxTokens"], + stop: body["stop"], + presence_penalty: body["presencePenalty"], + frequency_penalty: body["frequencyPenalty"], + logit_bias: body["logitBias"], + user: body["user"], + stream: body["stream"], + }, + }); +} + +export async function _createDeserialize( + result: + | ChatCompletionsCreate200Response + | ChatCompletionsCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + created: new Date(result.body["created"]), + model: result.body["model"], + choices: (result.body["choices"] ?? []).map((p) => ({ + index: p["index"], + message: { + role: p.message["role"] as any, + content: p.message["content"], + functionCall: !p.message.function_call + ? undefined + : { + name: p.message.function_call?.["name"], + arguments: p.message.function_call?.["arguments"], + }, + }, + finishReason: p["finish_reason"] as any, + })), + usage: !result.body.usage + ? undefined + : { + promptTokens: result.body.usage?.["prompt_tokens"], + completionTokens: result.body.usage?.["completion_tokens"], + totalTokens: result.body.usage?.["total_tokens"], + }, + }; +} + +export async function create( + context: Client, + body: CreateChatCompletionRequest, + options: ChatCompletionsCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, body, options); + return _createDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/completions/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/completions/index.ts new file mode 100644 index 0000000000..7da4975415 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/completions/index.ts @@ -0,0 +1,95 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + CreateCompletionRequest, + CreateCompletionResponse, +} from "../../models/models.js"; +import { + CompletionsCreate200Response, + CompletionsCreateDefaultResponse, + isUnexpected, + OpenAIContext as Client, +} from "../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { CompletionsCreateOptions } from "../../models/options.js"; + +export function _createSend( + context: Client, + body: CreateCompletionRequest, + options: CompletionsCreateOptions = { requestOptions: {} } +): StreamableMethod< + CompletionsCreate200Response | CompletionsCreateDefaultResponse +> { + return context + .path("/completions") + .post({ + ...operationOptionsToRequestParameters(options), + body: { + model: body["model"], + prompt: body["prompt"], + suffix: body["suffix"], + temperature: body["temperature"], + top_p: body["topP"], + n: body["n"], + max_tokens: body["maxTokens"], + stop: body["stop"], + presence_penalty: body["presencePenalty"], + frequency_penalty: body["frequencyPenalty"], + logit_bias: body["logitBias"], + user: body["user"], + stream: body["stream"], + logprobs: body["logprobs"], + echo: body["echo"], + best_of: body["bestOf"], + }, + }); +} + +export async function _createDeserialize( + result: CompletionsCreate200Response | CompletionsCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + created: new Date(result.body["created"]), + model: result.body["model"], + choices: (result.body["choices"] ?? []).map((p) => ({ + index: p["index"], + text: p["text"], + logprobs: + p.logprobs === null + ? null + : { + tokens: p.logprobs["tokens"], + tokenLogprobs: p.logprobs["token_logprobs"], + topLogprobs: p.logprobs["top_logprobs"], + textOffset: p.logprobs["text_offset"], + }, + finishReason: p["finish_reason"] as any, + })), + usage: !result.body.usage + ? undefined + : { + promptTokens: result.body.usage?.["prompt_tokens"], + completionTokens: result.body.usage?.["completion_tokens"], + totalTokens: result.body.usage?.["total_tokens"], + }, + }; +} + +export async function create( + context: Client, + body: CreateCompletionRequest, + options: CompletionsCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, body, options); + return _createDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/edits/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/edits/index.ts new file mode 100644 index 0000000000..10bb17509a --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/edits/index.ts @@ -0,0 +1,67 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { CreateEditRequest, CreateEditResponse } from "../../models/models.js"; +import { + EditsCreate200Response, + EditsCreateDefaultResponse, + isUnexpected, + OpenAIContext as Client, +} from "../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { EditsCreateOptions } from "../../models/options.js"; + +export function _createSend( + context: Client, + edit: CreateEditRequest, + options: EditsCreateOptions = { requestOptions: {} } +): StreamableMethod { + return context + .path("/edits") + .post({ + ...operationOptionsToRequestParameters(options), + body: { + model: edit["model"], + input: edit["input"], + instruction: edit["instruction"], + n: edit["n"], + temperature: edit["temperature"], + top_p: edit["topP"], + }, + }); +} + +export async function _createDeserialize( + result: EditsCreate200Response | EditsCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + object: result.body["object"], + created: new Date(result.body["created"]), + choices: (result.body["choices"] ?? []).map((p) => ({ + text: p["text"], + index: p["index"], + finishReason: p["finish_reason"] as any, + })), + usage: { + promptTokens: result.body.usage["prompt_tokens"], + completionTokens: result.body.usage["completion_tokens"], + totalTokens: result.body.usage["total_tokens"], + }, + }; +} + +export async function create( + context: Client, + edit: CreateEditRequest, + options: EditsCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, edit, options); + return _createDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/embeddings/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/embeddings/index.ts new file mode 100644 index 0000000000..aa698fc321 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/embeddings/index.ts @@ -0,0 +1,68 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + CreateEmbeddingRequest, + CreateEmbeddingResponse, +} from "../../models/models.js"; +import { + EmbeddingsCreate200Response, + EmbeddingsCreateDefaultResponse, + isUnexpected, + OpenAIContext as Client, +} from "../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { EmbeddingsCreateOptions } from "../../models/options.js"; + +export function _createSend( + context: Client, + embedding: CreateEmbeddingRequest, + options: EmbeddingsCreateOptions = { requestOptions: {} } +): StreamableMethod< + EmbeddingsCreate200Response | EmbeddingsCreateDefaultResponse +> { + return context + .path("/embeddings") + .post({ + ...operationOptionsToRequestParameters(options), + body: { + model: embedding["model"], + input: embedding["input"], + user: embedding["user"], + }, + }); +} + +export async function _createDeserialize( + result: EmbeddingsCreate200Response | EmbeddingsCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + object: result.body["object"], + model: result.body["model"], + data: (result.body["data"] ?? []).map((p) => ({ + index: p["index"], + object: p["object"], + embedding: p["embedding"], + })), + usage: { + promptTokens: result.body.usage["prompt_tokens"], + totalTokens: result.body.usage["total_tokens"], + }, + }; +} + +export async function create( + context: Client, + embedding: CreateEmbeddingRequest, + options: EmbeddingsCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, embedding, options); + return _createDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/files/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/files/index.ts new file mode 100644 index 0000000000..70783ce0fd --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/files/index.ts @@ -0,0 +1,217 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + ListFilesResponse, + OpenAIFile, + CreateFileRequest, + DeleteFileResponse, +} from "../../models/models.js"; +import { + FilesCreate200Response, + FilesCreateDefaultResponse, + FilesDeleteOperation200Response, + FilesDeleteOperationDefaultResponse, + FilesDownload200Response, + FilesDownloadDefaultResponse, + FilesList200Response, + FilesListDefaultResponse, + FilesRetrieve200Response, + FilesRetrieveDefaultResponse, + isUnexpected, + OpenAIContext as Client, +} from "../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { + FilesListOptions, + FilesCreateOptions, + FilesRetrieveOptions, + FilesDeleteOperationOptions, + FilesDownloadOptions, +} from "../../models/options.js"; + +export function _listSend( + context: Client, + options: FilesListOptions = { requestOptions: {} } +): StreamableMethod { + return context + .path("/files") + .get({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _listDeserialize( + result: FilesList200Response | FilesListDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + object: result.body["object"], + data: (result.body["data"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + }; +} + +export async function list( + context: Client, + options: FilesListOptions = { requestOptions: {} } +): Promise { + const result = await _listSend(context, options); + return _listDeserialize(result); +} + +export function _createSend( + context: Client, + file: CreateFileRequest, + options: FilesCreateOptions = { requestOptions: {} } +): StreamableMethod { + return context + .path("/files") + .post({ + ...operationOptionsToRequestParameters(options), + contentType: (options.contentType as any) ?? "multipart/form-data", + body: { file: file["file"], purpose: file["purpose"] }, + }); +} + +export async function _createDeserialize( + result: FilesCreate200Response | FilesCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + bytes: result.body["bytes"], + createdAt: new Date(result.body["createdAt"]), + filename: result.body["filename"], + purpose: result.body["purpose"], + status: result.body["status"] as any, + statusDetails: result.body["status_details"], + }; +} + +export async function create( + context: Client, + file: CreateFileRequest, + options: FilesCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, file, options); + return _createDeserialize(result); +} + +export function _retrieveSend( + context: Client, + fileId: string, + options: FilesRetrieveOptions = { requestOptions: {} } +): StreamableMethod { + return context + .path("/files/files/{file_id}", fileId) + .post({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _retrieveDeserialize( + result: FilesRetrieve200Response | FilesRetrieveDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + bytes: result.body["bytes"], + createdAt: new Date(result.body["createdAt"]), + filename: result.body["filename"], + purpose: result.body["purpose"], + status: result.body["status"] as any, + statusDetails: result.body["status_details"], + }; +} + +export async function retrieve( + context: Client, + fileId: string, + options: FilesRetrieveOptions = { requestOptions: {} } +): Promise { + const result = await _retrieveSend(context, fileId, options); + return _retrieveDeserialize(result); +} + +export function _deleteOperationSend( + context: Client, + fileId: string, + options: FilesDeleteOperationOptions = { requestOptions: {} } +): StreamableMethod< + FilesDeleteOperation200Response | FilesDeleteOperationDefaultResponse +> { + return context + .path("/files/files/{file_id}", fileId) + .delete({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _deleteOperationDeserialize( + result: FilesDeleteOperation200Response | FilesDeleteOperationDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + deleted: result.body["deleted"], + }; +} + +export async function deleteOperation( + context: Client, + fileId: string, + options: FilesDeleteOperationOptions = { requestOptions: {} } +): Promise { + const result = await _deleteOperationSend(context, fileId, options); + return _deleteOperationDeserialize(result); +} + +export function _downloadSend( + context: Client, + fileId: string, + options: FilesDownloadOptions = { requestOptions: {} } +): StreamableMethod { + return context + .path("/files/files/{file_id}/content", fileId) + .get({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _downloadDeserialize( + result: FilesDownload200Response | FilesDownloadDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return result.body; +} + +export async function download( + context: Client, + fileId: string, + options: FilesDownloadOptions = { requestOptions: {} } +): Promise { + const result = await _downloadSend(context, fileId, options); + return _downloadDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/fineTunes/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/fineTunes/index.ts new file mode 100644 index 0000000000..8e02d5d5ca --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/fineTunes/index.ts @@ -0,0 +1,446 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + CreateFineTuneRequest, + FineTune, + ListFineTunesResponse, + ListFineTuneEventsResponse, +} from "../../models/models.js"; +import { + FineTunesCancel200Response, + FineTunesCancelDefaultResponse, + FineTunesCreate200Response, + FineTunesCreateDefaultResponse, + FineTunesList200Response, + FineTunesListDefaultResponse, + FineTunesListEvents200Response, + FineTunesListEventsDefaultResponse, + FineTunesRetrieve200Response, + FineTunesRetrieveDefaultResponse, + isUnexpected, + OpenAIContext as Client, +} from "../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { + FineTunesCreateOptions, + FineTunesListOptions, + FineTunesRetrieveOptions, + FineTunesListEventsOptions, + FineTunesCancelOptions, +} from "../../models/options.js"; + +export function _createSend( + context: Client, + fineTune: CreateFineTuneRequest, + options: FineTunesCreateOptions = { requestOptions: {} } +): StreamableMethod< + FineTunesCreate200Response | FineTunesCreateDefaultResponse +> { + return context + .path("/fine-tunes") + .post({ + ...operationOptionsToRequestParameters(options), + body: { + training_file: fineTune["trainingFile"], + validation_file: fineTune["validationFile"], + model: fineTune["model"], + n_epochs: fineTune["nEpochs"], + batch_size: fineTune["batchSize"], + learning_rate_multiplier: fineTune["learningRateMultiplier"], + prompt_loss_rate: fineTune["promptLossRate"], + compute_classification_metrics: + fineTune["computeClassificationMetrics"], + classification_n_classes: fineTune["classificationNClasses"], + classification_positive_class: fineTune["classificationPositiveClass"], + classification_betas: fineTune["classificationBetas"], + suffix: fineTune["suffix"], + }, + }); +} + +export async function _createDeserialize( + result: FineTunesCreate200Response | FineTunesCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + createdAt: new Date(result.body["created_at"]), + updatedAt: new Date(result.body["updated_at"]), + model: result.body["model"], + fineTunedModel: result.body["fine_tuned_model"], + organizationId: result.body["organization_id"], + status: result.body["status"] as any, + hyperparams: { + nEpochs: result.body.hyperparams["n_epochs"], + batchSize: result.body.hyperparams["batch_size"], + promptLossWeight: result.body.hyperparams["prompt_loss_weight"], + learningRateMultiplier: + result.body.hyperparams["learning_rate_multiplier"], + computeClassificationMetrics: + result.body.hyperparams["compute_classification_metrics"], + classificationPositiveClass: + result.body.hyperparams["classification_positive_class"], + classificationNClasses: + result.body.hyperparams["classification_n_classes"], + }, + trainingFiles: (result.body["training_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + validationFiles: (result.body["validation_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + resultFiles: (result.body["result_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + events: (result.body["events"] ?? []).map((p) => ({ + object: p["object"], + createdAt: new Date(p["created_at"]), + level: p["level"], + message: p["message"], + })), + }; +} + +export async function create( + context: Client, + fineTune: CreateFineTuneRequest, + options: FineTunesCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, fineTune, options); + return _createDeserialize(result); +} + +export function _listSend( + context: Client, + options: FineTunesListOptions = { requestOptions: {} } +): StreamableMethod { + return context + .path("/fine-tunes") + .get({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _listDeserialize( + result: FineTunesList200Response | FineTunesListDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + object: result.body["object"], + data: (result.body["data"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + createdAt: new Date(p["created_at"]), + updatedAt: new Date(p["updated_at"]), + model: p["model"], + fineTunedModel: p["fine_tuned_model"], + organizationId: p["organization_id"], + status: p["status"] as any, + hyperparams: { + nEpochs: p.hyperparams["n_epochs"], + batchSize: p.hyperparams["batch_size"], + promptLossWeight: p.hyperparams["prompt_loss_weight"], + learningRateMultiplier: p.hyperparams["learning_rate_multiplier"], + computeClassificationMetrics: + p.hyperparams["compute_classification_metrics"], + classificationPositiveClass: + p.hyperparams["classification_positive_class"], + classificationNClasses: p.hyperparams["classification_n_classes"], + }, + trainingFiles: (p["training_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + validationFiles: (p["validation_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + resultFiles: (p["result_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + events: (p["events"] ?? []).map((p) => ({ + object: p["object"], + createdAt: new Date(p["created_at"]), + level: p["level"], + message: p["message"], + })), + })), + }; +} + +export async function list( + context: Client, + options: FineTunesListOptions = { requestOptions: {} } +): Promise { + const result = await _listSend(context, options); + return _listDeserialize(result); +} + +export function _retrieveSend( + context: Client, + fineTuneId: string, + options: FineTunesRetrieveOptions = { requestOptions: {} } +): StreamableMethod< + FineTunesRetrieve200Response | FineTunesRetrieveDefaultResponse +> { + return context + .path("/fine-tunes/{fine_tune_id}", fineTuneId) + .get({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _retrieveDeserialize( + result: FineTunesRetrieve200Response | FineTunesRetrieveDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + createdAt: new Date(result.body["created_at"]), + updatedAt: new Date(result.body["updated_at"]), + model: result.body["model"], + fineTunedModel: result.body["fine_tuned_model"], + organizationId: result.body["organization_id"], + status: result.body["status"] as any, + hyperparams: { + nEpochs: result.body.hyperparams["n_epochs"], + batchSize: result.body.hyperparams["batch_size"], + promptLossWeight: result.body.hyperparams["prompt_loss_weight"], + learningRateMultiplier: + result.body.hyperparams["learning_rate_multiplier"], + computeClassificationMetrics: + result.body.hyperparams["compute_classification_metrics"], + classificationPositiveClass: + result.body.hyperparams["classification_positive_class"], + classificationNClasses: + result.body.hyperparams["classification_n_classes"], + }, + trainingFiles: (result.body["training_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + validationFiles: (result.body["validation_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + resultFiles: (result.body["result_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + events: (result.body["events"] ?? []).map((p) => ({ + object: p["object"], + createdAt: new Date(p["created_at"]), + level: p["level"], + message: p["message"], + })), + }; +} + +export async function retrieve( + context: Client, + fineTuneId: string, + options: FineTunesRetrieveOptions = { requestOptions: {} } +): Promise { + const result = await _retrieveSend(context, fineTuneId, options); + return _retrieveDeserialize(result); +} + +export function _listEventsSend( + context: Client, + fineTuneId: string, + options: FineTunesListEventsOptions = { requestOptions: {} } +): StreamableMethod< + FineTunesListEvents200Response | FineTunesListEventsDefaultResponse +> { + return context + .path("/fine-tunes/{fine_tune_id}/events", fineTuneId) + .get({ + ...operationOptionsToRequestParameters(options), + queryParameters: { stream: options?.stream }, + }); +} + +export async function _listEventsDeserialize( + result: FineTunesListEvents200Response | FineTunesListEventsDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + object: result.body["object"], + data: (result.body["data"] ?? []).map((p) => ({ + object: p["object"], + createdAt: new Date(p["created_at"]), + level: p["level"], + message: p["message"], + })), + }; +} + +export async function listEvents( + context: Client, + fineTuneId: string, + options: FineTunesListEventsOptions = { requestOptions: {} } +): Promise { + const result = await _listEventsSend(context, fineTuneId, options); + return _listEventsDeserialize(result); +} + +export function _cancelSend( + context: Client, + fineTuneId: string, + options: FineTunesCancelOptions = { requestOptions: {} } +): StreamableMethod< + FineTunesCancel200Response | FineTunesCancelDefaultResponse +> { + return context + .path("/fine-tunes/{fine_tune_id}/cancel", fineTuneId) + .post({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _cancelDeserialize( + result: FineTunesCancel200Response | FineTunesCancelDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + createdAt: new Date(result.body["created_at"]), + updatedAt: new Date(result.body["updated_at"]), + model: result.body["model"], + fineTunedModel: result.body["fine_tuned_model"], + organizationId: result.body["organization_id"], + status: result.body["status"] as any, + hyperparams: { + nEpochs: result.body.hyperparams["n_epochs"], + batchSize: result.body.hyperparams["batch_size"], + promptLossWeight: result.body.hyperparams["prompt_loss_weight"], + learningRateMultiplier: + result.body.hyperparams["learning_rate_multiplier"], + computeClassificationMetrics: + result.body.hyperparams["compute_classification_metrics"], + classificationPositiveClass: + result.body.hyperparams["classification_positive_class"], + classificationNClasses: + result.body.hyperparams["classification_n_classes"], + }, + trainingFiles: (result.body["training_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + validationFiles: (result.body["validation_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + resultFiles: (result.body["result_files"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + bytes: p["bytes"], + createdAt: new Date(p["createdAt"]), + filename: p["filename"], + purpose: p["purpose"], + status: p["status"] as any, + statusDetails: p["status_details"], + })), + events: (result.body["events"] ?? []).map((p) => ({ + object: p["object"], + createdAt: new Date(p["created_at"]), + level: p["level"], + message: p["message"], + })), + }; +} + +export async function cancel( + context: Client, + fineTuneId: string, + options: FineTunesCancelOptions = { requestOptions: {} } +): Promise { + const result = await _cancelSend(context, fineTuneId, options); + return _cancelDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/fineTuning/jobs/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/fineTuning/jobs/index.ts new file mode 100644 index 0000000000..4abfd42de0 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/fineTuning/jobs/index.ts @@ -0,0 +1,332 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + CreateFineTuningJobRequest, + FineTuningJob, + ListPaginatedFineTuningJobsResponse, + ListFineTuningJobEventsResponse, +} from "../../../models/models.js"; +import { + FineTuningJobsCancel200Response, + FineTuningJobsCancelDefaultResponse, + FineTuningJobsCreate200Response, + FineTuningJobsCreateDefaultResponse, + FineTuningJobsList200Response, + FineTuningJobsListDefaultResponse, + FineTuningJobsListEvents200Response, + FineTuningJobsListEventsDefaultResponse, + FineTuningJobsRetrieve200Response, + FineTuningJobsRetrieveDefaultResponse, + isUnexpected, + OpenAIContext as Client, +} from "../../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { + FineTuningJobsCreateOptions, + FineTuningJobsListOptions, + FineTuningJobsRetrieveOptions, + FineTuningJobsListEventsOptions, + FineTuningJobsCancelOptions, +} from "../../../models/options.js"; + +export function _createSend( + context: Client, + job: CreateFineTuningJobRequest, + options: FineTuningJobsCreateOptions = { requestOptions: {} } +): StreamableMethod< + FineTuningJobsCreate200Response | FineTuningJobsCreateDefaultResponse +> { + return context + .path("/fine_tuning/jobs") + .post({ + ...operationOptionsToRequestParameters(options), + body: { + training_file: job["trainingFile"], + validation_file: job["validationFile"], + model: job["model"], + hyperparameters: !job.hyperparameters + ? undefined + : { n_epochs: job.hyperparameters?.["nEpochs"] }, + suffix: job["suffix"], + }, + }); +} + +export async function _createDeserialize( + result: FineTuningJobsCreate200Response | FineTuningJobsCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + createdAt: new Date(result.body["created_at"]), + finishedAt: + result.body["finished_at"] === null + ? null + : new Date(result.body["finished_at"]), + model: result.body["model"], + fineTunedModel: result.body["fine_tuned_model"], + organizationId: result.body["organization_id"], + status: result.body["status"] as any, + hyperparameters: { + nEpochs: result.body.hyperparameters["n_epochs"] as any, + }, + trainingFile: result.body["training_file"], + validationFile: result.body["validation_file"], + resultFiles: result.body["result_files"], + trainedTokens: result.body["trained_tokens"], + error: + result.body.error === null + ? null + : { + message: result.body.error["message"], + code: result.body.error["code"], + param: result.body.error["param"], + }, + }; +} + +/** + * Creates a job that fine-tunes a specified model from a given dataset. + * + * Response includes details of the enqueued job including job status and the name of the + * fine-tuned models once complete. + * + * [Learn more about fine-tuning](/docs/guides/fine-tuning) + */ +export async function create( + context: Client, + job: CreateFineTuningJobRequest, + options: FineTuningJobsCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, job, options); + return _createDeserialize(result); +} + +export function _listSend( + context: Client, + options: FineTuningJobsListOptions = { requestOptions: {} } +): StreamableMethod< + FineTuningJobsList200Response | FineTuningJobsListDefaultResponse +> { + return context + .path("/fine_tuning/jobs") + .get({ + ...operationOptionsToRequestParameters(options), + queryParameters: { after: options?.after, limit: options?.limit }, + }); +} + +export async function _listDeserialize( + result: FineTuningJobsList200Response | FineTuningJobsListDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + object: result.body["object"], + data: (result.body["data"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + createdAt: new Date(p["created_at"]), + finishedAt: p["finished_at"] === null ? null : new Date(p["finished_at"]), + model: p["model"], + fineTunedModel: p["fine_tuned_model"], + organizationId: p["organization_id"], + status: p["status"] as any, + hyperparameters: { nEpochs: p.hyperparameters["n_epochs"] as any }, + trainingFile: p["training_file"], + validationFile: p["validation_file"], + resultFiles: p["result_files"], + trainedTokens: p["trained_tokens"], + error: + p.error === null + ? null + : { + message: p.error["message"], + code: p.error["code"], + param: p.error["param"], + }, + })), + hasMore: result.body["has_more"], + }; +} + +export async function list( + context: Client, + options: FineTuningJobsListOptions = { requestOptions: {} } +): Promise { + const result = await _listSend(context, options); + return _listDeserialize(result); +} + +export function _retrieveSend( + context: Client, + fineTuningJobId: string, + options: FineTuningJobsRetrieveOptions = { requestOptions: {} } +): StreamableMethod< + FineTuningJobsRetrieve200Response | FineTuningJobsRetrieveDefaultResponse +> { + return context + .path("/fine_tuning/jobs/{fine_tuning_job_id}", fineTuningJobId) + .get({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _retrieveDeserialize( + result: + | FineTuningJobsRetrieve200Response + | FineTuningJobsRetrieveDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + createdAt: new Date(result.body["created_at"]), + finishedAt: + result.body["finished_at"] === null + ? null + : new Date(result.body["finished_at"]), + model: result.body["model"], + fineTunedModel: result.body["fine_tuned_model"], + organizationId: result.body["organization_id"], + status: result.body["status"] as any, + hyperparameters: { + nEpochs: result.body.hyperparameters["n_epochs"] as any, + }, + trainingFile: result.body["training_file"], + validationFile: result.body["validation_file"], + resultFiles: result.body["result_files"], + trainedTokens: result.body["trained_tokens"], + error: + result.body.error === null + ? null + : { + message: result.body.error["message"], + code: result.body.error["code"], + param: result.body.error["param"], + }, + }; +} + +export async function retrieve( + context: Client, + fineTuningJobId: string, + options: FineTuningJobsRetrieveOptions = { requestOptions: {} } +): Promise { + const result = await _retrieveSend(context, fineTuningJobId, options); + return _retrieveDeserialize(result); +} + +export function _listEventsSend( + context: Client, + fineTuningJobId: string, + options: FineTuningJobsListEventsOptions = { requestOptions: {} } +): StreamableMethod< + FineTuningJobsListEvents200Response | FineTuningJobsListEventsDefaultResponse +> { + return context + .path("/fine_tuning/jobs/{fine_tuning_job_id}/events", fineTuningJobId) + .get({ + ...operationOptionsToRequestParameters(options), + queryParameters: { after: options?.after, limit: options?.limit }, + }); +} + +export async function _listEventsDeserialize( + result: + | FineTuningJobsListEvents200Response + | FineTuningJobsListEventsDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + object: result.body["object"], + data: (result.body["data"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + createdAt: new Date(p["created_at"]), + level: p["level"] as any, + message: p["message"], + })), + }; +} + +export async function listEvents( + context: Client, + fineTuningJobId: string, + options: FineTuningJobsListEventsOptions = { requestOptions: {} } +): Promise { + const result = await _listEventsSend(context, fineTuningJobId, options); + return _listEventsDeserialize(result); +} + +export function _cancelSend( + context: Client, + fineTuningJobId: string, + options: FineTuningJobsCancelOptions = { requestOptions: {} } +): StreamableMethod< + FineTuningJobsCancel200Response | FineTuningJobsCancelDefaultResponse +> { + return context + .path("/fine_tuning/jobs/{fine_tuning_job_id}/cancel", fineTuningJobId) + .post({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _cancelDeserialize( + result: FineTuningJobsCancel200Response | FineTuningJobsCancelDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + createdAt: new Date(result.body["created_at"]), + finishedAt: + result.body["finished_at"] === null + ? null + : new Date(result.body["finished_at"]), + model: result.body["model"], + fineTunedModel: result.body["fine_tuned_model"], + organizationId: result.body["organization_id"], + status: result.body["status"] as any, + hyperparameters: { + nEpochs: result.body.hyperparameters["n_epochs"] as any, + }, + trainingFile: result.body["training_file"], + validationFile: result.body["validation_file"], + resultFiles: result.body["result_files"], + trainedTokens: result.body["trained_tokens"], + error: + result.body.error === null + ? null + : { + message: result.body.error["message"], + code: result.body.error["code"], + param: result.body.error["param"], + }, + }; +} + +export async function cancel( + context: Client, + fineTuningJobId: string, + options: FineTuningJobsCancelOptions = { requestOptions: {} } +): Promise { + const result = await _cancelSend(context, fineTuningJobId, options); + return _cancelDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/images/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/images/index.ts new file mode 100644 index 0000000000..8dfc04648b --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/images/index.ts @@ -0,0 +1,180 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + CreateImageRequest, + ImagesResponse, + CreateImageEditRequest, + CreateImageVariationRequest, +} from "../../models/models.js"; +import { + ImagesCreate200Response, + ImagesCreateDefaultResponse, + ImagesCreateEdit200Response, + ImagesCreateEditDefaultResponse, + ImagesCreateVariation200Response, + ImagesCreateVariationDefaultResponse, + isUnexpected, + OpenAIContext as Client, +} from "../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { stringToUint8Array } from "@azure/core-util"; +import { + ImagesCreateOptions, + ImagesCreateEditOptions, + ImagesCreateVariationOptions, +} from "../../models/options.js"; + +export function _createSend( + context: Client, + image: CreateImageRequest, + options: ImagesCreateOptions = { requestOptions: {} } +): StreamableMethod { + return context + .path("/images/generations") + .post({ + ...operationOptionsToRequestParameters(options), + body: { + prompt: image["prompt"], + n: image["n"], + size: image["size"], + response_format: image["responseFormat"], + user: image["user"], + }, + }); +} + +export async function _createDeserialize( + result: ImagesCreate200Response | ImagesCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + created: new Date(result.body["created"]), + data: (result.body["data"] ?? []).map((p) => ({ + url: p["url"], + b64Json: + typeof p["b64_json"] === "string" + ? stringToUint8Array(p["b64_json"], "base64") + : p["b64_json"], + })), + }; +} + +export async function create( + context: Client, + image: CreateImageRequest, + options: ImagesCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, image, options); + return _createDeserialize(result); +} + +export function _createEditSend( + context: Client, + image: CreateImageEditRequest, + options: ImagesCreateEditOptions = { requestOptions: {} } +): StreamableMethod< + ImagesCreateEdit200Response | ImagesCreateEditDefaultResponse +> { + return context + .path("/images/edits") + .post({ + ...operationOptionsToRequestParameters(options), + contentType: (options.contentType as any) ?? "multipart/form-data", + body: { + prompt: image["prompt"], + image: image["image"], + mask: image["mask"], + n: image["n"], + size: image["size"], + response_format: image["responseFormat"], + user: image["user"], + }, + }); +} + +export async function _createEditDeserialize( + result: ImagesCreateEdit200Response | ImagesCreateEditDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + created: new Date(result.body["created"]), + data: (result.body["data"] ?? []).map((p) => ({ + url: p["url"], + b64Json: + typeof p["b64_json"] === "string" + ? stringToUint8Array(p["b64_json"], "base64") + : p["b64_json"], + })), + }; +} + +export async function createEdit( + context: Client, + image: CreateImageEditRequest, + options: ImagesCreateEditOptions = { requestOptions: {} } +): Promise { + const result = await _createEditSend(context, image, options); + return _createEditDeserialize(result); +} + +export function _createVariationSend( + context: Client, + image: CreateImageVariationRequest, + options: ImagesCreateVariationOptions = { requestOptions: {} } +): StreamableMethod< + ImagesCreateVariation200Response | ImagesCreateVariationDefaultResponse +> { + return context + .path("/images/variations") + .post({ + ...operationOptionsToRequestParameters(options), + contentType: (options.contentType as any) ?? "multipart/form-data", + body: { + image: image["image"], + n: image["n"], + size: image["size"], + response_format: image["responseFormat"], + user: image["user"], + }, + }); +} + +export async function _createVariationDeserialize( + result: + | ImagesCreateVariation200Response + | ImagesCreateVariationDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + created: new Date(result.body["created"]), + data: (result.body["data"] ?? []).map((p) => ({ + url: p["url"], + b64Json: + typeof p["b64_json"] === "string" + ? stringToUint8Array(p["b64_json"], "base64") + : p["b64_json"], + })), + }; +} + +export async function createVariation( + context: Client, + image: CreateImageVariationRequest, + options: ImagesCreateVariationOptions = { requestOptions: {} } +): Promise { + const result = await _createVariationSend(context, image, options); + return _createVariationDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/index.ts index c0cda4a15e..7e52c3e77f 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/index.ts +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/index.ts @@ -6,33 +6,3 @@ export { OpenAIClientOptions, OpenAIContext, } from "./OpenAIContext.js"; -export { - createTranscription, - createTranslation, - createChatCompletion, - createFineTuningJob, - listPaginatedFineTuningJobs, - retrieveFineTuningJob, - listFineTuningEvents, - cancelFineTuningJob, - createCompletion, - createEdit, - createEmbedding, - listFiles, - createFile, - retrieveFile, - deleteFile, - downloadFile, - createFineTune, - listFineTunes, - retrieveFineTune, - listFineTuneEvents, - cancelFineTune, - listModels, - retrieve, - deleteOperation, - createImage, - createImageEdit, - createImageVariation, - createModeration, -} from "./operations.js"; diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/models/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/models/index.ts new file mode 100644 index 0000000000..12669d988b --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/models/index.ts @@ -0,0 +1,133 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + ListModelsResponse, + Model, + DeleteModelResponse, +} from "../../models/models.js"; +import { + isUnexpected, + ModelsDeleteOperation200Response, + ModelsDeleteOperationDefaultResponse, + ModelsList200Response, + ModelsListDefaultResponse, + ModelsRetrieve200Response, + ModelsRetrieveDefaultResponse, + OpenAIContext as Client, +} from "../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { + ModelsListOptions, + ModelsRetrieveOptions, + ModelsDeleteOperationOptions, +} from "../../models/options.js"; + +export function _listSend( + context: Client, + options: ModelsListOptions = { requestOptions: {} } +): StreamableMethod { + return context + .path("/models") + .get({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _listDeserialize( + result: ModelsList200Response | ModelsListDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + object: result.body["object"], + data: (result.body["data"] ?? []).map((p) => ({ + id: p["id"], + object: p["object"], + created: new Date(p["created"]), + ownedBy: p["owned_by"], + })), + }; +} + +export async function list( + context: Client, + options: ModelsListOptions = { requestOptions: {} } +): Promise { + const result = await _listSend(context, options); + return _listDeserialize(result); +} + +export function _retrieveSend( + context: Client, + model: string, + options: ModelsRetrieveOptions = { requestOptions: {} } +): StreamableMethod { + return context + .path("/models/{model}", model) + .get({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _retrieveDeserialize( + result: ModelsRetrieve200Response | ModelsRetrieveDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + created: new Date(result.body["created"]), + ownedBy: result.body["owned_by"], + }; +} + +export async function retrieve( + context: Client, + model: string, + options: ModelsRetrieveOptions = { requestOptions: {} } +): Promise { + const result = await _retrieveSend(context, model, options); + return _retrieveDeserialize(result); +} + +export function _deleteOperationSend( + context: Client, + model: string, + options: ModelsDeleteOperationOptions = { requestOptions: {} } +): StreamableMethod< + ModelsDeleteOperation200Response | ModelsDeleteOperationDefaultResponse +> { + return context + .path("/models/{model}", model) + .delete({ ...operationOptionsToRequestParameters(options) }); +} + +export async function _deleteOperationDeserialize( + result: + | ModelsDeleteOperation200Response + | ModelsDeleteOperationDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + object: result.body["object"], + deleted: result.body["deleted"], + }; +} + +export async function deleteOperation( + context: Client, + model: string, + options: ModelsDeleteOperationOptions = { requestOptions: {} } +): Promise { + const result = await _deleteOperationSend(context, model, options); + return _deleteOperationDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/moderations/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/moderations/index.ts new file mode 100644 index 0000000000..616495c103 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/moderations/index.ts @@ -0,0 +1,84 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { + CreateModerationRequest, + CreateModerationResponse, +} from "../../models/models.js"; +import { + isUnexpected, + ModerationsCreate200Response, + ModerationsCreateDefaultResponse, + OpenAIContext as Client, +} from "../../rest/index.js"; +import { + StreamableMethod, + operationOptionsToRequestParameters, +} from "@azure-rest/core-client"; +import { ModerationsCreateOptions } from "../../models/options.js"; + +export function _createSend( + context: Client, + content: CreateModerationRequest, + options: ModerationsCreateOptions = { requestOptions: {} } +): StreamableMethod< + ModerationsCreate200Response | ModerationsCreateDefaultResponse +> { + return context + .path("/moderations") + .post({ + ...operationOptionsToRequestParameters(options), + body: { input: content["input"], model: content["model"] }, + }); +} + +export async function _createDeserialize( + result: ModerationsCreate200Response | ModerationsCreateDefaultResponse +): Promise { + if (isUnexpected(result)) { + throw result.body; + } + + return { + id: result.body["id"], + model: result.body["model"], + results: (result.body["results"] ?? []).map((p) => ({ + flagged: p["flagged"], + categories: { + hate: p.categories["hate"], + "hate/threatening": p.categories["hate/threatening"], + harassment: p.categories["harassment"], + "harassment/threatening": p.categories["harassment/threatening"], + selfHarm: p.categories["self-harm"], + "selfHarm/intent": p.categories["self-harm/intent"], + "selfHarm/instructive": p.categories["self-harm/instructive"], + sexual: p.categories["sexual"], + "sexual/minors": p.categories["sexual/minors"], + violence: p.categories["violence"], + "violence/graphic": p.categories["violence/graphic"], + }, + categoryScores: { + hate: p.category_scores["hate"], + "hate/threatening": p.category_scores["hate/threatening"], + harassment: p.category_scores["harassment"], + "harassment/threatening": p.category_scores["harassment/threatening"], + selfHarm: p.category_scores["self-harm"], + "selfHarm/intent": p.category_scores["self-harm/intent"], + "selfHarm/instructive": p.category_scores["self-harm/instructive"], + sexual: p.category_scores["sexual"], + "sexual/minors": p.category_scores["sexual/minors"], + violence: p.category_scores["violence"], + "violence/graphic": p.category_scores["violence/graphic"], + }, + })), + }; +} + +export async function create( + context: Client, + content: CreateModerationRequest, + options: ModerationsCreateOptions = { requestOptions: {} } +): Promise { + const result = await _createSend(context, content, options); + return _createDeserialize(result); +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/operations.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/operations.ts deleted file mode 100644 index ee35e11597..0000000000 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/api/operations.ts +++ /dev/null @@ -1,1711 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT license. - -import { - CreateTranscriptionRequest, - CreateTranscriptionResponse, - CreateTranslationRequest, - CreateTranslationResponse, - CreateChatCompletionRequest, - CreateChatCompletionResponse, - CreateFineTuningJobRequest, - FineTuningJob, - ListPaginatedFineTuningJobsResponse, - ListFineTuningJobEventsResponse, - CreateCompletionRequest, - CreateCompletionResponse, - CreateEditRequest, - CreateEditResponse, - CreateEmbeddingRequest, - CreateEmbeddingResponse, - ListFilesResponse, - OpenAIFile, - CreateFileRequest, - DeleteFileResponse, - CreateFineTuneRequest, - FineTune, - ListFineTunesResponse, - ListFineTuneEventsResponse, - ListModelsResponse, - Model, - DeleteModelResponse, - CreateImageRequest, - ImagesResponse, - CreateImageEditRequest, - CreateImageVariationRequest, - CreateModerationRequest, - CreateModerationResponse, -} from "../models/models.js"; -import { - CancelFineTune200Response, - CancelFineTuneDefaultResponse, - CancelFineTuningJob200Response, - CancelFineTuningJobDefaultResponse, - CreateChatCompletion200Response, - CreateChatCompletionDefaultResponse, - CreateCompletion200Response, - CreateCompletionDefaultResponse, - CreateEdit200Response, - CreateEditDefaultResponse, - CreateEmbedding200Response, - CreateEmbeddingDefaultResponse, - CreateFile200Response, - CreateFileDefaultResponse, - CreateFineTune200Response, - CreateFineTuneDefaultResponse, - CreateFineTuningJob200Response, - CreateFineTuningJobDefaultResponse, - CreateImage200Response, - CreateImageDefaultResponse, - CreateImageEdit200Response, - CreateImageEditDefaultResponse, - CreateImageVariation200Response, - CreateImageVariationDefaultResponse, - CreateModeration200Response, - CreateModerationDefaultResponse, - CreateTranscription200Response, - CreateTranscriptionDefaultResponse, - CreateTranslation200Response, - CreateTranslationDefaultResponse, - DeleteFile200Response, - DeleteFileDefaultResponse, - DeleteOperation200Response, - DeleteOperationDefaultResponse, - DownloadFile200Response, - DownloadFileDefaultResponse, - isUnexpected, - ListFiles200Response, - ListFilesDefaultResponse, - ListFineTuneEvents200Response, - ListFineTuneEventsDefaultResponse, - ListFineTunes200Response, - ListFineTunesDefaultResponse, - ListFineTuningEvents200Response, - ListFineTuningEventsDefaultResponse, - ListModels200Response, - ListModelsDefaultResponse, - ListPaginatedFineTuningJobs200Response, - ListPaginatedFineTuningJobsDefaultResponse, - OpenAIContext as Client, - Retrieve200Response, - RetrieveDefaultResponse, - RetrieveFile200Response, - RetrieveFileDefaultResponse, - RetrieveFineTune200Response, - RetrieveFineTuneDefaultResponse, - RetrieveFineTuningJob200Response, - RetrieveFineTuningJobDefaultResponse, -} from "../rest/index.js"; -import { - StreamableMethod, - operationOptionsToRequestParameters, -} from "@azure-rest/core-client"; -import { stringToUint8Array } from "@azure/core-util"; -import { - CreateTranscriptionOptions, - CreateTranslationOptions, - CreateChatCompletionOptions, - CreateFineTuningJobOptions, - ListPaginatedFineTuningJobsOptions, - RetrieveFineTuningJobOptions, - ListFineTuningEventsOptions, - CancelFineTuningJobOptions, - CreateCompletionOptions, - CreateEditOptions, - CreateEmbeddingOptions, - ListFilesOptions, - CreateFileOptions, - RetrieveFileOptions, - DeleteFileOptions, - DownloadFileOptions, - CreateFineTuneOptions, - ListFineTunesOptions, - RetrieveFineTuneOptions, - ListFineTuneEventsOptions, - CancelFineTuneOptions, - ListModelsOptions, - RetrieveOptions, - DeleteOptions, - CreateImageOptions, - CreateImageEditOptions, - CreateImageVariationOptions, - CreateModerationOptions, -} from "../models/options.js"; - -export function _createTranscriptionSend( - context: Client, - audio: CreateTranscriptionRequest, - options: CreateTranscriptionOptions = { requestOptions: {} } -): StreamableMethod< - CreateTranscription200Response | CreateTranscriptionDefaultResponse -> { - return context - .path("/audio/transcriptions") - .post({ - ...operationOptionsToRequestParameters(options), - contentType: (options.contentType as any) ?? "multipart/form-data", - body: { - file: audio["file"], - model: audio["model"], - prompt: audio["prompt"], - response_format: audio["responseFormat"], - temperature: audio["temperature"], - language: audio["language"], - }, - }); -} - -export async function _createTranscriptionDeserialize( - result: CreateTranscription200Response | CreateTranscriptionDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - text: result.body["text"], - }; -} - -export async function createTranscription( - context: Client, - audio: CreateTranscriptionRequest, - options: CreateTranscriptionOptions = { requestOptions: {} } -): Promise { - const result = await _createTranscriptionSend(context, audio, options); - return _createTranscriptionDeserialize(result); -} - -export function _createTranslationSend( - context: Client, - audio: CreateTranslationRequest, - options: CreateTranslationOptions = { requestOptions: {} } -): StreamableMethod< - CreateTranslation200Response | CreateTranslationDefaultResponse -> { - return context - .path("/audio/translations") - .post({ - ...operationOptionsToRequestParameters(options), - contentType: (options.contentType as any) ?? "multipart/form-data", - body: { - file: audio["file"], - model: audio["model"], - prompt: audio["prompt"], - response_format: audio["responseFormat"], - temperature: audio["temperature"], - }, - }); -} - -export async function _createTranslationDeserialize( - result: CreateTranslation200Response | CreateTranslationDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - text: result.body["text"], - }; -} - -export async function createTranslation( - context: Client, - audio: CreateTranslationRequest, - options: CreateTranslationOptions = { requestOptions: {} } -): Promise { - const result = await _createTranslationSend(context, audio, options); - return _createTranslationDeserialize(result); -} - -export function _createChatCompletionSend( - context: Client, - body: CreateChatCompletionRequest, - options: CreateChatCompletionOptions = { requestOptions: {} } -): StreamableMethod< - CreateChatCompletion200Response | CreateChatCompletionDefaultResponse -> { - return context - .path("/chat/completions") - .post({ - ...operationOptionsToRequestParameters(options), - body: { - model: body["model"], - messages: (body["messages"] ?? []).map((p) => ({ - role: p["role"], - content: p["content"], - name: p["name"], - function_call: !p.functionCall - ? undefined - : { - name: p.functionCall?.["name"], - arguments: p.functionCall?.["arguments"], - }, - })), - functions: (body["functions"] ?? []).map((p) => ({ - name: p["name"], - description: p["description"], - parameters: p["parameters"], - })), - function_call: body["functionCall"], - temperature: body["temperature"], - top_p: body["topP"], - n: body["n"], - max_tokens: body["maxTokens"], - stop: body["stop"], - presence_penalty: body["presencePenalty"], - frequency_penalty: body["frequencyPenalty"], - logit_bias: body["logitBias"], - user: body["user"], - stream: body["stream"], - }, - }); -} - -export async function _createChatCompletionDeserialize( - result: CreateChatCompletion200Response | CreateChatCompletionDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - created: new Date(result.body["created"]), - model: result.body["model"], - choices: (result.body["choices"] ?? []).map((p) => ({ - index: p["index"], - message: { - role: p.message["role"] as any, - content: p.message["content"], - functionCall: !p.message.function_call - ? undefined - : { - name: p.message.function_call?.["name"], - arguments: p.message.function_call?.["arguments"], - }, - }, - finishReason: p["finish_reason"] as any, - })), - usage: !result.body.usage - ? undefined - : { - promptTokens: result.body.usage?.["prompt_tokens"], - completionTokens: result.body.usage?.["completion_tokens"], - totalTokens: result.body.usage?.["total_tokens"], - }, - }; -} - -export async function createChatCompletion( - context: Client, - body: CreateChatCompletionRequest, - options: CreateChatCompletionOptions = { requestOptions: {} } -): Promise { - const result = await _createChatCompletionSend(context, body, options); - return _createChatCompletionDeserialize(result); -} - -export function _createFineTuningJobSend( - context: Client, - job: CreateFineTuningJobRequest, - options: CreateFineTuningJobOptions = { requestOptions: {} } -): StreamableMethod< - CreateFineTuningJob200Response | CreateFineTuningJobDefaultResponse -> { - return context - .path("/fine_tuning/jobs") - .post({ - ...operationOptionsToRequestParameters(options), - body: { - training_file: job["trainingFile"], - validation_file: job["validationFile"], - model: job["model"], - hyperparameters: !job.hyperparameters - ? undefined - : { n_epochs: job.hyperparameters?.["nEpochs"] }, - suffix: job["suffix"], - }, - }); -} - -export async function _createFineTuningJobDeserialize( - result: CreateFineTuningJob200Response | CreateFineTuningJobDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - createdAt: new Date(result.body["created_at"]), - finishedAt: - result.body["finished_at"] === null - ? null - : new Date(result.body["finished_at"]), - model: result.body["model"], - fineTunedModel: result.body["fine_tuned_model"], - organizationId: result.body["organization_id"], - status: result.body["status"] as any, - hyperparameters: { - nEpochs: result.body.hyperparameters["n_epochs"] as any, - }, - trainingFile: result.body["training_file"], - validationFile: result.body["validation_file"], - resultFiles: result.body["result_files"], - trainedTokens: result.body["trained_tokens"], - error: - result.body.error === null - ? null - : { - message: result.body.error["message"], - code: result.body.error["code"], - param: result.body.error["param"], - }, - }; -} - -/** - * Creates a job that fine-tunes a specified model from a given dataset. - * - * Response includes details of the enqueued job including job status and the name of the - * fine-tuned models once complete. - * - * [Learn more about fine-tuning](/docs/guides/fine-tuning) - */ -export async function createFineTuningJob( - context: Client, - job: CreateFineTuningJobRequest, - options: CreateFineTuningJobOptions = { requestOptions: {} } -): Promise { - const result = await _createFineTuningJobSend(context, job, options); - return _createFineTuningJobDeserialize(result); -} - -export function _listPaginatedFineTuningJobsSend( - context: Client, - options: ListPaginatedFineTuningJobsOptions = { requestOptions: {} } -): StreamableMethod< - | ListPaginatedFineTuningJobs200Response - | ListPaginatedFineTuningJobsDefaultResponse -> { - return context - .path("/fine_tuning/jobs") - .get({ - ...operationOptionsToRequestParameters(options), - queryParameters: { after: options?.after, limit: options?.limit }, - }); -} - -export async function _listPaginatedFineTuningJobsDeserialize( - result: - | ListPaginatedFineTuningJobs200Response - | ListPaginatedFineTuningJobsDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - object: result.body["object"], - data: (result.body["data"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - createdAt: new Date(p["created_at"]), - finishedAt: p["finished_at"] === null ? null : new Date(p["finished_at"]), - model: p["model"], - fineTunedModel: p["fine_tuned_model"], - organizationId: p["organization_id"], - status: p["status"] as any, - hyperparameters: { nEpochs: p.hyperparameters["n_epochs"] as any }, - trainingFile: p["training_file"], - validationFile: p["validation_file"], - resultFiles: p["result_files"], - trainedTokens: p["trained_tokens"], - error: - p.error === null - ? null - : { - message: p.error["message"], - code: p.error["code"], - param: p.error["param"], - }, - })), - hasMore: result.body["has_more"], - }; -} - -export async function listPaginatedFineTuningJobs( - context: Client, - options: ListPaginatedFineTuningJobsOptions = { requestOptions: {} } -): Promise { - const result = await _listPaginatedFineTuningJobsSend(context, options); - return _listPaginatedFineTuningJobsDeserialize(result); -} - -export function _retrieveFineTuningJobSend( - context: Client, - fineTuningJobId: string, - options: RetrieveFineTuningJobOptions = { requestOptions: {} } -): StreamableMethod< - RetrieveFineTuningJob200Response | RetrieveFineTuningJobDefaultResponse -> { - return context - .path("/fine_tuning/jobs/{fine_tuning_job_id}", fineTuningJobId) - .get({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _retrieveFineTuningJobDeserialize( - result: - | RetrieveFineTuningJob200Response - | RetrieveFineTuningJobDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - createdAt: new Date(result.body["created_at"]), - finishedAt: - result.body["finished_at"] === null - ? null - : new Date(result.body["finished_at"]), - model: result.body["model"], - fineTunedModel: result.body["fine_tuned_model"], - organizationId: result.body["organization_id"], - status: result.body["status"] as any, - hyperparameters: { - nEpochs: result.body.hyperparameters["n_epochs"] as any, - }, - trainingFile: result.body["training_file"], - validationFile: result.body["validation_file"], - resultFiles: result.body["result_files"], - trainedTokens: result.body["trained_tokens"], - error: - result.body.error === null - ? null - : { - message: result.body.error["message"], - code: result.body.error["code"], - param: result.body.error["param"], - }, - }; -} - -export async function retrieveFineTuningJob( - context: Client, - fineTuningJobId: string, - options: RetrieveFineTuningJobOptions = { requestOptions: {} } -): Promise { - const result = await _retrieveFineTuningJobSend( - context, - fineTuningJobId, - options - ); - return _retrieveFineTuningJobDeserialize(result); -} - -export function _listFineTuningEventsSend( - context: Client, - fineTuningJobId: string, - options: ListFineTuningEventsOptions = { requestOptions: {} } -): StreamableMethod< - ListFineTuningEvents200Response | ListFineTuningEventsDefaultResponse -> { - return context - .path("/fine_tuning/jobs/{fine_tuning_job_id}/events", fineTuningJobId) - .get({ - ...operationOptionsToRequestParameters(options), - queryParameters: { after: options?.after, limit: options?.limit }, - }); -} - -export async function _listFineTuningEventsDeserialize( - result: ListFineTuningEvents200Response | ListFineTuningEventsDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - object: result.body["object"], - data: (result.body["data"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - createdAt: new Date(p["created_at"]), - level: p["level"] as any, - message: p["message"], - })), - }; -} - -export async function listFineTuningEvents( - context: Client, - fineTuningJobId: string, - options: ListFineTuningEventsOptions = { requestOptions: {} } -): Promise { - const result = await _listFineTuningEventsSend( - context, - fineTuningJobId, - options - ); - return _listFineTuningEventsDeserialize(result); -} - -export function _cancelFineTuningJobSend( - context: Client, - fineTuningJobId: string, - options: CancelFineTuningJobOptions = { requestOptions: {} } -): StreamableMethod< - CancelFineTuningJob200Response | CancelFineTuningJobDefaultResponse -> { - return context - .path("/fine_tuning/jobs/{fine_tuning_job_id}/cancel", fineTuningJobId) - .post({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _cancelFineTuningJobDeserialize( - result: CancelFineTuningJob200Response | CancelFineTuningJobDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - createdAt: new Date(result.body["created_at"]), - finishedAt: - result.body["finished_at"] === null - ? null - : new Date(result.body["finished_at"]), - model: result.body["model"], - fineTunedModel: result.body["fine_tuned_model"], - organizationId: result.body["organization_id"], - status: result.body["status"] as any, - hyperparameters: { - nEpochs: result.body.hyperparameters["n_epochs"] as any, - }, - trainingFile: result.body["training_file"], - validationFile: result.body["validation_file"], - resultFiles: result.body["result_files"], - trainedTokens: result.body["trained_tokens"], - error: - result.body.error === null - ? null - : { - message: result.body.error["message"], - code: result.body.error["code"], - param: result.body.error["param"], - }, - }; -} - -export async function cancelFineTuningJob( - context: Client, - fineTuningJobId: string, - options: CancelFineTuningJobOptions = { requestOptions: {} } -): Promise { - const result = await _cancelFineTuningJobSend( - context, - fineTuningJobId, - options - ); - return _cancelFineTuningJobDeserialize(result); -} - -export function _createCompletionSend( - context: Client, - body: CreateCompletionRequest, - options: CreateCompletionOptions = { requestOptions: {} } -): StreamableMethod< - CreateCompletion200Response | CreateCompletionDefaultResponse -> { - return context - .path("/completions") - .post({ - ...operationOptionsToRequestParameters(options), - body: { - model: body["model"], - prompt: body["prompt"], - suffix: body["suffix"], - temperature: body["temperature"], - top_p: body["topP"], - n: body["n"], - max_tokens: body["maxTokens"], - stop: body["stop"], - presence_penalty: body["presencePenalty"], - frequency_penalty: body["frequencyPenalty"], - logit_bias: body["logitBias"], - user: body["user"], - stream: body["stream"], - logprobs: body["logprobs"], - echo: body["echo"], - best_of: body["bestOf"], - }, - }); -} - -export async function _createCompletionDeserialize( - result: CreateCompletion200Response | CreateCompletionDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - created: new Date(result.body["created"]), - model: result.body["model"], - choices: (result.body["choices"] ?? []).map((p) => ({ - index: p["index"], - text: p["text"], - logprobs: - p.logprobs === null - ? null - : { - tokens: p.logprobs["tokens"], - tokenLogprobs: p.logprobs["token_logprobs"], - topLogprobs: p.logprobs["top_logprobs"], - textOffset: p.logprobs["text_offset"], - }, - finishReason: p["finish_reason"] as any, - })), - usage: !result.body.usage - ? undefined - : { - promptTokens: result.body.usage?.["prompt_tokens"], - completionTokens: result.body.usage?.["completion_tokens"], - totalTokens: result.body.usage?.["total_tokens"], - }, - }; -} - -export async function createCompletion( - context: Client, - body: CreateCompletionRequest, - options: CreateCompletionOptions = { requestOptions: {} } -): Promise { - const result = await _createCompletionSend(context, body, options); - return _createCompletionDeserialize(result); -} - -export function _createEditSend( - context: Client, - edit: CreateEditRequest, - options: CreateEditOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/edits") - .post({ - ...operationOptionsToRequestParameters(options), - body: { - model: edit["model"], - input: edit["input"], - instruction: edit["instruction"], - n: edit["n"], - temperature: edit["temperature"], - top_p: edit["topP"], - }, - }); -} - -export async function _createEditDeserialize( - result: CreateEdit200Response | CreateEditDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - object: result.body["object"], - created: new Date(result.body["created"]), - choices: (result.body["choices"] ?? []).map((p) => ({ - text: p["text"], - index: p["index"], - finishReason: p["finish_reason"] as any, - })), - usage: { - promptTokens: result.body.usage["prompt_tokens"], - completionTokens: result.body.usage["completion_tokens"], - totalTokens: result.body.usage["total_tokens"], - }, - }; -} - -export async function createEdit( - context: Client, - edit: CreateEditRequest, - options: CreateEditOptions = { requestOptions: {} } -): Promise { - const result = await _createEditSend(context, edit, options); - return _createEditDeserialize(result); -} - -export function _createEmbeddingSend( - context: Client, - embedding: CreateEmbeddingRequest, - options: CreateEmbeddingOptions = { requestOptions: {} } -): StreamableMethod< - CreateEmbedding200Response | CreateEmbeddingDefaultResponse -> { - return context - .path("/embeddings") - .post({ - ...operationOptionsToRequestParameters(options), - body: { - model: embedding["model"], - input: embedding["input"], - user: embedding["user"], - }, - }); -} - -export async function _createEmbeddingDeserialize( - result: CreateEmbedding200Response | CreateEmbeddingDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - object: result.body["object"], - model: result.body["model"], - data: (result.body["data"] ?? []).map((p) => ({ - index: p["index"], - object: p["object"], - embedding: p["embedding"], - })), - usage: { - promptTokens: result.body.usage["prompt_tokens"], - totalTokens: result.body.usage["total_tokens"], - }, - }; -} - -export async function createEmbedding( - context: Client, - embedding: CreateEmbeddingRequest, - options: CreateEmbeddingOptions = { requestOptions: {} } -): Promise { - const result = await _createEmbeddingSend(context, embedding, options); - return _createEmbeddingDeserialize(result); -} - -export function _listFilesSend( - context: Client, - options: ListFilesOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/files") - .get({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _listFilesDeserialize( - result: ListFiles200Response | ListFilesDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - object: result.body["object"], - data: (result.body["data"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - }; -} - -export async function listFiles( - context: Client, - options: ListFilesOptions = { requestOptions: {} } -): Promise { - const result = await _listFilesSend(context, options); - return _listFilesDeserialize(result); -} - -export function _createFileSend( - context: Client, - file: CreateFileRequest, - options: CreateFileOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/files") - .post({ - ...operationOptionsToRequestParameters(options), - contentType: (options.contentType as any) ?? "multipart/form-data", - body: { file: file["file"], purpose: file["purpose"] }, - }); -} - -export async function _createFileDeserialize( - result: CreateFile200Response | CreateFileDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - bytes: result.body["bytes"], - createdAt: new Date(result.body["createdAt"]), - filename: result.body["filename"], - purpose: result.body["purpose"], - status: result.body["status"] as any, - statusDetails: result.body["status_details"], - }; -} - -export async function createFile( - context: Client, - file: CreateFileRequest, - options: CreateFileOptions = { requestOptions: {} } -): Promise { - const result = await _createFileSend(context, file, options); - return _createFileDeserialize(result); -} - -export function _retrieveFileSend( - context: Client, - fileId: string, - options: RetrieveFileOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/files/files/{file_id}", fileId) - .post({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _retrieveFileDeserialize( - result: RetrieveFile200Response | RetrieveFileDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - bytes: result.body["bytes"], - createdAt: new Date(result.body["createdAt"]), - filename: result.body["filename"], - purpose: result.body["purpose"], - status: result.body["status"] as any, - statusDetails: result.body["status_details"], - }; -} - -export async function retrieveFile( - context: Client, - fileId: string, - options: RetrieveFileOptions = { requestOptions: {} } -): Promise { - const result = await _retrieveFileSend(context, fileId, options); - return _retrieveFileDeserialize(result); -} - -export function _deleteFileSend( - context: Client, - fileId: string, - options: DeleteFileOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/files/files/{file_id}", fileId) - .delete({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _deleteFileDeserialize( - result: DeleteFile200Response | DeleteFileDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - deleted: result.body["deleted"], - }; -} - -export async function deleteFile( - context: Client, - fileId: string, - options: DeleteFileOptions = { requestOptions: {} } -): Promise { - const result = await _deleteFileSend(context, fileId, options); - return _deleteFileDeserialize(result); -} - -export function _downloadFileSend( - context: Client, - fileId: string, - options: DownloadFileOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/files/files/{file_id}/content", fileId) - .get({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _downloadFileDeserialize( - result: DownloadFile200Response | DownloadFileDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return result.body; -} - -export async function downloadFile( - context: Client, - fileId: string, - options: DownloadFileOptions = { requestOptions: {} } -): Promise { - const result = await _downloadFileSend(context, fileId, options); - return _downloadFileDeserialize(result); -} - -export function _createFineTuneSend( - context: Client, - fineTune: CreateFineTuneRequest, - options: CreateFineTuneOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/fine-tunes") - .post({ - ...operationOptionsToRequestParameters(options), - body: { - training_file: fineTune["trainingFile"], - validation_file: fineTune["validationFile"], - model: fineTune["model"], - n_epochs: fineTune["nEpochs"], - batch_size: fineTune["batchSize"], - learning_rate_multiplier: fineTune["learningRateMultiplier"], - prompt_loss_rate: fineTune["promptLossRate"], - compute_classification_metrics: - fineTune["computeClassificationMetrics"], - classification_n_classes: fineTune["classificationNClasses"], - classification_positive_class: fineTune["classificationPositiveClass"], - classification_betas: fineTune["classificationBetas"], - suffix: fineTune["suffix"], - }, - }); -} - -export async function _createFineTuneDeserialize( - result: CreateFineTune200Response | CreateFineTuneDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - createdAt: new Date(result.body["created_at"]), - updatedAt: new Date(result.body["updated_at"]), - model: result.body["model"], - fineTunedModel: result.body["fine_tuned_model"], - organizationId: result.body["organization_id"], - status: result.body["status"] as any, - hyperparams: { - nEpochs: result.body.hyperparams["n_epochs"], - batchSize: result.body.hyperparams["batch_size"], - promptLossWeight: result.body.hyperparams["prompt_loss_weight"], - learningRateMultiplier: - result.body.hyperparams["learning_rate_multiplier"], - computeClassificationMetrics: - result.body.hyperparams["compute_classification_metrics"], - classificationPositiveClass: - result.body.hyperparams["classification_positive_class"], - classificationNClasses: - result.body.hyperparams["classification_n_classes"], - }, - trainingFiles: (result.body["training_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - validationFiles: (result.body["validation_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - resultFiles: (result.body["result_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - events: (result.body["events"] ?? []).map((p) => ({ - object: p["object"], - createdAt: new Date(p["created_at"]), - level: p["level"], - message: p["message"], - })), - }; -} - -export async function createFineTune( - context: Client, - fineTune: CreateFineTuneRequest, - options: CreateFineTuneOptions = { requestOptions: {} } -): Promise { - const result = await _createFineTuneSend(context, fineTune, options); - return _createFineTuneDeserialize(result); -} - -export function _listFineTunesSend( - context: Client, - options: ListFineTunesOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/fine-tunes") - .get({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _listFineTunesDeserialize( - result: ListFineTunes200Response | ListFineTunesDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - object: result.body["object"], - data: (result.body["data"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - createdAt: new Date(p["created_at"]), - updatedAt: new Date(p["updated_at"]), - model: p["model"], - fineTunedModel: p["fine_tuned_model"], - organizationId: p["organization_id"], - status: p["status"] as any, - hyperparams: { - nEpochs: p.hyperparams["n_epochs"], - batchSize: p.hyperparams["batch_size"], - promptLossWeight: p.hyperparams["prompt_loss_weight"], - learningRateMultiplier: p.hyperparams["learning_rate_multiplier"], - computeClassificationMetrics: - p.hyperparams["compute_classification_metrics"], - classificationPositiveClass: - p.hyperparams["classification_positive_class"], - classificationNClasses: p.hyperparams["classification_n_classes"], - }, - trainingFiles: (p["training_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - validationFiles: (p["validation_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - resultFiles: (p["result_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - events: (p["events"] ?? []).map((p) => ({ - object: p["object"], - createdAt: new Date(p["created_at"]), - level: p["level"], - message: p["message"], - })), - })), - }; -} - -export async function listFineTunes( - context: Client, - options: ListFineTunesOptions = { requestOptions: {} } -): Promise { - const result = await _listFineTunesSend(context, options); - return _listFineTunesDeserialize(result); -} - -export function _retrieveFineTuneSend( - context: Client, - fineTuneId: string, - options: RetrieveFineTuneOptions = { requestOptions: {} } -): StreamableMethod< - RetrieveFineTune200Response | RetrieveFineTuneDefaultResponse -> { - return context - .path("/fine-tunes/{fine_tune_id}", fineTuneId) - .get({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _retrieveFineTuneDeserialize( - result: RetrieveFineTune200Response | RetrieveFineTuneDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - createdAt: new Date(result.body["created_at"]), - updatedAt: new Date(result.body["updated_at"]), - model: result.body["model"], - fineTunedModel: result.body["fine_tuned_model"], - organizationId: result.body["organization_id"], - status: result.body["status"] as any, - hyperparams: { - nEpochs: result.body.hyperparams["n_epochs"], - batchSize: result.body.hyperparams["batch_size"], - promptLossWeight: result.body.hyperparams["prompt_loss_weight"], - learningRateMultiplier: - result.body.hyperparams["learning_rate_multiplier"], - computeClassificationMetrics: - result.body.hyperparams["compute_classification_metrics"], - classificationPositiveClass: - result.body.hyperparams["classification_positive_class"], - classificationNClasses: - result.body.hyperparams["classification_n_classes"], - }, - trainingFiles: (result.body["training_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - validationFiles: (result.body["validation_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - resultFiles: (result.body["result_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - events: (result.body["events"] ?? []).map((p) => ({ - object: p["object"], - createdAt: new Date(p["created_at"]), - level: p["level"], - message: p["message"], - })), - }; -} - -export async function retrieveFineTune( - context: Client, - fineTuneId: string, - options: RetrieveFineTuneOptions = { requestOptions: {} } -): Promise { - const result = await _retrieveFineTuneSend(context, fineTuneId, options); - return _retrieveFineTuneDeserialize(result); -} - -export function _listFineTuneEventsSend( - context: Client, - fineTuneId: string, - options: ListFineTuneEventsOptions = { requestOptions: {} } -): StreamableMethod< - ListFineTuneEvents200Response | ListFineTuneEventsDefaultResponse -> { - return context - .path("/fine-tunes/{fine_tune_id}/events", fineTuneId) - .get({ - ...operationOptionsToRequestParameters(options), - queryParameters: { stream: options?.stream }, - }); -} - -export async function _listFineTuneEventsDeserialize( - result: ListFineTuneEvents200Response | ListFineTuneEventsDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - object: result.body["object"], - data: (result.body["data"] ?? []).map((p) => ({ - object: p["object"], - createdAt: new Date(p["created_at"]), - level: p["level"], - message: p["message"], - })), - }; -} - -export async function listFineTuneEvents( - context: Client, - fineTuneId: string, - options: ListFineTuneEventsOptions = { requestOptions: {} } -): Promise { - const result = await _listFineTuneEventsSend(context, fineTuneId, options); - return _listFineTuneEventsDeserialize(result); -} - -export function _cancelFineTuneSend( - context: Client, - fineTuneId: string, - options: CancelFineTuneOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/fine-tunes/{fine_tune_id}/cancel", fineTuneId) - .post({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _cancelFineTuneDeserialize( - result: CancelFineTune200Response | CancelFineTuneDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - createdAt: new Date(result.body["created_at"]), - updatedAt: new Date(result.body["updated_at"]), - model: result.body["model"], - fineTunedModel: result.body["fine_tuned_model"], - organizationId: result.body["organization_id"], - status: result.body["status"] as any, - hyperparams: { - nEpochs: result.body.hyperparams["n_epochs"], - batchSize: result.body.hyperparams["batch_size"], - promptLossWeight: result.body.hyperparams["prompt_loss_weight"], - learningRateMultiplier: - result.body.hyperparams["learning_rate_multiplier"], - computeClassificationMetrics: - result.body.hyperparams["compute_classification_metrics"], - classificationPositiveClass: - result.body.hyperparams["classification_positive_class"], - classificationNClasses: - result.body.hyperparams["classification_n_classes"], - }, - trainingFiles: (result.body["training_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - validationFiles: (result.body["validation_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - resultFiles: (result.body["result_files"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - bytes: p["bytes"], - createdAt: new Date(p["createdAt"]), - filename: p["filename"], - purpose: p["purpose"], - status: p["status"] as any, - statusDetails: p["status_details"], - })), - events: (result.body["events"] ?? []).map((p) => ({ - object: p["object"], - createdAt: new Date(p["created_at"]), - level: p["level"], - message: p["message"], - })), - }; -} - -export async function cancelFineTune( - context: Client, - fineTuneId: string, - options: CancelFineTuneOptions = { requestOptions: {} } -): Promise { - const result = await _cancelFineTuneSend(context, fineTuneId, options); - return _cancelFineTuneDeserialize(result); -} - -export function _listModelsSend( - context: Client, - options: ListModelsOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/models") - .get({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _listModelsDeserialize( - result: ListModels200Response | ListModelsDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - object: result.body["object"], - data: (result.body["data"] ?? []).map((p) => ({ - id: p["id"], - object: p["object"], - created: new Date(p["created"]), - ownedBy: p["owned_by"], - })), - }; -} - -export async function listModels( - context: Client, - options: ListModelsOptions = { requestOptions: {} } -): Promise { - const result = await _listModelsSend(context, options); - return _listModelsDeserialize(result); -} - -export function _retrieveSend( - context: Client, - model: string, - options: RetrieveOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/models/{model}", model) - .get({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _retrieveDeserialize( - result: Retrieve200Response | RetrieveDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - created: new Date(result.body["created"]), - ownedBy: result.body["owned_by"], - }; -} - -export async function retrieve( - context: Client, - model: string, - options: RetrieveOptions = { requestOptions: {} } -): Promise { - const result = await _retrieveSend(context, model, options); - return _retrieveDeserialize(result); -} - -export function _deleteOperationSend( - context: Client, - model: string, - options: DeleteOptions = { requestOptions: {} } -): StreamableMethod< - DeleteOperation200Response | DeleteOperationDefaultResponse -> { - return context - .path("/models/{model}", model) - .delete({ ...operationOptionsToRequestParameters(options) }); -} - -export async function _deleteOperationDeserialize( - result: DeleteOperation200Response | DeleteOperationDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - object: result.body["object"], - deleted: result.body["deleted"], - }; -} - -/** - * @fixme delete is a reserved word that cannot be used as an operation name. Please add @projectedName( - * "javascript", "") to the operation to override the generated name. - */ -export async function deleteOperation( - context: Client, - model: string, - options: DeleteOptions = { requestOptions: {} } -): Promise { - const result = await _deleteOperationSend(context, model, options); - return _deleteOperationDeserialize(result); -} - -export function _createImageSend( - context: Client, - image: CreateImageRequest, - options: CreateImageOptions = { requestOptions: {} } -): StreamableMethod { - return context - .path("/images/generations") - .post({ - ...operationOptionsToRequestParameters(options), - body: { - prompt: image["prompt"], - n: image["n"], - size: image["size"], - response_format: image["responseFormat"], - user: image["user"], - }, - }); -} - -export async function _createImageDeserialize( - result: CreateImage200Response | CreateImageDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - created: new Date(result.body["created"]), - data: (result.body["data"] ?? []).map((p) => ({ - url: p["url"], - b64Json: - typeof p["b64_json"] === "string" - ? stringToUint8Array(p["b64_json"], "base64") - : p["b64_json"], - })), - }; -} - -export async function createImage( - context: Client, - image: CreateImageRequest, - options: CreateImageOptions = { requestOptions: {} } -): Promise { - const result = await _createImageSend(context, image, options); - return _createImageDeserialize(result); -} - -export function _createImageEditSend( - context: Client, - image: CreateImageEditRequest, - options: CreateImageEditOptions = { requestOptions: {} } -): StreamableMethod< - CreateImageEdit200Response | CreateImageEditDefaultResponse -> { - return context - .path("/images/edits") - .post({ - ...operationOptionsToRequestParameters(options), - contentType: (options.contentType as any) ?? "multipart/form-data", - body: { - prompt: image["prompt"], - image: image["image"], - mask: image["mask"], - n: image["n"], - size: image["size"], - response_format: image["responseFormat"], - user: image["user"], - }, - }); -} - -export async function _createImageEditDeserialize( - result: CreateImageEdit200Response | CreateImageEditDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - created: new Date(result.body["created"]), - data: (result.body["data"] ?? []).map((p) => ({ - url: p["url"], - b64Json: - typeof p["b64_json"] === "string" - ? stringToUint8Array(p["b64_json"], "base64") - : p["b64_json"], - })), - }; -} - -export async function createImageEdit( - context: Client, - image: CreateImageEditRequest, - options: CreateImageEditOptions = { requestOptions: {} } -): Promise { - const result = await _createImageEditSend(context, image, options); - return _createImageEditDeserialize(result); -} - -export function _createImageVariationSend( - context: Client, - image: CreateImageVariationRequest, - options: CreateImageVariationOptions = { requestOptions: {} } -): StreamableMethod< - CreateImageVariation200Response | CreateImageVariationDefaultResponse -> { - return context - .path("/images/variations") - .post({ - ...operationOptionsToRequestParameters(options), - contentType: (options.contentType as any) ?? "multipart/form-data", - body: { - image: image["image"], - n: image["n"], - size: image["size"], - response_format: image["responseFormat"], - user: image["user"], - }, - }); -} - -export async function _createImageVariationDeserialize( - result: CreateImageVariation200Response | CreateImageVariationDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - created: new Date(result.body["created"]), - data: (result.body["data"] ?? []).map((p) => ({ - url: p["url"], - b64Json: - typeof p["b64_json"] === "string" - ? stringToUint8Array(p["b64_json"], "base64") - : p["b64_json"], - })), - }; -} - -export async function createImageVariation( - context: Client, - image: CreateImageVariationRequest, - options: CreateImageVariationOptions = { requestOptions: {} } -): Promise { - const result = await _createImageVariationSend(context, image, options); - return _createImageVariationDeserialize(result); -} - -export function _createModerationSend( - context: Client, - content: CreateModerationRequest, - options: CreateModerationOptions = { requestOptions: {} } -): StreamableMethod< - CreateModeration200Response | CreateModerationDefaultResponse -> { - return context - .path("/moderations") - .post({ - ...operationOptionsToRequestParameters(options), - body: { input: content["input"], model: content["model"] }, - }); -} - -export async function _createModerationDeserialize( - result: CreateModeration200Response | CreateModerationDefaultResponse -): Promise { - if (isUnexpected(result)) { - throw result.body; - } - - return { - id: result.body["id"], - model: result.body["model"], - results: (result.body["results"] ?? []).map((p) => ({ - flagged: p["flagged"], - categories: { - hate: p.categories["hate"], - "hate/threatening": p.categories["hate/threatening"], - harassment: p.categories["harassment"], - "harassment/threatening": p.categories["harassment/threatening"], - selfHarm: p.categories["self-harm"], - "selfHarm/intent": p.categories["self-harm/intent"], - "selfHarm/instructive": p.categories["self-harm/instructive"], - sexual: p.categories["sexual"], - "sexual/minors": p.categories["sexual/minors"], - violence: p.categories["violence"], - "violence/graphic": p.categories["violence/graphic"], - }, - categoryScores: { - hate: p.category_scores["hate"], - "hate/threatening": p.category_scores["hate/threatening"], - harassment: p.category_scores["harassment"], - "harassment/threatening": p.category_scores["harassment/threatening"], - selfHarm: p.category_scores["self-harm"], - "selfHarm/intent": p.category_scores["self-harm/intent"], - "selfHarm/instructive": p.category_scores["self-harm/instructive"], - sexual: p.category_scores["sexual"], - "sexual/minors": p.category_scores["sexual/minors"], - violence: p.category_scores["violence"], - "violence/graphic": p.category_scores["violence/graphic"], - }, - })), - }; -} - -export async function createModeration( - context: Client, - content: CreateModerationRequest, - options: CreateModerationOptions = { requestOptions: {} } -): Promise { - const result = await _createModerationSend(context, content, options); - return _createModerationDeserialize(result); -} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/index.ts new file mode 100644 index 0000000000..1350e15202 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/index.ts @@ -0,0 +1,24 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { + AudioTranscriptionsOperations, + getAudioTranscriptionsOperations, +} from "./transcriptions/index.js"; +import { + AudioTranslationsOperations, + getAudioTranslationsOperations, +} from "./translations/index.js"; + +export interface AudioOperations { + transcriptions: AudioTranscriptionsOperations; + translations: AudioTranslationsOperations; +} + +export function getAudioOperations(context: OpenAIContext): AudioOperations { + return { + transcriptions: getAudioTranscriptionsOperations(context), + translations: getAudioTranslationsOperations(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/transcriptions/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/transcriptions/index.ts new file mode 100644 index 0000000000..1c0355b8f3 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/transcriptions/index.ts @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../../api/OpenAIContext.js"; +import { + CreateTranscriptionRequest, + CreateTranscriptionResponse, +} from "../../../models/models.js"; +import { create } from "../../../api/audio/transcriptions/index.js"; +import { AudioTranscriptionsCreateOptions } from "../../../models/options.js"; + +export interface AudioTranscriptionsOperations { + create: ( + audio: CreateTranscriptionRequest, + options?: AudioTranscriptionsCreateOptions + ) => Promise; +} + +export function getAudioTranscriptions(context: OpenAIContext) { + return { + create: ( + audio: CreateTranscriptionRequest, + options?: AudioTranscriptionsCreateOptions + ) => create(context, audio, options), + }; +} + +export function getAudioTranscriptionsOperations( + context: OpenAIContext +): AudioTranscriptionsOperations { + return { + ...getAudioTranscriptions(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/translations/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/translations/index.ts new file mode 100644 index 0000000000..5c8144e402 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/audio/translations/index.ts @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../../api/OpenAIContext.js"; +import { + CreateTranslationRequest, + CreateTranslationResponse, +} from "../../../models/models.js"; +import { create } from "../../../api/audio/translations/index.js"; +import { AudioTranslationsCreateOptions } from "../../../models/options.js"; + +export interface AudioTranslationsOperations { + create: ( + audio: CreateTranslationRequest, + options?: AudioTranslationsCreateOptions + ) => Promise; +} + +export function getAudioTranslations(context: OpenAIContext) { + return { + create: ( + audio: CreateTranslationRequest, + options?: AudioTranslationsCreateOptions + ) => create(context, audio, options), + }; +} + +export function getAudioTranslationsOperations( + context: OpenAIContext +): AudioTranslationsOperations { + return { + ...getAudioTranslations(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/chat/completions/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/chat/completions/index.ts new file mode 100644 index 0000000000..679bec3335 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/chat/completions/index.ts @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../../api/OpenAIContext.js"; +import { + CreateChatCompletionRequest, + CreateChatCompletionResponse, +} from "../../../models/models.js"; +import { create } from "../../../api/chat/completions/index.js"; +import { ChatCompletionsCreateOptions } from "../../../models/options.js"; + +export interface ChatCompletionsOperations { + create: ( + body: CreateChatCompletionRequest, + options?: ChatCompletionsCreateOptions + ) => Promise; +} + +export function getChatCompletions(context: OpenAIContext) { + return { + create: ( + body: CreateChatCompletionRequest, + options?: ChatCompletionsCreateOptions + ) => create(context, body, options), + }; +} + +export function getChatCompletionsOperations( + context: OpenAIContext +): ChatCompletionsOperations { + return { + ...getChatCompletions(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/chat/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/chat/index.ts new file mode 100644 index 0000000000..8a44e3a848 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/chat/index.ts @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { + ChatCompletionsOperations, + getChatCompletionsOperations, +} from "./completions/index.js"; + +export interface ChatOperations { + completions: ChatCompletionsOperations; +} + +export function getChatOperations(context: OpenAIContext): ChatOperations { + return { + completions: getChatCompletionsOperations(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/completions/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/completions/index.ts new file mode 100644 index 0000000000..4b8c7aae21 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/completions/index.ts @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { + CreateCompletionRequest, + CreateCompletionResponse, +} from "../../models/models.js"; +import { create } from "../../api/completions/index.js"; +import { CompletionsCreateOptions } from "../../models/options.js"; + +export interface CompletionsOperations { + create: ( + body: CreateCompletionRequest, + options?: CompletionsCreateOptions + ) => Promise; +} + +export function getCompletions(context: OpenAIContext) { + return { + create: ( + body: CreateCompletionRequest, + options?: CompletionsCreateOptions + ) => create(context, body, options), + }; +} + +export function getCompletionsOperations( + context: OpenAIContext +): CompletionsOperations { + return { + ...getCompletions(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/edits/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/edits/index.ts new file mode 100644 index 0000000000..4be75b08d4 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/edits/index.ts @@ -0,0 +1,27 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { CreateEditRequest, CreateEditResponse } from "../../models/models.js"; +import { create } from "../../api/edits/index.js"; +import { EditsCreateOptions } from "../../models/options.js"; + +export interface EditsOperations { + create: ( + edit: CreateEditRequest, + options?: EditsCreateOptions + ) => Promise; +} + +export function getEdits(context: OpenAIContext) { + return { + create: (edit: CreateEditRequest, options?: EditsCreateOptions) => + create(context, edit, options), + }; +} + +export function getEditsOperations(context: OpenAIContext): EditsOperations { + return { + ...getEdits(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/embeddings/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/embeddings/index.ts new file mode 100644 index 0000000000..ca050d494e --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/embeddings/index.ts @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { + CreateEmbeddingRequest, + CreateEmbeddingResponse, +} from "../../models/models.js"; +import { create } from "../../api/embeddings/index.js"; +import { EmbeddingsCreateOptions } from "../../models/options.js"; + +export interface EmbeddingsOperations { + create: ( + embedding: CreateEmbeddingRequest, + options?: EmbeddingsCreateOptions + ) => Promise; +} + +export function getEmbeddings(context: OpenAIContext) { + return { + create: ( + embedding: CreateEmbeddingRequest, + options?: EmbeddingsCreateOptions + ) => create(context, embedding, options), + }; +} + +export function getEmbeddingsOperations( + context: OpenAIContext +): EmbeddingsOperations { + return { + ...getEmbeddings(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/files/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/files/index.ts new file mode 100644 index 0000000000..fbaaaf3f6c --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/files/index.ts @@ -0,0 +1,61 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { + ListFilesResponse, + OpenAIFile, + CreateFileRequest, + DeleteFileResponse, +} from "../../models/models.js"; +import { + list, + create, + retrieve, + deleteOperation, + download, +} from "../../api/files/index.js"; +import { + FilesListOptions, + FilesCreateOptions, + FilesRetrieveOptions, + FilesDeleteOperationOptions, + FilesDownloadOptions, +} from "../../models/options.js"; + +export interface FilesOperations { + list: (options?: FilesListOptions) => Promise; + create: ( + file: CreateFileRequest, + options?: FilesCreateOptions + ) => Promise; + retrieve: ( + fileId: string, + options?: FilesRetrieveOptions + ) => Promise; + deleteOperation: ( + fileId: string, + options?: FilesDeleteOperationOptions + ) => Promise; + download: (fileId: string, options?: FilesDownloadOptions) => Promise; +} + +export function getFiles(context: OpenAIContext) { + return { + list: (options?: FilesListOptions) => list(context, options), + create: (file: CreateFileRequest, options?: FilesCreateOptions) => + create(context, file, options), + retrieve: (fileId: string, options?: FilesRetrieveOptions) => + retrieve(context, fileId, options), + deleteOperation: (fileId: string, options?: FilesDeleteOperationOptions) => + deleteOperation(context, fileId, options), + download: (fileId: string, options?: FilesDownloadOptions) => + download(context, fileId, options), + }; +} + +export function getFilesOperations(context: OpenAIContext): FilesOperations { + return { + ...getFiles(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTunes/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTunes/index.ts new file mode 100644 index 0000000000..89d669311f --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTunes/index.ts @@ -0,0 +1,68 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { + CreateFineTuneRequest, + FineTune, + ListFineTunesResponse, + ListFineTuneEventsResponse, +} from "../../models/models.js"; +import { + create, + list, + retrieve, + listEvents, + cancel, +} from "../../api/fineTunes/index.js"; +import { + FineTunesCreateOptions, + FineTunesListOptions, + FineTunesRetrieveOptions, + FineTunesListEventsOptions, + FineTunesCancelOptions, +} from "../../models/options.js"; + +export interface FineTunesOperations { + create: ( + fineTune: CreateFineTuneRequest, + options?: FineTunesCreateOptions + ) => Promise; + list: (options?: FineTunesListOptions) => Promise; + retrieve: ( + fineTuneId: string, + options?: FineTunesRetrieveOptions + ) => Promise; + listEvents: ( + fineTuneId: string, + options?: FineTunesListEventsOptions + ) => Promise; + cancel: ( + fineTuneId: string, + options?: FineTunesCancelOptions + ) => Promise; +} + +export function getFineTunes(context: OpenAIContext) { + return { + create: ( + fineTune: CreateFineTuneRequest, + options?: FineTunesCreateOptions + ) => create(context, fineTune, options), + list: (options?: FineTunesListOptions) => list(context, options), + retrieve: (fineTuneId: string, options?: FineTunesRetrieveOptions) => + retrieve(context, fineTuneId, options), + listEvents: (fineTuneId: string, options?: FineTunesListEventsOptions) => + listEvents(context, fineTuneId, options), + cancel: (fineTuneId: string, options?: FineTunesCancelOptions) => + cancel(context, fineTuneId, options), + }; +} + +export function getFineTunesOperations( + context: OpenAIContext +): FineTunesOperations { + return { + ...getFineTunes(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTuning/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTuning/index.ts new file mode 100644 index 0000000000..21accfa71c --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTuning/index.ts @@ -0,0 +1,20 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { + FineTuningJobsOperations, + getFineTuningJobsOperations, +} from "./jobs/index.js"; + +export interface FineTuningOperations { + jobs: FineTuningJobsOperations; +} + +export function getFineTuningOperations( + context: OpenAIContext +): FineTuningOperations { + return { + jobs: getFineTuningJobsOperations(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTuning/jobs/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTuning/jobs/index.ts new file mode 100644 index 0000000000..1633fe5eb2 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/fineTuning/jobs/index.ts @@ -0,0 +1,74 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../../api/OpenAIContext.js"; +import { + CreateFineTuningJobRequest, + FineTuningJob, + ListPaginatedFineTuningJobsResponse, + ListFineTuningJobEventsResponse, +} from "../../../models/models.js"; +import { + create, + list, + retrieve, + listEvents, + cancel, +} from "../../../api/fineTuning/jobs/index.js"; +import { + FineTuningJobsCreateOptions, + FineTuningJobsListOptions, + FineTuningJobsRetrieveOptions, + FineTuningJobsListEventsOptions, + FineTuningJobsCancelOptions, +} from "../../../models/options.js"; + +export interface FineTuningJobsOperations { + create: ( + job: CreateFineTuningJobRequest, + options?: FineTuningJobsCreateOptions + ) => Promise; + list: ( + options?: FineTuningJobsListOptions + ) => Promise; + retrieve: ( + fineTuningJobId: string, + options?: FineTuningJobsRetrieveOptions + ) => Promise; + listEvents: ( + fineTuningJobId: string, + options?: FineTuningJobsListEventsOptions + ) => Promise; + cancel: ( + fineTuningJobId: string, + options?: FineTuningJobsCancelOptions + ) => Promise; +} + +export function getFineTuningJobs(context: OpenAIContext) { + return { + create: ( + job: CreateFineTuningJobRequest, + options?: FineTuningJobsCreateOptions + ) => create(context, job, options), + list: (options?: FineTuningJobsListOptions) => list(context, options), + retrieve: ( + fineTuningJobId: string, + options?: FineTuningJobsRetrieveOptions + ) => retrieve(context, fineTuningJobId, options), + listEvents: ( + fineTuningJobId: string, + options?: FineTuningJobsListEventsOptions + ) => listEvents(context, fineTuningJobId, options), + cancel: (fineTuningJobId: string, options?: FineTuningJobsCancelOptions) => + cancel(context, fineTuningJobId, options), + }; +} + +export function getFineTuningJobsOperations( + context: OpenAIContext +): FineTuningJobsOperations { + return { + ...getFineTuningJobs(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/images/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/images/index.ts new file mode 100644 index 0000000000..73d51a5000 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/images/index.ts @@ -0,0 +1,52 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { + CreateImageRequest, + ImagesResponse, + CreateImageEditRequest, + CreateImageVariationRequest, +} from "../../models/models.js"; +import { create, createEdit, createVariation } from "../../api/images/index.js"; +import { + ImagesCreateOptions, + ImagesCreateEditOptions, + ImagesCreateVariationOptions, +} from "../../models/options.js"; + +export interface ImagesOperations { + create: ( + image: CreateImageRequest, + options?: ImagesCreateOptions + ) => Promise; + createEdit: ( + image: CreateImageEditRequest, + options?: ImagesCreateEditOptions + ) => Promise; + createVariation: ( + image: CreateImageVariationRequest, + options?: ImagesCreateVariationOptions + ) => Promise; +} + +export function getImages(context: OpenAIContext) { + return { + create: (image: CreateImageRequest, options?: ImagesCreateOptions) => + create(context, image, options), + createEdit: ( + image: CreateImageEditRequest, + options?: ImagesCreateEditOptions + ) => createEdit(context, image, options), + createVariation: ( + image: CreateImageVariationRequest, + options?: ImagesCreateVariationOptions + ) => createVariation(context, image, options), + }; +} + +export function getImagesOperations(context: OpenAIContext): ImagesOperations { + return { + ...getImages(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/index.ts new file mode 100644 index 0000000000..923b2b5a90 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/index.ts @@ -0,0 +1,18 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { AudioOperations } from "./audio/index.js"; +export { ChatOperations } from "./chat/index.js"; +export { CompletionsOperations } from "./completions/index.js"; +export { EditsOperations } from "./edits/index.js"; +export { EmbeddingsOperations } from "./embeddings/index.js"; +export { FilesOperations } from "./files/index.js"; +export { FineTunesOperations } from "./fineTunes/index.js"; +export { FineTuningOperations } from "./fineTuning/index.js"; +export { ImagesOperations } from "./images/index.js"; +export { ModelsOperations } from "./models/index.js"; +export { ModerationsOperations } from "./moderations/index.js"; +export { AudioTranscriptionsOperations } from "./audio/transcriptions/index.js"; +export { AudioTranslationsOperations } from "./audio/translations/index.js"; +export { ChatCompletionsOperations } from "./chat/completions/index.js"; +export { FineTuningJobsOperations } from "./fineTuning/jobs/index.js"; diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/models/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/models/index.ts new file mode 100644 index 0000000000..b8aee79af0 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/models/index.ts @@ -0,0 +1,40 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { + ListModelsResponse, + Model, + DeleteModelResponse, +} from "../../models/models.js"; +import { list, retrieve, deleteOperation } from "../../api/models/index.js"; +import { + ModelsListOptions, + ModelsRetrieveOptions, + ModelsDeleteOperationOptions, +} from "../../models/options.js"; + +export interface ModelsOperations { + list: (options?: ModelsListOptions) => Promise; + retrieve: (model: string, options?: ModelsRetrieveOptions) => Promise; + deleteOperation: ( + model: string, + options?: ModelsDeleteOperationOptions + ) => Promise; +} + +export function getModels(context: OpenAIContext) { + return { + list: (options?: ModelsListOptions) => list(context, options), + retrieve: (model: string, options?: ModelsRetrieveOptions) => + retrieve(context, model, options), + deleteOperation: (model: string, options?: ModelsDeleteOperationOptions) => + deleteOperation(context, model, options), + }; +} + +export function getModelsOperations(context: OpenAIContext): ModelsOperations { + return { + ...getModels(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/moderations/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/moderations/index.ts new file mode 100644 index 0000000000..f7e7454d53 --- /dev/null +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/classic/moderations/index.ts @@ -0,0 +1,34 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { OpenAIContext } from "../../api/OpenAIContext.js"; +import { + CreateModerationRequest, + CreateModerationResponse, +} from "../../models/models.js"; +import { create } from "../../api/moderations/index.js"; +import { ModerationsCreateOptions } from "../../models/options.js"; + +export interface ModerationsOperations { + create: ( + content: CreateModerationRequest, + options?: ModerationsCreateOptions + ) => Promise; +} + +export function getModerations(context: OpenAIContext) { + return { + create: ( + content: CreateModerationRequest, + options?: ModerationsCreateOptions + ) => create(context, content, options), + }; +} + +export function getModerationsOperations( + context: OpenAIContext +): ModerationsOperations { + return { + ...getModerations(context), + }; +} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/index.ts index ac6599d6f3..702fbf8751 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/index.ts +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/index.ts @@ -46,32 +46,49 @@ export { CreateImageVariationRequest, CreateModerationRequest, CreateModerationResponse, - CreateTranscriptionOptions, - CreateTranslationOptions, - CreateChatCompletionOptions, - CreateFineTuningJobOptions, - ListPaginatedFineTuningJobsOptions, - RetrieveFineTuningJobOptions, - ListFineTuningEventsOptions, - CancelFineTuningJobOptions, - CreateCompletionOptions, - CreateEditOptions, - CreateEmbeddingOptions, - ListFilesOptions, - CreateFileOptions, - RetrieveFileOptions, - DeleteFileOptions, - DownloadFileOptions, - CreateFineTuneOptions, - ListFineTunesOptions, - RetrieveFineTuneOptions, - ListFineTuneEventsOptions, - CancelFineTuneOptions, - ListModelsOptions, - RetrieveOptions, - DeleteOptions, - CreateImageOptions, - CreateImageEditOptions, - CreateImageVariationOptions, - CreateModerationOptions, + AudioTranscriptionsCreateOptions, + AudioTranslationsCreateOptions, + ChatCompletionsCreateOptions, + FineTuningJobsCreateOptions, + FineTuningJobsListOptions, + FineTuningJobsRetrieveOptions, + FineTuningJobsListEventsOptions, + FineTuningJobsCancelOptions, + CompletionsCreateOptions, + EditsCreateOptions, + EmbeddingsCreateOptions, + FilesListOptions, + FilesCreateOptions, + FilesRetrieveOptions, + FilesDeleteOperationOptions, + FilesDownloadOptions, + FineTunesCreateOptions, + FineTunesListOptions, + FineTunesRetrieveOptions, + FineTunesListEventsOptions, + FineTunesCancelOptions, + ModelsListOptions, + ModelsRetrieveOptions, + ModelsDeleteOperationOptions, + ImagesCreateOptions, + ImagesCreateEditOptions, + ImagesCreateVariationOptions, + ModerationsCreateOptions, } from "./models/index.js"; +export { + AudioOperations, + ChatOperations, + CompletionsOperations, + EditsOperations, + EmbeddingsOperations, + FilesOperations, + FineTunesOperations, + FineTuningOperations, + ImagesOperations, + ModelsOperations, + ModerationsOperations, + AudioTranscriptionsOperations, + AudioTranslationsOperations, + ChatCompletionsOperations, + FineTuningJobsOperations, +} from "./classic/index.js"; diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/models/index.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/models/index.ts index cf7df375b5..717c372fcb 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/models/index.ts +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/models/index.ts @@ -47,32 +47,32 @@ export { CreateModerationResponse, } from "./models.js"; export { - CreateTranscriptionOptions, - CreateTranslationOptions, - CreateChatCompletionOptions, - CreateFineTuningJobOptions, - ListPaginatedFineTuningJobsOptions, - RetrieveFineTuningJobOptions, - ListFineTuningEventsOptions, - CancelFineTuningJobOptions, - CreateCompletionOptions, - CreateEditOptions, - CreateEmbeddingOptions, - ListFilesOptions, - CreateFileOptions, - RetrieveFileOptions, - DeleteFileOptions, - DownloadFileOptions, - CreateFineTuneOptions, - ListFineTunesOptions, - RetrieveFineTuneOptions, - ListFineTuneEventsOptions, - CancelFineTuneOptions, - ListModelsOptions, - RetrieveOptions, - DeleteOptions, - CreateImageOptions, - CreateImageEditOptions, - CreateImageVariationOptions, - CreateModerationOptions, + AudioTranscriptionsCreateOptions, + AudioTranslationsCreateOptions, + ChatCompletionsCreateOptions, + FineTuningJobsCreateOptions, + FineTuningJobsListOptions, + FineTuningJobsRetrieveOptions, + FineTuningJobsListEventsOptions, + FineTuningJobsCancelOptions, + CompletionsCreateOptions, + EditsCreateOptions, + EmbeddingsCreateOptions, + FilesListOptions, + FilesCreateOptions, + FilesRetrieveOptions, + FilesDeleteOperationOptions, + FilesDownloadOptions, + FineTunesCreateOptions, + FineTunesListOptions, + FineTunesRetrieveOptions, + FineTunesListEventsOptions, + FineTunesCancelOptions, + ModelsListOptions, + ModelsRetrieveOptions, + ModelsDeleteOperationOptions, + ImagesCreateOptions, + ImagesCreateEditOptions, + ImagesCreateVariationOptions, + ModerationsCreateOptions, } from "./options.js"; diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/models/options.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/models/options.ts index 3f45e59f9a..42e2b2f697 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/models/options.ts +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/models/options.ts @@ -3,61 +3,61 @@ import { OperationOptions } from "@azure-rest/core-client"; -export interface CreateTranscriptionOptions extends OperationOptions { +export interface AudioTranscriptionsCreateOptions extends OperationOptions { contentType?: string; } -export interface CreateTranslationOptions extends OperationOptions { +export interface AudioTranslationsCreateOptions extends OperationOptions { contentType?: string; } -export interface CreateChatCompletionOptions extends OperationOptions {} +export interface ChatCompletionsCreateOptions extends OperationOptions {} -export interface CreateFineTuningJobOptions extends OperationOptions {} +export interface FineTuningJobsCreateOptions extends OperationOptions {} -export interface ListPaginatedFineTuningJobsOptions extends OperationOptions { +export interface FineTuningJobsListOptions extends OperationOptions { /** Identifier for the last job from the previous pagination request. */ after?: string; /** Number of fine-tuning jobs to retrieve. */ limit?: number; } -export interface RetrieveFineTuningJobOptions extends OperationOptions {} +export interface FineTuningJobsRetrieveOptions extends OperationOptions {} -export interface ListFineTuningEventsOptions extends OperationOptions { +export interface FineTuningJobsListEventsOptions extends OperationOptions { /** Identifier for the last event from the previous pagination request. */ after?: string; /** Number of events to retrieve. */ limit?: number; } -export interface CancelFineTuningJobOptions extends OperationOptions {} +export interface FineTuningJobsCancelOptions extends OperationOptions {} -export interface CreateCompletionOptions extends OperationOptions {} +export interface CompletionsCreateOptions extends OperationOptions {} -export interface CreateEditOptions extends OperationOptions {} +export interface EditsCreateOptions extends OperationOptions {} -export interface CreateEmbeddingOptions extends OperationOptions {} +export interface EmbeddingsCreateOptions extends OperationOptions {} -export interface ListFilesOptions extends OperationOptions {} +export interface FilesListOptions extends OperationOptions {} -export interface CreateFileOptions extends OperationOptions { +export interface FilesCreateOptions extends OperationOptions { contentType?: string; } -export interface RetrieveFileOptions extends OperationOptions {} +export interface FilesRetrieveOptions extends OperationOptions {} -export interface DeleteFileOptions extends OperationOptions {} +export interface FilesDeleteOperationOptions extends OperationOptions {} -export interface DownloadFileOptions extends OperationOptions {} +export interface FilesDownloadOptions extends OperationOptions {} -export interface CreateFineTuneOptions extends OperationOptions {} +export interface FineTunesCreateOptions extends OperationOptions {} -export interface ListFineTunesOptions extends OperationOptions {} +export interface FineTunesListOptions extends OperationOptions {} -export interface RetrieveFineTuneOptions extends OperationOptions {} +export interface FineTunesRetrieveOptions extends OperationOptions {} -export interface ListFineTuneEventsOptions extends OperationOptions { +export interface FineTunesListEventsOptions extends OperationOptions { /** * Whether to stream events for the fine-tune job. If set to true, events will be sent as * data-only @@ -70,22 +70,22 @@ export interface ListFineTuneEventsOptions extends OperationOptions { stream?: boolean; } -export interface CancelFineTuneOptions extends OperationOptions {} +export interface FineTunesCancelOptions extends OperationOptions {} -export interface ListModelsOptions extends OperationOptions {} +export interface ModelsListOptions extends OperationOptions {} -export interface RetrieveOptions extends OperationOptions {} +export interface ModelsRetrieveOptions extends OperationOptions {} -export interface DeleteOptions extends OperationOptions {} +export interface ModelsDeleteOperationOptions extends OperationOptions {} -export interface CreateImageOptions extends OperationOptions {} +export interface ImagesCreateOptions extends OperationOptions {} -export interface CreateImageEditOptions extends OperationOptions { +export interface ImagesCreateEditOptions extends OperationOptions { contentType?: string; } -export interface CreateImageVariationOptions extends OperationOptions { +export interface ImagesCreateVariationOptions extends OperationOptions { contentType?: string; } -export interface CreateModerationOptions extends OperationOptions {} +export interface ModerationsCreateOptions extends OperationOptions {} diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/clientDefinitions.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/clientDefinitions.ts index cbb44665c7..bb57942925 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/clientDefinitions.ts +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/clientDefinitions.ts @@ -2,120 +2,121 @@ // Licensed under the MIT license. import { - CreateTranscriptionParameters, - CreateTranslationParameters, - CreateChatCompletionParameters, - CreateFineTuningJobParameters, - ListPaginatedFineTuningJobsParameters, - RetrieveFineTuningJobParameters, - ListFineTuningEventsParameters, - CancelFineTuningJobParameters, - CreateCompletionParameters, - CreateEditParameters, - CreateEmbeddingParameters, - ListFilesParameters, - CreateFileParameters, - RetrieveFileParameters, - DeleteFileParameters, - DownloadFileParameters, - CreateFineTuneParameters, - ListFineTunesParameters, - RetrieveFineTuneParameters, - ListFineTuneEventsParameters, - CancelFineTuneParameters, - ListModelsParameters, - RetrieveParameters, - DeleteParameters, - CreateImageParameters, - CreateImageEditParameters, - CreateImageVariationParameters, - CreateModerationParameters, + AudioTranscriptionsCreateParameters, + AudioTranslationsCreateParameters, + ChatCompletionsCreateParameters, + FineTuningJobsCreateParameters, + FineTuningJobsListParameters, + FineTuningJobsRetrieveParameters, + FineTuningJobsListEventsParameters, + FineTuningJobsCancelParameters, + CompletionsCreateParameters, + EditsCreateParameters, + EmbeddingsCreateParameters, + FilesListParameters, + FilesCreateParameters, + FilesRetrieveParameters, + FilesDeleteParameters, + FilesDownloadParameters, + FineTunesCreateParameters, + FineTunesListParameters, + FineTunesRetrieveParameters, + FineTunesListEventsParameters, + FineTunesCancelParameters, + ModelsListParameters, + ModelsRetrieveParameters, + ModelsDeleteParameters, + ImagesCreateParameters, + ImagesCreateEditParameters, + ImagesCreateVariationParameters, + ModerationsCreateParameters, } from "./parameters.js"; import { - CreateTranscription200Response, - CreateTranscriptionDefaultResponse, - CreateTranslation200Response, - CreateTranslationDefaultResponse, - CreateChatCompletion200Response, - CreateChatCompletionDefaultResponse, - CreateFineTuningJob200Response, - CreateFineTuningJobDefaultResponse, - ListPaginatedFineTuningJobs200Response, - ListPaginatedFineTuningJobsDefaultResponse, - RetrieveFineTuningJob200Response, - RetrieveFineTuningJobDefaultResponse, - ListFineTuningEvents200Response, - ListFineTuningEventsDefaultResponse, - CancelFineTuningJob200Response, - CancelFineTuningJobDefaultResponse, - CreateCompletion200Response, - CreateCompletionDefaultResponse, - CreateEdit200Response, - CreateEditDefaultResponse, - CreateEmbedding200Response, - CreateEmbeddingDefaultResponse, - ListFiles200Response, - ListFilesDefaultResponse, - CreateFile200Response, - CreateFileDefaultResponse, - RetrieveFile200Response, - RetrieveFileDefaultResponse, - DeleteFile200Response, - DeleteFileDefaultResponse, - DownloadFile200Response, - DownloadFileDefaultResponse, - CreateFineTune200Response, - CreateFineTuneDefaultResponse, - ListFineTunes200Response, - ListFineTunesDefaultResponse, - RetrieveFineTune200Response, - RetrieveFineTuneDefaultResponse, - ListFineTuneEvents200Response, - ListFineTuneEventsDefaultResponse, - CancelFineTune200Response, - CancelFineTuneDefaultResponse, - ListModels200Response, - ListModelsDefaultResponse, - Retrieve200Response, - RetrieveDefaultResponse, - DeleteOperation200Response, - DeleteOperationDefaultResponse, - CreateImage200Response, - CreateImageDefaultResponse, - CreateImageEdit200Response, - CreateImageEditDefaultResponse, - CreateImageVariation200Response, - CreateImageVariationDefaultResponse, - CreateModeration200Response, - CreateModerationDefaultResponse, + AudioTranscriptionsCreate200Response, + AudioTranscriptionsCreateDefaultResponse, + AudioTranslationsCreate200Response, + AudioTranslationsCreateDefaultResponse, + ChatCompletionsCreate200Response, + ChatCompletionsCreateDefaultResponse, + FineTuningJobsCreate200Response, + FineTuningJobsCreateDefaultResponse, + FineTuningJobsList200Response, + FineTuningJobsListDefaultResponse, + FineTuningJobsRetrieve200Response, + FineTuningJobsRetrieveDefaultResponse, + FineTuningJobsListEvents200Response, + FineTuningJobsListEventsDefaultResponse, + FineTuningJobsCancel200Response, + FineTuningJobsCancelDefaultResponse, + CompletionsCreate200Response, + CompletionsCreateDefaultResponse, + EditsCreate200Response, + EditsCreateDefaultResponse, + EmbeddingsCreate200Response, + EmbeddingsCreateDefaultResponse, + FilesList200Response, + FilesListDefaultResponse, + FilesCreate200Response, + FilesCreateDefaultResponse, + FilesRetrieve200Response, + FilesRetrieveDefaultResponse, + FilesDeleteOperation200Response, + FilesDeleteOperationDefaultResponse, + FilesDownload200Response, + FilesDownloadDefaultResponse, + FineTunesCreate200Response, + FineTunesCreateDefaultResponse, + FineTunesList200Response, + FineTunesListDefaultResponse, + FineTunesRetrieve200Response, + FineTunesRetrieveDefaultResponse, + FineTunesListEvents200Response, + FineTunesListEventsDefaultResponse, + FineTunesCancel200Response, + FineTunesCancelDefaultResponse, + ModelsList200Response, + ModelsListDefaultResponse, + ModelsRetrieve200Response, + ModelsRetrieveDefaultResponse, + ModelsDeleteOperation200Response, + ModelsDeleteOperationDefaultResponse, + ImagesCreate200Response, + ImagesCreateDefaultResponse, + ImagesCreateEdit200Response, + ImagesCreateEditDefaultResponse, + ImagesCreateVariation200Response, + ImagesCreateVariationDefaultResponse, + ModerationsCreate200Response, + ModerationsCreateDefaultResponse, } from "./responses.js"; import { Client, StreamableMethod } from "@azure-rest/core-client"; -export interface CreateTranscription { +export interface AudioTranscriptionsCreate { post( - options: CreateTranscriptionParameters + options: AudioTranscriptionsCreateParameters ): StreamableMethod< - CreateTranscription200Response | CreateTranscriptionDefaultResponse + | AudioTranscriptionsCreate200Response + | AudioTranscriptionsCreateDefaultResponse >; } -export interface CreateTranslation { +export interface AudioTranslationsCreate { post( - options: CreateTranslationParameters + options: AudioTranslationsCreateParameters ): StreamableMethod< - CreateTranslation200Response | CreateTranslationDefaultResponse + AudioTranslationsCreate200Response | AudioTranslationsCreateDefaultResponse >; } -export interface CreateChatCompletion { +export interface ChatCompletionsCreate { post( - options?: CreateChatCompletionParameters + options?: ChatCompletionsCreateParameters ): StreamableMethod< - CreateChatCompletion200Response | CreateChatCompletionDefaultResponse + ChatCompletionsCreate200Response | ChatCompletionsCreateDefaultResponse >; } -export interface CreateFineTuningJob { +export interface FineTuningJobsCreate { /** * Creates a job that fine-tunes a specified model from a given dataset. * @@ -125,232 +126,236 @@ export interface CreateFineTuningJob { * [Learn more about fine-tuning](/docs/guides/fine-tuning) */ post( - options: CreateFineTuningJobParameters + options: FineTuningJobsCreateParameters ): StreamableMethod< - CreateFineTuningJob200Response | CreateFineTuningJobDefaultResponse + FineTuningJobsCreate200Response | FineTuningJobsCreateDefaultResponse >; get( - options?: ListPaginatedFineTuningJobsParameters + options?: FineTuningJobsListParameters ): StreamableMethod< - | ListPaginatedFineTuningJobs200Response - | ListPaginatedFineTuningJobsDefaultResponse + FineTuningJobsList200Response | FineTuningJobsListDefaultResponse >; } -export interface RetrieveFineTuningJob { +export interface FineTuningJobsRetrieve { get( - options?: RetrieveFineTuningJobParameters + options?: FineTuningJobsRetrieveParameters ): StreamableMethod< - RetrieveFineTuningJob200Response | RetrieveFineTuningJobDefaultResponse + FineTuningJobsRetrieve200Response | FineTuningJobsRetrieveDefaultResponse >; } -export interface ListFineTuningEvents { +export interface FineTuningJobsListEvents { get( - options?: ListFineTuningEventsParameters + options?: FineTuningJobsListEventsParameters ): StreamableMethod< - ListFineTuningEvents200Response | ListFineTuningEventsDefaultResponse + | FineTuningJobsListEvents200Response + | FineTuningJobsListEventsDefaultResponse >; } -export interface CancelFineTuningJob { +export interface FineTuningJobsCancel { post( - options?: CancelFineTuningJobParameters + options?: FineTuningJobsCancelParameters ): StreamableMethod< - CancelFineTuningJob200Response | CancelFineTuningJobDefaultResponse + FineTuningJobsCancel200Response | FineTuningJobsCancelDefaultResponse >; } -export interface CreateCompletion { +export interface CompletionsCreate { post( - options?: CreateCompletionParameters + options?: CompletionsCreateParameters ): StreamableMethod< - CreateCompletion200Response | CreateCompletionDefaultResponse + CompletionsCreate200Response | CompletionsCreateDefaultResponse >; } -export interface CreateEdit { +export interface EditsCreate { post( - options: CreateEditParameters - ): StreamableMethod; + options: EditsCreateParameters + ): StreamableMethod; } -export interface CreateEmbedding { +export interface EmbeddingsCreate { post( - options: CreateEmbeddingParameters + options: EmbeddingsCreateParameters ): StreamableMethod< - CreateEmbedding200Response | CreateEmbeddingDefaultResponse + EmbeddingsCreate200Response | EmbeddingsCreateDefaultResponse >; } -export interface ListFiles { +export interface FilesList { get( - options?: ListFilesParameters - ): StreamableMethod; + options?: FilesListParameters + ): StreamableMethod; post( - options: CreateFileParameters - ): StreamableMethod; + options: FilesCreateParameters + ): StreamableMethod; } -export interface RetrieveFile { +export interface FilesRetrieve { post( - options?: RetrieveFileParameters - ): StreamableMethod; + options?: FilesRetrieveParameters + ): StreamableMethod; delete( - options?: DeleteFileParameters - ): StreamableMethod; + options?: FilesDeleteParameters + ): StreamableMethod< + FilesDeleteOperation200Response | FilesDeleteOperationDefaultResponse + >; } -export interface DownloadFile { +export interface FilesDownload { get( - options?: DownloadFileParameters - ): StreamableMethod; + options?: FilesDownloadParameters + ): StreamableMethod; } -export interface CreateFineTune { +export interface FineTunesCreate { post( - options: CreateFineTuneParameters + options: FineTunesCreateParameters ): StreamableMethod< - CreateFineTune200Response | CreateFineTuneDefaultResponse + FineTunesCreate200Response | FineTunesCreateDefaultResponse >; get( - options?: ListFineTunesParameters - ): StreamableMethod; + options?: FineTunesListParameters + ): StreamableMethod; } -export interface RetrieveFineTune { +export interface FineTunesRetrieve { get( - options?: RetrieveFineTuneParameters + options?: FineTunesRetrieveParameters ): StreamableMethod< - RetrieveFineTune200Response | RetrieveFineTuneDefaultResponse + FineTunesRetrieve200Response | FineTunesRetrieveDefaultResponse >; } -export interface ListFineTuneEvents { +export interface FineTunesListEvents { get( - options?: ListFineTuneEventsParameters + options?: FineTunesListEventsParameters ): StreamableMethod< - ListFineTuneEvents200Response | ListFineTuneEventsDefaultResponse + FineTunesListEvents200Response | FineTunesListEventsDefaultResponse >; } -export interface CancelFineTune { +export interface FineTunesCancel { post( - options?: CancelFineTuneParameters + options?: FineTunesCancelParameters ): StreamableMethod< - CancelFineTune200Response | CancelFineTuneDefaultResponse + FineTunesCancel200Response | FineTunesCancelDefaultResponse >; } -export interface ListModels { +export interface ModelsList { get( - options?: ListModelsParameters - ): StreamableMethod; + options?: ModelsListParameters + ): StreamableMethod; } -export interface Retrieve { +export interface ModelsRetrieve { get( - options?: RetrieveParameters - ): StreamableMethod; + options?: ModelsRetrieveParameters + ): StreamableMethod< + ModelsRetrieve200Response | ModelsRetrieveDefaultResponse + >; delete( - options?: DeleteParameters + options?: ModelsDeleteParameters ): StreamableMethod< - DeleteOperation200Response | DeleteOperationDefaultResponse + ModelsDeleteOperation200Response | ModelsDeleteOperationDefaultResponse >; } -export interface CreateImage { +export interface ImagesCreate { post( - options: CreateImageParameters - ): StreamableMethod; + options: ImagesCreateParameters + ): StreamableMethod; } -export interface CreateImageEdit { +export interface ImagesCreateEdit { post( - options: CreateImageEditParameters + options: ImagesCreateEditParameters ): StreamableMethod< - CreateImageEdit200Response | CreateImageEditDefaultResponse + ImagesCreateEdit200Response | ImagesCreateEditDefaultResponse >; } -export interface CreateImageVariation { +export interface ImagesCreateVariation { post( - options: CreateImageVariationParameters + options: ImagesCreateVariationParameters ): StreamableMethod< - CreateImageVariation200Response | CreateImageVariationDefaultResponse + ImagesCreateVariation200Response | ImagesCreateVariationDefaultResponse >; } -export interface CreateModeration { +export interface ModerationsCreate { post( - options: CreateModerationParameters + options: ModerationsCreateParameters ): StreamableMethod< - CreateModeration200Response | CreateModerationDefaultResponse + ModerationsCreate200Response | ModerationsCreateDefaultResponse >; } export interface Routes { /** Resource for '/audio/transcriptions' has methods for the following verbs: post */ - (path: "/audio/transcriptions"): CreateTranscription; + (path: "/audio/transcriptions"): AudioTranscriptionsCreate; /** Resource for '/audio/translations' has methods for the following verbs: post */ - (path: "/audio/translations"): CreateTranslation; + (path: "/audio/translations"): AudioTranslationsCreate; /** Resource for '/chat/completions' has methods for the following verbs: post */ - (path: "/chat/completions"): CreateChatCompletion; + (path: "/chat/completions"): ChatCompletionsCreate; /** Resource for '/fine_tuning/jobs' has methods for the following verbs: post, get */ - (path: "/fine_tuning/jobs"): CreateFineTuningJob; + (path: "/fine_tuning/jobs"): FineTuningJobsCreate; /** Resource for '/fine_tuning/jobs/\{fine_tuning_job_id\}' has methods for the following verbs: get */ ( path: "/fine_tuning/jobs/{fine_tuning_job_id}", fineTuningJobId: string - ): RetrieveFineTuningJob; + ): FineTuningJobsRetrieve; /** Resource for '/fine_tuning/jobs/\{fine_tuning_job_id\}/events' has methods for the following verbs: get */ ( path: "/fine_tuning/jobs/{fine_tuning_job_id}/events", fineTuningJobId: string - ): ListFineTuningEvents; + ): FineTuningJobsListEvents; /** Resource for '/fine_tuning/jobs/\{fine_tuning_job_id\}/cancel' has methods for the following verbs: post */ ( path: "/fine_tuning/jobs/{fine_tuning_job_id}/cancel", fineTuningJobId: string - ): CancelFineTuningJob; + ): FineTuningJobsCancel; /** Resource for '/completions' has methods for the following verbs: post */ - (path: "/completions"): CreateCompletion; + (path: "/completions"): CompletionsCreate; /** Resource for '/edits' has methods for the following verbs: post */ - (path: "/edits"): CreateEdit; + (path: "/edits"): EditsCreate; /** Resource for '/embeddings' has methods for the following verbs: post */ - (path: "/embeddings"): CreateEmbedding; + (path: "/embeddings"): EmbeddingsCreate; /** Resource for '/files' has methods for the following verbs: get, post */ - (path: "/files"): ListFiles; + (path: "/files"): FilesList; /** Resource for '/files/files/\{file_id\}' has methods for the following verbs: post, delete */ - (path: "/files/files/{file_id}", fileId: string): RetrieveFile; + (path: "/files/files/{file_id}", fileId: string): FilesRetrieve; /** Resource for '/files/files/\{file_id\}/content' has methods for the following verbs: get */ - (path: "/files/files/{file_id}/content", fileId: string): DownloadFile; + (path: "/files/files/{file_id}/content", fileId: string): FilesDownload; /** Resource for '/fine-tunes' has methods for the following verbs: post, get */ - (path: "/fine-tunes"): CreateFineTune; + (path: "/fine-tunes"): FineTunesCreate; /** Resource for '/fine-tunes/\{fine_tune_id\}' has methods for the following verbs: get */ - (path: "/fine-tunes/{fine_tune_id}", fineTuneId: string): RetrieveFineTune; + (path: "/fine-tunes/{fine_tune_id}", fineTuneId: string): FineTunesRetrieve; /** Resource for '/fine-tunes/\{fine_tune_id\}/events' has methods for the following verbs: get */ ( path: "/fine-tunes/{fine_tune_id}/events", fineTuneId: string - ): ListFineTuneEvents; + ): FineTunesListEvents; /** Resource for '/fine-tunes/\{fine_tune_id\}/cancel' has methods for the following verbs: post */ ( path: "/fine-tunes/{fine_tune_id}/cancel", fineTuneId: string - ): CancelFineTune; + ): FineTunesCancel; /** Resource for '/models' has methods for the following verbs: get */ - (path: "/models"): ListModels; + (path: "/models"): ModelsList; /** Resource for '/models/\{model\}' has methods for the following verbs: get, delete */ - (path: "/models/{model}", model: string): Retrieve; + (path: "/models/{model}", model: string): ModelsRetrieve; /** Resource for '/images/generations' has methods for the following verbs: post */ - (path: "/images/generations"): CreateImage; + (path: "/images/generations"): ImagesCreate; /** Resource for '/images/edits' has methods for the following verbs: post */ - (path: "/images/edits"): CreateImageEdit; + (path: "/images/edits"): ImagesCreateEdit; /** Resource for '/images/variations' has methods for the following verbs: post */ - (path: "/images/variations"): CreateImageVariation; + (path: "/images/variations"): ImagesCreateVariation; /** Resource for '/moderations' has methods for the following verbs: post */ - (path: "/moderations"): CreateModeration; + (path: "/moderations"): ModerationsCreate; } export type OpenAIContext = Client & { diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/isUnexpected.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/isUnexpected.ts index e2f3d5509b..8539e0901e 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/isUnexpected.ts +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/isUnexpected.ts @@ -2,62 +2,62 @@ // Licensed under the MIT license. import { - CreateTranscription200Response, - CreateTranscriptionDefaultResponse, - CreateTranslation200Response, - CreateTranslationDefaultResponse, - CreateChatCompletion200Response, - CreateChatCompletionDefaultResponse, - CreateFineTuningJob200Response, - CreateFineTuningJobDefaultResponse, - ListPaginatedFineTuningJobs200Response, - ListPaginatedFineTuningJobsDefaultResponse, - RetrieveFineTuningJob200Response, - RetrieveFineTuningJobDefaultResponse, - ListFineTuningEvents200Response, - ListFineTuningEventsDefaultResponse, - CancelFineTuningJob200Response, - CancelFineTuningJobDefaultResponse, - CreateCompletion200Response, - CreateCompletionDefaultResponse, - CreateEdit200Response, - CreateEditDefaultResponse, - CreateEmbedding200Response, - CreateEmbeddingDefaultResponse, - ListFiles200Response, - ListFilesDefaultResponse, - CreateFile200Response, - CreateFileDefaultResponse, - RetrieveFile200Response, - RetrieveFileDefaultResponse, - DeleteFile200Response, - DeleteFileDefaultResponse, - DownloadFile200Response, - DownloadFileDefaultResponse, - CreateFineTune200Response, - CreateFineTuneDefaultResponse, - ListFineTunes200Response, - ListFineTunesDefaultResponse, - RetrieveFineTune200Response, - RetrieveFineTuneDefaultResponse, - ListFineTuneEvents200Response, - ListFineTuneEventsDefaultResponse, - CancelFineTune200Response, - CancelFineTuneDefaultResponse, - ListModels200Response, - ListModelsDefaultResponse, - Retrieve200Response, - RetrieveDefaultResponse, - DeleteOperation200Response, - DeleteOperationDefaultResponse, - CreateImage200Response, - CreateImageDefaultResponse, - CreateImageEdit200Response, - CreateImageEditDefaultResponse, - CreateImageVariation200Response, - CreateImageVariationDefaultResponse, - CreateModeration200Response, - CreateModerationDefaultResponse, + AudioTranscriptionsCreate200Response, + AudioTranscriptionsCreateDefaultResponse, + AudioTranslationsCreate200Response, + AudioTranslationsCreateDefaultResponse, + ChatCompletionsCreate200Response, + ChatCompletionsCreateDefaultResponse, + FineTuningJobsCreate200Response, + FineTuningJobsCreateDefaultResponse, + FineTuningJobsList200Response, + FineTuningJobsListDefaultResponse, + FineTuningJobsRetrieve200Response, + FineTuningJobsRetrieveDefaultResponse, + FineTuningJobsListEvents200Response, + FineTuningJobsListEventsDefaultResponse, + FineTuningJobsCancel200Response, + FineTuningJobsCancelDefaultResponse, + CompletionsCreate200Response, + CompletionsCreateDefaultResponse, + EditsCreate200Response, + EditsCreateDefaultResponse, + EmbeddingsCreate200Response, + EmbeddingsCreateDefaultResponse, + FilesList200Response, + FilesListDefaultResponse, + FilesCreate200Response, + FilesCreateDefaultResponse, + FilesRetrieve200Response, + FilesRetrieveDefaultResponse, + FilesDeleteOperation200Response, + FilesDeleteOperationDefaultResponse, + FilesDownload200Response, + FilesDownloadDefaultResponse, + FineTunesCreate200Response, + FineTunesCreateDefaultResponse, + FineTunesList200Response, + FineTunesListDefaultResponse, + FineTunesRetrieve200Response, + FineTunesRetrieveDefaultResponse, + FineTunesListEvents200Response, + FineTunesListEventsDefaultResponse, + FineTunesCancel200Response, + FineTunesCancelDefaultResponse, + ModelsList200Response, + ModelsListDefaultResponse, + ModelsRetrieve200Response, + ModelsRetrieveDefaultResponse, + ModelsDeleteOperation200Response, + ModelsDeleteOperationDefaultResponse, + ImagesCreate200Response, + ImagesCreateDefaultResponse, + ImagesCreateEdit200Response, + ImagesCreateEditDefaultResponse, + ImagesCreateVariation200Response, + ImagesCreateVariationDefaultResponse, + ModerationsCreate200Response, + ModerationsCreateDefaultResponse, } from "./responses.js"; const responseMap: Record = { @@ -92,186 +92,196 @@ const responseMap: Record = { }; export function isUnexpected( - response: CreateTranscription200Response | CreateTranscriptionDefaultResponse -): response is CreateTranscriptionDefaultResponse; -export function isUnexpected( - response: CreateTranslation200Response | CreateTranslationDefaultResponse -): response is CreateTranslationDefaultResponse; + response: + | AudioTranscriptionsCreate200Response + | AudioTranscriptionsCreateDefaultResponse +): response is AudioTranscriptionsCreateDefaultResponse; export function isUnexpected( response: - | CreateChatCompletion200Response - | CreateChatCompletionDefaultResponse -): response is CreateChatCompletionDefaultResponse; + | AudioTranslationsCreate200Response + | AudioTranslationsCreateDefaultResponse +): response is AudioTranslationsCreateDefaultResponse; export function isUnexpected( - response: CreateFineTuningJob200Response | CreateFineTuningJobDefaultResponse -): response is CreateFineTuningJobDefaultResponse; + response: + | ChatCompletionsCreate200Response + | ChatCompletionsCreateDefaultResponse +): response is ChatCompletionsCreateDefaultResponse; export function isUnexpected( response: - | ListPaginatedFineTuningJobs200Response - | ListPaginatedFineTuningJobsDefaultResponse -): response is ListPaginatedFineTuningJobsDefaultResponse; + | FineTuningJobsCreate200Response + | FineTuningJobsCreateDefaultResponse +): response is FineTuningJobsCreateDefaultResponse; +export function isUnexpected( + response: FineTuningJobsList200Response | FineTuningJobsListDefaultResponse +): response is FineTuningJobsListDefaultResponse; export function isUnexpected( response: - | RetrieveFineTuningJob200Response - | RetrieveFineTuningJobDefaultResponse -): response is RetrieveFineTuningJobDefaultResponse; + | FineTuningJobsRetrieve200Response + | FineTuningJobsRetrieveDefaultResponse +): response is FineTuningJobsRetrieveDefaultResponse; export function isUnexpected( response: - | ListFineTuningEvents200Response - | ListFineTuningEventsDefaultResponse -): response is ListFineTuningEventsDefaultResponse; + | FineTuningJobsListEvents200Response + | FineTuningJobsListEventsDefaultResponse +): response is FineTuningJobsListEventsDefaultResponse; export function isUnexpected( - response: CancelFineTuningJob200Response | CancelFineTuningJobDefaultResponse -): response is CancelFineTuningJobDefaultResponse; + response: + | FineTuningJobsCancel200Response + | FineTuningJobsCancelDefaultResponse +): response is FineTuningJobsCancelDefaultResponse; export function isUnexpected( - response: CreateCompletion200Response | CreateCompletionDefaultResponse -): response is CreateCompletionDefaultResponse; + response: CompletionsCreate200Response | CompletionsCreateDefaultResponse +): response is CompletionsCreateDefaultResponse; export function isUnexpected( - response: CreateEdit200Response | CreateEditDefaultResponse -): response is CreateEditDefaultResponse; + response: EditsCreate200Response | EditsCreateDefaultResponse +): response is EditsCreateDefaultResponse; export function isUnexpected( - response: CreateEmbedding200Response | CreateEmbeddingDefaultResponse -): response is CreateEmbeddingDefaultResponse; + response: EmbeddingsCreate200Response | EmbeddingsCreateDefaultResponse +): response is EmbeddingsCreateDefaultResponse; export function isUnexpected( - response: ListFiles200Response | ListFilesDefaultResponse -): response is ListFilesDefaultResponse; + response: FilesList200Response | FilesListDefaultResponse +): response is FilesListDefaultResponse; export function isUnexpected( - response: CreateFile200Response | CreateFileDefaultResponse -): response is CreateFileDefaultResponse; + response: FilesCreate200Response | FilesCreateDefaultResponse +): response is FilesCreateDefaultResponse; export function isUnexpected( - response: RetrieveFile200Response | RetrieveFileDefaultResponse -): response is RetrieveFileDefaultResponse; + response: FilesRetrieve200Response | FilesRetrieveDefaultResponse +): response is FilesRetrieveDefaultResponse; export function isUnexpected( - response: DeleteFile200Response | DeleteFileDefaultResponse -): response is DeleteFileDefaultResponse; + response: + | FilesDeleteOperation200Response + | FilesDeleteOperationDefaultResponse +): response is FilesDeleteOperationDefaultResponse; export function isUnexpected( - response: DownloadFile200Response | DownloadFileDefaultResponse -): response is DownloadFileDefaultResponse; + response: FilesDownload200Response | FilesDownloadDefaultResponse +): response is FilesDownloadDefaultResponse; export function isUnexpected( - response: CreateFineTune200Response | CreateFineTuneDefaultResponse -): response is CreateFineTuneDefaultResponse; + response: FineTunesCreate200Response | FineTunesCreateDefaultResponse +): response is FineTunesCreateDefaultResponse; export function isUnexpected( - response: ListFineTunes200Response | ListFineTunesDefaultResponse -): response is ListFineTunesDefaultResponse; + response: FineTunesList200Response | FineTunesListDefaultResponse +): response is FineTunesListDefaultResponse; export function isUnexpected( - response: RetrieveFineTune200Response | RetrieveFineTuneDefaultResponse -): response is RetrieveFineTuneDefaultResponse; + response: FineTunesRetrieve200Response | FineTunesRetrieveDefaultResponse +): response is FineTunesRetrieveDefaultResponse; export function isUnexpected( - response: ListFineTuneEvents200Response | ListFineTuneEventsDefaultResponse -): response is ListFineTuneEventsDefaultResponse; + response: FineTunesListEvents200Response | FineTunesListEventsDefaultResponse +): response is FineTunesListEventsDefaultResponse; export function isUnexpected( - response: CancelFineTune200Response | CancelFineTuneDefaultResponse -): response is CancelFineTuneDefaultResponse; + response: FineTunesCancel200Response | FineTunesCancelDefaultResponse +): response is FineTunesCancelDefaultResponse; export function isUnexpected( - response: ListModels200Response | ListModelsDefaultResponse -): response is ListModelsDefaultResponse; + response: ModelsList200Response | ModelsListDefaultResponse +): response is ModelsListDefaultResponse; export function isUnexpected( - response: Retrieve200Response | RetrieveDefaultResponse -): response is RetrieveDefaultResponse; + response: ModelsRetrieve200Response | ModelsRetrieveDefaultResponse +): response is ModelsRetrieveDefaultResponse; export function isUnexpected( - response: DeleteOperation200Response | DeleteOperationDefaultResponse -): response is DeleteOperationDefaultResponse; + response: + | ModelsDeleteOperation200Response + | ModelsDeleteOperationDefaultResponse +): response is ModelsDeleteOperationDefaultResponse; export function isUnexpected( - response: CreateImage200Response | CreateImageDefaultResponse -): response is CreateImageDefaultResponse; + response: ImagesCreate200Response | ImagesCreateDefaultResponse +): response is ImagesCreateDefaultResponse; export function isUnexpected( - response: CreateImageEdit200Response | CreateImageEditDefaultResponse -): response is CreateImageEditDefaultResponse; + response: ImagesCreateEdit200Response | ImagesCreateEditDefaultResponse +): response is ImagesCreateEditDefaultResponse; export function isUnexpected( response: - | CreateImageVariation200Response - | CreateImageVariationDefaultResponse -): response is CreateImageVariationDefaultResponse; + | ImagesCreateVariation200Response + | ImagesCreateVariationDefaultResponse +): response is ImagesCreateVariationDefaultResponse; export function isUnexpected( - response: CreateModeration200Response | CreateModerationDefaultResponse -): response is CreateModerationDefaultResponse; + response: ModerationsCreate200Response | ModerationsCreateDefaultResponse +): response is ModerationsCreateDefaultResponse; export function isUnexpected( response: - | CreateTranscription200Response - | CreateTranscriptionDefaultResponse - | CreateTranslation200Response - | CreateTranslationDefaultResponse - | CreateChatCompletion200Response - | CreateChatCompletionDefaultResponse - | CreateFineTuningJob200Response - | CreateFineTuningJobDefaultResponse - | ListPaginatedFineTuningJobs200Response - | ListPaginatedFineTuningJobsDefaultResponse - | RetrieveFineTuningJob200Response - | RetrieveFineTuningJobDefaultResponse - | ListFineTuningEvents200Response - | ListFineTuningEventsDefaultResponse - | CancelFineTuningJob200Response - | CancelFineTuningJobDefaultResponse - | CreateCompletion200Response - | CreateCompletionDefaultResponse - | CreateEdit200Response - | CreateEditDefaultResponse - | CreateEmbedding200Response - | CreateEmbeddingDefaultResponse - | ListFiles200Response - | ListFilesDefaultResponse - | CreateFile200Response - | CreateFileDefaultResponse - | RetrieveFile200Response - | RetrieveFileDefaultResponse - | DeleteFile200Response - | DeleteFileDefaultResponse - | DownloadFile200Response - | DownloadFileDefaultResponse - | CreateFineTune200Response - | CreateFineTuneDefaultResponse - | ListFineTunes200Response - | ListFineTunesDefaultResponse - | RetrieveFineTune200Response - | RetrieveFineTuneDefaultResponse - | ListFineTuneEvents200Response - | ListFineTuneEventsDefaultResponse - | CancelFineTune200Response - | CancelFineTuneDefaultResponse - | ListModels200Response - | ListModelsDefaultResponse - | Retrieve200Response - | RetrieveDefaultResponse - | DeleteOperation200Response - | DeleteOperationDefaultResponse - | CreateImage200Response - | CreateImageDefaultResponse - | CreateImageEdit200Response - | CreateImageEditDefaultResponse - | CreateImageVariation200Response - | CreateImageVariationDefaultResponse - | CreateModeration200Response - | CreateModerationDefaultResponse + | AudioTranscriptionsCreate200Response + | AudioTranscriptionsCreateDefaultResponse + | AudioTranslationsCreate200Response + | AudioTranslationsCreateDefaultResponse + | ChatCompletionsCreate200Response + | ChatCompletionsCreateDefaultResponse + | FineTuningJobsCreate200Response + | FineTuningJobsCreateDefaultResponse + | FineTuningJobsList200Response + | FineTuningJobsListDefaultResponse + | FineTuningJobsRetrieve200Response + | FineTuningJobsRetrieveDefaultResponse + | FineTuningJobsListEvents200Response + | FineTuningJobsListEventsDefaultResponse + | FineTuningJobsCancel200Response + | FineTuningJobsCancelDefaultResponse + | CompletionsCreate200Response + | CompletionsCreateDefaultResponse + | EditsCreate200Response + | EditsCreateDefaultResponse + | EmbeddingsCreate200Response + | EmbeddingsCreateDefaultResponse + | FilesList200Response + | FilesListDefaultResponse + | FilesCreate200Response + | FilesCreateDefaultResponse + | FilesRetrieve200Response + | FilesRetrieveDefaultResponse + | FilesDeleteOperation200Response + | FilesDeleteOperationDefaultResponse + | FilesDownload200Response + | FilesDownloadDefaultResponse + | FineTunesCreate200Response + | FineTunesCreateDefaultResponse + | FineTunesList200Response + | FineTunesListDefaultResponse + | FineTunesRetrieve200Response + | FineTunesRetrieveDefaultResponse + | FineTunesListEvents200Response + | FineTunesListEventsDefaultResponse + | FineTunesCancel200Response + | FineTunesCancelDefaultResponse + | ModelsList200Response + | ModelsListDefaultResponse + | ModelsRetrieve200Response + | ModelsRetrieveDefaultResponse + | ModelsDeleteOperation200Response + | ModelsDeleteOperationDefaultResponse + | ImagesCreate200Response + | ImagesCreateDefaultResponse + | ImagesCreateEdit200Response + | ImagesCreateEditDefaultResponse + | ImagesCreateVariation200Response + | ImagesCreateVariationDefaultResponse + | ModerationsCreate200Response + | ModerationsCreateDefaultResponse ): response is - | CreateTranscriptionDefaultResponse - | CreateTranslationDefaultResponse - | CreateChatCompletionDefaultResponse - | CreateFineTuningJobDefaultResponse - | ListPaginatedFineTuningJobsDefaultResponse - | RetrieveFineTuningJobDefaultResponse - | ListFineTuningEventsDefaultResponse - | CancelFineTuningJobDefaultResponse - | CreateCompletionDefaultResponse - | CreateEditDefaultResponse - | CreateEmbeddingDefaultResponse - | ListFilesDefaultResponse - | CreateFileDefaultResponse - | RetrieveFileDefaultResponse - | DeleteFileDefaultResponse - | DownloadFileDefaultResponse - | CreateFineTuneDefaultResponse - | ListFineTunesDefaultResponse - | RetrieveFineTuneDefaultResponse - | ListFineTuneEventsDefaultResponse - | CancelFineTuneDefaultResponse - | ListModelsDefaultResponse - | RetrieveDefaultResponse - | DeleteOperationDefaultResponse - | CreateImageDefaultResponse - | CreateImageEditDefaultResponse - | CreateImageVariationDefaultResponse - | CreateModerationDefaultResponse { + | AudioTranscriptionsCreateDefaultResponse + | AudioTranslationsCreateDefaultResponse + | ChatCompletionsCreateDefaultResponse + | FineTuningJobsCreateDefaultResponse + | FineTuningJobsListDefaultResponse + | FineTuningJobsRetrieveDefaultResponse + | FineTuningJobsListEventsDefaultResponse + | FineTuningJobsCancelDefaultResponse + | CompletionsCreateDefaultResponse + | EditsCreateDefaultResponse + | EmbeddingsCreateDefaultResponse + | FilesListDefaultResponse + | FilesCreateDefaultResponse + | FilesRetrieveDefaultResponse + | FilesDeleteOperationDefaultResponse + | FilesDownloadDefaultResponse + | FineTunesCreateDefaultResponse + | FineTunesListDefaultResponse + | FineTunesRetrieveDefaultResponse + | FineTunesListEventsDefaultResponse + | FineTunesCancelDefaultResponse + | ModelsListDefaultResponse + | ModelsRetrieveDefaultResponse + | ModelsDeleteOperationDefaultResponse + | ImagesCreateDefaultResponse + | ImagesCreateEditDefaultResponse + | ImagesCreateVariationDefaultResponse + | ModerationsCreateDefaultResponse { const lroOriginal = response.headers["x-ms-original-url"]; const url = new URL(lroOriginal ?? response.request.url); const method = response.request.method; diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/parameters.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/parameters.ts index 062d5eb118..4b6ba14fef 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/parameters.ts +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/parameters.ts @@ -18,120 +18,122 @@ import { CreateModerationRequest, } from "./models.js"; -export interface CreateTranscriptionBodyParam { +export interface AudioTranscriptionsCreateBodyParam { body: CreateTranscriptionRequest; } -export interface CreateTranscriptionMediaTypesParam { +export interface AudioTranscriptionsCreateMediaTypesParam { contentType: "multipart/form-data"; } -export type CreateTranscriptionParameters = CreateTranscriptionMediaTypesParam & - CreateTranscriptionBodyParam & - RequestParameters; +export type AudioTranscriptionsCreateParameters = + AudioTranscriptionsCreateMediaTypesParam & + AudioTranscriptionsCreateBodyParam & + RequestParameters; -export interface CreateTranslationBodyParam { +export interface AudioTranslationsCreateBodyParam { body: CreateTranslationRequest; } -export interface CreateTranslationMediaTypesParam { +export interface AudioTranslationsCreateMediaTypesParam { contentType: "multipart/form-data"; } -export type CreateTranslationParameters = CreateTranslationMediaTypesParam & - CreateTranslationBodyParam & - RequestParameters; +export type AudioTranslationsCreateParameters = + AudioTranslationsCreateMediaTypesParam & + AudioTranslationsCreateBodyParam & + RequestParameters; -export interface CreateChatCompletionBodyParam { +export interface ChatCompletionsCreateBodyParam { body?: CreateChatCompletionRequest; } -export type CreateChatCompletionParameters = CreateChatCompletionBodyParam & +export type ChatCompletionsCreateParameters = ChatCompletionsCreateBodyParam & RequestParameters; -export interface CreateFineTuningJobBodyParam { +export interface FineTuningJobsCreateBodyParam { body: CreateFineTuningJobRequest; } -export type CreateFineTuningJobParameters = CreateFineTuningJobBodyParam & +export type FineTuningJobsCreateParameters = FineTuningJobsCreateBodyParam & RequestParameters; -export interface ListPaginatedFineTuningJobsQueryParamProperties { +export interface FineTuningJobsListQueryParamProperties { /** Identifier for the last job from the previous pagination request. */ after?: string; /** Number of fine-tuning jobs to retrieve. */ limit?: number; } -export interface ListPaginatedFineTuningJobsQueryParam { - queryParameters?: ListPaginatedFineTuningJobsQueryParamProperties; +export interface FineTuningJobsListQueryParam { + queryParameters?: FineTuningJobsListQueryParamProperties; } -export type ListPaginatedFineTuningJobsParameters = - ListPaginatedFineTuningJobsQueryParam & RequestParameters; -export type RetrieveFineTuningJobParameters = RequestParameters; +export type FineTuningJobsListParameters = FineTuningJobsListQueryParam & + RequestParameters; +export type FineTuningJobsRetrieveParameters = RequestParameters; -export interface ListFineTuningEventsQueryParamProperties { +export interface FineTuningJobsListEventsQueryParamProperties { /** Identifier for the last event from the previous pagination request. */ after?: string; /** Number of events to retrieve. */ limit?: number; } -export interface ListFineTuningEventsQueryParam { - queryParameters?: ListFineTuningEventsQueryParamProperties; +export interface FineTuningJobsListEventsQueryParam { + queryParameters?: FineTuningJobsListEventsQueryParamProperties; } -export type ListFineTuningEventsParameters = ListFineTuningEventsQueryParam & - RequestParameters; -export type CancelFineTuningJobParameters = RequestParameters; +export type FineTuningJobsListEventsParameters = + FineTuningJobsListEventsQueryParam & RequestParameters; +export type FineTuningJobsCancelParameters = RequestParameters; -export interface CreateCompletionBodyParam { +export interface CompletionsCreateBodyParam { body?: CreateCompletionRequest; } -export type CreateCompletionParameters = CreateCompletionBodyParam & +export type CompletionsCreateParameters = CompletionsCreateBodyParam & RequestParameters; -export interface CreateEditBodyParam { +export interface EditsCreateBodyParam { body: CreateEditRequest; } -export type CreateEditParameters = CreateEditBodyParam & RequestParameters; +export type EditsCreateParameters = EditsCreateBodyParam & RequestParameters; -export interface CreateEmbeddingBodyParam { +export interface EmbeddingsCreateBodyParam { body: CreateEmbeddingRequest; } -export type CreateEmbeddingParameters = CreateEmbeddingBodyParam & +export type EmbeddingsCreateParameters = EmbeddingsCreateBodyParam & RequestParameters; -export type ListFilesParameters = RequestParameters; +export type FilesListParameters = RequestParameters; -export interface CreateFileBodyParam { +export interface FilesCreateBodyParam { body: CreateFileRequest; } -export interface CreateFileMediaTypesParam { +export interface FilesCreateMediaTypesParam { contentType: "multipart/form-data"; } -export type CreateFileParameters = CreateFileMediaTypesParam & - CreateFileBodyParam & +export type FilesCreateParameters = FilesCreateMediaTypesParam & + FilesCreateBodyParam & RequestParameters; -export type RetrieveFileParameters = RequestParameters; -export type DeleteFileParameters = RequestParameters; -export type DownloadFileParameters = RequestParameters; +export type FilesRetrieveParameters = RequestParameters; +export type FilesDeleteParameters = RequestParameters; +export type FilesDownloadParameters = RequestParameters; -export interface CreateFineTuneBodyParam { +export interface FineTunesCreateBodyParam { body: CreateFineTuneRequest; } -export type CreateFineTuneParameters = CreateFineTuneBodyParam & +export type FineTunesCreateParameters = FineTunesCreateBodyParam & RequestParameters; -export type ListFineTunesParameters = RequestParameters; -export type RetrieveFineTuneParameters = RequestParameters; +export type FineTunesListParameters = RequestParameters; +export type FineTunesRetrieveParameters = RequestParameters; -export interface ListFineTuneEventsQueryParamProperties { +export interface FineTunesListEventsQueryParamProperties { /** * Whether to stream events for the fine-tune job. If set to true, events will be sent as * data-only @@ -144,51 +146,51 @@ export interface ListFineTuneEventsQueryParamProperties { stream?: boolean; } -export interface ListFineTuneEventsQueryParam { - queryParameters?: ListFineTuneEventsQueryParamProperties; +export interface FineTunesListEventsQueryParam { + queryParameters?: FineTunesListEventsQueryParamProperties; } -export type ListFineTuneEventsParameters = ListFineTuneEventsQueryParam & +export type FineTunesListEventsParameters = FineTunesListEventsQueryParam & RequestParameters; -export type CancelFineTuneParameters = RequestParameters; -export type ListModelsParameters = RequestParameters; -export type RetrieveParameters = RequestParameters; -export type DeleteParameters = RequestParameters; +export type FineTunesCancelParameters = RequestParameters; +export type ModelsListParameters = RequestParameters; +export type ModelsRetrieveParameters = RequestParameters; +export type ModelsDeleteParameters = RequestParameters; -export interface CreateImageBodyParam { +export interface ImagesCreateBodyParam { body: CreateImageRequest; } -export type CreateImageParameters = CreateImageBodyParam & RequestParameters; +export type ImagesCreateParameters = ImagesCreateBodyParam & RequestParameters; -export interface CreateImageEditBodyParam { +export interface ImagesCreateEditBodyParam { body: CreateImageEditRequest; } -export interface CreateImageEditMediaTypesParam { +export interface ImagesCreateEditMediaTypesParam { contentType: "multipart/form-data"; } -export type CreateImageEditParameters = CreateImageEditMediaTypesParam & - CreateImageEditBodyParam & +export type ImagesCreateEditParameters = ImagesCreateEditMediaTypesParam & + ImagesCreateEditBodyParam & RequestParameters; -export interface CreateImageVariationBodyParam { +export interface ImagesCreateVariationBodyParam { body: CreateImageVariationRequest; } -export interface CreateImageVariationMediaTypesParam { +export interface ImagesCreateVariationMediaTypesParam { contentType: "multipart/form-data"; } -export type CreateImageVariationParameters = - CreateImageVariationMediaTypesParam & - CreateImageVariationBodyParam & +export type ImagesCreateVariationParameters = + ImagesCreateVariationMediaTypesParam & + ImagesCreateVariationBodyParam & RequestParameters; -export interface CreateModerationBodyParam { +export interface ModerationsCreateBodyParam { body: CreateModerationRequest; } -export type CreateModerationParameters = CreateModerationBodyParam & +export type ModerationsCreateParameters = ModerationsCreateBodyParam & RequestParameters; diff --git a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/responses.ts b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/responses.ts index 829265b555..e5d8f3c30a 100644 --- a/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/responses.ts +++ b/packages/typespec-test/test/openai_generic/generated/typespec-ts/src/rest/responses.ts @@ -27,310 +27,309 @@ import { } from "./outputModels.js"; /** The request has succeeded. */ -export interface CreateTranscription200Response extends HttpResponse { +export interface AudioTranscriptionsCreate200Response extends HttpResponse { status: "200"; body: CreateTranscriptionResponseOutput; } -export interface CreateTranscriptionDefaultResponse extends HttpResponse { +export interface AudioTranscriptionsCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateTranslation200Response extends HttpResponse { +export interface AudioTranslationsCreate200Response extends HttpResponse { status: "200"; body: CreateTranslationResponseOutput; } -export interface CreateTranslationDefaultResponse extends HttpResponse { +export interface AudioTranslationsCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateChatCompletion200Response extends HttpResponse { +export interface ChatCompletionsCreate200Response extends HttpResponse { status: "200"; body: CreateChatCompletionResponseOutput; } -export interface CreateChatCompletionDefaultResponse extends HttpResponse { +export interface ChatCompletionsCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateFineTuningJob200Response extends HttpResponse { +export interface FineTuningJobsCreate200Response extends HttpResponse { status: "200"; body: FineTuningJobOutput; } -export interface CreateFineTuningJobDefaultResponse extends HttpResponse { +export interface FineTuningJobsCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface ListPaginatedFineTuningJobs200Response extends HttpResponse { +export interface FineTuningJobsList200Response extends HttpResponse { status: "200"; body: ListPaginatedFineTuningJobsResponseOutput; } -export interface ListPaginatedFineTuningJobsDefaultResponse - extends HttpResponse { +export interface FineTuningJobsListDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface RetrieveFineTuningJob200Response extends HttpResponse { +export interface FineTuningJobsRetrieve200Response extends HttpResponse { status: "200"; body: FineTuningJobOutput; } -export interface RetrieveFineTuningJobDefaultResponse extends HttpResponse { +export interface FineTuningJobsRetrieveDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface ListFineTuningEvents200Response extends HttpResponse { +export interface FineTuningJobsListEvents200Response extends HttpResponse { status: "200"; body: ListFineTuningJobEventsResponseOutput; } -export interface ListFineTuningEventsDefaultResponse extends HttpResponse { +export interface FineTuningJobsListEventsDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CancelFineTuningJob200Response extends HttpResponse { +export interface FineTuningJobsCancel200Response extends HttpResponse { status: "200"; body: FineTuningJobOutput; } -export interface CancelFineTuningJobDefaultResponse extends HttpResponse { +export interface FineTuningJobsCancelDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateCompletion200Response extends HttpResponse { +export interface CompletionsCreate200Response extends HttpResponse { status: "200"; body: CreateCompletionResponseOutput; } -export interface CreateCompletionDefaultResponse extends HttpResponse { +export interface CompletionsCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateEdit200Response extends HttpResponse { +export interface EditsCreate200Response extends HttpResponse { status: "200"; body: CreateEditResponseOutput; } -export interface CreateEditDefaultResponse extends HttpResponse { +export interface EditsCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateEmbedding200Response extends HttpResponse { +export interface EmbeddingsCreate200Response extends HttpResponse { status: "200"; body: CreateEmbeddingResponseOutput; } -export interface CreateEmbeddingDefaultResponse extends HttpResponse { +export interface EmbeddingsCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface ListFiles200Response extends HttpResponse { +export interface FilesList200Response extends HttpResponse { status: "200"; body: ListFilesResponseOutput; } -export interface ListFilesDefaultResponse extends HttpResponse { +export interface FilesListDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateFile200Response extends HttpResponse { +export interface FilesCreate200Response extends HttpResponse { status: "200"; body: OpenAIFileOutput; } -export interface CreateFileDefaultResponse extends HttpResponse { +export interface FilesCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface RetrieveFile200Response extends HttpResponse { +export interface FilesRetrieve200Response extends HttpResponse { status: "200"; body: OpenAIFileOutput; } -export interface RetrieveFileDefaultResponse extends HttpResponse { +export interface FilesRetrieveDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface DeleteFile200Response extends HttpResponse { +export interface FilesDeleteOperation200Response extends HttpResponse { status: "200"; body: DeleteFileResponseOutput; } -export interface DeleteFileDefaultResponse extends HttpResponse { +export interface FilesDeleteOperationDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface DownloadFile200Response extends HttpResponse { +export interface FilesDownload200Response extends HttpResponse { status: "200"; body: string; } -export interface DownloadFileDefaultResponse extends HttpResponse { +export interface FilesDownloadDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateFineTune200Response extends HttpResponse { +export interface FineTunesCreate200Response extends HttpResponse { status: "200"; body: FineTuneOutput; } -export interface CreateFineTuneDefaultResponse extends HttpResponse { +export interface FineTunesCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface ListFineTunes200Response extends HttpResponse { +export interface FineTunesList200Response extends HttpResponse { status: "200"; body: ListFineTunesResponseOutput; } -export interface ListFineTunesDefaultResponse extends HttpResponse { +export interface FineTunesListDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface RetrieveFineTune200Response extends HttpResponse { +export interface FineTunesRetrieve200Response extends HttpResponse { status: "200"; body: FineTuneOutput; } -export interface RetrieveFineTuneDefaultResponse extends HttpResponse { +export interface FineTunesRetrieveDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface ListFineTuneEvents200Response extends HttpResponse { +export interface FineTunesListEvents200Response extends HttpResponse { status: "200"; body: ListFineTuneEventsResponseOutput; } -export interface ListFineTuneEventsDefaultResponse extends HttpResponse { +export interface FineTunesListEventsDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CancelFineTune200Response extends HttpResponse { +export interface FineTunesCancel200Response extends HttpResponse { status: "200"; body: FineTuneOutput; } -export interface CancelFineTuneDefaultResponse extends HttpResponse { +export interface FineTunesCancelDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface ListModels200Response extends HttpResponse { +export interface ModelsList200Response extends HttpResponse { status: "200"; body: ListModelsResponseOutput; } -export interface ListModelsDefaultResponse extends HttpResponse { +export interface ModelsListDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface Retrieve200Response extends HttpResponse { +export interface ModelsRetrieve200Response extends HttpResponse { status: "200"; body: ModelOutput; } -export interface RetrieveDefaultResponse extends HttpResponse { +export interface ModelsRetrieveDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface DeleteOperation200Response extends HttpResponse { +export interface ModelsDeleteOperation200Response extends HttpResponse { status: "200"; body: DeleteModelResponseOutput; } -export interface DeleteOperationDefaultResponse extends HttpResponse { +export interface ModelsDeleteOperationDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateImage200Response extends HttpResponse { +export interface ImagesCreate200Response extends HttpResponse { status: "200"; body: ImagesResponseOutput; } -export interface CreateImageDefaultResponse extends HttpResponse { +export interface ImagesCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateImageEdit200Response extends HttpResponse { +export interface ImagesCreateEdit200Response extends HttpResponse { status: "200"; body: ImagesResponseOutput; } -export interface CreateImageEditDefaultResponse extends HttpResponse { +export interface ImagesCreateEditDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateImageVariation200Response extends HttpResponse { +export interface ImagesCreateVariation200Response extends HttpResponse { status: "200"; body: ImagesResponseOutput; } -export interface CreateImageVariationDefaultResponse extends HttpResponse { +export interface ImagesCreateVariationDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } /** The request has succeeded. */ -export interface CreateModeration200Response extends HttpResponse { +export interface ModerationsCreate200Response extends HttpResponse { status: "200"; body: CreateModerationResponseOutput; } -export interface CreateModerationDefaultResponse extends HttpResponse { +export interface ModerationsCreateDefaultResponse extends HttpResponse { status: string; body: ErrorResponseOutput; } diff --git a/packages/typespec-test/test/openai_generic/spec/audio/operations.tsp b/packages/typespec-test/test/openai_generic/spec/audio/operations.tsp index 636fb941ac..25aeafe8f2 100644 --- a/packages/typespec-test/test/openai_generic/spec/audio/operations.tsp +++ b/packages/typespec-test/test/openai_generic/spec/audio/operations.tsp @@ -15,7 +15,7 @@ namespace Audio { @operationId("createTranscription") @tag("OpenAI") @summary("Transcribes audio into the input language.") - createTranscription( + create( @header contentType: "multipart/form-data", @body audio: CreateTranscriptionRequest, ): CreateTranscriptionResponse | ErrorResponse; @@ -27,7 +27,7 @@ namespace Audio { @operationId("createTranslation") @tag("OpenAI") @summary("Transcribes audio into the input language.") - createTranslation( + create( @header contentType: "multipart/form-data", @body audio: CreateTranslationRequest, ): CreateTranslationResponse | ErrorResponse; diff --git a/packages/typespec-test/test/openai_generic/spec/completions/chat-meta.tsp b/packages/typespec-test/test/openai_generic/spec/completions/chat-meta.tsp index 7823da41d5..fe8b365922 100644 --- a/packages/typespec-test/test/openai_generic/spec/completions/chat-meta.tsp +++ b/packages/typespec-test/test/openai_generic/spec/completions/chat-meta.tsp @@ -1,6 +1,6 @@ using TypeSpec.OpenAPI; -@@extension(OpenAI.Completions.createCompletion, +@@extension(OpenAI.Completions.create, "x-oaiMeta", { name: "Create chat completion", diff --git a/packages/typespec-test/test/openai_generic/spec/completions/operations.tsp b/packages/typespec-test/test/openai_generic/spec/completions/operations.tsp index d53245f7c7..e317a5fae8 100644 --- a/packages/typespec-test/test/openai_generic/spec/completions/operations.tsp +++ b/packages/typespec-test/test/openai_generic/spec/completions/operations.tsp @@ -17,7 +17,7 @@ namespace Chat { @tag("OpenAI") @post @operationId("createChatCompletion") - createChatCompletion( + create( ...CreateChatCompletionRequest, ): CreateChatCompletionResponse | ErrorResponse; } @@ -27,7 +27,7 @@ interface Completions { @tag("OpenAI") @post @operationId("createCompletion") - createCompletion( + create( ...CreateCompletionRequest, ): CreateCompletionResponse | ErrorResponse; } diff --git a/packages/typespec-test/test/openai_generic/spec/edits/operations.tsp b/packages/typespec-test/test/openai_generic/spec/edits/operations.tsp index 08497364e6..af49dc57b8 100644 --- a/packages/typespec-test/test/openai_generic/spec/edits/operations.tsp +++ b/packages/typespec-test/test/openai_generic/spec/edits/operations.tsp @@ -15,5 +15,5 @@ interface Edits { @post @tag("OpenAI") @operationId("createEdit") - createEdit(@body edit: CreateEditRequest): CreateEditResponse | ErrorResponse; + create(@body edit: CreateEditRequest): CreateEditResponse | ErrorResponse; } diff --git a/packages/typespec-test/test/openai_generic/spec/embeddings/operations.tsp b/packages/typespec-test/test/openai_generic/spec/embeddings/operations.tsp index 012d97c586..9fecde12dc 100644 --- a/packages/typespec-test/test/openai_generic/spec/embeddings/operations.tsp +++ b/packages/typespec-test/test/openai_generic/spec/embeddings/operations.tsp @@ -15,7 +15,7 @@ interface Embeddings { @summary("Creates an embedding vector representing the input text.") @post @operationId("createEmbedding") - createEmbedding( + create( @body embedding: CreateEmbeddingRequest, ): CreateEmbeddingResponse | ErrorResponse; } diff --git a/packages/typespec-test/test/openai_generic/spec/files/operations.tsp b/packages/typespec-test/test/openai_generic/spec/files/operations.tsp index 2e601ae030..ae2f6cfd5c 100644 --- a/packages/typespec-test/test/openai_generic/spec/files/operations.tsp +++ b/packages/typespec-test/test/openai_generic/spec/files/operations.tsp @@ -15,13 +15,13 @@ interface Files { @get @summary("Returns a list of files that belong to the user's organization.") @operationId("listFiles") - listFiles(): ListFilesResponse | ErrorResponse; + list(): ListFilesResponse | ErrorResponse; @tag("OpenAI") @post @summary("Returns a list of files that belong to the user's organization.") @operationId("createFile") - createFile( + create( @header contentType: "multipart/form-data", @body file: CreateFileRequest, ): OpenAIFile | ErrorResponse; @@ -31,7 +31,7 @@ interface Files { @summary("Returns information about a specific file.") @operationId("retrieveFile") @route("/files/{file_id}") - retrieveFile( + retrieve( /** The ID of the file to use for this request. */ @path file_id: string, ): OpenAIFile | ErrorResponse; @@ -41,7 +41,7 @@ interface Files { @summary("Delete a file") @operationId("deleteFile") @route("/files/{file_id}") - deleteFile( + delete( /** The ID of the file to use for this request. */ @path file_id: string, ): DeleteFileResponse | ErrorResponse; @@ -51,7 +51,7 @@ interface Files { @get @summary("Returns the contents of the specified file.") @operationId("downloadFile") - downloadFile( + download( /** The ID of the file to use for this request. */ @path file_id: string, ): string | ErrorResponse; diff --git a/packages/typespec-test/test/openai_generic/spec/fine-tuning/operations.tsp b/packages/typespec-test/test/openai_generic/spec/fine-tuning/operations.tsp index 15491f62e8..2ef0eccc43 100644 --- a/packages/typespec-test/test/openai_generic/spec/fine-tuning/operations.tsp +++ b/packages/typespec-test/test/openai_generic/spec/fine-tuning/operations.tsp @@ -24,14 +24,14 @@ namespace FineTuning { @post @tag("OpenAI") @operationId("createFineTuningJob") - createFineTuningJob( + create( @body job: CreateFineTuningJobRequest, ): FineTuningJob | ErrorResponse; @get @tag("OpenAI") @operationId("listPaginatedFineTuningJobs") - listPaginatedFineTuningJobs( + list( /** Identifier for the last job from the previous pagination request. */ @query after?: string, @@ -48,7 +48,7 @@ namespace FineTuning { @tag("OpenAI") @get @operationId("retrieveFineTuningJob") - retrieveFineTuningJob( + retrieve( @path fine_tuning_job_id: string, ): FineTuningJob | ErrorResponse; @@ -57,7 +57,7 @@ namespace FineTuning { @route("{fine_tuning_job_id}/events") @get @operationId("listFineTuningEvents") - listFineTuningEvents( + listEvents( /** The ID of the fine-tuning job to get events for. */ @path fine_tuning_job_id: string, @@ -73,7 +73,7 @@ namespace FineTuning { @route("{fine_tuning_job_id}/cancel") @post @operationId("cancelFineTuningJob") - cancelFineTuningJob( + cancel( /** The ID of the fine-tuning job to cancel. */ @path fine_tuning_job_id: string, ): FineTuningJob | ErrorResponse; @@ -93,7 +93,7 @@ interface FineTunes { [Learn more about fine-tuning](/docs/guides/legacy-fine-tuning) """) @operationId("createFineTune") - createFineTune( + create( @body fine_tune: CreateFineTuneRequest, ): FineTune | ErrorResponse; @@ -102,7 +102,7 @@ interface FineTunes { @tag("OpenAI") @summary("List your organization's fine-tuning jobs") @operationId("listFineTunes") - listFineTunes(): ListFineTunesResponse | ErrorResponse; + list(): ListFineTunesResponse | ErrorResponse; #deprecated "deprecated" @get @@ -114,7 +114,7 @@ interface FineTunes { [Learn more about fine-tuning](/docs/guides/legacy-fine-tuning) """) @operationId("retrieveFineTune") - retrieveFineTune( + retrieve( /** The ID of the fine-tune job */ @path fine_tune_id: string, ): FineTune | ErrorResponse; @@ -125,7 +125,7 @@ interface FineTunes { @tag("OpenAI") @summary("Get fine-grained status updates for a fine-tune job.") @operationId("listFineTuneEvents") - listFineTuneEvents( + listEvents( /** The ID of the fine-tune job to get events for. */ @path fine_tune_id: string, @@ -147,7 +147,7 @@ interface FineTunes { @tag("OpenAI") @summary("Immediately cancel a fine-tune job.") @operationId("cancelFineTune") - cancelFineTune( + cancel( /** The ID of the fine-tune job to cancel */ @path fine_tune_id: string, ): FineTune | ErrorResponse; @@ -162,7 +162,7 @@ interface Models { owner and availability. """) @operationId("listModels") - listModels(): ListModelsResponse | ErrorResponse; + list(): ListModelsResponse | ErrorResponse; @get @route("{model}") diff --git a/packages/typespec-test/test/openai_generic/spec/images/operations.tsp b/packages/typespec-test/test/openai_generic/spec/images/operations.tsp index 09203262b1..562644d5ac 100644 --- a/packages/typespec-test/test/openai_generic/spec/images/operations.tsp +++ b/packages/typespec-test/test/openai_generic/spec/images/operations.tsp @@ -16,14 +16,14 @@ interface Images { @operationId("createImage") @tag("OpenAI") @summary("Creates an image given a prompt") - createImage(@body image: CreateImageRequest): ImagesResponse | ErrorResponse; + create(@body image: CreateImageRequest): ImagesResponse | ErrorResponse; @route("edits") @post @operationId("createImageEdit") @tag("OpenAI") @summary("Creates an edited or extended image given an original image and a prompt.") - createImageEdit( + createEdit( @header contentType: "multipart/form-data", @body image: CreateImageEditRequest, ): ImagesResponse | ErrorResponse; @@ -33,7 +33,7 @@ interface Images { @operationId("createImageVariation") @tag("OpenAI") @summary("Creates an edited or extended image given an original image and a prompt.") - createImageVariation( + createVariation( @header contentType: "multipart/form-data", @body image: CreateImageVariationRequest, ): ImagesResponse | ErrorResponse; diff --git a/packages/typespec-test/test/openai_generic/spec/moderation/operations.tsp b/packages/typespec-test/test/openai_generic/spec/moderation/operations.tsp index 5f29bc3be8..4a22b97276 100644 --- a/packages/typespec-test/test/openai_generic/spec/moderation/operations.tsp +++ b/packages/typespec-test/test/openai_generic/spec/moderation/operations.tsp @@ -14,7 +14,7 @@ interface Moderations { @operationId("createModeration") @tag("OpenAI") @summary("Classifies if text violates OpenAI's Content Policy") - createModeration( + create( @body content: CreateModerationRequest, ): CreateModerationResponse | ErrorResponse; } diff --git a/packages/typespec-test/test/openai_modular/spec/tspconfig.yaml b/packages/typespec-test/test/openai_modular/spec/tspconfig.yaml index 10585a788e..4efd4b5f90 100644 --- a/packages/typespec-test/test/openai_modular/spec/tspconfig.yaml +++ b/packages/typespec-test/test/openai_modular/spec/tspconfig.yaml @@ -4,6 +4,7 @@ options: "@azure-tools/typespec-ts": azureSdkForJs: false isModularLibrary: true + hierarchyClient: false "emitter-output-dir": "{project-root}/../generated/typespec-ts" packageDetails: name: "@msinternal/openai_modular" diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/package.json b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/package.json index 229c9a76cc..97da0a213b 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/package.json +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/package.json @@ -23,6 +23,10 @@ "./models": { "types": "./types/src/models/index.d.ts", "import": "./dist-esm/src/models/index.js" + }, + "./api/widgets": { + "types": "./types/src/api/widgets/index.d.ts", + "import": "./dist-esm/src/api/widgets/index.js" } }, "repository": "github:Azure/azure-sdk-for-js", diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/review/widget_dpg.api.md b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/review/widget_dpg.api.md index edbbf5614a..59b244add6 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/review/widget_dpg.api.md +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/review/widget_dpg.api.md @@ -15,70 +15,81 @@ export interface AnalyzeResult { } // @public (undocumented) -export interface AnalyzeWidgetOptions extends OperationOptions { +export interface CreateWidget { + color: "red" | "blue"; + weight: number; } // @public (undocumented) -export interface CreateWidget { +export interface UpdateWidget { + color?: "red" | "blue"; + weight?: number; +} + +// @public (undocumented) +export interface Widget { color: "red" | "blue"; + id: string; weight: number; } // @public (undocumented) -export interface CreateWidgetOptions extends OperationOptions { +export interface WidgetsAnalyzeWidgetOptions extends OperationOptions { } // @public (undocumented) -export interface DeleteWidgetOptions extends OperationOptions { +export interface WidgetsCreateWidgetOptions extends OperationOptions { } // @public (undocumented) -export interface GetWidgetOptions extends OperationOptions { +export interface WidgetsDeleteWidgetOptions extends OperationOptions { } // @public (undocumented) -export interface ListWidgetsOptions extends OperationOptions { - // (undocumented) - nullableDateHeader?: Date | null; - // (undocumented) - nullableOptionalHeader?: string | null; - // (undocumented) - optionalDateHeader?: Date; - // (undocumented) - optionalHeader?: string; +export class WidgetServiceClient { + constructor(endpoint: string, options?: WidgetServiceClientOptions); + readonly pipeline: Pipeline; + readonly widgets: WidgetsOperations; } // @public (undocumented) -export interface UpdateWidget { - color?: "red" | "blue"; - weight?: number; +export interface WidgetServiceClientOptions extends ClientOptions { } // @public (undocumented) -export interface UpdateWidgetOptions extends OperationOptions { +export interface WidgetsGetWidgetOptions extends OperationOptions { } // @public (undocumented) -export interface Widget { - color: "red" | "blue"; - id: string; - weight: number; +export interface WidgetsListWidgetsOptions extends OperationOptions { + // (undocumented) + nullableDateHeader?: Date | null; + // (undocumented) + nullableOptionalHeader?: string | null; + // (undocumented) + optionalDateHeader?: Date; + // (undocumented) + optionalHeader?: string; } // @public (undocumented) -export class WidgetServiceClient { - constructor(endpoint: string, options?: WidgetServiceClientOptions); - analyzeWidget(id: string, options?: AnalyzeWidgetOptions): Promise; - createWidget(body: CreateWidget, options?: CreateWidgetOptions): Promise; - deleteWidget(id: string, options?: DeleteWidgetOptions): Promise; - getWidget(id: string, options?: GetWidgetOptions): Promise; - listWidgets(requiredHeader: string, bytesHeader: Uint8Array, value: Uint8Array, csvArrayHeader: Uint8Array[], utcDateHeader: Date, options?: ListWidgetsOptions): Promise; - readonly pipeline: Pipeline; - updateWidget(id: string, body: UpdateWidget, options?: UpdateWidgetOptions): Promise; +export interface WidgetsOperations { + // (undocumented) + analyzeWidget: (id: string, options?: WidgetsAnalyzeWidgetOptions) => Promise; + // (undocumented) + createWidget: (body: CreateWidget, options?: WidgetsCreateWidgetOptions) => Promise; + // (undocumented) + deleteWidget: (id: string, options?: WidgetsDeleteWidgetOptions) => Promise; + // (undocumented) + getWidget: (id: string, options?: WidgetsGetWidgetOptions) => Promise; + // (undocumented) + listWidgets: (requiredHeader: string, bytesHeader: Uint8Array, value: Uint8Array, csvArrayHeader: Uint8Array[], utcDateHeader: Date, options?: WidgetsListWidgetsOptions) => Promise; + // (undocumented) + updateWidget: (id: string, body: UpdateWidget, options?: WidgetsUpdateWidgetOptions) => Promise; } // @public (undocumented) -export interface WidgetServiceClientOptions extends ClientOptions { +export interface WidgetsUpdateWidgetOptions extends OperationOptions { } // (No @packageDocumentation comment for this package) diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/WidgetServiceClient.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/WidgetServiceClient.ts index 601eeef054..c66761b057 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/WidgetServiceClient.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/WidgetServiceClient.ts @@ -3,26 +3,10 @@ import { Pipeline } from "@azure/core-rest-pipeline"; import { - Widget, - CreateWidget, - UpdateWidget, - AnalyzeResult, -} from "./models/models.js"; + getWidgetsOperations, + WidgetsOperations, +} from "./classic/widgets/index.js"; import { - ListWidgetsOptions, - GetWidgetOptions, - CreateWidgetOptions, - UpdateWidgetOptions, - DeleteWidgetOptions, - AnalyzeWidgetOptions, -} from "./models/options.js"; -import { - listWidgets, - getWidget, - createWidget, - updateWidget, - deleteWidget, - analyzeWidget, createWidgetService, WidgetServiceClientOptions, WidgetServiceContext, @@ -38,78 +22,9 @@ export class WidgetServiceClient { constructor(endpoint: string, options: WidgetServiceClientOptions = {}) { this._client = createWidgetService(endpoint, options); this.pipeline = this._client.pipeline; + this.widgets = getWidgetsOperations(this._client); } - /** - * List all widgets in the system. This operation is not paginated, and returns a simple array of widgets. - * - * It does not accept any options or parameters. - */ - listWidgets( - requiredHeader: string, - bytesHeader: Uint8Array, - value: Uint8Array, - csvArrayHeader: Uint8Array[], - utcDateHeader: Date, - options: ListWidgetsOptions = { requestOptions: {} } - ): Promise { - return listWidgets( - this._client, - requiredHeader, - bytesHeader, - value, - csvArrayHeader, - utcDateHeader, - options - ); - } - - /** Get a widget by ID. */ - getWidget( - id: string, - options: GetWidgetOptions = { requestOptions: {} } - ): Promise { - return getWidget(this._client, id, options); - } - - /** - * Create a new widget. - * - * The widget ID is not required during creation, as it is automatically set by the server. Providing an ID will - * result in an error. - */ - createWidget( - body: CreateWidget, - options: CreateWidgetOptions = { requestOptions: {} } - ): Promise { - return createWidget(this._client, body, options); - } - - /** - * Update the contents of the widget. The widget ID is required in the input, but cannot be changed. All other fields - * are optional and will be updated within the widget if provided. - */ - updateWidget( - id: string, - body: UpdateWidget, - options: UpdateWidgetOptions = { requestOptions: {} } - ): Promise { - return updateWidget(this._client, id, body, options); - } - - /** Delete a widget by ID. */ - deleteWidget( - id: string, - options: DeleteWidgetOptions = { requestOptions: {} } - ): Promise { - return deleteWidget(this._client, id, options); - } - - /** Analyze a widget. The only guarantee is that this method will return a string containing the results of the analysis. */ - analyzeWidget( - id: string, - options: AnalyzeWidgetOptions = { requestOptions: {} } - ): Promise { - return analyzeWidget(this._client, id, options); - } + /** The operation groups for Widgets */ + public readonly widgets: WidgetsOperations; } diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/index.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/index.ts index 3200bb6717..2f4abd0ea6 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/index.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/index.ts @@ -1,14 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -export { - listWidgets, - getWidget, - createWidget, - updateWidget, - deleteWidget, - analyzeWidget, -} from "./operations.js"; export { createWidgetService, WidgetServiceClientOptions, diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/operations.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/widgets/index.ts similarity index 88% rename from packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/operations.ts rename to packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/widgets/index.ts index 98895ed1e5..ec20036e54 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/operations.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/api/widgets/index.ts @@ -6,7 +6,7 @@ import { CreateWidget, UpdateWidget, AnalyzeResult, -} from "../models/models.js"; +} from "../../models/models.js"; import { AnalyzeWidget200Response, AnalyzeWidgetDefaultResponse, @@ -23,20 +23,20 @@ import { UpdateWidget200Response, UpdateWidgetDefaultResponse, WidgetServiceContext as Client, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, } from "@azure-rest/core-client"; import { uint8ArrayToString } from "@azure/core-util"; import { - ListWidgetsOptions, - GetWidgetOptions, - CreateWidgetOptions, - UpdateWidgetOptions, - DeleteWidgetOptions, - AnalyzeWidgetOptions, -} from "../models/options.js"; + WidgetsListWidgetsOptions, + WidgetsGetWidgetOptions, + WidgetsCreateWidgetOptions, + WidgetsUpdateWidgetOptions, + WidgetsDeleteWidgetOptions, + WidgetsAnalyzeWidgetOptions, +} from "../../models/options.js"; export function _listWidgetsSend( context: Client, @@ -45,7 +45,7 @@ export function _listWidgetsSend( value: Uint8Array, csvArrayHeader: Uint8Array[], utcDateHeader: Date, - options: ListWidgetsOptions = { requestOptions: {} } + options: WidgetsListWidgetsOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets") @@ -109,7 +109,7 @@ export async function listWidgets( value: Uint8Array, csvArrayHeader: Uint8Array[], utcDateHeader: Date, - options: ListWidgetsOptions = { requestOptions: {} } + options: WidgetsListWidgetsOptions = { requestOptions: {} } ): Promise { const result = await _listWidgetsSend( context, @@ -126,7 +126,7 @@ export async function listWidgets( export function _getWidgetSend( context: Client, id: string, - options: GetWidgetOptions = { requestOptions: {} } + options: WidgetsGetWidgetOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets/{id}", id) @@ -151,7 +151,7 @@ export async function _getWidgetDeserialize( export async function getWidget( context: Client, id: string, - options: GetWidgetOptions = { requestOptions: {} } + options: WidgetsGetWidgetOptions = { requestOptions: {} } ): Promise { const result = await _getWidgetSend(context, id, options); return _getWidgetDeserialize(result); @@ -160,7 +160,7 @@ export async function getWidget( export function _createWidgetSend( context: Client, body: CreateWidget, - options: CreateWidgetOptions = { requestOptions: {} } + options: WidgetsCreateWidgetOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets") @@ -193,7 +193,7 @@ export async function _createWidgetDeserialize( export async function createWidget( context: Client, body: CreateWidget, - options: CreateWidgetOptions = { requestOptions: {} } + options: WidgetsCreateWidgetOptions = { requestOptions: {} } ): Promise { const result = await _createWidgetSend(context, body, options); return _createWidgetDeserialize(result); @@ -203,7 +203,7 @@ export function _updateWidgetSend( context: Client, id: string, body: UpdateWidget, - options: UpdateWidgetOptions = { requestOptions: {} } + options: WidgetsUpdateWidgetOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets/{id}", id) @@ -235,7 +235,7 @@ export async function updateWidget( context: Client, id: string, body: UpdateWidget, - options: UpdateWidgetOptions = { requestOptions: {} } + options: WidgetsUpdateWidgetOptions = { requestOptions: {} } ): Promise { const result = await _updateWidgetSend(context, id, body, options); return _updateWidgetDeserialize(result); @@ -244,7 +244,7 @@ export async function updateWidget( export function _deleteWidgetSend( context: Client, id: string, - options: DeleteWidgetOptions = { requestOptions: {} } + options: WidgetsDeleteWidgetOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets/{id}", id) @@ -265,7 +265,7 @@ export async function _deleteWidgetDeserialize( export async function deleteWidget( context: Client, id: string, - options: DeleteWidgetOptions = { requestOptions: {} } + options: WidgetsDeleteWidgetOptions = { requestOptions: {} } ): Promise { const result = await _deleteWidgetSend(context, id, options); return _deleteWidgetDeserialize(result); @@ -274,7 +274,7 @@ export async function deleteWidget( export function _analyzeWidgetSend( context: Client, id: string, - options: AnalyzeWidgetOptions = { requestOptions: {} } + options: WidgetsAnalyzeWidgetOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets/{id}/analyze", id) @@ -297,7 +297,7 @@ export async function _analyzeWidgetDeserialize( export async function analyzeWidget( context: Client, id: string, - options: AnalyzeWidgetOptions = { requestOptions: {} } + options: WidgetsAnalyzeWidgetOptions = { requestOptions: {} } ): Promise { const result = await _analyzeWidgetSend(context, id, options); return _analyzeWidgetDeserialize(result); diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/classic/index.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/classic/index.ts new file mode 100644 index 0000000000..9416252dc3 --- /dev/null +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/classic/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { WidgetsOperations } from "./widgets/index.js"; diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/classic/widgets/index.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/classic/widgets/index.ts new file mode 100644 index 0000000000..25cc81248f --- /dev/null +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/classic/widgets/index.ts @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { WidgetServiceContext } from "../../api/WidgetServiceContext.js"; +import { + Widget, + CreateWidget, + UpdateWidget, + AnalyzeResult, +} from "../../models/models.js"; +import { + listWidgets, + getWidget, + createWidget, + updateWidget, + deleteWidget, + analyzeWidget, +} from "../../api/widgets/index.js"; +import { + WidgetsListWidgetsOptions, + WidgetsGetWidgetOptions, + WidgetsCreateWidgetOptions, + WidgetsUpdateWidgetOptions, + WidgetsDeleteWidgetOptions, + WidgetsAnalyzeWidgetOptions, +} from "../../models/options.js"; + +export interface WidgetsOperations { + listWidgets: ( + requiredHeader: string, + bytesHeader: Uint8Array, + value: Uint8Array, + csvArrayHeader: Uint8Array[], + utcDateHeader: Date, + options?: WidgetsListWidgetsOptions + ) => Promise; + getWidget: (id: string, options?: WidgetsGetWidgetOptions) => Promise; + createWidget: ( + body: CreateWidget, + options?: WidgetsCreateWidgetOptions + ) => Promise; + updateWidget: ( + id: string, + body: UpdateWidget, + options?: WidgetsUpdateWidgetOptions + ) => Promise; + deleteWidget: ( + id: string, + options?: WidgetsDeleteWidgetOptions + ) => Promise; + analyzeWidget: ( + id: string, + options?: WidgetsAnalyzeWidgetOptions + ) => Promise; +} + +export function getWidgets(context: WidgetServiceContext) { + return { + listWidgets: ( + requiredHeader: string, + bytesHeader: Uint8Array, + value: Uint8Array, + csvArrayHeader: Uint8Array[], + utcDateHeader: Date, + options?: WidgetsListWidgetsOptions + ) => + listWidgets( + context, + requiredHeader, + bytesHeader, + value, + csvArrayHeader, + utcDateHeader, + options + ), + getWidget: (id: string, options?: WidgetsGetWidgetOptions) => + getWidget(context, id, options), + createWidget: (body: CreateWidget, options?: WidgetsCreateWidgetOptions) => + createWidget(context, body, options), + updateWidget: ( + id: string, + body: UpdateWidget, + options?: WidgetsUpdateWidgetOptions + ) => updateWidget(context, id, body, options), + deleteWidget: (id: string, options?: WidgetsDeleteWidgetOptions) => + deleteWidget(context, id, options), + analyzeWidget: (id: string, options?: WidgetsAnalyzeWidgetOptions) => + analyzeWidget(context, id, options), + }; +} + +export function getWidgetsOperations( + context: WidgetServiceContext +): WidgetsOperations { + return { + ...getWidgets(context), + }; +} diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/index.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/index.ts index 6d25e4ab37..373189b51d 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/index.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/index.ts @@ -10,10 +10,11 @@ export { CreateWidget, UpdateWidget, AnalyzeResult, - ListWidgetsOptions, - GetWidgetOptions, - CreateWidgetOptions, - UpdateWidgetOptions, - DeleteWidgetOptions, - AnalyzeWidgetOptions, + WidgetsListWidgetsOptions, + WidgetsGetWidgetOptions, + WidgetsCreateWidgetOptions, + WidgetsUpdateWidgetOptions, + WidgetsDeleteWidgetOptions, + WidgetsAnalyzeWidgetOptions, } from "./models/index.js"; +export { WidgetsOperations } from "./classic/index.js"; diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/models/index.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/models/index.ts index 55d53b8098..10a2c0c468 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/models/index.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/models/index.ts @@ -3,10 +3,10 @@ export { Widget, CreateWidget, UpdateWidget, AnalyzeResult } from "./models.js"; export { - ListWidgetsOptions, - GetWidgetOptions, - CreateWidgetOptions, - UpdateWidgetOptions, - DeleteWidgetOptions, - AnalyzeWidgetOptions, + WidgetsListWidgetsOptions, + WidgetsGetWidgetOptions, + WidgetsCreateWidgetOptions, + WidgetsUpdateWidgetOptions, + WidgetsDeleteWidgetOptions, + WidgetsAnalyzeWidgetOptions, } from "./options.js"; diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/models/options.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/models/options.ts index a692005100..6268816de1 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/models/options.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/sources/generated/src/models/options.ts @@ -3,19 +3,19 @@ import { OperationOptions } from "@azure-rest/core-client"; -export interface ListWidgetsOptions extends OperationOptions { +export interface WidgetsListWidgetsOptions extends OperationOptions { optionalHeader?: string; nullableOptionalHeader?: string | null; optionalDateHeader?: Date; nullableDateHeader?: Date | null; } -export interface GetWidgetOptions extends OperationOptions {} +export interface WidgetsGetWidgetOptions extends OperationOptions {} -export interface CreateWidgetOptions extends OperationOptions {} +export interface WidgetsCreateWidgetOptions extends OperationOptions {} -export interface UpdateWidgetOptions extends OperationOptions {} +export interface WidgetsUpdateWidgetOptions extends OperationOptions {} -export interface DeleteWidgetOptions extends OperationOptions {} +export interface WidgetsDeleteWidgetOptions extends OperationOptions {} -export interface AnalyzeWidgetOptions extends OperationOptions {} +export interface WidgetsAnalyzeWidgetOptions extends OperationOptions {} diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/WidgetServiceClient.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/WidgetServiceClient.ts index 601eeef054..c66761b057 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/WidgetServiceClient.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/WidgetServiceClient.ts @@ -3,26 +3,10 @@ import { Pipeline } from "@azure/core-rest-pipeline"; import { - Widget, - CreateWidget, - UpdateWidget, - AnalyzeResult, -} from "./models/models.js"; + getWidgetsOperations, + WidgetsOperations, +} from "./classic/widgets/index.js"; import { - ListWidgetsOptions, - GetWidgetOptions, - CreateWidgetOptions, - UpdateWidgetOptions, - DeleteWidgetOptions, - AnalyzeWidgetOptions, -} from "./models/options.js"; -import { - listWidgets, - getWidget, - createWidget, - updateWidget, - deleteWidget, - analyzeWidget, createWidgetService, WidgetServiceClientOptions, WidgetServiceContext, @@ -38,78 +22,9 @@ export class WidgetServiceClient { constructor(endpoint: string, options: WidgetServiceClientOptions = {}) { this._client = createWidgetService(endpoint, options); this.pipeline = this._client.pipeline; + this.widgets = getWidgetsOperations(this._client); } - /** - * List all widgets in the system. This operation is not paginated, and returns a simple array of widgets. - * - * It does not accept any options or parameters. - */ - listWidgets( - requiredHeader: string, - bytesHeader: Uint8Array, - value: Uint8Array, - csvArrayHeader: Uint8Array[], - utcDateHeader: Date, - options: ListWidgetsOptions = { requestOptions: {} } - ): Promise { - return listWidgets( - this._client, - requiredHeader, - bytesHeader, - value, - csvArrayHeader, - utcDateHeader, - options - ); - } - - /** Get a widget by ID. */ - getWidget( - id: string, - options: GetWidgetOptions = { requestOptions: {} } - ): Promise { - return getWidget(this._client, id, options); - } - - /** - * Create a new widget. - * - * The widget ID is not required during creation, as it is automatically set by the server. Providing an ID will - * result in an error. - */ - createWidget( - body: CreateWidget, - options: CreateWidgetOptions = { requestOptions: {} } - ): Promise { - return createWidget(this._client, body, options); - } - - /** - * Update the contents of the widget. The widget ID is required in the input, but cannot be changed. All other fields - * are optional and will be updated within the widget if provided. - */ - updateWidget( - id: string, - body: UpdateWidget, - options: UpdateWidgetOptions = { requestOptions: {} } - ): Promise { - return updateWidget(this._client, id, body, options); - } - - /** Delete a widget by ID. */ - deleteWidget( - id: string, - options: DeleteWidgetOptions = { requestOptions: {} } - ): Promise { - return deleteWidget(this._client, id, options); - } - - /** Analyze a widget. The only guarantee is that this method will return a string containing the results of the analysis. */ - analyzeWidget( - id: string, - options: AnalyzeWidgetOptions = { requestOptions: {} } - ): Promise { - return analyzeWidget(this._client, id, options); - } + /** The operation groups for Widgets */ + public readonly widgets: WidgetsOperations; } diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/index.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/index.ts index 3200bb6717..2f4abd0ea6 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/index.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/index.ts @@ -1,14 +1,6 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -export { - listWidgets, - getWidget, - createWidget, - updateWidget, - deleteWidget, - analyzeWidget, -} from "./operations.js"; export { createWidgetService, WidgetServiceClientOptions, diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/operations.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/widgets/index.ts similarity index 88% rename from packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/operations.ts rename to packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/widgets/index.ts index 98895ed1e5..ec20036e54 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/operations.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/api/widgets/index.ts @@ -6,7 +6,7 @@ import { CreateWidget, UpdateWidget, AnalyzeResult, -} from "../models/models.js"; +} from "../../models/models.js"; import { AnalyzeWidget200Response, AnalyzeWidgetDefaultResponse, @@ -23,20 +23,20 @@ import { UpdateWidget200Response, UpdateWidgetDefaultResponse, WidgetServiceContext as Client, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, } from "@azure-rest/core-client"; import { uint8ArrayToString } from "@azure/core-util"; import { - ListWidgetsOptions, - GetWidgetOptions, - CreateWidgetOptions, - UpdateWidgetOptions, - DeleteWidgetOptions, - AnalyzeWidgetOptions, -} from "../models/options.js"; + WidgetsListWidgetsOptions, + WidgetsGetWidgetOptions, + WidgetsCreateWidgetOptions, + WidgetsUpdateWidgetOptions, + WidgetsDeleteWidgetOptions, + WidgetsAnalyzeWidgetOptions, +} from "../../models/options.js"; export function _listWidgetsSend( context: Client, @@ -45,7 +45,7 @@ export function _listWidgetsSend( value: Uint8Array, csvArrayHeader: Uint8Array[], utcDateHeader: Date, - options: ListWidgetsOptions = { requestOptions: {} } + options: WidgetsListWidgetsOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets") @@ -109,7 +109,7 @@ export async function listWidgets( value: Uint8Array, csvArrayHeader: Uint8Array[], utcDateHeader: Date, - options: ListWidgetsOptions = { requestOptions: {} } + options: WidgetsListWidgetsOptions = { requestOptions: {} } ): Promise { const result = await _listWidgetsSend( context, @@ -126,7 +126,7 @@ export async function listWidgets( export function _getWidgetSend( context: Client, id: string, - options: GetWidgetOptions = { requestOptions: {} } + options: WidgetsGetWidgetOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets/{id}", id) @@ -151,7 +151,7 @@ export async function _getWidgetDeserialize( export async function getWidget( context: Client, id: string, - options: GetWidgetOptions = { requestOptions: {} } + options: WidgetsGetWidgetOptions = { requestOptions: {} } ): Promise { const result = await _getWidgetSend(context, id, options); return _getWidgetDeserialize(result); @@ -160,7 +160,7 @@ export async function getWidget( export function _createWidgetSend( context: Client, body: CreateWidget, - options: CreateWidgetOptions = { requestOptions: {} } + options: WidgetsCreateWidgetOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets") @@ -193,7 +193,7 @@ export async function _createWidgetDeserialize( export async function createWidget( context: Client, body: CreateWidget, - options: CreateWidgetOptions = { requestOptions: {} } + options: WidgetsCreateWidgetOptions = { requestOptions: {} } ): Promise { const result = await _createWidgetSend(context, body, options); return _createWidgetDeserialize(result); @@ -203,7 +203,7 @@ export function _updateWidgetSend( context: Client, id: string, body: UpdateWidget, - options: UpdateWidgetOptions = { requestOptions: {} } + options: WidgetsUpdateWidgetOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets/{id}", id) @@ -235,7 +235,7 @@ export async function updateWidget( context: Client, id: string, body: UpdateWidget, - options: UpdateWidgetOptions = { requestOptions: {} } + options: WidgetsUpdateWidgetOptions = { requestOptions: {} } ): Promise { const result = await _updateWidgetSend(context, id, body, options); return _updateWidgetDeserialize(result); @@ -244,7 +244,7 @@ export async function updateWidget( export function _deleteWidgetSend( context: Client, id: string, - options: DeleteWidgetOptions = { requestOptions: {} } + options: WidgetsDeleteWidgetOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets/{id}", id) @@ -265,7 +265,7 @@ export async function _deleteWidgetDeserialize( export async function deleteWidget( context: Client, id: string, - options: DeleteWidgetOptions = { requestOptions: {} } + options: WidgetsDeleteWidgetOptions = { requestOptions: {} } ): Promise { const result = await _deleteWidgetSend(context, id, options); return _deleteWidgetDeserialize(result); @@ -274,7 +274,7 @@ export async function deleteWidget( export function _analyzeWidgetSend( context: Client, id: string, - options: AnalyzeWidgetOptions = { requestOptions: {} } + options: WidgetsAnalyzeWidgetOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/widgets/{id}/analyze", id) @@ -297,7 +297,7 @@ export async function _analyzeWidgetDeserialize( export async function analyzeWidget( context: Client, id: string, - options: AnalyzeWidgetOptions = { requestOptions: {} } + options: WidgetsAnalyzeWidgetOptions = { requestOptions: {} } ): Promise { const result = await _analyzeWidgetSend(context, id, options); return _analyzeWidgetDeserialize(result); diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/classic/index.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/classic/index.ts new file mode 100644 index 0000000000..9416252dc3 --- /dev/null +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/classic/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { WidgetsOperations } from "./widgets/index.js"; diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/classic/widgets/index.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/classic/widgets/index.ts new file mode 100644 index 0000000000..25cc81248f --- /dev/null +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/classic/widgets/index.ts @@ -0,0 +1,98 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { WidgetServiceContext } from "../../api/WidgetServiceContext.js"; +import { + Widget, + CreateWidget, + UpdateWidget, + AnalyzeResult, +} from "../../models/models.js"; +import { + listWidgets, + getWidget, + createWidget, + updateWidget, + deleteWidget, + analyzeWidget, +} from "../../api/widgets/index.js"; +import { + WidgetsListWidgetsOptions, + WidgetsGetWidgetOptions, + WidgetsCreateWidgetOptions, + WidgetsUpdateWidgetOptions, + WidgetsDeleteWidgetOptions, + WidgetsAnalyzeWidgetOptions, +} from "../../models/options.js"; + +export interface WidgetsOperations { + listWidgets: ( + requiredHeader: string, + bytesHeader: Uint8Array, + value: Uint8Array, + csvArrayHeader: Uint8Array[], + utcDateHeader: Date, + options?: WidgetsListWidgetsOptions + ) => Promise; + getWidget: (id: string, options?: WidgetsGetWidgetOptions) => Promise; + createWidget: ( + body: CreateWidget, + options?: WidgetsCreateWidgetOptions + ) => Promise; + updateWidget: ( + id: string, + body: UpdateWidget, + options?: WidgetsUpdateWidgetOptions + ) => Promise; + deleteWidget: ( + id: string, + options?: WidgetsDeleteWidgetOptions + ) => Promise; + analyzeWidget: ( + id: string, + options?: WidgetsAnalyzeWidgetOptions + ) => Promise; +} + +export function getWidgets(context: WidgetServiceContext) { + return { + listWidgets: ( + requiredHeader: string, + bytesHeader: Uint8Array, + value: Uint8Array, + csvArrayHeader: Uint8Array[], + utcDateHeader: Date, + options?: WidgetsListWidgetsOptions + ) => + listWidgets( + context, + requiredHeader, + bytesHeader, + value, + csvArrayHeader, + utcDateHeader, + options + ), + getWidget: (id: string, options?: WidgetsGetWidgetOptions) => + getWidget(context, id, options), + createWidget: (body: CreateWidget, options?: WidgetsCreateWidgetOptions) => + createWidget(context, body, options), + updateWidget: ( + id: string, + body: UpdateWidget, + options?: WidgetsUpdateWidgetOptions + ) => updateWidget(context, id, body, options), + deleteWidget: (id: string, options?: WidgetsDeleteWidgetOptions) => + deleteWidget(context, id, options), + analyzeWidget: (id: string, options?: WidgetsAnalyzeWidgetOptions) => + analyzeWidget(context, id, options), + }; +} + +export function getWidgetsOperations( + context: WidgetServiceContext +): WidgetsOperations { + return { + ...getWidgets(context), + }; +} diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/index.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/index.ts index 6d25e4ab37..373189b51d 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/index.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/index.ts @@ -10,10 +10,11 @@ export { CreateWidget, UpdateWidget, AnalyzeResult, - ListWidgetsOptions, - GetWidgetOptions, - CreateWidgetOptions, - UpdateWidgetOptions, - DeleteWidgetOptions, - AnalyzeWidgetOptions, + WidgetsListWidgetsOptions, + WidgetsGetWidgetOptions, + WidgetsCreateWidgetOptions, + WidgetsUpdateWidgetOptions, + WidgetsDeleteWidgetOptions, + WidgetsAnalyzeWidgetOptions, } from "./models/index.js"; +export { WidgetsOperations } from "./classic/index.js"; diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/models/index.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/models/index.ts index 55d53b8098..10a2c0c468 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/models/index.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/models/index.ts @@ -3,10 +3,10 @@ export { Widget, CreateWidget, UpdateWidget, AnalyzeResult } from "./models.js"; export { - ListWidgetsOptions, - GetWidgetOptions, - CreateWidgetOptions, - UpdateWidgetOptions, - DeleteWidgetOptions, - AnalyzeWidgetOptions, + WidgetsListWidgetsOptions, + WidgetsGetWidgetOptions, + WidgetsCreateWidgetOptions, + WidgetsUpdateWidgetOptions, + WidgetsDeleteWidgetOptions, + WidgetsAnalyzeWidgetOptions, } from "./options.js"; diff --git a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/models/options.ts b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/models/options.ts index a692005100..6268816de1 100644 --- a/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/models/options.ts +++ b/packages/typespec-test/test/widget_dpg/generated/typespec-ts/src/models/options.ts @@ -3,19 +3,19 @@ import { OperationOptions } from "@azure-rest/core-client"; -export interface ListWidgetsOptions extends OperationOptions { +export interface WidgetsListWidgetsOptions extends OperationOptions { optionalHeader?: string; nullableOptionalHeader?: string | null; optionalDateHeader?: Date; nullableDateHeader?: Date | null; } -export interface GetWidgetOptions extends OperationOptions {} +export interface WidgetsGetWidgetOptions extends OperationOptions {} -export interface CreateWidgetOptions extends OperationOptions {} +export interface WidgetsCreateWidgetOptions extends OperationOptions {} -export interface UpdateWidgetOptions extends OperationOptions {} +export interface WidgetsUpdateWidgetOptions extends OperationOptions {} -export interface DeleteWidgetOptions extends OperationOptions {} +export interface WidgetsDeleteWidgetOptions extends OperationOptions {} -export interface AnalyzeWidgetOptions extends OperationOptions {} +export interface WidgetsAnalyzeWidgetOptions extends OperationOptions {} diff --git a/packages/typespec-ts/src/index.ts b/packages/typespec-ts/src/index.ts index fcb210c48a..ade702ba5c 100644 --- a/packages/typespec-ts/src/index.ts +++ b/packages/typespec-ts/src/index.ts @@ -46,6 +46,7 @@ import { buildModels, buildModelsOptions } from "./modular/emitModels.js"; import { buildOperationFiles } from "./modular/buildOperations.js"; import { buildSubpathIndexFile } from "./modular/buildSubpathIndex.js"; import { buildClassicalClient } from "./modular/buildClassicalClient.js"; +import { buildClassicOperationFiles } from "./modular/buildClassicalOperationGroups.js"; import { emitPackage, emitTsConfig } from "./modular/buildProjectFiles.js"; import { getRLCClients } from "./utils/clientUtils.js"; import { join } from "path"; @@ -182,8 +183,20 @@ export async function $onEmit(context: EmitContext) { ); buildClientContext(dpgContext, modularCodeModel, subClient); buildSubpathIndexFile(modularCodeModel, subClient, "models"); - buildSubpathIndexFile(modularCodeModel, subClient, "api"); + if (dpgContext.rlcOptions?.hierarchyClient) { + buildSubpathIndexFile(modularCodeModel, subClient, "api"); + } else { + buildSubpathIndexFile(modularCodeModel, subClient, "api", { + exportIndex: true + }); + } + buildClassicalClient(dpgContext, modularCodeModel, subClient); + buildClassicOperationFiles(modularCodeModel, subClient); + buildSubpathIndexFile(modularCodeModel, subClient, "classic", { + exportIndex: true, + interfaceOnly: true + }); if (modularCodeModel.clients.length > 1) { buildSubClientIndexFile(modularCodeModel, subClient); } diff --git a/packages/typespec-ts/src/lib.ts b/packages/typespec-ts/src/lib.ts index 7aca167249..0be46a8538 100644 --- a/packages/typespec-ts/src/lib.ts +++ b/packages/typespec-ts/src/lib.ts @@ -74,7 +74,9 @@ export const RLCOptionsSchema: JSONSchemaType = { azureArm: { type: "boolean", nullable: true }, sourceFrom: { type: "string", nullable: true }, isModularLibrary: { type: "boolean", nullable: true, default: false }, - enableOperationGroup: { type: "boolean", nullable: true } + enableOperationGroup: { type: "boolean", nullable: true }, + enableModelNamespace: { type: "boolean", nullable: true }, + hierarchyClient: { type: "boolean", nullable: true } }, required: [] }; diff --git a/packages/typespec-ts/src/modular/buildClassicalClient.ts b/packages/typespec-ts/src/modular/buildClassicalClient.ts index d0cd57fba5..9bc882a142 100644 --- a/packages/typespec-ts/src/modular/buildClassicalClient.ts +++ b/packages/typespec-ts/src/modular/buildClassicalClient.ts @@ -1,23 +1,24 @@ import { ClassDeclaration, - FunctionDeclarationStructure, MethodDeclarationStructure, - OptionalKind, Scope, SourceFile, StructureKind } from "ts-morph"; -import { toCamelCase } from "../utils/casingUtils.js"; import { getClientParameters, importCredential } from "./helpers/clientHelpers.js"; -import { getClientName } from "./helpers/namingHelpers.js"; -import { getOperationFunction } from "./helpers/operationHelpers.js"; +import { + getClassicalLayerPrefix, + getClientName +} from "./helpers/namingHelpers.js"; import { Client, ModularCodeModel } from "./modularCodeModel.js"; import { isRLCMultiEndpoint } from "../utils/clientUtils.js"; import { getDocsFromDescription } from "./helpers/docsHelpers.js"; import { SdkContext } from "../utils/interfaces.js"; +import { NameType, normalizeName } from "@azure-tools/rlc-common"; +import { getOperationFunction } from "./helpers/operationHelpers.js"; export function buildClassicalClient( dpgContext: SdkContext, @@ -85,7 +86,7 @@ export function buildClassicalClient( importCredential(clientFile); importPipeline(clientFile); importAllModels(clientFile, srcPath, subfolder); - buildClientOperationGroups(client, clientClass, subfolder); + buildClientOperationGroups(clientFile, client, clientClass); importAllApis(clientFile, srcPath, subfolder); clientFile.fixMissingImports(); clientFile.fixUnusedIdentifiers(); @@ -160,73 +161,88 @@ function importPipeline(clientSourceFile: SourceFile): void { namedImports: ["Pipeline"] }); } + function buildClientOperationGroups( + clientFile: SourceFile, client: Client, - clientClass: ClassDeclaration, - subfolder: string + clientClass: ClassDeclaration ) { - const operationMap = new Map< - OptionalKind, - string | undefined - >(); + let clientType = "Client"; + const subfolder = client.subfolder ?? ""; + if (subfolder && subfolder !== "") { + clientType = `Client.${clientClass.getName()}`; + } for (const operationGroup of client.operationGroups) { - const operationGroupName = toCamelCase(operationGroup.propertyName); - let clientType = "Client"; - if (subfolder && subfolder !== "") { - clientType = `Client.${clientClass.getName()}`; + const groupName = normalizeName( + operationGroup.namespaceHierarchies[0] ?? operationGroup.propertyName, + NameType.Property + ); + if (groupName === "") { + operationGroup.operations.forEach((op) => { + const declarations = getOperationFunction(op, clientType); + const method: MethodDeclarationStructure = { + docs: declarations.docs, + name: declarations.name ?? "FIXME", + kind: StructureKind.Method, + returnType: declarations.returnType, + parameters: declarations.parameters?.filter( + (p) => p.name !== "context" + ), + statements: `return ${declarations.name}(${[ + "this._client", + ...[ + declarations.parameters + ?.map((p) => p.name) + .filter((p) => p !== "context") + ] + ].join(",")})` + }; + clientClass.addMethod(method); + }); + continue; } - const operationDeclarations: OptionalKind[] = - operationGroup.operations.map((operation) => { - const declarations = getOperationFunction(operation, clientType); - operationMap.set(declarations, operation.oriName); - return declarations; + const operationName = `get${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + 0 + )}Operations`; + const propertyType = `${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + 0 + )}Operations`; + const existProperty = clientClass.getProperties().filter((p) => { + return p.getName() === groupName; + }); + if (!existProperty || existProperty.length === 0) { + clientFile.addImportDeclaration({ + namedImports: [operationName, propertyType], + moduleSpecifier: `./classic/${getClassicalLayerPrefix( + operationGroup, + NameType.File, + "/", + 0 + )}/index.js` }); - - if (operationGroupName && operationGroupName !== "") { clientClass.addProperty({ - name: operationGroupName, - initializer: ` - { - ${operationDeclarations.map((d) => { - return `${getClassicalMethodName(d)}: (${d.parameters - ?.filter((p) => p.name !== "context") - .map( - (p) => p.name + (p.name === "options" ? "?" : "") + ": " + p.type - ) - .join(",")}): ${d.returnType} => {return ${d.name}(${[ - "this._client", - ...[d.parameters?.map((p) => p.name).filter((p) => p !== "context")] - ].join(",")})}`; - })} - } - ` + name: groupName, + type: propertyType, + scope: Scope.Public, + isReadonly: true, + docs: ["The operation groups for " + operationGroup.propertyName] }); - } else { - clientClass.addMethods( - operationDeclarations.map((d) => { - const method: MethodDeclarationStructure = { - docs: d.docs, - name: getClassicalMethodName(d), - kind: StructureKind.Method, - returnType: d.returnType, - parameters: d.parameters?.filter((p) => p.name !== "context"), - statements: `return ${d.name}(${[ - "this._client", - ...[ - d.parameters?.map((p) => p.name).filter((p) => p !== "context") - ] - ].join(",")})` - }; - - return method; - }) - ); + clientClass + .getConstructors()[0] + ?.addStatements( + `this.${groupName} = get${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + 0 + )}Operations(this._client)` + ); } } - - function getClassicalMethodName( - declaration: OptionalKind - ) { - return operationMap.get(declaration) ?? declaration.name ?? "FIXME"; - } } diff --git a/packages/typespec-ts/src/modular/buildClassicalOperationGroups.ts b/packages/typespec-ts/src/modular/buildClassicalOperationGroups.ts new file mode 100644 index 0000000000..24cb5575b9 --- /dev/null +++ b/packages/typespec-ts/src/modular/buildClassicalOperationGroups.ts @@ -0,0 +1,151 @@ +import { + Client, + ModularCodeModel, + OperationGroup +} from "./modularCodeModel.js"; +import { NameType } from "@azure-tools/rlc-common"; +import { getClassicalOperation } from "./helpers/classicalOperationHelpers.js"; +import { getClassicalLayerPrefix } from "./helpers/namingHelpers.js"; +import { SourceFile } from "ts-morph"; +import { importModels } from "./buildOperations.js"; + +export function buildClassicOperationFiles( + codeModel: ModularCodeModel, + client: Client +) { + const classicOperationFiles: Map = new Map< + string, + SourceFile + >(); + for (const operationGroup of client.operationGroups) { + if (operationGroup.namespaceHierarchies.length > 0) { + const classicOperationFileName = + operationGroup.namespaceHierarchies.length > 0 + ? `${getClassicalLayerPrefix( + operationGroup, + NameType.File, + "/", + operationGroup.namespaceHierarchies.length - 1 + )}/index` + : // When the program has no operation groups defined all operations are put + // into a nameless operation group. We'll call this operations. + "index"; + + const subfolder = client.subfolder; + const srcPath = codeModel.modularOptions.sourceRoot; + const classicFile = + classicOperationFiles.get(classicOperationFileName) ?? + codeModel.project.createSourceFile( + `${srcPath}/${ + subfolder && subfolder !== "" ? subfolder + "/" : "" + }classic/${classicOperationFileName}.ts` + ); + getClassicalOperation(classicFile, client, operationGroup); + + // Import models used from ./models.ts + // We SHOULD keep this because otherwise ts-morph will "helpfully" try to import models from the rest layer when we call fixMissingImports(). + importModels( + srcPath, + classicFile, + codeModel.project, + subfolder, + operationGroup.namespaceHierarchies.length + ); + importApis(classicFile, client, codeModel, operationGroup); + classicFile.fixMissingImports(); + classicFile.fixUnusedIdentifiers(); + classicOperationFiles.set(classicOperationFileName, classicFile); + } + } + for (const operationGroup of client.operationGroups) { + if (operationGroup.namespaceHierarchies.length > 0) { + for ( + let layer = 0; + layer < operationGroup.namespaceHierarchies.length - 1; + layer++ + ) { + const classicOperationFileName = + operationGroup.namespaceHierarchies.length > 0 + ? `${getClassicalLayerPrefix( + operationGroup, + NameType.File, + "/", + layer + )}/index` + : // When the program has no operation groups defined all operations are put + // into a nameless operation group. We'll call this operations. + "index"; + + const subfolder = client.subfolder; + const srcPath = codeModel.modularOptions.sourceRoot; + const classicFile = + classicOperationFiles.get(classicOperationFileName) ?? + codeModel.project.createSourceFile( + `${srcPath}/${ + subfolder && subfolder !== "" ? subfolder + "/" : "" + }classic/${classicOperationFileName}.ts` + ); + getClassicalOperation(classicFile, client, operationGroup, layer); + + // Import models used from ./models.ts + // We SHOULD keep this because otherwise ts-morph will "helpfully" try to import models from the rest layer when we call fixMissingImports(). + importModels(srcPath, classicFile, codeModel.project, subfolder, layer); + importApis(classicFile, client, codeModel, operationGroup, layer); + classicFile.fixMissingImports(); + classicFile.fixUnusedIdentifiers(); + classicOperationFiles.set(classicOperationFileName, classicFile); + } + } + } + return classicOperationFiles; +} + +function importApis( + classicFile: SourceFile, + client: Client, + modularCodeModel: ModularCodeModel, + operationGroup: OperationGroup, + layer: number = operationGroup.namespaceHierarchies.length - 1 +) { + const classicOperationFileName = + operationGroup.namespaceHierarchies.length > 0 + ? `${getClassicalLayerPrefix( + operationGroup, + NameType.File, + "/", + layer + )}/index` + : // When the program has no operation groups defined all operations are put + // into a nameless operation group. We'll call this operations. + "index"; + + const subfolder = client.subfolder; + const srcPath = modularCodeModel.modularOptions.sourceRoot; + const apiFile = modularCodeModel.project.getSourceFile( + `${srcPath}/${ + subfolder && subfolder !== "" ? subfolder + "/" : "" + }api/${classicOperationFileName}.ts` + ); + + if (!apiFile) { + return; + } + + const exported = [...apiFile.getExportedDeclarations().keys()].filter((e) => { + return !e.startsWith("_"); + }); + + const existApiImport = classicFile.getImportDeclarations().filter((i) => { + return i + .getModuleSpecifierValue() + .includes(`../api/${classicOperationFileName}`); + })[0]; + if (exported.length > 0 && !existApiImport) { + classicFile.addImportDeclaration({ + moduleSpecifier: `${"../".repeat( + operationGroup.namespaceHierarchies.length + 1 + )}api/${classicOperationFileName}.js`, + namedImports: exported + }); + } +} diff --git a/packages/typespec-ts/src/modular/buildCodeModel.ts b/packages/typespec-ts/src/modular/buildCodeModel.ts index 79483ca692..8e4834af4a 100644 --- a/packages/typespec-ts/src/modular/buildCodeModel.ts +++ b/packages/typespec-ts/src/modular/buildCodeModel.ts @@ -99,6 +99,10 @@ import { } from "../utils/operationUtil.js"; import { SdkContext } from "../utils/interfaces.js"; import { Project } from "ts-morph"; +import { + getModelNamespaceName, + getOperationNamespaceInterfaceName +} from "../utils/namespaceUtils.js"; interface HttpServerParameter { type: "endpointPath"; @@ -769,6 +773,20 @@ function emitBasicOperation( ); }); + const namespaceHierarchies = + context.rlcOptions?.hierarchyClient === true + ? getOperationNamespaceInterfaceName(context, operation) + : []; + + if ( + namespaceHierarchies.length === 0 && + context.rlcOptions?.hierarchyClient === false && + operationGroupName !== "" && + namespaceHierarchies[0] !== operationGroupName + ) { + namespaceHierarchies.push(operationGroupName); + } + for (const param of httpOperation.parameters.parameters) { if (isIgnoredHeaderParam(param)) { continue; @@ -834,6 +852,7 @@ function emitBasicOperation( } } } + const name = applyCasing(operation.name, { casing: CASING }); /** handle name collision between operation name and parameter signature */ @@ -851,7 +870,7 @@ function emitBasicOperation( param.clientName = param.clientName + "Parameter"; }); return { - name: name, + name: normalizeName(name, NameType.Operation, true), description: getDocStr(context.program, operation), summary: getSummary(context.program, operation) ?? "", url: httpOperation.path, @@ -866,7 +885,8 @@ function emitBasicOperation( isOverload: false, overloads: [], apiVersions: [getAddedOnVersion(context.program, operation)], - rlcResponse: rlcResponses?.[0] + rlcResponse: rlcResponses?.[0], + namespaceHierarchies }; } @@ -958,9 +978,20 @@ function emitModel(context: SdkContext, type: Model): Record { getProjectedName(context.program, type, "javascript") ?? getProjectedName(context.program, type, "client") ?? getFriendlyName(context.program, type); + const fullNamespaceName = + getModelNamespaceName(context, type.namespace!) + .map((nsName) => { + return normalizeName(nsName, NameType.Interface); + }) + .join("") + + (effectiveName ? effectiveName : getName(context.program, type)); let modelName = overridedModelName ?? - (effectiveName ? effectiveName : getName(context.program, type)); + (context.rlcOptions?.enableModelNamespace + ? fullNamespaceName + : effectiveName + ? effectiveName + : getName(context.program, type)); if ( !overridedModelName && type.templateMapper && @@ -1419,6 +1450,10 @@ function emitOperationGroups( rlcModels: RLCModel ): OperationGroup[] { const operationGroups: OperationGroup[] = []; + const groupMapping: Map = new Map< + string, + OperationGroup + >(); for (const operationGroup of listOperationGroups(context, client)) { const operations: HrlcOperation[] = []; const name = operationGroup.type.name; @@ -1428,27 +1463,53 @@ function emitOperationGroups( )) { operations.push(emitOperation(context, operation, name, rlcModels)); } - operationGroups.push({ - className: name, - propertyName: name, - operations: operations - }); + if (operations.length > 0) { + addHierarchyOperationGroup(operations, groupMapping); + } } const clientOperations: HrlcOperation[] = []; for (const operation of listOperationsInOperationGroup(context, client)) { clientOperations.push(emitOperation(context, operation, "", rlcModels)); } if (clientOperations.length > 0) { - operationGroups.push({ - className: "", - propertyName: "", - operations: clientOperations - }); + addHierarchyOperationGroup(clientOperations, groupMapping); + } + + groupMapping.forEach((value) => { + operationGroups.push(value); + }); + if ( + context.rlcOptions?.hierarchyClient === false && + context.rlcOptions?.enableOperationGroup + ) { + resolveConflictIfExist(operationGroups); } - resolveConflictIfExist(operationGroups); return operationGroups; } +function addHierarchyOperationGroup( + operations: HrlcOperation[], + groupMapping: Map +): OperationGroup[] { + if (operations.length > 0) { + operations.forEach((op) => { + const groupName = op.namespaceHierarchies.join("") ?? ""; + if (!groupMapping.has(groupName)) { + groupMapping.set(groupName, { + className: groupName, + propertyName: groupName, + operations: [op], + namespaceHierarchies: op.namespaceHierarchies + }); + } else { + groupMapping.get(groupName)!.operations.push(op); + } + }); + return [...groupMapping.values()]; + } + return []; +} + function resolveConflictIfExist(operationGroups: OperationGroup[]) { if (operationGroups.length < 2) { return; diff --git a/packages/typespec-ts/src/modular/buildOperations.ts b/packages/typespec-ts/src/modular/buildOperations.ts index 94eef7c423..26f6af8309 100644 --- a/packages/typespec-ts/src/modular/buildOperations.ts +++ b/packages/typespec-ts/src/modular/buildOperations.ts @@ -26,23 +26,34 @@ export function buildOperationFiles( const operationFiles = []; for (const operationGroup of client.operationGroups) { const importSet: Map> = new Map>(); - const fileName = operationGroup.className - ? `${normalizeName(operationGroup.className, NameType.File)}` - : // When the program has no operation groups defined all operations are put - // into a nameless operation group. We'll call this operations. - "operations"; + const operationFileName = + operationGroup.className && operationGroup.namespaceHierarchies.length > 0 + ? `${operationGroup.namespaceHierarchies + .map((hierarchy) => { + return normalizeName(hierarchy, NameType.File); + }) + .join("/")}/index` + : // When the program has no operation groups defined all operations are put + // into a nameless operation group. We'll call this operations. + "operations"; const subfolder = client.subfolder; const srcPath = codeModel.modularOptions.sourceRoot; const operationGroupFile = codeModel.project.createSourceFile( `${srcPath}/${ subfolder && subfolder !== "" ? subfolder + "/" : "" - }api/${fileName}.ts` + }api/${operationFileName}.ts` ); // Import models used from ./models.ts // We SHOULD keep this because otherwise ts-morph will "helpfully" try to import models from the rest layer when we call fixMissingImports(). - importModels(srcPath, operationGroupFile, codeModel.project, subfolder); + importModels( + srcPath, + operationGroupFile, + codeModel.project, + subfolder, + operationGroup.namespaceHierarchies.length + ); const namedImports: string[] = []; let clientType = "Client"; @@ -54,7 +65,9 @@ export function buildOperationFiles( } operationGroupFile.addImportDeclarations([ { - moduleSpecifier: `../../rest/${subfolder}/index.js`, + moduleSpecifier: `../${"../".repeat( + operationGroup.namespaceHierarchies.length + )}rest/${subfolder}/index.js`, namedImports } ]); @@ -68,7 +81,9 @@ export function buildOperationFiles( { moduleSpecifier: `${ subfolder && subfolder !== "" ? "../" : "" - }../rest/index.js`, + }${"../".repeat( + operationGroup.namespaceHierarchies.length + 1 + )}rest/index.js`, namedImports } ]); @@ -125,8 +140,12 @@ export function importModels( srcPath: string, sourceFile: SourceFile, project: Project, - subfolder: string = "" + subfolder: string = "", + importLayer: number = 0 ) { + const hasModelsImport = sourceFile.getImportDeclarations().some((i) => { + return i.getModuleSpecifierValue().endsWith(`models/models.js`); + }); const modelsFile = project.getSourceFile( `${srcPath}/${ subfolder && subfolder !== "" ? subfolder + "/" : "" @@ -138,9 +157,9 @@ export function importModels( models.push(entry[0]); } - if (models.length > 0) { + if (models.length > 0 && !hasModelsImport) { sourceFile.addImportDeclaration({ - moduleSpecifier: "../models/models.js", + moduleSpecifier: `${"../".repeat(importLayer + 1)}models/models.js`, namedImports: models }); } @@ -162,7 +181,7 @@ export function buildOperationOptions( .filter((p) => p.optional || p.clientDefaultValue); const options = [...optionalParameters]; - const name = getOperationOptionsName(operation); + const name = getOperationOptionsName(operation, true); sourceFile.addInterface({ name, diff --git a/packages/typespec-ts/src/modular/buildProjectFiles.ts b/packages/typespec-ts/src/modular/buildProjectFiles.ts index 73a1e6197d..0cd57a3d13 100644 --- a/packages/typespec-ts/src/modular/buildProjectFiles.ts +++ b/packages/typespec-ts/src/modular/buildProjectFiles.ts @@ -5,6 +5,7 @@ import { hasLROOperation, hasPagingOperation } from "./helpers/operationHelpers.js"; +import { getClassicalLayerPrefix } from "./helpers/namingHelpers.js"; export function emitPackage( project: Project, @@ -309,7 +310,34 @@ export function emitPackage( }; } } - + if (codeModel.options.hierarchyClient) { + for (const client of codeModel.clients) { + for (const operationGroup of client.operationGroups) { + if (operationGroup.namespaceHierarchies.length === 0) { + continue; + } + const subfolder = + codeModel.clients.length > 1 + ? normalizeName(client.name.replace("Client", ""), NameType.File) + : undefined; + const subApiPath = `api/${getClassicalLayerPrefix( + operationGroup, + NameType.File, + "/" + )}`; + packageInfo.exports[ + `./${subfolder ? subfolder + "/" : ""}${subApiPath}` + ] = { + types: `./types/src/${ + subfolder ? subfolder + "/" : "" + }${subApiPath}/index.d.ts`, + import: `./dist-esm/src/${ + subfolder ? subfolder + "/" : "" + }${subApiPath}/index.js` + }; + } + } + } packageJson.addStatements(JSON.stringify(packageInfo)); return packageJson; diff --git a/packages/typespec-ts/src/modular/buildRootIndex.ts b/packages/typespec-ts/src/modular/buildRootIndex.ts index b412403eb3..51940f519c 100644 --- a/packages/typespec-ts/src/modular/buildRootIndex.ts +++ b/packages/typespec-ts/src/modular/buildRootIndex.ts @@ -20,7 +20,24 @@ export function buildRootIndex( } exportClassicalClient(client, rootIndexFile, subfolder); - exportModels(rootIndexFile, project, srcPath, clientName, subfolder, true); + exportModules( + rootIndexFile, + project, + srcPath, + clientName, + "models", + subfolder, + true + ); + exportModules( + rootIndexFile, + project, + srcPath, + clientName, + "classic", + subfolder, + true + ); } function exportClassicalClient( @@ -38,16 +55,19 @@ function exportClassicalClient( }); } -function exportModels( +function exportModules( indexFile: SourceFile, project: Project, srcPath: string, clientName: string, + moduleName: string, subfolder: string = "", isTopLevel: boolean = false ) { const modelsFile = project.getSourceFile( - `${srcPath}/${subfolder !== "" ? subfolder + "/" : ""}models/index.ts` + `${srcPath}/${ + subfolder !== "" ? subfolder + "/" : "" + }${moduleName}/index.ts` ); if (!modelsFile) { return; @@ -64,7 +84,7 @@ function exportModels( ); const moduleSpecifier = `./${ isTopLevel && subfolder !== "" ? subfolder + "/" : "" - }models/index.js`; + }${moduleName}/index.js`; indexFile.addExportDeclaration({ moduleSpecifier, namedExports @@ -93,11 +113,20 @@ export function buildSubClientIndexFile( } exportClassicalClient(client, subClientIndexFile, subfolder, true); - exportModels( + exportModules( + subClientIndexFile, + codeModel.project, + srcPath, + clientName, + "models", + subfolder + ); + exportModules( subClientIndexFile, codeModel.project, srcPath, clientName, + "classic", subfolder ); } diff --git a/packages/typespec-ts/src/modular/buildSubpathIndex.ts b/packages/typespec-ts/src/modular/buildSubpathIndex.ts index 925c1f3597..dc85ac0d62 100644 --- a/packages/typespec-ts/src/modular/buildSubpathIndex.ts +++ b/packages/typespec-ts/src/modular/buildSubpathIndex.ts @@ -1,10 +1,16 @@ import { join } from "path"; import { Client, ModularCodeModel } from "./modularCodeModel.js"; +export interface buildSubpathIndexFileOptions { + exportIndex?: boolean; + interfaceOnly?: boolean; +} + export function buildSubpathIndexFile( codeModel: ModularCodeModel, client: Client, - subpath: string + subpath: string, + options: buildSubpathIndexFileOptions = {} ) { const { subfolder } = client; const srcPath = codeModel.modularOptions.sourceRoot; @@ -16,16 +22,45 @@ export function buildSubpathIndexFile( .replace(/\\/g, "/") .startsWith(apiFilePattern.replace(/\\/g, "/")); }); + if (apiFiles.length === 0) { + return; + } const indexFile = codeModel.project.createSourceFile( `${srcPath}/${subfolder}/${subpath}/index.ts` ); for (const file of apiFiles) { - const exports = [...file.getExportedDeclarations().keys()].filter( - (k) => !k.startsWith("_") - ); + if (!options.exportIndex && file.getFilePath().endsWith("index.ts")) { + continue; + } + if (file.getFilePath() === indexFile.getFilePath()) { + continue; + } + + const namedExports: string[] = [...file.getExportedDeclarations().entries()] + .filter((exDeclaration) => { + if (exDeclaration[0].startsWith("_")) { + return false; + } + return exDeclaration[1].some((ex) => { + if ( + options.interfaceOnly && + ex.getKindName() !== "InterfaceDeclaration" + ) { + return false; + } + return true; + }); + }) + .map((exDeclaration) => { + return exDeclaration[0]; + }); indexFile.addExportDeclaration({ - moduleSpecifier: `./${file.getBaseNameWithoutExtension()}.js`, - namedExports: exports + moduleSpecifier: `.${file + .getFilePath() + .replace(indexFile.getDirectoryPath(), "") + .replace(/\\/g, "/") + .replace(".ts", "")}.js`, + namedExports }); } } diff --git a/packages/typespec-ts/src/modular/helpers/classicalOperationHelpers.ts b/packages/typespec-ts/src/modular/helpers/classicalOperationHelpers.ts new file mode 100644 index 0000000000..6b70869fd2 --- /dev/null +++ b/packages/typespec-ts/src/modular/helpers/classicalOperationHelpers.ts @@ -0,0 +1,212 @@ +import { + FunctionDeclarationStructure, + OptionalKind, + PropertySignatureStructure, + SourceFile, + StructureKind +} from "ts-morph"; +import { Client, OperationGroup } from "../modularCodeModel.js"; +import { getClassicalLayerPrefix, getClientName } from "./namingHelpers.js"; +import { NameType, normalizeName } from "@azure-tools/rlc-common"; +import { getOperationFunction } from "./operationHelpers.js"; + +export function getClassicalOperation( + classicFile: SourceFile, + client: Client, + operationGroup: OperationGroup, + layer: number = operationGroup.namespaceHierarchies.length - 1 +) { + const modularClientName = `${getClientName(client)}Context`; + const hasClientContextImport = classicFile + .getImportDeclarations() + .filter((i) => { + return ( + i.getModuleSpecifierValue() === + `${"../".repeat(layer + 2)}api/${modularClientName}.js` + ); + }); + if (!hasClientContextImport || hasClientContextImport.length === 0) { + classicFile.addImportDeclaration({ + namedImports: [client.rlcClientName], + moduleSpecifier: `${"../".repeat(layer + 2)}api/${modularClientName}.js` + }); + } + + const operationMap = new Map< + OptionalKind, + string | undefined + >(); + const operationDeclarations: OptionalKind[] = + operationGroup.operations.map((operation) => { + const declarations = getOperationFunction(operation, modularClientName); + operationMap.set(declarations, operation.oriName); + return declarations; + }); + + const interfaceName = `${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + layer + )}Operations`; + const existInterface = classicFile + .getInterfaces() + .filter((i) => i.getName() === interfaceName)[0]; + const properties: OptionalKind[] = []; + if (layer !== operationGroup.namespaceHierarchies.length - 1) { + properties.push({ + kind: StructureKind.PropertySignature, + name: + normalizeName( + (layer === operationGroup.namespaceHierarchies.length - 1 + ? operationGroup.namespaceHierarchies[layer] + : operationGroup.namespaceHierarchies[layer + 1]) ?? "", + NameType.Property + ) ?? operationGroup.propertyName, + type: `${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + layer + 1 + )}Operations` + }); + } else { + operationDeclarations.forEach((d) => { + properties.push({ + kind: StructureKind.PropertySignature, + name: getClassicalMethodName(d), + type: `(${d.parameters + ?.filter((p) => p.name !== "context") + .map( + (p) => p.name + (p.name === "options" ? "?" : "") + ": " + p.type + ) + .join(",")}) => ${d.returnType}` + }); + }); + } + if (existInterface) { + existInterface.addProperties([...properties]); + } else { + classicFile.addInterface({ + name: interfaceName, + isExported: true, + properties + }); + } + + if (layer === operationGroup.namespaceHierarchies.length - 1) { + classicFile.addFunction({ + name: `get${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + layer + )}`, + isExported: true, + parameters: [ + { + name: "context", + type: client.rlcClientName + } + ], + statements: `return { + ${operationDeclarations + .map((d) => { + return `${getClassicalMethodName(d)}: (${d.parameters + ?.filter((p) => p.name !== "context") + .map( + (p) => + p.name + (p.name === "options" ? "?" : "") + ": " + p.type + ) + .join(",")}) => ${d.name}(${[ + "context", + ...[ + d.parameters?.map((p) => p.name).filter((p) => p !== "context") + ] + ].join(",")})`; + }) + .join(",")} + }` + }); + } + + const operationFunctionName = `get${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + layer + )}Operations`; + const existFunction = classicFile + .getFunctions() + .filter((f) => f.getName() === operationFunctionName)[0]; + if (existFunction) { + const returnStatement = existFunction.getBodyText(); + if (returnStatement) { + let statement = `, + ...get${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + layer + 1 + )}Operations(context)}`; + if (layer !== operationGroup.namespaceHierarchies.length - 1) { + statement = `, + ${normalizeName( + operationGroup.namespaceHierarchies[layer + 1] ?? "FIXME", + NameType.Property + )}: get${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + layer + 1 + )}Operations(context)}`; + } + const newReturnStatement = returnStatement.replace(/}$/, statement); + existFunction.setBodyText(newReturnStatement); + } + } else { + classicFile.addFunction({ + name: operationFunctionName, + isExported: true, + parameters: [ + { + name: "context", + type: client.rlcClientName + } + ], + returnType: `${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + layer + )}Operations`, + statements: + layer !== operationGroup.namespaceHierarchies.length - 1 + ? `return { + ${normalizeName( + operationGroup.namespaceHierarchies[layer + 1] ?? "FIXME", + NameType.Property + )}: get${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + layer + 1 + )}Operations(context) + }` + : `return { + ...get${getClassicalLayerPrefix( + operationGroup, + NameType.Interface, + "", + layer + )}(context) + }` + }); + } + + function getClassicalMethodName( + declaration: OptionalKind + ) { + return operationMap.get(declaration) ?? declaration.name ?? "FIXME"; + } +} diff --git a/packages/typespec-ts/src/modular/helpers/namingHelpers.ts b/packages/typespec-ts/src/modular/helpers/namingHelpers.ts index 90f1cfd69e..b8e1a29be0 100644 --- a/packages/typespec-ts/src/modular/helpers/namingHelpers.ts +++ b/packages/typespec-ts/src/modular/helpers/namingHelpers.ts @@ -1,5 +1,5 @@ import { toCamelCase, toPascalCase } from "../../utils/casingUtils.js"; -import { Client, Operation } from "../modularCodeModel.js"; +import { Client, Operation, OperationGroup } from "../modularCodeModel.js"; import { ReservedModelNames, NameType, @@ -42,3 +42,27 @@ export function isReservedName(name: string, nameType: NameType): boolean { reservedName.reservedFor.includes(nameType) ); } + +export function getClassicalLayerPrefix( + operationGroup: OperationGroup | Operation, + nameType: NameType, + separator: string = "", + layer: number = operationGroup.namespaceHierarchies.length - 1 +): string { + const prefix: string[] = []; + if (layer < 0) { + return prefix.join(separator); + } + if (layer === 0) { + return normalizeName( + operationGroup.namespaceHierarchies[0] ?? "", + nameType + ); + } + for (let i = 0; i <= layer; i++) { + prefix.push( + normalizeName(operationGroup.namespaceHierarchies[i] ?? "", nameType) + ); + } + return prefix.join(separator); +} diff --git a/packages/typespec-ts/src/modular/helpers/operationHelpers.ts b/packages/typespec-ts/src/modular/helpers/operationHelpers.ts index 5d78f5dec4..ae63ad0a28 100644 --- a/packages/typespec-ts/src/modular/helpers/operationHelpers.ts +++ b/packages/typespec-ts/src/modular/helpers/operationHelpers.ts @@ -20,7 +20,7 @@ import { getResponseTypeName, normalizeName } from "@azure-tools/rlc-common"; -import { getOperationName } from "./namingHelpers.js"; +import { getClassicalLayerPrefix, getOperationName } from "./namingHelpers.js"; import { getFixmeForMultilineDocs, getDocsFromDescription @@ -184,7 +184,7 @@ function getOperationSignatureParameters( operation: Operation, clientType: string ): OptionalKind[] { - const optionsType = getOperationOptionsName(operation); + const optionsType = getOperationOptionsName(operation, true); const parameters: Map< string, OptionalKind @@ -270,12 +270,14 @@ export function getOperationFunction( statements }; } - export function getOperationOptionsName( operation: Operation, includeGroupName = false ) { - const prefix = includeGroupName ? toPascalCase(operation.groupName) : ""; + const prefix = + includeGroupName && operation.name.indexOf("_") === -1 + ? getClassicalLayerPrefix(operation, NameType.Interface) + : ""; const optionName = `${prefix}${toPascalCase(operation.name)}Options`; if (operation.bodyParameter?.type.name === optionName) { return optionName.replace(/Options$/, "RequestOptions"); diff --git a/packages/typespec-ts/src/modular/modularCodeModel.ts b/packages/typespec-ts/src/modular/modularCodeModel.ts index fcb12a81f7..736636e4b1 100644 --- a/packages/typespec-ts/src/modular/modularCodeModel.ts +++ b/packages/typespec-ts/src/modular/modularCodeModel.ts @@ -47,6 +47,7 @@ export interface OperationGroup { className: string; propertyName: string; operations: Operation[]; + namespaceHierarchies: string[]; } export interface Policy { type: string; @@ -168,4 +169,5 @@ export interface Operation { continuationTokenName?: string; addedOn?: string; rlcResponse?: OperationResponse; + namespaceHierarchies: string[]; } diff --git a/packages/typespec-ts/src/transform/transfromRLCOptions.ts b/packages/typespec-ts/src/transform/transfromRLCOptions.ts index 953521205d..76cea8f131 100644 --- a/packages/typespec-ts/src/transform/transfromRLCOptions.ts +++ b/packages/typespec-ts/src/transform/transfromRLCOptions.ts @@ -21,6 +21,7 @@ import { listOperationsInOperationGroup } from "@azure-tools/typespec-client-generator-core"; import { getOperationName } from "../utils/operationUtil.js"; +import { detectModelConflicts } from "../utils/namespaceUtils.js"; export function transformRLCOptions( emitterOptions: RLCOptions, @@ -56,6 +57,11 @@ function extractRLCOptions( dpgContext, emitterOptions ); + const enableModelNamespace = getEnableModelNamespace( + dpgContext, + emitterOptions + ); + const hierarchyClient = getHierarchyClient(emitterOptions); return { ...emitterOptions, ...credentialInfo, @@ -67,7 +73,9 @@ function extractRLCOptions( serviceInfo, azureOutputDirectory, sourceFrom: "TypeSpec", - enableOperationGroup + enableOperationGroup, + enableModelNamespace, + hierarchyClient }; } @@ -136,15 +144,41 @@ function getEnableOperationGroup( ) { return emitterOptions.enableOperationGroup; } - // Detect if existing name conflicts if customers didn't set the option explicitly + // Only detect if existing name conflicts if customers don't set hierarchyClient to true return detectIfNameConflicts(dpgContext); } +function getEnableModelNamespace( + dpgContext: SdkContext, + emitterOptions: RLCOptions +) { + if ( + emitterOptions.enableModelNamespace === true || + emitterOptions.enableModelNamespace === false + ) { + return emitterOptions.enableModelNamespace; + } + // Detect if existing name conflicts if customers didn't set the option explicitly + return detectModelConflicts(dpgContext); +} + +function getHierarchyClient(emitterOptions: RLCOptions) { + if ( + emitterOptions.hierarchyClient === true || + emitterOptions.hierarchyClient === false + ) { + return emitterOptions.hierarchyClient; + } + // enable hierarchy client by default if customers didn't set the option explicitly + return true; +} + function detectIfNameConflicts(dpgContext: SdkContext) { const clients = getRLCClients(dpgContext); const program = dpgContext.program; - const nameSet = new Set(); for (const client of clients) { + // only consider it's conflict when there are conflicts in the same client + const nameSet = new Set(); const operationGroups = listOperationGroups(dpgContext, client); for (const operationGroup of operationGroups) { const operations = listOperationsInOperationGroup( diff --git a/packages/typespec-ts/src/utils/modelUtils.ts b/packages/typespec-ts/src/utils/modelUtils.ts index 27278eefce..902028de54 100644 --- a/packages/typespec-ts/src/utils/modelUtils.ts +++ b/packages/typespec-ts/src/utils/modelUtils.ts @@ -70,6 +70,7 @@ import { isApiVersion } from "@azure-tools/typespec-client-generator-core"; import { SdkContext } from "./interfaces.js"; +import { getModelNamespaceName } from "./namespaceUtils.js"; export function getBinaryType(usage: SchemaContext[]) { return usage.includes(SchemaContext.Output) @@ -503,7 +504,16 @@ function getSchemaForModel( const program = dpgContext.program; const overridedModelName = getFriendlyName(program, model) ?? getProjectedName(program, model, "json"); - let name = model.name; + const fullNamespaceName = + overridedModelName ?? + getModelNamespaceName(dpgContext, model.namespace!) + .map((nsName) => { + return normalizeName(nsName, NameType.Interface); + }) + .join("") + model.name; + let name = dpgContext.rlcOptions?.enableModelNamespace + ? fullNamespaceName + : model.name; if ( !overridedModelName && model.templateMapper && diff --git a/packages/typespec-ts/src/utils/namespaceUtils.ts b/packages/typespec-ts/src/utils/namespaceUtils.ts new file mode 100644 index 0000000000..13c097be0a --- /dev/null +++ b/packages/typespec-ts/src/utils/namespaceUtils.ts @@ -0,0 +1,74 @@ +import { getAllModels } from "@azure-tools/typespec-client-generator-core"; +import { + Namespace, + isGlobalNamespace, + isService, + Operation +} from "@typespec/compiler"; +import { SdkContext } from "../utils/interfaces.js"; + +export function getModelNamespaceName( + dpgContext: SdkContext, + namespace: Namespace +): string[] { + const result: string[] = []; + namespace && + !isGlobalNamespace(dpgContext.program, namespace) && + !isService(dpgContext.program, namespace) + ? (result.push(...getModelNamespaceName(dpgContext, namespace.namespace!)), + result.push(namespace.name)) + : result; + return result; +} + +export function getOperationNamespaceInterfaceName( + dpgContext: SdkContext, + operation: Operation +): string[] { + const result: string[] = []; + if ( + dpgContext.rlcOptions?.hierarchyClient === false && + dpgContext.rlcOptions?.enableOperationGroup !== true + ) { + return result; + } + if (operation.interface) { + if ( + dpgContext.rlcOptions?.enableOperationGroup === true && + dpgContext.rlcOptions?.hierarchyClient === false + ) { + result.push(operation.interface.name); + return result; + } + if (operation.interface.namespace) { + result.push( + ...getModelNamespaceName(dpgContext, operation.interface.namespace) + ); + } + result.push(operation.interface.name); + } else if (operation.namespace) { + !isGlobalNamespace(dpgContext.program, operation.namespace) && + !isService(dpgContext.program, operation.namespace) + ? (result.push( + ...getModelNamespaceName(dpgContext, operation.namespace.namespace!) + ), + result.push(operation.namespace.name)) + : result; + } + return result; +} + +export function detectModelConflicts(dpgContext: SdkContext) { + const allModels = getAllModels(dpgContext); + const nameSet = new Set(); + for (const model of allModels) { + if (model.name === "") { + continue; + } + if (nameSet.has(model.name)) { + return true; + } + nameSet.add(model.name); + } + return false; +} diff --git a/packages/typespec-ts/src/utils/operationUtil.ts b/packages/typespec-ts/src/utils/operationUtil.ts index 3865b56627..9f4f7bed26 100644 --- a/packages/typespec-ts/src/utils/operationUtil.ts +++ b/packages/typespec-ts/src/utils/operationUtil.ts @@ -13,8 +13,6 @@ import { import { getProjectedName, ignoreDiagnostics, - isGlobalNamespace, - isService, Model, Operation, Program, @@ -44,6 +42,7 @@ import { } from "@azure-tools/rlc-common"; import { isByteOrByteUnion } from "./modelUtils.js"; import { SdkContext } from "./interfaces.js"; +import { getOperationNamespaceInterfaceName } from "./namespaceUtils.js"; // Sorts the responses by status code export function sortedOperationResponses(responses: HttpOperationResponse[]) { @@ -142,29 +141,21 @@ export function getOperationGroupName( if (!dpgContext.rlcOptions?.enableOperationGroup || !operationOrRoute) { return ""; } - const program = dpgContext.program; // If this is a HttpOperation if ((operationOrRoute as any).kind !== "Operation") { operationOrRoute = (operationOrRoute as HttpOperation).operation; } const operation = operationOrRoute as Operation; - if (operation.interface) { - return normalizeName( - operation.interface?.name ?? "", - NameType.Interface, - true - ); - } - const namespace = operation.namespace; - if ( - namespace === undefined || - isGlobalNamespace(program, namespace) || - isService(program, namespace) - ) { - return ""; - } + const namespaceNames = getOperationNamespaceInterfaceName( + dpgContext, + operation + ); - return normalizeName(namespace.name ?? "", NameType.Interface, true); + return namespaceNames + .map((name) => { + return normalizeName(name, NameType.Interface, true); + }) + .join(""); } export function getOperationName(program: Program, operation: Operation) { diff --git a/packages/typespec-ts/test/modularIntegration/generated/authentication/api-key/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/authentication/api-key/tspconfig.yaml index 90dc8a104b..d38df785a9 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/authentication/api-key/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/authentication/api-key/tspconfig.yaml @@ -8,6 +8,7 @@ options: azureSdkForJs: false isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/azure-api-key" description: "Azure API Key Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/authentication/http-custom/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/authentication/http-custom/tspconfig.yaml index 771f8dd6f3..5b9ba9eb90 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/authentication/http-custom/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/authentication/http-custom/tspconfig.yaml @@ -8,6 +8,7 @@ options: azureSdkForJs: false isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/azure-http-custom" description: "Azure Http Custom Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/authentication/oauth2/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/authentication/oauth2/tspconfig.yaml index b644cccbae..a0e3b7ca68 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/authentication/oauth2/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/authentication/oauth2/tspconfig.yaml @@ -8,6 +8,7 @@ options: azureSdkForJs: false isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/azure-oauth2" description: "Azure Oauth2 Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/authentication/union/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/authentication/union/tspconfig.yaml index 164ef2282d..d1e3b6af20 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/authentication/union/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/authentication/union/tspconfig.yaml @@ -8,6 +8,7 @@ options: azureSdkForJs: false isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/azure-auth-union" description: "Azure Auth Union Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/BasicClient.ts b/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/BasicClient.ts index 57bad8b457..1fd69adc06 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/BasicClient.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/BasicClient.ts @@ -10,8 +10,8 @@ import { ListOptions, ListWithPageOptions, ListWithCustomPageModelOptions, - DeleteOptions, - ExportOptions, + DeleteOperationOptions, + ExportOperationOptions, } from "./models/options.js"; import { createBasic, @@ -83,26 +83,18 @@ export class BasicClient { } /** Deletes a User */ - /** - * @fixme delete is a reserved word that cannot be used as an operation name. Please add @projectedName( - * "javascript", "") to the operation to override the generated name. - */ deleteOperation( id: number, - options: DeleteOptions = { requestOptions: {} } + options: DeleteOperationOptions = { requestOptions: {} } ): Promise { return deleteOperation(this._client, id, options); } /** Exports a User */ - /** - * @fixme export is a reserved word that cannot be used as an operation name. Please add @projectedName( - * "javascript", "") to the operation to override the generated name. - */ exportOperation( id: number, format: string, - options: ExportOptions = { requestOptions: {} } + options: ExportOperationOptions = { requestOptions: {} } ): Promise { return exportOperation(this._client, id, format, options); } diff --git a/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/api/operations.ts b/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/api/operations.ts index 621045aec1..a8914ed577 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/api/operations.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/api/operations.ts @@ -36,8 +36,8 @@ import { ListOptions, ListWithPageOptions, ListWithCustomPageModelOptions, - DeleteOptions, - ExportOptions, + DeleteOperationOptions, + ExportOperationOptions, } from "../models/options.js"; export function _createOrUpdateSend( @@ -342,7 +342,7 @@ export async function listWithCustomPageModel( export function _deleteOperationSend( context: Client, id: number, - options: DeleteOptions = { requestOptions: {} } + options: DeleteOperationOptions = { requestOptions: {} } ): StreamableMethod< DeleteOperation204Response | DeleteOperationDefaultResponse > { @@ -362,14 +362,10 @@ export async function _deleteOperationDeserialize( } /** Deletes a User */ -/** - * @fixme delete is a reserved word that cannot be used as an operation name. Please add @projectedName( - * "javascript", "") to the operation to override the generated name. - */ export async function deleteOperation( context: Client, id: number, - options: DeleteOptions = { requestOptions: {} } + options: DeleteOperationOptions = { requestOptions: {} } ): Promise { const result = await _deleteOperationSend(context, id, options); return _deleteOperationDeserialize(result); @@ -379,7 +375,7 @@ export function _exportOperationSend( context: Client, id: number, format: string, - options: ExportOptions = { requestOptions: {} } + options: ExportOperationOptions = { requestOptions: {} } ): StreamableMethod< ExportOperation200Response | ExportOperationDefaultResponse > { @@ -411,15 +407,11 @@ export async function _exportOperationDeserialize( } /** Exports a User */ -/** - * @fixme export is a reserved word that cannot be used as an operation name. Please add @projectedName( - * "javascript", "") to the operation to override the generated name. - */ export async function exportOperation( context: Client, id: number, format: string, - options: ExportOptions = { requestOptions: {} } + options: ExportOperationOptions = { requestOptions: {} } ): Promise { const result = await _exportOperationSend(context, id, format, options); return _exportOperationDeserialize(result); diff --git a/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/index.ts b/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/index.ts index 6521a8e214..7829aaa4d2 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/index.ts @@ -13,6 +13,6 @@ export { ListOptions, ListWithPageOptions, ListWithCustomPageModelOptions, - DeleteOptions, - ExportOptions, + DeleteOperationOptions, + ExportOperationOptions, } from "./models/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/models/index.ts b/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/models/index.ts index afed0676fd..a79ba0eeb3 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/models/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/models/index.ts @@ -9,6 +9,6 @@ export { ListOptions, ListWithPageOptions, ListWithCustomPageModelOptions, - DeleteOptions, - ExportOptions, + DeleteOperationOptions, + ExportOperationOptions, } from "./options.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/models/options.ts b/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/models/options.ts index 788bd1bc90..ce1b1048e5 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/models/options.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/azure/core/src/models/options.ts @@ -33,6 +33,6 @@ export interface ListWithPageOptions extends OperationOptions {} export interface ListWithCustomPageModelOptions extends OperationOptions {} -export interface DeleteOptions extends OperationOptions {} +export interface DeleteOperationOptions extends OperationOptions {} -export interface ExportOptions extends OperationOptions {} +export interface ExportOperationOptions extends OperationOptions {} diff --git a/packages/typespec-ts/test/modularIntegration/generated/azure/core/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/azure/core/tspconfig.yaml index 3c064fc4e0..cc07a97798 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/azure/core/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/azure/core/tspconfig.yaml @@ -9,6 +9,7 @@ options: azureSdkForJs: false isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/azure-core-basic" description: "Azure Core Basic Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/default/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/client/structure/default/tspconfig.yaml index 8a5a26fa47..52b71f0957 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/default/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/default/tspconfig.yaml @@ -9,6 +9,7 @@ options: azureSdkForJs: false isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/client-structure-default" description: "Client Structure Default Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/multi-client/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/client/structure/multi-client/tspconfig.yaml index 6249c23fb4..665d503dc9 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/multi-client/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/multi-client/tspconfig.yaml @@ -9,6 +9,7 @@ options: azureSdkForJs: false isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/client-structure-multiclient" description: "Client Structure MultiClient Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/RenamedOperationClient.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/RenamedOperationClient.ts index ba4eb10c2d..ef13835652 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/RenamedOperationClient.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/RenamedOperationClient.ts @@ -4,17 +4,12 @@ import { Pipeline } from "@azure/core-rest-pipeline"; import { ClientType } from "./models/models.js"; import { - RenamedTwoOptions, - RenamedFourOptions, - RenamedSixOptions, RenamedOneOptions, RenamedThreeOptions, RenamedFiveOptions, } from "./models/options.js"; +import { getGroupOperations, GroupOperations } from "./classic/group/index.js"; import { - renamedTwo, - renamedFour, - renamedSix, renamedOne, renamedThree, renamedFive, @@ -37,19 +32,11 @@ export class RenamedOperationClient { ) { this._client = createRenamedOperation(endpoint, client, options); this.pipeline = this._client.pipeline; + this.group = getGroupOperations(this._client); } - group = { - renamedTwo: (options?: RenamedTwoOptions): Promise => { - return renamedTwo(this._client, options); - }, - renamedFour: (options?: RenamedFourOptions): Promise => { - return renamedFour(this._client, options); - }, - renamedSix: (options?: RenamedSixOptions): Promise => { - return renamedSix(this._client, options); - }, - }; + /** The operation groups for Group */ + public readonly group: GroupOperations; renamedOne( options: RenamedOneOptions = { requestOptions: {} } diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/group.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/group/index.ts similarity index 78% rename from packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/group.ts rename to packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/group/index.ts index 3e7f64b87a..0e6904f807 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/group.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/group/index.ts @@ -6,20 +6,20 @@ import { ServiceContext as Client, Six204Response, Two204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, } from "@azure-rest/core-client"; import { - RenamedTwoOptions, - RenamedFourOptions, - RenamedSixOptions, -} from "../models/options.js"; + GroupRenamedTwoOptions, + GroupRenamedFourOptions, + GroupRenamedSixOptions, +} from "../../models/options.js"; export function _renamedTwoSend( context: Client, - options: RenamedTwoOptions = { requestOptions: {} } + options: GroupRenamedTwoOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/two") @@ -38,7 +38,7 @@ export async function _renamedTwoDeserialize( export async function renamedTwo( context: Client, - options: RenamedTwoOptions = { requestOptions: {} } + options: GroupRenamedTwoOptions = { requestOptions: {} } ): Promise { const result = await _renamedTwoSend(context, options); return _renamedTwoDeserialize(result); @@ -46,7 +46,7 @@ export async function renamedTwo( export function _renamedFourSend( context: Client, - options: RenamedFourOptions = { requestOptions: {} } + options: GroupRenamedFourOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/four") @@ -65,7 +65,7 @@ export async function _renamedFourDeserialize( export async function renamedFour( context: Client, - options: RenamedFourOptions = { requestOptions: {} } + options: GroupRenamedFourOptions = { requestOptions: {} } ): Promise { const result = await _renamedFourSend(context, options); return _renamedFourDeserialize(result); @@ -73,7 +73,7 @@ export async function renamedFour( export function _renamedSixSend( context: Client, - options: RenamedSixOptions = { requestOptions: {} } + options: GroupRenamedSixOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/six") @@ -92,7 +92,7 @@ export async function _renamedSixDeserialize( export async function renamedSix( context: Client, - options: RenamedSixOptions = { requestOptions: {} } + options: GroupRenamedSixOptions = { requestOptions: {} } ): Promise { const result = await _renamedSixSend(context, options); return _renamedSixDeserialize(result); diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/index.ts index fe55264d35..f4d13b6cc0 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/api/index.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -export { renamedTwo, renamedFour, renamedSix } from "./group.js"; export { renamedOne, renamedThree, renamedFive } from "./operations.js"; export { createRenamedOperation, RenamedOperationClientOptions, ServiceContext, } from "./RenamedOperationContext.js"; +export { renamedTwo, renamedFour, renamedSix } from "./group/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/classic/group/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/classic/group/index.ts new file mode 100644 index 0000000000..7991c15fee --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/classic/group/index.ts @@ -0,0 +1,33 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { ServiceContext } from "../../api/RenamedOperationContext.js"; +import { renamedTwo, renamedFour, renamedSix } from "../../api/group/index.js"; +import { + GroupRenamedTwoOptions, + GroupRenamedFourOptions, + GroupRenamedSixOptions, +} from "../../models/options.js"; + +export interface GroupOperations { + renamedTwo: (options?: GroupRenamedTwoOptions) => Promise; + renamedFour: (options?: GroupRenamedFourOptions) => Promise; + renamedSix: (options?: GroupRenamedSixOptions) => Promise; +} + +export function getGroup(context: ServiceContext) { + return { + renamedTwo: (options?: GroupRenamedTwoOptions) => + renamedTwo(context, options), + renamedFour: (options?: GroupRenamedFourOptions) => + renamedFour(context, options), + renamedSix: (options?: GroupRenamedSixOptions) => + renamedSix(context, options), + }; +} + +export function getGroupOperations(context: ServiceContext): GroupOperations { + return { + ...getGroup(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/classic/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/classic/index.ts new file mode 100644 index 0000000000..f01f27d2f0 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/classic/index.ts @@ -0,0 +1,4 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { GroupOperations } from "./group/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/index.ts index 19cc4f3085..d1a8c4f614 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/index.ts @@ -7,10 +7,11 @@ export { } from "./RenamedOperationClient.js"; export { ClientType, - RenamedTwoOptions, - RenamedFourOptions, - RenamedSixOptions, + GroupRenamedTwoOptions, + GroupRenamedFourOptions, + GroupRenamedSixOptions, RenamedOneOptions, RenamedThreeOptions, RenamedFiveOptions, } from "./models/index.js"; +export { GroupOperations } from "./classic/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/models/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/models/index.ts index 3e885c55d0..ffec77df83 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/models/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/models/index.ts @@ -3,9 +3,9 @@ export { ClientType } from "./models.js"; export { - RenamedTwoOptions, - RenamedFourOptions, - RenamedSixOptions, + GroupRenamedTwoOptions, + GroupRenamedFourOptions, + GroupRenamedSixOptions, RenamedOneOptions, RenamedThreeOptions, RenamedFiveOptions, diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/models/options.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/models/options.ts index 5a54b4c0f7..8a82417cfa 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/models/options.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/src/models/options.ts @@ -3,11 +3,11 @@ import { OperationOptions } from "@azure-rest/core-client"; -export interface RenamedTwoOptions extends OperationOptions {} +export interface GroupRenamedTwoOptions extends OperationOptions {} -export interface RenamedFourOptions extends OperationOptions {} +export interface GroupRenamedFourOptions extends OperationOptions {} -export interface RenamedSixOptions extends OperationOptions {} +export interface GroupRenamedSixOptions extends OperationOptions {} export interface RenamedOneOptions extends OperationOptions {} diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/tspconfig.yaml index 4baeba8f40..27667be85b 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/renamed-operation/tspconfig.yaml @@ -8,6 +8,7 @@ options: azureSdkForJs: false isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/client-structure-renamed" description: "Client Structure RenamedOperaiton Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/TwoOperationGroupClient.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/TwoOperationGroupClient.ts index 3043aa12bb..b09185232e 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/TwoOperationGroupClient.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/TwoOperationGroupClient.ts @@ -4,20 +4,14 @@ import { Pipeline } from "@azure/core-rest-pipeline"; import { ClientType } from "./models/models.js"; import { - OneOptions, - ThreeOptions, - FourOptions, - TwoOptions, - FiveOptions, - SixOptions, -} from "./models/options.js"; + getGroup1Operations, + Group1Operations, +} from "./classic/group1/index.js"; +import { + getGroup2Operations, + Group2Operations, +} from "./classic/group2/index.js"; import { - one, - three, - four, - two, - five, - six, createTwoOperationGroup, TwoOperationGroupClientOptions, ServiceContext, @@ -37,28 +31,12 @@ export class TwoOperationGroupClient { ) { this._client = createTwoOperationGroup(endpoint, client, options); this.pipeline = this._client.pipeline; + this.group1 = getGroup1Operations(this._client); + this.group2 = getGroup2Operations(this._client); } - group1 = { - one: (options?: OneOptions): Promise => { - return one(this._client, options); - }, - three: (options?: ThreeOptions): Promise => { - return three(this._client, options); - }, - four: (options?: FourOptions): Promise => { - return four(this._client, options); - }, - }; - group2 = { - two: (options?: TwoOptions): Promise => { - return two(this._client, options); - }, - five: (options?: FiveOptions): Promise => { - return five(this._client, options); - }, - six: (options?: SixOptions): Promise => { - return six(this._client, options); - }, - }; + /** The operation groups for Group1 */ + public readonly group1: Group1Operations; + /** The operation groups for Group2 */ + public readonly group2: Group2Operations; } diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group1.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group1/index.ts similarity index 79% rename from packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group1.ts rename to packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group1/index.ts index dbb7a4f759..3e472bd848 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group1.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group1/index.ts @@ -6,16 +6,20 @@ import { One204Response, ServiceContext as Client, Three204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, } from "@azure-rest/core-client"; -import { OneOptions, ThreeOptions, FourOptions } from "../models/options.js"; +import { + Group1OneOptions, + Group1ThreeOptions, + Group1FourOptions, +} from "../../models/options.js"; export function _oneSend( context: Client, - options: OneOptions = { requestOptions: {} } + options: Group1OneOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/one") @@ -32,7 +36,7 @@ export async function _oneDeserialize(result: One204Response): Promise { export async function one( context: Client, - options: OneOptions = { requestOptions: {} } + options: Group1OneOptions = { requestOptions: {} } ): Promise { const result = await _oneSend(context, options); return _oneDeserialize(result); @@ -40,7 +44,7 @@ export async function one( export function _threeSend( context: Client, - options: ThreeOptions = { requestOptions: {} } + options: Group1ThreeOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/three") @@ -59,7 +63,7 @@ export async function _threeDeserialize( export async function three( context: Client, - options: ThreeOptions = { requestOptions: {} } + options: Group1ThreeOptions = { requestOptions: {} } ): Promise { const result = await _threeSend(context, options); return _threeDeserialize(result); @@ -67,7 +71,7 @@ export async function three( export function _fourSend( context: Client, - options: FourOptions = { requestOptions: {} } + options: Group1FourOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/four") @@ -84,7 +88,7 @@ export async function _fourDeserialize(result: Four204Response): Promise { export async function four( context: Client, - options: FourOptions = { requestOptions: {} } + options: Group1FourOptions = { requestOptions: {} } ): Promise { const result = await _fourSend(context, options); return _fourDeserialize(result); diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group2.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group2/index.ts similarity index 79% rename from packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group2.ts rename to packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group2/index.ts index 7eb5efd199..856906e561 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group2.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/group2/index.ts @@ -6,16 +6,20 @@ import { ServiceContext as Client, Six204Response, Two204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, } from "@azure-rest/core-client"; -import { TwoOptions, FiveOptions, SixOptions } from "../models/options.js"; +import { + Group2TwoOptions, + Group2FiveOptions, + Group2SixOptions, +} from "../../models/options.js"; export function _twoSend( context: Client, - options: TwoOptions = { requestOptions: {} } + options: Group2TwoOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/two") @@ -32,7 +36,7 @@ export async function _twoDeserialize(result: Two204Response): Promise { export async function two( context: Client, - options: TwoOptions = { requestOptions: {} } + options: Group2TwoOptions = { requestOptions: {} } ): Promise { const result = await _twoSend(context, options); return _twoDeserialize(result); @@ -40,7 +44,7 @@ export async function two( export function _fiveSend( context: Client, - options: FiveOptions = { requestOptions: {} } + options: Group2FiveOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/five") @@ -57,7 +61,7 @@ export async function _fiveDeserialize(result: Five204Response): Promise { export async function five( context: Client, - options: FiveOptions = { requestOptions: {} } + options: Group2FiveOptions = { requestOptions: {} } ): Promise { const result = await _fiveSend(context, options); return _fiveDeserialize(result); @@ -65,7 +69,7 @@ export async function five( export function _sixSend( context: Client, - options: SixOptions = { requestOptions: {} } + options: Group2SixOptions = { requestOptions: {} } ): StreamableMethod { return context .path("/six") @@ -82,7 +86,7 @@ export async function _sixDeserialize(result: Six204Response): Promise { export async function six( context: Client, - options: SixOptions = { requestOptions: {} } + options: Group2SixOptions = { requestOptions: {} } ): Promise { const result = await _sixSend(context, options); return _sixDeserialize(result); diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/index.ts index fc5207b265..a8b6e53564 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/api/index.ts @@ -1,10 +1,10 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -export { one, three, four } from "./group1.js"; -export { two, five, six } from "./group2.js"; export { createTwoOperationGroup, TwoOperationGroupClientOptions, ServiceContext, } from "./TwoOperationGroupContext.js"; +export { one, three, four } from "./group1/index.js"; +export { two, five, six } from "./group2/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/group1/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/group1/index.ts new file mode 100644 index 0000000000..a1920276a2 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/group1/index.ts @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { ServiceContext } from "../../api/TwoOperationGroupContext.js"; +import { one, three, four } from "../../api/group1/index.js"; +import { + Group1OneOptions, + Group1ThreeOptions, + Group1FourOptions, +} from "../../models/options.js"; + +export interface Group1Operations { + one: (options?: Group1OneOptions) => Promise; + three: (options?: Group1ThreeOptions) => Promise; + four: (options?: Group1FourOptions) => Promise; +} + +export function getGroup1(context: ServiceContext) { + return { + one: (options?: Group1OneOptions) => one(context, options), + three: (options?: Group1ThreeOptions) => three(context, options), + four: (options?: Group1FourOptions) => four(context, options), + }; +} + +export function getGroup1Operations(context: ServiceContext): Group1Operations { + return { + ...getGroup1(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/group2/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/group2/index.ts new file mode 100644 index 0000000000..132062c81c --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/group2/index.ts @@ -0,0 +1,30 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { ServiceContext } from "../../api/TwoOperationGroupContext.js"; +import { two, five, six } from "../../api/group2/index.js"; +import { + Group2TwoOptions, + Group2FiveOptions, + Group2SixOptions, +} from "../../models/options.js"; + +export interface Group2Operations { + two: (options?: Group2TwoOptions) => Promise; + five: (options?: Group2FiveOptions) => Promise; + six: (options?: Group2SixOptions) => Promise; +} + +export function getGroup2(context: ServiceContext) { + return { + two: (options?: Group2TwoOptions) => two(context, options), + five: (options?: Group2FiveOptions) => five(context, options), + six: (options?: Group2SixOptions) => six(context, options), + }; +} + +export function getGroup2Operations(context: ServiceContext): Group2Operations { + return { + ...getGroup2(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/index.ts new file mode 100644 index 0000000000..eabc5c1a27 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/classic/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { Group1Operations } from "./group1/index.js"; +export { Group2Operations } from "./group2/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/index.ts index 13603a007d..eec426c3ba 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/index.ts @@ -7,10 +7,11 @@ export { } from "./TwoOperationGroupClient.js"; export { ClientType, - OneOptions, - ThreeOptions, - FourOptions, - TwoOptions, - FiveOptions, - SixOptions, + Group1OneOptions, + Group1ThreeOptions, + Group1FourOptions, + Group2TwoOptions, + Group2FiveOptions, + Group2SixOptions, } from "./models/index.js"; +export { Group1Operations, Group2Operations } from "./classic/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/models/index.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/models/index.ts index 297beca02a..24827c0b84 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/models/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/models/index.ts @@ -3,10 +3,10 @@ export { ClientType } from "./models.js"; export { - OneOptions, - ThreeOptions, - FourOptions, - TwoOptions, - FiveOptions, - SixOptions, + Group1OneOptions, + Group1ThreeOptions, + Group1FourOptions, + Group2TwoOptions, + Group2FiveOptions, + Group2SixOptions, } from "./options.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/models/options.ts b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/models/options.ts index 232303204a..99493095b2 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/models/options.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/src/models/options.ts @@ -3,14 +3,14 @@ import { OperationOptions } from "@azure-rest/core-client"; -export interface OneOptions extends OperationOptions {} +export interface Group1OneOptions extends OperationOptions {} -export interface ThreeOptions extends OperationOptions {} +export interface Group1ThreeOptions extends OperationOptions {} -export interface FourOptions extends OperationOptions {} +export interface Group1FourOptions extends OperationOptions {} -export interface TwoOptions extends OperationOptions {} +export interface Group2TwoOptions extends OperationOptions {} -export interface FiveOptions extends OperationOptions {} +export interface Group2FiveOptions extends OperationOptions {} -export interface SixOptions extends OperationOptions {} +export interface Group2SixOptions extends OperationOptions {} diff --git a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/tspconfig.yaml index 47adf24efd..5dff7d9182 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/client/structure/two-operation-group/tspconfig.yaml @@ -9,6 +9,7 @@ options: azureSdkForJs: false isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/client-structure-twoopgroup" description: "Client Structure TwoOperationGroup Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/BytesClient.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/BytesClient.ts index 7ac55b4697..168fa57f92 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/BytesClient.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/BytesClient.ts @@ -2,63 +2,24 @@ // Licensed under the MIT license. import { Pipeline } from "@azure/core-rest-pipeline"; +import { getQueryOperations, QueryOperations } from "./classic/query/index.js"; import { - DefaultBytesProperty, - Base64BytesProperty, - Base64urlBytesProperty, - Base64urlArrayBytesProperty, -} from "./models/models.js"; + getPropertyOperations, + PropertyOperations, +} from "./classic/property/index.js"; import { - QueryDefaultOptions, - QueryBase64Options, - QueryBase64urlOptions, - QueryBase64urlArrayOptions, - PropertyDefaultOptions, - PropertyBase64Options, - PropertyBase64urlOptions, - PropertyBase64urlArrayOptions, - HeaderDefaultOptions, - HeaderBase64Options, - HeaderBase64urlOptions, - HeaderBase64urlArrayOptions, - RequestBodyDefaultOptions, - RequestBodyOctetStreamOptions, - RequestBodyCustomContentTypeOptions, - RequestBodyBase64Options, - RequestBodyBase64urlOptions, - ResponseBodyDefaultOptions, - ResponseBodyOctetStreamOptions, - ResponseBodyCustomContentTypeOptions, - ResponseBodyBase64Options, - ResponseBodyBase64urlOptions, -} from "./models/options.js"; + getHeaderOperations, + HeaderOperations, +} from "./classic/header/index.js"; import { - createBytes, - BytesClientOptions, - BytesContext, - headerDefault, - headerBase64, - headerBase64url, - headerBase64urlArray, - propertyDefault, - propertyBase64, - propertyBase64url, - propertyBase64urlArray, - queryDefault, - queryBase64, - queryBase64url, - queryBase64urlArray, - requestBodyDefault, - requestBodyOctetStream, - requestBodyCustomContentType, - requestBodyBase64, - requestBodyBase64url, - responseBodyDefault, - responseBodyOctetStream, - responseBodyCustomContentType, - responseBodyBase64, - responseBodyBase64url, -} from "./api/index.js"; + getRequestBodyOperations, + RequestBodyOperations, +} from "./classic/requestBody/index.js"; +import { + getResponseBodyOperations, + ResponseBodyOperations, +} from "./classic/responseBody/index.js"; +import { createBytes, BytesClientOptions, BytesContext } from "./api/index.js"; export { BytesClientOptions } from "./api/BytesContext.js"; @@ -71,139 +32,21 @@ export class BytesClient { constructor(options: BytesClientOptions = {}) { this._client = createBytes(options); this.pipeline = this._client.pipeline; + this.query = getQueryOperations(this._client); + this.property = getPropertyOperations(this._client); + this.header = getHeaderOperations(this._client); + this.requestBody = getRequestBodyOperations(this._client); + this.responseBody = getResponseBodyOperations(this._client); } - query = { - default: ( - value: Uint8Array, - options?: QueryDefaultOptions - ): Promise => { - return queryDefault(this._client, value, options); - }, - base64: ( - value: Uint8Array, - options?: QueryBase64Options - ): Promise => { - return queryBase64(this._client, value, options); - }, - base64url: ( - value: Uint8Array, - options?: QueryBase64urlOptions - ): Promise => { - return queryBase64url(this._client, value, options); - }, - base64urlArray: ( - value: Uint8Array[], - options?: QueryBase64urlArrayOptions - ): Promise => { - return queryBase64urlArray(this._client, value, options); - }, - }; - property = { - default: ( - body: DefaultBytesProperty, - options?: PropertyDefaultOptions - ): Promise => { - return propertyDefault(this._client, body, options); - }, - base64: ( - body: Base64BytesProperty, - options?: PropertyBase64Options - ): Promise => { - return propertyBase64(this._client, body, options); - }, - base64url: ( - body: Base64urlBytesProperty, - options?: PropertyBase64urlOptions - ): Promise => { - return propertyBase64url(this._client, body, options); - }, - base64urlArray: ( - body: Base64urlArrayBytesProperty, - options?: PropertyBase64urlArrayOptions - ): Promise => { - return propertyBase64urlArray(this._client, body, options); - }, - }; - header = { - default: ( - value: Uint8Array, - options?: HeaderDefaultOptions - ): Promise => { - return headerDefault(this._client, value, options); - }, - base64: ( - value: Uint8Array, - options?: HeaderBase64Options - ): Promise => { - return headerBase64(this._client, value, options); - }, - base64url: ( - value: Uint8Array, - options?: HeaderBase64urlOptions - ): Promise => { - return headerBase64url(this._client, value, options); - }, - base64urlArray: ( - value: Uint8Array[], - options?: HeaderBase64urlArrayOptions - ): Promise => { - return headerBase64urlArray(this._client, value, options); - }, - }; - requestBody = { - default: ( - value: Uint8Array, - options?: RequestBodyDefaultOptions - ): Promise => { - return requestBodyDefault(this._client, value, options); - }, - octetStream: ( - value: Uint8Array, - options?: RequestBodyOctetStreamOptions - ): Promise => { - return requestBodyOctetStream(this._client, value, options); - }, - customContentType: ( - value: Uint8Array, - options?: RequestBodyCustomContentTypeOptions - ): Promise => { - return requestBodyCustomContentType(this._client, value, options); - }, - base64: ( - value: Uint8Array, - options?: RequestBodyBase64Options - ): Promise => { - return requestBodyBase64(this._client, value, options); - }, - base64url: ( - value: Uint8Array, - options?: RequestBodyBase64urlOptions - ): Promise => { - return requestBodyBase64url(this._client, value, options); - }, - }; - responseBody = { - default: (options?: ResponseBodyDefaultOptions): Promise => { - return responseBodyDefault(this._client, options); - }, - octetStream: ( - options?: ResponseBodyOctetStreamOptions - ): Promise => { - return responseBodyOctetStream(this._client, options); - }, - customContentType: ( - options?: ResponseBodyCustomContentTypeOptions - ): Promise => { - return responseBodyCustomContentType(this._client, options); - }, - base64: (options?: ResponseBodyBase64Options): Promise => { - return responseBodyBase64(this._client, options); - }, - base64url: ( - options?: ResponseBodyBase64urlOptions - ): Promise => { - return responseBodyBase64url(this._client, options); - }, - }; + /** The operation groups for Query */ + public readonly query: QueryOperations; + /** The operation groups for Property */ + public readonly property: PropertyOperations; + /** The operation groups for Header */ + public readonly header: HeaderOperations; + /** The operation groups for RequestBody */ + public readonly requestBody: RequestBodyOperations; + /** The operation groups for ResponseBody */ + public readonly responseBody: ResponseBodyOperations; } diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/header.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/header/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/header.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/header/index.ts index f354cd22ac..369fb342aa 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/header.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/header/index.ts @@ -8,7 +8,7 @@ import { HeaderBase64url204Response, HeaderBase64urlArray204Response, HeaderDefault204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -19,7 +19,7 @@ import { HeaderBase64Options, HeaderBase64urlOptions, HeaderBase64urlArrayOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _headerDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/index.ts index 221a9f24dc..e7548589f1 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/index.ts @@ -11,30 +11,30 @@ export { headerBase64, headerBase64url, headerBase64urlArray, -} from "./header.js"; +} from "./header/index.js"; export { propertyDefault, propertyBase64, propertyBase64url, propertyBase64urlArray, -} from "./property.js"; +} from "./property/index.js"; export { queryDefault, queryBase64, queryBase64url, queryBase64urlArray, -} from "./query.js"; +} from "./query/index.js"; export { requestBodyDefault, requestBodyOctetStream, requestBodyCustomContentType, requestBodyBase64, requestBodyBase64url, -} from "./requestBody.js"; +} from "./requestBody/index.js"; export { responseBodyDefault, responseBodyOctetStream, responseBodyCustomContentType, responseBodyBase64, responseBodyBase64url, -} from "./responseBody.js"; +} from "./responseBody/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/property.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/property/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/property.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/property/index.ts index 5f6d255713..016d9ecd0c 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/property.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/property/index.ts @@ -6,14 +6,14 @@ import { Base64BytesProperty, Base64urlBytesProperty, Base64urlArrayBytesProperty, -} from "../models/models.js"; +} from "../../models/models.js"; import { BytesContext as Client, PropertyBase64200Response, PropertyBase64url200Response, PropertyBase64urlArray200Response, PropertyDefault200Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -24,7 +24,7 @@ import { PropertyBase64Options, PropertyBase64urlOptions, PropertyBase64urlArrayOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _propertyDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/query.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/query/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/query.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/query/index.ts index fe03bfd668..8cd8d9e808 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/query.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/query/index.ts @@ -7,7 +7,7 @@ import { QueryBase64url204Response, QueryBase64urlArray204Response, QueryDefault204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -18,7 +18,7 @@ import { QueryBase64Options, QueryBase64urlOptions, QueryBase64urlArrayOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _queryDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/requestBody.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/requestBody/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/requestBody.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/requestBody/index.ts index a07544a825..8260076829 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/requestBody.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/requestBody/index.ts @@ -8,7 +8,7 @@ import { RequestBodyCustomContentType204Response, RequestBodyDefault204Response, RequestBodyOctetStream204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -20,7 +20,7 @@ import { RequestBodyCustomContentTypeOptions, RequestBodyBase64Options, RequestBodyBase64urlOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _requestBodyDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/responseBody.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/responseBody/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/responseBody.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/responseBody/index.ts index a8ac72ff01..0f67896f07 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/responseBody.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/api/responseBody/index.ts @@ -8,7 +8,7 @@ import { ResponseBodyCustomContentType200Response, ResponseBodyDefault200Response, ResponseBodyOctetStream200Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -20,7 +20,7 @@ import { ResponseBodyCustomContentTypeOptions, ResponseBodyBase64Options, ResponseBodyBase64urlOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _responseBodyDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/header/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/header/index.ts new file mode 100644 index 0000000000..f8379c1ed6 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/header/index.ts @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { BytesContext } from "../../api/BytesContext.js"; +import { + headerDefault, + headerBase64, + headerBase64url, + headerBase64urlArray, +} from "../../api/header/index.js"; +import { + HeaderDefaultOptions, + HeaderBase64Options, + HeaderBase64urlOptions, + HeaderBase64urlArrayOptions, +} from "../../models/options.js"; + +export interface HeaderOperations { + default: (value: Uint8Array, options?: HeaderDefaultOptions) => Promise; + base64: (value: Uint8Array, options?: HeaderBase64Options) => Promise; + base64url: ( + value: Uint8Array, + options?: HeaderBase64urlOptions + ) => Promise; + base64urlArray: ( + value: Uint8Array[], + options?: HeaderBase64urlArrayOptions + ) => Promise; +} + +export function getHeader(context: BytesContext) { + return { + default: (value: Uint8Array, options?: HeaderDefaultOptions) => + headerDefault(context, value, options), + base64: (value: Uint8Array, options?: HeaderBase64Options) => + headerBase64(context, value, options), + base64url: (value: Uint8Array, options?: HeaderBase64urlOptions) => + headerBase64url(context, value, options), + base64urlArray: ( + value: Uint8Array[], + options?: HeaderBase64urlArrayOptions + ) => headerBase64urlArray(context, value, options), + }; +} + +export function getHeaderOperations(context: BytesContext): HeaderOperations { + return { + ...getHeader(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/index.ts new file mode 100644 index 0000000000..9beef7ba60 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/index.ts @@ -0,0 +1,8 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { HeaderOperations } from "./header/index.js"; +export { PropertyOperations } from "./property/index.js"; +export { QueryOperations } from "./query/index.js"; +export { RequestBodyOperations } from "./requestBody/index.js"; +export { ResponseBodyOperations } from "./responseBody/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/property/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/property/index.ts new file mode 100644 index 0000000000..b7d46d09e8 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/property/index.ts @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { BytesContext } from "../../api/BytesContext.js"; +import { + DefaultBytesProperty, + Base64BytesProperty, + Base64urlBytesProperty, + Base64urlArrayBytesProperty, +} from "../../models/models.js"; +import { + propertyDefault, + propertyBase64, + propertyBase64url, + propertyBase64urlArray, +} from "../../api/property/index.js"; +import { + PropertyDefaultOptions, + PropertyBase64Options, + PropertyBase64urlOptions, + PropertyBase64urlArrayOptions, +} from "../../models/options.js"; + +export interface PropertyOperations { + default: ( + body: DefaultBytesProperty, + options?: PropertyDefaultOptions + ) => Promise; + base64: ( + body: Base64BytesProperty, + options?: PropertyBase64Options + ) => Promise; + base64url: ( + body: Base64urlBytesProperty, + options?: PropertyBase64urlOptions + ) => Promise; + base64urlArray: ( + body: Base64urlArrayBytesProperty, + options?: PropertyBase64urlArrayOptions + ) => Promise; +} + +export function getProperty(context: BytesContext) { + return { + default: (body: DefaultBytesProperty, options?: PropertyDefaultOptions) => + propertyDefault(context, body, options), + base64: (body: Base64BytesProperty, options?: PropertyBase64Options) => + propertyBase64(context, body, options), + base64url: ( + body: Base64urlBytesProperty, + options?: PropertyBase64urlOptions + ) => propertyBase64url(context, body, options), + base64urlArray: ( + body: Base64urlArrayBytesProperty, + options?: PropertyBase64urlArrayOptions + ) => propertyBase64urlArray(context, body, options), + }; +} + +export function getPropertyOperations( + context: BytesContext +): PropertyOperations { + return { + ...getProperty(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/query/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/query/index.ts new file mode 100644 index 0000000000..1bd0a9bbb5 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/query/index.ts @@ -0,0 +1,50 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { BytesContext } from "../../api/BytesContext.js"; +import { + queryDefault, + queryBase64, + queryBase64url, + queryBase64urlArray, +} from "../../api/query/index.js"; +import { + QueryDefaultOptions, + QueryBase64Options, + QueryBase64urlOptions, + QueryBase64urlArrayOptions, +} from "../../models/options.js"; + +export interface QueryOperations { + default: (value: Uint8Array, options?: QueryDefaultOptions) => Promise; + base64: (value: Uint8Array, options?: QueryBase64Options) => Promise; + base64url: ( + value: Uint8Array, + options?: QueryBase64urlOptions + ) => Promise; + base64urlArray: ( + value: Uint8Array[], + options?: QueryBase64urlArrayOptions + ) => Promise; +} + +export function getQuery(context: BytesContext) { + return { + default: (value: Uint8Array, options?: QueryDefaultOptions) => + queryDefault(context, value, options), + base64: (value: Uint8Array, options?: QueryBase64Options) => + queryBase64(context, value, options), + base64url: (value: Uint8Array, options?: QueryBase64urlOptions) => + queryBase64url(context, value, options), + base64urlArray: ( + value: Uint8Array[], + options?: QueryBase64urlArrayOptions + ) => queryBase64urlArray(context, value, options), + }; +} + +export function getQueryOperations(context: BytesContext): QueryOperations { + return { + ...getQuery(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/requestBody/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/requestBody/index.ts new file mode 100644 index 0000000000..5074a7e36f --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/requestBody/index.ts @@ -0,0 +1,66 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { BytesContext } from "../../api/BytesContext.js"; +import { + requestBodyDefault, + requestBodyOctetStream, + requestBodyCustomContentType, + requestBodyBase64, + requestBodyBase64url, +} from "../../api/requestBody/index.js"; +import { + RequestBodyDefaultOptions, + RequestBodyOctetStreamOptions, + RequestBodyCustomContentTypeOptions, + RequestBodyBase64Options, + RequestBodyBase64urlOptions, +} from "../../models/options.js"; + +export interface RequestBodyOperations { + default: ( + value: Uint8Array, + options?: RequestBodyDefaultOptions + ) => Promise; + octetStream: ( + value: Uint8Array, + options?: RequestBodyOctetStreamOptions + ) => Promise; + customContentType: ( + value: Uint8Array, + options?: RequestBodyCustomContentTypeOptions + ) => Promise; + base64: ( + value: Uint8Array, + options?: RequestBodyBase64Options + ) => Promise; + base64url: ( + value: Uint8Array, + options?: RequestBodyBase64urlOptions + ) => Promise; +} + +export function getRequestBody(context: BytesContext) { + return { + default: (value: Uint8Array, options?: RequestBodyDefaultOptions) => + requestBodyDefault(context, value, options), + octetStream: (value: Uint8Array, options?: RequestBodyOctetStreamOptions) => + requestBodyOctetStream(context, value, options), + customContentType: ( + value: Uint8Array, + options?: RequestBodyCustomContentTypeOptions + ) => requestBodyCustomContentType(context, value, options), + base64: (value: Uint8Array, options?: RequestBodyBase64Options) => + requestBodyBase64(context, value, options), + base64url: (value: Uint8Array, options?: RequestBodyBase64urlOptions) => + requestBodyBase64url(context, value, options), + }; +} + +export function getRequestBodyOperations( + context: BytesContext +): RequestBodyOperations { + return { + ...getRequestBody(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/responseBody/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/responseBody/index.ts new file mode 100644 index 0000000000..b57d5c8474 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/classic/responseBody/index.ts @@ -0,0 +1,53 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { BytesContext } from "../../api/BytesContext.js"; +import { + responseBodyDefault, + responseBodyOctetStream, + responseBodyCustomContentType, + responseBodyBase64, + responseBodyBase64url, +} from "../../api/responseBody/index.js"; +import { + ResponseBodyDefaultOptions, + ResponseBodyOctetStreamOptions, + ResponseBodyCustomContentTypeOptions, + ResponseBodyBase64Options, + ResponseBodyBase64urlOptions, +} from "../../models/options.js"; + +export interface ResponseBodyOperations { + default: (options?: ResponseBodyDefaultOptions) => Promise; + octetStream: ( + options?: ResponseBodyOctetStreamOptions + ) => Promise; + customContentType: ( + options?: ResponseBodyCustomContentTypeOptions + ) => Promise; + base64: (options?: ResponseBodyBase64Options) => Promise; + base64url: (options?: ResponseBodyBase64urlOptions) => Promise; +} + +export function getResponseBody(context: BytesContext) { + return { + default: (options?: ResponseBodyDefaultOptions) => + responseBodyDefault(context, options), + octetStream: (options?: ResponseBodyOctetStreamOptions) => + responseBodyOctetStream(context, options), + customContentType: (options?: ResponseBodyCustomContentTypeOptions) => + responseBodyCustomContentType(context, options), + base64: (options?: ResponseBodyBase64Options) => + responseBodyBase64(context, options), + base64url: (options?: ResponseBodyBase64urlOptions) => + responseBodyBase64url(context, options), + }; +} + +export function getResponseBodyOperations( + context: BytesContext +): ResponseBodyOperations { + return { + ...getResponseBody(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/index.ts index 152825fd67..092f056311 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/src/index.ts @@ -30,3 +30,10 @@ export { ResponseBodyBase64Options, ResponseBodyBase64urlOptions, } from "./models/index.js"; +export { + HeaderOperations, + PropertyOperations, + QueryOperations, + RequestBodyOperations, + ResponseBodyOperations, +} from "./classic/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/tspconfig.yaml index f43d04c270..9dfdcd95b1 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/bytes/tspconfig.yaml @@ -10,5 +10,6 @@ options: isTypeSpecTest: true enableOperationGroup: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/encode-bytes" diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/DatetimeClient.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/DatetimeClient.ts index b9e64ff4bb..f4b0c0d721 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/DatetimeClient.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/DatetimeClient.ts @@ -2,57 +2,23 @@ // Licensed under the MIT license. import { Pipeline } from "@azure/core-rest-pipeline"; +import { getQueryOperations, QueryOperations } from "./classic/query/index.js"; import { - DefaultDatetimeProperty, - Rfc3339DatetimeProperty, - Rfc7231DatetimeProperty, - UnixTimestampDatetimeProperty, - UnixTimestampArrayDatetimeProperty, -} from "./models/models.js"; + getPropertyOperations, + PropertyOperations, +} from "./classic/property/index.js"; import { - QueryDefaultOptions, - QueryRfc3339Options, - QueryRfc7231Options, - QueryUnixTimestampOptions, - QueryUnixTimestampArrayOptions, - PropertyDefaultOptions, - PropertyRfc3339Options, - PropertyRfc7231Options, - PropertyUnixTimestampOptions, - PropertyUnixTimestampArrayOptions, - HeaderDefaultOptions, - HeaderRfc3339Options, - HeaderRfc7231Options, - HeaderUnixTimestampOptions, - HeaderUnixTimestampArrayOptions, - ResponseHeaderDefaultOptions, - ResponseHeaderRfc3339Options, - ResponseHeaderRfc7231Options, - ResponseHeaderUnixTimestampOptions, -} from "./models/options.js"; + getHeaderOperations, + HeaderOperations, +} from "./classic/header/index.js"; +import { + getResponseHeaderOperations, + ResponseHeaderOperations, +} from "./classic/responseHeader/index.js"; import { createDatetime, DatetimeClientOptions, DatetimeContext, - headerDefault, - headerRfc3339, - headerRfc7231, - headerUnixTimestamp, - headerUnixTimestampArray, - propertyDefault, - propertyRfc3339, - propertyRfc7231, - propertyUnixTimestamp, - propertyUnixTimestampArray, - queryDefault, - queryRfc3339, - queryRfc7231, - queryUnixTimestamp, - queryUnixTimestampArray, - responseHeaderDefault, - responseHeaderRfc3339, - responseHeaderRfc7231, - responseHeaderUnixTimestamp, } from "./api/index.js"; export { DatetimeClientOptions } from "./api/DatetimeContext.js"; @@ -66,100 +32,18 @@ export class DatetimeClient { constructor(options: DatetimeClientOptions = {}) { this._client = createDatetime(options); this.pipeline = this._client.pipeline; + this.query = getQueryOperations(this._client); + this.property = getPropertyOperations(this._client); + this.header = getHeaderOperations(this._client); + this.responseHeader = getResponseHeaderOperations(this._client); } - query = { - default: (value: Date, options?: QueryDefaultOptions): Promise => { - return queryDefault(this._client, value, options); - }, - rfc3339: (value: Date, options?: QueryRfc3339Options): Promise => { - return queryRfc3339(this._client, value, options); - }, - rfc7231: (value: Date, options?: QueryRfc7231Options): Promise => { - return queryRfc7231(this._client, value, options); - }, - unixTimestamp: ( - value: Date, - options?: QueryUnixTimestampOptions - ): Promise => { - return queryUnixTimestamp(this._client, value, options); - }, - unixTimestampArray: ( - value: Date[], - options?: QueryUnixTimestampArrayOptions - ): Promise => { - return queryUnixTimestampArray(this._client, value, options); - }, - }; - property = { - default: ( - body: DefaultDatetimeProperty, - options?: PropertyDefaultOptions - ): Promise => { - return propertyDefault(this._client, body, options); - }, - rfc3339: ( - body: Rfc3339DatetimeProperty, - options?: PropertyRfc3339Options - ): Promise => { - return propertyRfc3339(this._client, body, options); - }, - rfc7231: ( - body: Rfc7231DatetimeProperty, - options?: PropertyRfc7231Options - ): Promise => { - return propertyRfc7231(this._client, body, options); - }, - unixTimestamp: ( - body: UnixTimestampDatetimeProperty, - options?: PropertyUnixTimestampOptions - ): Promise => { - return propertyUnixTimestamp(this._client, body, options); - }, - unixTimestampArray: ( - body: UnixTimestampArrayDatetimeProperty, - options?: PropertyUnixTimestampArrayOptions - ): Promise => { - return propertyUnixTimestampArray(this._client, body, options); - }, - }; - header = { - default: (value: Date, options?: HeaderDefaultOptions): Promise => { - return headerDefault(this._client, value, options); - }, - rfc3339: (value: Date, options?: HeaderRfc3339Options): Promise => { - return headerRfc3339(this._client, value, options); - }, - rfc7231: (value: Date, options?: HeaderRfc7231Options): Promise => { - return headerRfc7231(this._client, value, options); - }, - unixTimestamp: ( - value: Date, - options?: HeaderUnixTimestampOptions - ): Promise => { - return headerUnixTimestamp(this._client, value, options); - }, - unixTimestampArray: ( - value: Date[], - options?: HeaderUnixTimestampArrayOptions - ): Promise => { - return headerUnixTimestampArray(this._client, value, options); - }, - }; - responseHeader = { - default: (options?: ResponseHeaderDefaultOptions): Promise => { - return responseHeaderDefault(this._client, options); - }, - rfc3339: (options?: ResponseHeaderRfc3339Options): Promise => { - return responseHeaderRfc3339(this._client, options); - }, - rfc7231: (options?: ResponseHeaderRfc7231Options): Promise => { - return responseHeaderRfc7231(this._client, options); - }, - unixTimestamp: ( - options?: ResponseHeaderUnixTimestampOptions - ): Promise => { - return responseHeaderUnixTimestamp(this._client, options); - }, - }; + /** The operation groups for Query */ + public readonly query: QueryOperations; + /** The operation groups for Property */ + public readonly property: PropertyOperations; + /** The operation groups for Header */ + public readonly header: HeaderOperations; + /** The operation groups for ResponseHeader */ + public readonly responseHeader: ResponseHeaderOperations; } diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/header.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/header/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/header.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/header/index.ts index 5b291b3b69..553c870965 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/header.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/header/index.ts @@ -9,7 +9,7 @@ import { HeaderRfc7231204Response, HeaderUnixTimestamp204Response, HeaderUnixTimestampArray204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -20,7 +20,7 @@ import { HeaderRfc7231Options, HeaderUnixTimestampOptions, HeaderUnixTimestampArrayOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _headerDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/index.ts index 28f91b2a19..8e892173b4 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/index.ts @@ -12,24 +12,24 @@ export { headerRfc7231, headerUnixTimestamp, headerUnixTimestampArray, -} from "./header.js"; +} from "./header/index.js"; export { propertyDefault, propertyRfc3339, propertyRfc7231, propertyUnixTimestamp, propertyUnixTimestampArray, -} from "./property.js"; +} from "./property/index.js"; export { queryDefault, queryRfc3339, queryRfc7231, queryUnixTimestamp, queryUnixTimestampArray, -} from "./query.js"; +} from "./query/index.js"; export { responseHeaderDefault, responseHeaderRfc3339, responseHeaderRfc7231, responseHeaderUnixTimestamp, -} from "./responseHeader.js"; +} from "./responseHeader/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/property.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/property/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/property.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/property/index.ts index 6b426d277e..fe92a4c8fe 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/property.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/property/index.ts @@ -7,7 +7,7 @@ import { Rfc7231DatetimeProperty, UnixTimestampDatetimeProperty, UnixTimestampArrayDatetimeProperty, -} from "../models/models.js"; +} from "../../models/models.js"; import { DatetimeContext as Client, PropertyDefault200Response, @@ -15,7 +15,7 @@ import { PropertyRfc7231200Response, PropertyUnixTimestamp200Response, PropertyUnixTimestampArray200Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -26,7 +26,7 @@ import { PropertyRfc7231Options, PropertyUnixTimestampOptions, PropertyUnixTimestampArrayOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _propertyDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/query.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/query/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/query.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/query/index.ts index ffce73a4fe..3819c8d2ae 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/query.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/query/index.ts @@ -8,7 +8,7 @@ import { QueryRfc7231204Response, QueryUnixTimestamp204Response, QueryUnixTimestampArray204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -19,7 +19,7 @@ import { QueryRfc7231Options, QueryUnixTimestampOptions, QueryUnixTimestampArrayOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _queryDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/responseHeader.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/responseHeader/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/responseHeader.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/responseHeader/index.ts index 6e222fc3aa..c23f9b4c8d 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/responseHeader.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/api/responseHeader/index.ts @@ -7,7 +7,7 @@ import { ResponseHeaderRfc3339204Response, ResponseHeaderRfc7231204Response, ResponseHeaderUnixTimestamp204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -17,7 +17,7 @@ import { ResponseHeaderRfc3339Options, ResponseHeaderRfc7231Options, ResponseHeaderUnixTimestampOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _responseHeaderDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/header/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/header/index.ts new file mode 100644 index 0000000000..a717f57a06 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/header/index.ts @@ -0,0 +1,57 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { DatetimeContext } from "../../api/DatetimeContext.js"; +import { + headerDefault, + headerRfc3339, + headerRfc7231, + headerUnixTimestamp, + headerUnixTimestampArray, +} from "../../api/header/index.js"; +import { + HeaderDefaultOptions, + HeaderRfc3339Options, + HeaderRfc7231Options, + HeaderUnixTimestampOptions, + HeaderUnixTimestampArrayOptions, +} from "../../models/options.js"; + +export interface HeaderOperations { + default: (value: Date, options?: HeaderDefaultOptions) => Promise; + rfc3339: (value: Date, options?: HeaderRfc3339Options) => Promise; + rfc7231: (value: Date, options?: HeaderRfc7231Options) => Promise; + unixTimestamp: ( + value: Date, + options?: HeaderUnixTimestampOptions + ) => Promise; + unixTimestampArray: ( + value: Date[], + options?: HeaderUnixTimestampArrayOptions + ) => Promise; +} + +export function getHeader(context: DatetimeContext) { + return { + default: (value: Date, options?: HeaderDefaultOptions) => + headerDefault(context, value, options), + rfc3339: (value: Date, options?: HeaderRfc3339Options) => + headerRfc3339(context, value, options), + rfc7231: (value: Date, options?: HeaderRfc7231Options) => + headerRfc7231(context, value, options), + unixTimestamp: (value: Date, options?: HeaderUnixTimestampOptions) => + headerUnixTimestamp(context, value, options), + unixTimestampArray: ( + value: Date[], + options?: HeaderUnixTimestampArrayOptions + ) => headerUnixTimestampArray(context, value, options), + }; +} + +export function getHeaderOperations( + context: DatetimeContext +): HeaderOperations { + return { + ...getHeader(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/index.ts new file mode 100644 index 0000000000..7cc49f45e2 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/index.ts @@ -0,0 +1,7 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { HeaderOperations } from "./header/index.js"; +export { PropertyOperations } from "./property/index.js"; +export { QueryOperations } from "./query/index.js"; +export { ResponseHeaderOperations } from "./responseHeader/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/property/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/property/index.ts new file mode 100644 index 0000000000..8394a23308 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/property/index.ts @@ -0,0 +1,81 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { DatetimeContext } from "../../api/DatetimeContext.js"; +import { + DefaultDatetimeProperty, + Rfc3339DatetimeProperty, + Rfc7231DatetimeProperty, + UnixTimestampDatetimeProperty, + UnixTimestampArrayDatetimeProperty, +} from "../../models/models.js"; +import { + propertyDefault, + propertyRfc3339, + propertyRfc7231, + propertyUnixTimestamp, + propertyUnixTimestampArray, +} from "../../api/property/index.js"; +import { + PropertyDefaultOptions, + PropertyRfc3339Options, + PropertyRfc7231Options, + PropertyUnixTimestampOptions, + PropertyUnixTimestampArrayOptions, +} from "../../models/options.js"; + +export interface PropertyOperations { + default: ( + body: DefaultDatetimeProperty, + options?: PropertyDefaultOptions + ) => Promise; + rfc3339: ( + body: Rfc3339DatetimeProperty, + options?: PropertyRfc3339Options + ) => Promise; + rfc7231: ( + body: Rfc7231DatetimeProperty, + options?: PropertyRfc7231Options + ) => Promise; + unixTimestamp: ( + body: UnixTimestampDatetimeProperty, + options?: PropertyUnixTimestampOptions + ) => Promise; + unixTimestampArray: ( + body: UnixTimestampArrayDatetimeProperty, + options?: PropertyUnixTimestampArrayOptions + ) => Promise; +} + +export function getProperty(context: DatetimeContext) { + return { + default: ( + body: DefaultDatetimeProperty, + options?: PropertyDefaultOptions + ) => propertyDefault(context, body, options), + rfc3339: ( + body: Rfc3339DatetimeProperty, + options?: PropertyRfc3339Options + ) => propertyRfc3339(context, body, options), + rfc7231: ( + body: Rfc7231DatetimeProperty, + options?: PropertyRfc7231Options + ) => propertyRfc7231(context, body, options), + unixTimestamp: ( + body: UnixTimestampDatetimeProperty, + options?: PropertyUnixTimestampOptions + ) => propertyUnixTimestamp(context, body, options), + unixTimestampArray: ( + body: UnixTimestampArrayDatetimeProperty, + options?: PropertyUnixTimestampArrayOptions + ) => propertyUnixTimestampArray(context, body, options), + }; +} + +export function getPropertyOperations( + context: DatetimeContext +): PropertyOperations { + return { + ...getProperty(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/query/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/query/index.ts new file mode 100644 index 0000000000..d7ff3c2f70 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/query/index.ts @@ -0,0 +1,55 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { DatetimeContext } from "../../api/DatetimeContext.js"; +import { + queryDefault, + queryRfc3339, + queryRfc7231, + queryUnixTimestamp, + queryUnixTimestampArray, +} from "../../api/query/index.js"; +import { + QueryDefaultOptions, + QueryRfc3339Options, + QueryRfc7231Options, + QueryUnixTimestampOptions, + QueryUnixTimestampArrayOptions, +} from "../../models/options.js"; + +export interface QueryOperations { + default: (value: Date, options?: QueryDefaultOptions) => Promise; + rfc3339: (value: Date, options?: QueryRfc3339Options) => Promise; + rfc7231: (value: Date, options?: QueryRfc7231Options) => Promise; + unixTimestamp: ( + value: Date, + options?: QueryUnixTimestampOptions + ) => Promise; + unixTimestampArray: ( + value: Date[], + options?: QueryUnixTimestampArrayOptions + ) => Promise; +} + +export function getQuery(context: DatetimeContext) { + return { + default: (value: Date, options?: QueryDefaultOptions) => + queryDefault(context, value, options), + rfc3339: (value: Date, options?: QueryRfc3339Options) => + queryRfc3339(context, value, options), + rfc7231: (value: Date, options?: QueryRfc7231Options) => + queryRfc7231(context, value, options), + unixTimestamp: (value: Date, options?: QueryUnixTimestampOptions) => + queryUnixTimestamp(context, value, options), + unixTimestampArray: ( + value: Date[], + options?: QueryUnixTimestampArrayOptions + ) => queryUnixTimestampArray(context, value, options), + }; +} + +export function getQueryOperations(context: DatetimeContext): QueryOperations { + return { + ...getQuery(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/responseHeader/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/responseHeader/index.ts new file mode 100644 index 0000000000..18d0b0c8bc --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/classic/responseHeader/index.ts @@ -0,0 +1,46 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { DatetimeContext } from "../../api/DatetimeContext.js"; +import { + responseHeaderDefault, + responseHeaderRfc3339, + responseHeaderRfc7231, + responseHeaderUnixTimestamp, +} from "../../api/responseHeader/index.js"; +import { + ResponseHeaderDefaultOptions, + ResponseHeaderRfc3339Options, + ResponseHeaderRfc7231Options, + ResponseHeaderUnixTimestampOptions, +} from "../../models/options.js"; + +export interface ResponseHeaderOperations { + default: (options?: ResponseHeaderDefaultOptions) => Promise; + rfc3339: (options?: ResponseHeaderRfc3339Options) => Promise; + rfc7231: (options?: ResponseHeaderRfc7231Options) => Promise; + unixTimestamp: ( + options?: ResponseHeaderUnixTimestampOptions + ) => Promise; +} + +export function getResponseHeader(context: DatetimeContext) { + return { + default: (options?: ResponseHeaderDefaultOptions) => + responseHeaderDefault(context, options), + rfc3339: (options?: ResponseHeaderRfc3339Options) => + responseHeaderRfc3339(context, options), + rfc7231: (options?: ResponseHeaderRfc7231Options) => + responseHeaderRfc7231(context, options), + unixTimestamp: (options?: ResponseHeaderUnixTimestampOptions) => + responseHeaderUnixTimestamp(context, options), + }; +} + +export function getResponseHeaderOperations( + context: DatetimeContext +): ResponseHeaderOperations { + return { + ...getResponseHeader(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/index.ts index a3f40600fc..435582d2f5 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/src/index.ts @@ -28,3 +28,9 @@ export { ResponseHeaderRfc7231Options, ResponseHeaderUnixTimestampOptions, } from "./models/index.js"; +export { + HeaderOperations, + PropertyOperations, + QueryOperations, + ResponseHeaderOperations, +} from "./classic/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/tspconfig.yaml index 03aecac2c6..9a54aa0f36 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/datetime/tspconfig.yaml @@ -10,5 +10,6 @@ options: isTypeSpecTest: true enableOperationGroup: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/encode-datatime" diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/DurationClient.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/DurationClient.ts index d6dcd1d620..2e0041ce30 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/DurationClient.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/DurationClient.ts @@ -2,49 +2,19 @@ // Licensed under the MIT license. import { Pipeline } from "@azure/core-rest-pipeline"; +import { getQueryOperations, QueryOperations } from "./classic/query/index.js"; import { - DefaultDurationProperty, - ISO8601DurationProperty, - Int32SecondsDurationProperty, - FloatSecondsDurationProperty, - FloatSecondsDurationArrayProperty, -} from "./models/models.js"; + getPropertyOperations, + PropertyOperations, +} from "./classic/property/index.js"; import { - QueryDefaultOptions, - QueryIso8601Options, - QueryInt32SecondsOptions, - QueryFloatSecondsOptions, - QueryInt32SecondsArrayOptions, - PropertyDefaultOptions, - PropertyIso8601Options, - PropertyInt32SecondsOptions, - PropertyFloatSecondsOptions, - PropertyFloatSecondsArrayOptions, - HeaderDefaultOptions, - HeaderIso8601Options, - HeaderIso8601ArrayOptions, - HeaderInt32SecondsOptions, - HeaderFloatSecondsOptions, -} from "./models/options.js"; + getHeaderOperations, + HeaderOperations, +} from "./classic/header/index.js"; import { createDuration, DurationClientOptions, DurationContext, - headerDefault, - headerIso8601, - headerIso8601Array, - headerInt32Seconds, - headerFloatSeconds, - propertyDefault, - propertyIso8601, - propertyInt32Seconds, - propertyFloatSeconds, - propertyFloatSecondsArray, - queryDefault, - queryIso8601, - queryInt32Seconds, - queryFloatSeconds, - queryInt32SecondsArray, } from "./api/index.js"; export { DurationClientOptions } from "./api/DurationContext.js"; @@ -58,96 +28,15 @@ export class DurationClient { constructor(options: DurationClientOptions = {}) { this._client = createDuration(options); this.pipeline = this._client.pipeline; + this.query = getQueryOperations(this._client); + this.property = getPropertyOperations(this._client); + this.header = getHeaderOperations(this._client); } - query = { - default: (input: string, options?: QueryDefaultOptions): Promise => { - return queryDefault(this._client, input, options); - }, - iso8601: (input: string, options?: QueryIso8601Options): Promise => { - return queryIso8601(this._client, input, options); - }, - int32Seconds: ( - input: number, - options?: QueryInt32SecondsOptions - ): Promise => { - return queryInt32Seconds(this._client, input, options); - }, - floatSeconds: ( - input: number, - options?: QueryFloatSecondsOptions - ): Promise => { - return queryFloatSeconds(this._client, input, options); - }, - int32SecondsArray: ( - input: number[], - options?: QueryInt32SecondsArrayOptions - ): Promise => { - return queryInt32SecondsArray(this._client, input, options); - }, - }; - property = { - default: ( - body: DefaultDurationProperty, - options?: PropertyDefaultOptions - ): Promise => { - return propertyDefault(this._client, body, options); - }, - iso8601: ( - body: ISO8601DurationProperty, - options?: PropertyIso8601Options - ): Promise => { - return propertyIso8601(this._client, body, options); - }, - int32Seconds: ( - body: Int32SecondsDurationProperty, - options?: PropertyInt32SecondsOptions - ): Promise => { - return propertyInt32Seconds(this._client, body, options); - }, - floatSeconds: ( - body: FloatSecondsDurationProperty, - options?: PropertyFloatSecondsOptions - ): Promise => { - return propertyFloatSeconds(this._client, body, options); - }, - floatSecondsArray: ( - body: FloatSecondsDurationArrayProperty, - options?: PropertyFloatSecondsArrayOptions - ): Promise => { - return propertyFloatSecondsArray(this._client, body, options); - }, - }; - header = { - default: ( - duration: string, - options?: HeaderDefaultOptions - ): Promise => { - return headerDefault(this._client, duration, options); - }, - iso8601: ( - duration: string, - options?: HeaderIso8601Options - ): Promise => { - return headerIso8601(this._client, duration, options); - }, - iso8601Array: ( - duration: string[], - options?: HeaderIso8601ArrayOptions - ): Promise => { - return headerIso8601Array(this._client, duration, options); - }, - int32Seconds: ( - duration: number, - options?: HeaderInt32SecondsOptions - ): Promise => { - return headerInt32Seconds(this._client, duration, options); - }, - floatSeconds: ( - duration: number, - options?: HeaderFloatSecondsOptions - ): Promise => { - return headerFloatSeconds(this._client, duration, options); - }, - }; + /** The operation groups for Query */ + public readonly query: QueryOperations; + /** The operation groups for Property */ + public readonly property: PropertyOperations; + /** The operation groups for Header */ + public readonly header: HeaderOperations; } diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/header.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/header/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/header.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/header/index.ts index eb1de520e9..054b7a8c7f 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/header.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/header/index.ts @@ -9,7 +9,7 @@ import { HeaderInt32Seconds204Response, HeaderIso8601204Response, HeaderIso8601Array204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -20,7 +20,7 @@ import { HeaderIso8601ArrayOptions, HeaderInt32SecondsOptions, HeaderFloatSecondsOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _headerDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/index.ts index 716eddc539..54d0621d4e 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/index.ts @@ -12,18 +12,18 @@ export { headerIso8601Array, headerInt32Seconds, headerFloatSeconds, -} from "./header.js"; +} from "./header/index.js"; export { propertyDefault, propertyIso8601, propertyInt32Seconds, propertyFloatSeconds, propertyFloatSecondsArray, -} from "./property.js"; +} from "./property/index.js"; export { queryDefault, queryIso8601, queryInt32Seconds, queryFloatSeconds, queryInt32SecondsArray, -} from "./query.js"; +} from "./query/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/property.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/property/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/property.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/property/index.ts index 3c746dc464..17a37bbd69 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/property.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/property/index.ts @@ -7,7 +7,7 @@ import { Int32SecondsDurationProperty, FloatSecondsDurationProperty, FloatSecondsDurationArrayProperty, -} from "../models/models.js"; +} from "../../models/models.js"; import { DurationContext as Client, PropertyDefault200Response, @@ -15,7 +15,7 @@ import { PropertyFloatSecondsArray200Response, PropertyInt32Seconds200Response, PropertyIso8601200Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -26,7 +26,7 @@ import { PropertyInt32SecondsOptions, PropertyFloatSecondsOptions, PropertyFloatSecondsArrayOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _propertyDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/query.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/query/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/query.ts rename to packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/query/index.ts index 9ba5615fbd..6d28afff4b 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/query.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/api/query/index.ts @@ -8,7 +8,7 @@ import { QueryInt32Seconds204Response, QueryInt32SecondsArray204Response, QueryIso8601204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -19,7 +19,7 @@ import { QueryInt32SecondsOptions, QueryFloatSecondsOptions, QueryInt32SecondsArrayOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _queryDefaultSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/header/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/header/index.ts new file mode 100644 index 0000000000..30f8e74dae --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/header/index.ts @@ -0,0 +1,58 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { DurationContext } from "../../api/DurationContext.js"; +import { + headerDefault, + headerIso8601, + headerIso8601Array, + headerInt32Seconds, + headerFloatSeconds, +} from "../../api/header/index.js"; +import { + HeaderDefaultOptions, + HeaderIso8601Options, + HeaderIso8601ArrayOptions, + HeaderInt32SecondsOptions, + HeaderFloatSecondsOptions, +} from "../../models/options.js"; + +export interface HeaderOperations { + default: (duration: string, options?: HeaderDefaultOptions) => Promise; + iso8601: (duration: string, options?: HeaderIso8601Options) => Promise; + iso8601Array: ( + duration: string[], + options?: HeaderIso8601ArrayOptions + ) => Promise; + int32Seconds: ( + duration: number, + options?: HeaderInt32SecondsOptions + ) => Promise; + floatSeconds: ( + duration: number, + options?: HeaderFloatSecondsOptions + ) => Promise; +} + +export function getHeader(context: DurationContext) { + return { + default: (duration: string, options?: HeaderDefaultOptions) => + headerDefault(context, duration, options), + iso8601: (duration: string, options?: HeaderIso8601Options) => + headerIso8601(context, duration, options), + iso8601Array: (duration: string[], options?: HeaderIso8601ArrayOptions) => + headerIso8601Array(context, duration, options), + int32Seconds: (duration: number, options?: HeaderInt32SecondsOptions) => + headerInt32Seconds(context, duration, options), + floatSeconds: (duration: number, options?: HeaderFloatSecondsOptions) => + headerFloatSeconds(context, duration, options), + }; +} + +export function getHeaderOperations( + context: DurationContext +): HeaderOperations { + return { + ...getHeader(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/index.ts new file mode 100644 index 0000000000..00997e49be --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/index.ts @@ -0,0 +1,6 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { HeaderOperations } from "./header/index.js"; +export { PropertyOperations } from "./property/index.js"; +export { QueryOperations } from "./query/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/property/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/property/index.ts new file mode 100644 index 0000000000..3260bf5b45 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/property/index.ts @@ -0,0 +1,81 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { DurationContext } from "../../api/DurationContext.js"; +import { + DefaultDurationProperty, + ISO8601DurationProperty, + Int32SecondsDurationProperty, + FloatSecondsDurationProperty, + FloatSecondsDurationArrayProperty, +} from "../../models/models.js"; +import { + propertyDefault, + propertyIso8601, + propertyInt32Seconds, + propertyFloatSeconds, + propertyFloatSecondsArray, +} from "../../api/property/index.js"; +import { + PropertyDefaultOptions, + PropertyIso8601Options, + PropertyInt32SecondsOptions, + PropertyFloatSecondsOptions, + PropertyFloatSecondsArrayOptions, +} from "../../models/options.js"; + +export interface PropertyOperations { + default: ( + body: DefaultDurationProperty, + options?: PropertyDefaultOptions + ) => Promise; + iso8601: ( + body: ISO8601DurationProperty, + options?: PropertyIso8601Options + ) => Promise; + int32Seconds: ( + body: Int32SecondsDurationProperty, + options?: PropertyInt32SecondsOptions + ) => Promise; + floatSeconds: ( + body: FloatSecondsDurationProperty, + options?: PropertyFloatSecondsOptions + ) => Promise; + floatSecondsArray: ( + body: FloatSecondsDurationArrayProperty, + options?: PropertyFloatSecondsArrayOptions + ) => Promise; +} + +export function getProperty(context: DurationContext) { + return { + default: ( + body: DefaultDurationProperty, + options?: PropertyDefaultOptions + ) => propertyDefault(context, body, options), + iso8601: ( + body: ISO8601DurationProperty, + options?: PropertyIso8601Options + ) => propertyIso8601(context, body, options), + int32Seconds: ( + body: Int32SecondsDurationProperty, + options?: PropertyInt32SecondsOptions + ) => propertyInt32Seconds(context, body, options), + floatSeconds: ( + body: FloatSecondsDurationProperty, + options?: PropertyFloatSecondsOptions + ) => propertyFloatSeconds(context, body, options), + floatSecondsArray: ( + body: FloatSecondsDurationArrayProperty, + options?: PropertyFloatSecondsArrayOptions + ) => propertyFloatSecondsArray(context, body, options), + }; +} + +export function getPropertyOperations( + context: DurationContext +): PropertyOperations { + return { + ...getProperty(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/query/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/query/index.ts new file mode 100644 index 0000000000..a8ea99a586 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/classic/query/index.ts @@ -0,0 +1,58 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { DurationContext } from "../../api/DurationContext.js"; +import { + queryDefault, + queryIso8601, + queryInt32Seconds, + queryFloatSeconds, + queryInt32SecondsArray, +} from "../../api/query/index.js"; +import { + QueryDefaultOptions, + QueryIso8601Options, + QueryInt32SecondsOptions, + QueryFloatSecondsOptions, + QueryInt32SecondsArrayOptions, +} from "../../models/options.js"; + +export interface QueryOperations { + default: (input: string, options?: QueryDefaultOptions) => Promise; + iso8601: (input: string, options?: QueryIso8601Options) => Promise; + int32Seconds: ( + input: number, + options?: QueryInt32SecondsOptions + ) => Promise; + floatSeconds: ( + input: number, + options?: QueryFloatSecondsOptions + ) => Promise; + int32SecondsArray: ( + input: number[], + options?: QueryInt32SecondsArrayOptions + ) => Promise; +} + +export function getQuery(context: DurationContext) { + return { + default: (input: string, options?: QueryDefaultOptions) => + queryDefault(context, input, options), + iso8601: (input: string, options?: QueryIso8601Options) => + queryIso8601(context, input, options), + int32Seconds: (input: number, options?: QueryInt32SecondsOptions) => + queryInt32Seconds(context, input, options), + floatSeconds: (input: number, options?: QueryFloatSecondsOptions) => + queryFloatSeconds(context, input, options), + int32SecondsArray: ( + input: number[], + options?: QueryInt32SecondsArrayOptions + ) => queryInt32SecondsArray(context, input, options), + }; +} + +export function getQueryOperations(context: DurationContext): QueryOperations { + return { + ...getQuery(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/index.ts b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/index.ts index 58be9b1f92..692ef7d59a 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/src/index.ts @@ -24,3 +24,8 @@ export { HeaderInt32SecondsOptions, HeaderFloatSecondsOptions, } from "./models/index.js"; +export { + HeaderOperations, + PropertyOperations, + QueryOperations, +} from "./classic/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/tspconfig.yaml index 36b5a41544..a02bfc6f96 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/encode/duration/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/encode/duration/tspconfig.yaml @@ -10,5 +10,6 @@ options: isTypeSpecTest: true enableOperationGroup: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/encode-duration" diff --git a/packages/typespec-ts/test/modularIntegration/generated/headers/client-request-id/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/headers/client-request-id/tspconfig.yaml index 5b9605129b..f5470b415a 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/headers/client-request-id/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/headers/client-request-id/tspconfig.yaml @@ -6,6 +6,7 @@ options: generateTest: false azureSdkForJs: false isModularLibrary: true + hierarchyClient: false "emitter-output-dir": "{project-root}" packageDetails: name: "@msinternal/modular-model-usage" diff --git a/packages/typespec-ts/test/modularIntegration/generated/models/usage/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/models/usage/tspconfig.yaml index 3813d6f15e..c594bcc7b8 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/models/usage/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/models/usage/tspconfig.yaml @@ -6,6 +6,7 @@ options: generateTest: false azureSdkForJs: false isModularLibrary: true + hierarchyClient: false "emitter-output-dir": "{project-root}/generated" packageDetails: name: "@msinternal/modular-model-usage" diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/CollectionFormatClient.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/CollectionFormatClient.ts index 3bd4658aa2..2683b122d2 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/CollectionFormatClient.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/CollectionFormatClient.ts @@ -2,25 +2,16 @@ // Licensed under the MIT license. import { Pipeline } from "@azure/core-rest-pipeline"; +import { getQueryOperations, QueryOperations } from "./classic/query/index.js"; +import { + getHeaderOperations, + HeaderOperations, +} from "./classic/header/index.js"; import { createCollectionFormat, CollectionFormatClientOptions, CollectionFormatContext, - headerCsv, - queryMulti, - querySsv, - queryTsv, - queryPipes, - queryCsv, } from "./api/index.js"; -import { - QueryMultiOptions, - QuerySsvOptions, - QueryTsvOptions, - QueryPipesOptions, - QueryCsvOptions, - HeaderCsvOptions, -} from "./models/options.js"; export { CollectionFormatClientOptions } from "./api/CollectionFormatContext.js"; @@ -33,28 +24,12 @@ export class CollectionFormatClient { constructor(options: CollectionFormatClientOptions = {}) { this._client = createCollectionFormat(options); this.pipeline = this._client.pipeline; + this.query = getQueryOperations(this._client); + this.header = getHeaderOperations(this._client); } - query = { - multi: (colors: string[], options?: QueryMultiOptions): Promise => { - return queryMulti(this._client, colors, options); - }, - ssv: (colors: string[], options?: QuerySsvOptions): Promise => { - return querySsv(this._client, colors, options); - }, - tsv: (colors: string[], options?: QueryTsvOptions): Promise => { - return queryTsv(this._client, colors, options); - }, - pipes: (colors: string[], options?: QueryPipesOptions): Promise => { - return queryPipes(this._client, colors, options); - }, - csv: (colors: string[], options?: QueryCsvOptions): Promise => { - return queryCsv(this._client, colors, options); - }, - }; - header = { - csv: (colors: string[], options?: HeaderCsvOptions): Promise => { - return headerCsv(this._client, colors, options); - }, - }; + /** The operation groups for Query */ + public readonly query: QueryOperations; + /** The operation groups for Header */ + public readonly header: HeaderOperations; } diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/header.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/header/index.ts similarity index 92% rename from packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/header.ts rename to packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/header/index.ts index 82d2b7daf5..df903bae97 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/header.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/header/index.ts @@ -5,12 +5,12 @@ import { buildCsvCollection, CollectionFormatContext as Client, HeaderCsv204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, } from "@azure-rest/core-client"; -import { HeaderCsvOptions } from "../models/options.js"; +import { HeaderCsvOptions } from "../../models/options.js"; export function _headerCsvSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/index.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/index.ts index b29a292c01..adb430f41f 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/index.ts @@ -6,11 +6,11 @@ export { CollectionFormatClientOptions, CollectionFormatContext, } from "./CollectionFormatContext.js"; -export { headerCsv } from "./header.js"; +export { headerCsv } from "./header/index.js"; export { queryMulti, querySsv, queryTsv, queryPipes, queryCsv, -} from "./query.js"; +} from "./query/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/query.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/query/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/query.ts rename to packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/query/index.ts index 6cb204b48f..f75227d649 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/query.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/api/query/index.ts @@ -12,7 +12,7 @@ import { QueryPipes204Response, QuerySsv204Response, QueryTsv204Response, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -23,7 +23,7 @@ import { QueryTsvOptions, QueryPipesOptions, QueryCsvOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _queryMultiSend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/header/index.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/header/index.ts new file mode 100644 index 0000000000..922d35ffc1 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/header/index.ts @@ -0,0 +1,25 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { CollectionFormatContext } from "../../api/CollectionFormatContext.js"; +import { headerCsv } from "../../api/header/index.js"; +import { HeaderCsvOptions } from "../../models/options.js"; + +export interface HeaderOperations { + csv: (colors: string[], options?: HeaderCsvOptions) => Promise; +} + +export function getHeader(context: CollectionFormatContext) { + return { + csv: (colors: string[], options?: HeaderCsvOptions) => + headerCsv(context, colors, options), + }; +} + +export function getHeaderOperations( + context: CollectionFormatContext +): HeaderOperations { + return { + ...getHeader(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/index.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/index.ts new file mode 100644 index 0000000000..048cfcc807 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { HeaderOperations } from "./header/index.js"; +export { QueryOperations } from "./query/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/query/index.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/query/index.ts new file mode 100644 index 0000000000..b6b765c360 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/classic/query/index.ts @@ -0,0 +1,49 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { CollectionFormatContext } from "../../api/CollectionFormatContext.js"; +import { + queryMulti, + querySsv, + queryTsv, + queryPipes, + queryCsv, +} from "../../api/query/index.js"; +import { + QueryMultiOptions, + QuerySsvOptions, + QueryTsvOptions, + QueryPipesOptions, + QueryCsvOptions, +} from "../../models/options.js"; + +export interface QueryOperations { + multi: (colors: string[], options?: QueryMultiOptions) => Promise; + ssv: (colors: string[], options?: QuerySsvOptions) => Promise; + tsv: (colors: string[], options?: QueryTsvOptions) => Promise; + pipes: (colors: string[], options?: QueryPipesOptions) => Promise; + csv: (colors: string[], options?: QueryCsvOptions) => Promise; +} + +export function getQuery(context: CollectionFormatContext) { + return { + multi: (colors: string[], options?: QueryMultiOptions) => + queryMulti(context, colors, options), + ssv: (colors: string[], options?: QuerySsvOptions) => + querySsv(context, colors, options), + tsv: (colors: string[], options?: QueryTsvOptions) => + queryTsv(context, colors, options), + pipes: (colors: string[], options?: QueryPipesOptions) => + queryPipes(context, colors, options), + csv: (colors: string[], options?: QueryCsvOptions) => + queryCsv(context, colors, options), + }; +} + +export function getQueryOperations( + context: CollectionFormatContext +): QueryOperations { + return { + ...getQuery(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/index.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/index.ts index e3df41ce12..e951c92d7b 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/src/index.ts @@ -13,3 +13,4 @@ export { QueryCsvOptions, HeaderCsvOptions, } from "./models/index.js"; +export { HeaderOperations, QueryOperations } from "./classic/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/tspconfig.yaml index c9c2bcb4ef..7339906e9c 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/collection-format/tspconfig.yaml @@ -9,6 +9,7 @@ options: azureSdkForJs: false isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/azure-collection-format" description: "Azure Collection Format Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/SpreadClient.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/SpreadClient.ts index 3337fb82e2..7080297717 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/SpreadClient.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/SpreadClient.ts @@ -2,18 +2,9 @@ // Licensed under the MIT license. import { Pipeline } from "@azure/core-rest-pipeline"; -import { BodyParameter } from "./models/models.js"; +import { getModelOperations, ModelOperations } from "./classic/model/index.js"; +import { getAliasOperations, AliasOperations } from "./classic/alias/index.js"; import { - ModelSpreadAsRequestBodyOptions, - AliasSpreadAsRequestBodyOptions, - AliasSpreadAsRequestParameterOptions, - AliasSpreadWithMultipleParametersOptions, -} from "./models/options.js"; -import { - aliasSpreadAsRequestBody, - aliasSpreadAsRequestParameter, - aliasSpreadWithMultipleParameters, - modelSpreadAsRequestBody, createSpread, SpreadClientOptions, SpreadContext, @@ -30,60 +21,12 @@ export class SpreadClient { constructor(options: SpreadClientOptions = {}) { this._client = createSpread(options); this.pipeline = this._client.pipeline; + this.model = getModelOperations(this._client); + this.alias = getAliasOperations(this._client); } - model = { - spreadAsRequestBody: ( - body: BodyParameter, - options?: ModelSpreadAsRequestBodyOptions - ): Promise => { - return modelSpreadAsRequestBody(this._client, body, options); - }, - }; - alias = { - spreadAsRequestBody: ( - name: string, - options?: AliasSpreadAsRequestBodyOptions - ): Promise => { - return aliasSpreadAsRequestBody(this._client, name, options); - }, - spreadAsRequestParameter: ( - id: string, - xMsTestHeader: string, - name: string, - options?: AliasSpreadAsRequestParameterOptions - ): Promise => { - return aliasSpreadAsRequestParameter( - this._client, - id, - xMsTestHeader, - name, - options - ); - }, - spreadWithMultipleParameters: ( - id: string, - xMsTestHeader: string, - prop1: string, - prop2: string, - prop3: string, - prop4: string, - prop5: string, - prop6: string, - options?: AliasSpreadWithMultipleParametersOptions - ): Promise => { - return aliasSpreadWithMultipleParameters( - this._client, - id, - xMsTestHeader, - prop1, - prop2, - prop3, - prop4, - prop5, - prop6, - options - ); - }, - }; + /** The operation groups for Model */ + public readonly model: ModelOperations; + /** The operation groups for Alias */ + public readonly alias: AliasOperations; } diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/alias.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/alias/index.ts similarity index 98% rename from packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/alias.ts rename to packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/alias/index.ts index 60b8fb260a..f019d6ffbb 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/alias.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/alias/index.ts @@ -6,7 +6,7 @@ import { AliasSpreadAsRequestParameter204Response, AliasSpreadWithMultipleParameters204Response, SpreadContext as Client, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, @@ -15,7 +15,7 @@ import { AliasSpreadAsRequestBodyOptions, AliasSpreadAsRequestParameterOptions, AliasSpreadWithMultipleParametersOptions, -} from "../models/options.js"; +} from "../../models/options.js"; export function _aliasSpreadAsRequestBodySend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/index.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/index.ts index b187b64736..1f45690b7f 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/index.ts @@ -1,14 +1,14 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -export { - aliasSpreadAsRequestBody, - aliasSpreadAsRequestParameter, - aliasSpreadWithMultipleParameters, -} from "./alias.js"; -export { modelSpreadAsRequestBody } from "./model.js"; export { createSpread, SpreadClientOptions, SpreadContext, } from "./SpreadContext.js"; +export { + aliasSpreadAsRequestBody, + aliasSpreadAsRequestParameter, + aliasSpreadWithMultipleParameters, +} from "./alias/index.js"; +export { modelSpreadAsRequestBody } from "./model/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/model.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/model/index.ts similarity index 87% rename from packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/model.ts rename to packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/model/index.ts index 1a993308ab..52f0899295 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/model.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/api/model/index.ts @@ -1,16 +1,16 @@ // Copyright (c) Microsoft Corporation. // Licensed under the MIT license. -import { BodyParameter } from "../models/models.js"; +import { BodyParameter } from "../../models/models.js"; import { ModelSpreadAsRequestBody204Response, SpreadContext as Client, -} from "../rest/index.js"; +} from "../../rest/index.js"; import { StreamableMethod, operationOptionsToRequestParameters, } from "@azure-rest/core-client"; -import { ModelSpreadAsRequestBodyOptions } from "../models/options.js"; +import { ModelSpreadAsRequestBodyOptions } from "../../models/options.js"; export function _modelSpreadAsRequestBodySend( context: Client, diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/alias/index.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/alias/index.ts new file mode 100644 index 0000000000..b3e854c433 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/alias/index.ts @@ -0,0 +1,83 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { SpreadContext } from "../../api/SpreadContext.js"; +import { + aliasSpreadAsRequestBody, + aliasSpreadAsRequestParameter, + aliasSpreadWithMultipleParameters, +} from "../../api/alias/index.js"; +import { + AliasSpreadAsRequestBodyOptions, + AliasSpreadAsRequestParameterOptions, + AliasSpreadWithMultipleParametersOptions, +} from "../../models/options.js"; + +export interface AliasOperations { + spreadAsRequestBody: ( + name: string, + options?: AliasSpreadAsRequestBodyOptions + ) => Promise; + spreadAsRequestParameter: ( + id: string, + xMsTestHeader: string, + name: string, + options?: AliasSpreadAsRequestParameterOptions + ) => Promise; + spreadWithMultipleParameters: ( + id: string, + xMsTestHeader: string, + prop1: string, + prop2: string, + prop3: string, + prop4: string, + prop5: string, + prop6: string, + options?: AliasSpreadWithMultipleParametersOptions + ) => Promise; +} + +export function getAlias(context: SpreadContext) { + return { + spreadAsRequestBody: ( + name: string, + options?: AliasSpreadAsRequestBodyOptions + ) => aliasSpreadAsRequestBody(context, name, options), + spreadAsRequestParameter: ( + id: string, + xMsTestHeader: string, + name: string, + options?: AliasSpreadAsRequestParameterOptions + ) => + aliasSpreadAsRequestParameter(context, id, xMsTestHeader, name, options), + spreadWithMultipleParameters: ( + id: string, + xMsTestHeader: string, + prop1: string, + prop2: string, + prop3: string, + prop4: string, + prop5: string, + prop6: string, + options?: AliasSpreadWithMultipleParametersOptions + ) => + aliasSpreadWithMultipleParameters( + context, + id, + xMsTestHeader, + prop1, + prop2, + prop3, + prop4, + prop5, + prop6, + options + ), + }; +} + +export function getAliasOperations(context: SpreadContext): AliasOperations { + return { + ...getAlias(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/index.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/index.ts new file mode 100644 index 0000000000..1eb0a5ef59 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/index.ts @@ -0,0 +1,5 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +export { AliasOperations } from "./alias/index.js"; +export { ModelOperations } from "./model/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/model/index.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/model/index.ts new file mode 100644 index 0000000000..81f79850a8 --- /dev/null +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/classic/model/index.ts @@ -0,0 +1,29 @@ +// Copyright (c) Microsoft Corporation. +// Licensed under the MIT license. + +import { SpreadContext } from "../../api/SpreadContext.js"; +import { BodyParameter } from "../../models/models.js"; +import { modelSpreadAsRequestBody } from "../../api/model/index.js"; +import { ModelSpreadAsRequestBodyOptions } from "../../models/options.js"; + +export interface ModelOperations { + spreadAsRequestBody: ( + body: BodyParameter, + options?: ModelSpreadAsRequestBodyOptions + ) => Promise; +} + +export function getModel(context: SpreadContext) { + return { + spreadAsRequestBody: ( + body: BodyParameter, + options?: ModelSpreadAsRequestBodyOptions + ) => modelSpreadAsRequestBody(context, body, options), + }; +} + +export function getModelOperations(context: SpreadContext): ModelOperations { + return { + ...getModel(context), + }; +} diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/index.ts b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/index.ts index ba4af27542..7f67cb7c61 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/index.ts +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/src/index.ts @@ -9,3 +9,4 @@ export { AliasSpreadAsRequestParameterOptions, AliasSpreadWithMultipleParametersOptions, } from "./models/index.js"; +export { AliasOperations, ModelOperations } from "./classic/index.js"; diff --git a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/tspconfig.yaml index 8befb673ed..8aa54e1815 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/parameters/spread/tspconfig.yaml @@ -10,5 +10,6 @@ options: enableOperationGroup: true isTypeSpecTest: true isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/parameterSpread" diff --git a/packages/typespec-ts/test/modularIntegration/generated/server/path/multiple/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/server/path/multiple/tspconfig.yaml index f5bf9b2f5f..c21980cfc5 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/server/path/multiple/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/server/path/multiple/tspconfig.yaml @@ -10,6 +10,7 @@ options: isTypeSpecTest: true title: MultipleParamInServerPathClient isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/multipleparam" description: "MultipleParameter Test Service" diff --git a/packages/typespec-ts/test/modularIntegration/generated/server/path/single/tspconfig.yaml b/packages/typespec-ts/test/modularIntegration/generated/server/path/single/tspconfig.yaml index 272b2a511e..bd08d2f249 100644 --- a/packages/typespec-ts/test/modularIntegration/generated/server/path/single/tspconfig.yaml +++ b/packages/typespec-ts/test/modularIntegration/generated/server/path/single/tspconfig.yaml @@ -10,6 +10,7 @@ options: isTypeSpecTest: true title: SingleParamInServerPathClient isModularLibrary: true + hierarchyClient: false packageDetails: name: "@msinternal/singleparam" description: "SingleParameter Test Service"