@wix/himalaya-cli 0.1545.0 → 0.1547.0

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/cli.mjs CHANGED
@@ -694,8 +694,8 @@ function mobileUxDocumentBody(mobile) {
694
694
  }
695
695
  return out2 + mobile.slice(last);
696
696
  }
697
- function mobileUxSection(text11, heading) {
698
- const match = new RegExp(`(?:^|\\n)##[ \\t]+${heading}\\b[^\\n]*([\\s\\S]*?)(?=\\n##[ \\t]|$)`, "i").exec(text11);
697
+ function mobileUxSection(text12, heading) {
698
+ const match = new RegExp(`(?:^|\\n)##[ \\t]+${heading}\\b[^\\n]*([\\s\\S]*?)(?=\\n##[ \\t]|$)`, "i").exec(text12);
699
699
  return match ? match[1] : null;
700
700
  }
701
701
  function sectionTables(markdown) {
@@ -724,8 +724,8 @@ function namesOneCta(cell2) {
724
724
  if (!cell2) return false;
725
725
  return !/[,;]|\s\/\s/.test(cell2);
726
726
  }
727
- function declaredStates(text11) {
728
- const contract = section(text11, "Screen contract");
727
+ function declaredStates(text12) {
728
+ const contract = section(text12, "Screen contract");
729
729
  if (!contract) return [];
730
730
  const states = [];
731
731
  for (const bullet of contract.matchAll(/^[ \t]*[-*][ \t]*[^:\n]*\bstates?[ \t]*:[ \t]*(\S.*)$/gim)) {
@@ -735,8 +735,8 @@ function declaredStates(text11) {
735
735
  }
736
736
  return [...new Set(states.map((state) => state.toLowerCase()))];
737
737
  }
738
- function primaryCtaStructureGap(text11) {
739
- const acceptance = section(text11, "Implementation acceptance");
738
+ function primaryCtaStructureGap(text12) {
739
+ const acceptance = section(text12, "Implementation acceptance");
740
740
  if (acceptance === null) return "There is no `## Implementation acceptance` section to read it from.";
741
741
  const tables = sectionTables(acceptance).filter((table) => table.data.length > 0);
742
742
  if (!tables.length) return "Its acceptance table has no rows.";
@@ -749,7 +749,7 @@ function primaryCtaStructureGap(text11) {
749
749
  const data = ctaTables.flatMap(({ table }) => table.data);
750
750
  const flat = (value2) => value2.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
751
751
  const rowText = data.map((row2) => flat(row2.join(" ")));
752
- const missing3 = declaredStates(text11).filter((state) => !rowText.some((row2) => row2.includes(flat(state))));
752
+ const missing3 = declaredStates(text12).filter((state) => !rowText.some((row2) => row2.includes(flat(state))));
753
753
  if (missing3.length) return `The acceptance table has no row for the declared state(s): ${missing3.join(", ")}.`;
754
754
  return null;
755
755
  }
@@ -764,16 +764,16 @@ function hasUnterminatedComment(mobile) {
764
764
  }
765
765
  }
766
766
  function mobileUxMarkerFindings(mobile, renderedWidths = []) {
767
- const text11 = mobileUxDocumentBody(mobile);
767
+ const text12 = mobileUxDocumentBody(mobile);
768
768
  const findings = [];
769
- if (!/^## Implementation acceptance\b/im.test(text11)) {
769
+ if (!/^## Implementation acceptance\b/im.test(text12)) {
770
770
  findings.push({ code: "missing-acceptance-matrix", message: "MOBILE-UX.md must contain the heading `## Implementation acceptance` at the start of a line. Case is not checked, but use this spelling: other tooling addresses the document by it." });
771
771
  }
772
- if (!/^## Evidence\b/im.test(text11)) {
772
+ if (!/^## Evidence\b/im.test(text12)) {
773
773
  findings.push({ code: "missing-evidence-section", message: "MOBILE-UX.md must contain the heading `## Evidence` at the start of a line. Case is not checked, but use this spelling: other tooling addresses the document by it." });
774
774
  }
775
- if (!/one primary CTA per state/i.test(text11)) {
776
- const gap = primaryCtaStructureGap(text11);
775
+ if (!/one primary CTA per state/i.test(text12)) {
776
+ const gap = primaryCtaStructureGap(text12);
777
777
  if (gap) {
778
778
  findings.push({
779
779
  code: "missing-primary-cta-rule",
@@ -781,8 +781,8 @@ function mobileUxMarkerFindings(mobile, renderedWidths = []) {
781
781
  });
782
782
  }
783
783
  }
784
- if (!hasWidthEvidence(text11, renderedWidths)) {
785
- findings.push({ code: "missing-width-evidence", message: widthEvidenceMessage(text11, renderedWidths) });
784
+ if (!hasWidthEvidence(text12, renderedWidths)) {
785
+ findings.push({ code: "missing-width-evidence", message: widthEvidenceMessage(text12, renderedWidths) });
786
786
  }
787
787
  if (findings.length && hasUnterminatedComment(mobile)) {
788
788
  return [{
@@ -792,15 +792,15 @@ function mobileUxMarkerFindings(mobile, renderedWidths = []) {
792
792
  }
793
793
  return findings;
794
794
  }
795
- function widthMentions(text11) {
795
+ function widthMentions(text12) {
796
796
  const mentions = [];
797
- for (const match of text11.matchAll(/\d+/g)) {
797
+ for (const match of text12.matchAll(/\d+/g)) {
798
798
  const value2 = Number(match[0]);
799
799
  const start = match.index ?? 0;
800
800
  if (!inRange(value2)) continue;
801
801
  const end = start + match[0].length;
802
- const after = text11.slice(end, end + EDGE_WINDOW);
803
- const before = text11.slice(Math.max(0, start - EDGE_WINDOW), start);
802
+ const after = text12.slice(end, end + EDGE_WINDOW);
803
+ const before = text12.slice(Math.max(0, start - EDGE_WINDOW), start);
804
804
  if (looksLikeYear(value2) && !(UNIT_ATTACHED.test(after) || UNIT_WORD_ATTACHED.test(after))) continue;
805
805
  const spelledAsWidth = UNIT_ATTACHED.test(after) || UNIT_WORD_ATTACHED.test(after) || FILENAME_AFTER.test(after);
806
806
  const vetoed = spelledAsWidth && (ANTI_CUE_BEFORE.test(before) || PAIR_HEIGHT_BEFORE.test(before) || ANTI_CUE_AFTER.test(after));
@@ -2741,15 +2741,15 @@ var init_dist_jobs = __esm({
2741
2741
  scope: scope2
2742
2742
  })
2743
2743
  });
2744
- const text11 = await res.text();
2744
+ const text12 = await res.text();
2745
2745
  if (!res.ok) {
2746
- throw new JobServiceError(`oauth failed for scope ${scope2}`, res.status, truncate(text11));
2746
+ throw new JobServiceError(`oauth failed for scope ${scope2}`, res.status, truncate(text12));
2747
2747
  }
2748
2748
  let token;
2749
2749
  try {
2750
- token = JSON.parse(text11).access_token;
2750
+ token = JSON.parse(text12).access_token;
2751
2751
  } catch {
2752
- throw new JobServiceError(`oauth returned non-JSON for scope ${scope2}`, res.status, truncate(text11));
2752
+ throw new JobServiceError(`oauth returned non-JSON for scope ${scope2}`, res.status, truncate(text12));
2753
2753
  }
2754
2754
  if (!token) throw new JobServiceError(`oauth returned no access_token for scope ${scope2}`, res.status);
2755
2755
  this.tokens.set(scope2, { token, expiresAt: this.now() + TOKEN_TTL_MS });
@@ -2763,15 +2763,15 @@ var init_dist_jobs = __esm({
2763
2763
  headers: { Authorization: token, ...body ? { "content-type": "application/json" } : {} },
2764
2764
  ...body ? { body: JSON.stringify(body) } : {}
2765
2765
  });
2766
- const text11 = await res.text();
2766
+ const text12 = await res.text();
2767
2767
  if (!res.ok) {
2768
- throw new JobServiceError(`job service ${method} ${path2} failed`, res.status, truncate(text11));
2768
+ throw new JobServiceError(`job service ${method} ${path2} failed`, res.status, truncate(text12));
2769
2769
  }
2770
- if (!text11) return {};
2770
+ if (!text12) return {};
2771
2771
  try {
2772
- return JSON.parse(text11);
2772
+ return JSON.parse(text12);
2773
2773
  } catch {
2774
- throw new JobServiceError(`job service ${method} ${path2} returned non-JSON`, res.status, truncate(text11));
2774
+ throw new JobServiceError(`job service ${method} ${path2} returned non-JSON`, res.status, truncate(text12));
2775
2775
  }
2776
2776
  }
2777
2777
  /**
@@ -3564,15 +3564,15 @@ function summarizeLint(app, bres, outcome, strict, extraIssues = []) {
3564
3564
  }
3565
3565
  };
3566
3566
  const record3 = (value2) => value2 && typeof value2 === "object" && !Array.isArray(value2) ? value2 : {};
3567
- const text11 = (value2) => typeof value2 === "string" && value2 ? value2 : void 0;
3567
+ const text12 = (value2) => typeof value2 === "string" && value2 ? value2 : void 0;
3568
3568
  const message2 = (value2) => {
3569
3569
  const item = record3(value2);
3570
- if (text11(item.message)) return text11(item.message);
3571
- if (text11(item.error)) return text11(item.error);
3570
+ if (text12(item.message)) return text12(item.message);
3571
+ if (text12(item.error)) return text12(item.error);
3572
3572
  if (Array.isArray(item.errors)) {
3573
3573
  const diagnostics = item.errors.map((entry) => {
3574
3574
  const diagnostic = record3(entry);
3575
- return text11(diagnostic.text) ?? text11(diagnostic.message);
3575
+ return text12(diagnostic.text) ?? text12(diagnostic.message);
3576
3576
  }).filter((entry) => !!entry);
3577
3577
  if (diagnostics.length) return diagnostics.join("; ");
3578
3578
  }
@@ -3585,29 +3585,29 @@ function summarizeLint(app, bres, outcome, strict, extraIssues = []) {
3585
3585
  ...issues,
3586
3586
  ...bres.compileErrors.map((value2) => ({
3587
3587
  pass: "compile",
3588
- path: text11(record3(value2).bundle),
3588
+ path: text12(record3(value2).bundle),
3589
3589
  ruleCode: "compile-error",
3590
3590
  severity: "error",
3591
3591
  message: message2(value2)
3592
3592
  })),
3593
3593
  ...outcome.failedToBuild.map((value2) => ({
3594
3594
  pass: "build",
3595
- screen: text11(record3(value2).screenId),
3595
+ screen: text12(record3(value2).screenId),
3596
3596
  ruleCode: "failed-to-build",
3597
3597
  severity: "error",
3598
3598
  message: message2(value2)
3599
3599
  })),
3600
3600
  ...outcome.missingBundles.map((value2) => ({
3601
3601
  pass: "build",
3602
- screen: text11(record3(value2).screen),
3603
- path: text11(record3(value2).bundle),
3602
+ screen: text12(record3(value2).screen),
3603
+ path: text12(record3(value2).bundle),
3604
3604
  ruleCode: "missing-bundle",
3605
3605
  severity: "error",
3606
3606
  message: message2(value2)
3607
3607
  })),
3608
3608
  ...workerThrows.map((value2) => ({
3609
3609
  pass: "worker",
3610
- path: text11(record3(value2).bundle),
3610
+ path: text12(record3(value2).bundle),
3611
3611
  ruleCode: "worker-threw",
3612
3612
  severity: "error",
3613
3613
  message: message2(value2.threw)
@@ -4148,8 +4148,8 @@ var init_catalog_cache = __esm({
4148
4148
  let prior;
4149
4149
  if (existsSync4(channelPath)) {
4150
4150
  try {
4151
- const text11 = readFileSync5(channelPath, "utf8");
4152
- if (Buffer.byteLength(text11) <= MAX_METADATA) prior = JSON.parse(text11);
4151
+ const text12 = readFileSync5(channelPath, "utf8");
4152
+ if (Buffer.byteLength(text12) <= MAX_METADATA) prior = JSON.parse(text12);
4153
4153
  } catch {
4154
4154
  }
4155
4155
  }
@@ -5253,8 +5253,8 @@ function parseStyles(source, file2, diagnostics, origin = { line: 1, column: 1 }
5253
5253
  declarations[decl.prop] = decl.value;
5254
5254
  locations[decl.prop] = declLoc;
5255
5255
  }
5256
- for (const text11 of node.selector.split(",")) {
5257
- const s2 = text11.trim();
5256
+ for (const text12 of node.selector.split(",")) {
5257
+ const s2 = text12.trim();
5258
5258
  if (!s2 || !selector.test(s2)) {
5259
5259
  diagnostics.push({ ...loc, code: "HHP-CSS-SELECTOR", severity: "error", message: `Unsupported selector ${s2}.`, hint: "Use static tag, id, class, or compound selectors." });
5260
5260
  continue;
@@ -6033,31 +6033,31 @@ function compileV2(html, profile, options) {
6033
6033
  return component;
6034
6034
  }
6035
6035
  const textNodes = element.contents().toArray().filter((n2) => n2.type === "text");
6036
- const text11 = textNodes.map((n2) => n2.data).join(" ").replace(/\s+/g, " ").trim();
6036
+ const text12 = textNodes.map((n2) => n2.data).join(" ").replace(/\s+/g, " ").trim();
6037
6037
  if (["Text", "RichText"].includes(type)) {
6038
- const matches = [...text11.matchAll(/{{\s*([\w.$]+)\s*}}/g)];
6039
- if (/{{|}}/.test(text11.replace(/{{\s*[\w.$]+\s*}}/g, ""))) error(el2, "HHP-TEXT-EXPRESSION", "Text interpolation accepts state/item paths; compute expressions in the controller.");
6038
+ const matches = [...text12.matchAll(/{{\s*([\w.$]+)\s*}}/g)];
6039
+ if (/{{|}}/.test(text12.replace(/{{\s*[\w.$]+\s*}}/g, ""))) error(el2, "HHP-TEXT-EXPRESSION", "Text interpolation accepts state/item paths; compute expressions in the controller.");
6040
6040
  if (matches.length) {
6041
- if (matches.length === 1 && matches[0][0] === text11 && type === "Text") {
6041
+ if (matches.length === 1 && matches[0][0] === text12 && type === "Text") {
6042
6042
  props.text = path2(el2, matches[0][1], row2);
6043
6043
  } else if (controller && type === "Text") {
6044
6044
  for (const match of matches) path2(el2, match[1], row2);
6045
6045
  const key3 = `t${textProjections.length}`;
6046
- const normalized = text11.replace(/{{\s*([\w.$]+)\s*}}/g, (_match, raw) => `{{${raw.startsWith("$item.") ? raw : statePath(raw)}}}`);
6046
+ const normalized = text12.replace(/{{\s*([\w.$]+)\s*}}/g, (_match, raw) => `{{${raw.startsWith("$item.") ? raw : statePath(raw)}}}`);
6047
6047
  textProjections.push({ key: key3, text: normalized, ...row2 ? { collection: row2 } : {} });
6048
6048
  props.text = row2 ? `$item.__hhpText_${key3}` : `$service:${serviceName}.__hhpText.${key3}`;
6049
6049
  } else {
6050
6050
  if (profile.surfaces.some((surface) => surface === "ios" || surface === "android" || surface === "macos"))
6051
6051
  error(el2, "HHP-TEXT-TEMPLATE-SURFACE", "Text templates are not implemented by the enabled native renderers.", "Compute the complete string in controller state and bind it on a Text component with {{path}} or bind:content.");
6052
6052
  const params = {};
6053
- let template = text11;
6053
+ let template = text12;
6054
6054
  matches.forEach((m2, i2) => {
6055
6055
  params[`v${i2}`] = path2(el2, m2[1], row2);
6056
6056
  template = template.replace(m2[0], `{v${i2}}`);
6057
6057
  });
6058
6058
  props.template = { template, params };
6059
6059
  }
6060
- } else if (text11) props.text = text11;
6060
+ } else if (text12) props.text = text12;
6061
6061
  if (/^h[1-6]$/.test(tag) && props.style === void 0) {
6062
6062
  const candidates = tag === "h1" ? ["largeTitle", "title1", "body"] : tag === "h2" ? ["title1", "headline", "body"] : ["headline", "body"];
6063
6063
  const available = profile.tokens.typography ?? [];
@@ -6065,8 +6065,8 @@ function compileV2(html, profile, options) {
6065
6065
  if (heading) props.style = heading;
6066
6066
  else error(el2, "HHP-TOKEN", "Headings require a body, title1, headline, or largeTitle typography token.");
6067
6067
  }
6068
- } else if (type === "Button" && (text11 || attrs.title)) props.title = text11 || attrs.title;
6069
- else if (text11) error(el2, "HHP-TEXT", "Wrap container text in a paragraph or span.");
6068
+ } else if (type === "Button" && (text12 || attrs.title)) props.title = text12 || attrs.title;
6069
+ else if (text12) error(el2, "HHP-TEXT", "Wrap container text in a paragraph or span.");
6070
6070
  if (type === "Image" && attrs.src) {
6071
6071
  if (/^https:\/\//.test(attrs.src)) props.url = attrs.src;
6072
6072
  else {
@@ -8090,17 +8090,17 @@ ${BLOCK_END}`;
8090
8090
  ${block}
8091
8091
  `;
8092
8092
  }
8093
- function markersIntact(text11) {
8094
- const begins = text11.split(BLOCK_BEGIN).length - 1;
8095
- const ends = text11.split(BLOCK_END).length - 1;
8093
+ function markersIntact(text12) {
8094
+ const begins = text12.split(BLOCK_BEGIN).length - 1;
8095
+ const ends = text12.split(BLOCK_END).length - 1;
8096
8096
  if (begins === 0 && ends === 0) return true;
8097
- return begins === 1 && ends === 1 && text11.indexOf(BLOCK_BEGIN) < text11.indexOf(BLOCK_END) && BLOCK_RE.test(text11);
8097
+ return begins === 1 && ends === 1 && text12.indexOf(BLOCK_BEGIN) < text12.indexOf(BLOCK_END) && BLOCK_RE.test(text12);
8098
8098
  }
8099
- function withoutBlock(text11) {
8100
- const m2 = BLOCK_RE.exec(text11);
8101
- if (!m2) return text11;
8102
- const before = text11.slice(0, m2.index).replace(/\n+$/, "");
8103
- const after = text11.slice(m2.index + m2[0].length).replace(/^\n+/, "");
8099
+ function withoutBlock(text12) {
8100
+ const m2 = BLOCK_RE.exec(text12);
8101
+ if (!m2) return text12;
8102
+ const before = text12.slice(0, m2.index).replace(/\n+$/, "");
8103
+ const after = text12.slice(m2.index + m2[0].length).replace(/^\n+/, "");
8104
8104
  if (!before) return after;
8105
8105
  if (!after) return `${before}
8106
8106
  `;
@@ -8108,8 +8108,8 @@ function withoutBlock(text11) {
8108
8108
 
8109
8109
  ${after}`;
8110
8110
  }
8111
- function blockVersion(text11) {
8112
- return STAMP_RE.exec(text11)?.[1] ?? null;
8111
+ function blockVersion(text12) {
8112
+ return STAMP_RE.exec(text12)?.[1] ?? null;
8113
8113
  }
8114
8114
  function agentsMdBody(appName2) {
8115
8115
  const gates = APPROVAL_GATES.map((g2) => `- \`${g2.id}\` \u2014 ${g2.label}`).join("\n");
@@ -8572,13 +8572,13 @@ function assertConfinedTsconfig(entry, contentRoot2, allows) {
8572
8572
  `refused to read ${p2}: ${why}. A tsconfig may extend a file from its own package or an installed dependency \u2014 nothing else.`
8573
8573
  );
8574
8574
  };
8575
- const stripJsonc = (text11) => {
8576
- if (text11.charCodeAt(0) === 65279) text11 = text11.slice(1);
8575
+ const stripJsonc = (text12) => {
8576
+ if (text12.charCodeAt(0) === 65279) text12 = text12.slice(1);
8577
8577
  let out2 = "";
8578
8578
  let inStr = false;
8579
8579
  let esc = false;
8580
- for (let i2 = 0; i2 < text11.length; i2++) {
8581
- const c2 = text11[i2];
8580
+ for (let i2 = 0; i2 < text12.length; i2++) {
8581
+ const c2 = text12[i2];
8582
8582
  if (inStr) {
8583
8583
  out2 += c2;
8584
8584
  if (esc) esc = false;
@@ -8591,13 +8591,13 @@ function assertConfinedTsconfig(entry, contentRoot2, allows) {
8591
8591
  out2 += c2;
8592
8592
  continue;
8593
8593
  }
8594
- if (c2 === "/" && text11[i2 + 1] === "/") {
8595
- while (i2 < text11.length && text11[i2] !== "\n") i2++;
8594
+ if (c2 === "/" && text12[i2 + 1] === "/") {
8595
+ while (i2 < text12.length && text12[i2] !== "\n") i2++;
8596
8596
  continue;
8597
8597
  }
8598
- if (c2 === "/" && text11[i2 + 1] === "*") {
8598
+ if (c2 === "/" && text12[i2 + 1] === "*") {
8599
8599
  i2 += 2;
8600
- while (i2 < text11.length && !(text11[i2] === "*" && text11[i2 + 1] === "/")) i2++;
8600
+ while (i2 < text12.length && !(text12[i2] === "*" && text12[i2 + 1] === "/")) i2++;
8601
8601
  i2++;
8602
8602
  continue;
8603
8603
  }
@@ -13207,8 +13207,8 @@ function pushSpan(out2, s2) {
13207
13207
  else out2.push(s2);
13208
13208
  }
13209
13209
  function spanOf(textNode) {
13210
- const text11 = str(at(textNode, "textData", "text"));
13211
- if (text11 === "") return null;
13210
+ const text12 = str(at(textNode, "textData", "text"));
13211
+ if (text12 === "") return null;
13212
13212
  let bold = false, italic = false, underline = false;
13213
13213
  let link;
13214
13214
  const decorations = at(textNode, "textData", "decorations");
@@ -13235,7 +13235,7 @@ function spanOf(textNode) {
13235
13235
  }
13236
13236
  }
13237
13237
  }
13238
- const span = { text: text11 };
13238
+ const span = { text: text12 };
13239
13239
  if (bold) span.bold = true;
13240
13240
  if (italic) span.italic = true;
13241
13241
  if (underline) span.underline = true;
@@ -13457,8 +13457,8 @@ function blockOf(ids, n2, path2) {
13457
13457
  const { title, url } = cardFields(n2, type);
13458
13458
  return [card(ids.claim(n2, path2), type, title, url)];
13459
13459
  }
13460
- const text11 = plainText(n2);
13461
- return text11.trim() !== "" ? [{ kind: "paragraph", id: ids.claim(n2, path2), spans: [{ text: text11 }] }] : [];
13460
+ const text12 = plainText(n2);
13461
+ return text12.trim() !== "" ? [{ kind: "paragraph", id: ids.claim(n2, path2), spans: [{ text: text12 }] }] : [];
13462
13462
  }
13463
13463
  }
13464
13464
  }
@@ -14991,26 +14991,26 @@ function serviceOnlyBindingValues(props, key3) {
14991
14991
  });
14992
14992
  return out2;
14993
14993
  }
14994
- function matchBraceSafe(text11, open) {
14994
+ function matchBraceSafe(text12, open) {
14995
14995
  let depth = 0;
14996
- for (let i2 = open; i2 < text11.length; i2++) {
14997
- const c2 = text11[i2];
14996
+ for (let i2 = open; i2 < text12.length; i2++) {
14997
+ const c2 = text12[i2];
14998
14998
  if (c2 === '"' || c2 === "'" || c2 === "`") {
14999
14999
  const q2 = c2;
15000
15000
  i2++;
15001
- while (i2 < text11.length && text11[i2] !== q2) {
15002
- if (text11[i2] === "\\") i2++;
15001
+ while (i2 < text12.length && text12[i2] !== q2) {
15002
+ if (text12[i2] === "\\") i2++;
15003
15003
  i2++;
15004
15004
  }
15005
15005
  continue;
15006
15006
  }
15007
- if (c2 === "/" && text11[i2 + 1] === "/") {
15008
- while (i2 < text11.length && text11[i2] !== "\n") i2++;
15007
+ if (c2 === "/" && text12[i2 + 1] === "/") {
15008
+ while (i2 < text12.length && text12[i2] !== "\n") i2++;
15009
15009
  continue;
15010
15010
  }
15011
- if (c2 === "/" && text11[i2 + 1] === "*") {
15011
+ if (c2 === "/" && text12[i2 + 1] === "*") {
15012
15012
  i2 += 2;
15013
- while (i2 < text11.length && !(text11[i2] === "*" && text11[i2 + 1] === "/")) i2++;
15013
+ while (i2 < text12.length && !(text12[i2] === "*" && text12[i2 + 1] === "/")) i2++;
15014
15014
  i2++;
15015
15015
  continue;
15016
15016
  }
@@ -18331,11 +18331,11 @@ function strip(line) {
18331
18331
  function scalar(v2) {
18332
18332
  return v2.trim().replace(/^["']|["']$/g, "");
18333
18333
  }
18334
- function parseRolloutYaml(text11) {
18334
+ function parseRolloutYaml(text12) {
18335
18335
  const cfg = { app: "", rings: [] };
18336
18336
  let cur = null;
18337
18337
  let inRings = false;
18338
- for (const raw of text11.split("\n")) {
18338
+ for (const raw of text12.split("\n")) {
18339
18339
  const line = strip(raw);
18340
18340
  if (!line.trim()) continue;
18341
18341
  const top = /^([a-zA-Z_]+):\s*(.*)$/.exec(line);
@@ -18366,10 +18366,10 @@ function assignRing(r3, key3, val) {
18366
18366
  else if (key3 === "percent") r3.percent = Number(v2);
18367
18367
  else if (key3 === "minBinaryVersion") r3.minBinaryVersion = v2;
18368
18368
  }
18369
- function parseRevocationsYaml(text11) {
18369
+ function parseRevocationsYaml(text12) {
18370
18370
  const out2 = { app: "", revoked: [] };
18371
18371
  let inList = false;
18372
- for (const raw of text11.split("\n")) {
18372
+ for (const raw of text12.split("\n")) {
18373
18373
  const line = strip(raw);
18374
18374
  if (!line.trim()) continue;
18375
18375
  const top = /^([a-zA-Z_]+):\s*(.*)$/.exec(line);
@@ -18748,14 +18748,14 @@ function discoverNativeActions(appDir3) {
18748
18748
  }
18749
18749
  const sources = roots2.flatMap(({ directory, extension, buildDirMaxDepth }) => nativeSourceFiles(resolve16(appDir3, directory), extension, buildDirMaxDepth));
18750
18750
  const registered = sources.flatMap((source) => {
18751
- let text11;
18751
+ let text12;
18752
18752
  try {
18753
- text11 = readFileSync16(source, "utf8");
18753
+ text12 = readFileSync16(source, "utf8");
18754
18754
  } catch (err) {
18755
18755
  if (!vanished(err)) throw err;
18756
18756
  return [];
18757
18757
  }
18758
- return registeredActions(text11);
18758
+ return registeredActions(text12);
18759
18759
  });
18760
18760
  return {
18761
18761
  registered: new Set(registered),
@@ -22377,9 +22377,9 @@ var init_wix_cache_policy = __esm({
22377
22377
  });
22378
22378
 
22379
22379
  // ../../core/dev-server/src/l10n-catalog.ts
22380
- function parseCatalog(text11) {
22380
+ function parseCatalog(text12) {
22381
22381
  try {
22382
- const c2 = JSON.parse(text11);
22382
+ const c2 = JSON.parse(text12);
22383
22383
  return c2 && typeof c2 === "object" && c2.messages && typeof c2.messages === "object" ? c2 : void 0;
22384
22384
  } catch {
22385
22385
  return void 0;
@@ -27924,10 +27924,10 @@ async function mintAnonymousVisitor(clientId, fetchImpl = fetch) {
27924
27924
  headers: { "Content-Type": "application/json" },
27925
27925
  body: JSON.stringify({ clientId, grantType: "anonymous" })
27926
27926
  });
27927
- const text11 = await res.text();
27927
+ const text12 = await res.text();
27928
27928
  let j2 = {};
27929
27929
  try {
27930
- j2 = text11 ? JSON.parse(text11) : {};
27930
+ j2 = text12 ? JSON.parse(text12) : {};
27931
27931
  } catch {
27932
27932
  }
27933
27933
  if (res.status !== 200 || !j2.access_token) throw new Error(`visitor mint failed (${res.status})`);
@@ -27942,10 +27942,10 @@ async function mintOneAppVisitor(msid, fetchImpl = fetch, timeoutMs = ONE_APP_VI
27942
27942
  redirect: "error",
27943
27943
  signal: AbortSignal.timeout(timeoutMs)
27944
27944
  });
27945
- const text11 = await res.text();
27945
+ const text12 = await res.text();
27946
27946
  let j2 = {};
27947
27947
  try {
27948
- j2 = text11 ? JSON.parse(text11) : {};
27948
+ j2 = text12 ? JSON.parse(text12) : {};
27949
27949
  } catch {
27950
27950
  }
27951
27951
  const expiresAt = typeof j2.validUntil === "string" ? Date.parse(j2.validUntil) : NaN;
@@ -28307,10 +28307,10 @@ ${session}`);
28307
28307
  }),
28308
28308
  timedOut
28309
28309
  ]);
28310
- const text11 = await Promise.race([res.text(), timedOut]);
28310
+ const text12 = await Promise.race([res.text(), timedOut]);
28311
28311
  let j2 = {};
28312
28312
  try {
28313
- j2 = text11 ? JSON.parse(text11) : {};
28313
+ j2 = text12 ? JSON.parse(text12) : {};
28314
28314
  } catch {
28315
28315
  }
28316
28316
  if (res.status < 200 || res.status >= 300 || !j2.signedInstance)
@@ -28496,7 +28496,7 @@ ${session}`);
28496
28496
  });
28497
28497
  const xsrf = /(?:^|;\s*)XSRF-TOKEN=([^;]+)/.exec(sessionCookie)?.[1];
28498
28498
  let status;
28499
- let text11;
28499
+ let text12;
28500
28500
  try {
28501
28501
  const res = await Promise.race([
28502
28502
  this.fetchImpl(`${ONE_APP_SESSION}/${msid}/signed-instance?signed_instance_type=Member`, {
@@ -28508,7 +28508,7 @@ ${session}`);
28508
28508
  timedOut
28509
28509
  ]);
28510
28510
  status = res.status;
28511
- text11 = await Promise.race([res.text(), timedOut]);
28511
+ text12 = await Promise.race([res.text(), timedOut]);
28512
28512
  } catch (e2) {
28513
28513
  return refuse7(new SiteInstanceUnavailable(msid, `mint failed: ${e2?.message ?? e2}`), MEMBER_TRANSIENT_TTL_MS);
28514
28514
  } finally {
@@ -28518,7 +28518,7 @@ ${session}`);
28518
28518
  if (status === 401) return refuse7(new AccountSessionExpired(msid, `mint refused (${status})`), MEMBER_TRANSIENT_TTL_MS);
28519
28519
  let instance;
28520
28520
  try {
28521
- instance = JSON.parse(text11).signedInstance;
28521
+ instance = JSON.parse(text12).signedInstance;
28522
28522
  } catch {
28523
28523
  }
28524
28524
  if (status < 200 || status >= 300 || typeof instance !== "string" || !instance) {
@@ -28597,8 +28597,8 @@ async function postJson(path2, body, auth) {
28597
28597
  headers: { "Content-Type": "application/json", ...auth ? { Authorization: auth } : {} },
28598
28598
  body: JSON.stringify(body)
28599
28599
  });
28600
- const text11 = await res.text();
28601
- return { status: res.status, json: text11 ? JSON.parse(text11) : {} };
28600
+ const text12 = await res.text();
28601
+ return { status: res.status, json: text12 ? JSON.parse(text12) : {} };
28602
28602
  }
28603
28603
  async function mintVisitor(clientId) {
28604
28604
  const r3 = await postJson("/oauth2/token", { clientId, grantType: "anonymous" });
@@ -28871,13 +28871,13 @@ function recordWixTraffic(gw, app, adminUrl, ev) {
28871
28871
  full.respBody = truncate2(redactBodyString(full.respBody));
28872
28872
  gw.traffic.push(full);
28873
28873
  if (gw.traffic.length > TRAFFIC_CAP) gw.traffic.splice(0, gw.traffic.length - TRAFFIC_CAP);
28874
- const text11 = `event: wix.traffic
28874
+ const text12 = `event: wix.traffic
28875
28875
  data: ${JSON.stringify(full)}
28876
28876
 
28877
28877
  `;
28878
28878
  for (const res of [...gw.clients]) {
28879
28879
  try {
28880
- res.write(text11);
28880
+ res.write(text12);
28881
28881
  } catch {
28882
28882
  gw.clients.delete(res);
28883
28883
  }
@@ -29380,13 +29380,13 @@ async function resolveWixAccounts(cookieHeader, fetchImpl = fetch, authorization
29380
29380
  if (res.status === 428 || res.status === 401 || res.status === 403) {
29381
29381
  return { ok: false, reason: "no_session" };
29382
29382
  }
29383
- const text11 = await res.text();
29383
+ const text12 = await res.text();
29384
29384
  if (!res.ok) {
29385
- return { ok: false, reason: "upstream_failed", status: res.status, detail: text11.slice(0, 200) };
29385
+ return { ok: false, reason: "upstream_failed", status: res.status, detail: text12.slice(0, 200) };
29386
29386
  }
29387
29387
  let parsed;
29388
29388
  try {
29389
- parsed = JSON.parse(text11);
29389
+ parsed = JSON.parse(text12);
29390
29390
  } catch {
29391
29391
  return { ok: false, reason: "upstream_failed", status: res.status, detail: "unparseable_body" };
29392
29392
  }
@@ -29427,13 +29427,13 @@ async function resolveAccountCredential(auth, fetchImpl) {
29427
29427
  if (res.status === 428 || res.status === 401 || res.status === 403 || res.status === 404) {
29428
29428
  return { ok: false, reason: "no_session" };
29429
29429
  }
29430
- const text11 = await res.text();
29430
+ const text12 = await res.text();
29431
29431
  if (!res.ok) {
29432
- return { ok: false, reason: "upstream_failed", status: res.status, detail: text11.slice(0, 200) };
29432
+ return { ok: false, reason: "upstream_failed", status: res.status, detail: text12.slice(0, 200) };
29433
29433
  }
29434
29434
  let parsed;
29435
29435
  try {
29436
- parsed = JSON.parse(text11);
29436
+ parsed = JSON.parse(text12);
29437
29437
  } catch {
29438
29438
  return { ok: false, reason: "upstream_failed", status: res.status, detail: "unparseable_body" };
29439
29439
  }
@@ -30085,9 +30085,9 @@ async function getAndroidPixelDims(serial) {
30085
30085
  try {
30086
30086
  const args = serial ? ["-s", serial, "shell", "wm", "size"] : ["shell", "wm", "size"];
30087
30087
  const out2 = await runner.capture(ADB_BIN, args);
30088
- const text11 = out2.toString("utf8");
30089
- const override = /Override size:\s*(\d+)x(\d+)/.exec(text11);
30090
- const physical = /Physical size:\s*(\d+)x(\d+)/.exec(text11);
30088
+ const text12 = out2.toString("utf8");
30089
+ const override = /Override size:\s*(\d+)x(\d+)/.exec(text12);
30090
+ const physical = /Physical size:\s*(\d+)x(\d+)/.exec(text12);
30091
30091
  const m2 = override ?? physical;
30092
30092
  if (!m2) throw new Error("could not parse wm size");
30093
30093
  const dims = { width: parseInt(m2[1], 10), height: parseInt(m2[2], 10) };
@@ -32051,9 +32051,9 @@ function mdScan(src, linkStyle = "") {
32051
32051
  }
32052
32052
  return out2 + mdEsc(src.slice(last));
32053
32053
  }
32054
- function mdInline(text11, linkColor) {
32054
+ function mdInline(text12, linkColor) {
32055
32055
  const safe = typeof linkColor === "string" && /^[#a-zA-Z0-9(),.%\s-]+$/.test(linkColor) ? linkColor : "";
32056
- return { __html: mdScan(text11, safe ? ` style="color:${safe}"` : "") };
32056
+ return { __html: mdScan(text12, safe ? ` style="color:${safe}"` : "") };
32057
32057
  }
32058
32058
  function sevColor(ctx, sev) {
32059
32059
  switch (sev) {
@@ -32895,7 +32895,7 @@ function PickerLeadingVisual({ option, ctx, size = 20 }) {
32895
32895
  return null;
32896
32896
  }
32897
32897
  }
32898
- function PickerFieldBox({ look, ctx, option, text: text11, isPlaceholder, font, style }) {
32898
+ function PickerFieldBox({ look, ctx, option, text: text12, isPlaceholder, font, style }) {
32899
32899
  const C2 = ctx.color;
32900
32900
  return /* @__PURE__ */ jsxs2(
32901
32901
  "div",
@@ -32919,7 +32919,7 @@ function PickerFieldBox({ look, ctx, option, text: text11, isPlaceholder, font,
32919
32919
  },
32920
32920
  children: [
32921
32921
  !isPlaceholder && /* @__PURE__ */ jsx5(PickerLeadingVisual, { option, ctx }),
32922
- /* @__PURE__ */ jsx5("span", { style: { flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", color: isPlaceholder ? C2(look.placeholderColor, "#888") : C2("textPrimary", "#111") }, children: text11 }),
32922
+ /* @__PURE__ */ jsx5("span", { style: { flex: 1, minWidth: 0, overflow: "hidden", textOverflow: "ellipsis", whiteSpace: "nowrap", color: isPlaceholder ? C2(look.placeholderColor, "#888") : C2("textPrimary", "#111") }, children: text12 }),
32923
32923
  look.chevronIcon && /* @__PURE__ */ jsx5("span", { "data-picker-chevron": "", style: { flex: "none", display: "inline-grid", placeItems: "center" }, children: iconSvg(look.chevronIcon, { size: 16, color: C2("textSecondary", "#636b78") }) })
32924
32924
  ]
32925
32925
  }
@@ -33364,9 +33364,9 @@ function createRicosHostSession(o2) {
33364
33364
  if (!state.ready || state.unavailable) return;
33365
33365
  o2.send({ v: 1, type: "command", name, ...arg?.level ? { level: arg.level } : {}, ...arg?.value ? { value: arg.value } : {} });
33366
33366
  },
33367
- insertLink(url, text11) {
33367
+ insertLink(url, text12) {
33368
33368
  if (!state.ready || state.unavailable || !isSafeEditorLink(url)) return false;
33369
- o2.send({ v: 1, type: "insertLink", url: url.trim(), ...text11 ? { text: text11 } : {} });
33369
+ o2.send({ v: 1, type: "insertLink", url: url.trim(), ...text12 ? { text: text12 } : {} });
33370
33370
  return true;
33371
33371
  },
33372
33372
  removeLink() {
@@ -35848,8 +35848,8 @@ var init_esm = __esm({
35848
35848
 
35849
35849
  // ../../core/ts/src/rich-text-field.ts
35850
35850
  function richTextHtmlToPlainText(html) {
35851
- const text11 = decodeHTML(html.replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi, "").replace(/<li\b[^>]*>/gi, "\u2022 ").replace(/<br\s*\/?>|<\/(?:p|div|li|h[1-6]|blockquote|pre|tr)\s*>/gi, "\n").replace(/<[^>]*>/g, ""));
35852
- return text11.replace(/\r\n?/g, "\n").replace(/\n{3,}/g, "\n\n").trim();
35851
+ const text12 = decodeHTML(html.replace(/<(script|style)\b[^>]*>[\s\S]*?<\/\1\s*>/gi, "").replace(/<li\b[^>]*>/gi, "\u2022 ").replace(/<br\s*\/?>|<\/(?:p|div|li|h[1-6]|blockquote|pre|tr)\s*>/gi, "\n").replace(/<[^>]*>/g, ""));
35852
+ return text12.replace(/\r\n?/g, "\n").replace(/\n{3,}/g, "\n\n").trim();
35853
35853
  }
35854
35854
  function richTextPlainTextToHtml(value2) {
35855
35855
  if (value2 === "") return "";
@@ -35872,9 +35872,9 @@ function richTextEditedHtml(originalHtml, originalText, nextText) {
35872
35872
  if (/<(script|style)\b/i.test(source)) return richTextPlainTextToHtml(nextText);
35873
35873
  const spans = [];
35874
35874
  let visible = "";
35875
- const append = (text11, start, end, structural = false) => {
35876
- visible += text11;
35877
- for (let i2 = 0; i2 < text11.length; i2++) spans.push({ start, end, structural });
35875
+ const append = (text12, start, end, structural = false) => {
35876
+ visible += text12;
35877
+ for (let i2 = 0; i2 < text12.length; i2++) spans.push({ start, end, structural });
35878
35878
  };
35879
35879
  const token = /<[^>]*>|&(?:#\d+|#x[\da-f]+|[a-z][\da-z]+);?|[^<&]+/gi;
35880
35880
  for (const match of source.matchAll(token)) {
@@ -35928,7 +35928,7 @@ function richTextEditedHtml(originalHtml, originalText, nextText) {
35928
35928
  let edited = source;
35929
35929
  for (const span of removed.slice().reverse()) edited = edited.slice(0, span.start) + edited.slice(span.end);
35930
35930
  const insertionAfterDelete = insertionAt - removed.filter((span) => span.end <= insertionAt).reduce((n2, span) => n2 + span.end - span.start, 0);
35931
- const escape3 = (text11) => text11.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\"/g, "&quot;").replace(/'/g, "&#39;").replace(/\n/g, "<br>");
35931
+ const escape3 = (text12) => text12.replace(/&/g, "&amp;").replace(/</g, "&lt;").replace(/>/g, "&gt;").replace(/\"/g, "&quot;").replace(/'/g, "&#39;").replace(/\n/g, "<br>");
35932
35932
  const replacement = escape3(nextText.slice(prefix, newEnd));
35933
35933
  return edited.slice(0, insertionAfterDelete) + replacement + edited.slice(insertionAfterDelete);
35934
35934
  }
@@ -36033,13 +36033,13 @@ function NamedImage({ node, alt, env }) {
36033
36033
  }
36034
36034
  function Block({ b: b2, env, depth }) {
36035
36035
  const { ctx } = env;
36036
- const text11 = ctx.color("textPrimary", "#13171e");
36036
+ const text12 = ctx.color("textPrimary", "#13171e");
36037
36037
  const secondary = ctx.color("textSecondary", "#5c6370");
36038
36038
  const border = ctx.color("border", "#e5e5e5");
36039
36039
  switch (b2.kind) {
36040
36040
  case "paragraph":
36041
36041
  return /* @__PURE__ */ jsx9("p", { ...tid(env, b2.id, b2.kind), style: {
36042
- ...textStyle(ctx, "body", text11),
36042
+ ...textStyle(ctx, "body", text12),
36043
36043
  textAlign: b2.align,
36044
36044
  paddingInlineStart: b2.indent ? Math.min(b2.indent, 8) * 16 : void 0,
36045
36045
  minHeight: b2.spans.length ? void 0 : "1.5em"
@@ -36047,7 +36047,7 @@ function Block({ b: b2, env, depth }) {
36047
36047
  case "heading":
36048
36048
  return React10.createElement(
36049
36049
  `h${b2.level}`,
36050
- { ...tid(env, b2.id, b2.kind), style: textStyle(ctx, RICH_CONTENT_HEADING_TOKENS[b2.level - 1], text11) },
36050
+ { ...tid(env, b2.id, b2.kind), style: textStyle(ctx, RICH_CONTENT_HEADING_TOKENS[b2.level - 1], text12) },
36051
36051
  /* @__PURE__ */ jsx9(Spans, { spans: b2.spans, env })
36052
36052
  );
36053
36053
  case "list": {
@@ -36057,7 +36057,7 @@ function Block({ b: b2, env, depth }) {
36057
36057
  {
36058
36058
  ...tid(env, b2.id, b2.kind),
36059
36059
  start: b2.ordered ? b2.start : void 0,
36060
- style: { ...textStyle(ctx, "body", text11), paddingInlineStart: 24, listStyleType: b2.ordered ? "decimal" : depth % 2 ? "circle" : "disc" },
36060
+ style: { ...textStyle(ctx, "body", text12), paddingInlineStart: 24, listStyleType: b2.ordered ? "decimal" : depth % 2 ? "circle" : "disc" },
36061
36061
  children: b2.items.map((item, i2) => /* @__PURE__ */ jsx9("li", { "data-component-id": `${env.componentId}/${item.id}`, id: `${env.componentId}/${item.id}`, style: { marginBottom: 6 }, children: /* @__PURE__ */ jsx9("div", { style: { display: "flex", flexDirection: "column", gap: 6 }, children: item.blocks.map((child, j2) => /* @__PURE__ */ jsx9(Block, { b: child, env, depth: depth + 1 }, `${j2}:${child.id}`)) }) }, `${i2}:${item.id}`))
36062
36062
  }
36063
36063
  );
@@ -36071,7 +36071,7 @@ function Block({ b: b2, env, depth }) {
36071
36071
  overflowWrap: "anywhere",
36072
36072
  fontFamily: "ui-monospace, SFMono-Regular, Menlo, monospace",
36073
36073
  fontSize: "0.9em",
36074
- color: text11,
36074
+ color: text12,
36075
36075
  background: ctx.color("surfaceSecondary", "#f5f5f7"),
36076
36076
  padding: 10,
36077
36077
  borderRadius: 6
@@ -36090,11 +36090,11 @@ function Block({ b: b2, env, depth }) {
36090
36090
  case "button":
36091
36091
  return /* @__PURE__ */ jsx9(LinkButton, { label: b2.label, url: b2.url, env, testId: `${env.componentId}/${b2.id}` });
36092
36092
  case "table":
36093
- return /* @__PURE__ */ jsx9("table", { ...tid(env, b2.id, b2.kind), style: { width: "100%", borderCollapse: "collapse", ...textStyle(ctx, "body", text11) }, children: /* @__PURE__ */ jsx9("tbody", { children: b2.rows.map((row2, r3) => /* @__PURE__ */ jsx9("tr", { children: row2.map((cell2, c2) => /* @__PURE__ */ jsx9("td", { style: { border: `1px solid ${border}`, padding: 6, whiteSpace: "pre-wrap", verticalAlign: "top" }, children: cell2 }, c2)) }, r3)) }) });
36093
+ return /* @__PURE__ */ jsx9("table", { ...tid(env, b2.id, b2.kind), style: { width: "100%", borderCollapse: "collapse", ...textStyle(ctx, "body", text12) }, children: /* @__PURE__ */ jsx9("tbody", { children: b2.rows.map((row2, r3) => /* @__PURE__ */ jsx9("tr", { children: row2.map((cell2, c2) => /* @__PURE__ */ jsx9("td", { style: { border: `1px solid ${border}`, padding: 6, whiteSpace: "pre-wrap", verticalAlign: "top" }, children: cell2 }, c2)) }, r3)) }) });
36094
36094
  case "card": {
36095
36095
  const title = richContentCardTitle(b2);
36096
36096
  return /* @__PURE__ */ jsxs6("div", { ...tid(env, b2.id, b2.kind), role: "group", "aria-label": title, style: { border: `1px solid ${border}`, borderRadius: 8, padding: 12, display: "flex", flexDirection: "column", gap: 6 }, children: [
36097
- /* @__PURE__ */ jsx9("div", { style: textStyle(ctx, "bodyEmphasis", text11), children: title }),
36097
+ /* @__PURE__ */ jsx9("div", { style: textStyle(ctx, "bodyEmphasis", text12), children: title }),
36098
36098
  b2.url ? /* @__PURE__ */ jsxs6(Fragment3, { children: [
36099
36099
  /* @__PURE__ */ jsx9("div", { style: textStyle(ctx, "caption", secondary), children: richContentHost(b2.url) }),
36100
36100
  /* @__PURE__ */ jsx9(LinkButton, { label: RICH_CONTENT_OPEN_LABEL, url: b2.url, env, testId: `${env.componentId}/${b2.id}/open` })
@@ -36123,10 +36123,10 @@ var init_richContent = __esm({
36123
36123
 
36124
36124
  // ../../core/web-renderer/src/pdfPageCount.ts
36125
36125
  function pdfPageCount(bytes2) {
36126
- const text11 = pdfObjectSyntax(new TextDecoder("latin1").decode(bytes2));
36127
- const rooted = pdfRootPageCount(text11);
36126
+ const text12 = pdfObjectSyntax(new TextDecoder("latin1").decode(bytes2));
36127
+ const rooted = pdfRootPageCount(text12);
36128
36128
  let scanned = null;
36129
- for (const m2 of text11.matchAll(/<<((?:(?!<<|>>)[\s\S])*)>>/g)) {
36129
+ for (const m2 of text12.matchAll(/<<((?:(?!<<|>>)[\s\S])*)>>/g)) {
36130
36130
  const dict = m2[1];
36131
36131
  if (!/\/Type\s*\/Pages(?![A-Za-z])/.test(dict)) continue;
36132
36132
  const c2 = /\/Count\s+(\d+)/.exec(dict);
@@ -36138,24 +36138,24 @@ function pdfPageCount(bytes2) {
36138
36138
  if (rooted !== null && scanned !== null && rooted !== scanned) return null;
36139
36139
  return count2 <= PDF_MAX_PLAUSIBLE_PAGES ? count2 : null;
36140
36140
  }
36141
- function pdfObjectSyntax(text11) {
36142
- const out2 = text11.split("");
36141
+ function pdfObjectSyntax(text12) {
36142
+ const out2 = text12.split("");
36143
36143
  const blank = (from, to2) => {
36144
36144
  for (let k2 = from; k2 < to2; k2++) out2[k2] = " ";
36145
36145
  };
36146
36146
  let i2 = 0;
36147
- while (i2 < text11.length) {
36148
- const c2 = text11[i2];
36147
+ while (i2 < text12.length) {
36148
+ const c2 = text12[i2];
36149
36149
  if (c2 === "%") {
36150
- const eol = text11.slice(i2).search(/[\r\n]/);
36151
- const end = eol < 0 ? text11.length : i2 + eol;
36150
+ const eol = text12.slice(i2).search(/[\r\n]/);
36151
+ const end = eol < 0 ? text12.length : i2 + eol;
36152
36152
  blank(i2, end);
36153
36153
  i2 = end;
36154
36154
  } else if (c2 === "(") {
36155
36155
  let depth = 0;
36156
36156
  let j2 = i2;
36157
- for (; j2 < text11.length; j2++) {
36158
- const d2 = text11[j2];
36157
+ for (; j2 < text12.length; j2++) {
36158
+ const d2 = text12[j2];
36159
36159
  if (d2 === "\\") {
36160
36160
  j2++;
36161
36161
  continue;
@@ -36165,21 +36165,21 @@ function pdfObjectSyntax(text11) {
36165
36165
  }
36166
36166
  blank(i2, j2 + 1);
36167
36167
  i2 = j2 + 1;
36168
- } else if (c2 === "<" && text11[i2 + 1] !== "<") {
36169
- const end = text11.indexOf(">", i2);
36170
- const stop = end < 0 ? text11.length : end + 1;
36168
+ } else if (c2 === "<" && text12[i2 + 1] !== "<") {
36169
+ const end = text12.indexOf(">", i2);
36170
+ const stop = end < 0 ? text12.length : end + 1;
36171
36171
  blank(i2, stop);
36172
36172
  i2 = stop;
36173
- } else if (c2 === "<" && text11[i2 + 1] === "<") {
36173
+ } else if (c2 === "<" && text12[i2 + 1] === "<") {
36174
36174
  i2 += 2;
36175
36175
  } else if (
36176
36176
  // The `stream` KEYWORD, not the tail of a name (`/my-stream`) or of `endstream`: preceded by
36177
36177
  // whitespace or the `>>` that closes its dictionary, and followed by CRLF or LF (PDF 32000
36178
36178
  // §7.3.8.1 — a CR alone is not allowed there).
36179
- text11.startsWith("stream", i2) && /[\s>]/.test(text11[i2 - 1] ?? "") && (text11[i2 + 6] === "\n" || text11.startsWith("\r\n", i2 + 6))
36179
+ text12.startsWith("stream", i2) && /[\s>]/.test(text12[i2 - 1] ?? "") && (text12[i2 + 6] === "\n" || text12.startsWith("\r\n", i2 + 6))
36180
36180
  ) {
36181
- const end = text11.indexOf("endstream", i2 + 6);
36182
- const stop = end < 0 ? text11.length : end;
36181
+ const end = text12.indexOf("endstream", i2 + 6);
36182
+ const stop = end < 0 ? text12.length : end;
36183
36183
  blank(i2 + 6, stop);
36184
36184
  i2 = stop + "endstream".length;
36185
36185
  } else {
@@ -38063,19 +38063,19 @@ function getFilenameFromContentDispositionHeader(contentDisposition) {
38063
38063
  if (!value2.startsWith("=?") || /[\x00-\x19\x80-\xff]/.test(value2)) {
38064
38064
  return value2;
38065
38065
  }
38066
- return value2.replaceAll(/=\?([\w-]*)\?([QB])\?((?:[^?]|\?(?!=))*)\?=/gi, function(matches, charset, encoding, text11) {
38066
+ return value2.replaceAll(/=\?([\w-]*)\?([QB])\?((?:[^?]|\?(?!=))*)\?=/gi, function(matches, charset, encoding, text12) {
38067
38067
  if (encoding === "q" || encoding === "Q") {
38068
- text11 = text11.replaceAll("_", " ");
38069
- text11 = text11.replaceAll(/=([0-9a-f]{2})/gi, function(match, hex2) {
38068
+ text12 = text12.replaceAll("_", " ");
38069
+ text12 = text12.replaceAll(/=([0-9a-f]{2})/gi, function(match, hex2) {
38070
38070
  return String.fromCharCode(parseInt(hex2, 16));
38071
38071
  });
38072
- return textdecode(charset, text11);
38072
+ return textdecode(charset, text12);
38073
38073
  }
38074
38074
  try {
38075
- text11 = atob(text11);
38075
+ text12 = atob(text12);
38076
38076
  } catch {
38077
38077
  }
38078
- return textdecode(charset, text11);
38078
+ return textdecode(charset, text12);
38079
38079
  });
38080
38080
  }
38081
38081
  return "";
@@ -41867,8 +41867,8 @@ var init_pdf = __esm({
41867
41867
  return 1 / nativeParse("-0 ") !== -Infinity;
41868
41868
  });
41869
41869
  $2({ target: "JSON", stat: true, forced: NO_SOURCE_SUPPORT }, {
41870
- parse: function parse4(text11, reviver) {
41871
- return PROPER_BASE_PARSE && !isCallable(reviver) ? nativeParse(text11) : $parse(text11, reviver);
41870
+ parse: function parse4(text12, reviver) {
41871
+ return PROPER_BASE_PARSE && !isCallable(reviver) ? nativeParse(text12) : $parse(text12, reviver);
41872
41872
  }
41873
41873
  });
41874
41874
  },
@@ -42006,7 +42006,7 @@ var init_pdf = __esm({
42006
42006
  return ordered;
42007
42007
  };
42008
42008
  if ($stringify) $2({ target: "JSON", stat: true, arity: 3, forced: WRONG_SYMBOLS_CONVERSION || ILL_FORMED_UNICODE || !NATIVE_RAW_JSON }, {
42009
- stringify: function stringify(text11, replacer, space) {
42009
+ stringify: function stringify(text12, replacer, space) {
42010
42010
  var replacerFunction = isCallable(replacer) ? replacer : void 0;
42011
42011
  var propertyList = replacerFunction ? void 0 : getPropertyList(replacer);
42012
42012
  var keyPrefix = propertyList && getKeyPrefix(propertyList);
@@ -42016,7 +42016,7 @@ var init_pdf = __esm({
42016
42016
  var currentOrdered;
42017
42017
  var marked = false;
42018
42018
  var root = true;
42019
- var json8 = stringifyWithProperSymbolsConversion(text11, function(key3, value2) {
42019
+ var json8 = stringifyWithProperSymbolsConversion(text12, function(key3, value2) {
42020
42020
  key3 = $String(key3);
42021
42021
  if (propertyList) {
42022
42022
  if (key3 === END_MARK) {
@@ -45088,7 +45088,7 @@ var init_pdf = __esm({
45088
45088
  focusNode,
45089
45089
  focusOffset
45090
45090
  } = selection;
45091
- const text11 = selection.toString();
45091
+ const text12 = selection.toString();
45092
45092
  const anchorElement = this.#getAnchorElementForSelection(selection);
45093
45093
  const textLayer = anchorElement.closest(".textLayer");
45094
45094
  const boxes = this.getSelectionBoxes(textLayer);
@@ -45109,7 +45109,7 @@ var init_pdf = __esm({
45109
45109
  anchorOffset,
45110
45110
  focusNode,
45111
45111
  focusOffset,
45112
- text: text11
45112
+ text: text12
45113
45113
  });
45114
45114
  if (isNoneMode) {
45115
45115
  this.showAllEditors("highlight", true, true);
@@ -46815,32 +46815,32 @@ var init_pdf = __esm({
46815
46815
  deleted: this.isDeleted()
46816
46816
  };
46817
46817
  }
46818
- set data(text11) {
46819
- if (text11 !== this.#text) {
46818
+ set data(text12) {
46819
+ if (text12 !== this.#text) {
46820
46820
  this.#richText = null;
46821
46821
  }
46822
- if (text11 === null) {
46822
+ if (text12 === null) {
46823
46823
  this.#text = "";
46824
46824
  this.#deleted = true;
46825
46825
  return;
46826
46826
  }
46827
- this.#text = text11;
46827
+ this.#text = text12;
46828
46828
  this.#date = /* @__PURE__ */ new Date();
46829
46829
  this.#deleted = false;
46830
46830
  }
46831
46831
  restoreData({
46832
- text: text11,
46832
+ text: text12,
46833
46833
  richText,
46834
46834
  date
46835
46835
  }) {
46836
- this.#text = text11;
46836
+ this.#text = text12;
46837
46837
  this.#richText = richText;
46838
46838
  this.#date = date;
46839
46839
  this.#deleted = false;
46840
46840
  }
46841
- setInitialText(text11, richText = null) {
46842
- this.#initialText = text11;
46843
- this.data = text11;
46841
+ setInitialText(text12, richText = null) {
46842
+ this.#initialText = text12;
46843
+ this.data = text12;
46844
46844
  this.#date = null;
46845
46845
  this.#richText = richText;
46846
46846
  }
@@ -47891,8 +47891,8 @@ var init_pdf = __esm({
47891
47891
  get guessedAltText() {
47892
47892
  return this.#altText?.guessedText;
47893
47893
  }
47894
- async setGuessedAltText(text11) {
47895
- await this.#altText?.setGuessedText(text11);
47894
+ async setGuessedAltText(text12) {
47895
+ await this.#altText?.setGuessedText(text12);
47896
47896
  }
47897
47897
  serializeAltText(isForCopying) {
47898
47898
  return this.#altText?.serialize(isForCopying);
@@ -47939,13 +47939,13 @@ var init_pdf = __esm({
47939
47939
  const {
47940
47940
  data: {
47941
47941
  richText,
47942
- text: text11,
47942
+ text: text12,
47943
47943
  date,
47944
47944
  deleted
47945
47945
  }
47946
47946
  } = this.#comment;
47947
47947
  return {
47948
- text: text11,
47948
+ text: text12,
47949
47949
  richText,
47950
47950
  date,
47951
47951
  deleted,
@@ -58739,13 +58739,13 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
58739
58739
  } = this;
58740
58740
  return this.annotationStorage.getRawValue(`${AnnotationEditorPrefix}${data.id}`)?.popup?.contents || data.contentsObj?.str || "";
58741
58741
  }
58742
- set commentText(text11) {
58742
+ set commentText(text12) {
58743
58743
  const {
58744
58744
  data
58745
58745
  } = this;
58746
58746
  const popup = {
58747
- deleted: !text11,
58748
- contents: text11 || ""
58747
+ deleted: !text12,
58748
+ contents: text12 || ""
58749
58749
  };
58750
58750
  if (!this.annotationStorage.updateEditor(data.id, {
58751
58751
  popup
@@ -58759,7 +58759,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
58759
58759
  modificationDate: /* @__PURE__ */ new Date()
58760
58760
  });
58761
58761
  }
58762
- if (!text11) {
58762
+ if (!text12) {
58763
58763
  this.removePopup();
58764
58764
  }
58765
58765
  }
@@ -59311,9 +59311,9 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
59311
59311
  get commentText() {
59312
59312
  return this.editor.comment.text;
59313
59313
  }
59314
- set commentText(text11) {
59315
- this.editor.comment = text11;
59316
- if (!text11) {
59314
+ set commentText(text12) {
59315
+ this.editor.comment = text12;
59316
+ if (!text12) {
59317
59317
  this.removePopup();
59318
59318
  }
59319
59319
  }
@@ -60771,11 +60771,11 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
60771
60771
  this.#commentText ||= this.#firstElement.commentText;
60772
60772
  return this.#commentText;
60773
60773
  }
60774
- set comment(text11) {
60775
- if (text11 === this.comment) {
60774
+ set comment(text12) {
60775
+ if (text12 === this.comment) {
60776
60776
  return;
60777
60777
  }
60778
- this.#firstElement.commentText = this.#commentText = text11;
60778
+ this.#firstElement.commentText = this.#commentText = text12;
60779
60779
  }
60780
60780
  focus() {
60781
60781
  this.#firstElement.container?.focus();
@@ -60892,10 +60892,10 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
60892
60892
  get #fontColor() {
60893
60893
  return this.#html?.attributes?.style?.color || null;
60894
60894
  }
60895
- #makePopupContent(text11) {
60895
+ #makePopupContent(text12) {
60896
60896
  const popupLines = [];
60897
60897
  const popupContent = {
60898
- str: text11,
60898
+ str: text12,
60899
60899
  html: {
60900
60900
  name: "div",
60901
60901
  attributes: {
@@ -60913,7 +60913,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
60913
60913
  fontSize: this.#fontSize ? `calc(${this.#fontSize}px * var(--total-scale-factor))` : ""
60914
60914
  }
60915
60915
  };
60916
- for (const line of text11.split("\n")) {
60916
+ for (const line of text12.split("\n")) {
60917
60917
  popupLines.push({
60918
60918
  name: "span",
60919
60919
  value: line,
@@ -62422,9 +62422,9 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
62422
62422
  if (savedText === newText) {
62423
62423
  return;
62424
62424
  }
62425
- const setText = (text11) => {
62426
- this.#content = text11;
62427
- if (!text11) {
62425
+ const setText = (text12) => {
62426
+ this.#content = text12;
62427
+ if (!text12) {
62428
62428
  this.remove();
62429
62429
  return;
62430
62430
  }
@@ -66239,7 +66239,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
66239
66239
  const uint8Buf = this.#toUint8(grayImage);
66240
66240
  return [uint8Buf, newWidth, newHeight];
66241
66241
  }
66242
- static extractContoursFromText(text11, {
66242
+ static extractContoursFromText(text12, {
66243
66243
  fontFamily,
66244
66244
  fontStyle,
66245
66245
  fontWeight
@@ -66258,7 +66258,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
66258
66258
  fontBoundingBoxAscent,
66259
66259
  fontBoundingBoxDescent,
66260
66260
  width
66261
- } = ctx.measureText(text11);
66261
+ } = ctx.measureText(text12);
66262
66262
  const SCALE = 1.5;
66263
66263
  const canvasWidth = Math.ceil(Math.max(Math.abs(actualBoundingBoxLeft) + Math.abs(actualBoundingBoxRight) || 0, width) * SCALE);
66264
66264
  const canvasHeight = Math.ceil(Math.max(Math.abs(actualBoundingBoxAscent) + Math.abs(actualBoundingBoxDescent) || fontSize, Math.abs(fontBoundingBoxAscent) + Math.abs(fontBoundingBoxDescent) || fontSize) * SCALE);
@@ -66272,7 +66272,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
66272
66272
  ctx.fillStyle = "white";
66273
66273
  ctx.fillRect(0, 0, canvasWidth, canvasHeight);
66274
66274
  ctx.fillStyle = "black";
66275
- ctx.fillText(text11, canvasWidth * (SCALE - 1) / 2, canvasHeight * (3 - SCALE) / 2);
66275
+ ctx.fillText(text12, canvasWidth * (SCALE - 1) / 2, canvasHeight * (3 - SCALE) / 2);
66276
66276
  const uint8Buf = this.#toUint8(ctx.getImageData(0, 0, canvasWidth, canvasHeight).data);
66277
66277
  const histogram = this.#getHistogram(uint8Buf);
66278
66278
  const threshold = this.#guessThreshold(histogram);
@@ -66774,7 +66774,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
66774
66774
  } = this.parent.viewport;
66775
66775
  return SignatureExtractor.process(bitmap, pageWidth, pageHeight, rotation, _SignatureEditor._INNER_MARGIN);
66776
66776
  }
66777
- getFromText(text11, fontInfo) {
66777
+ getFromText(text12, fontInfo) {
66778
66778
  const {
66779
66779
  rawDims: {
66780
66780
  pageWidth,
@@ -66782,7 +66782,7 @@ fn fs_main(in : VertexOutput) -> @location(0) vec4<f32> {
66782
66782
  },
66783
66783
  rotation
66784
66784
  } = this.parent.viewport;
66785
- return SignatureExtractor.extractContoursFromText(text11, fontInfo, pageWidth, pageHeight, rotation, _SignatureEditor._INNER_MARGIN);
66785
+ return SignatureExtractor.extractContoursFromText(text12, fontInfo, pageWidth, pageHeight, rotation, _SignatureEditor._INNER_MARGIN);
66786
66786
  }
66787
66787
  getDrawnSignature(curves) {
66788
66788
  const {
@@ -118793,9 +118793,9 @@ function withExtras(name, render) {
118793
118793
  Wrapped.displayName = name;
118794
118794
  return Wrapped;
118795
118795
  }
118796
- function rememberReveal(text11, n2) {
118796
+ function rememberReveal(text12, n2) {
118797
118797
  if (revealProgress.size > 500) revealProgress.clear();
118798
- revealProgress.set(text11, n2);
118798
+ revealProgress.set(text12, n2);
118799
118799
  }
118800
118800
  function revealHtml(html, shown2, fade) {
118801
118801
  let w2 = 0;
@@ -119639,8 +119639,8 @@ function applyA11ySemantics(node, ctx, extra) {
119639
119639
  extra["aria-live"] = str11(announce.politeness) === "assertive" ? "assertive" : "polite";
119640
119640
  extra["aria-atomic"] = "true";
119641
119641
  extra["aria-relevant"] = trigger === "on_appear" ? "additions" : trigger === "both" ? "additions text" : "text";
119642
- const text11 = str11(announce.text);
119643
- if (text11 && extra["aria-label"] == null) extra["aria-label"] = text11;
119642
+ const text12 = str11(announce.text);
119643
+ if (text12 && extra["aria-label"] == null) extra["aria-label"] = text12;
119644
119644
  }
119645
119645
  }
119646
119646
  return hint;
@@ -121999,13 +121999,13 @@ var init_renderNode = __esm({
121999
121999
  const C2 = ctx.color;
122000
122000
  const isBoundText = typeof props.textPath === "string" && isBinding(props.textPath);
122001
122001
  const bound2 = useResolvedScalar(isBoundText ? props.textPath : void 0, ctx);
122002
- const text11 = isBoundText ? typeof bound2 === "string" || typeof bound2 === "number" ? String(bound2) : "" : literalErrorText;
122002
+ const text12 = isBoundText ? typeof bound2 === "string" || typeof bound2 === "number" ? String(bound2) : "" : literalErrorText;
122003
122003
  if (props.visible === false) return null;
122004
- if (isBoundText && !text11) return null;
122004
+ if (isBoundText && !text12) return null;
122005
122005
  const c2 = (props.severity ?? "error") === "warning" ? C2("warning", "#E89F00") : C2("danger", "#E62214");
122006
122006
  return /* @__PURE__ */ jsxs8("div", { role: "alert", style: { display: "flex", gap: 6, alignItems: "center", color: c2, fontSize: pxToRem(13), fontFamily: bodyFont(ctx), ...wrap }, children: [
122007
122007
  /* @__PURE__ */ jsx11("span", { "aria-hidden": "true", children: "\u26A0" }),
122008
- text11
122008
+ text12
122009
122009
  ] });
122010
122010
  });
122011
122011
  FormView = withExtras("FormView", ({ props, ctx, wrap }) => {
@@ -122809,8 +122809,8 @@ var init_renderNode = __esm({
122809
122809
  const look = pickerFieldLook(props.field, ctx);
122810
122810
  const shownSel = ctx.onAction ? sel : ctx.empty ? null : selectedId;
122811
122811
  const picked = opts.find((o2) => o2 != null && String(o2.id) === String(shownSel ?? ""));
122812
- const text11 = picked ? labelOf(picked) : String(placeholderText || "Select");
122813
- const box = /* @__PURE__ */ jsx11(PickerFieldBox, { look, ctx, option: picked, text: text11, isPlaceholder: !picked, font: bodyFont(ctx) });
122812
+ const text12 = picked ? labelOf(picked) : String(placeholderText || "Select");
122813
+ const box = /* @__PURE__ */ jsx11(PickerFieldBox, { look, ctx, option: picked, text: text12, isPlaceholder: !picked, font: bodyFont(ctx) });
122814
122814
  if (!ctx.onAction) return /* @__PURE__ */ jsx11("div", { style: { width: "100%", ...wrap }, children: box });
122815
122815
  return /* @__PURE__ */ jsxs8("div", { ...{ [A11Y_PART]: "root" }, "data-hm-picker-focus": "", style: { position: "relative", width: "100%", ...wrap }, children: [
122816
122816
  box,
@@ -122829,7 +122829,7 @@ var init_renderNode = __esm({
122829
122829
  ...pickerA11yProps,
122830
122830
  style: { position: "absolute", inset: 0, width: "100%", height: "100%", opacity: 0, cursor: "pointer", margin: 0, border: 0, fontSize: pxToRem(15) },
122831
122831
  children: [
122832
- !picked && /* @__PURE__ */ jsx11("option", { value: "", disabled: true, children: text11 }),
122832
+ !picked && /* @__PURE__ */ jsx11("option", { value: "", disabled: true, children: text12 }),
122833
122833
  opts.map((o2, i2) => /* @__PURE__ */ jsx11("option", { value: o2?.id, disabled: !pickerOptionPickable(o2), children: labelOf(o2) }, o2?.id ?? i2))
122834
122834
  ]
122835
122835
  }
@@ -123328,37 +123328,37 @@ var init_renderNode = __esm({
123328
123328
  REVEAL_BUFFER = 12;
123329
123329
  revealProgress = /* @__PURE__ */ new Map();
123330
123330
  countWords = (s2) => s2.split(/\s+/).filter((t2) => t2 !== "").length;
123331
- RevealText = ({ text: text11, reduce, markdownHtml }) => {
123332
- const tokens2 = React13.useMemo(() => text11.split(/(\s+)/).filter((t2) => t2 !== ""), [text11]);
123331
+ RevealText = ({ text: text12, reduce, markdownHtml }) => {
123332
+ const tokens2 = React13.useMemo(() => text12.split(/(\s+)/).filter((t2) => t2 !== ""), [text12]);
123333
123333
  const total = React13.useMemo(
123334
- () => markdownHtml != null ? revealHtml(markdownHtml, 0, void 0).total : countWords(text11),
123335
- [text11, markdownHtml]
123334
+ () => markdownHtml != null ? revealHtml(markdownHtml, 0, void 0).total : countWords(text12),
123335
+ [text12, markdownHtml]
123336
123336
  );
123337
123337
  const [shown2, setShown] = React13.useState(total);
123338
123338
  const prevRef = React13.useRef(null);
123339
123339
  useIsomorphicLayoutEffect(() => {
123340
123340
  const prev = prevRef.current;
123341
- prevRef.current = text11;
123341
+ prevRef.current = text12;
123342
123342
  if (reduce) {
123343
- rememberReveal(text11, total);
123343
+ rememberReveal(text12, total);
123344
123344
  setShown(total);
123345
123345
  return;
123346
123346
  }
123347
- let start = revealProgress.get(text11);
123348
- if (start == null) start = prev != null && text11.startsWith(prev) ? revealProgress.get(prev) ?? countWords(prev) : 0;
123347
+ let start = revealProgress.get(text12);
123348
+ if (start == null) start = prev != null && text12.startsWith(prev) ? revealProgress.get(prev) ?? countWords(prev) : 0;
123349
123349
  start = Math.max(start, total - REVEAL_BUFFER);
123350
- rememberReveal(text11, start);
123350
+ rememberReveal(text12, start);
123351
123351
  setShown(start);
123352
123352
  if (start >= total) return;
123353
123353
  let n2 = start;
123354
123354
  const id = setInterval(() => {
123355
123355
  n2 += 1;
123356
- rememberReveal(text11, n2);
123356
+ rememberReveal(text12, n2);
123357
123357
  setShown(n2);
123358
123358
  if (n2 >= total) clearInterval(id);
123359
123359
  }, REVEAL_RELEASE_MS);
123360
123360
  return () => clearInterval(id);
123361
- }, [text11, reduce, total]);
123361
+ }, [text12, reduce, total]);
123362
123362
  const fade = reduce ? void 0 : `opacity ${REVEAL_FADE_MS}ms ease-out`;
123363
123363
  if (markdownHtml != null) {
123364
123364
  return /* @__PURE__ */ jsx11(
@@ -124456,7 +124456,7 @@ var init_renderNode = __esm({
124456
124456
  TooltipNode = withExtras("TooltipNode", ({ props, ctx, wrap }) => {
124457
124457
  const C2 = ctx.color;
124458
124458
  const title = useBoundString(props.title, ctx);
124459
- const text11 = useBoundString(props.text, ctx);
124459
+ const text12 = useBoundString(props.text, ctx);
124460
124460
  const rich = title !== "";
124461
124461
  const trigger = resolveTooltipTrigger(props.trigger, "pointer");
124462
124462
  const edge = resolveOverlayEdge("Tooltip", props.edge);
@@ -124546,7 +124546,7 @@ var init_renderNode = __esm({
124546
124546
  // A held press would otherwise open the browser's own context menu over the bubble.
124547
124547
  onContextMenu: (e2) => e2.preventDefault()
124548
124548
  };
124549
- const hint = [title, text11].filter((s2) => s2 !== "").join(". ");
124549
+ const hint = [title, text12].filter((s2) => s2 !== "").join(". ");
124550
124550
  const anchor = props.anchor ? renderNode(props.anchor, ctx) : null;
124551
124551
  const wrapperHintId = `hm-tip-hint${React13.useId()}`;
124552
124552
  useIsomorphicLayoutEffect(() => {
@@ -124579,7 +124579,7 @@ var init_renderNode = __esm({
124579
124579
  ] }) }),
124580
124580
  open && /* @__PURE__ */ jsxs8("div", { ref: bubbleRef, role: "tooltip", "data-hm-tooltip-edge": placed, style: { position: "absolute", zIndex: 45, maxWidth: Math.min(240, placement.maxWidth), overflowWrap: placement.maxWidth < 240 ? "anywhere" : void 0, width: "max-content", background: C2("textPrimary", "#13171e"), color: C2("textOnAccent", "#fff"), borderRadius: 8, padding: rich ? "10px 12px" : "6px 10px", fontFamily: bodyFont(ctx), fontSize: pxToRem(13), lineHeight: 1.35, boxShadow: "0 4px 14px rgba(0,0,0,.18)", ...overlayEdgeStyle(placed, TOOLTIP_GAP), translate: `${placement.x}px ${placement.y}px` }, children: [
124581
124581
  rich && /* @__PURE__ */ jsx11("div", { style: { fontWeight: 700, marginBottom: 3 }, children: title }),
124582
- text11
124582
+ text12
124583
124583
  ] })
124584
124584
  ] });
124585
124585
  });
@@ -127256,8 +127256,8 @@ function buildRenderTree(node, path2 = "$", provider = null, itemScope = void 0,
127256
127256
  const asText3 = VALUE_PATH_TEXT.get(type);
127257
127257
  if (typeof valuePath === "string" && asText3 && (valuePath.startsWith("$service:") || /^\$item\.[^.]/.test(valuePath))) {
127258
127258
  const r3 = resolveTreeScalar(valuePath, provider, itemScope);
127259
- const text11 = asText3(r3, props);
127260
- if (text11 !== void 0) values.value = text11;
127259
+ const text12 = asText3(r3, props);
127260
+ if (text12 !== void 0) values.value = text12;
127261
127261
  else if (r3 !== void 0 && r3 !== null) {
127262
127262
  delete values.value;
127263
127263
  }
@@ -129208,11 +129208,11 @@ async function handleOwnerChatRequest(req, res) {
129208
129208
  return sendJson(res, 400, { error: "invalid_json" }, cors);
129209
129209
  }
129210
129210
  const chatroomId = (parsed.chatroomId ?? "").trim();
129211
- const text11 = (parsed.text ?? "").trim();
129212
- if (!chatroomId || !text11) return sendJson(res, 400, { error: "chatroomId_and_text_required" }, cors);
129211
+ const text12 = (parsed.text ?? "").trim();
129212
+ if (!chatroomId || !text12) return sendJson(res, 400, { error: "chatroomId_and_text_required" }, cors);
129213
129213
  const metaSiteId = (parsed.metaSiteId ?? "").trim() || await resolveMetaSiteId();
129214
129214
  if (!metaSiteId) return sendJson(res, 400, { error: "no_meta_site" }, cors);
129215
- const result = await sendChatMessageLive(metaSiteId, chatroomId, text11);
129215
+ const result = await sendChatMessageLive(metaSiteId, chatroomId, text12);
129216
129216
  if (result.ok) return sendJson(res, 200, { ok: true, message: result.message }, cors);
129217
129217
  return sendJson(res, result.status >= 400 && result.status < 600 ? result.status : 502, { ok: false, status: result.status, error: result.error }, cors);
129218
129218
  }
@@ -129506,13 +129506,13 @@ function invalidate(state, ...screenIds) {
129506
129506
  publishSSE(state, "screen.invalidated", { screenIds });
129507
129507
  }
129508
129508
  function publishSSE(state, type, payload) {
129509
- const text11 = `event: ${type}
129509
+ const text12 = `event: ${type}
129510
129510
  data: ${JSON.stringify(payload)}
129511
129511
 
129512
129512
  `;
129513
129513
  for (const res of [...state.sseClients]) {
129514
129514
  try {
129515
- res.write(text11);
129515
+ res.write(text12);
129516
129516
  } catch {
129517
129517
  state.sseClients.delete(res);
129518
129518
  }
@@ -129528,13 +129528,13 @@ function publishAdminSSE(state, type, payload) {
129528
129528
  state.lastDeviceScreen.set(key3, screenId);
129529
129529
  }
129530
129530
  }
129531
- const text11 = `event: ${type}
129531
+ const text12 = `event: ${type}
129532
129532
  data: ${JSON.stringify(payload)}
129533
129533
 
129534
129534
  `;
129535
129535
  for (const res of [...state.adminClients]) {
129536
129536
  try {
129537
- res.write(text11);
129537
+ res.write(text12);
129538
129538
  } catch {
129539
129539
  state.adminClients.delete(res);
129540
129540
  }
@@ -129555,12 +129555,12 @@ function publishDevReady(state, res, extra = {}) {
129555
129555
  hotReloadEnabled: state.hotReloadEnabled,
129556
129556
  ...extra
129557
129557
  };
129558
- const text11 = `event: dev.ready
129558
+ const text12 = `event: dev.ready
129559
129559
  data: ${JSON.stringify(payload)}
129560
129560
 
129561
129561
  `;
129562
129562
  if (res) {
129563
- res.write(text11);
129563
+ res.write(text12);
129564
129564
  } else {
129565
129565
  publishSSE(state, "dev.ready", payload);
129566
129566
  }
@@ -131625,9 +131625,9 @@ async function handleLiveSubscription(req, res, state) {
131625
131625
  },
131626
131626
  body: JSON.stringify({ ...body, app })
131627
131627
  });
131628
- const text11 = await upstream.text();
131628
+ const text12 = await upstream.text();
131629
131629
  res.writeHead(upstream.status, { "Content-Type": "application/json", ...cors });
131630
- res.end(text11 || JSON.stringify({ ok: upstream.ok }));
131630
+ res.end(text12 || JSON.stringify({ ok: upstream.ok }));
131631
131631
  } catch (error) {
131632
131632
  sendJson(res, 502, { error: "admin_server_unreachable", detail: String(error) }, cors);
131633
131633
  }
@@ -133930,10 +133930,10 @@ function componentModuleIds() {
133930
133930
  function usageStringCopyFor(permissionCopy) {
133931
133931
  const out2 = {};
133932
133932
  for (const [rawId, copy] of Object.entries(permissionCopy ?? {})) {
133933
- const text11 = typeof copy === "string" ? copy.trim() : "";
133934
- if (!text11) continue;
133933
+ const text12 = typeof copy === "string" ? copy.trim() : "";
133934
+ if (!text12) continue;
133935
133935
  const req = CAPABILITY_NATIVE[catalogKey(rawId)];
133936
- for (const u2 of [...req?.ios?.usageStrings ?? [], ...req?.macos?.usageStrings ?? []]) out2[u2.key] = text11;
133936
+ for (const u2 of [...req?.ios?.usageStrings ?? [], ...req?.macos?.usageStrings ?? []]) out2[u2.key] = text12;
133937
133937
  }
133938
133938
  return out2;
133939
133939
  }
@@ -134861,10 +134861,10 @@ function netTransport(rules) {
134861
134861
  if (res.needsUpstream) {
134862
134862
  throw new Error(`net fixture rule ${res.ruleId} is a \`transform\` rule, which needs a real upstream \u2014 not usable in a hermetic crawl`);
134863
134863
  }
134864
- const { status, body: text11 } = res.resolved;
134864
+ const { status, body: text12 } = res.resolved;
134865
134865
  if (status < 200 || status >= 300) throw new Error(`Wix ${status} for ${method} ${bare}`);
134866
134866
  try {
134867
- return text11 ? JSON.parse(text11) : {};
134867
+ return text12 ? JSON.parse(text12) : {};
134868
134868
  } catch {
134869
134869
  return {};
134870
134870
  }
@@ -134908,10 +134908,10 @@ function layeredTransport(layers3) {
134908
134908
  });
134909
134909
  if (res.matched) {
134910
134910
  if (res.needsUpstream) throw new Error(`net fixture rule ${res.ruleId} is a \`transform\` rule, which needs a real upstream \u2014 not usable in a hermetic crawl`);
134911
- const { status, body: text11 } = res.resolved;
134911
+ const { status, body: text12 } = res.resolved;
134912
134912
  if (status < 200 || status >= 300) throw new Error(`Wix ${status} for ${m2} ${bare}`);
134913
134913
  try {
134914
- return text11 ? JSON.parse(text11) : {};
134914
+ return text12 ? JSON.parse(text12) : {};
134915
134915
  } catch {
134916
134916
  return {};
134917
134917
  }
@@ -137087,13 +137087,13 @@ var init_build2 = __esm({
137087
137087
  });
137088
137088
 
137089
137089
  // ../mobile-dist/release-pin.ts
137090
- function withPinnedRelease(text11, releaseId) {
137091
- if (!releaseId) return text11;
137090
+ function withPinnedRelease(text12, releaseId) {
137091
+ if (!releaseId) return text12;
137092
137092
  let cfg;
137093
137093
  try {
137094
- cfg = JSON.parse(text11);
137094
+ cfg = JSON.parse(text12);
137095
137095
  } catch {
137096
- return text11;
137096
+ return text12;
137097
137097
  }
137098
137098
  cfg.releaseId = releaseId;
137099
137099
  cfg.releasePinned = true;
@@ -137474,18 +137474,18 @@ async function bakeCatalogs(app, locale, fetchCatalog, putDoc) {
137474
137474
  const source = locale?.default ?? "en";
137475
137475
  const tags = [.../* @__PURE__ */ new Set([source, ...declared])];
137476
137476
  for (const tag of tags) {
137477
- const text11 = await fetchCatalog(tag);
137478
- if (!text11) continue;
137479
- if (!declared.length && !servesMessages(text11)) continue;
137480
- const hash2 = sha2563(text11);
137481
- await putDoc(app, hash2, text11);
137477
+ const text12 = await fetchCatalog(tag);
137478
+ if (!text12) continue;
137479
+ if (!declared.length && !servesMessages(text12)) continue;
137480
+ const hash2 = sha2563(text12);
137481
+ await putDoc(app, hash2, text12);
137482
137482
  out2[tag] = hash2;
137483
137483
  }
137484
137484
  return out2;
137485
137485
  }
137486
- function servesMessages(text11) {
137486
+ function servesMessages(text12) {
137487
137487
  try {
137488
- const m2 = JSON.parse(text11).messages;
137488
+ const m2 = JSON.parse(text12).messages;
137489
137489
  return !!m2 && typeof m2 === "object" && Object.keys(m2).length > 0;
137490
137490
  } catch {
137491
137491
  return false;
@@ -137580,9 +137580,9 @@ async function snapshotTokens(app, base, fetchTokens, put) {
137580
137580
  }
137581
137581
  };
137582
137582
  }
137583
- const text11 = await res.text();
137584
- await put(text11);
137585
- return { hash: sha2563(text11) };
137583
+ const text12 = await res.text();
137584
+ await put(text12);
137585
+ return { hash: sha2563(text12) };
137586
137586
  }
137587
137587
  function tokensSnapshotMessage(app, base, status) {
137588
137588
  const why = status === 400 ? `the dev-server rejected the app id as malformed (400 bad_app). It must be lowercase letters, digits and hyphens, starting with a letter or digit, at most 63 characters, with at most one interior dot \u2014 so a leading underscore or an uppercase letter fails, on every build of that app. A single dot is FINE (an owner-namespaced slug), so do not remove one to get past this` : `${status} from the tokens route`;
@@ -137683,23 +137683,23 @@ function maximumBinaryVersion(current, candidate) {
137683
137683
  }
137684
137684
  return current;
137685
137685
  }
137686
- async function withStoreNavBundle(text11, address) {
137686
+ async function withStoreNavBundle(text12, address) {
137687
137687
  let cfg;
137688
137688
  try {
137689
- cfg = JSON.parse(text11);
137689
+ cfg = JSON.parse(text12);
137690
137690
  } catch {
137691
- return text11;
137691
+ return text12;
137692
137692
  }
137693
137693
  const refs = [cfg?.app?.logicBundle, cfg?.navigation?.navLogicBundle, cfg?.navLogicBundle].filter(
137694
137694
  (r3) => !!r3 && typeof r3 === "object" && typeof r3.url === "string"
137695
137695
  );
137696
- if (refs.length === 0) return text11;
137696
+ if (refs.length === 0) return text12;
137697
137697
  const resolved2 = [];
137698
137698
  for (const ref of refs) {
137699
137699
  const name = bundleNameFromUrl(ref.url);
137700
- if (!name) return text11;
137700
+ if (!name) return text12;
137701
137701
  const addressed = await address(name);
137702
- if (!addressed) return text11;
137702
+ if (!addressed) return text12;
137703
137703
  resolved2.push({ ref, url: addressed.url, sri: addressed.sri });
137704
137704
  }
137705
137705
  for (const { ref, url, sri: integrity2 } of resolved2) {
@@ -137708,10 +137708,10 @@ async function withStoreNavBundle(text11, address) {
137708
137708
  }
137709
137709
  return JSON.stringify(cfg);
137710
137710
  }
137711
- function linkableScreenIdsFrom(text11) {
137711
+ function linkableScreenIdsFrom(text12) {
137712
137712
  let cfg;
137713
137713
  try {
137714
- cfg = JSON.parse(text11);
137714
+ cfg = JSON.parse(text12);
137715
137715
  } catch {
137716
137716
  return [];
137717
137717
  }
@@ -137723,24 +137723,24 @@ function linkableScreenIdsFrom(text11) {
137723
137723
  }
137724
137724
  return [...ids];
137725
137725
  }
137726
- function withoutDevOnlyAppConfig(text11) {
137726
+ function withoutDevOnlyAppConfig(text12) {
137727
137727
  let cfg;
137728
137728
  try {
137729
- cfg = JSON.parse(text11);
137729
+ cfg = JSON.parse(text12);
137730
137730
  } catch {
137731
- return text11;
137731
+ return text12;
137732
137732
  }
137733
- if (!cfg || typeof cfg !== "object" || !("devGatewayConfig" in cfg)) return text11;
137733
+ if (!cfg || typeof cfg !== "object" || !("devGatewayConfig" in cfg)) return text12;
137734
137734
  delete cfg.devGatewayConfig;
137735
137735
  return JSON.stringify(cfg);
137736
137736
  }
137737
- function withProdServeAppConfig(text11, prod) {
137738
- if (!prod?.serve) return text11;
137737
+ function withProdServeAppConfig(text12, prod) {
137738
+ if (!prod?.serve) return text12;
137739
137739
  let cfg;
137740
137740
  try {
137741
- cfg = JSON.parse(text11);
137741
+ cfg = JSON.parse(text12);
137742
137742
  } catch {
137743
- return text11;
137743
+ return text12;
137744
137744
  }
137745
137745
  cfg.useProdServe = true;
137746
137746
  cfg.prodServeBaseUrl = prod.serve;
@@ -138124,10 +138124,10 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
138124
138124
  if (bytes2.length === 0 || bytes2.length > MAX_AUTHORING_DOC_BYTES) {
138125
138125
  throw new Error(`${file2} must be non-empty and at most ${MAX_AUTHORING_DOC_BYTES} bytes to ship with a release.`);
138126
138126
  }
138127
- const text11 = bytes2.toString("utf8");
138128
- if (!Buffer.from(text11, "utf8").equals(bytes2)) throw new Error(`${file2} must be canonical UTF-8 Markdown.`);
138127
+ const text12 = bytes2.toString("utf8");
138128
+ if (!Buffer.from(text12, "utf8").equals(bytes2)) throw new Error(`${file2} must be canonical UTF-8 Markdown.`);
138129
138129
  const hash2 = sha2563(bytes2);
138130
- await store.putDoc(app, hash2, text11);
138130
+ await store.putDoc(app, hash2, text12);
138131
138131
  authoringDocs[name] = { sha256: hash2, sri: sri2(bytes2), bytes: bytes2.length, contentType: "text/markdown; charset=utf-8" };
138132
138132
  }
138133
138133
  }
@@ -138280,10 +138280,10 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
138280
138280
  base = BAKE_OFFLINE_BASE;
138281
138281
  }
138282
138282
  const devFetch = (url, init) => dev.inject(new Request(url, init));
138283
- const depthRefusalFromText = (status, text11) => {
138283
+ const depthRefusalFromText = (status, text12) => {
138284
138284
  if (status !== 422) return null;
138285
138285
  try {
138286
- const body = JSON.parse(text11);
138286
+ const body = JSON.parse(text12);
138287
138287
  return body?.error === "depth_budget_exceeded" && body.finding ? body.finding : null;
138288
138288
  } catch {
138289
138289
  return null;
@@ -138291,8 +138291,8 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
138291
138291
  };
138292
138292
  const depthRefusalOf = async (res) => depthRefusalFromText(res.status, await res.text());
138293
138293
  const recordUnbuilt = async (screenId, res) => {
138294
- const text11 = await res.text();
138295
- const finding2 = depthRefusalFromText(res.status, text11);
138294
+ const text12 = await res.text();
138295
+ const finding2 = depthRefusalFromText(res.status, text12);
138296
138296
  if (finding2) {
138297
138297
  failedToBuild.push({ screenId, status: res.status, error: finding2.message });
138298
138298
  if (!depthRefusals.some((r3) => r3.screenId === screenId)) depthRefusals.push({ screenId, finding: finding2 });
@@ -138301,7 +138301,7 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
138301
138301
  }
138302
138302
  return;
138303
138303
  }
138304
- failedToBuild.push({ screenId, status: res.status, error: text11.slice(0, 2e3) });
138304
+ failedToBuild.push({ screenId, status: res.status, error: text12.slice(0, 2e3) });
138305
138305
  };
138306
138306
  try {
138307
138307
  for (const screenId of screenIds) {
@@ -138547,11 +138547,11 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
138547
138547
  ok: res.ok,
138548
138548
  status: res.status,
138549
138549
  text: async () => {
138550
- const text11 = await res.text();
138550
+ const text12 = await res.text();
138551
138551
  try {
138552
- const doc = JSON.parse(text11);
138552
+ const doc = JSON.parse(text12);
138553
138553
  if (!publishedFontPlan) {
138554
- if (!("fontFaces" in doc)) return text11;
138554
+ if (!("fontFaces" in doc)) return text12;
138555
138555
  const kept = publishableFontFaces(doc.fontFaces);
138556
138556
  if (kept) doc.fontFaces = kept;
138557
138557
  else delete doc.fontFaces;
@@ -138560,12 +138560,12 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
138560
138560
  doc.fontFaces = servedProjection(publishedFontPlan);
138561
138561
  return JSON.stringify(doc);
138562
138562
  } catch {
138563
- return text11;
138563
+ return text12;
138564
138564
  }
138565
138565
  }
138566
138566
  };
138567
138567
  },
138568
- (text11) => store.putTokens(app, text11)
138568
+ (text12) => store.putTokens(app, text12)
138569
138569
  );
138570
138570
  if (snapshot3.hash) tokensHash = snapshot3.hash;
138571
138571
  if (snapshot3.failure) {
@@ -138595,14 +138595,14 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
138595
138595
  if (streamPolicyErrors.length) {
138596
138596
  throw new Error(`invalid streamPolicy for release ${app}: ${streamPolicyErrors.join("; ")}`);
138597
138597
  }
138598
- const text11 = await withStoreNavBundle(prodText, async (name) => {
138598
+ const text12 = await withStoreNavBundle(prodText, async (name) => {
138599
138599
  const hash2 = await addressBundle(name) ?? null;
138600
138600
  const entry = hash2 ? bundles[name] : void 0;
138601
138601
  return entry ? { url: store.bundleUrl(app, entry.sha256), sri: entry.sri } : null;
138602
138602
  });
138603
- await store.putAppConfig(app, text11);
138604
- appConfigHash = sha2563(text11);
138605
- if (collect2?.descriptors) for (const id of linkableScreenIdsFrom(text11)) linkable.add(id);
138603
+ await store.putAppConfig(app, text12);
138604
+ appConfigHash = sha2563(text12);
138605
+ if (collect2?.descriptors) for (const id of linkableScreenIdsFrom(text12)) linkable.add(id);
138606
138606
  }
138607
138607
  const ahRes = await devFetch(`${base}/v1/action-handlers/${encodeURIComponent(app)}`, { headers: { "X-Himalaya-App": app } });
138608
138608
  if (ahRes.ok) {
@@ -139537,8 +139537,8 @@ function penalty(m2, size) {
139537
139537
  score += Math.floor(Math.abs(dark * 20 - total * 10) / total) * 10;
139538
139538
  return score;
139539
139539
  }
139540
- function encodeQr(text11) {
139541
- const bytes2 = [...new TextEncoder().encode(text11)];
139540
+ function encodeQr(text12) {
139541
+ const bytes2 = [...new TextEncoder().encode(text12)];
139542
139542
  const version5 = fitVersion(bytes2.length);
139543
139543
  if (!version5) {
139544
139544
  throw new RangeError(`QR payload too long: ${bytes2.length} bytes exceeds version ${QR_MAX_VERSION} at EC level L`);
@@ -139778,14 +139778,14 @@ function headline(changes) {
139778
139778
  function boardLines(changes) {
139779
139779
  const lines = [];
139780
139780
  for (const c2 of changes.items) {
139781
- const text11 = lineOf(c2);
139782
- const same3 = lines.find((l2) => l2.text === text11);
139781
+ const text12 = lineOf(c2);
139782
+ const same3 = lines.find((l2) => l2.text === text12);
139783
139783
  if (same3) {
139784
139784
  same3.n++;
139785
139785
  continue;
139786
139786
  }
139787
139787
  lines.push({
139788
- text: text11,
139788
+ text: text12,
139789
139789
  n: 1,
139790
139790
  ...c2.kind === "token" && c2.from && HEX.test(c2.from) ? { from: c2.from } : {},
139791
139791
  ...c2.kind === "token" && c2.to && HEX.test(c2.to) ? { to: c2.to } : {}
@@ -140634,14 +140634,14 @@ function contentDir(flags) {
140634
140634
  return resolve33(str3(flags.content) ?? process.cwd());
140635
140635
  }
140636
140636
  function renameRestoredSource(restored, declaredApp, renamed) {
140637
- const text11 = {};
140637
+ const text12 = {};
140638
140638
  for (const entry of restored) {
140639
140639
  const decoded = entry.bytes.toString("utf8");
140640
- if (Buffer.from(decoded, "utf8").equals(entry.bytes)) text11[entry.path] = decoded;
140640
+ if (Buffer.from(decoded, "utf8").equals(entry.bytes)) text12[entry.path] = decoded;
140641
140641
  }
140642
- const sentineled = sentinelizeArchive(text11, declaredApp);
140642
+ const sentineled = sentinelizeArchive(text12, declaredApp);
140643
140643
  for (const entry of restored) {
140644
- if (!(entry.path in text11)) continue;
140644
+ if (!(entry.path in text12)) continue;
140645
140645
  const body = sentineled[entry.path];
140646
140646
  if (body !== void 0) entry.bytes = Buffer.from(substituteIdentity(body, renamed), "utf8");
140647
140647
  }
@@ -140721,8 +140721,8 @@ function materializeForPreview(appDir3, slug, displayName3) {
140721
140721
  }
140722
140722
  async function appId(dir) {
140723
140723
  try {
140724
- const { readFileSync: readFileSync127 } = await import("node:fs");
140725
- const m2 = JSON.parse(readFileSync127(join31(dir, "himalaya.content.json"), "utf8"));
140724
+ const { readFileSync: readFileSync128 } = await import("node:fs");
140725
+ const m2 = JSON.parse(readFileSync128(join31(dir, "himalaya.content.json"), "utf8"));
140726
140726
  if (m2.name) return m2.name;
140727
140727
  } catch {
140728
140728
  }
@@ -141137,10 +141137,10 @@ function ownerTransport(msid, fetchImpl = fetch, timeoutMs = DEFAULT_TIMEOUT_MS,
141137
141137
  }
141138
141138
  throw new Error(`${method} ${path2} failed: ${err?.message ?? String(e2)}`);
141139
141139
  }
141140
- const text11 = await res.text();
141141
- let parsed = text11;
141140
+ const text12 = await res.text();
141141
+ let parsed = text12;
141142
141142
  try {
141143
- parsed = text11 ? JSON.parse(text11) : null;
141143
+ parsed = text12 ? JSON.parse(text12) : null;
141144
141144
  } catch {
141145
141145
  }
141146
141146
  if (!res.ok) throw new WixApiError(res.status, method, path2, parsed);
@@ -141310,10 +141310,10 @@ function makeTransport(fetchImpl, auth, timeoutMs = DEFAULT_TIMEOUT_MS2) {
141310
141310
  body: body === void 0 ? void 0 : JSON.stringify(body),
141311
141311
  signal: AbortSignal.timeout(timeoutMs)
141312
141312
  });
141313
- const text11 = await res.text();
141314
- let parsed = text11;
141313
+ const text12 = await res.text();
141314
+ let parsed = text12;
141315
141315
  try {
141316
- parsed = text11 ? JSON.parse(text11) : null;
141316
+ parsed = text12 ? JSON.parse(text12) : null;
141317
141317
  } catch {
141318
141318
  }
141319
141319
  if (!res.ok) throw new WixApiError2(res.status, method, path2, parsed);
@@ -141414,10 +141414,10 @@ async function mintVisitorToken(fetchImpl, clientId) {
141414
141414
  body: JSON.stringify({ clientId, grantType: "anonymous" }),
141415
141415
  signal: AbortSignal.timeout(8e3)
141416
141416
  });
141417
- const text11 = await res.text();
141418
- let parsed = text11;
141417
+ const text12 = await res.text();
141418
+ let parsed = text12;
141419
141419
  try {
141420
- parsed = text11 ? JSON.parse(text11) : null;
141420
+ parsed = text12 ? JSON.parse(text12) : null;
141421
141421
  } catch {
141422
141422
  }
141423
141423
  if (!res.ok) throw new WixApiError2(res.status, "POST", "/oauth2/token", parsed);
@@ -141615,10 +141615,10 @@ function scalar3(v2) {
141615
141615
  }
141616
141616
  return t2;
141617
141617
  }
141618
- function parseStoreConfig(text11) {
141618
+ function parseStoreConfig(text12) {
141619
141619
  const cfg = {};
141620
141620
  let section3 = null;
141621
- for (const raw of text11.split("\n")) {
141621
+ for (const raw of text12.split("\n")) {
141622
141622
  const line = strip2(raw);
141623
141623
  if (!line.trim()) continue;
141624
141624
  const indented = /^\s+/.test(raw);
@@ -146776,7 +146776,7 @@ function prettify(node, options, matcher, readonlyMatcher) {
146776
146776
  return compress(node, options, matcher, readonlyMatcher);
146777
146777
  }
146778
146778
  function compress(arr2, options, matcher, readonlyMatcher) {
146779
- let text11;
146779
+ let text12;
146780
146780
  const compressedObj = {};
146781
146781
  for (let i2 = 0; i2 < arr2.length; i2++) {
146782
146782
  const tagObj = arr2[i2];
@@ -146789,8 +146789,8 @@ function compress(arr2, options, matcher, readonlyMatcher) {
146789
146789
  matcher.push(property2, rawAttrs);
146790
146790
  }
146791
146791
  if (property2 === options.textNodeName) {
146792
- if (text11 === void 0) text11 = tagObj[property2];
146793
- else text11 += "" + tagObj[property2];
146792
+ if (text12 === void 0) text12 = tagObj[property2];
146793
+ else text12 += "" + tagObj[property2];
146794
146794
  } else if (property2 === void 0) {
146795
146795
  continue;
146796
146796
  } else if (tagObj[property2]) {
@@ -146828,9 +146828,9 @@ function compress(arr2, options, matcher, readonlyMatcher) {
146828
146828
  }
146829
146829
  }
146830
146830
  }
146831
- if (typeof text11 === "string") {
146832
- if (text11.length > 0) compressedObj[options.textNodeName] = text11;
146833
- } else if (text11 !== void 0) compressedObj[options.textNodeName] = text11;
146831
+ if (typeof text12 === "string") {
146832
+ if (text12.length > 0) compressedObj[options.textNodeName] = text12;
146833
+ } else if (text12 !== void 0) compressedObj[options.textNodeName] = text12;
146834
146834
  return compressedObj;
146835
146835
  }
146836
146836
  function propName2(obj7) {
@@ -147008,9 +147008,9 @@ function arrToStr(arr2, options, indentation, matcher, stopNodeExpressions, xmlV
147008
147008
  }
147009
147009
  if (!Array.isArray(arr2)) {
147010
147010
  if (arr2 !== void 0 && arr2 !== null) {
147011
- let text11 = arr2.toString();
147012
- text11 = replaceEntitiesValue2(text11, options);
147013
- return text11;
147011
+ let text12 = arr2.toString();
147012
+ text12 = replaceEntitiesValue2(text12, options);
147013
+ return text12;
147014
147014
  }
147015
147015
  return "";
147016
147016
  }
@@ -149315,9 +149315,9 @@ function bundlesOf(block) {
149315
149315
  walk2(block);
149316
149316
  return [...out2];
149317
149317
  }
149318
- function parseJson2(text11, what) {
149318
+ function parseJson2(text12, what) {
149319
149319
  try {
149320
- const value2 = JSON.parse(text11);
149320
+ const value2 = JSON.parse(text12);
149321
149321
  if (!value2 || typeof value2 !== "object" || Array.isArray(value2)) throw new Error("not an object");
149322
149322
  return value2;
149323
149323
  } catch (e2) {
@@ -149902,9 +149902,9 @@ function planTrim(src, keepIds, links) {
149902
149902
  for (const r3 of keptRoutes) for (const b2 of r3.bundles) keptWorkers.add(b2);
149903
149903
  const importsOf2 = (dir) => {
149904
149904
  const out2 = [];
149905
- for (const [rel, text11] of Object.entries(src.workerFiles)) {
149905
+ for (const [rel, text12] of Object.entries(src.workerFiles)) {
149906
149906
  if (!rel.startsWith(`tier5-src/${dir}/`)) continue;
149907
- for (const m2 of text11.matchAll(/(?:\bfrom\s*|\bimport\s*\(?\s*|\brequire\s*\(\s*)["']\.\.\/([A-Za-z0-9_.-]+)(?:\/|["'])/g)) out2.push(m2[1]);
149907
+ for (const m2 of text12.matchAll(/(?:\bfrom\s*|\bimport\s*\(?\s*|\brequire\s*\(\s*)["']\.\.\/([A-Za-z0-9_.-]+)(?:\/|["'])/g)) out2.push(m2[1]);
149908
149908
  }
149909
149909
  return out2;
149910
149910
  };
@@ -149950,9 +149950,9 @@ function planTrim(src, keepIds, links) {
149950
149950
  continue;
149951
149951
  }
149952
149952
  const block = edited.get(r3);
149953
- let text11 = block ? serializeAt(block, app.dev, r3.open) : void 0;
149954
- if (r3 === app.home && homeModules?.text !== void 0) text11 = homeModules.text;
149955
- if (text11 !== void 0) cut2(r3.open, r3.close, text11);
149953
+ let text12 = block ? serializeAt(block, app.dev, r3.open) : void 0;
149954
+ if (r3 === app.home && homeModules?.text !== void 0) text12 = homeModules.text;
149955
+ if (text12 !== void 0) cut2(r3.open, r3.close, text12);
149956
149956
  }
149957
149957
  if (templatedEmptied) cut2(templatedEmptied[0], templatedEmptied[1], "\n");
149958
149958
  dev += app.dev.slice(cursor);
@@ -150005,9 +150005,9 @@ function homeModulesPass(app, kept, edited) {
150005
150005
  const removedVertical = verticals.some(([, card2]) => !kept.has(app.exact.get(card2.screenId)));
150006
150006
  if (!removedVertical) return { dropped: [] };
150007
150007
  const block = edited.get(app.home);
150008
- const text11 = block ? serializeAt(block, app.dev, app.home.open) : app.dev.slice(app.home.open, app.home.close);
150008
+ const text12 = block ? serializeAt(block, app.dev, app.home.open) : app.dev.slice(app.home.open, app.home.close);
150009
150009
  const installed = verticals.filter(([, card2]) => kept.has(app.exact.get(card2.screenId))).map(([v2]) => v2);
150010
- const patched = patchHomeModules(text11, installed);
150010
+ const patched = patchHomeModules(text12, installed);
150011
150011
  if (!patched.droppedModules.length) return { dropped: [] };
150012
150012
  return { text: patched.src, dropped: patched.droppedModules };
150013
150013
  }
@@ -150497,8 +150497,8 @@ function workerReach(src) {
150497
150497
  const f2 = queue.shift();
150498
150498
  if (seen.has(f2)) continue;
150499
150499
  seen.add(f2);
150500
- const text11 = all.get(f2) ?? "";
150501
- for (const m2 of text11.matchAll(RELATIVE_IMPORT)) {
150500
+ const text12 = all.get(f2) ?? "";
150501
+ for (const m2 of text12.matchAll(RELATIVE_IMPORT)) {
150502
150502
  const r3 = resolveImport(f2, m2[1], all);
150503
150503
  if (r3 && !seen.has(r3)) queue.push(r3);
150504
150504
  }
@@ -150508,11 +150508,11 @@ function workerReach(src) {
150508
150508
  let fetchCall = false;
150509
150509
  const hits = [];
150510
150510
  for (const f2 of [...seen].sort()) {
150511
- const text11 = all.get(f2) ?? "";
150511
+ const text12 = all.get(f2) ?? "";
150512
150512
  const before = wix.size;
150513
- for (const m2 of text11.matchAll(WIX_MODULE)) wix.add(m2[1].replace(/^@wix\/himalaya\//, "@himalaya/"));
150514
- const r3 = /\bwixApi\b/.test(text11);
150515
- const fe2 = /(?<![.\w])fetch\s*\(/.test(text11);
150513
+ for (const m2 of text12.matchAll(WIX_MODULE)) wix.add(m2[1].replace(/^@wix\/himalaya\//, "@himalaya/"));
150514
+ const r3 = /\bwixApi\b/.test(text12);
150515
+ const fe2 = /(?<![.\w])fetch\s*\(/.test(text12);
150516
150516
  if (wix.size > before || r3 || fe2) hits.push(f2);
150517
150517
  raw ||= r3;
150518
150518
  fetchCall ||= fe2;
@@ -150961,10 +150961,10 @@ async function pushSetupRequest(options) {
150961
150961
  signal: AbortSignal.timeout(options.timeoutMs ?? (setup ? 12e4 : 3e4)),
150962
150962
  ...setup ? { body: JSON.stringify(options.body) } : {}
150963
150963
  });
150964
- const text11 = await response.text();
150964
+ const text12 = await response.text();
150965
150965
  let parsed = null;
150966
150966
  try {
150967
- const value2 = text11 ? JSON.parse(text11) : null;
150967
+ const value2 = text12 ? JSON.parse(text12) : null;
150968
150968
  parsed = value2 && typeof value2 === "object" && !Array.isArray(value2) ? value2 : null;
150969
150969
  } catch {
150970
150970
  parsed = null;
@@ -151108,8 +151108,8 @@ function appendProperties(literal, file2, lines) {
151108
151108
  const at2 = trailing ? literal.properties.end : last.end;
151109
151109
  const lead = trailing ? "" : ",";
151110
151110
  if (onOneLine(literal, file2)) {
151111
- const text11 = inline();
151112
- return { at: at2, end: at2, text: `${lead} ${trailing ? text11 : text11.replace(/,$/, "")}` };
151111
+ const text12 = inline();
151112
+ return { at: at2, end: at2, text: `${lead} ${trailing ? text12 : text12.replace(/,$/, "")}` };
151113
151113
  }
151114
151114
  const indent = lineIndent2(file2.text, last.getStart(file2));
151115
151115
  return { at: at2, end: at2, text: lead + lines.map((line) => `
@@ -151119,9 +151119,9 @@ function onOneLine(node, file2) {
151119
151119
  const line = (position) => file2.getLineAndCharacterOfPosition(position).line;
151120
151120
  return line(node.getStart(file2)) === line(node.getEnd());
151121
151121
  }
151122
- function lineIndent2(text11, position) {
151123
- const lineStart = text11.lastIndexOf("\n", position - 1) + 1;
151124
- return /^[ \t]*/.exec(text11.slice(lineStart))[0];
151122
+ function lineIndent2(text12, position) {
151123
+ const lineStart = text12.lastIndexOf("\n", position - 1) + 1;
151124
+ return /^[ \t]*/.exec(text12.slice(lineStart))[0];
151125
151125
  }
151126
151126
  function applySplices(source, splices) {
151127
151127
  return [...splices].sort((a2, b2) => b2.at - a2.at).reduce((out2, s2) => out2.slice(0, s2.at) + s2.text + out2.slice(s2.end), source);
@@ -152630,9 +152630,9 @@ __export(screen_state_exports, {
152630
152630
  import { createHash as createHash26 } from "node:crypto";
152631
152631
  import { lstatSync as lstatSync16, readFileSync as readFileSync52 } from "node:fs";
152632
152632
  import { join as join41 } from "node:path";
152633
- function quotableLine(text11) {
152634
- if (!text11) return void 0;
152635
- const first = text11.split(/\r?\n/).map((l2) => l2.trim()).find(Boolean);
152633
+ function quotableLine(text12) {
152634
+ if (!text12) return void 0;
152635
+ const first = text12.split(/\r?\n/).map((l2) => l2.trim()).find(Boolean);
152636
152636
  if (!first) return void 0;
152637
152637
  let line = first.replace(/\s+/g, " ");
152638
152638
  if (line.length > LINE_MAX) {
@@ -152645,9 +152645,9 @@ function quotableLine(text11) {
152645
152645
  function visibleText(html) {
152646
152646
  return html.replace(/<(script|style)\b[\s\S]*?<\/\1>/gi, " ").replace(/<[^>]*>/g, " ").replace(/&#x([0-9a-f]+);/gi, (_2, h2) => String.fromCodePoint(parseInt(h2, 16))).replace(/&#(\d+);/g, (_2, d2) => String.fromCodePoint(Number(d2))).replace(/&quot;/g, '"').replace(/&apos;/g, "'").replace(/&lt;/g, "<").replace(/&gt;/g, ">").replace(/&nbsp;/g, " ").replace(/&amp;/g, "&").replace(/\s+/g, " ");
152647
152647
  }
152648
- function painted(text11, page) {
152648
+ function painted(text12, page) {
152649
152649
  if (page === void 0) return true;
152650
- const probe2 = text11.replace(/\s+/g, " ").trim().slice(0, 60);
152650
+ const probe2 = text12.replace(/\s+/g, " ").trim().slice(0, 60);
152651
152651
  return !!probe2 && page.includes(probe2);
152652
152652
  }
152653
152653
  function errorMessageOf(s2) {
@@ -153926,8 +153926,8 @@ var init_cms_schema = __esm({
153926
153926
 
153927
153927
  // ../native-config/car.ts
153928
153928
  function parseCarConfig(configTs) {
153929
- const { text: text11, inString } = scanConfig(configTs);
153930
- for (const m2 of text11.matchAll(/\bcar\s*[:=]\s*\{([^}]*)\}/g)) {
153929
+ const { text: text12, inString } = scanConfig(configTs);
153930
+ for (const m2 of text12.matchAll(/\bcar\s*[:=]\s*\{([^}]*)\}/g)) {
153931
153931
  if (inString[m2.index]) continue;
153932
153932
  return { category: /category\s*:\s*["']([^"']+)["']/.exec(m2[1])?.[1] };
153933
153933
  }
@@ -154458,10 +154458,10 @@ function tokenColorIssues(dir, tokensPathOverride) {
154458
154458
  if (controlButton === void 0 || controlButton === null || typeof controlButton !== "object" || Array.isArray(controlButton)) return;
154459
154459
  const btn = controlButton;
154460
154460
  for (const size of ["sm", "md", "lg"]) {
154461
- const text11 = btn[size]?.text;
154462
- if (text11 === void 0 || typeof text11 === "string" && typo.has(text11)) continue;
154461
+ const text12 = btn[size]?.text;
154462
+ if (text12 === void 0 || typeof text12 === "string" && typo.has(text12)) continue;
154463
154463
  error(
154464
- `${tokensPath}: ${where}controls.button.${size}.text is ${JSON.stringify(text11)}, which names no \`typography\` token \u2014 every renderer would keep the built-in Button label. Name one that exists.`
154464
+ `${tokensPath}: ${where}controls.button.${size}.text is ${JSON.stringify(text12)}, which names no \`typography\` token \u2014 every renderer would keep the built-in Button label. Name one that exists.`
154465
154465
  );
154466
154466
  }
154467
154467
  const variants = btn.variants;
@@ -154948,16 +154948,16 @@ function encode(value2, quote) {
154948
154948
  if (quote === "'") return `'${value2.replace(/[\\']/g, "\\$&").replace(/\n/g, "\\n")}'`;
154949
154949
  return `\`${value2.replace(/[\\`]|\$(?=\{)/g, "\\$&")}\``;
154950
154950
  }
154951
- function syntaxErrors(file2, text11) {
154951
+ function syntaxErrors(file2, text12) {
154952
154952
  if (file2.endsWith(".json")) {
154953
154953
  try {
154954
- JSON.parse(text11);
154954
+ JSON.parse(text12);
154955
154955
  return [];
154956
154956
  } catch (e2) {
154957
154957
  return [e2.message];
154958
154958
  }
154959
154959
  }
154960
- const out2 = ts8.transpileModule(text11, { fileName: file2, reportDiagnostics: true, compilerOptions: { target: ts8.ScriptTarget.ES2022 } });
154960
+ const out2 = ts8.transpileModule(text12, { fileName: file2, reportDiagnostics: true, compilerOptions: { target: ts8.ScriptTarget.ES2022 } });
154961
154961
  return (out2.diagnostics ?? []).map((d2) => ts8.flattenDiagnosticMessageText(d2.messageText, "\n"));
154962
154962
  }
154963
154963
  function parses(dev, config) {
@@ -154978,10 +154978,10 @@ function sweepCopy(dir, pairs, dryRun) {
154978
154978
  const next = /* @__PURE__ */ new Map();
154979
154979
  const replaced = pairs.map(([from, to2]) => ({ from, to: to2, files: {} }));
154980
154980
  for (const f2 of files) {
154981
- const text11 = readFileSync60(join50(dir, f2), "utf8");
154982
- if (!pairs.some(([from]) => text11.includes(from) || text11.includes(JSON.stringify(from).slice(1, -1)))) continue;
154981
+ const text12 = readFileSync60(join50(dir, f2), "utf8");
154982
+ if (!pairs.some(([from]) => text12.includes(from) || text12.includes(JSON.stringify(from).slice(1, -1)))) continue;
154983
154983
  const kind = f2.endsWith(".json") ? ts8.ScriptKind.JSON : f2.endsWith("x") ? ts8.ScriptKind.TSX : ts8.ScriptKind.TS;
154984
- const sf2 = ts8.createSourceFile(f2, text11, ts8.ScriptTarget.Latest, true, kind);
154984
+ const sf2 = ts8.createSourceFile(f2, text12, ts8.ScriptTarget.Latest, true, kind);
154985
154985
  const edits = [];
154986
154986
  const visit = (node) => {
154987
154987
  if ((ts8.isStringLiteral(node) || ts8.isNoSubstitutionTemplateLiteral(node)) && isCopy(node, f2)) {
@@ -154994,14 +154994,14 @@ function sweepCopy(dir, pairs, dryRun) {
154994
154994
  });
154995
154995
  if (value2 !== node.text) {
154996
154996
  const start = node.getStart(sf2);
154997
- edits.push({ start, end: node.end, text: encode(value2, text11[start]) });
154997
+ edits.push({ start, end: node.end, text: encode(value2, text12[start]) });
154998
154998
  }
154999
154999
  }
155000
155000
  ts8.forEachChild(node, visit);
155001
155001
  };
155002
155002
  visit(sf2);
155003
155003
  if (!edits.length) continue;
155004
- let out2 = text11;
155004
+ let out2 = text12;
155005
155005
  for (const e2 of edits.sort((a2, b2) => b2.start - a2.start)) out2 = out2.slice(0, e2.start) + e2.text + out2.slice(e2.end);
155006
155006
  if (f2.startsWith("tier5-src/_shared/") && f2.endsWith(".ts") && !out2.includes(SHARED_FORK_MARKER)) {
155007
155007
  out2 = `${SHARED_FORK_MARKER} \u2014 copy rewritten by \`himi template sweep\`
@@ -155302,9 +155302,9 @@ function verticalsFromBook(path2) {
155302
155302
  throw new Error(`no book.json / provisioning.overlay.json under ${path2} \u2014 run \`himi site analyze\` first, or pass --verticals`);
155303
155303
  }
155304
155304
  function recommendTemplates(input) {
155305
- const text11 = input.text ?? "";
155306
- const owner = OWNER_WORDS.test(text11);
155307
- const want = new Set(tokens(text11));
155305
+ const text12 = input.text ?? "";
155306
+ const owner = OWNER_WORDS.test(text12);
155307
+ const want = new Set(tokens(text12));
155308
155308
  const byName3 = /* @__PURE__ */ new Map();
155309
155309
  for (const row2 of input.catalog) {
155310
155310
  const reasons = [];
@@ -155318,7 +155318,7 @@ function recommendTemplates(input) {
155318
155318
  reasons.push(`matches ${hit.map((h2) => `"${h2}"`).join(", ")}`);
155319
155319
  }
155320
155320
  }
155321
- if (text11) {
155321
+ if (text12) {
155322
155322
  if (owner === isOwner) {
155323
155323
  score += 0.3;
155324
155324
  reasons.push(owner ? "owner/operations app, and this is an owner template" : "customer-facing app, and this is a customer template");
@@ -156926,9 +156926,9 @@ function xmlAttr(value2) {
156926
156926
  return value2.replace(/&/g, "&amp;").replace(/"/g, "&quot;").replace(/</g, "&lt;").replace(/>/g, "&gt;");
156927
156927
  }
156928
156928
  function renderHealthPermissionCopyXml(copy, indent) {
156929
- const text11 = copy?.trim();
156930
- if (!text11) return [];
156931
- return [`${indent}<meta-data android:name="${HEALTH_PERMISSION_COPY_META}" android:value="${xmlAttr(text11)}" />`];
156929
+ const text12 = copy?.trim();
156930
+ if (!text12) return [];
156931
+ return [`${indent}<meta-data android:name="${HEALTH_PERMISSION_COPY_META}" android:value="${xmlAttr(text12)}" />`];
156932
156932
  }
156933
156933
  function renderModulesIosPackage(products, indent) {
156934
156934
  return products.flatMap((p2) => {
@@ -157095,8 +157095,8 @@ function swiftFilesWithModuleMarkers(app) {
157095
157095
  if (entry.isDirectory()) {
157096
157096
  if (!entry.name.endsWith(".xcodeproj")) stack.push(path2);
157097
157097
  } else if (entry.isFile() && entry.name.endsWith(".swift")) {
157098
- const text11 = readFileSync65(path2, "utf8");
157099
- if (hasMarkers(text11, "slash", LABEL_MODULES_SWIFT_IMPORT) || hasMarkers(text11, "slash", LABEL_MODULES_SWIFT_INSTALL)) out2.push(path2);
157098
+ const text12 = readFileSync65(path2, "utf8");
157099
+ if (hasMarkers(text12, "slash", LABEL_MODULES_SWIFT_IMPORT) || hasMarkers(text12, "slash", LABEL_MODULES_SWIFT_INSTALL)) out2.push(path2);
157100
157100
  }
157101
157101
  }
157102
157102
  }
@@ -157131,8 +157131,8 @@ function kotlinBootSourcesUnder(root) {
157131
157131
  }
157132
157132
  return out2.sort();
157133
157133
  }
157134
- function stripComments2(text11) {
157135
- return text11.replace(/\/\*[\s\S]*?\*\//g, (c2) => c2.replace(/[^\n]/g, " ")).replace(/\/\/[^\n]*/g, "");
157134
+ function stripComments2(text12) {
157135
+ return text12.replace(/\/\*[\s\S]*?\*\//g, (c2) => c2.replace(/[^\n]/g, " ")).replace(/\/\/[^\n]*/g, "");
157136
157136
  }
157137
157137
  function duplicateModuleInstalls(...texts) {
157138
157138
  const calls = ["installLinkedModules", ...NATIVE_MODULES.flatMap((m2) => m2.ios ? [`${m2.ios.product}.install`] : [])];
@@ -157194,19 +157194,19 @@ function hostAppliesDeferredWidgetActions(app) {
157194
157194
  }
157195
157195
  return false;
157196
157196
  }
157197
- function countBeginMarkers(text11, kind, label3) {
157198
- return text11.split("\n").filter((l2) => isBegin(l2, kind, label3)).length;
157197
+ function countBeginMarkers(text12, kind, label3) {
157198
+ return text12.split("\n").filter((l2) => isBegin(l2, kind, label3)).length;
157199
157199
  }
157200
- function countEndMarkers(text11, kind, label3) {
157201
- return text11.split("\n").filter((l2) => isEnd(l2, kind, label3)).length;
157200
+ function countEndMarkers(text12, kind, label3) {
157201
+ return text12.split("\n").filter((l2) => isEnd(l2, kind, label3)).length;
157202
157202
  }
157203
- function hasMarkers(text11, kind, label3) {
157204
- const lines = text11.split("\n");
157203
+ function hasMarkers(text12, kind, label3) {
157204
+ const lines = text12.split("\n");
157205
157205
  return lines.some((l2) => isBegin(l2, kind, label3)) && lines.some((l2) => isEnd(l2, kind, label3));
157206
157206
  }
157207
- function assertSingleMarkerPair(text11, kind, label3, where = "the file") {
157208
- const opens = countBeginMarkers(text11, kind, label3);
157209
- const closes = countEndMarkers(text11, kind, label3);
157207
+ function assertSingleMarkerPair(text12, kind, label3, where = "the file") {
157208
+ const opens = countBeginMarkers(text12, kind, label3);
157209
+ const closes = countEndMarkers(text12, kind, label3);
157210
157210
  if (opens > 1 || closes > 1) {
157211
157211
  const which = opens > 1 ? `">>> ${label3}" opens ${opens} times` : `"<<< ${label3}" closes ${closes} times`;
157212
157212
  throw new Error(
@@ -157214,9 +157214,9 @@ function assertSingleMarkerPair(text11, kind, label3, where = "the file") {
157214
157214
  );
157215
157215
  }
157216
157216
  }
157217
- function injectBlock(text11, kind, label3, render, where = "the file") {
157218
- assertSingleMarkerPair(text11, kind, label3, where);
157219
- const lines = text11.split("\n");
157217
+ function injectBlock(text12, kind, label3, render, where = "the file") {
157218
+ assertSingleMarkerPair(text12, kind, label3, where);
157219
+ const lines = text12.split("\n");
157220
157220
  const beginIdx = lines.findIndex((l2) => isBegin(l2, kind, label3));
157221
157221
  const endIdx = lines.findIndex((l2) => isEnd(l2, kind, label3));
157222
157222
  if (beginIdx === -1 || endIdx === -1 || endIdx < beginIdx) {
@@ -157256,8 +157256,8 @@ function applyToFile(path2, kind, label3, render, check) {
157256
157256
  function assertModuleFlagsMarkers(paths2) {
157257
157257
  for (const path2 of paths2) {
157258
157258
  if (!existsSync56(path2)) continue;
157259
- const text11 = readFileSync65(path2, "utf8");
157260
- if (hasMarkers(text11, "yaml", LABEL_MODULES_IOS_LINK) && !hasMarkers(text11, "yaml", LABEL_MODULES_IOS_FLAGS)) {
157259
+ const text12 = readFileSync65(path2, "utf8");
157260
+ if (hasMarkers(text12, "yaml", LABEL_MODULES_IOS_LINK) && !hasMarkers(text12, "yaml", LABEL_MODULES_IOS_FLAGS)) {
157261
157261
  throw new Error(`${path2} links modules (${LABEL_MODULES_IOS_LINK}) but has no ${LABEL_MODULES_IOS_FLAGS} block under its project-level settings:, so no module would install. Add the markers (see apps/_template).`);
157262
157262
  }
157263
157263
  }
@@ -157493,8 +157493,8 @@ function genNativeConfig(app, opts = {}) {
157493
157493
  }
157494
157494
  }
157495
157495
  for (const swift of swiftFilesWithModuleMarkers(app)) {
157496
- const text11 = readFileSync65(swift, "utf8");
157497
- if (!hasMarkers(text11, "slash", LABEL_MODULES_SWIFT_IMPORT) || !hasMarkers(text11, "slash", LABEL_MODULES_SWIFT_INSTALL)) {
157496
+ const text12 = readFileSync65(swift, "utf8");
157497
+ if (!hasMarkers(text12, "slash", LABEL_MODULES_SWIFT_IMPORT) || !hasMarkers(text12, "slash", LABEL_MODULES_SWIFT_INSTALL)) {
157498
157498
  throw new Error(`${app}: ${swift} must carry both ${LABEL_MODULES_SWIFT_IMPORT} and ${LABEL_MODULES_SWIFT_INSTALL} markers`);
157499
157499
  }
157500
157500
  files.push(applyToFile(swift, "slash", LABEL_MODULES_SWIFT_IMPORT, renderModulesSwiftImport, check));
@@ -157503,8 +157503,8 @@ function genNativeConfig(app, opts = {}) {
157503
157503
  files.push(...genCapabilityRegistrations(appDir(app), ids, check));
157504
157504
  const rce = declaresRichContentEditor(configTs);
157505
157505
  for (const yml of [iosYml, macosProjectYml(app)]) {
157506
- const text11 = existsSync56(yml) ? readFileSync65(yml, "utf8") : "";
157507
- const r3 = applyToFile(yml, "yaml", LABEL_LOCALWEB, renderLocalWebYaml(resourcesDirOf(text11), rce), check);
157506
+ const text12 = existsSync56(yml) ? readFileSync65(yml, "utf8") : "";
157507
+ const r3 = applyToFile(yml, "yaml", LABEL_LOCALWEB, renderLocalWebYaml(resourcesDirOf(text12), rce), check);
157508
157508
  if (existsSync56(yml)) assertLocalWebBlockLanded(app, rce, yml, r3.outcome);
157509
157509
  files.push(r3);
157510
157510
  }
@@ -158518,8 +158518,8 @@ function renderBase44Types(entities, app) {
158518
158518
  for (const f2 of fields) body.push(` ${key2(f2.key)}${required3.has(f2.key) ? "" : "?"}: ${fieldType(f2)};`);
158519
158519
  body.push("};", `export const ${name} = entities<${name}Row>(${JSON.stringify(physicalEntityName(e2, app))});`);
158520
158520
  }
158521
- const text11 = body.join("\n");
158522
- const types = ["Json", "JsonObject"].filter((t2) => new RegExp(`\\b${t2}\\b`).test(text11)).map((t2) => `type ${t2}`);
158521
+ const text12 = body.join("\n");
158522
+ const types = ["Json", "JsonObject"].filter((t2) => new RegExp(`\\b${t2}\\b`).test(text12)).map((t2) => `type ${t2}`);
158523
158523
  if (usable.length) L2.push(`import { ${["entities", ...types].join(", ")} } from "@himalaya/base44";`);
158524
158524
  return [...L2, ...body].join("\n") + "\n";
158525
158525
  }
@@ -158531,14 +158531,14 @@ async function declaredEntities(dir) {
158531
158531
  async function writeBase44Types(dir, app) {
158532
158532
  const list2 = await declaredEntities(dir);
158533
158533
  if (!list2?.length) throw new Base44TypesError("no_base44_entities", "config.ts declares no base44.entities \u2014 nothing to type. Declare them (or run `himi base44 adopt`) first.");
158534
- const text11 = renderBase44Types(list2, app);
158534
+ const text12 = renderBase44Types(list2, app);
158535
158535
  const path2 = join57(dir, BASE44_TYPES_PATH);
158536
- const changed = !existsSync58(path2) || readFileSync67(path2, "utf8") !== text11;
158536
+ const changed = !existsSync58(path2) || readFileSync67(path2, "utf8") !== text12;
158537
158537
  if (changed) {
158538
158538
  mkdirSync26(dirname33(path2), { recursive: true });
158539
- writeFileSync22(path2, text11);
158539
+ writeFileSync22(path2, text12);
158540
158540
  }
158541
- return { path: path2, changed, entities: text11.split("\nexport const ").length - 1 };
158541
+ return { path: path2, changed, entities: text12.split("\nexport const ").length - 1 };
158542
158542
  }
158543
158543
  async function base44TypesIssues(dir, app, strict) {
158544
158544
  const path2 = join57(dir, BASE44_TYPES_PATH);
@@ -159505,8 +159505,8 @@ function isNoneEntry(entry) {
159505
159505
  const head = entryHead(entry);
159506
159506
  return NONE.test(entry) || head !== "" && NONE.test(head);
159507
159507
  }
159508
- function parseDataAccess(text11, from) {
159509
- const body = text11.replace(/<!--[\s\S]*?(?:-->|$)/g, "");
159508
+ function parseDataAccess(text12, from) {
159509
+ const body = text12.replace(/<!--[\s\S]*?(?:-->|$)/g, "");
159510
159510
  const heading = new RegExp(`(?:^|\\n)##[ \\t]+${DATA_ACCESS_HEADING}\\b[^\\n]*([\\s\\S]*?)(?=\\n##[ \\t]|$)`, "i").exec(body);
159511
159511
  if (!heading) return null;
159512
159512
  const lines = heading[1].split("\n").map((l2) => l2.trim()).filter((l2) => l2.startsWith("|"));
@@ -159533,13 +159533,13 @@ function readDataAccess(dir) {
159533
159533
  for (const name of ["SPEC.md", "MOBILE-UX.md"]) {
159534
159534
  const p2 = join63(dir, name);
159535
159535
  if (!existsSync63(p2)) continue;
159536
- let text11;
159536
+ let text12;
159537
159537
  try {
159538
- text11 = readFileSync72(p2, "utf8");
159538
+ text12 = readFileSync72(p2, "utf8");
159539
159539
  } catch {
159540
159540
  continue;
159541
159541
  }
159542
- const plan = parseDataAccess(text11, name);
159542
+ const plan = parseDataAccess(text12, name);
159543
159543
  if (plan) return plan;
159544
159544
  }
159545
159545
  return null;
@@ -159695,7 +159695,7 @@ function readTestConfig(dir) {
159695
159695
  if (input !== void 0 && (!input || typeof input !== "object" || Array.isArray(input) || Object.values(input).some((v2) => typeof v2 !== "string"))) {
159696
159696
  throw new Error(`${TEST_CONFIG_FILE}: journeys[${i2}].input must be an object of string values \u2014 the screen input a nav edge would send, e.g. { "id": "svc-0001" }`);
159697
159697
  }
159698
- if (!Array.isArray(journey.expectText) || !journey.expectText.length || journey.expectText.some((text11) => typeof text11 !== "string" || !text11.trim())) {
159698
+ if (!Array.isArray(journey.expectText) || !journey.expectText.length || journey.expectText.some((text12) => typeof text12 !== "string" || !text12.trim())) {
159699
159699
  throw new Error(`${TEST_CONFIG_FILE}: journeys[${i2}] needs non-empty expectText values that prove a visible result`);
159700
159700
  }
159701
159701
  });
@@ -161385,14 +161385,14 @@ import { join as join69 } from "node:path";
161385
161385
  function mobileUxIssues(dir, strict) {
161386
161386
  const file2 = join69(dir, "MOBILE-UX.md");
161387
161387
  if (!existsSync67(file2)) return [];
161388
- let text11;
161388
+ let text12;
161389
161389
  try {
161390
- text11 = readFileSync77(file2, "utf8");
161390
+ text12 = readFileSync77(file2, "utf8");
161391
161391
  } catch {
161392
161392
  return [];
161393
161393
  }
161394
- if (!text11) return [];
161395
- return mobileUxMarkerFindings(text11, recordedRenderWidths(dir)).map((finding2) => {
161394
+ if (!text12) return [];
161395
+ return mobileUxMarkerFindings(text12, recordedRenderWidths(dir)).map((finding2) => {
161396
161396
  const scaffoldAdvisory = finding2.code === "missing-width-evidence";
161397
161397
  return {
161398
161398
  screen: null,
@@ -163216,12 +163216,12 @@ async function runRemoteFunctionOperation(input) {
163216
163216
  if (input.boCookie) headers2.cookie = input.boCookie;
163217
163217
  if (input.previewToken) headers2["x-himalaya-preview-token"] = input.previewToken;
163218
163218
  const response = await (input.fetchImpl ?? fetch)(url, { method, headers: headers2 });
163219
- const text11 = await response.text();
163219
+ const text12 = await response.text();
163220
163220
  let body;
163221
163221
  try {
163222
- body = JSON.parse(text11);
163222
+ body = JSON.parse(text12);
163223
163223
  } catch {
163224
- body = text11;
163224
+ body = text12;
163225
163225
  }
163226
163226
  return { ok: response.ok, status: response.status, body };
163227
163227
  }
@@ -164325,18 +164325,18 @@ function walkSource(dir, root = dir) {
164325
164325
  const ext = entry.name.slice(entry.name.lastIndexOf("."));
164326
164326
  if (!SOURCE_EXTENSIONS.has(ext)) continue;
164327
164327
  const absolute = join77(dir, entry.name);
164328
- const text11 = readText2(absolute);
164329
- if (text11 !== null) found.push({ path: relative15(root, absolute), text: text11 });
164328
+ const text12 = readText2(absolute);
164329
+ if (text12 !== null) found.push({ path: relative15(root, absolute), text: text12 });
164330
164330
  }
164331
164331
  return found;
164332
164332
  }
164333
- function blankMatrixRows(text11) {
164334
- const acceptance = mobileUxSection(mobileUxDocumentBody(text11), "Implementation acceptance") ?? "";
164333
+ function blankMatrixRows(text12) {
164334
+ const acceptance = mobileUxSection(mobileUxDocumentBody(text12), "Implementation acceptance") ?? "";
164335
164335
  return /\|\s*(?:Ready|Empty|Add\s*\/\s*edit|Saved\s*\/\s*completed|Error\s*\/\s*recovery)\s*\|\s*\|\s*\|\s*\|\s*\|/i.test(acceptance);
164336
164336
  }
164337
164337
  function usesAppNetwork(source) {
164338
- const code = (text11) => text11.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/[^\n]*/g, "");
164339
- return source.some(({ text: text11 }) => /\bwixApi\b|(?:from|import)\s*["']@(?:himalaya|wix\/himalaya)\/wix-[^"']+["']/.test(code(text11)));
164338
+ const code = (text12) => text12.replace(/\/\*[\s\S]*?\*\//g, "").replace(/\/\/[^\n]*/g, "");
164339
+ return source.some(({ text: text12 }) => /\bwixApi\b|(?:from|import)\s*["']@(?:himalaya|wix\/himalaya)\/wix-[^"']+["']/.test(code(text12)));
164340
164340
  }
164341
164341
  function auditUx(content, strict = false) {
164342
164342
  const dir = resolve62(content);
@@ -168019,24 +168019,24 @@ async function readCapped(res, maxChars) {
168019
168019
  return null;
168020
168020
  }
168021
168021
  if (!res.body) {
168022
- const text12 = await res.text();
168023
- return text12.length > maxChars ? null : text12;
168022
+ const text13 = await res.text();
168023
+ return text13.length > maxChars ? null : text13;
168024
168024
  }
168025
168025
  const reader = res.body.getReader();
168026
168026
  const decoder = new TextDecoder();
168027
- let text11 = "";
168027
+ let text12 = "";
168028
168028
  for (; ; ) {
168029
168029
  const { done, value: value2 } = await reader.read();
168030
168030
  if (done) break;
168031
- text11 += decoder.decode(value2, { stream: true });
168032
- if (text11.length > maxChars) {
168031
+ text12 += decoder.decode(value2, { stream: true });
168032
+ if (text12.length > maxChars) {
168033
168033
  await reader.cancel().catch(() => {
168034
168034
  });
168035
168035
  return null;
168036
168036
  }
168037
168037
  }
168038
- text11 += decoder.decode();
168039
- return text11.length > maxChars ? null : text11;
168038
+ text12 += decoder.decode();
168039
+ return text12.length > maxChars ? null : text12;
168040
168040
  }
168041
168041
  async function memberForwardCall(match, body, memberToken, fetchImpl = fetch, extraHeaders = {}) {
168042
168042
  const headers2 = { Accept: "application/json", ...extraHeaders };
@@ -168051,9 +168051,9 @@ async function memberForwardCall(match, body, memberToken, fetchImpl = fetch, ex
168051
168051
  credentials: "omit",
168052
168052
  signal: AbortSignal.timeout(FORWARD_TIMEOUT_MS)
168053
168053
  });
168054
- const text11 = await readCapped(res, MAX_RESPONSE_CHARS);
168055
- if (text11 === null) return { ok: false, code: "forward_too_large" };
168056
- return { ok: true, status: res.status, body: text11 };
168054
+ const text12 = await readCapped(res, MAX_RESPONSE_CHARS);
168055
+ if (text12 === null) return { ok: false, code: "forward_too_large" };
168056
+ return { ok: true, status: res.status, body: text12 };
168057
168057
  } catch {
168058
168058
  return { ok: false, code: "forward_failed" };
168059
168059
  }
@@ -168276,10 +168276,10 @@ async function hostedAuthUrl(req, visitorToken, fetchImpl = fetch) {
168276
168276
  }
168277
168277
  })
168278
168278
  });
168279
- const text11 = await res.text();
168279
+ const text12 = await res.text();
168280
168280
  let parsed = {};
168281
168281
  try {
168282
- parsed = text11 ? JSON.parse(text11) : {};
168282
+ parsed = text12 ? JSON.parse(text12) : {};
168283
168283
  } catch {
168284
168284
  }
168285
168285
  const fullUrl = parsed.redirectSession?.fullUrl;
@@ -168299,10 +168299,10 @@ async function exchangeAuthCode(cfg, code, verifier, fetchImpl = fetch) {
168299
168299
  redirectUri: cfg.redirectUri
168300
168300
  })
168301
168301
  });
168302
- const text11 = await res.text();
168302
+ const text12 = await res.text();
168303
168303
  let parsed = {};
168304
168304
  try {
168305
- parsed = text11 ? JSON.parse(text11) : {};
168305
+ parsed = text12 ? JSON.parse(text12) : {};
168306
168306
  } catch {
168307
168307
  }
168308
168308
  if (res.status !== 200 || !parsed.access_token) throw new Error(`token exchange failed (${res.status})`);
@@ -169923,11 +169923,11 @@ async function localizeConfigResponse(res, kind, header) {
169923
169923
  header
169924
169924
  )
169925
169925
  };
169926
- const text11 = JSON.stringify(next);
169926
+ const text12 = JSON.stringify(next);
169927
169927
  const headers2 = new Headers(res.headers);
169928
169928
  headers2.delete("etag");
169929
- headers2.set("content-length", String(new TextEncoder().encode(text11).length));
169930
- return new Response(text11, { status: 200, headers: headers2 });
169929
+ headers2.set("content-length", String(new TextEncoder().encode(text12).length));
169930
+ return new Response(text12, { status: 200, headers: headers2 });
169931
169931
  }
169932
169932
  function makeRunHandler(opts) {
169933
169933
  const mount = opts.chrome === "app" ? "/app" : "/preview";
@@ -170136,8 +170136,8 @@ var init_node_adapter = __esm({
170136
170136
  function authConfigOf(appConfig) {
170137
170137
  if (!appConfig) return void 0;
170138
170138
  try {
170139
- const text11 = typeof appConfig === "string" ? appConfig : new TextDecoder().decode(appConfig);
170140
- return JSON.parse(text11)?.authConfig ?? void 0;
170139
+ const text12 = typeof appConfig === "string" ? appConfig : new TextDecoder().decode(appConfig);
170140
+ return JSON.parse(text12)?.authConfig ?? void 0;
170141
170141
  } catch {
170142
170142
  return void 0;
170143
170143
  }
@@ -170514,16 +170514,16 @@ async function releasePayloadFromDir(root, app, header) {
170514
170514
  const manifest2 = await store.getManifest(app);
170515
170515
  if (!manifest2) throw new Error(`no release manifest for ${app} under ${root}`);
170516
170516
  const b64 = (b2) => b2 ? Buffer.from(b2).toString("base64") : void 0;
170517
- const text11 = (b2) => b2 ? new TextDecoder().decode(b2) : void 0;
170517
+ const text12 = (b2) => b2 ? new TextDecoder().decode(b2) : void 0;
170518
170518
  const screens = {};
170519
170519
  const docs = {};
170520
170520
  const addDoc = async (hash2) => {
170521
170521
  if (!hash2 || docs[hash2] !== void 0) return;
170522
- const d2 = text11(await store.getDoc?.(app, hash2) ?? null);
170522
+ const d2 = text12(await store.getDoc?.(app, hash2) ?? null);
170523
170523
  if (d2 !== void 0) docs[hash2] = d2;
170524
170524
  };
170525
170525
  for (const [id, meta] of Object.entries(manifest2.screens ?? {})) {
170526
- const s2 = text11(await store.getScreen(app, id));
170526
+ const s2 = text12(await store.getScreen(app, id));
170527
170527
  if (s2 !== void 0) screens[id] = s2;
170528
170528
  await addDoc(meta.descriptorHash);
170529
170529
  }
@@ -170544,10 +170544,10 @@ async function releasePayloadFromDir(root, app, header) {
170544
170544
  }
170545
170545
  const widgets = {};
170546
170546
  for (const id of Object.keys(manifest2.widgets ?? {})) {
170547
- const w2 = text11(await store.getWidget?.(app, id) ?? null);
170547
+ const w2 = text12(await store.getWidget?.(app, id) ?? null);
170548
170548
  if (w2 !== void 0) widgets[id] = w2;
170549
170549
  }
170550
- const appConfig = text11(await store.getAppConfig(app));
170550
+ const appConfig = text12(await store.getAppConfig(app));
170551
170551
  const wixClientId = appConfigWixClientId(appConfig);
170552
170552
  return {
170553
170553
  app,
@@ -170557,7 +170557,7 @@ async function releasePayloadFromDir(root, app, header) {
170557
170557
  docs,
170558
170558
  assets,
170559
170559
  widgets,
170560
- tokens: text11(await store.getTokens(app)),
170560
+ tokens: text12(await store.getTokens(app)),
170561
170561
  appConfig,
170562
170562
  icon: b64(await store.getIcon?.(app) ?? null),
170563
170563
  header,
@@ -170778,6 +170778,164 @@ var init_store_iap_purchases = __esm({
170778
170778
  }
170779
170779
  });
170780
170780
 
170781
+ // src/apple-keys.ts
170782
+ var apple_keys_exports = {};
170783
+ __export(apple_keys_exports, {
170784
+ runAppleKeys: () => runAppleKeys
170785
+ });
170786
+ import { createPublicKey as createPublicKey2 } from "node:crypto";
170787
+ import { readFileSync as readFileSync102, realpathSync as realpathSync13, statSync as statSync25 } from "node:fs";
170788
+ function readKey(flags, kind) {
170789
+ const names2 = kind === "asc" ? ["asc-key-file", "asc-key-id", "asc-issuer-id"] : ["iap-key", "iap-key-id", "iap-issuer-id"];
170790
+ if (names2.every((name) => flags[name] === void 0)) return void 0;
170791
+ const [file2, keyId, issuerId] = names2.map((name) => text8(flags[name]));
170792
+ if (!file2 || !keyId || !issuerId) throw new UsageError(`Supply --${names2.join(" --")} together.`);
170793
+ try {
170794
+ const path2 = realpathSync13(file2);
170795
+ assertCredentialOutsideRepo(names2[0], path2);
170796
+ if (statSync25(path2).size > 16384) throw new Error("oversized");
170797
+ const key3 = { keyId, issuerId, key: readFileSync102(path2, "utf8") };
170798
+ if (!isAppStoreConnectKey(key3)) throw new Error("invalid key");
170799
+ return key3;
170800
+ } catch {
170801
+ throw new UsageError(`Invalid ${kind.toUpperCase()} key: use a P-256 PKCS#8 .p8 file outside the repository, a 10-character key ID, and a UUID issuer ID.`);
170802
+ }
170803
+ }
170804
+ function publicKeyBytes(key3) {
170805
+ return createPublicKey2(key3).export({ type: "spki", format: "der" });
170806
+ }
170807
+ async function ascRequest(session, input, fetchImpl) {
170808
+ if (credentialHostRefusal(session.target.control)) throw new Error("insecure target");
170809
+ const base = session.target.control.replace(/\/$/, "");
170810
+ const query = new URLSearchParams({ app: input.app, site: input.site });
170811
+ const response = await fetchImpl(`${base}/v1/admin/store/asc-key${input.key ? "" : `?${query}`}`, {
170812
+ method: input.key ? "POST" : "GET",
170813
+ redirect: "error",
170814
+ signal: AbortSignal.timeout(6e4),
170815
+ headers: {
170816
+ Authorization: session.wixToken,
170817
+ "x-control-token": session.controlToken,
170818
+ ...session.previewTag ? { "x-wix-route-serve": session.previewTag } : {},
170819
+ ...input.key ? { "content-type": "application/json" } : {}
170820
+ },
170821
+ ...input.key ? { body: JSON.stringify({ app: input.app, site: input.site, appStoreConnect: input.key }) } : {}
170822
+ });
170823
+ if (!response.ok) throw new Error("ASC request failed");
170824
+ const body = await response.json();
170825
+ if (body.ok !== true || typeof body.asc?.present !== "boolean") throw new Error("invalid status");
170826
+ return {
170827
+ present: body.asc.present,
170828
+ ...typeof body.asc.keyId === "string" ? { keyId: body.asc.keyId } : {},
170829
+ ...typeof body.asc.issuerId === "string" ? { issuerId: body.asc.issuerId } : {}
170830
+ };
170831
+ }
170832
+ async function runAppleKeys(pos, flags, io2, deps = {}) {
170833
+ const completed = [];
170834
+ try {
170835
+ const operation = pos[2];
170836
+ if (operation !== "setup" && operation !== "status") throw new UsageError("Use himi store apple-keys setup|status.");
170837
+ const app = text8(flags.app), site = text8(flags.site)?.toLowerCase(), bundleId = text8(flags["bundle-id"]);
170838
+ if (!app || !site || !bundleId) throw new UsageError("Supply --app <slug> --site <metaSiteId> --bundle-id <id>.");
170839
+ if (!isValidAppId(app) || !/^[0-9a-f]{8}(-[0-9a-f]{4}){3}-[0-9a-f]{12}$/i.test(site) || !/^[A-Za-z0-9-]+(\.[A-Za-z0-9-]+)+$/.test(bundleId)) throw new UsageError("Invalid app, site or bundle ID.");
170840
+ for (const name of ["yes", "dry-run", "json"]) if (flags[name] !== void 0 && typeof flags[name] !== "boolean") throw new UsageError(`--${name} is a boolean flag.`);
170841
+ const setup = operation === "setup", dryRun = flags["dry-run"] === true;
170842
+ if (setup && !dryRun && flags.yes !== true) throw new UsageError("Key setup writes to Wix; pass --yes or preview with --dry-run.");
170843
+ const owner = await (deps.session ?? hostedOwnerSession)(flags);
170844
+ if (!owner.ok) {
170845
+ io2.error(JSON.stringify({ ok: false, code: "owner_session_unavailable", error: owner.error, ...owner.hint ? { hint: owner.hint } : {} }));
170846
+ return owner.exit;
170847
+ }
170848
+ const ascKey = setup ? readKey(flags, "asc") : void 0;
170849
+ const iapKey = setup ? readKey(flags, "iap") : void 0;
170850
+ if (setup && !ascKey && !iapKey) throw new UsageError("Supply an ASC key, an In-App Purchase key, or both. Each needs its own key ID and issuer ID.");
170851
+ if (!setup && Object.keys(flags).some((name) => /^(asc|iap)-(key|issuer)/.test(name))) throw new UsageError("Upload keys with setup, not status.");
170852
+ if (ascKey && iapKey && publicKeyBytes(ascKey.key).equals(publicKeyBytes(iapKey.key))) throw new UsageError("ASC and In-App Purchase require separate keys.");
170853
+ let asc = { present: null, state: "not_checked" };
170854
+ let iap = { present: null, state: "not_checked" };
170855
+ let failed3 = false;
170856
+ if (ascKey || !setup) {
170857
+ try {
170858
+ asc = await ascRequest(owner.session, { app, site, ...ascKey && !dryRun ? { key: ascKey } : {} }, deps.fetchImpl ?? fetch);
170859
+ if (ascKey && !dryRun) {
170860
+ completed.push("asc");
170861
+ if (!asc.present || asc.keyId !== ascKey.keyId || asc.issuerId !== ascKey.issuerId) throw new Error("ASC key not confirmed");
170862
+ }
170863
+ } catch {
170864
+ asc = { present: null, state: "unavailable" };
170865
+ failed3 = true;
170866
+ }
170867
+ }
170868
+ let purchasesAppId = null;
170869
+ if (iapKey || !setup) {
170870
+ try {
170871
+ const api2 = createPurchasesOwnerApi((deps.purchases ?? ((id) => ownerTransport(id, (url, init) => (deps.fetchImpl ?? fetch)(url, { ...init, redirect: "error" }), void 0, userSiteToken)))(site));
170872
+ let purchasesApp = (await api2.listApps()).find((candidate) => candidate.bundleId === bundleId);
170873
+ if (iapKey && !dryRun) {
170874
+ if (!purchasesApp) {
170875
+ try {
170876
+ purchasesApp = await api2.registerApp({ name: text8(flags["display-name"]) ?? app, bundleId });
170877
+ completed.push("purchases_app");
170878
+ } catch (error) {
170879
+ if (refusalCode(error) !== "ALREADY_EXISTS") throw error;
170880
+ purchasesApp = (await api2.listApps()).find((candidate) => candidate.bundleId === bundleId);
170881
+ if (!purchasesApp) throw error;
170882
+ }
170883
+ }
170884
+ purchasesAppId = purchasesApp.id;
170885
+ await api2.setAppleCredentials(purchasesApp.id, { keyId: iapKey.keyId, issuerId: iapKey.issuerId, privateKey: iapKey.key });
170886
+ completed.push("iap");
170887
+ purchasesApp = (await api2.listApps()).find((candidate) => candidate.bundleId === bundleId);
170888
+ if (!purchasesApp?.privateKeyStored) throw new Error("IAP key not confirmed");
170889
+ }
170890
+ iap = { present: purchasesApp?.privateKeyStored === true };
170891
+ purchasesAppId = purchasesApp?.id ?? null;
170892
+ } catch {
170893
+ iap = { present: null, state: "unavailable" };
170894
+ failed3 = true;
170895
+ }
170896
+ }
170897
+ const result = {
170898
+ ok: !failed3,
170899
+ app,
170900
+ site,
170901
+ bundleId,
170902
+ asc,
170903
+ iap,
170904
+ ready: asc.present === true && iap.present === true,
170905
+ purchasesAppId,
170906
+ ...failed3 ? { code: "apple_keys_failed", hint: "Read apple-keys status before retrying; completed writes remain stored." } : {},
170907
+ ...dryRun ? { dryRun: true, planned: [...ascKey ? ["asc"] : [], ...iapKey ? ["iap"] : []] } : {},
170908
+ completed
170909
+ };
170910
+ (failed3 ? io2.error : io2.log)(JSON.stringify(result));
170911
+ return failed3 ? 1 : 0;
170912
+ } catch (error) {
170913
+ const usage = error instanceof UsageError;
170914
+ io2.error(JSON.stringify({
170915
+ ok: false,
170916
+ code: usage ? "invalid_usage" : "apple_keys_failed",
170917
+ completed,
170918
+ ...usage ? { error: error.message } : { hint: "Read apple-keys status before retrying; completed writes remain stored. Check Wix login, site ownership and service availability." }
170919
+ }));
170920
+ return usage ? 2 : 1;
170921
+ }
170922
+ }
170923
+ var text8, UsageError;
170924
+ var init_apple_keys = __esm({
170925
+ "src/apple-keys.ts"() {
170926
+ init_hosted_owner();
170927
+ init_store_iap_purchases();
170928
+ init_wix_owner();
170929
+ init_preflight();
170930
+ init_push_setup_apple_credentials();
170931
+ init_contract();
170932
+ init_credential_hosts();
170933
+ text8 = (value2) => typeof value2 === "string" && value2.trim() ? value2.trim() : void 0;
170934
+ UsageError = class extends Error {
170935
+ };
170936
+ }
170937
+ });
170938
+
170781
170939
  // src/iap-catalog-client.ts
170782
170940
  function createIapCatalogClient(call, route) {
170783
170941
  if (!/^\/(?!\/)[^\s?#]+$/.test(route.prefix)) throw new IapCatalogError("catalog_route_unavailable", "IAP Catalog requires an explicit gateway path");
@@ -171067,7 +171225,7 @@ var init_embedded_bundles = __esm({
171067
171225
  });
171068
171226
 
171069
171227
  // ../store-release/register-bundle.ts
171070
- import { readFileSync as readFileSync102 } from "node:fs";
171228
+ import { readFileSync as readFileSync103 } from "node:fs";
171071
171229
  import { createPrivateKey as createPrivateKey4, sign as sign2 } from "node:crypto";
171072
171230
  function b64url3(b2) {
171073
171231
  return Buffer.from(b2).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
@@ -171085,7 +171243,7 @@ function bundleIdBody(identifier, name, platform = "IOS") {
171085
171243
  async function registerBundleId(opts) {
171086
171244
  const env = requireEnv(["ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_KEY_PATH"]);
171087
171245
  assertCredentialOutsideRepo("ASC_KEY_PATH", env.ASC_KEY_PATH);
171088
- const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID, readFileSync102(env.ASC_KEY_PATH, "utf8"), Math.floor(Date.now() / 1e3));
171246
+ const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID, readFileSync103(env.ASC_KEY_PATH, "utf8"), Math.floor(Date.now() / 1e3));
171089
171247
  const res = await fetch(`${ASC_API}/v1/bundleIds`, {
171090
171248
  method: "POST",
171091
171249
  headers: { Authorization: `Bearer ${jwt}`, "Content-Type": "application/json" },
@@ -171095,11 +171253,11 @@ async function registerBundleId(opts) {
171095
171253
  const j2 = await res.json();
171096
171254
  return { status: "created", id: j2.data?.id };
171097
171255
  }
171098
- const text11 = await res.text();
171099
- if (res.status === 409 || /already (exists|in use)|duplicate|ENTITY_ERROR.*identifier/i.test(text11)) {
171256
+ const text12 = await res.text();
171257
+ if (res.status === 409 || /already (exists|in use)|duplicate|ENTITY_ERROR.*identifier/i.test(text12)) {
171100
171258
  return { status: "exists" };
171101
171259
  }
171102
- throw new Error(`POST /v1/bundleIds \u2192 ${res.status}: ${text11.slice(0, 300)}`);
171260
+ throw new Error(`POST /v1/bundleIds \u2192 ${res.status}: ${text12.slice(0, 300)}`);
171103
171261
  }
171104
171262
  async function main() {
171105
171263
  const [app, ...rest] = process.argv.slice(2);
@@ -171115,7 +171273,7 @@ async function main() {
171115
171273
  }
171116
171274
  const ni2 = rest.indexOf("--name");
171117
171275
  const name = ni2 >= 0 ? rest[ni2 + 1] : cfg.app ?? app;
171118
- const yml = readFileSync102(iosProjectYml(app), "utf8");
171276
+ const yml = readFileSync103(iosProjectYml(app), "utf8");
171119
171277
  for (const { id, label: label3 } of [{ id: identifier, label: name }, ...embeddedBundles(yml).map((b2) => ({
171120
171278
  id: embeddedBundleId(identifier, b2),
171121
171279
  label: `${name} ${embeddedAppIdLabel(b2)}`
@@ -171352,9 +171510,9 @@ var init_iap_client = __esm({
171352
171510
  retryAfterMs(response.headers.get("retry-after"), this.now())
171353
171511
  );
171354
171512
  }
171355
- scrub(text11) {
171513
+ scrub(text12) {
171356
171514
  const { keyId, issuerId, privateKeyPem } = this.options.key;
171357
- let out2 = text11;
171515
+ let out2 = text12;
171358
171516
  for (const literal of [this.token?.value, privateKeyPem, issuerId, keyId]) {
171359
171517
  if (literal) out2 = out2.split(literal).join("[redacted]");
171360
171518
  }
@@ -171524,19 +171682,19 @@ var init_iap_api = __esm({
171524
171682
  });
171525
171683
  return toVersion(requireSingle(doc, "in-app purchase version"));
171526
171684
  }
171527
- async createLocalization(versionId, text11) {
171685
+ async createLocalization(versionId, text12) {
171528
171686
  const doc = await this.client.post("/v2/inAppPurchaseLocalizations", {
171529
171687
  data: {
171530
171688
  type: "inAppPurchaseLocalizations",
171531
- attributes: { locale: text11.locale, name: text11.name, description: text11.description },
171689
+ attributes: { locale: text12.locale, name: text12.name, description: text12.description },
171532
171690
  relationships: { version: related("inAppPurchaseVersions", versionId) }
171533
171691
  }
171534
171692
  });
171535
171693
  return toLocalization(requireSingle(doc, "localization"));
171536
171694
  }
171537
- async updateLocalization(localizationId, text11) {
171695
+ async updateLocalization(localizationId, text12) {
171538
171696
  const doc = await this.client.patch(`/v2/inAppPurchaseLocalizations/${enc(localizationId)}`, {
171539
- data: { type: "inAppPurchaseLocalizations", id: localizationId, attributes: { name: text11.name, description: text11.description } }
171697
+ data: { type: "inAppPurchaseLocalizations", id: localizationId, attributes: { name: text12.name, description: text12.description } }
171540
171698
  });
171541
171699
  return toLocalization(requireSingle(doc, "localization"));
171542
171700
  }
@@ -171769,9 +171927,9 @@ function createCatalogIapApi(client2, appId2) {
171769
171927
  const checkedApp = async (appleAppId) => {
171770
171928
  const reply = await client2.readAppleApp(appId2);
171771
171929
  if (reply.appleAppId !== appleAppId || reply.resource.id !== appleAppId) throw new Error("Catalog's verified Apple app differs from the manifest");
171772
- return { id: reply.resource.id, bundleId: text8(reply.resource, "bundleId") };
171930
+ return { id: reply.resource.id, bundleId: text9(reply.resource, "bundleId") };
171773
171931
  };
171774
- const points = async (id, territory) => (await client2.listResources(appId2, "PRICE_POINT", { inAppPurchaseId: id, territory })).resources.map((point) => ({ id: point.id, customerPrice: text8(point, "customerPrice") }));
171932
+ const points = async (id, territory) => (await client2.listResources(appId2, "PRICE_POINT", { inAppPurchaseId: id, territory })).resources.map((point) => ({ id: point.id, customerPrice: text9(point, "customerPrice") }));
171775
171933
  const desired = (item) => ({ localizations: item.localizations, price: selection(item.price), territories: item.territories });
171776
171934
  const mapping = async (item) => {
171777
171935
  const rule = item.wix && !item.unlocks?.length ? APPLE_PROVISIONING_RULES[item.wix.entityType] : void 0;
@@ -171850,7 +172008,7 @@ function createCatalogIapApi(client2, appId2) {
171850
172008
  },
171851
172009
  readApp: checkedApp,
171852
172010
  findBundles: async () => missing2("bundle-verification (performed on the server)"),
171853
- listTerritories: async () => (await client2.listResources(appId2, "TERRITORY")).resources.map((r3) => ({ id: r3.id, currency: text8(r3, "currency") })),
172011
+ listTerritories: async () => (await client2.listResources(appId2, "TERRITORY")).resources.map((r3) => ({ id: r3.id, currency: text9(r3, "currency") })),
171854
172012
  listProducts: async (appleAppId) => {
171855
172013
  const reply = await client2.listInAppPurchases(appId2);
171856
172014
  if (reply.appleAppId !== appleAppId) throw new Error("Catalog returned products for another Apple app");
@@ -171908,17 +172066,17 @@ function createCatalogIapApi(client2, appId2) {
171908
172066
  deleteReviewScreenshot: async () => missing2("review-screenshot/delete")
171909
172067
  };
171910
172068
  }
171911
- var text8, product, version3, localization;
172069
+ var text9, product, version3, localization;
171912
172070
  var init_iap_catalog_api = __esm({
171913
172071
  "../store-release/iap-catalog-api.ts"() {
171914
172072
  init_wix_payments_contract();
171915
172073
  init_iap_catalog_client();
171916
172074
  init_store_iap_purchases();
171917
172075
  init_iap_api();
171918
- text8 = (resource, key3) => typeof resource.attributes[key3] === "string" ? resource.attributes[key3] : "";
171919
- product = (resource) => ({ id: resource.id, productId: text8(resource, "productId"), referenceName: text8(resource, "name"), type: text8(resource, "inAppPurchaseType"), state: text8(resource, "state") });
171920
- version3 = (resource) => ({ id: resource.id, state: text8(resource, "state"), ...typeof resource.attributes.version === "number" ? { version: resource.attributes.version } : {} });
171921
- localization = (resource) => ({ id: resource.id, locale: text8(resource, "locale"), name: text8(resource, "name"), description: text8(resource, "description") });
172076
+ text9 = (resource, key3) => typeof resource.attributes[key3] === "string" ? resource.attributes[key3] : "";
172077
+ product = (resource) => ({ id: resource.id, productId: text9(resource, "productId"), referenceName: text9(resource, "name"), type: text9(resource, "inAppPurchaseType"), state: text9(resource, "state") });
172078
+ version3 = (resource) => ({ id: resource.id, state: text9(resource, "state"), ...typeof resource.attributes.version === "number" ? { version: resource.attributes.version } : {} });
172079
+ localization = (resource) => ({ id: resource.id, locale: text9(resource, "locale"), name: text9(resource, "name"), description: text9(resource, "description") });
171922
172080
  }
171923
172081
  });
171924
172082
 
@@ -172026,8 +172184,8 @@ function reportDuplicateMappings(reader, items) {
172026
172184
  reader.duplicates(items.flatMap((i2) => [i2.entitlement, ...(i2.unlocks ?? []).map((u2) => u2.entitlement)]), "items", "entitlement");
172027
172185
  reader.duplicates(items.map((i2) => i2.referenceName), "items", "referenceName");
172028
172186
  }
172029
- function looksLikeCredential(text11) {
172030
- return CREDENTIAL_SHAPES.some((shape) => shape.test(text11));
172187
+ function looksLikeCredential(text12) {
172188
+ return CREDENTIAL_SHAPES.some((shape) => shape.test(text12));
172031
172189
  }
172032
172190
  function reportCredentialMaterial(reader, value2, path2) {
172033
172191
  if (typeof value2 === "string") {
@@ -172040,15 +172198,15 @@ function reportCredentialMaterial(reader, value2, path2) {
172040
172198
  for (const [key3, v2] of Object.entries(value2)) reportCredentialMaterial(reader, v2, childPath(path2, key3));
172041
172199
  }
172042
172200
  }
172043
- function parseJson3(text11, label3) {
172201
+ function parseJson3(text12, label3) {
172044
172202
  try {
172045
- return JSON.parse(text11);
172203
+ return JSON.parse(text12);
172046
172204
  } catch (e2) {
172047
172205
  throw new Error(`${label3} is not valid JSON: ${e2.message}`);
172048
172206
  }
172049
172207
  }
172050
- function parseIapManifest(text11, label3) {
172051
- const doc = parseJson3(text11, label3);
172208
+ function parseIapManifest(text12, label3) {
172209
+ const doc = parseJson3(text12, label3);
172052
172210
  const reader = new ManifestReader();
172053
172211
  const obj7 = reader.object(doc, "", MANIFEST_KEYS);
172054
172212
  if (obj7.manifestVersion !== 1) reader.problems.push("manifestVersion must be 1");
@@ -172996,9 +173154,9 @@ async function ensure(spec, sleep) {
172996
173154
  }
172997
173155
  }
172998
173156
  function textFor(item, locale) {
172999
- const text11 = item.localizations.find((l2) => l2.locale === locale);
173000
- if (!text11) throw new Error(`no ${locale} localization in the manifest for ${item.productId}`);
173001
- return text11;
173157
+ const text12 = item.localizations.find((l2) => l2.locale === locale);
173158
+ if (!text12) throw new Error(`no ${locale} localization in the manifest for ${item.productId}`);
173159
+ return text12;
173002
173160
  }
173003
173161
  async function findProduct(api2, appId2, productId) {
173004
173162
  return (await api2.listProducts(appId2)).find((p2) => p2.productId === productId);
@@ -173057,14 +173215,14 @@ async function deleteLeftoverScreenshot(context, resourceId) {
173057
173215
  }
173058
173216
  async function upsertManagedLocalization(run2, locale, context) {
173059
173217
  const resourceId = required(run2.resourceId, "the product id");
173060
- const text11 = textFor(run2.item, locale);
173218
+ const text12 = textFor(run2.item, locale);
173061
173219
  const { api: api2, sleep } = context;
173062
173220
  const find2 = async () => {
173063
173221
  const version5 = await findDraft(api2, resourceId);
173064
- const localization2 = version5 && await findLocalization(api2, version5.id, locale, text11);
173222
+ const localization2 = version5 && await findLocalization(api2, version5.id, locale, text12);
173065
173223
  return version5 && localization2 ? { version: version5, localization: localization2, outcome: "ALREADY_APPLIED" } : void 0;
173066
173224
  };
173067
- const { value: value2, state } = await ensure({ write: () => api2.managed.upsertLocalization(resourceId, text11), find: find2 }, sleep);
173225
+ const { value: value2, state } = await ensure({ write: () => api2.managed.upsertLocalization(resourceId, text12), find: find2 }, sleep);
173068
173226
  run2.versionId = value2.version.id;
173069
173227
  return { state: value2.outcome === "ALREADY_APPLIED" ? "reconciled" : state, resourceId: value2.localization.id };
173070
173228
  }
@@ -173089,16 +173247,16 @@ function operationRunners(context, manifest2) {
173089
173247
  createLocalization: async (run2, op) => {
173090
173248
  if (api2.managed) return upsertManagedLocalization(run2, op.locale, context);
173091
173249
  const versionId = required(run2.versionId, "the draft version");
173092
- const text11 = textFor(run2.item, op.locale);
173093
- const { value: value2, state } = await ensure({ write: () => api2.createLocalization(versionId, text11), find: () => findLocalization(api2, versionId, text11.locale) }, sleep);
173250
+ const text12 = textFor(run2.item, op.locale);
173251
+ const { value: value2, state } = await ensure({ write: () => api2.createLocalization(versionId, text12), find: () => findLocalization(api2, versionId, text12.locale) }, sleep);
173094
173252
  return { state, resourceId: value2.id };
173095
173253
  },
173096
173254
  updateLocalization: async (run2, op) => {
173097
173255
  if (api2.managed) return upsertManagedLocalization(run2, op.locale, context);
173098
173256
  const versionId = required(run2.versionId, "the draft version");
173099
- const text11 = textFor(run2.item, op.locale);
173100
- const localizationId = required(run2.localizations.find((l2) => l2.locale === text11.locale)?.id, `the ${text11.locale} localization`);
173101
- const { value: value2, state } = await ensure({ write: () => api2.updateLocalization(localizationId, text11), find: () => findLocalization(api2, versionId, text11.locale, text11) }, sleep);
173257
+ const text12 = textFor(run2.item, op.locale);
173258
+ const localizationId = required(run2.localizations.find((l2) => l2.locale === text12.locale)?.id, `the ${text12.locale} localization`);
173259
+ const { value: value2, state } = await ensure({ write: () => api2.updateLocalization(localizationId, text12), find: () => findLocalization(api2, versionId, text12.locale, text12) }, sleep);
173102
173260
  return { state, resourceId: value2.id };
173103
173261
  },
173104
173262
  setPrice: async (run2) => {
@@ -173351,7 +173509,7 @@ __export(credential_profile_exports, {
173351
173509
  profilePath: () => profilePath,
173352
173510
  resolveStoreCredentials: () => resolveStoreCredentials
173353
173511
  });
173354
- import { existsSync as existsSync90, readFileSync as readFileSync103 } from "node:fs";
173512
+ import { existsSync as existsSync90, readFileSync as readFileSync104 } from "node:fs";
173355
173513
  import { homedir as homedir11 } from "node:os";
173356
173514
  import { join as join95 } from "node:path";
173357
173515
  function credentialsDir(home = homedir11()) {
@@ -173365,10 +173523,10 @@ function profilePath(name, home = homedir11()) {
173365
173523
  }
173366
173524
  return join95(credentialsDir(home), `${name}.json`);
173367
173525
  }
173368
- function parseProfile(text11, label3) {
173526
+ function parseProfile(text12, label3) {
173369
173527
  let doc;
173370
173528
  try {
173371
- doc = JSON.parse(text11);
173529
+ doc = JSON.parse(text12);
173372
173530
  } catch (e2) {
173373
173531
  throw new Error(`${label3} is not valid JSON: ${e2.message}`);
173374
173532
  }
@@ -173394,7 +173552,7 @@ function resolveStoreCredentials(opts) {
173394
173552
  const { app, cfg } = opts;
173395
173553
  const env = opts.env ?? process.env;
173396
173554
  const home = opts.home ?? homedir11();
173397
- const read = opts.readProfile ?? ((p2) => readFileSync103(p2, "utf8"));
173555
+ const read = opts.readProfile ?? ((p2) => readFileSync104(p2, "utf8"));
173398
173556
  const exists = opts.profileExists ?? existsSync90;
173399
173557
  const ios = cfg.ios ?? {};
173400
173558
  const flagName = opts.profileFlag?.trim();
@@ -173461,7 +173619,7 @@ var init_credential_profile = __esm({
173461
173619
 
173462
173620
  // ../store-release/iap-credentials.ts
173463
173621
  import { createHash as createHash45 } from "node:crypto";
173464
- import { existsSync as existsSync91, readFileSync as readFileSync104, realpathSync as realpathSync13 } from "node:fs";
173622
+ import { existsSync as existsSync91, readFileSync as readFileSync105, realpathSync as realpathSync14 } from "node:fs";
173465
173623
  import { homedir as homedir12 } from "node:os";
173466
173624
  function accountFingerprint(keyId, issuerId) {
173467
173625
  return `sha256:${createHash45("sha256").update(`${issuerId}:${keyId}`).digest("hex").slice(0, 16)}`;
@@ -173481,7 +173639,7 @@ function requireExplicitProfile(profileFlag, target) {
173481
173639
  }
173482
173640
  return profile;
173483
173641
  }
173484
- function readKey(path2, profile, readFile3) {
173642
+ function readKey2(path2, profile, readFile3) {
173485
173643
  try {
173486
173644
  return readFile3(path2);
173487
173645
  } catch {
@@ -173498,8 +173656,8 @@ function canonicalKeyPath(path2, profile, realpath) {
173498
173656
  function resolveIapCredentials(options) {
173499
173657
  const { target } = options;
173500
173658
  const home = options.home ?? homedir12();
173501
- const readFile3 = options.readFile ?? ((p2) => readFileSync104(p2, "utf8"));
173502
- const realpath = options.realpath ?? realpathSync13;
173659
+ const readFile3 = options.readFile ?? ((p2) => readFileSync105(p2, "utf8"));
173660
+ const realpath = options.realpath ?? realpathSync14;
173503
173661
  const profile = requireExplicitProfile(options.profileFlag, target);
173504
173662
  const creds = resolveStoreCredentials({
173505
173663
  app: target.himiApp,
@@ -173516,7 +173674,7 @@ function resolveIapCredentials(options) {
173516
173674
  throw new Error(`credential profile "${profile}" is for team "${creds.team}" but the manifest targets team "${target.teamId}".`);
173517
173675
  }
173518
173676
  return {
173519
- key: { keyId: creds.ascKeyId, issuerId: creds.ascIssuerId, privateKeyPem: readKey(creds.ascKeyPath, profile, readFile3) },
173677
+ key: { keyId: creds.ascKeyId, issuerId: creds.ascIssuerId, privateKeyPem: readKey2(creds.ascKeyPath, profile, readFile3) },
173520
173678
  team: creds.team,
173521
173679
  profile,
173522
173680
  fingerprint: accountFingerprint(creds.ascKeyId, creds.ascIssuerId)
@@ -173536,9 +173694,9 @@ var init_iap_credentials = __esm({
173536
173694
 
173537
173695
  // ../store-release/iap-draft.ts
173538
173696
  import { createHash as createHash46 } from "node:crypto";
173539
- function fit(text11, max) {
173540
- const chars = [...text11];
173541
- return chars.length <= max ? text11 : `${chars.slice(0, max - 1).join("").trimEnd()}${ELLIPSIS}`;
173697
+ function fit(text12, max) {
173698
+ const chars = [...text12];
173699
+ return chars.length <= max ? text12 : `${chars.slice(0, max - 1).join("").trimEnd()}${ELLIPSIS}`;
173542
173700
  }
173543
173701
  function plainText2(html) {
173544
173702
  return html.replace(/<[^>]*>/g, " ").replace(/&(amp|nbsp|lt|gt|quot|#39);/g, (entity) => ENTITIES[entity]).replace(/\s+/g, " ").trim();
@@ -173688,7 +173846,7 @@ var init_iap_draft = __esm({
173688
173846
  TIER_DESCRIPTION = "Unlocks one item in the app";
173689
173847
  ELLIPSIS = "\u2026";
173690
173848
  entityKey = (entityType, entityId) => `${entityType}:${entityId}`;
173691
- sha2 = (text11) => createHash46("sha256").update(text11).digest("hex");
173849
+ sha2 = (text12) => createHash46("sha256").update(text12).digest("hex");
173692
173850
  ENTITIES = { "&amp;": "&", "&nbsp;": " ", "&lt;": "<", "&gt;": ">", "&quot;": '"', "&#39;": "'" };
173693
173851
  MAX_SUFFIX = 24;
173694
173852
  ReferenceNames = class {
@@ -173826,7 +173984,7 @@ __export(version_exports, {
173826
173984
  stampTargetVersion: () => stampTargetVersion,
173827
173985
  stampVersionKeys: () => stampVersionKeys
173828
173986
  });
173829
- import { readFileSync as readFileSync105, writeFileSync as writeFileSync35 } from "node:fs";
173987
+ import { readFileSync as readFileSync106, writeFileSync as writeFileSync35 } from "node:fs";
173830
173988
  function readIosVersion(projectYml) {
173831
173989
  const marketing = matchScalar(projectYml, "CFBundleShortVersionString");
173832
173990
  const build3 = matchScalar(projectYml, "CFBundleVersion");
@@ -173973,8 +174131,8 @@ function setAndroidVersion(gradle, v2) {
173973
174131
  function bumpVersion(app, opts) {
173974
174132
  const iosPath = iosProjectYml(app);
173975
174133
  const gradlePath = androidGradle(app);
173976
- const iosYml = readFileSync105(iosPath, "utf8");
173977
- const gradle = readFileSync105(gradlePath, "utf8");
174134
+ const iosYml = readFileSync106(iosPath, "utf8");
174135
+ const gradle = readFileSync106(gradlePath, "utf8");
173978
174136
  const current = readIosVersion(iosYml);
173979
174137
  const next = {
173980
174138
  marketing: opts.marketing ?? current.marketing,
@@ -174007,13 +174165,14 @@ var init_store_spec = __esm({
174007
174165
  "../store-release/store-spec.ts"() {
174008
174166
  init_paths();
174009
174167
  init_version();
174168
+ init_binary_core();
174010
174169
  init_embedded_bundles();
174011
174170
  init_embedded_bundles();
174012
174171
  }
174013
174172
  });
174014
174173
 
174015
174174
  // src/iap-config-edit.ts
174016
- import { existsSync as existsSync92, readFileSync as readFileSync106 } from "node:fs";
174175
+ import { existsSync as existsSync92, readFileSync as readFileSync107 } from "node:fs";
174017
174176
  import { basename as basename25, join as join96 } from "node:path";
174018
174177
  import ts11 from "typescript";
174019
174178
  function bindPurchasesAppInConfig(source, options) {
@@ -174095,14 +174254,14 @@ function withStoreBundle(dir, options) {
174095
174254
  if (options.storeBundleId) return options;
174096
174255
  const path2 = join96(dir, "store", "store.config.yaml");
174097
174256
  if (!existsSync92(path2)) return options;
174098
- const storeBundleId = parseStoreConfig(readFileSync106(path2, "utf8")).ios?.bundleId;
174257
+ const storeBundleId = parseStoreConfig(readFileSync107(path2, "utf8")).ios?.bundleId;
174099
174258
  return storeBundleId ? { ...options, storeBundleId } : options;
174100
174259
  }
174101
174260
  function previewIapConfigEdit(dir, options) {
174102
174261
  const path2 = configEntry(dir);
174103
174262
  if (!path2) return void 0;
174104
174263
  if (isSymlink2(path2)) return { path: path2, changed: false, applied: [], conflicts: [], instructions: [`${basename25(path2)} is a symlink, so it would not be edited: add the purchases app in the file it points to.`] };
174105
- const { changed, applied, conflicts, instructions } = bindPurchasesAppInConfig(readFileSync106(path2, "utf8"), { ...withStoreBundle(dir, options), fileName: basename25(path2) });
174264
+ const { changed, applied, conflicts, instructions } = bindPurchasesAppInConfig(readFileSync107(path2, "utf8"), { ...withStoreBundle(dir, options), fileName: basename25(path2) });
174106
174265
  return { path: path2, changed, applied, conflicts, instructions };
174107
174266
  }
174108
174267
  async function applyIapConfigEdit(dir, options, validate5) {
@@ -174111,7 +174270,7 @@ async function applyIapConfigEdit(dir, options, validate5) {
174111
174270
  const fileName = basename25(path2);
174112
174271
  const refuse7 = (why) => ({ path: path2, changed: false, applied: [], conflicts: [], instructions: [why] });
174113
174272
  if (isSymlink2(path2)) return refuse7(`${fileName} is a symlink, so it was not edited: add the purchases app in the file it points to.`);
174114
- const original = readFileSync106(path2, "utf8");
174273
+ const original = readFileSync107(path2, "utf8");
174115
174274
  const edit = bindPurchasesAppInConfig(original, { ...withStoreBundle(dir, options), fileName });
174116
174275
  const { applied, conflicts, instructions } = edit;
174117
174276
  if (!edit.changed) return { path: path2, changed: false, applied, conflicts, instructions };
@@ -174181,7 +174340,7 @@ function bookingAttendanceOf(raw) {
174181
174340
  const policy = object8(object8(s2.bookingPolicy).participantsPolicy);
174182
174341
  return {
174183
174342
  kind: "bookingsService",
174184
- type: text9(s2.type),
174343
+ type: text10(s2.type),
174185
174344
  capacity: numeric(s2.defaultCapacity),
174186
174345
  maxParticipantsPerBooking: policy.enabled === true ? numeric(policy.maxParticipantsPerBooking) : void 0,
174187
174346
  hidden: boolean3(s2.hidden),
@@ -174190,21 +174349,21 @@ function bookingAttendanceOf(raw) {
174190
174349
  onlineBooking: boolean3(object8(s2.onlineBooking).enabled),
174191
174350
  onlinePayment: boolean3(options.online),
174192
174351
  deposit: options.deposit === true || fixed.deposit !== void 0,
174193
- priceType: text9(payment.rateType),
174194
- amount: text9(price.value),
174195
- currency: text9(price.currency)
174352
+ priceType: text10(payment.rateType),
174353
+ amount: text10(price.value),
174354
+ currency: text10(price.currency)
174196
174355
  };
174197
174356
  }
174198
174357
  function locationType(raw) {
174199
174358
  const location = object8(raw);
174200
- const type = text9(location.type) ?? "UNKNOWN";
174359
+ const type = text10(location.type) ?? "UNKNOWN";
174201
174360
  const addresses = [object8(location.custom).address, location.calculatedAddress].map(object8);
174202
174361
  return type === "CUSTOM" && addresses.every(describesNoPlace) ? ADDRESSLESS_CUSTOM : type;
174203
174362
  }
174204
174363
  function describesNoPlace(address) {
174205
174364
  const parts = ["country", "subdivision", "city", "postalCode", "addressLine", "addressLine2", "streetAddress", "location"];
174206
174365
  if (parts.some((key3) => address[key3] !== void 0 && address[key3] !== "")) return false;
174207
- const description = text9(address.formattedAddress)?.trim() ?? "";
174366
+ const description = text10(address.formattedAddress)?.trim() ?? "";
174208
174367
  return description === "" || ONLINE_LABEL.test(description);
174209
174368
  }
174210
174369
  function ticketAttendanceOf(event, definition) {
@@ -174213,31 +174372,31 @@ function ticketAttendanceOf(event, definition) {
174213
174372
  const pricing = object8(t2.pricingMethod);
174214
174373
  const price = object8(pricing.fixedPrice);
174215
174374
  const registration = object8(e2.registration);
174216
- const type = text9(registration.type) ?? text9(registration.initialType) ?? text9(e2.eventType);
174217
- const status = text9(e2.status) ?? text9(e2.eventStatus);
174375
+ const type = text10(registration.type) ?? text10(registration.initialType) ?? text10(e2.eventType);
174376
+ const status = text10(e2.status) ?? text10(e2.eventStatus);
174218
174377
  return {
174219
174378
  kind: "eventsTicket",
174220
- location: text9(object8(e2.location).type),
174379
+ location: text10(object8(e2.location).type),
174221
174380
  registration: type === "TICKETS" || type === "RSVP_AND_TICKETS" ? "TICKETING" : type,
174222
174381
  eventStatus: status === "SCHEDULED" ? "UPCOMING" : status,
174223
- saleStatus: text9(t2.saleStatus),
174382
+ saleStatus: text10(t2.saleStatus),
174224
174383
  hidden: boolean3(t2.hidden),
174225
- priceType: text9(pricing.pricingType),
174226
- amount: text9(price.value),
174227
- currency: text9(price.currency)
174384
+ priceType: text10(pricing.pricingType),
174385
+ amount: text10(price.value),
174386
+ currency: text10(price.currency)
174228
174387
  };
174229
174388
  }
174230
174389
  function object8(value2) {
174231
174390
  return value2 !== null && typeof value2 === "object" && !Array.isArray(value2) ? value2 : {};
174232
174391
  }
174233
- var ADDRESSLESS_CUSTOM, PHYSICAL_LOCATIONS, ONLINE_LABEL, text9, numeric, boolean3, zeroPrice;
174392
+ var ADDRESSLESS_CUSTOM, PHYSICAL_LOCATIONS, ONLINE_LABEL, text10, numeric, boolean3, zeroPrice;
174234
174393
  var init_attendance_classifier = __esm({
174235
174394
  "../../core/sdk/iap/src/attendance-classifier.ts"() {
174236
174395
  init_wix_payments_contract();
174237
174396
  ADDRESSLESS_CUSTOM = "CUSTOM_WITHOUT_ADDRESS";
174238
174397
  PHYSICAL_LOCATIONS = ["BUSINESS", "CUSTOMER", "CUSTOM", ADDRESSLESS_CUSTOM];
174239
174398
  ONLINE_LABEL = /^(online|virtual)(\s+(class|classes|classroom|course|session|sessions|meeting|lesson|training|workshop|event))?$/i;
174240
- text9 = (value2) => typeof value2 === "string" ? value2 : void 0;
174399
+ text10 = (value2) => typeof value2 === "string" ? value2 : void 0;
174241
174400
  numeric = (value2) => typeof value2 === "number" ? value2 : void 0;
174242
174401
  boolean3 = (value2) => typeof value2 === "boolean" ? value2 : void 0;
174243
174402
  zeroPrice = (value2) => typeof value2 === "string" && /^0+(?:\.0+)?$/.test(value2);
@@ -174250,8 +174409,8 @@ function amountText(value2) {
174250
174409
  return typeof value2 === "string" && value2.trim() ? value2.trim() : void 0;
174251
174410
  }
174252
174411
  function priceOf(amount, currency) {
174253
- const text11 = amountText(amount);
174254
- return text11 && typeof currency === "string" && currency ? { amount: text11, currency } : void 0;
174412
+ const text12 = amountText(amount);
174413
+ return text12 && typeof currency === "string" && currency ? { amount: text12, currency } : void 0;
174255
174414
  }
174256
174415
  function catalogItem(fields) {
174257
174416
  return Object.fromEntries(Object.entries(fields).filter(([, v2]) => v2 !== void 0 && v2 !== "" && v2 !== false));
@@ -174536,12 +174695,12 @@ function credentialsPlan(deps) {
174536
174695
  if (!deps.appleKey && deps.serverKeyOnly) return {
174537
174696
  state: "blocked",
174538
174697
  code: "apple_key_missing",
174539
- detail: "The server has no In-App Purchase key. Complete owner-driven server key onboarding before managed connect; the Branded key bridge is not yet available. An App Store Connect API key cannot replace this credential."
174698
+ detail: "The purchases app has no In-App Purchase key. Run himi store apple-keys setup --app <slug> --site <metaSiteId> --bundle-id <id> --iap-key <AuthKey.p8> --iap-key-id <id> --iap-issuer-id <issuer> --yes, then rerun connect. An App Store Connect API key cannot replace this credential."
174540
174699
  };
174541
174700
  return deps.appleKey ? { state: "planned", detail: "store the In-App Purchase key" } : {
174542
174701
  state: "blocked",
174543
174702
  code: "apple_key_missing",
174544
- detail: "no In-App Purchase key: create one in App Store Connect \u2192 Users and Access \u2192 Integrations \u2192 In-App Purchase, then rerun with --iap-key <AuthKey.p8> --iap-key-id <key id> (an App Store Connect API key is rejected)."
174703
+ detail: "no In-App Purchase key: create one in App Store Connect \u2192 Users and Access \u2192 Integrations \u2192 In-App Purchase, then run himi store apple-keys setup with --iap-key <AuthKey.p8> --iap-key-id <key id> --iap-issuer-id <issuer>, or rerun legacy connect with its key flags (an App Store Connect API key is rejected)."
174545
174704
  };
174546
174705
  }
174547
174706
  async function connectProvider(provider, appId2, apply) {
@@ -174826,8 +174985,8 @@ async function shoot(selected, run2, outDir) {
174826
174985
  function visibleText2(html) {
174827
174986
  return html.replace(/&nbsp;|&#160;|&#xa0;/gi, "\xA0").replace(/&amp;/g, "&");
174828
174987
  }
174829
- function manifestWithScreenshots(text11, shot) {
174830
- const doc = JSON.parse(text11);
174988
+ function manifestWithScreenshots(text12, shot) {
174989
+ const doc = JSON.parse(text12);
174831
174990
  for (const [index, path2] of shot) doc.items[index].reviewScreenshot = path2;
174832
174991
  return `${JSON.stringify(doc, null, 2)}
174833
174992
  `;
@@ -174870,7 +175029,7 @@ var init_store_iap_screenshots = __esm({
174870
175029
  });
174871
175030
 
174872
175031
  // src/store-iap-screenshot-render.ts
174873
- import { existsSync as existsSync93, mkdtempSync as mkdtempSync9, readFileSync as readFileSync107, rmSync as rmSync25 } from "node:fs";
175032
+ import { existsSync as existsSync93, mkdtempSync as mkdtempSync9, readFileSync as readFileSync108, rmSync as rmSync25 } from "node:fs";
174874
175033
  import { tmpdir as tmpdir10 } from "node:os";
174875
175034
  import { join as join98 } from "node:path";
174876
175035
  function renderProblems(render, entityId) {
@@ -174933,7 +175092,7 @@ function createReviewScreenRenderer() {
174933
175092
  async capture(html, contentDir2) {
174934
175093
  const { pngPageHtml: pngPageHtml2, stabilizePngPage: stabilizePngPage2 } = await Promise.resolve().then(() => (init_render_descriptor(), render_descriptor_exports));
174935
175094
  const tokensPath = join98(contentDir2, "tokens.json");
174936
- const tokens2 = existsSync93(tokensPath) ? JSON.parse(readFileSync107(tokensPath, "utf8")) : null;
175095
+ const tokens2 = existsSync93(tokensPath) ? JSON.parse(readFileSync108(tokensPath, "utf8")) : null;
174937
175096
  const { width, height, scale } = REVIEW_SCREENSHOT_FRAME;
174938
175097
  const page = await (await (browser ??= launch())).newPage({ viewport: { width, height }, deviceScaleFactor: scale, colorScheme: "light" });
174939
175098
  try {
@@ -175015,7 +175174,7 @@ __export(store_iap_exports, {
175015
175174
  });
175016
175175
  import { execFileSync as execFileSync8 } from "node:child_process";
175017
175176
  import { randomUUID as randomUUID9 } from "node:crypto";
175018
- import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync40, readFileSync as readFileSync108, realpathSync as realpathSync14, renameSync as renameSync14, rmSync as rmSync26, writeFileSync as writeFileSync36 } from "node:fs";
175177
+ import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync40, readFileSync as readFileSync109, realpathSync as realpathSync15, renameSync as renameSync14, rmSync as rmSync26, writeFileSync as writeFileSync36 } from "node:fs";
175019
175178
  import { homedir as homedir13, hostname as hostname2 } from "node:os";
175020
175179
  import { dirname as dirname49, join as join99, resolve as resolve73 } from "node:path";
175021
175180
  function scrubDeep(value2, scrub) {
@@ -175038,7 +175197,7 @@ function textFlag(flags, name) {
175038
175197
  }
175039
175198
  function requireFlag(flags, name, command) {
175040
175199
  const value2 = textFlag(flags, name);
175041
- if (!value2) throw new UsageError(`store iap ${command} needs --${name} <value>`);
175200
+ if (!value2) throw new UsageError2(`store iap ${command} needs --${name} <value>`);
175042
175201
  return value2;
175043
175202
  }
175044
175203
  function readInput(deps, path2, what) {
@@ -175055,9 +175214,9 @@ function manifestDirOf(manifestPath) {
175055
175214
  return dirname49(resolve73(manifestPath));
175056
175215
  }
175057
175216
  function readPlan(deps, path2) {
175058
- const text11 = readInput(deps, path2, "plan");
175217
+ const text12 = readInput(deps, path2, "plan");
175059
175218
  try {
175060
- return verifyPlan2(JSON.parse(text11));
175219
+ return verifyPlan2(JSON.parse(text12));
175061
175220
  } catch (e2) {
175062
175221
  if (e2 instanceof SyntaxError) throw new Error(`${path2} is not valid JSON: ${e2.message}`);
175063
175222
  throw e2;
@@ -175068,10 +175227,10 @@ function writeJson(deps, out2, path2, value2) {
175068
175227
  `);
175069
175228
  }
175070
175229
  function writePlan(deps, out2, path2, plan) {
175071
- const text11 = `${JSON.stringify(plan, null, 2)}
175230
+ const text12 = `${JSON.stringify(plan, null, 2)}
175072
175231
  `;
175073
- if (out2.carriesSecret(text11)) throw new Error("refusing to write a plan that contains this run's App Store Connect credentials");
175074
- deps.writeFileAtomic(path2, text11);
175232
+ if (out2.carriesSecret(text12)) throw new Error("refusing to write a plan that contains this run's App Store Connect credentials");
175233
+ deps.writeFileAtomic(path2, text12);
175075
175234
  }
175076
175235
  function catalogRoutePrefix(flags, deps) {
175077
175236
  if (flags["catalog-route"] !== void 0 && !textFlag(flags, "catalog-route")) throw new IapCatalogError("catalog_route_unavailable", "--catalog-route needs an explicit gateway path");
@@ -175087,7 +175246,7 @@ function catalogClient(flags, deps, site) {
175087
175246
  }
175088
175247
  function openSession(deps, out2, target, profile, flags = {}) {
175089
175248
  if (flags.managed === true) {
175090
- if (profile) throw new UsageError("--managed cannot be combined with --profile; no profile fallback is supported");
175249
+ if (profile) throw new UsageError2("--managed cannot be combined with --profile; no profile fallback is supported");
175091
175250
  const purchasesAppId = requireFlag(flags, "purchases-app", "managed");
175092
175251
  const identity2 = { mode: "managed", siteId: target.wixSiteId, purchasesAppId };
175093
175252
  const catalogRoute = catalogRoutePrefix(flags, deps);
@@ -175213,7 +175372,7 @@ async function planCommand(flags, deps, out2) {
175213
175372
  function createLimit(flags) {
175214
175373
  const value2 = textFlag(flags, "limit");
175215
175374
  if (value2 === void 0) return void 0;
175216
- if (!/^[1-9]\d*$/.test(value2)) throw new UsageError(`--limit must be a positive whole number (got ${JSON.stringify(value2)})`);
175375
+ if (!/^[1-9]\d*$/.test(value2)) throw new UsageError2(`--limit must be a positive whole number (got ${JSON.stringify(value2)})`);
175217
175376
  return Number(value2);
175218
175377
  }
175219
175378
  async function applyWithLock(deps, plan, session, limit, submitForReview = true) {
@@ -175275,26 +175434,26 @@ async function statusCommand(flags, deps, out2) {
175275
175434
  function draftMode(flags) {
175276
175435
  const value2 = textFlag(flags, "mode") ?? "per-item";
175277
175436
  const mode = DRAFT_MODES[value2];
175278
- if (!mode) throw new UsageError(`--mode must be per-item or tiers (got ${JSON.stringify(value2)})`);
175437
+ if (!mode) throw new UsageError2(`--mode must be per-item or tiers (got ${JSON.stringify(value2)})`);
175279
175438
  return mode;
175280
175439
  }
175281
175440
  function territoriesFlag(flags, base) {
175282
175441
  const territories = (textFlag(flags, "territories") ?? base).split(",").map((t2) => t2.trim().toUpperCase()).filter(Boolean);
175283
175442
  const bad2 = territories.find((t2) => !TERRITORY_CODE.test(t2));
175284
- if (bad2) throw new UsageError(`--territories must be ISO 3166-1 alpha-3 codes such as USA (got ${JSON.stringify(bad2)})`);
175443
+ if (bad2) throw new UsageError2(`--territories must be ISO 3166-1 alpha-3 codes such as USA (got ${JSON.stringify(bad2)})`);
175285
175444
  const duplicate = territories.find((t2, i2) => territories.indexOf(t2) !== i2);
175286
- if (duplicate) throw new UsageError(`--territories: duplicate territory ${duplicate}`);
175287
- if (!territories.includes(base)) throw new UsageError(`--territories must include the base territory ${base}`);
175445
+ if (duplicate) throw new UsageError2(`--territories: duplicate territory ${duplicate}`);
175446
+ if (!territories.includes(base)) throw new UsageError2(`--territories must include the base territory ${base}`);
175288
175447
  return territories;
175289
175448
  }
175290
175449
  function localeFlag(flags) {
175291
175450
  const locale = textFlag(flags, "locale") ?? "en-US";
175292
- if (!LOCALE_CODE.test(locale)) throw new UsageError(`--locale must be a locale such as en-US (got ${JSON.stringify(locale)})`);
175451
+ if (!LOCALE_CODE.test(locale)) throw new UsageError2(`--locale must be a locale such as en-US (got ${JSON.stringify(locale)})`);
175293
175452
  return locale;
175294
175453
  }
175295
175454
  function baseTerritoryFlag(flags) {
175296
175455
  const base = requireFlag(flags, "base-territory", "draft").toUpperCase();
175297
- if (!TERRITORY_CODE.test(base)) throw new UsageError(`--base-territory must be an ISO 3166-1 alpha-3 code such as USA (got ${JSON.stringify(base)})`);
175456
+ if (!TERRITORY_CODE.test(base)) throw new UsageError2(`--base-territory must be an ISO 3166-1 alpha-3 code such as USA (got ${JSON.stringify(base)})`);
175298
175457
  return base;
175299
175458
  }
175300
175459
  async function applePriceGrid(session, target, baseTerritory) {
@@ -175374,11 +175533,11 @@ function readInAppPurchaseKey(flags, deps, creds) {
175374
175533
  const path2 = textFlag(flags, "iap-key");
175375
175534
  const keyId = textFlag(flags, "iap-key-id");
175376
175535
  if (!path2 && !keyId) return null;
175377
- if (!path2 || !keyId) throw new UsageError("store iap connect needs --iap-key <AuthKey.p8> and --iap-key-id <id> together");
175378
- if (!/^[A-Z0-9]{10}$/.test(keyId)) throw new UsageError(`--iap-key-id must be the 10-character key id App Store Connect shows, got "${keyId}"`);
175536
+ if (!path2 || !keyId) throw new UsageError2("store iap connect needs --iap-key <AuthKey.p8> and --iap-key-id <id> together");
175537
+ if (!/^[A-Z0-9]{10}$/.test(keyId)) throw new UsageError2(`--iap-key-id must be the 10-character key id App Store Connect shows, got "${keyId}"`);
175379
175538
  let privateKey;
175380
175539
  try {
175381
- assertCredentialOutsideRepo("--iap-key", (deps.realpath ?? realpathSync14)(path2));
175540
+ assertCredentialOutsideRepo("--iap-key", (deps.realpath ?? realpathSync15)(path2));
175382
175541
  privateKey = readInput(deps, path2, "In-App Purchase key");
175383
175542
  } catch (error) {
175384
175543
  throw new KeyError(error.message);
@@ -175429,7 +175588,7 @@ async function connectCommand(flags, deps, out2) {
175429
175588
  return await connectWith(flags, deps, out2);
175430
175589
  } catch (error) {
175431
175590
  if (error instanceof IapCatalogError) return failFrom(error, out2);
175432
- if (error instanceof UsageError) return out2.fail(error.message, { ok: false, code: "invalid_usage", usage: STORE_IAP_USAGE });
175591
+ if (error instanceof UsageError2) return out2.fail(error.message, { ok: false, code: "invalid_usage", usage: STORE_IAP_USAGE });
175433
175592
  if (error instanceof IapManifestError) {
175434
175593
  return out2.fail(`${error.label} is not a valid IAP manifest`, { ok: false, code: "manifest_invalid", problems: error.problems });
175435
175594
  }
@@ -175445,7 +175604,7 @@ async function connectWith(flags, deps, out2) {
175445
175604
  try {
175446
175605
  previewTag = parsePreviewTag(textFlag(flags, "preview-tag") ?? process.env.HIMI_SERVE_PREVIEW_TAG);
175447
175606
  } catch (error) {
175448
- throw new UsageError(error.message);
175607
+ throw new UsageError2(error.message);
175449
175608
  }
175450
175609
  const manifest2 = readManifest2(deps, manifestPath);
175451
175610
  const catalog4 = catalogClient(flags, deps, manifest2.target.wixSiteId);
@@ -175484,7 +175643,7 @@ async function connectWith(flags, deps, out2) {
175484
175643
  return out2.fail(error instanceof Error ? error.message : String(error), { ok: false, code: "request_failed" });
175485
175644
  }
175486
175645
  const expectedApp = textFlag(flags, "purchases-app");
175487
- if (expectedApp && plan.purchasesAppId !== expectedApp) throw new UsageError("--purchases-app differs from the registration for the manifest's bundle on this site");
175646
+ if (expectedApp && plan.purchasesAppId !== expectedApp) throw new UsageError2("--purchases-app differs from the registration for the manifest's bundle on this site");
175488
175647
  let report3 = plan;
175489
175648
  if (!dryRun && writesPlanned(plan)) {
175490
175649
  const confirmed = flags.yes === true;
@@ -175560,8 +175719,8 @@ async function mappingsCommand(flags, deps, out2) {
175560
175719
  const appId2 = requireFlag(flags, "purchases-app", "mappings");
175561
175720
  const productId = textFlag(flags, "product");
175562
175721
  const active = textFlag(flags, "active");
175563
- if (flags.active !== void 0 && active !== "true" && active !== "false") throw new UsageError("--active must be true or false");
175564
- if (productId === void 0 !== (active === void 0)) throw new UsageError("mapping changes require both --product <mapping-id> and --active true|false");
175722
+ if (flags.active !== void 0 && active !== "true" && active !== "false") throw new UsageError2("--active must be true or false");
175723
+ if (productId === void 0 !== (active === void 0)) throw new UsageError2("mapping changes require both --product <mapping-id> and --active true|false");
175565
175724
  const client2 = catalogClient(flags, deps, site);
175566
175725
  if (!productId) {
175567
175726
  out2.print({ ok: true, products: await client2.listProducts(appId2) });
@@ -175604,7 +175763,7 @@ function printScreenshots(out2, report3, manifestPath, dryRun) {
175604
175763
  else if (report3.items.some((i2) => i2.screenshot)) out2.line(` manifest updated: ${manifestPath} \u2014 next: himi store iap plan --manifest ${manifestPath} \u2026 uploads them.`);
175605
175764
  }
175606
175765
  async function screenshotsCommand(flags, deps, out2) {
175607
- if (flags.managed === true) throw new UsageError("Catalog generates review screenshots during apply; local screenshots require explicit legacy --profile mode");
175766
+ if (flags.managed === true) throw new UsageError2("Catalog generates review screenshots during apply; local screenshots require explicit legacy --profile mode");
175608
175767
  const manifestPath = requireFlag(flags, "manifest", "screenshots");
175609
175768
  const contentDir2 = requireFlag(flags, "content", "screenshots");
175610
175769
  const manifestText = readInput(deps, manifestPath, "manifest");
@@ -175630,7 +175789,7 @@ async function screenshotsCommand(flags, deps, out2) {
175630
175789
  appleLocked: (item) => facts.get(item.productId)?.locked,
175631
175790
  appleRead: textFlag(flags, "profile") !== void 0,
175632
175791
  writeBytes: deps.writeBytes ?? writeBinaryFile,
175633
- writeText: (path2, text11) => deps.writeFileAtomic(path2, text11),
175792
+ writeText: (path2, text12) => deps.writeFileAtomic(path2, text12),
175634
175793
  ...only ? { only: new Set(only.split(",").map((id) => id.trim()).filter(Boolean)) } : {},
175635
175794
  ...outDir ? { outDir: resolve73(outDir) } : {},
175636
175795
  force: flags.force === true,
@@ -175666,7 +175825,7 @@ async function runStoreIap(pos, flags, io2, deps) {
175666
175825
  try {
175667
175826
  return await command(flags, deps, out2);
175668
175827
  } catch (e2) {
175669
- if (e2 instanceof UsageError) return out2.fail(e2.message, { usage: STORE_IAP_USAGE, ...flags.managed === true ? { ok: false, code: "invalid_usage" } : {} });
175828
+ if (e2 instanceof UsageError2) return out2.fail(e2.message, { usage: STORE_IAP_USAGE, ...flags.managed === true ? { ok: false, code: "invalid_usage" } : {} });
175670
175829
  return failFrom(e2, out2, flags.managed === true);
175671
175830
  }
175672
175831
  }
@@ -175678,7 +175837,7 @@ function fileJournal(path2) {
175678
175837
  }
175679
175838
  function readLockSummary(path2) {
175680
175839
  try {
175681
- const { pid, host, at: at2 } = JSON.parse(readFileSync108(path2, "utf8"));
175840
+ const { pid, host, at: at2 } = JSON.parse(readFileSync109(path2, "utf8"));
175682
175841
  return `pid ${pid} on ${host} since ${at2}`;
175683
175842
  } catch {
175684
175843
  return "unreadable lock";
@@ -175698,7 +175857,7 @@ function acquireApplyLock(dir, appleAppId) {
175698
175857
  return () => {
175699
175858
  let current = "";
175700
175859
  try {
175701
- current = readFileSync108(path2, "utf8");
175860
+ current = readFileSync109(path2, "utf8");
175702
175861
  } catch {
175703
175862
  return;
175704
175863
  }
@@ -175722,8 +175881,8 @@ async function confirmOnTerminal(question) {
175722
175881
  }
175723
175882
  function defaultStoreIapDeps() {
175724
175883
  return {
175725
- readFile: (path2) => readFileSync108(path2, "utf8"),
175726
- readBytes: (path2) => readFileSync108(path2),
175884
+ readFile: (path2) => readFileSync109(path2, "utf8"),
175885
+ readBytes: (path2) => readFileSync109(path2),
175727
175886
  readBuildIapBinding: (path2) => JSON.parse(execFileSync8("plutil", ["-convert", "json", "-o", "-", resolve73(path2)], { encoding: "utf8" })),
175728
175887
  visitorTransport: async (clientId, siteId) => {
175729
175888
  const [{ mintVisitorToken: mintVisitorToken2 }, { visitorTransportFrom: visitorTransportFrom2 }] = await Promise.all([Promise.resolve().then(() => (init_visitor_auth(), visitor_auth_exports)), Promise.resolve().then(() => (init_rest(), rest_exports))]);
@@ -175747,7 +175906,7 @@ function defaultStoreIapDeps() {
175747
175906
  sleep: (ms2) => new Promise((resolve85) => setTimeout(resolve85, ms2))
175748
175907
  };
175749
175908
  }
175750
- var STORE_IAP_USAGE, SUMMARY_THRESHOLD, SUMMARY_DETAIL_LIMIT, UsageError, CommandOutput, pad, DECISION_ORDER, OUTCOME_ORDER, COMPLETE, DRAFT_MODES, TERRITORY_CODE, LOCALE_CODE, GRID_UNAVAILABLE_NOTE, KeyError, CredentialsError, writesPlanned, COMMANDS2;
175909
+ var STORE_IAP_USAGE, SUMMARY_THRESHOLD, SUMMARY_DETAIL_LIMIT, UsageError2, CommandOutput, pad, DECISION_ORDER, OUTCOME_ORDER, COMPLETE, DRAFT_MODES, TERRITORY_CODE, LOCALE_CODE, GRID_UNAVAILABLE_NOTE, KeyError, CredentialsError, writesPlanned, COMMANDS2;
175751
175910
  var init_store_iap = __esm({
175752
175911
  "src/store-iap.ts"() {
175753
175912
  init_iap_catalog_client();
@@ -175777,7 +175936,7 @@ var init_store_iap = __esm({
175777
175936
  STORE_IAP_USAGE = "himi store iap draft|plan|apply|status|connect|screenshots|check|mappings \u2014 draft --site <msid> (--profile <name> | --purchases-app <id> --catalog-route <path>) --apple-app <id> --bundle <id> --base-territory <ISO3> --out <manifest.json> [--territories <a,b>] [--locale <l>] [--mode per-item|tiers] [--merge <manifest.json>] [--report <file>] \xB7 plan --manifest <file> (--profile <name> | --purchases-app <id> --catalog-route <path>) --out <plan.json> \xB7 apply --plan <plan.json> (--profile <name> | --purchases-app <id> --catalog-route <path>) --out <result.json> [--yes] [--limit <n>] [--no-submit] \xB7 status --manifest <file> (--profile <name> | --purchases-app <id> --catalog-route <path>) [--out <file>] [--refresh-wix] \xB7 connect --manifest <file> [--profile <name>] --catalog-route <path> [--iap-key <AuthKey.p8> --iap-key-id <id>] [--content <dir>] [--preview-tag dp-<tag>] [--dry-run] [--yes] [--out <report.json>] \xB7 screenshots --manifest <file> --content <app dir> --profile <name> [--out-dir <dir>] [--only <productId,\u2026>] [--force] [--dry-run] \xB7 check --manifest <file> --catalog-route <path> [--purchases-app <id>] [--content <dir>] [--plist <built Info.plist>] [--visitor-client <id>] \xB7 mappings --site <msid> --purchases-app <id> --catalog-route <path> [--product <mapping-id> --active true|false --yes] \xB7 Catalog is the default: --purchases-app <id> --catalog-route <path> for Apple reads; --managed is optional. --profile selects direct Apple mode.";
175778
175937
  SUMMARY_THRESHOLD = 50;
175779
175938
  SUMMARY_DETAIL_LIMIT = 20;
175780
- UsageError = class extends Error {
175939
+ UsageError2 = class extends Error {
175781
175940
  };
175782
175941
  CommandOutput = class {
175783
175942
  constructor(io2, json8) {
@@ -175794,8 +175953,8 @@ var init_store_iap = __esm({
175794
175953
  protectKey(key3) {
175795
175954
  this.secrets.push(key3.privateKey, key3.keyId);
175796
175955
  }
175797
- line(text11 = "") {
175798
- this.io.log(this.scrub(text11));
175956
+ line(text12 = "") {
175957
+ this.io.log(this.scrub(text12));
175799
175958
  }
175800
175959
  print(value2) {
175801
175960
  this.io.log(this.serialize(value2));
@@ -175808,11 +175967,11 @@ var init_store_iap = __esm({
175808
175967
  return JSON.stringify(scrubDeep(value2, (t2) => this.scrub(t2)), null, 2);
175809
175968
  }
175810
175969
  /** This run's own key material, raw or JSON-escaped, anywhere in `text`. */
175811
- carriesSecret(text11) {
175812
- return this.secrets.some((secret) => secret && (text11.includes(secret) || text11.includes(JSON.stringify(secret).slice(1, -1))));
175970
+ carriesSecret(text12) {
175971
+ return this.secrets.some((secret) => secret && (text12.includes(secret) || text12.includes(JSON.stringify(secret).slice(1, -1))));
175813
175972
  }
175814
- scrub(text11) {
175815
- let out2 = text11;
175973
+ scrub(text12) {
175974
+ let out2 = text12;
175816
175975
  for (const secret of this.secrets) if (secret) out2 = out2.split(secret).join("[redacted]");
175817
175976
  return scrubString(out2);
175818
175977
  }
@@ -176221,7 +176380,7 @@ __export(preflight_app_exports, {
176221
176380
  profileAccount: () => profileAccount,
176222
176381
  readXcconfigVars: () => readXcconfigVars
176223
176382
  });
176224
- import { readFileSync as readFileSync109, existsSync as existsSync94, readdirSync as readdirSync39, statSync as statSync25 } from "node:fs";
176383
+ import { readFileSync as readFileSync110, existsSync as existsSync94, readdirSync as readdirSync39, statSync as statSync26 } from "node:fs";
176225
176384
  import { createHash as createHash47 } from "node:crypto";
176226
176385
  import { dirname as dirname50, join as join100 } from "node:path";
176227
176386
  function analyze(projectYml, storeConfig, icon, account) {
@@ -176350,7 +176509,7 @@ function readXcconfigVars(iosDir, projectYml) {
176350
176509
  const read = (path2) => {
176351
176510
  if (seen.has(path2) || !existsSync94(path2)) return;
176352
176511
  seen.add(path2);
176353
- for (const raw of readFileSync109(path2, "utf8").split("\n")) {
176512
+ for (const raw of readFileSync110(path2, "utf8").split("\n")) {
176354
176513
  const inc = /^\s*#include\??\s+"([^"]+)"/.exec(raw);
176355
176514
  if (inc) {
176356
176515
  read(join100(dirname50(path2), inc[1]));
@@ -176377,8 +176536,8 @@ function profileAccount(app, storeConfig, opts = {}) {
176377
176536
  }
176378
176537
  }
176379
176538
  async function preflightApp(app, opts = {}) {
176380
- const projectYml = existsSync94(iosProjectYml(app)) ? readFileSync109(iosProjectYml(app), "utf8") : "";
176381
- const storeConfig = existsSync94(storeConfigPath(app)) ? readFileSync109(storeConfigPath(app), "utf8") : "";
176539
+ const projectYml = existsSync94(iosProjectYml(app)) ? readFileSync110(iosProjectYml(app), "utf8") : "";
176540
+ const storeConfig = existsSync94(storeConfigPath(app)) ? readFileSync110(storeConfigPath(app), "utf8") : "";
176382
176541
  const identity = projectYml ? analyzeStoreIdentity(projectYml, storeConfig, readXcconfigVars(join100(appDir(app), "ios"), projectYml)) : [];
176383
176542
  if (!storeConfig) return [{ level: "error", message: `no apps/${app}/store/store.config.yaml \u2014 run /setup-store-signing first.` }, ...identity];
176384
176543
  const findings = analyze(
@@ -176539,7 +176698,7 @@ function playListingAssets(app, locale = "en-US") {
176539
176698
  for (const name of names2) {
176540
176699
  const p2 = join100(dir, name);
176541
176700
  try {
176542
- if (statSync25(p2).isFile()) return { name, bytes: readFileSync109(p2) };
176701
+ if (statSync26(p2).isFile()) return { name, bytes: readFileSync110(p2) };
176543
176702
  } catch {
176544
176703
  }
176545
176704
  }
@@ -176579,7 +176738,7 @@ function listScreenshots(app, locale = "en-US") {
176579
176738
  const flat = join100(storeDir(app), "screenshots", locale);
176580
176739
  if (existsSync94(flat)) {
176581
176740
  for (const png of readdirSync39(flat).filter((n2) => n2.endsWith(".png"))) {
176582
- const sz = pngSize2(readFileSync109(join100(flat, png)));
176741
+ const sz = pngSize2(readFileSync110(join100(flat, png)));
176583
176742
  if (sz) out2.push({ name: png, w: sz.w, h: sz.h });
176584
176743
  }
176585
176744
  }
@@ -176587,9 +176746,9 @@ function listScreenshots(app, locale = "en-US") {
176587
176746
  if (existsSync94(legacy)) {
176588
176747
  for (const deviceDir of readdirSync39(legacy)) {
176589
176748
  const d2 = join100(legacy, deviceDir);
176590
- if (!statSync25(d2).isDirectory()) continue;
176749
+ if (!statSync26(d2).isDirectory()) continue;
176591
176750
  for (const png of readdirSync39(d2).filter((n2) => n2.endsWith(".png"))) {
176592
- const sz = pngSize2(readFileSync109(join100(d2, png)));
176751
+ const sz = pngSize2(readFileSync110(join100(d2, png)));
176593
176752
  if (sz) out2.push({ name: `${deviceDir}/${png}`, w: sz.w, h: sz.h });
176594
176753
  }
176595
176754
  }
@@ -176602,8 +176761,8 @@ function placeholderHashes2() {
176602
176761
  for (const target of readdirSync39(templateIos)) {
176603
176762
  const p2 = join100(templateIos, target, "Assets.xcassets", "AppIcon.appiconset", "icon_1024.png");
176604
176763
  try {
176605
- if (!statSync25(p2).isFile()) continue;
176606
- return [LEGACY_PLACEHOLDER_SHA2562, createHash47("sha256").update(readFileSync109(p2)).digest("hex")];
176764
+ if (!statSync26(p2).isFile()) continue;
176765
+ return [LEGACY_PLACEHOLDER_SHA2562, createHash47("sha256").update(readFileSync110(p2)).digest("hex")];
176607
176766
  } catch {
176608
176767
  }
176609
176768
  }
@@ -176638,8 +176797,8 @@ async function appIconState(iosDir) {
176638
176797
  for (const target of readdirSync39(iosDir)) {
176639
176798
  const p2 = join100(iosDir, target, "Assets.xcassets", "AppIcon.appiconset", "icon_1024.png");
176640
176799
  try {
176641
- if (!statSync25(p2).isFile()) continue;
176642
- const bytes2 = readFileSync109(p2);
176800
+ if (!statSync26(p2).isFile()) continue;
176801
+ const bytes2 = readFileSync110(p2);
176643
176802
  const hash2 = createHash47("sha256").update(bytes2).digest("hex");
176644
176803
  const pixels = await pixelIssues(bytes2);
176645
176804
  return {
@@ -176710,7 +176869,7 @@ __export(asc_status_exports, {
176710
176869
  ascStatus: () => ascStatus,
176711
176870
  buildVerdict: () => buildVerdict
176712
176871
  });
176713
- import { readFileSync as readFileSync110 } from "node:fs";
176872
+ import { readFileSync as readFileSync111 } from "node:fs";
176714
176873
  function buildVerdict(builds) {
176715
176874
  if (!builds.length) {
176716
176875
  return "NO builds registered \u2014 if you uploaded recently and it's been >15 min, the binary was REJECTED IN PROCESSING (reason is email-only; run validate-binary.ts / scan-purpose-strings.ts to reproduce it).";
@@ -176724,7 +176883,7 @@ function buildVerdict(builds) {
176724
176883
  function client(creds) {
176725
176884
  const env = creds ?? requireEnv(["ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_KEY_PATH"]);
176726
176885
  assertCredentialOutsideRepo("ASC_KEY_PATH", env.ASC_KEY_PATH);
176727
- const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID, readFileSync110(env.ASC_KEY_PATH, "utf8"), Math.floor(Date.now() / 1e3));
176886
+ const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID, readFileSync111(env.ASC_KEY_PATH, "utf8"), Math.floor(Date.now() / 1e3));
176728
176887
  return async (path2) => {
176729
176888
  const r3 = await fetch(`${ASC}${path2}`, { headers: { Authorization: `Bearer ${jwt}` } });
176730
176889
  return { status: r3.status, json: await r3.json().catch(() => ({})) };
@@ -177117,7 +177276,7 @@ __export(secrets_exports, {
177117
177276
  runRemoteSecretsCommand: () => runRemoteSecretsCommand,
177118
177277
  runSecretsCommand: () => runSecretsCommand
177119
177278
  });
177120
- import { readFileSync as readFileSync112 } from "node:fs";
177279
+ import { readFileSync as readFileSync113 } from "node:fs";
177121
177280
  function environment(value2) {
177122
177281
  if (value2 === "preview" || value2 === "production") return value2;
177123
177282
  throw new Error("--environment must be preview or production");
@@ -177148,7 +177307,7 @@ async function runSecretsCommand(operation, flags, io2, options = {}) {
177148
177307
  io2.log(JSON.stringify(await vault.list({ app, environment: env })));
177149
177308
  return 0;
177150
177309
  }
177151
- const value2 = options.readValue ? options.readValue() : readFileSync112(0, "utf8").replace(/\r?\n$/, "");
177310
+ const value2 = options.readValue ? options.readValue() : readFileSync113(0, "utf8").replace(/\r?\n$/, "");
177152
177311
  if (operation === "set") await vault.set({ app, environment: env, name, value: value2 });
177153
177312
  else if (operation === "rotate") await vault.rotate({ app, environment: env, name, value: value2 });
177154
177313
  else throw new Error(`unknown secrets operation ${operation}`);
@@ -177177,16 +177336,16 @@ async function runRemoteSecretsCommand(operation, flags, io2, options) {
177177
177336
  }
177178
177337
  let body;
177179
177338
  if (operation !== "list") {
177180
- const value2 = options.readValue ? options.readValue() : readFileSync112(0, "utf8").replace(/\r?\n$/, "");
177339
+ const value2 = options.readValue ? options.readValue() : readFileSync113(0, "utf8").replace(/\r?\n$/, "");
177181
177340
  body = JSON.stringify({ value: value2 });
177182
177341
  }
177183
177342
  const response = await (options.fetchImpl ?? fetch)(url, { method: operation === "list" ? "GET" : operation === "set" ? "PUT" : "POST", headers: headers2, body });
177184
- const text11 = await response.text();
177343
+ const text12 = await response.text();
177185
177344
  let output;
177186
177345
  try {
177187
- output = JSON.parse(text11);
177346
+ output = JSON.parse(text12);
177188
177347
  } catch {
177189
- output = text11;
177348
+ output = text12;
177190
177349
  }
177191
177350
  if (!response.ok) throw new Error(typeof output === "string" ? output : JSON.stringify(output));
177192
177351
  io2.log(JSON.stringify(output));
@@ -177244,9 +177403,9 @@ function headersFor(options) {
177244
177403
  ...options.previewTag ? { "x-wix-route-serve": options.previewTag } : {}
177245
177404
  };
177246
177405
  }
177247
- function objectFrom(text11) {
177406
+ function objectFrom(text12) {
177248
177407
  try {
177249
- const value2 = text11 ? JSON.parse(text11) : null;
177408
+ const value2 = text12 ? JSON.parse(text12) : null;
177250
177409
  return value2 && typeof value2 === "object" && !Array.isArray(value2) ? value2 : null;
177251
177410
  } catch {
177252
177411
  return null;
@@ -177484,12 +177643,12 @@ async function runNotifyPing(flags, io2, deps = {}) {
177484
177643
  const flagError = flagRefusal(flags);
177485
177644
  if (flagError) return refuse6(io2, flagError);
177486
177645
  const allMembers = flags["all-members"] === true;
177487
- if (allMembers && text10(flags["member-email"])) return refuse6(io2, "recipient_conflict", "Choose --all-members or --member-email.");
177646
+ if (allMembers && text11(flags["member-email"])) return refuse6(io2, "recipient_conflict", "Choose --all-members or --member-email.");
177488
177647
  if (allMembers && flags["dry-run"] !== true && flags.yes !== true) return refuse6(io2, "confirmation_required", "Preview with --dry-run, then add --yes to send to every approved member.");
177489
- const input = mergePushInputs(pushInputsFromContent(resolve75(text10(flags.content) ?? process.cwd())), flags);
177490
- const missing3 = [...input.app ? [] : ["app"], ...input.site ? [] : ["site"], ...REQUIRED_FLAGS.filter((f2) => !(allMembers && f2 === "member-email") && !text10(flags[f2]))];
177648
+ const input = mergePushInputs(pushInputsFromContent(resolve75(text11(flags.content) ?? process.cwd())), flags);
177649
+ const missing3 = [...input.app ? [] : ["app"], ...input.site ? [] : ["site"], ...REQUIRED_FLAGS.filter((f2) => !(allMembers && f2 === "member-email") && !text11(flags[f2]))];
177491
177650
  if (missing3.length) return refuse6(io2, "needs_input", "Name the app and site (or --content), the member's login email, a title and a link.", 2, { missing: missing3 });
177492
- const requestId2 = text10(flags["request-id"]) ?? (deps.newRequestId ?? randomUUID10)();
177651
+ const requestId2 = text11(flags["request-id"]) ?? (deps.newRequestId ?? randomUUID10)();
177493
177652
  if (!UUID_RE.test(requestId2)) return refuse6(io2, "invalid_request_id", "Reuse the requestId a previous send printed.");
177494
177653
  const owner = await hostedOwnerSession(flags, deps);
177495
177654
  if (!owner.ok) return refuse6(io2, owner.error, owner.hint, owner.exit);
@@ -177506,10 +177665,10 @@ async function runNotifyPing(flags, io2, deps = {}) {
177506
177665
  const body = {
177507
177666
  app: ownership.slug,
177508
177667
  site: input.site,
177509
- memberEmail: text10(flags["member-email"]),
177510
- title: text10(flags.title),
177511
- ...text10(flags.body) ? { body: text10(flags.body) } : {},
177512
- link: text10(flags.link),
177668
+ memberEmail: text11(flags["member-email"]),
177669
+ title: text11(flags.title),
177670
+ ...text11(flags.body) ? { body: text11(flags.body) } : {},
177671
+ link: text11(flags.link),
177513
177672
  requestId: requestId2,
177514
177673
  ...flags["dry-run"] === true ? { dryRun: true } : {}
177515
177674
  };
@@ -177549,7 +177708,7 @@ async function runAllMembers(args) {
177549
177708
  const code = error instanceof PushSendError ? error.code : error instanceof Error && ROSTER_CODES.has(error.message) ? error.message : "member_lookup_unavailable";
177550
177709
  return refuse6(io2, code, void 0, 1);
177551
177710
  }
177552
- const base = { app: input.app, site: input.site, title: text10(flags.title), ...text10(flags.body) ? { body: text10(flags.body) } : {}, link: text10(flags.link) };
177711
+ const base = { app: input.app, site: input.site, title: text11(flags.title), ...text11(flags.body) ? { body: text11(flags.body) } : {}, link: text11(flags.link) };
177553
177712
  const send2 = (recipient, memberRequestId, dryRun = false) => pushSendRequest({
177554
177713
  target: session.target,
177555
177714
  wixToken: session.wixToken,
@@ -177632,7 +177791,7 @@ function summary(result, sent) {
177632
177791
  }
177633
177792
  return `Ping accepted request ${sent.requestId} for ${sent.memberEmail}. Ping does not confirm delivery: it reaches the member's signed-in devices with notifications allowed.`;
177634
177793
  }
177635
- var LOCAL_SENDER_FLAGS, SWITCHES, REQUIRED_FLAGS, UUID_RE, KNOWN_CODES, ROSTER_CODES, HINTS, text10;
177794
+ var LOCAL_SENDER_FLAGS, SWITCHES, REQUIRED_FLAGS, UUID_RE, KNOWN_CODES, ROSTER_CODES, HINTS, text11;
177636
177795
  var init_notify_ping = __esm({
177637
177796
  "src/notify-ping.ts"() {
177638
177797
  init_push_send();
@@ -177660,7 +177819,7 @@ var init_notify_ping = __esm({
177660
177819
  site_token_invalid: "Run wix login as the site owner; the site token must belong to the app owner's account.",
177661
177820
  ping_permission_denied: "Himi Serve is not permitted to send through Ping; this is a platform issue, not your setup."
177662
177821
  };
177663
- text10 = (v2) => typeof v2 === "string" && v2.length > 0 ? v2 : void 0;
177822
+ text11 = (v2) => typeof v2 === "string" && v2.length > 0 ? v2 : void 0;
177664
177823
  }
177665
177824
  });
177666
177825
 
@@ -177675,7 +177834,7 @@ __export(notify_exports, {
177675
177834
  runNotify: () => runNotify,
177676
177835
  saveAdminSession: () => saveAdminSession
177677
177836
  });
177678
- import { chmodSync as chmodSync3, mkdirSync as mkdirSync41, readFileSync as readFileSync115, writeFileSync as writeFileSync38 } from "node:fs";
177837
+ import { chmodSync as chmodSync3, mkdirSync as mkdirSync41, readFileSync as readFileSync116, writeFileSync as writeFileSync38 } from "node:fs";
177679
177838
  import { homedir as homedir14 } from "node:os";
177680
177839
  import { dirname as dirname52, join as join105 } from "node:path";
177681
177840
  function defaultSessionsPath() {
@@ -177683,7 +177842,7 @@ function defaultSessionsPath() {
177683
177842
  }
177684
177843
  function loadSessionsFile(path2 = defaultSessionsPath()) {
177685
177844
  try {
177686
- return JSON.parse(readFileSync115(path2, "utf8"));
177845
+ return JSON.parse(readFileSync116(path2, "utf8"));
177687
177846
  } catch {
177688
177847
  return {};
177689
177848
  }
@@ -178052,7 +178211,7 @@ __export(base44_adopt_exports, {
178052
178211
  renderAdoptModule: () => renderAdoptModule,
178053
178212
  runBase44Adopt: () => runBase44Adopt
178054
178213
  });
178055
- import { existsSync as existsSync98, readFileSync as readFileSync116, writeFileSync as writeFileSync39 } from "node:fs";
178214
+ import { existsSync as existsSync98, readFileSync as readFileSync117, writeFileSync as writeFileSync39 } from "node:fs";
178056
178215
  import { join as join106, resolve as resolve76 } from "node:path";
178057
178216
  function prop(entity, key3) {
178058
178217
  const props = entity.schema?.properties;
@@ -178147,7 +178306,7 @@ function runBase44Adopt(opts) {
178147
178306
  const bookPath = join106(bookDir, "book.json");
178148
178307
  let book;
178149
178308
  try {
178150
- book = JSON.parse(readFileSync116(bookPath, "utf8"));
178309
+ book = JSON.parse(readFileSync117(bookPath, "utf8"));
178151
178310
  if (!book || typeof book !== "object" || !Array.isArray(book.entities)) throw new Error("not a Base44 app book (no entities[])");
178152
178311
  } catch (e2) {
178153
178312
  throw new AdoptError("book_unreadable", `could not read ${bookPath}: ${e2.message}. Run \`himi base44 analyze --app-id <id>\` first.`);
@@ -178410,7 +178569,7 @@ __export(generate_exports, {
178410
178569
  writeGenerated: () => writeGenerated
178411
178570
  });
178412
178571
  import { createHash as createHash50 } from "node:crypto";
178413
- import { existsSync as existsSync99, mkdirSync as mkdirSync42, readdirSync as readdirSync40, readFileSync as readFileSync117, writeFileSync as writeFileSync40 } from "node:fs";
178572
+ import { existsSync as existsSync99, mkdirSync as mkdirSync42, readdirSync as readdirSync40, readFileSync as readFileSync118, writeFileSync as writeFileSync40 } from "node:fs";
178414
178573
  import { dirname as dirname53, join as join107 } from "node:path";
178415
178574
  function withHeader(body) {
178416
178575
  return `${GENERATED_HEADER}${sha2566(body)}
@@ -178539,7 +178698,7 @@ function writeGenerated(dir, files, opts = {}) {
178539
178698
  let outcome;
178540
178699
  if (!existsSync99(abs)) outcome = "written";
178541
178700
  else {
178542
- const cur = readFileSync117(abs, "utf8");
178701
+ const cur = readFileSync118(abs, "utf8");
178543
178702
  if (cur === next) outcome = "unchanged";
178544
178703
  else if (isEdited(cur) && !opts.force) outcome = "skipped-edited";
178545
178704
  else outcome = "written";
@@ -178564,7 +178723,7 @@ function orphanedFiles(dir, current) {
178564
178723
  }
178565
178724
  for (const rel of candidates.sort()) {
178566
178725
  if (keep.has(rel) || !existsSync99(join107(dir, rel))) continue;
178567
- if (readFileSync117(join107(dir, rel), "utf8").startsWith(GENERATED_HEADER)) found.push(rel);
178726
+ if (readFileSync118(join107(dir, rel), "utf8").startsWith(GENERATED_HEADER)) found.push(rel);
178568
178727
  }
178569
178728
  return found;
178570
178729
  }
@@ -178602,7 +178761,7 @@ __export(base44_auth_exports, {
178602
178761
  usableBase44Auth: () => usableBase44Auth,
178603
178762
  writeBase44Session: () => writeBase44Session
178604
178763
  });
178605
- import { chmodSync as chmodSync4, existsSync as existsSync100, mkdirSync as mkdirSync43, readFileSync as readFileSync118, rmSync as rmSync27, writeFileSync as writeFileSync41 } from "node:fs";
178764
+ import { chmodSync as chmodSync4, existsSync as existsSync100, mkdirSync as mkdirSync43, readFileSync as readFileSync119, rmSync as rmSync27, writeFileSync as writeFileSync41 } from "node:fs";
178606
178765
  import { homedir as homedir15 } from "node:os";
178607
178766
  import { dirname as dirname54, join as join108 } from "node:path";
178608
178767
  function base44ApiBase(env = process.env) {
@@ -178615,7 +178774,7 @@ function readBase44Session(home) {
178615
178774
  const p2 = base44SessionPath(home);
178616
178775
  if (!existsSync100(p2)) return void 0;
178617
178776
  try {
178618
- const s2 = JSON.parse(readFileSync118(p2, "utf8"));
178777
+ const s2 = JSON.parse(readFileSync119(p2, "utf8"));
178619
178778
  return typeof s2.accessToken === "string" && s2.accessToken ? s2 : void 0;
178620
178779
  } catch {
178621
178780
  return void 0;
@@ -178735,7 +178894,7 @@ function hasBase44WriteScope(auth) {
178735
178894
  function importBase44CliSession(home = homedir15(), env = process.env) {
178736
178895
  const src = join108(home, ".base44", "auth", "auth.json");
178737
178896
  if (!existsSync100(src)) throw new Error(`no Base44 CLI session at ${src} \u2014 run \`npx base44 login\` first, or use \`himi base44 login\``);
178738
- const a2 = JSON.parse(readFileSync118(src, "utf8"));
178897
+ const a2 = JSON.parse(readFileSync119(src, "utf8"));
178739
178898
  if (typeof a2.accessToken !== "string" || !a2.accessToken) throw new Error(`${src} holds no access token`);
178740
178899
  const session = {
178741
178900
  accessToken: a2.accessToken,
@@ -178785,14 +178944,14 @@ async function callJson(t2, appId2, method, path2, what, body) {
178785
178944
  ...body !== void 0 ? { body: JSON.stringify(body) } : {}
178786
178945
  });
178787
178946
  if (!res.ok) {
178788
- const text12 = await res.text().catch(() => "");
178789
- throw new Base44RequestError(res.status, text12.slice(0, 500), what);
178947
+ const text13 = await res.text().catch(() => "");
178948
+ throw new Base44RequestError(res.status, text13.slice(0, 500), what);
178790
178949
  }
178791
- const text11 = await res.text();
178950
+ const text12 = await res.text();
178792
178951
  try {
178793
- return JSON.parse(text11);
178952
+ return JSON.parse(text12);
178794
178953
  } catch {
178795
- throw new Base44RequestError(res.status, `unreadable response: ${text11.slice(0, 200)}`, what);
178954
+ throw new Base44RequestError(res.status, `unreadable response: ${text12.slice(0, 200)}`, what);
178796
178955
  }
178797
178956
  }
178798
178957
  function requestFailure(e2) {
@@ -178832,14 +178991,14 @@ __export(seed_exports, {
178832
178991
  seedBase44Entities: () => seedBase44Entities,
178833
178992
  writeBase44SeedRows: () => writeBase44SeedRows
178834
178993
  });
178835
- import { existsSync as existsSync101, readFileSync as readFileSync119, writeFileSync as writeFileSync42 } from "node:fs";
178994
+ import { existsSync as existsSync101, readFileSync as readFileSync120, writeFileSync as writeFileSync42 } from "node:fs";
178836
178995
  import { join as join109 } from "node:path";
178837
178996
  function readBase44SeedFile(dir) {
178838
178997
  const file2 = join109(dir, BASE44_SEED_FILE);
178839
178998
  if (!existsSync101(file2)) return {};
178840
178999
  let parsed;
178841
179000
  try {
178842
- parsed = JSON.parse(readFileSync119(file2, "utf8"));
179001
+ parsed = JSON.parse(readFileSync120(file2, "utf8"));
178843
179002
  } catch (e2) {
178844
179003
  throw new SeedFileError(`${BASE44_SEED_FILE} is not valid JSON (${e2.message}). Fix or delete it.`);
178845
179004
  }
@@ -178999,7 +179158,7 @@ function writeBase44SeedRows(opts) {
178999
179158
  if (existsSync101(path2)) {
179000
179159
  let parsed;
179001
179160
  try {
179002
- parsed = JSON.parse(readFileSync119(path2, "utf8"));
179161
+ parsed = JSON.parse(readFileSync120(path2, "utf8"));
179003
179162
  } catch (e2) {
179004
179163
  throw new SeedFileError(`${BASE44_SEED_FILE} is not valid JSON (${e2.message}). Refusing to regenerate, because overwriting it would discard the rows already in it.`);
179005
179164
  }
@@ -179060,16 +179219,16 @@ var init_seed = __esm({
179060
179219
  });
179061
179220
 
179062
179221
  // src/base44-analyze/project.ts
179063
- function parseJsonc(text11) {
179222
+ function parseJsonc(text12) {
179064
179223
  let out2 = "";
179065
179224
  let i2 = 0;
179066
179225
  let inStr = false;
179067
- while (i2 < text11.length) {
179068
- const c2 = text11[i2];
179226
+ while (i2 < text12.length) {
179227
+ const c2 = text12[i2];
179069
179228
  if (inStr) {
179070
179229
  out2 += c2;
179071
179230
  if (c2 === "\\") {
179072
- out2 += text11[i2 + 1] ?? "";
179231
+ out2 += text12[i2 + 1] ?? "";
179073
179232
  i2 += 2;
179074
179233
  continue;
179075
179234
  }
@@ -179081,11 +179240,11 @@ function parseJsonc(text11) {
179081
179240
  inStr = true;
179082
179241
  out2 += c2;
179083
179242
  i2++;
179084
- } else if (c2 === "/" && text11[i2 + 1] === "/") {
179085
- while (i2 < text11.length && text11[i2] !== "\n") i2++;
179086
- } else if (c2 === "/" && text11[i2 + 1] === "*") {
179243
+ } else if (c2 === "/" && text12[i2 + 1] === "/") {
179244
+ while (i2 < text12.length && text12[i2] !== "\n") i2++;
179245
+ } else if (c2 === "/" && text12[i2 + 1] === "*") {
179087
179246
  i2 += 2;
179088
- while (i2 < text11.length && !(text11[i2] === "*" && text11[i2 + 1] === "/")) i2++;
179247
+ while (i2 < text12.length && !(text12[i2] === "*" && text12[i2 + 1] === "/")) i2++;
179089
179248
  i2 += 2;
179090
179249
  } else {
179091
179250
  out2 += c2;
@@ -179094,32 +179253,32 @@ function parseJsonc(text11) {
179094
179253
  }
179095
179254
  return JSON.parse(dropTrailingCommas(out2));
179096
179255
  }
179097
- function dropTrailingCommas(text11) {
179256
+ function dropTrailingCommas(text12) {
179098
179257
  let out2 = "";
179099
179258
  let inStr = false;
179100
- for (let i2 = 0; i2 < text11.length; i2++) {
179101
- const c2 = text11[i2];
179259
+ for (let i2 = 0; i2 < text12.length; i2++) {
179260
+ const c2 = text12[i2];
179102
179261
  if (inStr) {
179103
179262
  out2 += c2;
179104
- if (c2 === "\\") out2 += text11[++i2] ?? "";
179263
+ if (c2 === "\\") out2 += text12[++i2] ?? "";
179105
179264
  else if (c2 === '"') inStr = false;
179106
179265
  continue;
179107
179266
  }
179108
179267
  if (c2 === '"') inStr = true;
179109
179268
  if (c2 === ",") {
179110
179269
  let j2 = i2 + 1;
179111
- while (j2 < text11.length && /\s/.test(text11[j2])) j2++;
179112
- if (text11[j2] === "}" || text11[j2] === "]") continue;
179270
+ while (j2 < text12.length && /\s/.test(text12[j2])) j2++;
179271
+ if (text12[j2] === "}" || text12[j2] === "]") continue;
179113
179272
  }
179114
179273
  out2 += c2;
179115
179274
  }
179116
179275
  return out2;
179117
179276
  }
179118
179277
  function readJson9(files, path2) {
179119
- const text11 = files.get(path2);
179120
- if (text11 === void 0) return void 0;
179278
+ const text12 = files.get(path2);
179279
+ if (text12 === void 0) return void 0;
179121
179280
  try {
179122
- const v2 = parseJsonc(text11);
179281
+ const v2 = parseJsonc(text12);
179123
179282
  return v2 && typeof v2 === "object" && !Array.isArray(v2) ? v2 : void 0;
179124
179283
  } catch {
179125
179284
  return void 0;
@@ -179649,11 +179808,11 @@ async function readEntitySnapshot(appId2, deps) {
179649
179808
  const { entries, skipped } = collectAppSource(dl2.dir);
179650
179809
  const files = new Map(entries.map((e2) => [e2.path, e2.bytes.toString("utf8")]));
179651
179810
  for (const cfgPath of ["base44/config.jsonc", "base44/config.json"]) {
179652
- const text11 = files.get(cfgPath);
179653
- if (text11 === void 0) continue;
179811
+ const text12 = files.get(cfgPath);
179812
+ if (text12 === void 0) continue;
179654
179813
  let cfg;
179655
179814
  try {
179656
- cfg = parseJsonc(text11);
179815
+ cfg = parseJsonc(text12);
179657
179816
  } catch (e2) {
179658
179817
  throw new Error(`${cfgPath} does not parse (${e2.message}) \u2014 the entity directory it names cannot be trusted, so the snapshot may be incomplete`);
179659
179818
  }
@@ -179666,11 +179825,11 @@ async function readEntitySnapshot(appId2, deps) {
179666
179825
  const isEntityFile = (p2) => entityDirs.some((d2) => p2.startsWith(d2) && !p2.slice(d2.length).includes("/") && JSON_FILE2.test(p2));
179667
179826
  const dropped = skipped.map((p2) => p2.split(/[\\/]/).join("/")).filter((p2) => entityDirs.some((d2) => p2.startsWith(d2) || d2.startsWith(`${p2}/`)));
179668
179827
  if (dropped.length) throw new Error(`the download's entity files include ones himi will not read (${dropped.join(", ")}) \u2014 a sync without them would delete those entities`);
179669
- for (const [path2, text11] of files) {
179828
+ for (const [path2, text12] of files) {
179670
179829
  if (!isEntityFile(path2)) continue;
179671
179830
  let v2;
179672
179831
  try {
179673
- v2 = parseJsonc(text11);
179832
+ v2 = parseJsonc(text12);
179674
179833
  } catch (e2) {
179675
179834
  throw new Error(`entity file ${path2} does not parse (${e2.message}) \u2014 a sync without it would delete that entity`);
179676
179835
  }
@@ -179698,7 +179857,7 @@ __export(apply_exports, {
179698
179857
  createBase44Entities: () => createBase44Entities,
179699
179858
  fileLedger: () => fileLedger
179700
179859
  });
179701
- import { existsSync as existsSync103, readFileSync as readFileSync120, writeFileSync as writeFileSync43 } from "node:fs";
179860
+ import { existsSync as existsSync103, readFileSync as readFileSync121, writeFileSync as writeFileSync43 } from "node:fs";
179702
179861
  import { join as join111 } from "node:path";
179703
179862
  function fileLedger(dir, appId2) {
179704
179863
  const path2 = join111(dir, LEDGER_FILE2);
@@ -179706,7 +179865,7 @@ function fileLedger(dir, appId2) {
179706
179865
  if (!existsSync103(path2)) return {};
179707
179866
  let v2;
179708
179867
  try {
179709
- v2 = JSON.parse(readFileSync120(path2, "utf8"));
179868
+ v2 = JSON.parse(readFileSync121(path2, "utf8"));
179710
179869
  } catch (e2) {
179711
179870
  throw new LedgerError(`${LEDGER_FILE2} is not valid JSON (${e2.message}) \u2014 fix it (a merge conflict?) rather than let himi rewrite it`);
179712
179871
  }
@@ -179863,16 +180022,16 @@ function isPrivateV4([a2, b2, c2]) {
179863
180022
  return a2 >= 224;
179864
180023
  }
179865
180024
  function v6Groups(host) {
179866
- let text11 = host;
179867
- const dotted = /:((?:\d{1,3}\.){3}\d{1,3})$/.exec(text11);
180025
+ let text12 = host;
180026
+ const dotted = /:((?:\d{1,3}\.){3}\d{1,3})$/.exec(text12);
179868
180027
  if (dotted) {
179869
180028
  const octets = ipv4Octets(dotted[1]);
179870
180029
  if (!octets) return null;
179871
180030
  const hi2 = (octets[0] << 8 | octets[1]).toString(16);
179872
180031
  const lo2 = (octets[2] << 8 | octets[3]).toString(16);
179873
- text11 = `${text11.slice(0, dotted.index)}:${hi2}:${lo2}`;
180032
+ text12 = `${text12.slice(0, dotted.index)}:${hi2}:${lo2}`;
179874
180033
  }
179875
- const halves = text11.split("::");
180034
+ const halves = text12.split("::");
179876
180035
  if (halves.length > 2) return null;
179877
180036
  const parts = (part3) => part3 ? part3.split(":") : [];
179878
180037
  const head = parts(halves[0]);
@@ -180152,28 +180311,28 @@ var init_net_guard = __esm({
180152
180311
  });
180153
180312
 
180154
180313
  // src/site-analyze/copy-clean.ts
180155
- function isTemplatePlaceholder(text11) {
180156
- return PLACEHOLDER_RE.test(text11);
180314
+ function isTemplatePlaceholder(text12) {
180315
+ return PLACEHOLDER_RE.test(text12);
180157
180316
  }
180158
180317
  function cleanText(raw, cap) {
180159
180318
  const s2 = String(raw ?? "").replace(/[\u0000-\u001F\u007F]/g, " ").replace(/\s+/g, " ").trim();
180160
180319
  return s2.length > cap ? `${s2.slice(0, cap - 1).trimEnd()}\u2026` : s2;
180161
180320
  }
180162
- function stripPii(text11) {
180163
- return text11.replace(EMAIL_RE2, "").replace(PHONE_SHAPE_RE, (m2) => {
180321
+ function stripPii(text12) {
180322
+ return text12.replace(EMAIL_RE2, "").replace(PHONE_SHAPE_RE, (m2) => {
180164
180323
  const digits2 = (m2.match(ANY_DIGIT_RE) ?? []).length;
180165
180324
  return digits2 >= PHONE_MIN_DIGITS && PHONE_DIGIT_RUN_RE.test(m2) ? "" : m2;
180166
180325
  }).replace(/\s+/g, " ").trim();
180167
180326
  }
180168
- function isBoilerplate(text11) {
180169
- return BOILERPLATE_RE.test(text11) || PLACEHOLDER_RE.test(text11);
180327
+ function isBoilerplate(text12) {
180328
+ return BOILERPLATE_RE.test(text12) || PLACEHOLDER_RE.test(text12);
180170
180329
  }
180171
180330
  function copyOrDrop(raw, cap) {
180172
- const text11 = stripPii(cleanText(raw, cap));
180173
- if (text11.length < 2) return "";
180174
- if (isBoilerplate(text11)) return "";
180175
- if (!/[A-Za-zͰ-῿぀-힯]/.test(text11)) return "";
180176
- return text11;
180331
+ const text12 = stripPii(cleanText(raw, cap));
180332
+ if (text12.length < 2) return "";
180333
+ if (isBoilerplate(text12)) return "";
180334
+ if (!/[A-Za-zͰ-῿぀-힯]/.test(text12)) return "";
180335
+ return text12;
180177
180336
  }
180178
180337
  function dedupe2(values, cap) {
180179
180338
  const out2 = [];
@@ -180269,8 +180428,8 @@ function parsePublishedHtml(html) {
180269
180428
  const rawHeadings = [];
180270
180429
  HEADING_RE.lastIndex = 0;
180271
180430
  while (m2 = HEADING_RE.exec(html)) {
180272
- const text11 = copyOrDrop(textFromHtml(m2[1] ?? ""), 120);
180273
- if (text11) rawHeadings.push(text11);
180431
+ const text12 = copyOrDrop(textFromHtml(m2[1] ?? ""), 120);
180432
+ if (text12) rawHeadings.push(text12);
180274
180433
  if (rawHeadings.length >= 40) break;
180275
180434
  }
180276
180435
  const headings = dedupe2(rawHeadings, 20);
@@ -180362,14 +180521,14 @@ async function readPublishedHtml(fetchImpl, siteUrl, opts) {
180362
180521
  const chunk = await reader.read();
180363
180522
  if (chunk.done) break;
180364
180523
  bytes2 += chunk.value.byteLength;
180365
- const text11 = decoder.decode(chunk.value, { stream: true });
180366
- html += text11;
180367
- if (CODE_APP_ID_DONE_RE.test(overlap + text11) || bytes2 >= maxBytes) {
180524
+ const text12 = decoder.decode(chunk.value, { stream: true });
180525
+ html += text12;
180526
+ if (CODE_APP_ID_DONE_RE.test(overlap + text12) || bytes2 >= maxBytes) {
180368
180527
  await reader.cancel().catch(() => {
180369
180528
  });
180370
180529
  break;
180371
180530
  }
180372
- overlap = (overlap + text11).slice(-80);
180531
+ overlap = (overlap + text12).slice(-80);
180373
180532
  }
180374
180533
  } catch (e2) {
180375
180534
  if (!opts.signal?.aborted) throw e2;
@@ -180594,9 +180753,9 @@ var init_permissions = __esm({
180594
180753
  function genericDescription(it2) {
180595
180754
  for (const field of DESCRIPTION_FIELDS) {
180596
180755
  const raw = it2[field];
180597
- const text11 = typeof raw === "string" ? raw : str8(raw?.text);
180598
- if (!text11) continue;
180599
- const plain2 = text11.replace(/<[^>]*>/g, " ").replace(/&nbsp;/g, " ");
180756
+ const text12 = typeof raw === "string" ? raw : str8(raw?.text);
180757
+ if (!text12) continue;
180758
+ const plain2 = text12.replace(/<[^>]*>/g, " ").replace(/&nbsp;/g, " ");
180600
180759
  if (plain2.trim()) return plain2;
180601
180760
  }
180602
180761
  return void 0;
@@ -181077,8 +181236,8 @@ function cmsStatusNote(taxonomy) {
181077
181236
  function yn2(v2) {
181078
181237
  return v2 == null || v2 === "" ? "\u2014" : String(v2);
181079
181238
  }
181080
- function isAuthPhrase(text11) {
181081
- const t2 = text11.trim();
181239
+ function isAuthPhrase(text12) {
181240
+ const t2 = text12.trim();
181082
181241
  return AUTH_ONLY_ASCII.test(t2) || LOGIN_HE.includes(t2);
181083
181242
  }
181084
181243
  function looksGated(page) {
@@ -181877,12 +182036,12 @@ function mergeWst(pages2) {
181877
182036
  return acc;
181878
182037
  }
181879
182038
  function fontSlug(value2) {
181880
- let text11 = value2;
182039
+ let text12 = value2;
181881
182040
  try {
181882
- text11 = decodeURIComponent(value2);
182041
+ text12 = decodeURIComponent(value2);
181883
182042
  } catch {
181884
182043
  }
181885
- return text11.toLowerCase().replace(/[^a-z0-9]+/g, "");
182044
+ return text12.toLowerCase().replace(/[^a-z0-9]+/g, "");
181886
182045
  }
181887
182046
  function fontUrlSlug(url) {
181888
182047
  const last = url.split("?")[0].split("#")[0].split("/").pop() ?? "";
@@ -181970,9 +182129,9 @@ function attachVeloSources(book, sources, put) {
181970
182129
  if (isSecretVeloPath(f2.path)) continue;
181971
182130
  const rel = veloArtifactRelPath(f2.path);
181972
182131
  if (!rel) continue;
181973
- const text11 = byPath.get(f2.path) ?? f2.excerpt;
181974
- if (!text11) continue;
181975
- put(rel, text11);
182132
+ const text12 = byPath.get(f2.path) ?? f2.excerpt;
182133
+ if (!text12) continue;
182134
+ put(rel, text12);
181976
182135
  f2.localPath = rel;
181977
182136
  }
181978
182137
  }
@@ -182363,7 +182522,7 @@ function appIdFromUrl(raw) {
182363
182522
  return void 0;
182364
182523
  }
182365
182524
  }
182366
- function appIdFromText(text11) {
182525
+ function appIdFromText(text12) {
182367
182526
  const shapes = [
182368
182527
  // The published shell's own badge tag: `<script data-app-id="<id>" src="/static/js/badge.js">`.
182369
182528
  /\bdata-app-id\s*=\s*["']([a-f0-9]{24})["']/,
@@ -182374,7 +182533,7 @@ function appIdFromText(text11) {
182374
182533
  /\/apps\/([a-f0-9]{24})\b/
182375
182534
  ];
182376
182535
  for (const re2 of shapes) {
182377
- const m2 = re2.exec(text11);
182536
+ const m2 = re2.exec(text12);
182378
182537
  if (m2) return m2[1];
182379
182538
  }
182380
182539
  return void 0;
@@ -182748,11 +182907,11 @@ var init_analyze = __esm({
182748
182907
  });
182749
182908
 
182750
182909
  // src/base44-analyze/write-artifacts.ts
182751
- import { existsSync as existsSync104, mkdirSync as mkdirSync45, readFileSync as readFileSync121, rmSync as rmSync29, writeFileSync as writeFileSync45 } from "node:fs";
182910
+ import { existsSync as existsSync104, mkdirSync as mkdirSync45, readFileSync as readFileSync122, rmSync as rmSync29, writeFileSync as writeFileSync45 } from "node:fs";
182752
182911
  import { dirname as dirname55, join as join113, resolve as resolve77, sep as sep21 } from "node:path";
182753
182912
  function isBookFolder(dir) {
182754
182913
  try {
182755
- return JSON.parse(readFileSync121(join113(dir, "book.json"), "utf8")).kind === "base44-app-book";
182914
+ return JSON.parse(readFileSync122(join113(dir, "book.json"), "utf8")).kind === "base44-app-book";
182756
182915
  } catch {
182757
182916
  return false;
182758
182917
  }
@@ -185822,8 +185981,8 @@ function copyFromEval(evaled) {
185822
185981
  evaled.meta?.ogTitle,
185823
185982
  evaled.meta?.ogDescription
185824
185983
  ].map((raw) => {
185825
- const text11 = cleanText(raw, 400);
185826
- return text11 && isTemplatePlaceholder(text11) ? stripPii(cleanText(text11, 90)) : "";
185984
+ const text12 = cleanText(raw, 400);
185985
+ return text12 && isTemplatePlaceholder(text12) ? stripPii(cleanText(text12, 90)) : "";
185827
185986
  }),
185828
185987
  8
185829
185988
  );
@@ -187093,7 +187252,7 @@ __export(cli_exports2, {
187093
187252
  ONE_APP_WORKFLOW: () => ONE_APP_WORKFLOW,
187094
187253
  runOneAppCommand: () => runOneAppCommand
187095
187254
  });
187096
- import { closeSync as closeSync8, constants as constants7, lstatSync as lstatSync25, mkdirSync as mkdirSync47, openSync as openSync7, readFileSync as readFileSync122, realpathSync as realpathSync15, writeFileSync as writeFileSync47 } from "node:fs";
187255
+ import { closeSync as closeSync8, constants as constants7, lstatSync as lstatSync25, mkdirSync as mkdirSync47, openSync as openSync7, readFileSync as readFileSync123, realpathSync as realpathSync16, writeFileSync as writeFileSync47 } from "node:fs";
187097
187256
  import { createHash as createHash52 } from "node:crypto";
187098
187257
  import { dirname as dirname56, join as join116, parse as parse3, resolve as resolve80 } from "node:path";
187099
187258
  function readOptions(argv, cwd, commandIncluded) {
@@ -187143,7 +187302,7 @@ function readOptions(argv, cwd, commandIncluded) {
187143
187302
  const file2 = resolve80(cwd, flags["prompt-file"]);
187144
187303
  const stat2 = lstatSync25(file2);
187145
187304
  if (!stat2.isFile() || stat2.size > MAX_PROMPT_BYTES) throw new Error("invalid prompt file");
187146
- prompt = readFileSync122(file2, "utf8");
187305
+ prompt = readFileSync123(file2, "utf8");
187147
187306
  } catch {
187148
187307
  throw new OneAppError("invalid_prompt", "Use a readable text file of at most 64 KiB for --prompt-file.");
187149
187308
  }
@@ -187290,7 +187449,7 @@ validate-topbar checks authored source top-bar controls against the migrated con
187290
187449
  mkdirSync47(options.parentDir, { recursive: true, mode: 448 });
187291
187450
  assertSafeParents(options.parentDir);
187292
187451
  mkdirSync47(options.workspace, { mode: 448 });
187293
- if (realpathSync15(options.workspace) !== options.workspace) throw new Error("destination changed");
187452
+ if (realpathSync16(options.workspace) !== options.workspace) throw new Error("destination changed");
187294
187453
  evidenceDir = join116(options.workspace, ".himi", "one-app");
187295
187454
  mkdirSync47(evidenceDir, { recursive: true, mode: 448 });
187296
187455
  } catch (error) {
@@ -188501,8 +188660,8 @@ var init_copy = __esm({
188501
188660
  function textFields(look) {
188502
188661
  if (look.unavailable) return [];
188503
188662
  const out2 = [];
188504
- const add = (text11, where, narrative = false) => {
188505
- if (text11 && text11.trim()) out2.push({ text: text11, where, narrative });
188663
+ const add = (text12, where, narrative = false) => {
188664
+ if (text12 && text12.trim()) out2.push({ text: text12, where, narrative });
188506
188665
  };
188507
188666
  for (const label3 of look.navLabels) add(label3, "nav");
188508
188667
  for (const p2 of look.pages) {
@@ -189191,8 +189350,8 @@ async function analyzeSite(input, ports) {
189191
189350
  if (locale) plan.provisioning.locale = locale;
189192
189351
  const velo = buildVeloChapter({ look, owner: ownerVelo });
189193
189352
  const veloFiles = ownerVelo.files.flatMap((f2) => {
189194
- const text11 = f2.content ?? f2.excerpt;
189195
- return text11 ? [{ path: f2.path, text: text11 }] : [];
189353
+ const text12 = f2.content ?? f2.excerpt;
189354
+ return text12 ? [{ path: f2.path, text: text12 }] : [];
189196
189355
  }).slice(0, 80);
189197
189356
  const permissions = buildPermissionsChapter({
189198
189357
  cms,
@@ -189404,7 +189563,7 @@ var init_customer_build = __esm({
189404
189563
  });
189405
189564
 
189406
189565
  // src/site-analyze/apply.ts
189407
- import { existsSync as existsSync106, readFileSync as readFileSync123, writeFileSync as writeFileSync48, copyFileSync as copyFileSync2, mkdirSync as mkdirSync48, realpathSync as realpathSync16, statSync as statSync27 } from "node:fs";
189566
+ import { existsSync as existsSync106, readFileSync as readFileSync124, writeFileSync as writeFileSync48, copyFileSync as copyFileSync2, mkdirSync as mkdirSync48, realpathSync as realpathSync17, statSync as statSync28 } from "node:fs";
189408
189567
  import { dirname as dirname57, isAbsolute as isAbsolute10, join as join117, resolve as resolve81, sep as sep22 } from "node:path";
189409
189568
  import { spawnSync as spawnSync7 } from "node:child_process";
189410
189569
  function unpairedRedirectNote(overlay) {
@@ -189527,7 +189686,7 @@ function buildMergedContract(options) {
189527
189686
  if (!existsSync106(committedPath)) {
189528
189687
  throw new Error(`shell has no committed provisioning.json at ${committedPath} to build a contract from`);
189529
189688
  }
189530
- const committed = JSON.parse(readFileSync123(committedPath, "utf8"));
189689
+ const committed = JSON.parse(readFileSync124(committedPath, "utf8"));
189531
189690
  const merged = mergeCustomerOwned(committed, overlay);
189532
189691
  const overlayFontFamily = (overlay.branding ?? {}).fontFamily;
189533
189692
  const branding = merged.branding ?? {};
@@ -189544,14 +189703,14 @@ function buildMergedContract(options) {
189544
189703
  let real;
189545
189704
  let realRoot;
189546
189705
  try {
189547
- real = realpathSync16(from);
189548
- realRoot = realpathSync16(packageDir);
189706
+ real = realpathSync17(from);
189707
+ realRoot = realpathSync17(packageDir);
189549
189708
  } catch {
189550
189709
  return void 0;
189551
189710
  }
189552
189711
  if (!real.startsWith(realRoot + sep22)) return void 0;
189553
189712
  try {
189554
- if (!statSync27(real).isFile()) return void 0;
189713
+ if (!statSync28(real).isFile()) return void 0;
189555
189714
  mkdirSync48(dirname57(to2), { recursive: true });
189556
189715
  copyFileSync2(real, to2);
189557
189716
  } catch {
@@ -189566,7 +189725,7 @@ function buildMergedContract(options) {
189566
189725
  if (existsSync106(facesPath)) {
189567
189726
  let faces = [];
189568
189727
  try {
189569
- const parsed = JSON.parse(readFileSync123(facesPath, "utf8"));
189728
+ const parsed = JSON.parse(readFileSync124(facesPath, "utf8"));
189570
189729
  faces = Array.isArray(parsed) ? parsed : [];
189571
189730
  } catch {
189572
189731
  faces = [];
@@ -189627,7 +189786,7 @@ function staticFaqFor(overlay, overlayPath) {
189627
189786
  const bookPath = join117(dirname57(resolve81(overlayPath)), "book.json");
189628
189787
  if (!existsSync106(bookPath)) return void 0;
189629
189788
  try {
189630
- const book = JSON.parse(readFileSync123(bookPath, "utf8"));
189789
+ const book = JSON.parse(readFileSync124(bookPath, "utf8"));
189631
189790
  const copy = book?.copy;
189632
189791
  if (!copy || typeof copy !== "object" || copy.unavailable) return void 0;
189633
189792
  const pairs = deriveStaticFaq(copy.faq);
@@ -189644,7 +189803,7 @@ function staticGalleriesFor(overlay, overlayPath) {
189644
189803
  const bookPath = join117(dirname57(resolve81(overlayPath)), "book.json");
189645
189804
  if (!existsSync106(bookPath)) return void 0;
189646
189805
  try {
189647
- const book = JSON.parse(readFileSync123(bookPath, "utf8"));
189806
+ const book = JSON.parse(readFileSync124(bookPath, "utf8"));
189648
189807
  if (!book.look || book.look.unavailable || !Array.isArray(book.look.pages)) return void 0;
189649
189808
  const galleries = deriveStaticGalleries(book.look.pages);
189650
189809
  return galleries.length || book.look.complete === true ? galleries : void 0;
@@ -189656,8 +189815,8 @@ async function applyOverlays(input) {
189656
189815
  const cwd = resolve81(input.cwd);
189657
189816
  const shell = input.shell ?? DEFAULT_BRANDABLE_SHELL;
189658
189817
  assertKnownShell(shell);
189659
- const overlay = JSON.parse(readFileSync123(input.overlayPath, "utf8"));
189660
- const tokens2 = JSON.parse(readFileSync123(input.tokensPath, "utf8"));
189818
+ const overlay = JSON.parse(readFileSync124(input.overlayPath, "utf8"));
189819
+ const tokens2 = JSON.parse(readFileSync124(input.tokensPath, "utf8"));
189661
189820
  const faq = staticFaqFor(overlay, input.overlayPath);
189662
189821
  if (faq !== void 0) overlay.faq = faq;
189663
189822
  const galleries = staticGalleriesFor(overlay, input.overlayPath);
@@ -189676,7 +189835,7 @@ async function applyOverlays(input) {
189676
189835
  }
189677
189836
  const appDir3 = join117(repoRoot2, shellAppDir(shell));
189678
189837
  const committedPath = join117(appDir3, "provisioning.json");
189679
- const committedSite = existsSync106(committedPath) ? JSON.parse(readFileSync123(committedPath, "utf8")).site : void 0;
189838
+ const committedSite = existsSync106(committedPath) ? JSON.parse(readFileSync124(committedPath, "utf8")).site : void 0;
189680
189839
  if (committedSite !== void 0 && overlay.site === void 0) {
189681
189840
  throw new Error(
189682
189841
  `shell "${shell}" is a site shell: its contract names the customer's website (a \`site\` block), and this overlay has none. Re-run \`himi site analyze --url <site> --shell ${shell}\` to derive the site's page map (edit \`site.pages\` in provisioning.overlay.json if needed), then --apply.`
@@ -189718,7 +189877,7 @@ async function applyOverlays(input) {
189718
189877
  let packageFaq = faq;
189719
189878
  let packageGalleries = galleries;
189720
189879
  if (existsSync106(pkgProv)) {
189721
- const cur = JSON.parse(readFileSync123(pkgProv, "utf8"));
189880
+ const cur = JSON.parse(readFileSync124(pkgProv, "utf8"));
189722
189881
  if (galleries === void 0 && !sameKnownSite(cur, overlay)) overlay.galleries = [];
189723
189882
  const merged = deepMerge4(cur, overlay);
189724
189883
  packageFaq = merged.faq;
@@ -189736,7 +189895,7 @@ async function applyOverlays(input) {
189736
189895
  }
189737
189896
  const pkgTokens = join117(cwd, "tokens.json");
189738
189897
  if (existsSync106(pkgTokens) && (tokens2.colors || tokens2.typography)) {
189739
- const cur = JSON.parse(readFileSync123(pkgTokens, "utf8"));
189898
+ const cur = JSON.parse(readFileSync124(pkgTokens, "utf8"));
189740
189899
  let tokensIn = tokens2;
189741
189900
  if (tokens2.typography) {
189742
189901
  const fonts = catalogTypography(tokens2.typography, cur.typography);
@@ -189763,7 +189922,7 @@ async function applyOverlays(input) {
189763
189922
  const homeAction = homeRefreshActionId(shell);
189764
189923
  const homeSrc = join117(cwd, "dev/index.ts");
189765
189924
  if (homeAction && existsSync106(homeSrc)) {
189766
- const prev = readFileSync123(homeSrc, "utf8");
189925
+ const prev = readFileSync124(homeSrc, "utf8");
189767
189926
  const patched = patchBrandParams(prev, overlay, homeAction);
189768
189927
  let next = patched.src;
189769
189928
  if (!patched.foreign && faq?.length && prev.includes('"tier5.himiBrandedFaq.load"') && !prev.includes('"staticFaq"')) {
@@ -190498,13 +190657,13 @@ async function veloCall(fetchImpl, method, url, opts = {}) {
190498
190657
  body: opts.body === void 0 ? void 0 : JSON.stringify(opts.body),
190499
190658
  signal: AbortSignal.timeout(opts.timeoutMs ?? 3e4)
190500
190659
  });
190501
- const text11 = await res.text();
190502
- let json8 = text11;
190660
+ const text12 = await res.text();
190661
+ let json8 = text12;
190503
190662
  try {
190504
- json8 = text11 ? JSON.parse(text11) : null;
190663
+ json8 = text12 ? JSON.parse(text12) : null;
190505
190664
  } catch {
190506
190665
  }
190507
- return { status: res.status, json: json8, text: text11 };
190666
+ return { status: res.status, json: json8, text: text12 };
190508
190667
  }
190509
190668
  function snippet2(x2, cap = 180) {
190510
190669
  const s2 = typeof x2 === "string" ? x2 : JSON.stringify(x2) ?? "";
@@ -190763,7 +190922,7 @@ __export(cli_exports3, {
190763
190922
  runSiteAnalyze: () => runSiteAnalyze,
190764
190923
  runSiteFunctionCli: () => runSiteFunctionCli
190765
190924
  });
190766
- import { existsSync as existsSync107, readFileSync as readFileSync124 } from "node:fs";
190925
+ import { existsSync as existsSync107, readFileSync as readFileSync125 } from "node:fs";
190767
190926
  import { resolve as resolve82 } from "node:path";
190768
190927
  function applyNeedsClient(shell) {
190769
190928
  if (shell === void 0 || !SHELL_NAMES.includes(shell)) return true;
@@ -190833,7 +190992,7 @@ async function runSiteAnalyze(opts) {
190833
190992
  const prevOverlayPath = resolve82(outDir, "provisioning.overlay.json");
190834
190993
  const prevSite = existsSync107(prevOverlayPath) ? (() => {
190835
190994
  try {
190836
- return JSON.parse(readFileSync124(prevOverlayPath, "utf8")).site;
190995
+ return JSON.parse(readFileSync125(prevOverlayPath, "utf8")).site;
190837
190996
  } catch {
190838
190997
  return void 0;
190839
190998
  }
@@ -190852,7 +191011,7 @@ async function runSiteAnalyze(opts) {
190852
191011
  }
190853
191012
  const previousOverlay = resolve82(outDir, "provisioning.overlay.json");
190854
191013
  carryOverGoals(
190855
- existsSync107(previousOverlay) ? readFileSync124(previousOverlay, "utf8") : void 0,
191014
+ existsSync107(previousOverlay) ? readFileSync125(previousOverlay, "utf8") : void 0,
190856
191015
  result.provisioningOverlay
190857
191016
  );
190858
191017
  const ownerCall = ownerAuth ? ownerTransportFrom(fetchImpl, ownerAuth) : void 0;
@@ -190910,7 +191069,7 @@ async function runSiteFunctionCli(opts) {
190910
191069
  let source;
190911
191070
  if (opts.sourcePath) {
190912
191071
  const p2 = resolve82(opts.cwd ?? process.cwd(), opts.sourcePath);
190913
- source = readFileSync124(p2, "utf8");
191072
+ source = readFileSync125(p2, "utf8");
190914
191073
  }
190915
191074
  let body;
190916
191075
  if (opts.bodyRaw != null) {
@@ -190940,7 +191099,7 @@ async function runSiteFunctionCli(opts) {
190940
191099
  function base44BookRoutes(bookPath, siteUrl) {
190941
191100
  if (!existsSync107(bookPath)) return void 0;
190942
191101
  try {
190943
- const book = JSON.parse(readFileSync124(bookPath, "utf8"));
191102
+ const book = JSON.parse(readFileSync125(bookPath, "utf8"));
190944
191103
  if (book.kind !== "base44-app-book" || !Array.isArray(book.routes)) return void 0;
190945
191104
  const host = (u2) => {
190946
191105
  try {
@@ -191061,10 +191220,10 @@ function accountTransport(fetchImpl = fetch, timeoutMs = DEFAULT_TIMEOUT_MS5, sp
191061
191220
  }
191062
191221
  throw new Error(`${method} ${path2} failed: ${err?.message ?? String(e2)}`);
191063
191222
  }
191064
- const text11 = await res.text();
191065
- let parsed = text11;
191223
+ const text12 = await res.text();
191224
+ let parsed = text12;
191066
191225
  try {
191067
- parsed = text11 ? JSON.parse(text11) : null;
191226
+ parsed = text12 ? JSON.parse(text12) : null;
191068
191227
  } catch {
191069
191228
  }
191070
191229
  if (!res.ok) throw new WixApiError(res.status, method, path2, parsed);
@@ -191125,16 +191284,16 @@ async function installVerticals(msid, wanted, token, fetchImpl = fetch, timeoutM
191125
191284
  body: JSON.stringify({ apps: wanted.map((w2) => ({ id: w2.appDefId })) }),
191126
191285
  signal: AbortSignal.timeout(timeoutMs)
191127
191286
  });
191128
- const text11 = await res.text();
191287
+ const text12 = await res.text();
191129
191288
  if (!res.ok) {
191130
191289
  return {
191131
191290
  ...empty2,
191132
- errors: wanted.map((w2) => ({ ...w2, message: `bulk-install -> ${res.status}: ${text11.slice(0, 200)}` }))
191291
+ errors: wanted.map((w2) => ({ ...w2, message: `bulk-install -> ${res.status}: ${text12.slice(0, 200)}` }))
191133
191292
  };
191134
191293
  }
191135
191294
  let body = {};
191136
191295
  try {
191137
- body = text11 ? JSON.parse(text11) : {};
191296
+ body = text12 ? JSON.parse(text12) : {};
191138
191297
  } catch {
191139
191298
  }
191140
191299
  const nameOf2 = (appDefId) => wanted.find((w2) => w2.appDefId === appDefId)?.vertical ?? appDefId;
@@ -191195,7 +191354,7 @@ __export(site_create_exports, {
191195
191354
  runSiteList: () => runSiteList,
191196
191355
  writeProvisioningBinding: () => writeProvisioningBinding
191197
191356
  });
191198
- import { existsSync as existsSync108, readFileSync as readFileSync125, writeFileSync as writeFileSync49 } from "node:fs";
191357
+ import { existsSync as existsSync108, readFileSync as readFileSync126, writeFileSync as writeFileSync49 } from "node:fs";
191199
191358
  import { resolve as resolvePath2 } from "node:path";
191200
191359
  function oauthClientName(projectName) {
191201
191360
  return `${projectName} client`;
@@ -191344,7 +191503,7 @@ async function runSiteCreate(opts) {
191344
191503
  if (!wantOauthApp) return { ...base, nextSteps: nextSteps(metaSiteId) };
191345
191504
  return { ...base, clientId, redirectUri, nextSteps: nextSteps(metaSiteId, clientId) };
191346
191505
  }
191347
- function writeProvisioningBinding(target, binding2, fs2 = { existsSync: existsSync108, readFileSync: readFileSync125, writeFileSync: writeFileSync49 }) {
191506
+ function writeProvisioningBinding(target, binding2, fs2 = { existsSync: existsSync108, readFileSync: readFileSync126, writeFileSync: writeFileSync49 }) {
191348
191507
  const msid = binding2.siteId;
191349
191508
  const path2 = resolvePath2(target);
191350
191509
  const committed = committedShellProvisioning(path2);
@@ -191740,9 +191899,9 @@ function redactVeloSource(source, knownSecrets = []) {
191740
191899
  const visitLiterals = (node) => {
191741
191900
  if (ts12.isStringLiteral(node) || ts12.isNoSubstitutionTemplateLiteral(node) || ts12.isTemplateExpression(node)) {
191742
191901
  const start = node.getStart(clean2);
191743
- const text11 = source.slice(start, node.end);
191744
- const redacted = redactLiteral(text11, start);
191745
- if (redacted !== text11) {
191902
+ const text12 = source.slice(start, node.end);
191903
+ const redacted = redactLiteral(text12, start);
191904
+ if (redacted !== text12) {
191746
191905
  edits.push({ start, end: node.end, text: redacted });
191747
191906
  return;
191748
191907
  }
@@ -192273,7 +192432,7 @@ var init_capture = __esm({
192273
192432
 
192274
192433
  // src/fidelity/judge.ts
192275
192434
  import { spawn as spawn7 } from "node:child_process";
192276
- import { copyFileSync as copyFileSync3, mkdtempSync as mkdtempSync11, readFileSync as readFileSync126, rmSync as rmSync32 } from "node:fs";
192435
+ import { copyFileSync as copyFileSync3, mkdtempSync as mkdtempSync11, readFileSync as readFileSync127, rmSync as rmSync32 } from "node:fs";
192277
192436
  import { tmpdir as tmpdir12 } from "node:os";
192278
192437
  import { basename as basename26, dirname as dirname58, join as join119, resolve as resolve83 } from "node:path";
192279
192438
  import { fileURLToPath as fileURLToPath32 } from "node:url";
@@ -192309,8 +192468,8 @@ async function judgeStrip(strip3, screen, variant, opts = {}) {
192309
192468
  const judgeDir = opts.judgeDir ?? SOURCE_JUDGE_DIR;
192310
192469
  let prompt, schema;
192311
192470
  try {
192312
- prompt = readFileSync126(resolve83(judgeDir, "JUDGE.md"), "utf8");
192313
- schema = readFileSync126(resolve83(judgeDir, "verdict.schema.json"), "utf8");
192471
+ prompt = readFileSync127(resolve83(judgeDir, "JUDGE.md"), "utf8");
192472
+ schema = readFileSync127(resolve83(judgeDir, "verdict.schema.json"), "utf8");
192314
192473
  } catch (e2) {
192315
192474
  return cannotTell(`the judge prompt could not be read from ${judgeDir}: ${e2.message}`);
192316
192475
  }
@@ -192698,7 +192857,7 @@ __export(fidelity_exports, {
192698
192857
  himalayaRepoRoot: () => himalayaRepoRoot
192699
192858
  });
192700
192859
  import { execFileSync as execFileSync10 } from "node:child_process";
192701
- import { existsSync as existsSync111, realpathSync as realpathSync17 } from "node:fs";
192860
+ import { existsSync as existsSync111, realpathSync as realpathSync18 } from "node:fs";
192702
192861
  import { join as join123, relative as relative20, sep as sep23 } from "node:path";
192703
192862
  function himalayaRepoRoot(dir) {
192704
192863
  let top;
@@ -192708,7 +192867,7 @@ function himalayaRepoRoot(dir) {
192708
192867
  return null;
192709
192868
  }
192710
192869
  if (!existsSync111(join123(top, "tools/judges/fidelity/JUDGE.md"))) return null;
192711
- const rel = relative20(realpathSync17(top), realpathSync17(dir));
192870
+ const rel = relative20(realpathSync18(top), realpathSync18(dir));
192712
192871
  return rel.startsWith(`..${sep23}`) || rel === ".." ? null : top;
192713
192872
  }
192714
192873
  function fidelityEnvelope(report3) {
@@ -192837,10 +192996,10 @@ var ServeCliClient = class {
192837
192996
  ...carriesCredential ? { redirect: "error" } : {},
192838
192997
  body: opts.rawBody !== void 0 ? new Uint8Array(opts.rawBody) : opts.body !== void 0 ? JSON.stringify(opts.body) : void 0
192839
192998
  });
192840
- const text11 = await res.text();
192999
+ const text12 = await res.text();
192841
193000
  let json8 = null;
192842
193001
  try {
192843
- json8 = text11 ? JSON.parse(text11) : null;
193002
+ json8 = text12 ? JSON.parse(text12) : null;
192844
193003
  } catch {
192845
193004
  json8 = null;
192846
193005
  }
@@ -192848,7 +193007,7 @@ var ServeCliClient = class {
192848
193007
  res.headers.forEach((v2, k2) => {
192849
193008
  h2[k2] = v2;
192850
193009
  });
192851
- return { status: res.status, ok: res.ok, json: json8, text: text11, headers: h2 };
193010
+ return { status: res.status, ok: res.ok, json: json8, text: text12, headers: h2 };
192852
193011
  }
192853
193012
  // ---- serve (device-facing reads) ----
192854
193013
  health(plane) {
@@ -194349,7 +194508,7 @@ var COMMANDS = [
194349
194508
  { name: "visibility", summary: "read (no value) or set whether the public registry (/v1/apps + the Himi Player picker) LISTS the app. `public` lists it for everyone; `unlisted` hides it from listings while direct reads by app id \u2014 deep links, previews \u2014 keep working. App from --app or the content dir. Setting it needs no republish.", required: "[public|unlisted] [--app <a>] [--content <dir>] (--control-token)" },
194350
194509
  { name: "dist", summary: "build an INSTALLABLE QA binary (signed IPA / APK) on the Wix Job Service Mac pool and return an install link \u2014 the serve plane brokers the job, the pool builds it. WAITS for the build by default (~4 min) and prints the install link; `--no-wait` returns a jobId immediately instead. Omitting `--release` builds whatever is LIVE for the app. A named draft is refused unless `--allow-draft` makes that exceptional build explicit. `status <jobId>` / `watch <jobId>` / `list --app <a>` / `cancel <jobId>` inspect and stop builds (`watch` reports up front whether the job mints its own signing identity or borrows one, so a doomed iOS build is cancellable in seconds rather than after the archive). Off-repo, name a target \u2014 `--target wix` for a self-serve Wix login or `--target bo` for the internal employee path (the in-repo default is a local dev plane that isn't reachable off-repo); self-serve callers may build their OWN apps under a tighter budget (2 in flight / 5 per 24h), while a manage-only owner-role credential is refused. `--shell` picks the native host to sign into (branded-lite | owner-lite | brandy | base44 | player | demo-app) and defaults to the content package's himalaya.content.json `shell` (templates carry the one they were written for), else branded-lite. The per-app shells ADD the release's declared capabilities to the binary, while Himi Player and demo-app refuse a release declaring one they lack; `--plan` previews it without building; `brandy` is the site shell \u2014 the customer's own website as native-framed tabs. `--signing` defaults to `wix-managed` \u2014 the Wix Apple account mints a per-app signing identity for the build, so the caller provisions no Apple credentials of their own; `--signing byo --site <id>` reuses an existing customer ad-hoc profile and certificate for iOS; requires an owned site and a completed personal signing binding. `--android-signing` is the Android counterpart and a SEPARATE axis (a keystore, not an Apple account): `qa-keystore` (default \u2014 the repo's committed QA key, identical on every pool machine, so a build installs over the previous one), `wix-keystore` (the Wix key the pool machine carries; the build FAILS naming the paths searched if it carries none, rather than quietly signing with something else), or `debug` (the old per-machine key \u2014 QA must uninstall any previous build first). `--aab` builds an Android App Bundle (.aab) for the owner to upload to Google Play AND an APK from the same build \u2014 a download link for the .aab, an install link and QR for the APK; Android only; the bundle is signed with the Wix production key (`wix-keystore`, the upload key Branded apps use) \u2014 any other `--android-signing` is refused \u2014 and the APK with the committed QA key; a self-serve caller gets one only as the store build of its own Containers app (it must own the app's site, and `--aab` sends your Wix login); any other self-serve `--aab` gets 403 android_format_not_allowed. NOT the normal way to ship: screens, Tier-5 bundles, tokens and app-config all go over the air with `himi push` in seconds \u2014 a binary trip is only needed for a NATIVE delta (a new SDUI component, a new declared capability/entitlement, a new bundle id, or a minBinaryVersion floor bump). Refuses to build an app whose launcher icon is missing, a placeholder, or one a store would reject \u2014 the one thing a binary carries that no later OTA push can fix; `--force` builds anyway. Also refuses a release whose member login (WixConsumerAuthProvider) names no siteId, or not in lower case, when Wix says its site requires a member CAPTCHA \u2014 such a binary ships without the CAPTCHA key and every member sign-in fails; whatever it cannot read (the release, the site's setting) only warns and builds; `--skip-captcha-check` builds anyway", required: "[--app <a>] [--platform ios,android] [--release <id>] [--allow-draft] [--target <t>] [--shell branded-lite|owner-lite|brandy|base44|player|demo-app] [--signing wix-managed|byo] [--site <id>] [--android-signing qa-keystore|wix-keystore|debug] [--aab] [--borrow-ios-id <bundleId>] [--no-wait] [--force] [--skip-captcha-check] [--plan] | status <jobId> [--target <t>] | watch <jobId> [--target <t>] [--interval <ms>] | list --app <a> [--target <t>] | cancel <jobId> [--target <t>]" },
194351
194510
  { name: "testflight", summary: 'build, sign and upload an app to TestFlight (internal testers \u2014 no Beta App Review), then WAIT until App Store Connect finishes processing it. Sugar for `store upload --track testflight`. Prompts first: a build number is consumed permanently on a real Apple account and cannot be reused \u2014 `--yes` for CI, `--dry-run` to see the plan without touching anything. The wait is the real check, not a nicety: fastlane prints "Successfully uploaded" for a binary App Store Connect then rejects in processing, and a rejected binary leaves NO build record at all (the reason is emailed). Public App Store review is deliberately NOT automatable here \u2014 `--track appstore` is refused; use /submit-ios-app when you mean to go public', required: "<app> [--track testflight|internal] [--profile <name>] [--yes] [--dry-run] [--skip-build] [--no-wait] [--json]" },
194352
- { name: "store", summary: "the App Store Connect group behind `testflight`. `preflight <app>` checks readiness offline (icon, entitlements, encryption flag, version, store.config ids, listing + review record); `upload <app>` is what `testflight` runs; `status <app>` reads live build + processing state. `--profile` selects WHICH App Store Connect account: an app built for a Wix customer ships under the CUSTOMER's Apple team (Apple guideline 4.2.6 forbids an app-generation service submitting on a client's behalf), declared per-app as ios.credentialProfile in store.config.yaml and resolved from ~/.himalaya/store-credentials/<name>.json \u2014 the .p8 itself never enters the repo. `iap draft|plan|apply|status|connect|screenshots|check|mappings` registers an app owner's digital products as in-app purchases (non-consumables, or consumable price tiers): draft reads the Wix catalog and writes the manifest, plan and status only read, apply is the one App Store mutation boundary, connect readies the Wix site to sell them (purchases app, In-App Purchase key, appleIAP provider, product mappings; --preview-tag routes only its Serve calls to a deploy preview), legacy screenshots --profile renders each product's purchase screen from the app (--content) as a bound iPhone shows it to a signed-in member and names the 1290\xD72796 PNG as the item's App Review screenshot, and none of them builds, signs or needs a checkout (`himi docs iap-products`) IAP provisioning defaults to Catalog; managed apply generates screenshots on the server with no local .p8 or profile fallback; --managed is optional and --profile selects legacy mode; --catalog-route or HIMI_IAP_CATALOG_ROUTE has no default.", required: "preflight <app> [--profile <n>] | upload <app> [--track <t>] [--profile <n>] [--yes] [--dry-run] | status <app> [--profile <n>] | iap draft --site <msid> " + IAP_CREDENTIAL_OPTIONS + " --apple-app <id> --bundle <id> --base-territory <t> --out <f> [--territories <a,b>] [--locale <l>] [--mode per-item|tiers] [--merge <f>] [--report <f>] [--json] | iap plan --manifest <f> " + IAP_CREDENTIAL_OPTIONS + " --out <f> [--json] | iap apply --plan <f> " + IAP_CREDENTIAL_OPTIONS + " --out <f> [--yes] [--limit <n>] [--no-submit] [--json] | iap status --manifest <f> " + IAP_CREDENTIAL_OPTIONS + " [--out <f>] [--json] | iap connect --manifest <f> [--profile <n>] [--catalog-route <prefix>] [--iap-key <AuthKey.p8> --iap-key-id <id>] [--content <dir>] [--preview-tag dp-<tag>] [--dry-run] [--yes] [--out <f>] [--json] | iap screenshots --manifest <f> --content <dir> --profile <n> [--out-dir <d>] [--only <id,\u2026>] [--force] [--dry-run] [--json] | iap check --manifest <f> --catalog-route <prefix> [--purchases-app <id>] [--content <dir>] [--plist <file>] [--visitor-client <id>] [--json] | iap mappings --site <msid> --purchases-app <id> --catalog-route <prefix> [--product <id> --active true|false --yes] [--json]" },
194511
+ { name: "store", summary: "`apple-keys setup|status` onboards the owner\u2019s ASC and In-App Purchase keys independently of push and signing profiles. The App Store Connect group behind `testflight`. `preflight <app>` checks readiness offline (icon, entitlements, encryption flag, version, store.config ids, listing + review record); `upload <app>` is what `testflight` runs; `status <app>` reads live build + processing state. `--profile` selects WHICH App Store Connect account: an app built for a Wix customer ships under the CUSTOMER's Apple team (Apple guideline 4.2.6 forbids an app-generation service submitting on a client's behalf), declared per-app as ios.credentialProfile in store.config.yaml and resolved from ~/.himalaya/store-credentials/<name>.json \u2014 the .p8 itself never enters the repo. `iap draft|plan|apply|status|connect|screenshots|check|mappings` registers an app owner's digital products as in-app purchases (non-consumables, or consumable price tiers): draft reads the Wix catalog and writes the manifest, plan and status only read, apply is the one App Store mutation boundary, connect readies the Wix site to sell them (purchases app, In-App Purchase key, appleIAP provider, product mappings; --preview-tag routes only its Serve calls to a deploy preview), legacy screenshots --profile renders each product's purchase screen from the app (--content) as a bound iPhone shows it to a signed-in member and names the 1290\xD72796 PNG as the item's App Review screenshot, and none of them builds, signs or needs a checkout (`himi docs iap-products`) IAP provisioning defaults to Catalog; managed apply generates screenshots on the server with no local .p8 or profile fallback; --managed is optional and --profile selects legacy mode; --catalog-route or HIMI_IAP_CATALOG_ROUTE has no default.", required: "apple-keys setup|status --app <slug> --site <metaSiteId> --bundle-id <id> [--asc-key-file <p8> --asc-key-id <id> --asc-issuer-id <issuer>] [--iap-key <p8> --iap-key-id <id> --iap-issuer-id <issuer>] [--yes|--dry-run] [--json] | preflight <app> [--profile <n>] | upload <app> [--track <t>] [--profile <n>] [--yes] [--dry-run] | status <app> [--profile <n>] | iap draft --site <msid> " + IAP_CREDENTIAL_OPTIONS + " --apple-app <id> --bundle <id> --base-territory <t> --out <f> [--territories <a,b>] [--locale <l>] [--mode per-item|tiers] [--merge <f>] [--report <f>] [--json] | iap plan --manifest <f> " + IAP_CREDENTIAL_OPTIONS + " --out <f> [--json] | iap apply --plan <f> " + IAP_CREDENTIAL_OPTIONS + " --out <f> [--yes] [--limit <n>] [--no-submit] [--json] | iap status --manifest <f> " + IAP_CREDENTIAL_OPTIONS + " [--out <f>] [--json] | iap connect --manifest <f> [--profile <n>] [--catalog-route <prefix>] [--iap-key <AuthKey.p8> --iap-key-id <id>] [--content <dir>] [--preview-tag dp-<tag>] [--dry-run] [--yes] [--out <f>] [--json] | iap screenshots --manifest <f> --content <dir> --profile <n> [--out-dir <d>] [--only <id,\u2026>] [--force] [--dry-run] [--json] | iap check --manifest <f> --catalog-route <prefix> [--purchases-app <id>] [--content <dir>] [--plist <file>] [--visitor-client <id>] [--json] | iap mappings --site <msid> --purchases-app <id> --catalog-route <prefix> [--product <id> --active true|false --yes] [--json]" },
194353
194512
  { name: "guide", summary: "print the Himalaya overview + headless dev loop + available topics (offline)", required: "[--json]" },
194354
194513
  { name: "docs", summary: "print bundled/verified cached guides offline; status reports kit identity; refresh downloads compatible reference content independently of CLI without changing app source", required: "[<topic>|catalog [kind]|status|refresh] [--pin <version|digest>] [--unpin] [--no-network] [--json]" },
194355
194514
  { name: "components", summary: "print the SDUI component vocabulary + props; a name = that component (offline)", required: "[<Name>] [--json]" },
@@ -195494,8 +195653,8 @@ async function templateCommand(ctx) {
195494
195653
  io2.error(JSON.stringify({ ok: false, error: e2.message }));
195495
195654
  return 2;
195496
195655
  }
195497
- const text11 = str3(flags.text) ?? (pos.slice(2).join(" ") || void 0);
195498
- if (!text11 && !verticals?.length) {
195656
+ const text12 = str3(flags.text) ?? (pos.slice(2).join(" ") || void 0);
195657
+ if (!text12 && !verticals?.length) {
195499
195658
  io2.error(JSON.stringify({
195500
195659
  ok: false,
195501
195660
  error: 'nothing to match \u2014 pass a business description (--text "\u2026"), --verticals stores,bookings, or --book <site analyze dir>',
@@ -195516,7 +195675,7 @@ async function templateCommand(ctx) {
195516
195675
  note = `remote catalog unreachable (${e2.message}); ranked the embedded templates only`;
195517
195676
  }
195518
195677
  }
195519
- const res = recommendTemplates2({ catalog: catalog4, verticals, text: text11 });
195678
+ const res = recommendTemplates2({ catalog: catalog4, verticals, text: text12 });
195520
195679
  print({
195521
195680
  ok: true,
195522
195681
  ...verticals?.length ? { verticals } : {},
@@ -196157,9 +196316,9 @@ function dpxSessionPresent(path2 = dpxSessionTokenPath()) {
196157
196316
  return false;
196158
196317
  }
196159
196318
  }
196160
- function isPortInUseError(text11) {
196161
- if (!text11) return false;
196162
- return /EADDRINUSE/i.test(text11) || new RegExp(`(:::|:)${DPX_SESSION_PORT}\\b`).test(text11);
196319
+ function isPortInUseError(text12) {
196320
+ if (!text12) return false;
196321
+ return /EADDRINUSE/i.test(text12) || new RegExp(`(:::|:)${DPX_SESSION_PORT}\\b`).test(text12);
196163
196322
  }
196164
196323
  function parseDpxAuthStatusIdentity(stdout) {
196165
196324
  if (!stdout) return void 0;
@@ -196312,23 +196471,23 @@ async function functionsCommand(ctx) {
196312
196471
  const app = str3(flags.app) ?? loaded.app;
196313
196472
  const invoked2 = await invokeRemoteFunction2({ baseUrl: target.baseUrl, app, definition, body: input, params, releaseId: remoteRelease, previewToken: str3(flags["preview-token"]), boCookie: boCookie() });
196314
196473
  const response = invoked2.response;
196315
- const text12 = await response.text();
196474
+ const text13 = await response.text();
196316
196475
  let body2;
196317
196476
  try {
196318
- body2 = JSON.parse(text12);
196477
+ body2 = JSON.parse(text13);
196319
196478
  } catch {
196320
- body2 = text12;
196479
+ body2 = text13;
196321
196480
  }
196322
196481
  print({ ok: response.ok, app, releaseId: remoteRelease ?? null, url: invoked2.url, status: response.status, body: body2 });
196323
196482
  return response.ok ? 0 : 1;
196324
196483
  }
196325
196484
  const invoked = await invokeLocalFunction2(loaded, name, input, params);
196326
- const text11 = await invoked.response.text();
196485
+ const text12 = await invoked.response.text();
196327
196486
  let body;
196328
196487
  try {
196329
- body = JSON.parse(text11);
196488
+ body = JSON.parse(text12);
196330
196489
  } catch {
196331
- body = text11;
196490
+ body = text12;
196332
196491
  }
196333
196492
  print({ ok: invoked.response.ok, app: loaded.app, releaseId: invoked.releaseId, status: invoked.response.status, body });
196334
196493
  return invoked.response.ok ? 0 : 1;
@@ -197495,8 +197654,8 @@ function pushAuthHint(status, token, target, hasOwnerIssuer = true) {
197495
197654
  }
197496
197655
  async function contentVisibility(dir) {
197497
197656
  try {
197498
- const { readFileSync: readFileSync127 } = await import("node:fs");
197499
- const m2 = JSON.parse(readFileSync127(join89(dir, "himalaya.content.json"), "utf8"));
197657
+ const { readFileSync: readFileSync128 } = await import("node:fs");
197658
+ const m2 = JSON.parse(readFileSync128(join89(dir, "himalaya.content.json"), "utf8"));
197500
197659
  if (m2.visibility === "public" || m2.visibility === "unlisted") return m2.visibility;
197501
197660
  } catch {
197502
197661
  }
@@ -198464,8 +198623,8 @@ import { resolve as resolve70 } from "node:path";
198464
198623
 
198465
198624
  // ../../core/admin-web/src/utils/qr-terminal.ts
198466
198625
  init_qr();
198467
- function qrTerminal(text11, opts = {}) {
198468
- const { modules, size } = encodeQr(text11);
198626
+ function qrTerminal(text12, opts = {}) {
198627
+ const { modules, size } = encodeQr(text12);
198469
198628
  const quietZone = opts.quietZone ?? 4;
198470
198629
  const dim = size + quietZone * 2;
198471
198630
  const dark = (x2, y2) => x2 >= quietZone && x2 < quietZone + size && y2 >= quietZone && y2 < quietZone + size ? modules[y2 - quietZone][x2 - quietZone] : false;
@@ -200036,6 +200195,10 @@ function wixPlayerTestflightTarget(requested) {
200036
200195
  }
200037
200196
  async function testflightCommand(ctx) {
200038
200197
  const { io: io2, deps, pos, flags, command } = ctx;
200198
+ if (command === "store" && pos[1] === "apple-keys") {
200199
+ const { runAppleKeys: runAppleKeys2 } = await Promise.resolve().then(() => (init_apple_keys(), apple_keys_exports));
200200
+ return runAppleKeys2(pos, flags, io2);
200201
+ }
200039
200202
  if (command === "store" && pos[1] === "iap") {
200040
200203
  const { runStoreIap: runStoreIap2, defaultStoreIapDeps: defaultStoreIapDeps2 } = await Promise.resolve().then(() => (init_store_iap(), store_iap_exports));
200041
200204
  return runStoreIap2(pos, flags, io2, { ...defaultStoreIapDeps2(), validateConfig: createTrimValidator(deps) });
@@ -200665,7 +200828,7 @@ ${label3}`);
200665
200828
 
200666
200829
  // src/commands/login.ts
200667
200830
  init_config();
200668
- import { readFileSync as readFileSync111 } from "node:fs";
200831
+ import { readFileSync as readFileSync112 } from "node:fs";
200669
200832
  init_browser_login();
200670
200833
  init_wix_owner();
200671
200834
  init_owner_claim();
@@ -200886,7 +201049,7 @@ async function loginCommand(ctx) {
200886
201049
  const dpxPath = dpxSessionTokenPath();
200887
201050
  let dpx;
200888
201051
  try {
200889
- dpx = readFileSync111(dpxPath, "utf8").trim();
201052
+ dpx = readFileSync112(dpxPath, "utf8").trim();
200890
201053
  } catch {
200891
201054
  io2.error(JSON.stringify({ error: `no dpx session at ${dpxPath} \u2014 run \`dpx auth login\` then \`dpx auth token > ${dpxPath}\` (dpx 2.x keeps its own state in ~/.dpx/auth.json and does NOT write the legacy session file), or omit --dpx` }));
200892
201055
  return 1;
@@ -201253,7 +201416,7 @@ async function upgradeCommand(ctx) {
201253
201416
 
201254
201417
  // src/commands/doctor.ts
201255
201418
  init_config();
201256
- import { statSync as statSync26, accessSync as accessSync2, constants as constants6 } from "node:fs";
201419
+ import { statSync as statSync27, accessSync as accessSync2, constants as constants6 } from "node:fs";
201257
201420
  import { join as join102 } from "node:path";
201258
201421
  init_wix_owner();
201259
201422
  init_owner_claim();
@@ -201301,7 +201464,7 @@ function executableOnPath(name, env = process.env) {
201301
201464
  for (const suffix of suffixes) {
201302
201465
  const candidate = join102(dir, `${name}${suffix}`);
201303
201466
  try {
201304
- if (!statSync26(candidate).isFile()) continue;
201467
+ if (!statSync27(candidate).isFile()) continue;
201305
201468
  if (process.platform !== "win32") accessSync2(candidate, constants6.X_OK);
201306
201469
  return true;
201307
201470
  } catch {
@@ -201744,7 +201907,7 @@ async function guideCommand(ctx) {
201744
201907
  }
201745
201908
 
201746
201909
  // src/commands/secrets.ts
201747
- import { readFileSync as readFileSync113 } from "node:fs";
201910
+ import { readFileSync as readFileSync114 } from "node:fs";
201748
201911
  init_cli_shared();
201749
201912
  async function secretsCommand(ctx) {
201750
201913
  const { io: io2, pos, flags } = ctx;
@@ -201765,7 +201928,7 @@ async function secretsCommand(ctx) {
201765
201928
  const path2 = dpxSessionTokenPath();
201766
201929
  let raw;
201767
201930
  try {
201768
- raw = readFileSync113(path2, "utf8");
201931
+ raw = readFileSync114(path2, "utf8");
201769
201932
  } catch {
201770
201933
  io2.error(JSON.stringify({ error: `no DPX BO session at ${path2}` }));
201771
201934
  return 1;
@@ -201783,7 +201946,7 @@ init_schema2();
201783
201946
  // src/cms.ts
201784
201947
  init_cms_schema();
201785
201948
  init_wix_owner();
201786
- import { existsSync as existsSync97, readFileSync as readFileSync114, writeFileSync as writeFileSync37 } from "node:fs";
201949
+ import { existsSync as existsSync97, readFileSync as readFileSync115, writeFileSync as writeFileSync37 } from "node:fs";
201787
201950
  import { join as join104 } from "node:path";
201788
201951
  var FOREIGN_DETAIL_LIMIT = 25;
201789
201952
  var MAX_COLLECTION_PAGES = 40;
@@ -202308,7 +202471,7 @@ function readSeedFile(dir) {
202308
202471
  if (!existsSync97(file2)) return {};
202309
202472
  let parsed;
202310
202473
  try {
202311
- parsed = JSON.parse(readFileSync114(file2, "utf8"));
202474
+ parsed = JSON.parse(readFileSync115(file2, "utf8"));
202312
202475
  } catch (e2) {
202313
202476
  throw new Error(`cms-seed.json is not valid JSON (${e2.message}). Fix or delete it.`);
202314
202477
  }
@@ -202370,7 +202533,7 @@ async function writeSeedRows(opts) {
202370
202533
  if (existsSync97(file2)) {
202371
202534
  let parsed;
202372
202535
  try {
202373
- parsed = JSON.parse(readFileSync114(file2, "utf8"));
202536
+ parsed = JSON.parse(readFileSync115(file2, "utf8"));
202374
202537
  } catch (e2) {
202375
202538
  throw new Error(
202376
202539
  `cms-seed.json is not valid JSON (${e2.message}). Refusing to regenerate, because overwriting it would discard the rows already in it. Fix the JSON, or delete the file if you want a fresh set.`
@@ -203268,14 +203431,14 @@ function createTrimValidator(deps = {}, spawnFn = spawn9) {
203268
203431
  const parsed = JSON.parse(report3);
203269
203432
  counts = parsed.counts;
203270
203433
  if (Array.isArray(parsed.findings)) {
203271
- const text11 = (v2) => typeof v2 === "string" && v2 ? v2 : void 0;
203434
+ const text12 = (v2) => typeof v2 === "string" && v2 ? v2 : void 0;
203272
203435
  errors = parsed.findings.filter((f2) => f2 && f2.severity === "error" && typeof f2.id === "string").map((f2) => ({
203273
203436
  id: f2.id,
203274
- message: text11(f2.message) ?? "",
203275
- ...text11(f2.pass) ? { pass: text11(f2.pass) } : {},
203276
- ...text11(f2.screen) ? { screen: text11(f2.screen) } : {},
203277
- ...text11(f2.path) ? { path: text11(f2.path) } : {},
203278
- ...text11(f2.ruleCode) ? { ruleCode: text11(f2.ruleCode) } : {}
203437
+ message: text12(f2.message) ?? "",
203438
+ ...text12(f2.pass) ? { pass: text12(f2.pass) } : {},
203439
+ ...text12(f2.screen) ? { screen: text12(f2.screen) } : {},
203440
+ ...text12(f2.path) ? { path: text12(f2.path) } : {},
203441
+ ...text12(f2.ruleCode) ? { ruleCode: text12(f2.ruleCode) } : {}
203279
203442
  }));
203280
203443
  }
203281
203444
  } catch {