@uapkg/cli 1.1.8 → 1.1.9

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 (297) hide show
  1. package/dist/app/CompositionRoot.d.ts +47 -0
  2. package/dist/app/CompositionRoot.d.ts.map +1 -0
  3. package/dist/app/CompositionRoot.js +95 -0
  4. package/dist/app/CompositionRoot.js.map +1 -0
  5. package/dist/app/UAPKGApplication.d.ts +14 -0
  6. package/dist/app/UAPKGApplication.d.ts.map +1 -0
  7. package/dist/app/UAPKGApplication.js +111 -0
  8. package/dist/app/UAPKGApplication.js.map +1 -0
  9. package/dist/cli/UAPKGCommandLine.d.ts +166 -0
  10. package/dist/cli/UAPKGCommandLine.d.ts.map +1 -0
  11. package/dist/cli/UAPKGCommandLine.js +172 -0
  12. package/dist/cli/UAPKGCommandLine.js.map +1 -0
  13. package/dist/cli/parseCommandLine.d.ts +2 -0
  14. package/dist/cli/parseCommandLine.d.ts.map +1 -0
  15. package/dist/cli/parseCommandLine.js +6 -0
  16. package/dist/cli/parseCommandLine.js.map +1 -0
  17. package/dist/cli/parsing/UAPKGCommandLineParser.d.ts +8 -0
  18. package/dist/cli/parsing/UAPKGCommandLineParser.d.ts.map +1 -0
  19. package/dist/cli/parsing/UAPKGCommandLineParser.js +25 -0
  20. package/dist/cli/parsing/UAPKGCommandLineParser.js.map +1 -0
  21. package/dist/cli/parsing/UAPKGParserRegistry.d.ts +11 -0
  22. package/dist/cli/parsing/UAPKGParserRegistry.d.ts.map +1 -0
  23. package/dist/cli/parsing/UAPKGParserRegistry.js +39 -0
  24. package/dist/cli/parsing/UAPKGParserRegistry.js.map +1 -0
  25. package/dist/cli/parsing/contracts/UAPKGCommandModule.d.ts +9 -0
  26. package/dist/cli/parsing/contracts/UAPKGCommandModule.d.ts.map +1 -0
  27. package/dist/cli/parsing/contracts/UAPKGCommandModule.js +2 -0
  28. package/dist/cli/parsing/contracts/UAPKGCommandModule.js.map +1 -0
  29. package/dist/cli/parsing/modules/AddCommandModule.d.ts +7 -0
  30. package/dist/cli/parsing/modules/AddCommandModule.d.ts.map +1 -0
  31. package/dist/cli/parsing/modules/AddCommandModule.js +37 -0
  32. package/dist/cli/parsing/modules/AddCommandModule.js.map +1 -0
  33. package/dist/cli/parsing/modules/ConfigCommandModule.d.ts +7 -0
  34. package/dist/cli/parsing/modules/ConfigCommandModule.d.ts.map +1 -0
  35. package/dist/cli/parsing/modules/ConfigCommandModule.js +84 -0
  36. package/dist/cli/parsing/modules/ConfigCommandModule.js.map +1 -0
  37. package/dist/cli/parsing/modules/InitCommandModule.d.ts +7 -0
  38. package/dist/cli/parsing/modules/InitCommandModule.d.ts.map +1 -0
  39. package/dist/cli/parsing/modules/InitCommandModule.js +23 -0
  40. package/dist/cli/parsing/modules/InitCommandModule.js.map +1 -0
  41. package/dist/cli/parsing/modules/InstallCommandModule.d.ts +7 -0
  42. package/dist/cli/parsing/modules/InstallCommandModule.d.ts.map +1 -0
  43. package/dist/cli/parsing/modules/InstallCommandModule.js +29 -0
  44. package/dist/cli/parsing/modules/InstallCommandModule.js.map +1 -0
  45. package/dist/cli/parsing/modules/ListCommandModule.d.ts +7 -0
  46. package/dist/cli/parsing/modules/ListCommandModule.d.ts.map +1 -0
  47. package/dist/cli/parsing/modules/ListCommandModule.js +16 -0
  48. package/dist/cli/parsing/modules/ListCommandModule.js.map +1 -0
  49. package/dist/cli/parsing/modules/OutdatedCommandModule.d.ts +7 -0
  50. package/dist/cli/parsing/modules/OutdatedCommandModule.d.ts.map +1 -0
  51. package/dist/cli/parsing/modules/OutdatedCommandModule.js +17 -0
  52. package/dist/cli/parsing/modules/OutdatedCommandModule.js.map +1 -0
  53. package/dist/cli/parsing/modules/PackCommandModule.d.ts +7 -0
  54. package/dist/cli/parsing/modules/PackCommandModule.d.ts.map +1 -0
  55. package/dist/cli/parsing/modules/PackCommandModule.js +29 -0
  56. package/dist/cli/parsing/modules/PackCommandModule.js.map +1 -0
  57. package/dist/cli/parsing/modules/ProjectGetNameCommandModule.d.ts +7 -0
  58. package/dist/cli/parsing/modules/ProjectGetNameCommandModule.d.ts.map +1 -0
  59. package/dist/cli/parsing/modules/ProjectGetNameCommandModule.js +12 -0
  60. package/dist/cli/parsing/modules/ProjectGetNameCommandModule.js.map +1 -0
  61. package/dist/cli/parsing/modules/RegistryCommandModule.d.ts +7 -0
  62. package/dist/cli/parsing/modules/RegistryCommandModule.d.ts.map +1 -0
  63. package/dist/cli/parsing/modules/RegistryCommandModule.js +92 -0
  64. package/dist/cli/parsing/modules/RegistryCommandModule.js.map +1 -0
  65. package/dist/cli/parsing/modules/RemoveCommandModule.d.ts +7 -0
  66. package/dist/cli/parsing/modules/RemoveCommandModule.d.ts.map +1 -0
  67. package/dist/cli/parsing/modules/RemoveCommandModule.js +15 -0
  68. package/dist/cli/parsing/modules/RemoveCommandModule.js.map +1 -0
  69. package/dist/cli/parsing/modules/UpdateCommandModule.d.ts +7 -0
  70. package/dist/cli/parsing/modules/UpdateCommandModule.d.ts.map +1 -0
  71. package/dist/cli/parsing/modules/UpdateCommandModule.js +26 -0
  72. package/dist/cli/parsing/modules/UpdateCommandModule.js.map +1 -0
  73. package/dist/cli/parsing/modules/WhyCommandModule.d.ts +7 -0
  74. package/dist/cli/parsing/modules/WhyCommandModule.d.ts.map +1 -0
  75. package/dist/cli/parsing/modules/WhyCommandModule.js +15 -0
  76. package/dist/cli/parsing/modules/WhyCommandModule.js.map +1 -0
  77. package/dist/cli/parsing/modules/sharedOptions.d.ts +8 -0
  78. package/dist/cli/parsing/modules/sharedOptions.d.ts.map +1 -0
  79. package/dist/cli/parsing/modules/sharedOptions.js +26 -0
  80. package/dist/cli/parsing/modules/sharedOptions.js.map +1 -0
  81. package/dist/cli/runUAPKGCLI.d.ts +2 -0
  82. package/dist/cli/runUAPKGCLI.d.ts.map +1 -0
  83. package/dist/cli/runUAPKGCLI.js +7 -0
  84. package/dist/cli/runUAPKGCLI.js.map +1 -0
  85. package/dist/cli.d.ts +3 -0
  86. package/dist/cli.d.ts.map +1 -0
  87. package/dist/cli.js +18 -0
  88. package/dist/cli.js.map +1 -0
  89. package/dist/commands/AddCommand.d.ts +26 -0
  90. package/dist/commands/AddCommand.d.ts.map +1 -0
  91. package/dist/commands/AddCommand.js +55 -0
  92. package/dist/commands/AddCommand.js.map +1 -0
  93. package/dist/commands/Command.d.ts +4 -0
  94. package/dist/commands/Command.d.ts.map +1 -0
  95. package/dist/commands/Command.js +2 -0
  96. package/dist/commands/Command.js.map +1 -0
  97. package/dist/commands/ConfigCommand.d.ts +28 -0
  98. package/dist/commands/ConfigCommand.d.ts.map +1 -0
  99. package/dist/commands/ConfigCommand.js +187 -0
  100. package/dist/commands/ConfigCommand.js.map +1 -0
  101. package/dist/commands/InitCommand.d.ts +19 -0
  102. package/dist/commands/InitCommand.d.ts.map +1 -0
  103. package/dist/commands/InitCommand.js +61 -0
  104. package/dist/commands/InitCommand.js.map +1 -0
  105. package/dist/commands/InstallCommand.d.ts +30 -0
  106. package/dist/commands/InstallCommand.d.ts.map +1 -0
  107. package/dist/commands/InstallCommand.js +97 -0
  108. package/dist/commands/InstallCommand.js.map +1 -0
  109. package/dist/commands/ListCommand.d.ts +20 -0
  110. package/dist/commands/ListCommand.d.ts.map +1 -0
  111. package/dist/commands/ListCommand.js +83 -0
  112. package/dist/commands/ListCommand.js.map +1 -0
  113. package/dist/commands/OutdatedCommand.d.ts +20 -0
  114. package/dist/commands/OutdatedCommand.d.ts.map +1 -0
  115. package/dist/commands/OutdatedCommand.js +42 -0
  116. package/dist/commands/OutdatedCommand.js.map +1 -0
  117. package/dist/commands/PackCommand.d.ts +13 -0
  118. package/dist/commands/PackCommand.d.ts.map +1 -0
  119. package/dist/commands/PackCommand.js +22 -0
  120. package/dist/commands/PackCommand.js.map +1 -0
  121. package/dist/commands/PostinstallCandidateBuilder.d.ts +25 -0
  122. package/dist/commands/PostinstallCandidateBuilder.d.ts.map +1 -0
  123. package/dist/commands/PostinstallCandidateBuilder.js +41 -0
  124. package/dist/commands/PostinstallCandidateBuilder.js.map +1 -0
  125. package/dist/commands/ProjectGetNameCommand.d.ts +14 -0
  126. package/dist/commands/ProjectGetNameCommand.d.ts.map +1 -0
  127. package/dist/commands/ProjectGetNameCommand.js +26 -0
  128. package/dist/commands/ProjectGetNameCommand.js.map +1 -0
  129. package/dist/commands/RegistryCommand.d.ts +29 -0
  130. package/dist/commands/RegistryCommand.d.ts.map +1 -0
  131. package/dist/commands/RegistryCommand.js +121 -0
  132. package/dist/commands/RegistryCommand.js.map +1 -0
  133. package/dist/commands/RemoveCommand.d.ts +14 -0
  134. package/dist/commands/RemoveCommand.d.ts.map +1 -0
  135. package/dist/commands/RemoveCommand.js +55 -0
  136. package/dist/commands/RemoveCommand.js.map +1 -0
  137. package/dist/commands/UpdateCommand.d.ts +45 -0
  138. package/dist/commands/UpdateCommand.d.ts.map +1 -0
  139. package/dist/commands/UpdateCommand.js +113 -0
  140. package/dist/commands/UpdateCommand.js.map +1 -0
  141. package/dist/commands/WhyCommand.d.ts +21 -0
  142. package/dist/commands/WhyCommand.d.ts.map +1 -0
  143. package/dist/commands/WhyCommand.js +46 -0
  144. package/dist/commands/WhyCommand.js.map +1 -0
  145. package/dist/commands/add/DependencyAddResolver.d.ts +18 -0
  146. package/dist/commands/add/DependencyAddResolver.d.ts.map +1 -0
  147. package/dist/commands/add/DependencyAddResolver.js +36 -0
  148. package/dist/commands/add/DependencyAddResolver.js.map +1 -0
  149. package/dist/index.d.ts +26 -0
  150. package/dist/index.d.ts.map +1 -0
  151. package/dist/index.js +39 -0
  152. package/dist/index.js.map +1 -0
  153. package/dist/postinstall/api/PostinstallDsl.d.ts +44 -0
  154. package/dist/postinstall/api/PostinstallDsl.d.ts.map +1 -0
  155. package/dist/postinstall/api/PostinstallDsl.js +39 -0
  156. package/dist/postinstall/api/PostinstallDsl.js.map +1 -0
  157. package/dist/postinstall/api/definePostinstall.d.ts +18 -0
  158. package/dist/postinstall/api/definePostinstall.d.ts.map +1 -0
  159. package/dist/postinstall/api/definePostinstall.js +19 -0
  160. package/dist/postinstall/api/definePostinstall.js.map +1 -0
  161. package/dist/postinstall/index.d.ts +26 -0
  162. package/dist/postinstall/index.d.ts.map +1 -0
  163. package/dist/postinstall/index.js +37 -0
  164. package/dist/postinstall/index.js.map +1 -0
  165. package/dist/postinstall/loader/EntryResolver.d.ts +20 -0
  166. package/dist/postinstall/loader/EntryResolver.d.ts.map +1 -0
  167. package/dist/postinstall/loader/EntryResolver.js +35 -0
  168. package/dist/postinstall/loader/EntryResolver.js.map +1 -0
  169. package/dist/postinstall/loader/EsbuildTranspiler.d.ts +18 -0
  170. package/dist/postinstall/loader/EsbuildTranspiler.d.ts.map +1 -0
  171. package/dist/postinstall/loader/EsbuildTranspiler.js +58 -0
  172. package/dist/postinstall/loader/EsbuildTranspiler.js.map +1 -0
  173. package/dist/postinstall/loader/ExportValidator.d.ts +15 -0
  174. package/dist/postinstall/loader/ExportValidator.d.ts.map +1 -0
  175. package/dist/postinstall/loader/ExportValidator.js +34 -0
  176. package/dist/postinstall/loader/ExportValidator.js.map +1 -0
  177. package/dist/postinstall/loader/ModuleImporter.d.ts +29 -0
  178. package/dist/postinstall/loader/ModuleImporter.d.ts.map +1 -0
  179. package/dist/postinstall/loader/ModuleImporter.js +60 -0
  180. package/dist/postinstall/loader/ModuleImporter.js.map +1 -0
  181. package/dist/postinstall/loader/PostinstallLoader.d.ts +32 -0
  182. package/dist/postinstall/loader/PostinstallLoader.d.ts.map +1 -0
  183. package/dist/postinstall/loader/PostinstallLoader.js +60 -0
  184. package/dist/postinstall/loader/PostinstallLoader.js.map +1 -0
  185. package/dist/postinstall/markers/MarkerBlockEditor.d.ts +30 -0
  186. package/dist/postinstall/markers/MarkerBlockEditor.d.ts.map +1 -0
  187. package/dist/postinstall/markers/MarkerBlockEditor.js +46 -0
  188. package/dist/postinstall/markers/MarkerBlockEditor.js.map +1 -0
  189. package/dist/postinstall/markers/MarkerBlockService.d.ts +24 -0
  190. package/dist/postinstall/markers/MarkerBlockService.d.ts.map +1 -0
  191. package/dist/postinstall/markers/MarkerBlockService.js +46 -0
  192. package/dist/postinstall/markers/MarkerBlockService.js.map +1 -0
  193. package/dist/postinstall/markers/MarkerIntegrityValidator.d.ts +29 -0
  194. package/dist/postinstall/markers/MarkerIntegrityValidator.d.ts.map +1 -0
  195. package/dist/postinstall/markers/MarkerIntegrityValidator.js +53 -0
  196. package/dist/postinstall/markers/MarkerIntegrityValidator.js.map +1 -0
  197. package/dist/postinstall/policy/PostinstallPolicyGate.d.ts +36 -0
  198. package/dist/postinstall/policy/PostinstallPolicyGate.d.ts.map +1 -0
  199. package/dist/postinstall/policy/PostinstallPolicyGate.js +57 -0
  200. package/dist/postinstall/policy/PostinstallPolicyGate.js.map +1 -0
  201. package/dist/postinstall/runner/PostinstallOrchestrator.d.ts +71 -0
  202. package/dist/postinstall/runner/PostinstallOrchestrator.d.ts.map +1 -0
  203. package/dist/postinstall/runner/PostinstallOrchestrator.js +172 -0
  204. package/dist/postinstall/runner/PostinstallOrchestrator.js.map +1 -0
  205. package/dist/postinstall/unreal/BuildCsInjector.d.ts +23 -0
  206. package/dist/postinstall/unreal/BuildCsInjector.d.ts.map +1 -0
  207. package/dist/postinstall/unreal/BuildCsInjector.js +55 -0
  208. package/dist/postinstall/unreal/BuildCsInjector.js.map +1 -0
  209. package/dist/postinstall/unreal/CSharpInjectionEngine.d.ts +22 -0
  210. package/dist/postinstall/unreal/CSharpInjectionEngine.d.ts.map +1 -0
  211. package/dist/postinstall/unreal/CSharpInjectionEngine.js +61 -0
  212. package/dist/postinstall/unreal/CSharpInjectionEngine.js.map +1 -0
  213. package/dist/postinstall/unreal/CSharpStructureAnalyzer.d.ts +22 -0
  214. package/dist/postinstall/unreal/CSharpStructureAnalyzer.d.ts.map +1 -0
  215. package/dist/postinstall/unreal/CSharpStructureAnalyzer.js +130 -0
  216. package/dist/postinstall/unreal/CSharpStructureAnalyzer.js.map +1 -0
  217. package/dist/postinstall/unreal/CSharpStructures.d.ts +19 -0
  218. package/dist/postinstall/unreal/CSharpStructures.d.ts.map +1 -0
  219. package/dist/postinstall/unreal/CSharpStructures.js +2 -0
  220. package/dist/postinstall/unreal/CSharpStructures.js.map +1 -0
  221. package/dist/postinstall/unreal/CSharpWrapperFactory.d.ts +26 -0
  222. package/dist/postinstall/unreal/CSharpWrapperFactory.d.ts.map +1 -0
  223. package/dist/postinstall/unreal/CSharpWrapperFactory.js +60 -0
  224. package/dist/postinstall/unreal/CSharpWrapperFactory.js.map +1 -0
  225. package/dist/postinstall/unreal/PluginHash.d.ts +8 -0
  226. package/dist/postinstall/unreal/PluginHash.d.ts.map +1 -0
  227. package/dist/postinstall/unreal/PluginHash.js +13 -0
  228. package/dist/postinstall/unreal/PluginHash.js.map +1 -0
  229. package/dist/postinstall/unreal/PrettyParseError.d.ts +15 -0
  230. package/dist/postinstall/unreal/PrettyParseError.d.ts.map +1 -0
  231. package/dist/postinstall/unreal/PrettyParseError.js +43 -0
  232. package/dist/postinstall/unreal/PrettyParseError.js.map +1 -0
  233. package/dist/postinstall/unreal/ProjectFileLocator.d.ts +20 -0
  234. package/dist/postinstall/unreal/ProjectFileLocator.d.ts.map +1 -0
  235. package/dist/postinstall/unreal/ProjectFileLocator.js +53 -0
  236. package/dist/postinstall/unreal/ProjectFileLocator.js.map +1 -0
  237. package/dist/postinstall/unreal/TargetCsInjector.d.ts +23 -0
  238. package/dist/postinstall/unreal/TargetCsInjector.d.ts.map +1 -0
  239. package/dist/postinstall/unreal/TargetCsInjector.js +55 -0
  240. package/dist/postinstall/unreal/TargetCsInjector.js.map +1 -0
  241. package/dist/postinstall/unreal/UProjectInjector.d.ts +12 -0
  242. package/dist/postinstall/unreal/UProjectInjector.d.ts.map +1 -0
  243. package/dist/postinstall/unreal/UProjectInjector.js +54 -0
  244. package/dist/postinstall/unreal/UProjectInjector.js.map +1 -0
  245. package/dist/postinstall/unreal/UProjectMetadataReader.d.ts +9 -0
  246. package/dist/postinstall/unreal/UProjectMetadataReader.d.ts.map +1 -0
  247. package/dist/postinstall/unreal/UProjectMetadataReader.js +20 -0
  248. package/dist/postinstall/unreal/UProjectMetadataReader.js.map +1 -0
  249. package/dist/postinstall/unreal/UnrealSourceCatalog.d.ts +23 -0
  250. package/dist/postinstall/unreal/UnrealSourceCatalog.d.ts.map +1 -0
  251. package/dist/postinstall/unreal/UnrealSourceCatalog.js +52 -0
  252. package/dist/postinstall/unreal/UnrealSourceCatalog.js.map +1 -0
  253. package/dist/prompts/InkPromptService.d.ts +8 -0
  254. package/dist/prompts/InkPromptService.d.ts.map +1 -0
  255. package/dist/prompts/InkPromptService.js +56 -0
  256. package/dist/prompts/InkPromptService.js.map +1 -0
  257. package/dist/prompts/ProjectContextDetector.d.ts +10 -0
  258. package/dist/prompts/ProjectContextDetector.d.ts.map +1 -0
  259. package/dist/prompts/ProjectContextDetector.js +27 -0
  260. package/dist/prompts/ProjectContextDetector.js.map +1 -0
  261. package/dist/prompts/PromptService.d.ts +9 -0
  262. package/dist/prompts/PromptService.d.ts.map +1 -0
  263. package/dist/prompts/PromptService.js +8 -0
  264. package/dist/prompts/PromptService.js.map +1 -0
  265. package/dist/reporting/DiagnosticDeduplicator.d.ts +11 -0
  266. package/dist/reporting/DiagnosticDeduplicator.d.ts.map +1 -0
  267. package/dist/reporting/DiagnosticDeduplicator.js +37 -0
  268. package/dist/reporting/DiagnosticDeduplicator.js.map +1 -0
  269. package/dist/reporting/DiagnosticRenderer.d.ts +18 -0
  270. package/dist/reporting/DiagnosticRenderer.d.ts.map +1 -0
  271. package/dist/reporting/DiagnosticRenderer.js +2 -0
  272. package/dist/reporting/DiagnosticRenderer.js.map +1 -0
  273. package/dist/reporting/DiagnosticReporter.d.ts +23 -0
  274. package/dist/reporting/DiagnosticReporter.d.ts.map +1 -0
  275. package/dist/reporting/DiagnosticReporter.js +41 -0
  276. package/dist/reporting/DiagnosticReporter.js.map +1 -0
  277. package/dist/reporting/InkDiagnosticRenderer.d.ts +21 -0
  278. package/dist/reporting/InkDiagnosticRenderer.d.ts.map +1 -0
  279. package/dist/reporting/InkDiagnosticRenderer.js +44 -0
  280. package/dist/reporting/InkDiagnosticRenderer.js.map +1 -0
  281. package/dist/reporting/InstallProgressReporter.d.ts +34 -0
  282. package/dist/reporting/InstallProgressReporter.d.ts.map +1 -0
  283. package/dist/reporting/InstallProgressReporter.js +49 -0
  284. package/dist/reporting/InstallProgressReporter.js.map +1 -0
  285. package/dist/reporting/JsonReporter.d.ts +26 -0
  286. package/dist/reporting/JsonReporter.d.ts.map +1 -0
  287. package/dist/reporting/JsonReporter.js +16 -0
  288. package/dist/reporting/JsonReporter.js.map +1 -0
  289. package/dist/reporting/TextDiagnosticRenderer.d.ts +20 -0
  290. package/dist/reporting/TextDiagnosticRenderer.d.ts.map +1 -0
  291. package/dist/reporting/TextDiagnosticRenderer.js +30 -0
  292. package/dist/reporting/TextDiagnosticRenderer.js.map +1 -0
  293. package/dist/reporting/TextSink.d.ts +21 -0
  294. package/dist/reporting/TextSink.d.ts.map +1 -0
  295. package/dist/reporting/TextSink.js +25 -0
  296. package/dist/reporting/TextSink.js.map +1 -0
  297. package/package.json +12 -12
