@typespec/http-client-python 0.28.2 → 0.29.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 (368) hide show
  1. package/dist/emitter/code-model.d.ts.map +1 -1
  2. package/dist/emitter/code-model.js +7 -6
  3. package/dist/emitter/code-model.js.map +1 -1
  4. package/dist/emitter/constants.d.ts +6 -0
  5. package/dist/emitter/constants.d.ts.map +1 -0
  6. package/dist/emitter/constants.js +27 -0
  7. package/dist/emitter/constants.js.map +1 -0
  8. package/dist/emitter/emitter.d.ts.map +1 -1
  9. package/dist/emitter/emitter.js +193 -119
  10. package/dist/emitter/emitter.js.map +1 -1
  11. package/dist/emitter/http.d.ts.map +1 -1
  12. package/dist/emitter/http.js +33 -1
  13. package/dist/emitter/http.js.map +1 -1
  14. package/dist/emitter/lib.d.ts +37 -3
  15. package/dist/emitter/lib.d.ts.map +1 -1
  16. package/dist/emitter/lib.js +17 -0
  17. package/dist/emitter/lib.js.map +1 -1
  18. package/dist/emitter/run-python3.js +1 -1
  19. package/dist/emitter/run-python3.js.map +1 -1
  20. package/dist/emitter/system-requirements.js +6 -4
  21. package/dist/emitter/system-requirements.js.map +1 -1
  22. package/dist/emitter/types.d.ts +2 -5
  23. package/dist/emitter/types.d.ts.map +1 -1
  24. package/dist/emitter/types.js +86 -63
  25. package/dist/emitter/types.js.map +1 -1
  26. package/dist/emitter/utils.d.ts.map +1 -1
  27. package/dist/emitter/utils.js +16 -17
  28. package/dist/emitter/utils.js.map +1 -1
  29. package/emitter/src/code-model.ts +7 -13
  30. package/emitter/src/constants.ts +27 -0
  31. package/emitter/src/emitter.ts +241 -123
  32. package/emitter/src/http.ts +29 -1
  33. package/emitter/src/lib.ts +24 -0
  34. package/emitter/src/run-python3.ts +1 -1
  35. package/emitter/src/system-requirements.ts +4 -4
  36. package/emitter/src/types.ts +102 -62
  37. package/emitter/src/utils.ts +16 -18
  38. package/emitter/temp/tsconfig.tsbuildinfo +1 -1
  39. package/emitter/test/utils.test.ts +3 -0
  40. package/emitter/tsconfig.build.json +2 -1
  41. package/emitter/tsconfig.json +2 -1
  42. package/eng/scripts/Build-Packages.ps1 +62 -37
  43. package/eng/scripts/Check-GitChanges.ps1 +30 -3
  44. package/eng/scripts/Functions.ps1 +54 -15
  45. package/eng/scripts/Generate.ps1 +42 -8
  46. package/eng/scripts/Generation.psm1 +44 -15
  47. package/eng/scripts/Initialize-Repository.ps1 +29 -11
  48. package/eng/scripts/Test-Packages.ps1 +47 -31
  49. package/eng/scripts/ci/config/eslint-ci.config.mjs +64 -0
  50. package/eng/scripts/ci/{mypy.ini → config/mypy.ini} +1 -1
  51. package/eng/scripts/ci/{pylintrc → config/pylintrc} +1 -1
  52. package/eng/scripts/ci/{pyrightconfig.json → config/pyrightconfig.json} +1 -1
  53. package/eng/scripts/ci/dev_requirements.txt +2 -1
  54. package/eng/scripts/ci/format.ts +232 -2
  55. package/eng/scripts/ci/lint.ts +223 -20
  56. package/eng/scripts/ci/regenerate-common.ts +411 -136
  57. package/eng/scripts/ci/regenerate.ts +247 -101
  58. package/eng/scripts/ci/run-tests.ts +507 -0
  59. package/eng/scripts/ci/run_apiview.py +22 -16
  60. package/eng/scripts/ci/run_mypy.py +34 -23
  61. package/eng/scripts/ci/run_pylint.py +27 -19
  62. package/eng/scripts/ci/run_pyright.py +9 -5
  63. package/eng/scripts/ci/run_sphinx_build.py +24 -9
  64. package/eng/scripts/ci/typecheck.ts +225 -0
  65. package/eng/scripts/ci/util.py +61 -25
  66. package/eng/scripts/ci/utils.ts +5 -5
  67. package/eng/scripts/setup/__pycache__/package_manager.cpython-311.pyc +0 -0
  68. package/eng/scripts/setup/__pycache__/venvtools.cpython-311.pyc +0 -0
  69. package/eng/scripts/setup/build.ts +1 -1
  70. package/eng/scripts/setup/build_pygen_wheel.py +4 -3
  71. package/eng/scripts/setup/install.py +4 -3
  72. package/eng/scripts/setup/install.ts +1 -1
  73. package/eng/scripts/setup/prepare.py +3 -2
  74. package/eng/scripts/setup/prepare.ts +1 -1
  75. package/eng/scripts/setup/run-python3.ts +1 -1
  76. package/eng/scripts/setup/run_batch.py +197 -0
  77. package/eng/scripts/setup/run_tsp.py +3 -3
  78. package/eng/scripts/setup/system-requirements.ts +8 -4
  79. package/eng/scripts/setup/venvtools.py +1 -1
  80. package/generator/build/lib/pygen/__init__.py +1 -3
  81. package/generator/build/lib/pygen/codegen/__init__.py +0 -1
  82. package/generator/build/lib/pygen/codegen/models/base.py +0 -1
  83. package/generator/build/lib/pygen/codegen/models/client.py +2 -1
  84. package/generator/build/lib/pygen/codegen/models/code_model.py +1 -0
  85. package/generator/build/lib/pygen/codegen/models/enum_type.py +0 -1
  86. package/generator/build/lib/pygen/codegen/models/model_type.py +1 -7
  87. package/generator/build/lib/pygen/codegen/models/parameter.py +16 -14
  88. package/generator/build/lib/pygen/codegen/serializers/__init__.py +27 -12
  89. package/generator/build/lib/pygen/codegen/serializers/builder_serializer.py +12 -3
  90. package/generator/build/lib/pygen/codegen/serializers/general_serializer.py +6 -2
  91. package/generator/build/lib/pygen/codegen/serializers/import_serializer.py +17 -4
  92. package/generator/build/lib/pygen/codegen/serializers/parameter_serializer.py +17 -11
  93. package/generator/build/lib/pygen/codegen/templates/model_base.py.jinja2 +176 -71
  94. package/generator/build/lib/pygen/codegen/templates/packaging_templates/README.md.jinja2 +11 -3
  95. package/generator/build/lib/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +1 -1
  96. package/generator/build/lib/pygen/codegen/templates/serialization.py.jinja2 +5 -1
  97. package/generator/build/lib/pygen/preprocess/__init__.py +37 -30
  98. package/generator/component-detection-pip-report.json +7 -7
  99. package/generator/dist/pygen-0.1.0-py3-none-any.whl +0 -0
  100. package/generator/pygen/__init__.py +1 -3
  101. package/generator/pygen/codegen/__init__.py +0 -1
  102. package/generator/pygen/codegen/models/base.py +0 -1
  103. package/generator/pygen/codegen/models/client.py +2 -1
  104. package/generator/pygen/codegen/models/code_model.py +1 -0
  105. package/generator/pygen/codegen/models/enum_type.py +0 -1
  106. package/generator/pygen/codegen/models/model_type.py +1 -7
  107. package/generator/pygen/codegen/models/parameter.py +16 -14
  108. package/generator/pygen/codegen/serializers/__init__.py +27 -12
  109. package/generator/pygen/codegen/serializers/builder_serializer.py +12 -3
  110. package/generator/pygen/codegen/serializers/general_serializer.py +6 -2
  111. package/generator/pygen/codegen/serializers/import_serializer.py +17 -4
  112. package/generator/pygen/codegen/serializers/parameter_serializer.py +17 -11
  113. package/generator/pygen/codegen/templates/model_base.py.jinja2 +176 -71
  114. package/generator/pygen/codegen/templates/packaging_templates/README.md.jinja2 +11 -3
  115. package/generator/pygen/codegen/templates/packaging_templates/pyproject.toml.jinja2 +1 -1
  116. package/generator/pygen/codegen/templates/serialization.py.jinja2 +5 -1
  117. package/generator/pygen/preprocess/__init__.py +37 -30
  118. package/generator/pygen.egg-info/PKG-INFO +1 -2
  119. package/generator/pygen.egg-info/requires.txt +1 -1
  120. package/generator/setup.py +1 -2
  121. package/package.json +63 -42
  122. package/eng/scripts/ci/run-ci.ts +0 -89
  123. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_commonproperties_async.py +0 -94
  124. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_largeheader_async.py +0 -30
  125. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_nonresource_async.py +0 -36
  126. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_operationtemplates_async.py +0 -205
  127. package/generator/test/azure/mock_api_tests/asynctests/test_azure_arm_resource_async.py +0 -478
  128. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_access_async.py +0 -101
  129. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_header_async.py +0 -18
  130. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_path_async.py +0 -18
  131. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_api_version_query_async.py +0 -18
  132. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_default_value_async.py +0 -46
  133. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_initialization_async.py +0 -58
  134. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_client_location_async.py +0 -82
  135. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_deserialize_empty_string_as_null_async.py +0 -20
  136. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_flatten_async.py +0 -115
  137. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_hierrarchy_building_async.py +0 -53
  138. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_next_link_verb_async.py +0 -28
  139. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_override_async.py +0 -106
  140. package/generator/test/azure/mock_api_tests/asynctests/test_azure_client_generator_core_usage_async.py +0 -38
  141. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_basic_async.py +0 -76
  142. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_rpc_async.py +0 -22
  143. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_lro_standard_async.py +0 -39
  144. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_model_async.py +0 -33
  145. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_page_async.py +0 -80
  146. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_scalar_async.py +0 -41
  147. package/generator/test/azure/mock_api_tests/asynctests/test_azure_core_traits_async.py +0 -87
  148. package/generator/test/azure/mock_api_tests/asynctests/test_azure_encode_duration_async.py +0 -19
  149. package/generator/test/azure/mock_api_tests/asynctests/test_azure_example_basic_async.py +0 -30
  150. package/generator/test/azure/mock_api_tests/asynctests/test_azure_payload_pageable_async.py +0 -19
  151. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_method_subscription_id_async.py +0 -248
  152. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_async.py +0 -110
  153. package/generator/test/azure/mock_api_tests/asynctests/test_azure_resource_manager_multi_service_shared_models_async.py +0 -132
  154. package/generator/test/azure/mock_api_tests/asynctests/test_azure_special_headers_client_request_id_async.py +0 -30
  155. package/generator/test/azure/mock_api_tests/asynctests/test_azure_versioning_previewversion_async.py +0 -53
  156. package/generator/test/azure/mock_api_tests/asynctests/test_client_namespace_async.py +0 -34
  157. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_async.py +0 -69
  158. package/generator/test/azure/mock_api_tests/asynctests/test_client_naming_enum_conflict_async.py +0 -37
  159. package/generator/test/azure/mock_api_tests/asynctests/test_client_overload_async.py +0 -27
  160. package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_async.py +0 -64
  161. package/generator/test/azure/mock_api_tests/asynctests/test_client_structure_clientoperationgroup_async.py +0 -31
  162. package/generator/test/azure/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
  163. package/generator/test/azure/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
  164. package/generator/test/azure/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
  165. package/generator/test/azure/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
  166. package/generator/test/azure/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
  167. package/generator/test/azure/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -216
  168. package/generator/test/azure/mock_api_tests/asynctests/test_resiliency_srv_driven_async.py +0 -130
  169. package/generator/test/azure/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
  170. package/generator/test/azure/mock_api_tests/asynctests/test_service_multi_service_async.py +0 -31
  171. package/generator/test/azure/mock_api_tests/asynctests/test_special_words_async.py +0 -71
  172. package/generator/test/azure/mock_api_tests/conftest.py +0 -207
  173. package/generator/test/azure/mock_api_tests/data/image.jpg +0 -0
  174. package/generator/test/azure/mock_api_tests/data/image.png +0 -0
  175. package/generator/test/azure/mock_api_tests/test_azure_arm_commonproperties.py +0 -89
  176. package/generator/test/azure/mock_api_tests/test_azure_arm_largeheader.py +0 -27
  177. package/generator/test/azure/mock_api_tests/test_azure_arm_nonresource.py +0 -34
  178. package/generator/test/azure/mock_api_tests/test_azure_arm_operationtemplates.py +0 -180
  179. package/generator/test/azure/mock_api_tests/test_azure_arm_resource.py +0 -436
  180. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_access.py +0 -92
  181. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_header.py +0 -17
  182. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_path.py +0 -17
  183. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_api_version_query.py +0 -17
  184. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_default_value.py +0 -42
  185. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_initialization.py +0 -51
  186. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_client_location.py +0 -70
  187. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_deserialize_empty_string_as_null.py +0 -19
  188. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_flatten.py +0 -104
  189. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_hierrarchy_building.py +0 -45
  190. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_next_link_verb.py +0 -27
  191. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_override.py +0 -102
  192. package/generator/test/azure/mock_api_tests/test_azure_client_generator_core_usage.py +0 -32
  193. package/generator/test/azure/mock_api_tests/test_azure_core_basic.py +0 -70
  194. package/generator/test/azure/mock_api_tests/test_azure_core_lro_rpc.py +0 -20
  195. package/generator/test/azure/mock_api_tests/test_azure_core_lro_standard.py +0 -32
  196. package/generator/test/azure/mock_api_tests/test_azure_core_model.py +0 -30
  197. package/generator/test/azure/mock_api_tests/test_azure_core_page.py +0 -71
  198. package/generator/test/azure/mock_api_tests/test_azure_core_scalar.py +0 -35
  199. package/generator/test/azure/mock_api_tests/test_azure_core_traits.py +0 -85
  200. package/generator/test/azure/mock_api_tests/test_azure_encode_duration.py +0 -18
  201. package/generator/test/azure/mock_api_tests/test_azure_example_basic.py +0 -29
  202. package/generator/test/azure/mock_api_tests/test_azure_payload_pageable.py +0 -18
  203. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_method_subscription_id.py +0 -235
  204. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service.py +0 -104
  205. package/generator/test/azure/mock_api_tests/test_azure_resource_manager_multi_service_shared_models.py +0 -128
  206. package/generator/test/azure/mock_api_tests/test_azure_special_headers_client_request_id.py +0 -29
  207. package/generator/test/azure/mock_api_tests/test_azure_versioning_previewversion.py +0 -50
  208. package/generator/test/azure/mock_api_tests/test_clear_output_folder.py +0 -23
  209. package/generator/test/azure/mock_api_tests/test_client_namespace.py +0 -32
  210. package/generator/test/azure/mock_api_tests/test_client_naming.py +0 -57
  211. package/generator/test/azure/mock_api_tests/test_client_naming_enum_conflict.py +0 -35
  212. package/generator/test/azure/mock_api_tests/test_client_overload.py +0 -25
  213. package/generator/test/azure/mock_api_tests/test_client_structure.py +0 -60
  214. package/generator/test/azure/mock_api_tests/test_client_structure_clientoperationgroup.py +0 -29
  215. package/generator/test/azure/mock_api_tests/test_encode_duration.py +0 -60
  216. package/generator/test/azure/mock_api_tests/test_encode_numeric.py +0 -31
  217. package/generator/test/azure/mock_api_tests/test_model_base_flatten_compatibility.py +0 -251
  218. package/generator/test/azure/mock_api_tests/test_parameters_basic.py +0 -22
  219. package/generator/test/azure/mock_api_tests/test_parameters_spread.py +0 -66
  220. package/generator/test/azure/mock_api_tests/test_payload_content_negotiation.py +0 -33
  221. package/generator/test/azure/mock_api_tests/test_payload_multipart.py +0 -198
  222. package/generator/test/azure/mock_api_tests/test_resiliency_srv_driven.py +0 -124
  223. package/generator/test/azure/mock_api_tests/test_serialization_encoded_name_json.py +0 -21
  224. package/generator/test/azure/mock_api_tests/test_service_multi_service.py +0 -29
  225. package/generator/test/azure/mock_api_tests/test_special_words.py +0 -63
  226. package/generator/test/azure/requirements.txt +0 -125
  227. package/generator/test/azure/tox.ini +0 -64
  228. package/generator/test/data/image.jpg +0 -0
  229. package/generator/test/data/image.png +0 -0
  230. package/generator/test/dev_requirements.txt +0 -8
  231. package/generator/test/generic_mock_api_tests/asynctests/test_authentication_async.py +0 -140
  232. package/generator/test/generic_mock_api_tests/asynctests/test_encode_array_async.py +0 -139
  233. package/generator/test/generic_mock_api_tests/asynctests/test_encode_bytes_async.py +0 -132
  234. package/generator/test/generic_mock_api_tests/asynctests/test_encode_datetime_async.py +0 -127
  235. package/generator/test/generic_mock_api_tests/asynctests/test_headasboolean_async.py +0 -35
  236. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_body_optionality_async.py +0 -30
  237. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_collection_format_async.py +0 -38
  238. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_path_async.py +0 -24
  239. package/generator/test/generic_mock_api_tests/asynctests/test_parameters_query_async.py +0 -18
  240. package/generator/test/generic_mock_api_tests/asynctests/test_payload_json_merge_patch_async.py +0 -98
  241. package/generator/test/generic_mock_api_tests/asynctests/test_payload_media_type_async.py +0 -27
  242. package/generator/test/generic_mock_api_tests/asynctests/test_payload_pageable_async.py +0 -134
  243. package/generator/test/generic_mock_api_tests/asynctests/test_payload_xml_async.py +0 -150
  244. package/generator/test/generic_mock_api_tests/asynctests/test_response_status_code_range_async.py +0 -38
  245. package/generator/test/generic_mock_api_tests/asynctests/test_routes_async.py +0 -331
  246. package/generator/test/generic_mock_api_tests/asynctests/test_server_endpoint_not_defined_async.py +0 -18
  247. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_multiple_async.py +0 -25
  248. package/generator/test/generic_mock_api_tests/asynctests/test_server_path_single_async.py +0 -18
  249. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_not_versioned_async.py +0 -28
  250. package/generator/test/generic_mock_api_tests/asynctests/test_server_versions_versioned_async.py +0 -34
  251. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_conditional_request_async.py +0 -38
  252. package/generator/test/generic_mock_api_tests/asynctests/test_special_headers_repeatability_async.py +0 -19
  253. package/generator/test/generic_mock_api_tests/asynctests/test_specs_documentation_async.py +0 -59
  254. package/generator/test/generic_mock_api_tests/asynctests/test_streaming_jsonl_async.py +0 -27
  255. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_array_async.py +0 -127
  256. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_dictionary_async.py +0 -98
  257. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_extensible_async.py +0 -25
  258. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_enum_fixed_async.py +0 -27
  259. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_file_async.py +0 -59
  260. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_empty_async.py +0 -32
  261. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_enum_discriminator_async.py +0 -70
  262. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_nested_discriminator_async.py +0 -85
  263. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_not_discriminated_async.py +0 -34
  264. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_recursive_async.py +0 -34
  265. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_inheritance_single_discriminator_async.py +0 -67
  266. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_usage_async.py +0 -32
  267. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_model_visibility_async.py +0 -47
  268. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_additionalproperties_async.py +0 -353
  269. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_nullable_async.py +0 -110
  270. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_optional_async.py +0 -197
  271. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_property_valuetypes_async.py +0 -315
  272. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_scalar_async.py +0 -60
  273. package/generator/test/generic_mock_api_tests/asynctests/test_typetest_union_async.py +0 -90
  274. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_added_async.py +0 -36
  275. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_made_optional_async.py +0 -21
  276. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_removed_async.py +0 -39
  277. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_renamed_from_async.py +0 -29
  278. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_return_type_changed_from_async.py +0 -18
  279. package/generator/test/generic_mock_api_tests/asynctests/test_versioning_type_changed_from_async.py +0 -22
  280. package/generator/test/generic_mock_api_tests/conftest.py +0 -75
  281. package/generator/test/generic_mock_api_tests/data/image.jpg +0 -0
  282. package/generator/test/generic_mock_api_tests/data/image.png +0 -0
  283. package/generator/test/generic_mock_api_tests/test_authentication.py +0 -130
  284. package/generator/test/generic_mock_api_tests/test_encode_array.py +0 -126
  285. package/generator/test/generic_mock_api_tests/test_encode_bytes.py +0 -128
  286. package/generator/test/generic_mock_api_tests/test_encode_datetime.py +0 -123
  287. package/generator/test/generic_mock_api_tests/test_headasboolean.py +0 -33
  288. package/generator/test/generic_mock_api_tests/test_parameters_body_optionality.py +0 -27
  289. package/generator/test/generic_mock_api_tests/test_parameters_collection_format.py +0 -33
  290. package/generator/test/generic_mock_api_tests/test_parameters_path.py +0 -22
  291. package/generator/test/generic_mock_api_tests/test_parameters_query.py +0 -17
  292. package/generator/test/generic_mock_api_tests/test_payload_json_merge_patch.py +0 -93
  293. package/generator/test/generic_mock_api_tests/test_payload_media_type.py +0 -25
  294. package/generator/test/generic_mock_api_tests/test_payload_pageable.py +0 -99
  295. package/generator/test/generic_mock_api_tests/test_payload_xml.py +0 -135
  296. package/generator/test/generic_mock_api_tests/test_response_status_code_range.py +0 -36
  297. package/generator/test/generic_mock_api_tests/test_routes.py +0 -285
  298. package/generator/test/generic_mock_api_tests/test_server_endpoint_not_defined.py +0 -17
  299. package/generator/test/generic_mock_api_tests/test_server_path_multiple.py +0 -21
  300. package/generator/test/generic_mock_api_tests/test_server_path_single.py +0 -17
  301. package/generator/test/generic_mock_api_tests/test_server_versions_not_versioned.py +0 -25
  302. package/generator/test/generic_mock_api_tests/test_server_versions_versioned.py +0 -30
  303. package/generator/test/generic_mock_api_tests/test_special_headers_conditional_request.py +0 -34
  304. package/generator/test/generic_mock_api_tests/test_special_headers_repeatability.py +0 -18
  305. package/generator/test/generic_mock_api_tests/test_specs_documentation.py +0 -51
  306. package/generator/test/generic_mock_api_tests/test_streaming_jsonl.py +0 -25
  307. package/generator/test/generic_mock_api_tests/test_typetest_array.py +0 -111
  308. package/generator/test/generic_mock_api_tests/test_typetest_dictionary.py +0 -86
  309. package/generator/test/generic_mock_api_tests/test_typetest_enum_extensible.py +0 -23
  310. package/generator/test/generic_mock_api_tests/test_typetest_enum_fixed.py +0 -25
  311. package/generator/test/generic_mock_api_tests/test_typetest_file.py +0 -52
  312. package/generator/test/generic_mock_api_tests/test_typetest_model_empty.py +0 -29
  313. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_enum_discriminator.py +0 -58
  314. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_nested_discriminator.py +0 -79
  315. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_not_discriminated.py +0 -31
  316. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_recursive.py +0 -32
  317. package/generator/test/generic_mock_api_tests/test_typetest_model_inheritance_single_discriminator.py +0 -60
  318. package/generator/test/generic_mock_api_tests/test_typetest_model_usage.py +0 -28
  319. package/generator/test/generic_mock_api_tests/test_typetest_model_visibility.py +0 -40
  320. package/generator/test/generic_mock_api_tests/test_typetest_property_additionalproperties.py +0 -314
  321. package/generator/test/generic_mock_api_tests/test_typetest_property_nullable.py +0 -102
  322. package/generator/test/generic_mock_api_tests/test_typetest_property_optional.py +0 -174
  323. package/generator/test/generic_mock_api_tests/test_typetest_property_valuetypes.py +0 -286
  324. package/generator/test/generic_mock_api_tests/test_typetest_scalar.py +0 -53
  325. package/generator/test/generic_mock_api_tests/test_typetest_union.py +0 -80
  326. package/generator/test/generic_mock_api_tests/test_typetest_union_discriminated.py +0 -290
  327. package/generator/test/generic_mock_api_tests/test_versioning_added.py +0 -33
  328. package/generator/test/generic_mock_api_tests/test_versioning_made_optional.py +0 -20
  329. package/generator/test/generic_mock_api_tests/test_versioning_removed.py +0 -37
  330. package/generator/test/generic_mock_api_tests/test_versioning_renamed_from.py +0 -27
  331. package/generator/test/generic_mock_api_tests/test_versioning_return_type_changed_from.py +0 -17
  332. package/generator/test/generic_mock_api_tests/test_versioning_type_changed_from.py +0 -21
  333. package/generator/test/unbranded/mock_api_tests/asynctests/test_auth_flow_async.py +0 -19
  334. package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_duration_async.py +0 -63
  335. package/generator/test/unbranded/mock_api_tests/asynctests/test_encode_numeric_async.py +0 -35
  336. package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_basic_async.py +0 -24
  337. package/generator/test/unbranded/mock_api_tests/asynctests/test_parameters_spread_async.py +0 -76
  338. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_content_negotiation_async.py +0 -37
  339. package/generator/test/unbranded/mock_api_tests/asynctests/test_payload_multipart_async.py +0 -218
  340. package/generator/test/unbranded/mock_api_tests/asynctests/test_serialization_encoded_name_json_async.py +0 -24
  341. package/generator/test/unbranded/mock_api_tests/asynctests/test_special_words_async.py +0 -73
  342. package/generator/test/unbranded/mock_api_tests/asynctests/test_unbranded_async.py +0 -24
  343. package/generator/test/unbranded/mock_api_tests/conftest.py +0 -91
  344. package/generator/test/unbranded/mock_api_tests/data/image.jpg +0 -0
  345. package/generator/test/unbranded/mock_api_tests/data/image.png +0 -0
  346. package/generator/test/unbranded/mock_api_tests/test_auth_flow.py +0 -17
  347. package/generator/test/unbranded/mock_api_tests/test_encode_duration.py +0 -60
  348. package/generator/test/unbranded/mock_api_tests/test_encode_numeric.py +0 -32
  349. package/generator/test/unbranded/mock_api_tests/test_parameters_basic.py +0 -22
  350. package/generator/test/unbranded/mock_api_tests/test_parameters_spread.py +0 -66
  351. package/generator/test/unbranded/mock_api_tests/test_payload_content_negotiation.py +0 -33
  352. package/generator/test/unbranded/mock_api_tests/test_payload_multipart.py +0 -200
  353. package/generator/test/unbranded/mock_api_tests/test_serialization_encoded_name_json.py +0 -22
  354. package/generator/test/unbranded/mock_api_tests/test_special_words.py +0 -66
  355. package/generator/test/unbranded/mock_api_tests/test_unbranded.py +0 -65
  356. package/generator/test/unbranded/requirements.txt +0 -69
  357. package/generator/test/unbranded/tox.ini +0 -64
  358. package/generator/test/unittests/conftest.py +0 -15
  359. package/generator/test/unittests/requirements.txt +0 -3
  360. package/generator/test/unittests/test_enums.py +0 -89
  361. package/generator/test/unittests/test_model_base_serialization.py +0 -4906
  362. package/generator/test/unittests/test_model_base_xml_serialization.py +0 -1239
  363. package/generator/test/unittests/test_name_converter.py +0 -35
  364. package/generator/test/unittests/test_optional_return_type.py +0 -268
  365. package/generator/test/unittests/test_parameter_ordering.py +0 -104
  366. package/generator/test/unittests/test_sort_schema.py +0 -93
  367. package/generator/test/unittests/tox.ini +0 -5
  368. /package/eng/scripts/ci/{pyproject.toml → config/pyproject.toml} +0 -0
