Skip to content

fix(typespec-ts): preserve $DO_NOT_NORMALIZE$ operation-group names in classical client#4647

Merged
JialinHuang803 merged 3 commits into
Azure:release/june-2026from
v-jiaodi:hotfix-issue4604
Jun 18, 2026
Merged

fix(typespec-ts): preserve $DO_NOT_NORMALIZE$ operation-group names in classical client#4647
JialinHuang803 merged 3 commits into
Azure:release/june-2026from
v-jiaodi:hotfix-issue4604

Conversation

@v-jiaodi

Copy link
Copy Markdown
Member

When @@clientLocation assigns an operation to a $DO_NOT_NORMALIZE$-prefixed group (e.g. "$DO_NOT_NORMALIZE$wCFRelays"), the classical client generator was double-normalizing the name: the first pass strips the prefix → "wCFRelays", then a second normalizeName(..., NameType.OperationGroup) call converts it to "WCFRelays" via PascalCase reconstruction. This produced a refkey mismatch with the names registered by buildClassicOperationFiles (which uses single normalization), leaving unresolved placeholders in the output:

// Before fix
public readonly wCFRelays: __PLACEHOLDER_sWCFRelaysOperations_s0_sclassicOperations__;

// After fix
public readonly wCFRelays: wCFRelaysOperations;

fixes #4604

@microsoft-github-policy-service microsoft-github-policy-service Bot added the emitter:typescript Issues for @azure-tools/typespec-ts emitter label Jun 17, 2026
@azure-sdk

azure-sdk commented Jun 17, 2026

Copy link
Copy Markdown
Collaborator

❌ There is undocummented changes. Run chronus add to add a changeset or click here.

The following packages have changes but are not documented.

  • @azure-tools/typespec-autorest
  • @azure-tools/typespec-azure-resource-manager
  • @azure-tools/typespec-azure-rulesets

The following packages have already been documented:

  • @azure-tools/typespec-ts
Show changes

@azure-tools/typespec-ts - fix ✏️

Preserve $DO_NOT_NORMALIZE$ operation-group names in classical client generation to avoid double-normalization that caused unresolved placeholder references.

@azure-tools/typespec-ts - fix ✏️

[typespec-ts] fix body param serialize issue reported from sdk repo

@azure-tools/typespec-ts - fix ✏️

[typespec-ts] Keep paged result model public when also used as a model property

@pkg-pr-new

pkg-pr-new Bot commented Jun 17, 2026

Copy link
Copy Markdown

Open in StackBlitz

npm i https://pkg.pr.new/@azure-tools/typespec-autorest@4647
npm i https://pkg.pr.new/@azure-tools/typespec-azure-resource-manager@4647
npm i https://pkg.pr.new/@azure-tools/typespec-azure-rulesets@4647
npm i https://pkg.pr.new/@azure-tools/typespec-ts@4647

commit: 451bebe

@github-actions

github-actions Bot commented Jun 17, 2026

Copy link
Copy Markdown
Contributor

⚡ Benchmark Results

⚠️ 22 metric(s) regressed above the +5% threshold:

Metric Baseline Current Change
total 🔴 587.5ms 🔴 712.5ms +21.3% 🔴
loader 🟢 155.8ms 🟢 200.0ms +28.3% 🔴
resolver 🟢 18.5ms 🟢 21.1ms +14.1% 🔴
checker 🟢 181.7ms 🟡 218.6ms +20.3% 🔴
validation 🟢 41.5ms 🟢 44.8ms +8.1% 🔴
 ↳ validation/@azure-tools/typespec-azure-core 🟢 5.9ms 🟢 7.4ms +25.5% 🔴
 ↳ validation/@typespec/http 🟢 5.0ms 🟢 6.4ms +26.6% 🔴
