@typespec/http-client-python 0.32.0 → 0.34.0

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.
Files changed (73) hide show
  1. package/dist/emitter/emitter.js +10 -2
  2. package/dist/emitter/emitter.js.map +1 -1
  3. package/dist/emitter/lib.d.ts +6 -0
  4. package/dist/emitter/lib.d.ts.map +1 -1
  5. package/dist/emitter/lib.js +29 -0
  6. package/dist/emitter/lib.js.map +1 -1
  7. package/dist/emitter/types.d.ts.map +1 -1
  8. package/dist/emitter/types.js +2 -0
  9. package/dist/emitter/types.js.map +1 -1
  10. package/emitter/src/emitter.ts +9 -1
  11. package/emitter/src/lib.ts +36 -0
  12. package/emitter/src/types.ts +2 -0
  13. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  14. package/eng/scripts/ci/regenerate-common.ts +40 -15
  15. package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
  16. package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
  17. package/generator/build/lib/pygen/__init__.py +4 -3
  18. package/generator/build/lib/pygen/codegen/models/__init__.py +4 -2
  19. package/generator/build/lib/pygen/codegen/models/code_model.py +27 -5
  20. package/generator/build/lib/pygen/codegen/models/combined_type.py +3 -3
  21. package/generator/build/lib/pygen/codegen/models/enum_type.py +75 -25
  22. package/generator/build/lib/pygen/codegen/models/list_type.py +10 -4
  23. package/generator/build/lib/pygen/codegen/models/model_type.py +145 -4
  24. package/generator/build/lib/pygen/codegen/models/operation.py +1 -0
  25. package/generator/build/lib/pygen/codegen/models/paging_operation.py +5 -1
  26. package/generator/build/lib/pygen/codegen/models/parameter.py +2 -2
  27. package/generator/build/lib/pygen/codegen/models/primitive_types.py +30 -6
  28. package/generator/build/lib/pygen/codegen/models/property.py +21 -8
  29. package/generator/build/lib/pygen/codegen/models/response.py +16 -3
  30. package/generator/build/lib/pygen/codegen/models/utils.py +12 -10
  31. package/generator/build/lib/pygen/codegen/serializers/__init__.py +46 -11
  32. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +48 -15
  33. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +32 -2
  34. package/generator/build/lib/pygen/codegen/serializers/model_init_serializer.py +1 -1
  35. package/generator/build/lib/pygen/codegen/serializers/model_serializer.py +127 -3
  36. package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +263 -12
  37. package/generator/build/lib/pygen/codegen/serializers/unions_serializer.py +44 -0
  38. package/generator/build/lib/pygen/codegen/templates/model_container.py.jinja2 +1 -1
  39. package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +30 -2
  40. package/generator/build/lib/pygen/codegen/templates/types.py.jinja2 +51 -2
  41. package/generator/build/lib/pygen/codegen/templates/unions.py.jinja2 +9 -0
  42. package/generator/build/lib/pygen/preprocess/__init__.py +104 -13
  43. package/generator/build/lib/pygen/utils.py +16 -0
  44. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  45. package/generator/pygen/__init__.py +4 -3
  46. package/generator/pygen/codegen/models/__init__.py +4 -2
  47. package/generator/pygen/codegen/models/code_model.py +27 -5
  48. package/generator/pygen/codegen/models/combined_type.py +3 -3
  49. package/generator/pygen/codegen/models/enum_type.py +75 -25
  50. package/generator/pygen/codegen/models/list_type.py +10 -4
  51. package/generator/pygen/codegen/models/model_type.py +145 -4
  52. package/generator/pygen/codegen/models/operation.py +1 -0
  53. package/generator/pygen/codegen/models/paging_operation.py +5 -1
  54. package/generator/pygen/codegen/models/parameter.py +2 -2
  55. package/generator/pygen/codegen/models/primitive_types.py +30 -6
  56. package/generator/pygen/codegen/models/property.py +21 -8
  57. package/generator/pygen/codegen/models/response.py +16 -3
  58. package/generator/pygen/codegen/models/utils.py +12 -10
  59. package/generator/pygen/codegen/serializers/__init__.py +46 -11
  60. package/generator/pygen/codegen/serializers/builder_serializer.py +48 -15
  61. package/generator/pygen/codegen/serializers/general_serializer.py +32 -2
  62. package/generator/pygen/codegen/serializers/model_init_serializer.py +1 -1
  63. package/generator/pygen/codegen/serializers/model_serializer.py +127 -3
  64. package/generator/pygen/codegen/serializers/types_serializer.py +263 -12
  65. package/generator/pygen/codegen/serializers/unions_serializer.py +44 -0
  66. package/generator/pygen/codegen/templates/model_container.py.jinja2 +1 -1
  67. package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +30 -2
  68. package/generator/pygen/codegen/templates/types.py.jinja2 +51 -2
  69. package/generator/pygen/codegen/templates/unions.py.jinja2 +9 -0
  70. package/generator/pygen/preprocess/__init__.py +104 -13
  71. package/generator/pygen/utils.py +16 -0
  72. package/generator/pygen.egg-info/SOURCES.txt +2 -0
  73. package/package.json +5 -5
