@carbonenginejs/runtime-resource 0.8.0 → 0.9.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (297) hide show
  1. package/LICENSE +21 -21
  2. package/NOTICE +31 -29
  3. package/README.md +67 -548
  4. package/dist/CjsMotherLode.js +1271 -1271
  5. package/dist/CjsResMan.js +3005 -3005
  6. package/dist/CjsResManQueue.js +214 -214
  7. package/dist/CjsResource.js +566 -566
  8. package/dist/CjsResourceSource.js +68 -59
  9. package/dist/CjsResourceSource.js.map +1 -1
  10. package/dist/_virtual/_rollupPluginBabelHelpers.js +153 -153
  11. package/dist/format/CjsBlueReader.js +269 -269
  12. package/dist/format/CjsFormat.js +197 -192
  13. package/dist/format/CjsFormat.js.map +1 -1
  14. package/dist/format/CjsReader.js +18 -18
  15. package/dist/format/CjsResourceProbe.js +277 -277
  16. package/dist/format/payloadContract.js +173 -173
  17. package/dist/formats/black/CjsBlackFormat.js +278 -278
  18. package/dist/formats/black/core/CjsBlackBinaryReader.js +157 -153
  19. package/dist/formats/black/core/CjsBlackBinaryReader.js.map +1 -1
  20. package/dist/formats/black/core/CjsBlackPropertyReaders.js +387 -382
  21. package/dist/formats/black/core/CjsBlackPropertyReaders.js.map +1 -1
  22. package/dist/formats/black/core/CjsBlackReader.js +639 -639
  23. package/dist/formats/black/core/CjsBlackSchemaRegistry.js +437 -433
  24. package/dist/formats/black/core/CjsBlackSchemaRegistry.js.map +1 -1
  25. package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js +4 -0
  26. package/dist/formats/black/core/black-schema-v1-2026-07-23.json.js.map +1 -0
  27. package/dist/formats/black/core/blackConstants.js +7 -7
  28. package/dist/formats/black/core/blackDefinitions.js +10 -10
  29. package/dist/formats/black/core/blackDefinitions.js.map +1 -1
  30. package/dist/formats/black/core/blackEnums.js +6 -6
  31. package/dist/formats/black/core/blackSchema.js +3 -3
  32. package/dist/formats/black/core/blackVersion.js +22 -22
  33. package/dist/formats/black/core/helpers.js +182 -182
  34. package/dist/formats/black/core/schema.js +4 -4
  35. package/dist/formats/black/index.js +2 -2
  36. package/dist/formats/bnk/CjsBnkFormat.js +125 -125
  37. package/dist/formats/bnk/core/graph.js +140 -140
  38. package/dist/formats/bnk/core/helpers.js +409 -409
  39. package/dist/formats/bnk/core/musicNodes.js +493 -489
  40. package/dist/formats/bnk/core/musicNodes.js.map +1 -1
  41. package/dist/formats/bnk/core/soundbanksInfo.js +246 -246
  42. package/dist/formats/bnk/index.js +2 -2
  43. package/dist/formats/cmf/CjsCmfFormat.js +497 -497
  44. package/dist/formats/cmf/core/binary.js +123 -118
  45. package/dist/formats/cmf/core/binary.js.map +1 -1
  46. package/dist/formats/cmf/core/buffers.js +233 -233
  47. package/dist/formats/cmf/core/constants.js +47 -47
  48. package/dist/formats/cmf/core/gr2Anim.js +453 -453
  49. package/dist/formats/cmf/core/helpers.js +287 -287
  50. package/dist/formats/cmf/core/pack.js +276 -276
  51. package/dist/formats/cmf/core/schema.js +364 -364
  52. package/dist/formats/cmf/core/shared.js +268 -268
  53. package/dist/formats/cmf/core/writer.js +517 -517
  54. package/dist/formats/cmf/index.js +2 -2
  55. package/dist/formats/dds/CjsDdsFormat.js +200 -193
  56. package/dist/formats/dds/CjsDdsFormat.js.map +1 -1
  57. package/dist/formats/dds/core/bc6h.js +288 -288
  58. package/dist/formats/dds/core/bc7.js +256 -251
  59. package/dist/formats/dds/core/bc7.js.map +1 -1
  60. package/dist/formats/dds/core/helpers.js +815 -815
  61. package/dist/formats/dds/index.js +2 -2
  62. package/dist/formats/fbx/CjsFbxFormat.js +266 -266
  63. package/dist/formats/fbx/core/helpers.js +3911 -3901
  64. package/dist/formats/fbx/core/helpers.js.map +1 -1
  65. package/dist/formats/fbx/index.js +2 -2
  66. package/dist/formats/flac/CjsFlacFormat.js +93 -87
  67. package/dist/formats/flac/CjsFlacFormat.js.map +1 -1
  68. package/dist/formats/flac/core/helpers.js +295 -295
  69. package/dist/formats/flac/index.js +2 -2
  70. package/dist/formats/gif/CjsGifFormat.js +92 -87
  71. package/dist/formats/gif/CjsGifFormat.js.map +1 -1
  72. package/dist/formats/gif/core/helpers.js +360 -360
  73. package/dist/formats/gif/index.js +2 -2
  74. package/dist/formats/gltf/CjsGltfFormat.js +290 -290
  75. package/dist/formats/gltf/core/helpers.js +292 -292
  76. package/dist/formats/gltf/core/json.js +79 -79
  77. package/dist/formats/gltf/core/parser.js +666 -666
  78. package/dist/formats/gltf/core/targets.js +163 -163
  79. package/dist/formats/gltf/index.js +2 -2
  80. package/dist/formats/gr2/CjsGr2Format.js +46 -0
  81. package/dist/formats/gr2/CjsGr2Format.js.map +1 -0
  82. package/dist/formats/gr2/core/CjsFormatGr2.js +273 -0
  83. package/dist/formats/gr2/core/CjsFormatGr2.js.map +1 -0
  84. package/dist/formats/gr2/core/bitknit2.js +280 -0
  85. package/dist/formats/gr2/core/bitknit2.js.map +1 -0
  86. package/dist/formats/gr2/core/curves.js +1047 -0
  87. package/dist/formats/gr2/core/curves.js.map +1 -0
  88. package/dist/formats/gr2/core/gsf.js +72 -0
  89. package/dist/formats/gr2/core/gsf.js.map +1 -0
  90. package/dist/formats/gr2/core/helpers.js +332 -0
  91. package/dist/formats/gr2/core/helpers.js.map +1 -0
  92. package/dist/formats/gr2/core/json.js +622 -0
  93. package/dist/formats/gr2/core/json.js.map +1 -0
  94. package/dist/formats/gr2/core/oodle1.js +388 -0
  95. package/dist/formats/gr2/core/oodle1.js.map +1 -0
  96. package/dist/formats/gr2/core/reader.js +617 -0
  97. package/dist/formats/gr2/core/reader.js.map +1 -0
  98. package/dist/formats/gr2/core/tangents.js +48 -0
  99. package/dist/formats/gr2/core/tangents.js.map +1 -0
  100. package/dist/formats/gr2/core/targets.js +351 -0
  101. package/dist/formats/gr2/core/targets.js.map +1 -0
  102. package/dist/formats/gr2/index.js +3 -0
  103. package/dist/formats/gr2/index.js.map +1 -0
  104. package/dist/formats/index.js +30 -23
  105. package/dist/formats/index.js.map +1 -1
  106. package/dist/formats/jpeg/CjsJpegFormat.js +212 -206
  107. package/dist/formats/jpeg/CjsJpegFormat.js.map +1 -1
  108. package/dist/formats/jpeg/core/helpers.js +350 -350
  109. package/dist/formats/jpeg/core/jpeg.js +387 -377
  110. package/dist/formats/jpeg/core/jpeg.js.map +1 -1
  111. package/dist/formats/jpeg/index.js +2 -2
  112. package/dist/formats/mp3/CjsMp3Format.js +197 -192
  113. package/dist/formats/mp3/CjsMp3Format.js.map +1 -1
  114. package/dist/formats/mp3/core/helpers.js +338 -338
  115. package/dist/formats/mp3/index.js +2 -2
  116. package/dist/formats/mp4/CjsMp4Format.js +197 -191
  117. package/dist/formats/mp4/CjsMp4Format.js.map +1 -1
  118. package/dist/formats/mp4/core/helpers.js +449 -449
  119. package/dist/formats/mp4/index.js +2 -2
  120. package/dist/formats/obj/CjsObjFormat.js +253 -253
  121. package/dist/formats/obj/core/helpers.js +573 -573
  122. package/dist/formats/obj/core/json.js +64 -64
  123. package/dist/formats/obj/core/parser.js +321 -321
  124. package/dist/formats/obj/index.js +2 -2
  125. package/dist/formats/ogg/CjsOggFormat.js +94 -88
  126. package/dist/formats/ogg/CjsOggFormat.js.map +1 -1
  127. package/dist/formats/ogg/core/helpers.js +387 -387
  128. package/dist/formats/ogg/core/imdct.js +178 -178
  129. package/dist/formats/ogg/core/vorbis.js +1004 -999
  130. package/dist/formats/ogg/core/vorbis.js.map +1 -1
  131. package/dist/formats/ogg/index.js +2 -2
  132. package/dist/formats/png/CjsPngFormat.js +201 -195
  133. package/dist/formats/png/CjsPngFormat.js.map +1 -1
  134. package/dist/formats/png/core/helpers.js +583 -583
  135. package/dist/formats/png/index.js +2 -2
  136. package/dist/formats/red/CjsRedFormat.js +261 -261
  137. package/dist/formats/red/core/CjsRedReader.js +194 -194
  138. package/dist/formats/red/core/blackDefinitions.js +3 -3
  139. package/dist/formats/red/core/helpers.js +139 -139
  140. package/dist/formats/red/core/redGraph.js +68 -68
  141. package/dist/formats/red/core/schema.js +4 -4
  142. package/dist/formats/red/index.js +2 -2
  143. package/dist/formats/stl/CjsStlFormat.js +365 -365
  144. package/dist/formats/stl/core/helpers.js +261 -261
  145. package/dist/formats/stl/core/json.js +51 -51
  146. package/dist/formats/stl/core/stl.js +634 -629
  147. package/dist/formats/stl/core/stl.js.map +1 -1
  148. package/dist/formats/stl/core/targets.js +163 -163
  149. package/dist/formats/stl/index.js +2 -2
  150. package/dist/formats/tga/CjsTgaFormat.js +197 -192
  151. package/dist/formats/tga/CjsTgaFormat.js.map +1 -1
  152. package/dist/formats/tga/core/helpers.js +446 -446
  153. package/dist/formats/tga/index.js +2 -2
  154. package/dist/formats/wav/CjsWavFormat.js +198 -192
  155. package/dist/formats/wav/CjsWavFormat.js.map +1 -1
  156. package/dist/formats/wav/core/helpers.js +328 -328
  157. package/dist/formats/wav/index.js +2 -2
  158. package/dist/formats/webm/CjsWebmFormat.js +197 -191
  159. package/dist/formats/webm/CjsWebmFormat.js.map +1 -1
  160. package/dist/formats/webm/core/helpers.js +537 -537
  161. package/dist/formats/webm/index.js +2 -2
  162. package/dist/formats/webp/CjsWebpFormat.js +91 -86
  163. package/dist/formats/webp/CjsWebpFormat.js.map +1 -1
  164. package/dist/formats/webp/core/helpers.js +214 -214
  165. package/dist/formats/webp/index.js +2 -2
  166. package/dist/formats/wem/CjsWemFormat.js +242 -241
  167. package/dist/formats/wem/CjsWemFormat.js.map +1 -1
  168. package/dist/formats/wem/core/bitStream.js +259 -259
  169. package/dist/formats/wem/core/codebookLibrary.js +164 -164
  170. package/dist/formats/wem/core/helpers.js +417 -417
  171. package/dist/formats/wem/core/packedCodebooksAotuv603.js +30 -30
  172. package/dist/formats/wem/core/ptadpcm.js +77 -77
  173. package/dist/formats/wem/core/resolve.js +121 -121
  174. package/dist/formats/wem/core/wemToOgg.js +485 -485
  175. package/dist/formats/wem/index.js +2 -2
  176. package/dist/formats/yaml/CjsYamlFormat.js +89 -83
  177. package/dist/formats/yaml/CjsYamlFormat.js.map +1 -1
  178. package/dist/formats/yaml/core/CjsYamlReader.js +311 -305
  179. package/dist/formats/yaml/core/CjsYamlReader.js.map +1 -1
  180. package/dist/formats/yaml/core/helpers.js +160 -160
  181. package/dist/formats/yaml/index.js +2 -2
  182. package/dist/index.js +49 -48
  183. package/dist/index.js.map +1 -1
  184. package/dist/resourcePath.js +18 -18
  185. package/dist/resourceStates.js +9 -9
  186. package/dist/resources/AudioGeometryResData.js +47 -47
  187. package/dist/resources/GStateBindingCallbackData.js +31 -31
  188. package/dist/resources/MeshDecalData.js +37 -37
  189. package/dist/resources/MeshDecalLodData.js +34 -34
  190. package/dist/resources/Tr2EffectRes.js +71 -71
  191. package/dist/resources/Tr2GrannyIntersectionResult.js +60 -60
  192. package/dist/resources/Tr2GrannyStateRes.js +44 -44
  193. package/dist/resources/Tr2ImageRes.js +114 -114
  194. package/dist/resources/Tr2LightProfileRes.js +40 -40
  195. package/dist/resources/Tr2MaterialArea.js +34 -34
  196. package/dist/resources/Tr2MaterialMesh.js +31 -31
  197. package/dist/resources/Tr2MaterialRes.js +34 -34
  198. package/dist/resources/Tr2ShaderPermutation.js +43 -43
  199. package/dist/resources/Tr2TextureLodManager.js +80 -80
  200. package/dist/resources/Tr2TextureLodUpdateRequest.js +37 -37
  201. package/dist/resources/Tr2TexturePackChannel.js +37 -37
  202. package/dist/resources/Tr2TexturePipeline.js +52 -52
  203. package/dist/resources/Tr2TexturePipelineParams.js +34 -34
  204. package/dist/resources/Tr2TexturePipelineStepCompress.js +40 -40
  205. package/dist/resources/Tr2TexturePipelineStepGenerateMips.js +22 -0
  206. package/dist/resources/Tr2TexturePipelineStepGenerateMips.js.map +1 -0
  207. package/dist/resources/Tr2TexturePipelineStepLimitSize.js +34 -34
  208. package/dist/resources/Tr2TexturePipelineStepLoad.js +31 -31
  209. package/dist/resources/Tr2TexturePipelineStepPack.js +43 -43
  210. package/dist/resources/TriGeometryRes.js +239 -239
  211. package/dist/resources/TriGeometryResAreaData.js +59 -59
  212. package/dist/resources/TriGeometryResJointData.js +38 -38
  213. package/dist/resources/TriGeometryResLodData.js +88 -88
  214. package/dist/resources/TriGeometryResMeshData.js +63 -63
  215. package/dist/resources/TriGeometryResSkeletonData.js +34 -34
  216. package/dist/resources/TriGrannyRes.js +43 -43
  217. package/dist/resources/TriJointBinding.js +38 -38
  218. package/dist/resources/TriMorphTargetGeometryConstants.js +46 -46
  219. package/dist/resources/TriRtGeometryConstants.js +88 -88
  220. package/dist/resources/TriTextureRes.js +304 -304
  221. package/dist/resources/enums.js +18 -18
  222. package/dist/resources/resourceBoundary.js +47 -47
  223. package/dist/resources/texturePipelineBehavior.js +308 -308
  224. package/dist/texture/CjsTextureArrayRes.js +406 -406
  225. package/dist/texture/CjsTextureParameterProxy.js +133 -133
  226. package/docs/README.md +73 -0
  227. package/docs/architecture.md +86 -0
  228. package/docs/concepts/resource-lifecycle.md +217 -0
  229. package/docs/formats/README.md +105 -0
  230. package/docs/formats/gr2.md +161 -0
  231. package/{FORMAT-PROVENANCE.md → docs/formats/provenance.md} +173 -155
  232. package/docs/formats/stl.md +37 -0
  233. package/docs/formats/wwise.md +44 -0
  234. package/docs/reference/classes/README.md +33 -0
  235. package/docs/reference/classes/core.md +106 -0
  236. package/docs/reference/classes/dropped.md +46 -0
  237. package/docs/reference/classes/formats.md +522 -0
  238. package/docs/reference/classes/resources.md +346 -0
  239. package/docs/reference/classes/texture.md +26 -0
  240. package/docs/reference/events.md +92 -0
  241. package/docs/reference/motherlode-cache.md +244 -0
  242. package/docs/reference/queues.md +102 -0
  243. package/docs/reference/reload.md +107 -0
  244. package/docs/reference/texture-arrays.md +113 -0
  245. package/docs/reference/texture-pipeline.md +53 -0
  246. package/docs/roadmap.md +104 -0
  247. package/format-notices/black/LICENSE +21 -21
  248. package/format-notices/black/NOTICE +47 -47
  249. package/format-notices/bnk/LICENSE +21 -21
  250. package/format-notices/bnk/NOTICE +20 -20
  251. package/format-notices/cmf/LICENSE +21 -21
  252. package/format-notices/cmf/NOTICE +36 -36
  253. package/format-notices/dds/LICENSE +21 -21
  254. package/format-notices/dds/NOTICE +14 -14
  255. package/format-notices/fbx/LICENSE +21 -21
  256. package/format-notices/fbx/NOTICE +14 -14
  257. package/format-notices/flac/LICENSE +21 -21
  258. package/format-notices/flac/NOTICE +14 -14
  259. package/format-notices/gif/LICENSE +21 -21
  260. package/format-notices/gif/NOTICE +14 -14
  261. package/format-notices/gltf/LICENSE +21 -21
  262. package/format-notices/gltf/NOTICE +27 -27
  263. package/format-notices/gr2/LICENSE +21 -0
  264. package/format-notices/gr2/NOTICE +60 -0
  265. package/format-notices/gr2/THIRD-PARTY-NOTICES.md +93 -0
  266. package/format-notices/jpeg/LICENSE +21 -21
  267. package/format-notices/jpeg/NOTICE +14 -14
  268. package/format-notices/mp3/LICENSE +21 -21
  269. package/format-notices/mp3/NOTICE +14 -14
  270. package/format-notices/mp4/LICENSE +21 -21
  271. package/format-notices/mp4/NOTICE +14 -14
  272. package/format-notices/obj/LICENSE +21 -21
  273. package/format-notices/obj/NOTICE +26 -26
  274. package/format-notices/ogg/LICENSE +21 -21
  275. package/format-notices/ogg/NOTICE +28 -28
  276. package/format-notices/png/LICENSE +21 -21
  277. package/format-notices/png/NOTICE +14 -14
  278. package/format-notices/red/LICENSE +21 -21
  279. package/format-notices/red/NOTICE +31 -31
  280. package/format-notices/stl/LICENSE +21 -21
  281. package/format-notices/stl/NOTICE +21 -21
  282. package/format-notices/tga/LICENSE +21 -21
  283. package/format-notices/tga/NOTICE +14 -14
  284. package/format-notices/wav/LICENSE +21 -21
  285. package/format-notices/wav/NOTICE +14 -14
  286. package/format-notices/webm/LICENSE +21 -21
  287. package/format-notices/webm/NOTICE +14 -14
  288. package/format-notices/webp/LICENSE +21 -21
  289. package/format-notices/webp/NOTICE +14 -14
  290. package/format-notices/wem/LICENSE +57 -57
  291. package/format-notices/wem/NOTICE +33 -33
  292. package/format-notices/yaml/LICENSE +21 -21
  293. package/format-notices/yaml/NOTICE +44 -44
  294. package/package.json +52 -51
  295. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js +0 -4
  296. package/dist/formats/black/core/black-schema-v1-2026-07-11.json.js.map +0 -1
  297. package/resource-lifecycle.md +0 -679
