@wix/himalaya-cli 0.1397.0 → 0.1399.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/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/serve-runtime/src/wix-bridge.d.ts +30 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/icon-catalog.generated.d.ts +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +2 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/validation.d.ts +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/auth/src/copy.generated.d.ts +109 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/auth/src/feedback.d.ts +15 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/auth/src/index.d.ts +3 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/screens/src/index.d.ts +44 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/auth.mjs +304 -18
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/core/validation.mjs +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/core.mjs +72 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/screens.mjs +377 -20
- package/dist/cli.mjs +983 -342
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/component-reference.json +1 -1
- package/guides/component-reference.md +2 -0
- package/guides/headless-loop.md +1 -1
- package/guides/importable-sdks.md +2 -1
- package/guides/one-app-to-himi-app.md +30 -0
- package/guides/one-app-viewer.md +8 -1
- package/guides/sdk-reference.json +92 -1
- package/package.json +2 -2
- package/templates/beauty-salon/dev/index.ts +41 -1
- package/templates/beauty-salon/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/beauty-salon-owner/dev/index.ts +304 -7
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-widget-view.ts +63 -16
- package/templates/branded-lite/dev/index.ts +41 -1
- package/templates/branded-lite/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/community-club/dev/index.ts +41 -1
- package/templates/community-club/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/community-club-owner/dev/index.ts +304 -7
- package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/community-club-owner/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/community-club-owner/tier5-src/_shared/aria-widget-view.ts +63 -16
- package/templates/events-meetups/dev/index.ts +41 -1
- package/templates/events-meetups/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/events-meetups-owner/dev/index.ts +304 -7
- package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/events-meetups-owner/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/events-meetups-owner/tier5-src/_shared/aria-widget-view.ts +63 -16
- package/templates/gym-fitness/dev/index.ts +41 -1
- package/templates/gym-fitness/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/gym-fitness-owner/dev/index.ts +304 -7
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-widget-view.ts +63 -16
- package/templates/nonprofit-cause/dev/index.ts +41 -1
- package/templates/nonprofit-cause/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/nonprofit-cause-owner/dev/index.ts +304 -7
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-widget-view.ts +63 -16
- package/templates/owner-lite/dev/index.ts +304 -7
- package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/owner-lite/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/owner-lite/tier5-src/_shared/aria-widget-view.ts +63 -16
- package/templates/podcast-creator/dev/index.ts +41 -1
- package/templates/podcast-creator/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/podcast-creator-owner/dev/index.ts +304 -7
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-widget-view.ts +63 -16
- package/templates/portfolio-creative/dev/index.ts +41 -1
- package/templates/portfolio-creative/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/portfolio-creative-owner/dev/index.ts +304 -7
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-widget-view.ts +63 -16
- package/templates/restaurant/dev/index.ts +41 -1
- package/templates/restaurant/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/restaurant-owner/dev/index.ts +304 -7
- package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/restaurant-owner/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/restaurant-owner/tier5-src/_shared/aria-widget-view.ts +63 -16
- package/templates/retail-store/dev/index.ts +41 -1
- package/templates/retail-store/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/retail-store-owner/dev/index.ts +304 -7
- package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/retail-store-owner/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/retail-store-owner/tier5-src/_shared/aria-widget-view.ts +63 -16
- package/templates/yoga-studio/dev/index.ts +41 -1
- package/templates/yoga-studio/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/yoga-studio-owner/dev/index.ts +304 -7
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +39 -33
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-widget-model.ts +26 -4
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-widget-view.ts +63 -16
package/dist/cli.mjs
CHANGED
|
@@ -660,37 +660,37 @@ var init_file_store = __esm({
|
|
|
660
660
|
mkdirSync2(this.appDir(app), { recursive: true });
|
|
661
661
|
writeFileSync2(join2(this.appDir(app), "release-manifest.json"), JSON.stringify(manifest, null, 2));
|
|
662
662
|
}
|
|
663
|
-
async putScreen(app, screenId,
|
|
663
|
+
async putScreen(app, screenId, json7) {
|
|
664
664
|
const dir = join2(this.appDir(app), "screens");
|
|
665
665
|
mkdirSync2(dir, { recursive: true });
|
|
666
|
-
writeFileSync2(join2(dir, `${this.safe(screenId)}.json`),
|
|
666
|
+
writeFileSync2(join2(dir, `${this.safe(screenId)}.json`), json7);
|
|
667
667
|
}
|
|
668
668
|
async putBundle(app, sha2566, bytes2) {
|
|
669
669
|
const dir = join2(this.appDir(app), "bundles");
|
|
670
670
|
mkdirSync2(dir, { recursive: true });
|
|
671
671
|
writeFileSync2(join2(dir, `${this.safe(sha2566)}.bundle.js`), bytes2);
|
|
672
672
|
}
|
|
673
|
-
async putTokens(app,
|
|
673
|
+
async putTokens(app, json7) {
|
|
674
674
|
mkdirSync2(this.appDir(app), { recursive: true });
|
|
675
|
-
writeFileSync2(join2(this.appDir(app), "tokens.json"),
|
|
675
|
+
writeFileSync2(join2(this.appDir(app), "tokens.json"), json7);
|
|
676
676
|
}
|
|
677
|
-
async putDoc(app, sha2566,
|
|
677
|
+
async putDoc(app, sha2566, json7) {
|
|
678
678
|
const dir = join2(this.appDir(app), "docs");
|
|
679
679
|
mkdirSync2(dir, { recursive: true });
|
|
680
|
-
writeFileSync2(join2(dir, `${this.safe(sha2566)}.json`),
|
|
680
|
+
writeFileSync2(join2(dir, `${this.safe(sha2566)}.json`), json7);
|
|
681
681
|
}
|
|
682
|
-
async putAppConfig(app,
|
|
682
|
+
async putAppConfig(app, json7) {
|
|
683
683
|
mkdirSync2(this.appDir(app), { recursive: true });
|
|
684
|
-
writeFileSync2(join2(this.appDir(app), "app-config.json"),
|
|
684
|
+
writeFileSync2(join2(this.appDir(app), "app-config.json"), json7);
|
|
685
685
|
}
|
|
686
686
|
async putIcon(app, bytes2) {
|
|
687
687
|
mkdirSync2(this.appDir(app), { recursive: true });
|
|
688
688
|
writeFileSync2(join2(this.appDir(app), "icon.png"), bytes2);
|
|
689
689
|
}
|
|
690
|
-
async putWidget(app, widgetId,
|
|
690
|
+
async putWidget(app, widgetId, json7) {
|
|
691
691
|
const dir = join2(this.appDir(app), "widgets");
|
|
692
692
|
mkdirSync2(dir, { recursive: true });
|
|
693
|
-
writeFileSync2(join2(dir, `${this.safe(widgetId)}.json`),
|
|
693
|
+
writeFileSync2(join2(dir, `${this.safe(widgetId)}.json`), json7);
|
|
694
694
|
}
|
|
695
695
|
// Per-app settings (registry visibility) — release-independent, so it lives beside the
|
|
696
696
|
// manifest, not inside it. NOTE: listApps() keys on release-manifest.json/ledger presence,
|
|
@@ -701,8 +701,8 @@ var init_file_store = __esm({
|
|
|
701
701
|
}
|
|
702
702
|
// Template scaffold source archive — a content-addressed JSON doc, so it rides the same
|
|
703
703
|
// docs/ slot as putDoc (retention via retainedReleaseRefs.docs, which includes sourceHash).
|
|
704
|
-
async putSource(app, sha2566,
|
|
705
|
-
return this.putDoc(app, sha2566,
|
|
704
|
+
async putSource(app, sha2566, json7) {
|
|
705
|
+
return this.putDoc(app, sha2566, json7);
|
|
706
706
|
}
|
|
707
707
|
// App-owned resources. Stored EXTENSIONLESS under assets/<sha> — the content-type lives
|
|
708
708
|
// on the manifest record, so the bytes on disk carry no format assumption (unlike
|
|
@@ -2953,10 +2953,10 @@ function writeAttestation(input, opts = {}) {
|
|
|
2953
2953
|
};
|
|
2954
2954
|
const attestation = { ...unsigned, selfHash: "" };
|
|
2955
2955
|
attestation.selfHash = selfHashFor(attestation);
|
|
2956
|
-
const
|
|
2956
|
+
const json7 = JSON.stringify(attestation, null, 2) + "\n";
|
|
2957
2957
|
const runFile = `${runId.replace(/:/g, "-")}.json`;
|
|
2958
|
-
writeFileSync5(join6(dir, runFile),
|
|
2959
|
-
writeFileSync5(join6(dir, "latest.json"),
|
|
2958
|
+
writeFileSync5(join6(dir, runFile), json7);
|
|
2959
|
+
writeFileSync5(join6(dir, "latest.json"), json7);
|
|
2960
2960
|
const keep = Math.max(1, opts.maxRuns ?? DEFAULT_MAX_RUNS);
|
|
2961
2961
|
const allPriorRuns = readdirSync3(dir).filter((name) => name.endsWith(".json") && name !== "latest.json").filter((name) => name !== runFile).sort().reverse();
|
|
2962
2962
|
const priorRuns = allPriorRuns.filter((name) => {
|
|
@@ -5695,8 +5695,8 @@ var init_catalog_v2 = __esm({
|
|
|
5695
5695
|
"../html-to-t5/catalog.v2.json"() {
|
|
5696
5696
|
catalog_v2_default = {
|
|
5697
5697
|
encoding: "gzip-base64",
|
|
5698
|
-
sha256: "
|
|
5699
|
-
data: "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"
|
|
5698
|
+
sha256: "162ed13c5698a6cabad890dfb32b13d7a5ca00f67e7b92e19c8484a8b7337b33",
|
|
5699
|
+
data: "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"
|
|
5700
5700
|
};
|
|
5701
5701
|
}
|
|
5702
5702
|
});
|
|
@@ -5708,10 +5708,10 @@ function decodeCatalogEnvelope(value) {
|
|
|
5708
5708
|
const envelope = value;
|
|
5709
5709
|
if (!envelope || envelope.encoding !== "gzip-base64" || typeof envelope.data !== "string" || typeof envelope.sha256 !== "string")
|
|
5710
5710
|
throw new Error("Unsupported HHP catalog encoding; regenerate the catalog.");
|
|
5711
|
-
const
|
|
5712
|
-
if (createHash5("sha256").update(
|
|
5711
|
+
const json7 = gunzipSync(Buffer.from(envelope.data, "base64"), { maxOutputLength: 2 * 1024 * 1024 }).toString("utf8");
|
|
5712
|
+
if (createHash5("sha256").update(json7).digest("hex") !== envelope.sha256)
|
|
5713
5713
|
throw new Error("HHP catalog integrity check failed; regenerate the catalog.");
|
|
5714
|
-
return JSON.parse(
|
|
5714
|
+
return JSON.parse(json7);
|
|
5715
5715
|
}
|
|
5716
5716
|
var init_catalog_envelope = __esm({
|
|
5717
5717
|
"../html-to-t5/src/v2/catalog-envelope.ts"() {
|
|
@@ -9782,16 +9782,16 @@ function utf8Length(s2, cap) {
|
|
|
9782
9782
|
}
|
|
9783
9783
|
return n2;
|
|
9784
9784
|
}
|
|
9785
|
-
function repairLoneSurrogateEscapes(
|
|
9786
|
-
if (!
|
|
9785
|
+
function repairLoneSurrogateEscapes(json7) {
|
|
9786
|
+
if (!json7.includes("\\u")) return json7;
|
|
9787
9787
|
const hexAt = (i2) => {
|
|
9788
|
-
const h2 =
|
|
9788
|
+
const h2 = json7.slice(i2, i2 + 4);
|
|
9789
9789
|
return /^[0-9A-Fa-f]{4}$/.test(h2) ? parseInt(h2, 16) : -1;
|
|
9790
9790
|
};
|
|
9791
9791
|
let out2 = "";
|
|
9792
9792
|
let inString = false;
|
|
9793
|
-
for (let i2 = 0; i2 <
|
|
9794
|
-
const c2 =
|
|
9793
|
+
for (let i2 = 0; i2 < json7.length; i2++) {
|
|
9794
|
+
const c2 = json7[i2];
|
|
9795
9795
|
if (!inString) {
|
|
9796
9796
|
if (c2 === '"') inString = true;
|
|
9797
9797
|
out2 += c2;
|
|
@@ -9802,11 +9802,11 @@ function repairLoneSurrogateEscapes(json6) {
|
|
|
9802
9802
|
out2 += c2;
|
|
9803
9803
|
continue;
|
|
9804
9804
|
}
|
|
9805
|
-
if (c2 !== "\\" || i2 + 1 >=
|
|
9805
|
+
if (c2 !== "\\" || i2 + 1 >= json7.length) {
|
|
9806
9806
|
out2 += c2;
|
|
9807
9807
|
continue;
|
|
9808
9808
|
}
|
|
9809
|
-
const e2 =
|
|
9809
|
+
const e2 = json7[i2 + 1];
|
|
9810
9810
|
const v2 = e2 === "u" ? hexAt(i2 + 2) : -1;
|
|
9811
9811
|
if (v2 < 0) {
|
|
9812
9812
|
out2 += c2 + e2;
|
|
@@ -9814,9 +9814,9 @@ function repairLoneSurrogateEscapes(json6) {
|
|
|
9814
9814
|
continue;
|
|
9815
9815
|
}
|
|
9816
9816
|
if (v2 >= 55296 && v2 <= 56319) {
|
|
9817
|
-
const low =
|
|
9817
|
+
const low = json7[i2 + 6] === "\\" && json7[i2 + 7] === "u" ? hexAt(i2 + 8) : -1;
|
|
9818
9818
|
if (low >= 56320 && low <= 57343) {
|
|
9819
|
-
out2 +=
|
|
9819
|
+
out2 += json7.slice(i2, i2 + 12);
|
|
9820
9820
|
i2 += 11;
|
|
9821
9821
|
continue;
|
|
9822
9822
|
}
|
|
@@ -9829,7 +9829,7 @@ function repairLoneSurrogateEscapes(json6) {
|
|
|
9829
9829
|
i2 += 5;
|
|
9830
9830
|
continue;
|
|
9831
9831
|
}
|
|
9832
|
-
out2 +=
|
|
9832
|
+
out2 += json7.slice(i2, i2 + 6);
|
|
9833
9833
|
i2 += 5;
|
|
9834
9834
|
}
|
|
9835
9835
|
return out2;
|
|
@@ -9848,12 +9848,12 @@ function measure(nodes, limits) {
|
|
|
9848
9848
|
}
|
|
9849
9849
|
return count2 > limits.maxNodes ? "too_many_nodes" : null;
|
|
9850
9850
|
}
|
|
9851
|
-
function layoutRichContent(
|
|
9852
|
-
if (
|
|
9853
|
-
if (utf8Length(
|
|
9851
|
+
function layoutRichContent(json7, limits = RICH_CONTENT_LIMITS2) {
|
|
9852
|
+
if (json7 === "") return { blocks: [] };
|
|
9853
|
+
if (utf8Length(json7, limits.maxBytes) > limits.maxBytes) return { rejected: "too_large" };
|
|
9854
9854
|
let parsed;
|
|
9855
9855
|
try {
|
|
9856
|
-
parsed = JSON.parse(repairLoneSurrogateEscapes(
|
|
9856
|
+
parsed = JSON.parse(repairLoneSurrogateEscapes(json7));
|
|
9857
9857
|
} catch {
|
|
9858
9858
|
return { rejected: "invalid_json" };
|
|
9859
9859
|
}
|
|
@@ -10206,14 +10206,14 @@ function resolveActionEvaluator(explicit) {
|
|
|
10206
10206
|
}
|
|
10207
10207
|
function responseBytes(value) {
|
|
10208
10208
|
try {
|
|
10209
|
-
const
|
|
10210
|
-
if (typeof
|
|
10209
|
+
const json7 = JSON.stringify(value);
|
|
10210
|
+
if (typeof json7 !== "string") return 0;
|
|
10211
10211
|
const envelope = JSON.stringify({
|
|
10212
10212
|
protocol: "himi.t5.frame/1",
|
|
10213
10213
|
type: "bridge",
|
|
10214
|
-
payload: { op: "wix_result", id: "k000000", ok: true, payload:
|
|
10214
|
+
payload: { op: "wix_result", id: "k000000", ok: true, payload: json7 }
|
|
10215
10215
|
});
|
|
10216
|
-
return typeof envelope === "string" ? utf8Budget(envelope) : utf8Budget(
|
|
10216
|
+
return typeof envelope === "string" ? utf8Budget(envelope) : utf8Budget(json7);
|
|
10217
10217
|
} catch {
|
|
10218
10218
|
return 0;
|
|
10219
10219
|
}
|
|
@@ -11757,6 +11757,7 @@ function validateScreenDescriptor(screenId, descriptor, opts = {}) {
|
|
|
11757
11757
|
scanItemsPath(descriptor, "");
|
|
11758
11758
|
}
|
|
11759
11759
|
const ITEMS_PATH_HOST_TYPES = /* @__PURE__ */ new Set(["LazyList", "Grid", "Carousel", "Menu", "MediaPlayer"]);
|
|
11760
|
+
const ITEMS_PATH_SELF_BOUND_TYPES = /* @__PURE__ */ new Set(["Legend"]);
|
|
11760
11761
|
const scanItemsPathHost = (node, at2) => {
|
|
11761
11762
|
if (Array.isArray(node)) {
|
|
11762
11763
|
node.forEach((v3, i2) => scanItemsPathHost(v3, `${at2}[${i2}]`));
|
|
@@ -11768,7 +11769,7 @@ function validateScreenDescriptor(screenId, descriptor, opts = {}) {
|
|
|
11768
11769
|
const props = body?.props;
|
|
11769
11770
|
const itemsPath = props?.itemsPath;
|
|
11770
11771
|
const type = body?.type;
|
|
11771
|
-
if (typeof itemsPath === "string" && itemsPath.length > 0 && typeof type === "string" && !ITEMS_PATH_HOST_TYPES.has(type)) {
|
|
11772
|
+
if (typeof itemsPath === "string" && itemsPath.length > 0 && typeof type === "string" && !ITEMS_PATH_HOST_TYPES.has(type) && !ITEMS_PATH_SELF_BOUND_TYPES.has(type)) {
|
|
11772
11773
|
const core = body?.package === "himalaya";
|
|
11773
11774
|
issues.push({
|
|
11774
11775
|
severity: core ? "error" : "warning",
|
|
@@ -12758,7 +12759,8 @@ var init_validate_descriptor_core = __esm({
|
|
|
12758
12759
|
trailingIcon: "string",
|
|
12759
12760
|
validation: "any",
|
|
12760
12761
|
value: "string",
|
|
12761
|
-
valuePath: "string"
|
|
12762
|
+
valuePath: "string",
|
|
12763
|
+
visibilityToggle: "boolean"
|
|
12762
12764
|
},
|
|
12763
12765
|
TimeGrid: {
|
|
12764
12766
|
anchorDate: "string",
|
|
@@ -15445,8 +15447,8 @@ __export(quickjs_evaluator_exports, {
|
|
|
15445
15447
|
uninstallQuickJsBootEvaluator: () => uninstallQuickJsBootEvaluator
|
|
15446
15448
|
});
|
|
15447
15449
|
function inputJson(input) {
|
|
15448
|
-
const
|
|
15449
|
-
return
|
|
15450
|
+
const json7 = JSON.stringify(input ?? {});
|
|
15451
|
+
return json7 === void 0 ? "{}" : json7;
|
|
15450
15452
|
}
|
|
15451
15453
|
function timerGlobals(hide, live3) {
|
|
15452
15454
|
const hidden = new Set(hide ?? []);
|
|
@@ -25108,11 +25110,11 @@ function himiPluginManifest() {
|
|
|
25108
25110
|
};
|
|
25109
25111
|
}
|
|
25110
25112
|
function himiPluginFiles(skillMd) {
|
|
25111
|
-
const
|
|
25113
|
+
const json7 = (o2) => `${JSON.stringify(o2, null, 2)}
|
|
25112
25114
|
`;
|
|
25113
25115
|
return [
|
|
25114
|
-
{ path: ".claude-plugin/plugin.json", text:
|
|
25115
|
-
{ path: ".mcp.json", text:
|
|
25116
|
+
{ path: ".claude-plugin/plugin.json", text: json7(himiPluginManifest()) },
|
|
25117
|
+
{ path: ".mcp.json", text: json7({ mcpServers: { [HIMI_PLUGIN_NAME]: { command: HIMI_MCP_SERVER.command, args: [...HIMI_MCP_SERVER.args] } } }) },
|
|
25116
25118
|
{ path: "skills/himalaya/SKILL.md", text: skillMd }
|
|
25117
25119
|
];
|
|
25118
25120
|
}
|
|
@@ -25140,11 +25142,11 @@ function connectorPluginManifest() {
|
|
|
25140
25142
|
};
|
|
25141
25143
|
}
|
|
25142
25144
|
function connectorPluginFiles(mcpUrl, skillMd) {
|
|
25143
|
-
const
|
|
25145
|
+
const json7 = (o2) => `${JSON.stringify(o2, null, 2)}
|
|
25144
25146
|
`;
|
|
25145
25147
|
return [
|
|
25146
|
-
{ path: ".claude-plugin/plugin.json", text:
|
|
25147
|
-
{ path: ".mcp.json", text:
|
|
25148
|
+
{ path: ".claude-plugin/plugin.json", text: json7(connectorPluginManifest()) },
|
|
25149
|
+
{ path: ".mcp.json", text: json7({ mcpServers: { [CONNECTOR_PLUGIN_NAME]: { type: "http", url: mcpUrl } } }) },
|
|
25148
25150
|
{ path: `skills/${CONNECTOR_PLUGIN_NAME}/SKILL.md`, text: skillMd }
|
|
25149
25151
|
];
|
|
25150
25152
|
}
|
|
@@ -28250,8 +28252,8 @@ function lastDistFromJob(job, now = /* @__PURE__ */ new Date()) {
|
|
|
28250
28252
|
const capabilities = [...new Set(job.buildCapabilities.filter((x2) => typeof x2 === "string").map(catalogKey))].sort();
|
|
28251
28253
|
return { app: job.app, jobId: job.jobId, shell: job.shell, capabilities, finishedAt: now.toISOString() };
|
|
28252
28254
|
}
|
|
28253
|
-
function needsBinaryNotice(
|
|
28254
|
-
const nb =
|
|
28255
|
+
function needsBinaryNotice(json7) {
|
|
28256
|
+
const nb = json7?.needsBinary;
|
|
28255
28257
|
if (!nb || !Array.isArray(nb.missing)) return null;
|
|
28256
28258
|
const missing = nb.missing.filter((x2) => typeof x2 === "string");
|
|
28257
28259
|
if (!missing.length) return null;
|
|
@@ -30366,7 +30368,7 @@ function errorMessageFor(args) {
|
|
|
30366
30368
|
return defaultMessage(failure, args.catalog);
|
|
30367
30369
|
}
|
|
30368
30370
|
function shouldRevealError(args) {
|
|
30369
|
-
if (args.hasWorkerError) return true;
|
|
30371
|
+
if (args.hasWorkerError || args.feedbackShown) return true;
|
|
30370
30372
|
if (args.submitAttempted) return true;
|
|
30371
30373
|
switch (resolveMode(args.rule)) {
|
|
30372
30374
|
case "live":
|
|
@@ -31265,6 +31267,27 @@ var init_icon_catalog_generated = __esm({
|
|
|
31265
31267
|
"license": "Apache-2.0",
|
|
31266
31268
|
"libVersion": "0.45.9"
|
|
31267
31269
|
},
|
|
31270
|
+
"concealed": {
|
|
31271
|
+
"category": "status",
|
|
31272
|
+
"path": [
|
|
31273
|
+
"M15.725 13.525L14.625 12.425C15.058 11.242 14.833 10.258 13.95 9.475C13.067 8.692 12.108 8.492 11.075 8.875L9.975 7.775C10.258 7.592 10.575 7.458 10.925 7.375C11.275 7.292 11.633 7.25 12 7.25C13.183 7.25 14.188 7.663 15.013 8.488C15.838 9.313 16.25 10.317 16.25 11.5C16.25 11.867 16.204 12.229 16.113 12.588C16.021 12.946 15.892 13.258 15.725 13.525ZM18.95 16.75L17.95 15.75C18.767 15.15 19.479 14.479 20.088 13.738C20.696 12.996 21.142 12.25 21.425 11.5C20.592 9.65 19.342 8.188 17.675 7.113C16.008 6.038 14.2 5.5 12.25 5.5C11.55 5.5 10.833 5.567 10.1 5.7C9.367 5.833 8.792 5.992 8.375 6.175L7.225 5C7.808 4.733 8.554 4.5 9.463 4.3C10.371 4.1 11.258 4 12.125 4C14.508 4 16.688 4.679 18.663 6.038C20.638 7.396 22.083 9.217 23 11.5C22.567 12.567 22.008 13.542 21.325 14.425C20.642 15.308 19.85 16.083 18.95 16.75ZM20.4 22.4L16.2 18.275C15.617 18.508 14.958 18.688 14.225 18.813C13.492 18.938 12.75 19 12 19C9.567 19 7.358 18.321 5.375 16.963C3.392 15.604 1.933 13.783 1 11.5C1.333 10.633 1.796 9.788 2.388 8.963C2.979 8.138 3.7 7.35 4.55 6.6L1.4 3.45L2.45 2.375L21.375 21.3L20.4 22.4ZM5.575 7.65C4.958 8.1 4.362 8.692 3.788 9.425C3.213 10.158 2.8 10.85 2.55 11.5C3.4 13.35 4.679 14.813 6.388 15.888C8.096 16.963 10.033 17.5 12.2 17.5C12.75 17.5 13.292 17.467 13.825 17.4C14.358 17.333 14.758 17.233 15.025 17.1L13.425 15.5C13.242 15.583 13.017 15.646 12.75 15.688C12.483 15.729 12.233 15.75 12 15.75C10.833 15.75 9.833 15.342 9 14.525C8.167 13.708 7.75 12.7 7.75 11.5C7.75 11.25 7.771 11 7.813 10.75C7.854 10.5 7.917 10.275 8 10.075L5.575 7.65ZM13.2 11.2ZM10.3 12.65Z"
|
|
31274
|
+
],
|
|
31275
|
+
"style": "filled",
|
|
31276
|
+
"ios": {
|
|
31277
|
+
"sf": "eye.slash",
|
|
31278
|
+
"match": "exact"
|
|
31279
|
+
},
|
|
31280
|
+
"android": {
|
|
31281
|
+
"material": "VisibilityOff",
|
|
31282
|
+
"match": "exact"
|
|
31283
|
+
},
|
|
31284
|
+
"aliases": [
|
|
31285
|
+
"eye_slash"
|
|
31286
|
+
],
|
|
31287
|
+
"source": "material-symbols/visibility_off",
|
|
31288
|
+
"license": "Apache-2.0",
|
|
31289
|
+
"libVersion": "0.45.9"
|
|
31290
|
+
},
|
|
31268
31291
|
"cookie": {
|
|
31269
31292
|
"category": "commerce",
|
|
31270
31293
|
"path": [
|
|
@@ -31524,6 +31547,24 @@ var init_icon_catalog_generated = __esm({
|
|
|
31524
31547
|
"license": "Apache-2.0",
|
|
31525
31548
|
"libVersion": "0.45.9"
|
|
31526
31549
|
},
|
|
31550
|
+
"gift": {
|
|
31551
|
+
"category": "commerce",
|
|
31552
|
+
"path": [
|
|
31553
|
+
"M4 22L4 10.875L2 10.875L2 5.125L7.5 5.125C7.367 4.925 7.267 4.713 7.2 4.487C7.133 4.263 7.1 4.033 7.1 3.8C7.1 3.022 7.372 2.361 7.917 1.817C8.461 1.272 9.122 1 9.9 1C10.3 1 10.688 1.083 11.063 1.25C11.438 1.417 11.75 1.658 12 1.975C12.25 1.658 12.563 1.417 12.938 1.25C13.313 1.083 13.7 1 14.1 1C14.878 1 15.539 1.272 16.083 1.817C16.628 2.361 16.9 3.022 16.9 3.8C16.9 4.033 16.867 4.263 16.8 4.487C16.733 4.713 16.633 4.925 16.5 5.125L22 5.125L22 10.875L20 10.875L20 22L4 22ZM13.175 2.873C12.925 3.122 12.8 3.43 12.8 3.798C12.8 4.166 12.924 4.475 13.173 4.725C13.422 4.975 13.73 5.1 14.098 5.1C14.466 5.1 14.775 4.976 15.025 4.727C15.275 4.478 15.4 4.17 15.4 3.802C15.4 3.434 15.276 3.125 15.027 2.875C14.778 2.625 14.47 2.5 14.102 2.5C13.734 2.5 13.425 2.624 13.175 2.873ZM8.6 3.798C8.6 4.166 8.724 4.475 8.973 4.725C9.222 4.975 9.53 5.1 9.898 5.1C10.266 5.1 10.575 4.976 10.825 4.727C11.075 4.478 11.2 4.17 11.2 3.802C11.2 3.434 11.076 3.125 10.827 2.875C10.578 2.625 10.27 2.5 9.902 2.5C9.534 2.5 9.225 2.624 8.975 2.873C8.725 3.122 8.6 3.43 8.6 3.798ZM3.5 6.625L3.5 9.375L11.25 9.375L11.25 6.625L3.5 6.625ZM11.25 20.5L11.25 10.875L5.35 10.875L5.35 20.5L11.25 20.5ZM12.75 20.5L18.65 20.5L18.65 10.875L12.75 10.875L12.75 20.5ZM20.5 9.375L20.5 6.625L12.75 6.625L12.75 9.375L20.5 9.375Z"
|
|
31554
|
+
],
|
|
31555
|
+
"style": "filled",
|
|
31556
|
+
"ios": {
|
|
31557
|
+
"sf": "gift",
|
|
31558
|
+
"match": "exact"
|
|
31559
|
+
},
|
|
31560
|
+
"android": {
|
|
31561
|
+
"material": "CardGiftcard",
|
|
31562
|
+
"match": "exact"
|
|
31563
|
+
},
|
|
31564
|
+
"source": "material-symbols/featured_seasonal_and_gifts",
|
|
31565
|
+
"license": "Apache-2.0",
|
|
31566
|
+
"libVersion": "0.45.9"
|
|
31567
|
+
},
|
|
31527
31568
|
"globe": {
|
|
31528
31569
|
"category": "place",
|
|
31529
31570
|
"path": [
|
|
@@ -32087,6 +32128,25 @@ var init_icon_catalog_generated = __esm({
|
|
|
32087
32128
|
"license": "Apache-2.0",
|
|
32088
32129
|
"libVersion": "0.45.9"
|
|
32089
32130
|
},
|
|
32131
|
+
"paper_plane": {
|
|
32132
|
+
"category": "communication",
|
|
32133
|
+
"path": [
|
|
32134
|
+
"M3 20L3 4L22 12L3 20ZM4.5 17.675L18.1 12L4.5 6.25L4.5 10.45L10.55 12L4.5 13.5L4.5 17.675ZM4.5 17.675L4.5 6.25L4.5 17.675Z"
|
|
32135
|
+
],
|
|
32136
|
+
"style": "filled",
|
|
32137
|
+
"mirrorsInRTL": true,
|
|
32138
|
+
"ios": {
|
|
32139
|
+
"sf": "paperplane",
|
|
32140
|
+
"match": "exact"
|
|
32141
|
+
},
|
|
32142
|
+
"android": {
|
|
32143
|
+
"material": "Send",
|
|
32144
|
+
"match": "exact"
|
|
32145
|
+
},
|
|
32146
|
+
"source": "material-symbols/send",
|
|
32147
|
+
"license": "Apache-2.0",
|
|
32148
|
+
"libVersion": "0.45.9"
|
|
32149
|
+
},
|
|
32090
32150
|
"pause": {
|
|
32091
32151
|
"category": "media",
|
|
32092
32152
|
"path": [
|
|
@@ -32730,6 +32790,9 @@ var init_icon_catalog_generated = __esm({
|
|
|
32730
32790
|
"material": "Visibility",
|
|
32731
32791
|
"match": "exact"
|
|
32732
32792
|
},
|
|
32793
|
+
"aliases": [
|
|
32794
|
+
"eye"
|
|
32795
|
+
],
|
|
32733
32796
|
"source": "material-symbols/visibility",
|
|
32734
32797
|
"license": "Apache-2.0",
|
|
32735
32798
|
"libVersion": "0.45.9"
|
|
@@ -32841,6 +32904,8 @@ var init_icon_catalog_generated = __esm({
|
|
|
32841
32904
|
"clock": "clock",
|
|
32842
32905
|
"close": "close",
|
|
32843
32906
|
"xmark": "close",
|
|
32907
|
+
"concealed": "concealed",
|
|
32908
|
+
"eyeslash": "concealed",
|
|
32844
32909
|
"cookie": "cookie",
|
|
32845
32910
|
"copy": "copy",
|
|
32846
32911
|
"dashboard": "dashboard",
|
|
@@ -32857,6 +32922,7 @@ var init_icon_catalog_generated = __esm({
|
|
|
32857
32922
|
"filter": "filter",
|
|
32858
32923
|
"folder": "folder",
|
|
32859
32924
|
"fullscreen": "fullscreen",
|
|
32925
|
+
"gift": "gift",
|
|
32860
32926
|
"globe": "globe",
|
|
32861
32927
|
"grid": "grid",
|
|
32862
32928
|
"gridfill": "grid_fill",
|
|
@@ -32893,6 +32959,7 @@ var init_icon_catalog_generated = __esm({
|
|
|
32893
32959
|
"newspaperfill": "newspaper_fill",
|
|
32894
32960
|
"next": "next",
|
|
32895
32961
|
"skipforward": "next",
|
|
32962
|
+
"paperplane": "paper_plane",
|
|
32896
32963
|
"pause": "pause",
|
|
32897
32964
|
"people": "people",
|
|
32898
32965
|
"person": "person",
|
|
@@ -32931,6 +32998,7 @@ var init_icon_catalog_generated = __esm({
|
|
|
32931
32998
|
"trash": "trash",
|
|
32932
32999
|
"undo": "undo",
|
|
32933
33000
|
"visible": "visible",
|
|
33001
|
+
"eye": "visible",
|
|
32934
33002
|
"volume": "volume",
|
|
32935
33003
|
"warning": "warning",
|
|
32936
33004
|
"wifi": "wifi",
|
|
@@ -33371,7 +33439,107 @@ function memberInstanceRefusal(e2) {
|
|
|
33371
33439
|
if (e2 instanceof SiteInstanceUnavailable) return { status: 502, body: { error: "SiteInstanceUnavailable", metaSiteId: e2.metaSiteId, reason: e2.reason } };
|
|
33372
33440
|
return { status: 502, body: { error: "SiteInstanceUnavailable" } };
|
|
33373
33441
|
}
|
|
33374
|
-
|
|
33442
|
+
async function mintMemberSessionToken(sessionCookie, metaSiteId, fetchImpl = fetch, timeoutMs = OWNER_MINT_TIMEOUT_MS) {
|
|
33443
|
+
if (!isSafeMsid(metaSiteId)) throw new MemberSessionRefused(metaSiteId, "bad metaSiteId");
|
|
33444
|
+
const xsrf = /(?:^|;\s*)XSRF-TOKEN=([^;]+)/.exec(sessionCookie)?.[1];
|
|
33445
|
+
const ws2 = /(?:^|;\s*)wixSession2=([^;]+)/.exec(sessionCookie)?.[1];
|
|
33446
|
+
const base = { Cookie: sessionCookie, Accept: "application/json", ...xsrf ? { "x-xsrf-token": xsrf } : {} };
|
|
33447
|
+
const step = async (url, init) => {
|
|
33448
|
+
const abort = new AbortController();
|
|
33449
|
+
const timer = setTimeout(() => abort.abort(), timeoutMs);
|
|
33450
|
+
try {
|
|
33451
|
+
const res = await fetchImpl(url, { ...init, signal: abort.signal, redirect: "manual" });
|
|
33452
|
+
return { status: res.status, text: await res.text() };
|
|
33453
|
+
} catch (e2) {
|
|
33454
|
+
throw new SiteInstanceUnavailable(metaSiteId, `member session failed: ${e2?.message ?? e2}`);
|
|
33455
|
+
} finally {
|
|
33456
|
+
clearTimeout(timer);
|
|
33457
|
+
}
|
|
33458
|
+
};
|
|
33459
|
+
const verdict = (what, status) => {
|
|
33460
|
+
if (status === 401) throw new AccountSessionExpired(metaSiteId, `${what} refused (401)`);
|
|
33461
|
+
if (status === 403 || status === 404) throw new MemberSessionRefused(metaSiteId, `${what} refused (${status})`);
|
|
33462
|
+
throw new SiteInstanceUnavailable(metaSiteId, `${what} failed (${status})`);
|
|
33463
|
+
};
|
|
33464
|
+
const mint = await step(`${ONE_APP_SESSION}/${metaSiteId}/signed-instance?signed_instance_type=User`, {
|
|
33465
|
+
method: "GET",
|
|
33466
|
+
headers: { ...base, ...ws2 ? { Authorization: ws2 } : {} }
|
|
33467
|
+
});
|
|
33468
|
+
if (mint.status < 200 || mint.status >= 300) verdict("user instance", mint.status);
|
|
33469
|
+
let user;
|
|
33470
|
+
try {
|
|
33471
|
+
user = JSON.parse(mint.text).signedInstance;
|
|
33472
|
+
} catch {
|
|
33473
|
+
}
|
|
33474
|
+
if (typeof user !== "string" || !user) throw new SiteInstanceUnavailable(metaSiteId, "no user instance");
|
|
33475
|
+
const session = await step(MEMBER_SESSION_URL, {
|
|
33476
|
+
method: "POST",
|
|
33477
|
+
headers: { ...base, Authorization: user, "Content-Type": "application/json" },
|
|
33478
|
+
body: JSON.stringify({ metaSiteId })
|
|
33479
|
+
});
|
|
33480
|
+
if (session.status < 200 || session.status >= 300) verdict("member-session", session.status);
|
|
33481
|
+
let token;
|
|
33482
|
+
try {
|
|
33483
|
+
token = JSON.parse(session.text).sessionToken;
|
|
33484
|
+
} catch {
|
|
33485
|
+
}
|
|
33486
|
+
if (typeof token !== "string" || !token) throw new SiteInstanceUnavailable(metaSiteId, "no session token");
|
|
33487
|
+
return token;
|
|
33488
|
+
}
|
|
33489
|
+
function memberSessionRefusal(e2) {
|
|
33490
|
+
if (e2 instanceof AccountSessionExpired) return { status: 401, body: { error: "AccountSessionExpired" } };
|
|
33491
|
+
if (e2 instanceof MemberSessionRefused) return { status: 403, body: { error: "MemberSessionRefused" } };
|
|
33492
|
+
return { status: 502, body: { error: "SiteInstanceUnavailable" } };
|
|
33493
|
+
}
|
|
33494
|
+
function inviteShortLinkUrl(shortId) {
|
|
33495
|
+
return /^[A-Za-z0-9-]{1,64}$/.test(shortId) ? `https://wix.app/mobile.apps/${shortId}` : null;
|
|
33496
|
+
}
|
|
33497
|
+
function isInviteLanding(url) {
|
|
33498
|
+
if (url.protocol !== "https:") return false;
|
|
33499
|
+
const host = url.hostname.toLowerCase();
|
|
33500
|
+
if (host === "wix.app") return url.pathname.startsWith("/invite/");
|
|
33501
|
+
return (host === "wix.com" || host.endsWith(".wix.com")) && url.pathname.includes("/place-invites/invite-lp/");
|
|
33502
|
+
}
|
|
33503
|
+
function inviteHopAllowed(url) {
|
|
33504
|
+
if (url.protocol !== "https:" || url.port !== "" && url.port !== "443" || url.username || url.password) return false;
|
|
33505
|
+
const host = url.hostname.toLowerCase();
|
|
33506
|
+
return host === "wix.app" || host === "wix.com" || host.endsWith(".wix.com");
|
|
33507
|
+
}
|
|
33508
|
+
async function resolveInviteShortLink(shortId, fetchImpl = fetch, timeoutMs = 15e3) {
|
|
33509
|
+
const start = inviteShortLinkUrl(shortId);
|
|
33510
|
+
if (!start) return null;
|
|
33511
|
+
let url = new URL(start);
|
|
33512
|
+
for (let hop = 0; hop < INVITE_MAX_HOPS; hop++) {
|
|
33513
|
+
const abort = new AbortController();
|
|
33514
|
+
const timer = setTimeout(() => abort.abort(), timeoutMs);
|
|
33515
|
+
let res;
|
|
33516
|
+
try {
|
|
33517
|
+
res = await fetchImpl(url.toString(), { method: "GET", headers: { Accept: "text/html" }, redirect: "manual", credentials: "omit", signal: abort.signal });
|
|
33518
|
+
} catch {
|
|
33519
|
+
return null;
|
|
33520
|
+
} finally {
|
|
33521
|
+
clearTimeout(timer);
|
|
33522
|
+
}
|
|
33523
|
+
try {
|
|
33524
|
+
await res.body?.cancel();
|
|
33525
|
+
} catch {
|
|
33526
|
+
}
|
|
33527
|
+
if (res.status < 300 || res.status >= 400) return null;
|
|
33528
|
+
const location = res.headers.get("location");
|
|
33529
|
+
if (!location) return null;
|
|
33530
|
+
let next;
|
|
33531
|
+
try {
|
|
33532
|
+
next = new URL(location, url);
|
|
33533
|
+
} catch {
|
|
33534
|
+
return null;
|
|
33535
|
+
}
|
|
33536
|
+
if (isInviteLanding(next)) return next.toString();
|
|
33537
|
+
if (!inviteHopAllowed(next)) return null;
|
|
33538
|
+
url = next;
|
|
33539
|
+
}
|
|
33540
|
+
return null;
|
|
33541
|
+
}
|
|
33542
|
+
var WIX_API, ONE_APP_SESSION, OWNER_SCOPED_WIX_HOST, WIX_FORWARDABLE_HEADERS, OWNER_REFRESH_MARGIN_MS, OWNER_RENEW_MIN_AGE_MS, OWNER_MINT_TIMEOUT_MS, OwnerInstanceCache, OWNER_SITES_QUERY_PATH, OWNER_SITES_COUNT_PATH, OwnerSitesCache, ACCOUNT_FORWARD_ALLOWLIST, ACCOUNT_JOIN_PATHS, NotSiteMember, AccountSessionExpired, SiteInstanceUnavailable, MEMBER_REFRESH_MARGIN_MS, MEMBER_NEGATIVE_TTL_MS, MEMBER_TRANSIENT_TTL_MS, MemberInstanceCache, MEMBER_SESSION_URL, MemberSessionRefused, INVITE_MAX_HOPS;
|
|
33375
33543
|
var init_wix_bridge = __esm({
|
|
33376
33544
|
"../../core/serve-runtime/src/wix-bridge.ts"() {
|
|
33377
33545
|
init_sha256();
|
|
@@ -33680,6 +33848,17 @@ ${session}`);
|
|
|
33680
33848
|
return entry;
|
|
33681
33849
|
}
|
|
33682
33850
|
};
|
|
33851
|
+
MEMBER_SESSION_URL = "https://manage.wix.com/_api/users-members/v1/user-member-connections/member-session";
|
|
33852
|
+
MemberSessionRefused = class extends Error {
|
|
33853
|
+
constructor(metaSiteId, reason) {
|
|
33854
|
+
super(`MemberSessionRefused(metaSiteId: ${metaSiteId}): ${reason}`);
|
|
33855
|
+
this.metaSiteId = metaSiteId;
|
|
33856
|
+
this.reason = reason;
|
|
33857
|
+
this.name = "MemberSessionRefused";
|
|
33858
|
+
}
|
|
33859
|
+
code = "MemberSessionRefused";
|
|
33860
|
+
};
|
|
33861
|
+
INVITE_MAX_HOPS = 8;
|
|
33683
33862
|
}
|
|
33684
33863
|
});
|
|
33685
33864
|
|
|
@@ -37910,10 +38089,10 @@ function createRicosHostSession(o2) {
|
|
|
37910
38089
|
});
|
|
37911
38090
|
};
|
|
37912
38091
|
const writes = () => committed || state.dirty;
|
|
37913
|
-
const moved = (
|
|
37914
|
-
if (
|
|
37915
|
-
lastContent =
|
|
37916
|
-
if (
|
|
38092
|
+
const moved = (json7) => {
|
|
38093
|
+
if (json7 === lastContent) return false;
|
|
38094
|
+
lastContent = json7;
|
|
38095
|
+
if (json7 !== baseline) {
|
|
37917
38096
|
state.dirty = true;
|
|
37918
38097
|
if (dirtyTimer !== null) t2.clearTimeout(dirtyTimer);
|
|
37919
38098
|
dirtyTimer = t2.setTimeout(() => {
|
|
@@ -38137,13 +38316,13 @@ async function runRicosImageUpload(o2) {
|
|
|
38137
38316
|
return fail5("put");
|
|
38138
38317
|
}
|
|
38139
38318
|
if (!res.ok) return fail5("put");
|
|
38140
|
-
let
|
|
38319
|
+
let json7;
|
|
38141
38320
|
try {
|
|
38142
|
-
|
|
38321
|
+
json7 = await res.json();
|
|
38143
38322
|
} catch {
|
|
38144
38323
|
return fail5("bad_descriptor");
|
|
38145
38324
|
}
|
|
38146
|
-
const root =
|
|
38325
|
+
const root = json7 && typeof json7 === "object" ? json7 : {};
|
|
38147
38326
|
const d2 = root.file && typeof root.file === "object" ? root.file : root;
|
|
38148
38327
|
const id = typeof d2.id === "string" ? d2.id : "";
|
|
38149
38328
|
if (!id) return fail5("bad_descriptor");
|
|
@@ -38344,9 +38523,9 @@ function RichContentEditorView({ props, ctx, wrap, nodeId, renderChild, ...dom }
|
|
|
38344
38523
|
locale: ctx.localeTag ?? "en",
|
|
38345
38524
|
rtl: ctx.isRTL ?? document.documentElement.dir === "rtl",
|
|
38346
38525
|
palette: { text: C2("textPrimary", "#13171E"), background: C2("surfacePrimary", "#FFFFFF"), accent: C2("accentPrimary", "#116DFF") },
|
|
38347
|
-
onContent: (
|
|
38526
|
+
onContent: (json7) => {
|
|
38348
38527
|
const b2 = bagRef.current, n2 = nameRef.current;
|
|
38349
|
-
if (b2 && n2) b2.set(n2,
|
|
38528
|
+
if (b2 && n2) b2.set(n2, json7);
|
|
38350
38529
|
},
|
|
38351
38530
|
onToolbar: setToolbar,
|
|
38352
38531
|
onFocusChange: setFocused,
|
|
@@ -38713,13 +38892,13 @@ async function runMediaFieldUpload(o2) {
|
|
|
38713
38892
|
return { ok: false, reason: e2 instanceof Deadline || expired ? "timeout" : "put" };
|
|
38714
38893
|
}
|
|
38715
38894
|
if (!res.ok) return { ok: false, reason: "put" };
|
|
38716
|
-
let
|
|
38895
|
+
let json7;
|
|
38717
38896
|
try {
|
|
38718
|
-
|
|
38897
|
+
json7 = await bounded2(res.json());
|
|
38719
38898
|
} catch (e2) {
|
|
38720
38899
|
return { ok: false, reason: e2 instanceof Deadline || expired ? "timeout" : "bad_descriptor" };
|
|
38721
38900
|
}
|
|
38722
|
-
const root =
|
|
38901
|
+
const root = json7 && typeof json7 === "object" ? json7 : {};
|
|
38723
38902
|
const d2 = root.file && typeof root.file === "object" ? root.file : root;
|
|
38724
38903
|
const mediaId = typeof d2.id === "string" ? d2.id : "";
|
|
38725
38904
|
if (!mediaId) return { ok: false, reason: "bad_descriptor" };
|
|
@@ -45834,7 +46013,7 @@ var init_pdf = __esm({
|
|
|
45834
46013
|
var currentOrdered;
|
|
45835
46014
|
var marked = false;
|
|
45836
46015
|
var root = true;
|
|
45837
|
-
var
|
|
46016
|
+
var json7 = stringifyWithProperSymbolsConversion(text9, function(key2, value) {
|
|
45838
46017
|
key2 = $String(key2);
|
|
45839
46018
|
if (propertyList) {
|
|
45840
46019
|
if (key2 === END_MARK) {
|
|
@@ -45861,16 +46040,16 @@ var init_pdf = __esm({
|
|
|
45861
46040
|
}
|
|
45862
46041
|
return value;
|
|
45863
46042
|
}, space);
|
|
45864
|
-
if (typeof
|
|
45865
|
-
if (ILL_FORMED_UNICODE)
|
|
45866
|
-
if (!marked) return
|
|
46043
|
+
if (typeof json7 != "string") return json7;
|
|
46044
|
+
if (ILL_FORMED_UNICODE) json7 = replace(json7, surrogates, fixIllFormedJSON);
|
|
46045
|
+
if (!marked) return json7;
|
|
45867
46046
|
var result = "";
|
|
45868
|
-
var length =
|
|
46047
|
+
var length = json7.length;
|
|
45869
46048
|
for (var i2 = 0; i2 < length; i2++) {
|
|
45870
|
-
var chr = charAt(
|
|
46049
|
+
var chr = charAt(json7, i2);
|
|
45871
46050
|
if (chr === '"') {
|
|
45872
|
-
var end = parseJSONString(
|
|
45873
|
-
var string5 = slice(
|
|
46051
|
+
var end = parseJSONString(json7, ++i2).end - 1;
|
|
46052
|
+
var string5 = slice(json7, i2, end);
|
|
45874
46053
|
if (slice(string5, 0, RAW_MARK_LENGTH) === RAW_MARK) result += rawStrings[slice(string5, RAW_MARK_LENGTH)];
|
|
45875
46054
|
else if (slice(string5, 0, KEY_MARK_LENGTH) === KEY_MARK) result += '"' + slice(string5, KEY_MARK_LENGTH) + '"';
|
|
45876
46055
|
else result += '"' + string5 + '"';
|
|
@@ -123264,7 +123443,7 @@ function renderInner(node, ctx) {
|
|
|
123264
123443
|
if (!node || typeof node !== "object") return null;
|
|
123265
123444
|
const { type, props, modifiers } = normalize(node);
|
|
123266
123445
|
const hListItem = ctx.hListItem === true;
|
|
123267
|
-
if (modifiers?.theme) ctx = withTheme(ctx, modifiers.theme);
|
|
123446
|
+
if (modifiers?.theme) ctx = withTheme(ctx, resolveItemDeep2(modifiers.theme, ctx));
|
|
123268
123447
|
if (ctx.hListItem) ctx = { ...ctx, hListItem: false };
|
|
123269
123448
|
const pkg = node.body?.package;
|
|
123270
123449
|
const C2 = ctx.color;
|
|
@@ -124567,6 +124746,9 @@ var init_renderNode = __esm({
|
|
|
124567
124746
|
const onChangeAction = resolveRowAction2(props.onChange ?? cfg.onChange, ctx);
|
|
124568
124747
|
const borderless = props.borderless === true || cfg.borderless === true;
|
|
124569
124748
|
const secure = props.secure === true || cfg.secure === true;
|
|
124749
|
+
const [valueVisible, setValueVisible] = React9.useState(false);
|
|
124750
|
+
const visibilityToggle = secure && (props.visibilityToggle === true || cfg.visibilityToggle === true);
|
|
124751
|
+
const visibilityLabel = ctx.catalog?.get(valueVisible ? "auth.gate.password.hide" : "auth.gate.password.show") ?? (valueVisible ? "Hide password" : "Show password");
|
|
124570
124752
|
const erroredProp = props.error === true || cfg.error === true;
|
|
124571
124753
|
const muted = C2("textSecondary", "#888");
|
|
124572
124754
|
const pathProp = typeof props.valuePath === "string" ? props.valuePath : typeof cfg.valuePath === "string" ? cfg.valuePath : void 0;
|
|
@@ -124672,13 +124854,18 @@ var init_renderNode = __esm({
|
|
|
124672
124854
|
const hasWorkerError = Boolean(workerError && workerError.trim());
|
|
124673
124855
|
const painted2 = rawMessage === null ? "" : translateOnly(rawMessage);
|
|
124674
124856
|
const message = !painted2.trim() || ruleMessagePending && !hasWorkerError ? null : painted2;
|
|
124857
|
+
const [feedbackShown, setFeedbackShown] = React9.useState(false);
|
|
124675
124858
|
const revealed = message !== null && shouldRevealError({
|
|
124676
124859
|
rule,
|
|
124860
|
+
feedbackShown,
|
|
124677
124861
|
hasWorkerError,
|
|
124678
124862
|
touched,
|
|
124679
124863
|
focused: isFocused,
|
|
124680
124864
|
submitAttempted: formBag?.submitAttempted ?? false
|
|
124681
124865
|
});
|
|
124866
|
+
React9.useEffect(() => {
|
|
124867
|
+
if (revealed) setFeedbackShown(true);
|
|
124868
|
+
}, [revealed]);
|
|
124682
124869
|
const errored = erroredProp || revealed;
|
|
124683
124870
|
const generatedId = React9.useId();
|
|
124684
124871
|
const errorId = revealed ? `${componentId ?? generatedId}__error` : void 0;
|
|
@@ -124692,6 +124879,16 @@ var init_renderNode = __esm({
|
|
|
124692
124879
|
});
|
|
124693
124880
|
}
|
|
124694
124881
|
};
|
|
124882
|
+
const ownsPrivateDraft = React9.useRef(false);
|
|
124883
|
+
React9.useEffect(() => {
|
|
124884
|
+
if (visibilityToggle && !isBound) ownsPrivateDraft.current = true;
|
|
124885
|
+
}, [visibilityToggle, isBound]);
|
|
124886
|
+
const clearSensitiveDraft = React9.useRef(() => {
|
|
124887
|
+
});
|
|
124888
|
+
clearSensitiveDraft.current = () => {
|
|
124889
|
+
if (ownsPrivateDraft.current && !isBound) emit("");
|
|
124890
|
+
};
|
|
124891
|
+
React9.useEffect(() => () => clearSensitiveDraft.current(), []);
|
|
124695
124892
|
const onInput = (e2) => {
|
|
124696
124893
|
const v2 = e2.currentTarget.value;
|
|
124697
124894
|
setLocal(v2);
|
|
@@ -124779,13 +124976,33 @@ var init_renderNode = __esm({
|
|
|
124779
124976
|
/* @__PURE__ */ jsxs7("div", { style: composedBox, children: [
|
|
124780
124977
|
props.leadingIcon && accIcon(props.leadingIcon),
|
|
124781
124978
|
prefixText && /* @__PURE__ */ jsx10("span", { style: { color: muted, flex: "none" }, children: prefixText }),
|
|
124782
|
-
multilineBox ? /* @__PURE__ */ jsx10("textarea", { "data-component-id": componentId, id: fieldDomId, "data-component-type": componentType, ...a11yFwd, ref: inputRef, value: local, onChange: onInput, onKeyDown, onFocus: onFieldFocus, onBlur: onFieldBlur, placeholder: placeholder2, rows: 2, "aria-label": ariaLabelProp ?? placeholderName, "aria-labelledby": labelledBy, "aria-required": required3, "aria-invalid": errored || void 0, "aria-describedby": [errorId, describedByProp].filter(Boolean).join(" ") || void 0, inputMode, autoCapitalize, maxLength, autoCorrect: suggestOff ? "off" : suggestOn ? "on" : void 0, spellCheck: suggestOff ? false : suggestOn ? true : void 0, autoComplete: suggestOff ? "off" : void 0, style: inputBase }) : /* @__PURE__ */ jsx10("input", { "data-component-id": componentId, id: htmlId, "data-component-type": componentType, ...a11yFwd, ref: inputRef, type: secure ? "password" : "text", value: local, onChange: onInput, onKeyDown, onFocus: onFieldFocus, onBlur: onFieldBlur, placeholder: placeholder2, "aria-label": ariaLabelProp ?? placeholderName, "aria-labelledby": labelledBy, "aria-required": required3, "aria-invalid": errored || void 0, "aria-describedby": [errorId, describedByProp].filter(Boolean).join(" ") || void 0, inputMode, autoCapitalize, maxLength, autoCorrect: suggestOff ? "off" : suggestOn ? "on" : void 0, spellCheck: suggestOff ? false : suggestOn ? true : void 0, autoComplete: suggestOff ? "off" : void 0, enterKeyHint, style: inputBase }),
|
|
124979
|
+
multilineBox ? /* @__PURE__ */ jsx10("textarea", { "data-component-id": componentId, id: fieldDomId, "data-component-type": componentType, ...a11yFwd, ref: inputRef, value: local, onChange: onInput, onKeyDown, onFocus: onFieldFocus, onBlur: onFieldBlur, placeholder: placeholder2, rows: 2, "aria-label": ariaLabelProp ?? placeholderName, "aria-labelledby": labelledBy, "aria-required": required3, "aria-invalid": errored || void 0, "aria-describedby": [errorId, describedByProp].filter(Boolean).join(" ") || void 0, inputMode, autoCapitalize, maxLength, autoCorrect: suggestOff ? "off" : suggestOn ? "on" : void 0, spellCheck: suggestOff ? false : suggestOn ? true : void 0, autoComplete: suggestOff ? "off" : void 0, style: inputBase }) : /* @__PURE__ */ jsx10("input", { "data-component-id": componentId, id: htmlId, "data-component-type": componentType, ...a11yFwd, ref: inputRef, type: secure && !(visibilityToggle && valueVisible) ? "password" : "text", value: local, onChange: onInput, onKeyDown, onFocus: onFieldFocus, onBlur: onFieldBlur, placeholder: placeholder2, "aria-label": ariaLabelProp ?? placeholderName, "aria-labelledby": labelledBy, "aria-required": required3, "aria-invalid": errored || void 0, "aria-describedby": [errorId, describedByProp].filter(Boolean).join(" ") || void 0, inputMode, autoCapitalize, maxLength, autoCorrect: suggestOff ? "off" : suggestOn ? "on" : void 0, spellCheck: suggestOff ? false : suggestOn ? true : void 0, autoComplete: suggestOff ? "off" : void 0, enterKeyHint, style: inputBase }),
|
|
124783
124980
|
suffixText && /* @__PURE__ */ jsx10("span", { style: { color: muted, flex: "none" }, children: suffixText }),
|
|
124784
124981
|
props.clearButton && local && /* @__PURE__ */ jsx10("span", { onClick: () => {
|
|
124785
124982
|
setLocal("");
|
|
124786
124983
|
setEdited(true);
|
|
124787
124984
|
emit("");
|
|
124788
124985
|
}, style: { display: "inline-grid", placeItems: "center", width: 18, height: 18, borderRadius: "50%", background: C2("surfaceTertiary", "#e3e6ea"), color: muted, fontSize: 12, flex: "none", cursor: "pointer" }, children: "\xD7" }),
|
|
124986
|
+
visibilityToggle && /* @__PURE__ */ jsx10(
|
|
124987
|
+
"button",
|
|
124988
|
+
{
|
|
124989
|
+
type: "button",
|
|
124990
|
+
"aria-label": visibilityLabel,
|
|
124991
|
+
"aria-pressed": valueVisible,
|
|
124992
|
+
"data-component-id": `${componentId}_toggle`,
|
|
124993
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
124994
|
+
onClick: () => {
|
|
124995
|
+
const input = inputRef.current;
|
|
124996
|
+
const start = input?.selectionStart, end = input?.selectionEnd;
|
|
124997
|
+
setValueVisible(!valueVisible);
|
|
124998
|
+
queueMicrotask(() => {
|
|
124999
|
+
if (input && start != null && end != null) input.setSelectionRange(start, end);
|
|
125000
|
+
});
|
|
125001
|
+
},
|
|
125002
|
+
style: { background: "transparent", border: 0, padding: 8, minWidth: 44, minHeight: 44, display: "grid", placeItems: "center", cursor: "pointer", color: muted },
|
|
125003
|
+
children: iconSvg(valueVisible ? "eye.slash" : "eye", { size: 20, color: muted })
|
|
125004
|
+
}
|
|
125005
|
+
),
|
|
124789
125006
|
props.trailingIcon && accIcon(props.trailingIcon)
|
|
124790
125007
|
] }),
|
|
124791
125008
|
revealed ? /* @__PURE__ */ jsx10("span", { id: errorId, role: "alert", style: { fontFamily: bodyFont(ctx), fontSize: pxToRem(12), color: C2("danger", "#E62214"), paddingLeft: 2 }, children: message }) : (props.helperText ?? cfg.helperText) != null ? /* @__PURE__ */ jsx10("span", { style: { fontFamily: bodyFont(ctx), fontSize: pxToRem(12), color: errored ? C2("danger", "#E62214") : muted, paddingLeft: 2 }, children: txt(props.helperText ?? cfg.helperText, ctx) }) : null
|
|
@@ -132081,6 +132298,47 @@ function webWixSession(req, res, state) {
|
|
|
132081
132298
|
}
|
|
132082
132299
|
return session;
|
|
132083
132300
|
}
|
|
132301
|
+
async function pipeWebWixStream(upstream, res, signal, recordStream) {
|
|
132302
|
+
res.statusCode = upstream.status;
|
|
132303
|
+
for (const name of ["content-type", "cache-control", "retry-after"]) {
|
|
132304
|
+
const value = upstream.headers.get(name);
|
|
132305
|
+
if (value) res.setHeader(name, value);
|
|
132306
|
+
}
|
|
132307
|
+
res.setHeader("access-control-allow-origin", "*");
|
|
132308
|
+
res.setHeader("cache-control", res.getHeader("cache-control") ?? "no-cache");
|
|
132309
|
+
recordStream("proxy", upstream.status);
|
|
132310
|
+
if (!upstream.body) {
|
|
132311
|
+
res.end();
|
|
132312
|
+
return;
|
|
132313
|
+
}
|
|
132314
|
+
const reader = upstream.body.getReader();
|
|
132315
|
+
for (; ; ) {
|
|
132316
|
+
if (signal.aborted) {
|
|
132317
|
+
await reader.cancel();
|
|
132318
|
+
break;
|
|
132319
|
+
}
|
|
132320
|
+
const chunk = await reader.read();
|
|
132321
|
+
if (chunk.done) break;
|
|
132322
|
+
if (chunk.value && !res.write(chunk.value)) {
|
|
132323
|
+
await new Promise((resolve65) => {
|
|
132324
|
+
let settled = false;
|
|
132325
|
+
const finish2 = () => {
|
|
132326
|
+
if (settled) return;
|
|
132327
|
+
settled = true;
|
|
132328
|
+
res.off("drain", finish2);
|
|
132329
|
+
res.off("close", finish2);
|
|
132330
|
+
resolve65();
|
|
132331
|
+
};
|
|
132332
|
+
if (res.destroyed || !res.writable) finish2();
|
|
132333
|
+
else {
|
|
132334
|
+
res.once("drain", finish2);
|
|
132335
|
+
res.once("close", finish2);
|
|
132336
|
+
}
|
|
132337
|
+
});
|
|
132338
|
+
}
|
|
132339
|
+
}
|
|
132340
|
+
if (!res.destroyed) res.end();
|
|
132341
|
+
}
|
|
132084
132342
|
async function handleWebWix(req, res, state) {
|
|
132085
132343
|
const session = webWixSession(req, res, state);
|
|
132086
132344
|
const auth = resolveWebWixAuth(state.app);
|
|
@@ -132142,7 +132400,13 @@ async function handleWebWix(req, res, state) {
|
|
|
132142
132400
|
res.end(JSON.stringify({ error: "webwix_stream_bad_request" }));
|
|
132143
132401
|
return;
|
|
132144
132402
|
}
|
|
132145
|
-
|
|
132403
|
+
const sitePinned = Object.keys(forwardedHeaders).some((name) => name.toLowerCase() === "wix-site-id");
|
|
132404
|
+
if (isWixAccountModeApp(state.app) && sitePinned && !session.account) {
|
|
132405
|
+
recordStream("proxy", 401);
|
|
132406
|
+
return reply(401, { error: "webwix_account_signed_out" });
|
|
132407
|
+
}
|
|
132408
|
+
const accountSiteStream = isWixAccountModeApp(state.app) && !!session.account && sitePinned;
|
|
132409
|
+
if (state.wix.mode === "mock" && (!accountSiteStream || failsClosed(state.wix))) {
|
|
132146
132410
|
const matchCtx = { host: target.host, query: Object.fromEntries(target.searchParams.entries()), headers: forwardedHeaders, body };
|
|
132147
132411
|
let match = matchRuleEx(state.wix.rules, method, target.pathname, matchCtx);
|
|
132148
132412
|
if (match && (match.rule.kind ?? "mock") !== "mock") {
|
|
@@ -132175,6 +132439,38 @@ async function handleWebWix(req, res, state) {
|
|
|
132175
132439
|
};
|
|
132176
132440
|
res.once("close", onResponseClose);
|
|
132177
132441
|
try {
|
|
132442
|
+
const account = isWixAccountModeApp(state.app) ? session.account : void 0;
|
|
132443
|
+
const streamSite = Object.entries(forwardedHeaders).find(([name]) => name.toLowerCase() === "wix-site-id")?.[1]?.trim() ?? "";
|
|
132444
|
+
if (account && streamSite) {
|
|
132445
|
+
if (!isSafeMsid(streamSite)) {
|
|
132446
|
+
recordStream("proxy", 400);
|
|
132447
|
+
return reply(400, { error: "webwix_account_bad_site_id" });
|
|
132448
|
+
}
|
|
132449
|
+
let upstream2;
|
|
132450
|
+
try {
|
|
132451
|
+
upstream2 = await webWixStream(method, target.toString(), body, await webAccountMemberInstances.instance(streamSite, account.cookie), void 0, forwardedHeaders, abort.signal);
|
|
132452
|
+
if (upstream2.status === 401 && !abort.signal.aborted) {
|
|
132453
|
+
try {
|
|
132454
|
+
await upstream2.body?.cancel();
|
|
132455
|
+
} catch {
|
|
132456
|
+
}
|
|
132457
|
+
upstream2 = await webWixStream(method, target.toString(), body, await webAccountMemberInstances.instance(streamSite, account.cookie, { force: true }), void 0, forwardedHeaders, abort.signal);
|
|
132458
|
+
}
|
|
132459
|
+
} catch (e2) {
|
|
132460
|
+
if (e2 instanceof AccountSessionExpired) {
|
|
132461
|
+
webAccountMemberInstances.forgetSession(account.cookie);
|
|
132462
|
+
if (session.account === account) session.account = void 0;
|
|
132463
|
+
}
|
|
132464
|
+
if (e2 instanceof NotSiteMember || e2 instanceof SiteInstanceUnavailable || e2 instanceof AccountSessionExpired) {
|
|
132465
|
+
const refusal = memberInstanceRefusal(e2);
|
|
132466
|
+
recordStream("proxy", refusal.status);
|
|
132467
|
+
return reply(refusal.status, refusal.body);
|
|
132468
|
+
}
|
|
132469
|
+
throw e2;
|
|
132470
|
+
}
|
|
132471
|
+
await pipeWebWixStream(upstream2, res, abort.signal, recordStream);
|
|
132472
|
+
return;
|
|
132473
|
+
}
|
|
132178
132474
|
if (!session.visitorToken && !session.memberToken) {
|
|
132179
132475
|
try {
|
|
132180
132476
|
session.visitorToken = await mintVisitor(resolveWixClientId(state.app) ?? WEBWIX_CLIENT_ID);
|
|
@@ -132195,45 +132491,7 @@ async function handleWebWix(req, res, state) {
|
|
|
132195
132491
|
} catch {
|
|
132196
132492
|
}
|
|
132197
132493
|
}
|
|
132198
|
-
res.
|
|
132199
|
-
for (const name of ["content-type", "cache-control", "retry-after"]) {
|
|
132200
|
-
const value = upstream.headers.get(name);
|
|
132201
|
-
if (value) res.setHeader(name, value);
|
|
132202
|
-
}
|
|
132203
|
-
res.setHeader("access-control-allow-origin", "*");
|
|
132204
|
-
res.setHeader("cache-control", res.getHeader("cache-control") ?? "no-cache");
|
|
132205
|
-
recordStream("proxy", upstream.status);
|
|
132206
|
-
if (!upstream.body) {
|
|
132207
|
-
res.end();
|
|
132208
|
-
return;
|
|
132209
|
-
}
|
|
132210
|
-
const reader = upstream.body.getReader();
|
|
132211
|
-
for (; ; ) {
|
|
132212
|
-
if (abort.signal.aborted) {
|
|
132213
|
-
await reader.cancel();
|
|
132214
|
-
break;
|
|
132215
|
-
}
|
|
132216
|
-
const chunk = await reader.read();
|
|
132217
|
-
if (chunk.done) break;
|
|
132218
|
-
if (chunk.value && !res.write(chunk.value)) {
|
|
132219
|
-
await new Promise((resolve65) => {
|
|
132220
|
-
let settled = false;
|
|
132221
|
-
const finish2 = () => {
|
|
132222
|
-
if (settled) return;
|
|
132223
|
-
settled = true;
|
|
132224
|
-
res.off("drain", finish2);
|
|
132225
|
-
res.off("close", finish2);
|
|
132226
|
-
resolve65();
|
|
132227
|
-
};
|
|
132228
|
-
if (res.destroyed || !res.writable) finish2();
|
|
132229
|
-
else {
|
|
132230
|
-
res.once("drain", finish2);
|
|
132231
|
-
res.once("close", finish2);
|
|
132232
|
-
}
|
|
132233
|
-
});
|
|
132234
|
-
}
|
|
132235
|
-
}
|
|
132236
|
-
if (!res.destroyed) res.end();
|
|
132494
|
+
await pipeWebWixStream(upstream, res, abort.signal, recordStream);
|
|
132237
132495
|
} catch {
|
|
132238
132496
|
if (!abort.signal.aborted) {
|
|
132239
132497
|
recordStream("proxy", 502);
|
|
@@ -132314,6 +132572,65 @@ async function handleWebWix(req, res, state) {
|
|
|
132314
132572
|
}
|
|
132315
132573
|
return reply(405, { error: "method_not_allowed" });
|
|
132316
132574
|
}
|
|
132575
|
+
const accountRouteStarted = Date.now();
|
|
132576
|
+
const sealedAccountRoute = state.wix.mode === "mock" && failsClosed(state.wix);
|
|
132577
|
+
const logAccountRoute = (url, method, status) => {
|
|
132578
|
+
const t2 = new URL(url);
|
|
132579
|
+
recordWixTraffic(state.wix, state.appName, state.adminUrl, {
|
|
132580
|
+
ts: accountRouteStarted,
|
|
132581
|
+
source: sealedAccountRoute ? "mock" : "proxy",
|
|
132582
|
+
capability: "wix_api.web.account",
|
|
132583
|
+
host: t2.host,
|
|
132584
|
+
method,
|
|
132585
|
+
url: `${t2.origin}${t2.pathname}`,
|
|
132586
|
+
path: t2.pathname,
|
|
132587
|
+
status,
|
|
132588
|
+
durationMs: Date.now() - accountRouteStarted,
|
|
132589
|
+
...sealedAccountRoute ? { mockRuleId: UNMATCHED_FAIL_CLOSED_ID } : {}
|
|
132590
|
+
});
|
|
132591
|
+
};
|
|
132592
|
+
const sealedRefusal = (url, method) => {
|
|
132593
|
+
const refusal = hermeticRefusal(method, new URL(url).pathname);
|
|
132594
|
+
logAccountRoute(url, method, refusal.status);
|
|
132595
|
+
res.statusCode = refusal.status;
|
|
132596
|
+
res.setHeader("content-type", refusal.headers["content-type"]);
|
|
132597
|
+
res.end(refusal.body);
|
|
132598
|
+
};
|
|
132599
|
+
if (path2 === "/v1/__webwix/account/member-session") {
|
|
132600
|
+
if (!accountApp) return reply(404, { error: "webwix_account_unsupported" });
|
|
132601
|
+
if (req.method !== "POST") return reply(405, { error: "method_not_allowed" });
|
|
132602
|
+
res.setHeader("cache-control", "no-store");
|
|
132603
|
+
const account = session.account;
|
|
132604
|
+
if (!account) return reply(401, { error: "webwix_account_signed_out" });
|
|
132605
|
+
const metaSiteId = String((await readJson9()).metaSiteId ?? "").trim();
|
|
132606
|
+
if (!isSafeMsid(metaSiteId)) return reply(400, { error: "webwix_account_bad_site_id" });
|
|
132607
|
+
if (sealedAccountRoute) return sealedRefusal(MEMBER_SESSION_URL, "POST");
|
|
132608
|
+
try {
|
|
132609
|
+
const sessionToken = await mintMemberSessionToken(account.cookie, metaSiteId, fetch);
|
|
132610
|
+
logAccountRoute(MEMBER_SESSION_URL, "POST", 200);
|
|
132611
|
+
return reply(200, { sessionToken });
|
|
132612
|
+
} catch (e2) {
|
|
132613
|
+
if (e2 instanceof AccountSessionExpired) {
|
|
132614
|
+
webAccountMemberInstances.forgetSession(account.cookie);
|
|
132615
|
+
if (session.account === account) session.account = void 0;
|
|
132616
|
+
}
|
|
132617
|
+
const refusal = memberSessionRefusal(e2);
|
|
132618
|
+
logAccountRoute(MEMBER_SESSION_URL, "POST", refusal.status);
|
|
132619
|
+
return reply(refusal.status, refusal.body);
|
|
132620
|
+
}
|
|
132621
|
+
}
|
|
132622
|
+
if (path2 === "/v1/__webwix/account/short-link") {
|
|
132623
|
+
if (!accountApp) return reply(404, { error: "webwix_account_unsupported" });
|
|
132624
|
+
if (req.method !== "POST") return reply(405, { error: "method_not_allowed" });
|
|
132625
|
+
res.setHeader("cache-control", "no-store");
|
|
132626
|
+
const shortId = String((await readJson9()).shortId ?? "").trim();
|
|
132627
|
+
const start = inviteShortLinkUrl(shortId);
|
|
132628
|
+
if (!start) return reply(400, { error: "webwix_short_link_bad_id" });
|
|
132629
|
+
if (sealedAccountRoute) return sealedRefusal(start, "GET");
|
|
132630
|
+
const url = await resolveInviteShortLink(shortId, fetch);
|
|
132631
|
+
logAccountRoute(start, "GET", url ? 200 : 404);
|
|
132632
|
+
return url ? reply(200, { url }) : reply(404, { error: "webwix_short_link_unresolved" });
|
|
132633
|
+
}
|
|
132317
132634
|
if (path2 === "/v1/__webwix/call" && req.method === "POST") {
|
|
132318
132635
|
const b2 = await readJson9();
|
|
132319
132636
|
const ownerRung = b2.ownerMsid !== void 0 || b2.checkOwnerSession === true;
|
|
@@ -137465,10 +137782,10 @@ async function bakeWidgets(fetchPath, putWidget, ownBundles) {
|
|
|
137465
137782
|
}
|
|
137466
137783
|
continue;
|
|
137467
137784
|
}
|
|
137468
|
-
const
|
|
137469
|
-
await putWidget(widgetId,
|
|
137785
|
+
const json7 = JSON.stringify(snap);
|
|
137786
|
+
await putWidget(widgetId, json7);
|
|
137470
137787
|
widgets[widgetId] = {
|
|
137471
|
-
contentEtag: snap.contentEtag ?? sha2564(
|
|
137788
|
+
contentEtag: snap.contentEtag ?? sha2564(json7),
|
|
137472
137789
|
ttlSeconds: snap.refresh?.ttlSeconds ?? 0
|
|
137473
137790
|
};
|
|
137474
137791
|
}
|
|
@@ -137492,10 +137809,10 @@ function tokensSnapshotMessage(app, base, status) {
|
|
|
137492
137809
|
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`;
|
|
137493
137810
|
return `[release-build] tokens snapshot FAILED for "${app}" (${why}; ${base}/v1/tokens) \u2014 this release carries no tokensHash and the app will render with NO design tokens. On iOS an undefined colour token is invisible, not merely unstyled.` + (status === 400 ? ` Fix the app id (himalaya.content.json "name", or the package directory basename) to match that grammar \u2014 but do NOT drop an owner prefix's dot: \`himi push\` requires the manifest name to equal the composed <ownerPrefix>.<name>, so removing it trades this warning for a 400 "manifest.app must match app" and the app cannot publish at all.` : "");
|
|
137494
137811
|
}
|
|
137495
|
-
function pinBakedServerBaseUrl(
|
|
137812
|
+
function pinBakedServerBaseUrl(json7, base) {
|
|
137496
137813
|
const escaped = base.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
137497
137814
|
const boundary = /:\d+$/.test(base) ? "(?!\\d)" : "(?![\\w.-])(?!:\\d)";
|
|
137498
|
-
return
|
|
137815
|
+
return json7.replace(new RegExp(`${escaped}${boundary}`, "g"), BAKED_SERVER_BASE_URL);
|
|
137499
137816
|
}
|
|
137500
137817
|
function stableStringify2(v2) {
|
|
137501
137818
|
if (v2 === null || typeof v2 !== "object") return JSON.stringify(v2);
|
|
@@ -138212,15 +138529,15 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
138212
138529
|
}
|
|
138213
138530
|
tierScreens.push(summarize3({ ...descriptor, ...lb ? { logicBundle: lb } : {} }));
|
|
138214
138531
|
delete descriptor.etag;
|
|
138215
|
-
const
|
|
138216
|
-
await store.putScreen(app, screenId,
|
|
138217
|
-
screens[screenId] = { descriptorHash: sha2564(
|
|
138218
|
-
rememberInput(bundleName, JSON.parse(
|
|
138532
|
+
const json7 = pinBakedServerBaseUrl(JSON.stringify(descriptor), base);
|
|
138533
|
+
await store.putScreen(app, screenId, json7);
|
|
138534
|
+
screens[screenId] = { descriptorHash: sha2564(json7), bundle: bundleName, ...screenMetadataFor(screenMetadata, screenId) };
|
|
138535
|
+
rememberInput(bundleName, JSON.parse(json7));
|
|
138219
138536
|
if (collect2?.descriptors) {
|
|
138220
138537
|
baked.push({
|
|
138221
138538
|
screenId,
|
|
138222
|
-
descriptor: JSON.parse(
|
|
138223
|
-
descriptorJson:
|
|
138539
|
+
descriptor: JSON.parse(json7),
|
|
138540
|
+
descriptorJson: json7,
|
|
138224
138541
|
bundleName,
|
|
138225
138542
|
bundleJs: bundleName ? readBundle(bundleName) ?? null : null,
|
|
138226
138543
|
...bundleMapFor(tier5Dir, bundleName ?? void 0)
|
|
@@ -138357,14 +138674,14 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
138357
138674
|
}
|
|
138358
138675
|
delete descriptor.etag;
|
|
138359
138676
|
if (typeof descriptor.screenId === "string" && descriptor.screenId !== screenId) descriptor.screenId = screenId;
|
|
138360
|
-
const
|
|
138361
|
-
await store.putScreen(app, screenId,
|
|
138362
|
-
screens[screenId] = { descriptorHash: sha2564(
|
|
138363
|
-
rememberInput(bundleName, JSON.parse(
|
|
138677
|
+
const json7 = pinBakedServerBaseUrl(JSON.stringify(descriptor), base);
|
|
138678
|
+
await store.putScreen(app, screenId, json7);
|
|
138679
|
+
screens[screenId] = { descriptorHash: sha2564(json7), bundle: bundleName, ...screenMetadataFor(screenMetadata, screenId, canonical4) };
|
|
138680
|
+
rememberInput(bundleName, JSON.parse(json7));
|
|
138364
138681
|
if (collect2?.descriptors) {
|
|
138365
138682
|
baked.push({
|
|
138366
138683
|
screenId,
|
|
138367
|
-
descriptor: JSON.parse(
|
|
138684
|
+
descriptor: JSON.parse(json7),
|
|
138368
138685
|
// The EXACT baked bytes, exactly as the exact-screen path hands
|
|
138369
138686
|
// them over. Omitting them did not degrade the crawl quietly — it
|
|
138370
138687
|
// took out the native-decode oracle for the whole app, which
|
|
@@ -138373,7 +138690,7 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
138373
138690
|
// bytes") and throws rather than skipping. So one templated route
|
|
138374
138691
|
// anywhere in an app meant `himi test --native` reported nothing
|
|
138375
138692
|
// for ANY of its screens.
|
|
138376
|
-
descriptorJson:
|
|
138693
|
+
descriptorJson: json7,
|
|
138377
138694
|
bundleName,
|
|
138378
138695
|
bundleJs: bundleName ? readBundle(bundleName) ?? null : null,
|
|
138379
138696
|
...bundleMapFor(tier5Dir, bundleName ?? void 0)
|
|
@@ -138466,7 +138783,7 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
138466
138783
|
if (store.putWidget) {
|
|
138467
138784
|
const bakedWidgets = await bakeWidgets(
|
|
138468
138785
|
(path2) => devFetch(`${base}${path2}`, { headers: { "X-Himalaya-App": app } }),
|
|
138469
|
-
(widgetId,
|
|
138786
|
+
(widgetId, json7) => store.putWidget(app, widgetId, json7),
|
|
138470
138787
|
// `opts.tier5Dir`, NOT the `tier5Dir` local — that one falls back to the
|
|
138471
138788
|
// repo-global dir, where this package's widgets cannot be told from anyone
|
|
138472
138789
|
// else's and the filter would claim every app's rows as ours.
|
|
@@ -138485,9 +138802,9 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
138485
138802
|
if (!js2) continue;
|
|
138486
138803
|
try {
|
|
138487
138804
|
const input = bundleInputs.get(name);
|
|
138488
|
-
const
|
|
138489
|
-
const hash2 = sha2564(
|
|
138490
|
-
await store.putDoc(app, hash2,
|
|
138805
|
+
const json7 = JSON.stringify(extractBundleServices(js2, input ? { input } : {}));
|
|
138806
|
+
const hash2 = sha2564(json7);
|
|
138807
|
+
await store.putDoc(app, hash2, json7);
|
|
138491
138808
|
meta.servicesHash = hash2;
|
|
138492
138809
|
} catch {
|
|
138493
138810
|
}
|
|
@@ -156517,12 +156834,204 @@ var init_wix_member_auth = __esm({
|
|
|
156517
156834
|
}
|
|
156518
156835
|
});
|
|
156519
156836
|
|
|
156520
|
-
// ../../core/serve/src/
|
|
156837
|
+
// ../../core/serve/src/account-rung.ts
|
|
156521
156838
|
function json4(status, body, headers2 = {}) {
|
|
156522
|
-
return new Response(JSON.stringify(body), { status, headers: { "content-type": JSON_CT2, ...headers2 } });
|
|
156839
|
+
return new Response(JSON.stringify(body), { status, headers: { "content-type": JSON_CT2, ...NO_STORE, ...headers2 } });
|
|
156840
|
+
}
|
|
156841
|
+
function isWixAccountHost(host) {
|
|
156842
|
+
const hostname3 = host.replace(/:\d+$/, "").toLowerCase();
|
|
156843
|
+
return hostname3 === "wix.com" || hostname3.endsWith(".wix.com");
|
|
156844
|
+
}
|
|
156845
|
+
function accountReturnPath(raw, fallback) {
|
|
156846
|
+
const candidate = safeReturnPath(raw, fallback);
|
|
156847
|
+
const base = "http://placeholder.invalid";
|
|
156848
|
+
try {
|
|
156849
|
+
const u2 = new URL(candidate, base);
|
|
156850
|
+
if (u2.origin !== base || u2.pathname.startsWith("//")) return fallback;
|
|
156851
|
+
return `${u2.pathname}${u2.search}${u2.hash}`;
|
|
156852
|
+
} catch {
|
|
156853
|
+
return fallback;
|
|
156854
|
+
}
|
|
156855
|
+
}
|
|
156856
|
+
function withOutcome(target, outcome) {
|
|
156857
|
+
const url = new URL(target, "http://placeholder.invalid");
|
|
156858
|
+
url.searchParams.set("webwix_account", outcome);
|
|
156859
|
+
return `${url.pathname}${url.search}${url.hash}`;
|
|
156860
|
+
}
|
|
156861
|
+
function accountCookie(request) {
|
|
156862
|
+
return forwardableWixSessionCookies(request.headers.get("cookie"));
|
|
156863
|
+
}
|
|
156864
|
+
async function principal(cookie, opts, fetchImpl) {
|
|
156865
|
+
if (!cookie) return { ok: false, error: "webwix_account_no_session" };
|
|
156866
|
+
const who = await opts.resolveAccounts(cookie, fetchImpl).catch(() => ({ ok: false, reason: "upstream_failed" }));
|
|
156867
|
+
if (!who.ok) return { ok: false, error: who.reason === "no_session" ? "webwix_account_no_session" : "webwix_account_upstream_failed" };
|
|
156868
|
+
const ids = who.accounts.map((a2) => a2.accountId).sort().join("\n");
|
|
156869
|
+
return { ok: true, principal: `acct_${sha256Hex(ids).slice(0, 32)}` };
|
|
156870
|
+
}
|
|
156871
|
+
function crossSiteAccountWrite(request, url) {
|
|
156872
|
+
if (!/^application\/json\b/i.test(request.headers.get("content-type") ?? "")) return true;
|
|
156873
|
+
const origin = request.headers.get("origin");
|
|
156874
|
+
if (origin) {
|
|
156875
|
+
let host = null;
|
|
156876
|
+
try {
|
|
156877
|
+
host = new URL(origin).host;
|
|
156878
|
+
} catch {
|
|
156879
|
+
}
|
|
156880
|
+
if (host !== url.host) return true;
|
|
156881
|
+
}
|
|
156882
|
+
const site = request.headers.get("sec-fetch-site");
|
|
156883
|
+
return !!site && site !== "same-origin";
|
|
156884
|
+
}
|
|
156885
|
+
async function handleAccountRung(opts, ctx) {
|
|
156886
|
+
const { request, url, path: path2 } = ctx;
|
|
156887
|
+
const accountPath = ACCOUNT_RUNG_PATHS.has(path2);
|
|
156888
|
+
const bridgePath = path2 === "/v1/__webwix/identity" || path2 === "/v1/__webwix/call" || path2 === "/v1/__webwix/stream";
|
|
156889
|
+
if (!accountPath && !bridgePath) return null;
|
|
156890
|
+
const hostApp = opts.appForHost(url.host);
|
|
156891
|
+
if (!hostApp) return null;
|
|
156892
|
+
if (!await ctx.isAccountApp(hostApp).catch(() => false)) {
|
|
156893
|
+
return accountPath ? json4(404, { error: "webwix_account_unsupported" }) : null;
|
|
156894
|
+
}
|
|
156895
|
+
if (path2 === "/v1/__webwix/account/login" || path2 === "/v1/__webwix/account/callback") {
|
|
156896
|
+
const back = accountReturnPath(url.searchParams.get("return"), `/?app=${encodeURIComponent(hostApp)}`);
|
|
156897
|
+
const signInUrl = isWixAccountHost(url.host) ? wixAccountSignInUrl(`${ctx.publicBase}/v1/__webwix/account/callback?return=${encodeURIComponent(back)}`) : void 0;
|
|
156898
|
+
if (path2 === "/v1/__webwix/account/login" && request.method === "GET" && signInUrl) {
|
|
156899
|
+
return new Response(null, { status: 302, headers: { location: signInUrl, ...NO_STORE } });
|
|
156900
|
+
}
|
|
156901
|
+
if (path2 === "/v1/__webwix/account/login" && request.method === "POST" && crossSiteAccountWrite(request, url)) return CROSS_SITE();
|
|
156902
|
+
if (request.method !== "GET" && !(request.method === "POST" && path2 === "/v1/__webwix/account/login")) return json4(405, { error: "method_not_allowed" });
|
|
156903
|
+
const who = await principal(accountCookie(request), opts, ctx.fetchImpl);
|
|
156904
|
+
if (path2 === "/v1/__webwix/account/login" && request.method === "POST") {
|
|
156905
|
+
return who.ok ? json4(200, { ok: true, authenticated: true, userId: who.principal }) : json4(who.error === "webwix_account_no_session" ? 401 : 502, { ok: false, error: who.error, ...signInUrl ? { signInUrl } : {} });
|
|
156906
|
+
}
|
|
156907
|
+
return new Response(null, { status: 302, headers: { location: withOutcome(back, who.ok ? "signed_in" : who.error), ...NO_STORE } });
|
|
156908
|
+
}
|
|
156909
|
+
if (path2 === "/v1/__webwix/identity") {
|
|
156910
|
+
if (request.method !== "GET" && request.method !== "HEAD") return null;
|
|
156911
|
+
const who = await principal(accountCookie(request), opts, ctx.fetchImpl);
|
|
156912
|
+
const webwixDirect = await ctx.webwixDirect();
|
|
156913
|
+
if (request.method === "HEAD") return new Response(null, { status: 200, headers: { "content-type": JSON_CT2, ...NO_STORE } });
|
|
156914
|
+
return json4(200, who.ok ? { authenticated: true, userId: who.principal, email: null, mode: "account", webwixDirect } : { authenticated: false, userId: null, email: null, mode: "account", webwixDirect });
|
|
156915
|
+
}
|
|
156916
|
+
if (request.method !== "POST") return accountPath ? json4(405, { error: "method_not_allowed" }) : null;
|
|
156917
|
+
if (accountPath && crossSiteAccountWrite(request, url)) return CROSS_SITE();
|
|
156918
|
+
if (path2 === "/v1/__webwix/account/short-link") {
|
|
156919
|
+
const b2 = await request.json().catch(() => ({}));
|
|
156920
|
+
const shortId = String(b2.shortId ?? "").trim();
|
|
156921
|
+
if (!inviteShortLinkUrl(shortId)) return json4(400, { error: "webwix_short_link_bad_id" });
|
|
156922
|
+
const landed = await resolveInviteShortLink(shortId, ctx.fetchImpl);
|
|
156923
|
+
return landed ? json4(200, { url: landed }) : json4(404, { error: "webwix_short_link_unresolved" });
|
|
156924
|
+
}
|
|
156925
|
+
const cookie = accountCookie(request);
|
|
156926
|
+
const expired = (e2) => {
|
|
156927
|
+
if (e2 instanceof AccountSessionExpired) ctx.instances.forgetSession(cookie);
|
|
156928
|
+
};
|
|
156929
|
+
if (path2 === "/v1/__webwix/account/member-session") {
|
|
156930
|
+
if (!cookie) return json4(401, { error: "webwix_account_signed_out" });
|
|
156931
|
+
const b2 = await request.json().catch(() => ({}));
|
|
156932
|
+
const metaSiteId = String(b2.metaSiteId ?? "").trim();
|
|
156933
|
+
if (!isSafeMsid(metaSiteId)) return json4(400, { error: "webwix_account_bad_site_id" });
|
|
156934
|
+
try {
|
|
156935
|
+
return json4(200, { sessionToken: await mintMemberSessionToken(cookie, metaSiteId, ctx.fetchImpl) });
|
|
156936
|
+
} catch (e2) {
|
|
156937
|
+
expired(e2);
|
|
156938
|
+
const refusal = memberSessionRefusal(e2);
|
|
156939
|
+
return json4(refusal.status, refusal.body);
|
|
156940
|
+
}
|
|
156941
|
+
}
|
|
156942
|
+
if (ctx.namedApp !== hostApp) return null;
|
|
156943
|
+
const envelope = await request.clone().json().catch(() => null);
|
|
156944
|
+
if (!envelope || envelope.ownerMsid !== void 0 || envelope.checkOwnerSession !== void 0) return null;
|
|
156945
|
+
const method = String(envelope.method ?? "GET").toUpperCase();
|
|
156946
|
+
const target = String((path2 === "/v1/__webwix/stream" ? envelope.url : envelope.path) ?? "");
|
|
156947
|
+
const forwarded = normalizeWixForwardedHeaders(envelope.headers, target);
|
|
156948
|
+
const siteId = Object.entries(forwarded).find(([name]) => name.toLowerCase() === "wix-site-id")?.[1]?.trim() ?? "";
|
|
156949
|
+
const body = envelope.body === void 0 ? void 0 : typeof envelope.body === "string" ? envelope.body : JSON.stringify(envelope.body);
|
|
156950
|
+
const refuse7 = (e2) => {
|
|
156951
|
+
expired(e2);
|
|
156952
|
+
if (e2 instanceof NotSiteMember || e2 instanceof SiteInstanceUnavailable || e2 instanceof AccountSessionExpired) {
|
|
156953
|
+
const refusal = memberInstanceRefusal(e2);
|
|
156954
|
+
return json4(refusal.status, refusal.body);
|
|
156955
|
+
}
|
|
156956
|
+
return json4(502, { error: "webwix_bridge_upstream_failed" });
|
|
156957
|
+
};
|
|
156958
|
+
if (path2 === "/v1/__webwix/stream") {
|
|
156959
|
+
if (!siteId) return null;
|
|
156960
|
+
if (crossSiteAccountWrite(request, url)) return CROSS_SITE();
|
|
156961
|
+
if (!cookie) return json4(401, { error: "webwix_account_signed_out" });
|
|
156962
|
+
if (!isSafeMsid(siteId)) return json4(400, { error: "webwix_account_bad_site_id" });
|
|
156963
|
+
if (method !== "GET" && method !== "POST") return json4(400, { error: "invalid_stream_method" });
|
|
156964
|
+
const url2 = /^https:\/\//i.test(target) ? target : `https://www.wixapis.com${target.startsWith("/") ? target : `/${target}`}`;
|
|
156965
|
+
if (!isAllowedConsumerStreamTarget(url2)) return json4(400, { error: "invalid_stream_target" });
|
|
156966
|
+
const send3 = async (force) => fetchStream(ctx, url2, method, body, forwarded, await ctx.instances.instance(siteId, cookie, { force }));
|
|
156967
|
+
let upstream;
|
|
156968
|
+
try {
|
|
156969
|
+
upstream = await send3(false);
|
|
156970
|
+
if (upstream.status === 401) {
|
|
156971
|
+
try {
|
|
156972
|
+
await upstream.body?.cancel();
|
|
156973
|
+
} catch {
|
|
156974
|
+
}
|
|
156975
|
+
upstream = await send3(true);
|
|
156976
|
+
}
|
|
156977
|
+
} catch (e2) {
|
|
156978
|
+
return refuse7(e2);
|
|
156979
|
+
}
|
|
156980
|
+
const headers2 = new Headers({ "cache-control": "no-store, no-transform" });
|
|
156981
|
+
for (const name of ["content-type", "retry-after"]) {
|
|
156982
|
+
const value = upstream.headers.get(name);
|
|
156983
|
+
if (value) headers2.set(name, value);
|
|
156984
|
+
}
|
|
156985
|
+
return new Response(upstream.body, { status: upstream.status, headers: headers2 });
|
|
156986
|
+
}
|
|
156987
|
+
const absolute = /^[a-z][a-z0-9+.-]*:\/\//i.test(target);
|
|
156988
|
+
const allowed2 = absolute && !!allowedAccountTarget(method, target);
|
|
156989
|
+
if (!allowed2 && (absolute || !siteId)) return null;
|
|
156990
|
+
if (crossSiteAccountWrite(request, url)) return CROSS_SITE();
|
|
156991
|
+
if (!cookie) return json4(401, { error: "webwix_account_signed_out" });
|
|
156992
|
+
if (siteId && !isSafeMsid(siteId)) return json4(400, { error: "webwix_account_bad_site_id" });
|
|
156993
|
+
const send2 = async (force) => {
|
|
156994
|
+
const instance = siteId ? await ctx.instances.instance(siteId, cookie, { force }) : void 0;
|
|
156995
|
+
return allowed2 ? wixAccountCall(method, target, body, cookie, ctx.fetchImpl, forwarded, instance) : wixVisitorCall(method, target, body, instance ?? "", ctx.fetchImpl, forwarded);
|
|
156996
|
+
};
|
|
156997
|
+
try {
|
|
156998
|
+
let result = await send2(false);
|
|
156999
|
+
if (result.status === 401 && siteId) result = await send2(true);
|
|
157000
|
+
if (result.status >= 200 && result.status < 300 && isAccountJoinCall(method, target)) ctx.instances.forgetRefusals(cookie);
|
|
157001
|
+
return json4(200, result);
|
|
157002
|
+
} catch (e2) {
|
|
157003
|
+
return refuse7(e2);
|
|
157004
|
+
}
|
|
157005
|
+
}
|
|
157006
|
+
function fetchStream(ctx, url, method, body, forwarded, instance) {
|
|
157007
|
+
const headers2 = { ...forwarded, Accept: "text/event-stream", Authorization: instance };
|
|
157008
|
+
if (body !== void 0) headers2["Content-Type"] ??= "application/json";
|
|
157009
|
+
return ctx.fetchImpl(url, { method, headers: headers2, body: method === "GET" ? void 0 : body, redirect: "manual", signal: ctx.request.signal });
|
|
157010
|
+
}
|
|
157011
|
+
var ACCOUNT_RUNG_PATHS, JSON_CT2, NO_STORE, CROSS_SITE;
|
|
157012
|
+
var init_account_rung = __esm({
|
|
157013
|
+
"../../core/serve/src/account-rung.ts"() {
|
|
157014
|
+
init_sha256();
|
|
157015
|
+
init_wix_bridge();
|
|
157016
|
+
init_wix_member_auth();
|
|
157017
|
+
ACCOUNT_RUNG_PATHS = /* @__PURE__ */ new Set([
|
|
157018
|
+
"/v1/__webwix/account/login",
|
|
157019
|
+
"/v1/__webwix/account/callback",
|
|
157020
|
+
"/v1/__webwix/account/member-session",
|
|
157021
|
+
"/v1/__webwix/account/short-link"
|
|
157022
|
+
]);
|
|
157023
|
+
JSON_CT2 = "application/json; charset=utf-8";
|
|
157024
|
+
NO_STORE = { "cache-control": "no-store" };
|
|
157025
|
+
CROSS_SITE = () => json4(403, { error: "webwix_account_cross_site" });
|
|
157026
|
+
}
|
|
157027
|
+
});
|
|
157028
|
+
|
|
157029
|
+
// ../../core/serve/src/server.ts
|
|
157030
|
+
function json5(status, body, headers2 = {}) {
|
|
157031
|
+
return new Response(JSON.stringify(body), { status, headers: { "content-type": JSON_CT3, ...headers2 } });
|
|
156523
157032
|
}
|
|
156524
157033
|
function isCookieAuthorizedPath(path2) {
|
|
156525
|
-
return path2 === "/v1/__webwix/call" || path2 === "/v1/__webwix/stream" || path2 === "/v1/owner" || path2.startsWith("/v1/owner/") || path2 === "/v1/__webwix/identity" || path2 === "/v1/__webwix/login" || path2 === "/v1/__webwix/register" || path2 === "/v1/__webwix/logout" || path2 === MEMBER_CALLBACK_PATH;
|
|
157034
|
+
return path2 === "/v1/__webwix/call" || path2 === "/v1/__webwix/stream" || path2 === "/v1/owner" || path2.startsWith("/v1/owner/") || path2 === "/v1/__webwix/identity" || path2 === "/v1/__webwix/login" || path2 === "/v1/__webwix/register" || path2 === "/v1/__webwix/logout" || path2 === MEMBER_CALLBACK_PATH || ACCOUNT_RUNG_PATHS.has(path2);
|
|
156526
157035
|
}
|
|
156527
157036
|
function webwixCallLog(served, status) {
|
|
156528
157037
|
const directRung = served.rung === "visitor" || served.rung === "owner";
|
|
@@ -156545,6 +157054,7 @@ function makeServeHandler(opts) {
|
|
|
156545
157054
|
const webwixFetch = opts.webwixFetch ?? fetch;
|
|
156546
157055
|
const webwixOwnerInstances = new OwnerInstanceCache(webwixFetch);
|
|
156547
157056
|
const webwixOwnerSites = new OwnerSitesCache(webwixFetch);
|
|
157057
|
+
const webwixAccountInstances = new MemberInstanceCache(webwixFetch);
|
|
156548
157058
|
const webwixOwnerRungOn = () => opts.webwixOwnerRung !== false;
|
|
156549
157059
|
const memberAuthOn = () => opts.webwixMemberAuth === true && !!opts.webwixMemberSessions && !!opts.webwixMemberAppForHost;
|
|
156550
157060
|
const memberSessions = () => opts.webwixMemberSessions ?? null;
|
|
@@ -156661,12 +157171,12 @@ ${releaseId}`;
|
|
|
156661
157171
|
const denied2 = await authorizePinnedRead(request, url, app, pin);
|
|
156662
157172
|
if (denied2) return { ok: false, response: denied2 };
|
|
156663
157173
|
const m2 = await pinnedManifest(app, pin);
|
|
156664
|
-
if (!m2) return { ok: false, response:
|
|
157174
|
+
if (!m2) return { ok: false, response: json5(404, { error: "release_not_found", app, releaseId: pin }) };
|
|
156665
157175
|
bytes2 = m2.appConfigHash ? await pinnedBody(app, m2.appConfigHash, () => store.getAppConfig(app)) : null;
|
|
156666
157176
|
} else {
|
|
156667
157177
|
bytes2 = await store.getAppConfig(app);
|
|
156668
157178
|
}
|
|
156669
|
-
if (!bytes2) return { ok: false, response:
|
|
157179
|
+
if (!bytes2) return { ok: false, response: json5(404, { error: "app_config_not_found", app }) };
|
|
156670
157180
|
return { ok: true, bytes: bytes2 };
|
|
156671
157181
|
}
|
|
156672
157182
|
function resolveApp(request, url) {
|
|
@@ -156679,7 +157189,7 @@ ${releaseId}`;
|
|
|
156679
157189
|
if (request.headers.get("if-none-match") === etag) {
|
|
156680
157190
|
return new Response(null, { status: 304, headers: { etag, "cache-control": cache, ...vary } });
|
|
156681
157191
|
}
|
|
156682
|
-
return new Response(body, { status: 200, headers: { "content-type":
|
|
157192
|
+
return new Response(body, { status: 200, headers: { "content-type": JSON_CT3, etag, "cache-control": cache, ...vary } });
|
|
156683
157193
|
}
|
|
156684
157194
|
async function authorizePinnedRead(request, url, app, releaseId, screenId) {
|
|
156685
157195
|
const denied2 = await checkPinnedRead({
|
|
@@ -156692,7 +157202,7 @@ ${releaseId}`;
|
|
|
156692
157202
|
authorizePreview: opts.authorizePreview,
|
|
156693
157203
|
authorizeFollow: opts.authorizeFollow
|
|
156694
157204
|
});
|
|
156695
|
-
return denied2 &&
|
|
157205
|
+
return denied2 && json5(denied2.status, denied2.body);
|
|
156696
157206
|
}
|
|
156697
157207
|
async function honourRingPin(request) {
|
|
156698
157208
|
const kept = { request, dropped: false };
|
|
@@ -156774,30 +157284,59 @@ ${releaseId}`;
|
|
|
156774
157284
|
const control = b2.control ?? b2;
|
|
156775
157285
|
if (control && Object.keys(control).length) devControlOverlay.set(dcApp, control);
|
|
156776
157286
|
else devControlOverlay.delete(dcApp);
|
|
156777
|
-
return
|
|
157287
|
+
return json5(200, { ok: true, app: dcApp });
|
|
157288
|
+
}
|
|
157289
|
+
}
|
|
157290
|
+
if (opts.webwixAccountRung && opts.webwixBridge !== false) {
|
|
157291
|
+
const accountRung = opts.webwixAccountRung;
|
|
157292
|
+
const answered = await handleAccountRung(accountRung, {
|
|
157293
|
+
request,
|
|
157294
|
+
url,
|
|
157295
|
+
path: path2,
|
|
157296
|
+
fetchImpl: webwixFetch,
|
|
157297
|
+
instances: webwixAccountInstances,
|
|
157298
|
+
namedApp: resolveApp(request, url),
|
|
157299
|
+
publicBase: callbackUrlFor(url).slice(0, -MEMBER_CALLBACK_PATH.length),
|
|
157300
|
+
webwixDirect: async () => opts.webwixDirect ? await opts.webwixDirect() === true : opts.webwixBridge !== false,
|
|
157301
|
+
isAccountApp: async (app2) => {
|
|
157302
|
+
const cfg = await appConfigFor(request, url, app2);
|
|
157303
|
+
if (!cfg.ok) return false;
|
|
157304
|
+
const auth = JSON.parse(utf8Decode(cfg.bytes))?.authConfig;
|
|
157305
|
+
return !!auth && auth.required === true && auth.providerId === "wix-native" && auth.config?.mode === "account";
|
|
157306
|
+
}
|
|
157307
|
+
});
|
|
157308
|
+
if (answered) {
|
|
157309
|
+
if (path2 === "/v1/__webwix/call") {
|
|
157310
|
+
const app2 = resolveApp(request, url);
|
|
157311
|
+
try {
|
|
157312
|
+
opts.onWebwixCall?.(webwixCallLog({ rung: "account", ...app2 ? { app: app2 } : {} }, answered.status));
|
|
157313
|
+
} catch {
|
|
157314
|
+
}
|
|
157315
|
+
}
|
|
157316
|
+
return answered;
|
|
156778
157317
|
}
|
|
156779
157318
|
}
|
|
156780
157319
|
const memberRungApp = memberAuthOn() ? memberApp(request) : null;
|
|
156781
157320
|
if (memberRungApp && (path2 === "/v1/__webwix/login" || path2 === "/v1/__webwix/register" || path2 === MEMBER_CALLBACK_PATH || path2 === "/v1/__webwix/logout")) {
|
|
156782
157321
|
const store2 = memberSessions();
|
|
156783
|
-
if (!store2) return
|
|
157322
|
+
if (!store2) return json5(503, { error: "member_auth_unconfigured" });
|
|
156784
157323
|
const sessionId = readSessionCookie(request.headers.get("cookie"));
|
|
156785
157324
|
if (path2 === "/v1/__webwix/logout") {
|
|
156786
|
-
if (request.method !== "POST") return
|
|
157325
|
+
if (request.method !== "POST") return json5(405, { error: "method_not_allowed" });
|
|
156787
157326
|
if (sessionId) await store2.delete(sessionId);
|
|
156788
|
-
return
|
|
157327
|
+
return json5(200, { ok: true }, { "set-cookie": clearSessionCookie(), "cache-control": "no-store" });
|
|
156789
157328
|
}
|
|
156790
157329
|
if (path2 === MEMBER_CALLBACK_PATH) {
|
|
156791
|
-
if (request.method !== "GET") return
|
|
157330
|
+
if (request.method !== "GET") return json5(405, { error: "method_not_allowed" });
|
|
156792
157331
|
const code = url.searchParams.get("code");
|
|
156793
157332
|
const state2 = url.searchParams.get("state");
|
|
156794
157333
|
if (!code) {
|
|
156795
|
-
if (url.searchParams.has("nohash")) return
|
|
157334
|
+
if (url.searchParams.has("nohash")) return json5(400, { error: "member_auth_no_code" });
|
|
156796
157335
|
return fragmentBounceResponse();
|
|
156797
157336
|
}
|
|
156798
157337
|
const pending = sessionId ? await store2.get(sessionId) : null;
|
|
156799
157338
|
if (!pending || pending.kind !== "pending" || pending.state !== state2) {
|
|
156800
|
-
return
|
|
157339
|
+
return json5(400, { error: "member_auth_state_mismatch" });
|
|
156801
157340
|
}
|
|
156802
157341
|
const app3 = pending.app;
|
|
156803
157342
|
await store2.delete(sessionId);
|
|
@@ -156806,10 +157345,10 @@ ${releaseId}`;
|
|
|
156806
157345
|
try {
|
|
156807
157346
|
({ memberToken, expiresInSec } = await exchangeAuthCode(pending.auth, code, pending.verifier, webwixFetch));
|
|
156808
157347
|
} catch (e2) {
|
|
156809
|
-
return
|
|
157348
|
+
return json5(502, { error: "member_auth_exchange_failed", app: app3, detail: String(e2?.message ?? e2).slice(0, 120) });
|
|
156810
157349
|
}
|
|
156811
157350
|
const ttlMs = Math.min(MEMBER_SESSION_TTL_MS, (expiresInSec - 60) * 1e3);
|
|
156812
|
-
if (ttlMs <= 0) return
|
|
157351
|
+
if (ttlMs <= 0) return json5(502, { error: "member_auth_session_too_short", app: app3 });
|
|
156813
157352
|
const freshId = randomToken(32);
|
|
156814
157353
|
await store2.put(freshId, {
|
|
156815
157354
|
kind: "member",
|
|
@@ -156829,17 +157368,17 @@ ${releaseId}`;
|
|
|
156829
157368
|
}
|
|
156830
157369
|
const app2 = memberRungApp;
|
|
156831
157370
|
if (request.method === "POST") {
|
|
156832
|
-
return
|
|
157371
|
+
return json5(501, {
|
|
156833
157372
|
error: "member_password_login_unsupported",
|
|
156834
157373
|
app: app2,
|
|
156835
157374
|
detail: "Sign in through GET /v1/__webwix/login \u2014 the serve plane never accepts a password."
|
|
156836
157375
|
});
|
|
156837
157376
|
}
|
|
156838
|
-
if (request.method !== "GET") return
|
|
157377
|
+
if (request.method !== "GET") return json5(405, { error: "method_not_allowed" });
|
|
156839
157378
|
const cfg = await appConfigFor(request, url, app2);
|
|
156840
157379
|
if (!cfg.ok) return cfg.response;
|
|
156841
157380
|
const resolved2 = wixMemberAuthOf(utf8Decode(cfg.bytes), callbackUrlFor(url));
|
|
156842
|
-
if (!resolved2.ok) return
|
|
157381
|
+
if (!resolved2.ok) return json5(501, { error: `member_auth_${resolved2.error}`, app: app2 });
|
|
156843
157382
|
const returnTo = safeReturnPath(url.searchParams.get("return"), `/preview/a/${encodeURIComponent(app2)}`);
|
|
156844
157383
|
const state = randomToken(16);
|
|
156845
157384
|
const pkce = await generatePkce();
|
|
@@ -156852,7 +157391,7 @@ ${releaseId}`;
|
|
|
156852
157391
|
webwixFetch
|
|
156853
157392
|
);
|
|
156854
157393
|
} catch (e2) {
|
|
156855
|
-
return
|
|
157394
|
+
return json5(502, { error: "member_auth_unavailable", app: app2, detail: String(e2?.message ?? e2).slice(0, 120) });
|
|
156856
157395
|
}
|
|
156857
157396
|
if (sessionId) await store2.delete(sessionId);
|
|
156858
157397
|
const pendingId = randomToken(32);
|
|
@@ -156875,7 +157414,7 @@ ${releaseId}`;
|
|
|
156875
157414
|
});
|
|
156876
157415
|
}
|
|
156877
157416
|
if ((request.method === "GET" || request.method === "HEAD") && path2 === "/v1/__webwix/identity") {
|
|
156878
|
-
const headers2 = { "content-type":
|
|
157417
|
+
const headers2 = { "content-type": JSON_CT3, "cache-control": "no-store" };
|
|
156879
157418
|
if (request.method === "HEAD") return new Response(null, { status: 200, headers: headers2 });
|
|
156880
157419
|
const webwixDirect = opts.webwixDirect ? await opts.webwixDirect() === true : opts.webwixBridge !== false;
|
|
156881
157420
|
if (memberAuthOn()) {
|
|
@@ -156883,35 +157422,35 @@ ${releaseId}`;
|
|
|
156883
157422
|
const store2 = memberSessions();
|
|
156884
157423
|
if (app2 && store2) {
|
|
156885
157424
|
const token = await memberTokenFor(store2, readSessionCookie(request.headers.get("cookie")), app2, null);
|
|
156886
|
-
if (token) return
|
|
157425
|
+
if (token) return json5(200, { authenticated: true, userId: null, email: null, webwixDirect }, { "cache-control": "no-store" });
|
|
156887
157426
|
}
|
|
156888
157427
|
}
|
|
156889
|
-
return
|
|
157428
|
+
return json5(200, { authenticated: false, userId: null, email: null, webwixDirect }, { "cache-control": "no-store" });
|
|
156890
157429
|
}
|
|
156891
157430
|
if (request.method === "POST" && path2 === "/v1/__webwix/stream") {
|
|
156892
|
-
if (opts.webwixBridge === false) return
|
|
157431
|
+
if (opts.webwixBridge === false) return json5(503, { error: "webwix_bridge_disabled" }, { "cache-control": "no-store" });
|
|
156893
157432
|
const app2 = resolveApp(request, url);
|
|
156894
157433
|
const hostApp = memberApp(request);
|
|
156895
|
-
if (!app2) return
|
|
156896
|
-
if (!hostApp || app2 !== hostApp) return
|
|
157434
|
+
if (!app2) return json5(400, { error: "app_required" }, { "cache-control": "no-store" });
|
|
157435
|
+
if (!hostApp || app2 !== hostApp) return json5(403, { error: "webwix_stream_host_mismatch" }, { "cache-control": "no-store" });
|
|
156897
157436
|
const resolvedCfg = await appConfigFor(request, url, app2);
|
|
156898
157437
|
if (!resolvedCfg.ok) return resolvedCfg.response;
|
|
156899
157438
|
let call;
|
|
156900
157439
|
try {
|
|
156901
157440
|
call = await request.json();
|
|
156902
157441
|
} catch {
|
|
156903
|
-
return
|
|
157442
|
+
return json5(400, { error: "invalid_json" }, { "cache-control": "no-store" });
|
|
156904
157443
|
}
|
|
156905
157444
|
const method = String(call.method ?? "GET").toUpperCase();
|
|
156906
|
-
if (method !== "GET" && method !== "POST") return
|
|
157445
|
+
if (method !== "GET" && method !== "POST") return json5(400, { error: "invalid_stream_method" }, { "cache-control": "no-store" });
|
|
156907
157446
|
const rawTarget = String(call.url ?? "");
|
|
156908
157447
|
const target = /^https:\/\//i.test(rawTarget) ? rawTarget : `https://www.wixapis.com${rawTarget.startsWith("/") ? rawTarget : `/${rawTarget}`}`;
|
|
156909
|
-
if (!isAllowedConsumerStreamTarget(target)) return
|
|
157448
|
+
if (!isAllowedConsumerStreamTarget(target)) return json5(400, { error: "invalid_stream_target" }, { "cache-control": "no-store" });
|
|
156910
157449
|
const cfg = wixMemberAuthOf(utf8Decode(resolvedCfg.bytes), callbackUrlFor(url));
|
|
156911
|
-
if (!cfg.ok) return
|
|
157450
|
+
if (!cfg.ok) return json5(501, { error: "webwix_visitor_direct_only", app: app2 }, { "cache-control": "no-store" });
|
|
156912
157451
|
const store2 = memberSessions();
|
|
156913
157452
|
const token = memberAuthOn() && store2 ? await memberTokenFor(store2, readSessionCookie(request.headers.get("cookie")), hostApp, cfg.config.clientId) : null;
|
|
156914
|
-
if (!token) return
|
|
157453
|
+
if (!token) return json5(501, { error: "webwix_visitor_direct_only", app: app2 }, { "cache-control": "no-store" });
|
|
156915
157454
|
const headers2 = normalizeWixForwardedHeaders(call.headers);
|
|
156916
157455
|
headers2.Accept = "text/event-stream";
|
|
156917
157456
|
headers2.Authorization = token;
|
|
@@ -156921,7 +157460,7 @@ ${releaseId}`;
|
|
|
156921
157460
|
try {
|
|
156922
157461
|
upstream = await webwixFetch(target, { method, headers: headers2, body: method === "GET" ? void 0 : body, redirect: "manual", signal: request.signal });
|
|
156923
157462
|
} catch {
|
|
156924
|
-
return
|
|
157463
|
+
return json5(502, { error: "webwix_stream_upstream_failed" }, { "cache-control": "no-store" });
|
|
156925
157464
|
}
|
|
156926
157465
|
const responseHeaders = new Headers({ "cache-control": "no-store, no-transform" });
|
|
156927
157466
|
for (const name of ["content-type", "retry-after"]) {
|
|
@@ -156936,10 +157475,10 @@ ${releaseId}`;
|
|
|
156936
157475
|
try {
|
|
156937
157476
|
const res = await (async () => {
|
|
156938
157477
|
if (opts.webwixBridge === false) {
|
|
156939
|
-
return
|
|
157478
|
+
return json5(503, { error: "webwix_bridge_disabled" });
|
|
156940
157479
|
}
|
|
156941
157480
|
const app2 = resolveApp(request, url);
|
|
156942
|
-
if (!app2) return
|
|
157481
|
+
if (!app2) return json5(400, { error: "app_required" });
|
|
156943
157482
|
const resolvedCfg = await appConfigFor(request, url, app2);
|
|
156944
157483
|
if (!resolvedCfg.ok) return resolvedCfg.response;
|
|
156945
157484
|
served.app = app2;
|
|
@@ -156948,35 +157487,35 @@ ${releaseId}`;
|
|
|
156948
157487
|
try {
|
|
156949
157488
|
call = await request.json();
|
|
156950
157489
|
} catch {
|
|
156951
|
-
return
|
|
157490
|
+
return json5(400, { error: "invalid_json" });
|
|
156952
157491
|
}
|
|
156953
157492
|
served.fallback = call.fallback === true;
|
|
156954
157493
|
if (call.checkOwnerSession !== void 0 && (typeof call.checkOwnerSession !== "boolean" || call.checkOwnerSession && call.ownerMsid === void 0)) {
|
|
156955
|
-
return
|
|
157494
|
+
return json5(400, { error: "invalid_owner_session_check" });
|
|
156956
157495
|
}
|
|
156957
157496
|
const method = String(call.method ?? "GET").toUpperCase();
|
|
156958
157497
|
const reqPath = String(call.path ?? "/");
|
|
156959
157498
|
const body = call.body === void 0 ? void 0 : typeof call.body === "string" ? call.body : JSON.stringify(call.body);
|
|
156960
157499
|
const forwardedHeaders = normalizeWixForwardedHeaders(call.headers);
|
|
156961
157500
|
if (/^[a-z][a-z0-9+.-]*:\/\//i.test(reqPath)) {
|
|
156962
|
-
return absoluteUrlRejection(reqPath) === "owner-only" ?
|
|
157501
|
+
return absoluteUrlRejection(reqPath) === "owner-only" ? json5(501, { error: "webwix_owner_only", app: app2 }) : json5(400, { error: "absolute_urls_not_allowed" });
|
|
156963
157502
|
}
|
|
156964
157503
|
const callerCookie = request.headers.get("cookie") ?? "";
|
|
156965
157504
|
if (!call.checkOwnerSession && webwixOwnerRungOn() && method === "POST" && isOwnerSitesPath(reqPath) && !/wixSession2=/.test(callerCookie)) {
|
|
156966
157505
|
served.rung = "sites";
|
|
156967
|
-
return
|
|
157506
|
+
return json5(501, { error: "webwix_owner_no_session", app: app2 });
|
|
156968
157507
|
}
|
|
156969
157508
|
if (!call.checkOwnerSession && webwixOwnerRungOn() && method === "POST" && isOwnerSitesPath(reqPath) && /wixSession2=/.test(callerCookie)) {
|
|
156970
157509
|
served.rung = "sites";
|
|
156971
157510
|
try {
|
|
156972
157511
|
const envelope = await wixOwnerSitesCall(reqPath, callerCookie, body, webwixFetch);
|
|
156973
|
-
if (envelope.status >= 200 && envelope.status < 300) return
|
|
156974
|
-
return
|
|
157512
|
+
if (envelope.status >= 200 && envelope.status < 300) return json5(200, envelope);
|
|
157513
|
+
return json5(200, {
|
|
156975
157514
|
status: 501,
|
|
156976
157515
|
body: JSON.stringify({ error: "webwix_owner_sites_failed", upstream: envelope.status })
|
|
156977
157516
|
});
|
|
156978
157517
|
} catch (e2) {
|
|
156979
|
-
return
|
|
157518
|
+
return json5(200, {
|
|
156980
157519
|
status: 501,
|
|
156981
157520
|
body: JSON.stringify({ error: "webwix_owner_sites_failed", detail: String(e2?.message ?? e2).slice(0, 200) })
|
|
156982
157521
|
});
|
|
@@ -156984,12 +157523,12 @@ ${releaseId}`;
|
|
|
156984
157523
|
}
|
|
156985
157524
|
if (call.ownerMsid !== void 0) {
|
|
156986
157525
|
served.rung = call.checkOwnerSession === true ? "gate" : "owner";
|
|
156987
|
-
if (!webwixOwnerRungOn()) return
|
|
156988
|
-
return
|
|
157526
|
+
if (!webwixOwnerRungOn()) return json5(503, { error: "webwix_owner_disabled" });
|
|
157527
|
+
return json5(501, { error: "webwix_owner_direct_only", app: app2 });
|
|
156989
157528
|
}
|
|
156990
157529
|
const resolved2 = wixClientIdOf(utf8Decode(cfgBytes));
|
|
156991
157530
|
if ("error" in resolved2) {
|
|
156992
|
-
return
|
|
157531
|
+
return json5(501, { error: `webwix_bridge_${resolved2.error}`, app: app2 });
|
|
156993
157532
|
}
|
|
156994
157533
|
served.rung = "visitor";
|
|
156995
157534
|
const memberStore = memberSessions();
|
|
@@ -157000,13 +157539,13 @@ ${releaseId}`;
|
|
|
157000
157539
|
if (memberToken) {
|
|
157001
157540
|
served.rung = "member";
|
|
157002
157541
|
try {
|
|
157003
|
-
return
|
|
157542
|
+
return json5(200, await wixVisitorCall(method, reqPath, body, memberToken, webwixFetch, forwardedHeaders), { "cache-control": "no-store" });
|
|
157004
157543
|
} catch (e2) {
|
|
157005
|
-
return
|
|
157544
|
+
return json5(502, { error: "webwix_bridge_upstream_failed", detail: String(e2?.message ?? e2).slice(0, 200) });
|
|
157006
157545
|
}
|
|
157007
157546
|
}
|
|
157008
157547
|
}
|
|
157009
|
-
return
|
|
157548
|
+
return json5(501, { error: "webwix_visitor_direct_only", app: app2 });
|
|
157010
157549
|
})();
|
|
157011
157550
|
status = res.status;
|
|
157012
157551
|
return res;
|
|
@@ -157017,8 +157556,8 @@ ${releaseId}`;
|
|
|
157017
157556
|
}
|
|
157018
157557
|
}
|
|
157019
157558
|
}
|
|
157020
|
-
if (request.method !== "GET") return
|
|
157021
|
-
if (path2 === "/__health") return
|
|
157559
|
+
if (request.method !== "GET") return json5(405, { error: "method_not_allowed" });
|
|
157560
|
+
if (path2 === "/__health") return json5(200, { ok: true });
|
|
157022
157561
|
const packageShare = /^\/p\/([a-f0-9]{64})$/.exec(path2);
|
|
157023
157562
|
if (packageShare) {
|
|
157024
157563
|
const shareId = packageShare[1];
|
|
@@ -157027,8 +157566,8 @@ ${releaseId}`;
|
|
|
157027
157566
|
const wantsHtml = (request.headers.get("accept") ?? "").includes("text/html");
|
|
157028
157567
|
if (wantsMetadata || wantsHtml && !wantsDownload) {
|
|
157029
157568
|
const share = await resolvePackageShareMetadata(await getStore(), shareId);
|
|
157030
|
-
if (!share) return
|
|
157031
|
-
if (wantsMetadata) return
|
|
157569
|
+
if (!share) return json5(404, { error: "package_share_not_found" });
|
|
157570
|
+
if (wantsMetadata) return json5(200, share, { "cache-control": "no-store" });
|
|
157032
157571
|
const title = share.app.replace(/[<>&"]/g, "");
|
|
157033
157572
|
return new Response(`<!doctype html><meta charset="utf-8"><meta name="referrer" content="no-referrer"><title>${title} \xB7 Himi</title><main><h1>${title}</h1><p>Open this package in Himi Player, or download it for Files and Android sharing.</p><p><a href="?download=1">Download .himi</a></p></main>`, {
|
|
157034
157573
|
status: 200,
|
|
@@ -157036,7 +157575,7 @@ ${releaseId}`;
|
|
|
157036
157575
|
});
|
|
157037
157576
|
}
|
|
157038
157577
|
const found = await resolvePackageShare(await getStore(), shareId);
|
|
157039
|
-
if (!found) return
|
|
157578
|
+
if (!found) return json5(404, { error: "package_share_not_found" });
|
|
157040
157579
|
return new Response(found.archive, {
|
|
157041
157580
|
status: 200,
|
|
157042
157581
|
headers: {
|
|
@@ -157049,46 +157588,46 @@ ${releaseId}`;
|
|
|
157049
157588
|
});
|
|
157050
157589
|
}
|
|
157051
157590
|
if (path2 === "/v1/owner/instance") {
|
|
157052
|
-
if (opts.webwixBridge === false) return
|
|
157591
|
+
if (opts.webwixBridge === false) return json5(503, { error: "webwix_bridge_disabled" });
|
|
157053
157592
|
const gateApp = url.searchParams.get("app");
|
|
157054
157593
|
if (gateApp) {
|
|
157055
157594
|
const cfg = await appConfigFor(request, url, gateApp);
|
|
157056
157595
|
if (!cfg.ok) return cfg.response;
|
|
157057
157596
|
}
|
|
157058
|
-
if (!webwixOwnerRungOn()) return
|
|
157597
|
+
if (!webwixOwnerRungOn()) return json5(503, { error: "webwix_owner_disabled" });
|
|
157059
157598
|
const msid = url.searchParams.get("msid") ?? "";
|
|
157060
|
-
if (!isSafeMsid(msid)) return
|
|
157599
|
+
if (!isSafeMsid(msid)) return json5(400, { error: "webwix_owner_bad_msid" });
|
|
157061
157600
|
const cookie = request.headers.get("cookie") ?? "";
|
|
157062
|
-
if (!/wixSession2=/.test(cookie)) return
|
|
157601
|
+
if (!/wixSession2=/.test(cookie)) return json5(401, { error: "webwix_owner_no_session" });
|
|
157063
157602
|
const renew = url.searchParams.get("renew") === "1";
|
|
157064
157603
|
try {
|
|
157065
157604
|
const entry = await webwixOwnerInstances.entry(msid, cookie, Date.now(), { renew });
|
|
157066
|
-
return
|
|
157605
|
+
return json5(200, { ...entry, expiresInMs: Math.max(0, entry.expiresAt - Date.now()) }, { "cache-control": "no-store" });
|
|
157067
157606
|
} catch (e2) {
|
|
157068
157607
|
const msg = String(e2?.message ?? e2);
|
|
157069
|
-
if (/owner mint failed \(5\d\d\)/.test(msg) || !msg.includes("owner mint failed")) return
|
|
157070
|
-
return
|
|
157608
|
+
if (/owner mint failed \(5\d\d\)/.test(msg) || !msg.includes("owner mint failed")) return json5(502, { error: "webwix_bridge_upstream_failed" });
|
|
157609
|
+
return json5(403, { error: "webwix_owner_mint_failed" });
|
|
157071
157610
|
}
|
|
157072
157611
|
}
|
|
157073
157612
|
if (path2 === "/v1/owner/sites") {
|
|
157074
|
-
if (!webwixOwnerRungOn()) return
|
|
157613
|
+
if (!webwixOwnerRungOn()) return json5(503, { error: "webwix_owner_disabled" });
|
|
157075
157614
|
const cookie = request.headers.get("cookie") ?? "";
|
|
157076
|
-
if (!/wixSession2=/.test(cookie)) return
|
|
157615
|
+
if (!/wixSession2=/.test(cookie)) return json5(200, { sites: [] });
|
|
157077
157616
|
const limitParam = url.searchParams.get("limit");
|
|
157078
157617
|
const limitRaw = limitParam === null ? NaN : Number(limitParam);
|
|
157079
157618
|
const limit = Number.isFinite(limitRaw) ? Math.min(100, Math.max(1, Math.trunc(limitRaw))) : 50;
|
|
157080
157619
|
try {
|
|
157081
|
-
return
|
|
157620
|
+
return json5(200, { sites: await webwixOwnerSites.sites(cookie, limit) });
|
|
157082
157621
|
} catch (e2) {
|
|
157083
|
-
return
|
|
157622
|
+
return json5(501, { error: "webwix_owner_sites_failed", detail: String(e2?.message ?? e2).slice(0, 120) });
|
|
157084
157623
|
}
|
|
157085
157624
|
}
|
|
157086
157625
|
const store = await getStore();
|
|
157087
157626
|
if (path2 === "/v1/apps") {
|
|
157088
157627
|
if (opts.authorizeList && !await opts.authorizeList(request)) {
|
|
157089
|
-
return
|
|
157628
|
+
return json5(401, { error: "unauthorized" });
|
|
157090
157629
|
}
|
|
157091
|
-
if (!store.listApps) return
|
|
157630
|
+
if (!store.listApps) return json5(501, { error: "listing_unsupported" });
|
|
157092
157631
|
const ids = await store.listApps();
|
|
157093
157632
|
const apps = [];
|
|
157094
157633
|
for (const id of ids) {
|
|
@@ -157148,14 +157687,14 @@ ${releaseId}`;
|
|
|
157148
157687
|
}
|
|
157149
157688
|
return new Response(listBody, {
|
|
157150
157689
|
status: 200,
|
|
157151
|
-
headers: { "content-type":
|
|
157690
|
+
headers: { "content-type": JSON_CT3, ...listHeaders }
|
|
157152
157691
|
});
|
|
157153
157692
|
}
|
|
157154
157693
|
if (path2 === "/v1/templates") {
|
|
157155
157694
|
if (opts.authorizeList && !await opts.authorizeList(request)) {
|
|
157156
|
-
return
|
|
157695
|
+
return json5(401, { error: "unauthorized" });
|
|
157157
157696
|
}
|
|
157158
|
-
if (!store.listApps) return
|
|
157697
|
+
if (!store.listApps) return json5(501, { error: "listing_unsupported" });
|
|
157159
157698
|
const ids = await store.listApps();
|
|
157160
157699
|
const templates = [];
|
|
157161
157700
|
for (const id of ids) {
|
|
@@ -157182,7 +157721,7 @@ ${releaseId}`;
|
|
|
157182
157721
|
});
|
|
157183
157722
|
}
|
|
157184
157723
|
templates.sort((a2, b2) => String(a2.name).localeCompare(String(b2.name)));
|
|
157185
|
-
return
|
|
157724
|
+
return json5(200, { templates });
|
|
157186
157725
|
}
|
|
157187
157726
|
const cfgMatch = /^\/v1\/app-config\/([^/]+)$/.exec(path2);
|
|
157188
157727
|
const app = cfgMatch?.[1] ?? resolveApp(request, url);
|
|
@@ -157192,12 +157731,12 @@ ${releaseId}`;
|
|
|
157192
157731
|
if (denied2) return denied2;
|
|
157193
157732
|
}
|
|
157194
157733
|
if (path2 === "/v1/template-source") {
|
|
157195
|
-
if (!app) return
|
|
157196
|
-
if (!store.getSource) return
|
|
157734
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157735
|
+
if (!store.getSource) return json5(501, { error: "templates_unsupported" });
|
|
157197
157736
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157198
|
-
if (!m2?.sourceHash) return
|
|
157737
|
+
if (!m2?.sourceHash) return json5(404, { error: "template_source_not_found", app });
|
|
157199
157738
|
const bytes2 = await store.getSource(app, m2.sourceHash);
|
|
157200
|
-
if (!bytes2) return
|
|
157739
|
+
if (!bytes2) return json5(404, { error: "template_source_not_found", app });
|
|
157201
157740
|
const etag = `"${m2.sourceHash}"`;
|
|
157202
157741
|
const cache = { "cache-control": pin ? PINNED_CACHE_CONTROL : DOC_CACHE_CONTROL, ...pin ? { vary: "x-himalaya-release" } : {} };
|
|
157203
157742
|
if (request.headers.get("if-none-match") === etag) {
|
|
@@ -157205,17 +157744,17 @@ ${releaseId}`;
|
|
|
157205
157744
|
}
|
|
157206
157745
|
return new Response(bytes2, {
|
|
157207
157746
|
status: 200,
|
|
157208
|
-
headers: { "content-type":
|
|
157747
|
+
headers: { "content-type": JSON_CT3, etag, ...cache, "x-himalaya-app": app }
|
|
157209
157748
|
});
|
|
157210
157749
|
}
|
|
157211
157750
|
if (path2 === "/v1/authoring-docs" || /^\/v1\/authoring-docs\/(spec|mobile-ux)$/.test(path2)) {
|
|
157212
|
-
if (!app) return
|
|
157751
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157213
157752
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157214
|
-
if (!m2) return
|
|
157753
|
+
if (!m2) return json5(404, { error: pin ? "release_not_found" : "no_release", app });
|
|
157215
157754
|
const docs = m2.authoringDocs ?? {};
|
|
157216
157755
|
const match = /^\/v1\/authoring-docs\/(spec|mobile-ux)$/.exec(path2);
|
|
157217
157756
|
if (!match) {
|
|
157218
|
-
return
|
|
157757
|
+
return json5(200, {
|
|
157219
157758
|
app,
|
|
157220
157759
|
releaseId: m2.releaseId,
|
|
157221
157760
|
docs: Object.entries(docs).map(([name2, doc]) => ({ name: name2, ...doc }))
|
|
@@ -157223,9 +157762,9 @@ ${releaseId}`;
|
|
|
157223
157762
|
}
|
|
157224
157763
|
const name = match[1];
|
|
157225
157764
|
const meta = docs[name];
|
|
157226
|
-
if (!meta) return
|
|
157765
|
+
if (!meta) return json5(404, { error: "authoring_doc_not_found", app, name });
|
|
157227
157766
|
const bytes2 = pin ? await pinnedBody(app, meta.sha256, () => Promise.resolve(null)) : store.getDoc ? await store.getDoc(app, meta.sha256) : null;
|
|
157228
|
-
if (!bytes2) return
|
|
157767
|
+
if (!bytes2) return json5(404, { error: "authoring_doc_not_found", app, name });
|
|
157229
157768
|
const etag = `"${meta.sha256}"`;
|
|
157230
157769
|
if (request.headers.get("if-none-match") === etag) {
|
|
157231
157770
|
return new Response(null, { status: 304, headers: { etag, "cache-control": pin ? PINNED_CACHE_CONTROL : DOC_CACHE_CONTROL, ...pin ? { vary: "x-himalaya-release" } : {} } });
|
|
@@ -157244,20 +157783,20 @@ ${releaseId}`;
|
|
|
157244
157783
|
if (path2 === "/v1/release/current") {
|
|
157245
157784
|
if (pin) {
|
|
157246
157785
|
const m3 = app ? await pinnedManifest(app, pin) : null;
|
|
157247
|
-
if (!m3) return
|
|
157248
|
-
return
|
|
157786
|
+
if (!m3) return json5(404, { error: "release_not_found", app, releaseId: pin });
|
|
157787
|
+
return json5(200, { releaseId: m3.releaseId, app: m3.app, pinned: true, ...m3.minBinaryVersion ? { minBinaryVersion: m3.minBinaryVersion } : {}, ...m3.playerRequirements ? { playerRequirements: m3.playerRequirements } : {}, ...m3.hostProvidedIdentity === true ? { hostProvidedIdentity: true } : {}, ...m3.platforms ? { platforms: m3.platforms } : {} });
|
|
157249
157788
|
}
|
|
157250
157789
|
const m2 = app ? await manifest(app) : null;
|
|
157251
|
-
if (!m2) return
|
|
157252
|
-
return
|
|
157790
|
+
if (!m2) return json5(404, { error: "no_release", app });
|
|
157791
|
+
return json5(200, { releaseId: m2.releaseId, app: m2.app, ...m2.minBinaryVersion ? { minBinaryVersion: m2.minBinaryVersion } : {}, ...m2.playerRequirements ? { playerRequirements: m2.playerRequirements } : {}, ...m2.hostProvidedIdentity === true ? { hostProvidedIdentity: true } : {}, ...m2.platforms ? { platforms: m2.platforms } : {} });
|
|
157253
157792
|
}
|
|
157254
157793
|
const bundleMatch = /^\/v1\/bundles\/([a-f0-9]{64})\.bundle\.js$/.exec(path2);
|
|
157255
157794
|
if (bundleMatch) {
|
|
157256
157795
|
const hash2 = bundleMatch[1];
|
|
157257
157796
|
const m2 = app ? pin ? await pinnedManifest(app, pin) : await manifest(app) : null;
|
|
157258
|
-
if (!m2 || !app) return
|
|
157797
|
+
if (!m2 || !app) return json5(404, { error: "no_release", app });
|
|
157259
157798
|
const bytes2 = await store.getBundle(app, hash2);
|
|
157260
|
-
if (!bytes2) return
|
|
157799
|
+
if (!bytes2) return json5(404, { error: "bundle_not_found", hash: hash2 });
|
|
157261
157800
|
const entry = Object.values(m2.bundles).find((b2) => b2.sha256 === hash2);
|
|
157262
157801
|
return new Response(bytes2, {
|
|
157263
157802
|
status: 200,
|
|
@@ -157269,27 +157808,27 @@ ${releaseId}`;
|
|
|
157269
157808
|
});
|
|
157270
157809
|
}
|
|
157271
157810
|
if (path2 === "/v1/boot") {
|
|
157272
|
-
if (!app) return
|
|
157811
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157273
157812
|
let m2;
|
|
157274
157813
|
if (pin) {
|
|
157275
157814
|
const denied2 = await authorizePinnedRead(request, url, app, pin);
|
|
157276
157815
|
if (denied2) return denied2;
|
|
157277
157816
|
m2 = await pinnedManifest(app, pin);
|
|
157278
|
-
if (!m2) return
|
|
157817
|
+
if (!m2) return json5(404, { error: "release_not_found", app, releaseId: pin });
|
|
157279
157818
|
} else {
|
|
157280
157819
|
m2 = await manifest(app);
|
|
157281
|
-
if (!m2) return
|
|
157820
|
+
if (!m2) return json5(404, { error: "app_not_found", app });
|
|
157282
157821
|
}
|
|
157283
157822
|
const mm = m2;
|
|
157284
157823
|
const readDoc = (hash2, live3) => pin ? hash2 ? pinnedBody(app, hash2, live3) : Promise.resolve(null) : live3();
|
|
157285
157824
|
const ringPinned = pin !== null && request.headers.get(RELEASE_SOURCE_HEADER) === "ring";
|
|
157286
157825
|
const cfgBytes = ringPinned ? await store.getAppConfig(app) : await readDoc(mm.appConfigHash, () => store.getAppConfig(app));
|
|
157287
|
-
if (!cfgBytes) return
|
|
157826
|
+
if (!cfgBytes) return json5(404, { error: "app_config_not_found", app });
|
|
157288
157827
|
let appConfig;
|
|
157289
157828
|
try {
|
|
157290
157829
|
appConfig = JSON.parse(utf8Decode(cfgBytes));
|
|
157291
157830
|
} catch {
|
|
157292
|
-
return
|
|
157831
|
+
return json5(500, { error: "app_config_invalid", app });
|
|
157293
157832
|
}
|
|
157294
157833
|
const bootOverlay = (!pin || ringPinned) && opts.devControl ? devControlOverlay.get(app) : void 0;
|
|
157295
157834
|
if (bootOverlay) appConfig.control = { ...appConfig.control ?? {}, ...bootOverlay };
|
|
@@ -157346,41 +157885,41 @@ ${releaseId}`;
|
|
|
157346
157885
|
if (request.headers.get("if-none-match") === etag) {
|
|
157347
157886
|
return new Response(null, { status: 304, headers: { etag, "cache-control": cache, ...vary } });
|
|
157348
157887
|
}
|
|
157349
|
-
return
|
|
157888
|
+
return json5(200, { releaseId: mm.releaseId, app, appConfig, tokens: tokens2, homeScreenId, screen, homeBundle }, { etag, "cache-control": cache, ...vary });
|
|
157350
157889
|
}
|
|
157351
157890
|
if (path2 === "/v1/tokens") {
|
|
157352
|
-
if (!app) return
|
|
157891
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157353
157892
|
if (pin) {
|
|
157354
157893
|
const m2 = await pinnedManifest(app, pin);
|
|
157355
|
-
if (!m2) return
|
|
157894
|
+
if (!m2) return json5(404, { error: "release_not_found", app, releaseId: pin });
|
|
157356
157895
|
const bytes3 = m2.tokensHash ? await pinnedBody(app, m2.tokensHash, () => store.getTokens(app)) : null;
|
|
157357
|
-
if (!bytes3) return
|
|
157896
|
+
if (!bytes3) return json5(404, { error: "tokens_not_found", app });
|
|
157358
157897
|
return sendDoc(request, bytes3, true);
|
|
157359
157898
|
}
|
|
157360
157899
|
const bytes2 = await store.getTokens(app);
|
|
157361
|
-
if (!bytes2) return
|
|
157900
|
+
if (!bytes2) return json5(404, { error: "tokens_not_found", app });
|
|
157362
157901
|
return sendDoc(request, bytes2);
|
|
157363
157902
|
}
|
|
157364
157903
|
if (path2 === "/v1/l10n") {
|
|
157365
|
-
if (!app) return
|
|
157904
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157366
157905
|
const tag = (url.searchParams.get("tag") ?? "").trim();
|
|
157367
157906
|
if (!/^[a-z]{2}(-[A-Za-z0-9]+)?$/.test(tag)) {
|
|
157368
|
-
return
|
|
157907
|
+
return json5(400, { error: "bad_tag", hint: "pass a BCP-47 primary subtag, e.g. tag=he" });
|
|
157369
157908
|
}
|
|
157370
157909
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157371
|
-
if (!m2) return
|
|
157910
|
+
if (!m2) return json5(404, pin ? { error: "release_not_found", app, releaseId: pin } : { error: "no_release", app });
|
|
157372
157911
|
const hash2 = m2.catalogs?.[tag];
|
|
157373
157912
|
if (!hash2) return new Response(null, { status: 204 });
|
|
157374
|
-
if (!store.getDoc) return
|
|
157913
|
+
if (!store.getDoc) return json5(501, { error: "docs_unsupported" });
|
|
157375
157914
|
const bytes2 = await store.getDoc(app, hash2);
|
|
157376
157915
|
if (!bytes2) return new Response(null, { status: 204 });
|
|
157377
157916
|
return sendDoc(request, bytes2, Boolean(pin));
|
|
157378
157917
|
}
|
|
157379
157918
|
if (path2 === "/v1/app-icon") {
|
|
157380
|
-
if (!app) return
|
|
157381
|
-
if (!store.getIcon) return
|
|
157919
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157920
|
+
if (!store.getIcon) return json5(501, { error: "icons_unsupported" });
|
|
157382
157921
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157383
|
-
if (!m2) return
|
|
157922
|
+
if (!m2) return json5(404, pin ? { error: "release_not_found", app, releaseId: pin } : { error: "no_release", app });
|
|
157384
157923
|
if (!m2.iconHash) return new Response(null, { status: 204 });
|
|
157385
157924
|
const bytes2 = await store.getIcon(app);
|
|
157386
157925
|
if (!bytes2) return new Response(null, { status: 204 });
|
|
@@ -157395,19 +157934,19 @@ ${releaseId}`;
|
|
|
157395
157934
|
}
|
|
157396
157935
|
const assetMatch = /^\/v1\/asset\/([^/?]+)$/.exec(path2);
|
|
157397
157936
|
if (assetMatch) {
|
|
157398
|
-
if (!app) return
|
|
157399
|
-
if (!store.getAsset) return
|
|
157937
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157938
|
+
if (!store.getAsset) return json5(501, { error: "assets_unsupported" });
|
|
157400
157939
|
const sha2 = assetMatch[1];
|
|
157401
|
-
if (!isSafeSegment(sha2)) return
|
|
157940
|
+
if (!isSafeSegment(sha2)) return json5(400, { error: "bad_asset" });
|
|
157402
157941
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157403
157942
|
const record2 = Object.values(m2?.assets ?? {}).find((a2) => a2.sha256 === sha2);
|
|
157404
|
-
if (!record2) return
|
|
157943
|
+
if (!record2) return json5(404, { error: "asset_not_found", app });
|
|
157405
157944
|
const etag = strongEtagForSha256(sha2);
|
|
157406
157945
|
if (request.headers.get("if-none-match") === etag) {
|
|
157407
157946
|
return new Response(null, { status: 304, headers: { etag, "cache-control": BUNDLE_CACHE_CONTROL } });
|
|
157408
157947
|
}
|
|
157409
157948
|
const bytes2 = await store.getAsset(app, sha2);
|
|
157410
|
-
if (!bytes2) return
|
|
157949
|
+
if (!bytes2) return json5(404, { error: "asset_not_found", app });
|
|
157411
157950
|
return new Response(bytes2, {
|
|
157412
157951
|
status: 200,
|
|
157413
157952
|
headers: {
|
|
@@ -157433,19 +157972,19 @@ ${releaseId}`;
|
|
|
157433
157972
|
bundleUrl: `/v1/bundles/${h2.bundleHash}.bundle.js?app=${encodeURIComponent(ahApp)}`,
|
|
157434
157973
|
integrity: h2.sri
|
|
157435
157974
|
}));
|
|
157436
|
-
return
|
|
157975
|
+
return json5(200, { handlers });
|
|
157437
157976
|
}
|
|
157438
157977
|
if (cfgMatch) {
|
|
157439
157978
|
const cfgApp = cfgMatch[1];
|
|
157440
157979
|
if (pin) {
|
|
157441
157980
|
const m2 = await pinnedManifest(cfgApp, pin);
|
|
157442
|
-
if (!m2) return
|
|
157981
|
+
if (!m2) return json5(404, { error: "release_not_found", app: cfgApp, releaseId: pin });
|
|
157443
157982
|
const bytes3 = m2.appConfigHash ? await pinnedBody(cfgApp, m2.appConfigHash, () => store.getAppConfig(cfgApp)) : null;
|
|
157444
|
-
if (!bytes3) return
|
|
157983
|
+
if (!bytes3) return json5(404, { error: "app_config_not_found", app: cfgApp });
|
|
157445
157984
|
return sendDoc(request, bytes3, true);
|
|
157446
157985
|
}
|
|
157447
157986
|
const bytes2 = await store.getAppConfig(cfgApp);
|
|
157448
|
-
if (!bytes2) return
|
|
157987
|
+
if (!bytes2) return json5(404, { error: "app_config_not_found", app: cfgApp });
|
|
157449
157988
|
const overlay = opts.devControl ? devControlOverlay.get(cfgApp) : void 0;
|
|
157450
157989
|
if (overlay) {
|
|
157451
157990
|
const cfg = JSON.parse(utf8Decode(bytes2));
|
|
@@ -157457,50 +157996,50 @@ ${releaseId}`;
|
|
|
157457
157996
|
const screenMatch = /^\/v1\/screen\/([^/]+)$/.exec(path2);
|
|
157458
157997
|
if (screenMatch) {
|
|
157459
157998
|
const screenId = screenMatch[1];
|
|
157460
|
-
if (!app || !isSafeSegment(screenId)) return
|
|
157999
|
+
if (!app || !isSafeSegment(screenId)) return json5(404, { error: "screen_not_found", screenId });
|
|
157461
158000
|
if (pin) {
|
|
157462
158001
|
const denied2 = await authorizePinnedRead(request, url, app, pin, screenId);
|
|
157463
158002
|
if (denied2) return denied2;
|
|
157464
158003
|
const m3 = await pinnedManifest(app, pin);
|
|
157465
|
-
if (!m3) return
|
|
158004
|
+
if (!m3) return json5(404, { error: "release_not_found", app, releaseId: pin });
|
|
157466
158005
|
const meta2 = m3.screens[screenId];
|
|
157467
|
-
if (!meta2) return
|
|
158006
|
+
if (!meta2) return json5(404, { error: "screen_not_found", screenId });
|
|
157468
158007
|
const etag2 = `"${meta2.descriptorHash}"`;
|
|
157469
158008
|
const headers2 = { etag: etag2, "cache-control": PINNED_CACHE_CONTROL, vary: "x-himalaya-release" };
|
|
157470
158009
|
if (request.headers.get("if-none-match") === etag2) return new Response(null, { status: 304, headers: headers2 });
|
|
157471
158010
|
const body2 = await pinnedBody(app, meta2.descriptorHash, () => store.getScreen(app, screenId));
|
|
157472
|
-
if (!body2) return
|
|
157473
|
-
return new Response(body2, { status: 200, headers: { "content-type":
|
|
158011
|
+
if (!body2) return json5(404, { error: "screen_not_found", screenId });
|
|
158012
|
+
return new Response(body2, { status: 200, headers: { "content-type": JSON_CT3, ...headers2, "x-himalaya-app": app } });
|
|
157474
158013
|
}
|
|
157475
158014
|
const m2 = await manifest(app);
|
|
157476
158015
|
const meta = m2?.screens[screenId];
|
|
157477
|
-
if (!m2 || !meta) return
|
|
158016
|
+
if (!m2 || !meta) return json5(404, { error: "screen_not_found", screenId });
|
|
157478
158017
|
const etag = `"${meta.descriptorHash}"`;
|
|
157479
158018
|
if (request.headers.get("if-none-match") === etag) {
|
|
157480
158019
|
return new Response(null, { status: 304, headers: { etag, "cache-control": DOC_CACHE_CONTROL } });
|
|
157481
158020
|
}
|
|
157482
158021
|
const body = await store.getScreen(app, screenId);
|
|
157483
|
-
if (!body) return
|
|
158022
|
+
if (!body) return json5(404, { error: "screen_not_found", screenId });
|
|
157484
158023
|
return new Response(body, {
|
|
157485
158024
|
status: 200,
|
|
157486
|
-
headers: { "content-type":
|
|
158025
|
+
headers: { "content-type": JSON_CT3, etag, "cache-control": DOC_CACHE_CONTROL, "x-himalaya-app": app }
|
|
157487
158026
|
});
|
|
157488
158027
|
}
|
|
157489
158028
|
if (path2 === "/v1/widgets") {
|
|
157490
|
-
if (!app) return
|
|
158029
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157491
158030
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157492
|
-
if (!m2) return
|
|
158031
|
+
if (!m2) return json5(404, { error: pin ? "release_not_found" : "no_release", app });
|
|
157493
158032
|
const widgets = Object.entries(m2.widgets ?? {}).map(([widgetId, meta]) => ({ widgetId, contentEtag: meta.contentEtag }));
|
|
157494
|
-
return
|
|
158033
|
+
return json5(200, { widgets });
|
|
157495
158034
|
}
|
|
157496
158035
|
const widgetMatch = /^\/v1\/widget\/([^/]+)$/.exec(path2);
|
|
157497
158036
|
if (widgetMatch) {
|
|
157498
158037
|
const widgetId = widgetMatch[1];
|
|
157499
|
-
if (!app || !isSafeSegment(widgetId)) return
|
|
157500
|
-
if (!store.getWidget) return
|
|
158038
|
+
if (!app || !isSafeSegment(widgetId)) return json5(404, { error: "widget_not_found", widgetId });
|
|
158039
|
+
if (!store.getWidget) return json5(501, { error: "widgets_unsupported" });
|
|
157501
158040
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157502
158041
|
const meta = m2?.widgets?.[widgetId];
|
|
157503
|
-
if (!m2 || !meta) return
|
|
158042
|
+
if (!m2 || !meta) return json5(404, { error: "widget_not_found", widgetId });
|
|
157504
158043
|
const etag = `"${meta.contentEtag}"`;
|
|
157505
158044
|
const cache = pin ? PINNED_CACHE_CONTROL : `max-age=${meta.ttlSeconds}`;
|
|
157506
158045
|
const vary = pin ? { vary: "x-himalaya-release" } : {};
|
|
@@ -157508,15 +158047,15 @@ ${releaseId}`;
|
|
|
157508
158047
|
return new Response(null, { status: 304, headers: { etag, "cache-control": cache, ...vary } });
|
|
157509
158048
|
}
|
|
157510
158049
|
const body = await store.getWidget(app, widgetId);
|
|
157511
|
-
if (!body) return
|
|
158050
|
+
if (!body) return json5(404, { error: "widget_not_found", widgetId });
|
|
157512
158051
|
return new Response(body, {
|
|
157513
158052
|
status: 200,
|
|
157514
|
-
headers: { "content-type":
|
|
158053
|
+
headers: { "content-type": JSON_CT3, etag, "cache-control": cache, ...vary, "x-himalaya-app": app }
|
|
157515
158054
|
});
|
|
157516
158055
|
}
|
|
157517
|
-
return
|
|
158056
|
+
return json5(404, { error: "not_found" });
|
|
157518
158057
|
} catch (err) {
|
|
157519
|
-
return
|
|
158058
|
+
return json5(500, { error: "internal", message: err.message });
|
|
157520
158059
|
}
|
|
157521
158060
|
};
|
|
157522
158061
|
return async (request) => {
|
|
@@ -157538,7 +158077,7 @@ ${releaseId}`;
|
|
|
157538
158077
|
return withCors(request, response);
|
|
157539
158078
|
};
|
|
157540
158079
|
}
|
|
157541
|
-
var
|
|
158080
|
+
var JSON_CT3;
|
|
157542
158081
|
var init_server2 = __esm({
|
|
157543
158082
|
"../../core/serve/src/server.ts"() {
|
|
157544
158083
|
init_sha256();
|
|
@@ -157548,8 +158087,9 @@ var init_server2 = __esm({
|
|
|
157548
158087
|
init_pinned_read();
|
|
157549
158088
|
init_package_share();
|
|
157550
158089
|
init_wix_bridge();
|
|
158090
|
+
init_account_rung();
|
|
157551
158091
|
init_wix_member_auth();
|
|
157552
|
-
|
|
158092
|
+
JSON_CT3 = "application/json; charset=utf-8";
|
|
157553
158093
|
}
|
|
157554
158094
|
});
|
|
157555
158095
|
|
|
@@ -157758,14 +158298,14 @@ function makeRunHandler(opts) {
|
|
|
157758
158298
|
const url = new URL(request.url);
|
|
157759
158299
|
const path2 = url.pathname;
|
|
157760
158300
|
if (path2 === "/v1/release/resolve") {
|
|
157761
|
-
return
|
|
158301
|
+
return json6(
|
|
157762
158302
|
200,
|
|
157763
158303
|
{ app: opts.app, releaseId: opts.header?.releaseId ?? null, source: "local" },
|
|
157764
158304
|
{ "cache-control": "no-store" }
|
|
157765
158305
|
);
|
|
157766
158306
|
}
|
|
157767
158307
|
if (path2 === "/v1/revocations") {
|
|
157768
|
-
return
|
|
158308
|
+
return json6(
|
|
157769
158309
|
200,
|
|
157770
158310
|
{ app: opts.app, revokedIntegrities: [], version: 0, ttlSeconds: 30 },
|
|
157771
158311
|
{ "cache-control": "max-age=30" }
|
|
@@ -157774,14 +158314,14 @@ function makeRunHandler(opts) {
|
|
|
157774
158314
|
const flagAssign = FLAG_ASSIGNMENTS_PATH.exec(path2);
|
|
157775
158315
|
if (flagAssign) return flagAssignmentsResponse(request, flagAssign[1], []);
|
|
157776
158316
|
if (path2.startsWith("/v1/flags/")) {
|
|
157777
|
-
return
|
|
158317
|
+
return json6(200, { app: opts.app, definitions: {} }, { "cache-control": "no-store" });
|
|
157778
158318
|
}
|
|
157779
158319
|
if (path2 === "/v1/owner/sites" && !ownerRungOn && (request.method === "GET" || request.method === "HEAD")) {
|
|
157780
158320
|
const headers2 = { "cache-control": "no-store" };
|
|
157781
|
-
return request.method === "HEAD" ? new Response(null, { status: 200, headers: { "content-type": "application/json; charset=utf-8", ...headers2 } }) :
|
|
158321
|
+
return request.method === "HEAD" ? new Response(null, { status: 200, headers: { "content-type": "application/json; charset=utf-8", ...headers2 } }) : json6(200, { sites: [] }, headers2);
|
|
157782
158322
|
}
|
|
157783
158323
|
if (path2 === "/v1/telemetry/ingest") {
|
|
157784
|
-
if (request.method !== "POST") return
|
|
158324
|
+
if (request.method !== "POST") return json6(405, { error: "method_not_allowed" });
|
|
157785
158325
|
try {
|
|
157786
158326
|
const body = await request.json();
|
|
157787
158327
|
const events = Array.isArray(body) ? body : Array.isArray(body?.events) ? body.events : [body];
|
|
@@ -157819,7 +158359,7 @@ data: ${JSON.stringify(data ?? {})}
|
|
|
157819
158359
|
});
|
|
157820
158360
|
}
|
|
157821
158361
|
if (path2.startsWith("/v1/__webwix/") && path2 !== "/v1/__webwix/call" && path2 !== "/v1/__webwix/identity" && !(opts.serve?.webwixMemberAuth === true && opts.serve?.webwixMemberSessions)) {
|
|
157822
|
-
return
|
|
158362
|
+
return json6(501, { error: "webwix_member_auth_unavailable" });
|
|
157823
158363
|
}
|
|
157824
158364
|
if (path2 === "/v1/app-config" || path2.startsWith("/v1/app-config/")) {
|
|
157825
158365
|
return localizeConfigResponse(await serve(request), "app-config", opts.header ?? null);
|
|
@@ -157837,17 +158377,17 @@ data: ${JSON.stringify(data ?? {})}
|
|
|
157837
158377
|
if (path2 === mount || path2.startsWith(`${mount}/`)) {
|
|
157838
158378
|
return previewResponse(path2, opts.assets, mount);
|
|
157839
158379
|
}
|
|
157840
|
-
return
|
|
158380
|
+
return json6(404, { error: "not_found", path: path2 });
|
|
157841
158381
|
};
|
|
157842
158382
|
}
|
|
157843
|
-
var
|
|
158383
|
+
var json6;
|
|
157844
158384
|
var init_run_handler = __esm({
|
|
157845
158385
|
"../../core/serve/src/run-handler.ts"() {
|
|
157846
158386
|
init_server2();
|
|
157847
158387
|
init_flag_assignments();
|
|
157848
158388
|
init_preview3();
|
|
157849
158389
|
init_himi_package();
|
|
157850
|
-
|
|
158390
|
+
json6 = (status, body, headers2 = {}) => new Response(JSON.stringify(body), {
|
|
157851
158391
|
status,
|
|
157852
158392
|
headers: { "content-type": "application/json; charset=utf-8", ...headers2 }
|
|
157853
158393
|
});
|
|
@@ -158004,30 +158544,30 @@ var init_preview_assets_generated = __esm({
|
|
|
158004
158544
|
"../../packages/serve/src/preview-assets.generated.ts"() {
|
|
158005
158545
|
init_preview_assets_format();
|
|
158006
158546
|
PREVIEW_ASSET_MANIFEST = [
|
|
158007
|
-
{ key: "assets/DashboardHost-
|
|
158008
|
-
{ key: "assets/DevDrawer-
|
|
158009
|
-
{ key: "assets/IdiomCompare-
|
|
158010
|
-
{ key: "assets/SchemeCompare-
|
|
158011
|
-
{ key: "assets/index-
|
|
158012
|
-
{ key: "assets/pdf-
|
|
158013
|
-
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
158014
|
-
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset:
|
|
158015
|
-
{ key: "assets/pdfDocument-
|
|
158016
|
-
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset:
|
|
158017
|
-
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset:
|
|
158018
|
-
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset:
|
|
158019
|
-
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
158020
|
-
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset:
|
|
158021
|
-
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset:
|
|
158022
|
-
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
158023
|
-
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset:
|
|
158024
|
-
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
158025
|
-
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset:
|
|
158026
|
-
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset:
|
|
158027
|
-
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
158028
|
-
{ key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
158029
|
-
{ key: "index.html", contentType: "text/html; charset=utf-8", offset:
|
|
158030
|
-
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset:
|
|
158547
|
+
{ key: "assets/DashboardHost-CZohnlzS.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 2916, sha256: "c8dd05c386b0cac9272b16048547629ad4e41a650de0e746900ace528e162cef" },
|
|
158548
|
+
{ key: "assets/DevDrawer-CdKVsuN0.js", contentType: "application/javascript; charset=utf-8", offset: 2924, length: 16744, sha256: "b837413e2ea57d9ee25d0ae740feaae3b26acec2948ee78b435926172d60e519" },
|
|
158549
|
+
{ key: "assets/IdiomCompare-BAo95Xpf.js", contentType: "application/javascript; charset=utf-8", offset: 19668, length: 1892, sha256: "546dfab6d29cc31bd542d7b6ee18bbe46bdd6e97c4f4dfbdd1cdb2a6555893a3" },
|
|
158550
|
+
{ key: "assets/SchemeCompare-CEBN1gSj.js", contentType: "application/javascript; charset=utf-8", offset: 21560, length: 1819, sha256: "9cb6886800b8a5460c0ae3d768092d91b7c6ef19fe8237e3442e3776b3b91630" },
|
|
158551
|
+
{ key: "assets/index-B_Q9rUA6.js", contentType: "application/javascript; charset=utf-8", offset: 23379, length: 1335292, sha256: "fca2ff76f1883245062b6fecc43a53122a2485fe4edb9b2aa226cc453699549b" },
|
|
158552
|
+
{ key: "assets/pdf-QW2L5uFW.js", contentType: "application/javascript; charset=utf-8", offset: 1358671, length: 488199, sha256: "3861b1c11010779e5fc936dab55467aad99113805a22901cf0f1a2443ea98be9" },
|
|
158553
|
+
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1846870, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
|
|
158554
|
+
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1846943, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
|
|
158555
|
+
{ key: "assets/pdfDocument-DSU7vZ1T.js", contentType: "application/javascript; charset=utf-8", offset: 3163977, length: 2868, sha256: "4d633eec01a3f893ec099e44a0cd44781118702501afd22b62454c0f0e74f327" },
|
|
158556
|
+
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3166845, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
|
|
158557
|
+
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3171455, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
|
|
158558
|
+
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3660039, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
|
|
158559
|
+
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3750963, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
|
|
158560
|
+
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3841947, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
|
|
158561
|
+
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 3932927, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
|
|
158562
|
+
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 4023799, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
|
|
158563
|
+
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4114779, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
|
|
158564
|
+
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4223415, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
|
|
158565
|
+
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4332499, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
|
|
158566
|
+
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4441547, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
|
|
158567
|
+
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4549247, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
|
|
158568
|
+
{ key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset: 4637355, length: 6748, sha256: "4a92459977d7cefa1a6a7e020c3a63509737f083b3f2773557c1a5771665811a" },
|
|
158569
|
+
{ key: "index.html", contentType: "text/html; charset=utf-8", offset: 4644103, length: 4947, sha256: "abc29cd7b3390800bc6062b92fd59b182636b0f212c22047df94d618cb3f8ae2" },
|
|
158570
|
+
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4649050, length: 17768, sha256: "a47dec8623a0f58def7d8785ee74d08483626e75d07c9328bfc9ecb2172c2e0d" }
|
|
158031
158571
|
];
|
|
158032
158572
|
}
|
|
158033
158573
|
});
|
|
@@ -162672,9 +163212,9 @@ var init_store_iap = __esm({
|
|
|
162672
163212
|
UsageError = class extends Error {
|
|
162673
163213
|
};
|
|
162674
163214
|
CommandOutput = class {
|
|
162675
|
-
constructor(io2,
|
|
163215
|
+
constructor(io2, json7) {
|
|
162676
163216
|
this.io = io2;
|
|
162677
|
-
this.json =
|
|
163217
|
+
this.json = json7;
|
|
162678
163218
|
}
|
|
162679
163219
|
secrets = [];
|
|
162680
163220
|
get interactive() {
|
|
@@ -162845,7 +163385,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
162845
163385
|
const invokedAs = pos[0];
|
|
162846
163386
|
const sub = invokedAs === "testflight" ? "upload" : pos[1];
|
|
162847
163387
|
const app = invokedAs === "testflight" ? pos[1] : pos[2];
|
|
162848
|
-
const
|
|
163388
|
+
const json7 = on3(flags.json);
|
|
162849
163389
|
const print = (o2) => io2.log(JSON.stringify(o2, null, 2));
|
|
162850
163390
|
const fail5 = (error, extra = {}) => {
|
|
162851
163391
|
io2.error(JSON.stringify({ error, ...extra }));
|
|
@@ -162883,7 +163423,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
162883
163423
|
}
|
|
162884
163424
|
try {
|
|
162885
163425
|
const s2 = await deps.ascStatus(app, credsToEnv(creds2));
|
|
162886
|
-
if (
|
|
163426
|
+
if (json7) print({ ok: true, app, team: creds2.team, ...s2 });
|
|
162887
163427
|
else {
|
|
162888
163428
|
io2.log(` ${pad2("app")}${app} team ${creds2.team} appStoreId ${s2.appStoreId}`);
|
|
162889
163429
|
for (const b2 of s2.builds.slice(0, 5)) io2.log(` ${pad2("build")}${b2.version} ${b2.processingState}`);
|
|
@@ -162903,7 +163443,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
162903
163443
|
}
|
|
162904
163444
|
const { errors, warnings } = partitionFindings(findings);
|
|
162905
163445
|
if (sub === "preflight") {
|
|
162906
|
-
if (
|
|
163446
|
+
if (json7) print({ ok: errors.length === 0, app, findings });
|
|
162907
163447
|
else {
|
|
162908
163448
|
for (const f2 of findings) io2.log(` ${f2.level === "error" ? "\u2717" : "!"} ${f2.message}`);
|
|
162909
163449
|
io2.log(errors.length === 0 ? `
|
|
@@ -162941,7 +163481,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
162941
163481
|
const reuseExisting = on3(flags["skip-build"]);
|
|
162942
163482
|
const nextBuild = reuseExisting ? version4.build : version4.build + 1;
|
|
162943
163483
|
const plannedSteps = UPLOAD_STEPS.filter((s2) => !(reuseExisting && BUILD_STEPS.has(s2)));
|
|
162944
|
-
if (!
|
|
163484
|
+
if (!json7) {
|
|
162945
163485
|
io2.log("");
|
|
162946
163486
|
for (const line of accountHeader({ app, bundleId, version: version4, nextBuild, creds, track })) io2.log(line);
|
|
162947
163487
|
io2.log("");
|
|
@@ -162969,7 +163509,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
162969
163509
|
steps: [...plannedSteps],
|
|
162970
163510
|
warnings: warnings.map((w2) => w2.message)
|
|
162971
163511
|
};
|
|
162972
|
-
if (
|
|
163512
|
+
if (json7) print(plan);
|
|
162973
163513
|
else {
|
|
162974
163514
|
io2.log(`
|
|
162975
163515
|
dry run \u2014 nothing was built, uploaded or bumped.`);
|
|
@@ -163022,11 +163562,11 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
163022
163562
|
stderr: r2.stderr.split("\n").slice(-20).join("\n")
|
|
163023
163563
|
});
|
|
163024
163564
|
}
|
|
163025
|
-
if (!
|
|
163565
|
+
if (!json7) io2.log(` \u2713 ${pad2(step)}ok`);
|
|
163026
163566
|
}
|
|
163027
163567
|
if (on3(flags["no-wait"])) {
|
|
163028
163568
|
const out2 = { ok: true, app, build: uploaded.build, uploaded: true, processed: null, note: "upload accepted; processing not awaited. `himi store status " + app + "` tells you whether it landed." };
|
|
163029
|
-
if (
|
|
163569
|
+
if (json7) print(out2);
|
|
163030
163570
|
else io2.log(`
|
|
163031
163571
|
\u2713 uploaded build ${uploaded.build} \u2014 processing not awaited.`);
|
|
163032
163572
|
return 0;
|
|
@@ -163047,7 +163587,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
163047
163587
|
const mine = findBuild(s2.builds, uploaded.build);
|
|
163048
163588
|
if (mine && mine.processingState === "VALID") {
|
|
163049
163589
|
const url = `https://appstoreconnect.apple.com/apps/${s2.appStoreId}/testflight/ios`;
|
|
163050
|
-
if (
|
|
163590
|
+
if (json7) print({ ok: true, app, build: uploaded.build, processingState: mine.processingState, url });
|
|
163051
163591
|
else io2.log(`
|
|
163052
163592
|
\u2713 TestFlight ${uploaded.marketing} (${uploaded.build}) \u2014 Processing complete
|
|
163053
163593
|
${url}`);
|
|
@@ -163067,7 +163607,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
163067
163607
|
{ app, build: uploaded.build, uploaded: true, processed: false }
|
|
163068
163608
|
);
|
|
163069
163609
|
}
|
|
163070
|
-
if (!
|
|
163610
|
+
if (!json7) io2.log(` \u2026 processing (${Math.round(waited / 1e3)}s)`);
|
|
163071
163611
|
await deps.sleep(PROCESSING_POLL_MS);
|
|
163072
163612
|
waited += PROCESSING_POLL_MS;
|
|
163073
163613
|
}
|
|
@@ -164397,7 +164937,7 @@ function parseDataFlag(raw) {
|
|
|
164397
164937
|
async function runNotify(pos, flags, io2, deps = {}) {
|
|
164398
164938
|
const doFetch = deps.fetchImpl ?? fetch;
|
|
164399
164939
|
const str10 = (v2) => typeof v2 === "string" ? v2 : void 0;
|
|
164400
|
-
const
|
|
164940
|
+
const json7 = flags.json === true;
|
|
164401
164941
|
const print = (v2) => io2.log(JSON.stringify(v2, null, 2));
|
|
164402
164942
|
const sub = pos[1];
|
|
164403
164943
|
const USAGE2 = "himi notify send --app <app> (--token <t> | --device <id> | --all) --title <s> [--body <s>] [--link <url>]\n [--platform ios|android] [--category <c>] [--badge <n>] [--channel <id>] [--silent] [--dry-run] [--json]\n [--data k=v ...]\nhimi notify tokens --app <app> [--platform ios|android] [--include-disabled] [--json]\nhimi notify doctor [--json]";
|
|
@@ -164442,7 +164982,7 @@ async function runNotify(pos, flags, io2, deps = {}) {
|
|
|
164442
164982
|
...session ? {} : { hint: "no admin session \u2014 pass --admin-session or set HIMALAYA_ADMIN_SESSION" },
|
|
164443
164983
|
...reachable && authed && !senders ? { hint: "this admin-server predates /v1/admin/push-doctor \u2014 upgrade it to see sender readiness" } : {}
|
|
164444
164984
|
};
|
|
164445
|
-
if (
|
|
164985
|
+
if (json7) {
|
|
164446
164986
|
print(report3);
|
|
164447
164987
|
return report3.ok ? 0 : 1;
|
|
164448
164988
|
}
|
|
@@ -164490,7 +165030,7 @@ async function runNotify(pos, flags, io2, deps = {}) {
|
|
|
164490
165030
|
return 1;
|
|
164491
165031
|
}
|
|
164492
165032
|
const body = await res2.json();
|
|
164493
|
-
if (
|
|
165033
|
+
if (json7) {
|
|
164494
165034
|
print({ ok: true, app, count: body.tokens.length, tokens: body.tokens });
|
|
164495
165035
|
return 0;
|
|
164496
165036
|
}
|
|
@@ -164580,7 +165120,7 @@ async function runNotify(pos, flags, io2, deps = {}) {
|
|
|
164580
165120
|
io2.error(JSON.stringify({ error: out2.error ?? `send failed: ${res.status}` }));
|
|
164581
165121
|
return 1;
|
|
164582
165122
|
}
|
|
164583
|
-
if (
|
|
165123
|
+
if (json7) {
|
|
164584
165124
|
print(out2);
|
|
164585
165125
|
return out2.ok ? 0 : 1;
|
|
164586
165126
|
}
|
|
@@ -168240,10 +168780,10 @@ function writeBase44Book(result, outDir, opts = {}) {
|
|
|
168240
168780
|
const shot = shots.find((s2) => page.screenshotLocal?.endsWith(s2.filename));
|
|
168241
168781
|
if (shot) page.screenshotLocal = `screenshots/${shot.filename}`;
|
|
168242
168782
|
}
|
|
168243
|
-
const
|
|
168783
|
+
const json7 = `${JSON.stringify(book, null, 2)}
|
|
168244
168784
|
`;
|
|
168245
168785
|
const md = renderBookMd(book);
|
|
168246
|
-
assertNoSecrets(
|
|
168786
|
+
assertNoSecrets(json7);
|
|
168247
168787
|
assertNoSecrets(md);
|
|
168248
168788
|
const owned = ["book.json", "BOOK.md", "source", "screenshots"].filter((n2) => existsSync78(join83(out2, n2)));
|
|
168249
168789
|
if (owned.length) {
|
|
@@ -168251,7 +168791,7 @@ function writeBase44Book(result, outDir, opts = {}) {
|
|
|
168251
168791
|
for (const d2 of ["source", "screenshots"]) rmSync21(join83(out2, d2), { recursive: true, force: true });
|
|
168252
168792
|
}
|
|
168253
168793
|
mkdirSync38(out2, { recursive: true });
|
|
168254
|
-
writeFileSync34(join83(out2, "book.json"),
|
|
168794
|
+
writeFileSync34(join83(out2, "book.json"), json7);
|
|
168255
168795
|
writeFileSync34(join83(out2, "BOOK.md"), md);
|
|
168256
168796
|
files.push("book.json", "BOOK.md");
|
|
168257
168797
|
for (const s2 of shots) {
|
|
@@ -172181,12 +172721,54 @@ var init_collect = __esm({
|
|
|
172181
172721
|
});
|
|
172182
172722
|
|
|
172183
172723
|
// src/one-app/graph.ts
|
|
172184
|
-
function buildSourceGraph(raw) {
|
|
172185
|
-
const
|
|
172724
|
+
function buildSourceGraph(raw, enriched = {}) {
|
|
172725
|
+
const enrichedStructures = Object.values(enriched).filter((value) => value !== void 0);
|
|
172726
|
+
function sourceMap2(key2) {
|
|
172727
|
+
const result = {};
|
|
172728
|
+
for (const structure of enrichedStructures) {
|
|
172729
|
+
for (const [id, value] of Object.entries(object4(structure[key2]))) {
|
|
172730
|
+
if (!own4(result, id)) result[id] = value;
|
|
172731
|
+
}
|
|
172732
|
+
}
|
|
172733
|
+
for (const [id, value] of Object.entries(object4(raw[key2]))) {
|
|
172734
|
+
result[id] = own4(result, id) ? { ...object4(result[id]), ...object4(value) } : value;
|
|
172735
|
+
}
|
|
172736
|
+
return result;
|
|
172737
|
+
}
|
|
172738
|
+
function definitionMap(key2) {
|
|
172739
|
+
const result = {};
|
|
172740
|
+
for (const structure of enrichedStructures) {
|
|
172741
|
+
for (const [id, value] of Object.entries(object4(object4(structure.definitions)[key2]))) {
|
|
172742
|
+
if (!own4(result, id)) result[id] = value;
|
|
172743
|
+
}
|
|
172744
|
+
}
|
|
172745
|
+
for (const [id, value] of Object.entries(object4(object4(raw.definitions)[key2]))) {
|
|
172746
|
+
result[id] = own4(result, id) ? { ...object4(result[id]), ...object4(value) } : value;
|
|
172747
|
+
}
|
|
172748
|
+
return result;
|
|
172749
|
+
}
|
|
172750
|
+
function platformMap(platformStructure, key2) {
|
|
172751
|
+
const result = { ...object4(platformStructure[key2]) };
|
|
172752
|
+
for (const [id, value] of Object.entries(object4(raw[key2]))) {
|
|
172753
|
+
result[id] = own4(result, id) ? { ...object4(result[id]), ...object4(value) } : value;
|
|
172754
|
+
}
|
|
172755
|
+
return result;
|
|
172756
|
+
}
|
|
172757
|
+
function platformDefinitionMap(platformStructure, key2) {
|
|
172758
|
+
const result = { ...object4(object4(platformStructure.definitions)[key2]) };
|
|
172759
|
+
for (const [id, value] of Object.entries(object4(object4(raw.definitions)[key2]))) {
|
|
172760
|
+
result[id] = own4(result, id) ? { ...object4(result[id]), ...object4(value) } : value;
|
|
172761
|
+
}
|
|
172762
|
+
return result;
|
|
172763
|
+
}
|
|
172764
|
+
const screens = sourceMap2("screens");
|
|
172186
172765
|
const layouts = object4(raw.layoutItems);
|
|
172187
172766
|
const allSections = object4(raw.sections);
|
|
172188
172767
|
const sections = Object.fromEntries(Object.entries(allSections).filter(([, v2]) => !string3(object4(v2).sectionDefinitionId)?.startsWith("ntt.")));
|
|
172189
172768
|
const headers2 = object4(raw.headers);
|
|
172769
|
+
const topBars = sourceMap2("topBars");
|
|
172770
|
+
const topBarButtonDefinitions = definitionMap("topBarButtons");
|
|
172771
|
+
const actionDefinitions = definitionMap("actions");
|
|
172190
172772
|
const warnings = [];
|
|
172191
172773
|
const usedSections = /* @__PURE__ */ new Set();
|
|
172192
172774
|
const usedLayouts = /* @__PURE__ */ new Set();
|
|
@@ -172276,6 +172858,30 @@ function buildSourceGraph(raw) {
|
|
|
172276
172858
|
return [{ pointer: refPointer, context: placementContext, arrayIndex: index, ...own4(ref, "orderIndex") ? { orderIndex: ref.orderIndex } : {}, sectionId: id, sectionDefinitionId: string3(object4(sections[id]).sectionDefinitionId), reference: ref }];
|
|
172277
172859
|
});
|
|
172278
172860
|
}
|
|
172861
|
+
function topBarButtons(value, side2, pointer, context, buttonDefinitions = topBarButtonDefinitions, availableActions = actionDefinitions, trackInteractions = true) {
|
|
172862
|
+
const bar = object4(value);
|
|
172863
|
+
const idsKey = `${side2}ButtonIds`;
|
|
172864
|
+
const definitionsKey = `${side2}ButtonDefinitions`;
|
|
172865
|
+
const refs = own4(bar, idsKey) ? array3(bar[idsKey]) : array3(bar[definitionsKey]);
|
|
172866
|
+
return refs.map((ref, index) => {
|
|
172867
|
+
const refObject = object4(ref);
|
|
172868
|
+
const id = typeof ref === "string" ? ref : string3(refObject.topBarButtonDefinitionId) ?? string3(refObject.id);
|
|
172869
|
+
const definition = id && own4(buttonDefinitions, id) ? buttonDefinitions[id] : typeof ref === "object" && ref !== null ? ref : void 0;
|
|
172870
|
+
const actionDefinitionId = string3(object4(definition).actionDefinitionId) ?? string3(refObject.actionDefinitionId);
|
|
172871
|
+
const actionDefinition = actionDefinitionId && own4(availableActions, actionDefinitionId) ? availableActions[actionDefinitionId] : void 0;
|
|
172872
|
+
const buttonPointer = `${pointer}/${side2}/${index}`;
|
|
172873
|
+
if (trackInteractions) {
|
|
172874
|
+
if (actionDefinition !== void 0) actions(actionDefinition, `/definitions/actions/${part(actionDefinitionId)}`, context);
|
|
172875
|
+
else if (definition !== void 0) actions(definition, buttonPointer, context);
|
|
172876
|
+
}
|
|
172877
|
+
return {
|
|
172878
|
+
...id ? { id } : {},
|
|
172879
|
+
...definition !== void 0 ? { definition } : {},
|
|
172880
|
+
...actionDefinitionId ? { actionDefinitionId } : {},
|
|
172881
|
+
...actionDefinition !== void 0 ? { actionDefinition } : {}
|
|
172882
|
+
};
|
|
172883
|
+
});
|
|
172884
|
+
}
|
|
172279
172885
|
const screenGraph = Object.entries(screens).map(([screenId, source]) => {
|
|
172280
172886
|
const screen = object4(source);
|
|
172281
172887
|
const layout = object4(screen.layout);
|
|
@@ -172289,6 +172895,36 @@ function buildSourceGraph(raw) {
|
|
|
172289
172895
|
if (!own4(headers2, headerId)) warnings.push({ code: "missing_reference", pointer: `${pointer}/headerId`, reference: headerId });
|
|
172290
172896
|
else actions(headers2[headerId], `/headers/${part(headerId)}`, pointer);
|
|
172291
172897
|
}
|
|
172898
|
+
const topBarId = string3(screen.topBarId);
|
|
172899
|
+
const topBar = topBarId && own4(topBars, topBarId) ? topBars[topBarId] : void 0;
|
|
172900
|
+
if (topBarId && topBar === void 0 && own4(raw, "topBars")) {
|
|
172901
|
+
warnings.push({ code: "missing_reference", pointer: `${pointer}/topBarId`, reference: topBarId });
|
|
172902
|
+
}
|
|
172903
|
+
if (topBar !== void 0 && enrichedStructures.length === 0) actions(topBar, `/topBars/${part(topBarId)}`, pointer);
|
|
172904
|
+
const topBarButtonEvidence = topBar === void 0 ? void 0 : {
|
|
172905
|
+
left: topBarButtons(topBar, "left", `/topBars/${part(topBarId)}`, pointer, topBarButtonDefinitions, actionDefinitions, enrichedStructures.length === 0),
|
|
172906
|
+
right: topBarButtons(topBar, "right", `/topBars/${part(topBarId)}`, pointer, topBarButtonDefinitions, actionDefinitions, enrichedStructures.length === 0)
|
|
172907
|
+
};
|
|
172908
|
+
const topBarByPlatform = Object.fromEntries(Object.entries(enriched).flatMap(([platform, platformStructure]) => {
|
|
172909
|
+
if (!platformStructure) return [];
|
|
172910
|
+
const platformScreen = { ...object4(object4(platformStructure.screens)[screenId]), ...object4(object4(raw.screens)[screenId]) };
|
|
172911
|
+
const platformTopBarId = string3(platformScreen.topBarId);
|
|
172912
|
+
if (!platformTopBarId) return [];
|
|
172913
|
+
const platformTopBar = platformMap(platformStructure, "topBars")[platformTopBarId];
|
|
172914
|
+
if (platformTopBar === void 0) return [];
|
|
172915
|
+
const platformButtons = platformDefinitionMap(platformStructure, "topBarButtons");
|
|
172916
|
+
const platformActions = platformDefinitionMap(platformStructure, "actions");
|
|
172917
|
+
const platformPointer = `${pointer}/topBar/${platform}`;
|
|
172918
|
+
actions(platformTopBar, `/topBars/${part(platformTopBarId)}`, platformPointer);
|
|
172919
|
+
return [[platform, {
|
|
172920
|
+
topBarId: platformTopBarId,
|
|
172921
|
+
topBar: platformTopBar,
|
|
172922
|
+
topBarButtons: {
|
|
172923
|
+
left: topBarButtons(platformTopBar, "left", `/topBars/${part(platformTopBarId)}`, platformPointer, platformButtons, platformActions),
|
|
172924
|
+
right: topBarButtons(platformTopBar, "right", `/topBars/${part(platformTopBarId)}`, platformPointer, platformButtons, platformActions)
|
|
172925
|
+
}
|
|
172926
|
+
}]];
|
|
172927
|
+
}));
|
|
172292
172928
|
const pages2 = refs.flatMap((value, index) => {
|
|
172293
172929
|
const ref = object4(value), id = string3(ref.layoutItemId);
|
|
172294
172930
|
if (!id || !own4(layouts, id)) {
|
|
@@ -172312,7 +172948,12 @@ function buildSourceGraph(raw) {
|
|
|
172312
172948
|
return {
|
|
172313
172949
|
screenId,
|
|
172314
172950
|
pointer,
|
|
172951
|
+
...typeof screen.title === "string" ? { sourceTitle: screen.title } : {},
|
|
172315
172952
|
headerId,
|
|
172953
|
+
...headerId && own4(headers2, headerId) ? { header: headers2[headerId] } : {},
|
|
172954
|
+
topBarId,
|
|
172955
|
+
...topBar !== void 0 ? { topBar, topBarButtons: topBarButtonEvidence } : {},
|
|
172956
|
+
...Object.keys(topBarByPlatform).length ? { topBarByPlatform } : {},
|
|
172316
172957
|
settings: screen.settings,
|
|
172317
172958
|
permissions: screen.permissions,
|
|
172318
172959
|
layoutType: type,
|
|
@@ -172705,7 +173346,7 @@ Collect the source mobile app and hand it to the current coding agent. The agent
|
|
|
172705
173346
|
if (value !== void 0 && !artifacts[name]) put(name, sourceJson(value));
|
|
172706
173347
|
}
|
|
172707
173348
|
progress("normalizing");
|
|
172708
|
-
put("source-graph.json", sourceJson(buildSourceGraph(collected.rawStructure)));
|
|
173349
|
+
put("source-graph.json", sourceJson(buildSourceGraph(collected.rawStructure, collected.enriched)));
|
|
172709
173350
|
put("navigation-plan.json", sourceJson(planNavigation(collected.rawStructure, options.topTabs)));
|
|
172710
173351
|
progress("collected");
|
|
172711
173352
|
put("manifest.json", sourceJson({
|
|
@@ -175230,13 +175871,13 @@ function parseMethod(raw) {
|
|
|
175230
175871
|
return m2;
|
|
175231
175872
|
}
|
|
175232
175873
|
function jsonFunctionSource(method, name, body) {
|
|
175233
|
-
const
|
|
175874
|
+
const json7 = JSON.stringify(body, null, 2).replace(/\n/g, "\n ");
|
|
175234
175875
|
return `import { ok } from 'wix-http-functions';
|
|
175235
175876
|
|
|
175236
175877
|
export function ${methodPrefix(method)}_${name}(request) {
|
|
175237
175878
|
return ok({
|
|
175238
175879
|
headers: { 'Content-Type': 'application/json' },
|
|
175239
|
-
body: ${
|
|
175880
|
+
body: ${json7},
|
|
175240
175881
|
});
|
|
175241
175882
|
}
|
|
175242
175883
|
`;
|
|
@@ -175562,12 +176203,12 @@ async function veloCall(fetchImpl, method, url, opts = {}) {
|
|
|
175562
176203
|
signal: AbortSignal.timeout(opts.timeoutMs ?? 3e4)
|
|
175563
176204
|
});
|
|
175564
176205
|
const text9 = await res.text();
|
|
175565
|
-
let
|
|
176206
|
+
let json7 = text9;
|
|
175566
176207
|
try {
|
|
175567
|
-
|
|
176208
|
+
json7 = text9 ? JSON.parse(text9) : null;
|
|
175568
176209
|
} catch {
|
|
175569
176210
|
}
|
|
175570
|
-
return { status: res.status, json:
|
|
176211
|
+
return { status: res.status, json: json7, text: text9 };
|
|
175571
176212
|
}
|
|
175572
176213
|
function snippet2(x2, cap = 180) {
|
|
175573
176214
|
const s2 = typeof x2 === "string" ? x2 : JSON.stringify(x2) ?? "";
|
|
@@ -175618,15 +176259,15 @@ async function patchHttpFunctionsFile(fetchImpl, token, msid, gridAppId, layout,
|
|
|
175618
176259
|
else body.filesToUpdate = [{ path: filePath, content }];
|
|
175619
176260
|
return veloCall(fetchImpl, "PATCH", veloUpdateFilesPath(gridAppId), { token, msid, body });
|
|
175620
176261
|
}
|
|
175621
|
-
function revisionFrom(
|
|
175622
|
-
if (!
|
|
175623
|
-
const r2 =
|
|
176262
|
+
function revisionFrom(json7) {
|
|
176263
|
+
if (!json7 || typeof json7 !== "object") return void 0;
|
|
176264
|
+
const r2 = json7;
|
|
175624
176265
|
const v2 = r2.siteRevision?.revision ?? r2.revision;
|
|
175625
176266
|
return v2 == null ? void 0 : String(v2);
|
|
175626
176267
|
}
|
|
175627
|
-
function codeAppIdFromRevision(
|
|
175628
|
-
if (!
|
|
175629
|
-
const actions =
|
|
176268
|
+
function codeAppIdFromRevision(json7) {
|
|
176269
|
+
if (!json7 || typeof json7 !== "object") return void 0;
|
|
176270
|
+
const actions = json7.actions;
|
|
175630
176271
|
if (!Array.isArray(actions)) return void 0;
|
|
175631
176272
|
for (const a2 of actions) {
|
|
175632
176273
|
if (!a2 || typeof a2 !== "object") continue;
|
|
@@ -177151,17 +177792,17 @@ var ServeCliClient = class {
|
|
|
177151
177792
|
body: opts.rawBody !== void 0 ? new Uint8Array(opts.rawBody) : opts.body !== void 0 ? JSON.stringify(opts.body) : void 0
|
|
177152
177793
|
});
|
|
177153
177794
|
const text9 = await res.text();
|
|
177154
|
-
let
|
|
177795
|
+
let json7 = null;
|
|
177155
177796
|
try {
|
|
177156
|
-
|
|
177797
|
+
json7 = text9 ? JSON.parse(text9) : null;
|
|
177157
177798
|
} catch {
|
|
177158
|
-
|
|
177799
|
+
json7 = null;
|
|
177159
177800
|
}
|
|
177160
177801
|
const h2 = {};
|
|
177161
177802
|
res.headers.forEach((v2, k2) => {
|
|
177162
177803
|
h2[k2] = v2;
|
|
177163
177804
|
});
|
|
177164
|
-
return { status: res.status, ok: res.ok, json:
|
|
177805
|
+
return { status: res.status, ok: res.ok, json: json7, text: text9, headers: h2 };
|
|
177165
177806
|
}
|
|
177166
177807
|
// ---- serve (device-facing reads) ----
|
|
177167
177808
|
health(plane) {
|
|
@@ -177397,14 +178038,14 @@ var ServeCliClient = class {
|
|
|
177397
178038
|
const refusal = res.json;
|
|
177398
178039
|
const decodedOverPlainCap = res.status === 413 && refusal?.error === "payload_too_large" && refusal.limit === MAX_PUBLISH_BODY_BYTES && bytes2.byteLength <= MAX_PUBLISH_BODY_BYTES;
|
|
177399
178040
|
if (gzip && (res.status === 400 && refusal?.error === "bad_json" || decodedOverPlainCap)) {
|
|
177400
|
-
const
|
|
178041
|
+
const json7 = {
|
|
177401
178042
|
code: "compressed_publish_unsupported",
|
|
177402
178043
|
error: "compressed_publish_unsupported",
|
|
177403
178044
|
hint: "this body is over the plain publish cap, and the plane did not accept it compressed: either the plane predates compressed publish bodies (it needs a serve deploy), or this is a self-serve credential, which keeps the plain 8 MB cap",
|
|
177404
178045
|
sentBytes: bytes2.byteLength,
|
|
177405
178046
|
...typeof refusal?.bytes === "number" ? { planeCountedBytes: refusal.bytes } : {}
|
|
177406
178047
|
};
|
|
177407
|
-
return { ...res, json:
|
|
178048
|
+
return { ...res, json: json7, text: JSON.stringify(json7) };
|
|
177408
178049
|
}
|
|
177409
178050
|
return res;
|
|
177410
178051
|
}
|
|
@@ -177783,8 +178424,8 @@ var BO_WEWIX_COOKIE = "WixBoAuthentication-wewix";
|
|
|
177783
178424
|
function dpxCookieHeader(raw) {
|
|
177784
178425
|
const trimmed = raw.trim();
|
|
177785
178426
|
try {
|
|
177786
|
-
const
|
|
177787
|
-
const obj3 = JSON.parse(
|
|
178427
|
+
const json7 = Buffer.from(trimmed, "base64url").toString("utf8");
|
|
178428
|
+
const obj3 = JSON.parse(json7);
|
|
177788
178429
|
if (obj3 && typeof obj3 === "object") {
|
|
177789
178430
|
const pairs = [
|
|
177790
178431
|
typeof obj3.wewix === "string" ? `${BO_WEWIX_COOKIE}=${obj3.wewix}` : void 0,
|
|
@@ -180168,10 +180809,10 @@ async function fetchPackumentFrom(registry2, fetchImpl, timeoutMs) {
|
|
|
180168
180809
|
signal: controller.signal
|
|
180169
180810
|
});
|
|
180170
180811
|
if (!response.ok) return void 0;
|
|
180171
|
-
const
|
|
180172
|
-
const latest = typeof
|
|
180812
|
+
const json7 = await response.json();
|
|
180813
|
+
const latest = typeof json7?.["dist-tags"]?.latest === "string" ? json7["dist-tags"].latest : void 0;
|
|
180173
180814
|
const time = {};
|
|
180174
|
-
for (const [version4, when] of Object.entries(
|
|
180815
|
+
for (const [version4, when] of Object.entries(json7?.time ?? {})) if (typeof when === "string") time[version4] = when;
|
|
180175
180816
|
return latest ? { latest, time, registry: normalizeRegistry(registry2) ?? registry2 } : void 0;
|
|
180176
180817
|
} catch {
|
|
180177
180818
|
return void 0;
|