@@ -11,15 +11,32 @@ build-backend = "setuptools.build_meta"
11
11
  [project]
12
12
  name = "{{ options.get('package-name')|lower }}"
13
13
  {% if options.get('package-mode') %}
14
+ {% if KEEP_FIELDS and KEEP_FIELDS.get('project.authors') %}
15
+ authors = [
16
+ {% for author in KEEP_FIELDS.get('project.authors') %}
17
+ { {% for key, val in author.items() %}{{ key }} = {{ val|tojson }}{% if not loop.last %}, {% endif %}{% endfor %} },
18
+ {% endfor %}
19
+ ]
20
+ {% else %}
14
21
  authors = [
15
22
  { name = "{{ code_model.company_name }}"{% if code_model.is_azure_flavor %}, email = "azpysdkhelp@microsoft.com"{% endif %} },
16
23
  ]
17
- {% if options.get("azure-arm") %}
24
+ {% endif %}
25
+ {% if KEEP_FIELDS and KEEP_FIELDS.get('project.description') %}
26
+ description = {{ KEEP_FIELDS.get('project.description')|tojson }}
27
+ {% elif options.get("azure-arm") %}
18
28
  description = "Microsoft Azure {{ options.get('package-pprint-name') }} Client Library for Python"
19
29
  {% else %}
20
30
  description = "{{ code_model.company_name }} {% if code_model.is_azure_flavor and not options.get('package-pprint-name').startswith('Azure ') %}Azure {% endif %}{{ options.get('package-pprint-name') }} Client Library for Python"
21
31
  {% endif %}
22
32
  license = "MIT"
33
+ {% if KEEP_FIELDS and KEEP_FIELDS.get('project.classifiers') %}
34
+ classifiers = [
35
+ {% for classifier in KEEP_FIELDS.get('project.classifiers') %}
36
+ {{ classifier|tojson }},
37
+ {% endfor %}
38
+ ]
39
+ {% else %}
23
40
  classifiers = [
24
41
  "Development Status :: {{ dev_status }}",
25
42
  "Programming Language :: Python",
@@ -29,10 +46,15 @@ classifiers = [
29
46
  "Programming Language :: Python :: 3.{{ version }}",
30
47
  {% endfor %}
31
48
  ]
49
+ {% endif %}
32
50
  requires-python = ">={{ MIN_PYTHON_VERSION }}"
33
51
  {% else %}
52
+ {% if KEEP_FIELDS and KEEP_FIELDS.get('project.description') %}
53
+ description = {{ KEEP_FIELDS.get('project.description')|tojson }}
54
+ {% else %}
34
55
  description = "{{ options.get('package-name') }}"
35
56
  {% endif %}
57
+ {% endif %}
36
58
  {% if code_model.is_azure_flavor %}
37
59
  keywords = ["azure", "azure sdk"]
38
60
  {% endif %}
@@ -77,7 +99,13 @@ version = "{{ options.get("package-version", "unknown") }}"
77
99
  ]
78
100
  {% endfor %}
79
101
  {% endif %}
80
- {% if code_model.is_azure_flavor %}
102
+ {% if KEEP_FIELDS and KEEP_FIELDS.get('project.urls') %}
103
+
104
+ [project.urls]
105
+ {% for key, val in KEEP_FIELDS.get('project.urls').items() %}
106
+ {{ key }} = {{ val|tojson }}
107
+ {% endfor %}
108
+ {% elif code_model.is_azure_flavor %}
81
109
 
82
110
  [project.urls]
83
111
  repository = "https://github.com/Azure/azure-sdk-for-python"
