@carbonenginejs/runtime-resource 0.20.0 → 0.22.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 (306) hide show
  1. package/NOTICE +6 -0
  2. package/dist/CjsResMan.js +1374 -1318
  3. package/dist/CjsResMan.js.map +1 -1
  4. package/dist/format/CjsFormat.js +393 -164
  5. package/dist/format/CjsFormat.js.map +1 -1
  6. package/dist/format/CjsFormatStore.js +315 -0
  7. package/dist/format/CjsFormatStore.js.map +1 -0
  8. package/dist/format/CjsResourceProbe.js +66 -234
  9. package/dist/format/CjsResourceProbe.js.map +1 -1
  10. package/dist/format/payloadContract.js +47 -6
  11. package/dist/format/payloadContract.js.map +1 -1
  12. package/dist/formats/black/CjsBlackFormat.js +23 -6
  13. package/dist/formats/black/CjsBlackFormat.js.map +1 -1
  14. package/dist/formats/bnk/CjsBnkFormat.js +122 -120
  15. package/dist/formats/bnk/CjsBnkFormat.js.map +1 -1
  16. package/dist/formats/bnk/core/helpers.js +5 -15
  17. package/dist/formats/bnk/core/helpers.js.map +1 -1
  18. package/dist/formats/cmf/CjsCmfFormat.js +31 -14
  19. package/dist/formats/cmf/CjsCmfFormat.js.map +1 -1
  20. package/dist/formats/dds/CjsDdsFormat.js +29 -19
  21. package/dist/formats/dds/CjsDdsFormat.js.map +1 -1
  22. package/dist/formats/dds/core/helpers.js +4 -5
  23. package/dist/formats/dds/core/helpers.js.map +1 -1
  24. package/dist/formats/dxbc/CjsDxbcFormat.js +15 -13
  25. package/dist/formats/dxbc/CjsDxbcFormat.js.map +1 -1
  26. package/dist/formats/fbx/CjsFbxFormat.js +27 -19
  27. package/dist/formats/fbx/CjsFbxFormat.js.map +1 -1
  28. package/dist/formats/fbx/core/helpers.js +4 -4
  29. package/dist/formats/fbx/core/helpers.js.map +1 -1
  30. package/dist/formats/flac/CjsFlacFormat.js +19 -17
  31. package/dist/formats/flac/CjsFlacFormat.js.map +1 -1
  32. package/dist/formats/flac/core/helpers.js +5 -11
  33. package/dist/formats/flac/core/helpers.js.map +1 -1
  34. package/dist/formats/fsd/32/CjsFsd32Format.js +55 -0
  35. package/dist/formats/fsd/32/CjsFsd32Format.js.map +1 -0
  36. package/dist/formats/fsd/32/index.js +2 -0
  37. package/dist/formats/fsd/32/index.js.map +1 -0
  38. package/dist/formats/fsd/64/CjsFsd64Format.js +119 -0
  39. package/dist/formats/fsd/64/CjsFsd64Format.js.map +1 -0
  40. package/dist/formats/fsd/64/core/CjsFsd64Binary.js +393 -0
  41. package/dist/formats/fsd/64/core/CjsFsd64Binary.js.map +1 -0
  42. package/dist/formats/fsd/64/core/CjsFsd64Reader.js +138 -0
  43. package/dist/formats/fsd/64/core/CjsFsd64Reader.js.map +1 -0
  44. package/dist/formats/fsd/64/core/CjsFsd64SchemaDecoder.js +389 -0
  45. package/dist/formats/fsd/64/core/CjsFsd64SchemaDecoder.js.map +1 -0
  46. package/dist/formats/fsd/64/core/CjsFsd64SchemaReader.js +43 -0
  47. package/dist/formats/fsd/64/core/CjsFsd64SchemaReader.js.map +1 -0
  48. package/dist/formats/fsd/64/core/fsd64Records.js +60 -0
  49. package/dist/formats/fsd/64/core/fsd64Records.js.map +1 -0
  50. package/dist/formats/fsd/64/index.js +7 -0
  51. package/dist/formats/fsd/64/index.js.map +1 -0
  52. package/dist/formats/fsd/64/readers/CjsFsd64ReaderSetCharacterStaticData.js +33 -0
  53. package/dist/formats/fsd/64/readers/CjsFsd64ReaderSetCharacterStaticData.js.map +1 -0
  54. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAgentTypes.js +35 -0
  55. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAgentTypes.js.map +1 -0
  56. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAgentsInSpace.js +50 -0
  57. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAgentsInSpace.js.map +1 -0
  58. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAncestries.js +75 -0
  59. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAncestries.js.map +1 -0
  60. package/dist/formats/fsd/64/readers/CjsFsd64SchemaArchetypes.js +57 -0
  61. package/dist/formats/fsd/64/readers/CjsFsd64SchemaArchetypes.js.map +1 -0
  62. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAudioMetadata.js +201 -0
  63. package/dist/formats/fsd/64/readers/CjsFsd64SchemaAudioMetadata.js.map +1 -0
  64. package/dist/formats/fsd/64/readers/CjsFsd64SchemaBloodlines.js +73 -0
  65. package/dist/formats/fsd/64/readers/CjsFsd64SchemaBloodlines.js.map +1 -0
  66. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCategories.js +53 -0
  67. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCategories.js.map +1 -0
  68. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterAvatarBehaviors.js +44 -0
  69. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterAvatarBehaviors.js.map +1 -0
  70. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterColorLocations.js +38 -0
  71. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterColorLocations.js.map +1 -0
  72. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterColorNames.js +34 -0
  73. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterColorNames.js.map +1 -0
  74. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterModifierLocations.js +34 -0
  75. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterModifierLocations.js.map +1 -0
  76. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterPortraitResources.js +44 -0
  77. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterPortraitResources.js.map +1 -0
  78. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterResources.js +81 -0
  79. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterResources.js.map +1 -0
  80. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterSculptingLocations.js +34 -0
  81. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCharacterSculptingLocations.js.map +1 -0
  82. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCompressibleTypes.js +41 -0
  83. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCompressibleTypes.js.map +1 -0
  84. package/dist/formats/fsd/64/readers/CjsFsd64SchemaContrabandTypes.js +63 -0
  85. package/dist/formats/fsd/64/readers/CjsFsd64SchemaContrabandTypes.js.map +1 -0
  86. package/dist/formats/fsd/64/readers/CjsFsd64SchemaControlTowerResources.js +76 -0
  87. package/dist/formats/fsd/64/readers/CjsFsd64SchemaControlTowerResources.js.map +1 -0
  88. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationActivities.js +38 -0
  89. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationActivities.js.map +1 -0
  90. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationRoleGroups.js +74 -0
  91. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationRoleGroups.js.map +1 -0
  92. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationRoles.js +59 -0
  93. package/dist/formats/fsd/64/readers/CjsFsd64SchemaCorporationRoles.js.map +1 -0
  94. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaAttributeCategories.js +46 -0
  95. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaAttributeCategories.js.map +1 -0
  96. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaAttributes.js +133 -0
  97. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaAttributes.js.map +1 -0
  98. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaEffects.js +236 -0
  99. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaEffects.js.map +1 -0
  100. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaUnits.js +60 -0
  101. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDogmaUnits.js.map +1 -0
  102. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDynamicItemAttributes.js +95 -0
  103. package/dist/formats/fsd/64/readers/CjsFsd64SchemaDynamicItemAttributes.js.map +1 -0
  104. package/dist/formats/fsd/64/readers/CjsFsd64SchemaEpicArcs.js +106 -0
  105. package/dist/formats/fsd/64/readers/CjsFsd64SchemaEpicArcs.js.map +1 -0
  106. package/dist/formats/fsd/64/readers/CjsFsd64SchemaExpertSystems.js +86 -0
  107. package/dist/formats/fsd/64/readers/CjsFsd64SchemaExpertSystems.js.map +1 -0
  108. package/dist/formats/fsd/64/readers/CjsFsd64SchemaFactions.js +117 -0
  109. package/dist/formats/fsd/64/readers/CjsFsd64SchemaFactions.js.map +1 -0
  110. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGraphicIds.js +70 -0
  111. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGraphicIds.js.map +1 -0
  112. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGraphicMaterialSets.js +173 -0
  113. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGraphicMaterialSets.js.map +1 -0
  114. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGroups.js +77 -0
  115. package/dist/formats/fsd/64/readers/CjsFsd64SchemaGroups.js.map +1 -0
  116. package/dist/formats/fsd/64/readers/CjsFsd64SchemaIcons.js +62 -0
  117. package/dist/formats/fsd/64/readers/CjsFsd64SchemaIcons.js.map +1 -0
  118. package/dist/formats/fsd/64/readers/CjsFsd64SchemaMarketGroups.js +63 -0
  119. package/dist/formats/fsd/64/readers/CjsFsd64SchemaMarketGroups.js.map +1 -0
  120. package/dist/formats/fsd/64/readers/CjsFsd64SchemaMetaGroups.js +86 -0
  121. package/dist/formats/fsd/64/readers/CjsFsd64SchemaMetaGroups.js.map +1 -0
  122. package/dist/formats/fsd/64/readers/CjsFsd64SchemaNpcCorporationDivisions.js +72 -0
  123. package/dist/formats/fsd/64/readers/CjsFsd64SchemaNpcCorporationDivisions.js.map +1 -0
  124. package/dist/formats/fsd/64/readers/CjsFsd64SchemaNpcCorporations.js +326 -0
  125. package/dist/formats/fsd/64/readers/CjsFsd64SchemaNpcCorporations.js.map +1 -0
  126. package/dist/formats/fsd/64/readers/CjsFsd64SchemaPaperdolls.js +279 -0
  127. package/dist/formats/fsd/64/readers/CjsFsd64SchemaPaperdolls.js.map +1 -0
  128. package/dist/formats/fsd/64/readers/CjsFsd64SchemaRaces.js +64 -0
  129. package/dist/formats/fsd/64/readers/CjsFsd64SchemaRaces.js.map +1 -0
  130. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSchoolMap.js +40 -0
  131. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSchoolMap.js.map +1 -0
  132. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSchools.js +113 -0
  133. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSchools.js.map +1 -0
  134. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkillPlans.js +130 -0
  135. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkillPlans.js.map +1 -0
  136. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentCategories.js +38 -0
  137. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentCategories.js.map +1 -0
  138. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentPointValues.js +45 -0
  139. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentPointValues.js.map +1 -0
  140. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentRarities.js +44 -0
  141. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponentRarities.js.map +1 -0
  142. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponents.js +163 -0
  143. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrComponents.js.map +1 -0
  144. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotCategories.js +37 -0
  145. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotCategories.js.map +1 -0
  146. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotConfigurations.js +77 -0
  147. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotConfigurations.js.map +1 -0
  148. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotNames.js +37 -0
  149. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlotNames.js.map +1 -0
  150. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlots.js +74 -0
  151. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrSlots.js.map +1 -0
  152. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrTierThresholds.js +44 -0
  153. package/dist/formats/fsd/64/readers/CjsFsd64SchemaSkinrTierThresholds.js.map +1 -0
  154. package/dist/formats/fsd/64/readers/CjsFsd64SchemaStationOperations.js +120 -0
  155. package/dist/formats/fsd/64/readers/CjsFsd64SchemaStationOperations.js.map +1 -0
  156. package/dist/formats/fsd/64/readers/CjsFsd64SchemaStationServices.js +49 -0
  157. package/dist/formats/fsd/64/readers/CjsFsd64SchemaStationServices.js.map +1 -0
  158. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeDogma.js +73 -0
  159. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeDogma.js.map +1 -0
  160. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeLists.js +122 -0
  161. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeLists.js.map +1 -0
  162. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeMaterials.js +83 -0
  163. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypeMaterials.js.map +1 -0
  164. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypes.js +194 -0
  165. package/dist/formats/fsd/64/readers/CjsFsd64SchemaTypes.js.map +1 -0
  166. package/dist/formats/fsd/64/readers/index.js +58 -0
  167. package/dist/formats/fsd/64/readers/index.js.map +1 -0
  168. package/dist/formats/fsd/CjsFsdFormat.js +62 -0
  169. package/dist/formats/fsd/CjsFsdFormat.js.map +1 -0
  170. package/dist/formats/fsd/index.js +9 -0
  171. package/dist/formats/fsd/index.js.map +1 -0
  172. package/dist/formats/gif/CjsGifFormat.js +26 -16
  173. package/dist/formats/gif/CjsGifFormat.js.map +1 -1
  174. package/dist/formats/gif/core/helpers.js +6 -18
  175. package/dist/formats/gif/core/helpers.js.map +1 -1
  176. package/dist/formats/gltf/CjsGltfFormat.js +25 -13
  177. package/dist/formats/gltf/CjsGltfFormat.js.map +1 -1
  178. package/dist/formats/gr2/CjsGr2Format.js +27 -6
  179. package/dist/formats/gr2/CjsGr2Format.js.map +1 -1
  180. package/dist/formats/hlsl/CjsHlslFormat.js +20 -16
  181. package/dist/formats/hlsl/CjsHlslFormat.js.map +1 -1
  182. package/dist/formats/hlsl/core/analysis.js +1 -1
  183. package/dist/formats/index.js +5 -0
  184. package/dist/formats/index.js.map +1 -1
  185. package/dist/formats/jpeg/CjsJpegFormat.js +26 -19
  186. package/dist/formats/jpeg/CjsJpegFormat.js.map +1 -1
  187. package/dist/formats/jpeg/core/helpers.js +6 -15
  188. package/dist/formats/jpeg/core/helpers.js.map +1 -1
  189. package/dist/formats/jpeg/core/jpeg.js +0 -3
  190. package/dist/formats/jpeg/core/jpeg.js.map +1 -1
  191. package/dist/formats/mp3/CjsMp3Format.js +19 -19
  192. package/dist/formats/mp3/CjsMp3Format.js.map +1 -1
  193. package/dist/formats/mp3/core/helpers.js +5 -11
  194. package/dist/formats/mp3/core/helpers.js.map +1 -1
  195. package/dist/formats/mp4/CjsMp4Format.js +20 -19
  196. package/dist/formats/mp4/CjsMp4Format.js.map +1 -1
  197. package/dist/formats/mp4/core/helpers.js +6 -15
  198. package/dist/formats/mp4/core/helpers.js.map +1 -1
  199. package/dist/formats/obj/CjsObjFormat.js +25 -12
  200. package/dist/formats/obj/CjsObjFormat.js.map +1 -1
  201. package/dist/formats/ogg/CjsOggFormat.js +26 -17
  202. package/dist/formats/ogg/CjsOggFormat.js.map +1 -1
  203. package/dist/formats/ogg/core/helpers.js +5 -16
  204. package/dist/formats/ogg/core/helpers.js.map +1 -1
  205. package/dist/formats/pickle/CjsPickleFormat.js +64 -5
  206. package/dist/formats/pickle/CjsPickleFormat.js.map +1 -1
  207. package/dist/formats/png/CjsPngFormat.js +28 -19
  208. package/dist/formats/png/CjsPngFormat.js.map +1 -1
  209. package/dist/formats/png/core/helpers.js +5 -14
  210. package/dist/formats/png/core/helpers.js.map +1 -1
  211. package/dist/formats/red/CjsRedFormat.js +19 -5
  212. package/dist/formats/red/CjsRedFormat.js.map +1 -1
  213. package/dist/formats/schemabound/CjsSchemaBoundFormat.js +48 -38
  214. package/dist/formats/schemabound/CjsSchemaBoundFormat.js.map +1 -1
  215. package/dist/formats/sqlite/CjsSqliteFormat.js +49 -41
  216. package/dist/formats/sqlite/CjsSqliteFormat.js.map +1 -1
  217. package/dist/formats/static/CjsStaticFormat.js +15 -57
  218. package/dist/formats/static/CjsStaticFormat.js.map +1 -1
  219. package/dist/formats/static/staticContainers.js +6 -6
  220. package/dist/formats/static/staticContainers.js.map +1 -1
  221. package/dist/formats/stl/CjsStlFormat.js +25 -12
  222. package/dist/formats/stl/CjsStlFormat.js.map +1 -1
  223. package/dist/formats/tga/CjsTgaFormat.js +26 -19
  224. package/dist/formats/tga/CjsTgaFormat.js.map +1 -1
  225. package/dist/formats/tga/core/helpers.js +7 -22
  226. package/dist/formats/tga/core/helpers.js.map +1 -1
  227. package/dist/formats/wav/CjsWavFormat.js +26 -19
  228. package/dist/formats/wav/CjsWavFormat.js.map +1 -1
  229. package/dist/formats/wav/core/helpers.js +7 -16
  230. package/dist/formats/wav/core/helpers.js.map +1 -1
  231. package/dist/formats/webgl/CjsWebglFormat.js +11 -13
  232. package/dist/formats/webgl/CjsWebglFormat.js.map +1 -1
  233. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js +31 -1
  234. package/dist/formats/webgl/core/glsl/DxbcGlslEmitter.js.map +1 -1
  235. package/dist/formats/webgl/core/readGlslEffectContainer.js +8 -8
  236. package/dist/formats/webgl/core/readGlslEffectContainer.js.map +1 -1
  237. package/dist/formats/webgpu/CjsWebgpuFormat.js +11 -5
  238. package/dist/formats/webgpu/CjsWebgpuFormat.js.map +1 -1
  239. package/dist/formats/webm/CjsWebmFormat.js +20 -19
  240. package/dist/formats/webm/CjsWebmFormat.js.map +1 -1
  241. package/dist/formats/webm/core/helpers.js +6 -15
  242. package/dist/formats/webm/core/helpers.js.map +1 -1
  243. package/dist/formats/webp/CjsWebpFormat.js +19 -17
  244. package/dist/formats/webp/CjsWebpFormat.js.map +1 -1
  245. package/dist/formats/webp/core/helpers.js +5 -11
  246. package/dist/formats/webp/core/helpers.js.map +1 -1
  247. package/dist/formats/wem/CjsWemFormat.js +128 -141
  248. package/dist/formats/wem/CjsWemFormat.js.map +1 -1
  249. package/dist/formats/wem/core/helpers.js +1 -114
  250. package/dist/formats/wem/core/helpers.js.map +1 -1
  251. package/dist/formats/wem/core/{resolve.js → probeCodecSupport.js} +11 -18
  252. package/dist/formats/wem/core/probeCodecSupport.js.map +1 -0
  253. package/dist/formats/yaml/CjsYamlFormat.js +20 -5
  254. package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
  255. package/dist/generated/index.js +2 -0
  256. package/dist/generated/index.js.map +1 -0
  257. package/dist/generated/resources/Tr2RaycastGeometryRes.js +34 -0
  258. package/dist/generated/resources/Tr2RaycastGeometryRes.js.map +1 -0
  259. package/dist/generated/resources/index.js +2 -0
  260. package/dist/generated/resources/index.js.map +1 -0
  261. package/dist/index.js +3 -1
  262. package/dist/index.js.map +1 -1
  263. package/dist/resource/CjsResource.js +134 -0
  264. package/dist/resource/CjsResource.js.map +1 -1
  265. package/dist/resource/ResourceRequirement.js +42 -0
  266. package/dist/resource/ResourceRequirement.js.map +1 -0
  267. package/dist/resource/Tr2LightProfileRes.js +2 -1
  268. package/dist/resource/Tr2LightProfileRes.js.map +1 -1
  269. package/dist/resource/geometry/TriGeometryRes.js +34 -7
  270. package/dist/resource/geometry/TriGeometryRes.js.map +1 -1
  271. package/dist/resource/geometry/granny/Tr2GrannyStateRes.js +184 -7
  272. package/dist/resource/geometry/granny/Tr2GrannyStateRes.js.map +1 -1
  273. package/dist/resource/geometry/granny/TriGrannyRes.js +20 -8
  274. package/dist/resource/geometry/granny/TriGrannyRes.js.map +1 -1
  275. package/dist/resource/index.js +1 -0
  276. package/dist/resource/index.js.map +1 -1
  277. package/dist/resource/resourceBoundary.js +24 -1
  278. package/dist/resource/resourceBoundary.js.map +1 -1
  279. package/dist/resource/shader/Tr2EffectRes.js +2 -1
  280. package/dist/resource/shader/Tr2EffectRes.js.map +1 -1
  281. package/dist/resource/texture/CjsTextureArrayRes.js +2 -1
  282. package/dist/resource/texture/CjsTextureArrayRes.js.map +1 -1
  283. package/dist/resource/texture/Tr2ImageRes.js +2 -1
  284. package/dist/resource/texture/Tr2ImageRes.js.map +1 -1
  285. package/dist/resource/texture/TriTextureRes.js +40 -2
  286. package/dist/resource/texture/TriTextureRes.js.map +1 -1
  287. package/docs/architecture.md +121 -116
  288. package/docs/concepts/format-capabilities.md +90 -0
  289. package/docs/formats/README.md +14 -6
  290. package/docs/formats/fsd.md +104 -0
  291. package/docs/formats/gr2.md +1 -1
  292. package/docs/formats/hlsl/reference/api.md +6 -4
  293. package/docs/formats/provenance.md +18 -0
  294. package/docs/formats/schemabound.md +10 -4
  295. package/docs/formats/static.md +26 -26
  296. package/docs/formats/webgpu/reference/api.md +4 -3
  297. package/docs/reference/classes/core.md +22 -2
  298. package/docs/reference/classes/formats.md +643 -1
  299. package/docs/reference/classes/resources.md +463 -453
  300. package/docs/reference/queues.md +205 -194
  301. package/docs/roadmap.md +14 -18
  302. package/format-notices/fsd/LICENSE +21 -0
  303. package/format-notices/fsd/NOTICE +11 -0
  304. package/package.json +70 -64
  305. package/dist/formats/wem/core/resolve.js.map +0 -1
  306. package/docs/concepts/format-type-resolution.md +0 -79
