@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.
package/dist/index.js CHANGED
@@ -57894,7 +57894,7 @@ var require_util2 = __commonJS({
57894
57894
  return path12;
57895
57895
  }
57896
57896
  exports.normalize = normalize2;
57897
- function join17(aRoot, aPath) {
57897
+ function join18(aRoot, aPath) {
57898
57898
  if (aRoot === "") {
57899
57899
  aRoot = ".";
57900
57900
  }
@@ -57926,7 +57926,7 @@ var require_util2 = __commonJS({
57926
57926
  }
57927
57927
  return joined;
57928
57928
  }
57929
- exports.join = join17;
57929
+ exports.join = join18;
57930
57930
  exports.isAbsolute = function(aPath) {
57931
57931
  return aPath.charAt(0) === "/" || urlRegexp.test(aPath);
57932
57932
  };
@@ -58099,7 +58099,7 @@ var require_util2 = __commonJS({
58099
58099
  parsed.path = parsed.path.substring(0, index + 1);
58100
58100
  }
58101
58101
  }
58102
- sourceURL = join17(urlGenerate(parsed), sourceURL);
58102
+ sourceURL = join18(urlGenerate(parsed), sourceURL);
58103
58103
  }
58104
58104
  return normalize2(sourceURL);
58105
58105
  }
@@ -59901,7 +59901,7 @@ var require_escodegen = __commonJS({
59901
59901
  function noEmptySpace() {
59902
59902
  return space ? space : " ";
59903
59903
  }
59904
- function join17(left2, right2) {
59904
+ function join18(left2, right2) {
59905
59905
  var leftSource, rightSource, leftCharCode, rightCharCode;
59906
59906
  leftSource = toSourceNodeWhenNeeded(left2).toString();
59907
59907
  if (leftSource.length === 0) {
@@ -60232,8 +60232,8 @@ var require_escodegen = __commonJS({
60232
60232
  } else {
60233
60233
  result.push(that.generateExpression(stmt.left, Precedence.Call, E_TTT));
60234
60234
  }
60235
- result = join17(result, operator);
60236
- result = [join17(
60235
+ result = join18(result, operator);
60236
+ result = [join18(
60237
60237
  result,
60238
60238
  that.generateExpression(stmt.right, Precedence.Assignment, E_TTT)
60239
60239
  ), ")"];
@@ -60376,11 +60376,11 @@ var require_escodegen = __commonJS({
60376
60376
  var result, fragment;
60377
60377
  result = ["class"];
60378
60378
  if (stmt.id) {
60379
- result = join17(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
60379
+ result = join18(result, this.generateExpression(stmt.id, Precedence.Sequence, E_TTT));
60380
60380
  }
60381
60381
  if (stmt.superClass) {
60382
- fragment = join17("extends", this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
60383
- result = join17(result, fragment);
60382
+ fragment = join18("extends", this.generateExpression(stmt.superClass, Precedence.Unary, E_TTT));
60383
+ result = join18(result, fragment);
60384
60384
  }
60385
60385
  result.push(space);
60386
60386
  result.push(this.generateStatement(stmt.body, S_TFFT));
@@ -60393,9 +60393,9 @@ var require_escodegen = __commonJS({
60393
60393
  return escapeDirective(stmt.directive) + this.semicolon(flags);
60394
60394
  },
60395
60395
  DoWhileStatement: function(stmt, flags) {
60396
- var result = join17("do", this.maybeBlock(stmt.body, S_TFFF));
60396
+ var result = join18("do", this.maybeBlock(stmt.body, S_TFFF));
60397
60397
  result = this.maybeBlockSuffix(stmt.body, result);
60398
- return join17(result, [
60398
+ return join18(result, [
60399
60399
  "while" + space + "(",
60400
60400
  this.generateExpression(stmt.test, Precedence.Sequence, E_TTT),
60401
60401
  ")" + this.semicolon(flags)
@@ -60431,11 +60431,11 @@ var require_escodegen = __commonJS({
60431
60431
  ExportDefaultDeclaration: function(stmt, flags) {
60432
60432
  var result = ["export"], bodyFlags;
60433
60433
  bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF;
60434
- result = join17(result, "default");
60434
+ result = join18(result, "default");
60435
60435
  if (isStatement(stmt.declaration)) {
60436
- result = join17(result, this.generateStatement(stmt.declaration, bodyFlags));
60436
+ result = join18(result, this.generateStatement(stmt.declaration, bodyFlags));
60437
60437
  } else {
60438
- result = join17(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
60438
+ result = join18(result, this.generateExpression(stmt.declaration, Precedence.Assignment, E_TTT) + this.semicolon(flags));
60439
60439
  }
60440
60440
  return result;
60441
60441
  },
@@ -60443,15 +60443,15 @@ var require_escodegen = __commonJS({
60443
60443
  var result = ["export"], bodyFlags, that = this;
60444
60444
  bodyFlags = flags & F_SEMICOLON_OPT ? S_TFFT : S_TFFF;
60445
60445
  if (stmt.declaration) {
60446
- return join17(result, this.generateStatement(stmt.declaration, bodyFlags));
60446
+ return join18(result, this.generateStatement(stmt.declaration, bodyFlags));
60447
60447
  }
60448
60448
  if (stmt.specifiers) {
60449
60449
  if (stmt.specifiers.length === 0) {
60450
- result = join17(result, "{" + space + "}");
60450
+ result = join18(result, "{" + space + "}");
60451
60451
  } else if (stmt.specifiers[0].type === Syntax.ExportBatchSpecifier) {
60452
- result = join17(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
60452
+ result = join18(result, this.generateExpression(stmt.specifiers[0], Precedence.Sequence, E_TTT));
60453
60453
  } else {
60454
- result = join17(result, "{");
60454
+ result = join18(result, "{");
60455
60455
  withIndent(function(indent2) {
60456
60456
  var i, iz;
60457
60457
  result.push(newline);
@@ -60469,7 +60469,7 @@ var require_escodegen = __commonJS({
60469
60469
  result.push(base + "}");
60470
60470
  }
60471
60471
  if (stmt.source) {
60472
- result = join17(result, [
60472
+ result = join18(result, [
60473
60473
  "from" + space,
60474
60474
  // ModuleSpecifier
60475
60475
  this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
@@ -60557,7 +60557,7 @@ var require_escodegen = __commonJS({
60557
60557
  ];
60558
60558
  cursor = 0;
60559
60559
  if (stmt.specifiers[cursor].type === Syntax.ImportDefaultSpecifier) {
60560
- result = join17(result, [
60560
+ result = join18(result, [
60561
60561
  this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
60562
60562
  ]);
60563
60563
  ++cursor;
@@ -60567,7 +60567,7 @@ var require_escodegen = __commonJS({
60567
60567
  result.push(",");
60568
60568
  }
60569
60569
  if (stmt.specifiers[cursor].type === Syntax.ImportNamespaceSpecifier) {
60570
- result = join17(result, [
60570
+ result = join18(result, [
60571
60571
  space,
60572
60572
  this.generateExpression(stmt.specifiers[cursor], Precedence.Sequence, E_TTT)
60573
60573
  ]);
@@ -60596,7 +60596,7 @@ var require_escodegen = __commonJS({
60596
60596
  }
60597
60597
  }
60598
60598
  }
60599
- result = join17(result, [
60599
+ result = join18(result, [
60600
60600
  "from" + space,
60601
60601
  // ModuleSpecifier
60602
60602
  this.generateExpression(stmt.source, Precedence.Sequence, E_TTT),
@@ -60650,7 +60650,7 @@ var require_escodegen = __commonJS({
60650
60650
  return result;
60651
60651
  },
60652
60652
  ThrowStatement: function(stmt, flags) {
60653
- return [join17(
60653
+ return [join18(
60654
60654
  "throw",
60655
60655
  this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
60656
60656
  ), this.semicolon(flags)];
@@ -60661,7 +60661,7 @@ var require_escodegen = __commonJS({
60661
60661
  result = this.maybeBlockSuffix(stmt.block, result);
60662
60662
  if (stmt.handlers) {
60663
60663
  for (i = 0, iz = stmt.handlers.length; i < iz; ++i) {
60664
- result = join17(result, this.generateStatement(stmt.handlers[i], S_TFFF));
60664
+ result = join18(result, this.generateStatement(stmt.handlers[i], S_TFFF));
60665
60665
  if (stmt.finalizer || i + 1 !== iz) {
60666
60666
  result = this.maybeBlockSuffix(stmt.handlers[i].body, result);
60667
60667
  }
@@ -60669,7 +60669,7 @@ var require_escodegen = __commonJS({
60669
60669
  } else {
60670
60670
  guardedHandlers = stmt.guardedHandlers || [];
60671
60671
  for (i = 0, iz = guardedHandlers.length; i < iz; ++i) {
60672
- result = join17(result, this.generateStatement(guardedHandlers[i], S_TFFF));
60672
+ result = join18(result, this.generateStatement(guardedHandlers[i], S_TFFF));
60673
60673
  if (stmt.finalizer || i + 1 !== iz) {
60674
60674
  result = this.maybeBlockSuffix(guardedHandlers[i].body, result);
60675
60675
  }
@@ -60677,13 +60677,13 @@ var require_escodegen = __commonJS({
60677
60677
  if (stmt.handler) {
60678
60678
  if (Array.isArray(stmt.handler)) {
60679
60679
  for (i = 0, iz = stmt.handler.length; i < iz; ++i) {
60680
- result = join17(result, this.generateStatement(stmt.handler[i], S_TFFF));
60680
+ result = join18(result, this.generateStatement(stmt.handler[i], S_TFFF));
60681
60681
  if (stmt.finalizer || i + 1 !== iz) {
60682
60682
  result = this.maybeBlockSuffix(stmt.handler[i].body, result);
60683
60683
  }
60684
60684
  }
60685
60685
  } else {
60686
- result = join17(result, this.generateStatement(stmt.handler, S_TFFF));
60686
+ result = join18(result, this.generateStatement(stmt.handler, S_TFFF));
60687
60687
  if (stmt.finalizer) {
60688
60688
  result = this.maybeBlockSuffix(stmt.handler.body, result);
60689
60689
  }
@@ -60691,7 +60691,7 @@ var require_escodegen = __commonJS({
60691
60691
  }
60692
60692
  }
60693
60693
  if (stmt.finalizer) {
60694
- result = join17(result, ["finally", this.maybeBlock(stmt.finalizer, S_TFFF)]);
60694
+ result = join18(result, ["finally", this.maybeBlock(stmt.finalizer, S_TFFF)]);
60695
60695
  }
60696
60696
  return result;
60697
60697
  },
@@ -60725,7 +60725,7 @@ var require_escodegen = __commonJS({
60725
60725
  withIndent(function() {
60726
60726
  if (stmt.test) {
60727
60727
  result = [
60728
- join17("case", that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
60728
+ join18("case", that.generateExpression(stmt.test, Precedence.Sequence, E_TTT)),
60729
60729
  ":"
60730
60730
  ];
60731
60731
  } else {
@@ -60773,9 +60773,9 @@ var require_escodegen = __commonJS({
60773
60773
  result.push(this.maybeBlock(stmt.consequent, S_TFFF));
60774
60774
  result = this.maybeBlockSuffix(stmt.consequent, result);
60775
60775
  if (stmt.alternate.type === Syntax.IfStatement) {
60776
- result = join17(result, ["else ", this.generateStatement(stmt.alternate, bodyFlags)]);
60776
+ result = join18(result, ["else ", this.generateStatement(stmt.alternate, bodyFlags)]);
60777
60777
  } else {
60778
- result = join17(result, join17("else", this.maybeBlock(stmt.alternate, bodyFlags)));
60778
+ result = join18(result, join18("else", this.maybeBlock(stmt.alternate, bodyFlags)));
60779
60779
  }
60780
60780
  } else {
60781
60781
  result.push(this.maybeBlock(stmt.consequent, bodyFlags));
@@ -60876,7 +60876,7 @@ var require_escodegen = __commonJS({
60876
60876
  },
60877
60877
  ReturnStatement: function(stmt, flags) {
60878
60878
  if (stmt.argument) {
60879
- return [join17(
60879
+ return [join18(
60880
60880
  "return",
60881
60881
  this.generateExpression(stmt.argument, Precedence.Sequence, E_TTT)
60882
60882
  ), this.semicolon(flags)];
@@ -60965,14 +60965,14 @@ var require_escodegen = __commonJS({
60965
60965
  if (leftSource.charCodeAt(leftSource.length - 1) === 47 && esutils.code.isIdentifierPartES5(expr.operator.charCodeAt(0))) {
60966
60966
  result = [fragment, noEmptySpace(), expr.operator];
60967
60967
  } else {
60968
- result = join17(fragment, expr.operator);
60968
+ result = join18(fragment, expr.operator);
60969
60969
  }
60970
60970
  fragment = this.generateExpression(expr.right, rightPrecedence, flags);
60971
60971
  if (expr.operator === "/" && fragment.toString().charAt(0) === "/" || expr.operator.slice(-1) === "<" && fragment.toString().slice(0, 3) === "!--") {
60972
60972
  result.push(noEmptySpace());
60973
60973
  result.push(fragment);
60974
60974
  } else {
60975
- result = join17(result, fragment);
60975
+ result = join18(result, fragment);
60976
60976
  }
60977
60977
  if (expr.operator === "in" && !(flags & F_ALLOW_IN)) {
60978
60978
  return ["(", result, ")"];
@@ -61012,7 +61012,7 @@ var require_escodegen = __commonJS({
61012
61012
  var result, length, i, iz, itemFlags;
61013
61013
  length = expr["arguments"].length;
61014
61014
  itemFlags = flags & F_ALLOW_UNPARATH_NEW && !parentheses && length === 0 ? E_TFT : E_TFF;
61015
- result = join17(
61015
+ result = join18(
61016
61016
  "new",
61017
61017
  this.generateExpression(expr.callee, Precedence.New, itemFlags)
61018
61018
  );
@@ -61062,11 +61062,11 @@ var require_escodegen = __commonJS({
61062
61062
  var result, fragment, rightCharCode, leftSource, leftCharCode;
61063
61063
  fragment = this.generateExpression(expr.argument, Precedence.Unary, E_TTT);
61064
61064
  if (space === "") {
61065
- result = join17(expr.operator, fragment);
61065
+ result = join18(expr.operator, fragment);
61066
61066
  } else {
61067
61067
  result = [expr.operator];
61068
61068
  if (expr.operator.length > 2) {
61069
- result = join17(result, fragment);
61069
+ result = join18(result, fragment);
61070
61070
  } else {
61071
61071
  leftSource = toSourceNodeWhenNeeded(result).toString();
61072
61072
  leftCharCode = leftSource.charCodeAt(leftSource.length - 1);
@@ -61089,7 +61089,7 @@ var require_escodegen = __commonJS({
61089
61089
  result = "yield";
61090
61090
  }
61091
61091
  if (expr.argument) {
61092
- result = join17(
61092
+ result = join18(
61093
61093
  result,
61094
61094
  this.generateExpression(expr.argument, Precedence.Yield, E_TTT)
61095
61095
  );
@@ -61097,7 +61097,7 @@ var require_escodegen = __commonJS({
61097
61097
  return parenthesize(result, Precedence.Yield, precedence);
61098
61098
  },
61099
61099
  AwaitExpression: function(expr, precedence, flags) {
61100
- var result = join17(
61100
+ var result = join18(
61101
61101
  expr.all ? "await*" : "await",
61102
61102
  this.generateExpression(expr.argument, Precedence.Await, E_TTT)
61103
61103
  );
@@ -61180,11 +61180,11 @@ var require_escodegen = __commonJS({
61180
61180
  var result, fragment;
61181
61181
  result = ["class"];
61182
61182
  if (expr.id) {
61183
- result = join17(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
61183
+ result = join18(result, this.generateExpression(expr.id, Precedence.Sequence, E_TTT));
61184
61184
  }
61185
61185
  if (expr.superClass) {
61186
- fragment = join17("extends", this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
61187
- result = join17(result, fragment);
61186
+ fragment = join18("extends", this.generateExpression(expr.superClass, Precedence.Unary, E_TTT));
61187
+ result = join18(result, fragment);
61188
61188
  }
61189
61189
  result.push(space);
61190
61190
  result.push(this.generateStatement(expr.body, S_TFFT));
@@ -61199,7 +61199,7 @@ var require_escodegen = __commonJS({
61199
61199
  }
61200
61200
  if (expr.kind === "get" || expr.kind === "set") {
61201
61201
  fragment = [
61202
- join17(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
61202
+ join18(expr.kind, this.generatePropertyKey(expr.key, expr.computed)),
61203
61203
  this.generateFunctionBody(expr.value)
61204
61204
  ];
61205
61205
  } else {
@@ -61209,7 +61209,7 @@ var require_escodegen = __commonJS({
61209
61209
  this.generateFunctionBody(expr.value)
61210
61210
  ];
61211
61211
  }
61212
- return join17(result, fragment);
61212
+ return join18(result, fragment);
61213
61213
  },
61214
61214
  Property: function(expr, precedence, flags) {
61215
61215
  if (expr.kind === "get" || expr.kind === "set") {
@@ -61404,7 +61404,7 @@ var require_escodegen = __commonJS({
61404
61404
  for (i = 0, iz = expr.blocks.length; i < iz; ++i) {
61405
61405
  fragment = that.generateExpression(expr.blocks[i], Precedence.Sequence, E_TTT);
61406
61406
  if (i > 0 || extra.moz.comprehensionExpressionStartsWithAssignment) {
61407
- result = join17(result, fragment);
61407
+ result = join18(result, fragment);
61408
61408
  } else {
61409
61409
  result.push(fragment);
61410
61410
  }
@@ -61412,13 +61412,13 @@ var require_escodegen = __commonJS({
61412
61412
  });
61413
61413
  }
61414
61414
  if (expr.filter) {
61415
- result = join17(result, "if" + space);
61415
+ result = join18(result, "if" + space);
61416
61416
  fragment = this.generateExpression(expr.filter, Precedence.Sequence, E_TTT);
61417
- result = join17(result, ["(", fragment, ")"]);
61417
+ result = join18(result, ["(", fragment, ")"]);
61418
61418
  }
61419
61419
  if (!extra.moz.comprehensionExpressionStartsWithAssignment) {
61420
61420
  fragment = this.generateExpression(expr.body, Precedence.Assignment, E_TTT);
61421
- result = join17(result, fragment);
61421
+ result = join18(result, fragment);
61422
61422
  }
61423
61423
  result.push(expr.type === Syntax.GeneratorExpression ? ")" : "]");
61424
61424
  return result;
@@ -61434,8 +61434,8 @@ var require_escodegen = __commonJS({
61434
61434
  } else {
61435
61435
  fragment = this.generateExpression(expr.left, Precedence.Call, E_TTT);
61436
61436
  }
61437
- fragment = join17(fragment, expr.of ? "of" : "in");
61438
- fragment = join17(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
61437
+ fragment = join18(fragment, expr.of ? "of" : "in");
61438
+ fragment = join18(fragment, this.generateExpression(expr.right, Precedence.Sequence, E_TTT));
61439
61439
  return ["for" + space + "(", fragment, ")"];
61440
61440
  },
61441
61441
  SpreadElement: function(expr, precedence, flags) {
@@ -87597,9 +87597,9 @@ async function getConnectionTransport(options) {
87597
87597
  throw new Error("Could not detect required browser platform");
87598
87598
  }
87599
87599
  const { convertPuppeteerChannelToBrowsersChannel: convertPuppeteerChannelToBrowsersChannel2 } = await Promise.resolve().then(() => (init_LaunchOptions(), LaunchOptions_exports));
87600
- const { join: join17 } = await import("node:path");
87600
+ const { join: join18 } = await import("node:path");
87601
87601
  const userDataDir = resolveDefaultUserDataDir3(Browser4.CHROME, platform, convertPuppeteerChannelToBrowsersChannel2(options.channel));
87602
- const portPath = join17(userDataDir, "DevToolsActivePort");
87602
+ const portPath = join18(userDataDir, "DevToolsActivePort");
87603
87603
  try {
87604
87604
  const fileContent = await environment.value.fs.promises.readFile(portPath, "ascii");
87605
87605
  const [rawPort, rawPath] = fileContent.split("\n").map((line) => {
@@ -89417,11 +89417,11 @@ var init_puppeteer_core = __esm({
89417
89417
 
89418
89418
  // src/services/renderOrchestrator.ts
89419
89419
  import {
89420
- existsSync as existsSync14,
89421
- mkdirSync as mkdirSync9,
89420
+ existsSync as existsSync15,
89421
+ mkdirSync as mkdirSync10,
89422
89422
  rmSync as rmSync3,
89423
- readFileSync as readFileSync8,
89424
- writeFileSync as writeFileSync3,
89423
+ readFileSync as readFileSync9,
89424
+ writeFileSync as writeFileSync4,
89425
89425
  copyFileSync as copyFileSync2,
89426
89426
  appendFileSync
89427
89427
  } from "fs";
@@ -105679,7 +105679,7 @@ var serve = (options, listeningListener) => {
105679
105679
  };
105680
105680
 
105681
105681
  // src/services/renderOrchestrator.ts
105682
- import { join as join13, dirname as dirname10, resolve as resolve9 } from "path";
105682
+ import { join as join14, dirname as dirname10, resolve as resolve9 } from "path";
105683
105683
  import { randomUUID } from "crypto";
105684
105684
  import { freemem as freemem2 } from "os";
105685
105685
  import { fileURLToPath as fileURLToPath3 } from "url";
@@ -106038,10 +106038,15 @@ function createFileServer2(options) {
106038
106038
  }
106039
106039
 
106040
106040
  // src/services/htmlCompiler.ts
106041
- import { readFileSync as readFileSync7, existsSync as existsSync13, mkdirSync as mkdirSync8 } from "fs";
106042
- import { join as join12, dirname as dirname9, resolve as resolve8 } from "path";
106041
+ import { readFileSync as readFileSync8, existsSync as existsSync14, mkdirSync as mkdirSync9 } from "fs";
106042
+ import { join as join13, dirname as dirname9, resolve as resolve8 } from "path";
106043
106043
  import postcss from "postcss";
106044
106044
 
106045
+ // src/services/deterministicFonts.ts
106046
+ import { existsSync as existsSync13, mkdirSync as mkdirSync8, readFileSync as readFileSync7, writeFileSync as writeFileSync3 } from "node:fs";
106047
+ import { homedir as homedir2 } from "node:os";
106048
+ import { join as join12 } from "node:path";
106049
+
106045
106050
  // src/services/fontData.generated.ts
106046
106051
  var EMBEDDED_FONT_DATA = /* @__PURE__ */ new Map([
106047
106052
  ["@fontsource/inter:400:normal", "data:font/woff2;base64,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"],
@@ -106261,32 +106266,40 @@ function extractRequestedFontFamilies(html) {
106261
106266
  }
106262
106267
  return requested;
106263
106268
  }
106264
- function buildFontFaceCss(requestedFamilies) {
106269
+ function buildFontFaceRule(familyName, src, weight, style) {
106270
+ return [
106271
+ "@font-face {",
106272
+ ` font-family: "${familyName}";`,
106273
+ ` src: url("${src}") format("woff2");`,
106274
+ ` font-style: ${style};`,
106275
+ ` font-weight: ${weight};`,
106276
+ " font-display: block;",
106277
+ "}"
106278
+ ].join("\n");
106279
+ }
106280
+ async function buildFontFaceCss(requestedFamilies) {
106265
106281
  const rules = [];
106266
106282
  const unresolved = [];
106267
106283
  for (const [normalizedFamily, originalCaseFamily] of requestedFamilies) {
106268
106284
  const canonicalKey = FONT_ALIASES[normalizedFamily];
106269
- if (!canonicalKey) {
106270
- unresolved.push(originalCaseFamily);
106285
+ if (canonicalKey) {
106286
+ const canonical = CANONICAL_FONTS[canonicalKey];
106287
+ if (!canonical) continue;
106288
+ for (const face of canonical.faces) {
106289
+ const style = face.style || "normal";
106290
+ const src = fontDataUri(canonical.packageName, face.weight, style);
106291
+ rules.push(buildFontFaceRule(originalCaseFamily, src, face.weight, style));
106292
+ }
106271
106293
  continue;
106272
106294
  }
106273
- const canonical = CANONICAL_FONTS[canonicalKey];
106274
- if (!canonical) continue;
106275
- for (const face of canonical.faces) {
106276
- const style = face.style || "normal";
106277
- const src = fontDataUri(canonical.packageName, face.weight, style);
106278
- rules.push(
106279
- [
106280
- "@font-face {",
106281
- ` font-family: "${originalCaseFamily}";`,
106282
- ` src: url("${src}") format("woff2");`,
106283
- ` font-style: ${style};`,
106284
- ` font-weight: ${face.weight};`,
106285
- " font-display: block;",
106286
- "}"
106287
- ].join("\n")
106288
- );
106295
+ const googleFaces = await fetchGoogleFont(originalCaseFamily);
106296
+ if (googleFaces.length > 0) {
106297
+ for (const face of googleFaces) {
106298
+ rules.push(buildFontFaceRule(originalCaseFamily, face.dataUri, face.weight, face.style));
106299
+ }
106300
+ continue;
106289
106301
  }
106302
+ unresolved.push(originalCaseFamily);
106290
106303
  }
106291
106304
  return {
106292
106305
  css: rules.join("\n\n").trim(),
@@ -106310,7 +106323,67 @@ function warnUnresolvedFonts(unresolved) {
106310
106323
  Docs: https://hyperframes.heygen.com/docs/fonts`
106311
106324
  );
106312
106325
  }
106313
- function injectDeterministicFontFaces(html) {
106326
+ var GOOGLE_FONTS_CACHE_DIR = join12(homedir2(), ".cache", "hyperframes", "fonts");
106327
+ 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";
106328
+ function fontSlug(familyName) {
106329
+ return familyName.toLowerCase().replace(/[^a-z0-9]+/g, "-").replace(/^-|-$/g, "");
106330
+ }
106331
+ function fontCacheDir(slug) {
106332
+ const dir = join12(GOOGLE_FONTS_CACHE_DIR, slug);
106333
+ if (!existsSync13(dir)) {
106334
+ mkdirSync8(dir, { recursive: true });
106335
+ }
106336
+ return dir;
106337
+ }
106338
+ function cachedWoff2Path(slug, weight, style) {
106339
+ return join12(fontCacheDir(slug), `${weight}-${style}.woff2`);
106340
+ }
106341
+ async function fetchGoogleFont(familyName) {
106342
+ const slug = fontSlug(familyName);
106343
+ const encodedFamily = encodeURIComponent(familyName);
106344
+ 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`;
106345
+ let cssText;
106346
+ try {
106347
+ const res = await fetch(url, {
106348
+ headers: { "User-Agent": WOFF2_USER_AGENT }
106349
+ });
106350
+ if (!res.ok) {
106351
+ return [];
106352
+ }
106353
+ cssText = await res.text();
106354
+ } catch {
106355
+ return [];
106356
+ }
106357
+ const faceRegex = /@font-face\s*\{[^}]*font-style:\s*(normal|italic)[^}]*font-weight:\s*(\d+)[^}]*src:\s*url\(([^)]+)\)\s*format\(['"]woff2['"]\)[^}]*\}/gi;
106358
+ const faces = [];
106359
+ for (const match2 of cssText.matchAll(faceRegex)) {
106360
+ const style = match2[1] || "normal";
106361
+ const weight = match2[2] || "400";
106362
+ const woff2Url = match2[3] || "";
106363
+ if (!woff2Url) continue;
106364
+ const cachePath = cachedWoff2Path(slug, weight, style);
106365
+ if (!existsSync13(cachePath)) {
106366
+ try {
106367
+ const fontRes = await fetch(woff2Url);
106368
+ if (!fontRes.ok) continue;
106369
+ const buffer = Buffer.from(await fontRes.arrayBuffer());
106370
+ writeFileSync3(cachePath, buffer);
106371
+ } catch {
106372
+ continue;
106373
+ }
106374
+ }
106375
+ const fontBytes = readFileSync7(cachePath);
106376
+ const dataUri = `data:font/woff2;base64,${fontBytes.toString("base64")}`;
106377
+ faces.push({ weight, style, dataUri });
106378
+ }
106379
+ if (faces.length > 0) {
106380
+ console.log(
106381
+ `[Compiler] Fetched ${faces.length} font face(s) for "${familyName}" from Google Fonts (cached to ${fontCacheDir(slug)})`
106382
+ );
106383
+ }
106384
+ return faces;
106385
+ }
106386
+ async function injectDeterministicFontFaces(html) {
106314
106387
  const existingFaces = extractExistingFontFaces(html);
106315
106388
  const requestedFamilies = extractRequestedFontFamilies(html);
106316
106389
  const pendingFamilies = /* @__PURE__ */ new Map();
@@ -106322,7 +106395,7 @@ function injectDeterministicFontFaces(html) {
106322
106395
  if (pendingFamilies.size === 0) {
106323
106396
  return html;
106324
106397
  }
106325
- const { css, unresolved } = buildFontFaceCss(pendingFamilies);
106398
+ const { css, unresolved } = await buildFontFaceCss(pendingFamilies);
106326
106399
  if (!css) {
106327
106400
  if (unresolved.length > 0) {
106328
106401
  warnUnresolvedFonts(unresolved);
@@ -106358,16 +106431,16 @@ function dedupeElementsById(elements) {
106358
106431
  async function resolveMediaDuration(src, mediaStart, baseDir, downloadDir, tagName19) {
106359
106432
  let filePath = src;
106360
106433
  if (isHttpUrl(src)) {
106361
- if (!existsSync13(downloadDir)) mkdirSync8(downloadDir, { recursive: true });
106434
+ if (!existsSync14(downloadDir)) mkdirSync9(downloadDir, { recursive: true });
106362
106435
  try {
106363
106436
  filePath = await downloadToTemp(src, downloadDir);
106364
106437
  } catch {
106365
106438
  return { duration: 0, resolvedPath: src };
106366
106439
  }
106367
106440
  } else if (!filePath.startsWith("/")) {
106368
- filePath = join12(baseDir, filePath);
106441
+ filePath = join13(baseDir, filePath);
106369
106442
  }
106370
- if (!existsSync13(filePath)) {
106443
+ if (!existsSync14(filePath)) {
106371
106444
  return { duration: 0, resolvedPath: filePath };
106372
106445
  }
106373
106446
  const metadata = tagName19 === "video" ? await extractVideoMetadata(filePath) : await extractAudioMetadata(filePath);
@@ -106435,10 +106508,10 @@ async function parseSubCompositions(html, projectDir, downloadDir, parentOffset
106435
106508
  if (visited.has(filePath)) {
106436
106509
  continue;
106437
106510
  }
106438
- if (!existsSync13(filePath)) {
106511
+ if (!existsSync14(filePath)) {
106439
106512
  continue;
106440
106513
  }
106441
- const rawSubHtml = readFileSync7(filePath, "utf-8");
106514
+ const rawSubHtml = readFileSync8(filePath, "utf-8");
106442
106515
  const nestedVisited = new Set(visited);
106443
106516
  nestedVisited.add(filePath);
106444
106517
  workItems.push({ srcPath, absoluteStart, absoluteEnd, filePath, rawSubHtml, nestedVisited });
@@ -106632,8 +106705,8 @@ function inlineSubCompositions(html, subCompositions, projectDir) {
106632
106705
  let compHtml = subCompositions.get(srcPath) || null;
106633
106706
  if (!compHtml) {
106634
106707
  const filePath = resolve8(projectDir, srcPath);
106635
- if (existsSync13(filePath)) {
106636
- compHtml = readFileSync7(filePath, "utf-8");
106708
+ if (existsSync14(filePath)) {
106709
+ compHtml = readFileSync8(filePath, "utf-8");
106637
106710
  }
106638
106711
  }
106639
106712
  if (!compHtml) {
@@ -106856,7 +106929,7 @@ function collectExternalAssets(html, projectDir) {
106856
106929
  if (absPath.startsWith(absProjectDir + "/") || absPath === absProjectDir) {
106857
106930
  return null;
106858
106931
  }
106859
- if (!existsSync13(absPath)) return null;
106932
+ if (!existsSync14(absPath)) return null;
106860
106933
  const safeKey = "hf-ext/" + absPath.replace(/^\//, "");
106861
106934
  externalAssets.set(safeKey, absPath);
106862
106935
  return safeKey;
@@ -106901,7 +106974,7 @@ function collectExternalAssets(html, projectDir) {
106901
106974
  };
106902
106975
  }
106903
106976
  async function compileForRender(projectDir, htmlPath, downloadDir) {
106904
- const rawHtml = readFileSync7(htmlPath, "utf-8");
106977
+ const rawHtml = readFileSync8(htmlPath, "utf-8");
106905
106978
  const { html: compiledHtml, unresolvedCompositions } = await compileHtmlFile(
106906
106979
  rawHtml,
106907
106980
  projectDir,
@@ -106918,7 +106991,7 @@ async function compileForRender(projectDir, htmlPath, downloadDir) {
106918
106991
  /(<(?:video|audio)\b[^>]*?)\s+preload\s*=\s*["']none["']/gi,
106919
106992
  "$1"
106920
106993
  );
106921
- const coalescedHtml = injectDeterministicFontFaces(
106994
+ const coalescedHtml = await injectDeterministicFontFaces(
106922
106995
  coalesceHeadStylesAndBodyScripts(promoteCssImportsToLinkTags(sanitizedHtml))
106923
106996
  );
106924
106997
  const assembledHtml = await inlineExternalScripts(coalescedHtml);
@@ -107156,21 +107229,21 @@ function installDebugLogger(logPath, log = defaultLogger) {
107156
107229
  };
107157
107230
  }
107158
107231
  function writeCompiledArtifacts(compiled, workDir, includeSummary) {
107159
- const compileDir = join13(workDir, "compiled");
107160
- mkdirSync9(compileDir, { recursive: true });
107161
- writeFileSync3(join13(compileDir, "index.html"), compiled.html, "utf-8");
107232
+ const compileDir = join14(workDir, "compiled");
107233
+ mkdirSync10(compileDir, { recursive: true });
107234
+ writeFileSync4(join14(compileDir, "index.html"), compiled.html, "utf-8");
107162
107235
  for (const [srcPath, html] of compiled.subCompositions) {
107163
- const outPath = join13(compileDir, srcPath);
107164
- mkdirSync9(dirname10(outPath), { recursive: true });
107165
- writeFileSync3(outPath, html, "utf-8");
107236
+ const outPath = join14(compileDir, srcPath);
107237
+ mkdirSync10(dirname10(outPath), { recursive: true });
107238
+ writeFileSync4(outPath, html, "utf-8");
107166
107239
  }
107167
107240
  for (const [relativePath, absolutePath] of compiled.externalAssets) {
107168
- const outPath = resolve9(join13(compileDir, relativePath));
107241
+ const outPath = resolve9(join14(compileDir, relativePath));
107169
107242
  if (!outPath.startsWith(compileDir + "/")) {
107170
107243
  console.warn(`[Render] Skipping external asset with unsafe path: ${relativePath}`);
107171
107244
  continue;
107172
107245
  }
107173
- mkdirSync9(dirname10(outPath), { recursive: true });
107246
+ mkdirSync10(dirname10(outPath), { recursive: true });
107174
107247
  copyFileSync2(absolutePath, outPath);
107175
107248
  }
107176
107249
  if (includeSummary) {
@@ -107194,7 +107267,7 @@ function writeCompiledArtifacts(compiled, workDir, includeSummary) {
107194
107267
  })),
107195
107268
  subCompositions: Array.from(compiled.subCompositions.keys())
107196
107269
  };
107197
- writeFileSync3(join13(compileDir, "summary.json"), JSON.stringify(summary, null, 2), "utf-8");
107270
+ writeFileSync4(join14(compileDir, "summary.json"), JSON.stringify(summary, null, 2), "utf-8");
107198
107271
  }
107199
107272
  }
107200
107273
  function createRenderJob(config2) {
@@ -107239,8 +107312,8 @@ function extractStandaloneEntryFromIndex(indexHtml, entryFile) {
107239
107312
  async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSignal) {
107240
107313
  const moduleDir = dirname10(fileURLToPath3(import.meta.url));
107241
107314
  const producerRoot = process.env.PRODUCER_RENDERS_DIR ? resolve9(process.env.PRODUCER_RENDERS_DIR, "..") : resolve9(moduleDir, "../..");
107242
- const debugDir = join13(producerRoot, ".debug");
107243
- const workDir = job.config.debug ? join13(debugDir, job.id) : join13(dirname10(outputPath), `work-${job.id}`);
107315
+ const debugDir = join14(producerRoot, ".debug");
107316
+ const workDir = job.config.debug ? join14(debugDir, job.id) : join14(dirname10(outputPath), `work-${job.id}`);
107244
107317
  const pipelineStart = Date.now();
107245
107318
  const log = job.config.logger ?? defaultLogger;
107246
107319
  let fileServer = null;
@@ -107248,7 +107321,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107248
107321
  let lastBrowserConsole = [];
107249
107322
  let restoreLogger = null;
107250
107323
  const perfStages = {};
107251
- const perfOutputPath = join13(workDir, "perf-summary.json");
107324
+ const perfOutputPath = join14(workDir, "perf-summary.json");
107252
107325
  const cfg = { ...job.config.producerConfig ?? resolveConfig() };
107253
107326
  const outputFormat = job.config.format ?? "mp4";
107254
107327
  const isWebm = outputFormat === "webm";
@@ -107268,28 +107341,28 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107268
107341
  };
107269
107342
  job.startedAt = /* @__PURE__ */ new Date();
107270
107343
  assertNotAborted();
107271
- if (!existsSync14(workDir)) mkdirSync9(workDir, { recursive: true });
107344
+ if (!existsSync15(workDir)) mkdirSync10(workDir, { recursive: true });
107272
107345
  if (job.config.debug) {
107273
- const logPath = join13(workDir, "render.log");
107346
+ const logPath = join14(workDir, "render.log");
107274
107347
  restoreLogger = installDebugLogger(logPath, log);
107275
107348
  }
107276
107349
  const entryFile = job.config.entryFile || "index.html";
107277
- let htmlPath = join13(projectDir, entryFile);
107278
- if (!existsSync14(htmlPath)) {
107350
+ let htmlPath = join14(projectDir, entryFile);
107351
+ if (!existsSync15(htmlPath)) {
107279
107352
  throw new Error(`Entry file not found: ${htmlPath}`);
107280
107353
  }
107281
107354
  assertNotAborted();
107282
- const rawEntry = readFileSync8(htmlPath, "utf-8");
107355
+ const rawEntry = readFileSync9(htmlPath, "utf-8");
107283
107356
  if (entryFile !== "index.html" && rawEntry.trimStart().startsWith("<template")) {
107284
- const wrapperPath = join13(workDir, "standalone-entry.html");
107285
- const projectIndexPath = join13(projectDir, "index.html");
107286
- if (!existsSync14(projectIndexPath)) {
107357
+ const wrapperPath = join14(workDir, "standalone-entry.html");
107358
+ const projectIndexPath = join14(projectDir, "index.html");
107359
+ if (!existsSync15(projectIndexPath)) {
107287
107360
  throw new Error(
107288
107361
  `Template entry file "${entryFile}" requires a project index.html to extract its render shell.`
107289
107362
  );
107290
107363
  }
107291
107364
  const standaloneHtml = extractStandaloneEntryFromIndex(
107292
- readFileSync8(projectIndexPath, "utf-8"),
107365
+ readFileSync9(projectIndexPath, "utf-8"),
107293
107366
  entryFile
107294
107367
  );
107295
107368
  if (!standaloneHtml) {
@@ -107297,7 +107370,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107297
107370
  `Entry file "${entryFile}" is not mounted from index.html via data-composition-src, so it cannot be rendered independently.`
107298
107371
  );
107299
107372
  }
107300
- writeFileSync3(wrapperPath, standaloneHtml, "utf-8");
107373
+ writeFileSync4(wrapperPath, standaloneHtml, "utf-8");
107301
107374
  htmlPath = wrapperPath;
107302
107375
  log.info("Extracted standalone entry from index.html host context", {
107303
107376
  entryFile
@@ -107306,7 +107379,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107306
107379
  const stage1Start = Date.now();
107307
107380
  updateJobStatus(job, "preprocessing", "Compiling composition", 5, onProgress);
107308
107381
  const compileStart = Date.now();
107309
- let compiled = await compileForRender(projectDir, htmlPath, join13(workDir, "downloads"));
107382
+ let compiled = await compileForRender(projectDir, htmlPath, join14(workDir, "downloads"));
107310
107383
  assertNotAborted();
107311
107384
  perfStages.compileOnlyMs = Date.now() - compileStart;
107312
107385
  writeCompiledArtifacts(compiled, workDir, Boolean(job.config.debug));
@@ -107335,7 +107408,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107335
107408
  reasons.push(`${compiled.unresolvedCompositions.length} unresolved composition(s)`);
107336
107409
  fileServer = await createFileServer2({
107337
107410
  projectDir,
107338
- compiledDir: join13(workDir, "compiled"),
107411
+ compiledDir: join14(workDir, "compiled"),
107339
107412
  port: 0
107340
107413
  });
107341
107414
  assertNotAborted();
@@ -107348,7 +107421,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107348
107421
  };
107349
107422
  probeSession = await createCaptureSession(
107350
107423
  fileServer.url,
107351
- join13(workDir, "probe"),
107424
+ join14(workDir, "probe"),
107352
107425
  captureOpts,
107353
107426
  null,
107354
107427
  cfg
@@ -107380,7 +107453,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107380
107453
  compiled,
107381
107454
  resolutions,
107382
107455
  projectDir,
107383
- join13(workDir, "downloads")
107456
+ join14(workDir, "downloads")
107384
107457
  );
107385
107458
  assertNotAborted();
107386
107459
  composition.videos = compiled.videos;
@@ -107515,12 +107588,12 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107515
107588
  const stage2Start = Date.now();
107516
107589
  updateJobStatus(job, "preprocessing", "Extracting video frames", 10, onProgress);
107517
107590
  let frameLookup = null;
107518
- const compiledDir = join13(workDir, "compiled");
107591
+ const compiledDir = join14(workDir, "compiled");
107519
107592
  if (composition.videos.length > 0) {
107520
107593
  const extractionResult = await extractAllVideoFrames(
107521
107594
  composition.videos,
107522
107595
  projectDir,
107523
- { fps: job.config.fps, outputDir: join13(workDir, "video-frames") },
107596
+ { fps: job.config.fps, outputDir: join14(workDir, "video-frames") },
107524
107597
  abortSignal,
107525
107598
  void 0,
107526
107599
  compiledDir
@@ -107554,13 +107627,13 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107554
107627
  }
107555
107628
  const stage3Start = Date.now();
107556
107629
  updateJobStatus(job, "preprocessing", "Processing audio tracks", 20, onProgress);
107557
- const audioOutputPath = join13(workDir, "audio.aac");
107630
+ const audioOutputPath = join14(workDir, "audio.aac");
107558
107631
  let hasAudio = false;
107559
107632
  if (composition.audios.length > 0) {
107560
107633
  const audioResult = await processCompositionAudio(
107561
107634
  composition.audios,
107562
107635
  projectDir,
107563
- join13(workDir, "audio-work"),
107636
+ join14(workDir, "audio-work"),
107564
107637
  audioOutputPath,
107565
107638
  job.duration,
107566
107639
  abortSignal,
@@ -107578,13 +107651,13 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107578
107651
  if (!fileServer) {
107579
107652
  fileServer = await createFileServer2({
107580
107653
  projectDir,
107581
- compiledDir: join13(workDir, "compiled"),
107654
+ compiledDir: join14(workDir, "compiled"),
107582
107655
  port: 0
107583
107656
  });
107584
107657
  assertNotAborted();
107585
107658
  }
107586
- const framesDir = join13(workDir, "captured-frames");
107587
- if (!existsSync14(framesDir)) mkdirSync9(framesDir, { recursive: true });
107659
+ const framesDir = join14(workDir, "captured-frames");
107660
+ if (!existsSync15(framesDir)) mkdirSync10(framesDir, { recursive: true });
107588
107661
  const captureOptions = {
107589
107662
  width,
107590
107663
  height,
@@ -107595,7 +107668,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107595
107668
  const workerCount = calculateOptimalWorkers(job.totalFrames, job.config.workers, cfg);
107596
107669
  const FORMAT_EXT = { mp4: ".mp4", webm: ".webm", mov: ".mov" };
107597
107670
  const videoExt = FORMAT_EXT[outputFormat] ?? ".mp4";
107598
- const videoOnlyPath = join13(workDir, `video-only${videoExt}`);
107671
+ const videoOnlyPath = join14(workDir, `video-only${videoExt}`);
107599
107672
  const preset = getEncoderPreset(job.config.quality, outputFormat);
107600
107673
  job.framesRendered = 0;
107601
107674
  let streamingEncoder = null;
@@ -107864,7 +107937,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107864
107937
  job.perfSummary = perfSummary;
107865
107938
  if (job.config.debug) {
107866
107939
  try {
107867
- writeFileSync3(perfOutputPath, JSON.stringify(perfSummary, null, 2), "utf-8");
107940
+ writeFileSync4(perfOutputPath, JSON.stringify(perfSummary, null, 2), "utf-8");
107868
107941
  } catch (err) {
107869
107942
  log.debug("Failed to write perf summary", {
107870
107943
  perfOutputPath,
@@ -107873,8 +107946,8 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107873
107946
  }
107874
107947
  }
107875
107948
  if (job.config.debug) {
107876
- if (existsSync14(outputPath)) {
107877
- const debugOutput = join13(workDir, `output${videoExt}`);
107949
+ if (existsSync15(outputPath)) {
107950
+ const debugOutput = join14(workDir, `output${videoExt}`);
107878
107951
  copyFileSync2(outputPath, debugOutput);
107879
107952
  }
107880
107953
  } else {
@@ -107957,7 +108030,7 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107957
108030
  await safeCleanup(
107958
108031
  "remove workDir (error)",
107959
108032
  () => {
107960
- if (existsSync14(workDir)) rmSync3(workDir, { recursive: true, force: true });
108033
+ if (existsSync15(workDir)) rmSync3(workDir, { recursive: true, force: true });
107961
108034
  },
107962
108035
  log
107963
108036
  );
@@ -107969,15 +108042,15 @@ async function executeRenderJob(job, projectDir, outputPath, onProgress, abortSi
107969
108042
 
107970
108043
  // src/server.ts
107971
108044
  import {
107972
- existsSync as existsSync16,
107973
- mkdirSync as mkdirSync10,
108045
+ existsSync as existsSync17,
108046
+ mkdirSync as mkdirSync11,
107974
108047
  statSync as statSync7,
107975
108048
  mkdtempSync,
107976
- writeFileSync as writeFileSync4,
108049
+ writeFileSync as writeFileSync5,
107977
108050
  rmSync as rmSync4,
107978
108051
  createReadStream as createReadStream2
107979
108052
  } from "node:fs";
107980
- import { resolve as resolve12, dirname as dirname11, join as join16 } from "node:path";
108053
+ import { resolve as resolve12, dirname as dirname11, join as join17 } from "node:path";
107981
108054
  import { tmpdir as tmpdir2 } from "node:os";
107982
108055
  import { parseArgs } from "node:util";
107983
108056
  import crypto2 from "node:crypto";
@@ -108132,8 +108205,8 @@ var streamSSE = (c, cb, onError) => {
108132
108205
  };
108133
108206
 
108134
108207
  // src/services/hyperframeLint.ts
108135
- import { existsSync as existsSync15, readFileSync as readFileSync9, statSync as statSync6 } from "node:fs";
108136
- import { resolve as resolve10, join as join14 } from "node:path";
108208
+ import { existsSync as existsSync16, readFileSync as readFileSync10, statSync as statSync6 } from "node:fs";
108209
+ import { resolve as resolve10, join as join15 } from "node:path";
108137
108210
  function isStringRecord(value) {
108138
108211
  if (!value || typeof value !== "object" || Array.isArray(value)) {
108139
108212
  return false;
@@ -108161,7 +108234,7 @@ function pickEntryFile(files, preferredEntryFile) {
108161
108234
  }
108162
108235
  function readProjectEntryFile(projectDir, preferredEntryFile) {
108163
108236
  const absProjectDir = resolve10(projectDir);
108164
- if (!existsSync15(absProjectDir) || !statSync6(absProjectDir).isDirectory()) {
108237
+ if (!existsSync16(absProjectDir) || !statSync6(absProjectDir).isDirectory()) {
108165
108238
  return { error: `Project directory not found: ${absProjectDir}` };
108166
108239
  }
108167
108240
  const entryCandidates = [preferredEntryFile, "index.html", "src/index.html"].filter(
@@ -108172,16 +108245,16 @@ function readProjectEntryFile(projectDir, preferredEntryFile) {
108172
108245
  if (!absoluteEntryPath.startsWith(absProjectDir)) {
108173
108246
  return { error: `Entry file must stay inside project directory: ${entryFile}` };
108174
108247
  }
108175
- if (existsSync15(absoluteEntryPath) && statSync6(absoluteEntryPath).isFile()) {
108248
+ if (existsSync16(absoluteEntryPath) && statSync6(absoluteEntryPath).isFile()) {
108176
108249
  return {
108177
108250
  entryFile,
108178
- html: readFileSync9(absoluteEntryPath, "utf-8"),
108251
+ html: readFileSync10(absoluteEntryPath, "utf-8"),
108179
108252
  source: "projectDir"
108180
108253
  };
108181
108254
  }
108182
108255
  }
108183
108256
  return {
108184
- error: `No HTML entry file found in project directory: ${join14(absProjectDir, preferredEntryFile || "index.html")}`
108257
+ error: `No HTML entry file found in project directory: ${join15(absProjectDir, preferredEntryFile || "index.html")}`
108185
108258
  };
108186
108259
  }
108187
108260
  function prepareHyperframeLintBody(body) {
@@ -108222,12 +108295,12 @@ function runHyperframeLint(prepared) {
108222
108295
  }
108223
108296
 
108224
108297
  // src/utils/paths.ts
108225
- import { resolve as resolve11, basename as basename2, join as join15 } from "node:path";
108298
+ import { resolve as resolve11, basename as basename2, join as join16 } from "node:path";
108226
108299
  var DEFAULT_RENDERS_DIR = process.env.PRODUCER_RENDERS_DIR ?? resolve11(new URL(import.meta.url).pathname, "../../..", "renders");
108227
108300
  function resolveRenderPaths(projectDir, outputPath, rendersDir = DEFAULT_RENDERS_DIR) {
108228
108301
  const absoluteProjectDir = resolve11(projectDir);
108229
108302
  const projectName = basename2(absoluteProjectDir);
108230
- const resolvedOutputPath = outputPath ?? join15(rendersDir, `${projectName}.mp4`);
108303
+ const resolvedOutputPath = outputPath ?? join16(rendersDir, `${projectName}.mp4`);
108231
108304
  const absoluteOutputPath = resolve11(resolvedOutputPath);
108232
108305
  return { absoluteProjectDir, absoluteOutputPath };
108233
108306
  }
@@ -108283,11 +108356,11 @@ async function prepareRenderBody(body) {
108283
108356
  const projectDir = typeof body.projectDir === "string" ? body.projectDir : void 0;
108284
108357
  if (projectDir) {
108285
108358
  const absProjectDir = resolve12(projectDir);
108286
- if (!existsSync16(absProjectDir) || !statSync7(absProjectDir).isDirectory()) {
108359
+ if (!existsSync17(absProjectDir) || !statSync7(absProjectDir).isDirectory()) {
108287
108360
  return { error: `Project directory not found: ${absProjectDir}` };
108288
108361
  }
108289
108362
  const entry = options.entryFile || "index.html";
108290
- if (!existsSync16(resolve12(absProjectDir, entry))) {
108363
+ if (!existsSync17(resolve12(absProjectDir, entry))) {
108291
108364
  return { error: `Entry file "${entry}" not found in project directory: ${absProjectDir}` };
108292
108365
  }
108293
108366
  return { prepared: { input: { projectDir: absProjectDir, ...options } } };
@@ -108312,8 +108385,8 @@ async function prepareRenderBody(body) {
108312
108385
  }
108313
108386
  }
108314
108387
  const tempRoot = process.env.PRODUCER_TMP_PROJECT_DIR || tmpdir2();
108315
- const tempProjectDir = mkdtempSync(join16(tempRoot, "producer-project-"));
108316
- writeFileSync4(join16(tempProjectDir, "index.html"), htmlContent, "utf-8");
108388
+ const tempProjectDir = mkdtempSync(join17(tempRoot, "producer-project-"));
108389
+ writeFileSync5(join17(tempProjectDir, "index.html"), htmlContent, "utf-8");
108317
108390
  return {
108318
108391
  prepared: {
108319
108392
  input: {
@@ -108436,7 +108509,7 @@ function createRenderHandlers(options = {}) {
108436
108509
  log
108437
108510
  );
108438
108511
  const outputDir = dirname11(absoluteOutputPath);
108439
- if (!existsSync16(outputDir)) mkdirSync10(outputDir, { recursive: true });
108512
+ if (!existsSync17(outputDir)) mkdirSync11(outputDir, { recursive: true });
108440
108513
  const release = await renderSemaphore.acquire();
108441
108514
  log.info("render started", {
108442
108515
  requestId,
@@ -108463,7 +108536,7 @@ function createRenderHandlers(options = {}) {
108463
108536
  log.info(`render progress ${pct}%`, { requestId, stage: j.currentStage, message });
108464
108537
  }
108465
108538
  });
108466
- const fileSize = existsSync16(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
108539
+ const fileSize = existsSync17(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
108467
108540
  const durationMs = Date.now() - t0;
108468
108541
  const outputToken = store.register(absoluteOutputPath);
108469
108542
  const outputUrl = `${outputUrlPrefix}/${outputToken}`;
@@ -108547,7 +108620,7 @@ function createRenderHandlers(options = {}) {
108547
108620
  log
108548
108621
  );
108549
108622
  const outputDir = dirname11(absoluteOutputPath);
108550
- if (!existsSync16(outputDir)) mkdirSync10(outputDir, { recursive: true });
108623
+ if (!existsSync17(outputDir)) mkdirSync11(outputDir, { recursive: true });
108551
108624
  log.info("render-stream started", { requestId, projectDir: input2.projectDir });
108552
108625
  const job = createRenderJob({
108553
108626
  fps: input2.fps,
@@ -108592,7 +108665,7 @@ function createRenderHandlers(options = {}) {
108592
108665
  },
108593
108666
  abortController.signal
108594
108667
  );
108595
- const fileSize = existsSync16(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
108668
+ const fileSize = existsSync17(absoluteOutputPath) ? statSync7(absoluteOutputPath).size : 0;
108596
108669
  const outputToken = store.register(absoluteOutputPath);
108597
108670
  const outputUrl = `${outputUrlPrefix}/${outputToken}`;
108598
108671
  log.info("render-stream completed", { requestId, fileSize, perf: job.perfSummary ?? null });
@@ -108651,7 +108724,7 @@ function createRenderHandlers(options = {}) {
108651
108724
  if (!artifact) {
108652
108725
  return c.json({ success: false, error: "Output artifact not found or expired" }, 404);
108653
108726
  }
108654
- if (!existsSync16(artifact.path)) {
108727
+ if (!existsSync17(artifact.path)) {
108655
108728
  store.delete(token);
108656
108729
  return c.json({ success: false, error: "Output artifact file missing" }, 404);
108657
108730
  }