@@ -4,6 +4,55 @@
4
4
  {% endif %}
5
5
 
6
6
  {{ imports }}
7
- {% for nu in code_model.named_unions %}
8
- {{nu.name}} = {{nu.type_definition()}}
7
+ {% import 'operation_tools.jinja2' as op_tools %}
8
+ {% import "macros.jinja2" as macros %}
9
+ {% for enum in literal_enums %}
10
+
11
+ {{ serializer.declare_literal_enum(enum) }}
12
+ {% if enum.yaml_data.get("description") %}
13
+ """{{ op_tools.wrap_string(enum.yaml_data["description"], "\n") }}"""
14
+ {% endif %}
15
+ {% endfor %}
16
+ {% for model in models %}
17
+ {% if serializer.has_keyword_wire_names(model) %}
18
+
19
+
20
+ {{ serializer.declare_functional_model(model) }}
21
+ {{ model.name }}.__doc__ = """{{ op_tools.wrap_string(model.description(is_operation_file=False), "\n") }}
22
+
23
+ {% if model.properties != None %}
24
+ {% for p in model.properties %}
25
+ {% for line in serializer.variable_documentation_string(p) %}
26
+ {{ macros.wrap_model_string(line, '\n') -}}
27
+ {% endfor %}
28
+ {% endfor %}
29
+ {% endif %}
30
+ """
31
+ {% else %}
32
+
33
+
34
+ {{ serializer.declare_model(model) }}
35
+ """{{ op_tools.wrap_string(model.description(is_operation_file=False), "\n ") }}
36
+
37
+ {% if model.properties != None %}
38
+ {% for p in model.properties %}
39
+ {% for line in serializer.variable_documentation_string(p) %}
40
+ {{ macros.wrap_model_string(line, '\n ') -}}
41
+ {% endfor %}
42
+ {% endfor %}
43
+ {% endif %}
44
+ """
45
+
46
+ {% set shadowed = serializer.get_shadowed_builtins(model) %}
47
+ {% for p in serializer.get_properties_to_declare(model)%}
48
+ {{ serializer.declare_property(p, shadowed) }}
49
+ {% set prop_description = p.description(is_operation_file=False).replace('"', '\\"') %}
50
+ {% if prop_description %}
51
+ """{{ macros.wrap_model_string(prop_description, '\n ', '\"\"\"') -}}
52
+ {% endif %}
53
+ {% endfor %}
54
+ {% endif %}
55
+ {% endfor %}
56
+ {% for model in discriminated_bases %}
57
+ {{ serializer.discriminated_subtypes_union(model) }}
9
58
  {% endfor %}
@@ -0,0 +1,9 @@
1
+ # coding=utf-8
2
+ {% if code_model.license_header %}
3
+ {{ code_model.license_header }}
4
+ {% endif %}
5
+
6
+ {{ imports }}
7
+ {% for nu in code_model.named_unions %}
8
+ {{nu.name}} = {{nu.type_definition()}}
9
+ {% endfor %}
@@ -22,6 +22,7 @@ from ..utils import (
22
22
  get_body_type_for_description,
23
23
  JSON_REGEXP,
24
24
  KNOWN_TYPES,
25
+ description_ends_with_code_block,
25
26
  )
26
27
 
27
28
 
@@ -93,6 +94,8 @@ def add_overloads_for_body_param(yaml_data: dict[str, Any]) -> None:
93
94
  continue
94
95
  if body_type.get("type") == "model" and body_type.get("base") == "json":
95
96
  yaml_data["overloads"].append(add_overload(yaml_data, body_type, for_flatten_params=True))
97
+ # Skip single-body JSON overload; the TypedDict overload replaces it
98
+ continue
96
99
  yaml_data["overloads"].append(add_overload(yaml_data, body_type))
97
100
  content_type_param = next(p for p in yaml_data["parameters"] if p["wireName"].lower() == "content-type")
98
101
  content_type_param["inOverload"] = False
@@ -108,7 +111,9 @@ def update_description(description: Optional[str], default_description: str = ""
108
111
  if not description:
109
112
  description = default_description
110
113
  description.rstrip(" ")
111
- if description and description[-1] != ".":
114
+ # Don't append a trailing period when the description ends with a code block: the
115
+ # period would land inside the rendered literal block (e.g. "]." ) and break Sphinx.
116
+ if description and description[-1] != "." and not description_ends_with_code_block(description):
112
117
  description += "."
113
118
  return description
114
119
 
@@ -301,6 +306,44 @@ class PreProcessPlugin(YamlUpdatePlugin):
301
306
  def is_tsp(self) -> bool:
302
307
  return self.options.get("tsp_file", False)
303
308
 
309
+ @staticmethod
310
+ def _find_existing_typeddict(code_model: dict[str, Any], cross_lang_id: Optional[str]) -> Optional[dict[str, Any]]:
311
+ """Find an existing typeddict copy with the given crossLanguageDefinitionId."""
312
+ if not cross_lang_id:
313
+ return None
314
+ return next(
315
+ (
316
+ t
317
+ for t in code_model["types"]
318
+ if t.get("type") == "model"
319
+ and t.get("base") == "typeddict"
320
+ and t.get("crossLanguageDefinitionId") == cross_lang_id
321
+ ),
322
+ None,
323
+ )
324
+
325
+ @staticmethod
326
+ def _insert_typeddict_overload(
327
+ code_model: dict[str, Any],
328
+ body_parameter: dict[str, Any],
329
+ source: dict[str, Any],
330
+ origin_type: str,
331
+ existing_td: Optional[dict[str, Any]],
332
+ ) -> None:
333
+ """Insert a typeddict type into the body parameter's combined types."""
334
+ if origin_type == "model":
335
+ td_type = existing_td or {**source, "base": "typeddict"}
336
+ body_parameter["type"]["types"].insert(1, td_type)
337
+ if not existing_td:
338
+ code_model["types"].append(td_type)
339
+ else:
340
+ td_list_or_dict = copy.deepcopy(body_parameter["type"]["types"][0])
341
+ td_elem = existing_td or {**source, "base": "typeddict"}
342
+ td_list_or_dict["elementType"] = td_elem
343
+ body_parameter["type"]["types"].insert(1, td_list_or_dict)
344
+ if not existing_td:
345
+ code_model["types"].append(td_elem)
346
+
304
347
  def add_body_param_type(
305
348
  self,
306
349
  code_model: dict[str, Any],
@@ -319,25 +362,65 @@ class PreProcessPlugin(YamlUpdatePlugin):
319
362
  body_parameter["type"] if origin_type == "model" else body_parameter["type"].get("elementType", {})
320
363
  )
