@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.
- package/components.needle.json +1 -1
- package/dist/{gltf-progressive-CTlvpS3A.js → gltf-progressive-Bm_6aEi4.js} +1 -1
- package/dist/{gltf-progressive-CMwJPwEt.umd.cjs → gltf-progressive-BttGBXw6.umd.cjs} +1 -1
- package/dist/{gltf-progressive-DYL3SLVb.min.js → gltf-progressive-T5WKTux5.min.js} +1 -1
- package/dist/materialx-CJyQZtjt.min.js +90 -0
- package/dist/materialx-DMs1E08Z.js +4636 -0
- package/dist/materialx-DaKKOoVk.umd.cjs +90 -0
- package/dist/{needle-engine.bundle-DsTdfmeb.min.js → needle-engine.bundle-CBq_OMnI.min.js} +122 -124
- package/dist/{needle-engine.bundle-DB4kLWO_.js → needle-engine.bundle-DGyiwNWR.js} +3226 -3232
- package/dist/{needle-engine.bundle-C1BFRZDF.umd.cjs → needle-engine.bundle-JN3eiiYc.umd.cjs} +113 -115
- package/dist/needle-engine.d.ts +52 -33
- package/dist/needle-engine.js +288 -287
- package/dist/needle-engine.min.js +1 -1
- package/dist/needle-engine.umd.cjs +1 -1
- package/dist/{postprocessing-BN-f4viE.min.js → postprocessing-06AXuvdv.min.js} +1 -1
- package/dist/{postprocessing-De9ZpJrk.js → postprocessing-CI2x8Cln.js} +1 -1
- package/dist/{postprocessing-DYmYOVm4.umd.cjs → postprocessing-CPDcA21P.umd.cjs} +1 -1
- package/dist/{three-examples-BHqRVpO_.umd.cjs → three-examples-BMmNgNCN.umd.cjs} +12 -12
- package/dist/{three-examples-C0ZCCA_K.js → three-examples-CMYCd5nH.js} +192 -182
- package/dist/{three-examples-DmTY8tGr.min.js → three-examples-CQl1fFZp.min.js} +14 -14
- package/lib/engine/api.d.ts +2 -0
- package/lib/engine/api.js +2 -0
- package/lib/engine/api.js.map +1 -1
- package/lib/engine/debug/debug.js +1 -1
- package/lib/engine/debug/debug.js.map +1 -1
- package/lib/engine/debug/debug_spatial_console.js +1 -1
- package/lib/engine/debug/debug_spatial_console.js.map +1 -1
- package/lib/engine/engine_accessibility.d.ts +1 -1
- package/lib/engine/engine_accessibility.js +1 -1
- package/lib/engine/engine_accessibility.js.map +1 -1
- package/lib/engine/engine_context.d.ts +1 -1
- package/lib/engine/engine_context.js +2 -2
- package/lib/engine/engine_context.js.map +1 -1
- package/lib/engine/engine_create_objects.js +1 -1
- package/lib/engine/engine_create_objects.js.map +1 -1
- package/lib/engine/engine_gizmos.js +1 -1
- package/lib/engine/engine_gizmos.js.map +1 -1
- package/lib/engine/engine_license.js +2 -7
- package/lib/engine/engine_license.js.map +1 -1
- package/lib/engine/engine_test_utils.d.ts +39 -0
- package/lib/engine/engine_test_utils.js +84 -0
- package/lib/engine/engine_test_utils.js.map +1 -0
- package/lib/engine/engine_utils.js +2 -2
- package/lib/engine/engine_utils.js.map +1 -1
- package/lib/engine/export/gltf/index.js +1 -1
- package/lib/engine/export/gltf/index.js.map +1 -1
- package/lib/engine/webcomponents/logo-element.d.ts +3 -6
- package/lib/engine/webcomponents/logo-element.js +0 -18
- package/lib/engine/webcomponents/logo-element.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js +2 -2
- package/lib/engine/webcomponents/needle menu/needle-menu-spatial.js.map +1 -1
- package/lib/engine/webcomponents/needle menu/needle-menu.d.ts +7 -10
- package/lib/engine/webcomponents/needle menu/needle-menu.js +4 -14
- package/lib/engine/webcomponents/needle menu/needle-menu.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.ar-overlay.js +1 -10
- package/lib/engine/webcomponents/needle-engine.ar-overlay.js.map +1 -1
- package/lib/engine/webcomponents/needle-engine.d.ts +0 -3
- package/lib/engine/webcomponents/needle-engine.js +0 -10
- package/lib/engine/webcomponents/needle-engine.js.map +1 -1
- package/lib/engine-components/Component.js +1 -0
- package/lib/engine-components/Component.js.map +1 -1
- package/lib/engine-components/ReflectionProbe.d.ts +2 -24
- package/lib/engine-components/ReflectionProbe.js +2 -28
- package/lib/engine-components/ReflectionProbe.js.map +1 -1
- package/lib/engine-components/Skybox.js +2 -4
- package/lib/engine-components/Skybox.js.map +1 -1
- package/lib/engine-components/export/gltf/GltfExport.js +1 -1
- package/lib/engine-components/export/gltf/GltfExport.js.map +1 -1
- package/lib/engine-components/export/usdz/ThreeUSDZExporter.js +2 -2
- package/lib/engine-components/export/usdz/USDZExporter.js +1 -1
- package/lib/engine-components/export/usdz/USDZExporter.js.map +1 -1
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js +2 -2
- package/lib/engine-components/export/usdz/extensions/behavior/PhysicsExtension.js.map +1 -1
- package/lib/engine-components/postprocessing/Effects/Tonemapping.utils.d.ts +1 -1
- package/lib/include/three/EXT_mesh_gpu_instancing_exporter.js.map +1 -0
- package/package.json +14 -18
- package/plugins/common/buildinfo.js +10 -46
- package/plugins/common/files.js +1 -2
- package/plugins/common/license.js +69 -144
- package/plugins/common/logger.js +11 -172
- package/plugins/common/worker.js +4 -5
- package/plugins/types/userconfig.d.ts +2 -40
- package/plugins/vite/alias.js +5 -6
- package/plugins/vite/asap.js +5 -6
- package/plugins/vite/build-pipeline.js +41 -224
- package/plugins/vite/buildinfo.js +6 -66
- package/plugins/vite/copyfiles.js +12 -41
- package/plugins/vite/custom-element-data.js +16 -26
- package/plugins/vite/defines.js +5 -8
- package/plugins/vite/dependencies.js +10 -16
- package/plugins/vite/dependency-watcher.js +7 -35
- package/plugins/vite/drop-client.js +5 -7
- package/plugins/vite/drop.js +14 -16
- package/plugins/vite/editor-connection.js +16 -18
- package/plugins/vite/imports-logger.js +2 -12
- package/plugins/vite/index.js +3 -8
- package/plugins/vite/local-files.js +441 -2
- package/plugins/vite/logger.client.js +35 -45
- package/plugins/vite/logger.js +3 -6
- package/plugins/vite/meta.js +4 -18
- package/plugins/vite/needle-app.js +3 -4
- package/plugins/vite/peer.js +1 -2
- package/plugins/vite/pwa.js +17 -33
- package/plugins/vite/reload.js +2 -24
- package/src/engine/api.ts +3 -0
- package/src/engine/debug/debug.ts +1 -1
- package/src/engine/debug/debug_spatial_console.ts +1 -5
- package/src/engine/engine_accessibility.ts +1 -2
- package/src/engine/engine_context.ts +2 -2
- package/src/engine/engine_create_objects.ts +1 -1
- package/src/engine/engine_gizmos.ts +5 -9
- package/src/engine/engine_license.ts +2 -7
- package/src/engine/engine_test_utils.ts +109 -0
- package/src/engine/engine_utils.ts +2 -2
- package/src/engine/export/gltf/index.ts +1 -1
- package/src/engine/webcomponents/logo-element.ts +3 -20
- package/src/engine/webcomponents/needle menu/needle-menu-spatial.ts +2 -6
- package/src/engine/webcomponents/needle menu/needle-menu.ts +11 -23
- package/src/engine/webcomponents/needle-engine.ar-overlay.ts +2 -13
- package/src/engine/webcomponents/needle-engine.ts +1 -13
- package/src/engine-components/Component.ts +2 -1
- package/src/engine-components/ReflectionProbe.ts +9 -33
- package/src/engine-components/Skybox.ts +2 -4
- package/src/engine-components/export/gltf/GltfExport.ts +1 -1
- package/src/engine-components/export/usdz/ThreeUSDZExporter.ts +2 -2
- package/src/engine-components/export/usdz/USDZExporter.ts +1 -1
- package/src/engine-components/export/usdz/extensions/behavior/PhysicsExtension.ts +2 -2
- package/src/include/draco/draco_decoder.js +34 -0
- package/src/include/draco/draco_decoder.wasm +0 -0
- package/src/include/draco/draco_wasm_wrapper.js +117 -0
- package/src/include/ktx2/basis_transcoder.js +19 -0
- package/src/include/ktx2/basis_transcoder.wasm +0 -0
- package/src/include/needle/arial-msdf.json +1472 -0
- package/src/include/needle/arial.png +0 -0
- package/src/include/needle/poweredbyneedle.webp +0 -0
- package/dist/materialx-4jJLLe9Q.js +0 -4174
- package/dist/materialx-Bt9FHwco.min.js +0 -158
- package/dist/materialx-NDD0y4JY.umd.cjs +0 -158
- package/lib/engine/export/gltf/EXT_mesh_gpu_instancing_exporter.js.map +0 -1
- package/plugins/common/needle-engine-skill.md +0 -175
- package/plugins/vite/ai.js +0 -71
- package/plugins/vite/local-files-analysis.js +0 -789
- package/plugins/vite/local-files-core.js +0 -992
- package/plugins/vite/local-files-internals.js +0 -28
- package/plugins/vite/local-files-types.d.ts +0 -111
- package/plugins/vite/local-files-utils.js +0 -359
- package/plugins/vite/logging.js +0 -129
- /package/lib/{engine/export/gltf → include/three}/EXT_mesh_gpu_instancing_exporter.d.ts +0 -0
- /package/lib/{engine/export/gltf → include/three}/EXT_mesh_gpu_instancing_exporter.js +0 -0
- /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 {
|
|
14
|
-
* @param {
|
|
15
|
-
* @returns {
|
|
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
|
|
81
|
-
const targetFile = path.join(cwd, '
|
|
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 =
|
|
83
|
+
const sourceData = JSON.parse(fs.readFileSync(sourceFile, 'utf8'));
|
|
87
84
|
|
|
88
|
-
let targetData =
|
|
85
|
+
let targetData = {};
|
|
89
86
|
if (fs.existsSync(targetFile)) {
|
|
90
87
|
// Merge with existing file to preserve user content
|
|
91
88
|
try {
|
|
92
|
-
targetData =
|
|
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 =
|
|
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,
|
|
159
|
+
/** @type {Record<string, any>} */
|
|
170
160
|
const settings = JSON.parse(rawSettings) || {};
|
|
171
|
-
|
|
172
|
-
settings['html.customData'] =
|
|
161
|
+
|
|
162
|
+
settings['html.customData'] = settings['html.customData'] || [];
|
|
173
163
|
|
|
174
164
|
// Remove old node_modules path if present
|
|
175
|
-
const oldIndex =
|
|
165
|
+
const oldIndex = settings['html.customData'].indexOf(oldNodeModulesPath);
|
|
176
166
|
if (oldIndex >= 0) {
|
|
177
|
-
|
|
167
|
+
settings['html.customData'].splice(oldIndex, 1);
|
|
178
168
|
}
|
|
179
169
|
|
|
180
170
|
// Add local path if not present
|
|
181
|
-
if (!
|
|
182
|
-
|
|
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);
|
package/plugins/vite/defines.js
CHANGED
|
@@ -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(
|
|
31
|
+
async config(viteConfig) {
|
|
35
32
|
// console.log("Update vite defines -------------------------------------------");
|
|
36
33
|
if (!viteConfig.define) viteConfig.define = {};
|
|
37
34
|
const version = tryGetNeedleEngineVersion();
|
|
38
|
-
|
|
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 =
|
|
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(
|
|
67
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
107
|
+
console.log("[needle-dependencies] manualChunks can not be registered because inlineDynamicImports is true");
|
|
112
108
|
}
|
|
113
109
|
|
|
114
110
|
if (allowManualChunks) {
|
|
115
|
-
|
|
111
|
+
console.log("[needle-dependencies] registering manualChunks");
|
|
116
112
|
rollupOutput.manualChunks = needleManualChunks;
|
|
117
113
|
}
|
|
118
114
|
|
|
119
115
|
if (rollupOutput.chunkFileNames) {
|
|
120
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
8
|
-
|
|
9
|
-
/** @param {...string} msg */
|
|
5
|
+
const prefix = "[needle-dependency-watcher] ";
|
|
10
6
|
function log(...msg) {
|
|
11
|
-
|
|
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
|
|
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 =
|
|
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
|
-
|
|
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 =
|
|
10
|
-
import.meta.hot.on("needle-editor:exported-file", async
|
|
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 (
|
|
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
|
|
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:
|
|
63
|
+
location: undefined
|
|
66
64
|
};
|
|
67
65
|
|
|
68
66
|
const hits = Context.Current?.physics.raycast();
|
package/plugins/vite/drop.js
CHANGED
|
@@ -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(
|
|
20
|
+
config(config) {
|
|
23
21
|
if(userSettings)
|
|
24
|
-
if (!
|
|
25
|
-
if (!
|
|
26
|
-
|
|
27
|
-
setTimeout(() => console.log("Update HMR port to " +
|
|
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(
|
|
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(
|
|
43
|
+
configureServer(server) {
|
|
46
44
|
|
|
47
|
-
server.ws.on('needle:drop-file', async (
|
|
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', (
|
|
56
|
-
socket.on('message', async (
|
|
53
|
+
server.ws.on('connection', (socket, request) => {
|
|
54
|
+
socket.on('message', async (bytes) => {
|
|
57
55
|
try {
|
|
58
|
-
const message = Buffer.from(
|
|
56
|
+
const message = Buffer.from(bytes).toString();
|
|
59
57
|
if (message && message.startsWith("{")) {
|
|
60
|
-
const obj =
|
|
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 (
|
|
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
|
-
* @
|
|
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(() =>
|
|
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(() =>
|
|
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(() =>
|
|
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 } =
|
|
56
|
-
setTimeout(() =>
|
|
54
|
+
const { needleEditor } = await import(path);
|
|
55
|
+
setTimeout(() => console.log("Automatically installed Needle Editor Sync"), 500)
|
|
57
56
|
const method = needleEditor();
|
|
58
|
-
|
|
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
|
|
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(() =>
|
|
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(() =>
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
122
|
-
|
|
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
|
-
|
|
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 =
|
|
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;
|