@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 +912 -749
- package/guides/himi-json-output.md +29 -0
- package/guides/iap-products.md +49 -4
- package/package.json +2 -2
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(
|
|
698
|
-
const match = new RegExp(`(?:^|\\n)##[ \\t]+${heading}\\b[^\\n]*([\\s\\S]*?)(?=\\n##[ \\t]|$)`, "i").exec(
|
|
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(
|
|
728
|
-
const contract = section(
|
|
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(
|
|
739
|
-
const acceptance = section(
|
|
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(
|
|
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
|
|
767
|
+
const text12 = mobileUxDocumentBody(mobile);
|
|
768
768
|
const findings = [];
|
|
769
|
-
if (!/^## Implementation acceptance\b/im.test(
|
|
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(
|
|
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(
|
|
776
|
-
const gap = primaryCtaStructureGap(
|
|
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(
|
|
785
|
-
findings.push({ code: "missing-width-evidence", message: widthEvidenceMessage(
|
|
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(
|
|
795
|
+
function widthMentions(text12) {
|
|
796
796
|
const mentions = [];
|
|
797
|
-
for (const match of
|
|
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 =
|
|
803
|
-
const before =
|
|
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
|
|
2744
|
+
const text12 = await res.text();
|
|
2745
2745
|
if (!res.ok) {
|
|
2746
|
-
throw new JobServiceError(`oauth failed for scope ${scope2}`, res.status, truncate(
|
|
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(
|
|
2750
|
+
token = JSON.parse(text12).access_token;
|
|
2751
2751
|
} catch {
|
|
2752
|
-
throw new JobServiceError(`oauth returned non-JSON for scope ${scope2}`, res.status, truncate(
|
|
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
|
|
2766
|
+
const text12 = await res.text();
|
|
2767
2767
|
if (!res.ok) {
|
|
2768
|
-
throw new JobServiceError(`job service ${method} ${path2} failed`, res.status, truncate(
|
|
2768
|
+
throw new JobServiceError(`job service ${method} ${path2} failed`, res.status, truncate(text12));
|
|
2769
2769
|
}
|
|
2770
|
-
if (!
|
|
2770
|
+
if (!text12) return {};
|
|
2771
2771
|
try {
|
|
2772
|
-
return JSON.parse(
|
|
2772
|
+
return JSON.parse(text12);
|
|
2773
2773
|
} catch {
|
|
2774
|
-
throw new JobServiceError(`job service ${method} ${path2} returned non-JSON`, res.status, truncate(
|
|
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
|
|
3567
|
+
const text12 = (value2) => typeof value2 === "string" && value2 ? value2 : void 0;
|
|
3568
3568
|
const message2 = (value2) => {
|
|
3569
3569
|
const item = record3(value2);
|
|
3570
|
-
if (
|
|
3571
|
-
if (
|
|
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
|
|
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:
|
|
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:
|
|
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:
|
|
3603
|
-
path:
|
|
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:
|
|
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
|
|
4152
|
-
if (Buffer.byteLength(
|
|
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
|
|
5257
|
-
const s2 =
|
|
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
|
|
6036
|
+
const text12 = textNodes.map((n2) => n2.data).join(" ").replace(/\s+/g, " ").trim();
|
|
6037
6037
|
if (["Text", "RichText"].includes(type)) {
|
|
6038
|
-
const matches = [...
|
|
6039
|
-
if (/{{|}}/.test(
|
|
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] ===
|
|
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 =
|
|
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 =
|
|
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 (
|
|
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" && (
|
|
6069
|
-
else if (
|
|
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(
|
|
8094
|
-
const begins =
|
|
8095
|
-
const ends =
|
|
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 &&
|
|
8097
|
+
return begins === 1 && ends === 1 && text12.indexOf(BLOCK_BEGIN) < text12.indexOf(BLOCK_END) && BLOCK_RE.test(text12);
|
|
8098
8098
|
}
|
|
8099
|
-
function withoutBlock(
|
|
8100
|
-
const m2 = BLOCK_RE.exec(
|
|
8101
|
-
if (!m2) return
|
|
8102
|
-
const before =
|
|
8103
|
-
const after =
|
|
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(
|
|
8112
|
-
return STAMP_RE.exec(
|
|
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 = (
|
|
8576
|
-
if (
|
|
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 <
|
|
8581
|
-
const c2 =
|
|
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 === "/" &&
|
|
8595
|
-
while (i2 <
|
|
8594
|
+
if (c2 === "/" && text12[i2 + 1] === "/") {
|
|
8595
|
+
while (i2 < text12.length && text12[i2] !== "\n") i2++;
|
|
8596
8596
|
continue;
|
|
8597
8597
|
}
|
|
8598
|
-
if (c2 === "/" &&
|
|
8598
|
+
if (c2 === "/" && text12[i2 + 1] === "*") {
|
|
8599
8599
|
i2 += 2;
|
|
8600
|
-
while (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
|
|
13211
|
-
if (
|
|
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:
|
|
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
|
|
13461
|
-
return
|
|
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(
|
|
14994
|
+
function matchBraceSafe(text12, open) {
|
|
14995
14995
|
let depth = 0;
|
|
14996
|
-
for (let i2 = open; i2 <
|
|
14997
|
-
const c2 =
|
|
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 <
|
|
15002
|
-
if (
|
|
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 === "/" &&
|
|
15008
|
-
while (i2 <
|
|
15007
|
+
if (c2 === "/" && text12[i2 + 1] === "/") {
|
|
15008
|
+
while (i2 < text12.length && text12[i2] !== "\n") i2++;
|
|
15009
15009
|
continue;
|
|
15010
15010
|
}
|
|
15011
|
-
if (c2 === "/" &&
|
|
15011
|
+
if (c2 === "/" && text12[i2 + 1] === "*") {
|
|
15012
15012
|
i2 += 2;
|
|
15013
|
-
while (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(
|
|
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
|
|
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(
|
|
18369
|
+
function parseRevocationsYaml(text12) {
|
|
18370
18370
|
const out2 = { app: "", revoked: [] };
|
|
18371
18371
|
let inList = false;
|
|
18372
|
-
for (const raw of
|
|
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
|
|
18751
|
+
let text12;
|
|
18752
18752
|
try {
|
|
18753
|
-
|
|
18753
|
+
text12 = readFileSync16(source, "utf8");
|
|
18754
18754
|
} catch (err) {
|
|
18755
18755
|
if (!vanished(err)) throw err;
|
|
18756
18756
|
return [];
|
|
18757
18757
|
}
|
|
18758
|
-
return registeredActions(
|
|
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(
|
|
22380
|
+
function parseCatalog(text12) {
|
|
22381
22381
|
try {
|
|
22382
|
-
const c2 = JSON.parse(
|
|
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
|
|
27927
|
+
const text12 = await res.text();
|
|
27928
27928
|
let j2 = {};
|
|
27929
27929
|
try {
|
|
27930
|
-
j2 =
|
|
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
|
|
27945
|
+
const text12 = await res.text();
|
|
27946
27946
|
let j2 = {};
|
|
27947
27947
|
try {
|
|
27948
|
-
j2 =
|
|
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
|
|
28310
|
+
const text12 = await Promise.race([res.text(), timedOut]);
|
|
28311
28311
|
let j2 = {};
|
|
28312
28312
|
try {
|
|
28313
|
-
j2 =
|
|
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
|
|
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
|
-
|
|
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(
|
|
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
|
|
28601
|
-
return { status: res.status, json:
|
|
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
|
|
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(
|
|
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
|
|
29383
|
+
const text12 = await res.text();
|
|
29384
29384
|
if (!res.ok) {
|
|
29385
|
-
return { ok: false, reason: "upstream_failed", status: res.status, detail:
|
|
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(
|
|
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
|
|
29430
|
+
const text12 = await res.text();
|
|
29431
29431
|
if (!res.ok) {
|
|
29432
|
-
return { ok: false, reason: "upstream_failed", status: res.status, detail:
|
|
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(
|
|
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
|
|
30089
|
-
const override = /Override size:\s*(\d+)x(\d+)/.exec(
|
|
30090
|
-
const physical = /Physical size:\s*(\d+)x(\d+)/.exec(
|
|
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(
|
|
32054
|
+
function mdInline(text12, linkColor) {
|
|
32055
32055
|
const safe = typeof linkColor === "string" && /^[#a-zA-Z0-9(),.%\s-]+$/.test(linkColor) ? linkColor : "";
|
|
32056
|
-
return { __html: mdScan(
|
|
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:
|
|
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:
|
|
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,
|
|
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(), ...
|
|
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
|
|
35852
|
-
return
|
|
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 = (
|
|
35876
|
-
visible +=
|
|
35877
|
-
for (let i2 = 0; i2 <
|
|
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 = (
|
|
35931
|
+
const escape3 = (text12) => text12.replace(/&/g, "&").replace(/</g, "<").replace(/>/g, ">").replace(/\"/g, """).replace(/'/g, "'").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
|
|
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",
|
|
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],
|
|
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",
|
|
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:
|
|
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",
|
|
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",
|
|
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
|
|
36127
|
-
const rooted = pdfRootPageCount(
|
|
36126
|
+
const text12 = pdfObjectSyntax(new TextDecoder("latin1").decode(bytes2));
|
|
36127
|
+
const rooted = pdfRootPageCount(text12);
|
|
36128
36128
|
let scanned = null;
|
|
36129
|
-
for (const m2 of
|
|
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(
|
|
36142
|
-
const out2 =
|
|
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 <
|
|
36148
|
-
const c2 =
|
|
36147
|
+
while (i2 < text12.length) {
|
|
36148
|
+
const c2 = text12[i2];
|
|
36149
36149
|
if (c2 === "%") {
|
|
36150
|
-
const eol =
|
|
36151
|
-
const end = eol < 0 ?
|
|
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 <
|
|
36158
|
-
const d2 =
|
|
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 === "<" &&
|
|
36169
|
-
const end =
|
|
36170
|
-
const stop = end < 0 ?
|
|
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 === "<" &&
|
|
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
|
-
|
|
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 =
|
|
36182
|
-
const stop = end < 0 ?
|
|
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,
|
|
38066
|
+
return value2.replaceAll(/=\?([\w-]*)\?([QB])\?((?:[^?]|\?(?!=))*)\?=/gi, function(matches, charset, encoding, text12) {
|
|
38067
38067
|
if (encoding === "q" || encoding === "Q") {
|
|
38068
|
-
|
|
38069
|
-
|
|
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,
|
|
38072
|
+
return textdecode(charset, text12);
|
|
38073
38073
|
}
|
|
38074
38074
|
try {
|
|
38075
|
-
|
|
38075
|
+
text12 = atob(text12);
|
|
38076
38076
|
} catch {
|
|
38077
38077
|
}
|
|
38078
|
-
return textdecode(charset,
|
|
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(
|
|
41871
|
-
return PROPER_BASE_PARSE && !isCallable(reviver) ? nativeParse(
|
|
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(
|
|
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(
|
|
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
|
|
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:
|
|
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(
|
|
46819
|
-
if (
|
|
46818
|
+
set data(text12) {
|
|
46819
|
+
if (text12 !== this.#text) {
|
|
46820
46820
|
this.#richText = null;
|
|
46821
46821
|
}
|
|
46822
|
-
if (
|
|
46822
|
+
if (text12 === null) {
|
|
46823
46823
|
this.#text = "";
|
|
46824
46824
|
this.#deleted = true;
|
|
46825
46825
|
return;
|
|
46826
46826
|
}
|
|
46827
|
-
this.#text =
|
|
46827
|
+
this.#text = text12;
|
|
46828
46828
|
this.#date = /* @__PURE__ */ new Date();
|
|
46829
46829
|
this.#deleted = false;
|
|
46830
46830
|
}
|
|
46831
46831
|
restoreData({
|
|
46832
|
-
text:
|
|
46832
|
+
text: text12,
|
|
46833
46833
|
richText,
|
|
46834
46834
|
date
|
|
46835
46835
|
}) {
|
|
46836
|
-
this.#text =
|
|
46836
|
+
this.#text = text12;
|
|
46837
46837
|
this.#richText = richText;
|
|
46838
46838
|
this.#date = date;
|
|
46839
46839
|
this.#deleted = false;
|
|
46840
46840
|
}
|
|
46841
|
-
setInitialText(
|
|
46842
|
-
this.#initialText =
|
|
46843
|
-
this.data =
|
|
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(
|
|
47895
|
-
await this.#altText?.setGuessedText(
|
|
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:
|
|
47942
|
+
text: text12,
|
|
47943
47943
|
date,
|
|
47944
47944
|
deleted
|
|
47945
47945
|
}
|
|
47946
47946
|
} = this.#comment;
|
|
47947
47947
|
return {
|
|
47948
|
-
text:
|
|
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(
|
|
58742
|
+
set commentText(text12) {
|
|
58743
58743
|
const {
|
|
58744
58744
|
data
|
|
58745
58745
|
} = this;
|
|
58746
58746
|
const popup = {
|
|
58747
|
-
deleted: !
|
|
58748
|
-
contents:
|
|
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 (!
|
|
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(
|
|
59315
|
-
this.editor.comment =
|
|
59316
|
-
if (!
|
|
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(
|
|
60775
|
-
if (
|
|
60774
|
+
set comment(text12) {
|
|
60775
|
+
if (text12 === this.comment) {
|
|
60776
60776
|
return;
|
|
60777
60777
|
}
|
|
60778
|
-
this.#firstElement.commentText = this.#commentText =
|
|
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(
|
|
60895
|
+
#makePopupContent(text12) {
|
|
60896
60896
|
const popupLines = [];
|
|
60897
60897
|
const popupContent = {
|
|
60898
|
-
str:
|
|
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
|
|
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 = (
|
|
62426
|
-
this.#content =
|
|
62427
|
-
if (!
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
118796
|
+
function rememberReveal(text12, n2) {
|
|
118797
118797
|
if (revealProgress.size > 500) revealProgress.clear();
|
|
118798
|
-
revealProgress.set(
|
|
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
|
|
119643
|
-
if (
|
|
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
|
|
122002
|
+
const text12 = isBoundText ? typeof bound2 === "string" || typeof bound2 === "number" ? String(bound2) : "" : literalErrorText;
|
|
122003
122003
|
if (props.visible === false) return null;
|
|
122004
|
-
if (isBoundText && !
|
|
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
|
-
|
|
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
|
|
122813
|
-
const box = /* @__PURE__ */ jsx11(PickerFieldBox, { look, ctx, option: picked, text:
|
|
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:
|
|
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:
|
|
123332
|
-
const tokens2 = React13.useMemo(() =>
|
|
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(
|
|
123335
|
-
[
|
|
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 =
|
|
123341
|
+
prevRef.current = text12;
|
|
123342
123342
|
if (reduce) {
|
|
123343
|
-
rememberReveal(
|
|
123343
|
+
rememberReveal(text12, total);
|
|
123344
123344
|
setShown(total);
|
|
123345
123345
|
return;
|
|
123346
123346
|
}
|
|
123347
|
-
let start = revealProgress.get(
|
|
123348
|
-
if (start == null) start = prev != null &&
|
|
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(
|
|
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(
|
|
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
|
-
}, [
|
|
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
|
|
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,
|
|
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
|
-
|
|
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
|
|
127260
|
-
if (
|
|
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
|
|
129212
|
-
if (!chatroomId || !
|
|
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,
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
129558
|
+
const text12 = `event: dev.ready
|
|
129559
129559
|
data: ${JSON.stringify(payload)}
|
|
129560
129560
|
|
|
129561
129561
|
`;
|
|
129562
129562
|
if (res) {
|
|
129563
|
-
res.write(
|
|
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
|
|
131628
|
+
const text12 = await upstream.text();
|
|
131629
131629
|
res.writeHead(upstream.status, { "Content-Type": "application/json", ...cors });
|
|
131630
|
-
res.end(
|
|
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
|
|
133934
|
-
if (!
|
|
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] =
|
|
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:
|
|
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
|
|
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:
|
|
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
|
|
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(
|
|
137091
|
-
if (!releaseId) return
|
|
137090
|
+
function withPinnedRelease(text12, releaseId) {
|
|
137091
|
+
if (!releaseId) return text12;
|
|
137092
137092
|
let cfg;
|
|
137093
137093
|
try {
|
|
137094
|
-
cfg = JSON.parse(
|
|
137094
|
+
cfg = JSON.parse(text12);
|
|
137095
137095
|
} catch {
|
|
137096
|
-
return
|
|
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
|
|
137478
|
-
if (!
|
|
137479
|
-
if (!declared.length && !servesMessages(
|
|
137480
|
-
const hash2 = sha2563(
|
|
137481
|
-
await putDoc(app, hash2,
|
|
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(
|
|
137486
|
+
function servesMessages(text12) {
|
|
137487
137487
|
try {
|
|
137488
|
-
const m2 = JSON.parse(
|
|
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
|
|
137584
|
-
await put(
|
|
137585
|
-
return { hash: sha2563(
|
|
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(
|
|
137686
|
+
async function withStoreNavBundle(text12, address) {
|
|
137687
137687
|
let cfg;
|
|
137688
137688
|
try {
|
|
137689
|
-
cfg = JSON.parse(
|
|
137689
|
+
cfg = JSON.parse(text12);
|
|
137690
137690
|
} catch {
|
|
137691
|
-
return
|
|
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
|
|
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
|
|
137700
|
+
if (!name) return text12;
|
|
137701
137701
|
const addressed = await address(name);
|
|
137702
|
-
if (!addressed) return
|
|
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(
|
|
137711
|
+
function linkableScreenIdsFrom(text12) {
|
|
137712
137712
|
let cfg;
|
|
137713
137713
|
try {
|
|
137714
|
-
cfg = JSON.parse(
|
|
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(
|
|
137726
|
+
function withoutDevOnlyAppConfig(text12) {
|
|
137727
137727
|
let cfg;
|
|
137728
137728
|
try {
|
|
137729
|
-
cfg = JSON.parse(
|
|
137729
|
+
cfg = JSON.parse(text12);
|
|
137730
137730
|
} catch {
|
|
137731
|
-
return
|
|
137731
|
+
return text12;
|
|
137732
137732
|
}
|
|
137733
|
-
if (!cfg || typeof cfg !== "object" || !("devGatewayConfig" in cfg)) return
|
|
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(
|
|
137738
|
-
if (!prod?.serve) return
|
|
137737
|
+
function withProdServeAppConfig(text12, prod) {
|
|
137738
|
+
if (!prod?.serve) return text12;
|
|
137739
137739
|
let cfg;
|
|
137740
137740
|
try {
|
|
137741
|
-
cfg = JSON.parse(
|
|
137741
|
+
cfg = JSON.parse(text12);
|
|
137742
137742
|
} catch {
|
|
137743
|
-
return
|
|
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
|
|
138128
|
-
if (!Buffer.from(
|
|
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,
|
|
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,
|
|
138283
|
+
const depthRefusalFromText = (status, text12) => {
|
|
138284
138284
|
if (status !== 422) return null;
|
|
138285
138285
|
try {
|
|
138286
|
-
const body = JSON.parse(
|
|
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
|
|
138295
|
-
const finding2 = depthRefusalFromText(res.status,
|
|
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:
|
|
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
|
|
138550
|
+
const text12 = await res.text();
|
|
138551
138551
|
try {
|
|
138552
|
-
const doc = JSON.parse(
|
|
138552
|
+
const doc = JSON.parse(text12);
|
|
138553
138553
|
if (!publishedFontPlan) {
|
|
138554
|
-
if (!("fontFaces" in doc)) return
|
|
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
|
|
138563
|
+
return text12;
|
|
138564
138564
|
}
|
|
138565
138565
|
}
|
|
138566
138566
|
};
|
|
138567
138567
|
},
|
|
138568
|
-
(
|
|
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
|
|
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,
|
|
138604
|
-
appConfigHash = sha2563(
|
|
138605
|
-
if (collect2?.descriptors) for (const id of linkableScreenIdsFrom(
|
|
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(
|
|
139541
|
-
const bytes2 = [...new TextEncoder().encode(
|
|
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
|
|
139782
|
-
const same3 = lines.find((l2) => l2.text ===
|
|
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:
|
|
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
|
|
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))
|
|
140640
|
+
if (Buffer.from(decoded, "utf8").equals(entry.bytes)) text12[entry.path] = decoded;
|
|
140641
140641
|
}
|
|
140642
|
-
const sentineled = sentinelizeArchive(
|
|
140642
|
+
const sentineled = sentinelizeArchive(text12, declaredApp);
|
|
140643
140643
|
for (const entry of restored) {
|
|
140644
|
-
if (!(entry.path in
|
|
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:
|
|
140725
|
-
const m2 = JSON.parse(
|
|
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
|
|
141141
|
-
let parsed =
|
|
141140
|
+
const text12 = await res.text();
|
|
141141
|
+
let parsed = text12;
|
|
141142
141142
|
try {
|
|
141143
|
-
parsed =
|
|
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
|
|
141314
|
-
let parsed =
|
|
141313
|
+
const text12 = await res.text();
|
|
141314
|
+
let parsed = text12;
|
|
141315
141315
|
try {
|
|
141316
|
-
parsed =
|
|
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
|
|
141418
|
-
let parsed =
|
|
141417
|
+
const text12 = await res.text();
|
|
141418
|
+
let parsed = text12;
|
|
141419
141419
|
try {
|
|
141420
|
-
parsed =
|
|
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(
|
|
141618
|
+
function parseStoreConfig(text12) {
|
|
141619
141619
|
const cfg = {};
|
|
141620
141620
|
let section3 = null;
|
|
141621
|
-
for (const raw of
|
|
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
|
|
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 (
|
|
146793
|
-
else
|
|
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
|
|
146832
|
-
if (
|
|
146833
|
-
} else if (
|
|
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
|
|
147012
|
-
|
|
147013
|
-
return
|
|
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(
|
|
149318
|
+
function parseJson2(text12, what) {
|
|
149319
149319
|
try {
|
|
149320
|
-
const value2 = JSON.parse(
|
|
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,
|
|
149905
|
+
for (const [rel, text12] of Object.entries(src.workerFiles)) {
|
|
149906
149906
|
if (!rel.startsWith(`tier5-src/${dir}/`)) continue;
|
|
149907
|
-
for (const m2 of
|
|
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
|
|
149954
|
-
if (r3 === app.home && homeModules?.text !== void 0)
|
|
149955
|
-
if (
|
|
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
|
|
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(
|
|
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
|
|
150501
|
-
for (const m2 of
|
|
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
|
|
150511
|
+
const text12 = all.get(f2) ?? "";
|
|
150512
150512
|
const before = wix.size;
|
|
150513
|
-
for (const m2 of
|
|
150514
|
-
const r3 = /\bwixApi\b/.test(
|
|
150515
|
-
const fe2 = /(?<![.\w])fetch\s*\(/.test(
|
|
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
|
|
150964
|
+
const text12 = await response.text();
|
|
150965
150965
|
let parsed = null;
|
|
150966
150966
|
try {
|
|
150967
|
-
const value2 =
|
|
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
|
|
151112
|
-
return { at: at2, end: at2, text: `${lead} ${trailing ?
|
|
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(
|
|
151123
|
-
const lineStart =
|
|
151124
|
-
return /^[ \t]*/.exec(
|
|
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(
|
|
152634
|
-
if (!
|
|
152635
|
-
const first =
|
|
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(/"/g, '"').replace(/'/g, "'").replace(/</g, "<").replace(/>/g, ">").replace(/ /g, " ").replace(/&/g, "&").replace(/\s+/g, " ");
|
|
152647
152647
|
}
|
|
152648
|
-
function painted(
|
|
152648
|
+
function painted(text12, page) {
|
|
152649
152649
|
if (page === void 0) return true;
|
|
152650
|
-
const probe2 =
|
|
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:
|
|
153930
|
-
for (const m2 of
|
|
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
|
|
154462
|
-
if (
|
|
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(
|
|
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,
|
|
154951
|
+
function syntaxErrors(file2, text12) {
|
|
154952
154952
|
if (file2.endsWith(".json")) {
|
|
154953
154953
|
try {
|
|
154954
|
-
JSON.parse(
|
|
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(
|
|
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
|
|
154982
|
-
if (!pairs.some(([from]) =>
|
|
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,
|
|
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,
|
|
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 =
|
|
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
|
|
155306
|
-
const owner = OWNER_WORDS.test(
|
|
155307
|
-
const want = new Set(tokens(
|
|
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 (
|
|
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, "&").replace(/"/g, """).replace(/</g, "<").replace(/>/g, ">");
|
|
156927
156927
|
}
|
|
156928
156928
|
function renderHealthPermissionCopyXml(copy, indent) {
|
|
156929
|
-
const
|
|
156930
|
-
if (!
|
|
156931
|
-
return [`${indent}<meta-data android:name="${HEALTH_PERMISSION_COPY_META}" android:value="${xmlAttr(
|
|
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
|
|
157099
|
-
if (hasMarkers(
|
|
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(
|
|
157135
|
-
return
|
|
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(
|
|
157198
|
-
return
|
|
157197
|
+
function countBeginMarkers(text12, kind, label3) {
|
|
157198
|
+
return text12.split("\n").filter((l2) => isBegin(l2, kind, label3)).length;
|
|
157199
157199
|
}
|
|
157200
|
-
function countEndMarkers(
|
|
157201
|
-
return
|
|
157200
|
+
function countEndMarkers(text12, kind, label3) {
|
|
157201
|
+
return text12.split("\n").filter((l2) => isEnd(l2, kind, label3)).length;
|
|
157202
157202
|
}
|
|
157203
|
-
function hasMarkers(
|
|
157204
|
-
const lines =
|
|
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(
|
|
157208
|
-
const opens = countBeginMarkers(
|
|
157209
|
-
const closes = countEndMarkers(
|
|
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(
|
|
157218
|
-
assertSingleMarkerPair(
|
|
157219
|
-
const lines =
|
|
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
|
|
157260
|
-
if (hasMarkers(
|
|
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
|
|
157497
|
-
if (!hasMarkers(
|
|
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
|
|
157507
|
-
const r3 = applyToFile(yml, "yaml", LABEL_LOCALWEB, renderLocalWebYaml(resourcesDirOf(
|
|
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
|
|
158522
|
-
const types = ["Json", "JsonObject"].filter((t2) => new RegExp(`\\b${t2}\\b`).test(
|
|
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
|
|
158534
|
+
const text12 = renderBase44Types(list2, app);
|
|
158535
158535
|
const path2 = join57(dir, BASE44_TYPES_PATH);
|
|
158536
|
-
const changed = !existsSync58(path2) || readFileSync67(path2, "utf8") !==
|
|
158536
|
+
const changed = !existsSync58(path2) || readFileSync67(path2, "utf8") !== text12;
|
|
158537
158537
|
if (changed) {
|
|
158538
158538
|
mkdirSync26(dirname33(path2), { recursive: true });
|
|
158539
|
-
writeFileSync22(path2,
|
|
158539
|
+
writeFileSync22(path2, text12);
|
|
158540
158540
|
}
|
|
158541
|
-
return { path: path2, changed, entities:
|
|
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(
|
|
159509
|
-
const body =
|
|
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
|
|
159536
|
+
let text12;
|
|
159537
159537
|
try {
|
|
159538
|
-
|
|
159538
|
+
text12 = readFileSync72(p2, "utf8");
|
|
159539
159539
|
} catch {
|
|
159540
159540
|
continue;
|
|
159541
159541
|
}
|
|
159542
|
-
const plan = parseDataAccess(
|
|
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((
|
|
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
|
|
161388
|
+
let text12;
|
|
161389
161389
|
try {
|
|
161390
|
-
|
|
161390
|
+
text12 = readFileSync77(file2, "utf8");
|
|
161391
161391
|
} catch {
|
|
161392
161392
|
return [];
|
|
161393
161393
|
}
|
|
161394
|
-
if (!
|
|
161395
|
-
return mobileUxMarkerFindings(
|
|
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
|
|
163219
|
+
const text12 = await response.text();
|
|
163220
163220
|
let body;
|
|
163221
163221
|
try {
|
|
163222
|
-
body = JSON.parse(
|
|
163222
|
+
body = JSON.parse(text12);
|
|
163223
163223
|
} catch {
|
|
163224
|
-
body =
|
|
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
|
|
164329
|
-
if (
|
|
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(
|
|
164334
|
-
const acceptance = mobileUxSection(mobileUxDocumentBody(
|
|
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 = (
|
|
164339
|
-
return source.some(({ text:
|
|
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
|
|
168023
|
-
return
|
|
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
|
|
168027
|
+
let text12 = "";
|
|
168028
168028
|
for (; ; ) {
|
|
168029
168029
|
const { done, value: value2 } = await reader.read();
|
|
168030
168030
|
if (done) break;
|
|
168031
|
-
|
|
168032
|
-
if (
|
|
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
|
-
|
|
168039
|
-
return
|
|
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
|
|
168055
|
-
if (
|
|
168056
|
-
return { ok: true, status: res.status, body:
|
|
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
|
|
168279
|
+
const text12 = await res.text();
|
|
168280
168280
|
let parsed = {};
|
|
168281
168281
|
try {
|
|
168282
|
-
parsed =
|
|
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
|
|
168302
|
+
const text12 = await res.text();
|
|
168303
168303
|
let parsed = {};
|
|
168304
168304
|
try {
|
|
168305
|
-
parsed =
|
|
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
|
|
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(
|
|
169930
|
-
return new Response(
|
|
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
|
|
170140
|
-
return JSON.parse(
|
|
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
|
|
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 =
|
|
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 =
|
|
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 =
|
|
170547
|
+
const w2 = text12(await store.getWidget?.(app, id) ?? null);
|
|
170548
170548
|
if (w2 !== void 0) widgets[id] = w2;
|
|
170549
170549
|
}
|
|
170550
|
-
const appConfig =
|
|
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:
|
|
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
|
|
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,
|
|
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
|
|
171099
|
-
if (res.status === 409 || /already (exists|in use)|duplicate|ENTITY_ERROR.*identifier/i.test(
|
|
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}: ${
|
|
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 =
|
|
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(
|
|
171513
|
+
scrub(text12) {
|
|
171356
171514
|
const { keyId, issuerId, privateKeyPem } = this.options.key;
|
|
171357
|
-
let out2 =
|
|
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,
|
|
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:
|
|
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,
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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
|
|
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
|
-
|
|
171919
|
-
product = (resource) => ({ id: resource.id, productId:
|
|
171920
|
-
version3 = (resource) => ({ id: resource.id, state:
|
|
171921
|
-
localization = (resource) => ({ id: resource.id, locale:
|
|
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(
|
|
172030
|
-
return CREDENTIAL_SHAPES.some((shape) => shape.test(
|
|
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(
|
|
172201
|
+
function parseJson3(text12, label3) {
|
|
172044
172202
|
try {
|
|
172045
|
-
return JSON.parse(
|
|
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(
|
|
172051
|
-
const doc = parseJson3(
|
|
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
|
|
173000
|
-
if (!
|
|
173001
|
-
return
|
|
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
|
|
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,
|
|
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,
|
|
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
|
|
173093
|
-
const { value: value2, state } = await ensure({ write: () => api2.createLocalization(versionId,
|
|
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
|
|
173100
|
-
const localizationId = required(run2.localizations.find((l2) => l2.locale ===
|
|
173101
|
-
const { value: value2, state } = await ensure({ write: () => api2.updateLocalization(localizationId,
|
|
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
|
|
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(
|
|
173526
|
+
function parseProfile(text12, label3) {
|
|
173369
173527
|
let doc;
|
|
173370
173528
|
try {
|
|
173371
|
-
doc = JSON.parse(
|
|
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) =>
|
|
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
|
|
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
|
|
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) =>
|
|
173502
|
-
const realpath = options.realpath ??
|
|
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:
|
|
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(
|
|
173540
|
-
const chars = [...
|
|
173541
|
-
return chars.length <= max ?
|
|
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 = (
|
|
173849
|
+
sha2 = (text12) => createHash46("sha256").update(text12).digest("hex");
|
|
173692
173850
|
ENTITIES = { "&": "&", " ": " ", "<": "<", ">": ">", """: '"', "'": "'" };
|
|
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
|
|
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 =
|
|
173977
|
-
const gradle =
|
|
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
|
|
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(
|
|
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(
|
|
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 =
|
|
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:
|
|
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:
|
|
174194
|
-
amount:
|
|
174195
|
-
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 =
|
|
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 =
|
|
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 =
|
|
174217
|
-
const status =
|
|
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:
|
|
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:
|
|
174382
|
+
saleStatus: text10(t2.saleStatus),
|
|
174224
174383
|
hidden: boolean3(t2.hidden),
|
|
174225
|
-
priceType:
|
|
174226
|
-
amount:
|
|
174227
|
-
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,
|
|
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
|
-
|
|
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
|
|
174254
|
-
return
|
|
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
|
|
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
|
|
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(/ | | /gi, "\xA0").replace(/&/g, "&");
|
|
174828
174987
|
}
|
|
174829
|
-
function manifestWithScreenshots(
|
|
174830
|
-
const doc = JSON.parse(
|
|
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
|
|
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(
|
|
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
|
|
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
|
|
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
|
|
175217
|
+
const text12 = readInput(deps, path2, "plan");
|
|
175059
175218
|
try {
|
|
175060
|
-
return verifyPlan2(JSON.parse(
|
|
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
|
|
175230
|
+
const text12 = `${JSON.stringify(plan, null, 2)}
|
|
175072
175231
|
`;
|
|
175073
|
-
if (out2.carriesSecret(
|
|
175074
|
-
deps.writeFileAtomic(path2,
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
175287
|
-
if (!territories.includes(base)) throw new
|
|
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
|
|
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
|
|
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
|
|
175378
|
-
if (!/^[A-Z0-9]{10}$/.test(keyId)) throw new
|
|
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 ??
|
|
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
|
|
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
|
|
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
|
|
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
|
|
175564
|
-
if (productId === void 0 !== (active === void 0)) throw new
|
|
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
|
|
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,
|
|
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
|
|
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(
|
|
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 =
|
|
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) =>
|
|
175726
|
-
readBytes: (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,
|
|
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
|
-
|
|
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(
|
|
175798
|
-
this.io.log(this.scrub(
|
|
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(
|
|
175812
|
-
return this.secrets.some((secret) => secret && (
|
|
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(
|
|
175815
|
-
let out2 =
|
|
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
|
|
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
|
|
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)) ?
|
|
176381
|
-
const storeConfig = existsSync94(storeConfigPath(app)) ?
|
|
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 (
|
|
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(
|
|
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 (!
|
|
176749
|
+
if (!statSync26(d2).isDirectory()) continue;
|
|
176591
176750
|
for (const png of readdirSync39(d2).filter((n2) => n2.endsWith(".png"))) {
|
|
176592
|
-
const sz = pngSize2(
|
|
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 (!
|
|
176606
|
-
return [LEGACY_PLACEHOLDER_SHA2562, createHash47("sha256").update(
|
|
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 (!
|
|
176642
|
-
const bytes2 =
|
|
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
|
|
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,
|
|
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
|
|
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() :
|
|
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() :
|
|
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
|
|
177343
|
+
const text12 = await response.text();
|
|
177185
177344
|
let output;
|
|
177186
177345
|
try {
|
|
177187
|
-
output = JSON.parse(
|
|
177346
|
+
output = JSON.parse(text12);
|
|
177188
177347
|
} catch {
|
|
177189
|
-
output =
|
|
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(
|
|
177406
|
+
function objectFrom(text12) {
|
|
177248
177407
|
try {
|
|
177249
|
-
const value2 =
|
|
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 &&
|
|
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(
|
|
177490
|
-
const missing3 = [...input.app ? [] : ["app"], ...input.site ? [] : ["site"], ...REQUIRED_FLAGS.filter((f2) => !(allMembers && f2 === "member-email") && !
|
|
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 =
|
|
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:
|
|
177510
|
-
title:
|
|
177511
|
-
...
|
|
177512
|
-
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:
|
|
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,
|
|
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
|
-
|
|
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
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
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 =
|
|
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 (
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
178789
|
-
throw new Base44RequestError(res.status,
|
|
178947
|
+
const text13 = await res.text().catch(() => "");
|
|
178948
|
+
throw new Base44RequestError(res.status, text13.slice(0, 500), what);
|
|
178790
178949
|
}
|
|
178791
|
-
const
|
|
178950
|
+
const text12 = await res.text();
|
|
178792
178951
|
try {
|
|
178793
|
-
return JSON.parse(
|
|
178952
|
+
return JSON.parse(text12);
|
|
178794
178953
|
} catch {
|
|
178795
|
-
throw new Base44RequestError(res.status, `unreadable response: ${
|
|
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
|
|
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(
|
|
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(
|
|
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(
|
|
179222
|
+
function parseJsonc(text12) {
|
|
179064
179223
|
let out2 = "";
|
|
179065
179224
|
let i2 = 0;
|
|
179066
179225
|
let inStr = false;
|
|
179067
|
-
while (i2 <
|
|
179068
|
-
const c2 =
|
|
179226
|
+
while (i2 < text12.length) {
|
|
179227
|
+
const c2 = text12[i2];
|
|
179069
179228
|
if (inStr) {
|
|
179070
179229
|
out2 += c2;
|
|
179071
179230
|
if (c2 === "\\") {
|
|
179072
|
-
out2 +=
|
|
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 === "/" &&
|
|
179085
|
-
while (i2 <
|
|
179086
|
-
} else if (c2 === "/" &&
|
|
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 <
|
|
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(
|
|
179256
|
+
function dropTrailingCommas(text12) {
|
|
179098
179257
|
let out2 = "";
|
|
179099
179258
|
let inStr = false;
|
|
179100
|
-
for (let i2 = 0; i2 <
|
|
179101
|
-
const c2 =
|
|
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 +=
|
|
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 <
|
|
179112
|
-
if (
|
|
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
|
|
179120
|
-
if (
|
|
179278
|
+
const text12 = files.get(path2);
|
|
179279
|
+
if (text12 === void 0) return void 0;
|
|
179121
179280
|
try {
|
|
179122
|
-
const v2 = parseJsonc(
|
|
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
|
|
179653
|
-
if (
|
|
179811
|
+
const text12 = files.get(cfgPath);
|
|
179812
|
+
if (text12 === void 0) continue;
|
|
179654
179813
|
let cfg;
|
|
179655
179814
|
try {
|
|
179656
|
-
cfg = parseJsonc(
|
|
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,
|
|
179828
|
+
for (const [path2, text12] of files) {
|
|
179670
179829
|
if (!isEntityFile(path2)) continue;
|
|
179671
179830
|
let v2;
|
|
179672
179831
|
try {
|
|
179673
|
-
v2 = parseJsonc(
|
|
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
|
|
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(
|
|
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
|
|
179867
|
-
const dotted = /:((?:\d{1,3}\.){3}\d{1,3})$/.exec(
|
|
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
|
-
|
|
180032
|
+
text12 = `${text12.slice(0, dotted.index)}:${hi2}:${lo2}`;
|
|
179874
180033
|
}
|
|
179875
|
-
const halves =
|
|
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(
|
|
180156
|
-
return PLACEHOLDER_RE.test(
|
|
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(
|
|
180163
|
-
return
|
|
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(
|
|
180169
|
-
return BOILERPLATE_RE.test(
|
|
180327
|
+
function isBoilerplate(text12) {
|
|
180328
|
+
return BOILERPLATE_RE.test(text12) || PLACEHOLDER_RE.test(text12);
|
|
180170
180329
|
}
|
|
180171
180330
|
function copyOrDrop(raw, cap) {
|
|
180172
|
-
const
|
|
180173
|
-
if (
|
|
180174
|
-
if (isBoilerplate(
|
|
180175
|
-
if (!/[A-Za-zͰ--]/.test(
|
|
180176
|
-
return
|
|
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
|
|
180273
|
-
if (
|
|
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
|
|
180366
|
-
html +=
|
|
180367
|
-
if (CODE_APP_ID_DONE_RE.test(overlap +
|
|
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 +
|
|
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
|
|
180598
|
-
if (!
|
|
180599
|
-
const plain2 =
|
|
180756
|
+
const text12 = typeof raw === "string" ? raw : str8(raw?.text);
|
|
180757
|
+
if (!text12) continue;
|
|
180758
|
+
const plain2 = text12.replace(/<[^>]*>/g, " ").replace(/ /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(
|
|
181081
|
-
const t2 =
|
|
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
|
|
182039
|
+
let text12 = value2;
|
|
181881
182040
|
try {
|
|
181882
|
-
|
|
182041
|
+
text12 = decodeURIComponent(value2);
|
|
181883
182042
|
} catch {
|
|
181884
182043
|
}
|
|
181885
|
-
return
|
|
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
|
|
181974
|
-
if (!
|
|
181975
|
-
put(rel,
|
|
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(
|
|
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(
|
|
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
|
|
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(
|
|
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
|
|
185826
|
-
return
|
|
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
|
|
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 =
|
|
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 (
|
|
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 = (
|
|
188505
|
-
if (
|
|
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
|
|
189195
|
-
return
|
|
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
|
|
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(
|
|
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 =
|
|
189548
|
-
realRoot =
|
|
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 (!
|
|
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(
|
|
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(
|
|
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(
|
|
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(
|
|
189660
|
-
const tokens2 = JSON.parse(
|
|
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(
|
|
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(
|
|
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(
|
|
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 =
|
|
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
|
|
190502
|
-
let json8 =
|
|
190660
|
+
const text12 = await res.text();
|
|
190661
|
+
let json8 = text12;
|
|
190503
190662
|
try {
|
|
190504
|
-
json8 =
|
|
190663
|
+
json8 = text12 ? JSON.parse(text12) : null;
|
|
190505
190664
|
} catch {
|
|
190506
190665
|
}
|
|
190507
|
-
return { status: res.status, json: json8, text:
|
|
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
|
|
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(
|
|
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) ?
|
|
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 =
|
|
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(
|
|
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
|
|
191065
|
-
let parsed =
|
|
191223
|
+
const text12 = await res.text();
|
|
191224
|
+
let parsed = text12;
|
|
191066
191225
|
try {
|
|
191067
|
-
parsed =
|
|
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
|
|
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}: ${
|
|
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 =
|
|
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
|
|
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:
|
|
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
|
|
191744
|
-
const redacted = redactLiteral(
|
|
191745
|
-
if (redacted !==
|
|
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
|
|
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 =
|
|
192313
|
-
schema =
|
|
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
|
|
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(
|
|
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
|
|
192999
|
+
const text12 = await res.text();
|
|
192841
193000
|
let json8 = null;
|
|
192842
193001
|
try {
|
|
192843
|
-
json8 =
|
|
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:
|
|
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
|
|
195498
|
-
if (!
|
|
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:
|
|
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(
|
|
196161
|
-
if (!
|
|
196162
|
-
return /EADDRINUSE/i.test(
|
|
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
|
|
196474
|
+
const text13 = await response.text();
|
|
196316
196475
|
let body2;
|
|
196317
196476
|
try {
|
|
196318
|
-
body2 = JSON.parse(
|
|
196477
|
+
body2 = JSON.parse(text13);
|
|
196319
196478
|
} catch {
|
|
196320
|
-
body2 =
|
|
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
|
|
196485
|
+
const text12 = await invoked.response.text();
|
|
196327
196486
|
let body;
|
|
196328
196487
|
try {
|
|
196329
|
-
body = JSON.parse(
|
|
196488
|
+
body = JSON.parse(text12);
|
|
196330
196489
|
} catch {
|
|
196331
|
-
body =
|
|
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:
|
|
197499
|
-
const m2 = JSON.parse(
|
|
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(
|
|
198468
|
-
const { modules, size } = encodeQr(
|
|
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
|
|
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 =
|
|
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
|
|
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 (!
|
|
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
|
|
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 =
|
|
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
|
|
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(
|
|
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(
|
|
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
|
|
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:
|
|
203275
|
-
...
|
|
203276
|
-
...
|
|
203277
|
-
...
|
|
203278
|
-
...
|
|
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 {
|