@@ -1,3 +1,4 @@
1
+ import { CjsFormat } from '../../format/CjsFormat.js';
1
2
  import { CjsYamlFormat } from '../yaml/CjsYamlFormat.js';
2
3
  import { ReadValue } from './core/schemaBoundValues.js';
3
4
  import { SchemaBoundError } from './core/schemaBoundErrors.js';
@@ -30,7 +31,7 @@ const ROOT_TYPES = new Set(["dict", "list", "object"]);
30
31
  * a decoder written around a constant stride will read the first record
31
32
  * correctly and everything after it wrongly.
32
33
  */
33
- class CjsSchemaBoundFormat {
34
+ class CjsSchemaBoundFormat extends CjsFormat {
34
35
  /**
35
36
  * Reports whether a schema can drive this reader.
36
37
  *
@@ -42,9 +43,9 @@ class CjsSchemaBoundFormat {
42
43
  * @param {object|Uint8Array|ArrayBuffer|string} schema Schema document or its bytes.
43
44
  * @returns {boolean} True when the schema has a root this reader understands.
44
45
  */
45
- static is(schema) {
46
+ static is(input, options = null) {
46
47
  try {
47
- return ROOT_TYPES.has(this.schema(schema).type);
48
+ return ROOT_TYPES.has(this.schema(options?.schema ?? input).type);
48
49
  } catch {
49
50
  return false;
50
51
  }
@@ -57,13 +58,41 @@ class CjsSchemaBoundFormat {
57
58
  * @param {object} [options] Probe options.
58
59
  * @returns {object} Resource probe.
59
60
  */
60
- static isSupported(schema, options = null) {
61
- return Probe(this.is(schema), options);
61
+ static probeSupport(input, options = null) {
62
+ const usable = this.is(input, options);
63
+ return {
64
+ format: this.id,
65
+ source: options?.source || "buffer",
66
+ recognized: usable,
67
+ supported: usable,
68
+ preferredOutput: usable ? OUTPUT_JSON : "",
69
+ reason: usable ? "The supplied schema declares a root this reader can decode." : "A readable companion schema was not supplied.",
70
+ variants: [{
71
+ kind: OUTPUT_JSON,
72
+ supported: usable
73
+ }, {
74
+ kind: OUTPUT_PAYLOAD,
75
+ supported: usable
76
+ }],
77
+ metadata: usable ? this.inspect(input, options) : {
78
+ family: this.id,
79
+ requiresSchema: true,
80
+ decodable: false
81
+ }
82
+ };
62
83
  }
63
84
 
64
- // INTERIM, 2026-08-16. No `inspect` alias, matching CjsSqliteFormat and
65
- // diverging from the older formats. Both are held by the same undecided
66
- // question; see maintenance/INTERIM-sqlite-and-static-2026-08-16.md.
85
+ /** Return schema and payload facts without decoding the payload. */
86
+ static inspect(input, options = null) {
87
+ const schema = this.schema(options?.schema ?? input);
88
+ return {
89
+ family: this.id,
90
+ rootType: schema.type,
91
+ requiresSchema: true,
92
+ decodable: ROOT_TYPES.has(schema.type),
93
+ byteLength: options?.schema === undefined ? null : Normalize(input).byteLength
94
+ };
95
+ }
67
96
 
68
97
  /**
69
98
  * Reads a container against its schema.
@@ -101,7 +130,8 @@ class CjsSchemaBoundFormat {
101
130
  view: new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)
102
131
  };
103
132
  const decoded = ReadValue(context, 0, schema).value;
104
- return options.output === OUTPUT_PAYLOAD ? decoded : ToJSON(decoded);
133
+ const output = options.emit ?? options.output ?? OUTPUT_JSON;
134
+ return output === OUTPUT_PAYLOAD ? decoded : ToJSON(decoded);
105
135
  }
106
136
 
107
137
  /** Reads to plain JSON-compatible values. */
@@ -145,10 +175,16 @@ class CjsSchemaBoundFormat {
145
175
  });
146
176
  static id = "schemabound";
147
177
  static extensions = Object.freeze([".static"]);
148
- static type = Object.freeze(["data"]);
149
178
  static mediaTypes = Object.freeze(["data"]);
150
- static inputTypes = Object.freeze(["schemabound"]);
151
- static outputTypes = Object.freeze([OUTPUT_JSON, OUTPUT_PAYLOAD]);
179
+ static outputs = CjsFormat.defineOutputs({
180
+ json: {
181
+ default: true,
182
+ decoded: true
183
+ },
184
+ payload: {
185
+ decoded: true
186
+ }
187
+ });
152
188
  }
153
189
 
154
190
  /**
@@ -186,32 +222,6 @@ function Resolve(value) {
186
222
  return walk(value);
187
223
  }
188
224
 
189
- /** Builds the probe shape the resource manager routes on. */
190
- function Probe(usable, options) {
191
- return {
192
- format: "schemabound",
193
- source: "buffer",
194
- supported: usable ? "full" : "none",
195
- confidence: usable ? 1 : 0,
196
- preferred: "schemabound",
197
- // The schema is read to answer this, so it is measured rather than declared.
198
- // It says nothing about any payload: these containers carry no signature.
199
- verified: true,
200
- reason: usable ? "The schema declares a root this reader can decode." : "The schema is missing, unparsable, or declares an unreadable root.",
201
- variants: [{
202
- kind: "container",
203
- codec: "schemabound",
204
- supported: usable
205
- }],
206
- metadata: {
207
- family: "schemabound",
208
- requiresSchema: true,
209
- decodable: usable
210
- },
211
- ...(options || {})
212
- };
213
- }
214
-
215
225
  /** Converts decoded values to something `JSON.stringify` keeps losslessly. */
216
226
  function ToJSON(value) {
217
227
  if (typeof value === "bigint") return value.toString(10);
@@ -1 +1 @@
1
- {"version":3,"file":"CjsSchemaBoundFormat.js","sources":["../../../../src/formats/schemabound/CjsSchemaBoundFormat.js"],"sourcesContent":["import { CjsYamlFormat } from \"../yaml/index.js\";\nimport { ReadValue } from \"./core/schemaBoundValues.js\";\nimport { SchemaBoundError } from \"./core/schemaBoundErrors.js\";\n\nconst OUTPUT_JSON = \"json\";\nconst OUTPUT_PAYLOAD = \"payload\";\nconst ROOT_TYPES = new Set([ \"dict\", \"list\", \"object\" ]);\n\n/**\n * Reads a container whose layout lives in a separate schema.\n *\n * This is the third of the three families that share the `.static` extension,\n * and the one an extension check is least able to help with: the bytes carry no\n * signature, no version and no self-description. What they carry is a payload\n * whose every field position, width and meaning is stated in a sibling `.schema`\n * document — so the schema is not a hint here, it is the reader.\n *\n * That makes this the opposite of the hash-identified containers, where the\n * header names a layout it does not describe and the layout has to be derived\n * and pinned per dataset. Nothing needs deriving for this family. Supply the\n * schema and the bytes decode.\n *\n * **The schema is required and there is no default.** Given the wrong schema\n * these bytes decode into plausible nonsense rather than failing, because there\n * is nothing in them to disagree with. Pair each payload with the `.schema`\n * that shipped beside it.\n *\n * Read {@link CjsSchemaBoundFormat.read} before writing anything that walks the\n * result: a record's variable section changes length from record to record, and\n * a decoder written around a constant stride will read the first record\n * correctly and everything after it wrongly.\n */\nexport class CjsSchemaBoundFormat {\n\n /**\n * Reports whether a schema can drive this reader.\n *\n * The question is about the schema, never the payload. These containers have\n * no signature to test, so claiming to recognize the bytes would be a claim\n * this format cannot support - and `CjsStaticFormat` already answers which\n * family a `.static` file belongs to.\n *\n * @param {object|Uint8Array|ArrayBuffer|string} schema Schema document or its bytes.\n * @returns {boolean} True when the schema has a root this reader understands.\n */\n static is(schema) {\n try {\n return ROOT_TYPES.has(this.schema(schema).type);\n } catch {\n return false;\n }\n }\n\n /**\n * Reports whether this format can read a payload described by a schema.\n *\n * @param {object|Uint8Array|ArrayBuffer|string} schema Schema document or its bytes.\n * @param {object} [options] Probe options.\n * @returns {object} Resource probe.\n */\n static isSupported(schema, options = null) {\n return Probe(this.is(schema), options);\n }\n\n // INTERIM, 2026-08-16. No `inspect` alias, matching CjsSqliteFormat and\n // diverging from the older formats. Both are held by the same undecided\n // question; see maintenance/INTERIM-sqlite-and-static-2026-08-16.md.\n\n /**\n * Reads a container against its schema.\n *\n * The whole payload decodes in one pass. Three properties are worth knowing\n * before relying on the result:\n *\n * - **A keyed container's index is at the end.** Nothing at the front points\n * at it; it is found by reading the last four bytes as the index's own size.\n * - **Record offsets are relative to the four-byte header**, not to the file.\n * Decoding from the file start reads one field early, which looks like a\n * wrong layout rather than a wrong base.\n * - **The per-record offset table varies in length.** An optional attribute\n * that is absent occupies no slot, so consecutive records hold their\n * variable data at different distances from their own start.\n *\n * An absent optional takes the default its schema declares. Where none is\n * declared the attribute is left off the record entirely, which is what the\n * published static data exports show for those same rows.\n *\n * @param {Uint8Array|ArrayBuffer} input Container bytes.\n * @param {object} options Read options.\n * @param {object|Uint8Array|ArrayBuffer|string} options.schema The sibling schema.\n * @param {string} [options.output] `json` or `payload`.\n * @returns {object|Array} The decoded container.\n */\n static read(input, options = {}) {\n const bytes = Normalize(input);\n const schema = this.schema(options.schema);\n\n if (!ROOT_TYPES.has(schema.type)) {\n throw SchemaBoundError(`A container's root must be a dict, list or object, not ${schema.type}.`);\n }\n\n const context = {\n bytes,\n view: new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n };\n const decoded = ReadValue(context, 0, schema).value;\n\n return options.output === OUTPUT_PAYLOAD ? decoded : ToJSON(decoded);\n }\n\n /** Reads to plain JSON-compatible values. */\n static readJSON(input, options = {}) {\n return this.read(input, { ...options, output: OUTPUT_JSON });\n }\n\n /** Reads with wide integers left as `BigInt`. */\n static readPayload(input, options = {}) {\n return this.read(input, { ...options, output: OUTPUT_PAYLOAD });\n }\n\n /**\n * Parses a schema document, accepting YAML bytes, YAML text or a parsed object.\n *\n * @param {object|Uint8Array|ArrayBuffer|string} schema Schema in any accepted form.\n * @returns {object} The parsed schema.\n */\n static schema(schema) {\n if (!schema) {\n throw SchemaBoundError(\"This format cannot read a container without its schema.\");\n }\n\n if (typeof schema === \"object\" && !ArrayBuffer.isView(schema) && !(schema instanceof ArrayBuffer)) {\n return schema;\n }\n\n const parsed = CjsYamlFormat.read(typeof schema === \"string\" ? schema : Normalize(schema));\n\n if (!parsed || typeof parsed !== \"object\") {\n throw SchemaBoundError(\"A schema must parse to a mapping.\");\n }\n\n return Resolve(parsed);\n }\n\n static Output = Object.freeze({ JSON: OUTPUT_JSON, PAYLOAD: OUTPUT_PAYLOAD });\n\n static id = \"schemabound\";\n static extensions = Object.freeze([ \".static\" ]);\n static type = Object.freeze([ \"data\" ]);\n static mediaTypes = Object.freeze([ \"data\" ]);\n static inputTypes = Object.freeze([ \"schemabound\" ]);\n static outputTypes = Object.freeze([ OUTPUT_JSON, OUTPUT_PAYLOAD ]);\n}\n\n/**\n * Rejoins YAML anchors and aliases into the graph they describe.\n *\n * These schemas share repeated declarations by anchor - a container with two\n * coordinates writes the vector's component aliases once - and the YAML reader\n * reports that sharing as `$yamlId` and `$yamlRef` markers rather than\n * duplicating the node. Left alone, `$yamlId` reads as one more component and\n * `$yamlRef` as a declaration with no fields at all.\n *\n * @param {*} value Parsed schema, or any part of one.\n * @returns {*} The same schema with anchors resolved and markers removed.\n */\nfunction Resolve(value) {\n const anchors = new Map();\n\n const walk = node => {\n if (Array.isArray(node)) return node.map(walk);\n\n if (!node || typeof node !== \"object\") return node;\n\n if (Object.hasOwn(node, \"$yamlRef\")) {\n const target = anchors.get(node.$yamlRef);\n\n if (!target) {\n throw SchemaBoundError(`The schema refers to an anchor it never declares: ${node.$yamlRef}.`);\n }\n\n return target;\n }\n\n const result = {};\n const id = node.$yamlId;\n\n if (id !== undefined) anchors.set(id, result);\n\n for (const [ key, member ] of Object.entries(node)) {\n if (key !== \"$yamlId\") result[key] = walk(member);\n }\n\n return result;\n };\n\n return walk(value);\n}\n\n/** Builds the probe shape the resource manager routes on. */\nfunction Probe(usable, options) {\n return {\n format: \"schemabound\",\n source: \"buffer\",\n supported: usable ? \"full\" : \"none\",\n confidence: usable ? 1 : 0,\n preferred: \"schemabound\",\n // The schema is read to answer this, so it is measured rather than declared.\n // It says nothing about any payload: these containers carry no signature.\n verified: true,\n reason: usable\n ? \"The schema declares a root this reader can decode.\"\n : \"The schema is missing, unparsable, or declares an unreadable root.\",\n variants: [ { kind: \"container\", codec: \"schemabound\", supported: usable } ],\n metadata: { family: \"schemabound\", requiresSchema: true, decodable: usable },\n ...(options || {})\n };\n}\n\n/** Converts decoded values to something `JSON.stringify` keeps losslessly. */\nfunction ToJSON(value) {\n if (typeof value === \"bigint\") return value.toString(10);\n\n if (Array.isArray(value)) return value.map(ToJSON);\n\n if (value && typeof value === \"object\") {\n const result = {};\n\n for (const [ key, member ] of Object.entries(value)) result[key] = ToJSON(member);\n\n return result;\n }\n\n return value;\n}\n\n/** Accepts the byte forms every other format here accepts. */\nfunction Normalize(input) {\n if (input instanceof Uint8Array) return input;\n\n if (input instanceof ArrayBuffer) return new Uint8Array(input);\n\n if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n\n throw SchemaBoundError(\"A schema-bound container must be supplied as bytes.\");\n}\n\nexport default CjsSchemaBoundFormat;\n"],"names":["OUTPUT_JSON","OUTPUT_PAYLOAD","ROOT_TYPES","Set","CjsSchemaBoundFormat","is","schema","has","type","isSupported","options","Probe","read","input","bytes","Normalize","SchemaBoundError","context","view","DataView","buffer","byteOffset","byteLength","decoded","ReadValue","value","output","ToJSON","readJSON","readPayload","ArrayBuffer","isView","parsed","CjsYamlFormat","Resolve","Output","Object","freeze","JSON","PAYLOAD","id","extensions","mediaTypes","inputTypes","outputTypes","anchors","Map","walk","node","Array","isArray","map","hasOwn","target","get","$yamlRef","result","$yamlId","undefined","set","key","member","entries","usable","format","source","supported","confidence","preferred","verified","reason","variants","kind","codec","metadata","family","requiresSchema","decodable","toString","Uint8Array"],"mappings":";;;;AAIA,MAAMA,WAAW,GAAG,MAAM;AAC1B,MAAMC,cAAc,GAAG,SAAS;AAChC,MAAMC,UAAU,GAAG,IAAIC,GAAG,CAAC,CAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,CAAE,CAAC;;AAExD;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACO,MAAMC,oBAAoB,CAAC;AAEhC;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOC,EAAEA,CAACC,MAAM,EAAE;IAChB,IAAI;AACF,MAAA,OAAOJ,UAAU,CAACK,GAAG,CAAC,IAAI,CAACD,MAAM,CAACA,MAAM,CAAC,CAACE,IAAI,CAAC;AACjD,IAAA,CAAC,CAAC,MAAM;AACN,MAAA,OAAO,KAAK;AACd,IAAA;AACF,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACE,EAAA,OAAOC,WAAWA,CAACH,MAAM,EAAEI,OAAO,GAAG,IAAI,EAAE;IACzC,OAAOC,KAAK,CAAC,IAAI,CAACN,EAAE,CAACC,MAAM,CAAC,EAAEI,OAAO,CAAC;AACxC,EAAA;;AAEA;AACA;AACA;;AAEA;AACF;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;EACE,OAAOE,IAAIA,CAACC,KAAK,EAAEH,OAAO,GAAG,EAAE,EAAE;AAC/B,IAAA,MAAMI,KAAK,GAAGC,SAAS,CAACF,KAAK,CAAC;IAC9B,MAAMP,MAAM,GAAG,IAAI,CAACA,MAAM,CAACI,OAAO,CAACJ,MAAM,CAAC;IAE1C,IAAI,CAACJ,UAAU,CAACK,GAAG,CAACD,MAAM,CAACE,IAAI,CAAC,EAAE;AAChC,MAAA,MAAMQ,gBAAgB,CAAC,CAAA,uDAAA,EAA0DV,MAAM,CAACE,IAAI,GAAG,CAAC;AAClG,IAAA;AAEA,IAAA,MAAMS,OAAO,GAAG;MACdH,KAAK;AACLI,MAAAA,IAAI,EAAE,IAAIC,QAAQ,CAACL,KAAK,CAACM,MAAM,EAAEN,KAAK,CAACO,UAAU,EAAEP,KAAK,CAACQ,UAAU;KACpE;IACD,MAAMC,OAAO,GAAGC,SAAS,CAACP,OAAO,EAAE,CAAC,EAAEX,MAAM,CAAC,CAACmB,KAAK;IAEnD,OAAOf,OAAO,CAACgB,MAAM,KAAKzB,cAAc,GAAGsB,OAAO,GAAGI,MAAM,CAACJ,OAAO,CAAC;AACtE,EAAA;;AAEA;EACA,OAAOK,QAAQA,CAACf,KAAK,EAAEH,OAAO,GAAG,EAAE,EAAE;AACnC,IAAA,OAAO,IAAI,CAACE,IAAI,CAACC,KAAK,EAAE;AAAE,MAAA,GAAGH,OAAO;AAAEgB,MAAAA,MAAM,EAAE1B;AAAY,KAAC,CAAC;AAC9D,EAAA;;AAEA;EACA,OAAO6B,WAAWA,CAAChB,KAAK,EAAEH,OAAO,GAAG,EAAE,EAAE;AACtC,IAAA,OAAO,IAAI,CAACE,IAAI,CAACC,KAAK,EAAE;AAAE,MAAA,GAAGH,OAAO;AAAEgB,MAAAA,MAAM,EAAEzB;AAAe,KAAC,CAAC;AACjE,EAAA;;AAEA;AACF;AACA;AACA;AACA;AACA;EACE,OAAOK,MAAMA,CAACA,MAAM,EAAE;IACpB,IAAI,CAACA,MAAM,EAAE;MACX,MAAMU,gBAAgB,CAAC,yDAAyD,CAAC;AACnF,IAAA;AAEA,IAAA,IAAI,OAAOV,MAAM,KAAK,QAAQ,IAAI,CAACwB,WAAW,CAACC,MAAM,CAACzB,MAAM,CAAC,IAAI,EAAEA,MAAM,YAAYwB,WAAW,CAAC,EAAE;AACjG,MAAA,OAAOxB,MAAM;AACf,IAAA;AAEA,IAAA,MAAM0B,MAAM,GAAGC,aAAa,CAACrB,IAAI,CAAC,OAAON,MAAM,KAAK,QAAQ,GAAGA,MAAM,GAAGS,SAAS,CAACT,MAAM,CAAC,CAAC;AAE1F,IAAA,IAAI,CAAC0B,MAAM,IAAI,OAAOA,MAAM,KAAK,QAAQ,EAAE;MACzC,MAAMhB,gBAAgB,CAAC,mCAAmC,CAAC;AAC7D,IAAA;IAEA,OAAOkB,OAAO,CAACF,MAAM,CAAC;AACxB,EAAA;AAEA,EAAA,OAAOG,MAAM,GAAGC,MAAM,CAACC,MAAM,CAAC;AAAEC,IAAAA,IAAI,EAAEtC,WAAW;AAAEuC,IAAAA,OAAO,EAAEtC;AAAe,GAAC,CAAC;EAE7E,OAAOuC,EAAE,GAAG,aAAa;EACzB,OAAOC,UAAU,GAAGL,MAAM,CAACC,MAAM,CAAC,CAAE,SAAS,CAAE,CAAC;EAChD,OAAO7B,IAAI,GAAG4B,MAAM,CAACC,MAAM,CAAC,CAAE,MAAM,CAAE,CAAC;EACvC,OAAOK,UAAU,GAAGN,MAAM,CAACC,MAAM,CAAC,CAAE,MAAM,CAAE,CAAC;EAC7C,OAAOM,UAAU,GAAGP,MAAM,CAACC,MAAM,CAAC,CAAE,aAAa,CAAE,CAAC;EACpD,OAAOO,WAAW,GAAGR,MAAM,CAACC,MAAM,CAAC,CAAErC,WAAW,EAAEC,cAAc,CAAE,CAAC;AACrE;;AAEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,SAASiC,OAAOA,CAACT,KAAK,EAAE;AACtB,EAAA,MAAMoB,OAAO,GAAG,IAAIC,GAAG,EAAE;EAEzB,MAAMC,IAAI,GAAGC,IAAI,IAAI;AACnB,IAAA,IAAIC,KAAK,CAACC,OAAO,CAACF,IAAI,CAAC,EAAE,OAAOA,IAAI,CAACG,GAAG,CAACJ,IAAI,CAAC;IAE9C,IAAI,CAACC,IAAI,IAAI,OAAOA,IAAI,KAAK,QAAQ,EAAE,OAAOA,IAAI;IAElD,IAAIZ,MAAM,CAACgB,MAAM,CAACJ,IAAI,EAAE,UAAU,CAAC,EAAE;MACnC,MAAMK,MAAM,GAAGR,OAAO,CAACS,GAAG,CAACN,IAAI,CAACO,QAAQ,CAAC;MAEzC,IAAI,CAACF,MAAM,EAAE;AACX,QAAA,MAAMrC,gBAAgB,CAAC,CAAA,kDAAA,EAAqDgC,IAAI,CAACO,QAAQ,GAAG,CAAC;AAC/F,MAAA;AAEA,MAAA,OAAOF,MAAM;AACf,IAAA;IAEA,MAAMG,MAAM,GAAG,EAAE;AACjB,IAAA,MAAMhB,EAAE,GAAGQ,IAAI,CAACS,OAAO;IAEvB,IAAIjB,EAAE,KAAKkB,SAAS,EAAEb,OAAO,CAACc,GAAG,CAACnB,EAAE,EAAEgB,MAAM,CAAC;AAE7C,IAAA,KAAK,MAAM,CAAEI,GAAG,EAAEC,MAAM,CAAE,IAAIzB,MAAM,CAAC0B,OAAO,CAACd,IAAI,CAAC,EAAE;AAClD,MAAA,IAAIY,GAAG,KAAK,SAAS,EAAEJ,MAAM,CAACI,GAAG,CAAC,GAAGb,IAAI,CAACc,MAAM,CAAC;AACnD,IAAA;AAEA,IAAA,OAAOL,MAAM;EACf,CAAC;EAED,OAAOT,IAAI,CAACtB,KAAK,CAAC;AACpB;;AAEA;AACA,SAASd,KAAKA,CAACoD,MAAM,EAAErD,OAAO,EAAE;EAC9B,OAAO;AACLsD,IAAAA,MAAM,EAAE,aAAa;AACrBC,IAAAA,MAAM,EAAE,QAAQ;AAChBC,IAAAA,SAAS,EAAEH,MAAM,GAAG,MAAM,GAAG,MAAM;AACnCI,IAAAA,UAAU,EAAEJ,MAAM,GAAG,CAAC,GAAG,CAAC;AAC1BK,IAAAA,SAAS,EAAE,aAAa;AACxB;AACA;AACAC,IAAAA,QAAQ,EAAE,IAAI;AACdC,IAAAA,MAAM,EAAEP,MAAM,GACV,oDAAoD,GACpD,oEAAoE;AACxEQ,IAAAA,QAAQ,EAAE,CAAE;AAAEC,MAAAA,IAAI,EAAE,WAAW;AAAEC,MAAAA,KAAK,EAAE,aAAa;AAAEP,MAAAA,SAAS,EAAEH;AAAO,KAAC,CAAE;AAC5EW,IAAAA,QAAQ,EAAE;AAAEC,MAAAA,MAAM,EAAE,aAAa;AAAEC,MAAAA,cAAc,EAAE,IAAI;AAAEC,MAAAA,SAAS,EAAEd;KAAQ;IAC5E,IAAIrD,OAAO,IAAI,EAAE;GAClB;AACH;;AAEA;AACA,SAASiB,MAAMA,CAACF,KAAK,EAAE;EACrB,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE,OAAOA,KAAK,CAACqD,QAAQ,CAAC,EAAE,CAAC;AAExD,EAAA,IAAI7B,KAAK,CAACC,OAAO,CAACzB,KAAK,CAAC,EAAE,OAAOA,KAAK,CAAC0B,GAAG,CAACxB,MAAM,CAAC;AAElD,EAAA,IAAIF,KAAK,IAAI,OAAOA,KAAK,KAAK,QAAQ,EAAE;IACtC,MAAM+B,MAAM,GAAG,EAAE;IAEjB,KAAK,MAAM,CAAEI,GAAG,EAAEC,MAAM,CAAE,IAAIzB,MAAM,CAAC0B,OAAO,CAACrC,KAAK,CAAC,EAAE+B,MAAM,CAACI,GAAG,CAAC,GAAGjC,MAAM,CAACkC,MAAM,CAAC;AAEjF,IAAA,OAAOL,MAAM;AACf,EAAA;AAEA,EAAA,OAAO/B,KAAK;AACd;;AAEA;AACA,SAASV,SAASA,CAACF,KAAK,EAAE;AACxB,EAAA,IAAIA,KAAK,YAAYkE,UAAU,EAAE,OAAOlE,KAAK;EAE7C,IAAIA,KAAK,YAAYiB,WAAW,EAAE,OAAO,IAAIiD,UAAU,CAAClE,KAAK,CAAC;EAE9D,IAAIiB,WAAW,CAACC,MAAM,CAAClB,KAAK,CAAC,EAAE,OAAO,IAAIkE,UAAU,CAAClE,KAAK,CAACO,MAAM,EAAEP,KAAK,CAACQ,UAAU,EAAER,KAAK,CAACS,UAAU,CAAC;EAEtG,MAAMN,gBAAgB,CAAC,qDAAqD,CAAC;AAC/E;;;;"}
1
+ {"version":3,"file":"CjsSchemaBoundFormat.js","sources":["../../../../src/formats/schemabound/CjsSchemaBoundFormat.js"],"sourcesContent":["import { CjsFormat } from \"../../format/CjsFormat.js\";\nimport { CjsYamlFormat } from \"../yaml/index.js\";\nimport { ReadValue } from \"./core/schemaBoundValues.js\";\nimport { SchemaBoundError } from \"./core/schemaBoundErrors.js\";\n\nconst OUTPUT_JSON = \"json\";\nconst OUTPUT_PAYLOAD = \"payload\";\nconst ROOT_TYPES = new Set([ \"dict\", \"list\", \"object\" ]);\n\n/**\n * Reads a container whose layout lives in a separate schema.\n *\n * This is the third of the three families that share the `.static` extension,\n * and the one an extension check is least able to help with: the bytes carry no\n * signature, no version and no self-description. What they carry is a payload\n * whose every field position, width and meaning is stated in a sibling `.schema`\n * document — so the schema is not a hint here, it is the reader.\n *\n * That makes this the opposite of the hash-identified containers, where the\n * header names a layout it does not describe and the layout has to be derived\n * and pinned per dataset. Nothing needs deriving for this family. Supply the\n * schema and the bytes decode.\n *\n * **The schema is required and there is no default.** Given the wrong schema\n * these bytes decode into plausible nonsense rather than failing, because there\n * is nothing in them to disagree with. Pair each payload with the `.schema`\n * that shipped beside it.\n *\n * Read {@link CjsSchemaBoundFormat.read} before writing anything that walks the\n * result: a record's variable section changes length from record to record, and\n * a decoder written around a constant stride will read the first record\n * correctly and everything after it wrongly.\n */\nexport class CjsSchemaBoundFormat extends CjsFormat {\n\n /**\n * Reports whether a schema can drive this reader.\n *\n * The question is about the schema, never the payload. These containers have\n * no signature to test, so claiming to recognize the bytes would be a claim\n * this format cannot support - and `CjsStaticFormat` already answers which\n * family a `.static` file belongs to.\n *\n * @param {object|Uint8Array|ArrayBuffer|string} schema Schema document or its bytes.\n * @returns {boolean} True when the schema has a root this reader understands.\n */\n static is(input, options = null) {\n try {\n return ROOT_TYPES.has(this.schema(options?.schema ?? input).type);\n } catch {\n return false;\n }\n }\n\n /**\n * Reports whether this format can read a payload described by a schema.\n *\n * @param {object|Uint8Array|ArrayBuffer|string} schema Schema document or its bytes.\n * @param {object} [options] Probe options.\n * @returns {object} Resource probe.\n */\n static probeSupport(input, options = null) {\n const usable = this.is(input, options);\n return {\n format: this.id,\n source: options?.source || \"buffer\",\n recognized: usable,\n supported: usable,\n preferredOutput: usable ? OUTPUT_JSON : \"\",\n reason: usable\n ? \"The supplied schema declares a root this reader can decode.\"\n : \"A readable companion schema was not supplied.\",\n variants: [\n { kind: OUTPUT_JSON, supported: usable },\n { kind: OUTPUT_PAYLOAD, supported: usable }\n ],\n metadata: usable ? this.inspect(input, options) : {\n family: this.id,\n requiresSchema: true,\n decodable: false\n }\n };\n }\n\n /** Return schema and payload facts without decoding the payload. */\n static inspect(input, options = null) {\n const schema = this.schema(options?.schema ?? input);\n return {\n family: this.id,\n rootType: schema.type,\n requiresSchema: true,\n decodable: ROOT_TYPES.has(schema.type),\n byteLength: options?.schema === undefined ? null : Normalize(input).byteLength\n };\n }\n\n /**\n * Reads a container against its schema.\n *\n * The whole payload decodes in one pass. Three properties are worth knowing\n * before relying on the result:\n *\n * - **A keyed container's index is at the end.** Nothing at the front points\n * at it; it is found by reading the last four bytes as the index's own size.\n * - **Record offsets are relative to the four-byte header**, not to the file.\n * Decoding from the file start reads one field early, which looks like a\n * wrong layout rather than a wrong base.\n * - **The per-record offset table varies in length.** An optional attribute\n * that is absent occupies no slot, so consecutive records hold their\n * variable data at different distances from their own start.\n *\n * An absent optional takes the default its schema declares. Where none is\n * declared the attribute is left off the record entirely, which is what the\n * published static data exports show for those same rows.\n *\n * @param {Uint8Array|ArrayBuffer} input Container bytes.\n * @param {object} options Read options.\n * @param {object|Uint8Array|ArrayBuffer|string} options.schema The sibling schema.\n * @param {string} [options.output] `json` or `payload`.\n * @returns {object|Array} The decoded container.\n */\n static read(input, options = {}) {\n const bytes = Normalize(input);\n const schema = this.schema(options.schema);\n\n if (!ROOT_TYPES.has(schema.type)) {\n throw SchemaBoundError(`A container's root must be a dict, list or object, not ${schema.type}.`);\n }\n\n const context = {\n bytes,\n view: new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength)\n };\n const decoded = ReadValue(context, 0, schema).value;\n\n const output = options.emit ?? options.output ?? OUTPUT_JSON;\n return output === OUTPUT_PAYLOAD ? decoded : ToJSON(decoded);\n }\n\n /** Reads to plain JSON-compatible values. */\n static readJSON(input, options = {}) {\n return this.read(input, { ...options, output: OUTPUT_JSON });\n }\n\n /** Reads with wide integers left as `BigInt`. */\n static readPayload(input, options = {}) {\n return this.read(input, { ...options, output: OUTPUT_PAYLOAD });\n }\n\n /**\n * Parses a schema document, accepting YAML bytes, YAML text or a parsed object.\n *\n * @param {object|Uint8Array|ArrayBuffer|string} schema Schema in any accepted form.\n * @returns {object} The parsed schema.\n */\n static schema(schema) {\n if (!schema) {\n throw SchemaBoundError(\"This format cannot read a container without its schema.\");\n }\n\n if (typeof schema === \"object\" && !ArrayBuffer.isView(schema) && !(schema instanceof ArrayBuffer)) {\n return schema;\n }\n\n const parsed = CjsYamlFormat.read(typeof schema === \"string\" ? schema : Normalize(schema));\n\n if (!parsed || typeof parsed !== \"object\") {\n throw SchemaBoundError(\"A schema must parse to a mapping.\");\n }\n\n return Resolve(parsed);\n }\n\n static Output = Object.freeze({ JSON: OUTPUT_JSON, PAYLOAD: OUTPUT_PAYLOAD });\n\n static id = \"schemabound\";\n static extensions = Object.freeze([ \".static\" ]);\n static mediaTypes = Object.freeze([ \"data\" ]);\n static outputs = CjsFormat.defineOutputs({\n json: { default: true, decoded: true },\n payload: { decoded: true }\n });\n}\n\n/**\n * Rejoins YAML anchors and aliases into the graph they describe.\n *\n * These schemas share repeated declarations by anchor - a container with two\n * coordinates writes the vector's component aliases once - and the YAML reader\n * reports that sharing as `$yamlId` and `$yamlRef` markers rather than\n * duplicating the node. Left alone, `$yamlId` reads as one more component and\n * `$yamlRef` as a declaration with no fields at all.\n *\n * @param {*} value Parsed schema, or any part of one.\n * @returns {*} The same schema with anchors resolved and markers removed.\n */\nfunction Resolve(value) {\n const anchors = new Map();\n\n const walk = node => {\n if (Array.isArray(node)) return node.map(walk);\n\n if (!node || typeof node !== \"object\") return node;\n\n if (Object.hasOwn(node, \"$yamlRef\")) {\n const target = anchors.get(node.$yamlRef);\n\n if (!target) {\n throw SchemaBoundError(`The schema refers to an anchor it never declares: ${node.$yamlRef}.`);\n }\n\n return target;\n }\n\n const result = {};\n const id = node.$yamlId;\n\n if (id !== undefined) anchors.set(id, result);\n\n for (const [ key, member ] of Object.entries(node)) {\n if (key !== \"$yamlId\") result[key] = walk(member);\n }\n\n return result;\n };\n\n return walk(value);\n}\n\n/** Converts decoded values to something `JSON.stringify` keeps losslessly. */\nfunction ToJSON(value) {\n if (typeof value === \"bigint\") return value.toString(10);\n\n if (Array.isArray(value)) return value.map(ToJSON);\n\n if (value && typeof value === \"object\") {\n const result = {};\n\n for (const [ key, member ] of Object.entries(value)) result[key] = ToJSON(member);\n\n return result;\n }\n\n return value;\n}\n\n/** Accepts the byte forms every other format here accepts. */\nfunction Normalize(input) {\n if (input instanceof Uint8Array) return input;\n\n if (input instanceof ArrayBuffer) return new Uint8Array(input);\n\n if (ArrayBuffer.isView(input)) return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n\n throw SchemaBoundError(\"A schema-bound container must be supplied as bytes.\");\n}\n\nexport default CjsSchemaBoundFormat;\n"],"names":["OUTPUT_JSON","OUTPUT_PAYLOAD","ROOT_TYPES","Set","CjsSchemaBoundFormat","CjsFormat","is","input","options","has","schema","type","probeSupport","usable","format","id","source","recognized","supported","preferredOutput","reason","variants","kind","metadata","inspect","family","requiresSchema","decodable","rootType","byteLength","undefined","Normalize","read","bytes","SchemaBoundError","context","view","DataView","buffer","byteOffset","decoded","ReadValue","value","output","emit","ToJSON","readJSON","readPayload","ArrayBuffer","isView","parsed","CjsYamlFormat","Resolve","Output","Object","freeze","JSON","PAYLOAD","extensions","mediaTypes","outputs","defineOutputs","json","default","payload","anchors","Map","walk","node","Array","isArray","map","hasOwn","target","get","$yamlRef","result","$yamlId","set","key","member","entries","toString","Uint8Array"],"mappings":"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"}
@@ -1,6 +1,7 @@
1
+ import { CjsFormat } from '../../format/CjsFormat.js';
1
2
  import { ReadColumns } from './core/sqliteSchema.js';
2
3
  import { ReadHeader, TableRows } from './core/sqlitePages.js';
3
- import { SqliteError, ReadRecord } from './core/sqliteRecords.js';
4
+ import { ReadRecord, SqliteError } from './core/sqliteRecords.js';
4
5
 
5
6
  const OUTPUT_JSON = "json";
6
7
  const OUTPUT_PAYLOAD = "payload";
@@ -31,7 +32,7 @@ const MASTER_ROOT_PAGE = 1;
31
32
  * than `Number.MAX_SAFE_INTEGER` is returned as a `BigInt` rather than silently
32
33
  * rounded.
33
34
  */
34
- class CjsSqliteFormat {
35
+ class CjsSqliteFormat extends CjsFormat {
35
36
  /**
36
37
  * Reports whether bytes are a SQLite container, by signature.
37
38
  *
@@ -59,18 +60,41 @@ class CjsSqliteFormat {
59
60
  * @param {object} [options] Probe options.
60
61
  * @returns {object} Resource probe.
61
62
  */
62
- static isSupported(input, options = null) {
63
- return Probe(this.is(input), options);
63
+ static probeSupport(input, options = null) {
64
+ const recognized = this.is(input);
65
+ return {
66
+ format: this.id,
67
+ source: options?.source || "buffer",
68
+ recognized,
69
+ supported: recognized,
70
+ preferredOutput: recognized ? OUTPUT_JSON : "",
71
+ reason: recognized ? "Recognized a SQLite 3 container." : "The header signature is not SQLite 3.",
72
+ variants: [{
73
+ kind: OUTPUT_JSON,
74
+ supported: recognized
75
+ }, {
76
+ kind: OUTPUT_PAYLOAD,
77
+ supported: recognized
78
+ }, {
79
+ kind: OUTPUT_RAW,
80
+ supported: recognized
81
+ }],
82
+ metadata: recognized ? this.inspect(input) : {
83
+ family: this.id,
84
+ decodable: false
85
+ }
86
+ };
64
87
  }
65
88
 
66
- // INTERIM, 2026-08-16. No `inspect` alias onto `isSupported`, while nineteen
67
- // sibling formats have one. The capability-surface decision page names that
68
- // alias as the confusion it wants removed, but its own "What is not proposed"
69
- // says not to change things on its strength alone - so this is a divergence
70
- // awaiting a decision, not a settled position.
71
- //
72
- // See maintenance/INTERIM-sqlite-and-static-2026-08-16.md before resolving it,
73
- // and search for callers of `inspect` on any format first.
89
+ /** Return header facts without reading table rows. */
90
+ static inspect(input) {
91
+ const header = ReadHeader(Normalize(input));
92
+ return {
93
+ family: this.id,
94
+ decodable: true,
95
+ header
96
+ };
97
+ }
74
98
 
75
99
  /**
76
100
  * Reads every table and row.
@@ -82,7 +106,7 @@ class CjsSqliteFormat {
82
106
  * @returns {object} Tables keyed by name, each an array of row objects.
83
107
  */
84
108
  static read(input, options = {}) {
85
- const output = options.output ?? OUTPUT_JSON;
109
+ const output = options.emit ?? options.output ?? OUTPUT_JSON;
86
110
  const bytes = Normalize(input);
87
111
  const header = ReadHeader(bytes);
88
112
  const schema = ReadMaster(bytes, header);
@@ -146,36 +170,20 @@ class CjsSqliteFormat {
146
170
  });
147
171
  static id = "sqlite";
148
172
  static extensions = Object.freeze([".sqlite", ".db", ".sqlite3"]);
149
- static type = Object.freeze(["data"]);
150
173
  static mediaTypes = Object.freeze(["data"]);
151
- static inputTypes = Object.freeze(["sqlite"]);
152
- static outputTypes = Object.freeze([OUTPUT_JSON, OUTPUT_PAYLOAD]);
153
- static debugOutputTypes = Object.freeze([OUTPUT_RAW]);
154
- }
155
-
156
- /** Builds the probe shape the resource manager routes on. */
157
- function Probe(recognized, options) {
158
- return {
159
- format: "sqlite",
160
- source: "buffer",
161
- supported: recognized ? "full" : "none",
162
- confidence: 1,
163
- preferred: "sqlite",
164
- // The header signature is content, not a declaration, so a match is
165
- // evidence rather than a claim to be checked later.
166
- verified: true,
167
- reason: recognized ? "Recognized a SQLite 3 container." : "The header signature is not SQLite 3.",
168
- variants: [{
169
- kind: "container",
170
- codec: "sqlite",
171
- supported: recognized
172
- }],
173
- metadata: {
174
- family: "sqlite",
175
- decodable: recognized
174
+ static outputs = CjsFormat.defineOutputs({
175
+ json: {
176
+ default: true,
177
+ decoded: true
176
178
  },
177
- ...(options || {})
178
- };
179
+ payload: {
180
+ decoded: true
181
+ },
182
+ raw: {
183
+ role: "debug",
184
+ decoded: true
185
+ }
186
+ });
179
187
  }
180
188
 
181
189
  /** Reads `sqlite_master`, which is always the table b-tree rooted at page 1. */
@@ -1 +1 @@
1
- {"version":3,"file":"CjsSqliteFormat.js","sources":["../../../../src/formats/sqlite/CjsSqliteFormat.js"],"sourcesContent":["import { ReadColumns } from \"./core/sqliteSchema.js\";\nimport { ReadHeader, TableRows } from \"./core/sqlitePages.js\";\nimport { ReadRecord, SqliteError } from \"./core/sqliteRecords.js\";\n\nconst OUTPUT_JSON = \"json\";\nconst OUTPUT_PAYLOAD = \"payload\";\nconst OUTPUT_RAW = \"raw\";\nconst MASTER_ROOT_PAGE = 1;\n\n/**\n * Reads a SQLite 3 container as data.\n *\n * **This is a reader, not a database.** It accepts no SQL and runs no queries.\n * It returns the tables a container holds and every row of them, because that\n * is the whole of what this organization does with a SQLite file: the client's\n * `.static` containers and the prepared static data export are both opened,\n * scanned once, and closed.\n *\n * That scope is what makes it small. A query planner, an index walker, writing,\n * journalling and transactions are most of SQLite and none of this, so none of\n * them are here. Index b-tree pages are never visited: an index holds no data a\n * table scan does not already produce.\n *\n * It exists because `runtime-resource` is browser-safe and ships no SQLite\n * engine, so `.static` containers of the SQLite family previously needed a\n * driver injected by the caller — which meant Node, and in practice the\n * experimental `node:sqlite`. Nothing here touches a filesystem or a binding.\n *\n * Values map as the format defines them: NULL, integers, doubles, text decoded\n * with the database's own encoding, and blobs as `Uint8Array`. An integer wider\n * than `Number.MAX_SAFE_INTEGER` is returned as a `BigInt` rather than silently\n * rounded.\n */\nexport class CjsSqliteFormat {\n\n /**\n * Reports whether bytes are a SQLite container, by signature.\n *\n * @param {Uint8Array|ArrayBuffer} input Candidate bytes.\n * @returns {boolean} True when the header signature matches.\n */\n static is(input) {\n try {\n ReadHeader(Normalize(input));\n\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Reports whether these bytes are a SQLite container, on the signature.\n *\n * The signature is the whole claim: the header either says\n * `SQLite format 3` or it does not, so this is verified by content rather\n * than inferred from a name — which matters because `.static` carries three\n * unrelated families and the extension proves nothing.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @param {object} [options] Probe options.\n * @returns {object} Resource probe.\n */\n static isSupported(input, options = null) {\n return Probe(this.is(input), options);\n }\n\n // INTERIM, 2026-08-16. No `inspect` alias onto `isSupported`, while nineteen\n // sibling formats have one. The capability-surface decision page names that\n // alias as the confusion it wants removed, but its own \"What is not proposed\"\n // says not to change things on its strength alone - so this is a divergence\n // awaiting a decision, not a settled position.\n //\n // See maintenance/INTERIM-sqlite-and-static-2026-08-16.md before resolving it,\n // and search for callers of `inspect` on any format first.\n\n /**\n * Reads every table and row.\n *\n * @param {Uint8Array|ArrayBuffer} input Container bytes.\n * @param {object} [options] Read options.\n * @param {string} [options.output] `json`, `payload` or `raw`.\n * @param {string[]} [options.tables] Read only these tables.\n * @returns {object} Tables keyed by name, each an array of row objects.\n */\n static read(input, options = {}) {\n const output = options.output ?? OUTPUT_JSON;\n const bytes = Normalize(input);\n const header = ReadHeader(bytes);\n const schema = ReadMaster(bytes, header);\n\n if (output === OUTPUT_RAW) {\n return { header, schema };\n }\n\n const wanted = options.tables ? new Set(options.tables) : null;\n const tables = {};\n\n for (const entry of schema) {\n if (entry.type !== \"table\" || (wanted && !wanted.has(entry.name))) {\n continue;\n }\n\n // A table with no root page holds nothing: a view, or WITHOUT ROWID.\n tables[entry.name] = entry.rootPage\n ? ReadTable(bytes, header, entry, output === OUTPUT_JSON)\n : [];\n }\n\n return tables;\n }\n\n /** Reads to plain JSON-compatible values, converting blobs to arrays. */\n static readJSON(input, options = {}) {\n return this.read(input, { ...options, output: OUTPUT_JSON });\n }\n\n /** Reads with blobs left as `Uint8Array` and wide integers as `BigInt`. */\n static readPayload(input, options = {}) {\n return this.read(input, { ...options, output: OUTPUT_PAYLOAD });\n }\n\n /** Returns the parsed header and `sqlite_master` entries, decoding no rows. */\n static readRaw(input, options = {}) {\n return this.read(input, { ...options, output: OUTPUT_RAW });\n }\n\n /**\n * Lists the tables a container holds, without reading their rows.\n *\n * @param {Uint8Array|ArrayBuffer} input Container bytes.\n * @returns {Array<object>} One entry per table.\n */\n static tables(input) {\n const bytes = Normalize(input);\n\n return ReadMaster(bytes, ReadHeader(bytes)).filter(entry => entry.type === \"table\");\n }\n\n static Output = Object.freeze({\n JSON: OUTPUT_JSON,\n PAYLOAD: OUTPUT_PAYLOAD,\n RAW: OUTPUT_RAW\n });\n\n static id = \"sqlite\";\n static extensions = Object.freeze([ \".sqlite\", \".db\", \".sqlite3\" ]);\n static type = Object.freeze([ \"data\" ]);\n static mediaTypes = Object.freeze([ \"data\" ]);\n static inputTypes = Object.freeze([ \"sqlite\" ]);\n static outputTypes = Object.freeze([ OUTPUT_JSON, OUTPUT_PAYLOAD ]);\n static debugOutputTypes = Object.freeze([ OUTPUT_RAW ]);\n}\n\n/** Builds the probe shape the resource manager routes on. */\nfunction Probe(recognized, options) {\n return {\n format: \"sqlite\",\n source: \"buffer\",\n supported: recognized ? \"full\" : \"none\",\n confidence: 1,\n preferred: \"sqlite\",\n // The header signature is content, not a declaration, so a match is\n // evidence rather than a claim to be checked later.\n verified: true,\n reason: recognized\n ? \"Recognized a SQLite 3 container.\"\n : \"The header signature is not SQLite 3.\",\n variants: [ { kind: \"container\", codec: \"sqlite\", supported: recognized } ],\n metadata: { family: \"sqlite\", decodable: recognized },\n ...(options || {})\n };\n}\n\n/** Reads `sqlite_master`, which is always the table b-tree rooted at page 1. */\nfunction ReadMaster(bytes, header) {\n const entries = [];\n\n for (const row of TableRows(bytes, header, MASTER_ROOT_PAGE)) {\n const [ type, name, tableName, rootPage, sql ] = ReadRecord(row.payload, header.encoding);\n\n entries.push({\n type: String(type ?? \"\"),\n name: String(name ?? \"\"),\n tableName: String(tableName ?? \"\"),\n rootPage: Number(rootPage ?? 0),\n sql: sql === null || sql === undefined ? \"\" : String(sql)\n });\n }\n\n return entries;\n}\n\n/** Reads one table's rows as objects, named from its `CREATE TABLE` text. */\nfunction ReadTable(bytes, header, entry, json) {\n const { names, rowidAlias } = ReadColumns(entry.sql);\n const rows = [];\n\n for (const row of TableRows(bytes, header, entry.rootPage)) {\n const values = ReadRecord(row.payload, header.encoding);\n const record = {};\n\n for (let index = 0; index < values.length; index += 1) {\n // Positional names keep a row readable when the statement could not be\n // parsed, rather than dropping columns that certainly hold data.\n const name = names[index] ?? `column${index}`;\n const value = index === rowidAlias && values[index] === null ? row.rowid : values[index];\n\n record[name] = json ? ToJSON(value) : value;\n }\n\n rows.push(record);\n }\n\n return rows;\n}\n\n/** Converts a decoded value to something `JSON.stringify` keeps losslessly. */\nfunction ToJSON(value) {\n if (value instanceof Uint8Array) {\n return Array.from(value);\n }\n\n // A BigInt has no JSON form; a decimal string keeps every digit.\n return typeof value === \"bigint\" ? value.toString(10) : value;\n}\n\n/** Accepts the byte forms every other format here accepts. */\nfunction Normalize(input) {\n if (input instanceof Uint8Array) {\n return input;\n }\n\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n\n if (ArrayBuffer.isView(input)) {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n\n throw SqliteError(\"A SQLite container must be supplied as bytes.\");\n}\n\nexport default CjsSqliteFormat;\n"],"names":["OUTPUT_JSON","OUTPUT_PAYLOAD","OUTPUT_RAW","MASTER_ROOT_PAGE","CjsSqliteFormat","is","input","ReadHeader","Normalize","isSupported","options","Probe","read","output","bytes","header","schema","ReadMaster","wanted","tables","Set","entry","type","has","name","rootPage","ReadTable","readJSON","readPayload","readRaw","filter","Output","Object","freeze","JSON","PAYLOAD","RAW","id","extensions","mediaTypes","inputTypes","outputTypes","debugOutputTypes","recognized","format","source","supported","confidence","preferred","verified","reason","variants","kind","codec","metadata","family","decodable","entries","row","TableRows","tableName","sql","ReadRecord","payload","encoding","push","String","Number","undefined","json","names","rowidAlias","ReadColumns","rows","values","record","index","length","value","rowid","ToJSON","Uint8Array","Array","from","toString","ArrayBuffer","isView","buffer","byteOffset","byteLength","SqliteError"],"mappings":"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"}
1
+ {"version":3,"file":"CjsSqliteFormat.js","sources":["../../../../src/formats/sqlite/CjsSqliteFormat.js"],"sourcesContent":["import { CjsFormat } from \"../../format/CjsFormat.js\";\nimport { ReadColumns } from \"./core/sqliteSchema.js\";\nimport { ReadHeader, TableRows } from \"./core/sqlitePages.js\";\nimport { ReadRecord, SqliteError } from \"./core/sqliteRecords.js\";\n\nconst OUTPUT_JSON = \"json\";\nconst OUTPUT_PAYLOAD = \"payload\";\nconst OUTPUT_RAW = \"raw\";\nconst MASTER_ROOT_PAGE = 1;\n\n/**\n * Reads a SQLite 3 container as data.\n *\n * **This is a reader, not a database.** It accepts no SQL and runs no queries.\n * It returns the tables a container holds and every row of them, because that\n * is the whole of what this organization does with a SQLite file: the client's\n * `.static` containers and the prepared static data export are both opened,\n * scanned once, and closed.\n *\n * That scope is what makes it small. A query planner, an index walker, writing,\n * journalling and transactions are most of SQLite and none of this, so none of\n * them are here. Index b-tree pages are never visited: an index holds no data a\n * table scan does not already produce.\n *\n * It exists because `runtime-resource` is browser-safe and ships no SQLite\n * engine, so `.static` containers of the SQLite family previously needed a\n * driver injected by the caller — which meant Node, and in practice the\n * experimental `node:sqlite`. Nothing here touches a filesystem or a binding.\n *\n * Values map as the format defines them: NULL, integers, doubles, text decoded\n * with the database's own encoding, and blobs as `Uint8Array`. An integer wider\n * than `Number.MAX_SAFE_INTEGER` is returned as a `BigInt` rather than silently\n * rounded.\n */\nexport class CjsSqliteFormat extends CjsFormat {\n\n /**\n * Reports whether bytes are a SQLite container, by signature.\n *\n * @param {Uint8Array|ArrayBuffer} input Candidate bytes.\n * @returns {boolean} True when the header signature matches.\n */\n static is(input) {\n try {\n ReadHeader(Normalize(input));\n\n return true;\n } catch {\n return false;\n }\n }\n\n /**\n * Reports whether these bytes are a SQLite container, on the signature.\n *\n * The signature is the whole claim: the header either says\n * `SQLite format 3` or it does not, so this is verified by content rather\n * than inferred from a name — which matters because `.static` carries three\n * unrelated families and the extension proves nothing.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @param {object} [options] Probe options.\n * @returns {object} Resource probe.\n */\n static probeSupport(input, options = null) {\n const recognized = this.is(input);\n return {\n format: this.id,\n source: options?.source || \"buffer\",\n recognized,\n supported: recognized,\n preferredOutput: recognized ? OUTPUT_JSON : \"\",\n reason: recognized\n ? \"Recognized a SQLite 3 container.\"\n : \"The header signature is not SQLite 3.\",\n variants: [\n { kind: OUTPUT_JSON, supported: recognized },\n { kind: OUTPUT_PAYLOAD, supported: recognized },\n { kind: OUTPUT_RAW, supported: recognized }\n ],\n metadata: recognized ? this.inspect(input) : { family: this.id, decodable: false }\n };\n }\n\n /** Return header facts without reading table rows. */\n static inspect(input) {\n const header = ReadHeader(Normalize(input));\n return { family: this.id, decodable: true, header };\n }\n\n /**\n * Reads every table and row.\n *\n * @param {Uint8Array|ArrayBuffer} input Container bytes.\n * @param {object} [options] Read options.\n * @param {string} [options.output] `json`, `payload` or `raw`.\n * @param {string[]} [options.tables] Read only these tables.\n * @returns {object} Tables keyed by name, each an array of row objects.\n */\n static read(input, options = {}) {\n const output = options.emit ?? options.output ?? OUTPUT_JSON;\n const bytes = Normalize(input);\n const header = ReadHeader(bytes);\n const schema = ReadMaster(bytes, header);\n\n if (output === OUTPUT_RAW) {\n return { header, schema };\n }\n\n const wanted = options.tables ? new Set(options.tables) : null;\n const tables = {};\n\n for (const entry of schema) {\n if (entry.type !== \"table\" || (wanted && !wanted.has(entry.name))) {\n continue;\n }\n\n // A table with no root page holds nothing: a view, or WITHOUT ROWID.\n tables[entry.name] = entry.rootPage\n ? ReadTable(bytes, header, entry, output === OUTPUT_JSON)\n : [];\n }\n\n return tables;\n }\n\n /** Reads to plain JSON-compatible values, converting blobs to arrays. */\n static readJSON(input, options = {}) {\n return this.read(input, { ...options, output: OUTPUT_JSON });\n }\n\n /** Reads with blobs left as `Uint8Array` and wide integers as `BigInt`. */\n static readPayload(input, options = {}) {\n return this.read(input, { ...options, output: OUTPUT_PAYLOAD });\n }\n\n /** Returns the parsed header and `sqlite_master` entries, decoding no rows. */\n static readRaw(input, options = {}) {\n return this.read(input, { ...options, output: OUTPUT_RAW });\n }\n\n /**\n * Lists the tables a container holds, without reading their rows.\n *\n * @param {Uint8Array|ArrayBuffer} input Container bytes.\n * @returns {Array<object>} One entry per table.\n */\n static tables(input) {\n const bytes = Normalize(input);\n\n return ReadMaster(bytes, ReadHeader(bytes)).filter(entry => entry.type === \"table\");\n }\n\n static Output = Object.freeze({\n JSON: OUTPUT_JSON,\n PAYLOAD: OUTPUT_PAYLOAD,\n RAW: OUTPUT_RAW\n });\n\n static id = \"sqlite\";\n static extensions = Object.freeze([ \".sqlite\", \".db\", \".sqlite3\" ]);\n static mediaTypes = Object.freeze([ \"data\" ]);\n static outputs = CjsFormat.defineOutputs({\n json: { default: true, decoded: true },\n payload: { decoded: true },\n raw: { role: \"debug\", decoded: true }\n });\n}\n\n/** Reads `sqlite_master`, which is always the table b-tree rooted at page 1. */\nfunction ReadMaster(bytes, header) {\n const entries = [];\n\n for (const row of TableRows(bytes, header, MASTER_ROOT_PAGE)) {\n const [ type, name, tableName, rootPage, sql ] = ReadRecord(row.payload, header.encoding);\n\n entries.push({\n type: String(type ?? \"\"),\n name: String(name ?? \"\"),\n tableName: String(tableName ?? \"\"),\n rootPage: Number(rootPage ?? 0),\n sql: sql === null || sql === undefined ? \"\" : String(sql)\n });\n }\n\n return entries;\n}\n\n/** Reads one table's rows as objects, named from its `CREATE TABLE` text. */\nfunction ReadTable(bytes, header, entry, json) {\n const { names, rowidAlias } = ReadColumns(entry.sql);\n const rows = [];\n\n for (const row of TableRows(bytes, header, entry.rootPage)) {\n const values = ReadRecord(row.payload, header.encoding);\n const record = {};\n\n for (let index = 0; index < values.length; index += 1) {\n // Positional names keep a row readable when the statement could not be\n // parsed, rather than dropping columns that certainly hold data.\n const name = names[index] ?? `column${index}`;\n const value = index === rowidAlias && values[index] === null ? row.rowid : values[index];\n\n record[name] = json ? ToJSON(value) : value;\n }\n\n rows.push(record);\n }\n\n return rows;\n}\n\n/** Converts a decoded value to something `JSON.stringify` keeps losslessly. */\nfunction ToJSON(value) {\n if (value instanceof Uint8Array) {\n return Array.from(value);\n }\n\n // A BigInt has no JSON form; a decimal string keeps every digit.\n return typeof value === \"bigint\" ? value.toString(10) : value;\n}\n\n/** Accepts the byte forms every other format here accepts. */\nfunction Normalize(input) {\n if (input instanceof Uint8Array) {\n return input;\n }\n\n if (input instanceof ArrayBuffer) {\n return new Uint8Array(input);\n }\n\n if (ArrayBuffer.isView(input)) {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n\n throw SqliteError(\"A SQLite container must be supplied as bytes.\");\n}\n\nexport default CjsSqliteFormat;\n"],"names":["OUTPUT_JSON","OUTPUT_PAYLOAD","OUTPUT_RAW","MASTER_ROOT_PAGE","CjsSqliteFormat","CjsFormat","is","input","ReadHeader","Normalize","probeSupport","options","recognized","format","id","source","supported","preferredOutput","reason","variants","kind","metadata","inspect","family","decodable","header","read","output","emit","bytes","schema","ReadMaster","wanted","tables","Set","entry","type","has","name","rootPage","ReadTable","readJSON","readPayload","readRaw","filter","Output","Object","freeze","JSON","PAYLOAD","RAW","extensions","mediaTypes","outputs","defineOutputs","json","default","decoded","payload","raw","role","entries","row","TableRows","tableName","sql","ReadRecord","encoding","push","String","Number","undefined","names","rowidAlias","ReadColumns","rows","values","record","index","length","value","rowid","ToJSON","Uint8Array","Array","from","toString","ArrayBuffer","isView","buffer","byteOffset","byteLength","SqliteError"],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { CjsFormat } from '../../format/CjsFormat.js';
2
+
1
3
  const SQLITE_SIGNATURE = "SQLite format 3\0";
2
4
  const PICKLE_PREFIX_BYTES = 4;
3
5
 
@@ -39,7 +41,7 @@ const CJS_STATIC_FAMILIES = Object.freeze({
39
41
  * about what to decode in the wrong place. Nothing outside its own tests ever
40
42
  * called it.
41
43
  */
42
- class CjsStaticFormat {
44
+ class CjsStaticFormat extends CjsFormat {
43
45
  /**
44
46
  * Report which family a container holds, on the declaration seam.
45
47
  *
@@ -51,8 +53,16 @@ class CjsStaticFormat {
51
53
  * @param {object} [options] Probe options.
52
54
  * @returns {CjsResourceProbe} Declaration-derived probe.
53
55
  */
54
- static isSupported(input, options = null) {
55
- return Probe(this.describe(input), false, options);
56
+ static probeSupport(input, options = null) {
57
+ const detected = this.describe(input);
58
+ return {
59
+ format: this.id,
60
+ source: options?.source || "buffer",
61
+ recognized: detected.family !== CJS_STATIC_FAMILIES.UNKNOWN,
62
+ supported: false,
63
+ reason: detected.reason ?? `Recognized a ${detected.family} container.`,
64
+ metadata: detected
65
+ };
56
66
  }
57
67
 
58
68
  /**
@@ -63,25 +73,7 @@ class CjsStaticFormat {
63
73
  * @returns {CjsResourceProbe} Declaration-derived probe.
64
74
  */
65
75
  static inspect(input, options = null) {
66
- return this.isSupported(input, options);
67
- }
68
-
69
- /**
70
- * Content-verified family resolution.
71
- *
72
- * Contract: docs/concepts/format-type-resolution.md. There is no declared
73
- * type to disagree with here — the extension is silent — so the signature is
74
- * both the claim and the evidence, and the resolution is always verified.
75
- * `preferred` names the decode route, and all three now lead into this
76
- * package: `CjsPickleFormat`, `CjsSqliteFormat`, and `CjsSchemaBoundFormat`
77
- * once the caller has the `.schema` companion to hand it.
78
- *
79
- * @param {ArrayBuffer|ArrayBufferView} input Container bytes.
80
- * @param {object} [options] Probe options.
81
- * @returns {Promise<CjsResourceProbe>} Verified probe.
82
- */
83
- static async resolveType(input, options = null) {
84
- return Probe(this.describe(input), true, options);
76
+ return this.describe(input);
85
77
  }
86
78
 
87
79
  /**
@@ -147,8 +139,8 @@ class CjsStaticFormat {
147
139
  }
148
140
  static id = "static";
149
141
  static extensions = Object.freeze([".static"]);
150
- static type = Object.freeze(["data"]);
151
142
  static mediaTypes = Object.freeze(["data"]);
143
+ static outputs = Object.freeze({});
152
144
 
153
145
  /**
154
146
  * The extension is the only input this format claims.
@@ -159,40 +151,6 @@ class CjsStaticFormat {
159
151
  * nothing and the signature has to be read. The family belongs in
160
152
  * `describe()`, which measures it, not in a static that asserts it.
161
153
  */
162
- static inputTypes = Object.freeze(["static"]);
163
- static outputTypes = Object.freeze(["json", "payload"]);
164
- static debugOutputTypes = Object.freeze(["raw"]);
165
- }
166
-
167
- /**
168
- * Build the shared probe payload.
169
- *
170
- * Formats report a plain probe-shaped object rather than constructing a
171
- * `CjsResourceProbe`, which keeps this module free of the decorated class and
172
- * of the build transform it needs.
173
- */
174
- function Probe(detected, verified, options) {
175
- return {
176
- format: "static",
177
- source: "buffer",
178
- supported: detected.decodable ? "full" : "partial",
179
- confidence: detected.family === CJS_STATIC_FAMILIES.UNKNOWN ? 0.5 : 1,
180
- preferred: detected.family,
181
- verified,
182
- reason: detected.reason ?? `Recognized a ${detected.family} container.`,
183
- variants: [{
184
- kind: "container",
185
- codec: detected.family,
186
- supported: detected.decodable
187
- }],
188
- metadata: verified ? {
189
- ...detected,
190
- declared: null,
191
- resolved: detected.family,
192
- mismatch: false
193
- } : detected,
194
- ...(options || {})
195
- };
196
154
  }
197
155
  function MatchesSqlite(bytes) {
198
156
  if (bytes.byteLength < SQLITE_SIGNATURE.length) return false;
@@ -1 +1 @@
1
- {"version":3,"file":"CjsStaticFormat.js","sources":["../../../../src/formats/static/CjsStaticFormat.js"],"sourcesContent":["\nconst SQLITE_SIGNATURE = \"SQLite format 3\\0\";\nconst PICKLE_PREFIX_BYTES = 4;\n\n/** Container families found behind the single `.static` extension. */\nexport const CJS_STATIC_FAMILIES = Object.freeze({\n SQLITE: \"sqlite\",\n PICKLE: \"pickle\",\n UNKNOWN: \"unknown\"\n});\n\n/**\n * Identifies which container a client `.static` file actually holds.\n *\n * The extension names a role, not a format. Three unrelated containers ship\n * under it, and each fails in its own way when guessed at:\n *\n * - **SQLite 3** — a `cache(key, value, time)` plus `indexes(key, value)`\n * database whose values are JSON documents. `CjsSqliteFormat` reads it.\n * - **Embedded schema** — a four-byte little-endian SCHEMA LENGTH followed by\n * that schema as a protocol-0 pickle, and then a payload. The prefix is not a\n * wrapper to skip: slice `[4, 4 + length)` for the schema and give the rest\n * to `CjsSchemaBoundFormat`. All 25 of these name one global,\n * `collections.OrderedDict`, which the pickle reader rebuilds as plain data.\n * - **Schema-bound** — a binary record container whose `.schema` companion is\n * YAML describing its own layout: attribute sizes and types, optional flags,\n * lists with a fixed item size, vectors with a precision, and a key footer of\n * key-to-offset pairs. Nothing needs deriving, because the build ships the\n * layout. Six datasets are stored this way - the map skeleton of regions,\n * constellations and systems. `CjsSchemaBoundFormat` reads it, given that\n * companion, and reads the embedded-schema family above from the same code.\n *\n * Detection is signature-based and never executes or trusts file names.\n *\n * **This class identifies and does not decode.** It reports the family, the\n * payload offset and what is still missing; the caller takes that answer to the\n * format that owns the family. It carried a `read()` that dispatched to\n * `CjsPickleFormat` and `CjsSqliteFormat` until 2026-08-15, which made an\n * identification format the routing table for two others and put the decision\n * about what to decode in the wrong place. Nothing outside its own tests ever\n * called it.\n */\nexport class CjsStaticFormat\n{\n\n /**\n * Report which family a container holds, on the declaration seam.\n *\n * `.static` declares nothing: the extension names a role and every family\n * wears it. The signature is therefore the only claim there is, which is why\n * this format reads it here rather than trusting a name.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @param {object} [options] Probe options.\n * @returns {CjsResourceProbe} Declaration-derived probe.\n */\n static isSupported(input, options = null)\n {\n return Probe(this.describe(input), false, options);\n }\n\n /**\n * Alias for canonical naming.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @param {object} [options] Probe options.\n * @returns {CjsResourceProbe} Declaration-derived probe.\n */\n static inspect(input, options = null)\n {\n return this.isSupported(input, options);\n }\n\n /**\n * Content-verified family resolution.\n *\n * Contract: docs/concepts/format-type-resolution.md. There is no declared\n * type to disagree with here — the extension is silent — so the signature is\n * both the claim and the evidence, and the resolution is always verified.\n * `preferred` names the decode route, and all three now lead into this\n * package: `CjsPickleFormat`, `CjsSqliteFormat`, and `CjsSchemaBoundFormat`\n * once the caller has the `.schema` companion to hand it.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @param {object} [options] Probe options.\n * @returns {Promise<CjsResourceProbe>} Verified probe.\n */\n static async resolveType(input, options = null)\n {\n return Probe(this.describe(input), true, options);\n }\n\n /**\n * Describe one container without decoding it or building a probe.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @returns {object} Family, payload offset, and whether this package decodes it.\n */\n static describe(input)\n {\n const bytes = Normalize(input);\n\n if (MatchesSqlite(bytes))\n {\n return Object.freeze({\n family: CJS_STATIC_FAMILIES.SQLITE,\n byteLength: bytes.byteLength,\n payloadOffset: 0,\n prefix: null,\n // Decodable outright since CjsSqliteFormat landed. This reported\n // `requires: \"sqlite\"` while a caller had to supply an engine, and was\n // the example behind the argument that a capability can depend on the\n // caller's environment - an argument that now needs a different one.\n decodable: true,\n requires: null,\n reason: \"Recognized a SQLite container.\"\n });\n }\n\n if (MatchesPickle(bytes))\n {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n return Object.freeze({\n family: CJS_STATIC_FAMILIES.PICKLE,\n byteLength: bytes.byteLength,\n payloadOffset: PICKLE_PREFIX_BYTES,\n prefix: view.getUint32(0, true),\n decodable: true,\n requires: null,\n reason: null\n });\n }\n\n return Object.freeze({\n family: CJS_STATIC_FAMILIES.UNKNOWN,\n byteLength: bytes.byteLength,\n payloadOffset: 0,\n prefix: null,\n decodable: false,\n requires: \"schema\",\n // `decodable` is this format's own answer, and it stays false: these bytes\n // carry nothing to identify, so the family is an inference from the absence\n // of the other two signatures rather than a reading. `requires` names what\n // closes that gap - with the companion, CjsSchemaBoundFormat decodes it.\n reason: \"No signature. A schema-bound container needs its .schema companion, \"\n + \"which is YAML describing the layout. CjsSchemaBoundFormat reads it from there.\"\n });\n }\n\n /**\n * Return the decodable payload for a container, without its wrapper.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @returns {Uint8Array} Payload bytes.\n */\n static payload(input)\n {\n const bytes = Normalize(input);\n const detected = this.describe(bytes);\n\n return bytes.subarray(detected.payloadOffset);\n }\n\n\n static id = \"static\";\n static extensions = Object.freeze([ \".static\" ]);\n static type = Object.freeze([ \"data\" ]);\n static mediaTypes = Object.freeze([ \"data\" ]);\n\n /**\n * The extension is the only input this format claims.\n *\n * Naming the three families here would be a lie in the other direction: a\n * caller cannot hand this format \"a pickle\" or \"a sqlite\" and expect it to\n * route, because the whole point of the class is that `.static` declares\n * nothing and the signature has to be read. The family belongs in\n * `describe()`, which measures it, not in a static that asserts it.\n */\n static inputTypes = Object.freeze([ \"static\" ]);\n static outputTypes = Object.freeze([ \"json\", \"payload\" ]);\n static debugOutputTypes = Object.freeze([ \"raw\" ]);\n\n}\n\n/**\n * Build the shared probe payload.\n *\n * Formats report a plain probe-shaped object rather than constructing a\n * `CjsResourceProbe`, which keeps this module free of the decorated class and\n * of the build transform it needs.\n */\nfunction Probe(detected, verified, options)\n{\n return {\n format: \"static\",\n source: \"buffer\",\n supported: detected.decodable ? \"full\" : \"partial\",\n confidence: detected.family === CJS_STATIC_FAMILIES.UNKNOWN ? 0.5 : 1,\n preferred: detected.family,\n verified,\n reason: detected.reason ?? `Recognized a ${detected.family} container.`,\n variants: [ { kind: \"container\", codec: detected.family, supported: detected.decodable } ],\n metadata: verified\n ? { ...detected, declared: null, resolved: detected.family, mismatch: false }\n : detected,\n ...(options || {})\n };\n}\n\nfunction MatchesSqlite(bytes)\n{\n if (bytes.byteLength < SQLITE_SIGNATURE.length) return false;\n\n for (let index = 0; index < SQLITE_SIGNATURE.length; index++)\n {\n if (bytes[index] !== SQLITE_SIGNATURE.charCodeAt(index)) return false;\n }\n\n return true;\n}\n\nfunction MatchesPickle(bytes)\n{\n // A protocol-0 pickle opens a container then names it: \"(dp1\\n\" or \"(lp1\\n\".\n if (bytes.byteLength < PICKLE_PREFIX_BYTES + 3) return false;\n if (bytes[PICKLE_PREFIX_BYTES] !== 0x28) return false;\n\n const kind = bytes[PICKLE_PREFIX_BYTES + 1];\n\n return kind === 0x64 || kind === 0x6c;\n}\n\nfunction Normalize(input)\n{\n if (input instanceof ArrayBuffer) return new Uint8Array(input);\n\n if (ArrayBuffer.isView(input))\n {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n\n const error = new TypeError(\"A .static container must be an ArrayBuffer or a view over one.\");\n\n error.code = \"CJS_STATIC_FORMAT_INPUT_INVALID\";\n throw error;\n}\n"],"names":["SQLITE_SIGNATURE","PICKLE_PREFIX_BYTES","CJS_STATIC_FAMILIES","Object","freeze","SQLITE","PICKLE","UNKNOWN","CjsStaticFormat","isSupported","input","options","Probe","describe","inspect","resolveType","bytes","Normalize","MatchesSqlite","family","byteLength","payloadOffset","prefix","decodable","requires","reason","MatchesPickle","view","DataView","buffer","byteOffset","getUint32","payload","detected","subarray","id","extensions","type","mediaTypes","inputTypes","outputTypes","debugOutputTypes","verified","format","source","supported","confidence","preferred","variants","kind","codec","metadata","declared","resolved","mismatch","length","index","charCodeAt","ArrayBuffer","Uint8Array","isView","error","TypeError","code"],"mappings":"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"}
1
+ {"version":3,"file":"CjsStaticFormat.js","sources":["../../../../src/formats/static/CjsStaticFormat.js"],"sourcesContent":["import { CjsFormat } from \"../../format/CjsFormat.js\";\n\nconst SQLITE_SIGNATURE = \"SQLite format 3\\0\";\nconst PICKLE_PREFIX_BYTES = 4;\n\n/** Container families found behind the single `.static` extension. */\nexport const CJS_STATIC_FAMILIES = Object.freeze({\n SQLITE: \"sqlite\",\n PICKLE: \"pickle\",\n UNKNOWN: \"unknown\"\n});\n\n/**\n * Identifies which container a client `.static` file actually holds.\n *\n * The extension names a role, not a format. Three unrelated containers ship\n * under it, and each fails in its own way when guessed at:\n *\n * - **SQLite 3** — a `cache(key, value, time)` plus `indexes(key, value)`\n * database whose values are JSON documents. `CjsSqliteFormat` reads it.\n * - **Embedded schema** — a four-byte little-endian SCHEMA LENGTH followed by\n * that schema as a protocol-0 pickle, and then a payload. The prefix is not a\n * wrapper to skip: slice `[4, 4 + length)` for the schema and give the rest\n * to `CjsSchemaBoundFormat`. All 25 of these name one global,\n * `collections.OrderedDict`, which the pickle reader rebuilds as plain data.\n * - **Schema-bound** — a binary record container whose `.schema` companion is\n * YAML describing its own layout: attribute sizes and types, optional flags,\n * lists with a fixed item size, vectors with a precision, and a key footer of\n * key-to-offset pairs. Nothing needs deriving, because the build ships the\n * layout. Six datasets are stored this way - the map skeleton of regions,\n * constellations and systems. `CjsSchemaBoundFormat` reads it, given that\n * companion, and reads the embedded-schema family above from the same code.\n *\n * Detection is signature-based and never executes or trusts file names.\n *\n * **This class identifies and does not decode.** It reports the family, the\n * payload offset and what is still missing; the caller takes that answer to the\n * format that owns the family. It carried a `read()` that dispatched to\n * `CjsPickleFormat` and `CjsSqliteFormat` until 2026-08-15, which made an\n * identification format the routing table for two others and put the decision\n * about what to decode in the wrong place. Nothing outside its own tests ever\n * called it.\n */\nexport class CjsStaticFormat extends CjsFormat\n{\n\n /**\n * Report which family a container holds, on the declaration seam.\n *\n * `.static` declares nothing: the extension names a role and every family\n * wears it. The signature is therefore the only claim there is, which is why\n * this format reads it here rather than trusting a name.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @param {object} [options] Probe options.\n * @returns {CjsResourceProbe} Declaration-derived probe.\n */\n static probeSupport(input, options = null)\n {\n const detected = this.describe(input);\n return {\n format: this.id,\n source: options?.source || \"buffer\",\n recognized: detected.family !== CJS_STATIC_FAMILIES.UNKNOWN,\n supported: false,\n reason: detected.reason ?? `Recognized a ${detected.family} container.`,\n metadata: detected\n };\n }\n\n /**\n * Alias for canonical naming.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @param {object} [options] Probe options.\n * @returns {CjsResourceProbe} Declaration-derived probe.\n */\n static inspect(input, options = null)\n {\n void options;\n return this.describe(input);\n }\n\n /**\n * Describe one container without decoding it or building a probe.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @returns {object} Family, payload offset, and whether this package decodes it.\n */\n static describe(input)\n {\n const bytes = Normalize(input);\n\n if (MatchesSqlite(bytes))\n {\n return Object.freeze({\n family: CJS_STATIC_FAMILIES.SQLITE,\n byteLength: bytes.byteLength,\n payloadOffset: 0,\n prefix: null,\n // Decodable outright since CjsSqliteFormat landed. This reported\n // `requires: \"sqlite\"` while a caller had to supply an engine, and was\n // the example behind the argument that a capability can depend on the\n // caller's environment - an argument that now needs a different one.\n decodable: true,\n requires: null,\n reason: \"Recognized a SQLite container.\"\n });\n }\n\n if (MatchesPickle(bytes))\n {\n const view = new DataView(bytes.buffer, bytes.byteOffset, bytes.byteLength);\n\n return Object.freeze({\n family: CJS_STATIC_FAMILIES.PICKLE,\n byteLength: bytes.byteLength,\n payloadOffset: PICKLE_PREFIX_BYTES,\n prefix: view.getUint32(0, true),\n decodable: true,\n requires: null,\n reason: null\n });\n }\n\n return Object.freeze({\n family: CJS_STATIC_FAMILIES.UNKNOWN,\n byteLength: bytes.byteLength,\n payloadOffset: 0,\n prefix: null,\n decodable: false,\n requires: \"schema\",\n // `decodable` is this format's own answer, and it stays false: these bytes\n // carry nothing to identify, so the family is an inference from the absence\n // of the other two signatures rather than a reading. `requires` names what\n // closes that gap - with the companion, CjsSchemaBoundFormat decodes it.\n reason: \"No signature. A schema-bound container needs its .schema companion, \"\n + \"which is YAML describing the layout. CjsSchemaBoundFormat reads it from there.\"\n });\n }\n\n /**\n * Return the decodable payload for a container, without its wrapper.\n *\n * @param {ArrayBuffer|ArrayBufferView} input Container bytes.\n * @returns {Uint8Array} Payload bytes.\n */\n static payload(input)\n {\n const bytes = Normalize(input);\n const detected = this.describe(bytes);\n\n return bytes.subarray(detected.payloadOffset);\n }\n\n\n static id = \"static\";\n static extensions = Object.freeze([ \".static\" ]);\n static mediaTypes = Object.freeze([ \"data\" ]);\n static outputs = Object.freeze({});\n\n /**\n * The extension is the only input this format claims.\n *\n * Naming the three families here would be a lie in the other direction: a\n * caller cannot hand this format \"a pickle\" or \"a sqlite\" and expect it to\n * route, because the whole point of the class is that `.static` declares\n * nothing and the signature has to be read. The family belongs in\n * `describe()`, which measures it, not in a static that asserts it.\n */\n\n}\n\nfunction MatchesSqlite(bytes)\n{\n if (bytes.byteLength < SQLITE_SIGNATURE.length) return false;\n\n for (let index = 0; index < SQLITE_SIGNATURE.length; index++)\n {\n if (bytes[index] !== SQLITE_SIGNATURE.charCodeAt(index)) return false;\n }\n\n return true;\n}\n\nfunction MatchesPickle(bytes)\n{\n // A protocol-0 pickle opens a container then names it: \"(dp1\\n\" or \"(lp1\\n\".\n if (bytes.byteLength < PICKLE_PREFIX_BYTES + 3) return false;\n if (bytes[PICKLE_PREFIX_BYTES] !== 0x28) return false;\n\n const kind = bytes[PICKLE_PREFIX_BYTES + 1];\n\n return kind === 0x64 || kind === 0x6c;\n}\n\nfunction Normalize(input)\n{\n if (input instanceof ArrayBuffer) return new Uint8Array(input);\n\n if (ArrayBuffer.isView(input))\n {\n return new Uint8Array(input.buffer, input.byteOffset, input.byteLength);\n }\n\n const error = new TypeError(\"A .static container must be an ArrayBuffer or a view over one.\");\n\n error.code = \"CJS_STATIC_FORMAT_INPUT_INVALID\";\n throw error;\n}\n"],"names":["SQLITE_SIGNATURE","PICKLE_PREFIX_BYTES","CJS_STATIC_FAMILIES","Object","freeze","SQLITE","PICKLE","UNKNOWN","CjsStaticFormat","CjsFormat","probeSupport","input","options","detected","describe","format","id","source","recognized","family","supported","reason","metadata","inspect","bytes","Normalize","MatchesSqlite","byteLength","payloadOffset","prefix","decodable","requires","MatchesPickle","view","DataView","buffer","byteOffset","getUint32","payload","subarray","extensions","mediaTypes","outputs","length","index","charCodeAt","kind","ArrayBuffer","Uint8Array","isView","error","TypeError","code"],"mappings":"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"}
@@ -52,9 +52,9 @@ function FamilyError(path, found, wanted, reason) {
52
52
  * @returns {Promise<object>} Records keyed by their container key.
53
53
  */
54
54
  async function ReadStaticContainer(bytes, path = ".static input") {
55
- const probe = await CjsStaticFormat.resolveType(bytes);
56
- if (probe.preferred !== CJS_STATIC_FAMILIES.SQLITE) {
57
- throw FamilyError(path, probe.preferred, CJS_STATIC_FAMILIES.SQLITE, probe.reason);
55
+ const detected = CjsStaticFormat.inspect(bytes);
56
+ if (detected.family !== CJS_STATIC_FAMILIES.SQLITE) {
57
+ throw FamilyError(path, detected.family, CJS_STATIC_FAMILIES.SQLITE, detected.reason);
58
58
  }
59
59
  const tables = CjsSqliteFormat.readJSON(bytes, {
60
60
  tables: [CACHE_TABLE]
@@ -126,12 +126,12 @@ function ReadEmbeddedSchemaContainer(bytes, path = ".static input") {
126
126
  * @returns {Promise<object|Array>} Decoded records.
127
127
  */
128
128
  async function ReadSchemaBoundContainer(bytes, schema, path = ".static input") {
129
- const probe = await CjsStaticFormat.resolveType(bytes);
129
+ const detected = CjsStaticFormat.inspect(bytes);
130
130
 
131
131
  // The schema-bound family is the one with nothing to recognize, so it is
132
132
  // reported as `unknown` with `requires: "schema"` rather than named outright.
133
- if (probe.preferred !== CJS_STATIC_FAMILIES.UNKNOWN) {
134
- throw FamilyError(path, probe.preferred, "schema-bound", null);
133
+ if (detected.family !== CJS_STATIC_FAMILIES.UNKNOWN) {
134
+ throw FamilyError(path, detected.family, "schema-bound", null);
135
135
  }
136
136
  return CjsSchemaBoundFormat.read(bytes, {
137
137
  schema