@wix/himalaya-cli 0.1397.0 → 0.1398.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 +31 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/screens.mjs +377 -20
- package/dist/cli.mjs +941 -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/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/events-meetups/dev/index.ts +41 -1
- package/templates/events-meetups/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/gym-fitness/dev/index.ts +41 -1
- package/templates/gym-fitness/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/nonprofit-cause/dev/index.ts +41 -1
- package/templates/nonprofit-cause/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/podcast-creator/dev/index.ts +41 -1
- package/templates/podcast-creator/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/portfolio-creative/dev/index.ts +41 -1
- package/templates/portfolio-creative/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/restaurant/dev/index.ts +41 -1
- package/templates/restaurant/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/retail-store/dev/index.ts +41 -1
- package/templates/retail-store/tier5-src/himi-store-account/index.ts +90 -76
- package/templates/yoga-studio/dev/index.ts +41 -1
- package/templates/yoga-studio/tier5-src/himi-store-account/index.ts +90 -76
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"() {
|
|
@@ -7655,7 +7655,6 @@ function buttonVariant(style) {
|
|
|
7655
7655
|
var SYSTEM_FONT_FAMILY, TONAL_ELEVATION_ALPHA, BUTTON_MIN_HIT_TARGET, nonNegative, nonEmpty, own, COLOR_TOKEN_PROPS, TYPOGRAPHY_TOKEN_PROPS, BUTTON_VARIANTS;
|
|
7656
7656
|
var init_tokens = __esm({
|
|
7657
7657
|
"../../core/ts/src/tokens.ts"() {
|
|
7658
|
-
"use strict";
|
|
7659
7658
|
SYSTEM_FONT_FAMILY = "$system";
|
|
7660
7659
|
TONAL_ELEVATION_ALPHA = [0, 0.05, 0.08, 0.11, 0.12, 0.14];
|
|
7661
7660
|
BUTTON_MIN_HIT_TARGET = 44;
|
|
@@ -7711,7 +7710,6 @@ function resolveTranslation(value, catalog3, sourceCatalog) {
|
|
|
7711
7710
|
var BINDING_SIGILS, BINDING_SIGIL_RE, TRANSLATION_PREFIX, TRANSLATION_KEY_RE;
|
|
7712
7711
|
var init_bindings = __esm({
|
|
7713
7712
|
"../../core/ts/src/bindings.ts"() {
|
|
7714
|
-
"use strict";
|
|
7715
7713
|
BINDING_SIGILS = ["service", "flag", "item", "t"];
|
|
7716
7714
|
BINDING_SIGIL_RE = new RegExp(
|
|
7717
7715
|
`^\\$(?:${BINDING_SIGILS.filter((s2) => s2 !== "t").join("|")})\\b|^\\$t:`
|
|
@@ -9782,16 +9780,16 @@ function utf8Length(s2, cap) {
|
|
|
9782
9780
|
}
|
|
9783
9781
|
return n2;
|
|
9784
9782
|
}
|
|
9785
|
-
function repairLoneSurrogateEscapes(
|
|
9786
|
-
if (!
|
|
9783
|
+
function repairLoneSurrogateEscapes(json7) {
|
|
9784
|
+
if (!json7.includes("\\u")) return json7;
|
|
9787
9785
|
const hexAt = (i2) => {
|
|
9788
|
-
const h2 =
|
|
9786
|
+
const h2 = json7.slice(i2, i2 + 4);
|
|
9789
9787
|
return /^[0-9A-Fa-f]{4}$/.test(h2) ? parseInt(h2, 16) : -1;
|
|
9790
9788
|
};
|
|
9791
9789
|
let out2 = "";
|
|
9792
9790
|
let inString = false;
|
|
9793
|
-
for (let i2 = 0; i2 <
|
|
9794
|
-
const c2 =
|
|
9791
|
+
for (let i2 = 0; i2 < json7.length; i2++) {
|
|
9792
|
+
const c2 = json7[i2];
|
|
9795
9793
|
if (!inString) {
|
|
9796
9794
|
if (c2 === '"') inString = true;
|
|
9797
9795
|
out2 += c2;
|
|
@@ -9802,11 +9800,11 @@ function repairLoneSurrogateEscapes(json6) {
|
|
|
9802
9800
|
out2 += c2;
|
|
9803
9801
|
continue;
|
|
9804
9802
|
}
|
|
9805
|
-
if (c2 !== "\\" || i2 + 1 >=
|
|
9803
|
+
if (c2 !== "\\" || i2 + 1 >= json7.length) {
|
|
9806
9804
|
out2 += c2;
|
|
9807
9805
|
continue;
|
|
9808
9806
|
}
|
|
9809
|
-
const e2 =
|
|
9807
|
+
const e2 = json7[i2 + 1];
|
|
9810
9808
|
const v2 = e2 === "u" ? hexAt(i2 + 2) : -1;
|
|
9811
9809
|
if (v2 < 0) {
|
|
9812
9810
|
out2 += c2 + e2;
|
|
@@ -9814,9 +9812,9 @@ function repairLoneSurrogateEscapes(json6) {
|
|
|
9814
9812
|
continue;
|
|
9815
9813
|
}
|
|
9816
9814
|
if (v2 >= 55296 && v2 <= 56319) {
|
|
9817
|
-
const low =
|
|
9815
|
+
const low = json7[i2 + 6] === "\\" && json7[i2 + 7] === "u" ? hexAt(i2 + 8) : -1;
|
|
9818
9816
|
if (low >= 56320 && low <= 57343) {
|
|
9819
|
-
out2 +=
|
|
9817
|
+
out2 += json7.slice(i2, i2 + 12);
|
|
9820
9818
|
i2 += 11;
|
|
9821
9819
|
continue;
|
|
9822
9820
|
}
|
|
@@ -9829,7 +9827,7 @@ function repairLoneSurrogateEscapes(json6) {
|
|
|
9829
9827
|
i2 += 5;
|
|
9830
9828
|
continue;
|
|
9831
9829
|
}
|
|
9832
|
-
out2 +=
|
|
9830
|
+
out2 += json7.slice(i2, i2 + 6);
|
|
9833
9831
|
i2 += 5;
|
|
9834
9832
|
}
|
|
9835
9833
|
return out2;
|
|
@@ -9848,12 +9846,12 @@ function measure(nodes, limits) {
|
|
|
9848
9846
|
}
|
|
9849
9847
|
return count2 > limits.maxNodes ? "too_many_nodes" : null;
|
|
9850
9848
|
}
|
|
9851
|
-
function layoutRichContent(
|
|
9852
|
-
if (
|
|
9853
|
-
if (utf8Length(
|
|
9849
|
+
function layoutRichContent(json7, limits = RICH_CONTENT_LIMITS2) {
|
|
9850
|
+
if (json7 === "") return { blocks: [] };
|
|
9851
|
+
if (utf8Length(json7, limits.maxBytes) > limits.maxBytes) return { rejected: "too_large" };
|
|
9854
9852
|
let parsed;
|
|
9855
9853
|
try {
|
|
9856
|
-
parsed = JSON.parse(repairLoneSurrogateEscapes(
|
|
9854
|
+
parsed = JSON.parse(repairLoneSurrogateEscapes(json7));
|
|
9857
9855
|
} catch {
|
|
9858
9856
|
return { rejected: "invalid_json" };
|
|
9859
9857
|
}
|
|
@@ -10206,14 +10204,14 @@ function resolveActionEvaluator(explicit) {
|
|
|
10206
10204
|
}
|
|
10207
10205
|
function responseBytes(value) {
|
|
10208
10206
|
try {
|
|
10209
|
-
const
|
|
10210
|
-
if (typeof
|
|
10207
|
+
const json7 = JSON.stringify(value);
|
|
10208
|
+
if (typeof json7 !== "string") return 0;
|
|
10211
10209
|
const envelope = JSON.stringify({
|
|
10212
10210
|
protocol: "himi.t5.frame/1",
|
|
10213
10211
|
type: "bridge",
|
|
10214
|
-
payload: { op: "wix_result", id: "k000000", ok: true, payload:
|
|
10212
|
+
payload: { op: "wix_result", id: "k000000", ok: true, payload: json7 }
|
|
10215
10213
|
});
|
|
10216
|
-
return typeof envelope === "string" ? utf8Budget(envelope) : utf8Budget(
|
|
10214
|
+
return typeof envelope === "string" ? utf8Budget(envelope) : utf8Budget(json7);
|
|
10217
10215
|
} catch {
|
|
10218
10216
|
return 0;
|
|
10219
10217
|
}
|
|
@@ -12758,7 +12756,8 @@ var init_validate_descriptor_core = __esm({
|
|
|
12758
12756
|
trailingIcon: "string",
|
|
12759
12757
|
validation: "any",
|
|
12760
12758
|
value: "string",
|
|
12761
|
-
valuePath: "string"
|
|
12759
|
+
valuePath: "string",
|
|
12760
|
+
visibilityToggle: "boolean"
|
|
12762
12761
|
},
|
|
12763
12762
|
TimeGrid: {
|
|
12764
12763
|
anchorDate: "string",
|
|
@@ -15445,8 +15444,8 @@ __export(quickjs_evaluator_exports, {
|
|
|
15445
15444
|
uninstallQuickJsBootEvaluator: () => uninstallQuickJsBootEvaluator
|
|
15446
15445
|
});
|
|
15447
15446
|
function inputJson(input) {
|
|
15448
|
-
const
|
|
15449
|
-
return
|
|
15447
|
+
const json7 = JSON.stringify(input ?? {});
|
|
15448
|
+
return json7 === void 0 ? "{}" : json7;
|
|
15450
15449
|
}
|
|
15451
15450
|
function timerGlobals(hide, live3) {
|
|
15452
15451
|
const hidden = new Set(hide ?? []);
|
|
@@ -25108,11 +25107,11 @@ function himiPluginManifest() {
|
|
|
25108
25107
|
};
|
|
25109
25108
|
}
|
|
25110
25109
|
function himiPluginFiles(skillMd) {
|
|
25111
|
-
const
|
|
25110
|
+
const json7 = (o2) => `${JSON.stringify(o2, null, 2)}
|
|
25112
25111
|
`;
|
|
25113
25112
|
return [
|
|
25114
|
-
{ path: ".claude-plugin/plugin.json", text:
|
|
25115
|
-
{ path: ".mcp.json", text:
|
|
25113
|
+
{ path: ".claude-plugin/plugin.json", text: json7(himiPluginManifest()) },
|
|
25114
|
+
{ path: ".mcp.json", text: json7({ mcpServers: { [HIMI_PLUGIN_NAME]: { command: HIMI_MCP_SERVER.command, args: [...HIMI_MCP_SERVER.args] } } }) },
|
|
25116
25115
|
{ path: "skills/himalaya/SKILL.md", text: skillMd }
|
|
25117
25116
|
];
|
|
25118
25117
|
}
|
|
@@ -25140,11 +25139,11 @@ function connectorPluginManifest() {
|
|
|
25140
25139
|
};
|
|
25141
25140
|
}
|
|
25142
25141
|
function connectorPluginFiles(mcpUrl, skillMd) {
|
|
25143
|
-
const
|
|
25142
|
+
const json7 = (o2) => `${JSON.stringify(o2, null, 2)}
|
|
25144
25143
|
`;
|
|
25145
25144
|
return [
|
|
25146
|
-
{ path: ".claude-plugin/plugin.json", text:
|
|
25147
|
-
{ path: ".mcp.json", text:
|
|
25145
|
+
{ path: ".claude-plugin/plugin.json", text: json7(connectorPluginManifest()) },
|
|
25146
|
+
{ path: ".mcp.json", text: json7({ mcpServers: { [CONNECTOR_PLUGIN_NAME]: { type: "http", url: mcpUrl } } }) },
|
|
25148
25147
|
{ path: `skills/${CONNECTOR_PLUGIN_NAME}/SKILL.md`, text: skillMd }
|
|
25149
25148
|
];
|
|
25150
25149
|
}
|
|
@@ -28250,8 +28249,8 @@ function lastDistFromJob(job, now = /* @__PURE__ */ new Date()) {
|
|
|
28250
28249
|
const capabilities = [...new Set(job.buildCapabilities.filter((x2) => typeof x2 === "string").map(catalogKey))].sort();
|
|
28251
28250
|
return { app: job.app, jobId: job.jobId, shell: job.shell, capabilities, finishedAt: now.toISOString() };
|
|
28252
28251
|
}
|
|
28253
|
-
function needsBinaryNotice(
|
|
28254
|
-
const nb =
|
|
28252
|
+
function needsBinaryNotice(json7) {
|
|
28253
|
+
const nb = json7?.needsBinary;
|
|
28255
28254
|
if (!nb || !Array.isArray(nb.missing)) return null;
|
|
28256
28255
|
const missing = nb.missing.filter((x2) => typeof x2 === "string");
|
|
28257
28256
|
if (!missing.length) return null;
|
|
@@ -30366,7 +30365,7 @@ function errorMessageFor(args) {
|
|
|
30366
30365
|
return defaultMessage(failure, args.catalog);
|
|
30367
30366
|
}
|
|
30368
30367
|
function shouldRevealError(args) {
|
|
30369
|
-
if (args.hasWorkerError) return true;
|
|
30368
|
+
if (args.hasWorkerError || args.feedbackShown) return true;
|
|
30370
30369
|
if (args.submitAttempted) return true;
|
|
30371
30370
|
switch (resolveMode(args.rule)) {
|
|
30372
30371
|
case "live":
|
|
@@ -31265,6 +31264,27 @@ var init_icon_catalog_generated = __esm({
|
|
|
31265
31264
|
"license": "Apache-2.0",
|
|
31266
31265
|
"libVersion": "0.45.9"
|
|
31267
31266
|
},
|
|
31267
|
+
"concealed": {
|
|
31268
|
+
"category": "status",
|
|
31269
|
+
"path": [
|
|
31270
|
+
"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"
|
|
31271
|
+
],
|
|
31272
|
+
"style": "filled",
|
|
31273
|
+
"ios": {
|
|
31274
|
+
"sf": "eye.slash",
|
|
31275
|
+
"match": "exact"
|
|
31276
|
+
},
|
|
31277
|
+
"android": {
|
|
31278
|
+
"material": "VisibilityOff",
|
|
31279
|
+
"match": "exact"
|
|
31280
|
+
},
|
|
31281
|
+
"aliases": [
|
|
31282
|
+
"eye_slash"
|
|
31283
|
+
],
|
|
31284
|
+
"source": "material-symbols/visibility_off",
|
|
31285
|
+
"license": "Apache-2.0",
|
|
31286
|
+
"libVersion": "0.45.9"
|
|
31287
|
+
},
|
|
31268
31288
|
"cookie": {
|
|
31269
31289
|
"category": "commerce",
|
|
31270
31290
|
"path": [
|
|
@@ -32730,6 +32750,9 @@ var init_icon_catalog_generated = __esm({
|
|
|
32730
32750
|
"material": "Visibility",
|
|
32731
32751
|
"match": "exact"
|
|
32732
32752
|
},
|
|
32753
|
+
"aliases": [
|
|
32754
|
+
"eye"
|
|
32755
|
+
],
|
|
32733
32756
|
"source": "material-symbols/visibility",
|
|
32734
32757
|
"license": "Apache-2.0",
|
|
32735
32758
|
"libVersion": "0.45.9"
|
|
@@ -32841,6 +32864,8 @@ var init_icon_catalog_generated = __esm({
|
|
|
32841
32864
|
"clock": "clock",
|
|
32842
32865
|
"close": "close",
|
|
32843
32866
|
"xmark": "close",
|
|
32867
|
+
"concealed": "concealed",
|
|
32868
|
+
"eyeslash": "concealed",
|
|
32844
32869
|
"cookie": "cookie",
|
|
32845
32870
|
"copy": "copy",
|
|
32846
32871
|
"dashboard": "dashboard",
|
|
@@ -32931,6 +32956,7 @@ var init_icon_catalog_generated = __esm({
|
|
|
32931
32956
|
"trash": "trash",
|
|
32932
32957
|
"undo": "undo",
|
|
32933
32958
|
"visible": "visible",
|
|
32959
|
+
"eye": "visible",
|
|
32934
32960
|
"volume": "volume",
|
|
32935
32961
|
"warning": "warning",
|
|
32936
32962
|
"wifi": "wifi",
|
|
@@ -33371,7 +33397,107 @@ function memberInstanceRefusal(e2) {
|
|
|
33371
33397
|
if (e2 instanceof SiteInstanceUnavailable) return { status: 502, body: { error: "SiteInstanceUnavailable", metaSiteId: e2.metaSiteId, reason: e2.reason } };
|
|
33372
33398
|
return { status: 502, body: { error: "SiteInstanceUnavailable" } };
|
|
33373
33399
|
}
|
|
33374
|
-
|
|
33400
|
+
async function mintMemberSessionToken(sessionCookie, metaSiteId, fetchImpl = fetch, timeoutMs = OWNER_MINT_TIMEOUT_MS) {
|
|
33401
|
+
if (!isSafeMsid(metaSiteId)) throw new MemberSessionRefused(metaSiteId, "bad metaSiteId");
|
|
33402
|
+
const xsrf = /(?:^|;\s*)XSRF-TOKEN=([^;]+)/.exec(sessionCookie)?.[1];
|
|
33403
|
+
const ws2 = /(?:^|;\s*)wixSession2=([^;]+)/.exec(sessionCookie)?.[1];
|
|
33404
|
+
const base = { Cookie: sessionCookie, Accept: "application/json", ...xsrf ? { "x-xsrf-token": xsrf } : {} };
|
|
33405
|
+
const step = async (url, init) => {
|
|
33406
|
+
const abort = new AbortController();
|
|
33407
|
+
const timer = setTimeout(() => abort.abort(), timeoutMs);
|
|
33408
|
+
try {
|
|
33409
|
+
const res = await fetchImpl(url, { ...init, signal: abort.signal, redirect: "manual" });
|
|
33410
|
+
return { status: res.status, text: await res.text() };
|
|
33411
|
+
} catch (e2) {
|
|
33412
|
+
throw new SiteInstanceUnavailable(metaSiteId, `member session failed: ${e2?.message ?? e2}`);
|
|
33413
|
+
} finally {
|
|
33414
|
+
clearTimeout(timer);
|
|
33415
|
+
}
|
|
33416
|
+
};
|
|
33417
|
+
const verdict = (what, status) => {
|
|
33418
|
+
if (status === 401) throw new AccountSessionExpired(metaSiteId, `${what} refused (401)`);
|
|
33419
|
+
if (status === 403 || status === 404) throw new MemberSessionRefused(metaSiteId, `${what} refused (${status})`);
|
|
33420
|
+
throw new SiteInstanceUnavailable(metaSiteId, `${what} failed (${status})`);
|
|
33421
|
+
};
|
|
33422
|
+
const mint = await step(`${ONE_APP_SESSION}/${metaSiteId}/signed-instance?signed_instance_type=User`, {
|
|
33423
|
+
method: "GET",
|
|
33424
|
+
headers: { ...base, ...ws2 ? { Authorization: ws2 } : {} }
|
|
33425
|
+
});
|
|
33426
|
+
if (mint.status < 200 || mint.status >= 300) verdict("user instance", mint.status);
|
|
33427
|
+
let user;
|
|
33428
|
+
try {
|
|
33429
|
+
user = JSON.parse(mint.text).signedInstance;
|
|
33430
|
+
} catch {
|
|
33431
|
+
}
|
|
33432
|
+
if (typeof user !== "string" || !user) throw new SiteInstanceUnavailable(metaSiteId, "no user instance");
|
|
33433
|
+
const session = await step(MEMBER_SESSION_URL, {
|
|
33434
|
+
method: "POST",
|
|
33435
|
+
headers: { ...base, Authorization: user, "Content-Type": "application/json" },
|
|
33436
|
+
body: JSON.stringify({ metaSiteId })
|
|
33437
|
+
});
|
|
33438
|
+
if (session.status < 200 || session.status >= 300) verdict("member-session", session.status);
|
|
33439
|
+
let token;
|
|
33440
|
+
try {
|
|
33441
|
+
token = JSON.parse(session.text).sessionToken;
|
|
33442
|
+
} catch {
|
|
33443
|
+
}
|
|
33444
|
+
if (typeof token !== "string" || !token) throw new SiteInstanceUnavailable(metaSiteId, "no session token");
|
|
33445
|
+
return token;
|
|
33446
|
+
}
|
|
33447
|
+
function memberSessionRefusal(e2) {
|
|
33448
|
+
if (e2 instanceof AccountSessionExpired) return { status: 401, body: { error: "AccountSessionExpired" } };
|
|
33449
|
+
if (e2 instanceof MemberSessionRefused) return { status: 403, body: { error: "MemberSessionRefused" } };
|
|
33450
|
+
return { status: 502, body: { error: "SiteInstanceUnavailable" } };
|
|
33451
|
+
}
|
|
33452
|
+
function inviteShortLinkUrl(shortId) {
|
|
33453
|
+
return /^[A-Za-z0-9-]{1,64}$/.test(shortId) ? `https://wix.app/mobile.apps/${shortId}` : null;
|
|
33454
|
+
}
|
|
33455
|
+
function isInviteLanding(url) {
|
|
33456
|
+
if (url.protocol !== "https:") return false;
|
|
33457
|
+
const host = url.hostname.toLowerCase();
|
|
33458
|
+
if (host === "wix.app") return url.pathname.startsWith("/invite/");
|
|
33459
|
+
return (host === "wix.com" || host.endsWith(".wix.com")) && url.pathname.includes("/place-invites/invite-lp/");
|
|
33460
|
+
}
|
|
33461
|
+
function inviteHopAllowed(url) {
|
|
33462
|
+
if (url.protocol !== "https:" || url.port !== "" && url.port !== "443" || url.username || url.password) return false;
|
|
33463
|
+
const host = url.hostname.toLowerCase();
|
|
33464
|
+
return host === "wix.app" || host === "wix.com" || host.endsWith(".wix.com");
|
|
33465
|
+
}
|
|
33466
|
+
async function resolveInviteShortLink(shortId, fetchImpl = fetch, timeoutMs = 15e3) {
|
|
33467
|
+
const start = inviteShortLinkUrl(shortId);
|
|
33468
|
+
if (!start) return null;
|
|
33469
|
+
let url = new URL(start);
|
|
33470
|
+
for (let hop = 0; hop < INVITE_MAX_HOPS; hop++) {
|
|
33471
|
+
const abort = new AbortController();
|
|
33472
|
+
const timer = setTimeout(() => abort.abort(), timeoutMs);
|
|
33473
|
+
let res;
|
|
33474
|
+
try {
|
|
33475
|
+
res = await fetchImpl(url.toString(), { method: "GET", headers: { Accept: "text/html" }, redirect: "manual", credentials: "omit", signal: abort.signal });
|
|
33476
|
+
} catch {
|
|
33477
|
+
return null;
|
|
33478
|
+
} finally {
|
|
33479
|
+
clearTimeout(timer);
|
|
33480
|
+
}
|
|
33481
|
+
try {
|
|
33482
|
+
await res.body?.cancel();
|
|
33483
|
+
} catch {
|
|
33484
|
+
}
|
|
33485
|
+
if (res.status < 300 || res.status >= 400) return null;
|
|
33486
|
+
const location = res.headers.get("location");
|
|
33487
|
+
if (!location) return null;
|
|
33488
|
+
let next;
|
|
33489
|
+
try {
|
|
33490
|
+
next = new URL(location, url);
|
|
33491
|
+
} catch {
|
|
33492
|
+
return null;
|
|
33493
|
+
}
|
|
33494
|
+
if (isInviteLanding(next)) return next.toString();
|
|
33495
|
+
if (!inviteHopAllowed(next)) return null;
|
|
33496
|
+
url = next;
|
|
33497
|
+
}
|
|
33498
|
+
return null;
|
|
33499
|
+
}
|
|
33500
|
+
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
33501
|
var init_wix_bridge = __esm({
|
|
33376
33502
|
"../../core/serve-runtime/src/wix-bridge.ts"() {
|
|
33377
33503
|
init_sha256();
|
|
@@ -33680,6 +33806,17 @@ ${session}`);
|
|
|
33680
33806
|
return entry;
|
|
33681
33807
|
}
|
|
33682
33808
|
};
|
|
33809
|
+
MEMBER_SESSION_URL = "https://manage.wix.com/_api/users-members/v1/user-member-connections/member-session";
|
|
33810
|
+
MemberSessionRefused = class extends Error {
|
|
33811
|
+
constructor(metaSiteId, reason) {
|
|
33812
|
+
super(`MemberSessionRefused(metaSiteId: ${metaSiteId}): ${reason}`);
|
|
33813
|
+
this.metaSiteId = metaSiteId;
|
|
33814
|
+
this.reason = reason;
|
|
33815
|
+
this.name = "MemberSessionRefused";
|
|
33816
|
+
}
|
|
33817
|
+
code = "MemberSessionRefused";
|
|
33818
|
+
};
|
|
33819
|
+
INVITE_MAX_HOPS = 8;
|
|
33683
33820
|
}
|
|
33684
33821
|
});
|
|
33685
33822
|
|
|
@@ -37910,10 +38047,10 @@ function createRicosHostSession(o2) {
|
|
|
37910
38047
|
});
|
|
37911
38048
|
};
|
|
37912
38049
|
const writes = () => committed || state.dirty;
|
|
37913
|
-
const moved = (
|
|
37914
|
-
if (
|
|
37915
|
-
lastContent =
|
|
37916
|
-
if (
|
|
38050
|
+
const moved = (json7) => {
|
|
38051
|
+
if (json7 === lastContent) return false;
|
|
38052
|
+
lastContent = json7;
|
|
38053
|
+
if (json7 !== baseline) {
|
|
37917
38054
|
state.dirty = true;
|
|
37918
38055
|
if (dirtyTimer !== null) t2.clearTimeout(dirtyTimer);
|
|
37919
38056
|
dirtyTimer = t2.setTimeout(() => {
|
|
@@ -38137,13 +38274,13 @@ async function runRicosImageUpload(o2) {
|
|
|
38137
38274
|
return fail5("put");
|
|
38138
38275
|
}
|
|
38139
38276
|
if (!res.ok) return fail5("put");
|
|
38140
|
-
let
|
|
38277
|
+
let json7;
|
|
38141
38278
|
try {
|
|
38142
|
-
|
|
38279
|
+
json7 = await res.json();
|
|
38143
38280
|
} catch {
|
|
38144
38281
|
return fail5("bad_descriptor");
|
|
38145
38282
|
}
|
|
38146
|
-
const root =
|
|
38283
|
+
const root = json7 && typeof json7 === "object" ? json7 : {};
|
|
38147
38284
|
const d2 = root.file && typeof root.file === "object" ? root.file : root;
|
|
38148
38285
|
const id = typeof d2.id === "string" ? d2.id : "";
|
|
38149
38286
|
if (!id) return fail5("bad_descriptor");
|
|
@@ -38344,9 +38481,9 @@ function RichContentEditorView({ props, ctx, wrap, nodeId, renderChild, ...dom }
|
|
|
38344
38481
|
locale: ctx.localeTag ?? "en",
|
|
38345
38482
|
rtl: ctx.isRTL ?? document.documentElement.dir === "rtl",
|
|
38346
38483
|
palette: { text: C2("textPrimary", "#13171E"), background: C2("surfacePrimary", "#FFFFFF"), accent: C2("accentPrimary", "#116DFF") },
|
|
38347
|
-
onContent: (
|
|
38484
|
+
onContent: (json7) => {
|
|
38348
38485
|
const b2 = bagRef.current, n2 = nameRef.current;
|
|
38349
|
-
if (b2 && n2) b2.set(n2,
|
|
38486
|
+
if (b2 && n2) b2.set(n2, json7);
|
|
38350
38487
|
},
|
|
38351
38488
|
onToolbar: setToolbar,
|
|
38352
38489
|
onFocusChange: setFocused,
|
|
@@ -38713,13 +38850,13 @@ async function runMediaFieldUpload(o2) {
|
|
|
38713
38850
|
return { ok: false, reason: e2 instanceof Deadline || expired ? "timeout" : "put" };
|
|
38714
38851
|
}
|
|
38715
38852
|
if (!res.ok) return { ok: false, reason: "put" };
|
|
38716
|
-
let
|
|
38853
|
+
let json7;
|
|
38717
38854
|
try {
|
|
38718
|
-
|
|
38855
|
+
json7 = await bounded2(res.json());
|
|
38719
38856
|
} catch (e2) {
|
|
38720
38857
|
return { ok: false, reason: e2 instanceof Deadline || expired ? "timeout" : "bad_descriptor" };
|
|
38721
38858
|
}
|
|
38722
|
-
const root =
|
|
38859
|
+
const root = json7 && typeof json7 === "object" ? json7 : {};
|
|
38723
38860
|
const d2 = root.file && typeof root.file === "object" ? root.file : root;
|
|
38724
38861
|
const mediaId = typeof d2.id === "string" ? d2.id : "";
|
|
38725
38862
|
if (!mediaId) return { ok: false, reason: "bad_descriptor" };
|
|
@@ -45834,7 +45971,7 @@ var init_pdf = __esm({
|
|
|
45834
45971
|
var currentOrdered;
|
|
45835
45972
|
var marked = false;
|
|
45836
45973
|
var root = true;
|
|
45837
|
-
var
|
|
45974
|
+
var json7 = stringifyWithProperSymbolsConversion(text9, function(key2, value) {
|
|
45838
45975
|
key2 = $String(key2);
|
|
45839
45976
|
if (propertyList) {
|
|
45840
45977
|
if (key2 === END_MARK) {
|
|
@@ -45861,16 +45998,16 @@ var init_pdf = __esm({
|
|
|
45861
45998
|
}
|
|
45862
45999
|
return value;
|
|
45863
46000
|
}, space);
|
|
45864
|
-
if (typeof
|
|
45865
|
-
if (ILL_FORMED_UNICODE)
|
|
45866
|
-
if (!marked) return
|
|
46001
|
+
if (typeof json7 != "string") return json7;
|
|
46002
|
+
if (ILL_FORMED_UNICODE) json7 = replace(json7, surrogates, fixIllFormedJSON);
|
|
46003
|
+
if (!marked) return json7;
|
|
45867
46004
|
var result = "";
|
|
45868
|
-
var length =
|
|
46005
|
+
var length = json7.length;
|
|
45869
46006
|
for (var i2 = 0; i2 < length; i2++) {
|
|
45870
|
-
var chr = charAt(
|
|
46007
|
+
var chr = charAt(json7, i2);
|
|
45871
46008
|
if (chr === '"') {
|
|
45872
|
-
var end = parseJSONString(
|
|
45873
|
-
var string5 = slice(
|
|
46009
|
+
var end = parseJSONString(json7, ++i2).end - 1;
|
|
46010
|
+
var string5 = slice(json7, i2, end);
|
|
45874
46011
|
if (slice(string5, 0, RAW_MARK_LENGTH) === RAW_MARK) result += rawStrings[slice(string5, RAW_MARK_LENGTH)];
|
|
45875
46012
|
else if (slice(string5, 0, KEY_MARK_LENGTH) === KEY_MARK) result += '"' + slice(string5, KEY_MARK_LENGTH) + '"';
|
|
45876
46013
|
else result += '"' + string5 + '"';
|
|
@@ -124567,6 +124704,9 @@ var init_renderNode = __esm({
|
|
|
124567
124704
|
const onChangeAction = resolveRowAction2(props.onChange ?? cfg.onChange, ctx);
|
|
124568
124705
|
const borderless = props.borderless === true || cfg.borderless === true;
|
|
124569
124706
|
const secure = props.secure === true || cfg.secure === true;
|
|
124707
|
+
const [valueVisible, setValueVisible] = React9.useState(false);
|
|
124708
|
+
const visibilityToggle = secure && (props.visibilityToggle === true || cfg.visibilityToggle === true);
|
|
124709
|
+
const visibilityLabel = ctx.catalog?.get(valueVisible ? "auth.gate.password.hide" : "auth.gate.password.show") ?? (valueVisible ? "Hide password" : "Show password");
|
|
124570
124710
|
const erroredProp = props.error === true || cfg.error === true;
|
|
124571
124711
|
const muted = C2("textSecondary", "#888");
|
|
124572
124712
|
const pathProp = typeof props.valuePath === "string" ? props.valuePath : typeof cfg.valuePath === "string" ? cfg.valuePath : void 0;
|
|
@@ -124672,13 +124812,18 @@ var init_renderNode = __esm({
|
|
|
124672
124812
|
const hasWorkerError = Boolean(workerError && workerError.trim());
|
|
124673
124813
|
const painted2 = rawMessage === null ? "" : translateOnly(rawMessage);
|
|
124674
124814
|
const message = !painted2.trim() || ruleMessagePending && !hasWorkerError ? null : painted2;
|
|
124815
|
+
const [feedbackShown, setFeedbackShown] = React9.useState(false);
|
|
124675
124816
|
const revealed = message !== null && shouldRevealError({
|
|
124676
124817
|
rule,
|
|
124818
|
+
feedbackShown,
|
|
124677
124819
|
hasWorkerError,
|
|
124678
124820
|
touched,
|
|
124679
124821
|
focused: isFocused,
|
|
124680
124822
|
submitAttempted: formBag?.submitAttempted ?? false
|
|
124681
124823
|
});
|
|
124824
|
+
React9.useEffect(() => {
|
|
124825
|
+
if (revealed) setFeedbackShown(true);
|
|
124826
|
+
}, [revealed]);
|
|
124682
124827
|
const errored = erroredProp || revealed;
|
|
124683
124828
|
const generatedId = React9.useId();
|
|
124684
124829
|
const errorId = revealed ? `${componentId ?? generatedId}__error` : void 0;
|
|
@@ -124692,6 +124837,16 @@ var init_renderNode = __esm({
|
|
|
124692
124837
|
});
|
|
124693
124838
|
}
|
|
124694
124839
|
};
|
|
124840
|
+
const ownsPrivateDraft = React9.useRef(false);
|
|
124841
|
+
React9.useEffect(() => {
|
|
124842
|
+
if (visibilityToggle && !isBound) ownsPrivateDraft.current = true;
|
|
124843
|
+
}, [visibilityToggle, isBound]);
|
|
124844
|
+
const clearSensitiveDraft = React9.useRef(() => {
|
|
124845
|
+
});
|
|
124846
|
+
clearSensitiveDraft.current = () => {
|
|
124847
|
+
if (ownsPrivateDraft.current && !isBound) emit("");
|
|
124848
|
+
};
|
|
124849
|
+
React9.useEffect(() => () => clearSensitiveDraft.current(), []);
|
|
124695
124850
|
const onInput = (e2) => {
|
|
124696
124851
|
const v2 = e2.currentTarget.value;
|
|
124697
124852
|
setLocal(v2);
|
|
@@ -124779,13 +124934,33 @@ var init_renderNode = __esm({
|
|
|
124779
124934
|
/* @__PURE__ */ jsxs7("div", { style: composedBox, children: [
|
|
124780
124935
|
props.leadingIcon && accIcon(props.leadingIcon),
|
|
124781
124936
|
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 }),
|
|
124937
|
+
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
124938
|
suffixText && /* @__PURE__ */ jsx10("span", { style: { color: muted, flex: "none" }, children: suffixText }),
|
|
124784
124939
|
props.clearButton && local && /* @__PURE__ */ jsx10("span", { onClick: () => {
|
|
124785
124940
|
setLocal("");
|
|
124786
124941
|
setEdited(true);
|
|
124787
124942
|
emit("");
|
|
124788
124943
|
}, 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" }),
|
|
124944
|
+
visibilityToggle && /* @__PURE__ */ jsx10(
|
|
124945
|
+
"button",
|
|
124946
|
+
{
|
|
124947
|
+
type: "button",
|
|
124948
|
+
"aria-label": visibilityLabel,
|
|
124949
|
+
"aria-pressed": valueVisible,
|
|
124950
|
+
"data-component-id": `${componentId}_toggle`,
|
|
124951
|
+
onMouseDown: (event) => event.preventDefault(),
|
|
124952
|
+
onClick: () => {
|
|
124953
|
+
const input = inputRef.current;
|
|
124954
|
+
const start = input?.selectionStart, end = input?.selectionEnd;
|
|
124955
|
+
setValueVisible(!valueVisible);
|
|
124956
|
+
queueMicrotask(() => {
|
|
124957
|
+
if (input && start != null && end != null) input.setSelectionRange(start, end);
|
|
124958
|
+
});
|
|
124959
|
+
},
|
|
124960
|
+
style: { background: "transparent", border: 0, padding: 8, minWidth: 44, minHeight: 44, display: "grid", placeItems: "center", cursor: "pointer", color: muted },
|
|
124961
|
+
children: iconSvg(valueVisible ? "eye.slash" : "eye", { size: 20, color: muted })
|
|
124962
|
+
}
|
|
124963
|
+
),
|
|
124789
124964
|
props.trailingIcon && accIcon(props.trailingIcon)
|
|
124790
124965
|
] }),
|
|
124791
124966
|
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 +132256,47 @@ function webWixSession(req, res, state) {
|
|
|
132081
132256
|
}
|
|
132082
132257
|
return session;
|
|
132083
132258
|
}
|
|
132259
|
+
async function pipeWebWixStream(upstream, res, signal, recordStream) {
|
|
132260
|
+
res.statusCode = upstream.status;
|
|
132261
|
+
for (const name of ["content-type", "cache-control", "retry-after"]) {
|
|
132262
|
+
const value = upstream.headers.get(name);
|
|
132263
|
+
if (value) res.setHeader(name, value);
|
|
132264
|
+
}
|
|
132265
|
+
res.setHeader("access-control-allow-origin", "*");
|
|
132266
|
+
res.setHeader("cache-control", res.getHeader("cache-control") ?? "no-cache");
|
|
132267
|
+
recordStream("proxy", upstream.status);
|
|
132268
|
+
if (!upstream.body) {
|
|
132269
|
+
res.end();
|
|
132270
|
+
return;
|
|
132271
|
+
}
|
|
132272
|
+
const reader = upstream.body.getReader();
|
|
132273
|
+
for (; ; ) {
|
|
132274
|
+
if (signal.aborted) {
|
|
132275
|
+
await reader.cancel();
|
|
132276
|
+
break;
|
|
132277
|
+
}
|
|
132278
|
+
const chunk = await reader.read();
|
|
132279
|
+
if (chunk.done) break;
|
|
132280
|
+
if (chunk.value && !res.write(chunk.value)) {
|
|
132281
|
+
await new Promise((resolve65) => {
|
|
132282
|
+
let settled = false;
|
|
132283
|
+
const finish2 = () => {
|
|
132284
|
+
if (settled) return;
|
|
132285
|
+
settled = true;
|
|
132286
|
+
res.off("drain", finish2);
|
|
132287
|
+
res.off("close", finish2);
|
|
132288
|
+
resolve65();
|
|
132289
|
+
};
|
|
132290
|
+
if (res.destroyed || !res.writable) finish2();
|
|
132291
|
+
else {
|
|
132292
|
+
res.once("drain", finish2);
|
|
132293
|
+
res.once("close", finish2);
|
|
132294
|
+
}
|
|
132295
|
+
});
|
|
132296
|
+
}
|
|
132297
|
+
}
|
|
132298
|
+
if (!res.destroyed) res.end();
|
|
132299
|
+
}
|
|
132084
132300
|
async function handleWebWix(req, res, state) {
|
|
132085
132301
|
const session = webWixSession(req, res, state);
|
|
132086
132302
|
const auth = resolveWebWixAuth(state.app);
|
|
@@ -132142,7 +132358,13 @@ async function handleWebWix(req, res, state) {
|
|
|
132142
132358
|
res.end(JSON.stringify({ error: "webwix_stream_bad_request" }));
|
|
132143
132359
|
return;
|
|
132144
132360
|
}
|
|
132145
|
-
|
|
132361
|
+
const sitePinned = Object.keys(forwardedHeaders).some((name) => name.toLowerCase() === "wix-site-id");
|
|
132362
|
+
if (isWixAccountModeApp(state.app) && sitePinned && !session.account) {
|
|
132363
|
+
recordStream("proxy", 401);
|
|
132364
|
+
return reply(401, { error: "webwix_account_signed_out" });
|
|
132365
|
+
}
|
|
132366
|
+
const accountSiteStream = isWixAccountModeApp(state.app) && !!session.account && sitePinned;
|
|
132367
|
+
if (state.wix.mode === "mock" && (!accountSiteStream || failsClosed(state.wix))) {
|
|
132146
132368
|
const matchCtx = { host: target.host, query: Object.fromEntries(target.searchParams.entries()), headers: forwardedHeaders, body };
|
|
132147
132369
|
let match = matchRuleEx(state.wix.rules, method, target.pathname, matchCtx);
|
|
132148
132370
|
if (match && (match.rule.kind ?? "mock") !== "mock") {
|
|
@@ -132175,6 +132397,38 @@ async function handleWebWix(req, res, state) {
|
|
|
132175
132397
|
};
|
|
132176
132398
|
res.once("close", onResponseClose);
|
|
132177
132399
|
try {
|
|
132400
|
+
const account = isWixAccountModeApp(state.app) ? session.account : void 0;
|
|
132401
|
+
const streamSite = Object.entries(forwardedHeaders).find(([name]) => name.toLowerCase() === "wix-site-id")?.[1]?.trim() ?? "";
|
|
132402
|
+
if (account && streamSite) {
|
|
132403
|
+
if (!isSafeMsid(streamSite)) {
|
|
132404
|
+
recordStream("proxy", 400);
|
|
132405
|
+
return reply(400, { error: "webwix_account_bad_site_id" });
|
|
132406
|
+
}
|
|
132407
|
+
let upstream2;
|
|
132408
|
+
try {
|
|
132409
|
+
upstream2 = await webWixStream(method, target.toString(), body, await webAccountMemberInstances.instance(streamSite, account.cookie), void 0, forwardedHeaders, abort.signal);
|
|
132410
|
+
if (upstream2.status === 401 && !abort.signal.aborted) {
|
|
132411
|
+
try {
|
|
132412
|
+
await upstream2.body?.cancel();
|
|
132413
|
+
} catch {
|
|
132414
|
+
}
|
|
132415
|
+
upstream2 = await webWixStream(method, target.toString(), body, await webAccountMemberInstances.instance(streamSite, account.cookie, { force: true }), void 0, forwardedHeaders, abort.signal);
|
|
132416
|
+
}
|
|
132417
|
+
} catch (e2) {
|
|
132418
|
+
if (e2 instanceof AccountSessionExpired) {
|
|
132419
|
+
webAccountMemberInstances.forgetSession(account.cookie);
|
|
132420
|
+
if (session.account === account) session.account = void 0;
|
|
132421
|
+
}
|
|
132422
|
+
if (e2 instanceof NotSiteMember || e2 instanceof SiteInstanceUnavailable || e2 instanceof AccountSessionExpired) {
|
|
132423
|
+
const refusal = memberInstanceRefusal(e2);
|
|
132424
|
+
recordStream("proxy", refusal.status);
|
|
132425
|
+
return reply(refusal.status, refusal.body);
|
|
132426
|
+
}
|
|
132427
|
+
throw e2;
|
|
132428
|
+
}
|
|
132429
|
+
await pipeWebWixStream(upstream2, res, abort.signal, recordStream);
|
|
132430
|
+
return;
|
|
132431
|
+
}
|
|
132178
132432
|
if (!session.visitorToken && !session.memberToken) {
|
|
132179
132433
|
try {
|
|
132180
132434
|
session.visitorToken = await mintVisitor(resolveWixClientId(state.app) ?? WEBWIX_CLIENT_ID);
|
|
@@ -132195,45 +132449,7 @@ async function handleWebWix(req, res, state) {
|
|
|
132195
132449
|
} catch {
|
|
132196
132450
|
}
|
|
132197
132451
|
}
|
|
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();
|
|
132452
|
+
await pipeWebWixStream(upstream, res, abort.signal, recordStream);
|
|
132237
132453
|
} catch {
|
|
132238
132454
|
if (!abort.signal.aborted) {
|
|
132239
132455
|
recordStream("proxy", 502);
|
|
@@ -132314,6 +132530,65 @@ async function handleWebWix(req, res, state) {
|
|
|
132314
132530
|
}
|
|
132315
132531
|
return reply(405, { error: "method_not_allowed" });
|
|
132316
132532
|
}
|
|
132533
|
+
const accountRouteStarted = Date.now();
|
|
132534
|
+
const sealedAccountRoute = state.wix.mode === "mock" && failsClosed(state.wix);
|
|
132535
|
+
const logAccountRoute = (url, method, status) => {
|
|
132536
|
+
const t2 = new URL(url);
|
|
132537
|
+
recordWixTraffic(state.wix, state.appName, state.adminUrl, {
|
|
132538
|
+
ts: accountRouteStarted,
|
|
132539
|
+
source: sealedAccountRoute ? "mock" : "proxy",
|
|
132540
|
+
capability: "wix_api.web.account",
|
|
132541
|
+
host: t2.host,
|
|
132542
|
+
method,
|
|
132543
|
+
url: `${t2.origin}${t2.pathname}`,
|
|
132544
|
+
path: t2.pathname,
|
|
132545
|
+
status,
|
|
132546
|
+
durationMs: Date.now() - accountRouteStarted,
|
|
132547
|
+
...sealedAccountRoute ? { mockRuleId: UNMATCHED_FAIL_CLOSED_ID } : {}
|
|
132548
|
+
});
|
|
132549
|
+
};
|
|
132550
|
+
const sealedRefusal = (url, method) => {
|
|
132551
|
+
const refusal = hermeticRefusal(method, new URL(url).pathname);
|
|
132552
|
+
logAccountRoute(url, method, refusal.status);
|
|
132553
|
+
res.statusCode = refusal.status;
|
|
132554
|
+
res.setHeader("content-type", refusal.headers["content-type"]);
|
|
132555
|
+
res.end(refusal.body);
|
|
132556
|
+
};
|
|
132557
|
+
if (path2 === "/v1/__webwix/account/member-session") {
|
|
132558
|
+
if (!accountApp) return reply(404, { error: "webwix_account_unsupported" });
|
|
132559
|
+
if (req.method !== "POST") return reply(405, { error: "method_not_allowed" });
|
|
132560
|
+
res.setHeader("cache-control", "no-store");
|
|
132561
|
+
const account = session.account;
|
|
132562
|
+
if (!account) return reply(401, { error: "webwix_account_signed_out" });
|
|
132563
|
+
const metaSiteId = String((await readJson9()).metaSiteId ?? "").trim();
|
|
132564
|
+
if (!isSafeMsid(metaSiteId)) return reply(400, { error: "webwix_account_bad_site_id" });
|
|
132565
|
+
if (sealedAccountRoute) return sealedRefusal(MEMBER_SESSION_URL, "POST");
|
|
132566
|
+
try {
|
|
132567
|
+
const sessionToken = await mintMemberSessionToken(account.cookie, metaSiteId, fetch);
|
|
132568
|
+
logAccountRoute(MEMBER_SESSION_URL, "POST", 200);
|
|
132569
|
+
return reply(200, { sessionToken });
|
|
132570
|
+
} catch (e2) {
|
|
132571
|
+
if (e2 instanceof AccountSessionExpired) {
|
|
132572
|
+
webAccountMemberInstances.forgetSession(account.cookie);
|
|
132573
|
+
if (session.account === account) session.account = void 0;
|
|
132574
|
+
}
|
|
132575
|
+
const refusal = memberSessionRefusal(e2);
|
|
132576
|
+
logAccountRoute(MEMBER_SESSION_URL, "POST", refusal.status);
|
|
132577
|
+
return reply(refusal.status, refusal.body);
|
|
132578
|
+
}
|
|
132579
|
+
}
|
|
132580
|
+
if (path2 === "/v1/__webwix/account/short-link") {
|
|
132581
|
+
if (!accountApp) return reply(404, { error: "webwix_account_unsupported" });
|
|
132582
|
+
if (req.method !== "POST") return reply(405, { error: "method_not_allowed" });
|
|
132583
|
+
res.setHeader("cache-control", "no-store");
|
|
132584
|
+
const shortId = String((await readJson9()).shortId ?? "").trim();
|
|
132585
|
+
const start = inviteShortLinkUrl(shortId);
|
|
132586
|
+
if (!start) return reply(400, { error: "webwix_short_link_bad_id" });
|
|
132587
|
+
if (sealedAccountRoute) return sealedRefusal(start, "GET");
|
|
132588
|
+
const url = await resolveInviteShortLink(shortId, fetch);
|
|
132589
|
+
logAccountRoute(start, "GET", url ? 200 : 404);
|
|
132590
|
+
return url ? reply(200, { url }) : reply(404, { error: "webwix_short_link_unresolved" });
|
|
132591
|
+
}
|
|
132317
132592
|
if (path2 === "/v1/__webwix/call" && req.method === "POST") {
|
|
132318
132593
|
const b2 = await readJson9();
|
|
132319
132594
|
const ownerRung = b2.ownerMsid !== void 0 || b2.checkOwnerSession === true;
|
|
@@ -137465,10 +137740,10 @@ async function bakeWidgets(fetchPath, putWidget, ownBundles) {
|
|
|
137465
137740
|
}
|
|
137466
137741
|
continue;
|
|
137467
137742
|
}
|
|
137468
|
-
const
|
|
137469
|
-
await putWidget(widgetId,
|
|
137743
|
+
const json7 = JSON.stringify(snap);
|
|
137744
|
+
await putWidget(widgetId, json7);
|
|
137470
137745
|
widgets[widgetId] = {
|
|
137471
|
-
contentEtag: snap.contentEtag ?? sha2564(
|
|
137746
|
+
contentEtag: snap.contentEtag ?? sha2564(json7),
|
|
137472
137747
|
ttlSeconds: snap.refresh?.ttlSeconds ?? 0
|
|
137473
137748
|
};
|
|
137474
137749
|
}
|
|
@@ -137492,10 +137767,10 @@ function tokensSnapshotMessage(app, base, status) {
|
|
|
137492
137767
|
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
137768
|
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
137769
|
}
|
|
137495
|
-
function pinBakedServerBaseUrl(
|
|
137770
|
+
function pinBakedServerBaseUrl(json7, base) {
|
|
137496
137771
|
const escaped = base.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
137497
137772
|
const boundary = /:\d+$/.test(base) ? "(?!\\d)" : "(?![\\w.-])(?!:\\d)";
|
|
137498
|
-
return
|
|
137773
|
+
return json7.replace(new RegExp(`${escaped}${boundary}`, "g"), BAKED_SERVER_BASE_URL);
|
|
137499
137774
|
}
|
|
137500
137775
|
function stableStringify2(v2) {
|
|
137501
137776
|
if (v2 === null || typeof v2 !== "object") return JSON.stringify(v2);
|
|
@@ -138212,15 +138487,15 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
138212
138487
|
}
|
|
138213
138488
|
tierScreens.push(summarize3({ ...descriptor, ...lb ? { logicBundle: lb } : {} }));
|
|
138214
138489
|
delete descriptor.etag;
|
|
138215
|
-
const
|
|
138216
|
-
await store.putScreen(app, screenId,
|
|
138217
|
-
screens[screenId] = { descriptorHash: sha2564(
|
|
138218
|
-
rememberInput(bundleName, JSON.parse(
|
|
138490
|
+
const json7 = pinBakedServerBaseUrl(JSON.stringify(descriptor), base);
|
|
138491
|
+
await store.putScreen(app, screenId, json7);
|
|
138492
|
+
screens[screenId] = { descriptorHash: sha2564(json7), bundle: bundleName, ...screenMetadataFor(screenMetadata, screenId) };
|
|
138493
|
+
rememberInput(bundleName, JSON.parse(json7));
|
|
138219
138494
|
if (collect2?.descriptors) {
|
|
138220
138495
|
baked.push({
|
|
138221
138496
|
screenId,
|
|
138222
|
-
descriptor: JSON.parse(
|
|
138223
|
-
descriptorJson:
|
|
138497
|
+
descriptor: JSON.parse(json7),
|
|
138498
|
+
descriptorJson: json7,
|
|
138224
138499
|
bundleName,
|
|
138225
138500
|
bundleJs: bundleName ? readBundle(bundleName) ?? null : null,
|
|
138226
138501
|
...bundleMapFor(tier5Dir, bundleName ?? void 0)
|
|
@@ -138357,14 +138632,14 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
138357
138632
|
}
|
|
138358
138633
|
delete descriptor.etag;
|
|
138359
138634
|
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(
|
|
138635
|
+
const json7 = pinBakedServerBaseUrl(JSON.stringify(descriptor), base);
|
|
138636
|
+
await store.putScreen(app, screenId, json7);
|
|
138637
|
+
screens[screenId] = { descriptorHash: sha2564(json7), bundle: bundleName, ...screenMetadataFor(screenMetadata, screenId, canonical4) };
|
|
138638
|
+
rememberInput(bundleName, JSON.parse(json7));
|
|
138364
138639
|
if (collect2?.descriptors) {
|
|
138365
138640
|
baked.push({
|
|
138366
138641
|
screenId,
|
|
138367
|
-
descriptor: JSON.parse(
|
|
138642
|
+
descriptor: JSON.parse(json7),
|
|
138368
138643
|
// The EXACT baked bytes, exactly as the exact-screen path hands
|
|
138369
138644
|
// them over. Omitting them did not degrade the crawl quietly — it
|
|
138370
138645
|
// took out the native-decode oracle for the whole app, which
|
|
@@ -138373,7 +138648,7 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
138373
138648
|
// bytes") and throws rather than skipping. So one templated route
|
|
138374
138649
|
// anywhere in an app meant `himi test --native` reported nothing
|
|
138375
138650
|
// for ANY of its screens.
|
|
138376
|
-
descriptorJson:
|
|
138651
|
+
descriptorJson: json7,
|
|
138377
138652
|
bundleName,
|
|
138378
138653
|
bundleJs: bundleName ? readBundle(bundleName) ?? null : null,
|
|
138379
138654
|
...bundleMapFor(tier5Dir, bundleName ?? void 0)
|
|
@@ -138466,7 +138741,7 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
138466
138741
|
if (store.putWidget) {
|
|
138467
138742
|
const bakedWidgets = await bakeWidgets(
|
|
138468
138743
|
(path2) => devFetch(`${base}${path2}`, { headers: { "X-Himalaya-App": app } }),
|
|
138469
|
-
(widgetId,
|
|
138744
|
+
(widgetId, json7) => store.putWidget(app, widgetId, json7),
|
|
138470
138745
|
// `opts.tier5Dir`, NOT the `tier5Dir` local — that one falls back to the
|
|
138471
138746
|
// repo-global dir, where this package's widgets cannot be told from anyone
|
|
138472
138747
|
// else's and the filter would claim every app's rows as ours.
|
|
@@ -138485,9 +138760,9 @@ async function buildFromLoaded(preloaded, dest, opts = {}) {
|
|
|
138485
138760
|
if (!js2) continue;
|
|
138486
138761
|
try {
|
|
138487
138762
|
const input = bundleInputs.get(name);
|
|
138488
|
-
const
|
|
138489
|
-
const hash2 = sha2564(
|
|
138490
|
-
await store.putDoc(app, hash2,
|
|
138763
|
+
const json7 = JSON.stringify(extractBundleServices(js2, input ? { input } : {}));
|
|
138764
|
+
const hash2 = sha2564(json7);
|
|
138765
|
+
await store.putDoc(app, hash2, json7);
|
|
138491
138766
|
meta.servicesHash = hash2;
|
|
138492
138767
|
} catch {
|
|
138493
138768
|
}
|
|
@@ -156517,12 +156792,204 @@ var init_wix_member_auth = __esm({
|
|
|
156517
156792
|
}
|
|
156518
156793
|
});
|
|
156519
156794
|
|
|
156520
|
-
// ../../core/serve/src/
|
|
156795
|
+
// ../../core/serve/src/account-rung.ts
|
|
156521
156796
|
function json4(status, body, headers2 = {}) {
|
|
156522
|
-
return new Response(JSON.stringify(body), { status, headers: { "content-type": JSON_CT2, ...headers2 } });
|
|
156797
|
+
return new Response(JSON.stringify(body), { status, headers: { "content-type": JSON_CT2, ...NO_STORE, ...headers2 } });
|
|
156798
|
+
}
|
|
156799
|
+
function isWixAccountHost(host) {
|
|
156800
|
+
const hostname3 = host.replace(/:\d+$/, "").toLowerCase();
|
|
156801
|
+
return hostname3 === "wix.com" || hostname3.endsWith(".wix.com");
|
|
156802
|
+
}
|
|
156803
|
+
function accountReturnPath(raw, fallback) {
|
|
156804
|
+
const candidate = safeReturnPath(raw, fallback);
|
|
156805
|
+
const base = "http://placeholder.invalid";
|
|
156806
|
+
try {
|
|
156807
|
+
const u2 = new URL(candidate, base);
|
|
156808
|
+
if (u2.origin !== base || u2.pathname.startsWith("//")) return fallback;
|
|
156809
|
+
return `${u2.pathname}${u2.search}${u2.hash}`;
|
|
156810
|
+
} catch {
|
|
156811
|
+
return fallback;
|
|
156812
|
+
}
|
|
156813
|
+
}
|
|
156814
|
+
function withOutcome(target, outcome) {
|
|
156815
|
+
const url = new URL(target, "http://placeholder.invalid");
|
|
156816
|
+
url.searchParams.set("webwix_account", outcome);
|
|
156817
|
+
return `${url.pathname}${url.search}${url.hash}`;
|
|
156818
|
+
}
|
|
156819
|
+
function accountCookie(request) {
|
|
156820
|
+
return forwardableWixSessionCookies(request.headers.get("cookie"));
|
|
156821
|
+
}
|
|
156822
|
+
async function principal(cookie, opts, fetchImpl) {
|
|
156823
|
+
if (!cookie) return { ok: false, error: "webwix_account_no_session" };
|
|
156824
|
+
const who = await opts.resolveAccounts(cookie, fetchImpl).catch(() => ({ ok: false, reason: "upstream_failed" }));
|
|
156825
|
+
if (!who.ok) return { ok: false, error: who.reason === "no_session" ? "webwix_account_no_session" : "webwix_account_upstream_failed" };
|
|
156826
|
+
const ids = who.accounts.map((a2) => a2.accountId).sort().join("\n");
|
|
156827
|
+
return { ok: true, principal: `acct_${sha256Hex(ids).slice(0, 32)}` };
|
|
156828
|
+
}
|
|
156829
|
+
function crossSiteAccountWrite(request, url) {
|
|
156830
|
+
if (!/^application\/json\b/i.test(request.headers.get("content-type") ?? "")) return true;
|
|
156831
|
+
const origin = request.headers.get("origin");
|
|
156832
|
+
if (origin) {
|
|
156833
|
+
let host = null;
|
|
156834
|
+
try {
|
|
156835
|
+
host = new URL(origin).host;
|
|
156836
|
+
} catch {
|
|
156837
|
+
}
|
|
156838
|
+
if (host !== url.host) return true;
|
|
156839
|
+
}
|
|
156840
|
+
const site = request.headers.get("sec-fetch-site");
|
|
156841
|
+
return !!site && site !== "same-origin";
|
|
156842
|
+
}
|
|
156843
|
+
async function handleAccountRung(opts, ctx) {
|
|
156844
|
+
const { request, url, path: path2 } = ctx;
|
|
156845
|
+
const accountPath = ACCOUNT_RUNG_PATHS.has(path2);
|
|
156846
|
+
const bridgePath = path2 === "/v1/__webwix/identity" || path2 === "/v1/__webwix/call" || path2 === "/v1/__webwix/stream";
|
|
156847
|
+
if (!accountPath && !bridgePath) return null;
|
|
156848
|
+
const hostApp = opts.appForHost(url.host);
|
|
156849
|
+
if (!hostApp) return null;
|
|
156850
|
+
if (!await ctx.isAccountApp(hostApp).catch(() => false)) {
|
|
156851
|
+
return accountPath ? json4(404, { error: "webwix_account_unsupported" }) : null;
|
|
156852
|
+
}
|
|
156853
|
+
if (path2 === "/v1/__webwix/account/login" || path2 === "/v1/__webwix/account/callback") {
|
|
156854
|
+
const back = accountReturnPath(url.searchParams.get("return"), `/?app=${encodeURIComponent(hostApp)}`);
|
|
156855
|
+
const signInUrl = isWixAccountHost(url.host) ? wixAccountSignInUrl(`${ctx.publicBase}/v1/__webwix/account/callback?return=${encodeURIComponent(back)}`) : void 0;
|
|
156856
|
+
if (path2 === "/v1/__webwix/account/login" && request.method === "GET" && signInUrl) {
|
|
156857
|
+
return new Response(null, { status: 302, headers: { location: signInUrl, ...NO_STORE } });
|
|
156858
|
+
}
|
|
156859
|
+
if (path2 === "/v1/__webwix/account/login" && request.method === "POST" && crossSiteAccountWrite(request, url)) return CROSS_SITE();
|
|
156860
|
+
if (request.method !== "GET" && !(request.method === "POST" && path2 === "/v1/__webwix/account/login")) return json4(405, { error: "method_not_allowed" });
|
|
156861
|
+
const who = await principal(accountCookie(request), opts, ctx.fetchImpl);
|
|
156862
|
+
if (path2 === "/v1/__webwix/account/login" && request.method === "POST") {
|
|
156863
|
+
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 } : {} });
|
|
156864
|
+
}
|
|
156865
|
+
return new Response(null, { status: 302, headers: { location: withOutcome(back, who.ok ? "signed_in" : who.error), ...NO_STORE } });
|
|
156866
|
+
}
|
|
156867
|
+
if (path2 === "/v1/__webwix/identity") {
|
|
156868
|
+
if (request.method !== "GET" && request.method !== "HEAD") return null;
|
|
156869
|
+
const who = await principal(accountCookie(request), opts, ctx.fetchImpl);
|
|
156870
|
+
const webwixDirect = await ctx.webwixDirect();
|
|
156871
|
+
if (request.method === "HEAD") return new Response(null, { status: 200, headers: { "content-type": JSON_CT2, ...NO_STORE } });
|
|
156872
|
+
return json4(200, who.ok ? { authenticated: true, userId: who.principal, email: null, mode: "account", webwixDirect } : { authenticated: false, userId: null, email: null, mode: "account", webwixDirect });
|
|
156873
|
+
}
|
|
156874
|
+
if (request.method !== "POST") return accountPath ? json4(405, { error: "method_not_allowed" }) : null;
|
|
156875
|
+
if (accountPath && crossSiteAccountWrite(request, url)) return CROSS_SITE();
|
|
156876
|
+
if (path2 === "/v1/__webwix/account/short-link") {
|
|
156877
|
+
const b2 = await request.json().catch(() => ({}));
|
|
156878
|
+
const shortId = String(b2.shortId ?? "").trim();
|
|
156879
|
+
if (!inviteShortLinkUrl(shortId)) return json4(400, { error: "webwix_short_link_bad_id" });
|
|
156880
|
+
const landed = await resolveInviteShortLink(shortId, ctx.fetchImpl);
|
|
156881
|
+
return landed ? json4(200, { url: landed }) : json4(404, { error: "webwix_short_link_unresolved" });
|
|
156882
|
+
}
|
|
156883
|
+
const cookie = accountCookie(request);
|
|
156884
|
+
const expired = (e2) => {
|
|
156885
|
+
if (e2 instanceof AccountSessionExpired) ctx.instances.forgetSession(cookie);
|
|
156886
|
+
};
|
|
156887
|
+
if (path2 === "/v1/__webwix/account/member-session") {
|
|
156888
|
+
if (!cookie) return json4(401, { error: "webwix_account_signed_out" });
|
|
156889
|
+
const b2 = await request.json().catch(() => ({}));
|
|
156890
|
+
const metaSiteId = String(b2.metaSiteId ?? "").trim();
|
|
156891
|
+
if (!isSafeMsid(metaSiteId)) return json4(400, { error: "webwix_account_bad_site_id" });
|
|
156892
|
+
try {
|
|
156893
|
+
return json4(200, { sessionToken: await mintMemberSessionToken(cookie, metaSiteId, ctx.fetchImpl) });
|
|
156894
|
+
} catch (e2) {
|
|
156895
|
+
expired(e2);
|
|
156896
|
+
const refusal = memberSessionRefusal(e2);
|
|
156897
|
+
return json4(refusal.status, refusal.body);
|
|
156898
|
+
}
|
|
156899
|
+
}
|
|
156900
|
+
if (ctx.namedApp !== hostApp) return null;
|
|
156901
|
+
const envelope = await request.clone().json().catch(() => null);
|
|
156902
|
+
if (!envelope || envelope.ownerMsid !== void 0 || envelope.checkOwnerSession !== void 0) return null;
|
|
156903
|
+
const method = String(envelope.method ?? "GET").toUpperCase();
|
|
156904
|
+
const target = String((path2 === "/v1/__webwix/stream" ? envelope.url : envelope.path) ?? "");
|
|
156905
|
+
const forwarded = normalizeWixForwardedHeaders(envelope.headers, target);
|
|
156906
|
+
const siteId = Object.entries(forwarded).find(([name]) => name.toLowerCase() === "wix-site-id")?.[1]?.trim() ?? "";
|
|
156907
|
+
const body = envelope.body === void 0 ? void 0 : typeof envelope.body === "string" ? envelope.body : JSON.stringify(envelope.body);
|
|
156908
|
+
const refuse7 = (e2) => {
|
|
156909
|
+
expired(e2);
|
|
156910
|
+
if (e2 instanceof NotSiteMember || e2 instanceof SiteInstanceUnavailable || e2 instanceof AccountSessionExpired) {
|
|
156911
|
+
const refusal = memberInstanceRefusal(e2);
|
|
156912
|
+
return json4(refusal.status, refusal.body);
|
|
156913
|
+
}
|
|
156914
|
+
return json4(502, { error: "webwix_bridge_upstream_failed" });
|
|
156915
|
+
};
|
|
156916
|
+
if (path2 === "/v1/__webwix/stream") {
|
|
156917
|
+
if (!siteId) return null;
|
|
156918
|
+
if (crossSiteAccountWrite(request, url)) return CROSS_SITE();
|
|
156919
|
+
if (!cookie) return json4(401, { error: "webwix_account_signed_out" });
|
|
156920
|
+
if (!isSafeMsid(siteId)) return json4(400, { error: "webwix_account_bad_site_id" });
|
|
156921
|
+
if (method !== "GET" && method !== "POST") return json4(400, { error: "invalid_stream_method" });
|
|
156922
|
+
const url2 = /^https:\/\//i.test(target) ? target : `https://www.wixapis.com${target.startsWith("/") ? target : `/${target}`}`;
|
|
156923
|
+
if (!isAllowedConsumerStreamTarget(url2)) return json4(400, { error: "invalid_stream_target" });
|
|
156924
|
+
const send3 = async (force) => fetchStream(ctx, url2, method, body, forwarded, await ctx.instances.instance(siteId, cookie, { force }));
|
|
156925
|
+
let upstream;
|
|
156926
|
+
try {
|
|
156927
|
+
upstream = await send3(false);
|
|
156928
|
+
if (upstream.status === 401) {
|
|
156929
|
+
try {
|
|
156930
|
+
await upstream.body?.cancel();
|
|
156931
|
+
} catch {
|
|
156932
|
+
}
|
|
156933
|
+
upstream = await send3(true);
|
|
156934
|
+
}
|
|
156935
|
+
} catch (e2) {
|
|
156936
|
+
return refuse7(e2);
|
|
156937
|
+
}
|
|
156938
|
+
const headers2 = new Headers({ "cache-control": "no-store, no-transform" });
|
|
156939
|
+
for (const name of ["content-type", "retry-after"]) {
|
|
156940
|
+
const value = upstream.headers.get(name);
|
|
156941
|
+
if (value) headers2.set(name, value);
|
|
156942
|
+
}
|
|
156943
|
+
return new Response(upstream.body, { status: upstream.status, headers: headers2 });
|
|
156944
|
+
}
|
|
156945
|
+
const absolute = /^[a-z][a-z0-9+.-]*:\/\//i.test(target);
|
|
156946
|
+
const allowed2 = absolute && !!allowedAccountTarget(method, target);
|
|
156947
|
+
if (!allowed2 && (absolute || !siteId)) return null;
|
|
156948
|
+
if (crossSiteAccountWrite(request, url)) return CROSS_SITE();
|
|
156949
|
+
if (!cookie) return json4(401, { error: "webwix_account_signed_out" });
|
|
156950
|
+
if (siteId && !isSafeMsid(siteId)) return json4(400, { error: "webwix_account_bad_site_id" });
|
|
156951
|
+
const send2 = async (force) => {
|
|
156952
|
+
const instance = siteId ? await ctx.instances.instance(siteId, cookie, { force }) : void 0;
|
|
156953
|
+
return allowed2 ? wixAccountCall(method, target, body, cookie, ctx.fetchImpl, forwarded, instance) : wixVisitorCall(method, target, body, instance ?? "", ctx.fetchImpl, forwarded);
|
|
156954
|
+
};
|
|
156955
|
+
try {
|
|
156956
|
+
let result = await send2(false);
|
|
156957
|
+
if (result.status === 401 && siteId) result = await send2(true);
|
|
156958
|
+
if (result.status >= 200 && result.status < 300 && isAccountJoinCall(method, target)) ctx.instances.forgetRefusals(cookie);
|
|
156959
|
+
return json4(200, result);
|
|
156960
|
+
} catch (e2) {
|
|
156961
|
+
return refuse7(e2);
|
|
156962
|
+
}
|
|
156963
|
+
}
|
|
156964
|
+
function fetchStream(ctx, url, method, body, forwarded, instance) {
|
|
156965
|
+
const headers2 = { ...forwarded, Accept: "text/event-stream", Authorization: instance };
|
|
156966
|
+
if (body !== void 0) headers2["Content-Type"] ??= "application/json";
|
|
156967
|
+
return ctx.fetchImpl(url, { method, headers: headers2, body: method === "GET" ? void 0 : body, redirect: "manual", signal: ctx.request.signal });
|
|
156968
|
+
}
|
|
156969
|
+
var ACCOUNT_RUNG_PATHS, JSON_CT2, NO_STORE, CROSS_SITE;
|
|
156970
|
+
var init_account_rung = __esm({
|
|
156971
|
+
"../../core/serve/src/account-rung.ts"() {
|
|
156972
|
+
init_sha256();
|
|
156973
|
+
init_wix_bridge();
|
|
156974
|
+
init_wix_member_auth();
|
|
156975
|
+
ACCOUNT_RUNG_PATHS = /* @__PURE__ */ new Set([
|
|
156976
|
+
"/v1/__webwix/account/login",
|
|
156977
|
+
"/v1/__webwix/account/callback",
|
|
156978
|
+
"/v1/__webwix/account/member-session",
|
|
156979
|
+
"/v1/__webwix/account/short-link"
|
|
156980
|
+
]);
|
|
156981
|
+
JSON_CT2 = "application/json; charset=utf-8";
|
|
156982
|
+
NO_STORE = { "cache-control": "no-store" };
|
|
156983
|
+
CROSS_SITE = () => json4(403, { error: "webwix_account_cross_site" });
|
|
156984
|
+
}
|
|
156985
|
+
});
|
|
156986
|
+
|
|
156987
|
+
// ../../core/serve/src/server.ts
|
|
156988
|
+
function json5(status, body, headers2 = {}) {
|
|
156989
|
+
return new Response(JSON.stringify(body), { status, headers: { "content-type": JSON_CT3, ...headers2 } });
|
|
156523
156990
|
}
|
|
156524
156991
|
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;
|
|
156992
|
+
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
156993
|
}
|
|
156527
156994
|
function webwixCallLog(served, status) {
|
|
156528
156995
|
const directRung = served.rung === "visitor" || served.rung === "owner";
|
|
@@ -156545,6 +157012,7 @@ function makeServeHandler(opts) {
|
|
|
156545
157012
|
const webwixFetch = opts.webwixFetch ?? fetch;
|
|
156546
157013
|
const webwixOwnerInstances = new OwnerInstanceCache(webwixFetch);
|
|
156547
157014
|
const webwixOwnerSites = new OwnerSitesCache(webwixFetch);
|
|
157015
|
+
const webwixAccountInstances = new MemberInstanceCache(webwixFetch);
|
|
156548
157016
|
const webwixOwnerRungOn = () => opts.webwixOwnerRung !== false;
|
|
156549
157017
|
const memberAuthOn = () => opts.webwixMemberAuth === true && !!opts.webwixMemberSessions && !!opts.webwixMemberAppForHost;
|
|
156550
157018
|
const memberSessions = () => opts.webwixMemberSessions ?? null;
|
|
@@ -156661,12 +157129,12 @@ ${releaseId}`;
|
|
|
156661
157129
|
const denied2 = await authorizePinnedRead(request, url, app, pin);
|
|
156662
157130
|
if (denied2) return { ok: false, response: denied2 };
|
|
156663
157131
|
const m2 = await pinnedManifest(app, pin);
|
|
156664
|
-
if (!m2) return { ok: false, response:
|
|
157132
|
+
if (!m2) return { ok: false, response: json5(404, { error: "release_not_found", app, releaseId: pin }) };
|
|
156665
157133
|
bytes2 = m2.appConfigHash ? await pinnedBody(app, m2.appConfigHash, () => store.getAppConfig(app)) : null;
|
|
156666
157134
|
} else {
|
|
156667
157135
|
bytes2 = await store.getAppConfig(app);
|
|
156668
157136
|
}
|
|
156669
|
-
if (!bytes2) return { ok: false, response:
|
|
157137
|
+
if (!bytes2) return { ok: false, response: json5(404, { error: "app_config_not_found", app }) };
|
|
156670
157138
|
return { ok: true, bytes: bytes2 };
|
|
156671
157139
|
}
|
|
156672
157140
|
function resolveApp(request, url) {
|
|
@@ -156679,7 +157147,7 @@ ${releaseId}`;
|
|
|
156679
157147
|
if (request.headers.get("if-none-match") === etag) {
|
|
156680
157148
|
return new Response(null, { status: 304, headers: { etag, "cache-control": cache, ...vary } });
|
|
156681
157149
|
}
|
|
156682
|
-
return new Response(body, { status: 200, headers: { "content-type":
|
|
157150
|
+
return new Response(body, { status: 200, headers: { "content-type": JSON_CT3, etag, "cache-control": cache, ...vary } });
|
|
156683
157151
|
}
|
|
156684
157152
|
async function authorizePinnedRead(request, url, app, releaseId, screenId) {
|
|
156685
157153
|
const denied2 = await checkPinnedRead({
|
|
@@ -156692,7 +157160,7 @@ ${releaseId}`;
|
|
|
156692
157160
|
authorizePreview: opts.authorizePreview,
|
|
156693
157161
|
authorizeFollow: opts.authorizeFollow
|
|
156694
157162
|
});
|
|
156695
|
-
return denied2 &&
|
|
157163
|
+
return denied2 && json5(denied2.status, denied2.body);
|
|
156696
157164
|
}
|
|
156697
157165
|
async function honourRingPin(request) {
|
|
156698
157166
|
const kept = { request, dropped: false };
|
|
@@ -156774,30 +157242,59 @@ ${releaseId}`;
|
|
|
156774
157242
|
const control = b2.control ?? b2;
|
|
156775
157243
|
if (control && Object.keys(control).length) devControlOverlay.set(dcApp, control);
|
|
156776
157244
|
else devControlOverlay.delete(dcApp);
|
|
156777
|
-
return
|
|
157245
|
+
return json5(200, { ok: true, app: dcApp });
|
|
157246
|
+
}
|
|
157247
|
+
}
|
|
157248
|
+
if (opts.webwixAccountRung && opts.webwixBridge !== false) {
|
|
157249
|
+
const accountRung = opts.webwixAccountRung;
|
|
157250
|
+
const answered = await handleAccountRung(accountRung, {
|
|
157251
|
+
request,
|
|
157252
|
+
url,
|
|
157253
|
+
path: path2,
|
|
157254
|
+
fetchImpl: webwixFetch,
|
|
157255
|
+
instances: webwixAccountInstances,
|
|
157256
|
+
namedApp: resolveApp(request, url),
|
|
157257
|
+
publicBase: callbackUrlFor(url).slice(0, -MEMBER_CALLBACK_PATH.length),
|
|
157258
|
+
webwixDirect: async () => opts.webwixDirect ? await opts.webwixDirect() === true : opts.webwixBridge !== false,
|
|
157259
|
+
isAccountApp: async (app2) => {
|
|
157260
|
+
const cfg = await appConfigFor(request, url, app2);
|
|
157261
|
+
if (!cfg.ok) return false;
|
|
157262
|
+
const auth = JSON.parse(utf8Decode(cfg.bytes))?.authConfig;
|
|
157263
|
+
return !!auth && auth.required === true && auth.providerId === "wix-native" && auth.config?.mode === "account";
|
|
157264
|
+
}
|
|
157265
|
+
});
|
|
157266
|
+
if (answered) {
|
|
157267
|
+
if (path2 === "/v1/__webwix/call") {
|
|
157268
|
+
const app2 = resolveApp(request, url);
|
|
157269
|
+
try {
|
|
157270
|
+
opts.onWebwixCall?.(webwixCallLog({ rung: "account", ...app2 ? { app: app2 } : {} }, answered.status));
|
|
157271
|
+
} catch {
|
|
157272
|
+
}
|
|
157273
|
+
}
|
|
157274
|
+
return answered;
|
|
156778
157275
|
}
|
|
156779
157276
|
}
|
|
156780
157277
|
const memberRungApp = memberAuthOn() ? memberApp(request) : null;
|
|
156781
157278
|
if (memberRungApp && (path2 === "/v1/__webwix/login" || path2 === "/v1/__webwix/register" || path2 === MEMBER_CALLBACK_PATH || path2 === "/v1/__webwix/logout")) {
|
|
156782
157279
|
const store2 = memberSessions();
|
|
156783
|
-
if (!store2) return
|
|
157280
|
+
if (!store2) return json5(503, { error: "member_auth_unconfigured" });
|
|
156784
157281
|
const sessionId = readSessionCookie(request.headers.get("cookie"));
|
|
156785
157282
|
if (path2 === "/v1/__webwix/logout") {
|
|
156786
|
-
if (request.method !== "POST") return
|
|
157283
|
+
if (request.method !== "POST") return json5(405, { error: "method_not_allowed" });
|
|
156787
157284
|
if (sessionId) await store2.delete(sessionId);
|
|
156788
|
-
return
|
|
157285
|
+
return json5(200, { ok: true }, { "set-cookie": clearSessionCookie(), "cache-control": "no-store" });
|
|
156789
157286
|
}
|
|
156790
157287
|
if (path2 === MEMBER_CALLBACK_PATH) {
|
|
156791
|
-
if (request.method !== "GET") return
|
|
157288
|
+
if (request.method !== "GET") return json5(405, { error: "method_not_allowed" });
|
|
156792
157289
|
const code = url.searchParams.get("code");
|
|
156793
157290
|
const state2 = url.searchParams.get("state");
|
|
156794
157291
|
if (!code) {
|
|
156795
|
-
if (url.searchParams.has("nohash")) return
|
|
157292
|
+
if (url.searchParams.has("nohash")) return json5(400, { error: "member_auth_no_code" });
|
|
156796
157293
|
return fragmentBounceResponse();
|
|
156797
157294
|
}
|
|
156798
157295
|
const pending = sessionId ? await store2.get(sessionId) : null;
|
|
156799
157296
|
if (!pending || pending.kind !== "pending" || pending.state !== state2) {
|
|
156800
|
-
return
|
|
157297
|
+
return json5(400, { error: "member_auth_state_mismatch" });
|
|
156801
157298
|
}
|
|
156802
157299
|
const app3 = pending.app;
|
|
156803
157300
|
await store2.delete(sessionId);
|
|
@@ -156806,10 +157303,10 @@ ${releaseId}`;
|
|
|
156806
157303
|
try {
|
|
156807
157304
|
({ memberToken, expiresInSec } = await exchangeAuthCode(pending.auth, code, pending.verifier, webwixFetch));
|
|
156808
157305
|
} catch (e2) {
|
|
156809
|
-
return
|
|
157306
|
+
return json5(502, { error: "member_auth_exchange_failed", app: app3, detail: String(e2?.message ?? e2).slice(0, 120) });
|
|
156810
157307
|
}
|
|
156811
157308
|
const ttlMs = Math.min(MEMBER_SESSION_TTL_MS, (expiresInSec - 60) * 1e3);
|
|
156812
|
-
if (ttlMs <= 0) return
|
|
157309
|
+
if (ttlMs <= 0) return json5(502, { error: "member_auth_session_too_short", app: app3 });
|
|
156813
157310
|
const freshId = randomToken(32);
|
|
156814
157311
|
await store2.put(freshId, {
|
|
156815
157312
|
kind: "member",
|
|
@@ -156829,17 +157326,17 @@ ${releaseId}`;
|
|
|
156829
157326
|
}
|
|
156830
157327
|
const app2 = memberRungApp;
|
|
156831
157328
|
if (request.method === "POST") {
|
|
156832
|
-
return
|
|
157329
|
+
return json5(501, {
|
|
156833
157330
|
error: "member_password_login_unsupported",
|
|
156834
157331
|
app: app2,
|
|
156835
157332
|
detail: "Sign in through GET /v1/__webwix/login \u2014 the serve plane never accepts a password."
|
|
156836
157333
|
});
|
|
156837
157334
|
}
|
|
156838
|
-
if (request.method !== "GET") return
|
|
157335
|
+
if (request.method !== "GET") return json5(405, { error: "method_not_allowed" });
|
|
156839
157336
|
const cfg = await appConfigFor(request, url, app2);
|
|
156840
157337
|
if (!cfg.ok) return cfg.response;
|
|
156841
157338
|
const resolved2 = wixMemberAuthOf(utf8Decode(cfg.bytes), callbackUrlFor(url));
|
|
156842
|
-
if (!resolved2.ok) return
|
|
157339
|
+
if (!resolved2.ok) return json5(501, { error: `member_auth_${resolved2.error}`, app: app2 });
|
|
156843
157340
|
const returnTo = safeReturnPath(url.searchParams.get("return"), `/preview/a/${encodeURIComponent(app2)}`);
|
|
156844
157341
|
const state = randomToken(16);
|
|
156845
157342
|
const pkce = await generatePkce();
|
|
@@ -156852,7 +157349,7 @@ ${releaseId}`;
|
|
|
156852
157349
|
webwixFetch
|
|
156853
157350
|
);
|
|
156854
157351
|
} catch (e2) {
|
|
156855
|
-
return
|
|
157352
|
+
return json5(502, { error: "member_auth_unavailable", app: app2, detail: String(e2?.message ?? e2).slice(0, 120) });
|
|
156856
157353
|
}
|
|
156857
157354
|
if (sessionId) await store2.delete(sessionId);
|
|
156858
157355
|
const pendingId = randomToken(32);
|
|
@@ -156875,7 +157372,7 @@ ${releaseId}`;
|
|
|
156875
157372
|
});
|
|
156876
157373
|
}
|
|
156877
157374
|
if ((request.method === "GET" || request.method === "HEAD") && path2 === "/v1/__webwix/identity") {
|
|
156878
|
-
const headers2 = { "content-type":
|
|
157375
|
+
const headers2 = { "content-type": JSON_CT3, "cache-control": "no-store" };
|
|
156879
157376
|
if (request.method === "HEAD") return new Response(null, { status: 200, headers: headers2 });
|
|
156880
157377
|
const webwixDirect = opts.webwixDirect ? await opts.webwixDirect() === true : opts.webwixBridge !== false;
|
|
156881
157378
|
if (memberAuthOn()) {
|
|
@@ -156883,35 +157380,35 @@ ${releaseId}`;
|
|
|
156883
157380
|
const store2 = memberSessions();
|
|
156884
157381
|
if (app2 && store2) {
|
|
156885
157382
|
const token = await memberTokenFor(store2, readSessionCookie(request.headers.get("cookie")), app2, null);
|
|
156886
|
-
if (token) return
|
|
157383
|
+
if (token) return json5(200, { authenticated: true, userId: null, email: null, webwixDirect }, { "cache-control": "no-store" });
|
|
156887
157384
|
}
|
|
156888
157385
|
}
|
|
156889
|
-
return
|
|
157386
|
+
return json5(200, { authenticated: false, userId: null, email: null, webwixDirect }, { "cache-control": "no-store" });
|
|
156890
157387
|
}
|
|
156891
157388
|
if (request.method === "POST" && path2 === "/v1/__webwix/stream") {
|
|
156892
|
-
if (opts.webwixBridge === false) return
|
|
157389
|
+
if (opts.webwixBridge === false) return json5(503, { error: "webwix_bridge_disabled" }, { "cache-control": "no-store" });
|
|
156893
157390
|
const app2 = resolveApp(request, url);
|
|
156894
157391
|
const hostApp = memberApp(request);
|
|
156895
|
-
if (!app2) return
|
|
156896
|
-
if (!hostApp || app2 !== hostApp) return
|
|
157392
|
+
if (!app2) return json5(400, { error: "app_required" }, { "cache-control": "no-store" });
|
|
157393
|
+
if (!hostApp || app2 !== hostApp) return json5(403, { error: "webwix_stream_host_mismatch" }, { "cache-control": "no-store" });
|
|
156897
157394
|
const resolvedCfg = await appConfigFor(request, url, app2);
|
|
156898
157395
|
if (!resolvedCfg.ok) return resolvedCfg.response;
|
|
156899
157396
|
let call;
|
|
156900
157397
|
try {
|
|
156901
157398
|
call = await request.json();
|
|
156902
157399
|
} catch {
|
|
156903
|
-
return
|
|
157400
|
+
return json5(400, { error: "invalid_json" }, { "cache-control": "no-store" });
|
|
156904
157401
|
}
|
|
156905
157402
|
const method = String(call.method ?? "GET").toUpperCase();
|
|
156906
|
-
if (method !== "GET" && method !== "POST") return
|
|
157403
|
+
if (method !== "GET" && method !== "POST") return json5(400, { error: "invalid_stream_method" }, { "cache-control": "no-store" });
|
|
156907
157404
|
const rawTarget = String(call.url ?? "");
|
|
156908
157405
|
const target = /^https:\/\//i.test(rawTarget) ? rawTarget : `https://www.wixapis.com${rawTarget.startsWith("/") ? rawTarget : `/${rawTarget}`}`;
|
|
156909
|
-
if (!isAllowedConsumerStreamTarget(target)) return
|
|
157406
|
+
if (!isAllowedConsumerStreamTarget(target)) return json5(400, { error: "invalid_stream_target" }, { "cache-control": "no-store" });
|
|
156910
157407
|
const cfg = wixMemberAuthOf(utf8Decode(resolvedCfg.bytes), callbackUrlFor(url));
|
|
156911
|
-
if (!cfg.ok) return
|
|
157408
|
+
if (!cfg.ok) return json5(501, { error: "webwix_visitor_direct_only", app: app2 }, { "cache-control": "no-store" });
|
|
156912
157409
|
const store2 = memberSessions();
|
|
156913
157410
|
const token = memberAuthOn() && store2 ? await memberTokenFor(store2, readSessionCookie(request.headers.get("cookie")), hostApp, cfg.config.clientId) : null;
|
|
156914
|
-
if (!token) return
|
|
157411
|
+
if (!token) return json5(501, { error: "webwix_visitor_direct_only", app: app2 }, { "cache-control": "no-store" });
|
|
156915
157412
|
const headers2 = normalizeWixForwardedHeaders(call.headers);
|
|
156916
157413
|
headers2.Accept = "text/event-stream";
|
|
156917
157414
|
headers2.Authorization = token;
|
|
@@ -156921,7 +157418,7 @@ ${releaseId}`;
|
|
|
156921
157418
|
try {
|
|
156922
157419
|
upstream = await webwixFetch(target, { method, headers: headers2, body: method === "GET" ? void 0 : body, redirect: "manual", signal: request.signal });
|
|
156923
157420
|
} catch {
|
|
156924
|
-
return
|
|
157421
|
+
return json5(502, { error: "webwix_stream_upstream_failed" }, { "cache-control": "no-store" });
|
|
156925
157422
|
}
|
|
156926
157423
|
const responseHeaders = new Headers({ "cache-control": "no-store, no-transform" });
|
|
156927
157424
|
for (const name of ["content-type", "retry-after"]) {
|
|
@@ -156936,10 +157433,10 @@ ${releaseId}`;
|
|
|
156936
157433
|
try {
|
|
156937
157434
|
const res = await (async () => {
|
|
156938
157435
|
if (opts.webwixBridge === false) {
|
|
156939
|
-
return
|
|
157436
|
+
return json5(503, { error: "webwix_bridge_disabled" });
|
|
156940
157437
|
}
|
|
156941
157438
|
const app2 = resolveApp(request, url);
|
|
156942
|
-
if (!app2) return
|
|
157439
|
+
if (!app2) return json5(400, { error: "app_required" });
|
|
156943
157440
|
const resolvedCfg = await appConfigFor(request, url, app2);
|
|
156944
157441
|
if (!resolvedCfg.ok) return resolvedCfg.response;
|
|
156945
157442
|
served.app = app2;
|
|
@@ -156948,35 +157445,35 @@ ${releaseId}`;
|
|
|
156948
157445
|
try {
|
|
156949
157446
|
call = await request.json();
|
|
156950
157447
|
} catch {
|
|
156951
|
-
return
|
|
157448
|
+
return json5(400, { error: "invalid_json" });
|
|
156952
157449
|
}
|
|
156953
157450
|
served.fallback = call.fallback === true;
|
|
156954
157451
|
if (call.checkOwnerSession !== void 0 && (typeof call.checkOwnerSession !== "boolean" || call.checkOwnerSession && call.ownerMsid === void 0)) {
|
|
156955
|
-
return
|
|
157452
|
+
return json5(400, { error: "invalid_owner_session_check" });
|
|
156956
157453
|
}
|
|
156957
157454
|
const method = String(call.method ?? "GET").toUpperCase();
|
|
156958
157455
|
const reqPath = String(call.path ?? "/");
|
|
156959
157456
|
const body = call.body === void 0 ? void 0 : typeof call.body === "string" ? call.body : JSON.stringify(call.body);
|
|
156960
157457
|
const forwardedHeaders = normalizeWixForwardedHeaders(call.headers);
|
|
156961
157458
|
if (/^[a-z][a-z0-9+.-]*:\/\//i.test(reqPath)) {
|
|
156962
|
-
return absoluteUrlRejection(reqPath) === "owner-only" ?
|
|
157459
|
+
return absoluteUrlRejection(reqPath) === "owner-only" ? json5(501, { error: "webwix_owner_only", app: app2 }) : json5(400, { error: "absolute_urls_not_allowed" });
|
|
156963
157460
|
}
|
|
156964
157461
|
const callerCookie = request.headers.get("cookie") ?? "";
|
|
156965
157462
|
if (!call.checkOwnerSession && webwixOwnerRungOn() && method === "POST" && isOwnerSitesPath(reqPath) && !/wixSession2=/.test(callerCookie)) {
|
|
156966
157463
|
served.rung = "sites";
|
|
156967
|
-
return
|
|
157464
|
+
return json5(501, { error: "webwix_owner_no_session", app: app2 });
|
|
156968
157465
|
}
|
|
156969
157466
|
if (!call.checkOwnerSession && webwixOwnerRungOn() && method === "POST" && isOwnerSitesPath(reqPath) && /wixSession2=/.test(callerCookie)) {
|
|
156970
157467
|
served.rung = "sites";
|
|
156971
157468
|
try {
|
|
156972
157469
|
const envelope = await wixOwnerSitesCall(reqPath, callerCookie, body, webwixFetch);
|
|
156973
|
-
if (envelope.status >= 200 && envelope.status < 300) return
|
|
156974
|
-
return
|
|
157470
|
+
if (envelope.status >= 200 && envelope.status < 300) return json5(200, envelope);
|
|
157471
|
+
return json5(200, {
|
|
156975
157472
|
status: 501,
|
|
156976
157473
|
body: JSON.stringify({ error: "webwix_owner_sites_failed", upstream: envelope.status })
|
|
156977
157474
|
});
|
|
156978
157475
|
} catch (e2) {
|
|
156979
|
-
return
|
|
157476
|
+
return json5(200, {
|
|
156980
157477
|
status: 501,
|
|
156981
157478
|
body: JSON.stringify({ error: "webwix_owner_sites_failed", detail: String(e2?.message ?? e2).slice(0, 200) })
|
|
156982
157479
|
});
|
|
@@ -156984,12 +157481,12 @@ ${releaseId}`;
|
|
|
156984
157481
|
}
|
|
156985
157482
|
if (call.ownerMsid !== void 0) {
|
|
156986
157483
|
served.rung = call.checkOwnerSession === true ? "gate" : "owner";
|
|
156987
|
-
if (!webwixOwnerRungOn()) return
|
|
156988
|
-
return
|
|
157484
|
+
if (!webwixOwnerRungOn()) return json5(503, { error: "webwix_owner_disabled" });
|
|
157485
|
+
return json5(501, { error: "webwix_owner_direct_only", app: app2 });
|
|
156989
157486
|
}
|
|
156990
157487
|
const resolved2 = wixClientIdOf(utf8Decode(cfgBytes));
|
|
156991
157488
|
if ("error" in resolved2) {
|
|
156992
|
-
return
|
|
157489
|
+
return json5(501, { error: `webwix_bridge_${resolved2.error}`, app: app2 });
|
|
156993
157490
|
}
|
|
156994
157491
|
served.rung = "visitor";
|
|
156995
157492
|
const memberStore = memberSessions();
|
|
@@ -157000,13 +157497,13 @@ ${releaseId}`;
|
|
|
157000
157497
|
if (memberToken) {
|
|
157001
157498
|
served.rung = "member";
|
|
157002
157499
|
try {
|
|
157003
|
-
return
|
|
157500
|
+
return json5(200, await wixVisitorCall(method, reqPath, body, memberToken, webwixFetch, forwardedHeaders), { "cache-control": "no-store" });
|
|
157004
157501
|
} catch (e2) {
|
|
157005
|
-
return
|
|
157502
|
+
return json5(502, { error: "webwix_bridge_upstream_failed", detail: String(e2?.message ?? e2).slice(0, 200) });
|
|
157006
157503
|
}
|
|
157007
157504
|
}
|
|
157008
157505
|
}
|
|
157009
|
-
return
|
|
157506
|
+
return json5(501, { error: "webwix_visitor_direct_only", app: app2 });
|
|
157010
157507
|
})();
|
|
157011
157508
|
status = res.status;
|
|
157012
157509
|
return res;
|
|
@@ -157017,8 +157514,8 @@ ${releaseId}`;
|
|
|
157017
157514
|
}
|
|
157018
157515
|
}
|
|
157019
157516
|
}
|
|
157020
|
-
if (request.method !== "GET") return
|
|
157021
|
-
if (path2 === "/__health") return
|
|
157517
|
+
if (request.method !== "GET") return json5(405, { error: "method_not_allowed" });
|
|
157518
|
+
if (path2 === "/__health") return json5(200, { ok: true });
|
|
157022
157519
|
const packageShare = /^\/p\/([a-f0-9]{64})$/.exec(path2);
|
|
157023
157520
|
if (packageShare) {
|
|
157024
157521
|
const shareId = packageShare[1];
|
|
@@ -157027,8 +157524,8 @@ ${releaseId}`;
|
|
|
157027
157524
|
const wantsHtml = (request.headers.get("accept") ?? "").includes("text/html");
|
|
157028
157525
|
if (wantsMetadata || wantsHtml && !wantsDownload) {
|
|
157029
157526
|
const share = await resolvePackageShareMetadata(await getStore(), shareId);
|
|
157030
|
-
if (!share) return
|
|
157031
|
-
if (wantsMetadata) return
|
|
157527
|
+
if (!share) return json5(404, { error: "package_share_not_found" });
|
|
157528
|
+
if (wantsMetadata) return json5(200, share, { "cache-control": "no-store" });
|
|
157032
157529
|
const title = share.app.replace(/[<>&"]/g, "");
|
|
157033
157530
|
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
157531
|
status: 200,
|
|
@@ -157036,7 +157533,7 @@ ${releaseId}`;
|
|
|
157036
157533
|
});
|
|
157037
157534
|
}
|
|
157038
157535
|
const found = await resolvePackageShare(await getStore(), shareId);
|
|
157039
|
-
if (!found) return
|
|
157536
|
+
if (!found) return json5(404, { error: "package_share_not_found" });
|
|
157040
157537
|
return new Response(found.archive, {
|
|
157041
157538
|
status: 200,
|
|
157042
157539
|
headers: {
|
|
@@ -157049,46 +157546,46 @@ ${releaseId}`;
|
|
|
157049
157546
|
});
|
|
157050
157547
|
}
|
|
157051
157548
|
if (path2 === "/v1/owner/instance") {
|
|
157052
|
-
if (opts.webwixBridge === false) return
|
|
157549
|
+
if (opts.webwixBridge === false) return json5(503, { error: "webwix_bridge_disabled" });
|
|
157053
157550
|
const gateApp = url.searchParams.get("app");
|
|
157054
157551
|
if (gateApp) {
|
|
157055
157552
|
const cfg = await appConfigFor(request, url, gateApp);
|
|
157056
157553
|
if (!cfg.ok) return cfg.response;
|
|
157057
157554
|
}
|
|
157058
|
-
if (!webwixOwnerRungOn()) return
|
|
157555
|
+
if (!webwixOwnerRungOn()) return json5(503, { error: "webwix_owner_disabled" });
|
|
157059
157556
|
const msid = url.searchParams.get("msid") ?? "";
|
|
157060
|
-
if (!isSafeMsid(msid)) return
|
|
157557
|
+
if (!isSafeMsid(msid)) return json5(400, { error: "webwix_owner_bad_msid" });
|
|
157061
157558
|
const cookie = request.headers.get("cookie") ?? "";
|
|
157062
|
-
if (!/wixSession2=/.test(cookie)) return
|
|
157559
|
+
if (!/wixSession2=/.test(cookie)) return json5(401, { error: "webwix_owner_no_session" });
|
|
157063
157560
|
const renew = url.searchParams.get("renew") === "1";
|
|
157064
157561
|
try {
|
|
157065
157562
|
const entry = await webwixOwnerInstances.entry(msid, cookie, Date.now(), { renew });
|
|
157066
|
-
return
|
|
157563
|
+
return json5(200, { ...entry, expiresInMs: Math.max(0, entry.expiresAt - Date.now()) }, { "cache-control": "no-store" });
|
|
157067
157564
|
} catch (e2) {
|
|
157068
157565
|
const msg = String(e2?.message ?? e2);
|
|
157069
|
-
if (/owner mint failed \(5\d\d\)/.test(msg) || !msg.includes("owner mint failed")) return
|
|
157070
|
-
return
|
|
157566
|
+
if (/owner mint failed \(5\d\d\)/.test(msg) || !msg.includes("owner mint failed")) return json5(502, { error: "webwix_bridge_upstream_failed" });
|
|
157567
|
+
return json5(403, { error: "webwix_owner_mint_failed" });
|
|
157071
157568
|
}
|
|
157072
157569
|
}
|
|
157073
157570
|
if (path2 === "/v1/owner/sites") {
|
|
157074
|
-
if (!webwixOwnerRungOn()) return
|
|
157571
|
+
if (!webwixOwnerRungOn()) return json5(503, { error: "webwix_owner_disabled" });
|
|
157075
157572
|
const cookie = request.headers.get("cookie") ?? "";
|
|
157076
|
-
if (!/wixSession2=/.test(cookie)) return
|
|
157573
|
+
if (!/wixSession2=/.test(cookie)) return json5(200, { sites: [] });
|
|
157077
157574
|
const limitParam = url.searchParams.get("limit");
|
|
157078
157575
|
const limitRaw = limitParam === null ? NaN : Number(limitParam);
|
|
157079
157576
|
const limit = Number.isFinite(limitRaw) ? Math.min(100, Math.max(1, Math.trunc(limitRaw))) : 50;
|
|
157080
157577
|
try {
|
|
157081
|
-
return
|
|
157578
|
+
return json5(200, { sites: await webwixOwnerSites.sites(cookie, limit) });
|
|
157082
157579
|
} catch (e2) {
|
|
157083
|
-
return
|
|
157580
|
+
return json5(501, { error: "webwix_owner_sites_failed", detail: String(e2?.message ?? e2).slice(0, 120) });
|
|
157084
157581
|
}
|
|
157085
157582
|
}
|
|
157086
157583
|
const store = await getStore();
|
|
157087
157584
|
if (path2 === "/v1/apps") {
|
|
157088
157585
|
if (opts.authorizeList && !await opts.authorizeList(request)) {
|
|
157089
|
-
return
|
|
157586
|
+
return json5(401, { error: "unauthorized" });
|
|
157090
157587
|
}
|
|
157091
|
-
if (!store.listApps) return
|
|
157588
|
+
if (!store.listApps) return json5(501, { error: "listing_unsupported" });
|
|
157092
157589
|
const ids = await store.listApps();
|
|
157093
157590
|
const apps = [];
|
|
157094
157591
|
for (const id of ids) {
|
|
@@ -157148,14 +157645,14 @@ ${releaseId}`;
|
|
|
157148
157645
|
}
|
|
157149
157646
|
return new Response(listBody, {
|
|
157150
157647
|
status: 200,
|
|
157151
|
-
headers: { "content-type":
|
|
157648
|
+
headers: { "content-type": JSON_CT3, ...listHeaders }
|
|
157152
157649
|
});
|
|
157153
157650
|
}
|
|
157154
157651
|
if (path2 === "/v1/templates") {
|
|
157155
157652
|
if (opts.authorizeList && !await opts.authorizeList(request)) {
|
|
157156
|
-
return
|
|
157653
|
+
return json5(401, { error: "unauthorized" });
|
|
157157
157654
|
}
|
|
157158
|
-
if (!store.listApps) return
|
|
157655
|
+
if (!store.listApps) return json5(501, { error: "listing_unsupported" });
|
|
157159
157656
|
const ids = await store.listApps();
|
|
157160
157657
|
const templates = [];
|
|
157161
157658
|
for (const id of ids) {
|
|
@@ -157182,7 +157679,7 @@ ${releaseId}`;
|
|
|
157182
157679
|
});
|
|
157183
157680
|
}
|
|
157184
157681
|
templates.sort((a2, b2) => String(a2.name).localeCompare(String(b2.name)));
|
|
157185
|
-
return
|
|
157682
|
+
return json5(200, { templates });
|
|
157186
157683
|
}
|
|
157187
157684
|
const cfgMatch = /^\/v1\/app-config\/([^/]+)$/.exec(path2);
|
|
157188
157685
|
const app = cfgMatch?.[1] ?? resolveApp(request, url);
|
|
@@ -157192,12 +157689,12 @@ ${releaseId}`;
|
|
|
157192
157689
|
if (denied2) return denied2;
|
|
157193
157690
|
}
|
|
157194
157691
|
if (path2 === "/v1/template-source") {
|
|
157195
|
-
if (!app) return
|
|
157196
|
-
if (!store.getSource) return
|
|
157692
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157693
|
+
if (!store.getSource) return json5(501, { error: "templates_unsupported" });
|
|
157197
157694
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157198
|
-
if (!m2?.sourceHash) return
|
|
157695
|
+
if (!m2?.sourceHash) return json5(404, { error: "template_source_not_found", app });
|
|
157199
157696
|
const bytes2 = await store.getSource(app, m2.sourceHash);
|
|
157200
|
-
if (!bytes2) return
|
|
157697
|
+
if (!bytes2) return json5(404, { error: "template_source_not_found", app });
|
|
157201
157698
|
const etag = `"${m2.sourceHash}"`;
|
|
157202
157699
|
const cache = { "cache-control": pin ? PINNED_CACHE_CONTROL : DOC_CACHE_CONTROL, ...pin ? { vary: "x-himalaya-release" } : {} };
|
|
157203
157700
|
if (request.headers.get("if-none-match") === etag) {
|
|
@@ -157205,17 +157702,17 @@ ${releaseId}`;
|
|
|
157205
157702
|
}
|
|
157206
157703
|
return new Response(bytes2, {
|
|
157207
157704
|
status: 200,
|
|
157208
|
-
headers: { "content-type":
|
|
157705
|
+
headers: { "content-type": JSON_CT3, etag, ...cache, "x-himalaya-app": app }
|
|
157209
157706
|
});
|
|
157210
157707
|
}
|
|
157211
157708
|
if (path2 === "/v1/authoring-docs" || /^\/v1\/authoring-docs\/(spec|mobile-ux)$/.test(path2)) {
|
|
157212
|
-
if (!app) return
|
|
157709
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157213
157710
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157214
|
-
if (!m2) return
|
|
157711
|
+
if (!m2) return json5(404, { error: pin ? "release_not_found" : "no_release", app });
|
|
157215
157712
|
const docs = m2.authoringDocs ?? {};
|
|
157216
157713
|
const match = /^\/v1\/authoring-docs\/(spec|mobile-ux)$/.exec(path2);
|
|
157217
157714
|
if (!match) {
|
|
157218
|
-
return
|
|
157715
|
+
return json5(200, {
|
|
157219
157716
|
app,
|
|
157220
157717
|
releaseId: m2.releaseId,
|
|
157221
157718
|
docs: Object.entries(docs).map(([name2, doc]) => ({ name: name2, ...doc }))
|
|
@@ -157223,9 +157720,9 @@ ${releaseId}`;
|
|
|
157223
157720
|
}
|
|
157224
157721
|
const name = match[1];
|
|
157225
157722
|
const meta = docs[name];
|
|
157226
|
-
if (!meta) return
|
|
157723
|
+
if (!meta) return json5(404, { error: "authoring_doc_not_found", app, name });
|
|
157227
157724
|
const bytes2 = pin ? await pinnedBody(app, meta.sha256, () => Promise.resolve(null)) : store.getDoc ? await store.getDoc(app, meta.sha256) : null;
|
|
157228
|
-
if (!bytes2) return
|
|
157725
|
+
if (!bytes2) return json5(404, { error: "authoring_doc_not_found", app, name });
|
|
157229
157726
|
const etag = `"${meta.sha256}"`;
|
|
157230
157727
|
if (request.headers.get("if-none-match") === etag) {
|
|
157231
157728
|
return new Response(null, { status: 304, headers: { etag, "cache-control": pin ? PINNED_CACHE_CONTROL : DOC_CACHE_CONTROL, ...pin ? { vary: "x-himalaya-release" } : {} } });
|
|
@@ -157244,20 +157741,20 @@ ${releaseId}`;
|
|
|
157244
157741
|
if (path2 === "/v1/release/current") {
|
|
157245
157742
|
if (pin) {
|
|
157246
157743
|
const m3 = app ? await pinnedManifest(app, pin) : null;
|
|
157247
|
-
if (!m3) return
|
|
157248
|
-
return
|
|
157744
|
+
if (!m3) return json5(404, { error: "release_not_found", app, releaseId: pin });
|
|
157745
|
+
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
157746
|
}
|
|
157250
157747
|
const m2 = app ? await manifest(app) : null;
|
|
157251
|
-
if (!m2) return
|
|
157252
|
-
return
|
|
157748
|
+
if (!m2) return json5(404, { error: "no_release", app });
|
|
157749
|
+
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
157750
|
}
|
|
157254
157751
|
const bundleMatch = /^\/v1\/bundles\/([a-f0-9]{64})\.bundle\.js$/.exec(path2);
|
|
157255
157752
|
if (bundleMatch) {
|
|
157256
157753
|
const hash2 = bundleMatch[1];
|
|
157257
157754
|
const m2 = app ? pin ? await pinnedManifest(app, pin) : await manifest(app) : null;
|
|
157258
|
-
if (!m2 || !app) return
|
|
157755
|
+
if (!m2 || !app) return json5(404, { error: "no_release", app });
|
|
157259
157756
|
const bytes2 = await store.getBundle(app, hash2);
|
|
157260
|
-
if (!bytes2) return
|
|
157757
|
+
if (!bytes2) return json5(404, { error: "bundle_not_found", hash: hash2 });
|
|
157261
157758
|
const entry = Object.values(m2.bundles).find((b2) => b2.sha256 === hash2);
|
|
157262
157759
|
return new Response(bytes2, {
|
|
157263
157760
|
status: 200,
|
|
@@ -157269,27 +157766,27 @@ ${releaseId}`;
|
|
|
157269
157766
|
});
|
|
157270
157767
|
}
|
|
157271
157768
|
if (path2 === "/v1/boot") {
|
|
157272
|
-
if (!app) return
|
|
157769
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157273
157770
|
let m2;
|
|
157274
157771
|
if (pin) {
|
|
157275
157772
|
const denied2 = await authorizePinnedRead(request, url, app, pin);
|
|
157276
157773
|
if (denied2) return denied2;
|
|
157277
157774
|
m2 = await pinnedManifest(app, pin);
|
|
157278
|
-
if (!m2) return
|
|
157775
|
+
if (!m2) return json5(404, { error: "release_not_found", app, releaseId: pin });
|
|
157279
157776
|
} else {
|
|
157280
157777
|
m2 = await manifest(app);
|
|
157281
|
-
if (!m2) return
|
|
157778
|
+
if (!m2) return json5(404, { error: "app_not_found", app });
|
|
157282
157779
|
}
|
|
157283
157780
|
const mm = m2;
|
|
157284
157781
|
const readDoc = (hash2, live3) => pin ? hash2 ? pinnedBody(app, hash2, live3) : Promise.resolve(null) : live3();
|
|
157285
157782
|
const ringPinned = pin !== null && request.headers.get(RELEASE_SOURCE_HEADER) === "ring";
|
|
157286
157783
|
const cfgBytes = ringPinned ? await store.getAppConfig(app) : await readDoc(mm.appConfigHash, () => store.getAppConfig(app));
|
|
157287
|
-
if (!cfgBytes) return
|
|
157784
|
+
if (!cfgBytes) return json5(404, { error: "app_config_not_found", app });
|
|
157288
157785
|
let appConfig;
|
|
157289
157786
|
try {
|
|
157290
157787
|
appConfig = JSON.parse(utf8Decode(cfgBytes));
|
|
157291
157788
|
} catch {
|
|
157292
|
-
return
|
|
157789
|
+
return json5(500, { error: "app_config_invalid", app });
|
|
157293
157790
|
}
|
|
157294
157791
|
const bootOverlay = (!pin || ringPinned) && opts.devControl ? devControlOverlay.get(app) : void 0;
|
|
157295
157792
|
if (bootOverlay) appConfig.control = { ...appConfig.control ?? {}, ...bootOverlay };
|
|
@@ -157346,41 +157843,41 @@ ${releaseId}`;
|
|
|
157346
157843
|
if (request.headers.get("if-none-match") === etag) {
|
|
157347
157844
|
return new Response(null, { status: 304, headers: { etag, "cache-control": cache, ...vary } });
|
|
157348
157845
|
}
|
|
157349
|
-
return
|
|
157846
|
+
return json5(200, { releaseId: mm.releaseId, app, appConfig, tokens: tokens2, homeScreenId, screen, homeBundle }, { etag, "cache-control": cache, ...vary });
|
|
157350
157847
|
}
|
|
157351
157848
|
if (path2 === "/v1/tokens") {
|
|
157352
|
-
if (!app) return
|
|
157849
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157353
157850
|
if (pin) {
|
|
157354
157851
|
const m2 = await pinnedManifest(app, pin);
|
|
157355
|
-
if (!m2) return
|
|
157852
|
+
if (!m2) return json5(404, { error: "release_not_found", app, releaseId: pin });
|
|
157356
157853
|
const bytes3 = m2.tokensHash ? await pinnedBody(app, m2.tokensHash, () => store.getTokens(app)) : null;
|
|
157357
|
-
if (!bytes3) return
|
|
157854
|
+
if (!bytes3) return json5(404, { error: "tokens_not_found", app });
|
|
157358
157855
|
return sendDoc(request, bytes3, true);
|
|
157359
157856
|
}
|
|
157360
157857
|
const bytes2 = await store.getTokens(app);
|
|
157361
|
-
if (!bytes2) return
|
|
157858
|
+
if (!bytes2) return json5(404, { error: "tokens_not_found", app });
|
|
157362
157859
|
return sendDoc(request, bytes2);
|
|
157363
157860
|
}
|
|
157364
157861
|
if (path2 === "/v1/l10n") {
|
|
157365
|
-
if (!app) return
|
|
157862
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157366
157863
|
const tag = (url.searchParams.get("tag") ?? "").trim();
|
|
157367
157864
|
if (!/^[a-z]{2}(-[A-Za-z0-9]+)?$/.test(tag)) {
|
|
157368
|
-
return
|
|
157865
|
+
return json5(400, { error: "bad_tag", hint: "pass a BCP-47 primary subtag, e.g. tag=he" });
|
|
157369
157866
|
}
|
|
157370
157867
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157371
|
-
if (!m2) return
|
|
157868
|
+
if (!m2) return json5(404, pin ? { error: "release_not_found", app, releaseId: pin } : { error: "no_release", app });
|
|
157372
157869
|
const hash2 = m2.catalogs?.[tag];
|
|
157373
157870
|
if (!hash2) return new Response(null, { status: 204 });
|
|
157374
|
-
if (!store.getDoc) return
|
|
157871
|
+
if (!store.getDoc) return json5(501, { error: "docs_unsupported" });
|
|
157375
157872
|
const bytes2 = await store.getDoc(app, hash2);
|
|
157376
157873
|
if (!bytes2) return new Response(null, { status: 204 });
|
|
157377
157874
|
return sendDoc(request, bytes2, Boolean(pin));
|
|
157378
157875
|
}
|
|
157379
157876
|
if (path2 === "/v1/app-icon") {
|
|
157380
|
-
if (!app) return
|
|
157381
|
-
if (!store.getIcon) return
|
|
157877
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157878
|
+
if (!store.getIcon) return json5(501, { error: "icons_unsupported" });
|
|
157382
157879
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157383
|
-
if (!m2) return
|
|
157880
|
+
if (!m2) return json5(404, pin ? { error: "release_not_found", app, releaseId: pin } : { error: "no_release", app });
|
|
157384
157881
|
if (!m2.iconHash) return new Response(null, { status: 204 });
|
|
157385
157882
|
const bytes2 = await store.getIcon(app);
|
|
157386
157883
|
if (!bytes2) return new Response(null, { status: 204 });
|
|
@@ -157395,19 +157892,19 @@ ${releaseId}`;
|
|
|
157395
157892
|
}
|
|
157396
157893
|
const assetMatch = /^\/v1\/asset\/([^/?]+)$/.exec(path2);
|
|
157397
157894
|
if (assetMatch) {
|
|
157398
|
-
if (!app) return
|
|
157399
|
-
if (!store.getAsset) return
|
|
157895
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157896
|
+
if (!store.getAsset) return json5(501, { error: "assets_unsupported" });
|
|
157400
157897
|
const sha2 = assetMatch[1];
|
|
157401
|
-
if (!isSafeSegment(sha2)) return
|
|
157898
|
+
if (!isSafeSegment(sha2)) return json5(400, { error: "bad_asset" });
|
|
157402
157899
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157403
157900
|
const record2 = Object.values(m2?.assets ?? {}).find((a2) => a2.sha256 === sha2);
|
|
157404
|
-
if (!record2) return
|
|
157901
|
+
if (!record2) return json5(404, { error: "asset_not_found", app });
|
|
157405
157902
|
const etag = strongEtagForSha256(sha2);
|
|
157406
157903
|
if (request.headers.get("if-none-match") === etag) {
|
|
157407
157904
|
return new Response(null, { status: 304, headers: { etag, "cache-control": BUNDLE_CACHE_CONTROL } });
|
|
157408
157905
|
}
|
|
157409
157906
|
const bytes2 = await store.getAsset(app, sha2);
|
|
157410
|
-
if (!bytes2) return
|
|
157907
|
+
if (!bytes2) return json5(404, { error: "asset_not_found", app });
|
|
157411
157908
|
return new Response(bytes2, {
|
|
157412
157909
|
status: 200,
|
|
157413
157910
|
headers: {
|
|
@@ -157433,19 +157930,19 @@ ${releaseId}`;
|
|
|
157433
157930
|
bundleUrl: `/v1/bundles/${h2.bundleHash}.bundle.js?app=${encodeURIComponent(ahApp)}`,
|
|
157434
157931
|
integrity: h2.sri
|
|
157435
157932
|
}));
|
|
157436
|
-
return
|
|
157933
|
+
return json5(200, { handlers });
|
|
157437
157934
|
}
|
|
157438
157935
|
if (cfgMatch) {
|
|
157439
157936
|
const cfgApp = cfgMatch[1];
|
|
157440
157937
|
if (pin) {
|
|
157441
157938
|
const m2 = await pinnedManifest(cfgApp, pin);
|
|
157442
|
-
if (!m2) return
|
|
157939
|
+
if (!m2) return json5(404, { error: "release_not_found", app: cfgApp, releaseId: pin });
|
|
157443
157940
|
const bytes3 = m2.appConfigHash ? await pinnedBody(cfgApp, m2.appConfigHash, () => store.getAppConfig(cfgApp)) : null;
|
|
157444
|
-
if (!bytes3) return
|
|
157941
|
+
if (!bytes3) return json5(404, { error: "app_config_not_found", app: cfgApp });
|
|
157445
157942
|
return sendDoc(request, bytes3, true);
|
|
157446
157943
|
}
|
|
157447
157944
|
const bytes2 = await store.getAppConfig(cfgApp);
|
|
157448
|
-
if (!bytes2) return
|
|
157945
|
+
if (!bytes2) return json5(404, { error: "app_config_not_found", app: cfgApp });
|
|
157449
157946
|
const overlay = opts.devControl ? devControlOverlay.get(cfgApp) : void 0;
|
|
157450
157947
|
if (overlay) {
|
|
157451
157948
|
const cfg = JSON.parse(utf8Decode(bytes2));
|
|
@@ -157457,50 +157954,50 @@ ${releaseId}`;
|
|
|
157457
157954
|
const screenMatch = /^\/v1\/screen\/([^/]+)$/.exec(path2);
|
|
157458
157955
|
if (screenMatch) {
|
|
157459
157956
|
const screenId = screenMatch[1];
|
|
157460
|
-
if (!app || !isSafeSegment(screenId)) return
|
|
157957
|
+
if (!app || !isSafeSegment(screenId)) return json5(404, { error: "screen_not_found", screenId });
|
|
157461
157958
|
if (pin) {
|
|
157462
157959
|
const denied2 = await authorizePinnedRead(request, url, app, pin, screenId);
|
|
157463
157960
|
if (denied2) return denied2;
|
|
157464
157961
|
const m3 = await pinnedManifest(app, pin);
|
|
157465
|
-
if (!m3) return
|
|
157962
|
+
if (!m3) return json5(404, { error: "release_not_found", app, releaseId: pin });
|
|
157466
157963
|
const meta2 = m3.screens[screenId];
|
|
157467
|
-
if (!meta2) return
|
|
157964
|
+
if (!meta2) return json5(404, { error: "screen_not_found", screenId });
|
|
157468
157965
|
const etag2 = `"${meta2.descriptorHash}"`;
|
|
157469
157966
|
const headers2 = { etag: etag2, "cache-control": PINNED_CACHE_CONTROL, vary: "x-himalaya-release" };
|
|
157470
157967
|
if (request.headers.get("if-none-match") === etag2) return new Response(null, { status: 304, headers: headers2 });
|
|
157471
157968
|
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":
|
|
157969
|
+
if (!body2) return json5(404, { error: "screen_not_found", screenId });
|
|
157970
|
+
return new Response(body2, { status: 200, headers: { "content-type": JSON_CT3, ...headers2, "x-himalaya-app": app } });
|
|
157474
157971
|
}
|
|
157475
157972
|
const m2 = await manifest(app);
|
|
157476
157973
|
const meta = m2?.screens[screenId];
|
|
157477
|
-
if (!m2 || !meta) return
|
|
157974
|
+
if (!m2 || !meta) return json5(404, { error: "screen_not_found", screenId });
|
|
157478
157975
|
const etag = `"${meta.descriptorHash}"`;
|
|
157479
157976
|
if (request.headers.get("if-none-match") === etag) {
|
|
157480
157977
|
return new Response(null, { status: 304, headers: { etag, "cache-control": DOC_CACHE_CONTROL } });
|
|
157481
157978
|
}
|
|
157482
157979
|
const body = await store.getScreen(app, screenId);
|
|
157483
|
-
if (!body) return
|
|
157980
|
+
if (!body) return json5(404, { error: "screen_not_found", screenId });
|
|
157484
157981
|
return new Response(body, {
|
|
157485
157982
|
status: 200,
|
|
157486
|
-
headers: { "content-type":
|
|
157983
|
+
headers: { "content-type": JSON_CT3, etag, "cache-control": DOC_CACHE_CONTROL, "x-himalaya-app": app }
|
|
157487
157984
|
});
|
|
157488
157985
|
}
|
|
157489
157986
|
if (path2 === "/v1/widgets") {
|
|
157490
|
-
if (!app) return
|
|
157987
|
+
if (!app) return json5(400, { error: "missing_app" });
|
|
157491
157988
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157492
|
-
if (!m2) return
|
|
157989
|
+
if (!m2) return json5(404, { error: pin ? "release_not_found" : "no_release", app });
|
|
157493
157990
|
const widgets = Object.entries(m2.widgets ?? {}).map(([widgetId, meta]) => ({ widgetId, contentEtag: meta.contentEtag }));
|
|
157494
|
-
return
|
|
157991
|
+
return json5(200, { widgets });
|
|
157495
157992
|
}
|
|
157496
157993
|
const widgetMatch = /^\/v1\/widget\/([^/]+)$/.exec(path2);
|
|
157497
157994
|
if (widgetMatch) {
|
|
157498
157995
|
const widgetId = widgetMatch[1];
|
|
157499
|
-
if (!app || !isSafeSegment(widgetId)) return
|
|
157500
|
-
if (!store.getWidget) return
|
|
157996
|
+
if (!app || !isSafeSegment(widgetId)) return json5(404, { error: "widget_not_found", widgetId });
|
|
157997
|
+
if (!store.getWidget) return json5(501, { error: "widgets_unsupported" });
|
|
157501
157998
|
const m2 = pin ? await pinnedManifest(app, pin) : await manifest(app);
|
|
157502
157999
|
const meta = m2?.widgets?.[widgetId];
|
|
157503
|
-
if (!m2 || !meta) return
|
|
158000
|
+
if (!m2 || !meta) return json5(404, { error: "widget_not_found", widgetId });
|
|
157504
158001
|
const etag = `"${meta.contentEtag}"`;
|
|
157505
158002
|
const cache = pin ? PINNED_CACHE_CONTROL : `max-age=${meta.ttlSeconds}`;
|
|
157506
158003
|
const vary = pin ? { vary: "x-himalaya-release" } : {};
|
|
@@ -157508,15 +158005,15 @@ ${releaseId}`;
|
|
|
157508
158005
|
return new Response(null, { status: 304, headers: { etag, "cache-control": cache, ...vary } });
|
|
157509
158006
|
}
|
|
157510
158007
|
const body = await store.getWidget(app, widgetId);
|
|
157511
|
-
if (!body) return
|
|
158008
|
+
if (!body) return json5(404, { error: "widget_not_found", widgetId });
|
|
157512
158009
|
return new Response(body, {
|
|
157513
158010
|
status: 200,
|
|
157514
|
-
headers: { "content-type":
|
|
158011
|
+
headers: { "content-type": JSON_CT3, etag, "cache-control": cache, ...vary, "x-himalaya-app": app }
|
|
157515
158012
|
});
|
|
157516
158013
|
}
|
|
157517
|
-
return
|
|
158014
|
+
return json5(404, { error: "not_found" });
|
|
157518
158015
|
} catch (err) {
|
|
157519
|
-
return
|
|
158016
|
+
return json5(500, { error: "internal", message: err.message });
|
|
157520
158017
|
}
|
|
157521
158018
|
};
|
|
157522
158019
|
return async (request) => {
|
|
@@ -157538,7 +158035,7 @@ ${releaseId}`;
|
|
|
157538
158035
|
return withCors(request, response);
|
|
157539
158036
|
};
|
|
157540
158037
|
}
|
|
157541
|
-
var
|
|
158038
|
+
var JSON_CT3;
|
|
157542
158039
|
var init_server2 = __esm({
|
|
157543
158040
|
"../../core/serve/src/server.ts"() {
|
|
157544
158041
|
init_sha256();
|
|
@@ -157548,8 +158045,9 @@ var init_server2 = __esm({
|
|
|
157548
158045
|
init_pinned_read();
|
|
157549
158046
|
init_package_share();
|
|
157550
158047
|
init_wix_bridge();
|
|
158048
|
+
init_account_rung();
|
|
157551
158049
|
init_wix_member_auth();
|
|
157552
|
-
|
|
158050
|
+
JSON_CT3 = "application/json; charset=utf-8";
|
|
157553
158051
|
}
|
|
157554
158052
|
});
|
|
157555
158053
|
|
|
@@ -157758,14 +158256,14 @@ function makeRunHandler(opts) {
|
|
|
157758
158256
|
const url = new URL(request.url);
|
|
157759
158257
|
const path2 = url.pathname;
|
|
157760
158258
|
if (path2 === "/v1/release/resolve") {
|
|
157761
|
-
return
|
|
158259
|
+
return json6(
|
|
157762
158260
|
200,
|
|
157763
158261
|
{ app: opts.app, releaseId: opts.header?.releaseId ?? null, source: "local" },
|
|
157764
158262
|
{ "cache-control": "no-store" }
|
|
157765
158263
|
);
|
|
157766
158264
|
}
|
|
157767
158265
|
if (path2 === "/v1/revocations") {
|
|
157768
|
-
return
|
|
158266
|
+
return json6(
|
|
157769
158267
|
200,
|
|
157770
158268
|
{ app: opts.app, revokedIntegrities: [], version: 0, ttlSeconds: 30 },
|
|
157771
158269
|
{ "cache-control": "max-age=30" }
|
|
@@ -157774,14 +158272,14 @@ function makeRunHandler(opts) {
|
|
|
157774
158272
|
const flagAssign = FLAG_ASSIGNMENTS_PATH.exec(path2);
|
|
157775
158273
|
if (flagAssign) return flagAssignmentsResponse(request, flagAssign[1], []);
|
|
157776
158274
|
if (path2.startsWith("/v1/flags/")) {
|
|
157777
|
-
return
|
|
158275
|
+
return json6(200, { app: opts.app, definitions: {} }, { "cache-control": "no-store" });
|
|
157778
158276
|
}
|
|
157779
158277
|
if (path2 === "/v1/owner/sites" && !ownerRungOn && (request.method === "GET" || request.method === "HEAD")) {
|
|
157780
158278
|
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 } }) :
|
|
158279
|
+
return request.method === "HEAD" ? new Response(null, { status: 200, headers: { "content-type": "application/json; charset=utf-8", ...headers2 } }) : json6(200, { sites: [] }, headers2);
|
|
157782
158280
|
}
|
|
157783
158281
|
if (path2 === "/v1/telemetry/ingest") {
|
|
157784
|
-
if (request.method !== "POST") return
|
|
158282
|
+
if (request.method !== "POST") return json6(405, { error: "method_not_allowed" });
|
|
157785
158283
|
try {
|
|
157786
158284
|
const body = await request.json();
|
|
157787
158285
|
const events = Array.isArray(body) ? body : Array.isArray(body?.events) ? body.events : [body];
|
|
@@ -157819,7 +158317,7 @@ data: ${JSON.stringify(data ?? {})}
|
|
|
157819
158317
|
});
|
|
157820
158318
|
}
|
|
157821
158319
|
if (path2.startsWith("/v1/__webwix/") && path2 !== "/v1/__webwix/call" && path2 !== "/v1/__webwix/identity" && !(opts.serve?.webwixMemberAuth === true && opts.serve?.webwixMemberSessions)) {
|
|
157822
|
-
return
|
|
158320
|
+
return json6(501, { error: "webwix_member_auth_unavailable" });
|
|
157823
158321
|
}
|
|
157824
158322
|
if (path2 === "/v1/app-config" || path2.startsWith("/v1/app-config/")) {
|
|
157825
158323
|
return localizeConfigResponse(await serve(request), "app-config", opts.header ?? null);
|
|
@@ -157837,17 +158335,17 @@ data: ${JSON.stringify(data ?? {})}
|
|
|
157837
158335
|
if (path2 === mount || path2.startsWith(`${mount}/`)) {
|
|
157838
158336
|
return previewResponse(path2, opts.assets, mount);
|
|
157839
158337
|
}
|
|
157840
|
-
return
|
|
158338
|
+
return json6(404, { error: "not_found", path: path2 });
|
|
157841
158339
|
};
|
|
157842
158340
|
}
|
|
157843
|
-
var
|
|
158341
|
+
var json6;
|
|
157844
158342
|
var init_run_handler = __esm({
|
|
157845
158343
|
"../../core/serve/src/run-handler.ts"() {
|
|
157846
158344
|
init_server2();
|
|
157847
158345
|
init_flag_assignments();
|
|
157848
158346
|
init_preview3();
|
|
157849
158347
|
init_himi_package();
|
|
157850
|
-
|
|
158348
|
+
json6 = (status, body, headers2 = {}) => new Response(JSON.stringify(body), {
|
|
157851
158349
|
status,
|
|
157852
158350
|
headers: { "content-type": "application/json; charset=utf-8", ...headers2 }
|
|
157853
158351
|
});
|
|
@@ -158004,30 +158502,30 @@ var init_preview_assets_generated = __esm({
|
|
|
158004
158502
|
"../../packages/serve/src/preview-assets.generated.ts"() {
|
|
158005
158503
|
init_preview_assets_format();
|
|
158006
158504
|
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:
|
|
158505
|
+
{ key: "assets/DashboardHost-CMzLSKF-.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 2916, sha256: "c9f6138bd99f7f2688ce09257f0f6a11e605a401ed94b99039af6882a1b2cac6" },
|
|
158506
|
+
{ key: "assets/DevDrawer-DRsYVC-c.js", contentType: "application/javascript; charset=utf-8", offset: 2924, length: 16744, sha256: "b19cad52b8b093da1380c3d93bac25090785e99170a78af8b00a3d3391a1f71f" },
|
|
158507
|
+
{ key: "assets/IdiomCompare-CIS_tR5g.js", contentType: "application/javascript; charset=utf-8", offset: 19668, length: 1892, sha256: "89e8e33a11f734d6d40591cca7d82dad1777934ef69fb94d2ff36df8beed7aae" },
|
|
158508
|
+
{ key: "assets/SchemeCompare-B8ACwERk.js", contentType: "application/javascript; charset=utf-8", offset: 21560, length: 1819, sha256: "d3318143e09268f7523ca6b79bbb5ef845d3a33364ed022b60f25e79c64839fa" },
|
|
158509
|
+
{ key: "assets/index-DsicOVa7.js", contentType: "application/javascript; charset=utf-8", offset: 23379, length: 1333388, sha256: "3dfdd09d8d605e2b0ebbe61deff4e360a77d89d5f75bfc4cb0c1c742590d0724" },
|
|
158510
|
+
{ key: "assets/pdf-CRldTUgE.js", contentType: "application/javascript; charset=utf-8", offset: 1356767, length: 488199, sha256: "4fdd427b67ac902de39167965e657b474b0195cc46d3ca1c7c2697e944c7cb4f" },
|
|
158511
|
+
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1844966, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
|
|
158512
|
+
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1845039, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
|
|
158513
|
+
{ key: "assets/pdfDocument-B6MDOJiD.js", contentType: "application/javascript; charset=utf-8", offset: 3162073, length: 2868, sha256: "7c0ea35a311ba32e8fca842f54a7c22bfd3d1f108af6aad470c2b4fb956250d8" },
|
|
158514
|
+
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3164941, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
|
|
158515
|
+
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3169551, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
|
|
158516
|
+
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3658135, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
|
|
158517
|
+
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3749059, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
|
|
158518
|
+
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3840043, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
|
|
158519
|
+
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 3931023, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
|
|
158520
|
+
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 4021895, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
|
|
158521
|
+
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4112875, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
|
|
158522
|
+
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4221511, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
|
|
158523
|
+
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4330595, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
|
|
158524
|
+
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4439643, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
|
|
158525
|
+
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4547343, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
|
|
158526
|
+
{ key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset: 4635451, length: 6748, sha256: "4a92459977d7cefa1a6a7e020c3a63509737f083b3f2773557c1a5771665811a" },
|
|
158527
|
+
{ key: "index.html", contentType: "text/html; charset=utf-8", offset: 4642199, length: 4947, sha256: "519d65dd1d4dafc3e32f0ddb70ddfccfdd72b68110694d9c2ec61fb3b8640c48" },
|
|
158528
|
+
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4647146, length: 17768, sha256: "a47dec8623a0f58def7d8785ee74d08483626e75d07c9328bfc9ecb2172c2e0d" }
|
|
158031
158529
|
];
|
|
158032
158530
|
}
|
|
158033
158531
|
});
|
|
@@ -162672,9 +163170,9 @@ var init_store_iap = __esm({
|
|
|
162672
163170
|
UsageError = class extends Error {
|
|
162673
163171
|
};
|
|
162674
163172
|
CommandOutput = class {
|
|
162675
|
-
constructor(io2,
|
|
163173
|
+
constructor(io2, json7) {
|
|
162676
163174
|
this.io = io2;
|
|
162677
|
-
this.json =
|
|
163175
|
+
this.json = json7;
|
|
162678
163176
|
}
|
|
162679
163177
|
secrets = [];
|
|
162680
163178
|
get interactive() {
|
|
@@ -162845,7 +163343,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
162845
163343
|
const invokedAs = pos[0];
|
|
162846
163344
|
const sub = invokedAs === "testflight" ? "upload" : pos[1];
|
|
162847
163345
|
const app = invokedAs === "testflight" ? pos[1] : pos[2];
|
|
162848
|
-
const
|
|
163346
|
+
const json7 = on3(flags.json);
|
|
162849
163347
|
const print = (o2) => io2.log(JSON.stringify(o2, null, 2));
|
|
162850
163348
|
const fail5 = (error, extra = {}) => {
|
|
162851
163349
|
io2.error(JSON.stringify({ error, ...extra }));
|
|
@@ -162883,7 +163381,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
162883
163381
|
}
|
|
162884
163382
|
try {
|
|
162885
163383
|
const s2 = await deps.ascStatus(app, credsToEnv(creds2));
|
|
162886
|
-
if (
|
|
163384
|
+
if (json7) print({ ok: true, app, team: creds2.team, ...s2 });
|
|
162887
163385
|
else {
|
|
162888
163386
|
io2.log(` ${pad2("app")}${app} team ${creds2.team} appStoreId ${s2.appStoreId}`);
|
|
162889
163387
|
for (const b2 of s2.builds.slice(0, 5)) io2.log(` ${pad2("build")}${b2.version} ${b2.processingState}`);
|
|
@@ -162903,7 +163401,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
162903
163401
|
}
|
|
162904
163402
|
const { errors, warnings } = partitionFindings(findings);
|
|
162905
163403
|
if (sub === "preflight") {
|
|
162906
|
-
if (
|
|
163404
|
+
if (json7) print({ ok: errors.length === 0, app, findings });
|
|
162907
163405
|
else {
|
|
162908
163406
|
for (const f2 of findings) io2.log(` ${f2.level === "error" ? "\u2717" : "!"} ${f2.message}`);
|
|
162909
163407
|
io2.log(errors.length === 0 ? `
|
|
@@ -162941,7 +163439,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
162941
163439
|
const reuseExisting = on3(flags["skip-build"]);
|
|
162942
163440
|
const nextBuild = reuseExisting ? version4.build : version4.build + 1;
|
|
162943
163441
|
const plannedSteps = UPLOAD_STEPS.filter((s2) => !(reuseExisting && BUILD_STEPS.has(s2)));
|
|
162944
|
-
if (!
|
|
163442
|
+
if (!json7) {
|
|
162945
163443
|
io2.log("");
|
|
162946
163444
|
for (const line of accountHeader({ app, bundleId, version: version4, nextBuild, creds, track })) io2.log(line);
|
|
162947
163445
|
io2.log("");
|
|
@@ -162969,7 +163467,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
162969
163467
|
steps: [...plannedSteps],
|
|
162970
163468
|
warnings: warnings.map((w2) => w2.message)
|
|
162971
163469
|
};
|
|
162972
|
-
if (
|
|
163470
|
+
if (json7) print(plan);
|
|
162973
163471
|
else {
|
|
162974
163472
|
io2.log(`
|
|
162975
163473
|
dry run \u2014 nothing was built, uploaded or bumped.`);
|
|
@@ -163022,11 +163520,11 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
163022
163520
|
stderr: r2.stderr.split("\n").slice(-20).join("\n")
|
|
163023
163521
|
});
|
|
163024
163522
|
}
|
|
163025
|
-
if (!
|
|
163523
|
+
if (!json7) io2.log(` \u2713 ${pad2(step)}ok`);
|
|
163026
163524
|
}
|
|
163027
163525
|
if (on3(flags["no-wait"])) {
|
|
163028
163526
|
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 (
|
|
163527
|
+
if (json7) print(out2);
|
|
163030
163528
|
else io2.log(`
|
|
163031
163529
|
\u2713 uploaded build ${uploaded.build} \u2014 processing not awaited.`);
|
|
163032
163530
|
return 0;
|
|
@@ -163047,7 +163545,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
163047
163545
|
const mine = findBuild(s2.builds, uploaded.build);
|
|
163048
163546
|
if (mine && mine.processingState === "VALID") {
|
|
163049
163547
|
const url = `https://appstoreconnect.apple.com/apps/${s2.appStoreId}/testflight/ios`;
|
|
163050
|
-
if (
|
|
163548
|
+
if (json7) print({ ok: true, app, build: uploaded.build, processingState: mine.processingState, url });
|
|
163051
163549
|
else io2.log(`
|
|
163052
163550
|
\u2713 TestFlight ${uploaded.marketing} (${uploaded.build}) \u2014 Processing complete
|
|
163053
163551
|
${url}`);
|
|
@@ -163067,7 +163565,7 @@ async function runStore(pos, flags, io2, deps) {
|
|
|
163067
163565
|
{ app, build: uploaded.build, uploaded: true, processed: false }
|
|
163068
163566
|
);
|
|
163069
163567
|
}
|
|
163070
|
-
if (!
|
|
163568
|
+
if (!json7) io2.log(` \u2026 processing (${Math.round(waited / 1e3)}s)`);
|
|
163071
163569
|
await deps.sleep(PROCESSING_POLL_MS);
|
|
163072
163570
|
waited += PROCESSING_POLL_MS;
|
|
163073
163571
|
}
|
|
@@ -164397,7 +164895,7 @@ function parseDataFlag(raw) {
|
|
|
164397
164895
|
async function runNotify(pos, flags, io2, deps = {}) {
|
|
164398
164896
|
const doFetch = deps.fetchImpl ?? fetch;
|
|
164399
164897
|
const str10 = (v2) => typeof v2 === "string" ? v2 : void 0;
|
|
164400
|
-
const
|
|
164898
|
+
const json7 = flags.json === true;
|
|
164401
164899
|
const print = (v2) => io2.log(JSON.stringify(v2, null, 2));
|
|
164402
164900
|
const sub = pos[1];
|
|
164403
164901
|
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 +164940,7 @@ async function runNotify(pos, flags, io2, deps = {}) {
|
|
|
164442
164940
|
...session ? {} : { hint: "no admin session \u2014 pass --admin-session or set HIMALAYA_ADMIN_SESSION" },
|
|
164443
164941
|
...reachable && authed && !senders ? { hint: "this admin-server predates /v1/admin/push-doctor \u2014 upgrade it to see sender readiness" } : {}
|
|
164444
164942
|
};
|
|
164445
|
-
if (
|
|
164943
|
+
if (json7) {
|
|
164446
164944
|
print(report3);
|
|
164447
164945
|
return report3.ok ? 0 : 1;
|
|
164448
164946
|
}
|
|
@@ -164490,7 +164988,7 @@ async function runNotify(pos, flags, io2, deps = {}) {
|
|
|
164490
164988
|
return 1;
|
|
164491
164989
|
}
|
|
164492
164990
|
const body = await res2.json();
|
|
164493
|
-
if (
|
|
164991
|
+
if (json7) {
|
|
164494
164992
|
print({ ok: true, app, count: body.tokens.length, tokens: body.tokens });
|
|
164495
164993
|
return 0;
|
|
164496
164994
|
}
|
|
@@ -164580,7 +165078,7 @@ async function runNotify(pos, flags, io2, deps = {}) {
|
|
|
164580
165078
|
io2.error(JSON.stringify({ error: out2.error ?? `send failed: ${res.status}` }));
|
|
164581
165079
|
return 1;
|
|
164582
165080
|
}
|
|
164583
|
-
if (
|
|
165081
|
+
if (json7) {
|
|
164584
165082
|
print(out2);
|
|
164585
165083
|
return out2.ok ? 0 : 1;
|
|
164586
165084
|
}
|
|
@@ -168240,10 +168738,10 @@ function writeBase44Book(result, outDir, opts = {}) {
|
|
|
168240
168738
|
const shot = shots.find((s2) => page.screenshotLocal?.endsWith(s2.filename));
|
|
168241
168739
|
if (shot) page.screenshotLocal = `screenshots/${shot.filename}`;
|
|
168242
168740
|
}
|
|
168243
|
-
const
|
|
168741
|
+
const json7 = `${JSON.stringify(book, null, 2)}
|
|
168244
168742
|
`;
|
|
168245
168743
|
const md = renderBookMd(book);
|
|
168246
|
-
assertNoSecrets(
|
|
168744
|
+
assertNoSecrets(json7);
|
|
168247
168745
|
assertNoSecrets(md);
|
|
168248
168746
|
const owned = ["book.json", "BOOK.md", "source", "screenshots"].filter((n2) => existsSync78(join83(out2, n2)));
|
|
168249
168747
|
if (owned.length) {
|
|
@@ -168251,7 +168749,7 @@ function writeBase44Book(result, outDir, opts = {}) {
|
|
|
168251
168749
|
for (const d2 of ["source", "screenshots"]) rmSync21(join83(out2, d2), { recursive: true, force: true });
|
|
168252
168750
|
}
|
|
168253
168751
|
mkdirSync38(out2, { recursive: true });
|
|
168254
|
-
writeFileSync34(join83(out2, "book.json"),
|
|
168752
|
+
writeFileSync34(join83(out2, "book.json"), json7);
|
|
168255
168753
|
writeFileSync34(join83(out2, "BOOK.md"), md);
|
|
168256
168754
|
files.push("book.json", "BOOK.md");
|
|
168257
168755
|
for (const s2 of shots) {
|
|
@@ -172181,12 +172679,54 @@ var init_collect = __esm({
|
|
|
172181
172679
|
});
|
|
172182
172680
|
|
|
172183
172681
|
// src/one-app/graph.ts
|
|
172184
|
-
function buildSourceGraph(raw) {
|
|
172185
|
-
const
|
|
172682
|
+
function buildSourceGraph(raw, enriched = {}) {
|
|
172683
|
+
const enrichedStructures = Object.values(enriched).filter((value) => value !== void 0);
|
|
172684
|
+
function sourceMap2(key2) {
|
|
172685
|
+
const result = {};
|
|
172686
|
+
for (const structure of enrichedStructures) {
|
|
172687
|
+
for (const [id, value] of Object.entries(object4(structure[key2]))) {
|
|
172688
|
+
if (!own4(result, id)) result[id] = value;
|
|
172689
|
+
}
|
|
172690
|
+
}
|
|
172691
|
+
for (const [id, value] of Object.entries(object4(raw[key2]))) {
|
|
172692
|
+
result[id] = own4(result, id) ? { ...object4(result[id]), ...object4(value) } : value;
|
|
172693
|
+
}
|
|
172694
|
+
return result;
|
|
172695
|
+
}
|
|
172696
|
+
function definitionMap(key2) {
|
|
172697
|
+
const result = {};
|
|
172698
|
+
for (const structure of enrichedStructures) {
|
|
172699
|
+
for (const [id, value] of Object.entries(object4(object4(structure.definitions)[key2]))) {
|
|
172700
|
+
if (!own4(result, id)) result[id] = value;
|
|
172701
|
+
}
|
|
172702
|
+
}
|
|
172703
|
+
for (const [id, value] of Object.entries(object4(object4(raw.definitions)[key2]))) {
|
|
172704
|
+
result[id] = own4(result, id) ? { ...object4(result[id]), ...object4(value) } : value;
|
|
172705
|
+
}
|
|
172706
|
+
return result;
|
|
172707
|
+
}
|
|
172708
|
+
function platformMap(platformStructure, key2) {
|
|
172709
|
+
const result = { ...object4(platformStructure[key2]) };
|
|
172710
|
+
for (const [id, value] of Object.entries(object4(raw[key2]))) {
|
|
172711
|
+
result[id] = own4(result, id) ? { ...object4(result[id]), ...object4(value) } : value;
|
|
172712
|
+
}
|
|
172713
|
+
return result;
|
|
172714
|
+
}
|
|
172715
|
+
function platformDefinitionMap(platformStructure, key2) {
|
|
172716
|
+
const result = { ...object4(object4(platformStructure.definitions)[key2]) };
|
|
172717
|
+
for (const [id, value] of Object.entries(object4(object4(raw.definitions)[key2]))) {
|
|
172718
|
+
result[id] = own4(result, id) ? { ...object4(result[id]), ...object4(value) } : value;
|
|
172719
|
+
}
|
|
172720
|
+
return result;
|
|
172721
|
+
}
|
|
172722
|
+
const screens = sourceMap2("screens");
|
|
172186
172723
|
const layouts = object4(raw.layoutItems);
|
|
172187
172724
|
const allSections = object4(raw.sections);
|
|
172188
172725
|
const sections = Object.fromEntries(Object.entries(allSections).filter(([, v2]) => !string3(object4(v2).sectionDefinitionId)?.startsWith("ntt.")));
|
|
172189
172726
|
const headers2 = object4(raw.headers);
|
|
172727
|
+
const topBars = sourceMap2("topBars");
|
|
172728
|
+
const topBarButtonDefinitions = definitionMap("topBarButtons");
|
|
172729
|
+
const actionDefinitions = definitionMap("actions");
|
|
172190
172730
|
const warnings = [];
|
|
172191
172731
|
const usedSections = /* @__PURE__ */ new Set();
|
|
172192
172732
|
const usedLayouts = /* @__PURE__ */ new Set();
|
|
@@ -172276,6 +172816,30 @@ function buildSourceGraph(raw) {
|
|
|
172276
172816
|
return [{ pointer: refPointer, context: placementContext, arrayIndex: index, ...own4(ref, "orderIndex") ? { orderIndex: ref.orderIndex } : {}, sectionId: id, sectionDefinitionId: string3(object4(sections[id]).sectionDefinitionId), reference: ref }];
|
|
172277
172817
|
});
|
|
172278
172818
|
}
|
|
172819
|
+
function topBarButtons(value, side2, pointer, context, buttonDefinitions = topBarButtonDefinitions, availableActions = actionDefinitions, trackInteractions = true) {
|
|
172820
|
+
const bar = object4(value);
|
|
172821
|
+
const idsKey = `${side2}ButtonIds`;
|
|
172822
|
+
const definitionsKey = `${side2}ButtonDefinitions`;
|
|
172823
|
+
const refs = own4(bar, idsKey) ? array3(bar[idsKey]) : array3(bar[definitionsKey]);
|
|
172824
|
+
return refs.map((ref, index) => {
|
|
172825
|
+
const refObject = object4(ref);
|
|
172826
|
+
const id = typeof ref === "string" ? ref : string3(refObject.topBarButtonDefinitionId) ?? string3(refObject.id);
|
|
172827
|
+
const definition = id && own4(buttonDefinitions, id) ? buttonDefinitions[id] : typeof ref === "object" && ref !== null ? ref : void 0;
|
|
172828
|
+
const actionDefinitionId = string3(object4(definition).actionDefinitionId) ?? string3(refObject.actionDefinitionId);
|
|
172829
|
+
const actionDefinition = actionDefinitionId && own4(availableActions, actionDefinitionId) ? availableActions[actionDefinitionId] : void 0;
|
|
172830
|
+
const buttonPointer = `${pointer}/${side2}/${index}`;
|
|
172831
|
+
if (trackInteractions) {
|
|
172832
|
+
if (actionDefinition !== void 0) actions(actionDefinition, `/definitions/actions/${part(actionDefinitionId)}`, context);
|
|
172833
|
+
else if (definition !== void 0) actions(definition, buttonPointer, context);
|
|
172834
|
+
}
|
|
172835
|
+
return {
|
|
172836
|
+
...id ? { id } : {},
|
|
172837
|
+
...definition !== void 0 ? { definition } : {},
|
|
172838
|
+
...actionDefinitionId ? { actionDefinitionId } : {},
|
|
172839
|
+
...actionDefinition !== void 0 ? { actionDefinition } : {}
|
|
172840
|
+
};
|
|
172841
|
+
});
|
|
172842
|
+
}
|
|
172279
172843
|
const screenGraph = Object.entries(screens).map(([screenId, source]) => {
|
|
172280
172844
|
const screen = object4(source);
|
|
172281
172845
|
const layout = object4(screen.layout);
|
|
@@ -172289,6 +172853,36 @@ function buildSourceGraph(raw) {
|
|
|
172289
172853
|
if (!own4(headers2, headerId)) warnings.push({ code: "missing_reference", pointer: `${pointer}/headerId`, reference: headerId });
|
|
172290
172854
|
else actions(headers2[headerId], `/headers/${part(headerId)}`, pointer);
|
|
172291
172855
|
}
|
|
172856
|
+
const topBarId = string3(screen.topBarId);
|
|
172857
|
+
const topBar = topBarId && own4(topBars, topBarId) ? topBars[topBarId] : void 0;
|
|
172858
|
+
if (topBarId && topBar === void 0 && own4(raw, "topBars")) {
|
|
172859
|
+
warnings.push({ code: "missing_reference", pointer: `${pointer}/topBarId`, reference: topBarId });
|
|
172860
|
+
}
|
|
172861
|
+
if (topBar !== void 0 && enrichedStructures.length === 0) actions(topBar, `/topBars/${part(topBarId)}`, pointer);
|
|
172862
|
+
const topBarButtonEvidence = topBar === void 0 ? void 0 : {
|
|
172863
|
+
left: topBarButtons(topBar, "left", `/topBars/${part(topBarId)}`, pointer, topBarButtonDefinitions, actionDefinitions, enrichedStructures.length === 0),
|
|
172864
|
+
right: topBarButtons(topBar, "right", `/topBars/${part(topBarId)}`, pointer, topBarButtonDefinitions, actionDefinitions, enrichedStructures.length === 0)
|
|
172865
|
+
};
|
|
172866
|
+
const topBarByPlatform = Object.fromEntries(Object.entries(enriched).flatMap(([platform, platformStructure]) => {
|
|
172867
|
+
if (!platformStructure) return [];
|
|
172868
|
+
const platformScreen = { ...object4(object4(platformStructure.screens)[screenId]), ...object4(object4(raw.screens)[screenId]) };
|
|
172869
|
+
const platformTopBarId = string3(platformScreen.topBarId);
|
|
172870
|
+
if (!platformTopBarId) return [];
|
|
172871
|
+
const platformTopBar = platformMap(platformStructure, "topBars")[platformTopBarId];
|
|
172872
|
+
if (platformTopBar === void 0) return [];
|
|
172873
|
+
const platformButtons = platformDefinitionMap(platformStructure, "topBarButtons");
|
|
172874
|
+
const platformActions = platformDefinitionMap(platformStructure, "actions");
|
|
172875
|
+
const platformPointer = `${pointer}/topBar/${platform}`;
|
|
172876
|
+
actions(platformTopBar, `/topBars/${part(platformTopBarId)}`, platformPointer);
|
|
172877
|
+
return [[platform, {
|
|
172878
|
+
topBarId: platformTopBarId,
|
|
172879
|
+
topBar: platformTopBar,
|
|
172880
|
+
topBarButtons: {
|
|
172881
|
+
left: topBarButtons(platformTopBar, "left", `/topBars/${part(platformTopBarId)}`, platformPointer, platformButtons, platformActions),
|
|
172882
|
+
right: topBarButtons(platformTopBar, "right", `/topBars/${part(platformTopBarId)}`, platformPointer, platformButtons, platformActions)
|
|
172883
|
+
}
|
|
172884
|
+
}]];
|
|
172885
|
+
}));
|
|
172292
172886
|
const pages2 = refs.flatMap((value, index) => {
|
|
172293
172887
|
const ref = object4(value), id = string3(ref.layoutItemId);
|
|
172294
172888
|
if (!id || !own4(layouts, id)) {
|
|
@@ -172312,7 +172906,12 @@ function buildSourceGraph(raw) {
|
|
|
172312
172906
|
return {
|
|
172313
172907
|
screenId,
|
|
172314
172908
|
pointer,
|
|
172909
|
+
...typeof screen.title === "string" ? { sourceTitle: screen.title } : {},
|
|
172315
172910
|
headerId,
|
|
172911
|
+
...headerId && own4(headers2, headerId) ? { header: headers2[headerId] } : {},
|
|
172912
|
+
topBarId,
|
|
172913
|
+
...topBar !== void 0 ? { topBar, topBarButtons: topBarButtonEvidence } : {},
|
|
172914
|
+
...Object.keys(topBarByPlatform).length ? { topBarByPlatform } : {},
|
|
172316
172915
|
settings: screen.settings,
|
|
172317
172916
|
permissions: screen.permissions,
|
|
172318
172917
|
layoutType: type,
|
|
@@ -172705,7 +173304,7 @@ Collect the source mobile app and hand it to the current coding agent. The agent
|
|
|
172705
173304
|
if (value !== void 0 && !artifacts[name]) put(name, sourceJson(value));
|
|
172706
173305
|
}
|
|
172707
173306
|
progress("normalizing");
|
|
172708
|
-
put("source-graph.json", sourceJson(buildSourceGraph(collected.rawStructure)));
|
|
173307
|
+
put("source-graph.json", sourceJson(buildSourceGraph(collected.rawStructure, collected.enriched)));
|
|
172709
173308
|
put("navigation-plan.json", sourceJson(planNavigation(collected.rawStructure, options.topTabs)));
|
|
172710
173309
|
progress("collected");
|
|
172711
173310
|
put("manifest.json", sourceJson({
|
|
@@ -175230,13 +175829,13 @@ function parseMethod(raw) {
|
|
|
175230
175829
|
return m2;
|
|
175231
175830
|
}
|
|
175232
175831
|
function jsonFunctionSource(method, name, body) {
|
|
175233
|
-
const
|
|
175832
|
+
const json7 = JSON.stringify(body, null, 2).replace(/\n/g, "\n ");
|
|
175234
175833
|
return `import { ok } from 'wix-http-functions';
|
|
175235
175834
|
|
|
175236
175835
|
export function ${methodPrefix(method)}_${name}(request) {
|
|
175237
175836
|
return ok({
|
|
175238
175837
|
headers: { 'Content-Type': 'application/json' },
|
|
175239
|
-
body: ${
|
|
175838
|
+
body: ${json7},
|
|
175240
175839
|
});
|
|
175241
175840
|
}
|
|
175242
175841
|
`;
|
|
@@ -175562,12 +176161,12 @@ async function veloCall(fetchImpl, method, url, opts = {}) {
|
|
|
175562
176161
|
signal: AbortSignal.timeout(opts.timeoutMs ?? 3e4)
|
|
175563
176162
|
});
|
|
175564
176163
|
const text9 = await res.text();
|
|
175565
|
-
let
|
|
176164
|
+
let json7 = text9;
|
|
175566
176165
|
try {
|
|
175567
|
-
|
|
176166
|
+
json7 = text9 ? JSON.parse(text9) : null;
|
|
175568
176167
|
} catch {
|
|
175569
176168
|
}
|
|
175570
|
-
return { status: res.status, json:
|
|
176169
|
+
return { status: res.status, json: json7, text: text9 };
|
|
175571
176170
|
}
|
|
175572
176171
|
function snippet2(x2, cap = 180) {
|
|
175573
176172
|
const s2 = typeof x2 === "string" ? x2 : JSON.stringify(x2) ?? "";
|
|
@@ -175618,15 +176217,15 @@ async function patchHttpFunctionsFile(fetchImpl, token, msid, gridAppId, layout,
|
|
|
175618
176217
|
else body.filesToUpdate = [{ path: filePath, content }];
|
|
175619
176218
|
return veloCall(fetchImpl, "PATCH", veloUpdateFilesPath(gridAppId), { token, msid, body });
|
|
175620
176219
|
}
|
|
175621
|
-
function revisionFrom(
|
|
175622
|
-
if (!
|
|
175623
|
-
const r2 =
|
|
176220
|
+
function revisionFrom(json7) {
|
|
176221
|
+
if (!json7 || typeof json7 !== "object") return void 0;
|
|
176222
|
+
const r2 = json7;
|
|
175624
176223
|
const v2 = r2.siteRevision?.revision ?? r2.revision;
|
|
175625
176224
|
return v2 == null ? void 0 : String(v2);
|
|
175626
176225
|
}
|
|
175627
|
-
function codeAppIdFromRevision(
|
|
175628
|
-
if (!
|
|
175629
|
-
const actions =
|
|
176226
|
+
function codeAppIdFromRevision(json7) {
|
|
176227
|
+
if (!json7 || typeof json7 !== "object") return void 0;
|
|
176228
|
+
const actions = json7.actions;
|
|
175630
176229
|
if (!Array.isArray(actions)) return void 0;
|
|
175631
176230
|
for (const a2 of actions) {
|
|
175632
176231
|
if (!a2 || typeof a2 !== "object") continue;
|
|
@@ -177151,17 +177750,17 @@ var ServeCliClient = class {
|
|
|
177151
177750
|
body: opts.rawBody !== void 0 ? new Uint8Array(opts.rawBody) : opts.body !== void 0 ? JSON.stringify(opts.body) : void 0
|
|
177152
177751
|
});
|
|
177153
177752
|
const text9 = await res.text();
|
|
177154
|
-
let
|
|
177753
|
+
let json7 = null;
|
|
177155
177754
|
try {
|
|
177156
|
-
|
|
177755
|
+
json7 = text9 ? JSON.parse(text9) : null;
|
|
177157
177756
|
} catch {
|
|
177158
|
-
|
|
177757
|
+
json7 = null;
|
|
177159
177758
|
}
|
|
177160
177759
|
const h2 = {};
|
|
177161
177760
|
res.headers.forEach((v2, k2) => {
|
|
177162
177761
|
h2[k2] = v2;
|
|
177163
177762
|
});
|
|
177164
|
-
return { status: res.status, ok: res.ok, json:
|
|
177763
|
+
return { status: res.status, ok: res.ok, json: json7, text: text9, headers: h2 };
|
|
177165
177764
|
}
|
|
177166
177765
|
// ---- serve (device-facing reads) ----
|
|
177167
177766
|
health(plane) {
|
|
@@ -177397,14 +177996,14 @@ var ServeCliClient = class {
|
|
|
177397
177996
|
const refusal = res.json;
|
|
177398
177997
|
const decodedOverPlainCap = res.status === 413 && refusal?.error === "payload_too_large" && refusal.limit === MAX_PUBLISH_BODY_BYTES && bytes2.byteLength <= MAX_PUBLISH_BODY_BYTES;
|
|
177399
177998
|
if (gzip && (res.status === 400 && refusal?.error === "bad_json" || decodedOverPlainCap)) {
|
|
177400
|
-
const
|
|
177999
|
+
const json7 = {
|
|
177401
178000
|
code: "compressed_publish_unsupported",
|
|
177402
178001
|
error: "compressed_publish_unsupported",
|
|
177403
178002
|
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
178003
|
sentBytes: bytes2.byteLength,
|
|
177405
178004
|
...typeof refusal?.bytes === "number" ? { planeCountedBytes: refusal.bytes } : {}
|
|
177406
178005
|
};
|
|
177407
|
-
return { ...res, json:
|
|
178006
|
+
return { ...res, json: json7, text: JSON.stringify(json7) };
|
|
177408
178007
|
}
|
|
177409
178008
|
return res;
|
|
177410
178009
|
}
|
|
@@ -177783,8 +178382,8 @@ var BO_WEWIX_COOKIE = "WixBoAuthentication-wewix";
|
|
|
177783
178382
|
function dpxCookieHeader(raw) {
|
|
177784
178383
|
const trimmed = raw.trim();
|
|
177785
178384
|
try {
|
|
177786
|
-
const
|
|
177787
|
-
const obj3 = JSON.parse(
|
|
178385
|
+
const json7 = Buffer.from(trimmed, "base64url").toString("utf8");
|
|
178386
|
+
const obj3 = JSON.parse(json7);
|
|
177788
178387
|
if (obj3 && typeof obj3 === "object") {
|
|
177789
178388
|
const pairs = [
|
|
177790
178389
|
typeof obj3.wewix === "string" ? `${BO_WEWIX_COOKIE}=${obj3.wewix}` : void 0,
|
|
@@ -180168,10 +180767,10 @@ async function fetchPackumentFrom(registry2, fetchImpl, timeoutMs) {
|
|
|
180168
180767
|
signal: controller.signal
|
|
180169
180768
|
});
|
|
180170
180769
|
if (!response.ok) return void 0;
|
|
180171
|
-
const
|
|
180172
|
-
const latest = typeof
|
|
180770
|
+
const json7 = await response.json();
|
|
180771
|
+
const latest = typeof json7?.["dist-tags"]?.latest === "string" ? json7["dist-tags"].latest : void 0;
|
|
180173
180772
|
const time = {};
|
|
180174
|
-
for (const [version4, when] of Object.entries(
|
|
180773
|
+
for (const [version4, when] of Object.entries(json7?.time ?? {})) if (typeof when === "string") time[version4] = when;
|
|
180175
180774
|
return latest ? { latest, time, registry: normalizeRegistry(registry2) ?? registry2 } : void 0;
|
|
180176
180775
|
} catch {
|
|
180177
180776
|
return void 0;
|