@@ -1,41 +1,99 @@
1
1
  /* eslint-disable no-console */
2
- import chalk from "chalk";
3
- import { execFile } from "child_process";
4
- import { promises, rmSync } from "fs";
5
- import { join, resolve } from "path";
2
+ /**
3
+ * Regenerates Python SDK code from TypeSpec definitions.
4
+ *
5
+ * Two-phase pipeline:
6
+ * 1. TypeSpec compile (in-process, parallel) -> emits per-spec YAML only.
7
+ * 2. Single batched Python subprocess reads all YAMLs and writes the
8
+ * final `.py` files. Amortizes Python-startup cost across many specs.
9
+ *
10
+ * Shared helpers/data live in `regenerate-common.ts` (kept identical with the
11
+ * `@azure-tools/typespec-python` wrapper copy).
12
+ */
13
+
14
+ import { execSync } from "child_process";
15
+ import { existsSync } from "fs";
16
+ import { access, readdir } from "fs/promises";
17
+ import { platform } from "os";
18
+ import { dirname, join, resolve } from "path";
19
+ import pc from "picocolors";
6
20
  import { fileURLToPath } from "url";
7
- import { parseArgs, promisify } from "util";
21
+ import { parseArgs } from "util";
22
+
8
23
  import {
9
- BASE_AZURE_EMITTER_OPTIONS,
10
- BASE_EMITTER_OPTIONS,
11
- buildOptions,
12
- regenerate,
13
- toPosix,
14
- type RegenerateConfig,
15
- type RegenerateFlags,
16
- type RegenerateFlagsInput,
17
- type TspCommand,
24
+ buildTaskGroups,
25
+ getSubdirectories,
26
+ prepareBaselineOfGeneratedCode,
27
+ preprocess,
28
+ RegenerateContext,
29
+ RegenerateFlags,
30
+ runParallel,
18
31
  } from "./regenerate-common.js";
