@needle-tools/engine
Version:
Needle Engine is a web-based runtime for 3D apps. It runs on your machine for development with great integrations into editors like Unity or Blender - and can be deployed onto any device! It is flexible, extensible and networking and XR are built-in.
150 lines (140 loc) • 5.45 kB
TypeScript
/**
* Shared type declarations for the local-files plugin family.
* Referenced from local-files-utils.js, local-files-analysis.js, local-files-core.js, etc.
*/
export interface UrlHandler {
name: string;
/** RegExp with the /g flag — match group 1 must capture the URL. */
pattern: RegExp;
type: "binary" | "css" | "decoder-dir" | "webxr-profiles";
feature: string;
decoderFiles?: string[];
localDirName?: string;
}
export interface LocalizationStats {
fileCount: number;
totalBytes: number;
mimeCounts: Map<string, number>;
}
/**
* Configuration for the `makeFilesLocal` build plugin.
* Controls which external CDN assets are downloaded at build time and bundled locally,
* producing fully self-contained deployments that work without internet access.
* Useful for playable ads, app stores requiring single-origin bundles, offline PWAs,
* and restricted hosting environments.
*/
export interface LocalizationOptions {
/**
* Which feature categories to include when downloading assets.
* - `"auto"` — scan project scene files and source code to detect which features are actually used, then only download those.
* - `string[]` — explicit list of feature names. When set, **only** these features are processed.
* - When omitted, **all** features are included.
*
* Available features:
* `"draco"`, `"ktx2"`, `"materialx"`, `"xr"`, `"skybox"`, `"fonts"`,
* `"needle-fonts"`, `"needle-models"`, `"needle-avatars"`, `"needle-branding"`,
* `"polyhaven"`, `"cdn-scripts"`, `"github-content"`, `"threejs-models"`, `"needle-uploads"`
*
* @example
* features: "auto"
* @example
* features: ["draco", "ktx2", "fonts"]
*/
features?: string | string[];
/**
* Feature categories to exclude. Applied **after** `features` (including after auto-detection).
* Use this to opt out of specific categories you don't need without having to list every other one.
*
* @example
* // Auto-detect everything except XR controller profiles
* { features: "auto", excludeFeatures: ["xr"] }
*/
excludeFeatures?: string[];
/** URL substrings or RegExps to skip. */
exclude?: (string | RegExp)[];
/** @deprecated use `exclude` */
excludeUrls?: string[];
/** e.g. "facebook-instant", "discord" */
platform?: string;
/** Only process files inside these npm packages. */
packages?: string[];
/** Skybox selection: URL, magic keyword, array of those, or "all". */
skybox?: string | string[];
/** WebXR controller profile mode: "minimal" | "quest" | "pico" | "all" */
webxr?: string;
/**
* Template-based URL expansion rules. Used for CDN URLs that contain template-literal
* variables (e.g. `${version}`, `${platform}`). The plugin expands every combination
* of the provided variable values, downloads each concrete URL, and rewrites the
* template literal to point at the local copy.
*
* @example
* templateExpansions: [{
* cdnPrefix: "https://cdn.example.com/decoders/",
* variables: { version: ["v1", "v2"], arch: ["wasm", "js"] },
* localPrefix: "decoders" // optional — derived from cdnPrefix when omitted
* }]
*/
templateExpansions?: Array<{
/** The CDN base URL that the template literals start with. */
cdnPrefix: string;
/** Map of variable names to all possible values. Every combination is expanded and downloaded. */
variables: Record<string, string[]>;
/** Local output subdirectory. Derived from `cdnPrefix` hostname when omitted. */
localPrefix?: string;
}>;
/** Used when makeFilesLocal is an object — set to false to disable. */
enabled?: boolean;
}
export interface AutoPolicy {
features: Set<string>;
hasWebXR: boolean;
hasVideoPlayer: boolean;
allowedSkyboxUrls: Set<string> | null;
selectedWebXRProfiles: string[];
}
export interface LocalizationContext {
/** The Rollup plugin context, available during build hooks (null in dev/serve). */
pluginContext: import('rollup').PluginContext | null;
cache: {
addToCache(key: string, value: Buffer | string): void;
getFromCache(key: string): Buffer | string | null;
readonly map: Map<string, Buffer | string>;
};
command: "build" | "serve";
viteConfig: { build?: { assetsDir?: string } } | null;
options: LocalizationOptions;
autoPolicy: AutoPolicy | null;
failedDownloads: Map<string, string>;
localizationStats: LocalizationStats;
}
export interface SceneAnalysisReport {
hasWebXRComponent: boolean;
hasVideoPlayerComponent: boolean;
extensions: Set<string>;
componentTypes: Set<string>;
componentCounts: Map<string, number>;
glbFileCount: number;
gltfFileCount: number;
totalSceneFileCount: number;
totalNodeCount: number;
totalVertexCount: number;
totalTextureCount: number;
totalMeshCount: number;
totalPrimitiveCount: number;
dracoPrimitiveCount: number;
meshoptBufferViewCount: number;
}
export interface SceneFile {
path: string;
type: "glb" | "gltf";
}
export interface NeedleComponentEntry {
name?: string;
type?: string;
guid?: string;
}
export interface NeedleComponentExtension {
components?: NeedleComponentEntry[];
builtin_components?: NeedleComponentEntry[];
}