321
364
  is_dpg_model = model_type.get("base") == "dpg"
365
+ is_json_model = model_type.get("base") == "json"
366
+ is_typeddict_only = self.options["models-mode"] == "typeddict"
367
+
322
368
  body_parameter["type"] = {
323
369
  "type": "combined",
324
370
  "types": [body_parameter["type"]],
325
371
  }
326
- # don't add binary overload for multipart content type
327
- if not (self.is_tsp and has_multi_part_content_type(body_parameter)):
372
+ # don't add binary overload for multipart content type or typeddict-only mode
373
+ if not (self.is_tsp and has_multi_part_content_type(body_parameter)) and not is_typeddict_only:
328
374
  body_parameter["type"]["types"].append(KNOWN_TYPES["binary"])
329
375
 
376
+ # Add typeddict overload for non-spread dpg models
330
377
  if self.options["models-mode"] == "dpg" and is_dpg_model:
331
- if origin_type == "model":
332
- body_parameter["type"]["types"].insert(1, KNOWN_TYPES["any-object"])
378
+ cross_lang_id = model_type.get("crossLanguageDefinitionId")
379
+ existing_td = self._find_existing_typeddict(code_model, cross_lang_id)
380
+ self._insert_typeddict_overload(code_model, body_parameter, model_type, origin_type, existing_td)
381
+
382
+ # For spread bodies (json base), add a typeddict overload that references
383
+ # the original model. This replaces the JSON single-body overload.
384
+ if is_json_model:
385
+ cross_lang_id = model_type.get("crossLanguageDefinitionId")
386
+ original = None
387
+ if cross_lang_id:
388
+ original = next(
389
+ (
390
+ t
391
+ for t in code_model["types"]
392
+ if t.get("type") == "model"
393
+ and t.get("crossLanguageDefinitionId") == cross_lang_id
394
+ and t is not model_type
395
+ ),
396
+ None,
397
+ )
398
+
399
+ if is_typeddict_only and original:
400
+ # In typeddict-only mode, the original dpg model already renders
401
+ # as a TypedDict — reference it directly, no copy needed.
402
+ if origin_type == "model":
403
+ body_parameter["type"]["types"].insert(1, original)
404
+ else:
405
+ td_list_or_dict = copy.deepcopy(body_parameter["type"]["types"][0])
406
+ td_list_or_dict["elementType"] = original
407
+ body_parameter["type"]["types"].insert(1, td_list_or_dict)
333
408
  else:
