minecraft-renderer 0.1.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 (187) hide show
  1. package/README.md +297 -0
  2. package/dist/index.html +83 -0
  3. package/dist/static/image/arrow.6f27b59f.png +0 -0
  4. package/dist/static/image/blocksAtlasLatest.7850afa3.png +0 -0
  5. package/dist/static/image/blocksAtlasLegacy.5c76823d.png +0 -0
  6. package/dist/static/image/itemsAtlasLatest.36036f95.png +0 -0
  7. package/dist/static/image/itemsAtlasLegacy.dcb1b58d.png +0 -0
  8. package/dist/static/image/tipped_arrow.6f27b59f.png +0 -0
  9. package/dist/static/js/365.f05233ab.js +8462 -0
  10. package/dist/static/js/365.f05233ab.js.LICENSE.txt +52 -0
  11. package/dist/static/js/async/738.efa27644.js +1 -0
  12. package/dist/static/js/index.092ec5be.js +56 -0
  13. package/dist/static/js/lib-polyfill.98986ac5.js +1 -0
  14. package/dist/static/js/lib-react.5c9129e0.js +2 -0
  15. package/dist/static/js/lib-react.5c9129e0.js.LICENSE.txt +39 -0
  16. package/package.json +104 -0
  17. package/src/assets/destroy_stage_0.png +0 -0
  18. package/src/assets/destroy_stage_1.png +0 -0
  19. package/src/assets/destroy_stage_2.png +0 -0
  20. package/src/assets/destroy_stage_3.png +0 -0
  21. package/src/assets/destroy_stage_4.png +0 -0
  22. package/src/assets/destroy_stage_5.png +0 -0
  23. package/src/assets/destroy_stage_6.png +0 -0
  24. package/src/assets/destroy_stage_7.png +0 -0
  25. package/src/assets/destroy_stage_8.png +0 -0
  26. package/src/assets/destroy_stage_9.png +0 -0
  27. package/src/examples/README.md +146 -0
  28. package/src/examples/appViewerExample.ts +205 -0
  29. package/src/examples/initialMenuStart.ts +161 -0
  30. package/src/graphicsBackend/appViewer.ts +297 -0
  31. package/src/graphicsBackend/config.ts +119 -0
  32. package/src/graphicsBackend/index.ts +10 -0
  33. package/src/graphicsBackend/playerState.ts +61 -0
  34. package/src/graphicsBackend/types.ts +143 -0
  35. package/src/index.ts +97 -0
  36. package/src/lib/DebugGui.ts +190 -0
  37. package/src/lib/animationController.ts +85 -0
  38. package/src/lib/buildSharedConfig.mjs +1 -0
  39. package/src/lib/cameraBobbing.ts +94 -0
  40. package/src/lib/canvas2DOverlay.example.ts +361 -0
  41. package/src/lib/canvas2DOverlay.quickstart.ts +242 -0
  42. package/src/lib/canvas2DOverlay.ts +381 -0
  43. package/src/lib/cleanupDecorator.ts +29 -0
  44. package/src/lib/createPlayerObject.ts +55 -0
  45. package/src/lib/frameTimingCollector.ts +164 -0
  46. package/src/lib/guiRenderer.ts +283 -0
  47. package/src/lib/items.ts +140 -0
  48. package/src/lib/mesherlogReader.ts +131 -0
  49. package/src/lib/moreBlockDataGenerated.json +714 -0
  50. package/src/lib/preflatMap.json +1741 -0
  51. package/src/lib/simpleUtils.ts +40 -0
  52. package/src/lib/smoothSwitcher.ts +168 -0
  53. package/src/lib/spiral.ts +29 -0
  54. package/src/lib/ui/newStats.ts +120 -0
  55. package/src/lib/utils/proxy.ts +23 -0
  56. package/src/lib/utils/skins.ts +63 -0
  57. package/src/lib/utils.ts +76 -0
  58. package/src/lib/workerProxy.ts +342 -0
  59. package/src/lib/worldrendererCommon.ts +1088 -0
  60. package/src/mesher/mesher.ts +253 -0
  61. package/src/mesher/models.ts +769 -0
  62. package/src/mesher/modelsGeometryCommon.ts +142 -0
  63. package/src/mesher/shared.ts +80 -0
  64. package/src/mesher/standaloneRenderer.ts +270 -0
  65. package/src/mesher/test/a.ts +3 -0
  66. package/src/mesher/test/mesherTester.ts +76 -0
  67. package/src/mesher/test/playground.ts +19 -0
  68. package/src/mesher/test/test-perf.ts +74 -0
  69. package/src/mesher/test/tests.test.ts +56 -0
  70. package/src/mesher/world.ts +294 -0
  71. package/src/mesher/worldConstants.ts +1 -0
  72. package/src/modules/index.ts +11 -0
  73. package/src/modules/starfield.ts +313 -0
  74. package/src/modules/types.ts +110 -0
  75. package/src/playerState/playerState.ts +78 -0
  76. package/src/playerState/types.ts +36 -0
  77. package/src/playground/allEntitiesDebug.ts +170 -0
  78. package/src/playground/baseScene.ts +587 -0
  79. package/src/playground/mobileControls.tsx +268 -0
  80. package/src/playground/playground.html +83 -0
  81. package/src/playground/playground.ts +11 -0
  82. package/src/playground/playgroundUi.tsx +140 -0
  83. package/src/playground/reactUtils.ts +71 -0
  84. package/src/playground/scenes/allEntities.ts +13 -0
  85. package/src/playground/scenes/entities.ts +37 -0
  86. package/src/playground/scenes/floorRandom.ts +33 -0
  87. package/src/playground/scenes/frequentUpdates.ts +148 -0
  88. package/src/playground/scenes/geometryExport.ts +142 -0
  89. package/src/playground/scenes/index.ts +12 -0
  90. package/src/playground/scenes/lightingStarfield.ts +40 -0
  91. package/src/playground/scenes/main.ts +313 -0
  92. package/src/playground/scenes/railsCobweb.ts +14 -0
  93. package/src/playground/scenes/rotationIssue.ts +7 -0
  94. package/src/playground/scenes/slabsOptimization.ts +16 -0
  95. package/src/playground/scenes/transparencyIssue.ts +11 -0
  96. package/src/playground/shared.ts +79 -0
  97. package/src/resourcesManager/index.ts +5 -0
  98. package/src/resourcesManager/resourcesManager.ts +314 -0
  99. package/src/shims/minecraftData.ts +41 -0
  100. package/src/sign-renderer/index.html +21 -0
  101. package/src/sign-renderer/index.ts +216 -0
  102. package/src/sign-renderer/noop.js +1 -0
  103. package/src/sign-renderer/playground.ts +38 -0
  104. package/src/sign-renderer/tests.test.ts +69 -0
  105. package/src/sign-renderer/vite.config.ts +10 -0
  106. package/src/three/appShared.ts +75 -0
  107. package/src/three/bannerRenderer.ts +275 -0
  108. package/src/three/cameraShake.ts +120 -0
  109. package/src/three/cinimaticScript.ts +350 -0
  110. package/src/three/documentRenderer.ts +491 -0
  111. package/src/three/entities.ts +1580 -0
  112. package/src/three/entity/EntityMesh.ts +707 -0
  113. package/src/three/entity/animations.js +171 -0
  114. package/src/three/entity/armorModels.json +204 -0
  115. package/src/three/entity/armorModels.ts +36 -0
  116. package/src/three/entity/entities.json +6230 -0
  117. package/src/three/entity/exportedModels.js +38 -0
  118. package/src/three/entity/externalTextures.json +1 -0
  119. package/src/three/entity/models/allay.obj +325 -0
  120. package/src/three/entity/models/arrow.obj +60 -0
  121. package/src/three/entity/models/axolotl.obj +509 -0
  122. package/src/three/entity/models/blaze.obj +601 -0
  123. package/src/three/entity/models/boat.obj +417 -0
  124. package/src/three/entity/models/camel.obj +1061 -0
  125. package/src/three/entity/models/cat.obj +509 -0
  126. package/src/three/entity/models/chicken.obj +371 -0
  127. package/src/three/entity/models/cod.obj +371 -0
  128. package/src/three/entity/models/creeper.obj +279 -0
  129. package/src/three/entity/models/dolphin.obj +371 -0
  130. package/src/three/entity/models/ender_dragon.obj +2993 -0
  131. package/src/three/entity/models/enderman.obj +325 -0
  132. package/src/three/entity/models/endermite.obj +187 -0
  133. package/src/three/entity/models/fox.obj +463 -0
  134. package/src/three/entity/models/frog.obj +739 -0
  135. package/src/three/entity/models/ghast.obj +463 -0
  136. package/src/three/entity/models/goat.obj +601 -0
  137. package/src/three/entity/models/guardian.obj +1015 -0
  138. package/src/three/entity/models/horse.obj +1061 -0
  139. package/src/three/entity/models/llama.obj +509 -0
  140. package/src/three/entity/models/minecart.obj +233 -0
  141. package/src/three/entity/models/parrot.obj +509 -0
  142. package/src/three/entity/models/piglin.obj +739 -0
  143. package/src/three/entity/models/pillager.obj +371 -0
  144. package/src/three/entity/models/rabbit.obj +555 -0
  145. package/src/three/entity/models/sheep.obj +555 -0
  146. package/src/three/entity/models/shulker.obj +141 -0
  147. package/src/three/entity/models/sniffer.obj +693 -0
  148. package/src/three/entity/models/spider.obj +509 -0
  149. package/src/three/entity/models/tadpole.obj +95 -0
  150. package/src/three/entity/models/turtle.obj +371 -0
  151. package/src/three/entity/models/vex.obj +325 -0
  152. package/src/three/entity/models/villager.obj +509 -0
  153. package/src/three/entity/models/warden.obj +463 -0
  154. package/src/three/entity/models/witch.obj +647 -0
  155. package/src/three/entity/models/wolf.obj +509 -0
  156. package/src/three/entity/models/zombie_villager.obj +463 -0
  157. package/src/three/entity/objModels.js +1 -0
  158. package/src/three/fireworks.ts +661 -0
  159. package/src/three/fireworksRenderer.ts +434 -0
  160. package/src/three/globals.d.ts +7 -0
  161. package/src/three/graphicsBackend.ts +274 -0
  162. package/src/three/graphicsBackendOffThread.ts +107 -0
  163. package/src/three/hand.ts +89 -0
  164. package/src/three/holdingBlock.ts +926 -0
  165. package/src/three/index.ts +20 -0
  166. package/src/three/itemMesh.ts +427 -0
  167. package/src/three/modules.d.ts +14 -0
  168. package/src/three/panorama.ts +308 -0
  169. package/src/three/panoramaShared.ts +1 -0
  170. package/src/three/renderSlot.ts +82 -0
  171. package/src/three/skyboxRenderer.ts +406 -0
  172. package/src/three/starField.ts +13 -0
  173. package/src/three/threeJsMedia.ts +731 -0
  174. package/src/three/threeJsMethods.ts +15 -0
  175. package/src/three/threeJsParticles.ts +160 -0
  176. package/src/three/threeJsSound.ts +95 -0
  177. package/src/three/threeJsUtils.ts +90 -0
  178. package/src/three/waypointSprite.ts +435 -0
  179. package/src/three/waypoints.ts +163 -0
  180. package/src/three/world/cursorBlock.ts +172 -0
  181. package/src/three/world/vr.ts +257 -0
  182. package/src/three/worldGeometryExport.ts +259 -0
  183. package/src/three/worldGeometryHandler.ts +279 -0
  184. package/src/three/worldRendererThree.ts +1381 -0
  185. package/src/worldView/index.ts +6 -0
  186. package/src/worldView/types.ts +66 -0
  187. package/src/worldView/worldView.ts +424 -0
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Renderer Module System Types
3
+ *
4
+ * Modules are self-contained renderer extensions that can be enabled/disabled
5
+ * and configured through a standardized interface.
6
+ */
7
+
8
+ import * as THREE from 'three'
9
+
10
+ /**
11
+ * Setting value types supported by modules.
12
+ */
13
+ export type SettingValue = boolean | number | string | number[]
14
+
15
+ /**
16
+ * Setting definition for a module.
17
+ */
18
+ export interface ModuleSetting<T extends SettingValue = SettingValue> {
19
+ /** Default value for the setting */
20
+ default: T
21
+ /** Human-readable label for UI */
22
+ label?: string
23
+ /** Description of the setting */
24
+ description?: string
25
+ /** Minimum value (for number settings) */
26
+ min?: number
27
+ /** Maximum value (for number settings) */
28
+ max?: number
29
+ /** Step value (for number settings) */
30
+ step?: number
31
+ /** Available options (for string settings) */
32
+ options?: string[]
33
+ }
34
+
35
+ /**
36
+ * Module settings schema.
37
+ */
38
+ export type ModuleSettingsSchema = Record<string, ModuleSetting>
39
+
40
+ /**
41
+ * Infer settings object type from schema.
42
+ */
43
+ export type InferSettings<T extends ModuleSettingsSchema> = {
44
+ [K in keyof T]: T[K]['default']
45
+ }
46
+
47
+ /**
48
+ * Module manifest - describes a renderer module's identity and configuration.
49
+ */
50
+ export interface ModuleManifest<TSettings extends ModuleSettingsSchema = ModuleSettingsSchema> {
51
+ /** Unique identifier for the module */
52
+ id: string
53
+ /** Human-readable name */
54
+ name: string
55
+ /** Brief description */
56
+ description?: string
57
+ /** Module version */
58
+ version?: string
59
+ /** Settings schema for this module */
60
+ settings: TSettings
61
+ }
62
+
63
+ /**
64
+ * Module context provided to modules during initialization.
65
+ */
66
+ export interface ModuleContext {
67
+ /** The Three.js scene */
68
+ scene: THREE.Scene
69
+ /** Get the current camera position */
70
+ getCameraPosition: () => THREE.Vector3
71
+ /** Register a callback to be called each frame */
72
+ onRender: (callback: () => void) => void
73
+ /** Unregister a render callback */
74
+ offRender: (callback: () => void) => void
75
+ }
76
+
77
+ /**
78
+ * Base interface for renderer modules.
79
+ */
80
+ export interface RendererModule<TSettings extends ModuleSettingsSchema = ModuleSettingsSchema> {
81
+ /** Module manifest */
82
+ readonly manifest: ModuleManifest<TSettings>
83
+
84
+ /** Current settings values */
85
+ readonly settings: InferSettings<TSettings>
86
+
87
+ /** Whether the module is currently enabled */
88
+ enabled: boolean
89
+
90
+ /** Initialize the module with context */
91
+ init(context: ModuleContext): void
92
+
93
+ /** Update a setting value */
94
+ setSetting<K extends keyof TSettings>(key: K, value: TSettings[K]['default']): void
95
+
96
+ /** Called when module is enabled */
97
+ onEnable?(): void
98
+
99
+ /** Called when module is disabled */
100
+ onDisable?(): void
101
+
102
+ /** Cleanup and dispose resources */
103
+ dispose(): void
104
+ }
105
+
106
+ /**
107
+ * Module factory function type.
108
+ */
109
+ export type ModuleFactory<TSettings extends ModuleSettingsSchema = ModuleSettingsSchema> =
110
+ () => RendererModule<TSettings>
@@ -0,0 +1,78 @@
1
+ import { proxy } from 'valtio'
2
+ import type { GameMode, HandItemBlock, BlocksShapes, BlockShape, MovementState, CameraPerspective, Team, ItemSpecificContextProperties } from './types'
3
+
4
+ // edit src/mineflayer/playerState.ts for implementation of player state from mineflayer
5
+ export const getInitialPlayerState = () => proxy({
6
+ playerSkin: undefined as string | undefined,
7
+ inWater: false,
8
+ waterBreathing: false,
9
+ backgroundColor: [0, 0, 0] as [number, number, number],
10
+ ambientLight: 0,
11
+ directionalLight: 0,
12
+ eyeHeight: 0,
13
+ gameMode: undefined as GameMode | undefined,
14
+ lookingAtBlock: undefined as {
15
+ x: number
16
+ y: number
17
+ z: number
18
+ face?: number
19
+ shapes: BlocksShapes
20
+ } | undefined,
21
+ diggingBlock: undefined as {
22
+ x: number
23
+ y: number
24
+ z: number
25
+ stage: number
26
+ face?: number
27
+ mergedShape: BlockShape | undefined
28
+ } | undefined,
29
+ movementState: 'NOT_MOVING' as MovementState,
30
+ onGround: true,
31
+ sneaking: false,
32
+ flying: false,
33
+ sprinting: false,
34
+ itemUsageTicks: 0,
35
+ username: '',
36
+ onlineMode: false,
37
+ lightingDisabled: false,
38
+ shouldHideHand: false,
39
+ heldItemMain: undefined as HandItemBlock | undefined,
40
+ heldItemOff: undefined as HandItemBlock | undefined,
41
+ perspective: 'first_person' as CameraPerspective,
42
+ onFire: false,
43
+
44
+ cameraSpectatingEntity: undefined as number | undefined,
45
+
46
+ team: undefined as Team | undefined,
47
+ })
48
+
49
+ export const getPlayerStateUtils = (reactive: PlayerStateReactive) => ({
50
+ isSpectator() {
51
+ return reactive.gameMode === 'spectator'
52
+ },
53
+ isSpectatingEntity() {
54
+ return reactive.cameraSpectatingEntity !== undefined && reactive.gameMode === 'spectator'
55
+ },
56
+ isThirdPerson() {
57
+ if ((this as PlayerStateUtils).isSpectatingEntity()) return false
58
+ return reactive.perspective === 'third_person_back' || reactive.perspective === 'third_person_front'
59
+ }
60
+ })
61
+
62
+ export const getInitialPlayerStateRenderer = () => ({
63
+ reactive: getInitialPlayerState()
64
+ })
65
+
66
+ export type PlayerStateReactive = ReturnType<typeof getInitialPlayerState>
67
+ export type PlayerStateUtils = ReturnType<typeof getPlayerStateUtils>
68
+
69
+ export type PlayerStateRenderer = PlayerStateReactive
70
+
71
+ export const getItemSelector = (playerState: PlayerStateRenderer, specificProperties: ItemSpecificContextProperties, item?: import('prismarine-item').Item) => {
72
+ return {
73
+ ...specificProperties,
74
+ 'minecraft:date': new Date(),
75
+ // "minecraft:context_dimension": bot.entityp,
76
+ // 'minecraft:time': bot.time.timeOfDay / 24_000,
77
+ }
78
+ }
@@ -0,0 +1,36 @@
1
+ import { ItemSelector } from 'mc-assets/dist/itemDefinitions'
2
+
3
+ export type GameMode = 'survival' | 'creative' | 'adventure' | 'spectator'
4
+
5
+ export interface Team {
6
+ team?: any
7
+ id: string
8
+ name: string
9
+ color: string
10
+ prefix: string
11
+ suffix: string
12
+ players: string[]
13
+ }
14
+
15
+ export interface HandItemBlock {
16
+ name?: string
17
+ properties?: Record<string, any>
18
+ fullItem?: any
19
+ type: 'block' | 'item' | 'hand'
20
+ id?: number
21
+ }
22
+
23
+ export type MovementState = 'NOT_MOVING' | 'WALKING' | 'SPRINTING' | 'SNEAKING'
24
+ export type ItemSpecificContextProperties = Partial<
25
+ Pick<
26
+ ItemSelector['properties'],
27
+ | 'minecraft:using_item'
28
+ | 'minecraft:use_duration'
29
+ | 'minecraft:use_cycle'
30
+ | 'minecraft:display_context'
31
+ >
32
+ >
33
+ export type CameraPerspective = 'first_person' | 'third_person_back' | 'third_person_front'
34
+
35
+ export type BlockShape = { position: { x: number, y: number, z: number }; width: number; height: number; depth: number; }
36
+ export type BlocksShapes = BlockShape[]
@@ -0,0 +1,170 @@
1
+ import { EntityMesh, rendererSpecialHandled, EntityDebugFlags } from '@/three/entity/EntityMesh'
2
+
3
+ export const displayEntitiesDebugList = (version: string) => {
4
+ // Create results container
5
+ const container = document.createElement('div')
6
+ container.style.cssText = `
7
+ position: fixed;
8
+ top: 50%;
9
+ left: 50%;
10
+ transform: translate(-50%, -50%);
11
+ max-height: 90vh;
12
+ overflow-y: auto;
13
+ background: rgba(0,0,0,0.8);
14
+ color: white;
15
+ padding: 20px;
16
+ border-radius: 8px;
17
+ font-family: monospace;
18
+ min-width: 400px;
19
+ z-index: 1000;
20
+ `
21
+ document.body.appendChild(container)
22
+
23
+ // Add title
24
+ const title = document.createElement('h2')
25
+ title.textContent = 'Minecraft Entity Support'
26
+ title.style.cssText = 'margin-top: 0; text-align: center;'
27
+ container.appendChild(title)
28
+
29
+ // Test entities
30
+ const results: Array<{
31
+ entity: string;
32
+ supported: boolean;
33
+ type?: 'obj' | 'bedrock' | 'special';
34
+ mappedFrom?: string;
35
+ textureMap?: boolean;
36
+ errors?: string[];
37
+ }> = []
38
+ const { mcData } = window
39
+ const entityNames = Object.keys(mcData.entitiesArray.reduce((acc, entity) => {
40
+ acc[entity.name] = true
41
+ return acc
42
+ }, {}))
43
+
44
+ // Add loading indicator
45
+ const loading = document.createElement('div')
46
+ loading.textContent = 'Testing entities...'
47
+ loading.style.textAlign = 'center'
48
+ container.appendChild(loading)
49
+
50
+ for (const entity of entityNames) {
51
+ const debugFlags: EntityDebugFlags = {}
52
+
53
+ if (rendererSpecialHandled.includes(entity)) {
54
+ results.push({
55
+ entity,
56
+ supported: true,
57
+ type: 'special',
58
+ })
59
+ continue
60
+ }
61
+
62
+ try {
63
+
64
+ const { mesh: entityMesh } = new EntityMesh(version, entity, undefined, {}, debugFlags)
65
+ // find the most distant pos child
66
+ window.objects ??= {}
67
+ window.objects[entity] = entityMesh
68
+
69
+ results.push({
70
+ entity,
71
+ supported: !!debugFlags.type || rendererSpecialHandled.includes(entity),
72
+ type: debugFlags.type,
73
+ mappedFrom: debugFlags.tempMap,
74
+ textureMap: debugFlags.textureMap,
75
+ errors: debugFlags.errors
76
+ })
77
+ } catch (e) {
78
+ console.error(e)
79
+ results.push({
80
+ entity,
81
+ supported: false,
82
+ mappedFrom: debugFlags.tempMap
83
+ })
84
+ }
85
+ }
86
+
87
+ // Remove loading indicator
88
+ loading.remove()
89
+
90
+ const createSection = (title: string, items: any[], filter: (item: any) => boolean) => {
91
+ const section = document.createElement('div')
92
+ section.style.marginBottom = '20px'
93
+
94
+ const sectionTitle = document.createElement('h3')
95
+ sectionTitle.textContent = title
96
+ sectionTitle.style.textAlign = 'center'
97
+ section.appendChild(sectionTitle)
98
+
99
+ const list = document.createElement('ul')
100
+ list.style.cssText = 'padding-left: 20px; list-style-type: none; margin: 0;'
101
+
102
+ const filteredItems = items.filter(filter)
103
+ for (const item of filteredItems) {
104
+ const listItem = document.createElement('li')
105
+ listItem.style.cssText = 'line-height: 1.4; margin: 8px 0;'
106
+
107
+ const entityName = document.createElement('strong')
108
+ entityName.style.cssText = 'user-select: text;-webkit-user-select: text;'
109
+ entityName.textContent = item.entity
110
+ listItem.appendChild(entityName)
111
+
112
+ let text = ''
113
+ if (item.mappedFrom) {
114
+ text += ` -> ${item.mappedFrom}`
115
+ }
116
+ if (item.type) {
117
+ text += ` - ${item.type}`
118
+ }
119
+ if (item.textureMap) {
120
+ text += ' ⚠️'
121
+ }
122
+ if (item.errors) {
123
+ text += ' ❌'
124
+ }
125
+
126
+ listItem.appendChild(document.createTextNode(text))
127
+ list.appendChild(listItem)
128
+ }
129
+
130
+ section.appendChild(list)
131
+ return { section, count: filteredItems.length }
132
+ }
133
+
134
+ // Sort results - bedrock first
135
+ results.sort((a, b) => {
136
+ if (a.type === 'bedrock' && b.type !== 'bedrock') return -1
137
+ if (a.type !== 'bedrock' && b.type === 'bedrock') return 1
138
+ return a.entity.localeCompare(b.entity)
139
+ })
140
+
141
+ // Add sections
142
+ const sections = [
143
+ {
144
+ title: '❌ Unsupported Entities',
145
+ filter: (r: any) => !r.supported && !r.mappedFrom
146
+ },
147
+ {
148
+ title: '⚠️ Partially Supported Entities',
149
+ filter: (r: any) => r.mappedFrom
150
+ },
151
+ {
152
+ title: '✅ Supported Entities',
153
+ filter: (r: any) => r.supported && !r.mappedFrom
154
+ }
155
+ ]
156
+
157
+ for (const { title, filter } of sections) {
158
+ const { section, count } = createSection(title, results, filter)
159
+ if (count > 0) {
160
+ container.appendChild(section)
161
+ }
162
+ }
163
+
164
+ // log object with errors per entity
165
+ const errors = results.filter(r => r.errors).map(r => ({
166
+ entity: r.entity,
167
+ errors: r.errors
168
+ }))
169
+ console.log(errors)
170
+ }