@hyperframes/producer 0.3.0 → 0.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -57895,7 +57895,7 @@ var require_util2 = __commonJS({
57895
57895
  return path12;
57896
57896
  }
57897
57897
  exports.normalize = normalize2;
57898
- function join17(aRoot, aPath) {
57898
+ function join18(aRoot, aPath) {
57899
57899
  if (aRoot === "") {
57900
57900
  aRoot = ".";
57901
57901
  }
@@ -57927,7 +57927,7 @@ var require_util2 = __commonJS({
57927
57927
  }
57928
57928
  return joined;
57929
57929
  }
57930
- exports.join = join17;
57930
+ exports.join = join18;
57931
57931
  exports.isAbsolute = function(aPath) {
57932
57932
  return aPath.charAt(0) === "/" || urlRegexp.test(aPath);
57933
57933
  };
@@ -58100,7 +58100,7 @@ var require_util2 = __commonJS({
58100
58100
  parsed.path = parsed.path.substring(0, index + 1);
58101
58101
  }
58102
58102
  }
58103
- sourceURL = join17(urlGenerate(parsed), sourceURL);
58103
+ sourceURL = join18(urlGenerate(parsed), sourceURL);
58104
58104
  }
58105
58105
  return normalize2(sourceURL);
58106
58106
  }
@@ -59902,7 +59902,7 @@ var require_escodegen = __commonJS({
59902
59902
  function noEmptySpace() {
59903
59903
  return space ? space : " ";
59904
59904
  }
59905
- function join17(left2, right2) {
59905
+ function join18(left2, right2) {
59906
59906
  var leftSource, rightSource, leftCharCode, rightCharCode;
59907
59907
  leftSource = toSourceNodeWhenNeeded(left2).toString();
59908
59908
  if (leftSource.length === 0) {
@@ -60233,8 +60233,8 @@ var require_escodegen = __commonJS({
60233
60233
  } else {
60234
60234
  result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));
60235
60235
  }
60236
- result = join17(result, operator);
60237
- result = [join17(
60236
+ result = join18(result, operator);
60237
+ result = [join18(
60238
60238
  result,
60239
60239
  that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)
60240
60240
  ), ")"];
@@ -60377,11 +60377,11 @@ var require_escodegen = __commonJS({
60377
60377
  var result, fragment;
60378
60378
  result = ["class"];
60379
60379
  if (stmt.id) {
60380
- result = join17(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
60380
+ result = join18(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
60381
60381
  }
60382
60382
  if (stmt.superClass) {
60383
- fragment = join17("extends", this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
60384
- result = join17(result, fragment);
60383
+ fragment = join18("extends", this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
60384
+ result = join18(result, fragment);
60385
60385
  }
60386
60386
  result.push(space);
60387
60387
  result.push(this.generateStatement(stmt.body, S_TFFT));
@@ -60394,9 +60394,9 @@ var require_escodegen = __commonJS({
60394
60394
  return escapeDirective(stmt.directive) + this.semicolon(flags);
60395
60395
  },
60396
60396
  DoWhileStatement: function(stmt, flags) {
60397
- var result = join17("do", this.maybeBlock(stmt.body, S_TFFF));
60397
+ var result = join18("do", this.maybeBlock(stmt.body, S_TFFF));
60398
60398
  result = this.maybeBlockSuffix(stmt.body, result);
60399
- return join17(result, [
60399
+ return join18(result, [
60400
60400
  "while" + space + "(",
60401
60401
  this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
60402
60402
  ")" + this.semicolon(flags)
@@ -60432,11 +60432,11 @@ var require_escodegen = __commonJS({
60432
60432
  ExportDefaultDeclaration: function(stmt, flags) {
60433
60433
  var result = ["export"], bodyFlags;
60434
60434
  bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF;
60435
- result = join17(result, "default");
60435
+ result = join18(result, "default");
60436
60436
  if (isStatement(stmt.declaration)) {
60437
- result = join17(result, this.generateStatement(stmt.declaration, bodyFlags));
60437
+ result = join18(result, this.generateStatement(stmt.declaration, bodyFlags));
60438
60438
  } else {
60439
- result = join17(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
60439
+ result = join18(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
60440
60440
  }
60441
60441
  return result;
60442
60442
  },
@@ -60444,15 +60444,15 @@ var require_escodegen = __commonJS({
60444
60444
  var result = ["export"], bodyFlags, that = this;
60445
60445
  bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF;
60446
60446
  if (stmt.declaration) {
60447
- return join17(result, this.generateStatement(stmt.declaration, bodyFlags));
60447
+ return join18(result, this.generateStatement(stmt.declaration, bodyFlags));
60448
60448
  }
60449
60449
  if (stmt.specifiers) {
60450
60450
  if (stmt.specifiers.length === 0) {
60451
- result = join17(result, "{" + space + "}");
60451
+ result = join18(result, "{" + space + "}");
60452
60452
  } else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {
60453
- result = join17(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
60453
+ result = join18(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
60454
60454
  } else {
60455
- result = join17(result, "{");
60455
+ result = join18(result, "{");
60456
60456
  withIndent(function(indent2) {
60457
60457
  var i, iz;
60458
60458
  result.push(newline);
@@ -60470,7 +60470,7 @@ var require_escodegen = __commonJS({
60470
60470
  result.push(base + "}");
60471
60471
  }
60472
60472
  if (stmt.source) {
60473
- result = join17(result, [
60473
+ result = join18(result, [
60474
60474
  "from" + space,
60475
60475
  // ModuleSpecifier
60476
60476
  this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
@@ -60558,7 +60558,7 @@ var require_escodegen = __commonJS({
60558
60558
  ];
60559
60559
  cursor = 0;
60560
60560
  if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {
60561
- result = join17(result, [
60561
+ result = join18(result, [
60562
60562
  this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
60563
60563
  ]);
60564
60564
  ++cursor;
@@ -60568,7 +60568,7 @@ var require_escodegen = __commonJS({
60568
60568
  result.push(",");
60569
60569
  }
60570
60570
  if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {
60571
- result = join17(result, [
60571
+ result = join18(result, [
60572
60572
  space,
60573
60573
  this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
60574
60574
  ]);
@@ -60597,7 +60597,7 @@ var require_escodegen = __commonJS({
60597
60597
  }
60598
60598
  }
60599
60599
  }
60600
- result = join17(result, [
60600
+ result = join18(result, [
60601
60601
  "from" + space,
60602
60602
  // ModuleSpecifier
60603
60603
  this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
@@ -60651,7 +60651,7 @@ var require_escodegen = __commonJS({
60651
60651
  return result;
60652
60652
  },
60653
60653
  ThrowStatement: function(stmt, flags) {
60654
- return [join17(
60654
+ return [join18(
60655
60655
  "throw",
60656
60656
  this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
60657
60657
  ), this.semicolon(flags)];
@@ -60662,7 +60662,7 @@ var require_escodegen = __commonJS({
60662
60662
  result = this.maybeBlockSuffix(stmt.block, result);
60663
60663
  if (stmt.handlers) {
60664
60664
  for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {
60665
- result = join17(result, this.generateStatement(stmt.handlers[i], S_TFFF));
60665
+ result = join18(result, this.generateStatement(stmt.handlers[i], S_TFFF));
60666
60666
  if (stmt.finalizer || i + 1 !== iz) {
60667
60667
  result = this.maybeBlockSuffix(stmt.handlers[i].body, result);
60668
60668
  }
@@ -60670,7 +60670,7 @@ var require_escodegen = __commonJS({
60670
60670
  } else {
60671
60671
  guardedHandlers = stmt.guardedHandlers || [];
60672
60672
  for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {
60673
- result = join17(result, this.generateStatement(guardedHandlers[i], S_TFFF));
60673
+ result = join18(result, this.generateStatement(guardedHandlers[i], S_TFFF));
60674
60674
  if (stmt.finalizer || i + 1 !== iz) {
60675
60675
  result = this.maybeBlockSuffix(guardedHandlers[i].body, result);
60676
60676
  }
@@ -60678,13 +60678,13 @@ var require_escodegen = __commonJS({
60678
60678
  if (stmt.handler) {
60679
60679
  if (Array.isArray(stmt.handler)) {
60680
60680
  for (i = 0, iz = stmt.handler.length; i < iz; ++i) {
60681
- result = join17(result, this.generateStatement(stmt.handler[i], S_TFFF));
60681
+ result = join18(result, this.generateStatement(stmt.handler[i], S_TFFF));
60682
60682
  if (stmt.finalizer || i + 1 !== iz) {
60683
60683
  result = this.maybeBlockSuffix(stmt.handler[i].body, result);
60684
60684
  }
60685
60685
  }
60686
60686
  } else {
60687
- result = join17(result, this.generateStatement(stmt.handler, S_TFFF));
60687
+ result = join18(result, this.generateStatement(stmt.handler, S_TFFF));
60688
60688
  if (stmt.finalizer) {
60689
60689
  result = this.maybeBlockSuffix(stmt.handler.body, result);
60690
60690
  }
@@ -60692,7 +60692,7 @@ var require_escodegen = __commonJS({
60692
60692
  }
60693
60693
  }
60694
60694
  if (stmt.finalizer) {
60695
- result = join17(result, ["finally", this.maybeBlock(stmt.finalizer, S_TFFF)]);
60695
+ result = join18(result, ["finally", this.maybeBlock(stmt.finalizer, S_TFFF)]);
60696
60696
  }
60697
60697
  return result;
60698
60698
  },
@@ -60726,7 +60726,7 @@ var require_escodegen = __commonJS({
60726
60726
  withIndent(function() {
60727
60727
  if (stmt.test) {
60728
60728
  result = [
60729
- join17("case", that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
60729
+ join18("case", that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
60730
60730
  ":"
60731
60731
  ];
60732
60732
  } else {
@@ -60774,9 +60774,9 @@ var require_escodegen = __commonJS({
60774
60774
  result.push(this.maybeBlock(stmt.consequent, S_TFFF));
60775
60775
  result = this.maybeBlockSuffix(stmt.consequent, result);
60776
60776
  if (stmt.alternate.type === Syntax.IfStatement) {
60777
- result = join17(result, ["else ", this.generateStatement(stmt.alternate, bodyFlags)]);
60777
+ result = join18(result, ["else ", this.generateStatement(stmt.alternate, bodyFlags)]);
60778
60778
  } else {
60779
- result = join17(result, join17("else", this.maybeBlock(stmt.alternate, bodyFlags)));
60779
+ result = join18(result, join18("else", this.maybeBlock(stmt.alternate, bodyFlags)));
60780
60780
  }
60781
60781
  } else {
60782
60782
  result.push(this.maybeBlock(stmt.consequent, bodyFlags));
@@ -60877,7 +60877,7 @@ var require_escodegen = __commonJS({
60877
60877
  },
60878
60878
  ReturnStatement: function(stmt, flags) {
60879
60879
  if (stmt.argument) {
60880
- return [join17(
60880
+ return [join18(
60881
60881
  "return",
60882
60882
  this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
60883
60883
  ), this.semicolon(flags)];
@@ -60966,14 +60966,14 @@ var require_escodegen = __commonJS({
60966
60966
  if (leftSource.charCodeAt(leftSource.length - 1) === 47 && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) {
60967
60967
  result = [fragment, noEmptySpace(), expr.operator];
60968
60968
  } else {
60969
- result = join17(fragment, expr.operator);
60969
+ result = join18(fragment, expr.operator);
60970
60970
  }
60971
60971
  fragment = this.generateExpression(expr.right, rightPrecedence, flags);
60972
60972
  if (expr.operator === "/" && fragment.toString().charAt(0) === "/" || expr.operator.slice(-1) === "<" && fragment.toString().slice(0, 3) === "!--") {
60973
60973
  result.push(noEmptySpace());
60974
60974
  result.push(fragment);
60975
60975
  } else {
60976
- result = join17(result, fragment);
60976
+ result = join18(result, fragment);
60977
60977
  }
60978
60978
  if (expr.operator === "in" && !(flags & F_ALLOW_IN)) {
60979
60979
  return ["(", result, ")"];
@@ -61013,7 +61013,7 @@ var require_escodegen = __commonJS({
61013
61013
  var result, length, i, iz, itemFlags;
61014
61014
  length = expr["arguments"].length;
61015
61015
  itemFlags = flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0 ? E_TFT : E_TFF;
61016
- result = join17(
61016
+ result = join18(
61017
61017
  "new",
61018
61018
  this.generateExpression(expr.callee, Precedence.New, itemFlags)
61019
61019
  );
@@ -61063,11 +61063,11 @@ var require_escodegen = __commonJS({
61063
61063
  var result, fragment, rightCharCode, leftSource, leftCharCode;
61064
61064
  fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);
61065
61065
  if (space === "") {
61066
- result = join17(expr.operator, fragment);
61066
+ result = join18(expr.operator, fragment);
61067
61067
  } else {
61068
61068
  result = [expr.operator];
61069
61069
  if (expr.operator.length > 2) {
61070
- result = join17(result, fragment);
61070
+ result = join18(result, fragment);
61071
61071
  } else {
61072
61072
  leftSource = toSourceNodeWhenNeeded(result).toString();
61073
61073
  leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
@@ -61090,7 +61090,7 @@ var require_escodegen = __commonJS({
61090
61090
  result = "yield";
61091
61091
  }
61092
61092
  if (expr.argument) {
61093
- result = join17(
61093
+ result = join18(
61094
61094
  result,
61095
61095
  this.generateExpression(expr.argument, Precedence.Yield, E_TTT)
61096
61096
  );
@@ -61098,7 +61098,7 @@ var require_escodegen = __commonJS({
61098
61098
  return parenthesize(result, Precedence.Yield, precedence);
61099
61099
  },
61100
61100
  AwaitExpression: function(expr, precedence, flags) {
61101
- var result = join17(
61101
+ var result = join18(
61102
61102
  expr.all ? "await*" : "await",
61103
61103
  this.generateExpression(expr.argument, Precedence.Await, E_TTT)
61104
61104
  );
@@ -61181,11 +61181,11 @@ var require_escodegen = __commonJS({
61181
61181
  var result, fragment;
61182
61182
  result = ["class"];
61183
61183
  if (expr.id) {
61184
- result = join17(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
61184
+ result = join18(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
61185
61185
  }
61186
61186
  if (expr.superClass) {
61187
- fragment = join17("extends", this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
61188
- result = join17(result, fragment);
61187
+ fragment = join18("extends", this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
61188
+ result = join18(result, fragment);
61189
61189
  }
61190
61190
  result.push(space);
61191
61191
  result.push(this.generateStatement(expr.body, S_TFFT));
@@ -61200,7 +61200,7 @@ var require_escodegen = __commonJS({
61200
61200
  }
61201
61201
  if (expr.kind === "get" || expr.kind === "set") {
61202
61202
  fragment = [
61203
- join17(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
61203
+ join18(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
61204
61204
  this.generateFunctionBody(expr.value)
61205
61205
  ];
61206
61206
  } else {
@@ -61210,7 +61210,7 @@ var require_escodegen = __commonJS({
61210
61210
  this.generateFunctionBody(expr.value)
61211
61211
  ];
61212
61212
  }
61213
- return join17(result, fragment);
61213
+ return join18(result, fragment);
61214
61214
  },
61215
61215
  Property: function(expr, precedence, flags) {
61216
61216
  if (expr.kind === "get" || expr.kind === "set") {
@@ -61405,7 +61405,7 @@ var require_escodegen = __commonJS({
61405
61405
  for (i = 0, iz = expr.blocks.length; i < iz; ++i) {
61406
61406
  fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);
61407
61407
  if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {
61408
- result = join17(result, fragment);
61408
+ result = join18(result, fragment);
61409
61409
  } else {
61410
61410
  result.push(fragment);
61411
61411
  }
@@ -61413,13 +61413,13 @@ var require_escodegen = __commonJS({
61413
61413
  });
61414
61414
  }
61415
61415
  if (expr.filter) {
61416
- result = join17(result, "if" + space);
61416
+ result = join18(result, "if" + space);
61417
61417
  fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);
61418
- result = join17(result, ["(", fragment, ")"]);
61418
+ result = join18(result, ["(", fragment, ")"]);
61419
61419
  }
61420
61420
  if (!extra.moz.comprehensionExpressionStartsWithAssignment) {
61421
61421
  fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
61422
- result = join17(result, fragment);
61422
+ result = join18(result, fragment);
61423
61423
  }
61424
61424
  result.push(expr.type === Syntax.GeneratorExpression ? ")" : "]");
61425
61425
  return result;
@@ -61435,8 +61435,8 @@ var require_escodegen = __commonJS({
61435
61435
  } else {
61436
61436
  fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);
61437
61437
  }
61438
- fragment = join17(fragment, expr.of ? "of" : "in");
61439
- fragment = join17(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
61438
+ fragment = join18(fragment, expr.of ? "of" : "in");
61439
+ fragment = join18(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
61440
61440
  return ["for" + space + "(", fragment, ")"];
61441
61441
  },
61442
61442
  SpreadElement: function(expr, precedence, flags) {
@@ -87598,9 +87598,9 @@ async function getConnectionTransport(options) {
87598
87598
  throw new Error("Could not detect required browser platform");
87599
87599
  }
87600
87600
  const { convertPuppeteerChannelToBrowsersChannel: convertPuppeteerChannelToBrowsersChannel2 } = await Promise.resolve().then(() => (init_LaunchOptions(), LaunchOptions_exports));
87601
- const { join: join17 } = await import("node:path");
87601
+ const { join: join18 } = await import("node:path");
87602
87602
  const userDataDir = resolveDefaultUserDataDir3(Browser4.CHROME, platform, convertPuppeteerChannelToBrowsersChannel2(options.channel));
87603
- const portPath = join17(userDataDir, "DevToolsActivePort");
87603
+ const portPath = join18(userDataDir, "DevToolsActivePort");
87604
87604
  try {
87605
87605
  const fileContent = await environment.value.fs.promises.readFile(portPath, "ascii");
87606
87606
  const [rawPort, rawPath] = fileContent.split("\n").map((line) => {
@@ -89418,15 +89418,15 @@ var init_puppeteer_core = __esm({
89418
89418
 
89419
89419
  // src/server.ts
89420
89420
  import {
89421
- existsSync as existsSync16,
89422
- mkdirSync as mkdirSync10,
89421
+ existsSync as existsSync17,
89422
+ mkdirSync as mkdirSync11,
89423
89423
  statSync as statSync7,
89424
89424
  mkdtempSync,
89425
- writeFileSync as writeFileSync4,
89425
+ writeFileSync as writeFileSync5,
89426
89426
  rmSync as rmSync4,
89427
89427
  createReadStream as createReadStream2
89428
89428
  } from "node:fs";
89429
- import { resolve as resolve12, dirname as dirname11, join as join16 } from "node:path";
89429
+ import { resolve as resolve12, dirname as dirname11, join as join17 } from "node:path";
89430
89430
  import { tmpdir as tmpdir2 } from "node:os";
89431
89431
  import { parseArgs } from "node:util";
89432
89432
  import crypto2 from "node:crypto";
@@ -92206,11 +92206,11 @@ var serve = (options, listeningListener) => {
92206
92206
 
92207
92207
  // src/services/renderOrchestrator.ts
92208
92208
  import {
92209
- existsSync as existsSync14,
92210
- mkdirSync as mkdirSync9,
92209
+ existsSync as existsSync15,
92210
+ mkdirSync as mkdirSync10,
92211
92211
  rmSync as rmSync3,
92212
- readFileSync as readFileSync8,
92213
- writeFileSync as writeFileSync3,
92212
+ readFileSync as readFileSync9,
92213
+ writeFileSync as writeFileSync4,
92214
92214
  copyFileSync as copyFileSync2,
92215
92215
  appendFileSync
92216
92216
  } from "fs";
@@ -105844,7 +105844,7 @@ async function mergeWorkerFrames(workDir, tasks, outputDir) {
105844
105844
  }
105845
105845
 
105846
105846
  // src/services/renderOrchestrator.ts
105847
- import { join as join13, dirname as dirname10, resolve as resolve9 } from "path";
105847
+ import { join as join14, dirname as dirname10, resolve as resolve9 } from "path";
105848
105848
  import { randomUUID } from "crypto";
105849
105849
  import { freemem as freemem2 } from "os";
105850
105850
  import { fileURLToPath as fileURLToPath3 } from "url";
@@ -106203,10 +106203,15 @@ function createFileServer2(options) {
106203
106203
  }
106204
106204
 
106205
106205
  // src/services/htmlCompiler.ts
106206
- import { readFileSync as readFileSync7, existsSync as existsSync13, mkdirSync as mkdirSync8 } from "fs";
106207
- import { join as join12, dirname as dirname9, resolve as resolve8 } from "path";
106206
+ import { readFileSync as readFileSync8, existsSync as existsSync14, mkdirSync as mkdirSync9 } from "fs";
106207
+ import { join as join13, dirname as dirname9, resolve as resolve8 } from "path";
106208
106208
  import postcss from "postcss";
106209
106209
 
106210
+ // src/services/deterministicFonts.ts
106211
+ import { existsSync as existsSync13, mkdirSync as mkdirSync8, readFileSync as readFileSync7, writeFileSync as writeFileSync3 } from "node:fs";
106212
+ import { homedir as homedir2 } from "node:os";
106213
+ import { join as join12 } from "node:path";
106214
+
106210
106215
  // src/services/fontData.generated.ts
106211
106216
  var EMBEDDED_FONT_DATA = /* @__PURE__ */ new Map([
106212
106217
  ["@fontsource/inter:400:normal", "data:font/woff2;base64,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"],
@@ -106426,32 +106431,40 @@ function extractRequestedFontFamilies(html) {
106426
106431
  }
106427
106432
  return requested;
106428
106433
  }
106429
- function buildFontFaceCss(requestedFamilies) {
106434
+ function buildFontFaceRule(familyName, src, weight, style) {
106435
+ return [
106436
+ "@font-face {",
106437
+ ` font-family: "${familyName}";`,
106438
+ ` src: url("${src}") format("woff2");`,
106439
+ ` font-style: ${style};`,
106440
+ ` font-weight: ${weight};`,
106441
+ " font-display: block;",
106442
+ "}"
106443
+ ].join("\n");
106444
+ }
106445
+ async function buildFontFaceCss(requestedFamilies) {
106430
106446
  const rules = [];
106431
106447
  const unresolved = [];
106432
106448
  for (const [normalizedFamily, originalCaseFamily] of requestedFamilies) {
106433
106449
  const canonicalKey = FONT_ALIASES[normalizedFamily];
106434
- if (!canonicalKey) {
106435
- unresolved.push(originalCaseFamily);
106450
+ if (canonicalKey) {
106451
+ const canonical = CANONICAL_FONTS[canonicalKey];
106452
+ if (!canonical) continue;
106453
+ for (const face of canonical.faces) {
106454
+ const style = face.style || "normal";
106455
+ const src = fontDataUri(canonical.packageName, face.weight, style);
106456
+ rules.push(buildFontFaceRule(originalCaseFamily, src, face.weight, style));
106457
+ }
106436
106458
  continue;
106437
106459
  }
106438
- const canonical = CANONICAL_FONTS[canonicalKey];
106439
- if (!canonical) continue;
106440
- for (const face of canonical.faces) {
106441
- const style = face.style || "normal";
106442
- const src = fontDataUri(canonical.packageName, face.weight, style);
106443
- rules.push(
106444
- [
106445
- "@font-face {",
106446
- ` font-family: "${originalCaseFamily}";`,
106447
- ` src: url("${src}") format("woff2");`,
106448
- ` font-style: ${style};`,
106449
- ` font-weight: ${face.weight};`,
106450
- " font-display: block;",
106451
- "}"
106452
- ].join("\n")
106453
- );
106460
+ const googleFaces = await fetchGoogleFont(originalCaseFamily);
106461
+ if (googleFaces.length > 0) {
106462
+ for (const face of googleFaces) {
106463
+ rules.push(buildFontFaceRule(originalCaseFamily, face.dataUri, face.weight, face.style));
106464
+ }
106465
+ continue;
106454
106466
  }
106467
+ unresolved.push(originalCaseFamily);
106455
106468
  }
106456
106469
  return {
106457
106470
  css: rules.join("\n\n").trim(),
@@ -106475,7 +106488,67 @@ function warnUnresolvedFonts(unresolved) {
106475
106488
  Docs: https://hyperframes.heygen.com/docs/fonts`
106476
106489
  );
106477
106490
  }
106478
- function injectDeterministicFontFaces(html) {
106491
+ var GOOGLE_FONTS_CACHE_DIR = join12(homedir2(), ".cache", "hyperframes", "fonts");
106492
+ var WOFF2_USER_AGENT = "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Safari/537.36";
106493
+ function fontSlug(familyName) {
106494
+ return familyName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
106495
+ }
106496
+ function fontCacheDir(slug) {
106497
+ const dir = join12(GOOGLE_FONTS_CACHE_DIR, slug);
106498
+ if (!existsSync13(dir)) {
106499
+ mkdirSync8(dir, { recursive: true });
106500
+ }
106501
+ return dir;
106502
+ }
106503
+ function cachedWoff2Path(slug, weight, style) {
106504
+ return join12(fontCacheDir(slug), `${weight}-${style}.woff2`);
106505
+ }
106506
+ async function fetchGoogleFont(familyName) {
106507
+ const slug = fontSlug(familyName);
106508
+ const encodedFamily = encodeURIComponent(familyName);
106509
+ const url = `https://fonts.googleapis.com/css2?family=${encodedFamily}:ital,wght@0,100;0,200;0,300;0,400;0,500;0,600;0,700;0,800;0,900;1,400;1,700`;
106510
+ let cssText;
106511
+ try {
106512
+ const res = await fetch(url, {
106513
+ headers: { "User-Agent": WOFF2_USER_AGENT }
106514
+ });
106515
+ if (!res.ok) {
106516
+ return [];
106517
+ }
106518
+ cssText = await res.text();
106519
+ } catch {
106520
+ return [];
106521
+ }
106522
+ const faceRegex = /@font-face\s*\{[^}]*font-style:\s*(normal|italic)[^}]*font-weight:\s*(\d+)[^}]*src:\s*url\(([^)]+)\)\s*format\(['"]woff2['"]\)[^}]*\}/gi;
106523
+ const faces = [];
106524
+ for (const match2 of cssText.matchAll(faceRegex)) {
106525
+ const style = match2[1] || "normal";
106526
+ const weight = match2[2] || "400";
106527
+ const woff2Url = match2[3] || "";
106528
+ if (!woff2Url) continue;
106529
+ const cachePath = cachedWoff2Path(slug, weight, style);
106530
+ if (!existsSync13(cachePath)) {
106531
+ try {
106532
+ const fontRes = await fetch(woff2Url);
106533
+ if (!fontRes.ok) continue;
106534
+ const buffer = Buffer.from(await fontRes.arrayBuffer());
106535
+ writeFileSync3(cachePath, buffer);
106536
+ } catch {
106537
+ continue;
106538
+ }
106539
+ }
106540
+ const fontBytes = readFileSync7(cachePath);
106541
+ const dataUri = `data:font/woff2;base64,${fontBytes.toString("base64")}`;
106542
+ faces.push({ weight, style, dataUri });
106543
+ }
106544
+ if (faces.length > 0) {
106545
+ console.log(
106546
+ `[Compiler] Fetched ${faces.length} font face(s) for "${familyName}" from Google Fonts (cached to ${fontCacheDir(slug)})`
106547
+ );
106548
+ }
106549
+ return faces;
106550
+ }
106551
+ async function injectDeterministicFontFaces(html) {
106479
106552
  const existingFaces = extractExistingFontFaces(html);
106480
106553
  const requestedFamilies = extractRequestedFontFamilies(html);
106481
106554
  const pendingFamilies = /* @__PURE__ */ new Map();
@@ -106487,7 +106560,7 @@ function injectDeterministicFontFaces(html) {
106487
106560
  if (pendingFamilies.size === 0) {
106488
106561
  return html;
106489
106562
  }
106490
- const { css, unresolved } = buildFontFaceCss(pendingFamilies);
106563
+ const { css, unresolved } = await buildFontFaceCss(pendingFamilies);
106491
106564
  if (!css) {
106492
106565
  if (unresolved.length > 0) {
106493
106566
  warnUnresolvedFonts(unresolved);
@@ -106523,16 +106596,16 @@ function dedupeElementsById(elements) {
106523
106596
  async function resolveMediaDuration(src, mediaStart, baseDir, downloadDir, tagName19) {
106524
106597
  let filePath = src;
106525
106598
  if (isHttpUrl(src)) {
106526
- if (!existsSync13(downloadDir)) mkdirSync8(downloadDir, { recursive: true });
106599
+ if (!existsSync14(downloadDir)) mkdirSync9(downloadDir, { recursive: true });
106527
106600
  try {
106528
106601
  filePath = await downloadToTemp(src, downloadDir);
106529
106602
  } catch {
106530
106603
  return { duration: 0, resolvedPath: src };
106531
106604
  }
106532
106605
  } else if (!filePath.startsWith("/")) {
106533
- filePath = join12(baseDir, filePath);
106606
+ filePath = join13(baseDir, filePath);
106534
106607
  }
106535
- if (!existsSync13(filePath)) {
106608
+ if (!existsSync14(filePath)) {
106536
106609
  return { duration: 0, resolvedPath: filePath };
106537
106610
  }
106538
106611
  const metadata = tagName19 === "video" ? await extractVideoMetadata(filePath) : await extractAudioMetadata(filePath);
@@ -106600,10 +106673,10 @@ async function parseSubCompositions(html, projectDir, downloadDir, parentOffset
106600
106673
  if (visited.has(filePath)) {
106601
106674
  continue;
106602
106675
  }
106603
- if (!existsSync13(filePath)) {
106676
+ if (!existsSync14(filePath)) {
106604
106677
  continue;
106605
106678
  }
106606
- const rawSubHtml = readFileSync7(filePath, "utf-8");
106679
+ const rawSubHtml = readFileSync8(filePath, "utf-8");
106607
106680
  const nestedVisited = new Set(visited);
106608
106681
  nestedVisited.add(filePath);
106609
106682
  workItems.push({ srcPath, absoluteStart, absoluteEnd, filePath, rawSubHtml, nestedVisited });
@@ -106797,8 +106870,8 @@ function inlineSubCompositions(html, subCompositions, projectDir) {
106797
106870
  let compHtml = subCompositions.get(srcPath) || null;
106798
106871
  if (!compHtml) {
106799
106872
  const filePath = resolve8(projectDir, srcPath);
106800
- if (existsSync13(filePath)) {
106801
- compHtml = readFileSync7(filePath, "utf-8");
106873
+ if (existsSync14(filePath)) {
106874
+ compHtml = readFileSync8(filePath, "utf-8");
106802
106875
  }
106803
106876
  }
106804
106877
  if (!compHtml) {
@@ -107021,7 +107094,7 @@ function collectExternalAssets(html, projectDir) {
107021
107094
  if (absPath.startsWith(absProjectDir + "/") || absPath === absProjectDir) {
107022
107095
  return null;
107023
107096
  }
107024
- if (!existsSync13(absPath)) return null;
107097
+ if (!existsSync14(absPath)) return null;
107025
107098
  const safeKey = "hf-ext/" + absPath.replace(/^\//, "");
107026
107099
  externalAssets.set(safeKey, absPath);
107027
107100
  return safeKey;
@@ -107066,7 +107139,7 @@ function collectExternalAssets(html, projectDir) {
107066
107139
  };
107067
107140
  }
107068
107141
  async function compileForRender(projectDir, htmlPath, downloadDir) {
107069
- const rawHtml = readFileSync7(htmlPath, "utf-8");
107142
+ const rawHtml = readFileSync8(htmlPath, "utf-8");
107070
107143
  const { html: compiledHtml, unresolvedCompositions } = await compileHtmlFile(
107071
107144
  rawHtml,
107072
107145
  projectDir,
@@ -107083,7 +107156,7 @@ async function compileForRender(projectDir, htmlPath, downloadDir) {
107083
107156
  /(<(?:video|audio)\b[^>]*?)\s+preload\s*=\s*["']none["']/gi,
107084
107157
  "$1"
107085
107158
  );
107086
- const coalescedHtml = injectDeterministicFontFaces(
107159
+ const coalescedHtml = await injectDeterministicFontFaces(
107087
107160
  coalesceHeadStylesAndBodyScripts(promoteCssImportsToLinkTags(sanitizedHtml))
107088
107161
  );
107089
107162
  const assembledHtml = await inlineExternalScripts(coalescedHtml);
@@ -107321,21 +107394,21 @@ function installDebugLogger(logPath, log = defaultLogger) {
107321
107394
  };
107322
107395
  }
107323
107396
  function writeCompiledArtifacts(compiled, workDir, includeSummary) {
107324
- const compileDir = join13(workDir, "compiled");
107325
- mkdirSync9(compileDir, { recursive: true });
107326
- writeFileSync3(join13(compileDir, "index.html"), compiled.html, "utf-8");
107397
+ const compileDir = join14(workDir, "compiled");
107398
+ mkdirSync10(compileDir, { recursive: true });
107399
+ writeFileSync4(join14(compileDir, "index.html"), compiled.html, "utf-8");
107327
107400
  for (const [srcPath, html] of compiled.subCompositions) {
107328
- const outPath = join13(compileDir, srcPath);
107329
- mkdirSync9(dirname10(outPath), { recursive: true });
107330
- writeFileSync3(outPath, html, "utf-8");
107401
+ const outPath = join14(compileDir, srcPath);
107402
+ mkdirSync10(dirname10(outPath), { recursive: true });
107403
+ writeFileSync4(outPath, html, "utf-8");
107331
107404
  }
107332
107405
  for (const [relativePath, absolutePath] of compiled.externalAssets) {
107333
- const outPath = resolve9(join13(compileDir, relativePath));
107406
+ const outPath = resolve9(join14(compileDir, relativePath));
107334
107407
  if (!outPath.startsWith(compileDir + "/")) {
107335
107408
  console.warn(`[Render] Skipping external asset with unsafe path: ${relativePath}`);
107336
107409
  continue;
107337
107410
  }
107338
- mkdirSync9(dirname10(outPath), { recursive: true });
107411
+ mkdirSync10(dirname10(outPath), { recursive: true });
107339
107412
  copyFileSync2(absolutePath, outPath);
107340
107413
  }
107341
107414
  if (includeSummary) {
@@ -107359,7 +107432,7 @@ function writeCompiledArtifacts(compiled, workDir, includeSummary) {
107359
107432
  })),
107360
107433
  subCompositions: Array.from(compiled.subCompositions.keys())
107361
107434
  };
107362
- writeFileSync3(join13(compileDir, "summary.json"), JSON.stringify(summary, null, 2), "utf-8");
107435
+ writeFileSync4(join14(compileDir, "summary.json"), JSON.stringify(summary, null, 2), "utf-8");
107363
107436
  }
107364
107437
  }
107365
107438
  function createRenderJob(config2) {
@@ -107404,8 +107477,8 @@ function extractStandaloneEntryFromIndex(indexHtml, entryFile) {
107404
107477
  async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSignal) {
107405
107478
  const moduleDir = dirname10(fileURLToPath3(import.meta.url));
107406
107479
  const producerRoot = process.env.PRODUCER_RENDERS_DIR ? resolve9(process.env.PRODUCER_RENDERS_DIR, "..") : resolve9(moduleDir, "../..");
107407
- const debugDir = join13(producerRoot, ".debug");
107408
- const workDir = job.config.debug ? join13(debugDir, job.id) : join13(dirname10(outputPath), `work-${job.id}`);
107480
+ const debugDir = join14(producerRoot, ".debug");
107481
+ const workDir = job.config.debug ? join14(debugDir, job.id) : join14(dirname10(outputPath), `work-${job.id}`);
107409
107482
  const pipelineStart = Date.now();
107410
107483
  const log = job.config.logger ?? defaultLogger;
107411
107484
  let fileServer = null;
@@ -107413,7 +107486,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107413
107486
  let lastBrowserConsole = [];
107414
107487
  let restoreLogger = null;
107415
107488
  const perfStages = {};
107416
- const perfOutputPath = join13(workDir, "perf-summary.json");
107489
+ const perfOutputPath = join14(workDir, "perf-summary.json");
107417
107490
  const cfg = { ...job.config.producerConfig ?? resolveConfig() };
107418
107491
  const outputFormat = job.config.format ?? "mp4";
107419
107492
  const isWebm = outputFormat === "webm";
@@ -107433,28 +107506,28 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107433
107506
  };
107434
107507
  job.startedAt = /* @__PURE__ */ new Date();
107435
107508
  assertNotAborted();
107436
- if (!existsSync14(workDir)) mkdirSync9(workDir, { recursive: true });
107509
+ if (!existsSync15(workDir)) mkdirSync10(workDir, { recursive: true });
107437
107510
  if (job.config.debug) {
107438
- const logPath = join13(workDir, "render.log");
107511
+ const logPath = join14(workDir, "render.log");
107439
107512
  restoreLogger = installDebugLogger(logPath, log);
107440
107513
  }
107441
107514
  const entryFile = job.config.entryFile || "index.html";
107442
- let htmlPath = join13(projectDir, entryFile);
107443
- if (!existsSync14(htmlPath)) {
107515
+ let htmlPath = join14(projectDir, entryFile);
107516
+ if (!existsSync15(htmlPath)) {
107444
107517
  throw new Error(`Entry file not found: ${htmlPath}`);
107445
107518
  }
107446
107519
  assertNotAborted();
107447
- const rawEntry = readFileSync8(htmlPath, "utf-8");
107520
+ const rawEntry = readFileSync9(htmlPath, "utf-8");
107448
107521
  if (entryFile !== "index.html" && rawEntry.trimStart().startsWith("<template")) {
107449
- const wrapperPath = join13(workDir, "standalone-entry.html");
107450
- const projectIndexPath = join13(projectDir, "index.html");
107451
- if (!existsSync14(projectIndexPath)) {
107522
+ const wrapperPath = join14(workDir, "standalone-entry.html");
107523
+ const projectIndexPath = join14(projectDir, "index.html");
107524
+ if (!existsSync15(projectIndexPath)) {
107452
107525
  throw new Error(
107453
107526
  `Template entry file "${entryFile}" requires a project index.html to extract its render shell.`
107454
107527
  );
107455
107528
  }
107456
107529
  const standaloneHtml = extractStandaloneEntryFromIndex(
107457
- readFileSync8(projectIndexPath, "utf-8"),
107530
+ readFileSync9(projectIndexPath, "utf-8"),
107458
107531
  entryFile
107459
107532
  );
107460
107533
  if (!standaloneHtml) {
@@ -107462,7 +107535,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107462
107535
  `Entry file "${entryFile}" is not mounted from index.html via data-composition-src, so it cannot be rendered independently.`
107463
107536
  );
107464
107537
  }
107465
- writeFileSync3(wrapperPath, standaloneHtml, "utf-8");
107538
+ writeFileSync4(wrapperPath, standaloneHtml, "utf-8");
107466
107539
  htmlPath = wrapperPath;
107467
107540
  log.info("Extracted standalone entry from index.html host context", {
107468
107541
  entryFile
@@ -107471,7 +107544,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107471
107544
  const stage1Start = Date.now();
107472
107545
  updateJobStatus(job, "preprocessing", "Compiling composition", 5, onProgress);
107473
107546
  const compileStart = Date.now();
107474
- let compiled = await compileForRender(projectDir, htmlPath, join13(workDir, "downloads"));
107547
+ let compiled = await compileForRender(projectDir, htmlPath, join14(workDir, "downloads"));
107475
107548
  assertNotAborted();
107476
107549
  perfStages.compileOnlyMs = Date.now() - compileStart;
107477
107550
  writeCompiledArtifacts(compiled, workDir, Boolean(job.config.debug));
@@ -107500,7 +107573,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107500
107573
  reasons.push(`${compiled.unresolvedCompositions.length} unresolved composition(s)`);
107501
107574
  fileServer = await createFileServer2({
107502
107575
  projectDir,
107503
- compiledDir: join13(workDir, "compiled"),
107576
+ compiledDir: join14(workDir, "compiled"),
107504
107577
  port: 0
107505
107578
  });
107506
107579
  assertNotAborted();
@@ -107513,7 +107586,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107513
107586
  };
107514
107587
  probeSession = await createCaptureSession(
107515
107588
  fileServer.url,
107516
- join13(workDir, "probe"),
107589
+ join14(workDir, "probe"),
107517
107590
  captureOpts,
107518
107591
  null,
107519
107592
  cfg
@@ -107545,7 +107618,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107545
107618
  compiled,
107546
107619
  resolutions,
107547
107620
  projectDir,
107548
- join13(workDir, "downloads")
107621
+ join14(workDir, "downloads")
107549
107622
  );
107550
107623
  assertNotAborted();
107551
107624
  composition.videos = compiled.videos;
@@ -107680,12 +107753,12 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107680
107753
  const stage2Start = Date.now();
107681
107754
  updateJobStatus(job, "preprocessing", "Extracting video frames", 10, onProgress);
107682
107755
  let frameLookup = null;
107683
- const compiledDir = join13(workDir, "compiled");
107756
+ const compiledDir = join14(workDir, "compiled");
107684
107757
  if (composition.videos.length > 0) {
107685
107758
  const extractionResult = await extractAllVideoFrames(
107686
107759
  composition.videos,
107687
107760
  projectDir,
107688
- { fps: job.config.fps, outputDir: join13(workDir, "video-frames") },
107761
+ { fps: job.config.fps, outputDir: join14(workDir, "video-frames") },
107689
107762
  abortSignal,
107690
107763
  void 0,
107691
107764
  compiledDir
@@ -107719,13 +107792,13 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107719
107792
  }
107720
107793
  const stage3Start = Date.now();
107721
107794
  updateJobStatus(job, "preprocessing", "Processing audio tracks", 20, onProgress);
107722
- const audioOutputPath = join13(workDir, "audio.aac");
107795
+ const audioOutputPath = join14(workDir, "audio.aac");
107723
107796
  let hasAudio = false;
107724
107797
  if (composition.audios.length > 0) {
107725
107798
  const audioResult = await processCompositionAudio(
107726
107799
  composition.audios,
107727
107800
  projectDir,
107728
- join13(workDir, "audio-work"),
107801
+ join14(workDir, "audio-work"),
107729
107802
  audioOutputPath,
107730
107803
  job.duration,
107731
107804
  abortSignal,
@@ -107743,13 +107816,13 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107743
107816
  if (!fileServer) {
107744
107817
  fileServer = await createFileServer2({
107745
107818
  projectDir,
107746
- compiledDir: join13(workDir, "compiled"),
107819
+ compiledDir: join14(workDir, "compiled"),
107747
107820
  port: 0
107748
107821
  });
107749
107822
  assertNotAborted();
107750
107823
  }
107751
- const framesDir = join13(workDir, "captured-frames");
107752
- if (!existsSync14(framesDir)) mkdirSync9(framesDir, { recursive: true });
107824
+ const framesDir = join14(workDir, "captured-frames");
107825
+ if (!existsSync15(framesDir)) mkdirSync10(framesDir, { recursive: true });
107753
107826
  const captureOptions = {
107754
107827
  width,
107755
107828
  height,
@@ -107760,7 +107833,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107760
107833
  const workerCount = calculateOptimalWorkers(job.totalFrames, job.config.workers, cfg);
107761
107834
  const FORMAT_EXT = { mp4: ".mp4", webm: ".webm", mov: ".mov" };
107762
107835
  const videoExt = FORMAT_EXT[outputFormat] ?? ".mp4";
107763
- const videoOnlyPath = join13(workDir, `video-only${videoExt}`);
107836
+ const videoOnlyPath = join14(workDir, `video-only${videoExt}`);
107764
107837
  const preset = getEncoderPreset(job.config.quality, outputFormat);
107765
107838
  job.framesRendered = 0;
107766
107839
  let streamingEncoder = null;
@@ -108029,7 +108102,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
108029
108102
  job.perfSummary = perfSummary;
108030
108103
  if (job.config.debug) {
108031
108104
  try {
108032
- writeFileSync3(perfOutputPath, JSON.stringify(perfSummary, null, 2), "utf-8");
108105
+ writeFileSync4(perfOutputPath, JSON.stringify(perfSummary, null, 2), "utf-8");
108033
108106
  } catch (err) {
108034
108107
  log.debug("Failed to write perf summary", {
108035
108108
  perfOutputPath,
@@ -108038,8 +108111,8 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
108038
108111
  }
108039
108112
  }
108040
108113
  if (job.config.debug) {
108041
- if (existsSync14(outputPath)) {
108042
- const debugOutput = join13(workDir, `output${videoExt}`);
108114
+ if (existsSync15(outputPath)) {
108115
+ const debugOutput = join14(workDir, `output${videoExt}`);
108043
108116
  copyFileSync2(outputPath, debugOutput);
108044
108117
  }
108045
108118
  } else {
@@ -108122,7 +108195,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
108122
108195
  await safeCleanup(
108123
108196
  "remove workDir (error)",
108124
108197
  () => {
108125
- if (existsSync14(workDir)) rmSync3(workDir, { recursive: true, force: true });
108198
+ if (existsSync15(workDir)) rmSync3(workDir, { recursive: true, force: true });
108126
108199
  },
108127
108200
  log
108128
108201
  );
@@ -108133,8 +108206,8 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
108133
108206
  }
108134
108207
 
108135
108208
  // src/services/hyperframeLint.ts
108136
- import { existsSync as existsSync15, readFileSync as readFileSync9, statSync as statSync6 } from "node:fs";
108137
- import { resolve as resolve10, join as join14 } from "node:path";
108209
+ import { existsSync as existsSync16, readFileSync as readFileSync10, statSync as statSync6 } from "node:fs";
108210
+ import { resolve as resolve10, join as join15 } from "node:path";
108138
108211
  function isStringRecord(value) {
108139
108212
  if (!value || typeof value !== "object" || Array.isArray(value)) {
108140
108213
  return false;
@@ -108162,7 +108235,7 @@ function pickEntryFile(files, preferredEntryFile) {
108162
108235
  }
108163
108236
  function readProjectEntryFile(projectDir, preferredEntryFile) {
108164
108237
  const absProjectDir = resolve10(projectDir);
108165
- if (!existsSync15(absProjectDir) || !statSync6(absProjectDir).isDirectory()) {
108238
+ if (!existsSync16(absProjectDir) || !statSync6(absProjectDir).isDirectory()) {
108166
108239
  return { error: `Project directory not found: ${absProjectDir}` };
108167
108240
  }
108168
108241
  const entryCandidates = [preferredEntryFile, "index.html", "src/index.html"].filter(
@@ -108173,16 +108246,16 @@ function readProjectEntryFile(projectDir, preferredEntryFile) {
108173
108246
  if (!absoluteEntryPath.startsWith(absProjectDir)) {
108174
108247
  return { error: `Entry file must stay inside project directory: ${entryFile}` };
108175
108248
  }
108176
- if (existsSync15(absoluteEntryPath) && statSync6(absoluteEntryPath).isFile()) {
108249
+ if (existsSync16(absoluteEntryPath) && statSync6(absoluteEntryPath).isFile()) {
108177
108250
  return {
108178
108251
  entryFile,
108179
- html: readFileSync9(absoluteEntryPath, "utf-8"),
108252
+ html: readFileSync10(absoluteEntryPath, "utf-8"),
108180
108253
  source: "projectDir"
108181
108254
  };
108182
108255
  }
108183
108256
  }
108184
108257
  return {
108185
- error: `No HTML entry file found in project directory: ${join14(absProjectDir, preferredEntryFile || "index.html")}`
108258
+ error: `No HTML entry file found in project directory: ${join15(absProjectDir, preferredEntryFile || "index.html")}`
108186
108259
  };
108187
108260
  }
108188
108261
  function prepareHyperframeLintBody(body) {
@@ -108223,12 +108296,12 @@ function runHyperframeLint(prepared) {
108223
108296
  }
108224
108297
 
108225
108298
  // src/utils/paths.ts
108226
- import { resolve as resolve11, basename as basename2, join as join15 } from "node:path";
108299
+ import { resolve as resolve11, basename as basename2, join as join16 } from "node:path";
108227
108300
  var DEFAULT_RENDERS_DIR = process.env.PRODUCER_RENDERS_DIR ?? resolve11(new URL(import.meta.url).pathname, "../../..", "renders");
108228
108301
  function resolveRenderPaths(projectDir, outputPath, rendersDir = DEFAULT_RENDERS_DIR) {
108229
108302
  const absoluteProjectDir = resolve11(projectDir);
108230
108303
  const projectName = basename2(absoluteProjectDir);
108231
- const resolvedOutputPath = outputPath ?? join15(rendersDir, `${projectName}.mp4`);
108304
+ const resolvedOutputPath = outputPath ?? join16(rendersDir, `${projectName}.mp4`);
108232
108305
  const absoluteOutputPath = resolve11(resolvedOutputPath);
108233
108306
  return { absoluteProjectDir, absoluteOutputPath };
108234
108307
  }
@@ -108284,11 +108357,11 @@ async function prepareRenderBody(body) {
108284
108357
  const projectDir = typeof body.projectDir === "string" ? body.projectDir : void 0;
108285
108358
  if (projectDir) {
108286
108359
  const absProjectDir = resolve12(projectDir);
108287
- if (!existsSync16(absProjectDir) || !statSync7(absProjectDir).isDirectory()) {
108360
+ if (!existsSync17(absProjectDir) || !statSync7(absProjectDir).isDirectory()) {
108288
108361
  return { error: `Project directory not found: ${absProjectDir}` };
108289
108362
  }
108290
108363
  const entry = options.entryFile || "index.html";
108291
- if (!existsSync16(resolve12(absProjectDir, entry))) {
108364
+ if (!existsSync17(resolve12(absProjectDir, entry))) {
108292
108365
  return { error: `Entry file "${entry}" not found in project directory: ${absProjectDir}` };
108293
108366
  }
108294
108367
  return { prepared: { input: { projectDir: absProjectDir, ...options } } };
@@ -108313,8 +108386,8 @@ async function prepareRenderBody(body) {
108313
108386
  }
108314
108387
  }
108315
108388
  const tempRoot = process.env.PRODUCER_TMP_PROJECT_DIR || tmpdir2();
108316
- const tempProjectDir = mkdtempSync(join16(tempRoot, "producer-project-"));
108317
- writeFileSync4(join16(tempProjectDir, "index.html"), htmlContent, "utf-8");
108389
+ const tempProjectDir = mkdtempSync(join17(tempRoot, "producer-project-"));
108390
+ writeFileSync5(join17(tempProjectDir, "index.html"), htmlContent, "utf-8");
108318
108391
  return {
108319
108392
  prepared: {
108320
108393
  input: {
@@ -108437,7 +108510,7 @@ function createRenderHandlers(options = {}) {
108437
108510
  log
108438
108511
  );
108439
108512
  const outputDir = dirname11(absoluteOutputPath);
108440
- if (!existsSync16(outputDir)) mkdirSync10(outputDir, { recursive: true });
108513
+ if (!existsSync17(outputDir)) mkdirSync11(outputDir, { recursive: true });
108441
108514
  const release = await renderSemaphore.acquire();
108442
108515
  log.info("render started", {
108443
108516
  requestId,
@@ -108464,7 +108537,7 @@ function createRenderHandlers(options = {}) {
108464
108537
  log.info(`render progress ${pct}%`, { requestId, stage: j.currentStage, message });
108465
108538
  }
108466
108539
  });
108467
- const fileSize = existsSync16(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
108540
+ const fileSize = existsSync17(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
108468
108541
  const durationMs = Date.now() - t0;
108469
108542
  const outputToken = store.register(absoluteOutputPath);
108470
108543
  const outputUrl = `${outputUrlPrefix}/${outputToken}`;
@@ -108548,7 +108621,7 @@ function createRenderHandlers(options = {}) {
108548
108621
  log
108549
108622
  );
108550
108623
  const outputDir = dirname11(absoluteOutputPath);
108551
- if (!existsSync16(outputDir)) mkdirSync10(outputDir, { recursive: true });
108624
+ if (!existsSync17(outputDir)) mkdirSync11(outputDir, { recursive: true });
108552
108625
  log.info("render-stream started", { requestId, projectDir: input2.projectDir });
108553
108626
  const job = createRenderJob({
108554
108627
  fps: input2.fps,
@@ -108593,7 +108666,7 @@ function createRenderHandlers(options = {}) {
108593
108666
  },
108594
108667
  abortController.signal
108595
108668
  );
108596
- const fileSize = existsSync16(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
108669
+ const fileSize = existsSync17(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
108597
108670
  const outputToken = store.register(absoluteOutputPath);
108598
108671
  const outputUrl = `${outputUrlPrefix}/${outputToken}`;
108599
108672
  log.info("render-stream completed", { requestId, fileSize, perf: job.perfSummary ?? null });
@@ -108652,7 +108725,7 @@ function createRenderHandlers(options = {}) {
108652
108725
  if (!artifact) {
108653
108726
  return c.json({ success: false, error: "Output artifact not found or expired" }, 404);
108654
108727
  }
108655
- if (!existsSync16(artifact.path)) {
108728
+ if (!existsSync17(artifact.path)) {
108656
108729
  store.delete(token);
108657
108730
  return c.json({ success: false, error: "Output artifact file missing" }, 404);
108658
108731
  }