334
- # dict or list
335
- # copy the original dict / list type
336
- any_obj_list_or_dict = copy.deepcopy(body_parameter["type"]["types"][0])
337
- any_obj_list_or_dict["elementType"] = KNOWN_TYPES["any-object"]
338
- body_parameter["type"]["types"].insert(1, any_obj_list_or_dict)
409
+ source = original or model_type
410
+ existing_td = self._find_existing_typeddict(code_model, cross_lang_id)
411
+ self._insert_typeddict_overload(code_model, body_parameter, source, origin_type, existing_td)
412
+
413
+ if len(body_parameter["type"]["types"]) == 1:
414
+ # Only one body variant remains (e.g. typeddict-only mode where the
415
+ # binary and JSON overloads are omitted). Collapse the combined
416
+ # wrapper back to the single type so we don't emit a lone
417
+ # ``@overload`` (mypy rejects a single overload definition).
418
+ body_parameter["type"] = body_parameter["type"]["types"][0]
419
+ return
420
+
339
421
  code_model["types"].append(body_parameter["type"])
340
422
 
423
+
341
424
  def pad_reserved_words(self, name: str, pad_type: PadType, yaml_type: dict[str, Any]) -> str:
342
425
  # we want to pad hidden variables as well
343
426
  if not name:
@@ -485,7 +568,11 @@ class PreProcessPlugin(YamlUpdatePlugin):
485
568
  if yaml_data.get("isLroInitialOperation") is True:
486
569
  yaml_data["name"] = (
487
570
  "_"
488
- + self.pad_reserved_words(extract_original_name(yaml_data["name"]), PadType.METHOD, yaml_data)
571
+ + self.pad_reserved_words(
572
+ extract_original_name(yaml_data["name"]),
573
+ PadType.METHOD,
574
+ yaml_data,
575
+ )
489
576
  + "_initial"
490
577
  )
491
578
  else:
@@ -576,7 +663,9 @@ class PreProcessPlugin(YamlUpdatePlugin):
576
663
  item_type = item_type or yaml_data["itemType"]["elementType"]
577
664
  if yaml_data.get("nextOperation"):
578
665
  yaml_data["nextOperation"]["groupName"] = self.pad_reserved_words(
579
- yaml_data["nextOperation"]["groupName"], PadType.OPERATION_GROUP, yaml_data["nextOperation"]
666
+ yaml_data["nextOperation"]["groupName"],
667
+ PadType.OPERATION_GROUP,
668
+ yaml_data["nextOperation"],
580
669
  )
581
670
  yaml_data["nextOperation"]["groupName"] = to_snake_case(yaml_data["nextOperation"]["groupName"])
582
671
  for response in yaml_data["nextOperation"].get("responses", []):
@@ -598,7 +687,9 @@ class PreProcessPlugin(YamlUpdatePlugin):
598
687
  )
599
688
  operation_group["identifyName"] = to_snake_case(operation_group["identifyName"])
600
689
  operation_group["propertyName"] = self.pad_reserved_words(
601
- operation_group["propertyName"], PadType.OPERATION_GROUP, operation_group
690
+ operation_group["propertyName"],
691
+ PadType.OPERATION_GROUP,
692
+ operation_group,
602
693
  )
603
694
  operation_group["propertyName"] = to_snake_case(operation_group["propertyName"])
