@azure-tools/typespec-ts 0.11.0 → 0.12.0-alpha.20230501.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.rush/temp/package-deps_build.json +265 -152
- package/.rush/temp/shrinkwrap-deps.json +58 -54
- package/CHANGELOG.md +4 -0
- package/CONTRIBUTING.md +5 -2
- package/README.md +3 -3
- package/dist/src/casingUtils.d.ts +4 -0
- package/dist/src/casingUtils.d.ts.map +1 -0
- package/dist/src/casingUtils.js +39 -0
- package/dist/src/casingUtils.js.map +1 -0
- package/dist/src/emitUtil.js +7 -1
- package/dist/src/emitUtil.js.map +1 -1
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +41 -9
- package/dist/src/index.js.map +1 -1
- package/dist/src/lib.d.ts.map +1 -1
- package/dist/src/lib.js +2 -1
- package/dist/src/lib.js.map +1 -1
- package/dist/src/modelUtils.d.ts +22 -1
- package/dist/src/modelUtils.d.ts.map +1 -1
- package/dist/src/modelUtils.js +105 -13
- package/dist/src/modelUtils.js.map +1 -1
- package/dist/src/modular/buildApiIndex.d.ts +3 -0
- package/dist/src/modular/buildApiIndex.d.ts.map +1 -0
- package/dist/src/modular/buildApiIndex.js +12 -0
- package/dist/src/modular/buildApiIndex.js.map +1 -0
- package/dist/src/modular/buildClassicalClient.d.ts +4 -0
- package/dist/src/modular/buildClassicalClient.d.ts.map +1 -0
- package/dist/src/modular/buildClassicalClient.js +112 -0
- package/dist/src/modular/buildClassicalClient.js.map +1 -0
- package/dist/src/modular/buildClientContext.d.ts +7 -0
- package/dist/src/modular/buildClientContext.d.ts.map +1 -0
- package/dist/src/modular/buildClientContext.js +72 -0
- package/dist/src/modular/buildClientContext.js.map +1 -0
- package/dist/src/modular/buildCodeModel.d.ts +14 -0
- package/dist/src/modular/buildCodeModel.d.ts.map +1 -0
- package/dist/src/modular/buildCodeModel.js +1110 -0
- package/dist/src/modular/buildCodeModel.js.map +1 -0
- package/dist/src/modular/buildOperations.d.ts +13 -0
- package/dist/src/modular/buildOperations.d.ts.map +1 -0
- package/dist/src/modular/buildOperations.js +70 -0
- package/dist/src/modular/buildOperations.js.map +1 -0
- package/dist/src/modular/buildProjectFiles.d.ts +5 -0
- package/dist/src/modular/buildProjectFiles.d.ts.map +1 -0
- package/dist/src/modular/buildProjectFiles.js +182 -0
- package/dist/src/modular/buildProjectFiles.js.map +1 -0
- package/dist/src/modular/buildRootIndex.d.ts +4 -0
- package/dist/src/modular/buildRootIndex.d.ts.map +1 -0
- package/dist/src/modular/buildRootIndex.js +66 -0
- package/dist/src/modular/buildRootIndex.js.map +1 -0
- package/dist/src/modular/buildSharedTypes.d.ts +6 -0
- package/dist/src/modular/buildSharedTypes.d.ts.map +1 -0
- package/dist/src/modular/buildSharedTypes.js +33 -0
- package/dist/src/modular/buildSharedTypes.js.map +1 -0
- package/dist/src/modular/emitModels.d.ts +7 -0
- package/dist/src/modular/emitModels.d.ts.map +1 -0
- package/dist/src/modular/emitModels.js +63 -0
- package/dist/src/modular/emitModels.js.map +1 -0
- package/dist/src/modular/helpers/clientHelpers.d.ts +4 -0
- package/dist/src/modular/helpers/clientHelpers.d.ts.map +1 -0
- package/dist/src/modular/helpers/clientHelpers.js +31 -0
- package/dist/src/modular/helpers/clientHelpers.js.map +1 -0
- package/dist/src/modular/helpers/credentialHelpers.d.ts +7 -0
- package/dist/src/modular/helpers/credentialHelpers.d.ts.map +1 -0
- package/dist/src/modular/helpers/credentialHelpers.js +32 -0
- package/dist/src/modular/helpers/credentialHelpers.js.map +1 -0
- package/dist/src/modular/helpers/namingHelpers.d.ts +3 -0
- package/dist/src/modular/helpers/namingHelpers.d.ts.map +1 -0
- package/dist/src/modular/helpers/namingHelpers.js +4 -0
- package/dist/src/modular/helpers/namingHelpers.js.map +1 -0
- package/dist/src/modular/helpers/operationHelpers.d.ts +8 -0
- package/dist/src/modular/helpers/operationHelpers.d.ts.map +1 -0
- package/dist/src/modular/helpers/operationHelpers.js +274 -0
- package/dist/src/modular/helpers/operationHelpers.js.map +1 -0
- package/dist/src/modular/helpers/parameterHelpers.d.ts +3 -0
- package/dist/src/modular/helpers/parameterHelpers.d.ts.map +1 -0
- package/dist/src/modular/helpers/parameterHelpers.js +16 -0
- package/dist/src/modular/helpers/parameterHelpers.js.map +1 -0
- package/dist/src/modular/helpers/typeHelpers.d.ts +16 -0
- package/dist/src/modular/helpers/typeHelpers.d.ts.map +1 -0
- package/dist/src/modular/helpers/typeHelpers.js +92 -0
- package/dist/src/modular/helpers/typeHelpers.js.map +1 -0
- package/dist/src/modular/interfaces.d.ts +10 -0
- package/dist/src/modular/interfaces.d.ts.map +1 -0
- package/dist/src/modular/interfaces.js +2 -0
- package/dist/src/modular/interfaces.js.map +1 -0
- package/dist/src/modular/modularCodeModel.d.ts +121 -0
- package/dist/src/modular/modularCodeModel.d.ts.map +1 -0
- package/dist/src/modular/modularCodeModel.js +2 -0
- package/dist/src/modular/modularCodeModel.js.map +1 -0
- package/dist/src/operationUtil.d.ts +30 -4
- package/dist/src/operationUtil.d.ts.map +1 -1
- package/dist/src/operationUtil.js +77 -18
- package/dist/src/operationUtil.js.map +1 -1
- package/dist/src/transform/transform.d.ts +4 -6
- package/dist/src/transform/transform.d.ts.map +1 -1
- package/dist/src/transform/transform.js +17 -58
- package/dist/src/transform/transform.js.map +1 -1
- package/dist/src/transform/transformApiVersionInfo.d.ts +5 -0
- package/dist/src/transform/transformApiVersionInfo.d.ts.map +1 -0
- package/dist/src/transform/transformApiVersionInfo.js +64 -0
- package/dist/src/transform/transformApiVersionInfo.js.map +1 -0
- package/dist/src/transform/transformHelperFunctionDetails.d.ts +6 -0
- package/dist/src/transform/transformHelperFunctionDetails.d.ts.map +1 -0
- package/dist/src/transform/{transformAnnotationDetails.js → transformHelperFunctionDetails.js} +2 -2
- package/dist/src/transform/transformHelperFunctionDetails.js.map +1 -0
- package/dist/src/transform/transformParameters.d.ts +2 -2
- package/dist/src/transform/transformParameters.d.ts.map +1 -1
- package/dist/src/transform/transformParameters.js +20 -7
- package/dist/src/transform/transformParameters.js.map +1 -1
- package/dist/src/transform/transformPaths.d.ts +2 -2
- package/dist/src/transform/transformPaths.d.ts.map +1 -1
- package/dist/src/transform/transformPaths.js +15 -7
- package/dist/src/transform/transformPaths.js.map +1 -1
- package/dist/src/transform/transformResponses.d.ts +2 -2
- package/dist/src/transform/transformResponses.d.ts.map +1 -1
- package/dist/src/transform/transformResponses.js +23 -2
- package/dist/src/transform/transformResponses.js.map +1 -1
- package/dist/src/transform/transformSchemas.d.ts +2 -2
- package/dist/src/transform/transformSchemas.d.ts.map +1 -1
- package/dist/src/transform/transformSchemas.js +10 -22
- package/dist/src/transform/transformSchemas.js.map +1 -1
- package/dist/src/transform/transfromRLCOptions.d.ts +2 -2
- package/dist/src/transform/transfromRLCOptions.js +1 -1
- package/dist/src/transform/transfromRLCOptions.js.map +1 -1
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +27 -19
- package/src/casingUtils.ts +48 -0
- package/src/emitUtil.ts +9 -4
- package/src/index.ts +53 -10
- package/src/lib.ts +2 -1
- package/src/modelUtils.ts +137 -14
- package/src/modular/buildApiIndex.ts +13 -0
- package/src/modular/buildClassicalClient.ts +147 -0
- package/src/modular/buildClientContext.ts +104 -0
- package/src/modular/buildCodeModel.ts +1449 -0
- package/src/modular/buildOperations.ts +95 -0
- package/src/modular/buildProjectFiles.ts +219 -0
- package/src/modular/buildRootIndex.ts +94 -0
- package/src/modular/buildSharedTypes.ts +40 -0
- package/src/modular/emitModels.ts +72 -0
- package/src/modular/helpers/clientHelpers.ts +38 -0
- package/src/modular/helpers/credentialHelpers.ts +40 -0
- package/src/modular/helpers/namingHelpers.ts +5 -0
- package/src/modular/helpers/operationHelpers.ts +418 -0
- package/src/modular/helpers/parameterHelpers.ts +17 -0
- package/src/modular/helpers/typeHelpers.ts +106 -0
- package/src/modular/interfaces.ts +10 -0
- package/src/modular/modularCodeModel.ts +151 -0
- package/src/modular/static/karma.conf.cjs +120 -0
- package/src/modular/static/rollup.test.config.js +67 -0
- package/src/modular/static/scripts/renameOutput.mjs +17 -0
- package/src/operationUtil.ts +119 -31
- package/src/transform/transform.ts +33 -96
- package/src/transform/transformApiVersionInfo.ts +108 -0
- package/src/transform/{transformAnnotationDetails.ts → transformHelperFunctionDetails.ts} +11 -11
- package/src/transform/transformParameters.ts +30 -14
- package/src/transform/transformPaths.ts +29 -19
- package/src/transform/transformResponses.ts +50 -8
- package/src/transform/transformSchemas.ts +20 -28
- package/src/transform/transfromRLCOptions.ts +3 -3
- package/test/commands/cadl-ranch-list.ts +53 -20
- package/test/commands/gen-cadl-ranch.ts +6 -2
- package/test/commands/run.ts +3 -13
- package/test/integration/arrayItemTypes.spec.ts +6 -3
- package/test/integration/azurecore.spec.ts +130 -0
- package/test/integration/collectionFormat.spec.ts +118 -0
- package/test/integration/dictionary.spec.ts +6 -2
- package/test/integration/extensibleEnums.spec.ts +8 -8
- package/test/integration/fixedEnums.spec.ts +7 -7
- package/test/integration/generated/arrays/itemTypes/src/clientDefinitions.ts +33 -18
- package/test/integration/generated/arrays/itemTypes/src/parameters.ts +8 -0
- package/test/integration/generated/arrays/itemTypes/src/responses.ts +11 -0
- package/test/integration/generated/arrays/itemTypes/tspconfig.yaml +5 -2
- package/test/integration/generated/authentication/apiKey/package.json +2 -2
- package/test/integration/generated/authentication/apiKey/tspconfig.yaml +5 -2
- package/test/integration/generated/authentication/oauth2/tspconfig.yaml +5 -2
- package/test/integration/generated/authentication/union/tspconfig.yaml +5 -2
- package/test/integration/generated/{resiliency/devDriven → azure/core}/README.md +7 -7
- package/test/integration/generated/{lro/lroBasic → azure/core}/api-extractor.json +1 -1
- package/test/integration/generated/{resiliency/devDriven → azure/core}/package.json +6 -6
- package/test/integration/generated/azure/core/src/azureCoreClient.ts +31 -0
- package/test/integration/generated/azure/core/src/clientDefinitions.ts +108 -0
- package/test/integration/generated/{resiliency/devDriven → azure/core}/src/index.ts +4 -3
- package/test/integration/generated/azure/core/src/isUnexpected.ts +178 -0
- package/test/integration/generated/azure/core/src/models.ts +18 -0
- package/test/integration/generated/azure/core/src/outputModels.ts +32 -0
- package/test/integration/generated/{resiliency/devDriven → azure/core}/src/paginateHelper.ts +55 -5
- package/test/integration/generated/azure/core/src/parameters.ts +68 -0
- package/test/integration/generated/azure/core/src/responses.ts +158 -0
- package/test/integration/generated/azure/core/src/serializeHelper.ts +16 -0
- package/test/integration/generated/azure/core/tspconfig.yaml +15 -0
- package/test/integration/generated/azure/core-traits/README.md +56 -0
- package/test/integration/generated/azure/core-traits/api-extractor.json +18 -0
- package/test/integration/generated/azure/core-traits/package.json +80 -0
- package/test/integration/generated/azure/core-traits/src/azureCoreTraitsClient.ts +31 -0
- package/test/integration/generated/azure/core-traits/src/clientDefinitions.ts +22 -0
- package/test/integration/generated/azure/core-traits/src/index.ts +13 -0
- package/test/integration/generated/{resiliency/devDriven → azure/core-traits}/src/isUnexpected.ts +6 -26
- package/test/integration/generated/azure/core-traits/src/outputModels.ts +10 -0
- package/test/integration/generated/azure/core-traits/src/parameters.ts +26 -0
- package/test/integration/generated/azure/core-traits/src/responses.ts +32 -0
- package/test/integration/generated/azure/core-traits/tspconfig.yaml +15 -0
- package/test/integration/generated/dictionary/package.json +2 -2
- package/test/integration/generated/dictionary/src/clientDefinitions.ts +35 -20
- package/test/integration/generated/dictionary/src/parameters.ts +8 -0
- package/test/integration/generated/dictionary/src/responses.ts +11 -0
- package/test/integration/generated/dictionary/tspconfig.yaml +5 -2
- package/test/integration/generated/enums/extensible/README.md +3 -3
- package/test/integration/generated/enums/extensible/package.json +2 -2
- package/test/integration/generated/enums/extensible/src/clientDefinitions.ts +5 -5
- package/test/integration/generated/enums/extensible/src/index.ts +3 -3
- package/test/integration/generated/enums/extensible/src/{enumsExtensible.ts → typeEnumExtensible.ts} +4 -4
- package/test/integration/generated/enums/extensible/tspconfig.yaml +5 -2
- package/test/integration/generated/enums/fixed/README.md +3 -3
- package/test/integration/generated/enums/fixed/package.json +2 -2
- package/test/integration/generated/enums/fixed/src/clientDefinitions.ts +5 -5
- package/test/integration/generated/enums/fixed/src/index.ts +3 -3
- package/test/integration/generated/enums/fixed/src/{enumsFixed.ts → typeEnumFixed.ts} +4 -4
- package/test/integration/generated/enums/fixed/tspconfig.yaml +5 -2
- package/test/integration/generated/hello/package.json +2 -2
- package/test/integration/generated/hello/tspconfig.yaml +5 -2
- package/test/integration/generated/internal/src/clientDefinitions.ts +27 -0
- package/test/integration/generated/internal/src/index.ts +13 -0
- package/test/integration/generated/{lro/lroBasic/src/azureLro.ts → internal/src/internalClient.ts} +5 -5
- package/test/integration/generated/internal/src/models.ts +8 -0
- package/test/integration/generated/internal/src/outputModels.ts +13 -0
- package/test/integration/generated/internal/src/parameters.ts +21 -0
- package/test/integration/generated/internal/src/responses.ts +20 -0
- package/test/integration/generated/internal/tspconfig.yaml +14 -0
- package/test/integration/generated/lro/lroCore/.eslintrc.json +11 -0
- package/test/integration/generated/lro/lroCore/README.md +56 -0
- package/test/integration/generated/{resiliency/devDriven → lro/lroCore}/api-extractor.json +1 -1
- package/test/integration/generated/lro/{lroBasic → lroCore}/package.json +6 -6
- package/test/integration/generated/lro/lroCore/rollup.config.js +118 -0
- package/test/integration/generated/lro/lroCore/src/clientDefinitions.ts +54 -0
- package/test/integration/generated/lro/lroCore/src/index.ts +15 -0
- package/test/integration/generated/lro/lroCore/src/isUnexpected.ts +135 -0
- package/test/integration/generated/lro/lroCore/src/models.ts +8 -0
- package/test/integration/generated/lro/lroCore/src/outputModels.ts +50 -0
- package/test/integration/generated/lro/lroCore/src/parameters.ts +25 -0
- package/test/integration/generated/lro/{lroBasic → lroCore}/src/pollingHelper.ts +38 -0
- package/test/integration/generated/lro/lroCore/src/responses.ts +109 -0
- package/test/integration/generated/lro/lroCore/src/specsAzureCoreLroStandard.ts +31 -0
- package/test/integration/generated/lro/lroCore/tsconfig.json +25 -0
- package/test/integration/generated/lro/lroCore/tspconfig.yaml +14 -0
- package/test/integration/generated/lro/lroRPC/.eslintrc.json +11 -0
- package/test/integration/generated/lro/{lroBasic → lroRPC}/README.md +7 -7
- package/test/integration/generated/lro/lroRPC/api-extractor.json +18 -0
- package/test/integration/generated/lro/lroRPC/package.json +82 -0
- package/test/integration/generated/lro/lroRPC/rollup.config.js +118 -0
- package/test/integration/generated/lro/lroRPC/src/clientDefinitions.ts +79 -0
- package/test/integration/generated/lro/lroRPC/src/index.ts +15 -0
- package/test/integration/generated/lro/lroRPC/src/isUnexpected.ts +153 -0
- package/test/integration/generated/lro/lroRPC/src/models.ts +8 -0
- package/test/integration/generated/lro/lroRPC/src/outputModels.ts +40 -0
- package/test/integration/generated/lro/lroRPC/src/parameters.ts +20 -0
- package/test/integration/generated/lro/lroRPC/src/pollingHelper.ts +127 -0
- package/test/integration/generated/lro/lroRPC/src/responses.ts +124 -0
- package/test/integration/generated/lro/lroRPC/src/specsAzureCoreLroRpc.ts +31 -0
- package/test/integration/generated/lro/lroRPC/tsconfig.json +25 -0
- package/test/integration/generated/lro/lroRPC/tspconfig.yaml +14 -0
- package/test/integration/generated/models/inheritance/README.md +3 -3
- package/test/integration/generated/models/inheritance/package.json +2 -2
- package/test/integration/generated/models/inheritance/src/clientDefinitions.ts +13 -11
- package/test/integration/generated/models/inheritance/src/index.ts +3 -3
- package/test/integration/generated/models/inheritance/src/{modelsInheritance.ts → typeModelInheritance.ts} +4 -4
- package/test/integration/generated/models/inheritance/tspconfig.yaml +5 -2
- package/test/integration/generated/models/propertyNullable/.eslintrc.json +11 -0
- package/test/integration/generated/models/propertyNullable/README.md +56 -0
- package/test/integration/generated/models/propertyNullable/api-extractor.json +18 -0
- package/test/integration/generated/models/propertyNullable/package.json +80 -0
- package/test/integration/generated/models/propertyNullable/rollup.config.js +118 -0
- package/test/integration/generated/models/propertyNullable/src/clientDefinitions.ts +227 -0
- package/test/integration/generated/models/propertyNullable/src/index.ts +13 -0
- package/test/integration/generated/models/propertyNullable/src/models.ts +56 -0
- package/test/integration/generated/models/propertyNullable/src/outputModels.ts +56 -0
- package/test/integration/generated/models/propertyNullable/src/parameters.ts +197 -0
- package/test/integration/generated/models/propertyNullable/src/responses.ts +144 -0
- package/test/integration/generated/{resiliency/devDriven/src/resiliencyDevDriven.ts → models/propertyNullable/src/typePropertyNullable.ts} +5 -5
- package/test/integration/generated/models/propertyNullable/tsconfig.json +25 -0
- package/test/integration/generated/models/propertyNullable/tspconfig.yaml +14 -0
- package/test/integration/generated/models/propertyOptional/README.md +3 -3
- package/test/integration/generated/models/propertyOptional/package.json +2 -2
- package/test/integration/generated/models/propertyOptional/src/clientDefinitions.ts +47 -47
- package/test/integration/generated/models/propertyOptional/src/index.ts +3 -3
- package/test/integration/generated/models/propertyOptional/src/parameters.ts +7 -6
- package/test/integration/generated/models/propertyOptional/src/responses.ts +4 -4
- package/test/integration/generated/models/propertyOptional/src/{modelsPropertyOptional.ts → typePropertyOptional.ts} +4 -4
- package/test/integration/generated/models/propertyOptional/tspconfig.yaml +5 -2
- package/test/integration/generated/models/propertyTypes/README.md +3 -3
- package/test/integration/generated/models/propertyTypes/package.json +2 -2
- package/test/integration/generated/models/propertyTypes/src/clientDefinitions.ts +55 -47
- package/test/integration/generated/models/propertyTypes/src/index.ts +3 -3
- package/test/integration/generated/models/propertyTypes/src/parameters.ts +8 -6
- package/test/integration/generated/models/propertyTypes/src/responses.ts +4 -4
- package/test/integration/generated/models/propertyTypes/src/{modelsPropertyTypes.ts → typePropertyValueTypes.ts} +4 -4
- package/test/integration/generated/models/propertyTypes/tspconfig.yaml +5 -2
- package/test/integration/generated/models/usage/README.md +3 -3
- package/test/integration/generated/models/usage/package.json +2 -2
- package/test/integration/generated/models/usage/src/clientDefinitions.ts +7 -7
- package/test/integration/generated/models/usage/src/index.ts +3 -3
- package/test/integration/generated/models/usage/src/{modelsUsage.ts → typeModelUsage.ts} +4 -4
- package/test/integration/generated/models/usage/tspconfig.yaml +5 -2
- package/test/integration/generated/models/visibility/README.md +3 -3
- package/test/integration/generated/models/visibility/package.json +2 -2
- package/test/integration/generated/models/visibility/src/clientDefinitions.ts +3 -3
- package/test/integration/generated/models/visibility/src/index.ts +3 -3
- package/test/integration/generated/models/visibility/src/{modelsVisibilityAutomatic.ts → typeModelVisibility.ts} +4 -4
- package/test/integration/generated/models/visibility/tspconfig.yaml +5 -2
- package/test/integration/generated/parameters/collection-format/src/clientDefinitions.ts +63 -0
- package/test/integration/generated/parameters/collection-format/src/collectionFormatClient.ts +31 -0
- package/test/integration/generated/parameters/collection-format/src/index.ts +12 -0
- package/test/integration/generated/parameters/collection-format/src/parameters.ts +71 -0
- package/test/integration/generated/parameters/collection-format/src/responses.ts +34 -0
- package/test/integration/generated/parameters/collection-format/src/serializeHelper.ts +28 -0
- package/test/integration/generated/parameters/collection-format/tspconfig.yaml +14 -0
- package/test/integration/generated/parameters/spread/src/clientDefinitions.ts +61 -0
- package/test/integration/generated/{lro/lroBasic → parameters/spread}/src/index.ts +4 -4
- package/test/integration/generated/parameters/spread/src/models.ts +7 -0
- package/test/integration/generated/parameters/spread/src/parameters.ts +61 -0
- package/test/integration/generated/parameters/spread/src/parametersSpread.ts +31 -0
- package/test/integration/generated/parameters/spread/src/responses.ts +25 -0
- package/test/integration/generated/parameters/spread/tspconfig.yaml +12 -0
- package/test/integration/generated/projection/src/clientDefinitions.ts +71 -0
- package/test/integration/generated/projection/src/index.ts +12 -0
- package/test/integration/generated/projection/src/models.ts +22 -0
- package/test/integration/generated/projection/src/parameters.ts +48 -0
- package/test/integration/generated/projection/src/projectionClient.ts +31 -0
- package/test/integration/generated/projection/src/responses.ts +34 -0
- package/test/integration/generated/projection/tspconfig.yaml +14 -0
- package/test/integration/generated/resiliency/srvDriven1/README.md +4 -4
- package/test/integration/generated/resiliency/srvDriven1/package.json +2 -2
- package/test/integration/generated/resiliency/srvDriven1/src/clientDefinitions.ts +25 -49
- package/test/integration/generated/resiliency/srvDriven1/src/index.ts +3 -5
- package/test/integration/generated/resiliency/srvDriven1/src/parameters.ts +11 -32
- package/test/integration/generated/resiliency/srvDriven1/src/responses.ts +9 -24
- package/test/integration/generated/resiliency/srvDriven1/src/serviceDrivenOldClient.ts +39 -0
- package/test/integration/generated/resiliency/srvDriven1/tspconfig.yaml +6 -2
- package/test/integration/generated/resiliency/srvDriven2/README.md +13 -4
- package/test/integration/generated/resiliency/srvDriven2/package.json +2 -2
- package/test/integration/generated/resiliency/srvDriven2/src/clientDefinitions.ts +32 -68
- package/test/integration/generated/resiliency/srvDriven2/src/index.ts +3 -5
- package/test/integration/generated/resiliency/srvDriven2/src/parameters.ts +19 -42
- package/test/integration/generated/resiliency/srvDriven2/src/responses.ts +10 -31
- package/test/integration/generated/resiliency/srvDriven2/src/serviceDrivenNewClient.ts +39 -0
- package/test/integration/generated/resiliency/srvDriven2/tspconfig.yaml +6 -2
- package/test/integration/generated/server/path/multiple/src/clientDefinitions.ts +35 -0
- package/test/integration/generated/server/path/multiple/src/index.ts +11 -0
- package/test/integration/generated/server/path/multiple/src/multipleParamInServerPathClient.ts +39 -0
- package/test/integration/generated/server/path/multiple/src/parameters.ts +7 -0
- package/test/integration/generated/server/path/multiple/src/responses.ts +14 -0
- package/test/integration/generated/server/path/multiple/tspconfig.yaml +14 -0
- package/test/integration/generated/server/path/single/src/clientDefinitions.ts +19 -0
- package/test/integration/generated/server/path/single/src/index.ts +11 -0
- package/test/integration/generated/server/path/single/src/parameters.ts +6 -0
- package/test/integration/generated/server/path/single/src/responses.ts +9 -0
- package/test/integration/generated/server/path/single/src/singleParamInServerPathClient.ts +34 -0
- package/test/integration/generated/server/path/single/tspconfig.yaml +14 -0
- package/test/integration/generated/specialWords/tspconfig.yaml +5 -2
- package/test/integration/generated/unions/src/clientDefinitions.ts +8 -8
- package/test/integration/generated/unions/tspconfig.yaml +5 -2
- package/test/integration/internal.spec.ts +43 -0
- package/test/integration/lroCore.spec.ts +89 -0
- package/test/integration/modelInheritance.spec.ts +13 -13
- package/test/integration/modelPropertyNullable.spec.ts +115 -0
- package/test/integration/modelPropertyOptional.spec.ts +32 -32
- package/test/integration/modelPropertyType.spec.ts +6 -6
- package/test/integration/modelUsage.spec.ts +7 -7
- package/test/integration/projection.spec.ts +102 -0
- package/test/integration/resiliencyDpgCustomization.spec.ts +69 -35
- package/test/integration/server.spec.ts +59 -0
- package/test/integration/spreadParameters.spec.ts +82 -0
- package/test/integration/unions.spec.ts +4 -4
- package/test/unit/apiVersion.spec.ts +388 -0
- package/test/unit/clientFactoryGenerator.spec.ts +0 -131
- package/test/unit/modelsGenerator.spec.ts +2 -2
- package/test/unit/parametersGenerator.spec.ts +1 -1
- package/test/unit/responsesGenerator.spec.ts +1 -1
- package/test/unit/util/emitUtil.ts +6 -5
- package/test/unit/util/testUtil.ts +3 -3
- package/dist/src/transform/transformAnnotationDetails.d.ts +0 -6
- package/dist/src/transform/transformAnnotationDetails.d.ts.map +0 -1
- package/dist/src/transform/transformAnnotationDetails.js.map +0 -1
- package/dist/src/transform/transformApiVersionParam.d.ts +0 -5
- package/dist/src/transform/transformApiVersionParam.d.ts.map +0 -1
- package/dist/src/transform/transformApiVersionParam.js +0 -76
- package/dist/src/transform/transformApiVersionParam.js.map +0 -1
- package/src/transform/transformApiVersionParam.ts +0 -104
- package/test/integration/generated/lro/lroBasic/src/clientDefinitions.ts +0 -37
- package/test/integration/generated/lro/lroBasic/src/parameters.ts +0 -8
- package/test/integration/generated/lro/lroBasic/src/responses.ts +0 -22
- package/test/integration/generated/lro/lroBasic/tspconfig.yaml +0 -11
- package/test/integration/generated/resiliency/devDriven/src/clientDefinitions.ts +0 -75
- package/test/integration/generated/resiliency/devDriven/src/models.ts +0 -8
- package/test/integration/generated/resiliency/devDriven/src/outputModels.ts +0 -25
- package/test/integration/generated/resiliency/devDriven/src/parameters.ts +0 -17
- package/test/integration/generated/resiliency/devDriven/src/responses.ts +0 -62
- package/test/integration/generated/resiliency/devDriven/tspconfig.yaml +0 -11
- package/test/integration/generated/resiliency/srvDriven1/src/models.ts +0 -6
- package/test/integration/generated/resiliency/srvDriven1/src/outputModels.ts +0 -6
- package/test/integration/generated/resiliency/srvDriven1/src/resiliencyServiceDriven1.ts +0 -31
- package/test/integration/generated/resiliency/srvDriven2/src/models.ts +0 -6
- package/test/integration/generated/resiliency/srvDriven2/src/outputModels.ts +0 -6
- package/test/integration/generated/resiliency/srvDriven2/src/resiliencyServiceDriven2.ts +0 -31
- package/test/integration/helloWorld.spec.ts +0 -20
- package/test/integration/lroBasic.spec.ts +0 -25
- /package/test/integration/generated/{resiliency/devDriven → azure/core}/.eslintrc.json +0 -0
- /package/test/integration/generated/{resiliency/devDriven → azure/core}/rollup.config.js +0 -0
- /package/test/integration/generated/{resiliency/devDriven → azure/core}/tsconfig.json +0 -0
- /package/test/integration/generated/{lro/lroBasic → azure/core-traits}/.eslintrc.json +0 -0
- /package/test/integration/generated/{lro/lroBasic → azure/core-traits}/rollup.config.js +0 -0
- /package/test/integration/generated/{lro/lroBasic → azure/core-traits}/tsconfig.json +0 -0
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@azure-tools/typespec-ts",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.12.0-alpha.20230501.1",
|
|
4
4
|
"description": "An experimental CADL emitter for TypeScript RLC",
|
|
5
5
|
"main": "dist/src/index.js",
|
|
6
6
|
"type": "module",
|
|
@@ -14,11 +14,12 @@
|
|
|
14
14
|
"check-format": "npm run prettier -- --check",
|
|
15
15
|
"prettier": "prettier --config ./.prettierrc src/**/*.ts",
|
|
16
16
|
"check:tree": "ts-node ./test/commands/check-clean-tree.ts",
|
|
17
|
-
"integration-test-ci": "npm run start-test-server & npm run generate-and-run",
|
|
17
|
+
"integration-test-ci": "npm run start-test-server & npm run copy:typespec && npm run generate-and-run",
|
|
18
18
|
"start-test-server": "mkdirp -p coverage && npx cadl-ranch serve ./node_modules/@azure-tools/cadl-ranch-specs/http --coverageFile ./coverage/cadl-ranch-coverage-typescript.json",
|
|
19
|
+
"copy:typespec": "rm -rf temp && mkdirp -p temp && cp -r ./node_modules/@azure-tools/cadl-ranch-specs/http ./temp",
|
|
19
20
|
"generate-and-run": "npm run generate-cadl-only && npm run integration-test:alone && npm run stop-test-server",
|
|
20
21
|
"generate-cadl-only": "ts-node ./test/commands/gen-cadl-ranch.ts",
|
|
21
|
-
"integration-test:alone": "cross-env TS_NODE_PROJECT=tsconfig.test.json mocha -r ts-node/register --experimental-specifier-resolution=node --timeout
|
|
22
|
+
"integration-test:alone": "cross-env TS_NODE_PROJECT=tsconfig.test.json mocha -r ts-node/register --experimental-specifier-resolution=node --timeout 4000 ./test/integration/*.spec.ts",
|
|
22
23
|
"stop-test-server": "npx cadl-ranch server stop",
|
|
23
24
|
"unit-test": "cross-env TS_NODE_PROJECT=tsconfig.json mocha -r ts-node/register --experimental-specifier-resolution=node --experimental-modules=true './test/unit/**/*.spec.ts'"
|
|
24
25
|
},
|
|
@@ -30,23 +31,23 @@
|
|
|
30
31
|
"@types/node": "^18.0.0",
|
|
31
32
|
"@types/prettier": "^2.6.0",
|
|
32
33
|
"@types/fs-extra": "^9.0.13",
|
|
33
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
34
|
-
"@typescript-eslint/parser": "^5.
|
|
35
|
-
"@typespec/http": "~0.
|
|
34
|
+
"@typescript-eslint/eslint-plugin": "^5.58.0",
|
|
35
|
+
"@typescript-eslint/parser": "^5.58.0",
|
|
36
|
+
"@typespec/http": "~0.43.1",
|
|
36
37
|
"chai": "^4.3.6",
|
|
37
38
|
"mkdirp": "^2.1.2",
|
|
38
39
|
"eslint": "^8.9.0",
|
|
39
40
|
"mocha": "^9.2.2",
|
|
40
41
|
"rimraf": "^3.0.2",
|
|
41
42
|
"ts-node": "^10.9.1",
|
|
42
|
-
"typescript": "~
|
|
43
|
+
"typescript": "~5.0.0",
|
|
43
44
|
"prettier": "~2.7.1",
|
|
44
|
-
"@azure-tools/cadl-ranch-specs": "~0.
|
|
45
|
-
"@typespec/versioning": "~0.
|
|
46
|
-
"@azure-tools/cadl-ranch-expect": "^0.2.
|
|
47
|
-
"@azure-tools/cadl-ranch": "~0.4.
|
|
45
|
+
"@azure-tools/cadl-ranch-specs": "~0.14.2",
|
|
46
|
+
"@typespec/versioning": "~0.43.0",
|
|
47
|
+
"@azure-tools/cadl-ranch-expect": "^0.2.3",
|
|
48
|
+
"@azure-tools/cadl-ranch": "~0.4.6",
|
|
48
49
|
"chalk": "^4.0.0",
|
|
49
|
-
"@azure-rest/core-client": "^1.1.
|
|
50
|
+
"@azure-rest/core-client": "^1.1.2",
|
|
50
51
|
"@azure/core-auth": "^1.3.2",
|
|
51
52
|
"cross-env": "^7.0.3",
|
|
52
53
|
"@azure/core-paging": "^1.5.0",
|
|
@@ -54,20 +55,27 @@
|
|
|
54
55
|
"@azure/core-rest-pipeline": "^1.9.2"
|
|
55
56
|
},
|
|
56
57
|
"dependencies": {
|
|
57
|
-
"@typespec/compiler": "~0.
|
|
58
|
-
"@azure-tools/typespec-azure-core": "~0.
|
|
59
|
-
"@typespec/rest": "~0.
|
|
58
|
+
"@typespec/compiler": "~0.43.0",
|
|
59
|
+
"@azure-tools/typespec-azure-core": "~0.29.0",
|
|
60
|
+
"@typespec/rest": "~0.43.0",
|
|
60
61
|
"prettier": "^2.6.1",
|
|
61
62
|
"tslib": "^2.3.1",
|
|
62
|
-
"@azure-tools/rlc-common": "^0.
|
|
63
|
+
"@azure-tools/rlc-common": "^0.12.0",
|
|
63
64
|
"ts-morph": "^15.1.0",
|
|
64
|
-
"@azure-tools/typespec-client-generator-core": "~0.
|
|
65
|
-
"fs-extra": "^11.1.0"
|
|
65
|
+
"@azure-tools/typespec-client-generator-core": "~0.29.0",
|
|
66
|
+
"fs-extra": "^11.1.0",
|
|
67
|
+
"@typespec/openapi": "0.43.0",
|
|
68
|
+
"@typespec/openapi3": "0.43.0",
|
|
69
|
+
"@azure-tools/typespec-autorest": "~0.29.0"
|
|
66
70
|
},
|
|
67
71
|
"mocha": {
|
|
68
72
|
"extension": [
|
|
69
73
|
"ts"
|
|
70
74
|
],
|
|
71
75
|
"loader": "ts-node/esm"
|
|
72
|
-
}
|
|
76
|
+
},
|
|
77
|
+
"bugs": {
|
|
78
|
+
"url": "https://github.com/Azure/autorest.typescript/issues"
|
|
79
|
+
},
|
|
80
|
+
"homepage": "https://github.com/Azure/autorest.typescript/tree/main/packages/typespec-ts/"
|
|
73
81
|
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
export function toCamelCase(name: string): string {
|
|
2
|
+
let str = name;
|
|
3
|
+
// Handle snake case or dash-separated words
|
|
4
|
+
str = str.replace(/[-_]+/g, " ");
|
|
5
|
+
|
|
6
|
+
// Handle pascal case or camel case
|
|
7
|
+
str = str.replace(/([a-z])([A-Z])/g, (_match, p1, p2) => {
|
|
8
|
+
return p1 + " " + p2.toLowerCase();
|
|
9
|
+
});
|
|
10
|
+
|
|
11
|
+
// Convert to camel case
|
|
12
|
+
str = str.replace(/\s(.)/g, (_match, p1) => {
|
|
13
|
+
return p1.toUpperCase();
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
// Lowercase the first character
|
|
17
|
+
return str.charAt(0).toLowerCase() + str.slice(1);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export function camelToSnakeCase(name: string): string {
|
|
21
|
+
const camelToSnakeCaseRe = (str: string) =>
|
|
22
|
+
str
|
|
23
|
+
.replace(/\s+/g, "_")
|
|
24
|
+
.replace(/\$/g, "")
|
|
25
|
+
.replace(/-/g, "_")
|
|
26
|
+
.replace(/[A-Z]/g, (letter) => `_${letter.toLowerCase()}`);
|
|
27
|
+
|
|
28
|
+
return camelToSnakeCaseRe(name[0]!.toLowerCase() + name.slice(1));
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export function toPascalCase(name: string): string {
|
|
32
|
+
let str = name;
|
|
33
|
+
// Handle snake case or dash-separated words
|
|
34
|
+
str = str.replace(/[-_]+/g, " ");
|
|
35
|
+
|
|
36
|
+
// Handle pascal case or camel case
|
|
37
|
+
str = str.replace(/([a-z])([A-Z])/g, (_match, p1, p2) => {
|
|
38
|
+
return p1 + " " + p2.toLowerCase();
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
// Convert to camel case
|
|
42
|
+
str = str.replace(/\s(.)/g, (_match, p1) => {
|
|
43
|
+
return p1.toUpperCase();
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
// Lowercase the first character
|
|
47
|
+
return str.charAt(0).toUpperCase() + str.slice(1);
|
|
48
|
+
}
|
package/src/emitUtil.ts
CHANGED
|
@@ -53,10 +53,15 @@ async function emitFile(
|
|
|
53
53
|
}
|
|
54
54
|
// Format the contents if necessary
|
|
55
55
|
if (isJson || isSourceCode) {
|
|
56
|
-
|
|
57
|
-
prettierFileContent
|
|
58
|
-
|
|
59
|
-
|
|
56
|
+
try {
|
|
57
|
+
prettierFileContent = format(
|
|
58
|
+
prettierFileContent,
|
|
59
|
+
isJson ? prettierJSONOptions : prettierTypeScriptOptions
|
|
60
|
+
);
|
|
61
|
+
} catch (e) {
|
|
62
|
+
console.error(`Failed to format file: ${filePath}`);
|
|
63
|
+
throw e;
|
|
64
|
+
}
|
|
60
65
|
}
|
|
61
66
|
await host.mkdirp(dirname(filePath));
|
|
62
67
|
await host.writeFile(filePath, prettierFileContent);
|
package/src/index.ts
CHANGED
|
@@ -25,22 +25,33 @@ import {
|
|
|
25
25
|
buildSampleTest,
|
|
26
26
|
buildReadmeFile,
|
|
27
27
|
buildSerializeHelper,
|
|
28
|
-
RLCOptions
|
|
29
|
-
RLCModel
|
|
28
|
+
RLCOptions
|
|
30
29
|
} from "@azure-tools/rlc-common";
|
|
31
30
|
import { transformRLCModel } from "./transform/transform.js";
|
|
32
31
|
import { emitContentByBuilder, emitModels } from "./emitUtil.js";
|
|
33
32
|
import {
|
|
34
33
|
listClients,
|
|
35
|
-
|
|
34
|
+
createSdkContext
|
|
36
35
|
} from "@azure-tools/typespec-client-generator-core";
|
|
37
36
|
import * as path from "path";
|
|
37
|
+
import { buildSharedTypes } from "./modular/buildSharedTypes.js";
|
|
38
|
+
import { Project } from "ts-morph";
|
|
39
|
+
import { buildClientContext } from "./modular/buildClientContext.js";
|
|
40
|
+
import { emitCodeModel } from "./modular/buildCodeModel.js";
|
|
41
|
+
import { buildRootIndex } from "./modular/buildRootIndex.js";
|
|
42
|
+
import { buildModels } from "./modular/emitModels.js";
|
|
43
|
+
import { buildOperationFiles } from "./modular/buildOperations.js";
|
|
44
|
+
import { buildApiIndexFile } from "./modular/buildApiIndex.js";
|
|
45
|
+
import { buildClassicalClient } from "./modular/buildClassicalClient.js";
|
|
46
|
+
import { emitPackage, emitTsConfig } from "./modular/buildProjectFiles.js";
|
|
47
|
+
// import { emitPackage, emitTsConfig } from "./modular/buildProjectFiles.js";
|
|
38
48
|
|
|
39
49
|
export async function $onEmit(context: EmitContext) {
|
|
40
50
|
const program: Program = context.program;
|
|
41
51
|
const options: RLCOptions = context.options;
|
|
42
|
-
const dpgContext =
|
|
52
|
+
const dpgContext = createSdkContext(context);
|
|
43
53
|
const clients = listClients(dpgContext);
|
|
54
|
+
const srcPath: string = context.emitterOutputDir;
|
|
44
55
|
let count = -1;
|
|
45
56
|
for (const client of clients) {
|
|
46
57
|
count++;
|
|
@@ -51,7 +62,8 @@ export async function $onEmit(context: EmitContext) {
|
|
|
51
62
|
context.emitterOutputDir,
|
|
52
63
|
dpgContext
|
|
53
64
|
);
|
|
54
|
-
|
|
65
|
+
const pathToClear = options.isModularLibrary ? srcPath : rlcModels.srcPath;
|
|
66
|
+
clearSrcFolder(pathToClear, count, rlcModels?.options?.multiClient);
|
|
55
67
|
await emitModels(rlcModels, program);
|
|
56
68
|
await emitContentByBuilder(program, buildClientDefinitions, rlcModels);
|
|
57
69
|
await emitContentByBuilder(program, buildResponseTypes, rlcModels);
|
|
@@ -70,10 +82,10 @@ export async function $onEmit(context: EmitContext) {
|
|
|
70
82
|
[
|
|
71
83
|
buildEsLintConfig,
|
|
72
84
|
buildRollupConfig,
|
|
73
|
-
buildTsConfig,
|
|
74
85
|
buildApiExtractorConfig,
|
|
86
|
+
buildReadmeFile,
|
|
75
87
|
buildPackageFile,
|
|
76
|
-
|
|
88
|
+
buildTsConfig
|
|
77
89
|
],
|
|
78
90
|
rlcModels,
|
|
79
91
|
context.emitterOutputDir
|
|
@@ -92,12 +104,43 @@ export async function $onEmit(context: EmitContext) {
|
|
|
92
104
|
context.emitterOutputDir
|
|
93
105
|
);
|
|
94
106
|
}
|
|
107
|
+
|
|
108
|
+
if (options.isModularLibrary) {
|
|
109
|
+
// TODO: Emit modular parts of the library
|
|
110
|
+
const project = new Project();
|
|
111
|
+
const modularCodeModel = emitCodeModel(context, { casing: "camel" });
|
|
112
|
+
|
|
113
|
+
for (const client of modularCodeModel.clients) {
|
|
114
|
+
buildSharedTypes(project, srcPath);
|
|
115
|
+
buildClientContext(client, project, srcPath);
|
|
116
|
+
buildModels(modularCodeModel, project, srcPath);
|
|
117
|
+
buildOperationFiles(client, project, srcPath);
|
|
118
|
+
buildApiIndexFile(project, srcPath);
|
|
119
|
+
buildClassicalClient(client, project, srcPath);
|
|
120
|
+
buildRootIndex(client, project, srcPath);
|
|
121
|
+
|
|
122
|
+
emitPackage(project, srcPath, modularCodeModel);
|
|
123
|
+
emitTsConfig(project, srcPath, modularCodeModel);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
for (const file of project.getSourceFiles()) {
|
|
127
|
+
await emitContentByBuilder(
|
|
128
|
+
program,
|
|
129
|
+
() => ({ content: file.getFullText(), path: file.getFilePath() }),
|
|
130
|
+
modularCodeModel as any
|
|
131
|
+
);
|
|
132
|
+
// emitFile(program, { content: hrlcClient.content, path: hrlcClient.path });
|
|
133
|
+
}
|
|
134
|
+
}
|
|
95
135
|
}
|
|
96
136
|
|
|
97
|
-
function clearSrcFolder(
|
|
98
|
-
|
|
137
|
+
function clearSrcFolder(
|
|
138
|
+
srcPath: string,
|
|
139
|
+
count: number,
|
|
140
|
+
isMultiClient: boolean = false
|
|
141
|
+
) {
|
|
99
142
|
fsextra.emptyDirSync(srcPath);
|
|
100
|
-
if (
|
|
143
|
+
if (isMultiClient && count === 0) {
|
|
101
144
|
const folderPath = path.join(
|
|
102
145
|
srcPath.substring(0, srcPath.indexOf(path.sep + "src") + 4)
|
|
103
146
|
);
|
package/src/lib.ts
CHANGED
|
@@ -70,7 +70,8 @@ export const RLCOptionsSchema: JSONSchemaType<RLCOptions> = {
|
|
|
70
70
|
nullable: true
|
|
71
71
|
},
|
|
72
72
|
azureArm: { type: "boolean", nullable: true },
|
|
73
|
-
sourceFrom: { type: "string", nullable: true }
|
|
73
|
+
sourceFrom: { type: "string", nullable: true },
|
|
74
|
+
isModularLibrary: { type: "boolean", nullable: true, default: false }
|
|
74
75
|
},
|
|
75
76
|
required: []
|
|
76
77
|
};
|
package/src/modelUtils.ts
CHANGED
|
@@ -27,13 +27,19 @@ import {
|
|
|
27
27
|
isUnknownType,
|
|
28
28
|
Model,
|
|
29
29
|
ModelProperty,
|
|
30
|
-
Program,
|
|
31
30
|
Type,
|
|
32
31
|
Union,
|
|
33
32
|
isNullType,
|
|
34
33
|
Scalar,
|
|
35
34
|
UnionVariant,
|
|
36
|
-
getProjectedName
|
|
35
|
+
getProjectedName,
|
|
36
|
+
StringLiteral,
|
|
37
|
+
BooleanLiteral,
|
|
38
|
+
NoTarget,
|
|
39
|
+
NumericLiteral,
|
|
40
|
+
Service,
|
|
41
|
+
listServices,
|
|
42
|
+
Program
|
|
37
43
|
} from "@typespec/compiler";
|
|
38
44
|
import { reportDiagnostic } from "./lib.js";
|
|
39
45
|
import {
|
|
@@ -54,6 +60,11 @@ import {
|
|
|
54
60
|
} from "@typespec/http";
|
|
55
61
|
import { getPagedResult, isFixed } from "@azure-tools/typespec-azure-core";
|
|
56
62
|
import { extractPagedMetadataNested } from "./operationUtil.js";
|
|
63
|
+
import {
|
|
64
|
+
SdkContext,
|
|
65
|
+
getDefaultApiVersion,
|
|
66
|
+
isApiVersion
|
|
67
|
+
} from "@azure-tools/typespec-client-generator-core";
|
|
57
68
|
|
|
58
69
|
export function getBinaryType(usage: SchemaContext[]) {
|
|
59
70
|
return usage.includes(SchemaContext.Output)
|
|
@@ -134,8 +145,9 @@ export function getEffectiveModelFromType(program: Program, type: Type): Type {
|
|
|
134
145
|
export function includeDerivedModel(model: Model): boolean {
|
|
135
146
|
return (
|
|
136
147
|
!isTemplateDeclaration(model) &&
|
|
137
|
-
(model.
|
|
138
|
-
model.
|
|
148
|
+
(!model.templateMapper ||
|
|
149
|
+
!model.templateMapper.args ||
|
|
150
|
+
model.templateMapper.args?.length === 0 ||
|
|
139
151
|
model.derivedModels.length > 0)
|
|
140
152
|
);
|
|
141
153
|
}
|
|
@@ -342,12 +354,13 @@ function getSchemaForModel(
|
|
|
342
354
|
let name = model.name;
|
|
343
355
|
if (
|
|
344
356
|
!overridedModelName &&
|
|
345
|
-
model.
|
|
346
|
-
model.
|
|
357
|
+
model.templateMapper &&
|
|
358
|
+
model.templateMapper.args &&
|
|
359
|
+
model.templateMapper.args.length > 0 &&
|
|
347
360
|
getPagedResult(program, model)
|
|
348
361
|
) {
|
|
349
362
|
name =
|
|
350
|
-
model.
|
|
363
|
+
model.templateMapper.args
|
|
351
364
|
.map((it) => {
|
|
352
365
|
switch (it.kind) {
|
|
353
366
|
case "Model":
|
|
@@ -387,8 +400,8 @@ function getSchemaForModel(
|
|
|
387
400
|
const paged = extractPagedMetadataNested(program, model);
|
|
388
401
|
if (paged && paged.itemsProperty) {
|
|
389
402
|
const items = paged.itemsProperty as unknown as Model;
|
|
390
|
-
if (items && items.
|
|
391
|
-
const templateName = items.
|
|
403
|
+
if (items && items.templateMapper && items.templateMapper.args) {
|
|
404
|
+
const templateName = items.templateMapper.args
|
|
392
405
|
?.map((it) => {
|
|
393
406
|
switch (it.kind) {
|
|
394
407
|
case "Model":
|
|
@@ -528,8 +541,9 @@ function getSchemaForModel(
|
|
|
528
541
|
// templated type.
|
|
529
542
|
if (
|
|
530
543
|
model.baseModel &&
|
|
531
|
-
model.baseModel.
|
|
532
|
-
model.baseModel.
|
|
544
|
+
model.baseModel.templateMapper &&
|
|
545
|
+
model.baseModel.templateMapper.args &&
|
|
546
|
+
model.baseModel.templateMapper.args.length > 0 &&
|
|
533
547
|
modelSchema.properties &&
|
|
534
548
|
Object.keys(modelSchema.properties).length === 0
|
|
535
549
|
) {
|
|
@@ -845,7 +859,7 @@ function getSchemaForStdScalar(program: Program, cadlType: Scalar) {
|
|
|
845
859
|
typeName: "Date | string",
|
|
846
860
|
outputTypeName: "string"
|
|
847
861
|
};
|
|
848
|
-
case "
|
|
862
|
+
case "utcDateTime":
|
|
849
863
|
return {
|
|
850
864
|
type: "string",
|
|
851
865
|
format: "date-time",
|
|
@@ -941,8 +955,9 @@ export function getBodyType(
|
|
|
941
955
|
// response body type is reosurce type, and request body type (if templated) contains resource type
|
|
942
956
|
if (
|
|
943
957
|
bodyTypeInResponse === resourceType &&
|
|
944
|
-
bodyModel.
|
|
945
|
-
bodyModel.
|
|
958
|
+
bodyModel.templateMapper &&
|
|
959
|
+
bodyModel.templateMapper.args &&
|
|
960
|
+
bodyModel.templateMapper.args.some((it) => {
|
|
946
961
|
return it.kind === "Model" || it.kind === "Union"
|
|
947
962
|
? it === bodyTypeInResponse
|
|
948
963
|
: false;
|
|
@@ -959,3 +974,111 @@ export function getBodyType(
|
|
|
959
974
|
}
|
|
960
975
|
return bodyModel;
|
|
961
976
|
}
|
|
977
|
+
|
|
978
|
+
/**
|
|
979
|
+
* Predict if the default value exists in param, we would follow the rules:
|
|
980
|
+
* 1. If we have specific default literal in param
|
|
981
|
+
* 2. If we take the default api-version value into considerations
|
|
982
|
+
* @param program
|
|
983
|
+
* @param dpgContext
|
|
984
|
+
* @param param The param to predict
|
|
985
|
+
* @returns
|
|
986
|
+
*/
|
|
987
|
+
export function predictDefaultValue(
|
|
988
|
+
program: Program,
|
|
989
|
+
dpgContext: SdkContext,
|
|
990
|
+
param?: ModelProperty
|
|
991
|
+
) {
|
|
992
|
+
if (!param) {
|
|
993
|
+
return;
|
|
994
|
+
}
|
|
995
|
+
const specificDefault = param?.default;
|
|
996
|
+
if (isLiteralValue(specificDefault)) {
|
|
997
|
+
return specificDefault.value;
|
|
998
|
+
}
|
|
999
|
+
const serviceNamespace = getDefaultService(program)?.type;
|
|
1000
|
+
if (!serviceNamespace) {
|
|
1001
|
+
return;
|
|
1002
|
+
}
|
|
1003
|
+
const defaultApiVersion = getEnrichedDefaultApiVersion(program, dpgContext);
|
|
1004
|
+
if (param && isApiVersion(dpgContext, param) && defaultApiVersion) {
|
|
1005
|
+
return defaultApiVersion;
|
|
1006
|
+
}
|
|
1007
|
+
return;
|
|
1008
|
+
}
|
|
1009
|
+
|
|
1010
|
+
function isLiteralValue(
|
|
1011
|
+
type?: Type
|
|
1012
|
+
): type is StringLiteral | NumericLiteral | BooleanLiteral {
|
|
1013
|
+
if (!type) {
|
|
1014
|
+
return false;
|
|
1015
|
+
}
|
|
1016
|
+
|
|
1017
|
+
if (
|
|
1018
|
+
type.kind === "Boolean" ||
|
|
1019
|
+
type.kind === "String" ||
|
|
1020
|
+
type.kind === "Number"
|
|
1021
|
+
) {
|
|
1022
|
+
return type.value !== undefined;
|
|
1023
|
+
}
|
|
1024
|
+
|
|
1025
|
+
return false;
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
export function getDefaultService(program: Program): Service | undefined {
|
|
1029
|
+
const services = listServices(program);
|
|
1030
|
+
if (!services || services.length === 0) {
|
|
1031
|
+
reportDiagnostic(program, {
|
|
1032
|
+
code: "no-service-defined",
|
|
1033
|
+
target: NoTarget
|
|
1034
|
+
});
|
|
1035
|
+
}
|
|
1036
|
+
if (services.length > 1) {
|
|
1037
|
+
reportDiagnostic(program, {
|
|
1038
|
+
code: "more-than-one-service",
|
|
1039
|
+
target: NoTarget
|
|
1040
|
+
});
|
|
1041
|
+
}
|
|
1042
|
+
return services[0];
|
|
1043
|
+
}
|
|
1044
|
+
|
|
1045
|
+
/**
|
|
1046
|
+
* Get the default api-version both from versioned and service decorator
|
|
1047
|
+
* TODO: remember to switch to TCGC once the fix is done
|
|
1048
|
+
* @param program
|
|
1049
|
+
* @param dpgContext
|
|
1050
|
+
* @returns default api-version value
|
|
1051
|
+
*/
|
|
1052
|
+
export function getEnrichedDefaultApiVersion(
|
|
1053
|
+
program: Program,
|
|
1054
|
+
dpgContext: SdkContext
|
|
1055
|
+
): string | undefined {
|
|
1056
|
+
const serviceNamespace = getDefaultService(program);
|
|
1057
|
+
if (!serviceNamespace) {
|
|
1058
|
+
return;
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
const defaultVersion = getDefaultApiVersion(
|
|
1062
|
+
dpgContext,
|
|
1063
|
+
serviceNamespace!.type
|
|
1064
|
+
);
|
|
1065
|
+
if (defaultVersion) {
|
|
1066
|
+
return defaultVersion.value;
|
|
1067
|
+
}
|
|
1068
|
+
return serviceNamespace.version;
|
|
1069
|
+
}
|
|
1070
|
+
|
|
1071
|
+
export function trimUsage(model: any) {
|
|
1072
|
+
if (typeof model !== "object") {
|
|
1073
|
+
return model;
|
|
1074
|
+
}
|
|
1075
|
+
const tmpModel = Object.assign({}, model);
|
|
1076
|
+
const tmpModelKeys = Object.keys(tmpModel).filter((item) => {
|
|
1077
|
+
return item !== "usage";
|
|
1078
|
+
});
|
|
1079
|
+
const ordered = tmpModelKeys.sort().reduce((obj, key) => {
|
|
1080
|
+
(obj as any)[key] = trimUsage(tmpModel[key]);
|
|
1081
|
+
return obj;
|
|
1082
|
+
}, {});
|
|
1083
|
+
return ordered;
|
|
1084
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { Project } from "ts-morph";
|
|
2
|
+
|
|
3
|
+
export function buildApiIndexFile(project: Project, srcPath: string) {
|
|
4
|
+
const apiFiles = project.getSourceFiles("**/src/api/**");
|
|
5
|
+
const indexFile = project.createSourceFile(`${srcPath}/src/api/index.ts`);
|
|
6
|
+
for (const file of apiFiles) {
|
|
7
|
+
const exports = [...file.getExportedDeclarations().keys()];
|
|
8
|
+
indexFile.addExportDeclaration({
|
|
9
|
+
moduleSpecifier: `./${file.getBaseNameWithoutExtension()}.js`,
|
|
10
|
+
namedExports: exports
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ClassDeclaration,
|
|
3
|
+
FunctionDeclarationStructure,
|
|
4
|
+
MethodDeclarationStructure,
|
|
5
|
+
OptionalKind,
|
|
6
|
+
Project,
|
|
7
|
+
Scope,
|
|
8
|
+
SourceFile,
|
|
9
|
+
StructureKind
|
|
10
|
+
} from "ts-morph";
|
|
11
|
+
import { toCamelCase } from "../casingUtils.js";
|
|
12
|
+
import { getClientParameters } from "./helpers/clientHelpers.js";
|
|
13
|
+
import { getClientName } from "./helpers/namingHelpers.js";
|
|
14
|
+
import { getOperationFunction } from "./helpers/operationHelpers.js";
|
|
15
|
+
import { Client } from "./modularCodeModel.js";
|
|
16
|
+
|
|
17
|
+
export function buildClassicalClient(
|
|
18
|
+
client: Client,
|
|
19
|
+
project: Project,
|
|
20
|
+
srcPath: string
|
|
21
|
+
) {
|
|
22
|
+
const { description } = client;
|
|
23
|
+
const modularClientName = getClientName(client);
|
|
24
|
+
const classicalClientname = `${getClientName(client)}Client`;
|
|
25
|
+
const params = getClientParameters(client);
|
|
26
|
+
|
|
27
|
+
const clientFile = project.createSourceFile(
|
|
28
|
+
`${srcPath}/src/${classicalClientname}.ts`
|
|
29
|
+
);
|
|
30
|
+
const clientClass = clientFile.addClass({
|
|
31
|
+
isExported: true,
|
|
32
|
+
name: `${classicalClientname}`
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
// Add the private client member. This will be the client context from /api
|
|
36
|
+
clientClass.addProperty({
|
|
37
|
+
name: "_client",
|
|
38
|
+
type: `${modularClientName}Context`,
|
|
39
|
+
scope: Scope.Private
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
// TODO: We may need to generate constructor overloads at some point. Here we'd do that.
|
|
43
|
+
const constructor = clientClass.addConstructor({
|
|
44
|
+
docs: [description],
|
|
45
|
+
parameters: params
|
|
46
|
+
});
|
|
47
|
+
constructor.addStatements([
|
|
48
|
+
`this._client = create${modularClientName}(${(params ?? [])
|
|
49
|
+
.map((p) => p.name)
|
|
50
|
+
.join(",")})`
|
|
51
|
+
]);
|
|
52
|
+
importCredential(clientFile);
|
|
53
|
+
buildClientOperationGroups(client, clientClass);
|
|
54
|
+
importAllModels(clientFile, srcPath);
|
|
55
|
+
clientFile.fixUnusedIdentifiers();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
function importAllModels(clientFile: SourceFile, srcPath: string) {
|
|
59
|
+
const project = clientFile.getProject();
|
|
60
|
+
const apiModels = project.getSourceFile(`${srcPath}/src/api/index.ts`);
|
|
61
|
+
|
|
62
|
+
if (!apiModels) {
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
const exported = [...apiModels.getExportedDeclarations().keys()];
|
|
67
|
+
|
|
68
|
+
clientFile.addImportDeclaration({
|
|
69
|
+
moduleSpecifier: `./api/index.js`,
|
|
70
|
+
namedImports: exported
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
function importCredential(clientSourceFile: SourceFile): void {
|
|
75
|
+
clientSourceFile.addImportDeclaration({
|
|
76
|
+
moduleSpecifier: "@azure/core-auth",
|
|
77
|
+
namedImports: ["TokenCredential", "AzureKeyCredential"]
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function buildClientOperationGroups(
|
|
82
|
+
client: Client,
|
|
83
|
+
clientClass: ClassDeclaration
|
|
84
|
+
) {
|
|
85
|
+
for (const operationGroup of client.operationGroups) {
|
|
86
|
+
const operationGroupName = toCamelCase(operationGroup.propertyName);
|
|
87
|
+
const operationDeclarations: OptionalKind<FunctionDeclarationStructure>[] =
|
|
88
|
+
operationGroup.operations.map((operation) =>
|
|
89
|
+
getOperationFunction(operation)
|
|
90
|
+
);
|
|
91
|
+
|
|
92
|
+
const tempfile = new Project().createSourceFile("temp.ts");
|
|
93
|
+
|
|
94
|
+
const declarations = tempfile.addFunctions(operationDeclarations);
|
|
95
|
+
|
|
96
|
+
if (operationGroupName) {
|
|
97
|
+
clientClass.addProperty({
|
|
98
|
+
name: operationGroupName,
|
|
99
|
+
initializer: `
|
|
100
|
+
{
|
|
101
|
+
${declarations.map((d) => {
|
|
102
|
+
return `${d.getName()}: (${d
|
|
103
|
+
.getParameters()
|
|
104
|
+
.filter((p) => p.getName() !== "context")
|
|
105
|
+
.map((p) => p.getText())
|
|
106
|
+
.join(",")}): ${d
|
|
107
|
+
.getReturnType()
|
|
108
|
+
.getText()} => {return ${d.getName()}(${[
|
|
109
|
+
"this._client",
|
|
110
|
+
...d.getParameters().map((p) => p.getName())
|
|
111
|
+
]
|
|
112
|
+
.filter((p) => p !== "context")
|
|
113
|
+
.join(",")})}`;
|
|
114
|
+
})}
|
|
115
|
+
}
|
|
116
|
+
`
|
|
117
|
+
});
|
|
118
|
+
} else {
|
|
119
|
+
clientClass.addMethods(
|
|
120
|
+
declarations.map((d) => {
|
|
121
|
+
const method: MethodDeclarationStructure = {
|
|
122
|
+
name: d.getName() ?? "FIXME",
|
|
123
|
+
kind: StructureKind.Method,
|
|
124
|
+
returnType: d.getReturnType().getText(),
|
|
125
|
+
parameters: d
|
|
126
|
+
.getParameters()
|
|
127
|
+
.filter((p) => p.getName() !== "context")
|
|
128
|
+
.map((d) => d.getStructure()),
|
|
129
|
+
statements: `return ${d.getName()}(${[
|
|
130
|
+
"this._client",
|
|
131
|
+
...d.getParameters().map((p) => p.getName())
|
|
132
|
+
]
|
|
133
|
+
.filter((p) => p !== "context")
|
|
134
|
+
.join(",")})`
|
|
135
|
+
};
|
|
136
|
+
|
|
137
|
+
return method;
|
|
138
|
+
})
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Import ClientOptions
|
|
143
|
+
clientClass.getSourceFile().addImportDeclaration({
|
|
144
|
+
moduleSpecifier: `./common/interfaces.js`,
|
|
145
|
+
namedImports: ["ClientOptions"]
|
|
146
|
+
});
|
|
147
|
+
}
|