@carbonenginejs/runtime-resource 0.1.0 → 0.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (329) hide show
  1. package/FORMAT-PROVENANCE.md +155 -135
  2. package/LICENSE +21 -21
  3. package/NOTICE +29 -29
  4. package/README.md +548 -241
  5. package/dist/CjsMotherLode.js +1271 -56
  6. package/dist/CjsMotherLode.js.map +1 -1
  7. package/dist/CjsResMan.js +3005 -740
  8. package/dist/CjsResMan.js.map +1 -1
  9. package/dist/CjsResManQueue.js +214 -214
  10. package/dist/CjsResource.js +566 -366
  11. package/dist/CjsResource.js.map +1 -1
  12. package/dist/CjsResourceSource.js +59 -59
  13. package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
  14. package/dist/format/CjsBlueReader.js +269 -0
  15. package/dist/format/CjsBlueReader.js.map +1 -0
  16. package/dist/format/CjsFormat.js +192 -178
  17. package/dist/format/CjsFormat.js.map +1 -1
  18. package/dist/format/CjsReader.js +18 -0
  19. package/dist/format/CjsReader.js.map +1 -0
  20. package/dist/format/CjsResourceProbe.js +277 -269
  21. package/dist/format/CjsResourceProbe.js.map +1 -1
  22. package/dist/format/payloadContract.js +173 -173
  23. package/dist/formats/black/CjsBlackFormat.js +278 -272
  24. package/dist/formats/black/CjsBlackFormat.js.map +1 -1
  25. package/dist/formats/black/core/CjsBlackBinaryReader.js +153 -153
  26. package/dist/formats/black/core/CjsBlackPropertyReaders.js +382 -382
  27. package/dist/formats/black/core/CjsBlackReader.js +639 -760
  28. package/dist/formats/black/core/CjsBlackReader.js.map +1 -1
  29. package/dist/formats/black/core/CjsBlackSchemaRegistry.js +433 -433
  30. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +4 -4
  31. package/dist/formats/black/core/blackConstants.js +7 -7
  32. package/dist/formats/black/core/blackDefinitions.js +10 -10
  33. package/dist/formats/black/core/blackEnums.js +6 -6
  34. package/dist/formats/black/core/blackSchema.js +3 -3
  35. package/dist/formats/black/core/blackVersion.js +22 -22
  36. package/dist/formats/black/core/helpers.js +182 -182
  37. package/dist/formats/black/core/schema.js +4 -4
  38. package/dist/formats/black/index.js +2 -2
  39. package/dist/formats/bnk/CjsBnkFormat.js +238 -245
  40. package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
  41. package/dist/formats/bnk/core/graph.js +140 -0
  42. package/dist/formats/bnk/core/graph.js.map +1 -0
  43. package/dist/formats/bnk/core/helpers.js +409 -354
  44. package/dist/formats/bnk/core/helpers.js.map +1 -1
  45. package/dist/formats/bnk/core/musicNodes.js +521 -0
  46. package/dist/formats/bnk/core/musicNodes.js.map +1 -0
  47. package/dist/formats/bnk/core/soundbanksInfo.js +246 -246
  48. package/dist/formats/bnk/index.js +2 -3
  49. package/dist/formats/bnk/index.js.map +1 -1
  50. package/dist/formats/cmf/CjsCmfFormat.js +497 -491
  51. package/dist/formats/cmf/CjsCmfFormat.js.map +1 -1
  52. package/dist/formats/cmf/core/binary.js +118 -118
  53. package/dist/formats/cmf/core/buffers.js +233 -233
  54. package/dist/formats/cmf/core/constants.js +47 -47
  55. package/dist/formats/cmf/core/gr2Anim.js +453 -453
  56. package/dist/formats/cmf/core/helpers.js +287 -287
  57. package/dist/formats/cmf/core/pack.js +276 -276
  58. package/dist/formats/cmf/core/schema.js +364 -364
  59. package/dist/formats/cmf/core/shared.js +268 -268
  60. package/dist/formats/cmf/core/writer.js +517 -517
  61. package/dist/formats/cmf/index.js +2 -2
  62. package/dist/formats/dds/CjsDdsFormat.js +193 -187
  63. package/dist/formats/dds/CjsDdsFormat.js.map +1 -1
  64. package/dist/formats/dds/core/bc6h.js +288 -0
  65. package/dist/formats/dds/core/bc6h.js.map +1 -0
  66. package/dist/formats/dds/core/bc7.js +251 -0
  67. package/dist/formats/dds/core/bc7.js.map +1 -0
  68. package/dist/formats/dds/core/helpers.js +815 -812
  69. package/dist/formats/dds/core/helpers.js.map +1 -1
  70. package/dist/formats/dds/index.js +2 -2
  71. package/dist/formats/fbx/CjsFbxFormat.js +266 -260
  72. package/dist/formats/fbx/CjsFbxFormat.js.map +1 -1
  73. package/dist/formats/fbx/core/helpers.js +3901 -3901
  74. package/dist/formats/fbx/index.js +2 -2
  75. package/dist/formats/flac/CjsFlacFormat.js +87 -81
  76. package/dist/formats/flac/CjsFlacFormat.js.map +1 -1
  77. package/dist/formats/flac/core/helpers.js +295 -295
  78. package/dist/formats/flac/index.js +2 -2
  79. package/dist/formats/gif/CjsGifFormat.js +87 -81
  80. package/dist/formats/gif/CjsGifFormat.js.map +1 -1
  81. package/dist/formats/gif/core/helpers.js +360 -360
  82. package/dist/formats/gif/index.js +2 -2
  83. package/dist/formats/gltf/CjsGltfFormat.js +290 -284
  84. package/dist/formats/gltf/CjsGltfFormat.js.map +1 -1
  85. package/dist/formats/gltf/core/helpers.js +292 -292
  86. package/dist/formats/gltf/core/json.js +79 -79
  87. package/dist/formats/gltf/core/parser.js +666 -666
  88. package/dist/formats/gltf/core/targets.js +163 -163
  89. package/dist/formats/gltf/index.js +2 -2
  90. package/dist/formats/index.js +23 -23
  91. package/dist/formats/jpeg/CjsJpegFormat.js +206 -200
  92. package/dist/formats/jpeg/CjsJpegFormat.js.map +1 -1
  93. package/dist/formats/jpeg/core/helpers.js +350 -350
  94. package/dist/formats/jpeg/core/jpeg.js +377 -377
  95. package/dist/formats/jpeg/index.js +2 -2
  96. package/dist/formats/mp3/CjsMp3Format.js +192 -186
  97. package/dist/formats/mp3/CjsMp3Format.js.map +1 -1
  98. package/dist/formats/mp3/core/helpers.js +338 -338
  99. package/dist/formats/mp3/index.js +2 -2
  100. package/dist/formats/mp4/CjsMp4Format.js +191 -185
  101. package/dist/formats/mp4/CjsMp4Format.js.map +1 -1
  102. package/dist/formats/mp4/core/helpers.js +449 -449
  103. package/dist/formats/mp4/index.js +2 -2
  104. package/dist/formats/obj/CjsObjFormat.js +253 -247
  105. package/dist/formats/obj/CjsObjFormat.js.map +1 -1
  106. package/dist/formats/obj/core/helpers.js +573 -573
  107. package/dist/formats/obj/core/json.js +64 -64
  108. package/dist/formats/obj/core/parser.js +321 -321
  109. package/dist/formats/obj/index.js +2 -2
  110. package/dist/formats/ogg/CjsOggFormat.js +88 -82
  111. package/dist/formats/ogg/CjsOggFormat.js.map +1 -1
  112. package/dist/formats/ogg/core/helpers.js +387 -387
  113. package/dist/formats/ogg/core/imdct.js +178 -178
  114. package/dist/formats/ogg/core/vorbis.js +999 -999
  115. package/dist/formats/ogg/index.js +2 -2
  116. package/dist/formats/png/CjsPngFormat.js +195 -189
  117. package/dist/formats/png/CjsPngFormat.js.map +1 -1
  118. package/dist/formats/png/core/helpers.js +583 -583
  119. package/dist/formats/png/index.js +2 -2
  120. package/dist/formats/red/CjsRedFormat.js +261 -247
  121. package/dist/formats/red/CjsRedFormat.js.map +1 -1
  122. package/dist/formats/red/core/CjsRedReader.js +194 -201
  123. package/dist/formats/red/core/CjsRedReader.js.map +1 -1
  124. package/dist/formats/red/core/blackDefinitions.js +3 -3
  125. package/dist/formats/red/core/helpers.js +139 -136
  126. package/dist/formats/red/core/helpers.js.map +1 -1
  127. package/dist/formats/red/core/redGraph.js +68 -68
  128. package/dist/formats/red/core/schema.js +4 -4
  129. package/dist/formats/red/index.js +2 -2
  130. package/dist/formats/stl/CjsStlFormat.js +365 -304
  131. package/dist/formats/stl/CjsStlFormat.js.map +1 -1
  132. package/dist/formats/stl/core/helpers.js +261 -257
  133. package/dist/formats/stl/core/helpers.js.map +1 -1
  134. package/dist/formats/stl/core/json.js +51 -51
  135. package/dist/formats/stl/core/stl.js +629 -544
  136. package/dist/formats/stl/core/stl.js.map +1 -1
  137. package/dist/formats/stl/core/targets.js +163 -163
  138. package/dist/formats/stl/index.js +2 -2
  139. package/dist/formats/tga/CjsTgaFormat.js +192 -186
  140. package/dist/formats/tga/CjsTgaFormat.js.map +1 -1
  141. package/dist/formats/tga/core/helpers.js +446 -446
  142. package/dist/formats/tga/index.js +2 -2
  143. package/dist/formats/wav/CjsWavFormat.js +192 -186
  144. package/dist/formats/wav/CjsWavFormat.js.map +1 -1
  145. package/dist/formats/wav/core/helpers.js +328 -328
  146. package/dist/formats/wav/index.js +2 -2
  147. package/dist/formats/webm/CjsWebmFormat.js +191 -185
  148. package/dist/formats/webm/CjsWebmFormat.js.map +1 -1
  149. package/dist/formats/webm/core/helpers.js +537 -537
  150. package/dist/formats/webm/index.js +2 -2
  151. package/dist/formats/webp/CjsWebpFormat.js +86 -80
  152. package/dist/formats/webp/CjsWebpFormat.js.map +1 -1
  153. package/dist/formats/webp/core/helpers.js +214 -214
  154. package/dist/formats/webp/index.js +2 -2
  155. package/dist/formats/wem/CjsWemFormat.js +241 -197
  156. package/dist/formats/wem/CjsWemFormat.js.map +1 -1
  157. package/dist/formats/wem/core/bitStream.js +259 -259
  158. package/dist/formats/wem/core/codebookLibrary.js +164 -164
  159. package/dist/formats/wem/core/helpers.js +417 -336
  160. package/dist/formats/wem/core/helpers.js.map +1 -1
  161. package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
  162. package/dist/formats/wem/core/ptadpcm.js +77 -0
  163. package/dist/formats/wem/core/ptadpcm.js.map +1 -0
  164. package/dist/formats/wem/core/resolve.js +121 -0
  165. package/dist/formats/wem/core/resolve.js.map +1 -0
  166. package/dist/formats/wem/core/wemToOgg.js +485 -485
  167. package/dist/formats/wem/index.js +2 -2
  168. package/dist/formats/yaml/CjsYamlFormat.js +83 -77
  169. package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
  170. package/dist/formats/yaml/core/CjsYamlReader.js +305 -304
  171. package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
  172. package/dist/formats/yaml/core/helpers.js +160 -160
  173. package/dist/formats/yaml/index.js +2 -2
  174. package/dist/index.js +48 -52
  175. package/dist/index.js.map +1 -1
  176. package/dist/resourcePath.js +18 -18
  177. package/dist/resourceStates.js +9 -9
  178. package/dist/{generated/resources → resources}/AudioGeometryResData.js +47 -47
  179. package/dist/resources/AudioGeometryResData.js.map +1 -0
  180. package/dist/{generated/resources → resources}/GStateBindingCallbackData.js +31 -31
  181. package/dist/resources/GStateBindingCallbackData.js.map +1 -0
  182. package/dist/{generated/resources → resources}/MeshDecalData.js +37 -37
  183. package/dist/resources/MeshDecalData.js.map +1 -0
  184. package/dist/{generated/resources → resources}/MeshDecalLodData.js +34 -34
  185. package/dist/resources/MeshDecalLodData.js.map +1 -0
  186. package/dist/resources/Tr2EffectRes.js +71 -71
  187. package/dist/resources/Tr2GrannyIntersectionResult.js +60 -0
  188. package/dist/resources/Tr2GrannyIntersectionResult.js.map +1 -0
  189. package/dist/resources/Tr2GrannyStateRes.js +44 -44
  190. package/dist/resources/Tr2ImageRes.js +114 -114
  191. package/dist/resources/Tr2LightProfileRes.js +40 -40
  192. package/dist/{generated/resources → resources}/Tr2MaterialArea.js +34 -34
  193. package/dist/resources/Tr2MaterialArea.js.map +1 -0
  194. package/dist/{generated/resources → resources}/Tr2MaterialMesh.js +31 -31
  195. package/dist/resources/Tr2MaterialMesh.js.map +1 -0
  196. package/dist/{generated/resources → resources}/Tr2MaterialRes.js +34 -34
  197. package/dist/resources/Tr2MaterialRes.js.map +1 -0
  198. package/dist/{generated/resources → resources}/Tr2ShaderPermutation.js +43 -43
  199. package/dist/resources/Tr2ShaderPermutation.js.map +1 -0
  200. package/dist/{generated/resources → resources}/Tr2TextureLodManager.js +100 -60
  201. package/dist/resources/Tr2TextureLodManager.js.map +1 -0
  202. package/dist/{generated/resources → resources}/Tr2TextureLodUpdateRequest.js +37 -37
  203. package/dist/resources/Tr2TextureLodUpdateRequest.js.map +1 -0
  204. package/dist/{generated/resources → resources}/Tr2TexturePackChannel.js +37 -37
  205. package/dist/resources/Tr2TexturePackChannel.js.map +1 -0
  206. package/dist/resources/Tr2TexturePipeline.js +68 -0
  207. package/dist/resources/Tr2TexturePipeline.js.map +1 -0
  208. package/dist/{generated/resources → resources}/Tr2TexturePipelineParams.js +34 -34
  209. package/dist/resources/Tr2TexturePipelineParams.js.map +1 -0
  210. package/dist/{generated/resources → resources}/Tr2TexturePipelineStepCompress.js +40 -40
  211. package/dist/resources/Tr2TexturePipelineStepCompress.js.map +1 -0
  212. package/dist/{generated/resources → resources}/Tr2TexturePipelineStepLimitSize.js +34 -34
  213. package/dist/resources/Tr2TexturePipelineStepLimitSize.js.map +1 -0
  214. package/dist/{generated/resources → resources}/Tr2TexturePipelineStepLoad.js +31 -31
  215. package/dist/resources/Tr2TexturePipelineStepLoad.js.map +1 -0
  216. package/dist/{generated/resources → resources}/Tr2TexturePipelineStepPack.js +43 -43
  217. package/dist/resources/Tr2TexturePipelineStepPack.js.map +1 -0
  218. package/dist/resources/TriGeometryRes.js +239 -216
  219. package/dist/resources/TriGeometryRes.js.map +1 -1
  220. package/dist/{generated/resources → resources}/TriGeometryResAreaData.js +59 -59
  221. package/dist/resources/TriGeometryResAreaData.js.map +1 -0
  222. package/dist/{generated/resources → resources}/TriGeometryResJointData.js +38 -38
  223. package/dist/resources/TriGeometryResJointData.js.map +1 -0
  224. package/dist/{generated/resources → resources}/TriGeometryResLodData.js +88 -88
  225. package/dist/resources/TriGeometryResLodData.js.map +1 -0
  226. package/dist/{generated/resources → resources}/TriGeometryResMeshData.js +63 -63
  227. package/dist/resources/TriGeometryResMeshData.js.map +1 -0
  228. package/dist/{generated/resources → resources}/TriGeometryResSkeletonData.js +34 -34
  229. package/dist/resources/TriGeometryResSkeletonData.js.map +1 -0
  230. package/dist/resources/TriGrannyRes.js +43 -43
  231. package/dist/{generated/resources → resources}/TriJointBinding.js +38 -38
  232. package/dist/resources/TriJointBinding.js.map +1 -0
  233. package/dist/{generated/resources → resources}/TriMorphTargetGeometryConstants.js +46 -46
  234. package/dist/resources/TriMorphTargetGeometryConstants.js.map +1 -0
  235. package/dist/{generated/resources → resources}/TriRtGeometryConstants.js +88 -88
  236. package/dist/resources/TriRtGeometryConstants.js.map +1 -0
  237. package/dist/resources/TriTextureRes.js +304 -304
  238. package/dist/{generated/resources → resources}/enums.js +18 -18
  239. package/dist/resources/enums.js.map +1 -0
  240. package/dist/resources/resourceBoundary.js +47 -47
  241. package/dist/resources/texturePipelineBehavior.js +320 -0
  242. package/dist/resources/texturePipelineBehavior.js.map +1 -0
  243. package/dist/texture/CjsTextureArrayRes.js +406 -406
  244. package/dist/texture/CjsTextureParameterProxy.js +133 -133
  245. package/format-notices/black/LICENSE +21 -21
  246. package/format-notices/black/NOTICE +47 -47
  247. package/format-notices/bnk/LICENSE +21 -21
  248. package/format-notices/bnk/NOTICE +20 -17
  249. package/format-notices/cmf/LICENSE +21 -21
  250. package/format-notices/cmf/NOTICE +36 -36
  251. package/format-notices/dds/LICENSE +21 -21
  252. package/format-notices/dds/NOTICE +14 -14
  253. package/format-notices/fbx/LICENSE +21 -21
  254. package/format-notices/fbx/NOTICE +14 -14
  255. package/format-notices/flac/LICENSE +21 -21
  256. package/format-notices/flac/NOTICE +14 -14
  257. package/format-notices/gif/LICENSE +21 -21
  258. package/format-notices/gif/NOTICE +14 -14
  259. package/format-notices/gltf/LICENSE +21 -21
  260. package/format-notices/gltf/NOTICE +27 -27
  261. package/format-notices/jpeg/LICENSE +21 -21
  262. package/format-notices/jpeg/NOTICE +14 -14
  263. package/format-notices/mp3/LICENSE +21 -21
  264. package/format-notices/mp3/NOTICE +14 -14
  265. package/format-notices/mp4/LICENSE +21 -21
  266. package/format-notices/mp4/NOTICE +14 -14
  267. package/format-notices/obj/LICENSE +21 -21
  268. package/format-notices/obj/NOTICE +26 -26
  269. package/format-notices/ogg/LICENSE +21 -21
  270. package/format-notices/ogg/NOTICE +28 -28
  271. package/format-notices/png/LICENSE +21 -21
  272. package/format-notices/png/NOTICE +14 -14
  273. package/format-notices/red/LICENSE +21 -21
  274. package/format-notices/red/NOTICE +31 -31
  275. package/format-notices/stl/LICENSE +21 -21
  276. package/format-notices/stl/NOTICE +21 -21
  277. package/format-notices/tga/LICENSE +21 -21
  278. package/format-notices/tga/NOTICE +14 -14
  279. package/format-notices/wav/LICENSE +21 -21
  280. package/format-notices/wav/NOTICE +14 -14
  281. package/format-notices/webm/LICENSE +21 -21
  282. package/format-notices/webm/NOTICE +14 -14
  283. package/format-notices/webp/LICENSE +21 -21
  284. package/format-notices/webp/NOTICE +14 -14
  285. package/format-notices/wem/LICENSE +57 -57
  286. package/format-notices/wem/NOTICE +33 -33
  287. package/format-notices/yaml/LICENSE +21 -21
  288. package/format-notices/yaml/NOTICE +44 -44
  289. package/package.json +51 -51
  290. package/resource-lifecycle.md +679 -487
  291. package/dist/generated/resources/AudioGeometryResData.js.map +0 -1
  292. package/dist/generated/resources/CmfVertexReader.js +0 -46
  293. package/dist/generated/resources/CmfVertexReader.js.map +0 -1
  294. package/dist/generated/resources/GStateBindingCallbackData.js.map +0 -1
  295. package/dist/generated/resources/MeshDecalData.js.map +0 -1
  296. package/dist/generated/resources/MeshDecalLodData.js.map +0 -1
  297. package/dist/generated/resources/Tr2AsyncSave.js +0 -46
  298. package/dist/generated/resources/Tr2AsyncSave.js.map +0 -1
  299. package/dist/generated/resources/Tr2CmfContents.js +0 -37
  300. package/dist/generated/resources/Tr2CmfContents.js.map +0 -1
  301. package/dist/generated/resources/Tr2GrannyIntersectionResult.js +0 -58
  302. package/dist/generated/resources/Tr2GrannyIntersectionResult.js.map +0 -1
  303. package/dist/generated/resources/Tr2LoadPrepareFence.js +0 -37
  304. package/dist/generated/resources/Tr2LoadPrepareFence.js.map +0 -1
  305. package/dist/generated/resources/Tr2MaterialArea.js.map +0 -1
  306. package/dist/generated/resources/Tr2MaterialMesh.js.map +0 -1
  307. package/dist/generated/resources/Tr2MaterialRes.js.map +0 -1
  308. package/dist/generated/resources/Tr2ShaderPermutation.js.map +0 -1
  309. package/dist/generated/resources/Tr2TextureLodManager.js.map +0 -1
  310. package/dist/generated/resources/Tr2TextureLodUpdateRequest.js.map +0 -1
  311. package/dist/generated/resources/Tr2TexturePackChannel.js.map +0 -1
  312. package/dist/generated/resources/Tr2TexturePipeline.js +0 -44
  313. package/dist/generated/resources/Tr2TexturePipeline.js.map +0 -1
  314. package/dist/generated/resources/Tr2TexturePipelineParams.js.map +0 -1
  315. package/dist/generated/resources/Tr2TexturePipelineStepCompress.js.map +0 -1
  316. package/dist/generated/resources/Tr2TexturePipelineStepLimitSize.js.map +0 -1
  317. package/dist/generated/resources/Tr2TexturePipelineStepLoad.js.map +0 -1
  318. package/dist/generated/resources/Tr2TexturePipelineStepPack.js.map +0 -1
  319. package/dist/generated/resources/TriGeometryResAreaData.js.map +0 -1
  320. package/dist/generated/resources/TriGeometryResJointData.js.map +0 -1
  321. package/dist/generated/resources/TriGeometryResLodData.js.map +0 -1
  322. package/dist/generated/resources/TriGeometryResMeshData.js.map +0 -1
  323. package/dist/generated/resources/TriGeometryResSkeletonData.js.map +0 -1
  324. package/dist/generated/resources/TriJointBinding.js.map +0 -1
  325. package/dist/generated/resources/TriMorphTargetGeometryConstants.js.map +0 -1
  326. package/dist/generated/resources/TriRtGeometryConstants.js.map +0 -1
  327. package/dist/generated/resources/enums.js.map +0 -1
  328. package/dist/generated/resources/index.js +0 -32
  329. package/dist/generated/resources/index.js.map +0 -1