604
695
  operation_group["className"] = update_operation_group_class_name(
@@ -11,6 +11,22 @@ SWAGGER_PACKAGE_MODE = ["mgmtplane", "dataplane"] # for backward compatibility
11
11
  TYPESPEC_PACKAGE_MODE = ["azure-mgmt", "azure-dataplane", "generic"]
12
12
  VALID_PACKAGE_MODE = SWAGGER_PACKAGE_MODE + TYPESPEC_PACKAGE_MODE
13
13
 
14
+ CODE_BLOCK_MARKER = ".. code-block::"
15
+
16
+
17
+ def description_ends_with_code_block(description: str) -> bool:
18
+ """Return True when the description's trailing content is an RST ``.. code-block::``.
19
+
20
+ True when the last ``.. code-block::`` directive (starting its own line, so inline
21
+ mentions are ignored) is followed only by blank or indented lines, i.e. the literal
22
+ block runs to the end of the description.
23
+ """
24
+ lines = description.rstrip().splitlines()
25
+ directives = [i for i, line in enumerate(lines) if line.lstrip().startswith(CODE_BLOCK_MARKER)]
26
+ if not directives:
27
+ return False
28
+ return all(not line.strip() or line.startswith((" ", "\t")) for line in lines[directives[-1] + 1 :])
29
+
14
30
 
15
31
  def update_enum_value(name: str, value: Any, description: str, enum_type: dict[str, Any]) -> dict[str, Any]:
16
32
  return {
@@ -56,6 +56,7 @@ pygen/codegen/serializers/request_builders_serializer.py
56
56
  pygen/codegen/serializers/sample_serializer.py
57
57
  pygen/codegen/serializers/test_serializer.py
58
58
  pygen/codegen/serializers/types_serializer.py
59
+ pygen/codegen/serializers/unions_serializer.py
59
60
  pygen/codegen/serializers/utils.py
60
61
  pygen/codegen/templates/client.py.jinja2
61
62
  pygen/codegen/templates/client_container.py.jinja2
@@ -90,6 +91,7 @@ pygen/codegen/templates/serialization.py.jinja2
90
91
  pygen/codegen/templates/test.py.jinja2
91
92
  pygen/codegen/templates/testpreparer.py.jinja2
92
93
  pygen/codegen/templates/types.py.jinja2
94
+ pygen/codegen/templates/unions.py.jinja2
93
95
  pygen/codegen/templates/utils.py.jinja2
94
96
  pygen/codegen/templates/validation.py.jinja2
95
97
  pygen/codegen/templates/version.py.jinja2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@typespec/http-client-python",
3
- "version": "0.32.0",
3
+ "version": "0.34.0",
4
4
  "author": "Microsoft Corporation",
5
5
  "description": "TypeSpec emitter for Python SDKs",
6
6
  "homepage": "https://typespec.io",
@@ -68,7 +68,7 @@
68
68
  "@azure-tools/typespec-azure-core": ">=0.69.0 <1.0.0",
69
69
  "@azure-tools/typespec-azure-resource-manager": ">=0.69.1 <1.0.0",
70
70
  "@azure-tools/typespec-azure-rulesets": ">=0.69.1 <1.0.0",
71
- "@azure-tools/typespec-client-generator-core": ">=0.69.0 <1.0.0",
71
+ "@azure-tools/typespec-client-generator-core": ">=0.69.1 <1.0.0",
72
72
  "@typespec/compiler": "^1.13.0",
73
73
  "@typespec/http": "^1.13.0",
74
74
  "@typespec/openapi": "^1.13.0",
@@ -95,7 +95,7 @@
95
95
  ]
96
96
  },
97
97
  "dependencies": {
98
- "js-yaml": "~4.1.0",
98
+ "js-yaml": "^4.2.0",
99
99
  "marked": "^15.0.6",
100
100
  "pyodide": "0.26.2",
101
101
  "semver": "~7.6.2",
@@ -106,7 +106,7 @@
106
106
  "@azure-tools/typespec-azure-core": "~0.69.0",
107
107
  "@azure-tools/typespec-azure-resource-manager": "~0.69.1",
108
108
  "@azure-tools/typespec-azure-rulesets": "~0.69.1",
109
- "@azure-tools/typespec-client-generator-core": "~0.69.0",
109
+ "@azure-tools/typespec-client-generator-core": "~0.69.1",
110
110
  "@azure-tools/azure-http-specs": "0.1.0-alpha.42",
111
111
  "@typespec/compiler": "^1.13.0",
112
112
  "@typespec/http": "^1.13.0",
@@ -119,7 +119,7 @@
119
119
  "@typespec/sse": "~0.83.0",
120
120
  "@typespec/streams": "~0.83.0",
121
121
  "@typespec/xml": "~0.83.0",
122
- "@typespec/http-specs": "0.1.0-alpha.39-dev.1",
122
+ "@typespec/http-specs": "0.1.0-alpha.39-dev.2",
123
123
  "@types/js-yaml": "~4.0.5",
124
124
  "@types/node": "~25.0.2",
125
125
  "@types/semver": "7.5.8",