@uapkg/cli 1.2.0 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (412) hide show
  1. package/dist/app/CompositionRoot.d.ts +36 -33
  2. package/dist/app/CompositionRoot.d.ts.map +1 -1
  3. package/dist/app/CompositionRoot.js +91 -109
  4. package/dist/app/CompositionRoot.js.map +1 -1
  5. package/dist/app/UAPKGApplication.d.ts +6 -3
  6. package/dist/app/UAPKGApplication.d.ts.map +1 -1
  7. package/dist/app/UAPKGApplication.js +155 -169
  8. package/dist/app/UAPKGApplication.js.map +1 -1
  9. package/dist/build/BuildMetadata.d.ts +9 -6
  10. package/dist/build/BuildMetadata.d.ts.map +1 -1
  11. package/dist/build/BuildMetadata.js +2 -2
  12. package/dist/cli/UAPKGCommandLine.d.ts +259 -257
  13. package/dist/cli/UAPKGCommandLine.d.ts.map +1 -1
  14. package/dist/cli/UAPKGCommandLine.js +248 -239
  15. package/dist/cli/UAPKGCommandLine.js.map +1 -1
  16. package/dist/cli/parseCommandLine.d.ts +5 -1
  17. package/dist/cli/parseCommandLine.d.ts.map +1 -1
  18. package/dist/cli/parseCommandLine.js +8 -3
  19. package/dist/cli/parseCommandLine.js.map +1 -1
  20. package/dist/cli/parsing/UAPKGCommandLineParser.d.ts +9 -6
  21. package/dist/cli/parsing/UAPKGCommandLineParser.d.ts.map +1 -1
  22. package/dist/cli/parsing/UAPKGCommandLineParser.js +23 -31
  23. package/dist/cli/parsing/UAPKGCommandLineParser.js.map +1 -1
  24. package/dist/cli/parsing/UAPKGParserRegistry.d.ts +12 -9
  25. package/dist/cli/parsing/UAPKGParserRegistry.d.ts.map +1 -1
  26. package/dist/cli/parsing/UAPKGParserRegistry.js +53 -50
  27. package/dist/cli/parsing/UAPKGParserRegistry.js.map +1 -1
  28. package/dist/cli/parsing/contracts/UAPKGCommandModule.d.ts +9 -6
  29. package/dist/cli/parsing/contracts/UAPKGCommandModule.d.ts.map +1 -1
  30. package/dist/cli/parsing/contracts/UAPKGCommandModule.js +1 -2
  31. package/dist/cli/parsing/modules/AddCommandModule.d.ts +8 -5
  32. package/dist/cli/parsing/modules/AddCommandModule.d.ts.map +1 -1
  33. package/dist/cli/parsing/modules/AddCommandModule.js +49 -36
  34. package/dist/cli/parsing/modules/AddCommandModule.js.map +1 -1
  35. package/dist/cli/parsing/modules/ConfigCommandModule.d.ts +8 -5
  36. package/dist/cli/parsing/modules/ConfigCommandModule.d.ts.map +1 -1
  37. package/dist/cli/parsing/modules/ConfigCommandModule.js +87 -83
  38. package/dist/cli/parsing/modules/ConfigCommandModule.js.map +1 -1
  39. package/dist/cli/parsing/modules/InitCommandModule.d.ts +8 -5
  40. package/dist/cli/parsing/modules/InitCommandModule.d.ts.map +1 -1
  41. package/dist/cli/parsing/modules/InitCommandModule.js +25 -22
  42. package/dist/cli/parsing/modules/InitCommandModule.js.map +1 -1
  43. package/dist/cli/parsing/modules/InstallCommandModule.d.ts +8 -5
  44. package/dist/cli/parsing/modules/InstallCommandModule.d.ts.map +1 -1
  45. package/dist/cli/parsing/modules/InstallCommandModule.js +36 -28
  46. package/dist/cli/parsing/modules/InstallCommandModule.js.map +1 -1
  47. package/dist/cli/parsing/modules/LifecycleCommandModule.d.ts +8 -5
  48. package/dist/cli/parsing/modules/LifecycleCommandModule.d.ts.map +1 -1
  49. package/dist/cli/parsing/modules/LifecycleCommandModule.js +78 -50
  50. package/dist/cli/parsing/modules/LifecycleCommandModule.js.map +1 -1
  51. package/dist/cli/parsing/modules/ListCommandModule.d.ts +8 -5
  52. package/dist/cli/parsing/modules/ListCommandModule.d.ts.map +1 -1
  53. package/dist/cli/parsing/modules/ListCommandModule.js +26 -15
  54. package/dist/cli/parsing/modules/ListCommandModule.js.map +1 -1
  55. package/dist/cli/parsing/modules/LoginCommandModule.d.ts +8 -5
  56. package/dist/cli/parsing/modules/LoginCommandModule.d.ts.map +1 -1
  57. package/dist/cli/parsing/modules/LoginCommandModule.js +34 -33
  58. package/dist/cli/parsing/modules/LoginCommandModule.js.map +1 -1
  59. package/dist/cli/parsing/modules/LogoutCommandModule.d.ts +8 -5
  60. package/dist/cli/parsing/modules/LogoutCommandModule.d.ts.map +1 -1
  61. package/dist/cli/parsing/modules/LogoutCommandModule.js +30 -28
  62. package/dist/cli/parsing/modules/LogoutCommandModule.js.map +1 -1
  63. package/dist/cli/parsing/modules/OutdatedCommandModule.d.ts +8 -5
  64. package/dist/cli/parsing/modules/OutdatedCommandModule.d.ts.map +1 -1
  65. package/dist/cli/parsing/modules/OutdatedCommandModule.js +21 -16
  66. package/dist/cli/parsing/modules/OutdatedCommandModule.js.map +1 -1
  67. package/dist/cli/parsing/modules/PackCommandModule.d.ts +8 -5
  68. package/dist/cli/parsing/modules/PackCommandModule.d.ts.map +1 -1
  69. package/dist/cli/parsing/modules/PackCommandModule.js +30 -28
  70. package/dist/cli/parsing/modules/PackCommandModule.js.map +1 -1
  71. package/dist/cli/parsing/modules/ProjectGetNameCommandModule.d.ts +8 -5
  72. package/dist/cli/parsing/modules/ProjectGetNameCommandModule.d.ts.map +1 -1
  73. package/dist/cli/parsing/modules/ProjectGetNameCommandModule.js +14 -11
  74. package/dist/cli/parsing/modules/ProjectGetNameCommandModule.js.map +1 -1
  75. package/dist/cli/parsing/modules/PublishCommandModule.d.ts +8 -5
  76. package/dist/cli/parsing/modules/PublishCommandModule.d.ts.map +1 -1
  77. package/dist/cli/parsing/modules/PublishCommandModule.js +63 -47
  78. package/dist/cli/parsing/modules/PublishCommandModule.js.map +1 -1
  79. package/dist/cli/parsing/modules/RegistryCommandModule.d.ts +8 -5
  80. package/dist/cli/parsing/modules/RegistryCommandModule.d.ts.map +1 -1
  81. package/dist/cli/parsing/modules/RegistryCommandModule.js +117 -120
  82. package/dist/cli/parsing/modules/RegistryCommandModule.js.map +1 -1
  83. package/dist/cli/parsing/modules/RemoveCommandModule.d.ts +8 -5
  84. package/dist/cli/parsing/modules/RemoveCommandModule.d.ts.map +1 -1
  85. package/dist/cli/parsing/modules/RemoveCommandModule.js +25 -14
  86. package/dist/cli/parsing/modules/RemoveCommandModule.js.map +1 -1
  87. package/dist/cli/parsing/modules/RequestsCommandModule.d.ts +8 -5
  88. package/dist/cli/parsing/modules/RequestsCommandModule.d.ts.map +1 -1
  89. package/dist/cli/parsing/modules/RequestsCommandModule.js +56 -60
  90. package/dist/cli/parsing/modules/RequestsCommandModule.js.map +1 -1
  91. package/dist/cli/parsing/modules/UpdateCommandModule.d.ts +8 -5
  92. package/dist/cli/parsing/modules/UpdateCommandModule.d.ts.map +1 -1
  93. package/dist/cli/parsing/modules/UpdateCommandModule.js +38 -25
  94. package/dist/cli/parsing/modules/UpdateCommandModule.js.map +1 -1
  95. package/dist/cli/parsing/modules/WhoamiCommandModule.d.ts +8 -5
  96. package/dist/cli/parsing/modules/WhoamiCommandModule.d.ts.map +1 -1
  97. package/dist/cli/parsing/modules/WhoamiCommandModule.js +30 -28
  98. package/dist/cli/parsing/modules/WhoamiCommandModule.js.map +1 -1
  99. package/dist/cli/parsing/modules/WhyCommandModule.d.ts +8 -5
  100. package/dist/cli/parsing/modules/WhyCommandModule.d.ts.map +1 -1
  101. package/dist/cli/parsing/modules/WhyCommandModule.js +25 -14
  102. package/dist/cli/parsing/modules/WhyCommandModule.js.map +1 -1
  103. package/dist/cli/parsing/modules/sharedOptions.d.ts +8 -5
  104. package/dist/cli/parsing/modules/sharedOptions.d.ts.map +1 -1
  105. package/dist/cli/parsing/modules/sharedOptions.js +18 -23
  106. package/dist/cli/parsing/modules/sharedOptions.js.map +1 -1
  107. package/dist/cli/runUAPKGCLI.d.ts +4 -1
  108. package/dist/cli/runUAPKGCLI.d.ts.map +1 -1
  109. package/dist/cli/runUAPKGCLI.js +10 -5
  110. package/dist/cli/runUAPKGCLI.js.map +1 -1
  111. package/dist/cli-bootstrap.d.ts +1 -2
  112. package/dist/cli-bootstrap.js +15 -12
  113. package/dist/cli-bootstrap.js.map +1 -1
  114. package/dist/commands/AddCommand.d.ts +19 -16
  115. package/dist/commands/AddCommand.d.ts.map +1 -1
  116. package/dist/commands/AddCommand.js +49 -53
  117. package/dist/commands/AddCommand.js.map +1 -1
  118. package/dist/commands/Command.d.ts +5 -2
  119. package/dist/commands/Command.d.ts.map +1 -1
  120. package/dist/commands/Command.js +1 -2
  121. package/dist/commands/ConfigCommand.d.ts +28 -25
  122. package/dist/commands/ConfigCommand.d.ts.map +1 -1
  123. package/dist/commands/ConfigCommand.js +165 -186
  124. package/dist/commands/ConfigCommand.js.map +1 -1
  125. package/dist/commands/InitCommand.d.ts +19 -16
  126. package/dist/commands/InitCommand.d.ts.map +1 -1
  127. package/dist/commands/InitCommand.js +65 -60
  128. package/dist/commands/InitCommand.js.map +1 -1
  129. package/dist/commands/InstallCommand.d.ts +16 -13
  130. package/dist/commands/InstallCommand.d.ts.map +1 -1
  131. package/dist/commands/InstallCommand.js +118 -110
  132. package/dist/commands/InstallCommand.js.map +1 -1
  133. package/dist/commands/ListCommand.d.ts +13 -10
  134. package/dist/commands/ListCommand.d.ts.map +1 -1
  135. package/dist/commands/ListCommand.js +76 -81
  136. package/dist/commands/ListCommand.js.map +1 -1
  137. package/dist/commands/LoginCommand.d.ts +17 -14
  138. package/dist/commands/LoginCommand.d.ts.map +1 -1
  139. package/dist/commands/LoginCommand.js +66 -72
  140. package/dist/commands/LoginCommand.js.map +1 -1
  141. package/dist/commands/LogoutCommand.d.ts +15 -12
  142. package/dist/commands/LogoutCommand.d.ts.map +1 -1
  143. package/dist/commands/LogoutCommand.js +36 -37
  144. package/dist/commands/LogoutCommand.js.map +1 -1
  145. package/dist/commands/OutdatedCommand.d.ts +12 -9
  146. package/dist/commands/OutdatedCommand.d.ts.map +1 -1
  147. package/dist/commands/OutdatedCommand.js +41 -40
  148. package/dist/commands/OutdatedCommand.js.map +1 -1
  149. package/dist/commands/PackCommand.d.ts +13 -10
  150. package/dist/commands/PackCommand.d.ts.map +1 -1
  151. package/dist/commands/PackCommand.js +26 -21
  152. package/dist/commands/PackCommand.js.map +1 -1
  153. package/dist/commands/PackageLifecycleCommand.d.ts +23 -19
  154. package/dist/commands/PackageLifecycleCommand.d.ts.map +1 -1
  155. package/dist/commands/PackageLifecycleCommand.js +144 -129
  156. package/dist/commands/PackageLifecycleCommand.js.map +1 -1
  157. package/dist/commands/PostinstallCandidateBuilder.d.ts +11 -8
  158. package/dist/commands/PostinstallCandidateBuilder.d.ts.map +1 -1
  159. package/dist/commands/PostinstallCandidateBuilder.js +42 -42
  160. package/dist/commands/PostinstallCandidateBuilder.js.map +1 -1
  161. package/dist/commands/ProjectGetNameCommand.d.ts +10 -7
  162. package/dist/commands/ProjectGetNameCommand.d.ts.map +1 -1
  163. package/dist/commands/ProjectGetNameCommand.js +25 -25
  164. package/dist/commands/ProjectGetNameCommand.js.map +1 -1
  165. package/dist/commands/PublishCommand.d.ts +29 -23
  166. package/dist/commands/PublishCommand.d.ts.map +1 -1
  167. package/dist/commands/PublishCommand.js +243 -244
  168. package/dist/commands/PublishCommand.js.map +1 -1
  169. package/dist/commands/RegistryCommand.d.ts +38 -35
  170. package/dist/commands/RegistryCommand.d.ts.map +1 -1
  171. package/dist/commands/RegistryCommand.js +195 -223
  172. package/dist/commands/RegistryCommand.js.map +1 -1
  173. package/dist/commands/RemoveCommand.d.ts +14 -11
  174. package/dist/commands/RemoveCommand.d.ts.map +1 -1
  175. package/dist/commands/RemoveCommand.js +47 -54
  176. package/dist/commands/RemoveCommand.js.map +1 -1
  177. package/dist/commands/RequestsCommand.d.ts +21 -18
  178. package/dist/commands/RequestsCommand.d.ts.map +1 -1
  179. package/dist/commands/RequestsCommand.js +82 -95
  180. package/dist/commands/RequestsCommand.js.map +1 -1
  181. package/dist/commands/UpdateCommand.d.ts +29 -26
  182. package/dist/commands/UpdateCommand.d.ts.map +1 -1
  183. package/dist/commands/UpdateCommand.js +111 -111
  184. package/dist/commands/UpdateCommand.js.map +1 -1
  185. package/dist/commands/WhoamiCommand.d.ts +30 -27
  186. package/dist/commands/WhoamiCommand.d.ts.map +1 -1
  187. package/dist/commands/WhoamiCommand.js +63 -72
  188. package/dist/commands/WhoamiCommand.js.map +1 -1
  189. package/dist/commands/WhyCommand.d.ts +13 -10
  190. package/dist/commands/WhyCommand.d.ts.map +1 -1
  191. package/dist/commands/WhyCommand.js +45 -44
  192. package/dist/commands/WhyCommand.js.map +1 -1
  193. package/dist/commands/add/DependencyAddResolver.d.ts +14 -11
  194. package/dist/commands/add/DependencyAddResolver.d.ts.map +1 -1
  195. package/dist/commands/add/DependencyAddResolver.js +36 -36
  196. package/dist/commands/add/DependencyAddResolver.js.map +1 -1
  197. package/dist/control-plane/AccountManager.d.ts +96 -94
  198. package/dist/control-plane/AccountManager.d.ts.map +1 -1
  199. package/dist/control-plane/AccountManager.js +775 -967
  200. package/dist/control-plane/AccountManager.js.map +1 -1
  201. package/dist/control-plane/ArtifactObserver.d.ts +19 -16
  202. package/dist/control-plane/ArtifactObserver.d.ts.map +1 -1
  203. package/dist/control-plane/ArtifactObserver.js +73 -59
  204. package/dist/control-plane/ArtifactObserver.js.map +1 -1
  205. package/dist/control-plane/AuthMetadataStore.d.ts +16 -13
  206. package/dist/control-plane/AuthMetadataStore.d.ts.map +1 -1
  207. package/dist/control-plane/AuthMetadataStore.js +111 -113
  208. package/dist/control-plane/AuthMetadataStore.js.map +1 -1
  209. package/dist/control-plane/AuthStoragePaths.d.ts +7 -4
  210. package/dist/control-plane/AuthStoragePaths.d.ts.map +1 -1
  211. package/dist/control-plane/AuthStoragePaths.js +19 -14
  212. package/dist/control-plane/AuthStoragePaths.js.map +1 -1
  213. package/dist/control-plane/AuthenticationSelector.d.ts +21 -18
  214. package/dist/control-plane/AuthenticationSelector.d.ts.map +1 -1
  215. package/dist/control-plane/AuthenticationSelector.js +69 -63
  216. package/dist/control-plane/AuthenticationSelector.js.map +1 -1
  217. package/dist/control-plane/ControlPlaneClient.d.ts +37 -28
  218. package/dist/control-plane/ControlPlaneClient.d.ts.map +1 -1
  219. package/dist/control-plane/ControlPlaneClient.js +265 -254
  220. package/dist/control-plane/ControlPlaneClient.js.map +1 -1
  221. package/dist/control-plane/ControlPlaneEndpoints.d.ts +9 -6
  222. package/dist/control-plane/ControlPlaneEndpoints.d.ts.map +1 -1
  223. package/dist/control-plane/ControlPlaneEndpoints.js +17 -12
  224. package/dist/control-plane/ControlPlaneEndpoints.js.map +1 -1
  225. package/dist/control-plane/ControlPlaneTypes.d.ts +176 -152
  226. package/dist/control-plane/ControlPlaneTypes.d.ts.map +1 -1
  227. package/dist/control-plane/ControlPlaneTypes.js +88 -81
  228. package/dist/control-plane/ControlPlaneTypes.js.map +1 -1
  229. package/dist/control-plane/CredentialStore.d.ts +20 -18
  230. package/dist/control-plane/CredentialStore.d.ts.map +1 -1
  231. package/dist/control-plane/CredentialStore.js +66 -83
  232. package/dist/control-plane/CredentialStore.js.map +1 -1
  233. package/dist/control-plane/DPoPKeyStore.d.ts +12 -9
  234. package/dist/control-plane/DPoPKeyStore.d.ts.map +1 -1
  235. package/dist/control-plane/DPoPKeyStore.js +57 -53
  236. package/dist/control-plane/DPoPKeyStore.js.map +1 -1
  237. package/dist/control-plane/GitHubActionsOidcCredentialProvider.d.ts +37 -4
  238. package/dist/control-plane/GitHubActionsOidcCredentialProvider.d.ts.map +1 -1
  239. package/dist/control-plane/GitHubActionsOidcCredentialProvider.js +197 -63
  240. package/dist/control-plane/GitHubActionsOidcCredentialProvider.js.map +1 -1
  241. package/dist/control-plane/PublishIdempotencyStore.d.ts +25 -9
  242. package/dist/control-plane/PublishIdempotencyStore.d.ts.map +1 -1
  243. package/dist/control-plane/PublishIdempotencyStore.js +97 -68
  244. package/dist/control-plane/PublishIdempotencyStore.js.map +1 -1
  245. package/dist/control-plane/PublishRequestErrorMapper.d.ts +155 -0
  246. package/dist/control-plane/PublishRequestErrorMapper.d.ts.map +1 -0
  247. package/dist/control-plane/PublishRequestErrorMapper.js +597 -0
  248. package/dist/control-plane/PublishRequestErrorMapper.js.map +1 -0
  249. package/dist/control-plane/RegistryGrantLock.d.ts +29 -26
  250. package/dist/control-plane/RegistryGrantLock.d.ts.map +1 -1
  251. package/dist/control-plane/RegistryGrantLock.js +149 -185
  252. package/dist/control-plane/RegistryGrantLock.js.map +1 -1
  253. package/dist/control-plane/RegistryTrustResolver.d.ts +13 -10
  254. package/dist/control-plane/RegistryTrustResolver.d.ts.map +1 -1
  255. package/dist/control-plane/RegistryTrustResolver.js +97 -132
  256. package/dist/control-plane/RegistryTrustResolver.js.map +1 -1
  257. package/dist/index.d.ts +62 -39
  258. package/dist/index.js +60 -53
  259. package/dist/postinstall/api/PostinstallDsl.d.ts +24 -21
  260. package/dist/postinstall/api/PostinstallDsl.d.ts.map +1 -1
  261. package/dist/postinstall/api/PostinstallDsl.js +32 -35
  262. package/dist/postinstall/api/PostinstallDsl.js.map +1 -1
  263. package/dist/postinstall/api/definePostinstall.d.ts +5 -2
  264. package/dist/postinstall/api/definePostinstall.d.ts.map +1 -1
  265. package/dist/postinstall/api/definePostinstall.js +20 -16
  266. package/dist/postinstall/api/definePostinstall.js.map +1 -1
  267. package/dist/postinstall/index.d.ts +25 -26
  268. package/dist/postinstall/index.js +25 -37
  269. package/dist/postinstall/loader/EntryResolver.d.ts +11 -9
  270. package/dist/postinstall/loader/EntryResolver.d.ts.map +1 -1
  271. package/dist/postinstall/loader/EntryResolver.js +36 -32
  272. package/dist/postinstall/loader/EntryResolver.js.map +1 -1
  273. package/dist/postinstall/loader/EsbuildTranspiler.d.ts +6 -3
  274. package/dist/postinstall/loader/EsbuildTranspiler.d.ts.map +1 -1
  275. package/dist/postinstall/loader/EsbuildTranspiler.js +52 -56
  276. package/dist/postinstall/loader/EsbuildTranspiler.js.map +1 -1
  277. package/dist/postinstall/loader/ExportValidator.d.ts +8 -5
  278. package/dist/postinstall/loader/ExportValidator.d.ts.map +1 -1
  279. package/dist/postinstall/loader/ExportValidator.js +36 -32
  280. package/dist/postinstall/loader/ExportValidator.js.map +1 -1
  281. package/dist/postinstall/loader/ModuleImporter.d.ts +17 -14
  282. package/dist/postinstall/loader/ModuleImporter.d.ts.map +1 -1
  283. package/dist/postinstall/loader/ModuleImporter.js +50 -58
  284. package/dist/postinstall/loader/ModuleImporter.js.map +1 -1
  285. package/dist/postinstall/loader/PostinstallLoader.d.ts +22 -19
  286. package/dist/postinstall/loader/PostinstallLoader.d.ts.map +1 -1
  287. package/dist/postinstall/loader/PostinstallLoader.js +62 -58
  288. package/dist/postinstall/loader/PostinstallLoader.js.map +1 -1
  289. package/dist/postinstall/markers/MarkerBlockEditor.d.ts +19 -16
  290. package/dist/postinstall/markers/MarkerBlockEditor.d.ts.map +1 -1
  291. package/dist/postinstall/markers/MarkerBlockEditor.js +48 -44
  292. package/dist/postinstall/markers/MarkerBlockEditor.js.map +1 -1
  293. package/dist/postinstall/markers/MarkerBlockService.d.ts +10 -7
  294. package/dist/postinstall/markers/MarkerBlockService.d.ts.map +1 -1
  295. package/dist/postinstall/markers/MarkerBlockService.js +44 -44
  296. package/dist/postinstall/markers/MarkerBlockService.js.map +1 -1
  297. package/dist/postinstall/markers/MarkerIntegrityValidator.d.ts +12 -9
  298. package/dist/postinstall/markers/MarkerIntegrityValidator.d.ts.map +1 -1
  299. package/dist/postinstall/markers/MarkerIntegrityValidator.js +47 -52
  300. package/dist/postinstall/markers/MarkerIntegrityValidator.js.map +1 -1
  301. package/dist/postinstall/policy/PostinstallPolicyGate.d.ts +25 -23
  302. package/dist/postinstall/policy/PostinstallPolicyGate.d.ts.map +1 -1
  303. package/dist/postinstall/policy/PostinstallPolicyGate.js +63 -52
  304. package/dist/postinstall/policy/PostinstallPolicyGate.js.map +1 -1
  305. package/dist/postinstall/runner/PostinstallOrchestrator.d.ts +48 -45
  306. package/dist/postinstall/runner/PostinstallOrchestrator.d.ts.map +1 -1
  307. package/dist/postinstall/runner/PostinstallOrchestrator.js +172 -170
  308. package/dist/postinstall/runner/PostinstallOrchestrator.js.map +1 -1
  309. package/dist/postinstall/unreal/BuildCsInjector.d.ts +16 -13
  310. package/dist/postinstall/unreal/BuildCsInjector.d.ts.map +1 -1
  311. package/dist/postinstall/unreal/BuildCsInjector.js +58 -53
  312. package/dist/postinstall/unreal/BuildCsInjector.js.map +1 -1
  313. package/dist/postinstall/unreal/CSharpInjectionEngine.d.ts +13 -10
  314. package/dist/postinstall/unreal/CSharpInjectionEngine.d.ts.map +1 -1
  315. package/dist/postinstall/unreal/CSharpInjectionEngine.js +56 -59
  316. package/dist/postinstall/unreal/CSharpInjectionEngine.js.map +1 -1
  317. package/dist/postinstall/unreal/CSharpStructureAnalyzer.d.ts +11 -8
  318. package/dist/postinstall/unreal/CSharpStructureAnalyzer.d.ts.map +1 -1
  319. package/dist/postinstall/unreal/CSharpStructureAnalyzer.js +123 -127
  320. package/dist/postinstall/unreal/CSharpStructureAnalyzer.js.map +1 -1
  321. package/dist/postinstall/unreal/CSharpStructures.d.ts +18 -15
  322. package/dist/postinstall/unreal/CSharpStructures.d.ts.map +1 -1
  323. package/dist/postinstall/unreal/CSharpStructures.js +1 -2
  324. package/dist/postinstall/unreal/CSharpWrapperFactory.d.ts +7 -4
  325. package/dist/postinstall/unreal/CSharpWrapperFactory.d.ts.map +1 -1
  326. package/dist/postinstall/unreal/CSharpWrapperFactory.js +54 -58
  327. package/dist/postinstall/unreal/CSharpWrapperFactory.js.map +1 -1
  328. package/dist/postinstall/unreal/PluginHash.d.ts +5 -2
  329. package/dist/postinstall/unreal/PluginHash.d.ts.map +1 -1
  330. package/dist/postinstall/unreal/PluginHash.js +13 -8
  331. package/dist/postinstall/unreal/PluginHash.js.map +1 -1
  332. package/dist/postinstall/unreal/PrettyParseError.d.ts +8 -5
  333. package/dist/postinstall/unreal/PrettyParseError.d.ts.map +1 -1
  334. package/dist/postinstall/unreal/PrettyParseError.js +37 -37
  335. package/dist/postinstall/unreal/PrettyParseError.js.map +1 -1
  336. package/dist/postinstall/unreal/ProjectFileLocator.d.ts +12 -9
  337. package/dist/postinstall/unreal/ProjectFileLocator.d.ts.map +1 -1
  338. package/dist/postinstall/unreal/ProjectFileLocator.js +49 -51
  339. package/dist/postinstall/unreal/ProjectFileLocator.js.map +1 -1
  340. package/dist/postinstall/unreal/TargetCsInjector.d.ts +16 -13
  341. package/dist/postinstall/unreal/TargetCsInjector.d.ts.map +1 -1
  342. package/dist/postinstall/unreal/TargetCsInjector.js +58 -53
  343. package/dist/postinstall/unreal/TargetCsInjector.js.map +1 -1
  344. package/dist/postinstall/unreal/UProjectInjector.d.ts +6 -3
  345. package/dist/postinstall/unreal/UProjectInjector.d.ts.map +1 -1
  346. package/dist/postinstall/unreal/UProjectInjector.js +56 -52
  347. package/dist/postinstall/unreal/UProjectInjector.js.map +1 -1
  348. package/dist/postinstall/unreal/UProjectMetadataReader.d.ts +5 -2
  349. package/dist/postinstall/unreal/UProjectMetadataReader.d.ts.map +1 -1
  350. package/dist/postinstall/unreal/UProjectMetadataReader.js +22 -18
  351. package/dist/postinstall/unreal/UProjectMetadataReader.js.map +1 -1
  352. package/dist/postinstall/unreal/UnrealSourceCatalog.d.ts +17 -14
  353. package/dist/postinstall/unreal/UnrealSourceCatalog.d.ts.map +1 -1
  354. package/dist/postinstall/unreal/UnrealSourceCatalog.js +50 -50
  355. package/dist/postinstall/unreal/UnrealSourceCatalog.js.map +1 -1
  356. package/dist/prompts/InkPromptService.d.ts +10 -7
  357. package/dist/prompts/InkPromptService.d.ts.map +1 -1
  358. package/dist/prompts/InkPromptService.js +100 -71
  359. package/dist/prompts/InkPromptService.js.map +1 -1
  360. package/dist/prompts/ProjectContextDetector.d.ts +10 -7
  361. package/dist/prompts/ProjectContextDetector.d.ts.map +1 -1
  362. package/dist/prompts/ProjectContextDetector.js +32 -26
  363. package/dist/prompts/ProjectContextDetector.js.map +1 -1
  364. package/dist/prompts/PromptService.d.ts +11 -8
  365. package/dist/prompts/PromptService.d.ts.map +1 -1
  366. package/dist/prompts/PromptService.js +1 -8
  367. package/dist/reporting/DiagnosticDeduplicator.d.ts +8 -5
  368. package/dist/reporting/DiagnosticDeduplicator.d.ts.map +1 -1
  369. package/dist/reporting/DiagnosticDeduplicator.js +36 -35
  370. package/dist/reporting/DiagnosticDeduplicator.js.map +1 -1
  371. package/dist/reporting/DiagnosticRenderer.d.ts +11 -8
  372. package/dist/reporting/DiagnosticRenderer.d.ts.map +1 -1
  373. package/dist/reporting/DiagnosticRenderer.js +1 -2
  374. package/dist/reporting/DiagnosticReporter.d.ts +12 -9
  375. package/dist/reporting/DiagnosticReporter.d.ts.map +1 -1
  376. package/dist/reporting/DiagnosticReporter.js +40 -39
  377. package/dist/reporting/DiagnosticReporter.js.map +1 -1
  378. package/dist/reporting/InkDiagnosticRenderer.d.ts +12 -9
  379. package/dist/reporting/InkDiagnosticRenderer.d.ts.map +1 -1
  380. package/dist/reporting/InkDiagnosticRenderer.js +50 -42
  381. package/dist/reporting/InkDiagnosticRenderer.js.map +1 -1
  382. package/dist/reporting/InstallProgressReporter.d.ts +23 -20
  383. package/dist/reporting/InstallProgressReporter.d.ts.map +1 -1
  384. package/dist/reporting/InstallProgressReporter.js +48 -47
  385. package/dist/reporting/InstallProgressReporter.js.map +1 -1
  386. package/dist/reporting/JsonReporter.d.ts +16 -13
  387. package/dist/reporting/JsonReporter.d.ts.map +1 -1
  388. package/dist/reporting/JsonReporter.js +34 -20
  389. package/dist/reporting/JsonReporter.js.map +1 -1
  390. package/dist/reporting/RegistryRequestTerminalFormatter.d.ts +36 -0
  391. package/dist/reporting/RegistryRequestTerminalFormatter.d.ts.map +1 -0
  392. package/dist/reporting/RegistryRequestTerminalFormatter.js +90 -0
  393. package/dist/reporting/RegistryRequestTerminalFormatter.js.map +1 -0
  394. package/dist/reporting/TextDiagnosticRenderer.d.ts +11 -8
  395. package/dist/reporting/TextDiagnosticRenderer.d.ts.map +1 -1
  396. package/dist/reporting/TextDiagnosticRenderer.js +36 -28
  397. package/dist/reporting/TextDiagnosticRenderer.js.map +1 -1
  398. package/dist/reporting/TextSink.d.ts +14 -11
  399. package/dist/reporting/TextSink.d.ts.map +1 -1
  400. package/dist/reporting/TextSink.js +24 -20
  401. package/dist/reporting/TextSink.js.map +1 -1
  402. package/package.json +31 -32
  403. package/dist/cli/parsing/contracts/UAPKGCommandModule.js.map +0 -1
  404. package/dist/cli-bootstrap.d.ts.map +0 -1
  405. package/dist/commands/Command.js.map +0 -1
  406. package/dist/index.d.ts.map +0 -1
  407. package/dist/index.js.map +0 -1
  408. package/dist/postinstall/index.d.ts.map +0 -1
  409. package/dist/postinstall/index.js.map +0 -1
  410. package/dist/postinstall/unreal/CSharpStructures.js.map +0 -1
  411. package/dist/prompts/PromptService.js.map +0 -1
  412. package/dist/reporting/DiagnosticRenderer.js.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"file":"DPoPKeyStore.js","sourceRoot":"","sources":["../../src/control-plane/DPoPKeyStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAUxC,MAAM,OAAO,YAAY;IACa;IAApC,YAAoC,WAA4B;QAA5B,gBAAW,GAAX,WAAW,CAAiB;IAAG,CAAC;IAE7D,KAAK,CAAC,QAAQ;QACnB,MAAM,EAAE,eAAe,EAAE,GAAG,MAAM,MAAM,CAAC,cAAc,CAAC,CAAC;QACzD,OAAO,eAAe,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,SAAiB,EAAE,IAAyB;QAC5D,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAChD,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC;YACjD,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;SACnD,CAAC,CAAC;QACH,MAAM,UAAU,GAA0B;YACxC,SAAS,EAAE,OAAO;YAClB,SAAS;YACT,UAAU;SACX,CAAC;QACF,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,CAAC;IACpE,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,SAAiB;QACjC,MAAM,GAAG,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;QAClD,IAAI,CAAC,GAAG;YAAE,OAAO,SAAS,CAAC;QAE3B,IAAI,KAA4B,CAAC;QACjC,IAAI,CAAC;YACH,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAA0B,CAAC;QACnD,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CAAC,6CAA6C,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QACnF,CAAC;QACD,IAAI,KAAK,CAAC,SAAS,KAAK,OAAO,IAAI,CAAC,KAAK,CAAC,SAAS,IAAI,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC;YACzE,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC;QACzE,CAAC;QAED,MAAM,SAAS,GAAgC,EAAE,IAAI,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,CAAC;QACtF,MAAM,CAAC,SAAS,EAAE,UAAU,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YAChD,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,QAAQ,CAAC,CAAC;YAC/E,SAAS,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,EAAE,KAAK,CAAC,UAAU,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,MAAM,CAAC,CAAC;SAC/E,CAAC,CAAC;QACH,MAAM,SAAS,GAAG,SAAS,CAAC,eAAe,CAAC,IAAI,UAAU,CAAC,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,SAAS,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;QACzG,MAAM,OAAO,GAAG,MAAM,SAAS,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,SAAS,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QACnH,IAAI,CAAC,OAAO,EAAE,CAAC;YACb,MAAM,IAAI,KAAK,CAAC,4DAA4D,CAAC,CAAC;QAChF,CAAC;QACD,OAAO,EAAE,SAAS,EAAE,UAAU,EAAyB,CAAC;IAC1D,CAAC;IAEM,KAAK,CAAC,MAAM,CAAC,SAAiB;QACnC,MAAM,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3C,CAAC;CACF"}
