fix(assets): Zielpfad der Aufbereitung unabhängig vom Arbeitsverzeichnis
places.mjs schrieb bisher nach public/models/places/<id>.glb relativ zu process.cwd() und nahm jede id ungeprüft an. Die neue, exportierte placeTarget(id) löst den Pfad stattdessen von import.meta.url ab (egal von wo das Skript aufgerufen wird) und lehnt IDs außerhalb von [a-z0-9-]+ ab, bevor daraus ein Pfad wird, der aus public/models/ places/ herausführen könnte. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
1 parent
ed5254f88e
commit
23a0623898
2 files changed
+37
-4
No files matched your search
@@ -1,8 +1,9 @@
|
||||
import { isAbsolute } from "node:path";
|
||||
import { beforeAll, describe, expect, it } from "vitest";
|
||||
import { Document } from "@gltf-transform/core";
|
||||
import sharp from "sharp";
|
||||
import { EXT_MATERIALS_BUMP, EXTMaterialsBump } from "../tools/assets/bumpExtension.mjs";
|
||||
import { FAR_TEXTURE_SIZE, NEAR_TEXTURE_SIZE, optimizePlace } from "../tools/assets/places.mjs";
|
||||
import { FAR_TEXTURE_SIZE, NEAR_TEXTURE_SIZE, optimizePlace, placeTarget } from "../tools/assets/places.mjs";
|
||||
|
||||
/** 1100 px große Streifen. seed macht die Bilder verschieden, sonst legt dedup() sie zusammen. */
|
||||
function stripes(seed) {
|
||||
@@ -95,3 +96,21 @@ describe("optimizePlace", () => {
|
||||
expect(used).not.toContain("EXT_mesh_gpu_instancing");
|
||||
});
|
||||
});
|
||||
|
||||
describe("placeTarget", () => {
|
||||
// Bruch: ein Pfad relativ zum Arbeitsverzeichnis statt zum Projekt — bei einem Aufruf aus einem
|
||||
// anderen Ordner (z. B. aus einem Skript) landete die Datei am falschen Ort oder mkdir schlug fehl.
|
||||
it("liefert den absoluten Zielpfad unter public/models/places/", () => {
|
||||
const target = placeTarget("hood-yard");
|
||||
|
||||
expect(isAbsolute(target)).toBe(true);
|
||||
expect(target.endsWith("public/models/places/hood-yard.glb")).toBe(true);
|
||||
});
|
||||
|
||||
// Bruch: eine ID mit Pfadtrennzeichen oder Großbuchstaben schreibt außerhalb von
|
||||
// public/models/places/ oder unter einem Namen, den PLACES so nie referenziert.
|
||||
it("lehnt IDs mit Pfadtrennzeichen oder Großbuchstaben ab", () => {
|
||||
expect(() => placeTarget("../x")).toThrow();
|
||||
expect(() => placeTarget("Hood Yard")).toThrow();
|
||||
});
|
||||
});
|
||||
Reference in new issue
Block a user