alvarosabu 1 год назад
Родитель
Сommit
272441c249
36 измененных файлов с 712 добавлено и 384 удалено
  1. 0 6
      .eslintrc.json
  2. 0 4
      docs/.eslintrc.json
  3. 3 0
      docs/eslint.config.js
  4. 4 0
      eslint.config.js
  5. 7 6
      package.json
  6. 0 7
      playground/.eslintrc.json
  7. 3 0
      playground/eslint.config.js
  8. 1 1
      playground/index.html
  9. 3 1
      playground/package.json
  10. 0 1
      playground/src/App.vue
  11. 9 12
      playground/src/components/LocalOrbitControls.vue
  12. 4 3
      playground/src/components/MultipleCanvas.vue
  13. 0 2
      playground/src/components/TestSphere.vue
  14. 3 2
      playground/src/components/TheCameraOperator.vue
  15. 2 1
      playground/src/components/TheExperience.vue
  16. 5 3
      playground/src/pages/TheBasic.vue
  17. 1 1
      playground/src/pages/TheGroups.vue
  18. 2 1
      playground/src/pages/cameras/Cameras.vue
  19. 1 1
      playground/src/pages/cameras/MultipleCameras.vue
  20. 1 1
      playground/src/pages/cameras/NoCamera.vue
  21. 2 1
      playground/src/pages/click-blocking-box.vue
  22. 2 2
      playground/src/pages/empty.vue
  23. 5 5
      playground/src/pages/lights.vue
  24. 2 2
      playground/src/pages/misc/GUI.vue
  25. 2 2
      playground/src/pages/misc/Text3DDemo.vue
  26. 1 1
      playground/src/pages/misc/TheParticles.vue
  27. 4 4
      playground/src/pages/perf/AkuAku.vue
  28. 8 8
      playground/src/pages/perf/index.vue
  29. 3 2
      playground/src/pages/raycaster/TheEvents.vue
  30. 1 1
      playground/src/router.ts
  31. 11 11
      playground/tsconfig.json
  32. 0 49
      playground/vite.config.ts.timestamp-1706539768400-58c91108b32e6.mjs
  33. 561 170
      pnpm-lock.yaml
  34. 17 19
      src/components/TresCanvas.vue
  35. 32 42
      src/core/nodeOps.ts
  36. 12 12
      tsconfig.json

+ 0 - 6
.eslintrc.json

@@ -1,6 +0,0 @@
-{
-  "extends": "@tresjs/eslint-config-vue",
-  "rules": {
-    "@typescript-eslint/no-use-before-define": "off"
-  }
-}

+ 0 - 4
docs/.eslintrc.json

@@ -1,4 +0,0 @@
-{
-  "extends": "@tresjs/eslint-config-vue"
-}
-  

+ 3 - 0
docs/eslint.config.js

@@ -0,0 +1,3 @@
+import { tresLintConfig } from '@tresjs/eslint-config'
+
+export default tresLintConfig()

+ 4 - 0
eslint.config.js

@@ -0,0 +1,4 @@
+import { tresLintConfig } from '@tresjs/eslint-config'
+
+export default tresLintConfig({
+})

+ 7 - 6
package.json