19
32
 
20
- // PARSE INPUT ARGUMENTS
21
-
33
+ // Parse arguments
22
34
  const argv = parseArgs({
23
35
  args: process.argv.slice(2),
24
36
  options: {
25
- flavor: { type: "string" },
26
- name: { type: "string" },
27
- debug: { type: "boolean" },
37
+ flavor: { type: "string", short: "f" },
38
+ name: { type: "string", short: "n" },
39
+ debug: { type: "boolean", short: "d" },
28
40
  pluginDir: { type: "string" },
29
41
  emitterName: { type: "string" },
30
42
  generatedFolder: { type: "string" },
31
- pyodide: { type: "boolean" },
43
+ jobs: { type: "string", short: "j" },
44
+ help: { type: "boolean", short: "h" },
32
45
  },
33
46
  });
34
47
 
35
- // Get the directory of the current file
48
+ if (argv.values.help) {
49
+ console.log(`
50
+ ${pc.bold("Usage:")} tsx regenerate.ts [options]
51
+
52
+ ${pc.bold("Description:")}
53
+ Regenerates Python SDK code from TypeSpec definitions using in-process compilation.
54
+ This avoids spawning a new Node.js process for each spec, making it significantly faster.
55
+
56
+ ${pc.bold("Options:")}
57
+ ${pc.cyan("-f, --flavor <azure|unbranded>")}
58
+ SDK flavor to regenerate. If not specified, regenerates both flavors.
59
+
60
+ ${pc.cyan("-n, --name <pattern>")}
61
+ Filter packages by name pattern (case-insensitive substring match).
62
+ Examples:
63
+ --name xml Regenerate packages containing "xml"
64
+ --name authentication Regenerate authentication packages
65
+ --name type/array Regenerate the type/array package
66
+
67
+ ${pc.cyan("-d, --debug")}
68
+ Enable debug output during regeneration.
69
+
70
+ ${pc.cyan("-j, --jobs <n>")}
71
+ Number of parallel compilation tasks (default: 30 on Linux/Mac, 10 on Windows).
72
+
73
+ ${pc.cyan("-h, --help")}
74
+ Show this help message.
75
+
76
+ ${pc.bold("Examples:")}
77
+ ${pc.dim("# Regenerate all packages for both flavors")}
78
+ tsx regenerate.ts
79
+
80
+ ${pc.dim("# Regenerate only Azure packages")}
81
+ tsx regenerate.ts --flavor azure
82
+
83
+ ${pc.dim("# Regenerate a specific package by name")}
84
+ tsx regenerate.ts --flavor azure --name authentication-api-key
85
+
86
+ ${pc.dim("# Regenerate with more parallelism")}
87
+ tsx regenerate.ts --jobs 50
88
+ `);
89
+ process.exit(0);
90
+ }
91
+
92
+ // Get paths
93
+ const SCRIPT_DIR = dirname(fileURLToPath(import.meta.url));
36
94
  const PLUGIN_DIR = argv.values.pluginDir
