@wix/himalaya-cli 0.1529.0 → 0.1531.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/stdlib/wix-sdk/bookings-v2/src/index.d.ts +24 -0
- package/dist/cli.mjs +717 -481
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/release-notes.md +17 -0
- package/guides/templates.md +11 -1
- package/guides/tier-5-add-a-screen.md +4 -0
- package/package.json +2 -2
- package/templates/beauty-salon/dev/index.ts +3013 -3074
- package/templates/beauty-salon/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/beauty-salon/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/beauty-salon/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/beauty-salon/tier5-src/himi-booking-bookings/index.ts +385 -74
- package/templates/beauty-salon/tier5-src/himi-branded-lite-agenda/index.ts +240 -74
- package/templates/beauty-salon-owner/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/beauty-salon-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/branded-lite/dev/index.ts +3121 -3195
- package/templates/branded-lite/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/branded-lite/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/branded-lite/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/branded-lite/tier5-src/himi-booking-bookings/index.ts +385 -74
- package/templates/branded-lite/tier5-src/himi-branded-lite-agenda/index.ts +240 -74
- package/templates/community-club/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/community-club/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/community-club/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/community-club-owner/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/community-club-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/events-meetups/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/events-meetups/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/events-meetups/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/events-meetups-owner/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/events-meetups-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/gym-fitness/dev/index.ts +3023 -3097
- package/templates/gym-fitness/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/gym-fitness/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/gym-fitness/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/gym-fitness/tier5-src/himi-booking-bookings/index.ts +385 -74
- package/templates/gym-fitness/tier5-src/himi-branded-lite-agenda/index.ts +240 -74
- package/templates/gym-fitness-owner/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/gym-fitness-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/nonprofit-cause/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/nonprofit-cause/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/nonprofit-cause/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/nonprofit-cause-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/owner-lite/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/owner-lite/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/podcast-creator/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/podcast-creator/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/podcast-creator/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/podcast-creator-owner/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/podcast-creator-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/portfolio-creative/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/portfolio-creative/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/portfolio-creative/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/portfolio-creative-owner/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/portfolio-creative-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/restaurant/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/restaurant/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/restaurant/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/restaurant-owner/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/restaurant-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/retail-store/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/retail-store/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/retail-store/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/retail-store-owner/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/retail-store-owner/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/yoga-studio/dev/index.ts +3018 -3092
- package/templates/yoga-studio/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/yoga-studio/tier5-src/_shared/engine-intl.ts +18 -0
- package/templates/yoga-studio/tier5-src/_shared/member-bookings.ts +50 -7
- package/templates/yoga-studio/tier5-src/himi-booking-bookings/index.ts +385 -74
- package/templates/yoga-studio/tier5-src/himi-branded-lite-agenda/index.ts +240 -74
- package/templates/yoga-studio-owner/tier5-src/_shared/collection-service.ts +23 -5
- package/templates/yoga-studio-owner/tier5-src/_shared/engine-intl.ts +18 -0
package/dist/cli.mjs
CHANGED
|
@@ -357,9 +357,9 @@ function isComponentAllowed(surface, componentType) {
|
|
|
357
357
|
reason: `no ${gate.platform} template expresses ${componentType} (templates: ${gate.templates.join(", ")})`
|
|
358
358
|
};
|
|
359
359
|
}
|
|
360
|
-
const
|
|
361
|
-
if (!
|
|
362
|
-
return
|
|
360
|
+
const row2 = WIDGET_VOCABULARY[componentType];
|
|
361
|
+
if (!row2) return { allowed: true };
|
|
362
|
+
return row2[gate.family] ? { allowed: true } : { allowed: false, reason: `not in the ${gate.family} allowlist` };
|
|
363
363
|
}
|
|
364
364
|
var PREVIEW_EXEMPT_PLATFORM_KEYS, WATCH_UNAVAILABLE, CAR_TEMPLATES, PROJECTION_SNAPSHOT_SIZE, widgetSurface, PREVIEW_SURFACES, SURFACE_GROUPS, SURFACE_VIEW_LADDER;
|
|
365
365
|
var init_preview_surfaces = __esm({
|
|
@@ -635,7 +635,14 @@ var init_source_deny = __esm({
|
|
|
635
635
|
// a template publish would serve it unauthenticated and `himi init --template` would copy one
|
|
636
636
|
// author's hooks into every new app. Nothing is lost: the skill copies are regenerated by
|
|
637
637
|
// `himi agent-init`, which a restored or template-made app runs (or `himi init` already did).
|
|
638
|
-
...AGENT_TOOLING_DIRS
|
|
638
|
+
...AGENT_TOOLING_DIRS,
|
|
639
|
+
// Host and Wix CLI local state, never OTA content. AppSmith pods run the app at /user-code and
|
|
640
|
+
// keep their worker state under it (`.wix/app-smith-remote-machine/logs/*.log`,
|
|
641
|
+
// `bootstrap.complete.json`). Archived, a log line holding a signed S3 URL made `himi push`
|
|
642
|
+
// refuse the source as a leaked AWS key id; the agent may not edit `.wix/`, so it pushed with
|
|
643
|
+
// `--no-source`, and every later `himi pull` of that release failed `app_source_not_found`.
|
|
644
|
+
// The logs also landed in the owner-downloadable archive.
|
|
645
|
+
".wix"
|
|
639
646
|
]);
|
|
640
647
|
DENY_ROOT_DIRS = /* @__PURE__ */ new Set(["shots", "evidence"]);
|
|
641
648
|
DENY_FILES = [
|
|
@@ -735,14 +742,14 @@ function primaryCtaStructureGap(text11) {
|
|
|
735
742
|
if (!tables.length) return "Its acceptance table has no rows.";
|
|
736
743
|
const ctaTables = tables.map((table) => ({ table, cta: table.header.findIndex((cell2) => /primary\s*(?:cta|call[- ]?to[- ]?action|action)/i.test(cell2)) })).filter((entry) => entry.cta >= 0);
|
|
737
744
|
if (!ctaTables.length) return "Its acceptance table has no `Primary CTA` column.";
|
|
738
|
-
const unanswered = ctaTables.flatMap(({ table, cta }) => table.data.filter((
|
|
745
|
+
const unanswered = ctaTables.flatMap(({ table, cta }) => table.data.filter((row2) => !namesOneCta(row2[cta] ?? "")));
|
|
739
746
|
if (unanswered.length) {
|
|
740
747
|
return `${unanswered.length} acceptance row(s) do not name exactly one primary CTA (first: ${JSON.stringify(unanswered[0][0] ?? "")}).`;
|
|
741
748
|
}
|
|
742
749
|
const data = ctaTables.flatMap(({ table }) => table.data);
|
|
743
750
|
const flat = (value2) => value2.toLowerCase().replace(/[^a-z0-9]+/g, " ").trim();
|
|
744
|
-
const rowText = data.map((
|
|
745
|
-
const missing3 = declaredStates(text11).filter((state) => !rowText.some((
|
|
751
|
+
const rowText = data.map((row2) => flat(row2.join(" ")));
|
|
752
|
+
const missing3 = declaredStates(text11).filter((state) => !rowText.some((row2) => row2.includes(flat(state))));
|
|
746
753
|
if (missing3.length) return `The acceptance table has no row for the declared state(s): ${missing3.join(", ")}.`;
|
|
747
754
|
return null;
|
|
748
755
|
}
|
|
@@ -1225,12 +1232,18 @@ function sentinelizeArchive(raw, fallbackName) {
|
|
|
1225
1232
|
const name = contentName ?? config.match(/\bname\s*:\s*["']([^"'\n]+)["']/)?.[1] ?? fallbackName;
|
|
1226
1233
|
const packageSlug = new RegExp(`\\b(const PACKAGE_SLUG = )"${escapeRe(name)}"`, "g");
|
|
1227
1234
|
return Object.fromEntries(
|
|
1228
|
-
entries.map(([rel, body]) =>
|
|
1229
|
-
rel,
|
|
1230
|
-
|
|
1231
|
-
|
|
1235
|
+
entries.map(([rel, body]) => {
|
|
1236
|
+
const out2 = sentinelizeIdentity(body, { name: IDENTITY_FILES.has(rel) ? name : void 0, ids }).replace(packageSlug, '$1"__HIMI_APP_SLUG__"');
|
|
1237
|
+
return [rel, rel === "config.ts" ? sentinelizeScheme(out2, name) : out2];
|
|
1238
|
+
})
|
|
1232
1239
|
);
|
|
1233
1240
|
}
|
|
1241
|
+
function sentinelizeScheme(config, appName2) {
|
|
1242
|
+
const slug = appName2.replace(/[^a-z0-9+.-]/gi, "-").toLowerCase();
|
|
1243
|
+
if (!slug) return config;
|
|
1244
|
+
const scheme = escapeRe(`himalaya-${slug}`);
|
|
1245
|
+
return config.replace(new RegExp(`(["'\`])${scheme}\\1`, "g"), "$1himalaya-__HIMI_APP_SLUG__$1").replace(new RegExp(`(["'\`])${scheme}://`, "g"), "$1himalaya-__HIMI_APP_SLUG__://");
|
|
1246
|
+
}
|
|
1234
1247
|
function materializeSource(files, name, destDir, slug = name) {
|
|
1235
1248
|
const written = [];
|
|
1236
1249
|
const kept = [];
|
|
@@ -1616,8 +1629,8 @@ function userScoped(rule) {
|
|
|
1616
1629
|
function validateBase44Entities(cfg, app) {
|
|
1617
1630
|
if (!cfg) return [];
|
|
1618
1631
|
const issues = [];
|
|
1619
|
-
const add = (severity, ruleCode, entity,
|
|
1620
|
-
const err = (ruleCode, entity,
|
|
1632
|
+
const add = (severity, ruleCode, entity, message2) => issues.push({ severity, ruleCode, message: message2, ...entity !== void 0 ? { entity } : {} });
|
|
1633
|
+
const err = (ruleCode, entity, message2) => add("error", ruleCode, entity, message2);
|
|
1621
1634
|
const prefix = base44Prefix(app);
|
|
1622
1635
|
const types = new Set(BASE44_FIELD_TYPES);
|
|
1623
1636
|
const formats = new Set(BASE44_STRING_FORMATS);
|
|
@@ -1697,12 +1710,12 @@ function validateBase44Entities(cfg, app) {
|
|
|
1697
1710
|
} else if (!Array.isArray(spec.seed)) {
|
|
1698
1711
|
err("shape-invalid", name, "seed must be an array of row objects");
|
|
1699
1712
|
} else {
|
|
1700
|
-
spec.seed.forEach((
|
|
1701
|
-
if (!
|
|
1713
|
+
spec.seed.forEach((row2, index) => {
|
|
1714
|
+
if (!row2 || typeof row2 !== "object" || Array.isArray(row2)) {
|
|
1702
1715
|
err("shape-invalid", name, `seed row ${index} must be an object`);
|
|
1703
1716
|
return;
|
|
1704
1717
|
}
|
|
1705
|
-
for (const key3 of Object.keys(
|
|
1718
|
+
for (const key3 of Object.keys(row2)) {
|
|
1706
1719
|
if (!keys.has(key3)) err("seed-key-unknown", name, `seed row ${index} sets undeclared field "${key3}"`);
|
|
1707
1720
|
}
|
|
1708
1721
|
});
|
|
@@ -1855,7 +1868,7 @@ function validateCmsConfig(cms, app, opts = {}) {
|
|
|
1855
1868
|
const prefix = namespacePrefix(app);
|
|
1856
1869
|
const types = new Set(WIX_FIELD_TYPES);
|
|
1857
1870
|
const seenIds = /* @__PURE__ */ new Set();
|
|
1858
|
-
const err = (collection,
|
|
1871
|
+
const err = (collection, message2) => issues.push({ collection, severity: "error", message: message2 });
|
|
1859
1872
|
if (!Array.isArray(cms.collections)) {
|
|
1860
1873
|
err(null, "cms.collections must be an array");
|
|
1861
1874
|
return issues;
|
|
@@ -1937,12 +1950,12 @@ function validateCmsConfig(cms, app, opts = {}) {
|
|
|
1937
1950
|
err(name, "seed must be an array of row objects");
|
|
1938
1951
|
} else if (spec.seed) {
|
|
1939
1952
|
if (!spec.id) err(name, "an adopted collection cannot declare `seed` \u2014 himi never writes to collections it does not own");
|
|
1940
|
-
else spec.seed.forEach((
|
|
1941
|
-
if (!
|
|
1953
|
+
else spec.seed.forEach((row2, index) => {
|
|
1954
|
+
if (!row2 || typeof row2 !== "object" || Array.isArray(row2)) {
|
|
1942
1955
|
err(name, `seed row ${index} must be an object`);
|
|
1943
1956
|
return;
|
|
1944
1957
|
}
|
|
1945
|
-
Object.keys(
|
|
1958
|
+
Object.keys(row2).forEach((key3) => {
|
|
1946
1959
|
if (!keys.has(key3)) err(name, `seed row ${index} sets undeclared field "${key3}"`);
|
|
1947
1960
|
});
|
|
1948
1961
|
});
|
|
@@ -1975,7 +1988,7 @@ function validateDataResources(data, app) {
|
|
|
1975
1988
|
data.collections ? { collections: data.collections, ...data.memberGated ? { memberGated: true } : {} } : void 0,
|
|
1976
1989
|
app
|
|
1977
1990
|
).map((issue2) => ({ resource: issue2.collection, severity: issue2.severity, message: issue2.message }));
|
|
1978
|
-
const err = (resource,
|
|
1991
|
+
const err = (resource, message2) => issues.push({ resource, severity: "error", message: message2 });
|
|
1979
1992
|
if ((data.kv?.length ?? 0) > 0 && !appIdIsNamespaceSafe(app)) err(null, `app id "${app}" must be lowercase kebab-case for isolated data ownership`);
|
|
1980
1993
|
if (data.kv !== void 0 && !Array.isArray(data.kv)) {
|
|
1981
1994
|
err(null, "data.kv must be an array");
|
|
@@ -3093,7 +3106,7 @@ function summarizeLint(app, bres, outcome, strict, extraIssues = []) {
|
|
|
3093
3106
|
};
|
|
3094
3107
|
const record2 = (value2) => value2 && typeof value2 === "object" && !Array.isArray(value2) ? value2 : {};
|
|
3095
3108
|
const text11 = (value2) => typeof value2 === "string" && value2 ? value2 : void 0;
|
|
3096
|
-
const
|
|
3109
|
+
const message2 = (value2) => {
|
|
3097
3110
|
const item = record2(value2);
|
|
3098
3111
|
if (text11(item.message)) return text11(item.message);
|
|
3099
3112
|
if (text11(item.error)) return text11(item.error);
|
|
@@ -3116,14 +3129,14 @@ function summarizeLint(app, bres, outcome, strict, extraIssues = []) {
|
|
|
3116
3129
|
path: text11(record2(value2).bundle),
|
|
3117
3130
|
ruleCode: "compile-error",
|
|
3118
3131
|
severity: "error",
|
|
3119
|
-
message:
|
|
3132
|
+
message: message2(value2)
|
|
3120
3133
|
})),
|
|
3121
3134
|
...outcome.failedToBuild.map((value2) => ({
|
|
3122
3135
|
pass: "build",
|
|
3123
3136
|
screen: text11(record2(value2).screenId),
|
|
3124
3137
|
ruleCode: "failed-to-build",
|
|
3125
3138
|
severity: "error",
|
|
3126
|
-
message:
|
|
3139
|
+
message: message2(value2)
|
|
3127
3140
|
})),
|
|
3128
3141
|
...outcome.missingBundles.map((value2) => ({
|
|
3129
3142
|
pass: "build",
|
|
@@ -3131,14 +3144,14 @@ function summarizeLint(app, bres, outcome, strict, extraIssues = []) {
|
|
|
3131
3144
|
path: text11(record2(value2).bundle),
|
|
3132
3145
|
ruleCode: "missing-bundle",
|
|
3133
3146
|
severity: "error",
|
|
3134
|
-
message:
|
|
3147
|
+
message: message2(value2)
|
|
3135
3148
|
})),
|
|
3136
3149
|
...workerThrows.map((value2) => ({
|
|
3137
3150
|
pass: "worker",
|
|
3138
3151
|
path: text11(record2(value2).bundle),
|
|
3139
3152
|
ruleCode: "worker-threw",
|
|
3140
3153
|
severity: "error",
|
|
3141
|
-
message:
|
|
3154
|
+
message: message2(value2.threw)
|
|
3142
3155
|
}))
|
|
3143
3156
|
]
|
|
3144
3157
|
});
|
|
@@ -3382,8 +3395,8 @@ function catalogManifestDigest(manifest2) {
|
|
|
3382
3395
|
} = manifest2;
|
|
3383
3396
|
return hash(canonical(body));
|
|
3384
3397
|
}
|
|
3385
|
-
function fail(code,
|
|
3386
|
-
throw new CatalogError(code,
|
|
3398
|
+
function fail(code, message2) {
|
|
3399
|
+
throw new CatalogError(code, message2);
|
|
3387
3400
|
}
|
|
3388
3401
|
function safePath(path2) {
|
|
3389
3402
|
if (typeof path2 !== "string" || !path2 || path2.length > 512 || path2.includes("\\") || path2.startsWith("/") || path2.split("/").some(
|
|
@@ -3444,8 +3457,8 @@ var init_catalog_cache = __esm({
|
|
|
3444
3457
|
MAX_PACK = 16 * 1024 * 1024;
|
|
3445
3458
|
MAX_EXPANDED = 64 * 1024 * 1024;
|
|
3446
3459
|
CatalogError = class extends Error {
|
|
3447
|
-
constructor(code,
|
|
3448
|
-
super(
|
|
3460
|
+
constructor(code, message2) {
|
|
3461
|
+
super(message2);
|
|
3449
3462
|
this.code = code;
|
|
3450
3463
|
this.name = "CatalogError";
|
|
3451
3464
|
}
|
|
@@ -4300,8 +4313,8 @@ var init_catalog_v2 = __esm({
|
|
|
4300
4313
|
"../html-to-t5/catalog.v2.json"() {
|
|
4301
4314
|
catalog_v2_default = {
|
|
4302
4315
|
encoding: "gzip-base64",
|
|
4303
|
-
sha256: "
|
|
4304
|
-
data: "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"
|
|
4316
|
+
sha256: "da9148b1f5ea7fb20a46b896858ffdca7453c53edc833686eff49d77122e192f",
|
|
4317
|
+
data: "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"
|
|
4305
4318
|
};
|
|
4306
4319
|
}
|
|
4307
4320
|
});
|
|
@@ -4594,9 +4607,9 @@ function inspectModule(source, file2, profile, diagnostics) {
|
|
|
4594
4607
|
function analyzeController(source, file2, profile, diagnostics) {
|
|
4595
4608
|
inspectModule(source, file2, profile, diagnostics);
|
|
4596
4609
|
const sf2 = ts2.createSourceFile(file2, source, ts2.ScriptTarget.Latest, true);
|
|
4597
|
-
const error = (node,
|
|
4610
|
+
const error = (node, message2) => {
|
|
4598
4611
|
const p2 = sf2.getLineAndCharacterOfPosition(node.getStart(sf2));
|
|
4599
|
-
diagnostics.push({ code: "HHP-CONTROLLER", severity: "error", file: file2, line: p2.line + 1, column: p2.character + 1, message });
|
|
4612
|
+
diagnostics.push({ code: "HHP-CONTROLLER", severity: "error", file: file2, line: p2.line + 1, column: p2.character + 1, message: message2 });
|
|
4600
4613
|
};
|
|
4601
4614
|
const declaration = sf2.statements.find((n2) => ts2.isExportAssignment(n2) && !n2.isExportEquals);
|
|
4602
4615
|
if (!declaration || !ts2.isCallExpression(declaration.expression) || declaration.expression.expression.getText(sf2) !== "defineController") {
|
|
@@ -5367,7 +5380,7 @@ function compileV2(html, profile, options) {
|
|
|
5367
5380
|
const requiredCapabilities2 = /* @__PURE__ */ new Set();
|
|
5368
5381
|
const $2 = cheerio2.load(html, { sourceCodeLocationInfo: true });
|
|
5369
5382
|
const loc = (el2) => ({ file: options.file, line: el2?.sourceCodeLocation?.startLine ?? 1, column: el2?.sourceCodeLocation?.startCol ?? 1 });
|
|
5370
|
-
const error = (el2, code,
|
|
5383
|
+
const error = (el2, code, message2, hint) => diagnostics.push({ ...loc(el2), code, severity: "error", message: message2, ...hint ? { hint } : {} });
|
|
5371
5384
|
const meta = (name) => $2(`meta[name="${name}"]`).attr("content");
|
|
5372
5385
|
const screenId = options.screenId ?? meta("himalaya-screen-id");
|
|
5373
5386
|
if (!screenId || !/^[a-z][a-z0-9_.]*$/.test(screenId)) error(null, "HHP-SCREEN-ID", "Provide a stable lowercase screen id.");
|
|
@@ -5430,7 +5443,7 @@ function compileV2(html, profile, options) {
|
|
|
5430
5443
|
});
|
|
5431
5444
|
for (const rule of rules) {
|
|
5432
5445
|
const type = rule.declarations.display === "grid" || rule.declarations["grid-template-columns"] ? "Grid" : "VStack";
|
|
5433
|
-
translateStyle(rule.declarations, profile, type, {}, {}, (
|
|
5446
|
+
translateStyle(rule.declarations, profile, type, {}, {}, (message2, hint, property2) => diagnostics.push({ code: "HHP-CSS-VALUE", severity: "error", ...rule.locations[property2 ?? ""] ?? { file: rule.file, line: rule.line, column: 1 }, message: message2, ...hint ? { hint } : {} }));
|
|
5434
5447
|
}
|
|
5435
5448
|
rules.sort((a2, b2) => a2.specificity - b2.specificity);
|
|
5436
5449
|
const tags = new Map(Object.entries(profile.components).map(([name, spec]) => [spec.tag, name]));
|
|
@@ -5488,9 +5501,9 @@ function compileV2(html, profile, options) {
|
|
|
5488
5501
|
if (!profile.surfaces.every((s2) => field.surfaces.includes(s2))) error(el2, "HHP-FIELD-SURFACE", `${name} is unsupported on an enabled surface.`);
|
|
5489
5502
|
}
|
|
5490
5503
|
const statePath = (raw) => raw.startsWith(`${serviceName}.`) ? raw.slice(serviceName.length + 1) : raw;
|
|
5491
|
-
function path2(el2, raw,
|
|
5504
|
+
function path2(el2, raw, row2) {
|
|
5492
5505
|
if (raw.startsWith("$item.")) {
|
|
5493
|
-
if (!
|
|
5506
|
+
if (!row2) error(el2, "HHP-BINDING-SCOPE", "Item bindings require a keyed list template.");
|
|
5494
5507
|
return raw;
|
|
5495
5508
|
}
|
|
5496
5509
|
const relative20 = statePath(raw);
|
|
@@ -5498,9 +5511,9 @@ function compileV2(html, profile, options) {
|
|
|
5498
5511
|
return `$service:${serviceName}.${relative20}`;
|
|
5499
5512
|
}
|
|
5500
5513
|
const read = (value2, dotted) => dotted.split(".").reduce((current, key3) => current && typeof current === "object" && Object.hasOwn(current, key3) ? current[key3] : void 0, value2);
|
|
5501
|
-
function rowValues(
|
|
5502
|
-
if (!
|
|
5503
|
-
const [root, ...nested] =
|
|
5514
|
+
function rowValues(row2, raw) {
|
|
5515
|
+
if (!row2) return [];
|
|
5516
|
+
const [root, ...nested] = row2.split(".$item.");
|
|
5504
5517
|
let rows = info4?.paths.get(root);
|
|
5505
5518
|
for (const key3 of nested) rows = Array.isArray(rows) ? rows.flatMap((item) => {
|
|
5506
5519
|
const value2 = read(item, key3);
|
|
@@ -5521,7 +5534,7 @@ function compileV2(html, profile, options) {
|
|
|
5521
5534
|
}
|
|
5522
5535
|
return raw;
|
|
5523
5536
|
}
|
|
5524
|
-
function compile(el2, treePath,
|
|
5537
|
+
function compile(el2, treePath, row2 = false) {
|
|
5525
5538
|
const element = $2(el2), attrs = el2.attribs, tag = el2.tagName;
|
|
5526
5539
|
let type = attrs["data-component"] ?? tags.get(tag) ?? semantic[tag];
|
|
5527
5540
|
if (tag === "input" && attrs.type === "checkbox") type = "Toggle";
|
|
@@ -5544,10 +5557,10 @@ function compileV2(html, profile, options) {
|
|
|
5544
5557
|
}
|
|
5545
5558
|
if (style.display && !["main", "div", "header", "footer", "nav", "himi-v-stack", "himi-h-stack", "himi-grid"].includes(tag))
|
|
5546
5559
|
error(el2, "HHP-CSS-COMPONENT", "display layout rules require a stack or grid container.");
|
|
5547
|
-
type = translateStyle(style, profile, type, props, mods, (
|
|
5560
|
+
type = translateStyle(style, profile, type, props, mods, (message2, hint, property2) => diagnostics.push({ code: "HHP-CSS-VALUE", severity: "error", ...styleLocations[property2 ?? ""] ?? loc(el2), message: message2, ...hint ? { hint } : {} }));
|
|
5548
5561
|
const spec = Object.hasOwn(profile.components, type) ? profile.components[type] : void 0;
|
|
5549
5562
|
let id = attrs["data-id"] ?? attrs.id ?? `hhp.${screenId}.${treePath}`;
|
|
5550
|
-
if (
|
|
5563
|
+
if (row2 && !id.includes("$item.")) id += ".$item.id";
|
|
5551
5564
|
if (ids.has(id)) error(el2, "HHP-DUPLICATE-ID", `Duplicate component id ${id}.`);
|
|
5552
5565
|
if (!/^[a-zA-Z_][\w.$-]*$/.test(id)) error(el2, "HHP-COMPONENT-ID", `Invalid component id ${id}.`);
|
|
5553
5566
|
ids.add(id);
|
|
@@ -5564,20 +5577,20 @@ function compileV2(html, profile, options) {
|
|
|
5564
5577
|
if (/{{|}}/.test(text11.replace(/{{\s*[\w.$]+\s*}}/g, ""))) error(el2, "HHP-TEXT-EXPRESSION", "Text interpolation accepts state/item paths; compute expressions in the controller.");
|
|
5565
5578
|
if (matches.length) {
|
|
5566
5579
|
if (matches.length === 1 && matches[0][0] === text11 && type === "Text") {
|
|
5567
|
-
props.text = path2(el2, matches[0][1],
|
|
5580
|
+
props.text = path2(el2, matches[0][1], row2);
|
|
5568
5581
|
} else if (controller && type === "Text") {
|
|
5569
|
-
for (const match of matches) path2(el2, match[1],
|
|
5582
|
+
for (const match of matches) path2(el2, match[1], row2);
|
|
5570
5583
|
const key3 = `t${textProjections.length}`;
|
|
5571
5584
|
const normalized = text11.replace(/{{\s*([\w.$]+)\s*}}/g, (_match, raw) => `{{${raw.startsWith("$item.") ? raw : statePath(raw)}}}`);
|
|
5572
|
-
textProjections.push({ key: key3, text: normalized, ...
|
|
5573
|
-
props.text =
|
|
5585
|
+
textProjections.push({ key: key3, text: normalized, ...row2 ? { collection: row2 } : {} });
|
|
5586
|
+
props.text = row2 ? `$item.__hhpText_${key3}` : `$service:${serviceName}.__hhpText.${key3}`;
|
|
5574
5587
|
} else {
|
|
5575
5588
|
if (profile.surfaces.some((surface) => surface === "ios" || surface === "android" || surface === "macos"))
|
|
5576
5589
|
error(el2, "HHP-TEXT-TEMPLATE-SURFACE", "Text templates are not implemented by the enabled native renderers.", "Compute the complete string in controller state and bind it on a Text component with {{path}} or bind:content.");
|
|
5577
5590
|
const params = {};
|
|
5578
5591
|
let template = text11;
|
|
5579
5592
|
matches.forEach((m2, i2) => {
|
|
5580
|
-
params[`v${i2}`] = path2(el2, m2[1],
|
|
5593
|
+
params[`v${i2}`] = path2(el2, m2[1], row2);
|
|
5581
5594
|
template = template.replace(m2[0], `{v${i2}}`);
|
|
5582
5595
|
});
|
|
5583
5596
|
props.template = { template, params };
|
|
@@ -5672,8 +5685,8 @@ function compileV2(html, profile, options) {
|
|
|
5672
5685
|
continue;
|
|
5673
5686
|
}
|
|
5674
5687
|
if (attr3 === "bind:hidden") {
|
|
5675
|
-
mods.hiddenPath = path2(el2, raw,
|
|
5676
|
-
const values = raw.startsWith("$item.") ? rowValues(
|
|
5688
|
+
mods.hiddenPath = path2(el2, raw, row2);
|
|
5689
|
+
const values = raw.startsWith("$item.") ? rowValues(row2, raw) : [info4?.paths.get(statePath(raw))];
|
|
5677
5690
|
if (values.some((value2) => typeof value2 !== "boolean")) error(el2, "HHP-BINDING-TYPE", "bind:hidden requires boolean state.");
|
|
5678
5691
|
continue;
|
|
5679
5692
|
}
|
|
@@ -5697,10 +5710,10 @@ function compileV2(html, profile, options) {
|
|
|
5697
5710
|
error(el2, "HHP-BINDING-SCOPE", `${type}.${name2} binds only controller state, not a row field.`);
|
|
5698
5711
|
continue;
|
|
5699
5712
|
}
|
|
5700
|
-
props[field2.binding.field] = path2(el2, raw,
|
|
5713
|
+
props[field2.binding.field] = path2(el2, raw, row2);
|
|
5701
5714
|
const expected = field2.binding.state;
|
|
5702
5715
|
if (expected) {
|
|
5703
|
-
const values = raw.startsWith("$item.") ? rowValues(
|
|
5716
|
+
const values = raw.startsWith("$item.") ? rowValues(row2, raw) : info4?.paths.has(statePath(raw)) ? [info4.paths.get(statePath(raw))] : [];
|
|
5704
5717
|
if (values.some((value2) => typeof value2 !== expected)) error(el2, "HHP-BINDING-TYPE", `${attr3} requires ${expected} state (${field2.binding.note ?? `native ${field2.binding.field}`}).`);
|
|
5705
5718
|
} else if (field2.binding.mechanism === "path" && props[name2] === void 0) {
|
|
5706
5719
|
if (raw.startsWith("$item.")) {
|
|
@@ -5732,7 +5745,7 @@ function compileV2(html, profile, options) {
|
|
|
5732
5745
|
if (attr3.startsWith("data-mod-") || attr3.startsWith("himi-mod-")) {
|
|
5733
5746
|
const name2 = camel(attr3.slice(9)), field2 = own6(profile.modifiers, name2);
|
|
5734
5747
|
if (!field2) error(el2, "HHP-MODIFIER", `Unknown or unsupported modifier ${name2}.`);
|
|
5735
|
-
else if (name2.endsWith("Path") && field2.schema.type === "string") mods[name2] = raw.startsWith("$") && !raw.startsWith("$item.") ? raw : path2(el2, raw,
|
|
5748
|
+
else if (name2.endsWith("Path") && field2.schema.type === "string") mods[name2] = raw.startsWith("$") && !raw.startsWith("$item.") ? raw : path2(el2, raw, row2);
|
|
5736
5749
|
else {
|
|
5737
5750
|
mods[name2] = coerce(raw, field2);
|
|
5738
5751
|
structured(el2, mods[name2]);
|
|
@@ -5769,7 +5782,7 @@ function compileV2(html, profile, options) {
|
|
|
5769
5782
|
}
|
|
5770
5783
|
for (const rule of matching.filter((r3) => r3.breakpoint)) {
|
|
5771
5784
|
const responsiveProps = {};
|
|
5772
|
-
translateStyle(rule.declarations, profile, type, responsiveProps, {}, (
|
|
5785
|
+
translateStyle(rule.declarations, profile, type, responsiveProps, {}, (message2, hint, property2) => diagnostics.push({ code: "HHP-CSS-VALUE", severity: "error", ...rule.locations[property2 ?? ""] ?? { file: rule.file, line: rule.line, column: 1 }, message: message2, ...hint ? { hint } : {} }));
|
|
5773
5786
|
if (type !== "Grid") error(el2, "HHP-CSS-RESPONSIVE", "Container column overrides require a Grid.");
|
|
5774
5787
|
}
|
|
5775
5788
|
for (const breakpoint of [600, 840]) {
|
|
@@ -5819,7 +5832,7 @@ function compileV2(html, profile, options) {
|
|
|
5819
5832
|
const submit = type === "Form" && child.tagName === "button" && $2(child).attr("type") === "submit";
|
|
5820
5833
|
if (submit && attrs["on:submit"] && !$2(child).attr("on:click")) $2(child).attr("on:click", attrs["on:submit"]);
|
|
5821
5834
|
const slot = submit ? "submitButton" : $2(child).attr("slot") ?? $2(child).attr("data-slot");
|
|
5822
|
-
const childRow = each ? each.startsWith("$item.") &&
|
|
5835
|
+
const childRow = each ? each.startsWith("$item.") && row2 ? `${row2}.$item.${each.slice(6)}` : statePath(each) : row2;
|
|
5823
5836
|
const built = compile(child, `${treePath}.${index}`, childRow);
|
|
5824
5837
|
if (slot) {
|
|
5825
5838
|
const field = spec.fields[camel(slot)];
|
|
@@ -5839,7 +5852,7 @@ function compileV2(html, profile, options) {
|
|
|
5839
5852
|
if (++subtreeCount > 1) error(el2, "HHP-COMPOSITION-POLICY", "Only one WorkerSubtree slot is permitted per screen.");
|
|
5840
5853
|
if (props.policy && typeof props.policy === "object") {
|
|
5841
5854
|
try {
|
|
5842
|
-
for (const
|
|
5855
|
+
for (const message2 of workerSubtreePolicyErrors(props.policy)) error(el2, "HHP-COMPOSITION-POLICY", message2);
|
|
5843
5856
|
} catch {
|
|
5844
5857
|
error(el2, "HHP-COMPOSITION-POLICY", "Invalid WorkerSubtree policy.");
|
|
5845
5858
|
}
|
|
@@ -6226,18 +6239,18 @@ function archiveBytes(dir, bytes2) {
|
|
|
6226
6239
|
return { sha256: sha2567, ext, file: toPosix(rel) };
|
|
6227
6240
|
}
|
|
6228
6241
|
function appendProgress(dir, input) {
|
|
6229
|
-
const
|
|
6230
|
-
if (!
|
|
6231
|
-
if (
|
|
6242
|
+
const message2 = input.message.trim();
|
|
6243
|
+
if (!message2) throw new ProgressError("message_required", "a progress entry needs a message");
|
|
6244
|
+
if (message2.length > MAX_MESSAGE_CHARS) {
|
|
6232
6245
|
throw new ProgressError(
|
|
6233
6246
|
"message_too_long",
|
|
6234
|
-
`a postcard is a line or two (${
|
|
6247
|
+
`a postcard is a line or two (${message2.length} chars; the cap is ${MAX_MESSAGE_CHARS}) \u2014 put the detail in your reply and journal the headline`
|
|
6235
6248
|
);
|
|
6236
6249
|
}
|
|
6237
6250
|
const images = (input.images ?? []).map((src) => archiveImage(dir, src));
|
|
6238
6251
|
const entry = {
|
|
6239
6252
|
ts: (input.now ?? /* @__PURE__ */ new Date()).toISOString(),
|
|
6240
|
-
message,
|
|
6253
|
+
message: message2,
|
|
6241
6254
|
...input.step ? { step: input.step, stepNumber: JOURNEY_STEPS.indexOf(input.step) + 1 } : {},
|
|
6242
6255
|
...images.length ? { images } : {},
|
|
6243
6256
|
...input.auto ? { by: CLI_AUTHOR, milestone: input.auto.milestone, ...input.auto.ref ? { ref: input.auto.ref } : {} } : {}
|
|
@@ -6302,7 +6315,7 @@ function journalMilestone(dir, input) {
|
|
|
6302
6315
|
const step = MILESTONE_STEP[input.milestone];
|
|
6303
6316
|
const abs = input.image ? locateImage(dir, input.image) : null;
|
|
6304
6317
|
const images = abs ? [{ sha256: createHash4("sha256").update(readFileSync7(abs)).digest("hex") }] : [];
|
|
6305
|
-
let
|
|
6318
|
+
let message2 = input.message;
|
|
6306
6319
|
if (input.unlessUnchanged) {
|
|
6307
6320
|
const latest = [...entries].reverse().find((e2) => isCliEntry(e2) && e2.milestone === input.milestone);
|
|
6308
6321
|
const shas = (list2) => [...new Set((list2 ?? []).map((i2) => i2.sha256))].sort().join(",");
|
|
@@ -6311,12 +6324,12 @@ function journalMilestone(dir, input) {
|
|
|
6311
6324
|
const samePicture = !!latest && shas(latest.images) === shas(images);
|
|
6312
6325
|
if (latest && sameHeadline && samePicture) return { journaled: false, reason: "unchanged" };
|
|
6313
6326
|
const note = latest && input.changeNote ? input.changeNote({ previous: latest.message, pictureChanged: !samePicture, hadPicture: shas(latest.images) !== "", hasPicture: images.length > 0 }) : void 0;
|
|
6314
|
-
if (note)
|
|
6327
|
+
if (note) message2 = `${headline2} ${note}`;
|
|
6315
6328
|
}
|
|
6316
6329
|
if (entries.some((e2) => agentCovers(e2, { ts: now.toISOString(), step, images }))) return { journaled: false, reason: "agent-journaled" };
|
|
6317
|
-
if (looksSecret(
|
|
6330
|
+
if (looksSecret(message2)) return { journaled: false, reason: "unsafe" };
|
|
6318
6331
|
const entry = appendProgress(dir, {
|
|
6319
|
-
message,
|
|
6332
|
+
message: message2,
|
|
6320
6333
|
step,
|
|
6321
6334
|
...abs ? { images: [abs] } : {},
|
|
6322
6335
|
now,
|
|
@@ -6556,8 +6569,8 @@ var init_progress = __esm({
|
|
|
6556
6569
|
MAX_MESSAGE_CHARS = 500;
|
|
6557
6570
|
MAX_IMAGE_BYTES = 10 * 1024 * 1024;
|
|
6558
6571
|
ProgressError = class extends Error {
|
|
6559
|
-
constructor(code,
|
|
6560
|
-
super(
|
|
6572
|
+
constructor(code, message2) {
|
|
6573
|
+
super(message2);
|
|
6561
6574
|
this.code = code;
|
|
6562
6575
|
}
|
|
6563
6576
|
};
|
|
@@ -7452,8 +7465,8 @@ var init_preview = __esm({
|
|
|
7452
7465
|
plainRunReason = (r3) => `a plain \`himi run\` (not --watch, pid ${r3.pid}) is serving ${r3.url}; it is not this tool's live preview, so it was left alone \u2014 stop it where it runs to start a live one`;
|
|
7453
7466
|
legacyReason = (r3) => `a preview from an older himi CLI (pid ${r3.pid}) is serving ${r3.url} and cannot prove it is this app's, so it was left alone \u2014 stop it where it runs (Ctrl-C, or \`kill ${r3.pid}\`), then retry`;
|
|
7454
7467
|
PreviewStartError = class extends Error {
|
|
7455
|
-
constructor(
|
|
7456
|
-
super(
|
|
7468
|
+
constructor(message2, log) {
|
|
7469
|
+
super(message2);
|
|
7457
7470
|
this.log = log;
|
|
7458
7471
|
}
|
|
7459
7472
|
};
|
|
@@ -11305,9 +11318,9 @@ function renderedTableName(props) {
|
|
|
11305
11318
|
const columns = own2(props, "columns");
|
|
11306
11319
|
if (Array.isArray(columns) && columns.some(nonempty)) return true;
|
|
11307
11320
|
const rows = own2(props, "rows");
|
|
11308
|
-
return Array.isArray(rows) && rows.some((
|
|
11309
|
-
if (!
|
|
11310
|
-
const cells = own2(
|
|
11321
|
+
return Array.isArray(rows) && rows.some((row2) => {
|
|
11322
|
+
if (!row2 || typeof row2 !== "object" || Array.isArray(row2)) return false;
|
|
11323
|
+
const cells = own2(row2, "cells");
|
|
11311
11324
|
return Array.isArray(cells) && cells.some(nonempty);
|
|
11312
11325
|
});
|
|
11313
11326
|
}
|
|
@@ -11401,12 +11414,12 @@ function accessibleNameGaps(descriptor, options = {}) {
|
|
|
11401
11414
|
if (exposure !== "decorative") {
|
|
11402
11415
|
const tappable = isInteractive(n2) || propHandlers && hasPropHandler(n2);
|
|
11403
11416
|
const type = componentTypeOf(n2);
|
|
11404
|
-
const
|
|
11405
|
-
const contractual = !interactiveOnly &&
|
|
11417
|
+
const row2 = type ? own2(A11Y_CONTRACT, type) : void 0;
|
|
11418
|
+
const contractual = !interactiveOnly && row2?.name === "required";
|
|
11406
11419
|
if ((tappable || contractual) && !hasAccessibleName(n2, options.renderedNamesOnly === true)) {
|
|
11407
11420
|
const body = n2.body && typeof n2.body === "object" && !Array.isArray(n2.body) ? n2.body : void 0;
|
|
11408
11421
|
const props = n2.props && typeof n2.props === "object" && !Array.isArray(n2.props) ? n2.props : body?.props && typeof body.props === "object" && !Array.isArray(body.props) ? body.props : void 0;
|
|
11409
|
-
const inferred = type === "BottomSheet" && props?.modal === false ? "region" :
|
|
11422
|
+
const inferred = type === "BottomSheet" && props?.modal === false ? "region" : row2?.role ?? "unspecified";
|
|
11410
11423
|
out2.push({
|
|
11411
11424
|
at: path2 || "root",
|
|
11412
11425
|
type: type ?? (n2.icon ? "icon" : "node"),
|
|
@@ -11916,7 +11929,7 @@ function appBindingIssues(root, ctx, appActions, isNavItemHidden = (at2) => /^to
|
|
|
11916
11929
|
const verdict = appServicesVerdictOf(ctx);
|
|
11917
11930
|
const issues = [];
|
|
11918
11931
|
for (const ref of refs) {
|
|
11919
|
-
const issue2 = (
|
|
11932
|
+
const issue2 = (message2) => ({ severity: "error", pass: "bindings", path: ref.at, message: message2 });
|
|
11920
11933
|
if (ref.unresolved) {
|
|
11921
11934
|
issues.push(issue2(
|
|
11922
11935
|
`"${ref.value}" can never resolve here: the runtimes resolve bindings only in the TOP-LEVEL values of a non-worker action's params / args, so this string would reach the handler or worker as-is. Move it to a top-level param, or read it in the worker with app.read.`
|
|
@@ -11973,7 +11986,7 @@ function appBindingIssues(root, ctx, appActions, isNavItemHidden = (at2) => /^to
|
|
|
11973
11986
|
function appActionIssue(actionId, at2, ctx, appActions, registeredNative) {
|
|
11974
11987
|
const parsed = parseAppActionId(actionId);
|
|
11975
11988
|
if (!parsed) return null;
|
|
11976
|
-
const issue2 = (
|
|
11989
|
+
const issue2 = (message2) => ({ severity: "error", pass: "actions", path: at2, message: message2 });
|
|
11977
11990
|
if (registeredNative?.has(actionId)) {
|
|
11978
11991
|
return issue2(
|
|
11979
11992
|
`"${actionId}" is registered as a flat native handler, but app.<service>.<action> is reserved for app services (RFC 0074 \xA75) \u2014 rename the handler`
|
|
@@ -13172,9 +13185,9 @@ function buildSweepSource(allow) {
|
|
|
13172
13185
|
}
|
|
13173
13186
|
})(${JSON.stringify(allow)});`;
|
|
13174
13187
|
}
|
|
13175
|
-
function explainWithheldError(
|
|
13176
|
-
if (!deviceParity ||
|
|
13177
|
-
return BARE_FETCH_UNDEFINED.test(
|
|
13188
|
+
function explainWithheldError(message2, deviceParity) {
|
|
13189
|
+
if (!deviceParity || message2.includes(FETCH_ADVICE)) return message2;
|
|
13190
|
+
return BARE_FETCH_UNDEFINED.test(message2) ? `${message2} \u2014 ${FETCH_ADVICE}` : message2;
|
|
13178
13191
|
}
|
|
13179
13192
|
function realmInstallsIntl(intl, hide) {
|
|
13180
13193
|
return intl === true && !(hide ?? []).includes("Intl");
|
|
@@ -13365,8 +13378,8 @@ function runBundleSandbox(bundleJs, opts) {
|
|
|
13365
13378
|
get: (t2, prop2) => prop2 in t2 ? t2[prop2] : inert
|
|
13366
13379
|
});
|
|
13367
13380
|
const mkConsole = () => {
|
|
13368
|
-
const sink = (level) => (
|
|
13369
|
-
consoleLines.push({ level, message: String(
|
|
13381
|
+
const sink = (level) => (message2) => {
|
|
13382
|
+
consoleLines.push({ level, message: String(message2) });
|
|
13370
13383
|
};
|
|
13371
13384
|
return { log: sink("log"), warn: sink("warn"), error: sink("error"), info: sink("info"), debug: sink("debug") };
|
|
13372
13385
|
};
|
|
@@ -13562,11 +13575,11 @@ async function bootBundleWorker(bundleJs, opts) {
|
|
|
13562
13575
|
const pollDirectives = [];
|
|
13563
13576
|
const oversizeWixResponses = [];
|
|
13564
13577
|
const seenOversize = /* @__PURE__ */ new Set();
|
|
13565
|
-
const diagnose = (
|
|
13566
|
-
if (seenOversize.has(
|
|
13567
|
-
seenOversize.add(
|
|
13578
|
+
const diagnose = (message2) => {
|
|
13579
|
+
if (seenOversize.has(message2)) return;
|
|
13580
|
+
seenOversize.add(message2);
|
|
13568
13581
|
try {
|
|
13569
|
-
(opts.onDiagnostic ?? ((m2) => console.warn(m2)))(
|
|
13582
|
+
(opts.onDiagnostic ?? ((m2) => console.warn(m2)))(message2);
|
|
13570
13583
|
} catch {
|
|
13571
13584
|
}
|
|
13572
13585
|
};
|
|
@@ -13832,8 +13845,8 @@ async function bootBundleWorker(bundleJs, opts) {
|
|
|
13832
13845
|
const prev = def.state;
|
|
13833
13846
|
if (!prev || typeof prev !== "object" || Array.isArray(prev)) return;
|
|
13834
13847
|
const raw = err?.message ?? err;
|
|
13835
|
-
let
|
|
13836
|
-
if (raw === null || raw === void 0)
|
|
13848
|
+
let message2;
|
|
13849
|
+
if (raw === null || raw === void 0) message2 = "action failed";
|
|
13837
13850
|
else if (typeof raw === "object") {
|
|
13838
13851
|
let asJson;
|
|
13839
13852
|
try {
|
|
@@ -13841,12 +13854,12 @@ async function bootBundleWorker(bundleJs, opts) {
|
|
|
13841
13854
|
} catch {
|
|
13842
13855
|
asJson = void 0;
|
|
13843
13856
|
}
|
|
13844
|
-
|
|
13845
|
-
} else
|
|
13846
|
-
const failed3 = { ...prev, _error:
|
|
13857
|
+
message2 = typeof asJson === "string" ? asJson : String(raw);
|
|
13858
|
+
} else message2 = String(raw);
|
|
13859
|
+
const failed3 = { ...prev, _error: message2 };
|
|
13847
13860
|
if (prev.status === "loading") failed3.status = "error";
|
|
13848
13861
|
if (prev.loading === true) failed3.loading = false;
|
|
13849
|
-
if (typeof prev.error === "string") failed3.error =
|
|
13862
|
+
if (typeof prev.error === "string") failed3.error = message2;
|
|
13850
13863
|
def.state = failed3;
|
|
13851
13864
|
};
|
|
13852
13865
|
const runAction = async (def, label3, fn2, args) => {
|
|
@@ -13991,8 +14004,8 @@ function parseDescriptorWorkerAction(actionId) {
|
|
|
13991
14004
|
const match = /^tier5\.([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)$/.exec(actionId);
|
|
13992
14005
|
return match ? { service: match[1], action: match[2] } : null;
|
|
13993
14006
|
}
|
|
13994
|
-
function actionIssue(action, severity,
|
|
13995
|
-
return { severity, pass: "actions", path: action.at, message };
|
|
14007
|
+
function actionIssue(action, severity, message2) {
|
|
14008
|
+
return { severity, pass: "actions", path: action.at, message: message2 };
|
|
13996
14009
|
}
|
|
13997
14010
|
function appWorkerExports(context, service, action) {
|
|
13998
14011
|
return Boolean(context.appWorkerActions?.[service]?.includes(action));
|
|
@@ -14009,8 +14022,8 @@ function validateWorkerAction(action, context) {
|
|
|
14009
14022
|
if (exported?.includes(parsed.action)) return null;
|
|
14010
14023
|
if (exported === void 0 && appWorkerExports(context, parsed.service, parsed.action)) return null;
|
|
14011
14024
|
const appExports = exported === void 0 ? context.appWorkerActions?.[parsed.service] : void 0;
|
|
14012
|
-
const
|
|
14013
|
-
return actionIssue(action, "error",
|
|
14025
|
+
const message2 = exported ? `worker actionId "${action.actionId}" is not exported by service "${parsed.service}" (exports: ${exported.join(", ") || "none"})` : appExports ? `worker actionId "${action.actionId}" targets service "${parsed.service}", which this screen's bundle does not define (defines: ${Object.keys(context.bundleActions).join(", ") || "none"}) and the app-level worker does not export "${parsed.action}" from (exports: ${appExports.join(", ") || "none"})` : `worker actionId "${action.actionId}" targets service "${parsed.service}" which the bound bundle does not define (defines: ${Object.keys(context.bundleActions).join(", ") || "none"})`;
|
|
14026
|
+
return actionIssue(action, "error", message2);
|
|
14014
14027
|
}
|
|
14015
14028
|
if (appWorkerMayAnswer(context, parsed.service)) {
|
|
14016
14029
|
if (appWorkerExports(context, parsed.service, parsed.action)) return null;
|
|
@@ -15752,9 +15765,9 @@ function validateScreenDescriptor(screenId, descriptor, opts = {}) {
|
|
|
15752
15765
|
const gaps = accessibleNameGaps(descriptor);
|
|
15753
15766
|
const CAP5 = 20;
|
|
15754
15767
|
for (const gap of gaps.slice(0, CAP5)) {
|
|
15755
|
-
const
|
|
15768
|
+
const row2 = Object.prototype.hasOwnProperty.call(A11Y_CONTRACT, gap.type) ? A11Y_CONTRACT[gap.type] : void 0;
|
|
15756
15769
|
const why = gap.reason === "interactive" ? `it carries an \`onTap\`/\`onLongPress\`/\`onDoubleTap\`, which promotes ANY node to a control that owes a name (RFC 0058 \xA73.4)` : `RFC 0058 \xA73.3 requires a name for \`${gap.type}\` (announced as \`${gap.role}\`)`;
|
|
15757
|
-
const fix = gap.reason === "contract" ? `Give it \`modifiers.accessibilityLabel\`, or copy on a descendant \u2014 or, if it really is presentational, say so with \`modifiers.accessibilityRole: "decorative"\` (node-local) or \`modifiers.accessibilityHidden: true\` (whole subtree).` : `Give it \`modifiers.accessibilityLabel\`, or put readable copy on a descendant. An icon-only control names itself with \`Icon.contentDescription\`. \`decorative\` does not silence a control${
|
|
15770
|
+
const fix = gap.reason === "contract" ? `Give it \`modifiers.accessibilityLabel\`, or copy on a descendant \u2014 or, if it really is presentational, say so with \`modifiers.accessibilityRole: "decorative"\` (node-local) or \`modifiers.accessibilityHidden: true\` (whole subtree).` : `Give it \`modifiers.accessibilityLabel\`, or put readable copy on a descendant. An icon-only control names itself with \`Icon.contentDescription\`. \`decorative\` does not silence a control${row2?.decorative ? ` \u2014 a tappable \`${gap.type}\` is one` : ""}.`;
|
|
15758
15771
|
issues.push({
|
|
15759
15772
|
severity,
|
|
15760
15773
|
pass: "a11y",
|
|
@@ -17167,8 +17180,8 @@ var init_contained_dev_module = __esm({
|
|
|
17167
17180
|
};
|
|
17168
17181
|
ContainedDevModuleUnloadable = class extends Error {
|
|
17169
17182
|
himiContainedDevModuleUnloadable = true;
|
|
17170
|
-
constructor(
|
|
17171
|
-
super(
|
|
17183
|
+
constructor(message2) {
|
|
17184
|
+
super(message2);
|
|
17172
17185
|
this.name = "ContainedDevModuleUnloadable";
|
|
17173
17186
|
}
|
|
17174
17187
|
};
|
|
@@ -17178,6 +17191,18 @@ var init_contained_dev_module = __esm({
|
|
|
17178
17191
|
});
|
|
17179
17192
|
|
|
17180
17193
|
// ../../core/dev-server/src/loader.ts
|
|
17194
|
+
var loader_exports = {};
|
|
17195
|
+
__export(loader_exports, {
|
|
17196
|
+
hasDevModule: () => hasDevModule,
|
|
17197
|
+
listAvailableApps: () => listAvailableApps,
|
|
17198
|
+
loadApp: () => loadApp,
|
|
17199
|
+
loadContent: () => loadContent,
|
|
17200
|
+
readPlatformsJson: () => readPlatformsJson,
|
|
17201
|
+
resolveWixClientId: () => resolveWixClientId,
|
|
17202
|
+
resolveWixWebAuthConfig: () => resolveWixWebAuthConfig,
|
|
17203
|
+
resolveWixWebAuthPair: () => resolveWixWebAuthPair,
|
|
17204
|
+
tryLoadApp: () => tryLoadApp
|
|
17205
|
+
});
|
|
17181
17206
|
import { resolve as resolve14, basename as basename5, dirname as dirname10 } from "node:path";
|
|
17182
17207
|
import { existsSync as existsSync13, readdirSync as readdirSync10, readFileSync as readFileSync14, mkdirSync as mkdirSync8, rmSync as rmSync4 } from "node:fs";
|
|
17183
17208
|
import { pathToFileURL as pathToFileURL3, fileURLToPath as fileURLToPath7 } from "node:url";
|
|
@@ -17214,6 +17239,9 @@ function resolveDevEntry(name) {
|
|
|
17214
17239
|
}
|
|
17215
17240
|
return null;
|
|
17216
17241
|
}
|
|
17242
|
+
function hasDevModule(name) {
|
|
17243
|
+
return resolveDevEntry(name) !== null;
|
|
17244
|
+
}
|
|
17217
17245
|
async function devModuleUrl(entry, dir, fresh = false) {
|
|
17218
17246
|
const hasTypeScriptLoader = process.execArgv.some((arg) => arg.includes("tsx"));
|
|
17219
17247
|
const direct = !isOffRepo() && hasTypeScriptLoader;
|
|
@@ -17699,8 +17727,8 @@ var init_errors = __esm({
|
|
|
17699
17727
|
status;
|
|
17700
17728
|
/** Stable machine-readable code for the `error` field; callers branch on this, not on prose. */
|
|
17701
17729
|
code;
|
|
17702
|
-
constructor(
|
|
17703
|
-
super(
|
|
17730
|
+
constructor(message2, opts = {}) {
|
|
17731
|
+
super(message2);
|
|
17704
17732
|
this.name = "ControlInputError";
|
|
17705
17733
|
this.status = opts.status ?? 400;
|
|
17706
17734
|
this.code = opts.code ?? "invalid_request";
|
|
@@ -21064,8 +21092,8 @@ var init_screen_views = __esm({
|
|
|
21064
21092
|
"../../core/serve-storage/src/screen-views.ts"() {
|
|
21065
21093
|
init_unicode_case_folding();
|
|
21066
21094
|
ScreenViewValidationError = class extends Error {
|
|
21067
|
-
constructor(
|
|
21068
|
-
super(
|
|
21095
|
+
constructor(message2) {
|
|
21096
|
+
super(message2);
|
|
21069
21097
|
this.name = "ScreenViewValidationError";
|
|
21070
21098
|
}
|
|
21071
21099
|
};
|
|
@@ -22776,9 +22804,9 @@ function springCurve(spring, durationMs) {
|
|
|
22776
22804
|
const x2 = springStep(response, zeta);
|
|
22777
22805
|
const step = response / 64;
|
|
22778
22806
|
const envelope = springEnvelope(response, zeta, x2);
|
|
22779
|
-
let
|
|
22780
|
-
for (let t2 = 0; t2 <= SPRING_MAX_SECS && envelope(t2) > SPRING_SETTLE_TOLERANCE; t2 += step) if (Math.abs(1 - x2(t2)) > SPRING_SETTLE_TOLERANCE)
|
|
22781
|
-
const secs = Math.min(
|
|
22807
|
+
let settle2 = 0;
|
|
22808
|
+
for (let t2 = 0; t2 <= SPRING_MAX_SECS && envelope(t2) > SPRING_SETTLE_TOLERANCE; t2 += step) if (Math.abs(1 - x2(t2)) > SPRING_SETTLE_TOLERANCE) settle2 = t2;
|
|
22809
|
+
const secs = Math.min(settle2 + step, SPRING_MAX_SECS);
|
|
22782
22810
|
const samples = Math.min(200, Math.max(24, Math.ceil(12 * secs / response)));
|
|
22783
22811
|
const points = [];
|
|
22784
22812
|
for (let i2 = 0; i2 <= samples; i2++) points.push(i2 === 0 ? 0 : i2 === samples ? 1 : Number(x2(secs * i2 / samples).toFixed(3)));
|
|
@@ -23749,8 +23777,8 @@ var init_base44_entities = __esm({
|
|
|
23749
23777
|
});
|
|
23750
23778
|
|
|
23751
23779
|
// ../../core/sdk/functions/src/index.ts
|
|
23752
|
-
function fail2(
|
|
23753
|
-
throw new Error(`defineFunction: ${
|
|
23780
|
+
function fail2(message2) {
|
|
23781
|
+
throw new Error(`defineFunction: ${message2}`);
|
|
23754
23782
|
}
|
|
23755
23783
|
function validateName(name) {
|
|
23756
23784
|
if (typeof name !== "string") fail2("name must be a string");
|
|
@@ -29765,7 +29793,7 @@ var init_preview2 = __esm({
|
|
|
29765
29793
|
const out2 = [];
|
|
29766
29794
|
const err = [];
|
|
29767
29795
|
let settled = false;
|
|
29768
|
-
const
|
|
29796
|
+
const settle2 = (fn2, v2) => {
|
|
29769
29797
|
if (settled) return;
|
|
29770
29798
|
settled = true;
|
|
29771
29799
|
clearTimeout(timer);
|
|
@@ -29776,14 +29804,14 @@ var init_preview2 = __esm({
|
|
|
29776
29804
|
child.kill("SIGKILL");
|
|
29777
29805
|
} catch {
|
|
29778
29806
|
}
|
|
29779
|
-
|
|
29807
|
+
settle2(reject, new Error(`${cmd} ${args[0] ?? ""} timed out after ${timeoutMs}ms`));
|
|
29780
29808
|
}, timeoutMs);
|
|
29781
29809
|
child.stdout.on("data", (b2) => out2.push(b2));
|
|
29782
29810
|
child.stderr.on("data", (b2) => err.push(b2));
|
|
29783
|
-
child.on("error", (e2) =>
|
|
29811
|
+
child.on("error", (e2) => settle2(reject, e2));
|
|
29784
29812
|
child.on("close", (code) => {
|
|
29785
|
-
if (code === 0)
|
|
29786
|
-
else
|
|
29813
|
+
if (code === 0) settle2(resolve83, Buffer.concat(out2));
|
|
29814
|
+
else settle2(reject, new Error(`${cmd} exited ${code}: ${Buffer.concat(err).toString("utf8")}`));
|
|
29787
29815
|
});
|
|
29788
29816
|
});
|
|
29789
29817
|
},
|
|
@@ -31424,7 +31452,31 @@ function useBoundValues(ctx, bindings) {
|
|
|
31424
31452
|
}, [ctx.provider, key3]);
|
|
31425
31453
|
return values.length === paths2.length ? values : paths2.map(() => void 0);
|
|
31426
31454
|
}
|
|
31427
|
-
|
|
31455
|
+
function templateReadsService(template) {
|
|
31456
|
+
let reads2 = readsService.get(template);
|
|
31457
|
+
if (reads2 === void 0) {
|
|
31458
|
+
reads2 = JSON.stringify(template).indexOf("$service:") >= 0;
|
|
31459
|
+
readsService.set(template, reads2);
|
|
31460
|
+
}
|
|
31461
|
+
return reads2;
|
|
31462
|
+
}
|
|
31463
|
+
function sameJson(a2, b2) {
|
|
31464
|
+
if (a2 === b2) return true;
|
|
31465
|
+
if (a2 === null || b2 === null || typeof a2 !== "object" || typeof b2 !== "object") return false;
|
|
31466
|
+
if (Array.isArray(a2)) {
|
|
31467
|
+
if (!Array.isArray(b2) || a2.length !== b2.length) return false;
|
|
31468
|
+
for (let i2 = 0; i2 < a2.length; i2++) if (!sameJson(a2[i2], b2[i2])) return false;
|
|
31469
|
+
return true;
|
|
31470
|
+
}
|
|
31471
|
+
if (Array.isArray(b2)) return false;
|
|
31472
|
+
const ka2 = Object.keys(a2);
|
|
31473
|
+
if (ka2.length !== Object.keys(b2).length) return false;
|
|
31474
|
+
for (const k2 of ka2) {
|
|
31475
|
+
if (!Object.prototype.hasOwnProperty.call(b2, k2) || !sameJson(a2[k2], b2[k2])) return false;
|
|
31476
|
+
}
|
|
31477
|
+
return true;
|
|
31478
|
+
}
|
|
31479
|
+
var resolveScalarStatic, Bound, BoundList, readsService, BoundRow;
|
|
31428
31480
|
var init_bindings2 = __esm({
|
|
31429
31481
|
"../../core/web-renderer/src/bindings.tsx"() {
|
|
31430
31482
|
"use strict";
|
|
@@ -31451,12 +31503,18 @@ var init_bindings2 = __esm({
|
|
|
31451
31503
|
const arr2 = local ? ctx.itemScope?.[itemsPath.slice("$item.".length)] : bound2;
|
|
31452
31504
|
const items = Array.isArray(arr2) ? arr2 : [];
|
|
31453
31505
|
return /* @__PURE__ */ jsx3(Fragment, { children: items.map((item, i2) => {
|
|
31454
|
-
const scope2 = item && typeof item === "object" ? { ...item, __index: i2 } : { value: item, __index: i2 };
|
|
31455
|
-
const itemCtx = { ...ctx, itemScope: scope2 };
|
|
31456
31506
|
const key3 = item?.id ?? i2;
|
|
31457
|
-
return /* @__PURE__ */ jsx3(
|
|
31507
|
+
return /* @__PURE__ */ jsx3(BoundRow, { ctx, template, item, index: i2, renderRow }, String(key3));
|
|
31458
31508
|
}) });
|
|
31459
31509
|
};
|
|
31510
|
+
readsService = /* @__PURE__ */ new WeakMap();
|
|
31511
|
+
BoundRow = React2.memo(
|
|
31512
|
+
({ ctx, template, item, index, renderRow }) => {
|
|
31513
|
+
const scope2 = item && typeof item === "object" ? { ...item, __index: index } : { value: item, __index: index };
|
|
31514
|
+
return /* @__PURE__ */ jsx3(Fragment, { children: renderRow(template, { ...ctx, itemScope: scope2 }) });
|
|
31515
|
+
},
|
|
31516
|
+
(prev, next) => prev.ctx === next.ctx && prev.template === next.template && prev.renderRow === next.renderRow && prev.index === next.index && !templateReadsService(next.template) && sameJson(prev.item, next.item)
|
|
31517
|
+
);
|
|
31460
31518
|
}
|
|
31461
31519
|
});
|
|
31462
31520
|
|
|
@@ -33713,17 +33771,17 @@ var init_controls = __esm({
|
|
|
33713
33771
|
if (ni2 !== selIdx) select2(ni2);
|
|
33714
33772
|
};
|
|
33715
33773
|
const pagerRef = React7.useRef(null);
|
|
33716
|
-
const
|
|
33774
|
+
const settle2 = React7.useRef(void 0);
|
|
33717
33775
|
React7.useEffect(() => {
|
|
33718
33776
|
const el2 = pagerRef.current;
|
|
33719
33777
|
if (!el2 || !el2.clientWidth) return;
|
|
33720
33778
|
const x2 = selIdx * el2.clientWidth;
|
|
33721
33779
|
if (Math.abs(el2.scrollLeft - x2) > 1) el2.scrollTo?.({ left: x2, behavior: "smooth" });
|
|
33722
33780
|
}, [selIdx, pages2]);
|
|
33723
|
-
React7.useEffect(() => () => clearTimeout(
|
|
33781
|
+
React7.useEffect(() => () => clearTimeout(settle2.current), []);
|
|
33724
33782
|
const onPagerScroll = () => {
|
|
33725
|
-
clearTimeout(
|
|
33726
|
-
|
|
33783
|
+
clearTimeout(settle2.current);
|
|
33784
|
+
settle2.current = setTimeout(() => {
|
|
33727
33785
|
const el2 = pagerRef.current;
|
|
33728
33786
|
if (!el2 || !el2.clientWidth) return;
|
|
33729
33787
|
const i2 = Math.round(el2.scrollLeft / el2.clientWidth);
|
|
@@ -35124,7 +35182,7 @@ function Block({ b: b2, env, depth }) {
|
|
|
35124
35182
|
case "button":
|
|
35125
35183
|
return /* @__PURE__ */ jsx9(LinkButton, { label: b2.label, url: b2.url, env, testId: `${env.componentId}/${b2.id}` });
|
|
35126
35184
|
case "table":
|
|
35127
|
-
return /* @__PURE__ */ jsx9("table", { ...tid(env, b2.id, b2.kind), style: { width: "100%", borderCollapse: "collapse", ...textStyle(ctx, "body", text11) }, children: /* @__PURE__ */ jsx9("tbody", { children: b2.rows.map((
|
|
35185
|
+
return /* @__PURE__ */ jsx9("table", { ...tid(env, b2.id, b2.kind), style: { width: "100%", borderCollapse: "collapse", ...textStyle(ctx, "body", text11) }, children: /* @__PURE__ */ jsx9("tbody", { children: b2.rows.map((row2, r3) => /* @__PURE__ */ jsx9("tr", { children: row2.map((cell2, c2) => /* @__PURE__ */ jsx9("td", { style: { border: `1px solid ${border}`, padding: 6, whiteSpace: "pre-wrap", verticalAlign: "top" }, children: cell2 }, c2)) }, r3)) }) });
|
|
35128
35186
|
case "card": {
|
|
35129
35187
|
const title = richContentCardTitle(b2);
|
|
35130
35188
|
return /* @__PURE__ */ jsxs6("div", { ...tid(env, b2.id, b2.kind), role: "group", "aria-label": title, style: { border: `1px solid ${border}`, borderRadius: 8, padding: 12, display: "flex", flexDirection: "column", gap: 6 }, children: [
|
|
@@ -41693,10 +41751,10 @@ var init_pdf = __esm({
|
|
|
41693
41751
|
var $DOMException = function DOMException() {
|
|
41694
41752
|
anInstance(this, DOMExceptionPrototype);
|
|
41695
41753
|
var argumentsLength = arguments.length;
|
|
41696
|
-
var
|
|
41754
|
+
var message2 = normalizeStringArgument(argumentsLength < 1 ? void 0 : arguments[0]);
|
|
41697
41755
|
var name = normalizeStringArgument(argumentsLength < 2 ? void 0 : arguments[1], "Error");
|
|
41698
|
-
var that = new NativeDOMException(
|
|
41699
|
-
var error = new Error2(
|
|
41756
|
+
var that = new NativeDOMException(message2, name);
|
|
41757
|
+
var error = new Error2(message2);
|
|
41700
41758
|
error.name = DOM_EXCEPTION;
|
|
41701
41759
|
defineProperty(that, "stack", createPropertyDescriptor(1, clearErrorStack(error.stack, 1)));
|
|
41702
41760
|
inheritIfRequired(that, this, $DOMException);
|
|
@@ -42024,8 +42082,8 @@ var init_pdf = __esm({
|
|
|
42024
42082
|
};
|
|
42025
42083
|
verbosity = VerbosityLevel.WARNINGS;
|
|
42026
42084
|
BaseException = (function BaseExceptionClosure() {
|
|
42027
|
-
function BaseException2(
|
|
42028
|
-
this.message =
|
|
42085
|
+
function BaseException2(message2, name) {
|
|
42086
|
+
this.message = message2;
|
|
42029
42087
|
this.name = name;
|
|
42030
42088
|
}
|
|
42031
42089
|
BaseException2.prototype = new Error();
|
|
@@ -116575,9 +116633,9 @@ function ensurePressStyles() {
|
|
|
116575
116633
|
}
|
|
116576
116634
|
function idiomPressRules() {
|
|
116577
116635
|
let css = "";
|
|
116578
|
-
for (const [name,
|
|
116579
|
-
const layer = `color-mix(in srgb,currentColor ${Math.round(
|
|
116580
|
-
css += `[data-himalaya-idiom-press="${name}-highlight"]:active{opacity:${
|
|
116636
|
+
for (const [name, row2] of Object.entries(IDIOM_CONTROLS)) {
|
|
116637
|
+
const layer = `color-mix(in srgb,currentColor ${Math.round(row2.press.stateLayerOpacity * 100)}%,transparent)`;
|
|
116638
|
+
css += `[data-himalaya-idiom-press="${name}-highlight"]:active{opacity:${row2.press.highlightOpacity}!important}`;
|
|
116581
116639
|
css += `[data-himalaya-idiom-press="${name}-ripple"]:active{background-image:linear-gradient(${layer},${layer})!important}`;
|
|
116582
116640
|
}
|
|
116583
116641
|
return css;
|
|
@@ -117037,7 +117095,7 @@ function lottieRuntime(lib) {
|
|
|
117037
117095
|
} catch {
|
|
117038
117096
|
}
|
|
117039
117097
|
};
|
|
117040
|
-
const
|
|
117098
|
+
const settle2 = (el2) => {
|
|
117041
117099
|
const anim = lottieAnims.get(el2);
|
|
117042
117100
|
const host = el2;
|
|
117043
117101
|
const played = host.dataset.himalayaLottiePlayed;
|
|
@@ -117106,7 +117164,7 @@ function lottieRuntime(lib) {
|
|
|
117106
117164
|
const stamp = host.getAttribute("data-himalaya-lottie-play");
|
|
117107
117165
|
if (!anim) return;
|
|
117108
117166
|
if (!stamp) {
|
|
117109
|
-
|
|
117167
|
+
settle2(el2);
|
|
117110
117168
|
return;
|
|
117111
117169
|
}
|
|
117112
117170
|
if (host.dataset.himalayaLottiePlayed === stamp) return;
|
|
@@ -117123,7 +117181,7 @@ function lottieRuntime(lib) {
|
|
|
117123
117181
|
if (r3.type !== "attributes" || !(r3.target instanceof Element)) continue;
|
|
117124
117182
|
if (r3.attributeName === "data-himalaya-lottie") remount(r3.target);
|
|
117125
117183
|
else if (r3.attributeName === "data-himalaya-lottie-reduce") applyReduce(r3.target);
|
|
117126
|
-
else if (r3.attributeName === "data-himalaya-lottie-gen")
|
|
117184
|
+
else if (r3.attributeName === "data-himalaya-lottie-gen") settle2(r3.target);
|
|
117127
117185
|
else if (r3.attributeName === "data-himalaya-lottie-loop") applyLoop(r3.target);
|
|
117128
117186
|
else replay(r3.target);
|
|
117129
117187
|
}
|
|
@@ -118082,10 +118140,10 @@ function tableColumns(raw) {
|
|
|
118082
118140
|
};
|
|
118083
118141
|
});
|
|
118084
118142
|
}
|
|
118085
|
-
function dataTableCells(
|
|
118086
|
-
if (
|
|
118087
|
-
if (Array.isArray(
|
|
118088
|
-
const o2 =
|
|
118143
|
+
function dataTableCells(row2, columns) {
|
|
118144
|
+
if (row2 == null) return columns.map(() => "");
|
|
118145
|
+
if (Array.isArray(row2)) return columns.map((_2, i2) => row2[i2] == null ? "" : String(row2[i2]));
|
|
118146
|
+
const o2 = row2;
|
|
118089
118147
|
if (Array.isArray(o2.cells)) return columns.map((_2, i2) => o2.cells[i2] == null ? "" : String(o2.cells[i2]));
|
|
118090
118148
|
return columns.map((c2) => c2.key && o2[c2.key] != null ? String(o2[c2.key]) : "");
|
|
118091
118149
|
}
|
|
@@ -119116,11 +119174,11 @@ function renderInner(node, ctx) {
|
|
|
119116
119174
|
itemsPath,
|
|
119117
119175
|
template: items[0],
|
|
119118
119176
|
renderRow: (t2, ic) => {
|
|
119119
|
-
let
|
|
119120
|
-
if (boundStagger > 0 && React12.isValidElement(
|
|
119177
|
+
let row2 = renderNode(t2, asItem(ic));
|
|
119178
|
+
if (boundStagger > 0 && React12.isValidElement(row2)) {
|
|
119121
119179
|
const i2 = Number(ic.itemScope?.__index ?? 0);
|
|
119122
|
-
const prev =
|
|
119123
|
-
|
|
119180
|
+
const prev = row2.props.style ?? {};
|
|
119181
|
+
row2 = React12.cloneElement(row2, { style: { ...prev, animationDelay: `${i2 * boundStagger}ms` } });
|
|
119124
119182
|
}
|
|
119125
119183
|
if (boundSwipe && ctx.onAction && !props.horizontal) {
|
|
119126
119184
|
const leading = resolveSwipeActions(boundSwipe.leading, ic);
|
|
@@ -119136,12 +119194,12 @@ function renderInner(node, ctx) {
|
|
|
119136
119194
|
accent: C2("accentPrimary", "#116DFF"),
|
|
119137
119195
|
fg: C2("textPrimary", "#13171e"),
|
|
119138
119196
|
fontFamily: bodyFont(ctx),
|
|
119139
|
-
children:
|
|
119197
|
+
children: row2
|
|
119140
119198
|
}
|
|
119141
119199
|
);
|
|
119142
119200
|
}
|
|
119143
119201
|
}
|
|
119144
|
-
return
|
|
119202
|
+
return row2;
|
|
119145
119203
|
}
|
|
119146
119204
|
}
|
|
119147
119205
|
);
|
|
@@ -120534,9 +120592,9 @@ var init_renderNode = __esm({
|
|
|
120534
120592
|
const rawMessage = errorMessageFor({ rule: effectiveRule, value: local, workerError, catalog: validationCatalog });
|
|
120535
120593
|
const hasWorkerError = Boolean(workerError && workerError.trim());
|
|
120536
120594
|
const painted2 = rawMessage === null ? "" : translateOnly(rawMessage);
|
|
120537
|
-
const
|
|
120595
|
+
const message2 = !painted2.trim() || ruleMessagePending && !hasWorkerError ? null : painted2;
|
|
120538
120596
|
const [feedbackShown, setFeedbackShown] = React12.useState(false);
|
|
120539
|
-
const revealed =
|
|
120597
|
+
const revealed = message2 !== null && shouldRevealError({
|
|
120540
120598
|
rule,
|
|
120541
120599
|
feedbackShown,
|
|
120542
120600
|
hasWorkerError,
|
|
@@ -120687,7 +120745,7 @@ var init_renderNode = __esm({
|
|
|
120687
120745
|
),
|
|
120688
120746
|
props.trailingIcon && accIcon(props.trailingIcon)
|
|
120689
120747
|
] }),
|
|
120690
|
-
revealed ? /* @__PURE__ */ jsx11("span", { id: errorId, role: "alert", style: { fontFamily: bodyFont(ctx), fontSize: pxToRem(12), color: C2("danger", "#E62214"), paddingLeft: 2 }, children:
|
|
120748
|
+
revealed ? /* @__PURE__ */ jsx11("span", { id: errorId, role: "alert", style: { fontFamily: bodyFont(ctx), fontSize: pxToRem(12), color: C2("danger", "#E62214"), paddingLeft: 2 }, children: message2 }) : (props.helperText ?? cfg.helperText) != null ? /* @__PURE__ */ jsx11("span", { style: { fontFamily: bodyFont(ctx), fontSize: pxToRem(12), color: errored ? C2("danger", "#E62214") : muted, paddingLeft: 2 }, children: txt(props.helperText ?? cfg.helperText, ctx) }) : null
|
|
120691
120749
|
] });
|
|
120692
120750
|
};
|
|
120693
120751
|
MENU_ANCHOR_CONTROL = 'a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"]), [role="button"], [role="link"]';
|
|
@@ -121225,10 +121283,10 @@ var init_renderNode = __esm({
|
|
|
121225
121283
|
setStatus("playing");
|
|
121226
121284
|
setError("");
|
|
121227
121285
|
} catch (cause) {
|
|
121228
|
-
const
|
|
121286
|
+
const message2 = cause instanceof Error ? cause.message : "Autoplay blocked";
|
|
121229
121287
|
setStatus("blocked");
|
|
121230
|
-
setError(
|
|
121231
|
-
emit(props.onError, { state: "blocked", status: "blocked", error:
|
|
121288
|
+
setError(message2);
|
|
121289
|
+
emit(props.onError, { state: "blocked", status: "blocked", error: message2, code: "playback_blocked" });
|
|
121232
121290
|
}
|
|
121233
121291
|
}, [isYouTube, isUnsupportedProvider, emit, props.onError]);
|
|
121234
121292
|
const pause = React12.useCallback(() => {
|
|
@@ -121478,10 +121536,10 @@ var init_renderNode = __esm({
|
|
|
121478
121536
|
emit(props.onEnd, { state: "ended", status: "ended" });
|
|
121479
121537
|
},
|
|
121480
121538
|
onError: () => {
|
|
121481
|
-
const
|
|
121539
|
+
const message2 = "Unable to play this media source";
|
|
121482
121540
|
setStatus("error");
|
|
121483
|
-
setError(
|
|
121484
|
-
emit(props.onError, { state: "error", status: "error", error:
|
|
121541
|
+
setError(message2);
|
|
121542
|
+
emit(props.onError, { state: "error", status: "error", error: message2, code: "source_error" });
|
|
121485
121543
|
}
|
|
121486
121544
|
};
|
|
121487
121545
|
if (items.length === 0) return /* @__PURE__ */ jsx11("div", { "data-media-player": sessionId, style: { minHeight: props.height ?? 120, display: "grid", placeItems: "center", ...wrap }, children: slot("empty") ?? "No media" });
|
|
@@ -121551,7 +121609,7 @@ var init_renderNode = __esm({
|
|
|
121551
121609
|
if (!retypeSrc) return;
|
|
121552
121610
|
let live3 = true;
|
|
121553
121611
|
let made = null;
|
|
121554
|
-
const
|
|
121612
|
+
const settle2 = (r3) => {
|
|
121555
121613
|
const u2 = r3?.url ?? null;
|
|
121556
121614
|
made = u2;
|
|
121557
121615
|
if (!live3) {
|
|
@@ -121560,7 +121618,7 @@ var init_renderNode = __esm({
|
|
|
121560
121618
|
}
|
|
121561
121619
|
setRetyped({ from: retypeSrc, url: u2, pageCount: r3?.pageCount ?? null });
|
|
121562
121620
|
};
|
|
121563
|
-
loadPdfFetch().then((m2) => m2.retypeAsPdfCounted(retypeSrc)).then(
|
|
121621
|
+
loadPdfFetch().then((m2) => m2.retypeAsPdfCounted(retypeSrc)).then(settle2, () => settle2(null));
|
|
121564
121622
|
return () => {
|
|
121565
121623
|
live3 = false;
|
|
121566
121624
|
if (made) URL.revokeObjectURL(made);
|
|
@@ -124475,7 +124533,7 @@ var init_renderNode = __esm({
|
|
|
124475
124533
|
const selectedId = isBinding(props.selectedId) ? boundSel : props.selectedId;
|
|
124476
124534
|
const selIdx = Math.max(0, opts.findIndex((o2) => o2?.id === selectedId));
|
|
124477
124535
|
const viewport = React12.useRef(null);
|
|
124478
|
-
const
|
|
124536
|
+
const settle2 = React12.useRef(void 0);
|
|
124479
124537
|
const pickerId = React12.useId();
|
|
124480
124538
|
const interactive = !!ctx.onAction && !!props.onChange;
|
|
124481
124539
|
const emit = (index) => {
|
|
@@ -124486,7 +124544,7 @@ var init_renderNode = __esm({
|
|
|
124486
124544
|
React12.useEffect(() => {
|
|
124487
124545
|
if (viewport.current) viewport.current.scrollTop = selIdx * 32;
|
|
124488
124546
|
}, [selIdx, opts.length]);
|
|
124489
|
-
React12.useEffect(() => () => clearTimeout(
|
|
124547
|
+
React12.useEffect(() => () => clearTimeout(settle2.current), []);
|
|
124490
124548
|
return /* @__PURE__ */ jsxs8("div", { style: { position: "relative", width: "100%", maxWidth: 220, height: 160, overflow: "hidden", background: C2("surfaceSecondary", "#f5f7fa"), borderRadius: 12, ...wrap }, children: [
|
|
124491
124549
|
/* @__PURE__ */ jsx11("div", { "aria-hidden": "true", style: { position: "absolute", top: 64, left: 8, right: 8, height: 32, background: C2("surfacePrimary", "#fff"), borderRadius: 8, boxShadow: "inset 0 0 0 1px rgba(0,0,0,.06)" } }),
|
|
124492
124550
|
/* @__PURE__ */ jsx11(
|
|
@@ -124506,8 +124564,8 @@ var init_renderNode = __esm({
|
|
|
124506
124564
|
}
|
|
124507
124565
|
},
|
|
124508
124566
|
onScroll: () => {
|
|
124509
|
-
clearTimeout(
|
|
124510
|
-
|
|
124567
|
+
clearTimeout(settle2.current);
|
|
124568
|
+
settle2.current = setTimeout(() => emit(Math.max(0, Math.min(opts.length - 1, Math.round((viewport.current?.scrollTop ?? 0) / 32)))), 120);
|
|
124511
124569
|
},
|
|
124512
124570
|
style: { position: "relative", height: "100%", overflowY: "auto", scrollbarWidth: "none", scrollSnapType: "y mandatory", padding: "64px 0", boxSizing: "border-box" },
|
|
124513
124571
|
children: opts.map((o2, index) => /* @__PURE__ */ jsx11(
|
|
@@ -125289,7 +125347,7 @@ var init_renderNode = __esm({
|
|
|
125289
125347
|
] }),
|
|
125290
125348
|
/* @__PURE__ */ jsx11("div", { style: { display: "grid", gridTemplateColumns: "repeat(7, minmax(0, 1fr))", gap: 2, marginBottom: 4 }, children: heads.map((h2, i2) => /* @__PURE__ */ jsx11("div", { style: { textAlign: "center", fontFamily: bodyFont(ctx), fontSize: pxToRem(11), fontWeight: 600, color: C2("textSecondary", "#888"), textTransform: "uppercase" }, children: h2 }, i2)) }),
|
|
125291
125349
|
/* @__PURE__ */ jsx11("div", { ref: gridRef, role: "grid", "aria-label": monthLabel, style: { display: "grid", gridTemplateColumns: "repeat(7, minmax(0, 1fr))", gap: 2, width: "100%" }, children: rows.flatMap(
|
|
125292
|
-
(
|
|
125350
|
+
(row2, ri2) => row2.map((cell2, ci2) => {
|
|
125293
125351
|
if (!cell2.inMonth && !showAdjacent) return /* @__PURE__ */ jsx11("div", { "aria-hidden": "true" }, `${ri2}-${ci2}`);
|
|
125294
125352
|
const dec = decByDate.get(cell2.date);
|
|
125295
125353
|
const disabled = dec?.disabled === true || !calWithinWindow(cell2.date, minDate, maxDate);
|
|
@@ -126347,8 +126405,8 @@ async function pngPageHtml(item) {
|
|
|
126347
126405
|
return `<!doctype html><html${item.isRTL ? ' dir="rtl"' : ""}><head><meta charset="utf-8"><style>${faces}${fill}body{font-family:${HOST_PAGE_FONT}}</style></head><body style="margin:0">${item.html}</body></html>`;
|
|
126348
126406
|
}
|
|
126349
126407
|
function isMissingPlaywrightExecutable(error) {
|
|
126350
|
-
const
|
|
126351
|
-
return /Executable doesn't exist at/.test(
|
|
126408
|
+
const message2 = error?.message ?? "";
|
|
126409
|
+
return /Executable doesn't exist at/.test(message2) && /playwright install/.test(message2);
|
|
126352
126410
|
}
|
|
126353
126411
|
async function pngAvailable() {
|
|
126354
126412
|
let chromium;
|
|
@@ -127741,11 +127799,11 @@ function deepMerge3(base, patch) {
|
|
|
127741
127799
|
return out2;
|
|
127742
127800
|
}
|
|
127743
127801
|
function recordOverrideHistory(state, screenId, op, descriptor, notes) {
|
|
127744
|
-
const
|
|
127802
|
+
const row2 = { id: ++overrideHistorySeq, op, descriptor, notes, updatedAt: Math.floor(Date.now() / 1e3) };
|
|
127745
127803
|
const list2 = state.localOverrideHistory.get(screenId) ?? [];
|
|
127746
|
-
list2.unshift(
|
|
127804
|
+
list2.unshift(row2);
|
|
127747
127805
|
state.localOverrideHistory.set(screenId, list2);
|
|
127748
|
-
return
|
|
127806
|
+
return row2;
|
|
127749
127807
|
}
|
|
127750
127808
|
function send(res, status, body, headers2 = {}) {
|
|
127751
127809
|
res.statusCode = status;
|
|
@@ -128167,21 +128225,21 @@ async function handleOrionChatRequest(req, res) {
|
|
|
128167
128225
|
const { detectAgentHire, sendOrionChatMessage, extractAgentFromReply, localMaestroReply } = await import("./apps/orion-clone-live.js");
|
|
128168
128226
|
let body = "";
|
|
128169
128227
|
for await (const chunk of req) body += chunk;
|
|
128170
|
-
let
|
|
128228
|
+
let message2 = "";
|
|
128171
128229
|
let conversationId;
|
|
128172
128230
|
let attachment;
|
|
128173
128231
|
try {
|
|
128174
128232
|
const j2 = JSON.parse(body || "{}");
|
|
128175
|
-
|
|
128233
|
+
message2 = String(j2.message ?? "");
|
|
128176
128234
|
conversationId = j2.conversationId ? String(j2.conversationId) : void 0;
|
|
128177
128235
|
if (j2.attachment && typeof j2.attachment.dataUri === "string" && j2.attachment.dataUri) {
|
|
128178
128236
|
attachment = { dataUri: String(j2.attachment.dataUri), fileName: j2.attachment.fileName ? String(j2.attachment.fileName) : void 0, mime: j2.attachment.mime ? String(j2.attachment.mime) : void 0 };
|
|
128179
128237
|
}
|
|
128180
128238
|
} catch {
|
|
128181
128239
|
}
|
|
128182
|
-
if (!
|
|
128183
|
-
const hireIntent = detectAgentHire(
|
|
128184
|
-
const result = await sendOrionChatMessage(
|
|
128240
|
+
if (!message2.trim()) return sendJson(res, 400, { error: "message_required" }, cors);
|
|
128241
|
+
const hireIntent = detectAgentHire(message2);
|
|
128242
|
+
const result = await sendOrionChatMessage(message2, conversationId, attachment);
|
|
128185
128243
|
let agentCard;
|
|
128186
128244
|
let hireReply;
|
|
128187
128245
|
if (hireIntent) {
|
|
@@ -128194,7 +128252,7 @@ async function handleOrionChatRequest(req, res) {
|
|
|
128194
128252
|
}
|
|
128195
128253
|
}
|
|
128196
128254
|
if (!result || !result.reply || !result.reply.trim()) {
|
|
128197
|
-
const reply = hireReply ?? localMaestroReply(
|
|
128255
|
+
const reply = hireReply ?? localMaestroReply(message2);
|
|
128198
128256
|
return sendJson(res, 200, { conversationId: result?.conversationId ?? conversationId ?? "local-dev", reply, ...agentCard ? { agentCard } : {} }, { ...cors, "cache-control": "no-store" });
|
|
128199
128257
|
}
|
|
128200
128258
|
return sendJson(res, 200, { ...result, reply: hireReply ?? result.reply, ...agentCard ? { agentCard } : {} }, { ...cors, "cache-control": "no-store" });
|
|
@@ -128210,11 +128268,11 @@ async function handleOrionConversationRequest(req, res) {
|
|
|
128210
128268
|
async function handleOrionChatStreamRequest(req, res) {
|
|
128211
128269
|
let body = "";
|
|
128212
128270
|
for await (const chunk of req) body += chunk;
|
|
128213
|
-
let
|
|
128271
|
+
let message2 = "";
|
|
128214
128272
|
let conversationId;
|
|
128215
128273
|
try {
|
|
128216
128274
|
const j2 = JSON.parse(body || "{}");
|
|
128217
|
-
|
|
128275
|
+
message2 = String(j2.message ?? "");
|
|
128218
128276
|
conversationId = j2.conversationId ? String(j2.conversationId) : void 0;
|
|
128219
128277
|
} catch {
|
|
128220
128278
|
}
|
|
@@ -128225,7 +128283,7 @@ async function handleOrionChatStreamRequest(req, res) {
|
|
|
128225
128283
|
"access-control-allow-origin": "*"
|
|
128226
128284
|
});
|
|
128227
128285
|
const { openOrionChatStream } = await import("./apps/orion-clone-live.js");
|
|
128228
|
-
await openOrionChatStream(
|
|
128286
|
+
await openOrionChatStream(message2, conversationId, (sse) => {
|
|
128229
128287
|
try {
|
|
128230
128288
|
res.write(sse);
|
|
128231
128289
|
} catch {
|
|
@@ -129463,9 +129521,9 @@ async function handleWebWix(req, res, state) {
|
|
|
129463
129521
|
record2("proxy", r3.status, r3.body);
|
|
129464
129522
|
return reply(200, { status: r3.status, body: r3.body });
|
|
129465
129523
|
} catch (e2) {
|
|
129466
|
-
const
|
|
129467
|
-
record2("proxy", 0,
|
|
129468
|
-
return reply(200, { status: 0, body:
|
|
129524
|
+
const message2 = JSON.stringify({ error: String(e2?.message ?? e2) });
|
|
129525
|
+
record2("proxy", 0, message2);
|
|
129526
|
+
return reply(200, { status: 0, body: message2 });
|
|
129469
129527
|
}
|
|
129470
129528
|
}
|
|
129471
129529
|
if (path2 === "/v1/__webwix/logout" && req.method === "POST") {
|
|
@@ -129856,9 +129914,9 @@ async function handleDev(req, res, state) {
|
|
|
129856
129914
|
state.serverCache.clear();
|
|
129857
129915
|
return sendJson(res, 200, { status: "ok", bundle: name });
|
|
129858
129916
|
} catch (err) {
|
|
129859
|
-
const
|
|
129860
|
-
const status = /unknown bundle source/.test(
|
|
129861
|
-
return sendJson(res, status, { error: "rebuild_failed", bundle: name, message });
|
|
129917
|
+
const message2 = err.message;
|
|
129918
|
+
const status = /unknown bundle source/.test(message2) ? 404 : 500;
|
|
129919
|
+
return sendJson(res, status, { error: "rebuild_failed", bundle: name, message: message2 });
|
|
129862
129920
|
}
|
|
129863
129921
|
}
|
|
129864
129922
|
if (url === "/__dev/actions/log") {
|
|
@@ -130021,14 +130079,14 @@ async function handleAdminPlayground(req, res, state) {
|
|
|
130021
130079
|
if (revertMatch && req.method === "POST") {
|
|
130022
130080
|
const screenId = decodeURIComponent(revertMatch[1]);
|
|
130023
130081
|
const historyId = Number(new URLSearchParams(url.split("?")[1] ?? "").get("historyId"));
|
|
130024
|
-
const
|
|
130025
|
-
if (!
|
|
130026
|
-
if (
|
|
130082
|
+
const row2 = (state.localOverrideHistory.get(screenId) ?? []).find((r3) => r3.id === historyId);
|
|
130083
|
+
if (!row2) return sendJson(res, 404, { error: "history_row_not_found", screenId, historyId });
|
|
130084
|
+
if (row2.op === "delete" || row2.descriptor == null) {
|
|
130027
130085
|
state.localOverrides.delete(screenId);
|
|
130028
130086
|
recordOverrideHistory(state, screenId, "revert", null, `revert to #${historyId} (deleted)`);
|
|
130029
130087
|
} else {
|
|
130030
|
-
state.localOverrides.set(screenId,
|
|
130031
|
-
recordOverrideHistory(state, screenId, "revert",
|
|
130088
|
+
state.localOverrides.set(screenId, row2.descriptor);
|
|
130089
|
+
recordOverrideHistory(state, screenId, "revert", row2.descriptor, `revert to #${historyId}`);
|
|
130032
130090
|
}
|
|
130033
130091
|
invalidate(state, screenId);
|
|
130034
130092
|
return sendJson(res, 200, { status: "ok", screenId, revertedTo: historyId });
|
|
@@ -133124,8 +133182,8 @@ function emptiedBase44(data) {
|
|
|
133124
133182
|
const drain = (m2) => Object.fromEntries(Object.keys(m2).map((k2) => [k2, []]));
|
|
133125
133183
|
return { seed: drain(data.seed), sample: drain(data.sample) };
|
|
133126
133184
|
}
|
|
133127
|
-
function fail3(status, code,
|
|
133128
|
-
return { ok: false, error: { status, code, message } };
|
|
133185
|
+
function fail3(status, code, message2) {
|
|
133186
|
+
return { ok: false, error: { status, code, message: message2 } };
|
|
133129
133187
|
}
|
|
133130
133188
|
function parseObject2(raw) {
|
|
133131
133189
|
if (raw && typeof raw === "object" && !Array.isArray(raw)) return raw;
|
|
@@ -133215,11 +133273,11 @@ function compareScalar(a2, b2) {
|
|
|
133215
133273
|
function scalarEqual(a2, b2) {
|
|
133216
133274
|
return isScalar(a2) && isScalar(b2) && a2 === b2;
|
|
133217
133275
|
}
|
|
133218
|
-
function evalCondition(
|
|
133219
|
-
if ("and" in c2) return c2.and.every((s2) => evalCondition(
|
|
133220
|
-
if ("or" in c2) return c2.or.some((s2) => evalCondition(
|
|
133221
|
-
if ("not" in c2) return !evalCondition(
|
|
133222
|
-
const rv =
|
|
133276
|
+
function evalCondition(row2, c2) {
|
|
133277
|
+
if ("and" in c2) return c2.and.every((s2) => evalCondition(row2, s2));
|
|
133278
|
+
if ("or" in c2) return c2.or.some((s2) => evalCondition(row2, s2));
|
|
133279
|
+
if ("not" in c2) return !evalCondition(row2, c2.not);
|
|
133280
|
+
const rv = row2[c2.field];
|
|
133223
133281
|
switch (c2.op) {
|
|
133224
133282
|
case "eq":
|
|
133225
133283
|
return scalarEqual(rv, c2.value);
|
|
@@ -133367,26 +133425,26 @@ function seedTokens(state, limit = 48) {
|
|
|
133367
133425
|
}
|
|
133368
133426
|
function synthesizeInput(control, resolve83, tokens2) {
|
|
133369
133427
|
const id = `${control.type}.${control.callback}`;
|
|
133370
|
-
const
|
|
133371
|
-
if (!
|
|
133428
|
+
const row2 = SYNTHESIZED_CONTROLS[id];
|
|
133429
|
+
if (!row2) return null;
|
|
133372
133430
|
const props = control.props;
|
|
133373
133431
|
if (hasRowBinding(props)) return null;
|
|
133374
|
-
if (
|
|
133432
|
+
if (row2.from === "declared-options") {
|
|
133375
133433
|
const ids = declaredOptionIds(props, resolve83);
|
|
133376
133434
|
if (!ids.length) return null;
|
|
133377
|
-
if (
|
|
133435
|
+
if (row2.encoding === "string-array") {
|
|
133378
133436
|
const currentRaw2 = resolved(props.selectedIds, resolve83);
|
|
133379
133437
|
const current3 = (Array.isArray(currentRaw2) ? currentRaw2 : []).filter((x2) => typeof x2 === "string");
|
|
133380
133438
|
const pick5 = ids.find((o2) => !current3.includes(o2));
|
|
133381
133439
|
if (pick5 === void 0) return null;
|
|
133382
133440
|
const value2 = props.multiSelect === true ? [...current3, pick5] : [pick5];
|
|
133383
|
-
return { key:
|
|
133441
|
+
return { key: row2.key, value: value2, from: row2.from, current: current3, control: id };
|
|
133384
133442
|
}
|
|
133385
133443
|
const currentRaw = resolved(props.selectedId, resolve83);
|
|
133386
133444
|
const current2 = typeof currentRaw === "string" ? currentRaw : void 0;
|
|
133387
133445
|
const pick4 = ids.find((o2) => o2 !== current2);
|
|
133388
133446
|
if (pick4 === void 0) return null;
|
|
133389
|
-
return { key:
|
|
133447
|
+
return { key: row2.key, value: pick4, from: row2.from, current: current2, control: id };
|
|
133390
133448
|
}
|
|
133391
133449
|
if (!acceptsWords(props) || !acceptsWords(control.wrapper ?? {})) return null;
|
|
133392
133450
|
const binding2 = typeof props.valuePath === "string" ? props.valuePath : typeof props.value === "string" && props.value.startsWith("$service:") ? props.value : void 0;
|
|
@@ -133396,7 +133454,7 @@ function synthesizeInput(control, resolve83, tokens2) {
|
|
|
133396
133454
|
const max = typeof props.maxLength === "number" && props.maxLength > 0 ? props.maxLength : void 0;
|
|
133397
133455
|
const pick3 = tokens2().find((t2) => t2 !== current && (max === void 0 || t2.length <= max));
|
|
133398
133456
|
if (pick3 === void 0) return null;
|
|
133399
|
-
return { key:
|
|
133457
|
+
return { key: row2.key, value: pick3, from: row2.from, current, control: id };
|
|
133400
133458
|
}
|
|
133401
133459
|
function acceptsWords(props) {
|
|
133402
133460
|
if (props.secure === true) return false;
|
|
@@ -133678,8 +133736,8 @@ function onAppearOf(payload) {
|
|
|
133678
133736
|
function rootOnAppear(descriptor) {
|
|
133679
133737
|
return onAppearOf(descriptor?.payload);
|
|
133680
133738
|
}
|
|
133681
|
-
function isTransportReject(
|
|
133682
|
-
return
|
|
133739
|
+
function isTransportReject(message2) {
|
|
133740
|
+
return message2 === REJECT_ALL_MESSAGE || message2.startsWith("no data layer served ");
|
|
133683
133741
|
}
|
|
133684
133742
|
function isUnservedRequest(e2) {
|
|
133685
133743
|
const m2 = e2 instanceof Error ? e2.message : typeof e2 === "string" ? e2 : "";
|
|
@@ -133895,11 +133953,11 @@ function localDatabaseAnswer(schema, store, queue, method, params) {
|
|
|
133895
133953
|
if (!obj5 || typeof obj5.id !== "string") {
|
|
133896
133954
|
throw new Error("local_database.upsert: object with string id required");
|
|
133897
133955
|
}
|
|
133898
|
-
const
|
|
133899
|
-
const at2 = rows.findIndex((r3) => r3.id ===
|
|
133956
|
+
const row2 = detached(obj5);
|
|
133957
|
+
const at2 = rows.findIndex((r3) => r3.id === row2.id);
|
|
133900
133958
|
const next = [...rows];
|
|
133901
|
-
if (at2 >= 0) next[at2] =
|
|
133902
|
-
else next.push(
|
|
133959
|
+
if (at2 >= 0) next[at2] = row2;
|
|
133960
|
+
else next.push(row2);
|
|
133903
133961
|
store.set(entity, next);
|
|
133904
133962
|
return {};
|
|
133905
133963
|
}
|
|
@@ -134478,13 +134536,13 @@ async function crawlScreen(opts) {
|
|
|
134478
134536
|
async function crawlScreenJourney(opts) {
|
|
134479
134537
|
return withSwallowedRejections(async () => {
|
|
134480
134538
|
const findings = [];
|
|
134481
|
-
const fail6 = (
|
|
134539
|
+
const fail6 = (message2, step) => {
|
|
134482
134540
|
findings.push({
|
|
134483
134541
|
screen: opts.screenId,
|
|
134484
134542
|
trigger: step ? { tap: step.component ?? null, key: "journey", action: step.action } : "boot",
|
|
134485
134543
|
invariant: "journey-failed",
|
|
134486
134544
|
severity: "error",
|
|
134487
|
-
message,
|
|
134545
|
+
message: message2,
|
|
134488
134546
|
hint: "Keep a journey screen-local. Use an exact descriptor action id, pass the typed params it receives on device, and assert visible completion text."
|
|
134489
134547
|
});
|
|
134490
134548
|
};
|
|
@@ -135405,11 +135463,11 @@ async function crawlScreenDeep(opts, deep) {
|
|
|
135405
135463
|
return { findings: dedupe(findings), nodesVisited: visited.size, dispatches, capped, ...effects.length ? { effects } : {} };
|
|
135406
135464
|
});
|
|
135407
135465
|
}
|
|
135408
|
-
function effectiveSiteForRow(site,
|
|
135466
|
+
function effectiveSiteForRow(site, row2) {
|
|
135409
135467
|
const merged = { ...site.params ?? {}, ...site.args ?? {} };
|
|
135410
135468
|
const substituted = {};
|
|
135411
135469
|
for (const [k2, v2] of Object.entries(merged)) {
|
|
135412
|
-
substituted[k2] = typeof v2 === "string" && v2.startsWith("$item.") ? pathValue(
|
|
135470
|
+
substituted[k2] = typeof v2 === "string" && v2.startsWith("$item.") ? pathValue(row2, v2.slice("$item.".length)) : v2 === "$item" ? row2 : v2;
|
|
135413
135471
|
}
|
|
135414
135472
|
return { ...site, params: substituted, args: void 0 };
|
|
135415
135473
|
}
|
|
@@ -135603,8 +135661,8 @@ async function crawlScreenRelations(opts) {
|
|
|
135603
135661
|
const undoIsRowBound = isRowBound(b2);
|
|
135604
135662
|
const after = await replay([a2, b2], (i2, bootState, prev) => {
|
|
135605
135663
|
if (i2 !== 1) return null;
|
|
135606
|
-
const
|
|
135607
|
-
if (
|
|
135664
|
+
const row2 = newlyAddedRow(bootState, prev, b2.itemsPath);
|
|
135665
|
+
if (row2) return row2;
|
|
135608
135666
|
return undoIsRowBound ? UNBINDABLE_ROW : null;
|
|
135609
135667
|
});
|
|
135610
135668
|
if (!after) continue;
|
|
@@ -135663,7 +135721,7 @@ var init_screen_crawl = __esm({
|
|
|
135663
135721
|
WIX_DATA_QUERY = /\/wix-data\/v2\/items\/query$/;
|
|
135664
135722
|
WIX_DATA_ANY = /\/wix-data\//;
|
|
135665
135723
|
CAPABILITY_ACTION = /^capability\.([a-z0-9_]+)\.([A-Za-z0-9_]+)$/;
|
|
135666
|
-
detached = (
|
|
135724
|
+
detached = (row2) => JSON.parse(JSON.stringify(row2));
|
|
135667
135725
|
CRAWL_CLOCK = Date.parse("2026-01-01T00:00:00.000Z");
|
|
135668
135726
|
MEMBER_IDENTITY_ACTION = /memberIdentity|member\.identity|currentMember/i;
|
|
135669
135727
|
BLANK_WHEN_BOUND = {
|
|
@@ -138424,7 +138482,7 @@ function penalty(m2, size) {
|
|
|
138424
138482
|
if (c2 === m2[y2][x2 + 1] && c2 === m2[y2 + 1][x2] && c2 === m2[y2 + 1][x2 + 1]) score += 3;
|
|
138425
138483
|
}
|
|
138426
138484
|
let dark = 0;
|
|
138427
|
-
for (const
|
|
138485
|
+
for (const row2 of m2) for (const c2 of row2) if (c2) dark++;
|
|
138428
138486
|
const total = size * size;
|
|
138429
138487
|
score += Math.floor(Math.abs(dark * 20 - total * 10) / total) * 10;
|
|
138430
138488
|
return score;
|
|
@@ -138497,7 +138555,7 @@ function encodeQr(text11) {
|
|
|
138497
138555
|
}
|
|
138498
138556
|
let best = null, bestMask = 0, bestScore = Infinity;
|
|
138499
138557
|
for (let mask = 0; mask < 8; mask++) {
|
|
138500
|
-
const cand = modules.map((
|
|
138558
|
+
const cand = modules.map((row2) => [...row2]);
|
|
138501
138559
|
for (let y2 = 0; y2 < size; y2++)
|
|
138502
138560
|
for (let x2 = 0; x2 < size; x2++) if (!reserved[y2][x2] && MASKS[mask](x2, y2)) cand[y2][x2] = !cand[y2][x2];
|
|
138503
138561
|
applyFormat(cand, size, mask);
|
|
@@ -139109,7 +139167,7 @@ function lanOf(value2) {
|
|
|
139109
139167
|
return null;
|
|
139110
139168
|
}
|
|
139111
139169
|
try {
|
|
139112
|
-
return { url, qr: encodeQr(url).modules.map((
|
|
139170
|
+
return { url, qr: encodeQr(url).modules.map((row2) => row2.map((m2) => m2 ? "1" : "0").join("")) };
|
|
139113
139171
|
} catch {
|
|
139114
139172
|
return { url, qr: null };
|
|
139115
139173
|
}
|
|
@@ -140620,11 +140678,11 @@ function validateAmpersand(xmlData, i2) {
|
|
|
140620
140678
|
}
|
|
140621
140679
|
return i2;
|
|
140622
140680
|
}
|
|
140623
|
-
function getErrorObject(code,
|
|
140681
|
+
function getErrorObject(code, message2, lineNumber) {
|
|
140624
140682
|
return {
|
|
140625
140683
|
err: {
|
|
140626
140684
|
code,
|
|
140627
|
-
msg:
|
|
140685
|
+
msg: message2,
|
|
140628
140686
|
line: lineNumber.line || lineNumber,
|
|
140629
140687
|
col: lineNumber.col
|
|
140630
140688
|
}
|
|
@@ -147832,6 +147890,7 @@ var init_home_descriptor = __esm({
|
|
|
147832
147890
|
var template_trim_exports = {};
|
|
147833
147891
|
__export(template_trim_exports, {
|
|
147834
147892
|
TrimRefusal: () => TrimRefusal,
|
|
147893
|
+
bundlesOf: () => bundlesOf,
|
|
147835
147894
|
comparable: () => comparable,
|
|
147836
147895
|
compareErrors: () => compareErrors,
|
|
147837
147896
|
leftoverNavRefs: () => leftoverNavRefs,
|
|
@@ -148058,8 +148117,8 @@ function rowTemplateTarget(entry, removed) {
|
|
|
148058
148117
|
if (!isNode3(entry)) return void 0;
|
|
148059
148118
|
const props = entry.body.props;
|
|
148060
148119
|
if (!props?.itemsPath || !Array.isArray(props.items)) return void 0;
|
|
148061
|
-
for (const
|
|
148062
|
-
const to2 = tapTarget(
|
|
148120
|
+
for (const row2 of props.items) {
|
|
148121
|
+
const to2 = tapTarget(row2);
|
|
148063
148122
|
if (to2 && removed(to2)) return to2;
|
|
148064
148123
|
}
|
|
148065
148124
|
return void 0;
|
|
@@ -148713,17 +148772,17 @@ async function runTemplateTrim(req, deps) {
|
|
|
148713
148772
|
validate: validate6 ? { counts: validate6.counts ?? null, ...validate6.tail ? { tail: validate6.tail } : {} } : null
|
|
148714
148773
|
});
|
|
148715
148774
|
const abort = (error, cause, validate6) => {
|
|
148716
|
-
const
|
|
148775
|
+
const message2 = cause?.message ?? String(cause);
|
|
148717
148776
|
try {
|
|
148718
148777
|
restore();
|
|
148719
148778
|
} catch (e2) {
|
|
148720
148779
|
return {
|
|
148721
148780
|
code: 1,
|
|
148722
|
-
result: { ok: false, error: `${error} (${
|
|
148781
|
+
result: { ok: false, error: `${error} (${message2}), and restoring the originals failed too (${e2.message})`, rolledBack: false, backup: backupRel, hint: `the originals are in ${backupRel} \u2014 copy dev/index.ts, config.ts and tier5-src/* back by hand`, ...base(validate6) }
|
|
148723
148782
|
};
|
|
148724
148783
|
}
|
|
148725
148784
|
dropBackup();
|
|
148726
|
-
return { code: 1, result: { ok: false, error: `${error} (${
|
|
148785
|
+
return { code: 1, result: { ok: false, error: `${error} (${message2}); every file was restored`, rolledBack: true, ...base(validate6) } };
|
|
148727
148786
|
};
|
|
148728
148787
|
try {
|
|
148729
148788
|
mkdirSync20(join34(backup, "dev"), { recursive: true });
|
|
@@ -148855,8 +148914,8 @@ var init_template_trim = __esm({
|
|
|
148855
148914
|
init_home_descriptor();
|
|
148856
148915
|
TrimRefusal = class extends Error {
|
|
148857
148916
|
detail;
|
|
148858
|
-
constructor(
|
|
148859
|
-
super(
|
|
148917
|
+
constructor(message2, detail = {}) {
|
|
148918
|
+
super(message2);
|
|
148860
148919
|
this.detail = detail;
|
|
148861
148920
|
}
|
|
148862
148921
|
};
|
|
@@ -148887,6 +148946,129 @@ var init_template_trim = __esm({
|
|
|
148887
148946
|
}
|
|
148888
148947
|
});
|
|
148889
148948
|
|
|
148949
|
+
// src/template-evaluate.ts
|
|
148950
|
+
var template_evaluate_exports = {};
|
|
148951
|
+
__export(template_evaluate_exports, {
|
|
148952
|
+
evaluatedView: () => evaluatedView,
|
|
148953
|
+
templatedLabel: () => templatedLabel
|
|
148954
|
+
});
|
|
148955
|
+
async function settle(work, what) {
|
|
148956
|
+
let timer;
|
|
148957
|
+
try {
|
|
148958
|
+
return await Promise.race([
|
|
148959
|
+
Promise.resolve().then(work),
|
|
148960
|
+
new Promise((_2, reject) => {
|
|
148961
|
+
timer = setTimeout(() => reject(new Error(`${what} did not finish within ${BUILD_TIMEOUT_MS / 1e3}s`)), BUILD_TIMEOUT_MS);
|
|
148962
|
+
})
|
|
148963
|
+
]);
|
|
148964
|
+
} finally {
|
|
148965
|
+
clearTimeout(timer);
|
|
148966
|
+
}
|
|
148967
|
+
}
|
|
148968
|
+
function captureCount(pattern) {
|
|
148969
|
+
try {
|
|
148970
|
+
return (new RegExp(`${pattern.source}|`).exec("")?.length ?? 1) - 1;
|
|
148971
|
+
} catch {
|
|
148972
|
+
return 1;
|
|
148973
|
+
}
|
|
148974
|
+
}
|
|
148975
|
+
function buildContext(module, name) {
|
|
148976
|
+
let store = {};
|
|
148977
|
+
try {
|
|
148978
|
+
store = module.createStore?.(name) ?? {};
|
|
148979
|
+
} catch {
|
|
148980
|
+
store = {};
|
|
148981
|
+
}
|
|
148982
|
+
return {
|
|
148983
|
+
store,
|
|
148984
|
+
toggles: {},
|
|
148985
|
+
query: new URLSearchParams(),
|
|
148986
|
+
caller: { entitled: false },
|
|
148987
|
+
serverBaseUrl: "http://localhost",
|
|
148988
|
+
bundleIntegrity: () => "sha256-unpinned",
|
|
148989
|
+
asset: () => null
|
|
148990
|
+
};
|
|
148991
|
+
}
|
|
148992
|
+
function row(label3, kind, built, buildError) {
|
|
148993
|
+
const block = built && typeof built === "object" && !Array.isArray(built) ? built : {};
|
|
148994
|
+
const json8 = JSON.stringify(block, null, 2) ?? "{}";
|
|
148995
|
+
return {
|
|
148996
|
+
label: label3,
|
|
148997
|
+
kind,
|
|
148998
|
+
block,
|
|
148999
|
+
bundles: buildError ? [] : bundlesOf(block),
|
|
149000
|
+
lines: json8.split("\n").length,
|
|
149001
|
+
bytes: Buffer.byteLength(json8),
|
|
149002
|
+
...buildError ? { buildError } : {}
|
|
149003
|
+
};
|
|
149004
|
+
}
|
|
149005
|
+
async function buildTemplated(t2, ctx) {
|
|
149006
|
+
const placeholder3 = Array.from({ length: Math.max(1, captureCount(t2.pattern)) }, () => ID_PLACEHOLDER);
|
|
149007
|
+
let error;
|
|
149008
|
+
try {
|
|
149009
|
+
const built = await settle(() => t2.build(ctx, placeholder3), `the templated route ${t2.display}`);
|
|
149010
|
+
if (built) return { built };
|
|
149011
|
+
} catch (e2) {
|
|
149012
|
+
error = message(e2);
|
|
149013
|
+
}
|
|
149014
|
+
if (typeof t2.seedIds === "function") {
|
|
149015
|
+
try {
|
|
149016
|
+
const ids = await settle(() => t2.seedIds(ctx), `seedIds of ${t2.display}`);
|
|
149017
|
+
for (const id of Array.isArray(ids) ? ids.slice(0, 20) : []) {
|
|
149018
|
+
const m2 = typeof id === "string" ? t2.pattern.exec(id) : null;
|
|
149019
|
+
if (!m2) continue;
|
|
149020
|
+
const built = await settle(() => t2.build(ctx, m2.slice(1)), `the templated route ${t2.display}`);
|
|
149021
|
+
if (built) return { built };
|
|
149022
|
+
}
|
|
149023
|
+
} catch (e2) {
|
|
149024
|
+
error ??= message(e2);
|
|
149025
|
+
}
|
|
149026
|
+
}
|
|
149027
|
+
return { error: error ?? "the builder returned no descriptor" };
|
|
149028
|
+
}
|
|
149029
|
+
async function evaluatedView(dir) {
|
|
149030
|
+
const { loadContent: loadContent2 } = await Promise.resolve().then(() => (init_loader(), loader_exports));
|
|
149031
|
+
(await Promise.resolve().then(() => (init_build(), build_exports))).bundledRuntimeDir();
|
|
149032
|
+
let loaded;
|
|
149033
|
+
try {
|
|
149034
|
+
loaded = await loadContent2(dir);
|
|
149035
|
+
} catch (e2) {
|
|
149036
|
+
throw new TrimRefusal(`dev/index.ts could not be loaded to read its screens: ${message(e2)}`);
|
|
149037
|
+
}
|
|
149038
|
+
const m2 = loaded.module;
|
|
149039
|
+
const ctx = buildContext(m2, loaded.name);
|
|
149040
|
+
const routes = [];
|
|
149041
|
+
for (const [id, build3] of Object.entries(m2.screens?.exact ?? {})) {
|
|
149042
|
+
try {
|
|
149043
|
+
const built = await settle(() => build3(ctx), `the screen ${id}`);
|
|
149044
|
+
routes.push(built ? row(id, "screen", built) : row(id, "screen", void 0, "the builder returned no descriptor"));
|
|
149045
|
+
} catch (e2) {
|
|
149046
|
+
routes.push(row(id, "screen", void 0, message(e2)));
|
|
149047
|
+
}
|
|
149048
|
+
}
|
|
149049
|
+
for (const t2 of m2.screens?.templated ?? []) {
|
|
149050
|
+
const { built, error } = await buildTemplated(t2, ctx);
|
|
149051
|
+
routes.push(row(templatedLabel(String(t2.display)), "templated", built, built ? void 0 : error));
|
|
149052
|
+
}
|
|
149053
|
+
const nav = m2.config?.navigation;
|
|
149054
|
+
return {
|
|
149055
|
+
layout: "evaluated",
|
|
149056
|
+
home: String(m2.homeScreenId ?? ""),
|
|
149057
|
+
routes,
|
|
149058
|
+
nav: nav && typeof nav === "object" && !Array.isArray(nav) ? nav : {}
|
|
149059
|
+
};
|
|
149060
|
+
}
|
|
149061
|
+
var BUILD_TIMEOUT_MS, ID_PLACEHOLDER, templatedLabel, message;
|
|
149062
|
+
var init_template_evaluate = __esm({
|
|
149063
|
+
"src/template-evaluate.ts"() {
|
|
149064
|
+
init_template_trim();
|
|
149065
|
+
BUILD_TIMEOUT_MS = 1e4;
|
|
149066
|
+
ID_PLACEHOLDER = "__HIMI_ID__";
|
|
149067
|
+
templatedLabel = (display) => display.replace(/[[{].*$/, "").replace(/[_/]+$/, "") || display;
|
|
149068
|
+
message = (e2) => e2 instanceof Error ? e2.message : String(e2);
|
|
149069
|
+
}
|
|
149070
|
+
});
|
|
149071
|
+
|
|
148890
149072
|
// src/template-adopt.ts
|
|
148891
149073
|
var template_adopt_exports = {};
|
|
148892
149074
|
__export(template_adopt_exports, {
|
|
@@ -148899,6 +149081,7 @@ __export(template_adopt_exports, {
|
|
|
148899
149081
|
copyHits: () => copyHits,
|
|
148900
149082
|
droppedPrimaryTaps: () => droppedPrimaryTaps,
|
|
148901
149083
|
findRoute: () => findRoute,
|
|
149084
|
+
inspectAnyLayout: () => inspectAnyLayout,
|
|
148902
149085
|
inspectApp: () => inspectApp,
|
|
148903
149086
|
inventorySummary: () => inventorySummary,
|
|
148904
149087
|
keepFromSpec: () => keepFromSpec,
|
|
@@ -149051,8 +149234,8 @@ function copyHits(dir, re2, limit = 200) {
|
|
|
149051
149234
|
}
|
|
149052
149235
|
return { hits, total };
|
|
149053
149236
|
}
|
|
149054
|
-
function navigationOf(
|
|
149055
|
-
const nav =
|
|
149237
|
+
function navigationOf(navValue) {
|
|
149238
|
+
const nav = navValue ?? {};
|
|
149056
149239
|
const tabs = (nav.tabBar?.items ?? []).map((t2) => t2.screenId).filter((s2) => typeof s2 === "string");
|
|
149057
149240
|
return { tabs, linkable: Array.isArray(nav.linkableScreens) ? nav.linkableScreens.length : 0 };
|
|
149058
149241
|
}
|
|
@@ -149070,9 +149253,40 @@ function journeysFor(screen, actions) {
|
|
|
149070
149253
|
expectText: ["<FILL: text the screen shows once the submit succeeds>"]
|
|
149071
149254
|
}));
|
|
149072
149255
|
}
|
|
149256
|
+
function parsedView(src) {
|
|
149257
|
+
const app = parseApp(src.dev, src.config);
|
|
149258
|
+
return {
|
|
149259
|
+
layout: "generated",
|
|
149260
|
+
home: app.home.label,
|
|
149261
|
+
routes: app.routes.map((r3) => ({
|
|
149262
|
+
label: r3.label,
|
|
149263
|
+
kind: r3.kind,
|
|
149264
|
+
block: r3.block,
|
|
149265
|
+
bundles: r3.bundles,
|
|
149266
|
+
lines: src.dev.slice(r3.lineStart, r3.end).split("\n").length - 1,
|
|
149267
|
+
bytes: r3.end - r3.lineStart
|
|
149268
|
+
})),
|
|
149269
|
+
nav: app.nav.value
|
|
149270
|
+
};
|
|
149271
|
+
}
|
|
149073
149272
|
function inspectApp(dir) {
|
|
149074
149273
|
const src = readAppSources(dir);
|
|
149075
|
-
|
|
149274
|
+
return inventoryOf(dir, src, parsedView(src));
|
|
149275
|
+
}
|
|
149276
|
+
async function inspectAnyLayout(dir) {
|
|
149277
|
+
const src = readAppSources(dir);
|
|
149278
|
+
let view;
|
|
149279
|
+
try {
|
|
149280
|
+
view = parsedView(src);
|
|
149281
|
+
} catch (e2) {
|
|
149282
|
+
if (!(e2 instanceof TrimRefusal)) throw e2;
|
|
149283
|
+
const { evaluatedView: evaluatedView2 } = await Promise.resolve().then(() => (init_template_evaluate(), template_evaluate_exports));
|
|
149284
|
+
view = await evaluatedView2(dir);
|
|
149285
|
+
return { ...inventoryOf(dir, src, view), layoutNote: e2.message };
|
|
149286
|
+
}
|
|
149287
|
+
return inventoryOf(dir, src, view);
|
|
149288
|
+
}
|
|
149289
|
+
function inventoryOf(dir, src, app) {
|
|
149076
149290
|
const reach = workerReach(src);
|
|
149077
149291
|
const bootRequests = [];
|
|
149078
149292
|
const matrix = [];
|
|
@@ -149084,10 +149298,11 @@ function inspectApp(dir) {
|
|
|
149084
149298
|
screens.push({
|
|
149085
149299
|
id: r3.label,
|
|
149086
149300
|
kind: r3.kind,
|
|
149087
|
-
lines:
|
|
149088
|
-
bytes: r3.
|
|
149301
|
+
lines: r3.lines,
|
|
149302
|
+
bytes: r3.bytes,
|
|
149089
149303
|
workers: r3.bundles,
|
|
149090
|
-
onAppear: [...new Set(appear.map((a2) => a2.actionId))]
|
|
149304
|
+
onAppear: [...new Set(appear.map((a2) => a2.actionId))],
|
|
149305
|
+
...r3.buildError ? { buildError: r3.buildError } : {}
|
|
149091
149306
|
});
|
|
149092
149307
|
for (const a2 of appear) {
|
|
149093
149308
|
for (const w2 of r3.bundles) {
|
|
@@ -149095,33 +149310,37 @@ function inspectApp(dir) {
|
|
|
149095
149310
|
if (!reaches(wr2)) continue;
|
|
149096
149311
|
const via = [...wr2.wixModules, ...wr2.rawWixApi ? ["wixApi"] : [], ...wr2.fetch ? ["fetch"] : []];
|
|
149097
149312
|
if (!bootRequests.some((b2) => b2.screen === r3.label && b2.actionId === a2.actionId && b2.worker === w2)) {
|
|
149098
|
-
bootRequests.push({ screen: r3.label, actionId: a2.actionId, worker: w2, via, home: r3.label === app.home
|
|
149313
|
+
bootRequests.push({ screen: r3.label, actionId: a2.actionId, worker: w2, via, home: r3.label === app.home });
|
|
149099
149314
|
}
|
|
149100
149315
|
}
|
|
149101
149316
|
}
|
|
149102
149317
|
const pick3 = (k2) => [...new Set(actions.filter((a2) => a2.kind === k2).map((a2) => a2.action))].sort();
|
|
149103
|
-
const
|
|
149318
|
+
const row2 = {
|
|
149104
149319
|
screen: r3.label,
|
|
149105
149320
|
reads: [...new Set(r3.bundles.flatMap((w2) => reach.get(w2)?.wixModules ?? []))].sort(),
|
|
149106
149321
|
writes: pick3("write"),
|
|
149107
149322
|
destructive: pick3("destructive"),
|
|
149108
149323
|
payment: pick3("payment")
|
|
149109
149324
|
};
|
|
149110
|
-
const prior = matrix.find((m2) => m2.screen ===
|
|
149325
|
+
const prior = matrix.find((m2) => m2.screen === row2.screen);
|
|
149111
149326
|
if (prior) {
|
|
149112
|
-
for (const k2 of ["reads", "writes", "destructive", "payment"]) prior[k2] = [.../* @__PURE__ */ new Set([...prior[k2], ...
|
|
149113
|
-
} else if (
|
|
149327
|
+
for (const k2 of ["reads", "writes", "destructive", "payment"]) prior[k2] = [.../* @__PURE__ */ new Set([...prior[k2], ...row2[k2]])].sort();
|
|
149328
|
+
} else if (row2.writes.length || row2.destructive.length || row2.payment.length) matrix.push(row2);
|
|
149114
149329
|
journeys.push(...journeysFor(r3.label, actions));
|
|
149115
149330
|
}
|
|
149331
|
+
const unreadScreens = screens.filter((s2) => s2.buildError).map((s2) => s2.id);
|
|
149116
149332
|
return {
|
|
149117
149333
|
ok: true,
|
|
149118
149334
|
dir,
|
|
149119
|
-
|
|
149335
|
+
layout: app.layout,
|
|
149336
|
+
home: app.home,
|
|
149120
149337
|
screens,
|
|
149121
149338
|
workers: [...reach.values()],
|
|
149122
|
-
navigation: navigationOf(app),
|
|
149339
|
+
navigation: navigationOf(app.nav),
|
|
149123
149340
|
bootRequests,
|
|
149124
|
-
|
|
149341
|
+
// The preflight errs to "may request": a screen it could not read is not proof of offline.
|
|
149342
|
+
bootsOffline: bootRequests.length === 0 && unreadScreens.length === 0,
|
|
149343
|
+
...unreadScreens.length ? { unreadScreens } : {},
|
|
149125
149344
|
placeholders: copyHits(dir, PLACEHOLDER),
|
|
149126
149345
|
sampleCopy: copyHits(dir, SAMPLE_COPY, 50),
|
|
149127
149346
|
matrix,
|
|
@@ -149151,11 +149370,12 @@ function inventorySummary(inv) {
|
|
|
149151
149370
|
bootsOffline: inv.bootsOffline,
|
|
149152
149371
|
bootRequests: inv.bootRequests.length,
|
|
149153
149372
|
...inv.bootRequests.some((b2) => b2.home) ? { homeRequestsAtBoot: true } : {},
|
|
149373
|
+
...inv.unreadScreens?.length ? { unreadScreens: inv.unreadScreens.length } : {},
|
|
149154
149374
|
placeholders: inv.placeholders.total,
|
|
149155
149375
|
sampleCopy: inv.sampleCopy.total,
|
|
149156
149376
|
riskyScreens: inv.matrix.length,
|
|
149157
149377
|
journeyStubs: inv.journeys.length,
|
|
149158
|
-
next: inv.bootsOffline ? "Nothing requests at boot \u2014 the local preview needs no data consent. `himi template inspect` for the full inventory." : `${inv.bootRequests.length} screen action(s) can call Wix/network on appear \u2014 get data consent (or mock them in dev/net-mocks.json) before booting the preview. Details: ${ADOPT_FILE}.`
|
|
149378
|
+
next: inv.bootsOffline ? "Nothing requests at boot \u2014 the local preview needs no data consent. `himi template inspect` for the full inventory." : inv.bootRequests.length === 0 ? `${inv.unreadScreens?.length ?? 0} screen(s) could not be built to read (see buildError), so whether they request on appear is unknown \u2014 treat the preview as needing data consent until they build. Details: ${ADOPT_FILE}.` : `${inv.bootRequests.length} screen action(s) can call Wix/network on appear \u2014 get data consent (or mock them in dev/net-mocks.json) before booting the preview. Details: ${ADOPT_FILE}.`
|
|
149159
149379
|
};
|
|
149160
149380
|
}
|
|
149161
149381
|
function writeNoFollow(dir, rel, body) {
|
|
@@ -150771,6 +150991,7 @@ function ignoredChange(relPath, isDirectory = () => false, rasterDir = "assets/h
|
|
|
150771
150991
|
if (!parts.length) return true;
|
|
150772
150992
|
const [top] = parts;
|
|
150773
150993
|
if ([".himi", "dist", "node_modules", ".git", ".build", ...AGENT_TOOLING_DIRS].includes(top)) return true;
|
|
150994
|
+
if (top === ".wix" && (parts.length > 1 || isDirectory(top))) return true;
|
|
150774
150995
|
if (parts.length === 1 && AGENT_TOOLING_ROOT_FILES.includes(top)) return true;
|
|
150775
150996
|
if ((top === "shots" || top === "evidence") && (parts.length > 1 || isDirectory(top))) return true;
|
|
150776
150997
|
const name = parts[parts.length - 1];
|
|
@@ -151094,10 +151315,10 @@ function screenStateOf(services, html, opts = {}) {
|
|
|
151094
151315
|
let empty2;
|
|
151095
151316
|
for (const top of states) for (const s2 of layers2(top)) {
|
|
151096
151317
|
const status = typeof s2.status === "string" ? s2.status.toLowerCase() : typeof s2.phase === "string" ? s2.phase.toLowerCase() : void 0;
|
|
151097
|
-
const
|
|
151318
|
+
const message2 = errorMessageOf(s2);
|
|
151098
151319
|
const flagged = status === "error" || status === "failed" || s2.hasError === true || s2.isError === true || s2.isErrored === true || s2.errored === true || s2.noError === false || s2.notErrored === false;
|
|
151099
|
-
if (flagged && !(
|
|
151100
|
-
const line =
|
|
151320
|
+
if (flagged && !(message2 && page !== void 0 && !painted(message2, page)) || message2 && page !== void 0 && painted(message2, page)) {
|
|
151321
|
+
const line = message2 && painted(message2, page) ? quotableLine(message2) : void 0;
|
|
151101
151322
|
return { state: "error", ...line ? { line } : {}, ...opts.offline ? { offline: true } : {} };
|
|
151102
151323
|
}
|
|
151103
151324
|
if (status === "loading" || s2.isLoading === true || s2.noLoading === false) loading = true;
|
|
@@ -151161,9 +151382,9 @@ function homeStateCaveat(state) {
|
|
|
151161
151382
|
if (state.state === "loading") return "the home screen is still on its loading state (its data never finished loading)";
|
|
151162
151383
|
return `the home screen shows its empty state${quote}`;
|
|
151163
151384
|
}
|
|
151164
|
-
function withHomeCaveat(
|
|
151165
|
-
if (!caveat) return
|
|
151166
|
-
const body =
|
|
151385
|
+
function withHomeCaveat(message2, caveat) {
|
|
151386
|
+
if (!caveat) return message2;
|
|
151387
|
+
const body = message2.endsWith(".") ? message2.slice(0, -1) : message2;
|
|
151167
151388
|
return `${body} \u2014 but ${caveat}.`;
|
|
151168
151389
|
}
|
|
151169
151390
|
var SHOT_STATES_FILE, KEEP, LINE_MAX, str4, sha256Of;
|
|
@@ -151665,8 +151886,8 @@ async function openBoardForSession(dir, cwd = process.cwd()) {
|
|
|
151665
151886
|
return { opened: false, error: `the build board was not created: ${e2.message} \u2014 \`himi studio --no-open\` in the app retries it` };
|
|
151666
151887
|
}
|
|
151667
151888
|
}
|
|
151668
|
-
function journal(dir, milestone,
|
|
151669
|
-
const r3 = journalMilestone(dir, { milestone, message, ...extra });
|
|
151889
|
+
function journal(dir, milestone, message2, extra) {
|
|
151890
|
+
const r3 = journalMilestone(dir, { milestone, message: message2, ...extra });
|
|
151670
151891
|
return r3.journaled ? { journaled: true, milestone, message: r3.entry.message } : void 0;
|
|
151671
151892
|
}
|
|
151672
151893
|
function stillBuilding(dir, image, now) {
|
|
@@ -151693,7 +151914,7 @@ function afterRenderPng(dir, input) {
|
|
|
151693
151914
|
let postcard;
|
|
151694
151915
|
if (isHome) {
|
|
151695
151916
|
const d2 = initDivergence(dir);
|
|
151696
|
-
const said = (
|
|
151917
|
+
const said = (message2) => withHomeCaveat(message2, homeCaveat(dir, input.pngFile));
|
|
151697
151918
|
postcard = d2.state === "unchanged" ? journal(dir, "first-look", said(startingPointMessage(d2.template)), { ref: STARTING_POINT_REF, image: input.pngFile, ...at2 }) : d2.state === "diverged" ? journal(dir, "first-look", said(yourFirstLookMessage(dir)), { image: input.pngFile, ...at2 }) : journal(dir, "first-look", said(`First look at ${appName(dir)}: the home screen, where the build starts.`), { image: input.pngFile, ...at2 });
|
|
151698
151919
|
postcard ??= stillBuilding(dir, input.pngFile, input.now ?? /* @__PURE__ */ new Date());
|
|
151699
151920
|
}
|
|
@@ -151711,8 +151932,8 @@ function testPostcardMessage(s2) {
|
|
|
151711
151932
|
const unreached = s2.unreached ? `, ${plural2(s2.unreached, "screen")} nothing links to` : "";
|
|
151712
151933
|
return `Test crawl: ${plural2(s2.screens, "screen")} and ${plural2(s2.actions ?? 0, "action")} exercised${links}${unreached} \u2014 ${s2.errors ? `${plural2(s2.errors, "error")} to fix` : "no errors"}.`;
|
|
151713
151934
|
}
|
|
151714
|
-
function testPostcardCounts(
|
|
151715
|
-
const head =
|
|
151935
|
+
function testPostcardCounts(message2) {
|
|
151936
|
+
const head = message2.split(". ")[0];
|
|
151716
151937
|
const counts = /* @__PURE__ */ new Map();
|
|
151717
151938
|
const num4 = (re2, label3) => {
|
|
151718
151939
|
const m2 = re2.exec(head);
|
|
@@ -152770,8 +152991,8 @@ function tokenNumericIssuesFor(dir) {
|
|
|
152770
152991
|
}
|
|
152771
152992
|
function tokenColorIssues(dir, tokensPathOverride) {
|
|
152772
152993
|
const issues = [];
|
|
152773
|
-
const error = (
|
|
152774
|
-
const warn3 = (
|
|
152994
|
+
const error = (message2) => issues.push({ screen: null, pass: "tokens", severity: "error", message: message2 });
|
|
152995
|
+
const warn3 = (message2) => issues.push({ screen: null, pass: "tokens", severity: "warning", message: message2 });
|
|
152775
152996
|
const configured = tokensPathOverride ? { path: tokensPathOverride } : configuredTokensPath(dir);
|
|
152776
152997
|
if (configured.computed) {
|
|
152777
152998
|
warn3(
|
|
@@ -153324,6 +153545,15 @@ function syntaxErrors(file2, text11) {
|
|
|
153324
153545
|
const out2 = ts7.transpileModule(text11, { fileName: file2, reportDiagnostics: true, compilerOptions: { target: ts7.ScriptTarget.ES2022 } });
|
|
153325
153546
|
return (out2.diagnostics ?? []).map((d2) => ts7.flattenDiagnosticMessageText(d2.messageText, "\n"));
|
|
153326
153547
|
}
|
|
153548
|
+
function parses(dev, config) {
|
|
153549
|
+
try {
|
|
153550
|
+
parseApp(dev, config);
|
|
153551
|
+
return true;
|
|
153552
|
+
} catch (e2) {
|
|
153553
|
+
if (e2 instanceof TrimRefusal) return false;
|
|
153554
|
+
throw e2;
|
|
153555
|
+
}
|
|
153556
|
+
}
|
|
153327
153557
|
function sweepCopy(dir, pairs, dryRun) {
|
|
153328
153558
|
for (const [from] of pairs) {
|
|
153329
153559
|
if (from.trim().length < 3) throw new TrimRefusal(`refusing to sweep "${from}": a replacement source must be at least 3 characters`);
|
|
@@ -153362,12 +153592,14 @@ function sweepCopy(dir, pairs, dryRun) {
|
|
|
153362
153592
|
if (errors.length) throw new TrimRefusal(`the sweep would break ${f2} \u2014 nothing written: ${errors[0]}`);
|
|
153363
153593
|
next.set(f2, out2);
|
|
153364
153594
|
}
|
|
153365
|
-
const
|
|
153366
|
-
const
|
|
153367
|
-
|
|
153368
|
-
|
|
153369
|
-
|
|
153370
|
-
|
|
153595
|
+
const devBefore = readFileSync59(join49(dir, "dev", "index.ts"), "utf8");
|
|
153596
|
+
const configBefore = readFileSync59(join49(dir, "config.ts"), "utf8");
|
|
153597
|
+
if (parses(devBefore, configBefore)) {
|
|
153598
|
+
try {
|
|
153599
|
+
parseApp(next.get("dev/index.ts") ?? devBefore, next.get("config.ts") ?? configBefore);
|
|
153600
|
+
} catch (e2) {
|
|
153601
|
+
throw new TrimRefusal(`the sweep would leave dev/index.ts or config.ts unparseable \u2014 nothing written: ${e2.message}`);
|
|
153602
|
+
}
|
|
153371
153603
|
}
|
|
153372
153604
|
if (!dryRun) for (const [f2, t2] of next) writeFileSync20(join49(dir, f2), t2);
|
|
153373
153605
|
const g2 = new RegExp(PLACEHOLDER.source, `${PLACEHOLDER.flags.replace("g", "")}g`);
|
|
@@ -153654,12 +153886,12 @@ function recommendTemplates(input) {
|
|
|
153654
153886
|
const owner = OWNER_WORDS.test(text11);
|
|
153655
153887
|
const want = new Set(tokens(text11));
|
|
153656
153888
|
const byName3 = /* @__PURE__ */ new Map();
|
|
153657
|
-
for (const
|
|
153889
|
+
for (const row2 of input.catalog) {
|
|
153658
153890
|
const reasons = [];
|
|
153659
153891
|
let score = 0;
|
|
153660
|
-
const isOwner = /owner/.test(
|
|
153892
|
+
const isOwner = /owner/.test(row2.name);
|
|
153661
153893
|
if (want.size) {
|
|
153662
|
-
const hay = new Set(tokens([
|
|
153894
|
+
const hay = new Set(tokens([row2.name, row2.title ?? "", row2.description ?? "", ...row2.tags ?? [], row2.category ?? ""].join(" ")));
|
|
153663
153895
|
const hit = [...want].filter((t2) => hay.has(t2));
|
|
153664
153896
|
if (hit.length) {
|
|
153665
153897
|
score += hit.length / want.size;
|
|
@@ -153674,7 +153906,7 @@ function recommendTemplates(input) {
|
|
|
153674
153906
|
score -= 0.3;
|
|
153675
153907
|
}
|
|
153676
153908
|
}
|
|
153677
|
-
byName3.set(
|
|
153909
|
+
byName3.set(row2.name, { name: row2.name, score, reasons, ...row2.source ? { source: row2.source } : {} });
|
|
153678
153910
|
}
|
|
153679
153911
|
if (input.verticals?.length) {
|
|
153680
153912
|
for (const c2 of scoreOverlays(input.verticals, "")) {
|
|
@@ -156453,8 +156685,8 @@ function navConfigPathErrors(config) {
|
|
|
156453
156685
|
if (!tabs && !rail) {
|
|
156454
156686
|
const home = typeof config.homeScreenId === "string" && config.homeScreenId.length > 0 ? config.homeScreenId : void 0;
|
|
156455
156687
|
const rows = list2(obj5(config.drawer)?.items);
|
|
156456
|
-
const
|
|
156457
|
-
homes.push(["drawer.items",
|
|
156688
|
+
const row2 = home !== void 0 ? rows.find(([it2]) => it2.screenId === home) : firstOf(obj5(config.drawer)?.items, true);
|
|
156689
|
+
homes.push(["drawer.items", row2]);
|
|
156458
156690
|
}
|
|
156459
156691
|
for (const [where, first] of homes) {
|
|
156460
156692
|
if (first && first[0].hiddenUntilResolved) {
|
|
@@ -156483,9 +156715,9 @@ __export(nav_lint_exports, {
|
|
|
156483
156715
|
});
|
|
156484
156716
|
async function navIssues(dir, strict) {
|
|
156485
156717
|
const issues = [];
|
|
156486
|
-
const push = (severity, ruleCode,
|
|
156487
|
-
const error = (ruleCode,
|
|
156488
|
-
const warn3 = (ruleCode,
|
|
156718
|
+
const push = (severity, ruleCode, message2) => issues.push({ screen: null, pass: "nav", severity, message: message2, ruleCode });
|
|
156719
|
+
const error = (ruleCode, message2) => push("error", ruleCode, message2);
|
|
156720
|
+
const warn3 = (ruleCode, message2) => push(strict ? "error" : "warning", ruleCode, message2);
|
|
156489
156721
|
let cfg;
|
|
156490
156722
|
try {
|
|
156491
156723
|
cfg = await loadAppConfigModule(dir);
|
|
@@ -156552,10 +156784,10 @@ async function navIssues(dir, strict) {
|
|
|
156552
156784
|
);
|
|
156553
156785
|
}
|
|
156554
156786
|
const servedHome = homeScreenIdOf(dir) ?? void 0;
|
|
156555
|
-
for (const
|
|
156556
|
-
error("nav-path-malformed", `navigation.${
|
|
156787
|
+
for (const message2 of navConfigPathErrors({ ...nav, homeScreenId: servedHome })) {
|
|
156788
|
+
error("nav-path-malformed", `navigation.${message2}`);
|
|
156557
156789
|
}
|
|
156558
|
-
for (const
|
|
156790
|
+
for (const message2 of navSharedIdErrors(nav)) error("nav-row-id-shadows-tab", `navigation.${message2}`);
|
|
156559
156791
|
const topBarDefault = nav.topBarDefault;
|
|
156560
156792
|
if (isPlainObject2(topBarDefault)) {
|
|
156561
156793
|
for (const key3 of SCREEN_ONLY_TOP_BAR_KEYS) {
|
|
@@ -156685,14 +156917,14 @@ function navSharedIdErrors(nav) {
|
|
|
156685
156917
|
for (const [tab] of items("tabBar")) if (typeof tab.id === "string" && !tabScreens.has(tab.id)) tabScreens.set(tab.id, tab.screenId);
|
|
156686
156918
|
const out2 = [];
|
|
156687
156919
|
for (const key3 of ["drawer", "sidebar"]) {
|
|
156688
|
-
for (const [
|
|
156689
|
-
if (typeof
|
|
156690
|
-
const tabScreen = tabScreens.get(
|
|
156920
|
+
for (const [row2, i2] of items(key3)) {
|
|
156921
|
+
if (typeof row2.id !== "string" || !tabScreens.has(row2.id)) continue;
|
|
156922
|
+
const tabScreen = tabScreens.get(row2.id);
|
|
156691
156923
|
if (typeof tabScreen !== "string") continue;
|
|
156692
|
-
if (key3 === "drawer" && (
|
|
156693
|
-
if (typeof
|
|
156924
|
+
if (key3 === "drawer" && (row2.role === "section" || row2.role === "note")) continue;
|
|
156925
|
+
if (typeof row2.screenId !== "string" || row2.screenId === "" || row2.screenId === tabScreen) continue;
|
|
156694
156926
|
out2.push(
|
|
156695
|
-
`${key3}.items[${i2}] "${
|
|
156927
|
+
`${key3}.items[${i2}] "${row2.id}": a tab has this id but opens ${JSON.stringify(tabScreen)}, not "${row2.screenId}" \u2014 every shell hands its host one id and the host resolves tabs first, so this row would open the tab's screen. Give the row its own id.`
|
|
156696
156928
|
);
|
|
156697
156929
|
}
|
|
156698
156930
|
}
|
|
@@ -156964,8 +157196,8 @@ var init_base44_types = __esm({
|
|
|
156964
157196
|
SCALAR = { string: "string", number: "number", integer: "number", boolean: "boolean" };
|
|
156965
157197
|
key2 = (k2) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(k2) ? k2 : JSON.stringify(k2);
|
|
156966
157198
|
Base44TypesError = class extends Error {
|
|
156967
|
-
constructor(code,
|
|
156968
|
-
super(
|
|
157199
|
+
constructor(code, message2) {
|
|
157200
|
+
super(message2);
|
|
156969
157201
|
this.code = code;
|
|
156970
157202
|
}
|
|
156971
157203
|
};
|
|
@@ -157853,10 +158085,10 @@ function parseDataAccess(text11, from) {
|
|
|
157853
158085
|
const rows = [];
|
|
157854
158086
|
for (const line of lines.slice(1)) {
|
|
157855
158087
|
if (/^\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)*\|?$/.test(line)) continue;
|
|
157856
|
-
const
|
|
157857
|
-
const screen = unquote(
|
|
158088
|
+
const row2 = cells(line);
|
|
158089
|
+
const screen = unquote(row2[screenCol] ?? "");
|
|
157858
158090
|
if (!screen) continue;
|
|
157859
|
-
const cell2 = unquote(
|
|
158091
|
+
const cell2 = unquote(row2[writesCol] ?? "");
|
|
157860
158092
|
const entries = splitEntries(cell2).filter((e2) => !isNoneEntry(e2));
|
|
157861
158093
|
rows.push({ screen, allowed: NONE.test(cell2) || !entries.length ? null : entries });
|
|
157862
158094
|
}
|
|
@@ -157905,10 +158137,10 @@ function pathPattern(p2) {
|
|
|
157905
158137
|
function unapprovedWriteFindings(writes, plan) {
|
|
157906
158138
|
if (!plan) return [];
|
|
157907
158139
|
const byScreen = /* @__PURE__ */ new Map();
|
|
157908
|
-
for (const
|
|
157909
|
-
const list2 = byScreen.get(
|
|
157910
|
-
list2.push(
|
|
157911
|
-
byScreen.set(
|
|
158140
|
+
for (const row2 of plan.rows) {
|
|
158141
|
+
const list2 = byScreen.get(row2.screen) ?? [];
|
|
158142
|
+
list2.push(row2);
|
|
158143
|
+
byScreen.set(row2.screen, list2);
|
|
157912
158144
|
}
|
|
157913
158145
|
const findings = [];
|
|
157914
158146
|
for (const w2 of writes) {
|
|
@@ -160374,25 +160606,25 @@ function createLocalTestSandbox() {
|
|
|
160374
160606
|
hasData: Boolean(context.dataApi && context.capabilities?.includes("data")),
|
|
160375
160607
|
hasResourceAdmin: Boolean(context.dataApi && context.capabilities?.includes("resource_admin"))
|
|
160376
160608
|
};
|
|
160377
|
-
port1.on("message", async (
|
|
160609
|
+
port1.on("message", async (message2) => {
|
|
160378
160610
|
try {
|
|
160379
160611
|
let value2;
|
|
160380
|
-
if (
|
|
160381
|
-
else if (
|
|
160382
|
-
else if (
|
|
160383
|
-
const response = await (context.http || context.httpApi).fetch(String(
|
|
160612
|
+
if (message2.capability === "wixApi" && context.wixApi) value2 = await context.wixApi.call(...message2.args);
|
|
160613
|
+
else if (message2.capability === "secrets" && (context.secrets || context.secretsApi)) value2 = await (context.secrets || context.secretsApi).get(String(message2.args[0]));
|
|
160614
|
+
else if (message2.capability === "http" && (context.http || context.httpApi)) {
|
|
160615
|
+
const response = await (context.http || context.httpApi).fetch(String(message2.args[0]), message2.args[1]);
|
|
160384
160616
|
value2 = { status: response.status, statusText: response.statusText, headers: [...response.headers.entries()], body: new Uint8Array(await response.arrayBuffer()) };
|
|
160385
|
-
} else if (
|
|
160386
|
-
value2 = await context.functionsApi.call(String(
|
|
160387
|
-
} else if (
|
|
160388
|
-
value2 = await context.functionsApi.enqueue(String(
|
|
160389
|
-
} else if (
|
|
160390
|
-
value2 = await context.dataApi.call(
|
|
160391
|
-
} else throw new Error(`${
|
|
160392
|
-
port1.postMessage({ id:
|
|
160617
|
+
} else if (message2.capability === "functions.call" && context.functionsApi) {
|
|
160618
|
+
value2 = await context.functionsApi.call(String(message2.args[0]), message2.args[1], message2.args[2]);
|
|
160619
|
+
} else if (message2.capability === "functions.enqueue" && context.functionsApi?.enqueue) {
|
|
160620
|
+
value2 = await context.functionsApi.enqueue(String(message2.args[0]), message2.args[1], message2.args[2]);
|
|
160621
|
+
} else if (message2.capability === "data" && context.dataApi) {
|
|
160622
|
+
value2 = await context.dataApi.call(message2.args[0], String(message2.args[1]), message2.args[2]);
|
|
160623
|
+
} else throw new Error(`${message2.capability} capability is not configured`);
|
|
160624
|
+
port1.postMessage({ id: message2.id, ok: true, value: value2 });
|
|
160393
160625
|
} catch (error) {
|
|
160394
160626
|
port1.postMessage({
|
|
160395
|
-
id:
|
|
160627
|
+
id: message2.id,
|
|
160396
160628
|
ok: false,
|
|
160397
160629
|
error: error instanceof Error ? { message: error.message, name: error.name, code: error.code } : { message: String(error) }
|
|
160398
160630
|
});
|
|
@@ -160427,14 +160659,14 @@ function createLocalTestSandbox() {
|
|
|
160427
160659
|
return;
|
|
160428
160660
|
}
|
|
160429
160661
|
signal?.addEventListener("abort", abortHandler, { once: true });
|
|
160430
|
-
worker.on("message", (
|
|
160431
|
-
if (
|
|
160662
|
+
worker.on("message", (message2) => {
|
|
160663
|
+
if (message2.ready) {
|
|
160432
160664
|
clearTimeout(timer);
|
|
160433
160665
|
timer = setTimeout(() => finish2(() => reject(new SandboxError("timeout", `execution exceeded ${limits.timeoutMs}ms`))), Math.max(1, limits.timeoutMs));
|
|
160434
160666
|
return;
|
|
160435
160667
|
}
|
|
160436
|
-
if (
|
|
160437
|
-
else finish2(() => reject(new SandboxError("execution_failed",
|
|
160668
|
+
if (message2.ok) finish2(() => resolve83({ value: message2.value, durationMs: Date.now() - started }));
|
|
160669
|
+
else finish2(() => reject(new SandboxError("execution_failed", message2.message ?? "handler failed")));
|
|
160438
160670
|
});
|
|
160439
160671
|
worker.once("error", (error) => finish2(() => reject(new SandboxError("execution_failed", error.message))));
|
|
160440
160672
|
worker.once("exit", (code) => {
|
|
@@ -160449,8 +160681,8 @@ var init_sandbox = __esm({
|
|
|
160449
160681
|
"../../core/functions-runtime/src/sandbox.ts"() {
|
|
160450
160682
|
SandboxError = class extends Error {
|
|
160451
160683
|
code;
|
|
160452
|
-
constructor(code,
|
|
160453
|
-
super(`${code}: ${
|
|
160684
|
+
constructor(code, message2) {
|
|
160685
|
+
super(`${code}: ${message2}`);
|
|
160454
160686
|
this.name = "SandboxError";
|
|
160455
160687
|
this.code = code;
|
|
160456
160688
|
}
|
|
@@ -160559,8 +160791,8 @@ var FunctionCallError, NAME;
|
|
|
160559
160791
|
var init_calls = __esm({
|
|
160560
160792
|
"../../core/functions-runtime/src/calls.ts"() {
|
|
160561
160793
|
FunctionCallError = class extends Error {
|
|
160562
|
-
constructor(code,
|
|
160563
|
-
super(`${code}: ${
|
|
160794
|
+
constructor(code, message2) {
|
|
160795
|
+
super(`${code}: ${message2}`);
|
|
160564
160796
|
this.code = code;
|
|
160565
160797
|
this.name = "FunctionCallError";
|
|
160566
160798
|
}
|
|
@@ -160629,8 +160861,8 @@ var FunctionQueueError;
|
|
|
160629
160861
|
var init_queue = __esm({
|
|
160630
160862
|
"../../core/functions-runtime/src/queue.ts"() {
|
|
160631
160863
|
FunctionQueueError = class extends Error {
|
|
160632
|
-
constructor(code,
|
|
160633
|
-
super(`${code}: ${
|
|
160864
|
+
constructor(code, message2) {
|
|
160865
|
+
super(`${code}: ${message2}`);
|
|
160634
160866
|
this.code = code;
|
|
160635
160867
|
this.name = "FunctionQueueError";
|
|
160636
160868
|
}
|
|
@@ -160759,8 +160991,8 @@ function verifyPlan(scope2, plan) {
|
|
|
160759
160991
|
const { hash: hash2, ...unsigned } = plan;
|
|
160760
160992
|
if (!equalScope(scope2, plan.scope) || hashResourcePlan(unsigned) !== hash2) throw new ResourceApplyError("invalid_plan", "plan hash or app/site/environment scope does not match");
|
|
160761
160993
|
if (plan.operations.length > 100) throw new ResourceApplyError("invalid_plan", "a resource plan may contain at most 100 operations");
|
|
160762
|
-
const invalid = (
|
|
160763
|
-
throw new ResourceApplyError("invalid_plan",
|
|
160994
|
+
const invalid = (message2) => {
|
|
160995
|
+
throw new ResourceApplyError("invalid_plan", message2);
|
|
160764
160996
|
};
|
|
160765
160997
|
for (const operation of plan.operations) {
|
|
160766
160998
|
if (operation.kind === "create-kv" || operation.kind === "update-kv") {
|
|
@@ -160829,8 +161061,8 @@ var init_apply = __esm({
|
|
|
160829
161061
|
init_schema2();
|
|
160830
161062
|
init_tombstones();
|
|
160831
161063
|
ResourceApplyError = class extends Error {
|
|
160832
|
-
constructor(code,
|
|
160833
|
-
super(`${code}: ${
|
|
161064
|
+
constructor(code, message2) {
|
|
161065
|
+
super(`${code}: ${message2}`);
|
|
160834
161066
|
this.code = code;
|
|
160835
161067
|
this.name = "ResourceApplyError";
|
|
160836
161068
|
}
|
|
@@ -161057,8 +161289,8 @@ function json2(status, body, requestId2, extra = {}) {
|
|
|
161057
161289
|
headers: { "content-type": "application/json; charset=utf-8", "cache-control": "no-store", "x-request-id": requestId2, ...extra }
|
|
161058
161290
|
});
|
|
161059
161291
|
}
|
|
161060
|
-
function errorResponse(status, code,
|
|
161061
|
-
return json2(status, { error: { code, message:
|
|
161292
|
+
function errorResponse(status, code, message2, requestId2) {
|
|
161293
|
+
return json2(status, { error: { code, message: message2.slice(0, MAX_LOG_MESSAGE), requestId: requestId2 }, requestId: requestId2 }, requestId2, { "access-control-allow-origin": "*" });
|
|
161062
161294
|
}
|
|
161063
161295
|
function routeMatch(template, actual) {
|
|
161064
161296
|
const expected = template.split("/").filter(Boolean);
|
|
@@ -161355,11 +161587,11 @@ function makeFunctionsHandler(options) {
|
|
|
161355
161587
|
return json2(200, value2, id, { "access-control-allow-origin": "*" });
|
|
161356
161588
|
} catch (error) {
|
|
161357
161589
|
finish2("error");
|
|
161358
|
-
const
|
|
161590
|
+
const message2 = error instanceof Error ? error.message : String(error);
|
|
161359
161591
|
const code = error instanceof SandboxError || error instanceof FunctionCallError ? error.code : "execution_failed";
|
|
161360
161592
|
const status = code === "canceled" || code === "function_call_canceled" ? 499 : code === "timeout" || code === "memory_limit" || code === "function_call_deadline_exceeded" ? 504 : code === "capability_not_implemented" ? 501 : code === "function_input_invalid" ? 422 : code === "function_bundle_invalid" || code === "function_output_invalid" ? 502 : code === "function_not_found" ? 404 : code === "function_call_forbidden" ? 403 : 500;
|
|
161361
161593
|
const responseCode = code === "function_input_invalid" ? "invalid_request" : code === "function_bundle_invalid" ? "bundle_integrity_failed" : code === "function_output_invalid" ? "invalid_response" : code;
|
|
161362
|
-
return errorResponse(status, responseCode,
|
|
161594
|
+
return errorResponse(status, responseCode, message2, id);
|
|
161363
161595
|
}
|
|
161364
161596
|
};
|
|
161365
161597
|
}
|
|
@@ -161864,7 +162096,7 @@ var init_file_tools = __esm({
|
|
|
161864
162096
|
MAX_LISTED = 2e3;
|
|
161865
162097
|
CONTENT_MARKER = "himalaya.content.json";
|
|
161866
162098
|
ok = (o2) => ({ content: [{ type: "text", text: JSON.stringify(o2, null, 2) }] });
|
|
161867
|
-
refuse5 = (error,
|
|
162099
|
+
refuse5 = (error, message2) => ({ content: [{ type: "text", text: JSON.stringify({ ok: false, error, message: message2 }, null, 2) }], isError: true });
|
|
161868
162100
|
DIR = z2.string().optional().describe("The app folder, relative to the workspace folder. Default: the workspace folder itself.");
|
|
161869
162101
|
WRITE_ANN = { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false };
|
|
161870
162102
|
}
|
|
@@ -162638,8 +162870,8 @@ var init_open_url = __esm({
|
|
|
162638
162870
|
// src/ux-audit.ts
|
|
162639
162871
|
import { existsSync as existsSync72, readFileSync as readFileSync83, readdirSync as readdirSync32 } from "node:fs";
|
|
162640
162872
|
import { join as join76, relative as relative15, resolve as resolve61 } from "node:path";
|
|
162641
|
-
function issue(issues, strict, code,
|
|
162642
|
-
issues.push({ code, message, ...path2 ? { path: path2 } : {}, severity: strict ? "error" : "warning" });
|
|
162873
|
+
function issue(issues, strict, code, message2, path2) {
|
|
162874
|
+
issues.push({ code, message: message2, ...path2 ? { path: path2 } : {}, severity: strict ? "error" : "warning" });
|
|
162643
162875
|
}
|
|
162644
162876
|
function readText2(path2) {
|
|
162645
162877
|
try {
|
|
@@ -162702,8 +162934,8 @@ function auditUx(content, strict = false) {
|
|
|
162702
162934
|
}
|
|
162703
162935
|
const malformedChecks = record2.checks !== void 0 && !Array.isArray(record2.checks);
|
|
162704
162936
|
if (malformedChecks || record2.status !== "unavailable" && (record2.checks ?? []).length === 0) {
|
|
162705
|
-
const
|
|
162706
|
-
issues.push({ code: `missing-${platform}-checks`, message, path: UX_EVIDENCE_PATH, severity: "error" });
|
|
162937
|
+
const message2 = malformedChecks ? `${platform} audit has a malformed checks list; it must be an array.` : `${platform} audit needs the checks that were driven.`;
|
|
162938
|
+
issues.push({ code: `missing-${platform}-checks`, message: message2, path: UX_EVIDENCE_PATH, severity: "error" });
|
|
162707
162939
|
}
|
|
162708
162940
|
if (record2.status === "unavailable" && !record2.reason?.trim()) {
|
|
162709
162941
|
issues.push({ code: `missing-${platform}-reason`, message: `${platform} is unavailable but has no reason.`, path: UX_EVIDENCE_PATH, severity: "error" });
|
|
@@ -164601,23 +164833,23 @@ function syncCoverage(evidenceDir, contentDir2, write2 = true) {
|
|
|
164601
164833
|
const old = existed ? obj3(JSON.parse(readFileSync90(path2, "utf8"))) : {};
|
|
164602
164834
|
const hashesChanged = existed && JSON.stringify(old.sourceHashes) !== JSON.stringify(current.sourceHashes);
|
|
164603
164835
|
const prior = Array.isArray(old.requirements) ? old.requirements : [];
|
|
164604
|
-
const byId = new Map(prior.map((
|
|
164605
|
-
const known = new Set(current.requirements.map((
|
|
164606
|
-
const removed = prior.filter((
|
|
164607
|
-
const added = current.requirements.filter((
|
|
164608
|
-
const changed = current.requirements.filter((
|
|
164609
|
-
const previous = byId.get(
|
|
164610
|
-
return previous && (previous.kind !==
|
|
164611
|
-
}).map((
|
|
164612
|
-
current.requirements = current.requirements.map((
|
|
164613
|
-
const previous = byId.get(
|
|
164836
|
+
const byId = new Map(prior.map((row2) => [row2.id, row2]));
|
|
164837
|
+
const known = new Set(current.requirements.map((row2) => row2.id));
|
|
164838
|
+
const removed = prior.filter((row2) => !known.has(row2.id)).map((row2) => row2.id);
|
|
164839
|
+
const added = current.requirements.filter((row2) => !byId.has(row2.id)).length;
|
|
164840
|
+
const changed = current.requirements.filter((row2) => {
|
|
164841
|
+
const previous = byId.get(row2.id);
|
|
164842
|
+
return previous && (previous.kind !== row2.kind || previous.source !== row2.source || previous.description !== row2.description || previous.platform !== row2.platform);
|
|
164843
|
+
}).map((row2) => row2.id);
|
|
164844
|
+
current.requirements = current.requirements.map((row2) => {
|
|
164845
|
+
const previous = byId.get(row2.id);
|
|
164614
164846
|
return previous ? {
|
|
164615
|
-
...
|
|
164847
|
+
...row2,
|
|
164616
164848
|
...previous.target ? { target: previous.target } : {},
|
|
164617
164849
|
...!hashesChanged && previous.status ? { status: previous.status } : {},
|
|
164618
164850
|
...!hashesChanged && previous.verification ? { verification: previous.verification } : {},
|
|
164619
164851
|
...previous.adaptation ? { adaptation: previous.adaptation } : {}
|
|
164620
|
-
} :
|
|
164852
|
+
} : row2;
|
|
164621
164853
|
});
|
|
164622
164854
|
if (write2 && removed.length === 0) writeFileSync33(path2, JSON.stringify(current, null, 2) + "\n");
|
|
164623
164855
|
return { coverage: current, added, removed, changed, hashesChanged, existed };
|
|
@@ -164640,31 +164872,31 @@ function verifyCoverage(evidenceDir, contentDir2, releaseHash, builtScreenIds) {
|
|
|
164640
164872
|
const contentManifest = join85(resolve64(contentDir2), "himalaya.content.json");
|
|
164641
164873
|
const declaredScreens = existsSync79(contentManifest) ? obj3(obj3(JSON.parse(readFileSync90(contentManifest, "utf8"))).screens) : void 0;
|
|
164642
164874
|
const availableScreens = builtScreenIds ? new Set(builtScreenIds) : declaredScreens && Object.keys(declaredScreens).length ? new Set(Object.keys(declaredScreens)) : void 0;
|
|
164643
|
-
for (const
|
|
164644
|
-
const id = typeof
|
|
164645
|
-
const kind =
|
|
164875
|
+
for (const row2 of rows) {
|
|
164876
|
+
const id = typeof row2.id === "string" ? row2.id : void 0;
|
|
164877
|
+
const kind = row2.kind;
|
|
164646
164878
|
if (!id || !Object.hasOwn(REQUIRED_CHECK, kind)) {
|
|
164647
164879
|
issues.push({ id, message: "Invalid requirement identity or kind." });
|
|
164648
164880
|
continue;
|
|
164649
164881
|
}
|
|
164650
|
-
const status =
|
|
164882
|
+
const status = row2.status;
|
|
164651
164883
|
if (status !== "supported" && status !== "adapted" && status !== "conditional") {
|
|
164652
164884
|
issues.push({ id, message: "Requirement is unresolved or has no status." });
|
|
164653
164885
|
continue;
|
|
164654
164886
|
}
|
|
164655
|
-
const target = obj3(
|
|
164887
|
+
const target = obj3(row2.target);
|
|
164656
164888
|
if (typeof target.screenId !== "string" || !target.screenId.trim()) issues.push({ id, message: "Target screen mapping is absent." });
|
|
164657
164889
|
else if (!availableScreens) issues.push({ id, message: "Target screens are unavailable for verification; supply a built release or a declared screen map." });
|
|
164658
164890
|
else if (!availableScreens.has(target.screenId)) issues.push({ id, message: `Target screen ${target.screenId} is absent from the built release or app declaration.` });
|
|
164659
164891
|
if ((kind === "interaction" || kind === "top-bar") && (typeof target.controlId !== "string" || !target.controlId.trim())) {
|
|
164660
164892
|
issues.push({ id, message: "Target control mapping is absent." });
|
|
164661
164893
|
}
|
|
164662
|
-
const adaptation = obj3(
|
|
164894
|
+
const adaptation = obj3(row2.adaptation);
|
|
164663
164895
|
if (status === "adapted" && (!String(adaptation.instruction ?? "").trim() || !String(adaptation.explanation ?? "").trim())) {
|
|
164664
164896
|
issues.push({ id, message: "Adaptation must cite the user instruction and explain the change." });
|
|
164665
164897
|
}
|
|
164666
164898
|
const required3 = REQUIRED_CHECK[kind];
|
|
164667
|
-
const checks = Array.isArray(
|
|
164899
|
+
const checks = Array.isArray(row2.verification) ? row2.verification.map(obj3) : [];
|
|
164668
164900
|
const matching = checks.filter((check) => check.check === required3);
|
|
164669
164901
|
if (!matching.length) {
|
|
164670
164902
|
issues.push({ id, message: `Required check ${required3} has no evidence.` });
|
|
@@ -164698,7 +164930,7 @@ function verifyCoverage(evidenceDir, contentDir2, releaseHash, builtScreenIds) {
|
|
|
164698
164930
|
}
|
|
164699
164931
|
}
|
|
164700
164932
|
}
|
|
164701
|
-
return { ok: issues.length === 0, count: rows.length, requirementIds: rows.map((
|
|
164933
|
+
return { ok: issues.length === 0, count: rows.length, requirementIds: rows.map((row2) => String(row2.id ?? "")), issues };
|
|
164702
164934
|
}
|
|
164703
164935
|
var obj3, sha, REQUIRED_CHECK, COVERAGE_FILE, NATIVE_PROOF_FILE;
|
|
164704
164936
|
var init_coverage2 = __esm({
|
|
@@ -165038,8 +165270,8 @@ function validate3(evidenceDir, contentDir2) {
|
|
|
165038
165270
|
if (existsSync80(coveragePath)) {
|
|
165039
165271
|
try {
|
|
165040
165272
|
const coverage = readJson7(coveragePath);
|
|
165041
|
-
for (const
|
|
165042
|
-
const entry = object7(
|
|
165273
|
+
for (const row2 of Array.isArray(coverage.requirements) ? coverage.requirements : []) {
|
|
165274
|
+
const entry = object7(row2) ?? {};
|
|
165043
165275
|
if (entry.kind !== "route" || typeof entry.source !== "string" || !/^\/screens\/[^/]+$/.test(entry.source)) continue;
|
|
165044
165276
|
const screenId = entry.source.slice(9).replaceAll("~1", "/").replaceAll("~0", "~");
|
|
165045
165277
|
const targetScreen = object7(entry.target)?.screenId;
|
|
@@ -165518,7 +165750,7 @@ function patchHonesty(opts) {
|
|
|
165518
165750
|
return { attestation, source };
|
|
165519
165751
|
}
|
|
165520
165752
|
function partialPublishAllowed(rows, acceptPartial) {
|
|
165521
|
-
return !rows.some((
|
|
165753
|
+
return !rows.some((row2) => row2.slice === "screenMetadata") && (rows.length === 0 || acceptPartial);
|
|
165522
165754
|
}
|
|
165523
165755
|
var SELECTOR_KINDS;
|
|
165524
165756
|
var init_release_patch2 = __esm({
|
|
@@ -167814,37 +168046,37 @@ var init_preview_assets_generated = __esm({
|
|
|
167814
168046
|
"../../packages/serve/src/preview-assets.generated.ts"() {
|
|
167815
168047
|
init_preview_assets_format();
|
|
167816
168048
|
PREVIEW_ASSET_MANIFEST = [
|
|
167817
|
-
{ key: "assets/DashboardHost-
|
|
167818
|
-
{ key: "assets/DevDrawer-
|
|
167819
|
-
{ key: "assets/IdiomCompare-
|
|
167820
|
-
{ key: "assets/LightboxViewer-
|
|
167821
|
-
{ key: "assets/PhonePreviewControl-
|
|
167822
|
-
{ key: "assets/SchemeCompare-
|
|
168049
|
+
{ key: "assets/DashboardHost-D0AIh2Fi.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 2916, sha256: "eca2f8260addf4ead475e304f4bdb9aa3a5655aa9b9042a0107c73d3c5d8147f" },
|
|
168050
|
+
{ key: "assets/DevDrawer-Sm3GT4me.js", contentType: "application/javascript; charset=utf-8", offset: 2924, length: 16744, sha256: "1764380f2536a2da8715514073c657a2e7c1bcb8f299e5e8e273acae3bdc3164" },
|
|
168051
|
+
{ key: "assets/IdiomCompare-d9cqrgVi.js", contentType: "application/javascript; charset=utf-8", offset: 19668, length: 1892, sha256: "ea482691eaa9cda3d3239568d177e9332b94a0a59e9e9e5d269d059fe07ddd58" },
|
|
168052
|
+
{ key: "assets/LightboxViewer-NWgAZkvo.js", contentType: "application/javascript; charset=utf-8", offset: 21560, length: 8132, sha256: "21f6c5678752b22d095626e89c039bf1ab1cf566e9b0a880ddc7c64de2635f6a" },
|
|
168053
|
+
{ key: "assets/PhonePreviewControl-DmWDJR7y.js", contentType: "application/javascript; charset=utf-8", offset: 29692, length: 37729, sha256: "c528ff6a6503b5cecddcb95d98e7b10e71b38718513a992c95c3e61aac178c9a" },
|
|
168054
|
+
{ key: "assets/SchemeCompare-DAe05rjM.js", contentType: "application/javascript; charset=utf-8", offset: 67421, length: 1824, sha256: "ed47f5a463367279abfa343aaabb348b2cf419a48072a265442f84ba585976da" },
|
|
167823
168055
|
{ key: "assets/glassPreviewBrowser-Bt5ZFmG4.js", contentType: "application/javascript; charset=utf-8", offset: 69245, length: 342, sha256: "20d73f97d38f6d9a0b79e68e24954cd6bbfe66833a6e6aecae00a9102e64cab3" },
|
|
167824
|
-
{ key: "assets/index-
|
|
167825
|
-
{ key: "assets/pdf-
|
|
167826
|
-
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
167827
|
-
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset:
|
|
167828
|
-
{ key: "assets/pdfDocument-
|
|
167829
|
-
{ key: "assets/pdfFetch-Cc8i1I1h.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
167830
|
-
{ key: "assets/webviewBridgeHost-
|
|
167831
|
-
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset:
|
|
167832
|
-
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset:
|
|
167833
|
-
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset:
|
|
167834
|
-
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
167835
|
-
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset:
|
|
167836
|
-
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset:
|
|
167837
|
-
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
167838
|
-
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset:
|
|
167839
|
-
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
167840
|
-
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset:
|
|
167841
|
-
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset:
|
|
167842
|
-
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
167843
|
-
{ key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
167844
|
-
{ key: "index.html", contentType: "text/html; charset=utf-8", offset:
|
|
167845
|
-
{ key: "ios-glass-preview.css", contentType: "text/css; charset=utf-8", offset:
|
|
167846
|
-
{ key: "ios-glass-preview.svg", contentType: "image/svg+xml", offset:
|
|
167847
|
-
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset:
|
|
168056
|
+
{ key: "assets/index-DZLNpgeb.js", contentType: "application/javascript; charset=utf-8", offset: 69587, length: 1337208, sha256: "89aa5fffddb672994a2a13f4a209b5694ff41f2055b01d9d5837829682b7be6f" },
|
|
168057
|
+
{ key: "assets/pdf-DkBJdVwB.js", contentType: "application/javascript; charset=utf-8", offset: 1406795, length: 488199, sha256: "8d77ca7222c2580c60a06abe6c78163894a40593fae3a071e664a3a05110dbec" },
|
|
168058
|
+
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1894994, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
|
|
168059
|
+
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1895067, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
|
|
168060
|
+
{ key: "assets/pdfDocument-DKE-Ra33.js", contentType: "application/javascript; charset=utf-8", offset: 3212101, length: 3379, sha256: "675e5f6d7a6d04607c86b32573e1d28aa126a049f6df26e39d407a9cb3059fc9" },
|
|
168061
|
+
{ key: "assets/pdfFetch-Cc8i1I1h.js", contentType: "application/javascript; charset=utf-8", offset: 3215480, length: 2266, sha256: "1d21ad008921942217c9eac0c35b1713773b9d89c71e3ab4412781f7bb88f463" },
|
|
168062
|
+
{ key: "assets/webviewBridgeHost-Tij-rBHM.js", contentType: "application/javascript; charset=utf-8", offset: 3217746, length: 9781, sha256: "9ac08d6b6839d3927c9cd364e53a5b01992e534bf77247568e24b18b3e4d2bb7" },
|
|
168063
|
+
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3227527, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
|
|
168064
|
+
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3232137, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
|
|
168065
|
+
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3720721, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
|
|
168066
|
+
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3811645, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
|
|
168067
|
+
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3902629, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
|
|
168068
|
+
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 3993609, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
|
|
168069
|
+
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 4084481, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
|
|
168070
|
+
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4175461, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
|
|
168071
|
+
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4284097, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
|
|
168072
|
+
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4393181, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
|
|
168073
|
+
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4502229, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
|
|
168074
|
+
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4609929, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
|
|
168075
|
+
{ key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset: 4698037, length: 6748, sha256: "4a92459977d7cefa1a6a7e020c3a63509737f083b3f2773557c1a5771665811a" },
|
|
168076
|
+
{ key: "index.html", contentType: "text/html; charset=utf-8", offset: 4704785, length: 4947, sha256: "ce6250b8f09a5c349489f0db1b7410dbac5627087c11b4dddc7958fbde5641db" },
|
|
168077
|
+
{ key: "ios-glass-preview.css", contentType: "text/css; charset=utf-8", offset: 4709732, length: 7193, sha256: "a482f4796147c2a3893942e10ab225bd3b6f749f7125fe0330680d4c20ea0212" },
|
|
168078
|
+
{ key: "ios-glass-preview.svg", contentType: "image/svg+xml", offset: 4716925, length: 423, sha256: "b9cd5989d31464a0422f260a332af6be5add0b04de2148944de35158f3b75efc" },
|
|
168079
|
+
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4717348, length: 18778, sha256: "ba734d58c88281c71c01d9a2842a991d06f3ed91bf03449427ef11c7f6d1605d" }
|
|
167848
168080
|
];
|
|
167849
168081
|
}
|
|
167850
168082
|
});
|
|
@@ -168303,8 +168535,8 @@ function defaultGitOps(cwd = process.cwd()) {
|
|
|
168303
168535
|
return false;
|
|
168304
168536
|
}
|
|
168305
168537
|
},
|
|
168306
|
-
createTag(tag,
|
|
168307
|
-
run2(["tag", "-a", tag, "-m",
|
|
168538
|
+
createTag(tag, message2) {
|
|
168539
|
+
run2(["tag", "-a", tag, "-m", message2]);
|
|
168308
168540
|
},
|
|
168309
168541
|
pushTag(tag) {
|
|
168310
168542
|
run2(["push", "origin", tag]);
|
|
@@ -168541,8 +168773,8 @@ var init_iap_catalog_client = __esm({
|
|
|
168541
168773
|
}
|
|
168542
168774
|
};
|
|
168543
168775
|
IapCatalogError = class extends Error {
|
|
168544
|
-
constructor(code,
|
|
168545
|
-
super(
|
|
168776
|
+
constructor(code, message2, endpoint) {
|
|
168777
|
+
super(message2);
|
|
168546
168778
|
this.code = code;
|
|
168547
168779
|
this.endpoint = endpoint;
|
|
168548
168780
|
this.name = "IapCatalogError";
|
|
@@ -168796,8 +169028,8 @@ var init_iap_client = __esm({
|
|
|
168796
169028
|
TOKEN_LIFETIME_S = 1200;
|
|
168797
169029
|
TOKEN_REFRESH_MARGIN_S = 60;
|
|
168798
169030
|
AscError = class extends Error {
|
|
168799
|
-
constructor(kind,
|
|
168800
|
-
super(
|
|
169031
|
+
constructor(kind, message2, status, codes = [], detail = "", retryAfterMs2) {
|
|
169032
|
+
super(message2);
|
|
168801
169033
|
this.kind = kind;
|
|
168802
169034
|
this.status = status;
|
|
168803
169035
|
this.codes = codes;
|
|
@@ -170496,8 +170728,8 @@ var init_iap_plan = __esm({
|
|
|
170496
170728
|
init_iap_price_status();
|
|
170497
170729
|
init_iap_review_screenshot();
|
|
170498
170730
|
IapProvisionError = class extends Error {
|
|
170499
|
-
constructor(reason,
|
|
170500
|
-
super(
|
|
170731
|
+
constructor(reason, message2) {
|
|
170732
|
+
super(message2);
|
|
170501
170733
|
this.reason = reason;
|
|
170502
170734
|
this.name = "IapProvisionError";
|
|
170503
170735
|
}
|
|
@@ -170514,7 +170746,7 @@ var init_iap_plan = __esm({
|
|
|
170514
170746
|
isoDay = (date) => date.toISOString().slice(0, 10);
|
|
170515
170747
|
exactTarget = (price) => price.rule === "atLeast" ? void 0 : price.amount;
|
|
170516
170748
|
LEFTOVER_SCREENSHOT_STATES = /* @__PURE__ */ new Set(["AWAITING_UPLOAD", "FAILED"]);
|
|
170517
|
-
planError = (
|
|
170749
|
+
planError = (message2) => new IapProvisionError("plan", message2);
|
|
170518
170750
|
}
|
|
170519
170751
|
});
|
|
170520
170752
|
|
|
@@ -171363,9 +171595,9 @@ function redactValue(v2) {
|
|
|
171363
171595
|
if (v2 && typeof v2 === "object") return redactRow(v2);
|
|
171364
171596
|
return v2;
|
|
171365
171597
|
}
|
|
171366
|
-
function redactRow(
|
|
171598
|
+
function redactRow(row2) {
|
|
171367
171599
|
const out2 = {};
|
|
171368
|
-
for (const [k2, v2] of Object.entries(
|
|
171600
|
+
for (const [k2, v2] of Object.entries(row2)) {
|
|
171369
171601
|
out2[k2] = isSecretKey(k2) && v2 !== null && v2 !== void 0 && v2 !== "" ? "[redacted]" : redactValue(v2);
|
|
171370
171602
|
}
|
|
171371
171603
|
return out2;
|
|
@@ -172311,7 +172543,7 @@ function isItemRow(fields, entityId, price) {
|
|
|
172311
172543
|
return values.some((v2) => v2.toLowerCase() === entityId.toLowerCase()) && values.some((v2) => visibleText2(v2).includes(price));
|
|
172312
172544
|
}
|
|
172313
172545
|
function rowOffersPurchase(value2, entityId, price) {
|
|
172314
|
-
if (Array.isArray(value2)) return value2.some((
|
|
172546
|
+
if (Array.isArray(value2)) return value2.some((row2) => rowOffersPurchase(row2, entityId, price));
|
|
172315
172547
|
if (!value2 || typeof value2 !== "object") return false;
|
|
172316
172548
|
const fields = value2;
|
|
172317
172549
|
if (isItemRow(fields, entityId, price)) return offersPurchase(fields);
|
|
@@ -173123,11 +173355,11 @@ function firstProblem(report3) {
|
|
|
173123
173355
|
function printConnect(out2, report3, heading) {
|
|
173124
173356
|
out2.line(`himi store iap connect \u2014 ${heading}`);
|
|
173125
173357
|
out2.line(` ${pad("site")}${report3.site} \xB7 bundle ${report3.bundleId}`);
|
|
173126
|
-
const
|
|
173127
|
-
|
|
173128
|
-
|
|
173129
|
-
|
|
173130
|
-
for (const mapping of report3.mappings)
|
|
173358
|
+
const row2 = (label3, step) => out2.line(` ${pad(label3)}${step.state.padEnd(9)}${step.detail}`);
|
|
173359
|
+
row2("app", report3.app);
|
|
173360
|
+
row2("key", report3.credentials);
|
|
173361
|
+
row2("provider", report3.provider);
|
|
173362
|
+
for (const mapping of report3.mappings) row2("mapping", mapping);
|
|
173131
173363
|
if (report3.purchasesAppId) out2.line(` ${pad("binding")}wixIap: { purchasesAppId: "${report3.purchasesAppId}" }`);
|
|
173132
173364
|
}
|
|
173133
173365
|
function printConfig(out2, config, note) {
|
|
@@ -175888,8 +176120,8 @@ var init_base44_adopt = __esm({
|
|
|
175888
176120
|
BUILTINS = new Set(BASE44_BUILTIN_FIELDS);
|
|
175889
176121
|
ENTITY_NAME2 = /^[A-Za-z][A-Za-z0-9]*$/;
|
|
175890
176122
|
AdoptError = class extends Error {
|
|
175891
|
-
constructor(code,
|
|
175892
|
-
super(
|
|
176123
|
+
constructor(code, message2, exit = 1, extra = {}) {
|
|
176124
|
+
super(message2);
|
|
175893
176125
|
this.code = code;
|
|
175894
176126
|
this.exit = exit;
|
|
175895
176127
|
this.extra = extra;
|
|
@@ -176078,8 +176310,8 @@ var init_plan4 = __esm({
|
|
|
176078
176310
|
"src/base44-screens/plan.ts"() {
|
|
176079
176311
|
init_base44_schema();
|
|
176080
176312
|
PlanError = class extends Error {
|
|
176081
|
-
constructor(code,
|
|
176082
|
-
super(
|
|
176313
|
+
constructor(code, message2, extra = {}) {
|
|
176314
|
+
super(message2);
|
|
176083
176315
|
this.code = code;
|
|
176084
176316
|
this.extra = extra;
|
|
176085
176317
|
this.name = "PlanError";
|
|
@@ -176622,7 +176854,7 @@ async function seedBase44Entities(opts) {
|
|
|
176622
176854
|
continue;
|
|
176623
176855
|
}
|
|
176624
176856
|
const declared = new Set((spec.fields ?? []).map((f2) => f2.key));
|
|
176625
|
-
const clean2 = rows.map((
|
|
176857
|
+
const clean2 = rows.map((row2) => Object.fromEntries(Object.entries(row2).filter(([k2]) => declared.has(k2))));
|
|
176626
176858
|
const dropped = [...new Set(rows.flatMap((r3) => Object.keys(r3).filter((k2) => !declared.has(k2))))];
|
|
176627
176859
|
if (dropped.length) (report3.droppedKeys ??= {})[name] = dropped;
|
|
176628
176860
|
if (clean2.some((r3) => Object.keys(r3).length === 0)) {
|
|
@@ -177182,8 +177414,8 @@ var init_functions2 = __esm({
|
|
|
177182
177414
|
MAX_FILES = 200;
|
|
177183
177415
|
MAX_BYTES = 5 * 1024 * 1024;
|
|
177184
177416
|
FunctionSourceError = class extends Error {
|
|
177185
|
-
constructor(code,
|
|
177186
|
-
super(
|
|
177417
|
+
constructor(code, message2) {
|
|
177418
|
+
super(message2);
|
|
177187
177419
|
this.code = code;
|
|
177188
177420
|
}
|
|
177189
177421
|
};
|
|
@@ -178572,10 +178804,10 @@ async function readCms(call, opts = {}) {
|
|
|
178572
178804
|
query: { paging: { limit: 5 } }
|
|
178573
178805
|
});
|
|
178574
178806
|
const items = asArr(q2.data?.dataItems);
|
|
178575
|
-
const samples = items.slice(0, 5).map((
|
|
178576
|
-
const dataObj2 =
|
|
178807
|
+
const samples = items.slice(0, 5).map((row2, i2) => {
|
|
178808
|
+
const dataObj2 = row2.data && typeof row2.data === "object" ? row2.data : row2;
|
|
178577
178809
|
const title = sampleTitle(dataObj2);
|
|
178578
|
-
return { id: str8(
|
|
178810
|
+
return { id: str8(row2.id ?? dataObj2._id) || `row-${i2}`, ...title ? { title } : {} };
|
|
178579
178811
|
});
|
|
178580
178812
|
out2.push({
|
|
178581
178813
|
id,
|
|
@@ -181493,10 +181725,10 @@ function isString(data) {
|
|
|
181493
181725
|
function isObject(data) {
|
|
181494
181726
|
return objectToString(data) === "[object Object]";
|
|
181495
181727
|
}
|
|
181496
|
-
function validate4(bool2, cbOrMessage,
|
|
181728
|
+
function validate4(bool2, cbOrMessage, message2) {
|
|
181497
181729
|
if (bool2) return;
|
|
181498
181730
|
const cb = typeof cbOrMessage === "function" ? cbOrMessage : void 0;
|
|
181499
|
-
let options = typeof cbOrMessage === "function" ?
|
|
181731
|
+
let options = typeof cbOrMessage === "function" ? message2 : cbOrMessage;
|
|
181500
181732
|
if (!isObject(options)) options = "[object Object]";
|
|
181501
181733
|
const err = new ParameterError(safeToString(options));
|
|
181502
181734
|
if (cb) cb(err);
|
|
@@ -184286,7 +184518,7 @@ async function queryBase44Entities(opts) {
|
|
|
184286
184518
|
const declared = [];
|
|
184287
184519
|
for (const spec of specs) {
|
|
184288
184520
|
const physical = physicalEntityName(spec, app);
|
|
184289
|
-
const
|
|
184521
|
+
const row2 = {
|
|
184290
184522
|
entity: isAdoptedEntity(spec) ? spec.base44Name : spec.name,
|
|
184291
184523
|
physical,
|
|
184292
184524
|
ownership: isAdoptedEntity(spec) ? "adopted" : "owned",
|
|
@@ -184295,18 +184527,18 @@ async function queryBase44Entities(opts) {
|
|
|
184295
184527
|
};
|
|
184296
184528
|
const remote = live3?.get(physical);
|
|
184297
184529
|
if (live3 && !remote) {
|
|
184298
|
-
|
|
184530
|
+
row2.drift.push({ entity: physical, kind: "missing", detail: `entity "${physical}" is declared but the live app does not have it` });
|
|
184299
184531
|
} else {
|
|
184300
|
-
if (remote)
|
|
184532
|
+
if (remote) row2.drift = diffEntityFields(spec, remote);
|
|
184301
184533
|
try {
|
|
184302
184534
|
const c2 = await countRows(ports, appId2, physical, cap);
|
|
184303
|
-
|
|
184304
|
-
if (c2.capped)
|
|
184535
|
+
row2.rows = c2.rows;
|
|
184536
|
+
if (c2.capped) row2.capped = true;
|
|
184305
184537
|
} catch (e2) {
|
|
184306
|
-
|
|
184538
|
+
row2.countError = e2.message;
|
|
184307
184539
|
}
|
|
184308
184540
|
}
|
|
184309
|
-
declared.push(
|
|
184541
|
+
declared.push(row2);
|
|
184310
184542
|
}
|
|
184311
184543
|
const known = new Set(declared.map((d2) => d2.physical));
|
|
184312
184544
|
const foreignNames = live3 ? [...live3.keys()].filter((n2) => !known.has(n2)).sort() : [];
|
|
@@ -184340,8 +184572,8 @@ var OneAppError;
|
|
|
184340
184572
|
var init_errors2 = __esm({
|
|
184341
184573
|
"src/one-app/errors.ts"() {
|
|
184342
184574
|
OneAppError = class extends Error {
|
|
184343
|
-
constructor(code,
|
|
184344
|
-
super(
|
|
184575
|
+
constructor(code, message2, details) {
|
|
184576
|
+
super(message2);
|
|
184345
184577
|
this.code = code;
|
|
184346
184578
|
this.details = details;
|
|
184347
184579
|
this.name = "OneAppError";
|
|
@@ -184490,8 +184722,8 @@ async function collectOneApp(input, deps = {}) {
|
|
|
184490
184722
|
if (!response.ok) {
|
|
184491
184723
|
controller.abort();
|
|
184492
184724
|
const code = response.status === 401 ? "source_unauthorized" : response.status === 403 ? "source_forbidden" : response.status === 404 ? "source_not_found" : "source_request_failed";
|
|
184493
|
-
const
|
|
184494
|
-
throw new OneAppError(code,
|
|
184725
|
+
const message2 = response.status === 401 || response.status === 403 ? "The signed-in Wix user cannot read this source app. Check site access and sign in again." : response.status === 404 ? "The source app was not found. Check the metasite ID." : "The source could not be read. Try again later.";
|
|
184726
|
+
throw new OneAppError(code, message2, { stage, httpStatus: response.status });
|
|
184495
184727
|
}
|
|
184496
184728
|
const length = Number(response.headers.get("content-length"));
|
|
184497
184729
|
if (Number.isFinite(length) && length > maxBytes) {
|
|
@@ -185334,8 +185566,8 @@ function siteAppRequirementsFrom(appId2, entry) {
|
|
|
185334
185566
|
};
|
|
185335
185567
|
}
|
|
185336
185568
|
function messageOf2(err) {
|
|
185337
|
-
const
|
|
185338
|
-
return typeof
|
|
185569
|
+
const message2 = err?.message;
|
|
185570
|
+
return typeof message2 === "string" && message2 ? message2 : String(err);
|
|
185339
185571
|
}
|
|
185340
185572
|
function decideSiteApp(input) {
|
|
185341
185573
|
const fallback = (pickedAppId, reason) => ({ appId: DEFAULT_SITE_APP, source: "fallback", pickedAppId, reason });
|
|
@@ -186181,9 +186413,9 @@ function textFields(look) {
|
|
|
186181
186413
|
return out2;
|
|
186182
186414
|
}
|
|
186183
186415
|
function pushWhere(map, key3, value2, where) {
|
|
186184
|
-
const
|
|
186185
|
-
if (!
|
|
186186
|
-
map.set(key3,
|
|
186416
|
+
const row2 = map.get(key3) ?? { value: value2, where: [] };
|
|
186417
|
+
if (!row2.where.includes(where) && row2.where.length < CAP4.where) row2.where.push(where);
|
|
186418
|
+
map.set(key3, row2);
|
|
186187
186419
|
}
|
|
186188
186420
|
function templateContacts(identity, fields) {
|
|
186189
186421
|
const hits = /* @__PURE__ */ new Map();
|
|
@@ -190188,21 +190420,21 @@ import { basename as basename26, join as join120 } from "node:path";
|
|
|
190188
190420
|
function runId(now = /* @__PURE__ */ new Date()) {
|
|
190189
190421
|
return now.toISOString().replace(/[-:]/g, "").replace(/\..*/, "").replace("T", "-");
|
|
190190
190422
|
}
|
|
190191
|
-
function rowStatus(
|
|
190423
|
+
function rowStatus(row2, thresholds) {
|
|
190192
190424
|
const fail6 = [], warn3 = [];
|
|
190193
|
-
if (
|
|
190194
|
-
const parityExpected =
|
|
190195
|
-
const questions = [["design (web vs mockup)",
|
|
190425
|
+
if (row2.error) warn3.push(`${row2.error.code}: ${row2.error.message}`);
|
|
190426
|
+
const parityExpected = row2.frames.some((f2) => (f2.surface === "ios" || f2.surface === "android") && f2.file);
|
|
190427
|
+
const questions = [["design (web vs mockup)", row2.judge.design], ...parityExpected ? [["parity (native vs web)", row2.judge.parity]] : []];
|
|
190196
190428
|
for (const [question, v2] of questions) {
|
|
190197
190429
|
if (v2 === "mismatch") fail6.push(`judge: ${question} mismatch`);
|
|
190198
190430
|
else if (v2 === "partial") warn3.push(`judge: ${question} partial`);
|
|
190199
190431
|
}
|
|
190200
|
-
if (
|
|
190201
|
-
warn3.push(`judge: cannot tell${
|
|
190432
|
+
if (row2.judge.design === "cannot_tell" || row2.judge.parity === "cannot_tell" && parityExpected) {
|
|
190433
|
+
warn3.push(`judge: cannot tell${row2.judge.reason ? ` (${row2.judge.reason})` : ""}`);
|
|
190202
190434
|
}
|
|
190203
|
-
for (const f2 of
|
|
190204
|
-
if (
|
|
190205
|
-
const design =
|
|
190435
|
+
for (const f2 of row2.frames) if (f2.skipped) warn3.push(`${f2.surface} skipped: ${f2.skipped.reason}`);
|
|
190436
|
+
if (row2.frames.some((f2) => f2.noReference)) warn3.push("no_reference: the mockup does not style this variant");
|
|
190437
|
+
const design = row2.scores.find((s2) => s2.a === "mockup" && s2.b === "web");
|
|
190206
190438
|
if (!thresholds || !design) {
|
|
190207
190439
|
} else if (design.global < thresholds.fail) fail6.push(`score: mockup\u2194web ${design.global} < fail ${thresholds.fail}`);
|
|
190208
190440
|
else if (design.global < thresholds.warn) warn3.push(`score: mockup\u2194web ${design.global} < warn ${thresholds.warn}`);
|
|
@@ -190269,11 +190501,11 @@ async function runFidelity(root, opts = {}) {
|
|
|
190269
190501
|
const parity = captured.has("ios") || captured.has("android") ? verdict.parity : "cannot_tell";
|
|
190270
190502
|
verdict = { ...verdict, parity, verdict: worse(verdict.design, parity), findings: verdict.findings.filter((f2) => captured.has(f2.surface)) };
|
|
190271
190503
|
}
|
|
190272
|
-
const
|
|
190273
|
-
rows.push({ ...
|
|
190504
|
+
const row2 = { screen, variant, frames, scores, judge: verdict, ...stripFile ? { strip: stripFile } : {}, ...error ? { error } : {} };
|
|
190505
|
+
rows.push({ ...row2, ...rowStatus(row2, fidelityThresholds(manifest2, screen)) });
|
|
190274
190506
|
} catch (e2) {
|
|
190275
|
-
const
|
|
190276
|
-
rows.push({ ...
|
|
190507
|
+
const row2 = { screen, variant, frames, scores: [], judge: skippedJudge("the row did not finish"), error: { code: "fidelity_row_failed", message: e2.message } };
|
|
190508
|
+
rows.push({ ...row2, ...rowStatus(row2, fidelityThresholds(manifest2, screen)) });
|
|
190277
190509
|
}
|
|
190278
190510
|
}
|
|
190279
190511
|
}
|
|
@@ -190635,7 +190867,7 @@ var ServeCliClient = class {
|
|
|
190635
190867
|
* One probe costs one extra request only for files that were already going to fail. */
|
|
190636
190868
|
async telemetrySend(events) {
|
|
190637
190869
|
const post = (batch) => this.request("telemetry", "POST", "/v1/telemetry/ingest", { body: batch, headers: this.telHeaders() });
|
|
190638
|
-
const
|
|
190870
|
+
const settle2 = (r3, posted) => {
|
|
190639
190871
|
const j2 = r3.json && typeof r3.json === "object" ? r3.json : null;
|
|
190640
190872
|
const n2 = (k2) => typeof j2?.[k2] === "number" ? j2[k2] : 0;
|
|
190641
190873
|
const counted = typeof j2?.accepted === "number";
|
|
@@ -190645,11 +190877,11 @@ var ServeCliClient = class {
|
|
|
190645
190877
|
return { ...r3, ok: false, json: { ...j2 ?? {}, ok: false } };
|
|
190646
190878
|
};
|
|
190647
190879
|
const first = await post(events);
|
|
190648
|
-
if (first.status !== 413 || events.length <= 1) return
|
|
190880
|
+
if (first.status !== 413 || events.length <= 1) return settle2(first, events.length);
|
|
190649
190881
|
const body = first.json;
|
|
190650
|
-
if (!body || body.error !== "batch_too_large") return
|
|
190882
|
+
if (!body || body.error !== "batch_too_large") return settle2(first, events.length);
|
|
190651
190883
|
const limit = typeof body.limit === "number" && Number.isInteger(body.limit) && body.limit > 0 ? body.limit : null;
|
|
190652
|
-
if (limit === null || limit >= events.length) return
|
|
190884
|
+
if (limit === null || limit >= events.length) return settle2(first, events.length);
|
|
190653
190885
|
const totals = { accepted: 0, dropped: 0, failed: 0 };
|
|
190654
190886
|
const add = (r3) => {
|
|
190655
190887
|
const j2 = r3.json;
|
|
@@ -190665,14 +190897,14 @@ var ServeCliClient = class {
|
|
|
190665
190897
|
last = await post(chunk);
|
|
190666
190898
|
add(last);
|
|
190667
190899
|
if (!last.ok) {
|
|
190668
|
-
return
|
|
190900
|
+
return settle2(
|
|
190669
190901
|
{ ...last, json: { ...last.json ?? {}, ...totals, batched: { limit, sent, ...totals, failedAt: i2 } } },
|
|
190670
190902
|
events.length
|
|
190671
190903
|
);
|
|
190672
190904
|
}
|
|
190673
190905
|
sent += chunk.length;
|
|
190674
190906
|
}
|
|
190675
|
-
return
|
|
190907
|
+
return settle2(
|
|
190676
190908
|
{ ...last, json: { ...last.json ?? {}, ...totals, batched: { limit, sent, ...totals } } },
|
|
190677
190909
|
events.length
|
|
190678
190910
|
);
|
|
@@ -191205,14 +191437,16 @@ var USAGE = `himi \u2014 the Himalaya authoring CLI (remote dev loop)
|
|
|
191205
191437
|
and typed-journey stubs. Writes .himi/adopt.json, .himi/adopt-matrix.md and
|
|
191206
191438
|
.himi/himi-test.stub.json (--dry-run writes nothing)
|
|
191207
191439
|
himi template screens [--show <id>] [--write <id> --from <file>] [--add <id> --from <file> [--parent <id>] [--tab <id>] [--display-name <name>]] [--content <dir>]
|
|
191208
|
-
list dev/index.ts screens (size, workers, onAppear)
|
|
191440
|
+
list dev/index.ts screens (size, workers, onAppear) in any layout \u2014 a hand-written
|
|
191441
|
+
dev/index.ts is read by evaluating it, as validate does; --show prints ONE entry so
|
|
191209
191442
|
nobody reads the whole file; --write puts an edited entry back (re-parsed, refused
|
|
191210
191443
|
if it breaks the file or changes the screen count)
|
|
191211
191444
|
--add appends a NEW screen entry and registers it in linkableScreens (--parent/--tab)
|
|
191212
191445
|
himi template sweep --set "Old=>New" [--set \u2026] | --map <file.json> [--content <dir>] [--dry-run]
|
|
191213
191446
|
replace the template's sample identity/copy inside string literals only (never
|
|
191214
|
-
identifiers) across dev/index.ts, config.ts, tokens.json and tier5-src;
|
|
191215
|
-
before writing and
|
|
191447
|
+
identifiers) across dev/index.ts, config.ts, tokens.json and tier5-src; syntax-checks
|
|
191448
|
+
every changed file (and re-parses a generated SCREENS map) before writing, and
|
|
191449
|
+
reports placeholdersLeft
|
|
191216
191450
|
himi template recommend [--text <description>] [--verticals a,b] [--book <site analyze dir>] [--remote]
|
|
191217
191451
|
rank the catalog for one business: description words + owner-vs-customer, and the
|
|
191218
191452
|
site's installed verticals (the same scoring site analyze uses)
|
|
@@ -192619,7 +192853,7 @@ async function adoptAtInit(dir) {
|
|
|
192619
192853
|
const layout = /SCREENS = runtimeSetting/.test(msg);
|
|
192620
192854
|
return {
|
|
192621
192855
|
adopt: {
|
|
192622
|
-
skipped: layout ? "no adoption inventory for this template: its dev/index.ts is not in the generated SCREENS layout,
|
|
192856
|
+
skipped: layout ? "no adoption inventory for this template: its dev/index.ts is not in the generated SCREENS layout, and init reads a template statically, never running its code. `himi template screens` and `himi template inspect` read it by evaluating dev/index.ts (as `himi validate` does); `himi template trim` and `screens --show/--write/--add` need the generated layout, so edit its source directly" : `no adoption inventory: ${msg}`
|
|
192623
192857
|
}
|
|
192624
192858
|
};
|
|
192625
192859
|
}
|
|
@@ -192850,8 +193084,8 @@ var VALID_PLATFORM_KEYS2 = /* @__PURE__ */ new Set([
|
|
|
192850
193084
|
]);
|
|
192851
193085
|
function surfaceIssues(dir, surfaceNav, strict) {
|
|
192852
193086
|
const issues = [];
|
|
192853
|
-
const warn3 = (
|
|
192854
|
-
const error = (
|
|
193087
|
+
const warn3 = (message2) => issues.push({ screen: null, pass: "surfaces", severity: strict ? "error" : "warning", message: message2 });
|
|
193088
|
+
const error = (message2) => issues.push({ screen: null, pass: "surfaces", severity: "error", message: message2 });
|
|
192855
193089
|
let platforms = {};
|
|
192856
193090
|
let envelopeUnreadable = false;
|
|
192857
193091
|
const p2 = join45(dir, "platforms.json");
|
|
@@ -193077,16 +193311,14 @@ async function templateCommand(ctx) {
|
|
|
193077
193311
|
const dir = contentDir(flags);
|
|
193078
193312
|
try {
|
|
193079
193313
|
if (sub === "inspect") {
|
|
193080
|
-
const inv = adopt.
|
|
193314
|
+
const { layoutNote: _n2, ...inv } = await adopt.inspectAnyLayout(dir);
|
|
193081
193315
|
const written = flags["dry-run"] === true ? [] : adopt.writeInventory(dir, inv);
|
|
193082
193316
|
const { dir: _d, ...rest } = inv;
|
|
193083
193317
|
print({ ...rest, written, summary: adopt.inventorySummary(inv) });
|
|
193084
193318
|
return 0;
|
|
193085
193319
|
}
|
|
193086
193320
|
if (sub === "screens") {
|
|
193087
|
-
const src = adopt.readAppSources(dir);
|
|
193088
193321
|
const { parseApp: parseApp2 } = await Promise.resolve().then(() => (init_template_trim(), template_trim_exports));
|
|
193089
|
-
const app = parseApp2(src.dev, src.config);
|
|
193090
193322
|
const show = str3(flags.show);
|
|
193091
193323
|
const target = str3(flags.write);
|
|
193092
193324
|
const adding = str3(flags.add);
|
|
@@ -193103,18 +193335,22 @@ async function templateCommand(ctx) {
|
|
|
193103
193335
|
return 0;
|
|
193104
193336
|
}
|
|
193105
193337
|
if (show) {
|
|
193338
|
+
const src = adopt.readAppSources(dir);
|
|
193339
|
+
const app = parseApp2(src.dev, src.config);
|
|
193106
193340
|
const r3 = adopt.findRoute(app, show);
|
|
193107
193341
|
if (!r3) throw new TrimRefusal2(`no screen "${show}" in dev/index.ts \u2014 \`himi template screens\` lists the ids`);
|
|
193108
193342
|
io2.log(src.dev.slice(r3.lineStart, r3.end).replace(/\n$/, ""));
|
|
193109
193343
|
return 0;
|
|
193110
193344
|
}
|
|
193111
|
-
const inv = adopt.
|
|
193345
|
+
const inv = await adopt.inspectAnyLayout(dir);
|
|
193112
193346
|
print({
|
|
193113
193347
|
ok: true,
|
|
193348
|
+
layout: inv.layout,
|
|
193114
193349
|
home: inv.home,
|
|
193115
193350
|
count: inv.screens.length,
|
|
193116
193351
|
screens: inv.screens,
|
|
193117
|
-
hint: "`--show <id>` prints one screen's entry; edit it and `--write <id> --from <file>` puts it back (re-parsed, refused if it breaks the file)"
|
|
193352
|
+
hint: inv.layout === "generated" ? "`--show <id>` prints one screen's entry; edit it and `--write <id> --from <file>` puts it back (re-parsed, refused if it breaks the file)" : "dev/index.ts is hand-written (not the generated SCREENS map), so these screens were read by evaluating it, as `himi validate` does. Edit its source directly: `--show`/`--write`/`--add` and `himi template trim` need the generated layout",
|
|
193353
|
+
...inv.layoutNote ? { layoutNote: inv.layoutNote } : {}
|
|
193118
193354
|
});
|
|
193119
193355
|
return 0;
|
|
193120
193356
|
}
|
|
@@ -193618,14 +193854,14 @@ import { join as join60 } from "node:path";
|
|
|
193618
193854
|
async function iconIssues(dir, strict, opts = {}) {
|
|
193619
193855
|
if (!existsSync60(join60(dir, "himalaya.content.json"))) return [];
|
|
193620
193856
|
const status = await iconStatus(dir);
|
|
193621
|
-
const issue2 = (severity,
|
|
193857
|
+
const issue2 = (severity, message2) => ({
|
|
193622
193858
|
screen: null,
|
|
193623
193859
|
pass: "icon",
|
|
193624
193860
|
severity,
|
|
193625
|
-
message
|
|
193861
|
+
message: message2
|
|
193626
193862
|
});
|
|
193627
193863
|
const playIssues = (status.play?.issues ?? []).map(
|
|
193628
|
-
(
|
|
193864
|
+
(message2) => issue2("error", `Play listing icon (${PLAY_LISTING_ICON}) ${message2}. Re-derive it with \`himi icon set <file.png>\`.`)
|
|
193629
193865
|
);
|
|
193630
193866
|
if (status.verdict === "missing") {
|
|
193631
193867
|
if (status.declared) {
|
|
@@ -193646,8 +193882,8 @@ async function iconIssues(dir, strict, opts = {}) {
|
|
|
193646
193882
|
`launcher icon is still the "${status.templateIcon}" template's artwork, byte for byte. It passes every store rule and is not this customer's mark. Replace it with \`himi icon set <file.png>\`, \`himi icon from-site\`, or \`himi icon generate\`.`
|
|
193647
193883
|
));
|
|
193648
193884
|
}
|
|
193649
|
-
for (const
|
|
193650
|
-
out2.push(issue2("error", `launcher icon ${
|
|
193885
|
+
for (const message2 of status.byteIssues) {
|
|
193886
|
+
out2.push(issue2("error", `launcher icon ${message2}. Fix it with \`himi icon set <file.png>\`.`));
|
|
193651
193887
|
}
|
|
193652
193888
|
for (const f2 of status.pixelFindings) {
|
|
193653
193889
|
out2.push(issue2(f2.level === "error" ? "error" : strict ? "error" : "warning", f2.message));
|
|
@@ -194124,13 +194360,13 @@ async function progressCommand2(ctx) {
|
|
|
194124
194360
|
const journal2 = journalPath2(dir);
|
|
194125
194361
|
const isContentPackage = existsSync71(join75(dir, "himalaya.content.json"));
|
|
194126
194362
|
const hint = isContentPackage ? {} : { hint: "no himalaya.content.json here \u2014 run from the app directory (or pass --content <dir>) so the build board finds this journal" };
|
|
194127
|
-
const
|
|
194363
|
+
const message2 = pos.slice(1).join(" ").trim();
|
|
194128
194364
|
const approvalFlags = ["approve", "done", "drop"].filter((f2) => flags[f2] !== void 0);
|
|
194129
194365
|
if (approvalFlags.length > 1) {
|
|
194130
194366
|
io2.error(JSON.stringify({ ok: false, error: "one_approval_action", hint: "pass one of --approve, --done or --drop per call" }));
|
|
194131
194367
|
return 2;
|
|
194132
194368
|
}
|
|
194133
|
-
if ((approvalFlags.length === 1 || flags.brief === true) && (flags.step !== void 0 || flags.image !== void 0 || flags.notify === true || flags["no-image"] === true || flags.brief === true && (
|
|
194369
|
+
if ((approvalFlags.length === 1 || flags.brief === true) && (flags.step !== void 0 || flags.image !== void 0 || flags.notify === true || flags["no-image"] === true || flags.brief === true && (message2 || approvalFlags.length))) {
|
|
194134
194370
|
io2.error(JSON.stringify({
|
|
194135
194371
|
ok: false,
|
|
194136
194372
|
error: flags.brief === true ? "brief_is_read_only" : "approval_is_its_own_call",
|
|
@@ -194148,7 +194384,7 @@ async function progressCommand2(ctx) {
|
|
|
194148
194384
|
}
|
|
194149
194385
|
const action = flag === "approve" ? "approved" : flag === "done" ? "done" : "dropped";
|
|
194150
194386
|
try {
|
|
194151
|
-
const { event, open } = appendApproval2(dir, { gate: ref.gate, ..."id" in ref && ref.id ? { id: ref.id } : {}, action, ...
|
|
194387
|
+
const { event, open } = appendApproval2(dir, { gate: ref.gate, ..."id" in ref && ref.id ? { id: ref.id } : {}, action, ...message2 ? { note: message2 } : {} });
|
|
194152
194388
|
print({ ok: true, approval: event, open, ...hint });
|
|
194153
194389
|
return 0;
|
|
194154
194390
|
} catch (e2) {
|
|
@@ -194167,7 +194403,7 @@ async function progressCommand2(ctx) {
|
|
|
194167
194403
|
io2.log(formatBrief2({ appName: appLabel2(dir), isContentPackage, summary: summary2, open, ...note ? { agentContextNote: note } : {} }));
|
|
194168
194404
|
return 0;
|
|
194169
194405
|
}
|
|
194170
|
-
if (!
|
|
194406
|
+
if (!message2) {
|
|
194171
194407
|
if (flags.step !== void 0 || flags.image !== void 0 || flags.notify === true || flags["no-image"] === true) {
|
|
194172
194408
|
io2.error(JSON.stringify({ ok: false, error: "message_required", hint: 'progress "<what changed>" --step <n> --image <png>' }));
|
|
194173
194409
|
return 2;
|
|
@@ -194205,8 +194441,8 @@ async function progressCommand2(ctx) {
|
|
|
194205
194441
|
} else imageNote = `no picture attached: ${auto.skipped}`;
|
|
194206
194442
|
}
|
|
194207
194443
|
try {
|
|
194208
|
-
const entry = appendProgress2(dir, { message, ...step ? { step } : {}, images });
|
|
194209
|
-
const notified = flags.notify === true ? await notifyDesktop2(`himi \xB7 ${appLabel2(dir) ?? "your app"}`,
|
|
194444
|
+
const entry = appendProgress2(dir, { message: message2, ...step ? { step } : {}, images });
|
|
194445
|
+
const notified = flags.notify === true ? await notifyDesktop2(`himi \xB7 ${appLabel2(dir) ?? "your app"}`, message2) : void 0;
|
|
194210
194446
|
const { count: count2 } = summarizeProgress2(readProgress2(dir).entries);
|
|
194211
194447
|
const imageAttached = (entry.images?.length ?? 0) > 0;
|
|
194212
194448
|
const handed = handover && isContentPackage ? (await Promise.resolve().then(() => (init_milestones(), milestones_exports))).afterHandoverPostcard(dir, { content: str3(flags.content) }) : null;
|
|
@@ -194627,7 +194863,7 @@ async function testCommand(ctx) {
|
|
|
194627
194863
|
continue;
|
|
194628
194864
|
}
|
|
194629
194865
|
try {
|
|
194630
|
-
const progress = (
|
|
194866
|
+
const progress = (message2) => io2.error(`[native ${availability.platform} ${(/* @__PURE__ */ new Date()).toISOString()}] ${message2}`);
|
|
194631
194867
|
const nativeRun = availability.platform === "ios" ? runNativeDecode2({ descriptors, tokensJson, packageDir: availability.packageDir, progress }) : runAndroidNativeDecode2({ descriptors, tokensJson, harnessDir: availability.harnessDir, gradlew: availability.gradlew, sdkDir: availability.sdkDir, progress });
|
|
194632
194868
|
result = mergeNativeDecode2(result, nativeRun);
|
|
194633
194869
|
} catch (error) {
|
|
@@ -194811,13 +195047,13 @@ async function iconCommand(ctx) {
|
|
|
194811
195047
|
level: requireVerified ? "error" : "warn",
|
|
194812
195048
|
message: `still the "${status.templateIcon}" template's artwork, byte for byte \u2014 not this customer's mark. \`himi icon set <file.png>\` / \`from-site\` / \`generate\` replaces it.`
|
|
194813
195049
|
}] : [],
|
|
194814
|
-
...status.byteIssues.map((
|
|
195050
|
+
...status.byteIssues.map((message2) => ({ level: "error", message: message2 })),
|
|
194815
195051
|
...status.pixelFindings,
|
|
194816
195052
|
// Play's rules, on the derived 512 — the other half of what `check` claims to
|
|
194817
195053
|
// validate. Kept distinct in the text so nobody applies Apple's answer to it.
|
|
194818
|
-
...(status.play?.issues ?? []).map((
|
|
195054
|
+
...(status.play?.issues ?? []).map((message2) => ({
|
|
194819
195055
|
level: "error",
|
|
194820
|
-
message: `Play listing icon (${status.play?.path.split("/").pop()}) ${
|
|
195056
|
+
message: `Play listing icon (${status.play?.path.split("/").pop()}) ${message2}`
|
|
194821
195057
|
}))
|
|
194822
195058
|
];
|
|
194823
195059
|
if (flags.json === true) {
|
|
@@ -196355,12 +196591,12 @@ async function runPackageCommand(ctx) {
|
|
|
196355
196591
|
const live3 = join91(running.releaseRoot, running.app);
|
|
196356
196592
|
const manifestOf = (tree) => JSON.parse(readFileSync96(join91(tree, "release-manifest.json"), "utf8"));
|
|
196357
196593
|
let current = manifestOf(live3);
|
|
196358
|
-
const failed3 = async (
|
|
196594
|
+
const failed3 = async (message2) => {
|
|
196359
196595
|
if (stopping) return;
|
|
196360
|
-
bus.publish("build.failed", { message });
|
|
196361
|
-
record2(running, { ok: false, at: (/* @__PURE__ */ new Date()).toISOString(), error:
|
|
196596
|
+
bus.publish("build.failed", { message: message2 });
|
|
196597
|
+
record2(running, { ok: false, at: (/* @__PURE__ */ new Date()).toISOString(), error: message2 });
|
|
196362
196598
|
await refreshBoard();
|
|
196363
|
-
io2.error(JSON.stringify({ watch: "build_failed", keptLastGood: true, message }));
|
|
196599
|
+
io2.error(JSON.stringify({ watch: "build_failed", keptLastGood: true, message: message2 }));
|
|
196364
196600
|
};
|
|
196365
196601
|
rebuild = watchKit.serialize(async () => {
|
|
196366
196602
|
const t0 = Date.now();
|
|
@@ -196911,13 +197147,13 @@ function diagnoseBody(body) {
|
|
|
196911
197147
|
const findings = body.findings;
|
|
196912
197148
|
if (!Array.isArray(findings)) return body;
|
|
196913
197149
|
const messageOf3 = (entry) => {
|
|
196914
|
-
const
|
|
196915
|
-
return typeof
|
|
197150
|
+
const message2 = entry && typeof entry === "object" ? entry.message : void 0;
|
|
197151
|
+
return typeof message2 === "string" ? message2 : void 0;
|
|
196916
197152
|
};
|
|
196917
|
-
const shown2 = new Set(findings.map(messageOf3).filter((
|
|
197153
|
+
const shown2 = new Set(findings.map(messageOf3).filter((message2) => message2 !== void 0));
|
|
196918
197154
|
const folded = (value2) => Array.isArray(value2) && value2.length > 0 && value2.every((entry) => {
|
|
196919
|
-
const
|
|
196920
|
-
return
|
|
197155
|
+
const message2 = messageOf3(entry);
|
|
197156
|
+
return message2 !== void 0 && shown2.has(message2);
|
|
196921
197157
|
});
|
|
196922
197158
|
const out2 = {};
|
|
196923
197159
|
const emptied = [];
|
|
@@ -199772,9 +200008,9 @@ async function seedCms(opts) {
|
|
|
199772
200008
|
}
|
|
199773
200009
|
if (!dryRun) {
|
|
199774
200010
|
const declaredKeys = new Set(spec.fields.map((f2) => f2.key));
|
|
199775
|
-
const clean2 = rows.map((
|
|
200011
|
+
const clean2 = rows.map((row2) => {
|
|
199776
200012
|
const out2 = {};
|
|
199777
|
-
for (const [k2, v2] of Object.entries(
|
|
200013
|
+
for (const [k2, v2] of Object.entries(row2)) if (declaredKeys.has(k2)) out2[k2] = v2;
|
|
199778
200014
|
return out2;
|
|
199779
200015
|
});
|
|
199780
200016
|
const droppedKeys = [...new Set(rows.flatMap((r3) => Object.keys(r3).filter((k2) => !declaredKeys.has(k2))))];
|
|
@@ -199787,11 +200023,11 @@ async function seedCms(opts) {
|
|
|
199787
200023
|
await mapLimit(
|
|
199788
200024
|
clean2,
|
|
199789
200025
|
4,
|
|
199790
|
-
(
|
|
200026
|
+
(row2, i2) => (
|
|
199791
200027
|
// Sent EXACTLY ONCE. An insert carries no idempotency key, so retrying a request
|
|
199792
200028
|
// that landed but whose response was lost silently duplicates the row — and a
|
|
199793
200029
|
// duplicate is worse than a reported failure the author can re-run deliberately.
|
|
199794
|
-
call("POST", "/wix-data/v2/items", { dataCollectionId: id, dataItem: { data:
|
|
200030
|
+
call("POST", "/wix-data/v2/items", { dataCollectionId: id, dataItem: { data: row2 } })
|
|
199795
200031
|
)
|
|
199796
200032
|
);
|
|
199797
200033
|
}
|
|
@@ -199937,7 +200173,7 @@ async function planData(options) {
|
|
|
199937
200173
|
kv.push({ name: spec.name, status: !remote.exists ? "missing" : drift ? "drift" : "ready", ...drift ? { detail: "declaration differs from provisioned KV metadata" } : {} });
|
|
199938
200174
|
}
|
|
199939
200175
|
const collections = await queryCms({ app: options.scope.app, cms: { collections: options.data?.collections ?? [] }, call: options.call });
|
|
199940
|
-
return { ok: kv.every((
|
|
200176
|
+
return { ok: kv.every((row2) => row2.status === "ready") && collections.ok, scope: { ...options.scope }, kv, collections, writes: 0 };
|
|
199941
200177
|
}
|
|
199942
200178
|
async function createData(options) {
|
|
199943
200179
|
const created = [];
|
|
@@ -200981,7 +201217,7 @@ himi v${cliVersion()} \u2014 run \`himi --version\`. If authoring commands fail
|
|
|
200981
201217
|
message: "this package changed things a per-item patch cannot move, so publishing only the selected items would ship bytes whose dependencies are missing on the plane.",
|
|
200982
201218
|
notCarried,
|
|
200983
201219
|
carriedByPatch: ["screens", "bundles", "tokens", "appConfig"],
|
|
200984
|
-
hint: notCarried.some((
|
|
201220
|
+
hint: notCarried.some((row2) => row2.slice === "screenMetadata") ? "run a full `himi push` to publish screen names/grouping. --accept-partial cannot bypass this requirement." : "run a full `himi push` \u2014 it publishes assets, the icon, the surface envelope and minBinaryVersion. Re-run with --accept-partial only if you know those devices are already covered."
|
|
200985
201221
|
}), null, 2));
|
|
200986
201222
|
return 1;
|
|
200987
201223
|
}
|