@@ -1,305 +1,311 @@
1
- import { LineCounter, parseDocument, isMap, isSeq, isScalar, isAlias, visit } from 'yaml';
2
- import { CjsReader } from '../../../format/CjsReader.js';
3
- import { toJsonGraph, TAG_REJECT, TAG_HANDLE, TAG_PRESERVE } from './helpers.js';
4
-
5
- const TAG_PREFIX = "tag:yaml.org,2002:";
6
- const PYTHON_TUPLE = `${TAG_PREFIX}python/tuple`;
7
- const PYTHON_UNICODE = `${TAG_PREFIX}python/unicode`;
8
- const PYTHON_PROJECTED_DECAL = `${TAG_PREFIX}python/object:paperDoll.ProjectedDecal`;
9
- const PYTHON_PART_METADATA = `${TAG_PREFIX}python/object:paperDoll.AvatarPartMetaData`;
10
- const STANDARD_TAGS = new Set(["binary", "bool", "float", "int", "map", "merge", "null", "omap", "pairs", "seq", "set", "str", "timestamp"].map(name => `${TAG_PREFIX}${name}`));
11
- function canonicalTag(tag) {
12
- if (typeof tag !== "string") return tag;
13
- if (tag.startsWith("!!")) return `${TAG_PREFIX}${tag.slice(2)}`;
14
- return tag;
15
- }
16
- function displayMessage(error) {
17
- return String(error && error.message ? error.message : error).trim();
18
- }
19
- function defineMappingValue(target, key, value) {
20
- Object.defineProperty(target, key, {
21
- value,
22
- enumerable: true,
23
- configurable: true,
24
- writable: true
25
- });
26
- }
27
- class CjsYamlReader extends CjsReader {
28
- constructor(input, options = {}) {
29
- super(options);
30
- if (typeof input !== "string") {
31
- throw new TypeError("CjsYamlFormat input must be a YAML string");
32
- }
33
- this.source = input;
34
- this.lineCounter = new LineCounter();
35
- this.document = parseDocument(input, {
36
- keepSourceTokens: true,
37
- lineCounter: this.lineCounter,
38
- prettyErrors: true,
39
- strict: true,
40
- uniqueKeys: this.options.uniqueKeys
41
- });
42
- this.inventory = this.BuildInventory();
43
- }
44
- Read() {
45
- return this.ReadPayload();
46
- }
47
- ReadPayload() {
48
- return toJsonGraph(this.ReadRaw(), this.options);
49
- }
50
- ReadRaw() {
51
- this.AssertSyntax();
52
- this.AssertAliasLimit();
53
- return this.Convert(this.document.contents, new Map());
54
- }
55
- ReadDocument() {
56
- let value = null;
57
- const errors = this.inventory.errors.slice();
58
- if (!errors.length) {
59
- try {
60
- this.AssertAliasLimit();
61
- value = this.Convert(this.document.contents, new Map());
62
- } catch (error) {
63
- errors.push(this.DescribeError(error));
64
- }
65
- }
66
- return {
67
- format: {
68
- id: "yaml"
69
- },
70
- source: {
71
- name: this.options.sourceName,
72
- length: this.source.length
73
- },
74
- root: {
75
- kind: this.RootKind()
76
- },
77
- value,
78
- tags: this.inventory.tags,
79
- anchors: this.inventory.anchors,
80
- aliases: this.inventory.aliases,
81
- warnings: this.inventory.warnings,
82
- errors
83
- };
84
- }
85
- Inspect() {
86
- return {
87
- format: {
88
- id: "yaml"
89
- },
90
- source: {
91
- name: this.options.sourceName,
92
- length: this.source.length
93
- },
94
- root: {
95
- kind: this.RootKind()
96
- },
97
- tags: this.inventory.tags,
98
- anchors: this.inventory.anchors,
99
- aliases: this.inventory.aliases,
100
- warnings: this.inventory.warnings,
101
- errors: this.inventory.errors
102
- };
103
- }
104
- RootKind() {
105
- const node = this.document.contents;
106
- if (node === null) return "null";
107
- if (isMap(node)) return "mapping";
108
- if (isSeq(node)) return "sequence";
109
- if (isScalar(node)) return "scalar";
110
- if (isAlias(node)) return "alias";
111
- return "unknown";
112
- }
113
- AssertSyntax() {
114
- if (!this.document.errors.length) return;
115
- const first = this.document.errors[0];
116
- const source = this.options.sourceName ? ` in ${this.options.sourceName}` : "";
117
- throw new SyntaxError(`CjsYamlFormat${source}: ${displayMessage(first)}`);
118
- }
119
- AssertAliasLimit() {
120
- if (this.inventory.aliases.length <= this.options.maxAliasCount) return;
121
- const source = this.options.sourceName ? ` in ${this.options.sourceName}` : "";
122
- throw new RangeError(`CjsYamlFormat${source}: alias count ${this.inventory.aliases.length} exceeds maxAliasCount ${this.options.maxAliasCount}`);
123
- }
124
- Convert(node, memo) {
125
- if (node === null || node === undefined) return null;
126
- if (isAlias(node)) {
127
- const source = node.resolve(this.document);
128
- if (!source) throw this.NodeError(node, `unresolved alias "${node.source}"`);
129
- return this.Convert(source, memo);
130
- }
131
- if (memo.has(node)) return memo.get(node);
132
- const tag = this.CustomTag(node);
133
- if (tag) {
134
- this.AssertTagAllowed(tag, node);
135
- const handler = this.FindTagHandler(tag);
136
- if (handler) {
137
- const value = this.ConvertBase(node, memo, true);
138
- const handled = handler(value, this.TagContext(tag, node));
139
- memo.set(node, handled);
140
- return handled;
141
- }
142
- if (tag === PYTHON_TUPLE) {
143
- if (!isSeq(node)) throw this.NodeError(node, `${tag} must decorate a sequence`);
144
- return this.ConvertBase(node, memo, true);
145
- }
146
- if (tag === PYTHON_UNICODE) {
147
- if (!isScalar(node) || typeof node.value !== "string") {
148
- throw this.NodeError(node, `${tag} must decorate a string scalar`);
149
- }
150
- return node.value;
151
- }
152
- if (this.options.tagPolicy === TAG_REJECT) {
153
- throw this.NodeError(node, `custom tag "${tag}" is rejected by tagPolicy`);
154
- }
155
- if (this.options.tagPolicy === TAG_HANDLE) {
156
- throw this.NodeError(node, `custom tag "${tag}" has no explicit handler`);
157
- }
158
- if (this.options.tagPolicy === TAG_PRESERVE || tag === PYTHON_PROJECTED_DECAL || tag === PYTHON_PART_METADATA) {
159
- const wrapper = {
160
- [this.options.tagField]: tag
161
- };
162
- memo.set(node, wrapper);
163
- wrapper[this.options.valueField] = this.ConvertBase(node, memo, false);
164
- return wrapper;
165
- }
166
- }
167
- return this.ConvertBase(node, memo, true);
168
- }
169
- ConvertBase(node, memo, memoize) {
170
- if (isScalar(node)) return node.value;
171
- if (isSeq(node)) {
172
- const out = [];
173
- if (memoize) memo.set(node, out);
174
- for (const item of node.items) out.push(this.Convert(item, memo));
175
- return out;
176
- }
177
- if (isMap(node)) {
178
- const out = {};
179
- if (memoize) memo.set(node, out);
180
- for (const pair of node.items) {
181
- const key = this.MapKey(pair.key);
182
- if (this.options.uniqueKeys && Object.prototype.hasOwnProperty.call(out, key)) {
183
- throw this.NodeError(pair.key, `duplicate mapping key "${key}"`);
184
- }
185
- // Defining the property prevents keys such as "__proto__" from
186
- // mutating the result object's prototype.
187
- defineMappingValue(out, key, this.Convert(pair.value, memo));
188
- }
189
- return out;
190
- }
191
- throw this.NodeError(node, "unsupported YAML node");
192
- }
193
- MapKey(node) {
194
- if (!isScalar(node)) throw this.NodeError(node, "mapping keys must be scalar values");
195
- return String(node.value);
196
- }
197
- CustomTag(node) {
198
- const tag = canonicalTag(node.tag);
199
- return tag && !STANDARD_TAGS.has(tag) ? tag : null;
200
- }
201
- AssertTagAllowed(tag, node) {
202
- if (!this.options.allowedTags) return;
203
- const allowed = new Set(this.options.allowedTags.map(canonicalTag));
204
- if (!allowed.has(tag)) throw this.NodeError(node, `custom tag "${tag}" is not in allowedTags`);
205
- }
206
- FindTagHandler(tag) {
207
- const handlers = this.options.tagHandlers;
208
- const short = tag.startsWith(TAG_PREFIX) ? `!!${tag.slice(TAG_PREFIX.length)}` : tag;
209
- if (handlers instanceof Map) return handlers.get(tag) || handlers.get(short) || null;
210
- return handlers[tag] || handlers[short] || null;
211
- }
212
- TagContext(tag, node) {
213
- return {
214
- tag,
215
- sourceName: this.options.sourceName,
216
- location: this.TagLocation(node)
217
- };
218
- }
219
- NodeError(node, message) {
220
- const at = node && node.tag ? this.TagLocation(node) : this.Location(node);
221
- const source = this.options.sourceName ? `${this.options.sourceName}:` : "";
222
- const where = at ? `${source}${at.line}:${at.column}` : this.options.sourceName || "YAML input";
223
- const error = new Error(`CjsYamlFormat ${where}: ${message}`);
224
- error.code = "YAML_TAG_POLICY";
225
- error.location = at;
226
- return error;
227
- }
228
- Location(node) {
229
- if (!node || !Array.isArray(node.range)) return null;
230
- const pos = this.lineCounter.linePos(node.range[0]);
231
- return {
232
- offset: node.range[0],
233
- line: pos.line,
234
- column: pos.col
235
- };
236
- }
237
- TagLocation(node) {
238
- const fallback = this.Location(node);
239
- if (!fallback || !node.tag) return fallback;
240
- const lineStart = this.source.lastIndexOf("\n", node.range[0] - 1) + 1;
241
- const prefix = this.source.slice(lineStart, node.range[0]);
242
- const tags = [...prefix.matchAll(/!<[^>]+>|!!?[^\s[\]{},]+/g)];
243
- const match = tags[tags.length - 1];
244
- if (!match) return fallback;
245
- const offset = lineStart + match.index;
246
- const pos = this.lineCounter.linePos(offset);
247
- return {
248
- offset,
249
- line: pos.line,
250
- column: pos.col
251
- };
252
- }
253
- DescribeError(error) {
254
- const linePos = error && error.linePos && error.linePos[0];
255
- return {
256
- code: error && error.code ? error.code : "YAML_ERROR",
257
- message: displayMessage(error),
258
- location: error && error.location ? error.location : linePos ? {
259
- line: linePos.line,
260
- column: linePos.col
261
- } : null
262
- };
263
- }
264
- BuildInventory() {
265
- const tags = [];
266
- const anchors = [];
267
- const aliases = [];
268
- visit(this.document, (_key, node) => {
269
- if (!node || typeof node !== "object") return;
270
- const tag = this.CustomTag(node);
271
- const location = tag ? this.TagLocation(node) : this.Location(node);
272
- if (tag) tags.push({
273
- tag,
274
- kind: this.NodeKind(node),
275
- location
276
- });
277
- if (node.anchor) anchors.push({
278
- name: node.anchor,
279
- kind: this.NodeKind(node),
280
- location
281
- });
282
- if (isAlias(node)) aliases.push({
283
- name: node.source,
284
- location
285
- });
286
- });
287
- return {
288
- tags,
289
- anchors,
290
- aliases,
291
- warnings: this.document.warnings.map(error => this.DescribeError(error)),
292
- errors: this.document.errors.map(error => this.DescribeError(error))
293
- };
294
- }
295
- NodeKind(node) {
296
- if (isMap(node)) return "mapping";
297
- if (isSeq(node)) return "sequence";
298
- if (isScalar(node)) return "scalar";
299
- if (isAlias(node)) return "alias";
300
- return "unknown";
301
- }
302
- }
303
-
304
- export { CjsYamlReader };
305
- //# sourceMappingURL=CjsYamlReader.js.map
1
+ import { LineCounter, parseDocument, isMap, isSeq, isScalar, isAlias, visit } from 'yaml';
2
+ import { CjsReader } from '../../../format/CjsReader.js';
3
+ import { toJsonGraph, TAG_REJECT, TAG_HANDLE, TAG_PRESERVE } from './helpers.js';
4
+
5
+ const TAG_PREFIX = "tag:yaml.org,2002:";
6
+ const PYTHON_TUPLE = `${TAG_PREFIX}python/tuple`;
7
+ const PYTHON_UNICODE = `${TAG_PREFIX}python/unicode`;
8
+ const PYTHON_PROJECTED_DECAL = `${TAG_PREFIX}python/object:paperDoll.ProjectedDecal`;
9
+ const PYTHON_PART_METADATA = `${TAG_PREFIX}python/object:paperDoll.AvatarPartMetaData`;
10
+ const STANDARD_TAGS = new Set(["binary", "bool", "float", "int", "map", "merge", "null", "omap", "pairs", "seq", "set", "str", "timestamp"].map(name => `${TAG_PREFIX}${name}`));
11
+ function canonicalTag(tag) {
12
+ if (typeof tag !== "string") return tag;
13
+ if (tag.startsWith("!!")) return `${TAG_PREFIX}${tag.slice(2)}`;
14
+ return tag;
15
+ }
16
+ function displayMessage(error) {
17
+ return String(error && error.message ? error.message : error).trim();
18
+ }
19
+ function defineMappingValue(target, key, value) {
20
+ Object.defineProperty(target, key, {
21
+ value,
22
+ enumerable: true,
23
+ configurable: true,
24
+ writable: true
25
+ });
26
+ }
27
+
28
+ /**
29
+ * Construction-bound reader that parses one YAML source with the `yaml`
30
+ * library and produces the format's payload, raw, or document graphs while
31
+ * enforcing tag policy and alias limits.
32
+ */
33
+ class CjsYamlReader extends CjsReader {
34
+ constructor(input, options = {}) {
35
+ super(options);
36
+ if (typeof input !== "string") {
37
+ throw new TypeError("CjsYamlFormat input must be a YAML string");
38
+ }
39
+ this.source = input;
40
+ this.lineCounter = new LineCounter();
41
+ this.document = parseDocument(input, {
42
+ keepSourceTokens: true,
43
+ lineCounter: this.lineCounter,
44
+ prettyErrors: true,
45
+ strict: true,
46
+ uniqueKeys: this.options.uniqueKeys
47
+ });
48
+ this.inventory = this.BuildInventory();
49
+ }
50
+ Read() {
51
+ return this.ReadPayload();
52
+ }
53
+ ReadPayload() {
54
+ return toJsonGraph(this.ReadRaw(), this.options);
55
+ }
56
+ ReadRaw() {
57
+ this.AssertSyntax();
58
+ this.AssertAliasLimit();
59
+ return this.Convert(this.document.contents, new Map());
60
+ }
61
+ ReadDocument() {
62
+ let value = null;
63
+ const errors = this.inventory.errors.slice();
64
+ if (!errors.length) {
65
+ try {
66
+ this.AssertAliasLimit();
67
+ value = this.Convert(this.document.contents, new Map());
68
+ } catch (error) {
69
+ errors.push(this.DescribeError(error));
70
+ }
71
+ }
72
+ return {
73
+ format: {
74
+ id: "yaml"
75
+ },
76
+ source: {
77
+ name: this.options.sourceName,
78
+ length: this.source.length
79
+ },
80
+ root: {
81
+ kind: this.RootKind()
82
+ },
83
+ value,
84
+ tags: this.inventory.tags,
85
+ anchors: this.inventory.anchors,
86
+ aliases: this.inventory.aliases,
87
+ warnings: this.inventory.warnings,
88
+ errors
89
+ };
90
+ }
91
+ Inspect() {
92
+ return {
93
+ format: {
94
+ id: "yaml"
95
+ },
96
+ source: {
97
+ name: this.options.sourceName,
98
+ length: this.source.length
99
+ },
100
+ root: {
101
+ kind: this.RootKind()
102
+ },
103
+ tags: this.inventory.tags,
104
+ anchors: this.inventory.anchors,
105
+ aliases: this.inventory.aliases,
106
+ warnings: this.inventory.warnings,
107
+ errors: this.inventory.errors
108
+ };
109
+ }
110
+ RootKind() {
111
+ const node = this.document.contents;
112
+ if (node === null) return "null";
113
+ if (isMap(node)) return "mapping";
114
+ if (isSeq(node)) return "sequence";
115
+ if (isScalar(node)) return "scalar";
116
+ if (isAlias(node)) return "alias";
117
+ return "unknown";
118
+ }
119
+ AssertSyntax() {
120
+ if (!this.document.errors.length) return;
121
+ const first = this.document.errors[0];
122
+ const source = this.options.sourceName ? ` in ${this.options.sourceName}` : "";
123
+ throw new SyntaxError(`CjsYamlFormat${source}: ${displayMessage(first)}`);
124
+ }
125
+ AssertAliasLimit() {
126
+ if (this.inventory.aliases.length <= this.options.maxAliasCount) return;
127
+ const source = this.options.sourceName ? ` in ${this.options.sourceName}` : "";
128
+ throw new RangeError(`CjsYamlFormat${source}: alias count ${this.inventory.aliases.length} exceeds maxAliasCount ${this.options.maxAliasCount}`);
129
+ }
130
+ Convert(node, memo) {
131
+ if (node === null || node === undefined) return null;
132
+ if (isAlias(node)) {
133
+ const source = node.resolve(this.document);
134
+ if (!source) throw this.NodeError(node, `unresolved alias "${node.source}"`);
135
+ return this.Convert(source, memo);
136
+ }
137
+ if (memo.has(node)) return memo.get(node);
138
+ const tag = this.CustomTag(node);
139
+ if (tag) {
140
+ this.AssertTagAllowed(tag, node);
141
+ const handler = this.FindTagHandler(tag);
142
+ if (handler) {
143
+ const value = this.ConvertBase(node, memo, true);
144
+ const handled = handler(value, this.TagContext(tag, node));
145
+ memo.set(node, handled);
146
+ return handled;
147
+ }
148
+ if (tag === PYTHON_TUPLE) {
149
+ if (!isSeq(node)) throw this.NodeError(node, `${tag} must decorate a sequence`);
150
+ return this.ConvertBase(node, memo, true);
151
+ }
152
+ if (tag === PYTHON_UNICODE) {
153
+ if (!isScalar(node) || typeof node.value !== "string") {
154
+ throw this.NodeError(node, `${tag} must decorate a string scalar`);
155
+ }
156
+ return node.value;
157
+ }
158
+ if (this.options.tagPolicy === TAG_REJECT) {
159
+ throw this.NodeError(node, `custom tag "${tag}" is rejected by tagPolicy`);
160
+ }
161
+ if (this.options.tagPolicy === TAG_HANDLE) {
162
+ throw this.NodeError(node, `custom tag "${tag}" has no explicit handler`);
163
+ }
164
+ if (this.options.tagPolicy === TAG_PRESERVE || tag === PYTHON_PROJECTED_DECAL || tag === PYTHON_PART_METADATA) {
165
+ const wrapper = {
166
+ [this.options.tagField]: tag
167
+ };
168
+ memo.set(node, wrapper);
169
+ wrapper[this.options.valueField] = this.ConvertBase(node, memo, false);
170
+ return wrapper;
171
+ }
172
+ }
173
+ return this.ConvertBase(node, memo, true);
174
+ }
175
+ ConvertBase(node, memo, memoize) {
176
+ if (isScalar(node)) return node.value;
177
+ if (isSeq(node)) {
178
+ const out = [];
179
+ if (memoize) memo.set(node, out);
180
+ for (const item of node.items) out.push(this.Convert(item, memo));
181
+ return out;
182
+ }
183
+ if (isMap(node)) {
184
+ const out = {};
185
+ if (memoize) memo.set(node, out);
186
+ for (const pair of node.items) {
187
+ const key = this.MapKey(pair.key);
188
+ if (this.options.uniqueKeys && Object.prototype.hasOwnProperty.call(out, key)) {
189
+ throw this.NodeError(pair.key, `duplicate mapping key "${key}"`);
190
+ }
191
+ // Defining the property prevents keys such as "__proto__" from
192
+ // mutating the result object's prototype.
193
+ defineMappingValue(out, key, this.Convert(pair.value, memo));
194
+ }
195
+ return out;
196
+ }
197
+ throw this.NodeError(node, "unsupported YAML node");
198
+ }
199
+ MapKey(node) {
200
+ if (!isScalar(node)) throw this.NodeError(node, "mapping keys must be scalar values");
201
+ return String(node.value);
202
+ }
203
+ CustomTag(node) {
204
+ const tag = canonicalTag(node.tag);
205
+ return tag && !STANDARD_TAGS.has(tag) ? tag : null;
206
+ }
207
+ AssertTagAllowed(tag, node) {
208
+ if (!this.options.allowedTags) return;
209
+ const allowed = new Set(this.options.allowedTags.map(canonicalTag));
210
+ if (!allowed.has(tag)) throw this.NodeError(node, `custom tag "${tag}" is not in allowedTags`);
211
+ }
212
+ FindTagHandler(tag) {
213
+ const handlers = this.options.tagHandlers;
214
+ const short = tag.startsWith(TAG_PREFIX) ? `!!${tag.slice(TAG_PREFIX.length)}` : tag;
215
+ if (handlers instanceof Map) return handlers.get(tag) || handlers.get(short) || null;
216
+ return handlers[tag] || handlers[short] || null;
217
+ }
218
+ TagContext(tag, node) {
219
+ return {
220
+ tag,
221
+ sourceName: this.options.sourceName,
222
+ location: this.TagLocation(node)
223
+ };
224
+ }
225
+ NodeError(node, message) {
226
+ const at = node && node.tag ? this.TagLocation(node) : this.Location(node);
227
+ const source = this.options.sourceName ? `${this.options.sourceName}:` : "";
228
+ const where = at ? `${source}${at.line}:${at.column}` : this.options.sourceName || "YAML input";
229
+ const error = new Error(`CjsYamlFormat ${where}: ${message}`);
230
+ error.code = "YAML_TAG_POLICY";
231
+ error.location = at;
232
+ return error;
233
+ }
234
+ Location(node) {
235
+ if (!node || !Array.isArray(node.range)) return null;
236
+ const pos = this.lineCounter.linePos(node.range[0]);
237
+ return {
238
+ offset: node.range[0],
239
+ line: pos.line,
240
+ column: pos.col
241
+ };
242
+ }
243
+ TagLocation(node) {
244
+ const fallback = this.Location(node);
245
+ if (!fallback || !node.tag) return fallback;
246
+ const lineStart = this.source.lastIndexOf("\n", node.range[0] - 1) + 1;
247
+ const prefix = this.source.slice(lineStart, node.range[0]);
248
+ const tags = [...prefix.matchAll(/!<[^>]+>|!!?[^\s[\]{},]+/g)];
249
+ const match = tags[tags.length - 1];
250
+ if (!match) return fallback;
251
+ const offset = lineStart + match.index;
252
+ const pos = this.lineCounter.linePos(offset);
253
+ return {
254
+ offset,
255
+ line: pos.line,
256
+ column: pos.col
257
+ };
258
+ }
259
+ DescribeError(error) {
260
+ const linePos = error && error.linePos && error.linePos[0];
261
+ return {
262
+ code: error && error.code ? error.code : "YAML_ERROR",
263
+ message: displayMessage(error),
264
+ location: error && error.location ? error.location : linePos ? {
265
+ line: linePos.line,
266
+ column: linePos.col
267
+ } : null
268
+ };
269
+ }
270
+ BuildInventory() {
271
+ const tags = [];
272
+ const anchors = [];
273
+ const aliases = [];
274
+ visit(this.document, (_key, node) => {
275
+ if (!node || typeof node !== "object") return;
276
+ const tag = this.CustomTag(node);
277
+ const location = tag ? this.TagLocation(node) : this.Location(node);
278
+ if (tag) tags.push({
279
+ tag,
280
+ kind: this.NodeKind(node),
281
+ location
282
+ });
283
+ if (node.anchor) anchors.push({
284
+ name: node.anchor,
285
+ kind: this.NodeKind(node),
286
+ location
287
+ });
288
+ if (isAlias(node)) aliases.push({
289
+ name: node.source,
290
+ location
291
+ });
292
+ });
293
+ return {
294
+ tags,
295
+ anchors,
296
+ aliases,
297
+ warnings: this.document.warnings.map(error => this.DescribeError(error)),
298
+ errors: this.document.errors.map(error => this.DescribeError(error))
299
+ };
300
+ }
301
+ NodeKind(node) {
302
+ if (isMap(node)) return "mapping";
303
+ if (isSeq(node)) return "sequence";
304
+ if (isScalar(node)) return "scalar";
305
+ if (isAlias(node)) return "alias";
306
+ return "unknown";
307
+ }
308
+ }
309
+
310
+ export { CjsYamlReader };
311
+ //# sourceMappingURL=CjsYamlReader.js.map