#!/usr/bin/env node "use strict"; const assert = require("assert"); const fs = require("fs"); const os = require("os"); const path = require("path"); const { SCHEMA, validateManifest } = require("./lib/package-contract"); const dir = fs.mkdtempSync(path.join(os.tmpdir(), "asset-package-")); fs.mkdirSync(path.join(dir, "models")); fs.writeFileSync(path.join(dir, "models", "area.glb"), "glb"); const valid = { schema: SCHEMA, packageVersion: "1.0.0", areaId: "area", coordinateSystem: { axes: "ENU", units: "meters", x: "east", y: "north", z: "up" }, placement: { longitude: 120, latitude: 30, height: 0, headingCorrectionDegrees: -90 }, bounds: { minLon: 119, minLat: 29, maxLon: 121, maxLat: 31 }, assets: [{ id: "main", role: "scene", category: "scene", uri: "models/area.glb", defaultLoad: true }] }; assert.doesNotThrow(() => validateManifest(valid, dir)); for (const change of [ (m) => { m.schema = "bad"; }, (m) => { m.assets[0].uri = "../area.glb"; }, (m) => { m.assets[0].category = "dynamic"; }, (m) => { m.assets.push({ ...m.assets[0] }); }, (m) => { m.placement.longitude = 900; }, ]) { const manifest = JSON.parse(JSON.stringify(valid)); change(manifest); assert.throws(() => validateManifest(manifest, dir)); } fs.rmSync(dir, { recursive: true, force: true }); console.log("Asset package contract tests passed.");