@needle-tools/engine 4.15.0-next.f391a30 → 4.15.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 (150) hide show
  1. package/components.needle.json +1 -1
  2. package/dist/{gltf-progressive-CTlvpS3A.js → gltf-progressive-Bm_6aEi4.js} +1 -1
  3. package/dist/{gltf-progressive-CMwJPwEt.umd.cjs → gltf-progressive-BttGBXw6.umd.cjs} +1 -1
  4. package/dist/{gltf-progressive-DYL3SLVb.min.js → gltf-progressive-T5WKTux5.min.js} +1 -1
  5. package/dist/materialx-CJyQZtjt.min.js +90 -0
  6. package/dist/materialx-DMs1E08Z.js +4636 -0
  7. package/dist/materialx-DaKKOoVk.umd.cjs +90 -0
  8. package/dist/{needle-engine.bundle-DsTdfmeb.min.js → needle-engine.bundle-CBq_OMnI.min.js} +122 -124
  9. package/dist/{needle-engine.bundle-DB4kLWO_.js → needle-engine.bundle-DGyiwNWR.js} +3226 -3232
  10. package/dist/{needle-engine.bundle-C1BFRZDF.umd.cjs → needle-engine.bundle-JN3eiiYc.umd.cjs} +113 -115
  11. package/dist/needle-engine.d.ts +52 -33
  12. package/dist/needle-engine.js +288 -287
  13. package/dist/needle-engine.min.js +1 -1
  14. package/dist/needle-engine.umd.cjs +1 -1
  15. package/dist/{postprocessing-BN-f4viE.min.js → postprocessing-06AXuvdv.min.js} +1 -1
  16. package/dist/{postprocessing-De9ZpJrk.js → postprocessing-CI2x8Cln.js} +1 -1
  17. package/dist/{postprocessing-DYmYOVm4.umd.cjs → postprocessing-CPDcA21P.umd.cjs} +1 -1
  18. package/dist/{three-examples-BHqRVpO_.umd.cjs → three-examples-BMmNgNCN.umd.cjs} +12 -12
  19. package/dist/{three-examples-C0ZCCA_K.js → three-examples-CMYCd5nH.js} +192 -182
  20. package/dist/{three-examples-DmTY8tGr.min.js → three-examples-CQl1fFZp.min.js} +14 -14
  21. package/lib/engine/api.d.ts +2 -0
  22. package/lib/engine/api.js +2 -0
  23. package/lib/engine/api.js.map +1 -1
  24. package/lib/engine/debug/debug.js +1 -1
  25. package/lib/engine/debug/debug.js.map +1 -1
  26. package/lib/engine/debug/debug_spatial_console.js +1 -1
  27. package/lib/engine/debug/debug_spatial_console.js.map +1 -1
  28. package/lib/engine/engine_accessibility.d.ts +1 -1
  29. package/lib/engine/engine_accessibility.js +1 -1
  30. package/lib/engine/engine_accessibility.js.map +1 -1
  31. package/lib/engine/engine_context.d.ts +1 -1
  32. package/lib/engine/engine_context.js +2 -2
  33. package/lib/engine/engine_context.js.map +1 -1
  34. package/lib/engine/engine_create_objects.js +1 -1
  35. package/lib/engine/engine_create_objects.js.map +1 -1
  36. package/lib/engine/engine_gizmos.js +1 -1
  37. package/lib/engine/engine_gizmos.js.map +1 -1
  38. package/lib/engine/engine_license.js +2 -7
  39. package/lib/engine/engine_license.js.map +1 -1
  40. package/lib/engine/engine_test_utils.d.ts +39 -0
  41. package/lib/engine/engine_test_utils.js +84 -0
  42. package/lib/engine/engine_test_utils.js.map +1 -0
  43. package/lib/engine/engine_utils.js +2 -2
  44. package/lib/engine/engine_utils.js.map +1 -1
  45. package/lib/engine/export/gltf/index.js +1 -1
  46. package/lib/engine/export/gltf/index.js.map +1 -1
  47. package/lib/engine/webcomponents/logo-element.d.ts +3 -6
  48. package/lib/engine/webcomponents/logo-element.js +0 -18
  49. package/lib/engine/webcomponents/logo-element.js.map +1 -1
  50. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +2 -2
  51. package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
  52. package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +7 -10
  53. package/lib/engine/webcomponents/needle menu/needle-menu.js +4 -14
  54. package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
  55. package/lib/engine/webcomponents/needle-engine.ar-overlay.js +1 -10
  56. package/lib/engine/webcomponents/needle-engine.ar-overlay.js.map +1 -1
  57. package/lib/engine/webcomponents/needle-engine.d.ts +0 -3
  58. package/lib/engine/webcomponents/needle-engine.js +0 -10
  59. package/lib/engine/webcomponents/needle-engine.js.map +1 -1
  60. package/lib/engine-components/Component.js +1 -0
  61. package/lib/engine-components/Component.js.map +1 -1
  62. package/lib/engine-components/ReflectionProbe.d.ts +2 -24
  63. package/lib/engine-components/ReflectionProbe.js +2 -28
  64. package/lib/engine-components/ReflectionProbe.js.map +1 -1
  65. package/lib/engine-components/Skybox.js +2 -4
  66. package/lib/engine-components/Skybox.js.map +1 -1
  67. package/lib/engine-components/export/gltf/GltfExport.js +1 -1
  68. package/lib/engine-components/export/gltf/GltfExport.js.map +1 -1
  69. package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +2 -2
  70. package/lib/engine-components/export/usdz/USDZExporter.js +1 -1
  71. package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
  72. package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js +2 -2
  73. package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js.map +1 -1
  74. package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +1 -1
  75. package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js.map +1 -0
  76. package/package.json +14 -18
  77. package/plugins/common/buildinfo.js +10 -46
  78. package/plugins/common/files.js +1 -2
  79. package/plugins/common/license.js +69 -144
  80. package/plugins/common/logger.js +11 -172
  81. package/plugins/common/worker.js +4 -5
  82. package/plugins/types/userconfig.d.ts +2 -40
  83. package/plugins/vite/alias.js +5 -6
  84. package/plugins/vite/asap.js +5 -6
  85. package/plugins/vite/build-pipeline.js +41 -224
  86. package/plugins/vite/buildinfo.js +6 -66
  87. package/plugins/vite/copyfiles.js +12 -41
  88. package/plugins/vite/custom-element-data.js +16 -26
  89. package/plugins/vite/defines.js +5 -8
  90. package/plugins/vite/dependencies.js +10 -16
  91. package/plugins/vite/dependency-watcher.js +7 -35
  92. package/plugins/vite/drop-client.js +5 -7
  93. package/plugins/vite/drop.js +14 -16
  94. package/plugins/vite/editor-connection.js +16 -18
  95. package/plugins/vite/imports-logger.js +2 -12
  96. package/plugins/vite/index.js +3 -8
  97. package/plugins/vite/local-files.js +441 -2
  98. package/plugins/vite/logger.client.js +35 -45
  99. package/plugins/vite/logger.js +3 -6
  100. package/plugins/vite/meta.js +4 -18
  101. package/plugins/vite/needle-app.js +3 -4
  102. package/plugins/vite/peer.js +1 -2
  103. package/plugins/vite/pwa.js +17 -33
  104. package/plugins/vite/reload.js +2 -24
  105. package/src/engine/api.ts +3 -0
  106. package/src/engine/debug/debug.ts +1 -1
  107. package/src/engine/debug/debug_spatial_console.ts +1 -5
  108. package/src/engine/engine_accessibility.ts +1 -2
  109. package/src/engine/engine_context.ts +2 -2
  110. package/src/engine/engine_create_objects.ts +1 -1
  111. package/src/engine/engine_gizmos.ts +5 -9
  112. package/src/engine/engine_license.ts +2 -7
  113. package/src/engine/engine_test_utils.ts +109 -0
  114. package/src/engine/engine_utils.ts +2 -2
  115. package/src/engine/export/gltf/index.ts +1 -1
  116. package/src/engine/webcomponents/logo-element.ts +3 -20
  117. package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +2 -6
  118. package/src/engine/webcomponents/needle menu/needle-menu.ts +11 -23
  119. package/src/engine/webcomponents/needle-engine.ar-overlay.ts +2 -13
  120. package/src/engine/webcomponents/needle-engine.ts +1 -13
  121. package/src/engine-components/Component.ts +2 -1
  122. package/src/engine-components/ReflectionProbe.ts +9 -33
  123. package/src/engine-components/Skybox.ts +2 -4
  124. package/src/engine-components/export/gltf/GltfExport.ts +1 -1
  125. package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2 -2
  126. package/src/engine-components/export/usdz/USDZExporter.ts +1 -1
  127. package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +2 -2
  128. package/src/include/draco/draco_decoder.js +34 -0
  129. package/src/include/draco/draco_decoder.wasm +0 -0
  130. package/src/include/draco/draco_wasm_wrapper.js +117 -0
  131. package/src/include/ktx2/basis_transcoder.js +19 -0
  132. package/src/include/ktx2/basis_transcoder.wasm +0 -0
  133. package/src/include/needle/arial-msdf.json +1472 -0
  134. package/src/include/needle/arial.png +0 -0
  135. package/src/include/needle/poweredbyneedle.webp +0 -0
  136. package/dist/materialx-4jJLLe9Q.js +0 -4174
  137. package/dist/materialx-Bt9FHwco.min.js +0 -158
  138. package/dist/materialx-NDD0y4JY.umd.cjs +0 -158
  139. package/lib/engine/export/gltf/EXT_mesh_gpu_instancing_exporter.js.map +0 -1
  140. package/plugins/common/needle-engine-skill.md +0 -175
  141. package/plugins/vite/ai.js +0 -71
  142. package/plugins/vite/local-files-analysis.js +0 -789
  143. package/plugins/vite/local-files-core.js +0 -992
  144. package/plugins/vite/local-files-internals.js +0 -28
  145. package/plugins/vite/local-files-types.d.ts +0 -111
  146. package/plugins/vite/local-files-utils.js +0 -359
  147. package/plugins/vite/logging.js +0 -129
  148. /package/lib/{engine/export/gltf → include/three}/EXT_mesh_gpu_instancing_exporter.d.ts +0 -0
  149. /package/lib/{engine/export/gltf → include/three}/EXT_mesh_gpu_instancing_exporter.js +0 -0
  150. /package/src/{engine/export/gltf → include/three}/EXT_mesh_gpu_instancing_exporter.js +0 -0