@@ -17,8 +17,8 @@
   "exports": {
     ".": {
       "types": "./dist/index.d.ts",
-      "require": "./dist/tres.umd.cjs",
-      "import": "./dist/tres.js"
+      "import": "./dist/tres.js",
+      "require": "./dist/tres.umd.cjs"
     },
     "./components": {
       "types": "./dist/components/index.d.ts"
@@ -38,8 +38,8 @@
   "module": "./dist/tres.js",
   "types": "./dist/index.d.ts",
   "files": [
-    "dist",
-    "*.d.ts"
+    "*.d.ts",
+    "dist"
   ],
   "publishConfig": {
     "access": "public"
@@ -53,7 +53,8 @@
     "test:ui": "vitest --ui",
     "release": "release-it",
     "coverage": "vitest run --coverage",
-    "lint": "eslint . --ext .js,.jsx,.ts,.tsx,.vue",
+    "lint": "eslint .",
+    "lint:fix": "eslint . --fix",
     "docs:dev": "vitepress dev docs",
     "docs:build": "vitepress build docs",
     "docs:serve": "vitepress serve docs",
@@ -72,7 +73,7 @@
     "@release-it/conventional-changelog": "^8.0.1",
     "@stackblitz/sdk": "^1.9.0",
     "@tresjs/cientos": "3.6.0",
-    "@tresjs/eslint-config-vue": "^0.2.1",
+    "@tresjs/eslint-config": "^1.0.0",
     "@types/three": "^0.159.0",
     "@typescript-eslint/eslint-plugin": "^6.14.0",
     "@typescript-eslint/parser": "^6.14.0",

+ 0 - 7
playground/.eslintrc.json

@@ -1,7 +0,0 @@
-{
-  "extends": "@tresjs/eslint-config-vue",
-  "rules": {
-    "no-console": "off"
-  }
-}
-  

+ 3 - 0
playground/eslint.config.js

@@ -0,0 +1,3 @@
+import { tresLintConfig } from '@tresjs/eslint-config'
+
+export default tresLintConfig()

+ 1 - 1
playground/index.html

@@ -1,4 +1,4 @@
-<!DOCTYPE html>
+<!doctype html>
 <html lang="en">
   <head>
     <meta charset="UTF-8" />

+ 3 - 1
playground/package.json

@@ -6,7 +6,9 @@
   "scripts": {
     "dev": "vite --host",
     "build": "vue-tsc && vite build",
-    "preview": "vite preview"
+    "preview": "vite preview",
+    "lint": "eslint .",
+    "lint:fix": "eslint . --fix"
   },
   "dependencies": {
     "@tresjs/cientos": "3.6.0",

+ 0 - 1
playground/src/App.vue

@@ -4,4 +4,3 @@
 <template>
   <router-view />
 </template>
-

+ 9 - 12
playground/src/components/LocalOrbitControls.vue

@@ -1,7 +1,7 @@
 <script lang="ts" setup>
 import type { Camera } from 'three'
 import { OrbitControls } from 'three-stdlib'
-import { ref, unref, onUnmounted } from 'vue'
+import { onUnmounted, ref, unref } from 'vue'
 import type { TresVector3 } from '@tresjs/core'
 import { extend, useRenderLoop, useTresContext } from '@tresjs/core'
 import { useEventListener } from '@vueuse/core'
@@ -230,7 +230,7 @@ export interface OrbitControlsProps {
 }
 
 // TODO: remove disable once eslint is updated to support vue 3.3
-// eslint-disable-next-line vue/no-setup-props-destructure
+
 const {
   autoRotate = false,
   autoRotateSpeed = 2,
@@ -238,14 +238,14 @@ const {
   dampingFactor = 0.05,
   enablePan = true,
   keyPanSpeed = 7,
-  maxAzimuthAngle = Infinity,
-  minAzimuthAngle = -Infinity,
+  maxAzimuthAngle = Number.POSITIVE_INFINITY,
+  minAzimuthAngle = Number.NEGATIVE_INFINITY,
   maxPolarAngle = Math.PI,
   minPolarAngle = 0,
   minDistance = 0,
-  maxDistance = Infinity,
+  maxDistance = Number.POSITIVE_INFINITY,
   minZoom = 0,
-  maxZoom = Infinity,
+  maxZoom = Number.POSITIVE_INFINITY,
   enableZoom = true,
   zoomSpeed = 1,
   enableRotate = true,
@@ -263,14 +263,11 @@ extend({ OrbitControls })
 
 function addEventListeners() {
   useEventListener(controls.value as any, 'change', () =>
-    emit('change', controls.value),
-  )
+    emit('change', controls.value))
   useEventListener(controls.value as any, 'start', () =>
-    emit('start', controls.value),
-  )
+    emit('start', controls.value))
   useEventListener(controls.value as any, 'end', () =>
-    emit('end', controls.value),
-  )
+    emit('end', controls.value))
 }
 
 const { onLoop } = useRenderLoop()

+ 4 - 3
playground/src/components/MultipleCanvas.vue

@@ -22,6 +22,7 @@ const state2 = reactive({
   toneMapping: NoToneMapping, */
 })
 const log = () => {
+  // eslint-disable-next-line no-console
   console.log(3)
 }
 </script>
@@ -33,12 +34,12 @@ const log = () => {
       v-model="state.clearColor"
       type="text"
       name=""
-    >
+    />
     <input
       v-model="state.stencil"
       type="checkbox"
       name=""
-    >
+    />
     <div class="w-1/2 aspect-video">
       <TresCanvas v-bind="state">
         <TresPerspectiveCamera
@@ -94,4 +95,4 @@ const log = () => {
       </TresCanvas>
     </div>
   </div>
-</template>
+</template>

+ 0 - 2
playground/src/components/TestSphere.vue

@@ -21,8 +21,6 @@ const pbrTexture = await useTexture({
   ambientOcclusion:
     'https://raw.githubusercontent.com/Tresjs/assets/main/textures/black-rock/Rock035_2K_AmbientOcclusion.jpg',
 })
-
-console.log('sphereRef', getCurrentInstance())
 </script>
 
 <template>

+ 3 - 2
playground/src/components/TheCameraOperator.vue

@@ -8,11 +8,12 @@ const props = defineProps<{
 const { setCameraActive } = useTresContext()
 
 watchEffect(() => {
-  if (props.activeCameraUuid)
+  if (props.activeCameraUuid) {
     setCameraActive(props.activeCameraUuid)
+  }
 })
 </script>
 
 <template>
-  <slot />
+  <slot></slot>
 </template>

+ 2 - 1
playground/src/components/TheExperience.vue

@@ -1,6 +1,7 @@
+<!-- eslint-disable no-console -->
 <script setup lang="ts">
 import { ref, watchEffect } from 'vue'
-import { BasicShadowMap, SRGBColorSpace, NoToneMapping } from 'three'
+import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
 import { TresCanvas } from '@tresjs/core'
 import { OrbitControls } from '@tresjs/cientos'
 import { TresLeches, useControls } from '@tresjs/leches'

+ 5 - 3
playground/src/pages/TheBasic.vue

@@ -1,5 +1,5 @@
 <script setup lang="ts">
-import { SRGBColorSpace, BasicShadowMap, NoToneMapping } from 'three'
+import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
 import { reactive, ref } from 'vue'
 import { TresCanvas, useRenderLoop } from '@tresjs/core'
 import { OrbitControls } from '@tresjs/cientos'
@@ -19,7 +19,9 @@ const sphereRef = ref()
 const { onLoop } = useRenderLoop()
 
 onLoop(({ elapsed }) => {
-  if (!sphereRef.value) return
+  if (!sphereRef.value) {
+    return
+  }
   sphereRef.value.position.y += Math.sin(elapsed) * 0.01
 })
 
@@ -36,7 +38,7 @@ const sphereExists = ref(true)
   <input
     v-model="sphereExists"
     type="checkbox"
-  >
+  />
   <TresCanvas v-bind="state">
     <TresPerspectiveCamera
       :position="[5, 5, 5]"

+ 1 - 1
playground/src/pages/TheGroups.vue

@@ -26,7 +26,7 @@ onLoop(() => {
       />
       <OrbitControls />
       <TresAmbientLight
-        :color="0xffffff"
+        :color="0xFFFFFF"
         :intensity="0.5"
       />
       <TresGroup

+ 2 - 1
playground/src/pages/cameras/Cameras.vue

@@ -1,6 +1,7 @@
+<!-- eslint-disable no-console -->
 <script setup lang="ts">
 import { TresCanvas } from '@tresjs/core'
-import { BasicShadowMap, SRGBColorSpace, NoToneMapping, PerspectiveCamera, OrthographicCamera } from 'three'
+import { BasicShadowMap, NoToneMapping, OrthographicCamera, PerspectiveCamera, SRGBColorSpace } from 'three'
 import { TresLeches, useControls } from '@tresjs/leches'
 import '@tresjs/leches/styles'
 import { Box } from '@tresjs/cientos'

+ 1 - 1
playground/src/pages/cameras/MultipleCameras.vue

@@ -45,7 +45,7 @@ const camera3Exists = ref(false)
     <input
       v-model="camera3Exists"
       type="checkbox"
-    >
+    />
     <div class="w-1/2 aspect-video">
       <TresCanvas v-bind="state">
         <TheCameraOperator :active-camera-uuid="activeCameraUuid">

+ 1 - 1
playground/src/pages/cameras/NoCamera.vue

@@ -20,7 +20,7 @@ const useOwnCamera = ref(false)
     <input
       v-model="useOwnCamera"
       type="checkbox"
-    >
+    />
     <div class="w-1/2 aspect-video">
       <TresCanvas
         v-bind="state"

+ 2 - 1
playground/src/pages/click-blocking-box.vue

@@ -1,3 +1,4 @@
+<!-- eslint-disable no-console -->
 <script lang="ts" setup>
 import { TresCanvas } from '@tresjs/core'
 import { OrbitControls } from '@tresjs/cientos'
@@ -36,6 +37,6 @@ const boxOneBlocksPointerEvents = ref(false)
       v-model="boxOneBlocksPointerEvents"
       type="checkbox"
       style="position: fixed; top:10px; left: 10px;"
-    >
+    />
   </div>
 </template>

+ 2 - 2
playground/src/pages/empty.vue

@@ -3,5 +3,5 @@
 </script>
 
 <template>
-  <div />
-</template>
+  <div></div>
+</template>

+ 5 - 5
playground/src/pages/lights.vue

@@ -1,7 +1,7 @@
 <script setup lang="ts">
 import type { TresObject } from '@tresjs/core'
-import { TresCanvas, vLightHelper, vAlwaysLookAt, vDistanceTo, vLog } from '@tresjs/core'
-import { BasicShadowMap, SRGBColorSpace, NoToneMapping } from 'three'
+import { TresCanvas, vAlwaysLookAt, vDistanceTo, vLightHelper, vLog } from '@tresjs/core'
+import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
 
 import { OrbitControls } from '@tresjs/cientos'
 
@@ -19,12 +19,12 @@ const planeRef: Ref<TresObject | null> = ref(null)
 
 <template>
   <TresCanvas
-   
+
     v-bind="gl"
   >
     <TresPerspectiveCamera :position="[3, 3, 3]" />
     <OrbitControls />
-   
+
     <TresDirectionalLight
       v-light-helper
       v-always-look-at="[8, 16, 0]"
@@ -52,4 +52,4 @@ const planeRef: Ref<TresObject | null> = ref(null)
     </TresMesh>
     <TresAmbientLight :intensity="1" />
   </TresCanvas>
-</template>
+</template>

+ 2 - 2
playground/src/pages/misc/GUI.vue

@@ -1,6 +1,6 @@
 <script setup lang="ts">
 import { TresCanvas } from '@tresjs/core'
-import { BasicShadowMap, SRGBColorSpace, NoToneMapping, Vector3 } from 'three'
+import { BasicShadowMap, NoToneMapping, SRGBColorSpace, Vector3 } from 'three'
 import { OrbitControls } from '@tresjs/cientos'
 
 // import { OrbitControls, Box } from '@tresjs/cientos'
@@ -46,4 +46,4 @@ setTimeout(() => {
     <TresGridHelper />
     <TresAmbientLight :intensity="1" />
   </TresCanvas>
-</template>
+</template>

+ 2 - 2
playground/src/pages/misc/Text3DDemo.vue

@@ -1,6 +1,6 @@
 <script setup lang="ts">
 import { TresCanvas } from '@tresjs/core'
-import { BasicShadowMap, SRGBColorSpace, NoToneMapping } from 'three'
+import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
 import { OrbitControls } from '@tresjs/cientos'
 import Text3D from '../../components/Text3D.vue'
 
@@ -23,4 +23,4 @@ const gl = {
     </Suspense>
     <TresAmbientLight :intensity="1" />
   </TresCanvas>
-</template>
+</template>

+ 1 - 1
playground/src/pages/misc/TheParticles.vue

@@ -95,4 +95,4 @@ onLoop(({ elapsed }) => {
       cast-shadow
     />
   </TresCanvas>
-</template>
+</template>

+ 4 - 4
playground/src/pages/perf/AkuAku.vue

@@ -1,6 +1,6 @@
+<!-- eslint-disable no-console -->
 <script setup lang="ts">
 import { useGLTF } from '@tresjs/cientos'
-import { useControls } from '@tresjs/leches'
 
 const { nodes } = await useGLTF(
   'https://raw.githubusercontent.com/Tresjs/assets/main/models/gltf/aku-aku/AkuAku.gltf',
@@ -19,7 +19,7 @@ const model = nodes.AkuAku
   },
 }) */
 
-function disposeModel() {
+/* function disposeModel() {
   console.log('disposingModel')
   model.traverse((child) => {
     if (child.isMesh) {
@@ -27,7 +27,7 @@ function disposeModel() {
       if (child.material) {
         child.material.dispose()
       }
-        
+
       // Dispose of the geometry
       if (child.geometry) {
         child.geometry.dispose()
@@ -35,7 +35,7 @@ function disposeModel() {
     }
   })
   console.log('disposingModel Finished')
-}
+} */
 
 model.traverse((child) => {
   if (child.material) {

+ 8 - 8
playground/src/pages/perf/index.vue

@@ -1,10 +1,10 @@
+<!-- eslint-disable no-console -->
 <script setup lang="ts">
 import { TresCanvas } from '@tresjs/core'
-import { BasicShadowMap, SRGBColorSpace, NoToneMapping } from 'three'
-import { TresLeches, Perf, useControls } from '@tresjs/leches'
+import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
+import { Perf, TresLeches, useControls } from '@tresjs/leches'
 import '@tresjs/leches/styles'
 import { OrbitControls } from '@tresjs/cientos'
-import { useRouter } from 'vue-router'
 import AkuAku from './AkuAku.vue'
 
 const gl = {
@@ -16,8 +16,6 @@ const gl = {
   toneMapping: NoToneMapping,
 }
 
-const router = useRouter()
-
 const { sphere } = useControls({
   sphere: true,
 })
@@ -25,7 +23,9 @@ const { sphere } = useControls({
 const ctx = ref(null)
 
 watchEffect(() => {
-  if (!ctx.value) return
+  if (!ctx.value) {
+    return
+  }
   console.log('ctx', ctx.value)
 })
 
@@ -50,7 +50,7 @@ useControls({
     <Perf />
     <TresPerspectiveCamera :position="[3, 3, 3]" />
     <OrbitControls />
-    <Suspense> 
+    <Suspense>
       <AkuAku v-if="sphere" />
     </Suspense>
     <!--  <TresMesh
@@ -62,4 +62,4 @@ useControls({
     </TresMesh> -->
     <TresAmbientLight :intensity="1" />
   </TresCanvas>
-</template>
+</template>

+ 3 - 2
playground/src/pages/raycaster/TheEvents.vue

@@ -1,6 +1,7 @@
+<!-- eslint-disable no-console -->
 <script setup lang="ts">
 import { TresCanvas } from '@tresjs/core'
-import { BasicShadowMap, SRGBColorSpace, NoToneMapping } from 'three'
+import { BasicShadowMap, NoToneMapping, SRGBColorSpace } from 'three'
 
 import { OrbitControls } from '@tresjs/cientos'
 
@@ -41,7 +42,7 @@ const visible = ref(true)
 </script>
 
 <template>
-  <button @click="visible = !visible" />
+  <button @click="visible = !visible"></button>
   <div v-if="visible">
     <TresCanvas
       window-size

+ 1 - 1
playground/src/router.ts

@@ -86,7 +86,7 @@ const routes = [
     name: 'empty',
     component: () => import('./pages/empty.vue'),
   },
-  
+
 ]
 export const router = createRouter({
   history: createWebHistory(),

+ 11 - 11
playground/tsconfig.json

@@ -1,21 +1,21 @@
 {
   "compilerOptions": {
     "target": "ESNext",
+    "jsx": "preserve",
+    "lib": ["ESNext", "DOM"],
     "useDefineForClassFields": true,
     "module": "ESNext",
     "moduleResolution": "bundler",
-    "strict": true,
-    "jsx": "preserve",
-    "resolveJsonModule": true,
-    "isolatedModules": true,
-    "esModuleInterop": true,
-    "lib": ["ESNext", "DOM"],
-    "skipLibCheck": true,
-    "noEmit": true,
     "paths": {
       "@tresjs/core": ["../dist/"]
-    }
+    },
+    "resolveJsonModule": true,
+    "strict": true,
+    "noEmit": true,
+    "esModuleInterop": true,
+    "isolatedModules": true,
+    "skipLibCheck": true
   },
-  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "auto-imports.d.ts", "components.d.ts"],
-  "references": [{ "path": "./tsconfig.node.json" }]
+  "references": [{ "path": "./tsconfig.node.json" }],
+  "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue", "auto-imports.d.ts", "components.d.ts"]
 }

Разница между файлами не показана из-за своего большого размера
+ 0 - 49
playground/vite.config.ts.timestamp-1706539768400-58c91108b32e6.mjs


Разница между файлами не показана из-за своего большого размера
+ 561 - 170
pnpm-lock.yaml


+ 17 - 19
src/components/TresCanvas.vue

@@ -1,33 +1,32 @@
 <script setup lang="ts">
 import { PerspectiveCamera, Scene } from 'three'
 import type {
-  WebGLRendererParameters,
   ColorSpace,
   ShadowMapType,
   ToneMapping,
+  WebGLRendererParameters,
 } from 'three'
-import type { Ref,
-  App } from 'vue'
+import type { App, Ref } from 'vue'
 import {
+  Fragment,
   computed,
+  defineComponent,
+  getCurrentInstance,
+  h,
   onMounted,
   provide,
   ref,
   shallowRef,
   watch,
   watchEffect,
-  Fragment,
-  defineComponent,
-  h, 
-  getCurrentInstance,
 } from 'vue'
 import pkg from '../../package.json'
 import {
-  useTresContextProvider,
+  type TresContext,
   useLogger,
   usePointerEventHandler,
   useRenderLoop,
-  type TresContext,
+  useTresContextProvider,
 } from '../composables'
 import { extend } from '../core/catalogue'
 import { render } from '../core/renderer'
@@ -68,6 +67,10 @@ const props = withDefaults(defineProps<TresCanvasProps>(), {
   failIfMajorPerformanceCaveat: undefined,
 })
 
+const slots = defineSlots<{
+  default: () => any
+}>()
+
 const { logWarning } = useLogger()
 
 const canvas = ref<HTMLCanvasElement>()
@@ -81,17 +84,13 @@ const scene = shallowRef(new Scene())
 
 const { resume } = useRenderLoop()
 
-const slots = defineSlots<{
-  default(): any
-}>()
-
 const instance = getCurrentInstance()?.appContext.app
 
 const createInternalComponent = (context: TresContext) =>
   defineComponent({
     setup() {
       const ctx = getCurrentInstance()?.appContext
-      if (ctx) ctx.app = instance as App
+      if (ctx) { ctx.app = instance as App }
       provide('useTres', context)
       provide('extend', extend)
 
@@ -164,7 +163,7 @@ onMounted(() => {
   watch(
     () => props.camera,
     (newCamera, oldCamera) => {
-      if (newCamera) registerCamera(newCamera)
+      if (newCamera) { registerCamera(newCamera) }
       if (oldCamera) {
         oldCamera.removeFromParent()
         deregisterCamera(oldCamera)
@@ -178,13 +177,12 @@ onMounted(() => {
   if (!camera.value) {
     logWarning(
       'No camera found. Creating a default perspective camera. '
-        + 'To have full control over a camera, please add one to the scene.',
+      + 'To have full control over a camera, please add one to the scene.',
     )
     addDefaultCamera()
   }
 
-  if (import.meta.hot && context.value)
-    import.meta.hot.on('vite:afterUpdate', () => dispose(context.value as TresContext))
+  if (import.meta.hot && context.value) { import.meta.hot.on('vite:afterUpdate', () => dispose(context.value as TresContext)) }
 })
 </script>
 
@@ -205,5 +203,5 @@ onMounted(() => {
       touchAction: 'none',
       ...$attrs.style as Object,
     }"
-  />
+  ></canvas>
 </template>

+ 32 - 42
src/core/nodeOps.ts

@@ -1,7 +1,7 @@
 import type { RendererOptions } from 'vue'
 import { BufferAttribute } from 'three'
 import { isFunction } from '@alvarosabu/utils'
-import type { Object3D, Camera } from 'three'
+import type { Camera, Object3D } from 'three'
 import { useLogger } from '../composables'
 import { deepArrayEqual, isHTMLTag, kebabToCamel } from '../utils'
 
@@ -25,18 +25,18 @@ const supportedPointerEvents = [
 
 export const nodeOps: RendererOptions<TresObject, TresObject> = {
   createElement(tag, _isSVG, _anchor, props) {
-    if (!props) props = {}
+    if (!props) { props = {} }
 
     if (!props.args) {
       props.args = []
     }
-    if (tag === 'template') return null
-    if (isHTMLTag(tag)) return null
+    if (tag === 'template') { return null }
+    if (isHTMLTag(tag)) { return null }
     let name = tag.replace('Tres', '')
     let instance
 
     if (tag === 'primitive') {
-      if (props?.object === undefined) logError('Tres primitives need a prop \'object\'')
+      if (props?.object === undefined) { logError('Tres primitives need a prop \'object\'') }
       const object = props.object as TresObject
       name = object.type
       instance = Object.assign(object, { type: name, attach: props.attach, primitive: true })
@@ -59,19 +59,19 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
     }
 
     if (props?.attach === undefined) {
-      if (instance.isMaterial) instance.attach = 'material'
-      else if (instance.isBufferGeometry) instance.attach = 'geometry'
+      if (instance.isMaterial) { instance.attach = 'material' }
+      else if (instance.isBufferGeometry) { instance.attach = 'geometry' }
     }
 
     // determine whether the material was passed via prop to
     // prevent it's disposal when node is removed later in it's lifecycle
 
     if (instance.isObject3D) {
-      if (props?.material?.isMaterial) (instance as TresObject3D).userData.tres__materialViaProp = true
-      if (props?.geometry?.isBufferGeometry) (instance as TresObject3D).userData.tres__geometryViaProp = true
+      if (props?.material?.isMaterial) { (instance as TresObject3D).userData.tres__materialViaProp = true }
+      if (props?.geometry?.isBufferGeometry) { (instance as TresObject3D).userData.tres__geometryViaProp = true }
     }
 
-    // Since THREE instances properties are not consistent, (Orbit Controls doesn't have a `type` property) 
+    // Since THREE instances properties are not consistent, (Orbit Controls doesn't have a `type` property)
     // we take the tag name and we save it on the userData for later use in the re-instancing process.
     instance.userData = {
       ...instance.userData,
@@ -81,14 +81,13 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
     return instance
   },
   insert(child, parent) {
-    if (parent && parent.isScene) scene = parent as unknown as TresScene
+    if (parent && parent.isScene) { scene = parent as unknown as TresScene }
 
     const parentObject = parent || scene
 
     if (child?.isObject3D) {
       if (child?.isCamera) {
-        if (!scene?.userData.tres__registerCamera)
-          throw 'could not find tres__registerCamera on scene\'s userData'
+        if (!scene?.userData.tres__registerCamera) { throw 'could not find tres__registerCamera on scene\'s userData' }
 
         scene?.userData.tres__registerCamera?.(child as unknown as Camera)
       }
@@ -96,8 +95,7 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
       if (
         child && supportedPointerEvents.some(eventName => child[eventName])
       ) {
-        if (!scene?.userData.tres__registerAtPointerEventHandler)
-          throw 'could not find tres__registerAtPointerEventHandler on scene\'s userData'
+        if (!scene?.userData.tres__registerAtPointerEventHandler) { throw 'could not find tres__registerAtPointerEventHandler on scene\'s userData' }
 
         scene?.userData.tres__registerAtPointerEventHandler?.(child as Object3D)
       }
@@ -118,7 +116,7 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
     }
   },
   remove(node) {
-    if (!node) return
+    if (!node) { return }
     // remove is only called on the node being removed and not on child nodes.
 
     if (node.isObject3D) {
@@ -143,29 +141,23 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
         = scene?.userData.tres__deregisterBlockingObjectAtPointerEventHandler
 
       const deregisterAtPointerEventHandlerIfRequired = (object: TresObject) => {
-
-        if (!deregisterBlockingObjectAtPointerEventHandler)
-          throw 'could not find tres__deregisterBlockingObjectAtPointerEventHandler on scene\'s userData'
+        if (!deregisterBlockingObjectAtPointerEventHandler) { throw 'could not find tres__deregisterBlockingObjectAtPointerEventHandler on scene\'s userData' }
 
         scene?.userData.tres__deregisterBlockingObjectAtPointerEventHandler?.(object as Object3D)
 
-        if (!deregisterAtPointerEventHandler)
-          throw 'could not find tres__deregisterAtPointerEventHandler on scene\'s userData'
+        if (!deregisterAtPointerEventHandler) { throw 'could not find tres__deregisterAtPointerEventHandler on scene\'s userData' }
 
         if (
           object && supportedPointerEvents.some(eventName => object[eventName])
-        )
-          deregisterAtPointerEventHandler?.(object as Object3D)
+        ) { deregisterAtPointerEventHandler?.(object as Object3D) }
       }
 
       const deregisterCameraIfRequired = (object: Object3D) => {
         const deregisterCamera = scene?.userData.tres__deregisterCamera
 
-        if (!deregisterCamera)
-          throw 'could not find tres__deregisterCamera on scene\'s userData'
+        if (!deregisterCamera) { throw 'could not find tres__deregisterCamera on scene\'s userData' }
 
-        if ((object as Camera).isCamera)
-          deregisterCamera?.(object as Camera)
+        if ((object as Camera).isCamera) { deregisterCamera?.(object as Camera) }
       }
 
       node.removeFromParent?.()
@@ -187,10 +179,8 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
       let root = node
       let key = prop
       if (node.isObject3D && key === 'blocks-pointer-events') {
-        if (nextValue || nextValue === '')
-          scene?.userData.tres__registerBlockingObjectAtPointerEventHandler?.(node as Object3D)
-        else
-          scene?.userData.tres__deregisterBlockingObjectAtPointerEventHandler?.(node as Object3D)
+        if (nextValue || nextValue === '') { scene?.userData.tres__registerBlockingObjectAtPointerEventHandler?.(node as Object3D) }
+        else { scene?.userData.tres__deregisterBlockingObjectAtPointerEventHandler?.(node as Object3D) }
 
         return
       }
@@ -211,7 +201,7 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
       }
 
       if (root.type === 'BufferGeometry') {
-        if (key === 'args') return
+        if (key === 'args') { return }
         root.setAttribute(
           kebabToCamel(key),
           new BufferAttribute(...(nextValue as ConstructorParameters<typeof BufferAttribute>)),
@@ -225,24 +215,24 @@ export const nodeOps: RendererOptions<TresObject, TresObject> = {
         target = chain.reduce((acc, key) => acc[kebabToCamel(key)], root)
         key = chain.pop() as string
         finalKey = key.toLowerCase()
-        if (!target?.set) root = chain.reduce((acc, key) => acc[kebabToCamel(key)], root)
+        if (!target?.set) { root = chain.reduce((acc, key) => acc[kebabToCamel(key)], root) }
       }
       let value = nextValue
-      if (value === '') value = true
+      if (value === '') { value = true }
       // Set prop, prefer atomic methods if applicable
       if (isFunction(target)) {
-        //don't call pointer event callback functions
+        // don't call pointer event callback functions
         if (!supportedPointerEvents.includes(prop)) {
-          if (Array.isArray(value)) node[finalKey](...value)
-          else node[finalKey](value)
+          if (Array.isArray(value)) { node[finalKey](...value) }
+          else { node[finalKey](value) }
         }
         return
       }
-      if (!target?.set && !isFunction(target)) root[finalKey] = value
-      else if (target.constructor === value.constructor && target?.copy) target?.copy(value)
-      else if (Array.isArray(value)) target.set(...value)
-      else if (!target.isColor && target.setScalar) target.setScalar(value)
-      else target.set(value)
+      if (!target?.set && !isFunction(target)) { root[finalKey] = value }
+      else if (target.constructor === value.constructor && target?.copy) { target?.copy(value) }
+      else if (Array.isArray(value)) { target.set(...value) }
+      else if (!target.isColor && target.setScalar) { target.setScalar(value) }
+      else { target.set(value) }
     }
   },
 

+ 12 - 12
tsconfig.json

@@ -1,24 +1,24 @@
 {
   "compilerOptions": {
-    "baseUrl": ".",
+    "incremental": false,
     "target": "esnext",
+    "jsx": "preserve",
+    "lib": ["esnext", "dom"],
+    "baseUrl": ".",
     "module": "esnext",
     "moduleResolution": "node",
-    "strict": true,
-    "jsx": "preserve",
-    "sourceMap": true,
     "resolveJsonModule": true,
-    "esModuleInterop": true,
-    "lib": ["esnext", "dom"],
     "types": ["vite/client", "node", "vitest/globals"],
-    "incremental": false,
-    "skipLibCheck": true,
-    "noUnusedLocals": true,
+    "strict": true,
     "strictNullChecks": true,
+    "noUnusedLocals": true,
+    "declaration": true,
+    "sourceMap": true,
+    "esModuleInterop": true,
     "forceConsistentCasingInFileNames": true,
-    "declaration": true
+    "skipLibCheck": true
   },
+  "references": [{ "path": "./tsconfig.node.json" }],
   "include": ["src/**/*.ts", "src/**/*.d.ts", "src/**/*.tsx", "src/**/*.vue"],
-  "exclude": ["node_modules", "src/**/*.cy.ts", "src/**/*.test.ts"],
-  "references": [{ "path": "./tsconfig.node.json" }]
+  "exclude": ["node_modules", "src/**/*.cy.ts", "src/**/*.test.ts"]
 }

Некоторые файлы не были показаны из-за большого количества измененных файлов