@@ -1,760 +1,639 @@
1
- import { resolveHydrationAdapter, CjsCarbonDocument, normalizeCarbonTypeDescriptor, CARBON_TYPE, normalizeCarbonValue, CjsSchema } from '@carbonenginejs/core-types';
2
- import { CJS_BLACK_FOURCC, CJS_BLACK_VERSION, CJS_BLACK_FORMAT_ID } from './blackConstants.js';
3
- import { CjsBlackBinaryReader } from './CjsBlackBinaryReader.js';
4
- import { CjsBlackPropertyReaders } from './CjsBlackPropertyReaders.js';
5
- import { CjsBlackSchemaRegistry } from './CjsBlackSchemaRegistry.js';
6
-
7
- class CjsBlackReader {
8
- constructor(input, options = {}) {
9
- this.options = {
10
- ...options
11
- };
12
- this.reader = CjsBlackBinaryReader.from(input, this);
13
- this.schemaShapes = CjsBlackSchemaRegistry.createShapeMap(options.schema);
14
- this.references = new Map();
15
- this.nodes = [];
16
- this.reports = [];
17
- this.nextNodeId = 1;
18
- this.info = null;
19
- this.readMode = "payload";
20
- this.payloadDepth = 0;
21
- this.payloadRootFields = null;
22
- this.hydrationAdapter = resolveHydrationAdapter(options);
23
- this.hydrationOptions = {
24
- ...options,
25
- markDirty: false,
26
- skipUpdate: true,
27
- skipEvents: true
28
- };
29
- this.runtimeInstances = [];
30
- }
31
- Inspect() {
32
- if (this.info) return this.info;
33
- const reader = this.reader;
34
- reader.ExpectU32(CJS_BLACK_FOURCC, "Invalid Black FOURCC");
35
- const version = reader.ReadU32();
36
- if (version !== CJS_BLACK_VERSION) {
37
- throw new RangeError(`Unsupported Black version: ${version}`);
38
- }
39
- const strings = CjsBlackReader.readStringTable(reader);
40
- const wideStrings = CjsBlackReader.readWideStringTable(reader);
41
- this.info = {
42
- format: {
43
- id: CJS_BLACK_FORMAT_ID,
44
- version
45
- },
46
- byteLength: reader.data.byteLength,
47
- dataOffset: reader.offset,
48
- strings,
49
- wideStrings
50
- };
51
- return this.info;
52
- }
53
- Read() {
54
- return this.ReadPayload();
55
- }
56
- ReadDocument() {
57
- const info = this.Inspect();
58
- this.ResetReadState();
59
- this.readMode = "document";
60
- this.reader.offset = info.dataOffset;
61
- const rootRef = this.ReadObject(this.reader);
62
- if (!CjsCarbonDocument.isRef(rootRef)) {
63
- throw new TypeError("Black root object is null");
64
- }
65
- this.reader.ExpectEnd("Black object graph did not read to end");
66
- const includeRefIndex = this.ShouldIncludeRefIndex();
67
- const refs = {};
68
- if (includeRefIndex) {
69
- for (const node of this.nodes) {
70
- refs[String(node.id)] = {
71
- kind: node.kind
72
- };
73
- }
74
- }
75
- return CjsCarbonDocument.create({
76
- format: info.format,
77
- roots: [{
78
- name: this.options.rootName || "default",
79
- ref: rootRef
80
- }],
81
- nodes: this.nodes,
82
- refs: includeRefIndex ? refs : null,
83
- metadata: this.CreateDocumentMetadata(info),
84
- reports: this.reports
85
- });
86
- }
87
- ReadRuntime() {
88
- const info = this.Inspect();
89
- this.ResetReadState();
90
- this.readMode = "runtime";
91
- this.reader.offset = info.dataOffset;
92
- const root = this.ReadObject(this.reader);
93
- if (root === null) {
94
- throw new TypeError("Black root object is null");
95
- }
96
- this.reader.ExpectEnd("Black object graph did not read to end");
97
-
98
- // Phase 3: the whole graph is constructed and valued (references
99
- // resolved), so run the adapter's post-graph init once per instance.
100
- // Instances are collected in completion order, so children finalize
101
- // before their parents.
102
- for (const record of this.runtimeInstances) {
103
- this.hydrationAdapter.finalize(record.instance, {
104
- kind: record.kind,
105
- shape: record.shape
106
- });
107
- }
108
- return {
109
- root,
110
- format: info.format,
111
- reports: this.reports
112
- };
113
- }
114
- ReadPayload() {
115
- const info = this.Inspect();
116
- this.ResetReadState();
117
- this.readMode = "payload";
118
- this.reader.offset = info.dataOffset;
119
- const object = this.ReadObject(this.reader);
120
- if (object === null) {
121
- throw new TypeError("Black root object is null");
122
- }
123
- this.reader.ExpectEnd("Black object graph did not read to end");
124
- const payload = {
125
- comments: this.reports,
126
- object
127
- };
128
- if (this.ShouldIncludeDocumentMetadata()) {
129
- payload.metadata = this.CreateDocumentMetadata(info);
130
- }
131
- return payload;
132
- }
133
- ReadObject(reader) {
134
- if (this.readMode === "runtime") return this.ReadRuntimeObject(reader);
135
- if (this.readMode === "payload") return this.ReadPayloadObject(reader);
136
- const blackReference = reader.ReadU32();
137
- if (blackReference === 0) return null;
138
- const existing = this.references.get(blackReference);
139
- if (existing) return CjsCarbonDocument.createRef(existing);
140
- return this.ReadObjectPayload(reader, {
141
- blackReference,
142
- embedded: false
143
- });
144
- }
145
- ReadEmbeddedObject(reader) {
146
- if (this.readMode === "runtime") return this.ReadRuntimeObjectPayload(reader, {
147
- blackReference: null,
148
- embedded: true
149
- });
150
- if (this.readMode === "payload") return this.ReadPayloadObjectPayload(reader, {
151
- blackReference: null,
152
- embedded: true
153
- });
154
- return this.ReadObjectPayload(reader, {
155
- blackReference: null,
156
- embedded: true
157
- });
158
- }
159
- ReadObjectPayload(reader, options) {
160
- const payloadSize = reader.ReadU32();
161
- const objectReader = reader.ReadBinaryReader(payloadSize);
162
- const kind = objectReader.ReadStringRef();
163
- const shape = this.ResolveSourceShape(kind);
164
- const includeClassMetadata = this.ShouldIncludeClassMetadata();
165
- const includeFieldTrace = this.ShouldIncludeFieldTrace();
166
- const node = {
167
- id: this.nextNodeId++,
168
- kind,
169
- fields: {},
170
- ...(includeClassMetadata ? {
171
- source: shape?.source || {},
172
- meta: {
173
- family: shape?.family || null,
174
- hashes: shape?.hashes || null,
175
- blue: shape?.blue || null
176
- }
177
- } : {}),
178
- ...(includeFieldTrace ? {
179
- meta: {
180
- ...(includeClassMetadata ? {
181
- family: shape?.family || null,
182
- hashes: shape?.hashes || null,
183
- blue: shape?.blue || null
184
- } : {}),
185
- black: {
186
- reference: options.blackReference,
187
- embedded: options.embedded,
188
- payloadSize,
189
- fields: {}
190
- }
191
- }
192
- } : {}),
193
- raw: null
194
- };
195
- this.nodes.push(node);
196
- if (options.blackReference !== null) {
197
- this.references.set(options.blackReference, node.id);
198
- }
199
- let previousBlackName = null;
200
- while (!objectReader.AtEnd()) {
201
- const blackName = objectReader.ReadStringRef();
202
- const target = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
203
- const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, target);
204
- this.AssignFieldValue(node, target, value);
205
- previousBlackName = blackName;
206
- }
207
- objectReader.ExpectEnd(`${kind} did not read to end`);
208
- return CjsCarbonDocument.createRef(node.id);
209
- }
210
- ReadRuntimeObject(reader) {
211
- const blackReference = reader.ReadU32();
212
- if (blackReference === 0) return null;
213
- if (this.references.has(blackReference)) {
214
- return this.references.get(blackReference);
215
- }
216
- return this.ReadRuntimeObjectPayload(reader, {
217
- blackReference,
218
- embedded: false
219
- });
220
- }
221
- ReadRuntimeObjectPayload(reader, options) {
222
- const payloadSize = reader.ReadU32();
223
- const objectReader = reader.ReadBinaryReader(payloadSize);
224
- const kind = objectReader.ReadStringRef();
225
- const shape = this.ResolveSourceShape(kind);
226
- const target = this.CreateRuntimeTarget(kind, shape);
227
- if (options.blackReference !== null) {
228
- this.references.set(options.blackReference, target);
229
- }
230
-
231
- // Accumulate this object's fields into a plain values map, then hand
232
- // the whole map to the hydration adapter. The adapter (default:
233
- // Object.assign) decides how the caller's class receives its values -
234
- // direct assignment, SetValues, etc. The target instance is already
235
- // registered above, so back-references resolve to it while its values
236
- // are still being collected (the adapter must mutate in place).
237
- const values = {};
238
- let previousBlackName = null;
239
- while (!objectReader.AtEnd()) {
240
- const blackName = objectReader.ReadStringRef();
241
- const fieldTarget = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
242
- const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, fieldTarget);
243
- this.AssignRuntimeFieldValue(values, fieldTarget, value);
244
- previousBlackName = blackName;
245
- }
246
- objectReader.ExpectEnd(`${kind} did not read to end`);
247
- this.hydrationAdapter.applyValues(target, values, {
248
- kind,
249
- shape,
250
- options: this.hydrationOptions
251
- });
252
- this.runtimeInstances.push({
253
- instance: target,
254
- kind,
255
- shape
256
- });
257
- return target;
258
- }
259
- ReadPayloadObject(reader) {
260
- const blackReference = reader.ReadU32();
261
- if (blackReference === 0) return null;
262
- if (this.references.has(blackReference)) {
263
- return this.CreatePayloadReference(this.references.get(blackReference), blackReference);
264
- }
265
- return this.ReadPayloadObjectPayload(reader, {
266
- blackReference,
267
- embedded: false
268
- });
269
- }
270
- ReadPayloadObjectPayload(reader, options) {
271
- const payloadSize = reader.ReadU32();
272
- const objectReader = reader.ReadBinaryReader(payloadSize);
273
- const kind = objectReader.ReadStringRef();
274
- const shape = this.ResolveSourceShape(kind);
275
- const target = this.CreatePayloadTarget(kind);
276
- if (options.blackReference !== null) {
277
- this.references.set(options.blackReference, target);
278
- }
279
- this.payloadDepth++;
280
- try {
281
- let previousBlackName = null;
282
- while (!objectReader.AtEnd()) {
283
- const blackName = objectReader.ReadStringRef();
284
- const fieldTarget = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
285
- if (this.ShouldSkipPayloadField(fieldTarget)) {
286
- this.SkipFieldValue(objectReader, fieldTarget);
287
- previousBlackName = blackName;
288
- continue;
289
- }
290
- const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, fieldTarget);
291
- this.AssignPayloadFieldValue(target, fieldTarget, value);
292
- previousBlackName = blackName;
293
- }
294
- } finally {
295
- this.payloadDepth--;
296
- }
297
- objectReader.ExpectEnd(`${kind} did not read to end`);
298
- return target;
299
- }
300
- CreateRuntimeTarget(kind, shape) {
301
- const built = this.hydrationAdapter.construct(kind, {
302
- kind,
303
- shape,
304
- options: this.options
305
- });
306
- if (built !== undefined) return built;
307
- const ClassConstructor = this.ResolveClass(kind);
308
- if (ClassConstructor) {
309
- return new ClassConstructor();
310
- }
311
- return {
312
- _sourceClassName: kind,
313
- _sourceShape: shape || null
314
- };
315
- }
316
- CreatePayloadTarget(kind) {
317
- const typeField = this.GetPayloadTypeField();
318
- return typeField ? {
319
- [typeField]: kind
320
- } : {};
321
- }
322
- CreateSkippedPayloadTarget() {
323
- return {};
324
- }
325
- CreatePayloadReference(targetObject, blackReference) {
326
- const idField = this.GetPayloadIdField();
327
- const referenceField = this.GetPayloadReferenceField();
328
- if (idField && !Object.hasOwn(targetObject, idField)) {
329
- targetObject[idField] = blackReference;
330
- }
331
- return referenceField ? {
332
- [referenceField]: blackReference
333
- } : targetObject;
334
- }
335
- GetPayloadTypeField() {
336
- return this.options.payloadTypeField === false ? null : this.options.payloadTypeField || "_type";
337
- }
338
- GetPayloadIdField() {
339
- return this.options.payloadIdField === false ? null : this.options.payloadIdField || "_id";
340
- }
341
- GetPayloadReferenceField() {
342
- return this.options.payloadReferenceField === false ? null : this.options.payloadReferenceField || "_reference";
343
- }
344
- GetPayloadRootFields() {
345
- if (this.payloadRootFields !== null) return this.payloadRootFields;
346
- const fields = this.options.payloadRootFields ?? this.options.rootFields ?? null;
347
- if (!fields) {
348
- this.payloadRootFields = false;
349
- return this.payloadRootFields;
350
- }
351
- this.payloadRootFields = new Set((Array.isArray(fields) ? fields : [fields]).map(String));
352
- return this.payloadRootFields;
353
- }
354
- ShouldSkipPayloadField(target) {
355
- if (this.readMode !== "payload" || this.payloadDepth !== 1) return false;
356
- const rootFields = this.GetPayloadRootFields();
357
- if (!rootFields) return false;
358
- const fieldName = target.unknown ? target.blackName : target.field.name;
359
- return !rootFields.has(fieldName);
360
- }
361
- SkipFieldValue(reader, target) {
362
- if (target.unknown) {
363
- this.ReadUnknownFieldValue(reader, null, target.blackName);
364
- return;
365
- }
366
- CjsBlackPropertyReaders.skipValue(reader, target.field);
367
- }
368
- SkipObject(reader) {
369
- const blackReference = reader.ReadU32();
370
- if (blackReference === 0) return;
371
- if (this.references.has(blackReference)) return;
372
- this.references.set(blackReference, this.CreateSkippedPayloadTarget());
373
- this.SkipObjectPayload(reader);
374
- }
375
- SkipEmbeddedObject(reader) {
376
- this.SkipObjectPayload(reader);
377
- }
378
- SkipObjectPayload(reader) {
379
- const payloadSize = reader.ReadU32();
380
- const objectReader = reader.ReadBinaryReader(payloadSize);
381
- const kind = objectReader.ReadStringRef();
382
- const shape = this.ResolveSourceShape(kind);
383
- while (!objectReader.AtEnd()) {
384
- const blackName = objectReader.ReadStringRef();
385
- const fieldTarget = this.ResolveFieldTarget(kind, shape, blackName);
386
- this.SkipFieldValue(objectReader, fieldTarget);
387
- }
388
- objectReader.ExpectEnd(`${kind} did not read to end`);
389
- }
390
- ShouldIncludeClassMetadata() {
391
- return Boolean(this.options.includeClassMetadata || this.options.trace || this.options.debug);
392
- }
393
- ShouldIncludeFieldTrace() {
394
- return Boolean(this.options.includeFieldTrace || this.options.trace || this.options.debug);
395
- }
396
- ShouldIncludeDocumentMetadata() {
397
- return Boolean(this.options.includeMetadata || this.options.trace || this.options.debug || this.options.metadata);
398
- }
399
- ShouldIncludeRefIndex() {
400
- return Boolean(this.options.includeRefIndex || this.options.trace || this.options.debug);
401
- }
402
- CreateDocumentMetadata(info) {
403
- if (!this.ShouldIncludeDocumentMetadata()) return this.options.metadata || null;
404
- return {
405
- black: {
406
- stringCount: info.strings.length,
407
- wideStringCount: info.wideStrings.length,
408
- wideStrings: info.wideStrings.slice()
409
- },
410
- ...(this.options.metadata || {})
411
- };
412
- }
413
- ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName = null) {
414
- try {
415
- return this.ResolveFieldTarget(kind, shape, blackName);
416
- } catch (error) {
417
- error.message = `${kind}.${blackName} after ${previousBlackName || "<start>"}: ${error.message}`;
418
- throw error;
419
- }
420
- }
421
- ReadFieldValueWithContext(reader, kind, blackName, target) {
422
- try {
423
- return target.unknown ? this.ReadUnknownFieldValue(reader, kind, blackName) : CjsBlackPropertyReaders.readValue(reader, target.field);
424
- } catch (error) {
425
- error.message = `${kind}.${blackName}: ${error.message}`;
426
- throw error;
427
- }
428
- }
429
- AssignFieldValue(node, target, value) {
430
- if (target.unknown) {
431
- node.raw = node.raw || {};
432
- node.raw[target.blackName] = value;
433
- this.AssignFieldTrace(node, target);
434
- return;
435
- }
436
- if (target.indexed) {
437
- let current = node.fields[target.field.name];
438
- if (!current || typeof current !== "object" || CjsCarbonDocument.isRef(current)) {
439
- current = Number.isInteger(target.index) ? [] : {};
440
- node.fields[target.field.name] = current;
441
- }
442
- current[target.key] = value;
443
- } else {
444
- node.fields[target.field.name] = value;
445
- }
446
- this.AssignFieldTrace(node, target);
447
- }
448
- AssignFieldTrace(node, target) {
449
- if (!this.ShouldIncludeFieldTrace()) return;
450
- node.meta.black.fields[target.blackName] = {
451
- field: target.field.name,
452
- cppName: target.field.cppName || null,
453
- member: target.member,
454
- indexed: target.indexed,
455
- indexToken: target.indexToken,
456
- key: target.key
457
- };
458
- }
459
- AssignRuntimeFieldValue(targetObject, target, value) {
460
- if (target.unknown) {
461
- targetObject[target.blackName] = value;
462
- return;
463
- }
464
- if (target.indexed) {
465
- let current = targetObject[target.field.name];
466
- if (!current || typeof current !== "object") {
467
- current = Number.isInteger(target.index) ? [] : {};
468
- targetObject[target.field.name] = current;
469
- }
470
- current[target.key] = this.NormalizeRuntimeFieldValue(value, target.field);
471
- return;
472
- }
473
- targetObject[target.field.name] = this.NormalizeRuntimeFieldValue(value, target.field);
474
- }
475
- AssignPayloadFieldValue(targetObject, target, value) {
476
- if (target.unknown) {
477
- targetObject[target.blackName] = value;
478
- return;
479
- }
480
- if (target.indexed) {
481
- let current = targetObject[target.field.name];
482
- if (!current || typeof current !== "object") {
483
- current = Number.isInteger(target.index) ? [] : {};
484
- targetObject[target.field.name] = current;
485
- }
486
- current[target.key] = value;
487
- return;
488
- }
489
- targetObject[target.field.name] = value;
490
- }
491
- NormalizeRuntimeFieldValue(value, field) {
492
- if (!field) return value;
493
-
494
- // In runtime mode, object-graph fields already hold constructed class
495
- // instances (or arrays/dicts of them) produced by ReadObject. Passing
496
- // those back through normalizeCarbonValue would deep-clone and flatten
497
- // them into plain objects, dropping the constructed classes. Preserve
498
- // them - matching CjsDocumentHydrator.hydrateFieldValue - and only
499
- // normalize scalar/math leaf values.
500
- const descriptor = normalizeCarbonTypeDescriptor(field);
501
- const kind = descriptor.kind;
502
- if (kind === CARBON_TYPE.ARRAY && Array.isArray(value)) return value;
503
- if ((kind === CARBON_TYPE.OBJECT_REF || kind === CARBON_TYPE.STRUCT || kind === CARBON_TYPE.RAW_STRUCT || kind === CARBON_TYPE.UNKNOWN) && value && typeof value === "object") {
504
- return value;
505
- }
506
- if (CjsBlackReader.isShapeIncompatibleMathArray(value, descriptor)) return value;
507
- return normalizeCarbonValue(value, field);
508
- }
509
- ResolveFieldTarget(kind, shape, blackName) {
510
- if (!shape) {
511
- throw new TypeError(`No source shape registered for Black type ${kind}`);
512
- }
513
- const fields = shape.fields || [];
514
- const blackField = (shape.black?.fields || []).find(item => CjsBlackSchemaRegistry.matchesBlackFieldName(item, blackName));
515
- if (blackField) {
516
- return this.ResolveBlackFieldTarget(blackName, blackField, fields);
517
- }
518
- const field = fields.find(item => item.name === blackName || item.cppName === blackName);
519
- if (field) {
520
- return {
521
- blackName,
522
- field,
523
- member: blackName,
524
- indexed: false,
525
- indexToken: null,
526
- index: null,
527
- key: null
528
- };
529
- }
530
- const indexed = CjsBlackReader.parseIndexedMember(blackName);
531
- if (indexed) {
532
- const indexedField = fields.find(item => item.cppName === indexed.member || item.name === CjsBlackReader.toJsFieldName(indexed.member));
533
- if (indexedField) {
534
- const key = CjsBlackReader.normalizeIndexedKey(indexed.indexToken, indexedField);
535
- return {
536
- blackName,
537
- field: indexedField,
538
- member: blackName,
539
- indexed: true,
540
- indexToken: indexed.indexToken,
541
- index: Number.isInteger(key) ? key : null,
542
- key
543
- };
544
- }
545
- }
546
- if (this.ShouldCaptureUnknownField(blackName, kind, shape)) {
547
- return this.ResolveUnknownFieldTarget(kind, shape, blackName);
548
- }
549
- throw new TypeError(`Unknown Black property ${blackName} for ${kind}`);
550
- }
551
- ReadUnknownFieldValue(reader, kind, blackName) {
552
- const readers = this.GetUnknownFieldReaders(blackName);
553
- const errors = [];
554
- for (const readValue of readers) {
555
- const startOffset = reader.offset;
556
- try {
557
- return readValue(reader);
558
- } catch (error) {
559
- reader.offset = startOffset;
560
- errors.push(error);
561
- }
562
- }
563
- this.reports.push({
564
- level: "warning",
565
- code: "unknown-black-property-unreadable",
566
- kind,
567
- blackName
568
- });
569
- throw errors[0] || new TypeError(`Unable to read unknown Black field ${blackName} for ${kind}`);
570
- }
571
- GetUnknownFieldReaders(blackName) {
572
- const readers = [];
573
- const readByKind = (kind, options = null) => {
574
- const field = options ? {
575
- ...options,
576
- kind
577
- } : {
578
- kind
579
- };
580
- readers.push(streamReader => CjsBlackPropertyReaders.readValue(streamReader, field));
581
- };
582
- const readByDescriptor = (descriptor = {}) => {
583
- readers.push(streamReader => CjsBlackPropertyReaders.readValue(streamReader, descriptor));
584
- };
585
- if (this.options.allowUnknownStringFallback) {
586
- readByKind("string");
587
- readByKind("path");
588
- }
589
- const name = String(blackName || "");
590
- if (name.endsWith(".dds") || name.endsWith(".png") || name.endsWith(".jpg") || /^res:\//.test(name)) {
591
- readers.unshift(streamReader => CjsBlackPropertyReaders.readValue(streamReader, {
592
- kind: "path"
593
- }));
594
- readByKind("uint32");
595
- readByKind("float32");
596
- }
597
- if (!this.options.allowUnknownStringFallback) {
598
- readByKind("path");
599
- readByKind("string");
600
- }
601
- readByKind("objectRef");
602
- readByKind("boolean");
603
- readByKind("float32");
604
- readByKind("float64");
605
- readByKind("int32");
606
- readByKind("uint32");
607
- readByKind("int16");
608
- readByKind("uint16");
609
- readByKind("int8");
610
- readByKind("uint8");
611
- readByDescriptor({
612
- kind: "vector3"
613
- });
614
- readByDescriptor({
615
- kind: "vector4"
616
- });
617
- readByDescriptor({
618
- kind: "array",
619
- elementType: {
620
- kind: "uint32"
621
- }
622
- });
623
- return readers;
624
- }
625
- ResolveBlackFieldTarget(blackName, blackField, fields) {
626
- const sourceField = fields.find(item => item.name === blackField.fieldName || item.name === blackField.name || item.cppName === blackField.cppName || item.cppName === blackField.memberPath || item.cppName === blackField.memberRoot);
627
- const fieldName = blackField.fieldName || sourceField?.name || blackField.name || CjsBlackReader.toJsFieldName(blackName);
628
- Boolean(blackField.name && blackField.name !== blackField.fieldName);
629
- const field = {
630
- ...(sourceField || {}),
631
- name: fieldName,
632
- cppName: blackField.cppName || sourceField?.cppName || null,
633
- cppType: blackField.cppType || sourceField?.cppType || null,
634
- black: blackField
635
- };
636
- const hasIndex = Boolean(blackField.indexToken || blackField.indexKey !== undefined);
637
- const storageKey = hasIndex ? blackField.indexKey ?? CjsBlackReader.normalizeIndexedKey(blackField.indexToken, field) : null;
638
- const indexed = Boolean(hasIndex);
639
- return {
640
- blackName,
641
- field,
642
- member: blackField.member || blackName,
643
- indexed,
644
- indexToken: blackField.indexToken || null,
645
- index: Number.isInteger(storageKey) ? storageKey : null,
646
- key: storageKey
647
- };
648
- }
649
- ResolveUnknownFieldTarget(_kind, _shape, blackName) {
650
- return {
651
- blackName,
652
- field: {
653
- name: "__blackUnknown",
654
- cppName: null,
655
- cppType: null,
656
- black: {
657
- fieldName: "__blackUnknown",
658
- name: blackName,
659
- memberPath: blackName,
660
- memberRoot: blackName,
661
- beType: "UNKNOWN"
662
- }
663
- },
664
- member: blackName,
665
- indexed: false,
666
- indexToken: null,
667
- index: null,
668
- key: blackName,
669
- unknown: true
670
- };
671
- }
672
- ShouldCaptureUnknownField(blackName, _kind, shape) {
673
- if (this.options.captureUnknownBlackFields) return true;
674
- if (this.options.captureUnknownResourceFields && /^res:\//.test(String(blackName || ""))) return true;
675
- if (this.options.captureUnknownWhenNoBlackFields && (!shape?.black || !shape.black.fields || !shape.black.fields.length)) return true;
676
- return false;
677
- }
678
- ResolveSourceShape(kind) {
679
- const registry = this.options.registry || null;
680
- if (registry?.GetSourceShape) return registry.GetSourceShape(kind);
681
- const sourceShapes = this.options.sourceShapes || null;
682
- if (sourceShapes?.GetSourceShape) return sourceShapes.GetSourceShape(kind);
683
- if (sourceShapes) {
684
- const shape = sourceShapes instanceof Map ? sourceShapes.get(kind) : sourceShapes[kind];
685
- if (shape) return CjsBlackSchemaRegistry.normalizeShape(shape);
686
- }
687
- return this.schemaShapes.get(kind) || null;
688
- }
689
- ResolveClass(kind) {
690
- const classes = this.options.classes || {};
691
- const Schema = this.options.registry || CjsSchema;
692
- return classes[kind] || Schema.GetConstructor(kind);
693
- }
694
- ResetReadState() {
695
- this.references = new Map();
696
- this.nodes = [];
697
- this.reports = [];
698
- this.nextNodeId = this.options.firstId || 1;
699
- this.payloadDepth = 0;
700
- this.payloadRootFields = null;
701
- this.runtimeInstances = [];
702
- }
703
- TransformPath(value) {
704
- const handler = this.options.pathHandler;
705
- return typeof handler === "function" ? handler(value) : value;
706
- }
707
- static readStringTable(reader) {
708
- const stringsReader = reader.ReadBinaryReader(reader.ReadU32());
709
- const count = stringsReader.ReadU16();
710
- const strings = [];
711
- for (let i = 0; i < count; i++) {
712
- strings[i] = stringsReader.ReadCString();
713
- }
714
- stringsReader.ExpectEnd("Black string table did not read to end");
715
- return strings;
716
- }
717
- static readWideStringTable(reader) {
718
- const wideStringsReader = reader.ReadBinaryReader(reader.ReadU32());
719
- const count = wideStringsReader.ReadU16();
720
- const wideStrings = [];
721
- for (let i = 0; i < count; i++) {
722
- wideStrings[i] = wideStringsReader.ReadCWString();
723
- }
724
- wideStringsReader.ExpectEnd("Black wide string table did not read to end");
725
- return wideStrings;
726
- }
727
- static normalizeIndexedKey(indexToken, field) {
728
- const number = Number(indexToken);
729
- if (Number.isInteger(number) && String(indexToken).trim() === String(number)) return number;
730
- let text = String(indexToken || "").trim();
731
- text = text.replace(/^.*::/, "");
732
- text = text.replace(/^TYPE_/, "");
733
- const pascal = text.split(/[^A-Za-z0-9]+/).filter(Boolean).map(part => CJS_BLACK_INDEX_TOKEN_NAMES[part] || (part === "FX" ? "FX" : part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())).join("");
734
- if (field?.jsType?.kind === "objectRef") {
735
- return pascal ? pascal.charAt(0).toLowerCase() + pascal.slice(1) : text;
736
- }
737
- return pascal || text;
738
- }
739
- static parseIndexedMember(value) {
740
- const match = String(value || "").match(/^(.+)\[([^\]]+)\]$/);
741
- if (!match) return null;
742
- return {
743
- member: match[1],
744
- indexToken: match[2]
745
- };
746
- }
747
- static toJsFieldName(value) {
748
- return String(value || "").replace(/^m_/, "");
749
- }
750
- static isShapeIncompatibleMathArray(value, descriptor) {
751
- const expectedLength = descriptor?.length;
752
- return Array.isArray(value) && Number.isInteger(expectedLength) && value.length !== expectedLength;
753
- }
754
- }
755
- const CJS_BLACK_INDEX_TOKEN_NAMES = Object.freeze({
756
- SIMPLEPRIMARY: "SimplePrimary"
757
- });
758
-
759
- export { CjsBlackReader };
760
- //# sourceMappingURL=CjsBlackReader.js.map
1
+ import { CjsCarbonDocument } from '@carbonenginejs/core-types/document';
2
+ import { CjsSchema } from '@carbonenginejs/core-types/schema';
3
+ import { CjsBlueReader } from '../../../format/CjsBlueReader.js';
4
+ import { CJS_BLACK_FOURCC, CJS_BLACK_VERSION, CJS_BLACK_FORMAT_ID } from './blackConstants.js';
5
+ import { CjsBlackBinaryReader } from './CjsBlackBinaryReader.js';
6
+ import { CjsBlackPropertyReaders } from './CjsBlackPropertyReaders.js';
7
+ import { CjsBlackSchemaRegistry } from './CjsBlackSchemaRegistry.js';
8
+
9
+ /**
10
+ * Reads a `.black` stream into a payload/document/runtime graph.
11
+ *
12
+ * This transport owns the binary buffer, string tables, numeric references,
13
+ * and binary read cursor. `ResetReadState()` clears only per-read graph state;
14
+ * each read entrypoint separately restores the cursor to `dataOffset`.
15
+ */
16
+ class CjsBlackReader extends CjsBlueReader {
17
+ constructor(input, options = {}) {
18
+ super(options, {
19
+ schemaRegistry: CjsBlackSchemaRegistry,
20
+ defaultRegistry: CjsSchema,
21
+ includeShapeContext: true,
22
+ includeSourceShape: true,
23
+ includeEmptyPayloadType: true,
24
+ requirePayloadReferenceTarget: true
25
+ });
26
+ this.reader = CjsBlackBinaryReader.from(input, this);
27
+ this.references = new Map();
28
+ this.nodes = [];
29
+ this.nextNodeId = 1;
30
+ this.info = null;
31
+ this.readMode = "payload";
32
+ this.payloadDepth = 0;
33
+ this.payloadRootFields = null;
34
+ }
35
+ Inspect() {
36
+ if (this.info) return this.info;
37
+ const reader = this.reader;
38
+ reader.ExpectU32(CJS_BLACK_FOURCC, "Invalid Black FOURCC");
39
+ const version = reader.ReadU32();
40
+ if (version !== CJS_BLACK_VERSION) {
41
+ throw new RangeError(`Unsupported Black version: ${version}`);
42
+ }
43
+ const strings = CjsBlackReader.readStringTable(reader);
44
+ const wideStrings = CjsBlackReader.readWideStringTable(reader);
45
+ this.info = {
46
+ format: {
47
+ id: CJS_BLACK_FORMAT_ID,
48
+ version
49
+ },
50
+ byteLength: reader.data.byteLength,
51
+ dataOffset: reader.offset,
52
+ strings,
53
+ wideStrings
54
+ };
55
+ return this.info;
56
+ }
57
+ Read() {
58
+ return this.ReadPayload();
59
+ }
60
+ ReadDocument() {
61
+ const info = this.Inspect();
62
+ this.ResetReadState();
63
+ this.readMode = "document";
64
+ this.reader.offset = info.dataOffset;
65
+ const rootRef = this.ReadObject(this.reader);
66
+ if (!CjsCarbonDocument.isRef(rootRef)) {
67
+ throw new TypeError("Black root object is null");
68
+ }
69
+ this.reader.ExpectEnd("Black object graph did not read to end");
70
+ const includeRefIndex = this.ShouldIncludeRefIndex();
71
+ const refs = {};
72
+ if (includeRefIndex) {
73
+ for (const node of this.nodes) {
74
+ refs[String(node.id)] = {
75
+ kind: node.kind
76
+ };
77
+ }
78
+ }
79
+ return CjsCarbonDocument.create({
80
+ format: info.format,
81
+ roots: [{
82
+ name: this.options.rootName || "default",
83
+ ref: rootRef
84
+ }],
85
+ nodes: this.nodes,
86
+ refs: includeRefIndex ? refs : null,
87
+ metadata: this.CreateDocumentMetadata(info),
88
+ reports: this.reports
89
+ });
90
+ }
91
+ ReadRuntime() {
92
+ const info = this.Inspect();
93
+ this.ResetReadState();
94
+ this.readMode = "runtime";
95
+ this.reader.offset = info.dataOffset;
96
+ const root = this.ReadObject(this.reader);
97
+ if (root === null) {
98
+ throw new TypeError("Black root object is null");
99
+ }
100
+ this.reader.ExpectEnd("Black object graph did not read to end");
101
+ this.FinalizeRuntimeInstances();
102
+ return {
103
+ root,
104
+ format: info.format,
105
+ reports: this.reports
106
+ };
107
+ }
108
+ ReadPayload() {
109
+ const info = this.Inspect();
110
+ this.ResetReadState();
111
+ this.readMode = "payload";
112
+ this.ValidatePayloadConfiguration();
113
+ this.reader.offset = info.dataOffset;
114
+ const object = this.ReadObject(this.reader);
115
+ if (object === null) {
116
+ throw new TypeError("Black root object is null");
117
+ }
118
+ this.reader.ExpectEnd("Black object graph did not read to end");
119
+ const payload = {
120
+ comments: this.reports,
121
+ object
122
+ };
123
+ if (this.ShouldIncludeDocumentMetadata()) {
124
+ payload.metadata = this.CreateDocumentMetadata(info);
125
+ }
126
+ return payload;
127
+ }
128
+ ReadObject(reader) {
129
+ if (this.readMode === "runtime") return this.ReadRuntimeObject(reader);
130
+ if (this.readMode === "payload") return this.ReadPayloadObject(reader);
131
+ const blackReference = reader.ReadU32();
132
+ if (blackReference === 0) return null;
133
+ const existing = this.references.get(blackReference);
134
+ if (existing) return CjsCarbonDocument.createRef(existing);
135
+ return this.ReadObjectPayload(reader, {
136
+ blackReference,
137
+ embedded: false
138
+ });
139
+ }
140
+ ReadEmbeddedObject(reader) {
141
+ if (this.readMode === "runtime") return this.ReadRuntimeObjectPayload(reader, {
142
+ blackReference: null,
143
+ embedded: true
144
+ });
145
+ if (this.readMode === "payload") return this.ReadPayloadObjectPayload(reader, {
146
+ blackReference: null,
147
+ embedded: true
148
+ });
149
+ return this.ReadObjectPayload(reader, {
150
+ blackReference: null,
151
+ embedded: true
152
+ });
153
+ }
154
+ ReadObjectPayload(reader, options) {
155
+ const payloadSize = reader.ReadU32();
156
+ const objectReader = reader.ReadBinaryReader(payloadSize);
157
+ const kind = objectReader.ReadStringRef();
158
+ const shape = this.ResolveSourceShape(kind);
159
+ const includeClassMetadata = this.ShouldIncludeClassMetadata();
160
+ const includeFieldTrace = this.ShouldIncludeFieldTrace();
161
+ const node = {
162
+ id: this.nextNodeId++,
163
+ kind,
164
+ fields: {},
165
+ ...(includeClassMetadata ? {
166
+ source: shape?.source || {},
167
+ meta: {
168
+ family: shape?.family || null,
169
+ hashes: shape?.hashes || null,
170
+ blue: shape?.blue || null
171
+ }
172
+ } : {}),
173
+ ...(includeFieldTrace ? {
174
+ meta: {
175
+ ...(includeClassMetadata ? {
176
+ family: shape?.family || null,
177
+ hashes: shape?.hashes || null,
178
+ blue: shape?.blue || null
179
+ } : {}),
180
+ black: {
181
+ reference: options.blackReference,
182
+ embedded: options.embedded,
183
+ payloadSize,
184
+ fields: {}
185
+ }
186
+ }
187
+ } : {}),
188
+ raw: null
189
+ };
190
+ this.nodes.push(node);
191
+ if (options.blackReference !== null) {
192
+ this.references.set(options.blackReference, node.id);
193
+ }
194
+ let previousBlackName = null;
195
+ while (!objectReader.AtEnd()) {
196
+ const blackName = objectReader.ReadStringRef();
197
+ const target = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
198
+ const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, target);
199
+ this.AssignFieldValue(node, target, value);
200
+ previousBlackName = blackName;
201
+ }
202
+ objectReader.ExpectEnd(`${kind} did not read to end`);
203
+ return CjsCarbonDocument.createRef(node.id);
204
+ }
205
+ ReadRuntimeObject(reader) {
206
+ const blackReference = reader.ReadU32();
207
+ if (blackReference === 0) return null;
208
+ if (this.references.has(blackReference)) {
209
+ return this.references.get(blackReference);
210
+ }
211
+ return this.ReadRuntimeObjectPayload(reader, {
212
+ blackReference,
213
+ embedded: false
214
+ });
215
+ }
216
+ ReadRuntimeObjectPayload(reader, options) {
217
+ const payloadSize = reader.ReadU32();
218
+ const objectReader = reader.ReadBinaryReader(payloadSize);
219
+ const kind = objectReader.ReadStringRef();
220
+ const shape = this.ResolveSourceShape(kind);
221
+ const target = this.CreateRuntimeTarget(kind, shape);
222
+ if (options.blackReference !== null) {
223
+ this.references.set(options.blackReference, target);
224
+ }
225
+
226
+ // Accumulate this object's fields into a plain values map, then hand
227
+ // the whole map to the hydration adapter. The adapter (default:
228
+ // Object.assign) decides how the caller's class receives its values -
229
+ // direct assignment, SetValues, etc. The target instance is already
230
+ // registered above, so back-references resolve to it while its values
231
+ // are still being collected (the adapter must mutate in place).
232
+ const values = {};
233
+ let previousBlackName = null;
234
+ while (!objectReader.AtEnd()) {
235
+ const blackName = objectReader.ReadStringRef();
236
+ const fieldTarget = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
237
+ const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, fieldTarget);
238
+ this.AssignRuntimeFieldValue(values, fieldTarget, value);
239
+ previousBlackName = blackName;
240
+ }
241
+ objectReader.ExpectEnd(`${kind} did not read to end`);
242
+ this.ApplyRuntimeValues(target, values, kind, shape);
243
+ return target;
244
+ }
245
+ ReadPayloadObject(reader) {
246
+ const blackReference = reader.ReadU32();
247
+ if (blackReference === 0) return null;
248
+ if (this.references.has(blackReference)) {
249
+ return this.CreatePayloadReference(this.references.get(blackReference), blackReference);
250
+ }
251
+ return this.ReadPayloadObjectPayload(reader, {
252
+ blackReference,
253
+ embedded: false
254
+ });
255
+ }
256
+ ReadPayloadObjectPayload(reader, options) {
257
+ const payloadSize = reader.ReadU32();
258
+ const objectReader = reader.ReadBinaryReader(payloadSize);
259
+ const kind = objectReader.ReadStringRef();
260
+ const shape = this.ResolveSourceShape(kind);
261
+ const target = this.CreatePayloadTarget(kind);
262
+ if (options.blackReference !== null) {
263
+ this.references.set(options.blackReference, target);
264
+ }
265
+ this.payloadDepth++;
266
+ try {
267
+ let previousBlackName = null;
268
+ while (!objectReader.AtEnd()) {
269
+ const blackName = objectReader.ReadStringRef();
270
+ const fieldTarget = this.ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName);
271
+ if (this.ShouldSkipPayloadField(fieldTarget)) {
272
+ this.SkipFieldValue(objectReader, fieldTarget);
273
+ previousBlackName = blackName;
274
+ continue;
275
+ }
276
+ const value = this.ReadFieldValueWithContext(objectReader, kind, blackName, fieldTarget);
277
+ this.AssignPayloadFieldValue(target, fieldTarget, value);
278
+ previousBlackName = blackName;
279
+ }
280
+ } finally {
281
+ this.payloadDepth--;
282
+ }
283
+ objectReader.ExpectEnd(`${kind} did not read to end`);
284
+ return target;
285
+ }
286
+ CreateSkippedPayloadTarget() {
287
+ return {};
288
+ }
289
+ GetPayloadRootFields() {
290
+ if (this.payloadRootFields !== null) return this.payloadRootFields;
291
+ const fields = this.options.payloadRootFields ?? this.options.rootFields ?? null;
292
+ if (!fields) {
293
+ this.payloadRootFields = false;
294
+ return this.payloadRootFields;
295
+ }
296
+ this.payloadRootFields = new Set((Array.isArray(fields) ? fields : [fields]).map(String));
297
+ return this.payloadRootFields;
298
+ }
299
+ ShouldSkipPayloadField(target) {
300
+ if (this.readMode !== "payload" || this.payloadDepth !== 1) return false;
301
+ const rootFields = this.GetPayloadRootFields();
302
+ if (!rootFields) return false;
303
+ const fieldName = target.unknown ? target.blackName : target.field.name;
304
+ return !rootFields.has(fieldName);
305
+ }
306
+ SkipFieldValue(reader, target) {
307
+ if (target.unknown) {
308
+ this.ReadUnknownFieldValue(reader, null, target.blackName);
309
+ return;
310
+ }
311
+ CjsBlackPropertyReaders.skipValue(reader, target.field);
312
+ }
313
+ SkipObject(reader) {
314
+ const blackReference = reader.ReadU32();
315
+ if (blackReference === 0) return;
316
+ if (this.references.has(blackReference)) return;
317
+ this.references.set(blackReference, this.CreateSkippedPayloadTarget());
318
+ this.SkipObjectPayload(reader);
319
+ }
320
+ SkipEmbeddedObject(reader) {
321
+ this.SkipObjectPayload(reader);
322
+ }
323
+ SkipObjectPayload(reader) {
324
+ const payloadSize = reader.ReadU32();
325
+ const objectReader = reader.ReadBinaryReader(payloadSize);
326
+ const kind = objectReader.ReadStringRef();
327
+ const shape = this.ResolveSourceShape(kind);
328
+ while (!objectReader.AtEnd()) {
329
+ const blackName = objectReader.ReadStringRef();
330
+ const fieldTarget = this.ResolveFieldTarget(kind, shape, blackName);
331
+ this.SkipFieldValue(objectReader, fieldTarget);
332
+ }
333
+ objectReader.ExpectEnd(`${kind} did not read to end`);
334
+ }
335
+ ShouldIncludeClassMetadata() {
336
+ return Boolean(this.options.includeClassMetadata || this.options.trace || this.options.debug);
337
+ }
338
+ ShouldIncludeFieldTrace() {
339
+ return Boolean(this.options.includeFieldTrace || this.options.trace || this.options.debug);
340
+ }
341
+ ShouldIncludeDocumentMetadata() {
342
+ return Boolean(this.options.includeMetadata || this.options.trace || this.options.debug || this.options.metadata);
343
+ }
344
+ ShouldIncludeRefIndex() {
345
+ return Boolean(this.options.includeRefIndex || this.options.trace || this.options.debug);
346
+ }
347
+ CreateDocumentMetadata(info) {
348
+ if (!this.ShouldIncludeDocumentMetadata()) return this.options.metadata || null;
349
+ return {
350
+ black: {
351
+ stringCount: info.strings.length,
352
+ wideStringCount: info.wideStrings.length,
353
+ wideStrings: info.wideStrings.slice()
354
+ },
355
+ ...(this.options.metadata || {})
356
+ };
357
+ }
358
+ ResolveFieldTargetWithContext(kind, shape, blackName, previousBlackName = null) {
359
+ try {
360
+ return this.ResolveFieldTarget(kind, shape, blackName);
361
+ } catch (error) {
362
+ error.message = `${kind}.${blackName} after ${previousBlackName || "<start>"}: ${error.message}`;
363
+ throw error;
364
+ }
365
+ }
366
+ ReadFieldValueWithContext(reader, kind, blackName, target) {
367
+ try {
368
+ return target.unknown ? this.ReadUnknownFieldValue(reader, kind, blackName) : CjsBlackPropertyReaders.readValue(reader, target.field);
369
+ } catch (error) {
370
+ error.message = `${kind}.${blackName}: ${error.message}`;
371
+ throw error;
372
+ }
373
+ }
374
+ AssignFieldValue(node, target, value) {
375
+ if (target.unknown) {
376
+ node.raw = node.raw || {};
377
+ node.raw[target.blackName] = value;
378
+ this.AssignFieldTrace(node, target);
379
+ return;
380
+ }
381
+ if (target.indexed) {
382
+ let current = node.fields[target.field.name];
383
+ if (!current || typeof current !== "object" || CjsCarbonDocument.isRef(current)) {
384
+ current = Number.isInteger(target.index) ? [] : {};
385
+ node.fields[target.field.name] = current;
386
+ }
387
+ current[target.key] = value;
388
+ } else {
389
+ node.fields[target.field.name] = value;
390
+ }
391
+ this.AssignFieldTrace(node, target);
392
+ }
393
+ AssignFieldTrace(node, target) {
394
+ if (!this.ShouldIncludeFieldTrace()) return;
395
+ node.meta.black.fields[target.blackName] = {
396
+ field: target.field.name,
397
+ cppName: target.field.cppName || null,
398
+ member: target.member,
399
+ indexed: target.indexed,
400
+ indexToken: target.indexToken,
401
+ key: target.key
402
+ };
403
+ }
404
+ ResolveFieldTarget(kind, shape, blackName) {
405
+ if (!shape) {
406
+ throw new TypeError(`No source shape registered for Black type ${kind}`);
407
+ }
408
+ const fields = shape.fields || [];
409
+ const blackField = (shape.black?.fields || []).find(item => CjsBlackSchemaRegistry.matchesBlackFieldName(item, blackName));
410
+ if (blackField) {
411
+ return this.ResolveBlackFieldTarget(blackName, blackField, fields);
412
+ }
413
+ const field = fields.find(item => item.name === blackName || item.cppName === blackName);
414
+ if (field) {
415
+ return {
416
+ blackName,
417
+ wireName: blackName,
418
+ field,
419
+ member: blackName,
420
+ indexed: false,
421
+ indexToken: null,
422
+ index: null,
423
+ key: null
424
+ };
425
+ }
426
+ const indexed = CjsBlackReader.parseIndexedMember(blackName);
427
+ if (indexed) {
428
+ const indexedField = fields.find(item => item.cppName === indexed.member || item.name === CjsBlackReader.toJsFieldName(indexed.member));
429
+ if (indexedField) {
430
+ const key = CjsBlackReader.normalizeIndexedKey(indexed.indexToken, indexedField);
431
+ return {
432
+ blackName,
433
+ wireName: blackName,
434
+ field: indexedField,
435
+ member: blackName,
436
+ indexed: true,
437
+ indexToken: indexed.indexToken,
438
+ index: Number.isInteger(key) ? key : null,
439
+ key
440
+ };
441
+ }
442
+ }
443
+ if (this.ShouldCaptureUnknownField(blackName, kind, shape)) {
444
+ return this.ResolveUnknownFieldTarget(kind, shape, blackName);
445
+ }
446
+ throw new TypeError(`Unknown Black property ${blackName} for ${kind}`);
447
+ }
448
+ ReadUnknownFieldValue(reader, kind, blackName) {
449
+ const readers = this.GetUnknownFieldReaders(blackName);
450
+ const errors = [];
451
+ for (const readValue of readers) {
452
+ const startOffset = reader.offset;
453
+ try {
454
+ return readValue(reader);
455
+ } catch (error) {
456
+ reader.offset = startOffset;
457
+ errors.push(error);
458
+ }
459
+ }
460
+ this.reports.push({
461
+ level: "warning",
462
+ code: "unknown-black-property-unreadable",
463
+ kind,
464
+ blackName
465
+ });
466
+ throw errors[0] || new TypeError(`Unable to read unknown Black field ${blackName} for ${kind}`);
467
+ }
468
+ GetUnknownFieldReaders(blackName) {
469
+ const readers = [];
470
+ const readByKind = (kind, options = null) => {
471
+ const field = options ? {
472
+ ...options,
473
+ kind
474
+ } : {
475
+ kind
476
+ };
477
+ readers.push(streamReader => CjsBlackPropertyReaders.readValue(streamReader, field));
478
+ };
479
+ const readByDescriptor = (descriptor = {}) => {
480
+ readers.push(streamReader => CjsBlackPropertyReaders.readValue(streamReader, descriptor));
481
+ };
482
+ if (this.options.allowUnknownStringFallback) {
483
+ readByKind("string");
484
+ readByKind("path");
485
+ }
486
+ const name = String(blackName || "");
487
+ if (name.endsWith(".dds") || name.endsWith(".png") || name.endsWith(".jpg") || /^res:\//.test(name)) {
488
+ readers.unshift(streamReader => CjsBlackPropertyReaders.readValue(streamReader, {
489
+ kind: "path"
490
+ }));
491
+ readByKind("uint32");
492
+ readByKind("float32");
493
+ }
494
+ if (!this.options.allowUnknownStringFallback) {
495
+ readByKind("path");
496
+ readByKind("string");
497
+ }
498
+ readByKind("objectRef");
499
+ readByKind("boolean");
500
+ readByKind("float32");
501
+ readByKind("float64");
502
+ readByKind("int32");
503
+ readByKind("uint32");
504
+ readByKind("int16");
505
+ readByKind("uint16");
506
+ readByKind("int8");
507
+ readByKind("uint8");
508
+ readByDescriptor({
509
+ kind: "vector3"
510
+ });
511
+ readByDescriptor({
512
+ kind: "vector4"
513
+ });
514
+ readByDescriptor({
515
+ kind: "array",
516
+ elementType: {
517
+ kind: "uint32"
518
+ }
519
+ });
520
+ return readers;
521
+ }
522
+ ResolveBlackFieldTarget(blackName, blackField, fields) {
523
+ const sourceField = fields.find(item => item.name === blackField.fieldName || item.name === blackField.name || item.cppName === blackField.cppName || item.cppName === blackField.memberPath || item.cppName === blackField.memberRoot);
524
+ const fieldName = blackField.fieldName || sourceField?.name || blackField.name || CjsBlackReader.toJsFieldName(blackName);
525
+ Boolean(blackField.name && blackField.name !== blackField.fieldName);
526
+ const field = {
527
+ ...(sourceField || {}),
528
+ name: fieldName,
529
+ cppName: blackField.cppName || sourceField?.cppName || null,
530
+ cppType: blackField.cppType || sourceField?.cppType || null,
531
+ black: blackField
532
+ };
533
+ const hasIndex = Boolean(blackField.indexToken || blackField.indexKey !== undefined);
534
+ const storageKey = hasIndex ? blackField.indexKey ?? CjsBlackReader.normalizeIndexedKey(blackField.indexToken, field) : null;
535
+ const indexed = Boolean(hasIndex);
536
+ return {
537
+ blackName,
538
+ wireName: blackName,
539
+ field,
540
+ member: blackField.member || blackName,
541
+ indexed,
542
+ indexToken: blackField.indexToken || null,
543
+ index: Number.isInteger(storageKey) ? storageKey : null,
544
+ key: storageKey
545
+ };
546
+ }
547
+ ResolveUnknownFieldTarget(_kind, _shape, blackName) {
548
+ return {
549
+ blackName,
550
+ wireName: blackName,
551
+ field: {
552
+ name: "__blackUnknown",
553
+ cppName: null,
554
+ cppType: null,
555
+ black: {
556
+ fieldName: "__blackUnknown",
557
+ name: blackName,
558
+ memberPath: blackName,
559
+ memberRoot: blackName,
560
+ beType: "UNKNOWN"
561
+ }
562
+ },
563
+ member: blackName,
564
+ indexed: false,
565
+ indexToken: null,
566
+ index: null,
567
+ key: blackName,
568
+ unknown: true
569
+ };
570
+ }
571
+ ShouldCaptureUnknownField(blackName, _kind, shape) {
572
+ if (this.options.captureUnknownBlackFields) return true;
573
+ if (this.options.captureUnknownResourceFields && /^res:\//.test(String(blackName || ""))) return true;
574
+ if (this.options.captureUnknownWhenNoBlackFields && (!shape?.black || !shape.black.fields || !shape.black.fields.length)) return true;
575
+ return false;
576
+ }
577
+ ResolveClass(kind) {
578
+ const classes = this.options.classes || {};
579
+ const Schema = this.options.registry || CjsSchema;
580
+ return classes[kind] || Schema.GetConstructor(kind);
581
+ }
582
+ ResetReadState() {
583
+ super.ResetBlueReadState();
584
+ this.references = new Map();
585
+ this.nodes = [];
586
+ this.nextNodeId = this.options.firstId || 1;
587
+ this.payloadDepth = 0;
588
+ this.payloadRootFields = null;
589
+ }
590
+ static readStringTable(reader) {
591
+ const stringsReader = reader.ReadBinaryReader(reader.ReadU32());
592
+ const count = stringsReader.ReadU16();
593
+ const strings = [];
594
+ for (let i = 0; i < count; i++) {
595
+ strings[i] = stringsReader.ReadCString();
596
+ }
597
+ stringsReader.ExpectEnd("Black string table did not read to end");
598
+ return strings;
599
+ }
600
+ static readWideStringTable(reader) {
601
+ const wideStringsReader = reader.ReadBinaryReader(reader.ReadU32());
602
+ const count = wideStringsReader.ReadU16();
603
+ const wideStrings = [];
604
+ for (let i = 0; i < count; i++) {
605
+ wideStrings[i] = wideStringsReader.ReadCWString();
606
+ }
607
+ wideStringsReader.ExpectEnd("Black wide string table did not read to end");
608
+ return wideStrings;
609
+ }
610
+ static normalizeIndexedKey(indexToken, field) {
611
+ const number = Number(indexToken);
612
+ if (Number.isInteger(number) && String(indexToken).trim() === String(number)) return number;
613
+ let text = String(indexToken || "").trim();
614
+ text = text.replace(/^.*::/, "");
615
+ text = text.replace(/^TYPE_/, "");
616
+ const pascal = text.split(/[^A-Za-z0-9]+/).filter(Boolean).map(part => CJS_BLACK_INDEX_TOKEN_NAMES[part] || (part === "FX" ? "FX" : part.charAt(0).toUpperCase() + part.slice(1).toLowerCase())).join("");
617
+ if (field?.jsType?.kind === "objectRef") {
618
+ return pascal ? pascal.charAt(0).toLowerCase() + pascal.slice(1) : text;
619
+ }
620
+ return pascal || text;
621
+ }
622
+ static parseIndexedMember(value) {
623
+ const match = String(value || "").match(/^(.+)\[([^\]]+)\]$/);
624
+ if (!match) return null;
625
+ return {
626
+ member: match[1],
627
+ indexToken: match[2]
628
+ };
629
+ }
630
+ static toJsFieldName(value) {
631
+ return String(value || "").replace(/^m_/, "");
632
+ }
633
+ }
634
+ const CJS_BLACK_INDEX_TOKEN_NAMES = Object.freeze({
635
+ SIMPLEPRIMARY: "SimplePrimary"
636
+ });
637
+
638
+ export { CjsBlackReader };
639
+ //# sourceMappingURL=CjsBlackReader.js.map