37
95
  ? resolve(argv.values.pluginDir)
38
- : resolve(fileURLToPath(import.meta.url), "../../../../");
96
+ : resolve(SCRIPT_DIR, "../../../");
39
97
  const AZURE_HTTP_SPECS = resolve(PLUGIN_DIR, "node_modules/@azure-tools/azure-http-specs/specs");
40
98
  const HTTP_SPECS = resolve(PLUGIN_DIR, "node_modules/@typespec/http-specs/specs");
41
99
  const GENERATED_FOLDER = argv.values.generatedFolder
@@ -43,95 +101,183 @@ const GENERATED_FOLDER = argv.values.generatedFolder
43
101
  : resolve(PLUGIN_DIR, "generator");
44
102
  const EMITTER_NAME = argv.values.emitterName || "@typespec/http-client-python";
45
103
 
46
- const AZURE_EMITTER_OPTIONS: Record<string, Record<string, string> | Record<string, string>[]> = {
47
- ...BASE_AZURE_EMITTER_OPTIONS,
48
- "client/structure/client-operation-group": {
49
- "package-name": "client-structure-clientoperationgroup",
50
- namespace: "client.structure.clientoperationgroup",
51
- },
52
- };
53
-
54
- const EMITTER_OPTIONS: Record<string, Record<string, string> | Record<string, string>[]> = {
55
- ...BASE_EMITTER_OPTIONS,
56
- "type/array": {
57
- "package-name": "typetest-array",
58
- namespace: "typetest.array",
59
- "use-pyodide": "true",
60
- },
61
- "type/model/inheritance/recursive": {
62
- "package-name": "typetest-model-recursive",
63
- namespace: "typetest.model.recursive",
64
- "use-pyodide": "true",
65
- },
104
+ const ctx: RegenerateContext = {
105
+ pluginDir: PLUGIN_DIR,
106
+ azureHttpSpecs: AZURE_HTTP_SPECS,
107
+ httpSpecs: HTTP_SPECS,
108
+ generatedFolder: GENERATED_FOLDER,
109
+ emitterName: EMITTER_NAME,
66
110
  };
67
111
 
68
- // Function to execute CLI commands asynchronously
69
- async function executeCommand(tspCommand: TspCommand): Promise<void> {
70
- const cmd = tspCommand.command as string[];
71
- const execFileAsync = promisify(execFile);
112
+ async function collectConfigFiles(generatedDir: string, flavor: string): Promise<string[]> {
113
+ const flavorDir = join(generatedDir, "..", "tests", "generated", flavor);
72
114
  try {
73
- console.log(chalk.green(`start tsp ${cmd.join(" ")}`));
74
- await execFileAsync("tsp", cmd, { shell: true });
75
- console.log(chalk.green(`tsp ${cmd.join(" ")} succeeded`));
76
- } catch (err) {
77
- rmSync(tspCommand.outputDir, { recursive: true, force: true });
78
- console.error(chalk.red(`exec error: ${err}`));
79
- throw err;
115
+ await access(flavorDir);
116
+ } catch {
117
+ return [];
80
118
  }
119
+
120
+ const configFiles: string[] = [];
121
+ for (const pkg of await readdir(flavorDir, { withFileTypes: true })) {
122
+ if (pkg.isDirectory()) {
123
+ const pkgDir = join(flavorDir, pkg.name);
124
+ for (const file of await readdir(pkgDir)) {
125
+ if (file.startsWith(".tsp-codegen-") && file.endsWith(".json")) {
126
+ configFiles.push(join(pkgDir, file));
127
+ }
128
+ }
129
+ }
130
+ }
131
+ return configFiles;
81
132
  }
82
133
 
83
- // create some files before regeneration. After regeneration, these files should be deleted and we will test it
84
- // in test case
85
- async function preprocess(flags: RegenerateFlagsInput): Promise<void> {
86
- if (flags.flavor === "azure") {
87
- // create folder if not exists
88
- const folderParts = [
89
- "test",
90
- "azure",
91
- "generated",
92
- "authentication-api-key",
93
- "authentication",
94
- "apikey",
95
- "_operations",
96
- ];
97
- await promises.mkdir(join(GENERATED_FOLDER, ...folderParts), { recursive: true });
98
- await promises.writeFile(
99
- join(GENERATED_FOLDER, ...folderParts, "to_be_deleted.py"),
100
- "# This file is to be deleted after regeneration",
134
+ function runBatchPythonProcessing(flavor: string, configCount: number, jobs: number): boolean {
135
+ if (configCount === 0) return true;
136
+
137
+ console.log(pc.cyan(`\nRunning batch Python processing on ${configCount} specs...`));
138
+
139
+ // Find Python venv
140
+ let venvPath = join(PLUGIN_DIR, "venv");
141
+ if (existsSync(join(venvPath, "bin"))) {
142
+ venvPath = join(venvPath, "bin", "python");
143
+ } else if (existsSync(join(venvPath, "Scripts"))) {
144
+ venvPath = join(venvPath, "Scripts", "python.exe");
145
+ } else {
146
+ console.error(pc.red("Python venv not found"));
147
+ return false;
148
+ }
149
+
150
+ const batchScript = join(PLUGIN_DIR, "eng", "scripts", "setup", "run_batch.py");
151
+
152
+ try {
153
+ // Pass directory and flavor instead of individual config files to avoid command line length limits on Windows
154
+ execSync(
155
+ `"${venvPath}" "${batchScript}" --generated-dir "${PLUGIN_DIR}" --flavor ${flavor} --jobs ${jobs}`,
156
+ {
157
+ stdio: "inherit",
158
+ cwd: PLUGIN_DIR,
159
+ },
101
160
  );
161
+ return true;
162
+ } catch {
163
+ return false;
102
164
  }
103
165
  }
104
166
 
105
- function _getCmdList(spec: string, flags: RegenerateFlags): TspCommand[] {
106
- return buildOptions(spec, GENERATED_FOLDER, flags, config).map((po) => {
107
- const optionArgs = Object.entries(po.options).flatMap(([k, v]) => [
108
- "--option",
109
- `${EMITTER_NAME}.${k}="${v}"`,
110
- ]);
111
- return {
112
- outputDir: po.outputDir,
113
- command: ["compile", spec, "--emit", toPosix(PLUGIN_DIR), ...optionArgs],
114
- };
115
- });
116
- }
167
+ async function regenerateFlavor(
168
+ flavor: string,
169
+ name: string | undefined,
170
+ debug: boolean,
171
+ jobs: number,
172
+ ): Promise<boolean> {
173
+ console.log(pc.cyan(`\n${"=".repeat(60)}`));
174
+ console.log(pc.cyan(`Regenerating ${flavor} flavor`));
175
+ console.log(pc.cyan(`${"=".repeat(60)}\n`));
117
176
 
118
- const config: RegenerateConfig = {
119
- azureHttpSpecs: AZURE_HTTP_SPECS,
120
- httpSpecs: HTTP_SPECS,
121
- emitterOptions: EMITTER_OPTIONS,
122
- azureEmitterOptions: AZURE_EMITTER_OPTIONS,
123
- preprocess,
124
- getCmdList: _getCmdList,
125
- executeCommand,
126
- };
177
+ const flags: RegenerateFlags = { flavor, debug, name };
178
+
179
+ // Preprocess
180
+ await preprocess(flavor, GENERATED_FOLDER);
181
+
182
+ // Collect specs
183
+ const azureSpecs = flavor === "azure" ? await getSubdirectories(AZURE_HTTP_SPECS, flags) : [];
184
+ const standardSpecs = await getSubdirectories(HTTP_SPECS, flags);
185
+ const allSpecs = [...azureSpecs, ...standardSpecs];
186
+
187
+ // Build task groups (tasks for same spec run sequentially to avoid state pollution).
188
+ // emitYamlOnly: true -> phase 1 emits YAML only; phase 2 (runBatchPythonProcessing) writes .py files.
189
+ const groups = buildTaskGroups(allSpecs, flags, ctx, { emitYamlOnly: true });
190
+ const totalTasks = groups.reduce((sum, g) => sum + g.tasks.length, 0);
127
191
 
128
- const start = performance.now();
129
- regenerate(argv.values, config)
130
- .then(() =>
131
- console.log(
132
- chalk.green(
133
- `Regeneration successful, time taken: ${Math.round((performance.now() - start) / 1000)} s`,
134
- ),
192
+ console.log(pc.cyan(`Found ${allSpecs.length} specs (${totalTasks} total tasks) to compile`));
193
+ console.log(pc.cyan(`Using ${jobs} parallel jobs\n`));
194
+
195
+ // Run compilation (emits YAML only)
196
+ const startTime = performance.now();
197
+ const results = await runParallel(groups, jobs, ctx);
198
+ const compileTime = (performance.now() - startTime) / 1000;
199
+
200
+ // Summary for TypeSpec compilation
201
+ const succeeded = Array.from(results.values()).filter((v) => v).length;
202
+ const compileFailed = results.size - succeeded;
203
+
204
+ console.log(
205
+ pc.cyan(
206
+ `\nTypeSpec compilation: ${succeeded} succeeded, ${compileFailed} failed (${compileTime.toFixed(1)}s)`,
135
207
  ),
136
- )
137
- .catch((error) => console.error(chalk.red(`Regeneration failed: ${error.message}`)));
208
+ );
209
+
210
+ if (compileFailed > 0) {
211
+ console.log(pc.red(`Skipping Python processing due to compilation failures`));
212
+ return false;
213
+ }
214
+
215
+ // Batch process all specs with Python
216
+ const pyStartTime = performance.now();
217
+ const configCount = (await collectConfigFiles(GENERATED_FOLDER, flavor)).length;
218
+ // Use fewer Python jobs since Python processing is heavier
219
+ const pyJobs = Math.max(4, jobs);
220
+ const pySuccess = runBatchPythonProcessing(flavor, configCount, pyJobs);
221
+ const pyTime = (performance.now() - pyStartTime) / 1000;
222
+
223
+ const totalTime = (performance.now() - startTime) / 1000;
224
+
225
+ console.log(pc.cyan(`\n${"=".repeat(60)}`));
226
+ console.log(pc.cyan(`Results: ${succeeded} specs processed`));
227
+ console.log(
228
+ pc.cyan(
229
+ ` TypeSpec: ${compileTime.toFixed(1)}s | Python: ${pyTime.toFixed(1)}s | Total: ${totalTime.toFixed(1)}s`,
230
+ ),
231
+ );
232
+ console.log(pc.cyan(`${"=".repeat(60)}\n`));
233
+
234
+ return pySuccess;
235
+ }
236
+
237
+ async function main() {
238
+ const isWindows = platform() === "win32";
239
+ const flavor = argv.values.flavor;
240
+ const name = argv.values.name;
241
+ const debug = argv.values.debug ?? false;
242
+ // Windows has slower file system operations and process spawning,
243
+ // so use fewer parallel jobs to avoid I/O contention and memory pressure
244
+ const defaultJobs = isWindows ? 10 : 30;
245
+ const jobs = argv.values.jobs ? parseInt(argv.values.jobs, 10) : defaultJobs;
246
+
247
+ console.log(pc.cyan(`\nRegeneration config:`));
248
+ console.log(pc.cyan(` Platform: ${isWindows ? "Windows" : "Unix"}`));
249
+ console.log(pc.cyan(` Mode: in-process compilation`));
250
+ console.log(pc.cyan(` Jobs: ${jobs}`));
251
+ if (name) {
252
+ console.log(pc.cyan(` Filter: ${name}`));
253
+ }
254
+ console.log();
255
+
256
+ const startTime = performance.now();
257
+ let success: boolean;
258
+
259
+ await prepareBaselineOfGeneratedCode(GENERATED_FOLDER);
260
+
261
+ if (flavor) {
262
+ success = await regenerateFlavor(flavor, name, debug, jobs);
263
+ } else {
264
+ // Both flavors
265
+ const azureSuccess = await regenerateFlavor("azure", name, debug, jobs);
266
+ const unbrandedSuccess = await regenerateFlavor("unbranded", name, debug, jobs);
267
+ success = azureSuccess && unbrandedSuccess;
268
+ }
269
+
270
+ const totalDuration = (performance.now() - startTime) / 1000;
271
+ console.log(
272
+ success
273
+ ? pc.green(`\nRegeneration completed successfully in ${totalDuration.toFixed(1)}s`)
274
+ : pc.red(`\nRegeneration failed after ${totalDuration.toFixed(1)}s`),
275
+ );
276
+
277
+ process.exit(success ? 0 : 1);
278
+ }
279
+
280
+ main().catch((err) => {
281
+ console.error(pc.red(`Fatal error: ${err}`));
282
+ process.exit(1);
283
+ });