linter 🟢 131.7ms 🟢 154.5ms +17.4% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-header-explode 🟡 18.2ms 🔴 22.6ms +24.7% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-query-explode 🟡 19.4ms 🔴 23.6ms +21.9% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-response-body 🔴 23.0ms 🔴 28.1ms +22.1% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-route-parameter-name-mismatch 🟢 4.6ms 🟢 5.9ms +26.7% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/response-schema-problem 🔴 21.4ms 🔴 25.8ms +20.6% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/use-standard-names 🟢 4.7ms 🟢 6.0ms +29.1% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-operation-response 🟢 4.3ms 🟢 5.5ms +28.6% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/lro-location-header 🟡 12.8ms 🟡 15.0ms +16.7% 🔴
emit 🔴 5.66s 🔴 6.48s +14.6% 🔴
 ↳ emit/@azure-tools/typespec-autorest 🟢 156.3ms 🟢 183.9ms +17.7% 🔴
 ↳ emit/@azure-tools/typespec-python 🔴 4.16s 🔴 4.78s +15.0% 🔴
 ↳ emit/@typespec/http-client-js 🔴 1.11s 🔴 1.27s +14.4% 🔴
 ↳ emit/@typespec/openapi3 🟢 139.5ms 🟢 164.7ms +18.0% 🔴
 ↳ emit/@typespec/openapi3/compute 🟢 121.4ms 🟢 145.6ms +20.0% 🔴
Full details – comparing 1c0eca0 vs baseline 40aa6fc
Metric Baseline Current Change
total 🔴 587.5ms 🔴 712.5ms +21.3% 🔴
loader 🟢 155.8ms 🟢 200.0ms +28.3% 🔴
resolver 🟢 18.5ms 🟢 21.1ms +14.1% 🔴
checker 🟢 181.7ms 🟡 218.6ms +20.3% 🔴
validation 🟢 41.5ms 🟢 44.8ms +8.1% 🔴
 ↳ validation/@azure-tools/typespec-azure-core 🟢 5.9ms 🟢 7.4ms +25.5% 🔴
 ↳ validation/@typespec/http 🟢 5.0ms 🟢 6.4ms +26.6% 🔴
 ↳ validation/@typespec/rest 🟢 0.6ms 🟢 0.7ms +28.5%
 ↳ validation/@typespec/versioning 🔴 28.0ms 🔴 28.4ms +1.6%
 ↳ validation/compiler 🟢 1.5ms 🟢 1.6ms +7.9%
