import { License } from "./license.js"; export type needleModules = { webpack: object | undefined } /** * Settings for the Needle plugin */ export type userSettings = { /** disable needle asap plugin and glTF / GLB preload links */ noAsap?: boolean; /** disable vite.alias modification */ noAlias?: boolean; /** * Set to `true` to disable development telemetry. During `vite serve` the Needle * plugin forwards Needle-origin server errors (build / dev-server / misconfig * failures) to the analytics backend so engine bugs are visible. Messages and * stacks are sanitized (secrets + user paths stripped) before sending, and only * Needle-related errors are forwarded - never browser/runtime logs. * Can also be disabled via the NEEDLE_TELEMETRY=0 / NEEDLE_NO_TELEMETRY=1 env vars. * @default false */ noTelemetry?: boolean; /** Enable verbose debug output for needle plugins. */ debug?: boolean; /** * When set to `true` a plugin will log all alias resolutions to a file in the project node_modules directory * @default false */ debugAlias?: boolean; /** disable automatic copying of files to include and output directory (dist) */ noCopy?: boolean; /** When enabled the needle-engine include directory will be copied */ copyIncludesFromEngine?: boolean; /** Set to `false` to prevent the Rapier physics engine from loading. * NOTE: by default Needle Engine uses dynamic loading of the Rapier physics engine. This means that the Rapier code is only loaded when a physics component is used in the scene. */ useRapier?: boolean; /** Set to `false` to prevent postprocessing effects from loading. * NOTE: by default Needle Engine uses dynamic loading of postprocessing modules. This means that the postprocessing code is only loaded when a postprocessing effect is used in the scene. */ usePostprocessing?: boolean; noDependencyWatcher?: boolean; /** set to false to suppress editor-sync package installation and connection */ dontInstallEditor?: boolean; /** set to false to prevent meta.html modifications (vite only) */ allowMetaPlugin?: boolean; /** set to true to prevent injecting peerjs `parcelRequire` global variable declaration */ noPeer?: boolean; /** set to true to disable reload plugin */ noReload?: boolean; /** Set to false to disable hot reload for the needle plugin. */ allowHotReload?: boolean; /** When enabled the Vite drop plugin will be enabled. @default false */ useDrop?: boolean; noCodegenTransform?: boolean; noFacebookInstantGames?: boolean; /** Custom configuration for facebook instant games. */ facebookInstantGames?: {} /** Set to true to create an imports.log file that shows all module imports. The file is generated when stopping the server. */ debugImportChains?: boolean; /** Set to true to disable generating the buildinfo.json file in your output directory */ noBuildInfo?: boolean; /** Set to true to disable the needle build pipeline (running compression and optimization as a postprocessing step on the exported glTF files) */ noBuildPipeline?: boolean; /** * Use to configure optimized builds */ buildPipeline?: { /** Set to false to prevent the build pipeline from running */ enabled?: boolean, /** Set a project name (cloud only) */ projectName?: string, /** Enable for verbose log output */ verbose?: boolean, /** Set to a specific version of the Needle Build Pipeline used for local compression. * Must be 3.x or newer (earlier versions don't support the required license auth). * @default "3" * @example "3.0.0" */ version?: string; /** If defined the access token will be used to run compression on Needle Cloud. * * Expected to be a Needle Cloud access token (created in the Needle Cloud UI), * NOT a JWT. Do not pass a licensing JWT here. */ accessToken?: string | undefined; /** Where to run asset compression. * - `"cloud"` (default when an access token / NEEDLE_CLOUD_TOKEN is available): * compress on Needle Cloud. * - `"local"`: always compress on the build machine, even when a token is set. * The token is still used to authenticate the license (so CI builds don't need * interactive login) — it just won't upload assets for cloud compression. * @default "cloud" */ compression?: "cloud" | "local"; /** * The max duration the build pipeline will wait for the website bundling process to finish. After bundling has finished the pipeline will start processing the exported glTF files. * Default is 60000 (60 seconds) * @default 60000 */ maxWaitDuration?: number; // in ms, default 60000 (60 seconds) } /** required for @serializable https://github.com/vitejs/vite/issues/13736 */ vite44Hack?: boolean; /** set to true to disable poster generation */ noPoster?: boolean; // posterFormat?: "image/webp";// | "image/png"; /** * Use "default" to always generate the poster after 'src' has changed * Use "once" to generate the poster only once, when no poster already exists */ posterGenerationMode?: "default" | "once"; /** Pass in PWA options, `true` to enable with defaults, or `false` to disable. * Options are forwarded to `vite-plugin-pwa`. */ pwa?: Record | boolean; /** used by nextjs config to forward the webpack module */ modules?: needleModules; /** * Use to activate a needle engine license */ license?: License; /** Enable verbose logging */ debugLicense?: boolean; /** * When enabled, external CDN URLs are downloaded at build time and bundled locally. * This creates fully self-contained deployments that work without internet access. * * - `true` — enable with all features (download everything) * - `"auto"` — automatically detect which features the project uses and only include those * - `{ enabled: true }` — same as `true` * - `{ enabled: true, features: "auto" }` — same as `"auto"` * - `{ enabled: true, features: ["draco", "ktx2"] }` — only include specific features * - `{ enabled: true, excludeFeatures: ["xr"] }` — include all except specific features * - `{ enabled: true, features: "auto", excludeFeatures: ["skybox"] }` — auto-detect but exclude specific features * * Available features: * - `"draco"` — Draco mesh decoders * - `"ktx2"` — KTX2/Basis texture transcoders * - `"materialx"` — MaterialX WASM shader compiler * - `"xr"` — WebXR input profiles (controllers/hands) * - `"skybox"` — Skybox/environment textures * - `"fonts"` — Google Fonts CSS + font files * - `"needle-fonts"` — Needle font assets (MSDF, etc.) * - `"needle-models"` — Needle models * - `"needle-avatars"` — Needle avatars * - `"polyhaven"` — Polyhaven HDRIs/models * - `"cdn-scripts"` — Third-party scripts (QRCode.js, vConsole, HLS.js) * - `"github-content"` — GitHub raw content files * - `"threejs-models"` — three.js example models * - `"needle-uploads"` — Needle uploads assets */ makeFilesLocal?: boolean | "auto" | { enabled: boolean; /** URL patterns to exclude from making local */ exclude?: string[]; /** Target platform preset */ platform?: "discord" | "facebook-instant" | null; /** * Feature categories to include. * - `"auto"` — Automatically detect which features the project uses. * - `FeatureName[]` — Explicit list. When set, ONLY these features are processed. * - When omitted, ALL features are included. */ features?: "auto" | Array<"draco" | "ktx2" | "materialx" | "xr" | "skybox" | "fonts" | "needle-fonts" | "needle-models" | "needle-avatars" | "polyhaven" | "cdn-scripts" | "github-content" | "threejs-models" | "needle-uploads">; /** Feature categories to exclude. Applied after `features` (including after auto-detection). */ excludeFeatures?: Array<"draco" | "ktx2" | "materialx" | "xr" | "skybox" | "fonts" | "needle-fonts" | "needle-models" | "needle-avatars" | "polyhaven" | "cdn-scripts" | "github-content" | "threejs-models" | "needle-uploads">; } /** * When set to `true` a plugin will automatically attempt to open the browser using a network ip address when the local server has started * @default undefined */ openBrowser?: boolean; /** * Enable remote debugging: bind the dev server to your local network (`host`) * and serve over HTTPS (via `@vitejs/plugin-basic-ssl`) so you can open the page * on a phone, Quest or Apple Vision Pro on the same Wi‑Fi. The Needle logger * already streams the device's console, errors and device info back over Vite's * websocket (see `node_modules/.needle/logs/latest.client.needle.log`), so this * makes "debug a scene on a real device from your laptop" work out of the box. * HTTPS is required for WebXR / secure‑context features on the device; the * self‑signed certificate shows a one‑time warning you accept on the device. * * Requires `@vitejs/plugin-basic-ssl` (for HTTPS) and, optionally, * `qrcode-terminal` (to print a scannable QR code). Can also be toggled with the * `NEEDLE_REMOTE` env var (`NEEDLE_REMOTE=1` / `=false`). * - `true` — enable with a terminal QR code * - `{ qr: false }` — enable but don't print the QR code * @default false */ remote?: boolean | { /** Set to false to skip printing the scannable QR code. @default true */ qr?: boolean; }; disableLogging?: boolean; /** Set to true to disable the plugin that ensures VSCode workspace settings for custom-elements.json data */ noCustomElementData?: boolean; /** * Configure installation of local AI assistant skill files. * The files install during dev server startup by default. Build-time * installation is opt-in because builds should not normally mutate the * project directory or fetch helper documentation. */ ai?: { /** Set to false to disable AI helper file installation. Can also be disabled with NEEDLE_AI=false or NEEDLE_AI=0 (case-insensitive). */ install?: boolean; /** Set to true to install AI helper files during Vite builds. @default false */ installDuringBuild?: boolean; /** Set to false to skip downloading linked reference files during dev-server installation. @default true */ downloadReferences?: boolean; /** Set to true to download linked reference files during build-time installation. @default false */ downloadReferencesDuringBuild?: boolean; }; /** * Generate Typescript declaration files for references 3D assets in your project. * These will be available via `context.sceneData` in your code. * @default enabled */ dts?: { /** When set to false, disables the generation of TypeScript declaration files. * @default true */ enabled?: boolean; } }