@@ -0,0 +1,172 @@
1
+ import { createIoErrorDiagnostic, createUnknownErrorDiagnostic, DiagnosticBag } from '@uapkg/diagnostics';
2
+ import { PostinstallLoader } from '../loader/PostinstallLoader.js';
3
+ import { PostinstallPolicyGate } from '../policy/PostinstallPolicyGate.js';
4
+ import { BuildCsInjector } from '../unreal/BuildCsInjector.js';
5
+ import { ProjectFileLocator } from '../unreal/ProjectFileLocator.js';
6
+ import { TargetCsInjector } from '../unreal/TargetCsInjector.js';
7
+ import { UnrealSourceCatalogBuilder } from '../unreal/UnrealSourceCatalog.js';
8
+ import { UProjectInjector } from '../unreal/UProjectInjector.js';
9
+ import { UProjectMetadataReader } from '../unreal/UProjectMetadataReader.js';
10
+ /**
11
+ * Top-level postinstall flow:
12
+ *
13
+ * 1. Fast path: if the host is a plugin manifest, nothing runs.
14
+ * 2. For each candidate plugin:
15
+ * a. PolicyGate decides allow/deny. Deny → info diagnostic, skip.
16
+ * b. Loader locates + transpiles + imports + validates the script.
17
+ * c. Accumulate `(plugin, definition)` pairs into a plan.
18
+ * 3. Build a single {@link UnrealSourceCatalog} covering every module
19
+ * any script wants to touch.
20
+ * 4. Apply injectors idempotently per zone.
21
+ *
22
+ * Always returns a {@link Result}; never throws. The caller inspects
23
+ * `diagnostics` to render errors/warnings/info lines.
24
+ */
25
+ export class PostinstallOrchestrator {
26
+ loader;
27
+ policy;
28
+ catalogBuilder;
29
+ buildInjector;
30
+ targetInjector;
31
+ projectInjector;
32
+ projectFileLocator;
33
+ uprojectReader;
34
+ constructor(loader = new PostinstallLoader(), policy = new PostinstallPolicyGate(), catalogBuilder = new UnrealSourceCatalogBuilder(), buildInjector = new BuildCsInjector(), targetInjector = new TargetCsInjector(), projectInjector = new UProjectInjector(), projectFileLocator = new ProjectFileLocator(), uprojectReader = new UProjectMetadataReader()) {
35
+ this.loader = loader;
36
+ this.policy = policy;
37
+ this.catalogBuilder = catalogBuilder;
38
+ this.buildInjector = buildInjector;
39
+ this.targetInjector = targetInjector;
40
+ this.projectInjector = projectInjector;
41
+ this.projectFileLocator = projectFileLocator;
42
+ this.uprojectReader = uprojectReader;
43
+ }
44
+ async run(input) {
45
+ const bag = new DiagnosticBag();
46
+ const executed = [];
47
+ const skipped = [];
48
+ if (input.manifestType !== 'project' || input.candidates.length === 0) {
49
+ return bag.toResult({ executed, skipped });
50
+ }
51
+ const plan = await this.buildPlan(input.candidates, bag, skipped);
52
+ if (plan.length === 0) {
53
+ return bag.toResult({ executed, skipped });
54
+ }
55
+ const catalogResult = this.buildCatalog(input.projectRoot, plan, input.moduleNameOverride);
56
+ if (!catalogResult.ok) {
57
+ bag.mergeArray(catalogResult.diagnostics);
58
+ return bag.toFailure();
59
+ }
60
+ const { catalog, moduleNames } = catalogResult.value;
61
+ for (const entry of plan) {
62
+ const applied = this.applyScript(input.projectRoot, entry, catalog, moduleNames, bag);
63
+ if (applied)
64
+ executed.push(entry.loaded.packageName);
65
+ }
66
+ return bag.toResult({ executed, skipped });
67
+ }
68
+ // ---- private helpers --------------------------------------------------
69
+ async buildPlan(candidates, bag, skipped) {
70
+ const plan = [];
71
+ for (const candidate of candidates) {
72
+ const decision = this.policy.evaluate(candidate.packageName, candidate.registry);
73
+ if (!decision.allowed) {
74
+ if (decision.denialDiagnostic)
75
+ bag.add(decision.denialDiagnostic);
76
+ skipped.push({ packageName: candidate.packageName, reason: 'policy-denied' });
77
+ continue;
78
+ }
79
+ const loaded = await this.loader.load(candidate.packageName, candidate.pluginRoot);
80
+ bag.mergeArray(loaded.diagnostics);
81
+ if (!loaded.ok)
82
+ continue; // Errors already in bag.
83
+ if (loaded.value === null) {
84
+ skipped.push({ packageName: candidate.packageName, reason: 'no-script' });
85
+ continue;
86
+ }
87
+ plan.push({ candidate, loaded: loaded.value });
88
+ }
89
+ return plan;
90
+ }
91
+ buildCatalog(projectRoot, plan, moduleNameOverride) {
92
+ const hasModuleSetup = plan.some((entry) => Boolean(entry.loaded.definition.setupModules));
93
+ let moduleNames = [];
94
+ if (hasModuleSetup) {
95
+ if (moduleNameOverride !== undefined) {
96
+ // Explicit override from project manifest wins; empty = no modules.
97
+ moduleNames = moduleNameOverride;
98
+ }
99
+ else {
100
+ try {
101
+ const uprojectPath = this.projectFileLocator.findProjectFile(projectRoot);
102
+ moduleNames = this.uprojectReader.readModuleNames(uprojectPath);
103
+ }
104
+ catch (error) {
105
+ return {
106
+ ok: false,
107
+ diagnostics: [createIoErrorDiagnostic(projectRoot, error instanceof Error ? error.message : String(error))],
108
+ };
109
+ }
110
+ }
111
+ }
112
+ try {
113
+ const catalog = this.catalogBuilder.build(projectRoot, moduleNames);
114
+ return { ok: true, value: { catalog, moduleNames }, diagnostics: [] };
115
+ }
116
+ catch (error) {
117
+ return {
118
+ ok: false,
119
+ diagnostics: [createUnknownErrorDiagnostic(error instanceof Error ? error.message : String(error))],
120
+ };
121
+ }
122
+ }
123
+ applyScript(projectRoot, entry, catalog, moduleNames, bag) {
124
+ const { loaded } = entry;
125
+ const def = loaded.definition;
126
+ let anyFailed = false;
127
+ if (def.setupModules) {
128
+ for (const moduleName of moduleNames) {
129
+ const moduleFile = catalog.moduleFiles.get(moduleName);
130
+ if (!moduleFile) {
131
+ bag.add(createUnknownErrorDiagnostic(`Missing module mapping for ${moduleName} (plugin ${loaded.packageName})`));
132
+ anyFailed = true;
133
+ continue;
134
+ }
135
+ const result = this.buildInjector.apply(moduleFile, loaded.packageName, def.setupModules);
136
+ this.absorb(result, bag, () => {
137
+ anyFailed = true;
138
+ });
139
+ }
140
+ }
141
+ if (def.setupTargets) {
142
+ for (const targetFile of catalog.targetFiles) {
143
+ const result = this.targetInjector.apply(targetFile, loaded.packageName, def.setupTargets);
144
+ this.absorb(result, bag, () => {
145
+ anyFailed = true;
146
+ });
147
+ }
148
+ }
149
+ const projectPlugins = def.setupProject?.plugins ?? [];
150
+ if (projectPlugins.length > 0) {
151
+ try {
152
+ const uprojectPath = this.projectFileLocator.findProjectFile(projectRoot);
153
+ const result = this.projectInjector.apply(uprojectPath, projectPlugins);
154
+ this.absorb(result, bag, () => {
155
+ anyFailed = true;
156
+ });
157
+ }
158
+ catch (error) {
159
+ bag.add(createIoErrorDiagnostic(projectRoot, error instanceof Error ? error.message : String(error)));
160
+ anyFailed = true;
161
+ }
162
+ }
163
+ return !anyFailed;
164
+ }
165
+ absorb(result, bag, onFail) {
166
+ for (const d of result.diagnostics)
167
+ bag.add(d);
168
+ if (!result.ok)
169
+ onFail();
170
+ }
171
+ }
172
+ //# sourceMappingURL=PostinstallOrchestrator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PostinstallOrchestrator.js","sourceRoot":"","sources":["../../../src/postinstall/runner/PostinstallOrchestrator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ import { type Result } from '@uapkg/diagnostics';
2
+ import type { ZoneDefinition } from '../api/PostinstallDsl.js';
3
+ import { MarkerBlockEditor } from '../markers/MarkerBlockEditor.js';
4
+ import { CSharpInjectionEngine } from './CSharpInjectionEngine.js';
5
+ import { CSharpStructureAnalyzer } from './CSharpStructureAnalyzer.js';
6
+ import { CSharpWrapperFactory } from './CSharpWrapperFactory.js';
7
+ /**
8
+ * Injects a plugin's `setupModules` content into a single `*.Build.cs` file.
9
+ *
10
+ * The operation is idempotent: re-running overwrites the owned marker blocks.
11
+ * All failures are returned as `Result.fail` — this class never throws. Before
12
+ * mutation, pre-existing owned marker blocks are checked for corruption
13
+ * (orphaned / nested markers) and surfaced as `POSTINSTALL_MARKER_CORRUPT`.
14
+ */
15
+ export declare class BuildCsInjector {
16
+ private readonly analyzer;
17
+ private readonly wrapperFactory;
18
+ private readonly injector;
19
+ private readonly markerEditor;
20
+ constructor(analyzer?: CSharpStructureAnalyzer, wrapperFactory?: CSharpWrapperFactory, injector?: CSharpInjectionEngine, markerEditor?: MarkerBlockEditor);
21
+ apply(filePath: string, pluginName: string, zones: ZoneDefinition): Result<void>;
22
+ }
23
+ //# sourceMappingURL=BuildCsInjector.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildCsInjector.d.ts","sourceRoot":"","sources":["../../../src/postinstall/unreal/BuildCsInjector.ts"],"names":[],"mappings":"AACA,OAAO,EAAqC,KAAK,MAAM,EAAE,MAAM,oBAAoB,CAAC;AACpF,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,iBAAiB,EAAE,MAAM,iCAAiC,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AACvE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AAKjE;;;;;;;GAOG;AACH,qBAAa,eAAe;IAExB,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,cAAc;IAC/B,OAAO,CAAC,QAAQ,CAAC,QAAQ;IACzB,OAAO,CAAC,QAAQ,CAAC,YAAY;gBAHZ,QAAQ,GAAE,uBAAuD,EACjE,cAAc,GAAE,oBAAiD,EACjE,QAAQ,GAAE,qBAAmD,EAC7D,YAAY,GAAE,iBAA2C;IAGrE,KAAK,CAAC,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,GAAG,MAAM,CAAC,IAAI,CAAC;CAgCxF"}
@@ -0,0 +1,55 @@
1
+ import fs from 'node:fs';
2
+ import { createIoErrorDiagnostic, fail, ok } from '@uapkg/diagnostics';
3
+ import { MarkerBlockEditor } from '../markers/MarkerBlockEditor.js';
4
+ import { CSharpInjectionEngine } from './CSharpInjectionEngine.js';
5
+ import { CSharpStructureAnalyzer } from './CSharpStructureAnalyzer.js';
6
+ import { CSharpWrapperFactory } from './CSharpWrapperFactory.js';
7
+ import { getWrapperClassName } from './PluginHash.js';
8
+ const BUILD_CS_ZONES = ['module-includes', 'module-class-body', 'module-constructor'];
9
+ /**
10
+ * Injects a plugin's `setupModules` content into a single `*.Build.cs` file.
11
+ *
12
+ * The operation is idempotent: re-running overwrites the owned marker blocks.
13
+ * All failures are returned as `Result.fail` — this class never throws. Before
14
+ * mutation, pre-existing owned marker blocks are checked for corruption
15
+ * (orphaned / nested markers) and surfaced as `POSTINSTALL_MARKER_CORRUPT`.
16
+ */
17
+ export class BuildCsInjector {
18
+ analyzer;
19
+ wrapperFactory;
20
+ injector;
21
+ markerEditor;
22
+ constructor(analyzer = new CSharpStructureAnalyzer(), wrapperFactory = new CSharpWrapperFactory(), injector = new CSharpInjectionEngine(), markerEditor = new MarkerBlockEditor()) {
23
+ this.analyzer = analyzer;
24
+ this.wrapperFactory = wrapperFactory;
25
+ this.injector = injector;
26
+ this.markerEditor = markerEditor;
27
+ }
28
+ apply(filePath, pluginName, zones) {
29
+ try {
30
+ let source = fs.readFileSync(filePath, 'utf-8');
31
+ for (const zone of BUILD_CS_ZONES) {
32
+ const check = this.markerEditor.validate(source, pluginName, zone, filePath);
33
+ if (!check.ok)
34
+ return fail(check.diagnostics);
35
+ }
36
+ if (zones.includes?.trim()) {
37
+ source = this.injector.applyIncludes(source, pluginName, zones.includes, 'module-includes');
38
+ }
39
+ if (zones.classBody?.trim()) {
40
+ const parsedForWrapper = this.analyzer.parseModule(filePath, source);
41
+ const wrapperClassName = getWrapperClassName(pluginName);
42
+ const wrapper = this.wrapperFactory.createWrapper(wrapperClassName, 'ModuleRules', 'rules', zones.classBody);
43
+ source = this.injector.applyClassWrapper(parsedForWrapper, pluginName, wrapper, 'module-class-body');
44
+ const parsedForCtor = this.analyzer.parseModule(filePath, source);
45
+ source = this.injector.applyConstructorCall(parsedForCtor, pluginName, `${wrapperClassName}.Apply(this)`, 'module-constructor');
46
+ }
47
+ fs.writeFileSync(filePath, source, 'utf-8');
48
+ return ok(undefined);
49
+ }
50
+ catch (error) {
51
+ return fail([createIoErrorDiagnostic(filePath, error instanceof Error ? error.message : String(error))]);
52
+ }
53
+ }
54
+ }
55
+ //# sourceMappingURL=BuildCsInjector.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BuildCsInjector.js","sourceRoot":"","sources":["../../../src/postinstall/unreal/BuildCsInjector.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { MarkerBlockService } from '../markers/MarkerBlockService.js';
2
+ import type { ParsedCSharpFile } from './CSharpStructures.js';
3
+ /**
4
+ * Applies marker-delimited edits to a parsed C# file at three well-known anchors:
5
+ *
6
+ * 1. `applyIncludes` — `using ...;` block just after the last top-level `using`.
7
+ * 2. `applyClassWrapper` — nested helper class inside the rules class body.
8
+ * 3. `applyConstructorCall` — a single statement at the top of the constructor.
9
+ *
10
+ * Every edit is wrapped in an owned `UAPKG-BEGIN/END` marker block so re-running
11
+ * uapkg is idempotent. Existing owned blocks are stripped before re-insert.
12
+ */
13
+ export declare class CSharpInjectionEngine {
14
+ private readonly markerBlock;
15
+ constructor(markerBlock?: MarkerBlockService);
16
+ applyIncludes(source: string, pluginName: string, includesContent: string, zone: string): string;
17
+ applyClassWrapper(parsed: ParsedCSharpFile, pluginName: string, wrapperContent: string, zone: string): string;
18
+ applyConstructorCall(parsed: ParsedCSharpFile, pluginName: string, callExpression: string, zone: string): string;
19
+ private detectClassMemberIndent;
20
+ private detectConstructorIndent;
21
+ }
22
+ //# sourceMappingURL=CSharpInjectionEngine.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSharpInjectionEngine.d.ts","sourceRoot":"","sources":["../../../src/postinstall/unreal/CSharpInjectionEngine.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,kCAAkC,CAAC;AACtE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAE9D;;;;;;;;;GASG;AACH,qBAAa,qBAAqB;IACb,OAAO,CAAC,QAAQ,CAAC,WAAW;gBAAX,WAAW,GAAE,kBAA6C;IAEvF,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAahG,iBAAiB,CAAC,MAAM,EAAE,gBAAgB,EAAE,UAAU,EAAE,MAAM,EAAE,cAAc,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IAW7G,oBAAoB,CACzB,MAAM,EAAE,gBAAgB,EACxB,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,IAAI,EAAE,MAAM,GACX,MAAM;IAcT,OAAO,CAAC,uBAAuB;IAO/B,OAAO,CAAC,uBAAuB;CAMhC"}
@@ -0,0 +1,61 @@
1
+ import { MarkerBlockService } from '../markers/MarkerBlockService.js';
2
+ /**
3
+ * Applies marker-delimited edits to a parsed C# file at three well-known anchors:
4
+ *
5
+ * 1. `applyIncludes` — `using ...;` block just after the last top-level `using`.
6
+ * 2. `applyClassWrapper` — nested helper class inside the rules class body.
7
+ * 3. `applyConstructorCall` — a single statement at the top of the constructor.
8
+ *
9
+ * Every edit is wrapped in an owned `UAPKG-BEGIN/END` marker block so re-running
10
+ * uapkg is idempotent. Existing owned blocks are stripped before re-insert.
11
+ */
12
+ export class CSharpInjectionEngine {
13
+ markerBlock;
14
+ constructor(markerBlock = new MarkerBlockService()) {
15
+ this.markerBlock = markerBlock;
16
+ }
17
+ applyIncludes(source, pluginName, includesContent, zone) {
18
+ const withoutOwnedBlock = this.markerBlock.stripOwnedBlock(source, pluginName, zone);
19
+ const includeBlock = this.markerBlock.createBlock(pluginName, zone, includesContent);
20
+ const usingMatches = [...withoutOwnedBlock.matchAll(/^[ \t]*using\s+[^;]+;\s*$/gm)];
21
+ if (usingMatches.length === 0) {
22
+ return `${includeBlock}\n${withoutOwnedBlock}`.trimStart();
23
+ }
24
+ const lastUsing = usingMatches[usingMatches.length - 1];
25
+ const lastUsingIndex = (lastUsing.index ?? 0) + lastUsing[0].length;
26
+ return `${withoutOwnedBlock.slice(0, lastUsingIndex)}\n${includeBlock}\n${withoutOwnedBlock.slice(lastUsingIndex).trimStart()}`;
27
+ }
28
+ applyClassWrapper(parsed, pluginName, wrapperContent, zone) {
29
+ const classStart = parsed.classInfo.classOpenBraceIndex + 1;
30
+ const classEnd = parsed.classInfo.classCloseBraceIndex;
31
+ const classBody = parsed.source.slice(classStart, classEnd);
32
+ const stripped = this.markerBlock.stripOwnedBlock(classBody, pluginName, zone).trimStart();
33
+ const indent = this.detectClassMemberIndent(parsed.source, parsed.classInfo.classOpenBraceIndex);
34
+ const block = this.markerBlock.createBlock(pluginName, zone, wrapperContent, indent);
35
+ const nextBody = `\n${block}\n\n${stripped}`.replace(/\n{3,}/g, '\n\n');
36
+ return `${parsed.source.slice(0, classStart)}${nextBody}${parsed.source.slice(classEnd)}`;
37
+ }
38
+ applyConstructorCall(parsed, pluginName, callExpression, zone) {
39
+ const bodyStart = parsed.constructorInfo.bodyOpenBraceIndex + 1;
40
+ const bodyEnd = parsed.constructorInfo.bodyCloseBraceIndex;
41
+ const body = parsed.source.slice(bodyStart, bodyEnd);
42
+ const withoutOwnedBlock = this.markerBlock.stripOwnedBlock(body, pluginName, zone).trimStart();
43
+ const indent = this.detectConstructorIndent(parsed.source, parsed.constructorInfo.bodyOpenBraceIndex);
44
+ const block = this.markerBlock.createBlock(pluginName, zone, `${callExpression};`, indent);
45
+ const nextBody = `\n${block}\n${withoutOwnedBlock.length > 0 ? `\n${withoutOwnedBlock}` : ''}`.replace(/\n{3,}/g, '\n\n');
46
+ return `${parsed.source.slice(0, bodyStart)}${nextBody}${parsed.source.slice(bodyEnd)}`;
47
+ }
48
+ detectClassMemberIndent(source, classOpenBraceIndex) {
49
+ const lineStart = source.lastIndexOf('\n', classOpenBraceIndex);
50
+ const classLine = source.slice(lineStart + 1, classOpenBraceIndex);
51
+ const classIndent = classLine.match(/^\s*/)?.[0] ?? '';
52
+ return `${classIndent} `;
53
+ }
54
+ detectConstructorIndent(source, constructorOpenBraceIndex) {
55
+ const lineStart = source.lastIndexOf('\n', constructorOpenBraceIndex);
56
+ const constructorLine = source.slice(lineStart + 1, constructorOpenBraceIndex);
57
+ const constructorIndent = constructorLine.match(/^\s*/)?.[0] ?? '';
58
+ return `${constructorIndent} `;
59
+ }
60
+ }
61
+ //# sourceMappingURL=CSharpInjectionEngine.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSharpInjectionEngine.js","sourceRoot":"","sources":["../../../src/postinstall/unreal/CSharpInjectionEngine.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import type { ParsedCSharpFile } from './CSharpStructures.js';
2
+ /**
3
+ * Lightweight C# structural parser tailored to Unreal build files.
4
+ *
5
+ * We do NOT invoke the Roslyn / csharp-ast graph for analysis because the
6
+ * pipeline only needs three anchors:
7
+ * 1. The single class inheriting `ModuleRules` / `TargetRules`.
8
+ * 2. Its constructor matching `(ModuleRules|TargetRules)(Type Target) : base(Target)`.
9
+ * 3. The body braces of (1) and (2) so injectors can splice content.
10
+ *
11
+ * Lighter-than-AST parsing keeps this file < 200 LOC and avoids pulling a
12
+ * heavyweight runtime into `uapkg install`.
13
+ */
14
+ export declare class CSharpStructureAnalyzer {
15
+ parseModule(filePath: string, source: string): ParsedCSharpFile;
16
+ parseTarget(filePath: string, source: string): ParsedCSharpFile;
17
+ private parseFile;
18
+ private findClassesByBase;
19
+ private findConstructor;
20
+ private findMatchingBrace;
21
+ }
22
+ //# sourceMappingURL=CSharpStructureAnalyzer.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSharpStructureAnalyzer.d.ts","sourceRoot":"","sources":["../../../src/postinstall/unreal/CSharpStructureAnalyzer.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAkD,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAK9G;;;;;;;;;;;GAWG;AACH,qBAAa,uBAAuB;IAC3B,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAI/D,WAAW,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,gBAAgB;IAQtE,OAAO,CAAC,SAAS;IAqBjB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,eAAe;IAgCvB,OAAO,CAAC,iBAAiB;CAqD1B"}
@@ -0,0 +1,130 @@
1
+ import { PrettyParseError } from './PrettyParseError.js';
2
+ const CLASS_REGEX = /\bclass\s+([A-Za-z_][A-Za-z0-9_]*)\s*:\s*([^{\r\n]+)/g;
3
+ /**
4
+ * Lightweight C# structural parser tailored to Unreal build files.
5
+ *
6
+ * We do NOT invoke the Roslyn / csharp-ast graph for analysis because the
7
+ * pipeline only needs three anchors:
8
+ * 1. The single class inheriting `ModuleRules` / `TargetRules`.
9
+ * 2. Its constructor matching `(ModuleRules|TargetRules)(Type Target) : base(Target)`.
10
+ * 3. The body braces of (1) and (2) so injectors can splice content.
11
+ *
12
+ * Lighter-than-AST parsing keeps this file < 200 LOC and avoids pulling a
13
+ * heavyweight runtime into `uapkg install`.
14
+ */
15
+ export class CSharpStructureAnalyzer {
16
+ parseModule(filePath, source) {
17
+ return this.parseFile('module', filePath, source, 'ModuleRules', 'ReadOnlyTargetRules');
18
+ }
19
+ parseTarget(filePath, source) {
20
+ const parsed = this.parseFile('target', filePath, source, 'TargetRules', 'TargetInfo');
21
+ if (!/\bType\s*=\s*TargetType\.[A-Za-z_][A-Za-z0-9_]*\s*;/.test(source)) {
22
+ throw new PrettyParseError(filePath, 'TargetRules file missing `Type = TargetType.X;` assignment', source, 0);
23
+ }
24
+ return parsed;
25
+ }
26
+ parseFile(kind, filePath, source, expectedBaseClass, expectedConstructorArgType) {
27
+ const matchingClasses = this.findClassesByBase(source, expectedBaseClass);
28
+ if (matchingClasses.length !== 1) {
29
+ throw new PrettyParseError(filePath, `Expected exactly one class extending ${expectedBaseClass}, found ${matchingClasses.length}`, source, matchingClasses[0]?.classKeywordIndex ?? 0);
30
+ }
31
+ const classInfo = matchingClasses[0];
32
+ const constructorInfo = this.findConstructor(filePath, source, classInfo, expectedConstructorArgType);
33
+ return { kind, classInfo, constructorInfo, source };
34
+ }
35
+ findClassesByBase(source, expectedBaseClass) {
36
+ const classes = [];
37
+ for (const match of source.matchAll(CLASS_REGEX)) {
38
+ const className = match[1];
39
+ const inheritance = match[2] ?? '';
40
+ const inheritsExpected = inheritance
41
+ .split(',')
42
+ .map((item) => item.trim())
43
+ .some((item) => item === expectedBaseClass);
44
+ if (!inheritsExpected || !className)
45
+ continue;
46
+ const classKeywordIndex = match.index ?? 0;
47
+ const classOpenBraceIndex = source.indexOf('{', classKeywordIndex);
48
+ if (classOpenBraceIndex < 0)
49
+ continue;
50
+ const classCloseBraceIndex = this.findMatchingBrace(source, classOpenBraceIndex);
51
+ classes.push({ className, classKeywordIndex, classOpenBraceIndex, classCloseBraceIndex });
52
+ }
53
+ return classes;
54
+ }
55
+ findConstructor(filePath, source, classInfo, expectedConstructorArgType) {
56
+ const classBody = source.slice(classInfo.classOpenBraceIndex + 1, classInfo.classCloseBraceIndex);
57
+ const signatureRegex = new RegExp(`\\bpublic\\s+${classInfo.className}\\s*\\(\\s*${expectedConstructorArgType}\\s+Target\\s*\\)\\s*:\\s*base\\s*\\(\\s*Target\\s*\\)`, 'g');
58
+ const matches = [...classBody.matchAll(signatureRegex)];
59
+ if (matches.length !== 1) {
60
+ throw new PrettyParseError(filePath, `Expected exactly one constructor signature for ${classInfo.className}(${expectedConstructorArgType} Target) : base(Target), found ${matches.length}`, source, classInfo.classKeywordIndex);
61
+ }
62
+ const signatureRelativeIndex = matches[0].index ?? 0;
63
+ const signatureIndex = classInfo.classOpenBraceIndex + 1 + signatureRelativeIndex;
64
+ const bodyOpenBraceIndex = source.indexOf('{', signatureIndex);
65
+ if (bodyOpenBraceIndex < 0) {
66
+ throw new PrettyParseError(filePath, 'Constructor body opening brace not found', source, signatureIndex);
67
+ }
68
+ const bodyCloseBraceIndex = this.findMatchingBrace(source, bodyOpenBraceIndex);
69
+ return { signatureIndex, bodyOpenBraceIndex, bodyCloseBraceIndex };
70
+ }
71
+ findMatchingBrace(source, openIndex) {
72
+ let depth = 0;
73
+ let inSingleLineComment = false;
74
+ let inMultiLineComment = false;
75
+ let inSingleQuote = false;
76
+ let inDoubleQuote = false;
77
+ for (let i = openIndex; i < source.length; i += 1) {
78
+ const current = source[i];
79
+ const next = source[i + 1];
80
+ const prev = source[i - 1];
81
+ if (inSingleLineComment) {
82
+ if (current === '\n')
83
+ inSingleLineComment = false;
84
+ continue;
85
+ }
86
+ if (inMultiLineComment) {
87
+ if (prev === '*' && current === '/')
88
+ inMultiLineComment = false;
89
+ continue;
90
+ }
91
+ if (inSingleQuote) {
92
+ if (current === "'" && prev !== '\\')
93
+ inSingleQuote = false;
94
+ continue;
95
+ }
96
+ if (inDoubleQuote) {
97
+ if (current === '"' && prev !== '\\')
98
+ inDoubleQuote = false;
99
+ continue;
100
+ }
101
+ if (current === '/' && next === '/') {
102
+ inSingleLineComment = true;
103
+ i += 1;
104
+ continue;
105
+ }
106
+ if (current === '/' && next === '*') {
107
+ inMultiLineComment = true;
108
+ i += 1;
109
+ continue;
110
+ }
111
+ if (current === "'") {
112
+ inSingleQuote = true;
113
+ continue;
114
+ }
115
+ if (current === '"') {
116
+ inDoubleQuote = true;
117
+ continue;
118
+ }
119
+ if (current === '{')
120
+ depth += 1;
121
+ else if (current === '}') {
122
+ depth -= 1;
123
+ if (depth === 0)
124
+ return i;
125
+ }
126
+ }
127
+ throw new Error('Unbalanced braces in C# file');
128
+ }
129
+ }
130
+ //# sourceMappingURL=CSharpStructureAnalyzer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSharpStructureAnalyzer.js","sourceRoot":"","sources":["../../../src/postinstall/unreal/CSharpStructureAnalyzer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ export type CSharpFileKind = 'module' | 'target';
2
+ export interface ParsedClass {
3
+ readonly className: string;
4
+ readonly classKeywordIndex: number;
5
+ readonly classOpenBraceIndex: number;
6
+ readonly classCloseBraceIndex: number;
7
+ }
8
+ export interface ParsedConstructor {
9
+ readonly signatureIndex: number;
10
+ readonly bodyOpenBraceIndex: number;
11
+ readonly bodyCloseBraceIndex: number;
12
+ }
13
+ export interface ParsedCSharpFile {
14
+ readonly kind: CSharpFileKind;
15
+ readonly classInfo: ParsedClass;
16
+ readonly constructorInfo: ParsedConstructor;
17
+ readonly source: string;
18
+ }
19
+ //# sourceMappingURL=CSharpStructures.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSharpStructures.d.ts","sourceRoot":"","sources":["../../../src/postinstall/unreal/CSharpStructures.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,CAAC;AAEjD,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,iBAAiB,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,oBAAoB,EAAE,MAAM,CAAC;CACvC;AAED,MAAM,WAAW,iBAAiB;IAChC,QAAQ,CAAC,cAAc,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;IACpC,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;CACtC;AAED,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,SAAS,EAAE,WAAW,CAAC;IAChC,QAAQ,CAAC,eAAe,EAAE,iBAAiB,CAAC;IAC5C,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CSharpStructures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSharpStructures.js","sourceRoot":"","sources":["../../../src/postinstall/unreal/CSharpStructures.ts"],"names":[],"mappings":""}
@@ -0,0 +1,26 @@
1
+ export type WrapperContextType = 'ModuleRules' | 'TargetRules';
2
+ /**
3
+ * Produces the hashed helper class that wraps user-supplied `classBody` content.
4
+ *
5
+ * The helper has the shape:
6
+ *
7
+ * ```csharp
8
+ * static class UAPKG_<hash>
9
+ * {
10
+ * public static void Apply(ModuleRules|TargetRules rules|target)
11
+ * {
12
+ * <user body>
13
+ * }
14
+ * }
15
+ * ```
16
+ *
17
+ * We use `@amplication/csharp-ast` to generate a syntactically valid class and
18
+ * then patch the output:
19
+ * * strip an invalid `using ;` line the library emits for empty namespaces;
20
+ * * retype the `object` parameter back to the requested ModuleRules/TargetRules.
21
+ */
22
+ export declare class CSharpWrapperFactory {
23
+ createWrapper(className: string, contextType: WrapperContextType, contextName: string, body: string): string;
24
+ private normalize;
25
+ }
26
+ //# sourceMappingURL=CSharpWrapperFactory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CSharpWrapperFactory.d.ts","sourceRoot":"","sources":["../../../src/postinstall/unreal/CSharpWrapperFactory.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,kBAAkB,GAAG,aAAa,GAAG,aAAa,CAAC;AAE/D;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,oBAAoB;IACxB,aAAa,CAAC,SAAS,EAAE,MAAM,EAAE,WAAW,EAAE,kBAAkB,EAAE,WAAW,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM;IA8BnH,OAAO,CAAC,SAAS;CAWlB"}