1
+ {"version":3,"file":"DPoPKeyStore.js","names":[],"sources":["../../src/control-plane/DPoPKeyStore.ts"],"sourcesContent":["import { webcrypto } from 'node:crypto';\nimport type * as oauth from 'oauth4webapi';\nimport type { CredentialStore } from './CredentialStore.js';\n\ninterface SerializedDPoPKeyPair {\n readonly algorithm: 'ES256';\n readonly publicKey: webcrypto.JsonWebKey;\n readonly privateKey: webcrypto.JsonWebKey;\n}\n\nexport class DPoPKeyStore {\n public constructor(private readonly credentials: CredentialStore) {}\n\n public async generate(): Promise<oauth.CryptoKeyPair> {\n const { generateKeyPair } = await import('oauth4webapi');\n return generateKeyPair('ES256', { extractable: true });\n }\n\n public async save(reference: string, pair: oauth.CryptoKeyPair): Promise<void> {\n const [publicKey, privateKey] = await Promise.all([\n webcrypto.subtle.exportKey('jwk', pair.publicKey),\n webcrypto.subtle.exportKey('jwk', pair.privateKey),\n ]);\n const serialized: SerializedDPoPKeyPair = {\n algorithm: 'ES256',\n publicKey,\n privateKey,\n };\n await this.credentials.set(reference, JSON.stringify(serialized));\n }\n\n public async load(reference: string): Promise<oauth.CryptoKeyPair | undefined> {\n const raw = await this.credentials.get(reference);\n if (!raw) return undefined;\n\n let saved: SerializedDPoPKeyPair;\n try {\n saved = JSON.parse(raw) as SerializedDPoPKeyPair;\n } catch (error) {\n throw new Error('The saved UAPKG DPoP key is not valid JSON.', { cause: error });\n }\n if (saved.algorithm !== 'ES256' || !saved.publicKey || !saved.privateKey) {\n throw new Error('The saved UAPKG DPoP key has an unsupported format.');\n }\n\n const algorithm: webcrypto.EcKeyImportParams = { name: 'ECDSA', namedCurve: 'P-256' };\n const [publicKey, privateKey] = await Promise.all([\n webcrypto.subtle.importKey('jwk', saved.publicKey, algorithm, true, ['verify']),\n webcrypto.subtle.importKey('jwk', saved.privateKey, algorithm, true, ['sign']),\n ]);\n const challenge = webcrypto.getRandomValues(new Uint8Array(32));\n const signature = await webcrypto.subtle.sign({ name: 'ECDSA', hash: 'SHA-256' }, privateKey, challenge);\n const matches = await webcrypto.subtle.verify({ name: 'ECDSA', hash: 'SHA-256' }, publicKey, signature, challenge);\n if (!matches) {\n throw new Error('The saved UAPKG DPoP public and private keys do not match.');\n }\n return { publicKey, privateKey } as oauth.CryptoKeyPair;\n }\n\n public async delete(reference: string): Promise<void> {\n await this.credentials.delete(reference);\n }\n}\n"],"mappings":";;;AAUA,IAAa,eAAb,MAA0B;CACY;CAApC,AAAO,YAAY,AAAiB,aAA8B;EAA9B;CAA+B;CAEnE,MAAa,WAAyC;EACpD,MAAM,EAAE,oBAAoB,MAAM,OAAO;EACzC,OAAO,gBAAgB,SAAS,EAAE,aAAa,KAAK,CAAC;CACvD;CAEA,MAAa,KAAK,WAAmB,MAA0C;EAC7E,MAAM,CAAC,WAAW,cAAc,MAAM,QAAQ,IAAI,CAChD,UAAU,OAAO,UAAU,OAAO,KAAK,SAAS,GAChD,UAAU,OAAO,UAAU,OAAO,KAAK,UAAU,CACnD,CAAC;EACD,MAAM,aAAoC;GACxC,WAAW;GACX;GACA;EACF;EACA,MAAM,KAAK,YAAY,IAAI,WAAW,KAAK,UAAU,UAAU,CAAC;CAClE;CAEA,MAAa,KAAK,WAA6D;EAC7E,MAAM,MAAM,MAAM,KAAK,YAAY,IAAI,SAAS;EAChD,IAAI,CAAC,KAAK,OAAO;EAEjB,IAAI;EACJ,IAAI;GACF,QAAQ,KAAK,MAAM,GAAG;EACxB,SAAS,OAAO;GACd,MAAM,IAAI,MAAM,+CAA+C,EAAE,OAAO,MAAM,CAAC;EACjF;EACA,IAAI,MAAM,cAAc,WAAW,CAAC,MAAM,aAAa,CAAC,MAAM,YAC5D,MAAM,IAAI,MAAM,qDAAqD;EAGvE,MAAM,YAAyC;GAAE,MAAM;GAAS,YAAY;EAAQ;EACpF,MAAM,CAAC,WAAW,cAAc,MAAM,QAAQ,IAAI,CAChD,UAAU,OAAO,UAAU,OAAO,MAAM,WAAW,WAAW,MAAM,CAAC,QAAQ,CAAC,GAC9E,UAAU,OAAO,UAAU,OAAO,MAAM,YAAY,WAAW,MAAM,CAAC,MAAM,CAAC,CAC/E,CAAC;EACD,MAAM,YAAY,UAAU,gCAAgB,IAAI,WAAW,EAAE,CAAC;EAC9D,MAAM,YAAY,MAAM,UAAU,OAAO,KAAK;GAAE,MAAM;GAAS,MAAM;EAAU,GAAG,YAAY,SAAS;EAEvG,IAAI,CAAC,MADiB,UAAU,OAAO,OAAO;GAAE,MAAM;GAAS,MAAM;EAAU,GAAG,WAAW,WAAW,SAAS,GAE/G,MAAM,IAAI,MAAM,4DAA4D;EAE9E,OAAO;GAAE;GAAW;EAAW;CACjC;CAEA,MAAa,OAAO,WAAkC;EACpD,MAAM,KAAK,YAAY,OAAO,SAAS;CACzC;AACF"}
@@ -1,6 +1,39 @@
1
- import { type RegistryTrust } from './ControlPlaneTypes.js';
2
- export declare class GitHubActionsOidcCredentialProvider {
3
- isAvailable(): boolean;
4
- exchange(trust: RegistryTrust): Promise<string>;
1
+ import { RegistryTrust } from "./ControlPlaneTypes.js";
2
+ //#region src/control-plane/GitHubActionsOidcCredentialProvider.d.ts
3
+ type GitHubActionsOidcErrorCode = 'OIDC_CONTROL_PLANE_UNTRUSTED' | 'OIDC_EXCHANGE_TARGET_INVALID' | 'OIDC_GITHUB_CONTEXT_UNAVAILABLE' | 'OIDC_GITHUB_ENDPOINT_INVALID' | 'OIDC_GITHUB_TOKEN_REQUEST_FAILED' | 'OIDC_GITHUB_TOKEN_REQUEST_TIMEOUT' | 'OIDC_GITHUB_TOKEN_REJECTED' | 'OIDC_GITHUB_TOKEN_RESPONSE_INVALID' | 'OIDC_GITHUB_TOKEN_RESPONSE_TOO_LARGE' | 'OIDC_EXCHANGE_REQUEST_FAILED' | 'OIDC_EXCHANGE_REQUEST_TIMEOUT' | 'OIDC_EXCHANGE_REJECTED' | 'OIDC_EXCHANGE_RESPONSE_INVALID' | 'OIDC_EXCHANGE_RESPONSE_TOO_LARGE';
4
+ /** Stable local failures from the GitHub Actions OIDC credential flow. */
5
+ declare class GitHubActionsOidcError extends Error {
6
+ readonly code: GitHubActionsOidcErrorCode;
7
+ readonly status?: number | undefined;
8
+ constructor(code: GitHubActionsOidcErrorCode, message: string, status?: number | undefined, options?: ErrorOptions);
5
9
  }
10
+ interface GitHubActionsOidcCredentialProviderOptions {
11
+ readonly fetch?: typeof fetch;
12
+ readonly sleep?: (milliseconds: number) => Promise<void>;
13
+ readonly requestTimeoutMs?: number;
14
+ readonly maxResponseBytes?: number;
15
+ readonly maxAttempts?: number;
16
+ readonly maxRetryDelayMs?: number;
17
+ }
18
+ /** Package selector bound into every UAPKG OIDC exchange. */
19
+ interface GitHubActionsOidcTarget {
20
+ readonly registryId: string;
21
+ readonly packageName: string;
22
+ }
23
+ declare class GitHubActionsOidcCredentialProvider {
24
+ private readonly fetch;
25
+ private readonly sleep;
26
+ private readonly requestTimeoutMs;
27
+ private readonly maxResponseBytes;
28
+ private readonly maxAttempts;
29
+ private readonly maxRetryDelayMs;
30
+ constructor(options?: GitHubActionsOidcCredentialProviderOptions);
31
+ isAvailable(): boolean;
32
+ exchange(trust: RegistryTrust, target: GitHubActionsOidcTarget): Promise<string>;
33
+ private fetchWithRetry;
34
+ private retryDelay;
35
+ private readJson;
36
+ }
37
+ //#endregion
38
+ export { GitHubActionsOidcCredentialProvider, GitHubActionsOidcCredentialProviderOptions, GitHubActionsOidcError, GitHubActionsOidcErrorCode, GitHubActionsOidcTarget };
6
39
  //# sourceMappingURL=GitHubActionsOidcCredentialProvider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"GitHubActionsOidcCredentialProvider.d.ts","sourceRoot":"","sources":["../../src/control-plane/GitHubActionsOidcCredentialProvider.ts"],"names":[],"mappings":"AACA,OAAO,EAEL,KAAK,aAAa,EAGnB,MAAM,wBAAwB,CAAC;AAShC,qBAAa,mCAAmC;IACvC,WAAW,IAAI,OAAO;IAQhB,QAAQ,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,MAAM,CAAC;CAkD7D"}
1
+ {"version":3,"file":"GitHubActionsOidcCredentialProvider.d.ts","names":[],"sources":["../../src/control-plane/GitHubActionsOidcCredentialProvider.ts"],"mappings":";;KA8BY;;cAiBC,+BAA+B;WAExB,MAAM;WAEN;EAHlB,YACkB,MAAM,4BACtB,iBACgB,6BAChB,UAAU;;UAOG;WACN,eAAe;WACf,SAAS,yBAAyB;WAClC;WACA;WACA;WACA;;;UAIM;WACN;WACA;;cAKE;mBACM;mBACA;mBACA;mBACA;mBACA;mBACA;EAEjB,YAAmB,UAAS;EASrB;EAQM,SAAS,OAAO,eAAe,QAAQ,0BAA0B;UA8FhE;UA2BN;UAMM"}
@@ -1,67 +1,201 @@
1
- import { z } from 'zod';
2
- import { ControlPlaneError, UAPKG_CONTROL_PLANE_API, UAPKG_GITHUB_OIDC_AUDIENCE, } from './ControlPlaneTypes.js';
3
- const githubResponseSchema = z.object({ value: z.string().min(1) });
4
- const exchangeResponseSchema = z.object({
5
- ok: z.literal(true),
6
- token: z.string().min(1),
7
- expiresAt: z.number().int().positive(),
1
+ import { ControlPlaneError, UAPKG_CONTROL_PLANE_API, UAPKG_GITHUB_OIDC_AUDIENCE } from "./ControlPlaneTypes.js";
2
+ import { z } from "zod";
3
+
4
+ //#region src/control-plane/GitHubActionsOidcCredentialProvider.ts
5
+ const DEFAULT_REQUEST_TIMEOUT_MS = 3e4;
6
+ const DEFAULT_MAX_RESPONSE_BYTES = 65536;
7
+ const DEFAULT_MAX_ATTEMPTS = 3;
8
+ const DEFAULT_RETRY_DELAY_MS = 1e3;
9
+ const DEFAULT_MAX_RETRY_DELAY_MS = 3e4;
10
+ const RETRYABLE_STATUS_CODES = /* @__PURE__ */ new Set([429, 503]);
11
+ const githubResponseSchema = z.strictObject({ value: z.string().min(1) });
12
+ const exchangeResponseSchema = z.strictObject({
13
+ ok: z.literal(true),
14
+ token: z.string().min(1),
15
+ expiresAt: z.number().int().positive()
8
16
  });
9
- export class GitHubActionsOidcCredentialProvider {
10
- isAvailable() {
11
- return Boolean(process.env.GITHUB_ACTIONS === 'true' ||
12
- process.env.ACTIONS_ID_TOKEN_REQUEST_URL ||
13
- process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN);
14
- }
15
- async exchange(trust) {
16
- if (trust.apiBaseUrl !== UAPKG_CONTROL_PLANE_API) {
17
- throw new Error(`UAPKG v1 OIDC exchange is pinned to ${UAPKG_CONTROL_PLANE_API}.`);
18
- }
19
- const requestUrl = process.env.ACTIONS_ID_TOKEN_REQUEST_URL;
20
- const requestToken = process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
21
- if (!this.isAvailable() || !requestUrl || !requestToken) {
22
- throw new Error('GitHub Actions OIDC was selected but its identity-token endpoint is unavailable. The workflow must grant `id-token: write`.');
23
- }
24
- const url = new URL(requestUrl);
25
- if (url.protocol !== 'https:' || !url.hostname.endsWith('.actions.githubusercontent.com')) {
26
- throw new Error('GitHub Actions supplied an unexpected OIDC token endpoint.');
27
- }
28
- url.searchParams.set('audience', UAPKG_GITHUB_OIDC_AUDIENCE);
29
- const githubResponse = await fetch(url, {
30
- headers: { authorization: `Bearer ${requestToken}` },
31
- });
32
- const githubValue = githubResponseSchema.safeParse(await safeJson(githubResponse));
33
- if (!githubResponse.ok || !githubValue.success) {
34
- throw new Error(`GitHub Actions did not issue an OIDC identity token (HTTP ${githubResponse.status}).`);
35
- }
36
- const exchangeResponse = await fetch(new URL('/v1/github-user-app/oidc/github-actions/exchange', trust.apiBaseUrl), {
37
- method: 'POST',
38
- headers: { 'content-type': 'application/json' },
39
- body: JSON.stringify({
40
- provider: 'github_actions',
41
- audience: UAPKG_GITHUB_OIDC_AUDIENCE,
42
- idToken: githubValue.data.value,
43
- }),
44
- });
45
- const exchangeValue = await safeJson(exchangeResponse);
46
- if (!exchangeResponse.ok) {
47
- const error = z.object({ error: z.object({ code: z.string(), message: z.string() }) }).safeParse(exchangeValue);
48
- if (error.success) {
49
- throw new ControlPlaneError(error.data.error.code, error.data.error.message, exchangeResponse.status);
50
- }
51
- throw new Error(`UAPKG rejected the GitHub Actions identity (HTTP ${exchangeResponse.status}).`);
52
- }
53
- const parsed = exchangeResponseSchema.safeParse(exchangeValue);
54
- if (!parsed.success)
55
- throw new Error('The UAPKG OIDC exchange response was invalid.');
56
- return parsed.data.token;
57
- }
17
+ const exchangeErrorSchema = z.strictObject({
18
+ ok: z.literal(false),
19
+ error: z.strictObject({
20
+ code: z.string().min(1),
21
+ message: z.string().min(1),
22
+ details: z.record(z.string(), z.unknown()).optional()
23
+ })
24
+ });
25
+ /** Stable local failures from the GitHub Actions OIDC credential flow. */
26
+ var GitHubActionsOidcError = class extends Error {
27
+ code;
28
+ status;
29
+ constructor(code, message, status, options) {
30
+ super(message, options);
31
+ this.code = code;
32
+ this.status = status;
33
+ this.name = "GitHubActionsOidcError";
34
+ }
35
+ };
36
+ var GitHubActionsOidcCredentialProvider = class {
37
+ fetch;
38
+ sleep;
39
+ requestTimeoutMs;
40
+ maxResponseBytes;
41
+ maxAttempts;
42
+ maxRetryDelayMs;
43
+ constructor(options = {}) {
44
+ this.fetch = options.fetch ?? globalThis.fetch;
45
+ this.sleep = options.sleep ?? delay;
46
+ this.requestTimeoutMs = positiveInteger(options.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS);
47
+ this.maxResponseBytes = positiveInteger(options.maxResponseBytes, DEFAULT_MAX_RESPONSE_BYTES);
48
+ this.maxAttempts = positiveInteger(options.maxAttempts, DEFAULT_MAX_ATTEMPTS);
49
+ this.maxRetryDelayMs = positiveInteger(options.maxRetryDelayMs, DEFAULT_MAX_RETRY_DELAY_MS);
50
+ }
51
+ isAvailable() {
52
+ return Boolean(process.env.GITHUB_ACTIONS === "true" || process.env.ACTIONS_ID_TOKEN_REQUEST_URL || process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN);
53
+ }
54
+ async exchange(trust, target) {
55
+ if (trust.apiBaseUrl !== UAPKG_CONTROL_PLANE_API) throw new GitHubActionsOidcError("OIDC_CONTROL_PLANE_UNTRUSTED", `UAPKG v1 OIDC exchange is pinned to ${UAPKG_CONTROL_PLANE_API}.`);
56
+ const packageName = target.packageName.trim();
57
+ if (target.registryId !== trust.registryId || !packageName) throw new GitHubActionsOidcError("OIDC_EXCHANGE_TARGET_INVALID", "GitHub Actions OIDC requires the exact trusted registry and packaged package name.");
58
+ const requestUrl = process.env.ACTIONS_ID_TOKEN_REQUEST_URL;
59
+ const requestToken = process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;
60
+ if (!this.isAvailable() || !requestUrl || !requestToken) throw new GitHubActionsOidcError("OIDC_GITHUB_CONTEXT_UNAVAILABLE", "GitHub Actions OIDC was selected but its identity-token endpoint is unavailable. The workflow must grant `id-token: write`.");
61
+ const url = parseGitHubOidcEndpoint(requestUrl);
62
+ url.searchParams.set("audience", UAPKG_GITHUB_OIDC_AUDIENCE);
63
+ const githubResponse = await this.fetchWithRetry(url, { headers: { authorization: `Bearer ${requestToken}` } }, "github");
64
+ const githubValue = githubResponseSchema.safeParse(await this.readJson(githubResponse, "github"));
65
+ if (!githubResponse.ok) throw new GitHubActionsOidcError("OIDC_GITHUB_TOKEN_REJECTED", `GitHub Actions did not issue an OIDC identity token (HTTP ${githubResponse.status}).`, githubResponse.status);
66
+ if (!githubValue.success) throw new GitHubActionsOidcError("OIDC_GITHUB_TOKEN_RESPONSE_INVALID", "GitHub Actions returned an invalid OIDC identity-token response.", githubResponse.status);
67
+ const exchangeResponse = await this.fetchWithRetry(new URL("/v1/oidc/github-actions/exchange", trust.apiBaseUrl), {
68
+ method: "POST",
69
+ headers: { "content-type": "application/json" },
70
+ body: JSON.stringify({
71
+ provider: "github_actions",
72
+ audience: UAPKG_GITHUB_OIDC_AUDIENCE,
73
+ idToken: githubValue.data.value,
74
+ target: {
75
+ registryId: target.registryId,
76
+ packageName
77
+ }
78
+ })
79
+ }, "exchange");
80
+ const exchangeValue = await this.readJson(exchangeResponse, "exchange");
81
+ if (!exchangeResponse.ok) {
82
+ const error = exchangeErrorSchema.safeParse(exchangeValue);
83
+ if (error.success) throw new ControlPlaneError(error.data.error.code, error.data.error.message, exchangeResponse.status, error.data.error.details);
84
+ throw new GitHubActionsOidcError("OIDC_EXCHANGE_REJECTED", `UAPKG rejected the GitHub Actions identity (HTTP ${exchangeResponse.status}).`, exchangeResponse.status);
85
+ }
86
+ const parsed = exchangeResponseSchema.safeParse(exchangeValue);
87
+ if (!parsed.success) throw new GitHubActionsOidcError("OIDC_EXCHANGE_RESPONSE_INVALID", "The UAPKG OIDC exchange response was invalid.", exchangeResponse.status);
88
+ return parsed.data.token;
89
+ }
90
+ async fetchWithRetry(url, init, endpoint) {
91
+ for (let attempt = 1; attempt <= this.maxAttempts; attempt += 1) {
92
+ let response;
93
+ try {
94
+ response = await this.fetch(url, {
95
+ ...init,
96
+ redirect: "error",
97
+ signal: AbortSignal.timeout(this.requestTimeoutMs)
98
+ });
99
+ } catch (error) {
100
+ if (attempt < this.maxAttempts) {
101
+ await this.sleep(this.retryDelay(void 0, attempt));
102
+ continue;
103
+ }
104
+ throw requestFailure(endpoint, error);
105
+ }
106
+ if (!RETRYABLE_STATUS_CODES.has(response.status) || attempt === this.maxAttempts) return response;
107
+ const retryAfter = response.headers.get("retry-after");
108
+ await response.body?.cancel().catch(() => void 0);
109
+ await this.sleep(this.retryDelay(retryAfter, attempt));
110
+ }
111
+ throw new Error("OIDC retry loop exhausted unexpectedly.");
112
+ }
113
+ retryDelay(retryAfter, attempt) {
114
+ const parsed = parseRetryAfter(retryAfter);
115
+ const fallback = DEFAULT_RETRY_DELAY_MS * 2 ** (attempt - 1);
116
+ return Math.min(parsed ?? fallback, this.maxRetryDelayMs);
117
+ }
118
+ async readJson(response, endpoint) {
119
+ const contentLength = parseContentLength(response.headers.get("content-length"));
120
+ if (contentLength !== void 0 && contentLength > this.maxResponseBytes) {
121
+ await response.body?.cancel().catch(() => void 0);
122
+ throw responseTooLarge(endpoint, response.status);
123
+ }
124
+ const chunks = [];
125
+ let byteLength = 0;
126
+ if (response.body) {
127
+ const reader = response.body.getReader();
128
+ try {
129
+ while (true) {
130
+ const { done, value } = await reader.read();
131
+ if (done) break;
132
+ byteLength += value.byteLength;
133
+ if (byteLength > this.maxResponseBytes) {
134
+ await reader.cancel().catch(() => void 0);
135
+ throw responseTooLarge(endpoint, response.status);
136
+ }
137
+ chunks.push(value);
138
+ }
139
+ } finally {
140
+ reader.releaseLock();
141
+ }
142
+ }
143
+ if (byteLength === 0) return {};
144
+ const contentType = response.headers.get("content-type")?.split(";", 1)[0]?.trim().toLowerCase();
145
+ if (contentType !== "application/json" && !contentType?.endsWith("+json")) throw responseInvalid(endpoint, response.status);
146
+ const bytes = new Uint8Array(byteLength);
147
+ let offset = 0;
148
+ for (const chunk of chunks) {
149
+ bytes.set(chunk, offset);
150
+ offset += chunk.byteLength;
151
+ }
152
+ try {
153
+ return JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(bytes));
154
+ } catch (error) {
155
+ throw responseInvalid(endpoint, response.status, error);
156
+ }
157
+ }
158
+ };
159
+ function parseGitHubOidcEndpoint(value) {
160
+ let url;
161
+ try {
162
+ url = new URL(value);
163
+ } catch (error) {
164
+ throw new GitHubActionsOidcError("OIDC_GITHUB_ENDPOINT_INVALID", "GitHub Actions supplied an unexpected OIDC token endpoint.", void 0, { cause: error });
165
+ }
166
+ const hostname = url.hostname.toLowerCase();
167
+ if (url.protocol !== "https:" || url.username || url.password || url.port || hostname !== "actions.githubusercontent.com" && !hostname.endsWith(".actions.githubusercontent.com")) throw new GitHubActionsOidcError("OIDC_GITHUB_ENDPOINT_INVALID", "GitHub Actions supplied an unexpected OIDC token endpoint.");
168
+ return url;
169
+ }
170
+ function requestFailure(endpoint, error) {
171
+ const timedOut = error instanceof DOMException && error.name === "TimeoutError";
172
+ if (endpoint === "github") return new GitHubActionsOidcError(timedOut ? "OIDC_GITHUB_TOKEN_REQUEST_TIMEOUT" : "OIDC_GITHUB_TOKEN_REQUEST_FAILED", timedOut ? "Timed out while requesting a GitHub Actions OIDC identity token." : "Unable to request a GitHub Actions OIDC identity token.", void 0, { cause: error });
173
+ return new GitHubActionsOidcError(timedOut ? "OIDC_EXCHANGE_REQUEST_TIMEOUT" : "OIDC_EXCHANGE_REQUEST_FAILED", timedOut ? "Timed out while exchanging the GitHub Actions identity with UAPKG." : "Unable to exchange the GitHub Actions identity with UAPKG.", void 0, { cause: error });
174
+ }
175
+ function responseTooLarge(endpoint, status) {
176
+ return endpoint === "github" ? new GitHubActionsOidcError("OIDC_GITHUB_TOKEN_RESPONSE_TOO_LARGE", "GitHub Actions returned an oversized OIDC identity-token response.", status) : new GitHubActionsOidcError("OIDC_EXCHANGE_RESPONSE_TOO_LARGE", "The UAPKG OIDC exchange returned an oversized response.", status);
177
+ }
178
+ function responseInvalid(endpoint, status, cause) {
179
+ return endpoint === "github" ? new GitHubActionsOidcError("OIDC_GITHUB_TOKEN_RESPONSE_INVALID", "GitHub Actions returned an invalid OIDC identity-token response.", status, { cause }) : new GitHubActionsOidcError("OIDC_EXCHANGE_RESPONSE_INVALID", "The UAPKG OIDC exchange response was invalid.", status, { cause });
180
+ }
181
+ function parseContentLength(value) {
182
+ if (value === null || !/^\d+$/.test(value)) return void 0;
183
+ const parsed = Number(value);
184
+ return Number.isSafeInteger(parsed) ? parsed : void 0;
185
+ }
186
+ function parseRetryAfter(value, now = Date.now()) {
187
+ if (!value) return void 0;
188
+ if (/^\d+$/.test(value)) return Number(value) * 1e3;
189
+ const timestamp = Date.parse(value);
190
+ return Number.isFinite(timestamp) ? Math.max(0, timestamp - now) : void 0;
191
+ }
192
+ function positiveInteger(value, fallback) {
193
+ return value !== void 0 && Number.isSafeInteger(value) && value > 0 ? value : fallback;
58
194
  }
59
- async function safeJson(response) {
60
- try {
61
- return (await response.json());
62
- }
63
- catch {
64
- return {};
65
- }
195
+ function delay(milliseconds) {
196
+ return new Promise((resolve) => setTimeout(resolve, milliseconds));
66
197
  }
198
+
199
+ //#endregion
200
+ export { GitHubActionsOidcCredentialProvider, GitHubActionsOidcError };
67
201
  //# sourceMappingURL=GitHubActionsOidcCredentialProvider.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"GitHubActionsOidcCredentialProvider.js","sourceRoot":"","sources":["../../src/control-plane/GitHubActionsOidcCredentialProvider.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"GitHubActionsOidcCredentialProvider.js","names":[],"sources":["../../src/control-plane/GitHubActionsOidcCredentialProvider.ts"],"sourcesContent":["import { z } from 'zod';\nimport {\n ControlPlaneError,\n type RegistryTrust,\n UAPKG_CONTROL_PLANE_API,\n UAPKG_GITHUB_OIDC_AUDIENCE,\n} from './ControlPlaneTypes.js';\n\nconst DEFAULT_REQUEST_TIMEOUT_MS = 30_000;\nconst DEFAULT_MAX_RESPONSE_BYTES = 64 * 1024;\nconst DEFAULT_MAX_ATTEMPTS = 3;\nconst DEFAULT_RETRY_DELAY_MS = 1_000;\nconst DEFAULT_MAX_RETRY_DELAY_MS = 30_000;\nconst RETRYABLE_STATUS_CODES = new Set([429, 503]);\n\nconst githubResponseSchema = z.strictObject({ value: z.string().min(1) });\nconst exchangeResponseSchema = z.strictObject({\n ok: z.literal(true),\n token: z.string().min(1),\n expiresAt: z.number().int().positive(),\n});\nconst exchangeErrorSchema = z.strictObject({\n ok: z.literal(false),\n error: z.strictObject({\n code: z.string().min(1),\n message: z.string().min(1),\n details: z.record(z.string(), z.unknown()).optional(),\n }),\n});\n\nexport type GitHubActionsOidcErrorCode =\n | 'OIDC_CONTROL_PLANE_UNTRUSTED'\n | 'OIDC_EXCHANGE_TARGET_INVALID'\n | 'OIDC_GITHUB_CONTEXT_UNAVAILABLE'\n | 'OIDC_GITHUB_ENDPOINT_INVALID'\n | 'OIDC_GITHUB_TOKEN_REQUEST_FAILED'\n | 'OIDC_GITHUB_TOKEN_REQUEST_TIMEOUT'\n | 'OIDC_GITHUB_TOKEN_REJECTED'\n | 'OIDC_GITHUB_TOKEN_RESPONSE_INVALID'\n | 'OIDC_GITHUB_TOKEN_RESPONSE_TOO_LARGE'\n | 'OIDC_EXCHANGE_REQUEST_FAILED'\n | 'OIDC_EXCHANGE_REQUEST_TIMEOUT'\n | 'OIDC_EXCHANGE_REJECTED'\n | 'OIDC_EXCHANGE_RESPONSE_INVALID'\n | 'OIDC_EXCHANGE_RESPONSE_TOO_LARGE';\n\n/** Stable local failures from the GitHub Actions OIDC credential flow. */\nexport class GitHubActionsOidcError extends Error {\n public constructor(\n public readonly code: GitHubActionsOidcErrorCode,\n message: string,\n public readonly status?: number,\n options?: ErrorOptions,\n ) {\n super(message, options);\n this.name = 'GitHubActionsOidcError';\n }\n}\n\nexport interface GitHubActionsOidcCredentialProviderOptions {\n readonly fetch?: typeof fetch;\n readonly sleep?: (milliseconds: number) => Promise<void>;\n readonly requestTimeoutMs?: number;\n readonly maxResponseBytes?: number;\n readonly maxAttempts?: number;\n readonly maxRetryDelayMs?: number;\n}\n\n/** Package selector bound into every UAPKG OIDC exchange. */\nexport interface GitHubActionsOidcTarget {\n readonly registryId: string;\n readonly packageName: string;\n}\n\ntype OidcEndpoint = 'github' | 'exchange';\n\nexport class GitHubActionsOidcCredentialProvider {\n private readonly fetch: typeof fetch;\n private readonly sleep: (milliseconds: number) => Promise<void>;\n private readonly requestTimeoutMs: number;\n private readonly maxResponseBytes: number;\n private readonly maxAttempts: number;\n private readonly maxRetryDelayMs: number;\n\n public constructor(options: GitHubActionsOidcCredentialProviderOptions = {}) {\n this.fetch = options.fetch ?? globalThis.fetch;\n this.sleep = options.sleep ?? delay;\n this.requestTimeoutMs = positiveInteger(options.requestTimeoutMs, DEFAULT_REQUEST_TIMEOUT_MS);\n this.maxResponseBytes = positiveInteger(options.maxResponseBytes, DEFAULT_MAX_RESPONSE_BYTES);\n this.maxAttempts = positiveInteger(options.maxAttempts, DEFAULT_MAX_ATTEMPTS);\n this.maxRetryDelayMs = positiveInteger(options.maxRetryDelayMs, DEFAULT_MAX_RETRY_DELAY_MS);\n }\n\n public isAvailable(): boolean {\n return Boolean(\n process.env.GITHUB_ACTIONS === 'true' ||\n process.env.ACTIONS_ID_TOKEN_REQUEST_URL ||\n process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN,\n );\n }\n\n public async exchange(trust: RegistryTrust, target: GitHubActionsOidcTarget): Promise<string> {\n if (trust.apiBaseUrl !== UAPKG_CONTROL_PLANE_API) {\n throw new GitHubActionsOidcError(\n 'OIDC_CONTROL_PLANE_UNTRUSTED',\n `UAPKG v1 OIDC exchange is pinned to ${UAPKG_CONTROL_PLANE_API}.`,\n );\n }\n const packageName = target.packageName.trim();\n if (target.registryId !== trust.registryId || !packageName) {\n throw new GitHubActionsOidcError(\n 'OIDC_EXCHANGE_TARGET_INVALID',\n 'GitHub Actions OIDC requires the exact trusted registry and packaged package name.',\n );\n }\n const requestUrl = process.env.ACTIONS_ID_TOKEN_REQUEST_URL;\n const requestToken = process.env.ACTIONS_ID_TOKEN_REQUEST_TOKEN;\n if (!this.isAvailable() || !requestUrl || !requestToken) {\n throw new GitHubActionsOidcError(\n 'OIDC_GITHUB_CONTEXT_UNAVAILABLE',\n 'GitHub Actions OIDC was selected but its identity-token endpoint is unavailable. The workflow must grant `id-token: write`.',\n );\n }\n\n const url = parseGitHubOidcEndpoint(requestUrl);\n url.searchParams.set('audience', UAPKG_GITHUB_OIDC_AUDIENCE);\n\n const githubResponse = await this.fetchWithRetry(\n url,\n {\n headers: { authorization: `Bearer ${requestToken}` },\n },\n 'github',\n );\n const githubValue = githubResponseSchema.safeParse(await this.readJson(githubResponse, 'github'));\n if (!githubResponse.ok) {\n throw new GitHubActionsOidcError(\n 'OIDC_GITHUB_TOKEN_REJECTED',\n `GitHub Actions did not issue an OIDC identity token (HTTP ${githubResponse.status}).`,\n githubResponse.status,\n );\n }\n if (!githubValue.success) {\n throw new GitHubActionsOidcError(\n 'OIDC_GITHUB_TOKEN_RESPONSE_INVALID',\n 'GitHub Actions returned an invalid OIDC identity-token response.',\n githubResponse.status,\n );\n }\n\n const exchangeResponse = await this.fetchWithRetry(\n new URL('/v1/oidc/github-actions/exchange', trust.apiBaseUrl),\n {\n method: 'POST',\n headers: { 'content-type': 'application/json' },\n body: JSON.stringify({\n provider: 'github_actions',\n audience: UAPKG_GITHUB_OIDC_AUDIENCE,\n idToken: githubValue.data.value,\n target: {\n registryId: target.registryId,\n packageName,\n },\n }),\n },\n 'exchange',\n );\n const exchangeValue = await this.readJson(exchangeResponse, 'exchange');\n if (!exchangeResponse.ok) {\n const error = exchangeErrorSchema.safeParse(exchangeValue);\n if (error.success) {\n throw new ControlPlaneError(\n error.data.error.code,\n error.data.error.message,\n exchangeResponse.status,\n error.data.error.details,\n );\n }\n throw new GitHubActionsOidcError(\n 'OIDC_EXCHANGE_REJECTED',\n `UAPKG rejected the GitHub Actions identity (HTTP ${exchangeResponse.status}).`,\n exchangeResponse.status,\n );\n }\n const parsed = exchangeResponseSchema.safeParse(exchangeValue);\n if (!parsed.success) {\n throw new GitHubActionsOidcError(\n 'OIDC_EXCHANGE_RESPONSE_INVALID',\n 'The UAPKG OIDC exchange response was invalid.',\n exchangeResponse.status,\n );\n }\n return parsed.data.token;\n }\n\n private async fetchWithRetry(url: URL, init: RequestInit, endpoint: OidcEndpoint): Promise<Response> {\n for (let attempt = 1; attempt <= this.maxAttempts; attempt += 1) {\n let response: Response;\n try {\n response = await this.fetch(url, {\n ...init,\n redirect: 'error',\n signal: AbortSignal.timeout(this.requestTimeoutMs),\n });\n } catch (error) {\n if (attempt < this.maxAttempts) {\n await this.sleep(this.retryDelay(undefined, attempt));\n continue;\n }\n throw requestFailure(endpoint, error);\n }\n\n if (!RETRYABLE_STATUS_CODES.has(response.status) || attempt === this.maxAttempts) return response;\n\n const retryAfter = response.headers.get('retry-after');\n await response.body?.cancel().catch(() => undefined);\n await this.sleep(this.retryDelay(retryAfter, attempt));\n }\n\n throw new Error('OIDC retry loop exhausted unexpectedly.');\n }\n\n private retryDelay(retryAfter: string | null | undefined, attempt: number): number {\n const parsed = parseRetryAfter(retryAfter);\n const fallback = DEFAULT_RETRY_DELAY_MS * 2 ** (attempt - 1);\n return Math.min(parsed ?? fallback, this.maxRetryDelayMs);\n }\n\n private async readJson(response: Response, endpoint: OidcEndpoint): Promise<unknown> {\n const contentLength = parseContentLength(response.headers.get('content-length'));\n if (contentLength !== undefined && contentLength > this.maxResponseBytes) {\n await response.body?.cancel().catch(() => undefined);\n throw responseTooLarge(endpoint, response.status);\n }\n\n const chunks: Uint8Array[] = [];\n let byteLength = 0;\n if (response.body) {\n const reader = response.body.getReader();\n try {\n while (true) {\n const { done, value } = await reader.read();\n if (done) break;\n byteLength += value.byteLength;\n if (byteLength > this.maxResponseBytes) {\n await reader.cancel().catch(() => undefined);\n throw responseTooLarge(endpoint, response.status);\n }\n chunks.push(value);\n }\n } finally {\n reader.releaseLock();\n }\n }\n\n if (byteLength === 0) return {};\n const contentType = response.headers.get('content-type')?.split(';', 1)[0]?.trim().toLowerCase();\n if (contentType !== 'application/json' && !contentType?.endsWith('+json')) {\n throw responseInvalid(endpoint, response.status);\n }\n\n const bytes = new Uint8Array(byteLength);\n let offset = 0;\n for (const chunk of chunks) {\n bytes.set(chunk, offset);\n offset += chunk.byteLength;\n }\n try {\n return JSON.parse(new TextDecoder('utf-8', { fatal: true }).decode(bytes)) as unknown;\n } catch (error) {\n throw responseInvalid(endpoint, response.status, error);\n }\n }\n}\n\nfunction parseGitHubOidcEndpoint(value: string): URL {\n let url: URL;\n try {\n url = new URL(value);\n } catch (error) {\n throw new GitHubActionsOidcError(\n 'OIDC_GITHUB_ENDPOINT_INVALID',\n 'GitHub Actions supplied an unexpected OIDC token endpoint.',\n undefined,\n { cause: error },\n );\n }\n const hostname = url.hostname.toLowerCase();\n if (\n url.protocol !== 'https:' ||\n url.username ||\n url.password ||\n url.port ||\n (hostname !== 'actions.githubusercontent.com' && !hostname.endsWith('.actions.githubusercontent.com'))\n ) {\n throw new GitHubActionsOidcError(\n 'OIDC_GITHUB_ENDPOINT_INVALID',\n 'GitHub Actions supplied an unexpected OIDC token endpoint.',\n );\n }\n return url;\n}\n\nfunction requestFailure(endpoint: OidcEndpoint, error: unknown): GitHubActionsOidcError {\n const timedOut = error instanceof DOMException && error.name === 'TimeoutError';\n if (endpoint === 'github') {\n return new GitHubActionsOidcError(\n timedOut ? 'OIDC_GITHUB_TOKEN_REQUEST_TIMEOUT' : 'OIDC_GITHUB_TOKEN_REQUEST_FAILED',\n timedOut\n ? 'Timed out while requesting a GitHub Actions OIDC identity token.'\n : 'Unable to request a GitHub Actions OIDC identity token.',\n undefined,\n { cause: error },\n );\n }\n return new GitHubActionsOidcError(\n timedOut ? 'OIDC_EXCHANGE_REQUEST_TIMEOUT' : 'OIDC_EXCHANGE_REQUEST_FAILED',\n timedOut\n ? 'Timed out while exchanging the GitHub Actions identity with UAPKG.'\n : 'Unable to exchange the GitHub Actions identity with UAPKG.',\n undefined,\n { cause: error },\n );\n}\n\nfunction responseTooLarge(endpoint: OidcEndpoint, status: number): GitHubActionsOidcError {\n return endpoint === 'github'\n ? new GitHubActionsOidcError(\n 'OIDC_GITHUB_TOKEN_RESPONSE_TOO_LARGE',\n 'GitHub Actions returned an oversized OIDC identity-token response.',\n status,\n )\n : new GitHubActionsOidcError(\n 'OIDC_EXCHANGE_RESPONSE_TOO_LARGE',\n 'The UAPKG OIDC exchange returned an oversized response.',\n status,\n );\n}\n\nfunction responseInvalid(endpoint: OidcEndpoint, status: number, cause?: unknown): GitHubActionsOidcError {\n return endpoint === 'github'\n ? new GitHubActionsOidcError(\n 'OIDC_GITHUB_TOKEN_RESPONSE_INVALID',\n 'GitHub Actions returned an invalid OIDC identity-token response.',\n status,\n { cause },\n )\n : new GitHubActionsOidcError(\n 'OIDC_EXCHANGE_RESPONSE_INVALID',\n 'The UAPKG OIDC exchange response was invalid.',\n status,\n { cause },\n );\n}\n\nfunction parseContentLength(value: string | null): number | undefined {\n if (value === null || !/^\\d+$/.test(value)) return undefined;\n const parsed = Number(value);\n return Number.isSafeInteger(parsed) ? parsed : undefined;\n}\n\nfunction parseRetryAfter(value: string | null | undefined, now = Date.now()): number | undefined {\n if (!value) return undefined;\n if (/^\\d+$/.test(value)) return Number(value) * 1_000;\n const timestamp = Date.parse(value);\n return Number.isFinite(timestamp) ? Math.max(0, timestamp - now) : undefined;\n}\n\nfunction positiveInteger(value: number | undefined, fallback: number): number {\n return value !== undefined && Number.isSafeInteger(value) && value > 0 ? value : fallback;\n}\n\nfunction delay(milliseconds: number): Promise<void> {\n return new Promise((resolve) => setTimeout(resolve, milliseconds));\n}\n"],"mappings":"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"}
@@ -1,3 +1,17 @@
1
+ //#region src/control-plane/PublishIdempotencyStore.d.ts
2
+ interface GitHubActionsPublishCoordinates {
3
+ readonly registryId: string;
4
+ readonly packageName: string;
5
+ readonly packageVersion: string;
6
+ readonly artifactSha256: string;
7
+ }
8
+ /**
9
+ * Stable, non-secret key for one GitHub Actions publish job. A rerun keeps the
10
+ * same run ID and job name but changes GITHUB_RUN_ATTEMPT, so the attempt is
11
+ * deliberately excluded. Renewing an OIDC session therefore cannot change
12
+ * the request identity.
13
+ */
14
+ declare function createGitHubActionsPublishIdempotencyKey(coordinates: GitHubActionsPublishCoordinates, environment?: NodeJS.ProcessEnv): string;
1
15
  /**
2
16
  * Persisted idempotency keys for logical registry-operation submissions.
3
17
  * One logical submission (operation + registry + payload) keeps one key
@@ -5,14 +19,16 @@
5
19
  * original request instead of creating a duplicate. Keys are cleared once
6
20
  * the request reaches a terminal state.
7
21
  */
8
- export declare class PublishIdempotencyStore {
9
- private readonly filePath;
10
- constructor(filePath?: string);
11
- /** Stable digest identifying one logical submission. */
12
- static submissionDigest(operation: string, submission: unknown): string;
13
- getOrCreate(digest: string, newKey: () => string, now?: number): string;
14
- clear(digest: string, now?: number): void;
15
- private read;
16
- private write;
22
+ declare class PublishIdempotencyStore {
23
+ private readonly filePath;
24
+ constructor(filePath?: string);
25
+ /** Stable digest identifying one logical submission. */
26
+ static submissionDigest(operation: string, submission: unknown): string;
27
+ getOrCreate(digest: string, newKey: () => string, now?: number): string;
28
+ clear(digest: string, now?: number): void;
29
+ private read;
30
+ private write;
17
31
  }
32
+ //#endregion
33
+ export { GitHubActionsPublishCoordinates, PublishIdempotencyStore, createGitHubActionsPublishIdempotencyKey };
18
34
  //# sourceMappingURL=PublishIdempotencyStore.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"PublishIdempotencyStore.d.ts","sourceRoot":"","sources":["../../src/control-plane/PublishIdempotencyStore.ts"],"names":[],"mappings":"AAkBA;;;;;;GAMG;AACH,qBAAa,uBAAuB;IAClC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAS;gBAEf,QAAQ,CAAC,EAAE,MAAM;IAIpC,wDAAwD;WAC1C,gBAAgB,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,GAAG,MAAM;IAIvE,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM;IAY3E,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,IAAI;IAQpD,OAAO,CAAC,IAAI;IAyBZ,OAAO,CAAC,KAAK;CAId"}
1
+ {"version":3,"file":"PublishIdempotencyStore.d.ts","names":[],"sources":["../../src/control-plane/PublishIdempotencyStore.ts"],"mappings":";UAkBiB;WACN;WACA;WACA;WACA;;;;;;;;iBASK,yCACd,aAAa,iCACb,cAAa,OAAO;;;;;;;;cA2BT;mBACM;EAEjB,YAAmB;;SAKL,iBAAiB,mBAAmB;EAI3C,YAAY,gBAAgB,sBAAsB;EAYlD,MAAM,gBAAgB;UAQrB;UAyBA"}
@@ -1,71 +1,100 @@
1
- import { mkdirSync, readFileSync, writeFileSync } from 'node:fs';
2
- import { dirname, join } from 'node:path';
3
- import { resolveActiveUapkgProfileRoot } from '@uapkg/common';
4
- import { sha256OfCanonicalJson } from '@uapkg/package-claims';
5
- const STORE_FILE_NAME = 'publish-idempotency.json';
6
- const MAX_ENTRY_AGE_MS = 7 * 24 * 60 * 60 * 1000;
1
+ import { resolveActiveUapkgProfileRoot } from "@uapkg/common";
2
+ import { dirname, join } from "node:path";
3
+ import { mkdirSync, readFileSync, writeFileSync } from "node:fs";
4
+ import { sha256OfCanonicalJson } from "@uapkg/package-claims";
5
+
6
+ //#region src/control-plane/PublishIdempotencyStore.ts
7
+ const STORE_FILE_NAME = "publish-idempotency.json";
8
+ const MAX_ENTRY_AGE_MS = 6048e5;
7
9
  /**
8
- * Persisted idempotency keys for logical registry-operation submissions.
9
- * One logical submission (operation + registry + payload) keeps one key
10
- * across retries, so a re-run after a network fault or crash replays the
11
- * original request instead of creating a duplicate. Keys are cleared once
12
- * the request reaches a terminal state.
13
- */
14
- export class PublishIdempotencyStore {
15
- filePath;
16
- constructor(filePath) {
17
- this.filePath = filePath ?? join(resolveActiveUapkgProfileRoot(), STORE_FILE_NAME);
18
- }
19
- /** Stable digest identifying one logical submission. */
20
- static submissionDigest(operation, submission) {
21
- return sha256OfCanonicalJson({ operation, submission });
22
- }
23
- getOrCreate(digest, newKey, now = Date.now()) {
24
- const store = this.read(now);
25
- const existing = store.entries[digest];
26
- if (existing)
27
- return existing.key;
28
- const key = newKey();
29
- this.write({
30
- schemaVersion: 1,
31
- entries: { ...store.entries, [digest]: { key, createdAt: now } },
32
- });
33
- return key;
34
- }
35
- clear(digest, now = Date.now()) {
36
- const store = this.read(now);
37
- if (!(digest in store.entries))
38
- return;
39
- const entries = { ...store.entries };
40
- delete entries[digest];
41
- this.write({ schemaVersion: 1, entries });
42
- }
43
- read(now) {
44
- let parsed;
45
- try {
46
- const raw = readFileSync(this.filePath, 'utf8');
47
- const candidate = JSON.parse(raw);
48
- if (candidate.schemaVersion === 1 && candidate.entries && typeof candidate.entries === 'object') {
49
- parsed = { schemaVersion: 1, entries: candidate.entries };
50
- }
51
- }
52
- catch {
53
- // Missing or corrupt store starts fresh; keys are best-effort retry aids.
54
- }
55
- const entries = {};
56
- for (const [digest, entry] of Object.entries(parsed?.entries ?? {})) {
57
- if (entry &&
58
- typeof entry.key === 'string' &&
59
- typeof entry.createdAt === 'number' &&
60
- now - entry.createdAt <= MAX_ENTRY_AGE_MS) {
61
- entries[digest] = entry;
62
- }
63
- }
64
- return { schemaVersion: 1, entries };
65
- }
66
- write(store) {
67
- mkdirSync(dirname(this.filePath), { recursive: true });
68
- writeFileSync(this.filePath, `${JSON.stringify(store, null, 2)}\n`, 'utf8');
69
- }
10
+ * Stable, non-secret key for one GitHub Actions publish job. A rerun keeps the
11
+ * same run ID and job name but changes GITHUB_RUN_ATTEMPT, so the attempt is
12
+ * deliberately excluded. Renewing an OIDC session therefore cannot change
13
+ * the request identity.
14
+ */
15
+ function createGitHubActionsPublishIdempotencyKey(coordinates, environment = process.env) {
16
+ const githubRunId = environment.GITHUB_RUN_ID?.trim();
17
+ const githubJob = environment.GITHUB_JOB?.trim();
18
+ if (!githubRunId || !githubJob) throw new Error("GitHub Actions OIDC publishing requires GITHUB_RUN_ID and GITHUB_JOB to derive a stable idempotency key.");
19
+ return `gha-${sha256OfCanonicalJson({
20
+ schemaVersion: 1,
21
+ registryId: coordinates.registryId,
22
+ packageName: coordinates.packageName,
23
+ packageVersion: coordinates.packageVersion,
24
+ artifactSha256: coordinates.artifactSha256,
25
+ githubRunId,
26
+ githubJob
27
+ })}`;
70
28
  }
29
+ /**
30
+ * Persisted idempotency keys for logical registry-operation submissions.
31
+ * One logical submission (operation + registry + payload) keeps one key
32
+ * across retries, so a re-run after a network fault or crash replays the
33
+ * original request instead of creating a duplicate. Keys are cleared once
34
+ * the request reaches a terminal state.
35
+ */
36
+ var PublishIdempotencyStore = class {
37
+ filePath;
38
+ constructor(filePath) {
39
+ this.filePath = filePath ?? join(resolveActiveUapkgProfileRoot(), STORE_FILE_NAME);
40
+ }
41
+ /** Stable digest identifying one logical submission. */
42
+ static submissionDigest(operation, submission) {
43
+ return sha256OfCanonicalJson({
44
+ operation,
45
+ submission
46
+ });
47
+ }
48
+ getOrCreate(digest, newKey, now = Date.now()) {
49
+ const store = this.read(now);
50
+ const existing = store.entries[digest];
51
+ if (existing) return existing.key;
52
+ const key = newKey();
53
+ this.write({
54
+ schemaVersion: 1,
55
+ entries: {
56
+ ...store.entries,
57
+ [digest]: {
58
+ key,
59
+ createdAt: now
60
+ }
61
+ }
62
+ });
63
+ return key;
64
+ }
65
+ clear(digest, now = Date.now()) {
66
+ const store = this.read(now);
67
+ if (!(digest in store.entries)) return;
68
+ const entries = { ...store.entries };
69
+ delete entries[digest];
70
+ this.write({
71
+ schemaVersion: 1,
72
+ entries
73
+ });
74
+ }
75
+ read(now) {
76
+ let parsed;
77
+ try {
78
+ const raw = readFileSync(this.filePath, "utf8");
79
+ const candidate = JSON.parse(raw);
80
+ if (candidate.schemaVersion === 1 && candidate.entries && typeof candidate.entries === "object") parsed = {
81
+ schemaVersion: 1,
82
+ entries: candidate.entries
83
+ };
84
+ } catch {}
85
+ const entries = {};
86
+ for (const [digest, entry] of Object.entries(parsed?.entries ?? {})) if (entry && typeof entry.key === "string" && typeof entry.createdAt === "number" && now - entry.createdAt <= MAX_ENTRY_AGE_MS) entries[digest] = entry;
87
+ return {
88
+ schemaVersion: 1,
89
+ entries
90
+ };
91
+ }
92
+ write(store) {
93
+ mkdirSync(dirname(this.filePath), { recursive: true });
94
+ writeFileSync(this.filePath, `${JSON.stringify(store, null, 2)}\n`, "utf8");
95
+ }
96
+ };
97
+
98
+ //#endregion
99
+ export { PublishIdempotencyStore, createGitHubActionsPublishIdempotencyKey };
71
100
  //# sourceMappingURL=PublishIdempotencyStore.js.map