linter 🟢 131.7ms 🟢 154.5ms +17.4% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/auth-required 🟢 0.0ms 🟢 0.0ms +11.0%
 ↳ linter/@azure-tools/typespec-azure-core/bad-record-type 🟢 0.2ms 🟢 0.2ms +2.3%
 ↳ linter/@azure-tools/typespec-azure-core/byos 🟢 5.9ms 🟢 6.7ms +14.6%
 ↳ linter/@azure-tools/typespec-azure-core/casing-style 🟢 0.6ms 🟢 0.7ms +17.0%
 ↳ linter/@azure-tools/typespec-azure-core/composition-over-inheritance 🟢 0.1ms 🟢 0.1ms +11.2%
 ↳ linter/@azure-tools/typespec-azure-core/documentation-required 🟢 0.8ms 🟢 1.0ms +16.1%
 ↳ linter/@azure-tools/typespec-azure-core/friendly-name 🟢 0.6ms 🟢 0.7ms +7.0%
 ↳ linter/@azure-tools/typespec-azure-core/key-visibility-required 🟢 0.2ms 🟢 0.2ms +14.4%
 ↳ linter/@azure-tools/typespec-azure-core/known-encoding 🟢 0.3ms 🟢 0.3ms +7.9%
 ↳ linter/@azure-tools/typespec-azure-core/long-running-polling-operation-required 🟢 0.3ms 🟢 0.4ms +30.9%
 ↳ linter/@azure-tools/typespec-azure-core/no-case-mismatch 🟢 0.2ms 🟢 0.3ms +14.7%
 ↳ linter/@azure-tools/typespec-azure-core/no-closed-literal-union 🟢 0.2ms 🟢 0.3ms +28.7%
 ↳ linter/@azure-tools/typespec-azure-core/no-enum 🟢 0.1ms 🟢 0.0ms -6.8%
 ↳ linter/@azure-tools/typespec-azure-core/no-error-status-codes 🟢 0.1ms 🟢 0.1ms +12.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-explicit-routes-resource-ops 🟢 0.1ms 🟢 0.1ms +17.9%
 ↳ linter/@azure-tools/typespec-azure-core/no-format 🟢 0.6ms 🟢 0.6ms +13.7%
 ↳ linter/@azure-tools/typespec-azure-core/no-generic-numeric 🟢 0.4ms 🟢 0.5ms +11.9%
 ↳ linter/@azure-tools/typespec-azure-core/no-header-explode 🟡 18.2ms 🔴 22.6ms +24.7% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-legacy-usage 🟢 1.1ms 🟢 1.2ms +4.3%
 ↳ linter/@azure-tools/typespec-azure-core/no-multiple-discriminator 🟢 0.1ms 🟢 0.1ms +19.5%
 ↳ linter/@azure-tools/typespec-azure-core/no-nullable 🟢 0.2ms 🟢 0.3ms +20.6%
 ↳ linter/@azure-tools/typespec-azure-core/no-offsetdatetime 🟢 1.2ms 🟢 1.3ms +8.3%
 ↳ linter/@azure-tools/typespec-azure-core/no-openapi 🟢 2.0ms 🟢 2.4ms +19.1%
 ↳ linter/@azure-tools/typespec-azure-core/no-private-usage 🟢 1.9ms 🟢 2.2ms +17.0%
 ↳ linter/@azure-tools/typespec-azure-core/no-query-explode 🟡 19.4ms 🔴 23.6ms +21.9% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-response-body 🔴 23.0ms 🔴 28.1ms +22.1% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-rest-library-interfaces 🟢 0.0ms 🟢 0.0ms +12.0%
 ↳ linter/@azure-tools/typespec-azure-core/no-route-parameter-name-mismatch 🟢 4.6ms 🟢 5.9ms +26.7% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/no-rpc-path-params 🟢 0.2ms 🟢 0.2ms +37.5%
 ↳ linter/@azure-tools/typespec-azure-core/no-string-discriminator 🟢 0.0ms 🟢 0.1ms +15.0%
 ↳ linter/@azure-tools/typespec-azure-core/no-unknown 🟢 0.2ms 🟢 0.2ms +20.2%
 ↳ linter/@azure-tools/typespec-azure-core/no-unnamed-union 🟢 0.3ms 🟢 0.4ms +22.9%
 ↳ linter/@azure-tools/typespec-azure-core/operation-missing-api-version 🟢 0.2ms 🟢 0.2ms +19.3%
 ↳ linter/@azure-tools/typespec-azure-core/request-body-problem 🟢 0.3ms 🟢 0.4ms +18.4%
 ↳ linter/@azure-tools/typespec-azure-core/require-versioned 🟢 0.0ms 🟢 0.0ms +35.9%
 ↳ linter/@azure-tools/typespec-azure-core/response-schema-problem 🔴 21.4ms 🔴 25.8ms +20.6% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/rpc-operation-request-body 🟢 0.3ms 🟢 0.4ms +20.4%
 ↳ linter/@azure-tools/typespec-azure-core/spread-discriminated-model 🟢 0.3ms 🟢 0.3ms +18.0%
 ↳ linter/@azure-tools/typespec-azure-core/use-standard-names 🟢 4.7ms 🟢 6.0ms +29.1% 🔴
 ↳ linter/@azure-tools/typespec-azure-core/use-standard-operations 🟢 0.1ms 🟢 0.1ms +25.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-agent-base-type-child-resources 🟢 3.9ms 🟢 4.3ms +8.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-agent-base-type-lifecycle-operations 🟢 0.0ms 🟢 0.0ms -12.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-common-types-version 🟢 3.7ms 🟢 4.3ms +15.8%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-custom-resource-no-key 🟢 0.1ms 🟢 0.1ms +11.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-custom-resource-usage-discourage 🟢 0.1ms 🟢 0.1ms +23.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-delete-operation-response-codes 🟢 1.0ms 🟢 1.2ms +17.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-no-path-casing-conflicts 🟢 4.1ms 🟢 4.9ms +19.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-no-record 🟢 0.4ms 🟢 0.4ms +10.8%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-post-operation-response-codes 🟢 0.4ms 🟢 0.5ms +17.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-put-operation-response-codes 🟢 0.0ms 🟢 0.0ms +0.5%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-action-no-segment 🟢 0.2ms 🟢 0.3ms +25.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-duplicate-property 🟢 0.1ms 🟢 0.1ms +12.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-interface-requires-decorator 🟢 0.0ms 🟢 0.0ms -0.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-action-verb 🟢 0.1ms 🟢 0.1ms +15.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-envelope-property 🟢 0.1ms 🟢 0.1ms +8.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-invalid-version-format 🟢 0.0ms 🟢 0.0ms +7.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-key-invalid-chars 🟢 0.2ms 🟢 0.3ms +7.7%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-name-pattern 🟢 0.0ms 🟢 0.0ms -4.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-operation 🟢 0.2ms 🟢 0.2ms +13.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-operation-response 🟢 4.3ms 🟢 5.5ms +28.6% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-patch 🟢 0.3ms 🟢 0.3ms +20.8%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-path-segment-invalid-chars 🟢 0.2ms 🟢 0.2ms +8.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/arm-resource-provisioning-state 🟢 0.1ms 🟢 0.1ms +4.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/beyond-nesting-levels 🟢 0.1ms 🟢 0.1ms +4.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/empty-updateable-properties 🟢 0.2ms 🟢 0.2ms -3.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/improper-subscription-list-operation 🟢 0.0ms 🟢 0.0ms +9.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/lro-location-header 🟡 12.8ms 🟡 15.0ms +16.7% 🔴
 ↳ linter/@azure-tools/typespec-azure-resource-manager/missing-operations-endpoint 🟢 0.0ms 🟢 0.0ms +3.8%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/missing-x-ms-identifiers 🟢 0.3ms 🟢 0.3ms +9.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-empty-model 🟢 0.1ms 🟢 0.1ms +18.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-override-props 🟢 0.1ms 🟢 0.1ms +11.2%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-resource-delete-operation 🟢 0.2ms 🟢 0.2ms +25.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/no-response-body 🔴 22.2ms 🔴 22.5ms +1.6%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/patch-envelope 🟢 0.1ms 🟢 0.2ms +7.3%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/resource-name 🟢 0.1ms 🟢 0.2ms +9.1%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/secret-prop 🟢 2.4ms 🟢 2.7ms +13.0%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/unsupported-type 🟢 0.3ms 🟢 0.4ms +17.9%
 ↳ linter/@azure-tools/typespec-azure-resource-manager/version-progression 🟢 0.0ms 🟢 0.0ms +0.4%
 ↳ linter/@azure-tools/typespec-client-generator-core/property-name-conflict 🟢 1.0ms 🟢 1.2ms +16.5%
 ↳ linter/@azure-tools/typespec-client-generator-core/require-client-suffix 🟢 0.2ms 🟢 0.2ms +14.9%
