@typespec/http-client-python 0.34.0 → 0.34.2
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/README.md +25 -3
- package/dist/emitter/emitter.d.ts.map +1 -1
- package/dist/emitter/emitter.js +2 -11
- package/dist/emitter/emitter.js.map +1 -1
- package/dist/emitter/external-process.d.ts +14 -0
- package/dist/emitter/external-process.d.ts.map +1 -1
- package/dist/emitter/external-process.js +17 -1
- package/dist/emitter/external-process.js.map +1 -1
- package/dist/emitter/lib.js +1 -1
- package/dist/emitter/lib.js.map +1 -1
- package/dist/emitter/node-runner.d.ts.map +1 -1
- package/dist/emitter/node-runner.js +2 -1
- package/dist/emitter/node-runner.js.map +1 -1
- package/dist/emitter/utils.d.ts +10 -0
- package/dist/emitter/utils.d.ts.map +1 -1
- package/dist/emitter/utils.js +12 -0
- package/dist/emitter/utils.js.map +1 -1
- package/emitter/src/emitter.ts +2 -14
- package/emitter/src/external-process.ts +18 -1
- package/emitter/src/lib.ts +1 -1
- package/emitter/src/node-runner.ts +2 -1
- package/emitter/src/utils.ts +13 -0
- package/emitter/temp/tsconfig.tsbuildinfo +1 -1
- package/emitter/test/external-process.test.ts +28 -0
- package/emitter/test/utils.test.ts +12 -1
- package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
- package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
- package/generator/build/lib/pygen/__init__.py +2 -0
- package/generator/build/lib/pygen/codegen/models/enum_type.py +7 -0
- package/generator/build/lib/pygen/codegen/models/model_type.py +4 -0
- package/generator/build/lib/pygen/codegen/serializers/types_serializer.py +105 -12
- package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +10 -9
- package/generator/build/lib/pygen/preprocess/__init__.py +55 -17
- package/generator/component-detection-pip-report.json +9 -9
- package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
- package/generator/pygen/__init__.py +2 -0
- package/generator/pygen/codegen/models/enum_type.py +7 -0
- package/generator/pygen/codegen/models/model_type.py +4 -0
- package/generator/pygen/codegen/serializers/types_serializer.py +105 -12
- package/generator/pygen/codegen/templates/model_base.py.jinja2 +10 -9
- package/generator/pygen/preprocess/__init__.py +55 -17
- package/package.json +33 -33
|
@@ -5,7 +5,8 @@
|
|
|
5
5
|
# --------------------------------------------------------------------------
|
|
6
6
|
import keyword
|
|
7
7
|
import re
|
|
8
|
-
from
|
|
8
|
+
from functools import cached_property
|
|
9
|
+
from typing import Any, Optional
|
|
9
10
|
from ..models import ModelType, CodeModel
|
|
10
11
|
from ..models.enum_type import EnumType
|
|
11
12
|
from ..models.imports import FileImport, ImportType
|
|
@@ -71,28 +72,114 @@ class TypesSerializer(BaseSerializer):
|
|
|
71
72
|
values = [enum.get_declaration(v.value) for v in enum.values]
|
|
72
73
|
return f"{enum.name} = Literal[{', '.join(values)}]"
|
|
73
74
|
|
|
75
|
+
@staticmethod
|
|
76
|
+
def _renders_as_input_typeddict(m: "ModelType") -> bool:
|
|
77
|
+
"""Whether a non-json model is a *seed* for the types.py input surface.
|
|
78
|
+
|
|
79
|
+
TypedDicts (and discriminated-base union aliases) in ``types.py`` describe request-body
|
|
80
|
+
(*input*) shapes. Output-only models already render as classes in ``models/`` and are
|
|
81
|
+
referenced via ``_models.*``, so a response-only model that nothing input references would be
|
|
82
|
+
dead code. A model seeds the input surface when it is:
|
|
83
|
+
|
|
84
|
+
* a typeddict copy (``base == "typeddict"``) — these only exist as input body overloads
|
|
85
|
+
(their ``usage`` may carry ``Spread``/``Json`` rather than ``Input``), or
|
|
86
|
+
* ``is_typed_dict_only`` — includes every model in full ``typeddict`` mode (responses too),
|
|
87
|
+
and input-only anonymous bodies, or
|
|
88
|
+
* used as input (``is_usage_input``) — e.g. a model shared between request and response.
|
|
89
|
+
|
|
90
|
+
The full set rendered in types.py is the transitive closure of these seeds over base
|
|
91
|
+
classes, discriminated subtypes and property types (see :attr:`_types_file_model_names`), so
|
|
92
|
+
an output-only model that *is* referenced by an input model (e.g. ARM ``SystemData`` on
|
|
93
|
+
``Resource``) is still rendered.
|
|
94
|
+
"""
|
|
95
|
+
return m.base == "typeddict" or m.is_typed_dict_only or m.is_usage_input
|
|
96
|
+
|
|
97
|
+
@staticmethod
|
|
98
|
+
def _iter_referenced_models(base_type: Any):
|
|
99
|
+
"""Yield ModelType instances directly referenced by a type, recursing through containers.
|
|
100
|
+
|
|
101
|
+
Handles list/dict ``element_type``, constant/enum ``value_type`` and combined ``types``.
|
|
102
|
+
A referenced ModelType is yielded but not descended into — the closure walk descends into a
|
|
103
|
+
model's own properties/parents/subtypes when that model is itself visited.
|
|
104
|
+
"""
|
|
105
|
+
stack = [base_type]
|
|
106
|
+
seen: set[int] = set()
|
|
107
|
+
while stack:
|
|
108
|
+
t = stack.pop()
|
|
109
|
+
if t is None or id(t) in seen:
|
|
110
|
+
continue
|
|
111
|
+
seen.add(id(t))
|
|
112
|
+
if isinstance(t, ModelType):
|
|
113
|
+
yield t
|
|
114
|
+
continue
|
|
115
|
+
for attr in ("element_type", "value_type"):
|
|
116
|
+
child = getattr(t, attr, None)
|
|
117
|
+
if child is not None:
|
|
118
|
+
stack.append(child)
|
|
119
|
+
for child in getattr(t, "types", []) or []:
|
|
120
|
+
stack.append(child)
|
|
121
|
+
|
|
122
|
+
@cached_property
|
|
123
|
+
def _types_file_model_names(self) -> set[str]:
|
|
124
|
+
"""Names of every model that must be rendered in types.py.
|
|
125
|
+
|
|
126
|
+
Starts from the input seeds (:meth:`_renders_as_input_typeddict`) and takes the transitive
|
|
127
|
+
closure over base classes, discriminated subtypes and property types. Keyed on model
|
|
128
|
+
``name`` (dpg models and their typeddict copies share a name and render as one TypedDict), so
|
|
129
|
+
the result is stable regardless of which copy a reference points at.
|
|
130
|
+
|
|
131
|
+
Cached: the closure is a full walk over the model graph and is read several times per file
|
|
132
|
+
(via :attr:`typeddict_models` and :attr:`discriminated_base_models`). ``self._models`` is set
|
|
133
|
+
once at construction and never mutated, so memoizing on the instance is safe.
|
|
134
|
+
"""
|
|
135
|
+
needed: set[str] = set()
|
|
136
|
+
stack = [m for m in self._models if m.base != "json" and self._renders_as_input_typeddict(m)]
|
|
137
|
+
while stack:
|
|
138
|
+
m = stack.pop()
|
|
139
|
+
if m.base == "json" or m.name in needed:
|
|
140
|
+
continue
|
|
141
|
+
needed.add(m.name)
|
|
142
|
+
stack.extend(m.parents)
|
|
143
|
+
stack.extend(m.discriminated_subtypes.values())
|
|
144
|
+
for prop in m.properties:
|
|
145
|
+
stack.extend(self._iter_referenced_models(prop.type))
|
|
146
|
+
return needed
|
|
147
|
+
|
|
74
148
|
@property
|
|
75
149
|
def typeddict_models(self) -> list[ModelType]:
|
|
76
150
|
"""Models that should be rendered as TypedDicts (excluding discriminated bases which become unions).
|
|
77
151
|
|
|
78
|
-
When both a dpg model and its typeddict copy exist
|
|
152
|
+
When both a dpg model and its typeddict copy exist for the same model,
|
|
79
153
|
prefer the dpg model (it already renders as a TypedDict in types.py) and skip the copy.
|
|
154
|
+
|
|
155
|
+
The pairing is keyed on the model ``name`` (the copy is a shallow copy of the source, so it
|
|
156
|
+
shares the source's name). ``crossLanguageDefinitionId`` cannot be used here: template
|
|
157
|
+
instantiated models such as ``ResourceUpdateModel<Foo, FooProperties>`` all share the
|
|
158
|
+
template's cross-language id, so keying on it would wrongly collapse distinct models
|
|
159
|
+
(e.g. ``CacheUpdate`` and ``VolumeUpdate``) into one and drop the rest from types.py.
|
|
160
|
+
|
|
161
|
+
Only models in the input-surface closure (:attr:`_types_file_model_names`) are rendered, so
|
|
162
|
+
response-only models (e.g. ``GetResponse``) are dropped while models reachable from an input
|
|
163
|
+
model — including output-only ones such as a discriminated subtype or an ARM ``SystemData``
|
|
164
|
+
property — are kept, ensuring no forward reference is left undefined.
|
|
80
165
|
"""
|
|
81
|
-
|
|
82
|
-
|
|
166
|
+
needed = self._types_file_model_names
|
|
167
|
+
candidates = [
|
|
168
|
+
m for m in self._models if m.base != "json" and not m.discriminated_subtypes and m.name in needed
|
|
169
|
+
]
|
|
170
|
+
seen_names: dict[str, "ModelType"] = {}
|
|
83
171
|
result: list["ModelType"] = []
|
|
84
172
|
for m in candidates:
|
|
85
|
-
|
|
86
|
-
if
|
|
173
|
+
name = m.name
|
|
174
|
+
if name in seen_names:
|
|
87
175
|
# Prefer the dpg model over the typeddict copy
|
|
88
|
-
if m.base == "dpg" and
|
|
176
|
+
if m.base == "dpg" and seen_names[name].base == "typeddict":
|
|
89
177
|
# Replace the typeddict copy with the dpg model
|
|
90
|
-
result = [r if r is not
|
|
91
|
-
|
|
178
|
+
result = [r if r is not seen_names[name] else m for r in result]
|
|
179
|
+
seen_names[name] = m
|
|
92
180
|
# Otherwise skip this duplicate
|
|
93
181
|
continue
|
|
94
|
-
|
|
95
|
-
seen_ids[clid] = m
|
|
182
|
+
seen_names[name] = m
|
|
96
183
|
result.append(m)
|
|
97
184
|
return result
|
|
98
185
|
|
|
@@ -100,10 +187,16 @@ class TypesSerializer(BaseSerializer):
|
|
|
100
187
|
def discriminated_base_models(self) -> list[ModelType]:
|
|
101
188
|
"""Discriminated base models that become Union type aliases in types.py.
|
|
102
189
|
|
|
190
|
+
Only bases in the input-surface closure (:attr:`_types_file_model_names`) are emitted: an
|
|
191
|
+
output-only ``Dinosaur = Union[TRex]`` alias is dead code and would reference subtype
|
|
192
|
+
TypedDicts that are themselves (correctly) omitted from types.py, causing a ``NameError`` at
|
|
193
|
+
import time.
|
|
194
|
+
|
|
103
195
|
Topologically sorted so that nested discriminated bases (e.g. Shark)
|
|
104
196
|
are defined before their parents (e.g. Fish = Union[Salmon, Shark]).
|
|
105
197
|
"""
|
|
106
|
-
|
|
198
|
+
needed = self._types_file_model_names
|
|
199
|
+
bases = [m for m in self._models if m.base != "json" and m.discriminated_subtypes and m.name in needed]
|
|
107
200
|
base_names = {m.name for m in bases}
|
|
108
201
|
sorted_bases: list[ModelType] = []
|
|
109
202
|
visited: set[str] = set()
|
|
@@ -470,21 +470,21 @@ class _MyMutableMapping(MutableMapping[str, typing.Any]):
|
|
|
470
470
|
|
|
471
471
|
def keys(self) -> typing.KeysView[str]:
|
|
472
472
|
"""
|
|
473
|
-
:returns: a set-like object providing a view on
|
|
473
|
+
:returns: a set-like object providing a view on the mapping's keys
|
|
474
474
|
:rtype: ~typing.KeysView
|
|
475
475
|
"""
|
|
476
476
|
return self._data.keys()
|
|
477
477
|
|
|
478
478
|
def values(self) -> typing.ValuesView[typing.Any]:
|
|
479
479
|
"""
|
|
480
|
-
:returns: an object providing a view on
|
|
480
|
+
:returns: an object providing a view on the mapping's values
|
|
481
481
|
:rtype: ~typing.ValuesView
|
|
482
482
|
"""
|
|
483
483
|
return self._data.values()
|
|
484
484
|
|
|
485
485
|
def items(self) -> typing.ItemsView[str, typing.Any]:
|
|
486
486
|
"""
|
|
487
|
-
:returns: set-like object providing a view on
|
|
487
|
+
:returns: a set-like object providing a view on the mapping's items
|
|
488
488
|
:rtype: ~typing.ItemsView
|
|
489
489
|
"""
|
|
490
490
|
return self._data.items()
|
|
@@ -494,7 +494,7 @@ class _MyMutableMapping(MutableMapping[str, typing.Any]):
|
|
|
494
494
|
Get the value for key if key is in the dictionary, else default.
|
|
495
495
|
:param str key: The key to look up.
|
|
496
496
|
:param any default: The value to return if key is not in the dictionary. Defaults to None
|
|
497
|
-
:returns:
|
|
497
|
+
:returns: The value for key if key is in the dictionary, else default.
|
|
498
498
|
:rtype: any
|
|
499
499
|
"""
|
|
500
500
|
try:
|
|
@@ -529,19 +529,19 @@ class _MyMutableMapping(MutableMapping[str, typing.Any]):
|
|
|
529
529
|
Removes and returns some (key, value) pair
|
|
530
530
|
:returns: The (key, value) pair.
|
|
531
531
|
:rtype: tuple
|
|
532
|
-
:raises KeyError: if
|
|
532
|
+
:raises KeyError: if the dictionary is empty.
|
|
533
533
|
"""
|
|
534
534
|
return self._data.popitem()
|
|
535
535
|
|
|
536
536
|
def clear(self) -> None:
|
|
537
537
|
"""
|
|
538
|
-
Remove all items from
|
|
538
|
+
Remove all items from the dictionary.
|
|
539
539
|
"""
|
|
540
540
|
self._data.clear()
|
|
541
541
|
|
|
542
542
|
def update(self, *args: typing.Any, **kwargs: typing.Any) -> None: # pylint: disable=arguments-differ
|
|
543
543
|
"""
|
|
544
|
-
|
|
544
|
+
Update the dictionary from a mapping or an iterable of key-value pairs.
|
|
545
545
|
:param any args: Either a mapping object or an iterable of key-value pairs.
|
|
546
546
|
"""
|
|
547
547
|
self._data.update(*args, **kwargs)
|
|
@@ -554,10 +554,11 @@ class _MyMutableMapping(MutableMapping[str, typing.Any]):
|
|
|
554
554
|
|
|
555
555
|
def setdefault(self, key: str, default: typing.Any = _UNSET) -> typing.Any:
|
|
556
556
|
"""
|
|
557
|
-
|
|
557
|
+
Return the value for key if key is in the dictionary; otherwise set the key to
|
|
558
|
+
default and return default.
|
|
558
559
|
:param str key: The key to look up.
|
|
559
560
|
:param any default: The value to set if key is not in the dictionary
|
|
560
|
-
:returns:
|
|
561
|
+
:returns: The value for key if key is in the dictionary, else default.
|
|
561
562
|
:rtype: any
|
|
562
563
|
"""
|
|
563
564
|
if default is _UNSET:
|
|
@@ -307,8 +307,18 @@ class PreProcessPlugin(YamlUpdatePlugin):
|
|
|
307
307
|
return self.options.get("tsp_file", False)
|
|
308
308
|
|
|
309
309
|
@staticmethod
|
|
310
|
-
def _find_existing_typeddict(
|
|
311
|
-
|
|
310
|
+
def _find_existing_typeddict(
|
|
311
|
+
code_model: dict[str, Any],
|
|
312
|
+
cross_lang_id: Optional[str],
|
|
313
|
+
name: Optional[str] = None,
|
|
314
|
+
) -> Optional[dict[str, Any]]:
|
|
315
|
+
"""Find an existing typeddict copy for the given model.
|
|
316
|
+
|
|
317
|
+
Matches on both ``crossLanguageDefinitionId`` and ``name``. The name is required because
|
|
318
|
+
template-instantiated models (e.g. ``ResourceUpdateModel<Foo, FooProperties>``) all share
|
|
319
|
+
the template's cross-language id, so matching on the id alone would reuse one model's copy
|
|
320
|
+
(e.g. ``CacheUpdate``) for a different model (e.g. ``VolumeUpdate``).
|
|
321
|
+
"""
|
|
312
322
|
if not cross_lang_id:
|
|
313
323
|
return None
|
|
314
324
|
return next(
|
|
@@ -318,10 +328,50 @@ class PreProcessPlugin(YamlUpdatePlugin):
|
|
|
318
328
|
if t.get("type") == "model"
|
|
319
329
|
and t.get("base") == "typeddict"
|
|
320
330
|
and t.get("crossLanguageDefinitionId") == cross_lang_id
|
|
331
|
+
and (name is None or t.get("name") == name)
|
|
321
332
|
),
|
|
322
333
|
None,
|
|
323
334
|
)
|
|
324
335
|
|
|
336
|
+
@staticmethod
|
|
337
|
+
def _find_spread_original(code_model: dict[str, Any], json_model: dict[str, Any]) -> Optional[dict[str, Any]]:
|
|
338
|
+
"""Recover the dpg model that a spread (json) body was cloned from.
|
|
339
|
+
|
|
340
|
+
When a spread body type is also used elsewhere, the emitter clones it, renames the clone to
|
|
341
|
+
``<Method>Request`` and sets ``base = "json"`` while keeping the original
|
|
342
|
+
``crossLanguageDefinitionId``. To reference the real model's TypedDict we look the clone up
|
|
343
|
+
by that id.
|
|
344
|
+
|
|
345
|
+
Distinct template-instantiated models share a single ``crossLanguageDefinitionId``, so an id
|
|
346
|
+
match alone is ambiguous. We only reuse an original when the choice is unambiguous:
|
|
347
|
+
|
|
348
|
+
* a dpg candidate whose ``name`` equals the json model's name (the body was not renamed), or
|
|
349
|
+
* exactly one dpg candidate carries the id.
|
|
350
|
+
|
|
351
|
+
Otherwise we return ``None`` so the caller falls back to the json model itself, avoiding a
|
|
352
|
+
reference to the wrong model's TypedDict.
|
|
353
|
+
"""
|
|
354
|
+
cross_lang_id = json_model.get("crossLanguageDefinitionId")
|
|
355
|
+
if not cross_lang_id:
|
|
356
|
+
return None
|
|
357
|
+
candidates = [
|
|
358
|
+
t
|
|
359
|
+
for t in code_model["types"]
|
|
360
|
+
if t.get("type") == "model"
|
|
361
|
+
and t.get("base") == "dpg"
|
|
362
|
+
and t.get("crossLanguageDefinitionId") == cross_lang_id
|
|
363
|
+
and t is not json_model
|
|
364
|
+
]
|
|
365
|
+
if not candidates:
|
|
366
|
+
return None
|
|
367
|
+
name = json_model.get("name")
|
|
368
|
+
for candidate in candidates:
|
|
369
|
+
if candidate.get("name") == name:
|
|
370
|
+
return candidate
|
|
371
|
+
if len(candidates) == 1:
|
|
372
|
+
return candidates[0]
|
|
373
|
+
return None
|
|
374
|
+
|
|
325
375
|
@staticmethod
|
|
326
376
|
def _insert_typeddict_overload(
|
|
327
377
|
code_model: dict[str, Any],
|
|
@@ -376,25 +426,14 @@ class PreProcessPlugin(YamlUpdatePlugin):
|
|
|
376
426
|
# Add typeddict overload for non-spread dpg models
|
|
377
427
|
if self.options["models-mode"] == "dpg" and is_dpg_model:
|
|
378
428
|
cross_lang_id = model_type.get("crossLanguageDefinitionId")
|
|
379
|
-
existing_td = self._find_existing_typeddict(code_model, cross_lang_id)
|
|
429
|
+
existing_td = self._find_existing_typeddict(code_model, cross_lang_id, model_type.get("name"))
|
|
380
430
|
self._insert_typeddict_overload(code_model, body_parameter, model_type, origin_type, existing_td)
|
|
381
431
|
|
|
382
432
|
# For spread bodies (json base), add a typeddict overload that references
|
|
383
433
|
# the original model. This replaces the JSON single-body overload.
|
|
384
434
|
if is_json_model:
|
|
385
435
|
cross_lang_id = model_type.get("crossLanguageDefinitionId")
|
|
386
|
-
original =
|
|
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
|
-
)
|
|
436
|
+
original = self._find_spread_original(code_model, model_type)
|
|
398
437
|
|
|
399
438
|
if is_typeddict_only and original:
|
|
400
439
|
# In typeddict-only mode, the original dpg model already renders
|
|
@@ -407,7 +446,7 @@ class PreProcessPlugin(YamlUpdatePlugin):
|
|
|
407
446
|
body_parameter["type"]["types"].insert(1, td_list_or_dict)
|
|
408
447
|
else:
|
|
409
448
|
source = original or model_type
|
|
410
|
-
existing_td = self._find_existing_typeddict(code_model, cross_lang_id)
|
|
449
|
+
existing_td = self._find_existing_typeddict(code_model, cross_lang_id, source.get("name"))
|
|
411
450
|
self._insert_typeddict_overload(code_model, body_parameter, source, origin_type, existing_td)
|
|
412
451
|
|
|
413
452
|
if len(body_parameter["type"]["types"]) == 1:
|
|
@@ -420,7 +459,6 @@ class PreProcessPlugin(YamlUpdatePlugin):
|
|
|
420
459
|
|
|
421
460
|
code_model["types"].append(body_parameter["type"])
|
|
422
461
|
|
|
423
|
-
|
|
424
462
|
def pad_reserved_words(self, name: str, pad_type: PadType, yaml_type: dict[str, Any]) -> str:
|
|
425
463
|
# we want to pad hidden variables as well
|
|
426
464
|
if not name:
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@typespec/http-client-python",
|
|
3
|
-
"version": "0.34.
|
|
3
|
+
"version": "0.34.2",
|
|
4
4
|
"author": "Microsoft Corporation",
|
|
5
5
|
"description": "TypeSpec emitter for Python SDKs",
|
|
6
6
|
"homepage": "https://typespec.io",
|
|
@@ -64,20 +64,20 @@
|
|
|
64
64
|
"emitter"
|
|
65
65
|
],
|
|
66
66
|
"peerDependencies": {
|
|
67
|
-
"@azure-tools/typespec-autorest": ">=0.
|
|
68
|
-
"@azure-tools/typespec-azure-core": ">=0.
|
|
69
|
-
"@azure-tools/typespec-azure-resource-manager": ">=0.
|
|
70
|
-
"@azure-tools/typespec-azure-rulesets": ">=0.
|
|
71
|
-
"@azure-tools/typespec-client-generator-core": ">=0.
|
|
72
|
-
"@typespec/compiler": "^1.
|
|
73
|
-
"@typespec/http": "^1.
|
|
74
|
-
"@typespec/openapi": "^1.
|
|
75
|
-
"@typespec/rest": ">=0.
|
|
76
|
-
"@typespec/versioning": ">=0.
|
|
77
|
-
"@typespec/events": ">=0.
|
|
78
|
-
"@typespec/sse": ">=0.
|
|
79
|
-
"@typespec/streams": ">=0.
|
|
80
|
-
"@typespec/xml": ">=0.
|
|
67
|
+
"@azure-tools/typespec-autorest": ">=0.70.0 <1.0.0",
|
|
68
|
+
"@azure-tools/typespec-azure-core": ">=0.70.0 <1.0.0",
|
|
69
|
+
"@azure-tools/typespec-azure-resource-manager": ">=0.70.0 <1.0.0",
|
|
70
|
+
"@azure-tools/typespec-azure-rulesets": ">=0.70.0 <1.0.0",
|
|
71
|
+
"@azure-tools/typespec-client-generator-core": ">=0.70.0 <1.0.0",
|
|
72
|
+
"@typespec/compiler": "^1.14.0",
|
|
73
|
+
"@typespec/http": "^1.14.0",
|
|
74
|
+
"@typespec/openapi": "^1.14.0",
|
|
75
|
+
"@typespec/rest": ">=0.84.0 <1.0.0",
|
|
76
|
+
"@typespec/versioning": ">=0.84.0 <1.0.0",
|
|
77
|
+
"@typespec/events": ">=0.84.0 <1.0.0",
|
|
78
|
+
"@typespec/sse": ">=0.84.0 <1.0.0",
|
|
79
|
+
"@typespec/streams": ">=0.84.0 <1.0.0",
|
|
80
|
+
"@typespec/xml": ">=0.84.0 <1.0.0"
|
|
81
81
|
},
|
|
82
82
|
"playgroundConfig": {
|
|
83
83
|
"assets": [
|
|
@@ -102,24 +102,24 @@
|
|
|
102
102
|
"tsx": "^4.21.0"
|
|
103
103
|
},
|
|
104
104
|
"devDependencies": {
|
|
105
|
-
"@azure-tools/typespec-autorest": "~0.
|
|
106
|
-
"@azure-tools/typespec-azure-core": "~0.
|
|
107
|
-
"@azure-tools/typespec-azure-resource-manager": "~0.
|
|
108
|
-
"@azure-tools/typespec-azure-rulesets": "~0.
|
|
109
|
-
"@azure-tools/typespec-client-generator-core": "~0.
|
|
110
|
-
"@azure-tools/azure-http-specs": "0.1.0-alpha.
|
|
111
|
-
"@typespec/compiler": "^1.
|
|
112
|
-
"@typespec/http": "^1.
|
|
113
|
-
"@typespec/openapi": "^1.
|
|
114
|
-
"@typespec/rest": "~0.
|
|
115
|
-
"@typespec/versioning": "~0.
|
|
116
|
-
"@typespec/events": "~0.
|
|
117
|
-
"@typespec/spector": "0.1.0-alpha.
|
|
118
|
-
"@typespec/spec-api": "0.1.0-alpha.
|
|
119
|
-
"@typespec/sse": "~0.
|
|
120
|
-
"@typespec/streams": "~0.
|
|
121
|
-
"@typespec/xml": "~0.
|
|
122
|
-
"@typespec/http-specs": "0.1.0-alpha.39
|
|
105
|
+
"@azure-tools/typespec-autorest": "~0.70.0",
|
|
106
|
+
"@azure-tools/typespec-azure-core": "~0.70.0",
|
|
107
|
+
"@azure-tools/typespec-azure-resource-manager": "~0.70.0",
|
|
108
|
+
"@azure-tools/typespec-azure-rulesets": "~0.70.0",
|
|
109
|
+
"@azure-tools/typespec-client-generator-core": "~0.70.0",
|
|
110
|
+
"@azure-tools/azure-http-specs": "0.1.0-alpha.43",
|
|
111
|
+
"@typespec/compiler": "^1.14.0",
|
|
112
|
+
"@typespec/http": "^1.14.0",
|
|
113
|
+
"@typespec/openapi": "^1.14.0",
|
|
114
|
+
"@typespec/rest": "~0.84.0",
|
|
115
|
+
"@typespec/versioning": "~0.84.0",
|
|
116
|
+
"@typespec/events": "~0.84.0",
|
|
117
|
+
"@typespec/spector": "0.1.0-alpha.26",
|
|
118
|
+
"@typespec/spec-api": "0.1.0-alpha.15",
|
|
119
|
+
"@typespec/sse": "~0.84.0",
|
|
120
|
+
"@typespec/streams": "~0.84.0",
|
|
121
|
+
"@typespec/xml": "~0.84.0",
|
|
122
|
+
"@typespec/http-specs": "0.1.0-alpha.39",
|
|
123
123
|
"@types/js-yaml": "~4.0.5",
|
|
124
124
|
"@types/node": "~25.0.2",
|
|
125
125
|
"@types/semver": "7.5.8",
|