Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 3 additions & 1 deletion packages/cli/src/commands/preview.ts
Original file line number Diff line number Diff line change
Expand Up @@ -682,7 +682,9 @@ function linkProjectIntoStudioData(
}
}
if (!existsSync(symlinkPath)) {
symlinkSync(dir, symlinkPath, "dir");
// Windows: "dir" symlinks need Developer Mode or elevation (EPERM otherwise);
// NTFS junctions are unprivileged and keep the live write-back the studio needs.
symlinkSync(dir, symlinkPath, process.platform === "win32" ? "junction" : "dir");
createdSymlink = true;
}
}
Expand Down
11 changes: 11 additions & 0 deletions packages/core/src/compiler/timingCompiler.test.ts
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import { readFileSync } from "node:fs";
import { dirname, join } from "node:path";
import { describe, it, expect } from "vitest";
import {
compileTimingAttrs,
Expand All @@ -6,6 +8,15 @@ import {
clampDurations,
} from "./timingCompiler.js";

// Raw 0x00 bytes in the HFMASK delimiters shipped once and broke every render
// under Bun's transpiler while behaving fine under Node (issue #2139) — only a
// byte-level check catches that, so keep the delimiters as \x00 escapes.
it("source contains no raw NUL bytes", () => {
const testPath = expect.getState().testPath ?? "";
const src = readFileSync(join(dirname(testPath), "timingCompiler.ts"), "latin1");
expect(src.includes("\x00")).toBe(false);
});

describe("compileTimingAttrs", () => {
it("adds data-end when data-start and data-duration are present on a video", () => {
const html = '<video id="v1" src="a.mp4" data-start="2" data-duration="5">';
Expand Down
Binary file modified packages/core/src/compiler/timingCompiler.ts
Binary file not shown.
Loading