@@ -1,18 +1,15 @@
1
- // @ts-check
2
1
  import fs from 'fs';
3
2
  import path from 'path';
4
3
 
5
- /** @typedef {{ version?: number, tags?: {name: string, [key: string]: unknown}[], valueSets?: {name: string, [key: string]: unknown}[], globalAttributes?: unknown[] }} CustomElementData */
6
-
7
4
  /** Known needle-engine tag names that should be updated from the source */
8
5
  const NEEDLE_TAG_NAMES = ['needle-engine', 'needle-menu', 'needle-button'];
9
6
 
10
7
  /**
11
8
  * Merges needle-engine custom element data into an existing custom-elements.json file.
12
9
  * Preserves user-defined tags while updating needle-engine specific tags.
13
- * @param {CustomElementData} sourceData - The needle-engine custom-elements.json data
14
- * @param {CustomElementData} targetData - The existing project custom-elements.json data
15
- * @returns {CustomElementData} Merged data
10
+ * @param {object} sourceData - The needle-engine custom-elements.json data
11
+ * @param {object} targetData - The existing project custom-elements.json data
12
+ * @returns {object} Merged data
16
13
  */
17
14
  function mergeCustomElementData(sourceData, targetData) {
18
15
  const merged = { ...targetData };
@@ -77,30 +74,23 @@ export const needleCustomElementData = (command, config, userSettings = {}) => {
77
74
 
78
75
  // Path to source custom-elements.json in node_modules
79
76
  const sourceFile = path.join(cwd, 'node_modules', '@needle-tools', 'engine', 'custom-elements.json');
80
- // Path to target custom-elements.json in project vs code directory
81
- const targetFile = path.join(cwd, '.vscode', 'custom-elements.json');
77
+ // Path to target custom-elements.json in project root
78
+ const targetFile = path.join(cwd, 'custom-elements.json');
82
79
 
83
80
  // Copy/merge custom-elements.json to project
84
81
  if (fs.existsSync(sourceFile)) {
85
82
  try {
86
- const sourceData = /** @type {CustomElementData} */ (JSON.parse(fs.readFileSync(sourceFile, 'utf8')));
83
+ const sourceData = JSON.parse(fs.readFileSync(sourceFile, 'utf8'));
87
84
 
88
- let targetData = /** @type {CustomElementData} */ ({});
85
+ let targetData = {};
89
86
  if (fs.existsSync(targetFile)) {
90
87
  // Merge with existing file to preserve user content
91
88
  try {
92
- targetData = /** @type {CustomElementData} */ (JSON.parse(fs.readFileSync(targetFile, 'utf8')));
89
+ targetData = JSON.parse(fs.readFileSync(targetFile, 'utf8'));
93
90
  } catch {
94
91
  targetData = {};
95
92
  }
96
93
  }
97
- else {
98
- // Ensure .vscode directory exists
99
- const vscodeDir = path.dirname(targetFile);
100
- if (!fs.existsSync(vscodeDir)) {
101
- fs.mkdirSync(vscodeDir);
102
- }
103
- }
104
94
 
105
95
  const mergedData = mergeCustomElementData(sourceData, targetData);
106
96
  const newContent = JSON.stringify(mergedData, null, 2);
@@ -135,7 +125,7 @@ export const needleCustomElementData = (command, config, userSettings = {}) => {
135
125
  const full = path.join(cwd, f);
136
126
  try {
137
127
  const raw = fs.readFileSync(full, 'utf8');
138
- const data = /** @type {{settings?: {'html.customData'?: string[], [key: string]: unknown}}} */ (JSON.parse(raw));
128
+ const data = JSON.parse(raw);
139
129
 
140
130
  // Ensure settings.html.customData contains the local path
141
131
  data.settings = data.settings || {};
@@ -166,20 +156,20 @@ export const needleCustomElementData = (command, config, userSettings = {}) => {
166
156
  if (fs.existsSync(settingsFile)) {
167
157
  try {
168
158
  const rawSettings = fs.readFileSync(settingsFile, 'utf8');
169
- /** @type {Record<string, unknown>} */
159
+ /** @type {Record<string, any>} */
170
160
  const settings = JSON.parse(rawSettings) || {};
171
- const htmlData = /** @type {string[]} */ (settings['html.customData'] || []);
172
- settings['html.customData'] = htmlData;
161
+
162
+ settings['html.customData'] = settings['html.customData'] || [];
173
163
 
174
164
  // Remove old node_modules path if present
175
- const oldIndex = htmlData.indexOf(oldNodeModulesPath);
165
+ const oldIndex = settings['html.customData'].indexOf(oldNodeModulesPath);
176
166
  if (oldIndex >= 0) {
177
- htmlData.splice(oldIndex, 1);
167
+ settings['html.customData'].splice(oldIndex, 1);
178
168
  }
179
169
 
180
170
  // Add local path if not present
181
- if (!htmlData.includes(localCustomDataPath)) {
182
- htmlData.push(localCustomDataPath);
171
+ if (!settings['html.customData'].includes(localCustomDataPath)) {
172
+ settings['html.customData'].push(localCustomDataPath);
183
173
 
184
174
  // Write back settings.json if changed
185
175
  const newRawSettings = JSON.stringify(settings, null, 2);
@@ -1,7 +1,6 @@
1
1
  import { loadConfig } from "./config.js";
2
2
  import { tryGetNeedleEngineVersion } from "../common/version.js";
3
3
  import { getPublicIdentifier as getPublicIdentifier } from "../common/license.js";
4
- import { needleLog } from "./logging.js";
5
4
 
6
5
  // NOTE: ALL DEFINES MUST BE SET HERE! NEVER ADD OR RELY ON DEFINES IN ANY OTHER PLUGIN
7
6
 
@@ -12,8 +11,6 @@ import { needleLog } from "./logging.js";
12
11
  // https://vitejs.dev/config/#using-environment-variables-in-config
13
12
 
14
13
  /**
15
- * @param {string} command
16
- * @param {{ generator?: string, useRapier?: boolean } | null | undefined} needleEngineConfig
17
14
  * @param {import('../types').userSettings} userSettings
18
15
  */
19
16
  export const needleDefines = (command, needleEngineConfig, userSettings) => {
@@ -31,11 +28,11 @@ export const needleDefines = (command, needleEngineConfig, userSettings) => {
31
28
  return {
32
29
  name: 'needle:defines',
33
30
  enforce: 'pre',
34
- async config(/** @type {{ define?: Record<string, unknown> }} */ viteConfig) {
31
+ async config(viteConfig) {
35
32
  // console.log("Update vite defines -------------------------------------------");
36
33
  if (!viteConfig.define) viteConfig.define = {};
37
34
  const version = tryGetNeedleEngineVersion();
38
- needleLog("needle-defines", "Needle Engine Version: " + version + " " + (needleEngineConfig?.generator ?? "(unknown generator)"));
35
+ console.log("Needle Engine Version: " + version, needleEngineConfig?.generator ?? "(unknown generator)");
39
36
  if (version)
40
37
  viteConfig.define.NEEDLE_ENGINE_VERSION = "\"" + version + "\"";
41
38
  if (needleEngineConfig)
@@ -60,11 +57,11 @@ export const needleDefines = (command, needleEngineConfig, userSettings) => {
60
57
  // this gives a timestamp containing the timezone
61
58
  viteConfig.define.NEEDLE_PROJECT_BUILD_TIME = "\"" + new Date().toString() + "\"";
62
59
 
63
- const projectId = /** @type {string | undefined} */ (undefined); // TODO: this needs to be exported by the integration (if any)
60
+ const projectId = undefined; // TODO: this needs to be exported by the integration (if any)
64
61
  const publicIdentifier = await getPublicIdentifier(projectId, {
65
62
  loglevel: userSettings?.debugLicense === true ? "verbose" : undefined,
66
- }).catch((/** @type {{ message?: string }} */ err) => {
67
- needleLog("needle-defines", "Failed to get public identifier: " + err.message, "warn");
63
+ }).catch(err => {
64
+ console.warn("Failed to get public identifier:", err.message);
68
65
  });
69
66
  if (publicIdentifier) {
70
67
  viteConfig.define.NEEDLE_PUBLIC_KEY = "\"" + publicIdentifier + "\"";
@@ -1,5 +1,4 @@
1
1
  import { tryGetNeedleEngineVersion, tryGetPackageVersion } from '../common/version.js';
2
- import { needleLog } from './logging.js';
3
2
 
4
3
  /**
5
4
  * @type {string[]}
@@ -40,10 +39,9 @@ const excludeDependencies = [
40
39
  * @param {import('vite').UserConfig} config
41
40
  */
42
41
  function handleOptimizeDeps(config) {
43
- const logLines = [];
44
42
  excludeDependencies.forEach(dep => {
45
43
  if (config.optimizeDeps?.include?.includes(dep)) {
46
- logLines.push(`${dep} is included in the optimizeDeps.include array. This may cause issues with the worker import.`);
44
+ console.log(`[needle-dependencies] ${dep} is included in the optimizeDeps.include array. This may cause issues with the worker import.`);
47
45
  }
48
46
  else {
49
47
  if (!config.optimizeDeps) {
@@ -56,7 +54,7 @@ function handleOptimizeDeps(config) {
56
54
  // This needs to be excluded from optimization because otherwise the worker import fails
57
55
  // three-mesh-bvh/src/workers/generateMeshBVH.worker.js?worker
58
56
  // same for gltf-progressive
59
- logLines.push(`Adding ${dep} to the optimizeDeps.exclude array to support workers.`);
57
+ console.log(`[needle-dependencies] Adding ${dep} to the optimizeDeps.exclude array to support workers.`);
60
58
  config.optimizeDeps.exclude.push(dep);
61
59
 
62
60
  if (!config.server) config.server = {};
@@ -67,14 +65,12 @@ function handleOptimizeDeps(config) {
67
65
  }
68
66
  }
69
67
  });
70
- if (logLines.length) needleLog("needle-dependencies", logLines.join("\n"));
71
68
  }
72
69
 
73
70
  /**
74
71
  * @param {import('vite').UserConfig} config
75
72
  */
76
73
  function handleManualChunks(config) {
77
- const logLines = [];
78
74
  if (!config.build) {
79
75
  config.build = {};
80
76
  }
@@ -89,7 +85,7 @@ function handleManualChunks(config) {
89
85
 
90
86
  if (Array.isArray(rollupOutput)) {
91
87
  // append the manualChunks function to the array
92
- logLines.push("registering manualChunks");
88
+ console.log("[needle-dependencies] registering manualChunks");
93
89
  rollupOutput.push({
94
90
  manualChunks: needleManualChunks
95
91
  })
@@ -100,39 +96,37 @@ function handleManualChunks(config) {
100
96
  if ("manualChunks" in rollupOutput) {
101
97
  allowManualChunks = false;
102
98
  // if the user has already defined manualChunks (even when set to undefined), we don't want to overwrite it
103
- logLines.push("manualChunks already found in vite config - will not overwrite it");
99
+ console.log("[needle-dependencies] manualChunks already found in vite config - will not overwrite it");
104
100
  }
105
101
  else if (rollupOutput.preserveModules === true) {
106
102
  allowManualChunks = false;
107
- logLines.push("manualChunks can not be registered because preserveModules is true");
103
+ console.log("[needle-dependencies] manualChunks can not be registered because preserveModules is true");
108
104
  }
109
105
  if (rollupOutput.inlineDynamicImports === true) {
110
106
  allowManualChunks = false;
111
- logLines.push("manualChunks can not be registered because inlineDynamicImports is true");
107
+ console.log("[needle-dependencies] manualChunks can not be registered because inlineDynamicImports is true");
112
108
  }
113
109
 
114
110
  if (allowManualChunks) {
115
- logLines.push("registering manualChunks");
111
+ console.log("[needle-dependencies] registering manualChunks");
116
112
  rollupOutput.manualChunks = needleManualChunks;
117
113
  }
118
114
 
119
115
  if (rollupOutput.chunkFileNames) {
120
- logLines.push("chunkFileNames already defined");
116
+ console.log("[needle-dependencies] chunkFileNames already defined");
121
117
  }
122
118
  else {
123
119
  rollupOutput.chunkFileNames = handleChunkFileNames;
124
120
  }
125
121
 
126
122
  if (rollupOutput.assetFileNames) {
127
- logLines.push("assetFileNames already defined");
123
+ console.log("[needle-dependencies] assetFileNames already defined");
128
124
  }
129
125
  else {
130
126
  rollupOutput.assetFileNames = assetFileNames;
131
127
  }
132
128
  }
133
129
 
134
- if (logLines.length) needleLog("needle-dependencies", logLines.join("\n"));
135
-
136
130
  // TODO: this was a test if it allows us to remove the sync import of postprocessing due to n8ao's import
137
131
  // config.build.rollupOptions.external = (source, importer, isResolved) => {
138
132
  // if (importer?.includes("node_modules/n8ao/") || importer?.includes("node_modules/postprocessing/")) {
@@ -165,7 +159,7 @@ function handleManualChunks(config) {
165
159
  }
166
160
  }
167
161
  catch (e) {
168
- needleLog("needle-dependencies", "Error reading version " + e, "warn");
162
+ console.warn("[needle-dependencies] Error reading version", e);
169
163
  }
170
164
  }
171
165
  else if (chunk.name === 'three') {
@@ -1,19 +1,13 @@
1
- // @ts-check
2
1
  import { exec, execSync } from 'child_process';
3
2
  import { existsSync, readFileSync, rmSync, statSync, writeFileSync } from 'fs';
4
3
  import path from 'path';
5
- import { needleLog } from './logging.js';
6
4
 
7
- /** @typedef {{dependencies?: Record<string, string>, devDependencies?: Record<string, string>}} PackageJson */
8
-
9
- /** @param {...string} msg */
5
+ const prefix = "[needle-dependency-watcher] ";
10
6
  function log(...msg) {
11
- needleLog("needle-dependency-watcher", msg.join(" "));
7
+ console.log(prefix, ...msg)
12
8
  }
13
9
 
14
10
  /**
15
- * @param {string} command
16
- * @param {unknown} config
17
11
  * @param {import('../types').userSettings} userSettings
18
12
  */
19
13
  export const needleDependencyWatcher = (command, config, userSettings) => {
@@ -25,26 +19,17 @@ export const needleDependencyWatcher = (command, config, userSettings) => {
25
19
  const packageJsonPath = path.join(dir, "package.json");
26
20
  const viteCacheDir = path.join(dir, "node_modules", ".vite");
27
21
 
28
- return /** @type {import('vite').Plugin} */ ({
22
+ return {
29
23
  name: 'needle-dependency-watcher',
30
- /** @param {import('vite').ViteDevServer} server */
31
24
  configureServer(server) {
25
+ watchPackageJson(server, dir, packageJsonPath, viteCacheDir);
32
26
  manageClients(server);
33
- const startWatching = () => watchPackageJson(server, dir, packageJsonPath, viteCacheDir);
34
- if (server.httpServer?.listening) {
35
- startWatching();
36
- }
37
- else {
38
- server.httpServer?.once("listening", startWatching);
39
- }
40
27
  }
41
- });
28
+ }
42
29
  }
43
30
 
44
- /** @type {Set<{send: (data: string) => void, on: (event: string, cb: () => void) => void}>} */
45
31
  const currentClients = new Set();
46
32
 
47
- /** @param {import('vite').ViteDevServer} server */
48
33
  function manageClients(server) {
49
34
  server.ws.on("connection", (socket) => {
50
35
  currentClients.add(socket);
@@ -65,22 +50,12 @@ async function triggerReloadOnClients() {
65
50
  }
66
51
 
67
52
 
68
- /** @type {import('fs').Stats | undefined} */
69
53
  let packageJsonStat;
70
- /** @type {Date | undefined} */
71
54
  let lastEditTime;
72
- /** @type {number | undefined} */
73
55
  let packageJsonSize;
74
- /** @type {PackageJson | undefined} */
75
56
  let packageJson;
76
57
  let requireInstall = false;
77
58
 
78
- /**
79
- * @param {import('vite').ViteDevServer} server
80
- * @param {string} projectDir
81
- * @param {string} packageJsonPath
82
- * @param {string} cachePath
83
- */
84
59
  function watchPackageJson(server, projectDir, packageJsonPath, cachePath) {
85
60
 
86
61
  if (!existsSync(packageJsonPath)) {
@@ -93,7 +68,6 @@ function watchPackageJson(server, projectDir, packageJsonPath, cachePath) {
93
68
  packageJsonStat = statSync(packageJsonPath);
94
69
  lastEditTime = packageJsonStat.mtime;
95
70
  packageJsonSize = packageJsonStat.size;
96
- /** @type {PackageJson} */
97
71
  packageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
98
72
 
99
73
  setTimeout(() => {
@@ -117,7 +91,7 @@ function watchPackageJson(server, projectDir, packageJsonPath, cachePath) {
117
91
  }
118
92
 
119
93
  // test if dependencies changed
120
- let newPackageJson = /** @type {PackageJson} */ (JSON.parse(readFileSync(packageJsonPath, "utf8")));
94
+ let newPackageJson = JSON.parse(readFileSync(packageJsonPath, "utf8"));
121
95
  if (newPackageJson.dependencies) {
122
96
  for (const key in newPackageJson.dependencies) {
123
97
  if (packageJson.dependencies[key] !== newPackageJson.dependencies[key] && newPackageJson.dependencies[key] !== undefined) {
@@ -151,7 +125,6 @@ function watchPackageJson(server, projectDir, packageJsonPath, cachePath) {
151
125
  }, 2000);
152
126
  }
153
127
 
154
- /** @param {string} projectDir @param {PackageJson | undefined} packageJson @returns {boolean} */
155
128
  function testIfInstallIsRequired(projectDir, packageJson) {
156
129
  if (packageJson.dependencies) {
157
130
  for (const key in packageJson.dependencies) {
@@ -222,7 +195,6 @@ let isRunningRestart = false;
222
195
  let restartId = 0;
223
196
  let lastRestartTime = 0;
224
197
 
225
- /** @param {import('vite').ViteDevServer} server @param {string} projectDir @param {string} cachePath */
226
198
  async function restart(server, projectDir, cachePath) {
227
199
 
228
200
  if (isRunningRestart) return;
@@ -261,7 +233,7 @@ async function restart(server, projectDir, cachePath) {
261
233
  server.restart();
262
234
  }
263
235
  isRunningRestart = false;
264
- needleLog("needle-dependency-watcher", "-----------------------------------------------");
236
+ console.log("-----------------------------------------------")
265
237
  }
266
238
  catch (err) {
267
239
  log("Error restarting server", err);
@@ -6,8 +6,8 @@ import { Context, destroy, loadSync } from "@needle-tools/engine"
6
6
 
7
7
  if (import.meta?.hot) {
8
8
 
9
- const previouslyLoaded = /** @type {unknown[]} */ ([]);
10
- import.meta.hot.on("needle-editor:exported-file", async (/** @type {{ path: string }} */ msg) => {
9
+ const previouslyLoaded = [];
10
+ import.meta.hot.on("needle-editor:exported-file", async msg => {
11
11
  try {
12
12
  console.log(msg);
13
13
  const ctx = Context.Current;
@@ -21,12 +21,11 @@ if (import.meta?.hot) {
21
21
  console.log(glb);
22
22
  ctx.scene.add(glb.scene);
23
23
  }
24
- catch (/** @type {unknown} */ err) {
24
+ catch (err) {
25
25
  console.error(err);
26
26
  }
27
27
  })
28
28
 
29
- /** @param {unknown} target */
30
29
  function isNeedleCanvas(target) {
31
30
  if (target instanceof HTMLCanvasElement) {
32
31
  return true
@@ -46,9 +45,8 @@ if (import.meta?.hot) {
46
45
 
47
46
  window.addEventListener('drop', (e) => {
48
47
  if (!isNeedleCanvas(e.target)) return;
49
- if (!e.dataTransfer) return;
50
48
 
51
- for (const file of /** @type {Iterable<File>} */ (e.dataTransfer.files)) {
49
+ for (const file of e.dataTransfer.files) {
52
50
  if (file.name.endsWith(".prefab") ||
53
51
  file.name.endsWith(".fbx") ||
54
52
  file.name.endsWith(".gltf") ||
@@ -62,7 +60,7 @@ if (import.meta?.hot) {
62
60
  name: file.name,
63
61
  size: file.size,
64
62
  lastModified: file.lastModified,
65
- location: /** @type {{ x: number, y: number, z: number } | undefined} */ (undefined)
63
+ location: undefined
66
64
  };
67
65
 
68
66
  const hits = Context.Current?.physics.raycast();
@@ -8,8 +8,6 @@ const __dirname = path.dirname(__filename);
8
8
 
9
9
  /** experimental, allow dropping files from Unity into the running scene */
10
10
  /**
11
- * @param {string} command
12
- * @param {import('../types/needleConfig').needleMeta | null | undefined} config
13
11
  * @param {import('../types/userconfig.js').userSettings} userSettings
14
12
  */
15
13
  export const needleDrop = (command, config, userSettings) => {
@@ -19,16 +17,16 @@ export const needleDrop = (command, config, userSettings) => {
19
17
 
20
18
  return {
21
19
  name: "needle:drop",
22
- config(/** @type {{ server?: { hmr?: { port?: number } } }} */ viteConfig) {
20
+ config(config) {
23
21
  if(userSettings)
24
- if (!viteConfig.server) viteConfig.server = {};
25
- if (!viteConfig.server.hmr) viteConfig.server.hmr = {};
26
- viteConfig.server.hmr.port = 8080;
27
- setTimeout(() => console.log("Update HMR port to " + viteConfig.server?.hmr?.port));
22
+ if (!config.server) config.server = {};
23
+ if (!config.server.hmr) config.server.hmr = {};
24
+ config.server.hmr.port = 8080;
25
+ setTimeout(() => console.log("Update HMR port to " + config.server.hmr.port));
28
26
  },
29
27
  transformIndexHtml: {
30
28
  order: 'pre',
31
- handler(/** @type {string} */ html, /** @type {unknown} */ _) {
29
+ handler(html, _) {
32
30
  const file = path.join(__dirname, 'drop-client.js');
33
31
  return [
34
32
  {
@@ -42,28 +40,28 @@ export const needleDrop = (command, config, userSettings) => {
42
40
  ];
43
41
  },
44
42
  },
45
- configureServer(/** @type {{ ws: { on(event: string, cb: (...args: unknown[]) => void): void, send(type: string, data?: unknown): void } }} */ server) {
43
+ configureServer(server) {
46
44
 
47
- server.ws.on('needle:drop-file', async (/** @type {unknown} */ data, /** @type {unknown} */ client) => {
48
- server.ws.send('needle-editor:drop-file', data);
45
+ server.ws.on('needle:drop-file', async (data, client) => {
46
+ server.ws.send({ type: 'needle-editor:drop-file', data: data });
49
47
  });
50
48
  // TODO: not sure how we can receive it with the normal vite server
51
49
  // server.ws.on("custom", (data, client) => {
52
50
  // console.log(data);
53
51
  // })
54
52
 
55
- server.ws.on('connection', (/** @type {{ on(event: string, cb: (...args: unknown[]) => void): void }} */ socket, /** @type {unknown} */ request) => {
56
- socket.on('message', async (/** @type {Buffer | string} */ bytes) => {
53
+ server.ws.on('connection', (socket, request) => {
54
+ socket.on('message', async (bytes) => {
57
55
  try {
58
- const message = Buffer.from(/** @type {ArrayBuffer} */ (bytes)).toString();
56
+ const message = Buffer.from(bytes).toString();
59
57
  if (message && message.startsWith("{")) {
60
- const obj = /** @type {{ type: string, data: unknown }} */ (JSON.parse(message));
58
+ const obj = JSON.parse(message);
61
59
  if (obj.type === "needle-editor:exported-file") {
62
60
  server.ws.send(obj.type, obj.data);
63
61
  }
64
62
  }
65
63
  }
66
- catch (/** @type {{ message?: string }} */ e) {
64
+ catch (e) {
67
65
  console.error(e.message);
68
66
  }
69
67
  });
@@ -1,5 +1,4 @@
1
1
  import { existsSync } from "fs";
2
- import { needleLog } from "./logging.js";
3
2
 
4
3
  const root = process.cwd();
5
4
 
@@ -14,7 +13,7 @@ const editorSyncPackageName = "@needle-tools/editor-sync"
14
13
  let editorSyncEnabled = false;
15
14
 
16
15
  /**
17
- * @type {(command: string, config: { generator?: string | null, needleEditor?: { enabled?: boolean } | string | null, dontInstallEditor?: boolean }, userSettings: { dontInstallEditor?: boolean }, pluginsArray: unknown[]) => Promise<import('vite').Plugin | undefined>}
16
+ * @param {import('../types').userSettings} userSettings
18
17
  */
19
18
  export const editorConnection = async (command, config, userSettings, pluginsArray) => {
20
19
  if (command === "build") return;
@@ -23,7 +22,7 @@ export const editorConnection = async (command, config, userSettings, pluginsArr
23
22
  if (typeof config.generator === "string" && !config.generator.includes("Unity")) return;
24
23
 
25
24
  if (!config) {
26
- setTimeout(() => needleLog("needle-editor-sync", "Needle Editor Sync can not be installed automatically to vite: missing config", "warn"), 1000);
25
+ setTimeout(() => console.log("Needle Editor Sync can not be installed automatically to vite: missing config"), 1000);
27
26
  return createPlugin(false);
28
27
  }
29
28
 
@@ -38,31 +37,29 @@ export const editorConnection = async (command, config, userSettings, pluginsArr
38
37
  // }
39
38
  // }
40
39
  if (needleEditorSettings && needleEditorSettings.enabled === false) {
41
- setTimeout(() => needleLog("needle-editor-sync", "Needle Editor Sync is not enabled. Add a 'Needle Editor Sync' component to your scene to enable", "warn"), 1000);
40
+ setTimeout(() => console.log("Needle Editor Sync is not enabled. Add a 'Needle Editor Sync' component to your scene to enable"), 1000);
42
41
  return createPlugin(false);
43
42
  }
44
43
 
45
44
  // Check if the editor package is installed
46
45
  let path = root + `/node_modules/${editorSyncPackageName}/plugins/index.js`;
47
46
  if (existsSync(path) === false) {
48
- setTimeout(() => needleLog("needle-editor-sync", `${editorSyncPackageName} is not installed: Add the "Needle Editor Sync" component to your scene if you want to send changes directly from the Unity Editor to web app`, "warn"), 1000);
47
+ setTimeout(() => console.log(`> ${editorSyncPackageName} is not installed: Add the "Needle Editor Sync" component to your scene if you want to send changes directly from the Unity Editor to web app`), 1000);
49
48
  return createPlugin(false);
50
49
  }
51
50
 
52
51
 
53
52
  // Load vite plugin
54
53
  if (!path.startsWith("file:")) path = "file:" + path;
55
- const { needleEditor } = /** @type {{ needleEditor: () => Record<string, unknown> }} */ (await import(path));
56
- setTimeout(() => needleLog("needle-editor-sync", "Automatically installed Needle Editor Sync"), 500)
54
+ const { needleEditor } = await import(path);
55
+ setTimeout(() => console.log("Automatically installed Needle Editor Sync"), 500)
57
56
  const method = needleEditor();
58
- const typedPluginsArray = /** @type {Array<Record<string, unknown>>} */ (pluginsArray);
59
- typedPluginsArray.push(method);
57
+ pluginsArray.push(method);
60
58
  return createPlugin(true);
61
59
  }
62
60
 
63
- /** @param {boolean} isInstalled */
64
61
  function createPlugin(isInstalled) {
65
- return /** @type {import('vite').Plugin} */ ({
62
+ return {
66
63
  name: "needle-editor-connection",
67
64
  // Setup HMR port for connecting to the editor
68
65
  config(config) {
@@ -70,12 +67,12 @@ function createPlugin(isInstalled) {
70
67
  if (!config.server) config.server = {};
71
68
  if (!config.server.hmr) config.server.hmr = {};
72
69
  if (config.server.hmr === false) {
73
- setTimeout(() => needleLog("needle-editor-sync", "HMR is disabled, not initializing Needle Editor", "warn"));
70
+ setTimeout(() => console.log("[needle-editor-sync] HMR is disabled, not initializing Needle Editor"));
74
71
  return;
75
72
  }
76
73
  if (config.server.hmr.port === undefined) {
77
74
  config.server.hmr.port = 1107;
78
- setTimeout(() => needleLog("needle-editor-sync", "Update HMR port to " + config.server.hmr.port));
75
+ setTimeout(() => console.log("[needle-editor-sync] Update HMR port to " + config.server.hmr.port));
79
76
  }
80
77
  }
81
78
 
@@ -97,7 +94,7 @@ function createPlugin(isInstalled) {
97
94
  if (bytes?.length < 50) {
98
95
  const message = Buffer.from(bytes).toString();
99
96
  if (message === "needle:editor:restart") {
100
- needleLog("needle-editor-sync", "Received request for a soft restart of the vite server...")
97
+ console.log("Received request for a soft restart of the vite server... ")
101
98
  // This just restarts the vite server
102
99
  server.restart();
103
100
  }
@@ -108,7 +105,7 @@ function createPlugin(isInstalled) {
108
105
  socket.send(JSON.stringify({ type: "pong" }));
109
106
  }
110
107
  else if (message === "needle:editor:editor-sync-enabled") {
111
- needleLog("needle-editor-sync", "Editor sync enabled")
108
+ console.log("Editor sync enabled")
112
109
  editorSyncEnabled = true;
113
110
  }
114
111
  else if (message === "needle:editor:editor-sync-disabled") {
@@ -118,10 +115,11 @@ function createPlugin(isInstalled) {
118
115
  })
119
116
  });
120
117
  }
121
- catch(/** @type {unknown} */ err){
122
- needleLog("needle-editor-sync", "Error in needle-editor-connection", "error")
118
+ catch(err){
119
+ console.error("Error in needle-editor-connection")
123
120
  console.error(err)
124
121
  }
125
122
  }
126
- })
123
+
124
+ }
127
125
  }
@@ -1,20 +1,14 @@
1
- // @ts-check
2
1
  import path from 'path';
3
2
  import fs from 'fs';
4
3
 
5
- /** @typedef {{ id: string, imports: GraphNode[], importedBy: GraphNode[] }} GraphNode */
6
-
7
4
  /**
8
- * @param {string} command
9
- * @param {unknown} config
10
5
  * @param {import('../types').userSettings} userSettings
11
6
  */
12
7
  export const needleImportsLogger = (command, config, userSettings) => {
13
8
 
14
9
  if (!userSettings.debugImportChains) return;
15
10
 
16
- /** @type {{allNodes: Map<string, GraphNode>, graph: Record<string, unknown>}} */
17
- const graph = {
11
+ const graph = {
18
12
  allNodes: new Map(),
19
13
  graph: {},
20
14
  };
@@ -27,7 +21,6 @@ export const needleImportsLogger = (command, config, userSettings) => {
27
21
  return {
28
22
  name: 'needle:imports-logger',
29
23
  enforce: 'pre',
30
- /** @param {string} id @param {string | undefined} importer */
31
24
  resolveId(id, importer) {
32
25
 
33
26
  // we want to make a graph of all the imports
@@ -64,7 +57,6 @@ export const needleImportsLogger = (command, config, userSettings) => {
64
57
 
65
58
  return;
66
59
  },
67
- /** @param {Error | undefined} [error] */
68
60
  buildEnd(error) {
69
61
  try {
70
62
  // create log file and append lines to it
@@ -72,7 +64,6 @@ export const needleImportsLogger = (command, config, userSettings) => {
72
64
  // append a single line efficiently; replace if necessary
73
65
  const fd = fs.openSync(logFile, "w");
74
66
 
75
- /** @param {string} str */
76
67
  const write = (str) => {
77
68
  if (logToConsole)
78
69
  console.log(str);
@@ -85,8 +76,7 @@ export const needleImportsLogger = (command, config, userSettings) => {
85
76
  }
86
77
 
87
78
  // log graph
88
- const loggedNodes = /** @type {Set<string>} */ (new Set());
89
- /** @param {GraphNode} node @param {number} depth @param {0|1|2} type */
79
+ const loggedNodes = new Set();
90
80
  const logNode = (node, depth, type) => {
91
81
  if (!showOneLevelOfImportsThatWereAlreadyLogged && loggedNodes.has(node.id))
92
82
  return;