emit 🔴 5.66s 🔴 6.48s +14.6% 🔴
 ↳ emit/@azure-tools/typespec-autorest 🟢 156.3ms 🟢 183.9ms +17.7% 🔴
 ↳ emit/@azure-tools/typespec-python 🔴 4.16s 🔴 4.78s +15.0% 🔴
 ↳ emit/@typespec/http-client-js 🔴 1.11s 🔴 1.27s +14.4% 🔴
 ↳ emit/@typespec/openapi3 🟢 139.5ms 🟢 164.7ms +18.0% 🔴
 ↳ emit/@typespec/openapi3/compute 🟢 121.4ms 🟢 145.6ms +20.0% 🔴
 ↳ emit/@typespec/openapi3/write 🟢 18.3ms 🟢 19.3ms +5.3%

Averaged across 3 specs (azure-arm-resource-manager, azure-core-dataplane, azure-full).
Threshold: changes > ±5% are highlighted.
🟢 Fast · 🟡 Moderate (stages >200ms, rules >10ms) · 🔴 Slow (stages >400ms, rules >20ms)

@azure-sdk

azure-sdk commented Jun 17, 2026

Copy link
Copy Markdown
Collaborator

You can try these changes here

🛝 Playground 🌐 Website

@v-jiaodi v-jiaodi marked this pull request as ready for review June 18, 2026 02:02
v-jiaodi and others added 2 commits June 18, 2026 10:02
… client

- Add doNotNormalizeOperationGroup.md scenario test
- Fix emitModularClientFromTypeSpec to call buildClassicOperationFiles
  for proper refkey resolution of operation groups
- Default hierarchyClient to true to match production emitter behavior
- Update existing snapshots affected by hierarchyClient default change

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
@JialinHuang803

Copy link
Copy Markdown
Member

The spector tests are already resolved in the main branch.

@JialinHuang803 JialinHuang803 merged commit abc22df into Azure:release/june-2026 Jun 18, 2026
30 of 31 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

emitter:typescript Issues for @azure-tools/typespec-ts emitter

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants