@wix/himalaya-cli 0.1529.0 → 0.1530.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 -484
- 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 +1767 -2698
- 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-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 +1753 -2697
- 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/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 +1753 -2697
- 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-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 +1755 -2699
- 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-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`
|
|
@@ -12206,7 +12219,6 @@ function webViewOriginAllowed(url, origins) {
|
|
|
12206
12219
|
}
|
|
12207
12220
|
var init_webview_origin = __esm({
|
|
12208
12221
|
"../../core/ts/src/webview-origin.ts"() {
|
|
12209
|
-
"use strict";
|
|
12210
12222
|
}
|
|
12211
12223
|
});
|
|
12212
12224
|
|
|
@@ -13172,9 +13184,9 @@ function buildSweepSource(allow) {
|
|
|
13172
13184
|
}
|
|
13173
13185
|
})(${JSON.stringify(allow)});`;
|
|
13174
13186
|
}
|
|
13175
|
-
function explainWithheldError(
|
|
13176
|
-
if (!deviceParity ||
|
|
13177
|
-
return BARE_FETCH_UNDEFINED.test(
|
|
13187
|
+
function explainWithheldError(message2, deviceParity) {
|
|
13188
|
+
if (!deviceParity || message2.includes(FETCH_ADVICE)) return message2;
|
|
13189
|
+
return BARE_FETCH_UNDEFINED.test(message2) ? `${message2} \u2014 ${FETCH_ADVICE}` : message2;
|
|
13178
13190
|
}
|
|
13179
13191
|
function realmInstallsIntl(intl, hide) {
|
|
13180
13192
|
return intl === true && !(hide ?? []).includes("Intl");
|
|
@@ -13365,8 +13377,8 @@ function runBundleSandbox(bundleJs, opts) {
|
|
|
13365
13377
|
get: (t2, prop2) => prop2 in t2 ? t2[prop2] : inert
|
|
13366
13378
|
});
|
|
13367
13379
|
const mkConsole = () => {
|
|
13368
|
-
const sink = (level) => (
|
|
13369
|
-
consoleLines.push({ level, message: String(
|
|
13380
|
+
const sink = (level) => (message2) => {
|
|
13381
|
+
consoleLines.push({ level, message: String(message2) });
|
|
13370
13382
|
};
|
|
13371
13383
|
return { log: sink("log"), warn: sink("warn"), error: sink("error"), info: sink("info"), debug: sink("debug") };
|
|
13372
13384
|
};
|
|
@@ -13562,11 +13574,11 @@ async function bootBundleWorker(bundleJs, opts) {
|
|
|
13562
13574
|
const pollDirectives = [];
|
|
13563
13575
|
const oversizeWixResponses = [];
|
|
13564
13576
|
const seenOversize = /* @__PURE__ */ new Set();
|
|
13565
|
-
const diagnose = (
|
|
13566
|
-
if (seenOversize.has(
|
|
13567
|
-
seenOversize.add(
|
|
13577
|
+
const diagnose = (message2) => {
|
|
13578
|
+
if (seenOversize.has(message2)) return;
|
|
13579
|
+
seenOversize.add(message2);
|
|
13568
13580
|
try {
|
|
13569
|
-
(opts.onDiagnostic ?? ((m2) => console.warn(m2)))(
|
|
13581
|
+
(opts.onDiagnostic ?? ((m2) => console.warn(m2)))(message2);
|
|
13570
13582
|
} catch {
|
|
13571
13583
|
}
|
|
13572
13584
|
};
|
|
@@ -13832,8 +13844,8 @@ async function bootBundleWorker(bundleJs, opts) {
|
|
|
13832
13844
|
const prev = def.state;
|
|
13833
13845
|
if (!prev || typeof prev !== "object" || Array.isArray(prev)) return;
|
|
13834
13846
|
const raw = err?.message ?? err;
|
|
13835
|
-
let
|
|
13836
|
-
if (raw === null || raw === void 0)
|
|
13847
|
+
let message2;
|
|
13848
|
+
if (raw === null || raw === void 0) message2 = "action failed";
|
|
13837
13849
|
else if (typeof raw === "object") {
|
|
13838
13850
|
let asJson;
|
|
13839
13851
|
try {
|
|
@@ -13841,12 +13853,12 @@ async function bootBundleWorker(bundleJs, opts) {
|
|
|
13841
13853
|
} catch {
|
|
13842
13854
|
asJson = void 0;
|
|
13843
13855
|
}
|
|
13844
|
-
|
|
13845
|
-
} else
|
|
13846
|
-
const failed3 = { ...prev, _error:
|
|
13856
|
+
message2 = typeof asJson === "string" ? asJson : String(raw);
|
|
13857
|
+
} else message2 = String(raw);
|
|
13858
|
+
const failed3 = { ...prev, _error: message2 };
|
|
13847
13859
|
if (prev.status === "loading") failed3.status = "error";
|
|
13848
13860
|
if (prev.loading === true) failed3.loading = false;
|
|
13849
|
-
if (typeof prev.error === "string") failed3.error =
|
|
13861
|
+
if (typeof prev.error === "string") failed3.error = message2;
|
|
13850
13862
|
def.state = failed3;
|
|
13851
13863
|
};
|
|
13852
13864
|
const runAction = async (def, label3, fn2, args) => {
|
|
@@ -13991,8 +14003,8 @@ function parseDescriptorWorkerAction(actionId) {
|
|
|
13991
14003
|
const match = /^tier5\.([A-Za-z0-9_-]+)\.([A-Za-z0-9_-]+)$/.exec(actionId);
|
|
13992
14004
|
return match ? { service: match[1], action: match[2] } : null;
|
|
13993
14005
|
}
|
|
13994
|
-
function actionIssue(action, severity,
|
|
13995
|
-
return { severity, pass: "actions", path: action.at, message };
|
|
14006
|
+
function actionIssue(action, severity, message2) {
|
|
14007
|
+
return { severity, pass: "actions", path: action.at, message: message2 };
|
|
13996
14008
|
}
|
|
13997
14009
|
function appWorkerExports(context, service, action) {
|
|
13998
14010
|
return Boolean(context.appWorkerActions?.[service]?.includes(action));
|
|
@@ -14009,8 +14021,8 @@ function validateWorkerAction(action, context) {
|
|
|
14009
14021
|
if (exported?.includes(parsed.action)) return null;
|
|
14010
14022
|
if (exported === void 0 && appWorkerExports(context, parsed.service, parsed.action)) return null;
|
|
14011
14023
|
const appExports = exported === void 0 ? context.appWorkerActions?.[parsed.service] : void 0;
|
|
14012
|
-
const
|
|
14013
|
-
return actionIssue(action, "error",
|
|
14024
|
+
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"})`;
|
|
14025
|
+
return actionIssue(action, "error", message2);
|
|
14014
14026
|
}
|
|
14015
14027
|
if (appWorkerMayAnswer(context, parsed.service)) {
|
|
14016
14028
|
if (appWorkerExports(context, parsed.service, parsed.action)) return null;
|
|
@@ -15752,9 +15764,9 @@ function validateScreenDescriptor(screenId, descriptor, opts = {}) {
|
|
|
15752
15764
|
const gaps = accessibleNameGaps(descriptor);
|
|
15753
15765
|
const CAP5 = 20;
|
|
15754
15766
|
for (const gap of gaps.slice(0, CAP5)) {
|
|
15755
|
-
const
|
|
15767
|
+
const row2 = Object.prototype.hasOwnProperty.call(A11Y_CONTRACT, gap.type) ? A11Y_CONTRACT[gap.type] : void 0;
|
|
15756
15768
|
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${
|
|
15769
|
+
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
15770
|
issues.push({
|
|
15759
15771
|
severity,
|
|
15760
15772
|
pass: "a11y",
|
|
@@ -17167,8 +17179,8 @@ var init_contained_dev_module = __esm({
|
|
|
17167
17179
|
};
|
|
17168
17180
|
ContainedDevModuleUnloadable = class extends Error {
|
|
17169
17181
|
himiContainedDevModuleUnloadable = true;
|
|
17170
|
-
constructor(
|
|
17171
|
-
super(
|
|
17182
|
+
constructor(message2) {
|
|
17183
|
+
super(message2);
|
|
17172
17184
|
this.name = "ContainedDevModuleUnloadable";
|
|
17173
17185
|
}
|
|
17174
17186
|
};
|
|
@@ -17178,6 +17190,18 @@ var init_contained_dev_module = __esm({
|
|
|
17178
17190
|
});
|
|
17179
17191
|
|
|
17180
17192
|
// ../../core/dev-server/src/loader.ts
|
|
17193
|
+
var loader_exports = {};
|
|
17194
|
+
__export(loader_exports, {
|
|
17195
|
+
hasDevModule: () => hasDevModule,
|
|
17196
|
+
listAvailableApps: () => listAvailableApps,
|
|
17197
|
+
loadApp: () => loadApp,
|
|
17198
|
+
loadContent: () => loadContent,
|
|
17199
|
+
readPlatformsJson: () => readPlatformsJson,
|
|
17200
|
+
resolveWixClientId: () => resolveWixClientId,
|
|
17201
|
+
resolveWixWebAuthConfig: () => resolveWixWebAuthConfig,
|
|
17202
|
+
resolveWixWebAuthPair: () => resolveWixWebAuthPair,
|
|
17203
|
+
tryLoadApp: () => tryLoadApp
|
|
17204
|
+
});
|
|
17181
17205
|
import { resolve as resolve14, basename as basename5, dirname as dirname10 } from "node:path";
|
|
17182
17206
|
import { existsSync as existsSync13, readdirSync as readdirSync10, readFileSync as readFileSync14, mkdirSync as mkdirSync8, rmSync as rmSync4 } from "node:fs";
|
|
17183
17207
|
import { pathToFileURL as pathToFileURL3, fileURLToPath as fileURLToPath7 } from "node:url";
|
|
@@ -17214,6 +17238,9 @@ function resolveDevEntry(name) {
|
|
|
17214
17238
|
}
|
|
17215
17239
|
return null;
|
|
17216
17240
|
}
|
|
17241
|
+
function hasDevModule(name) {
|
|
17242
|
+
return resolveDevEntry(name) !== null;
|
|
17243
|
+
}
|
|
17217
17244
|
async function devModuleUrl(entry, dir, fresh = false) {
|
|
17218
17245
|
const hasTypeScriptLoader = process.execArgv.some((arg) => arg.includes("tsx"));
|
|
17219
17246
|
const direct = !isOffRepo() && hasTypeScriptLoader;
|
|
@@ -17699,8 +17726,8 @@ var init_errors = __esm({
|
|
|
17699
17726
|
status;
|
|
17700
17727
|
/** Stable machine-readable code for the `error` field; callers branch on this, not on prose. */
|
|
17701
17728
|
code;
|
|
17702
|
-
constructor(
|
|
17703
|
-
super(
|
|
17729
|
+
constructor(message2, opts = {}) {
|
|
17730
|
+
super(message2);
|
|
17704
17731
|
this.name = "ControlInputError";
|
|
17705
17732
|
this.status = opts.status ?? 400;
|
|
17706
17733
|
this.code = opts.code ?? "invalid_request";
|
|
@@ -21064,8 +21091,8 @@ var init_screen_views = __esm({
|
|
|
21064
21091
|
"../../core/serve-storage/src/screen-views.ts"() {
|
|
21065
21092
|
init_unicode_case_folding();
|
|
21066
21093
|
ScreenViewValidationError = class extends Error {
|
|
21067
|
-
constructor(
|
|
21068
|
-
super(
|
|
21094
|
+
constructor(message2) {
|
|
21095
|
+
super(message2);
|
|
21069
21096
|
this.name = "ScreenViewValidationError";
|
|
21070
21097
|
}
|
|
21071
21098
|
};
|
|
@@ -22572,7 +22599,6 @@ function resolveIdiom(tokens2, ctx = {}) {
|
|
|
22572
22599
|
var IDIOM_CONTEXTS, UNSAFE_KEYS;
|
|
22573
22600
|
var init_idiom = __esm({
|
|
22574
22601
|
"../../core/ts/src/idiom.ts"() {
|
|
22575
|
-
"use strict";
|
|
22576
22602
|
IDIOM_CONTEXTS = {
|
|
22577
22603
|
ios: { native: ["ios"] },
|
|
22578
22604
|
android: { native: ["material"] },
|
|
@@ -22776,9 +22802,9 @@ function springCurve(spring, durationMs) {
|
|
|
22776
22802
|
const x2 = springStep(response, zeta);
|
|
22777
22803
|
const step = response / 64;
|
|
22778
22804
|
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(
|
|
22805
|
+
let settle2 = 0;
|
|
22806
|
+
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;
|
|
22807
|
+
const secs = Math.min(settle2 + step, SPRING_MAX_SECS);
|
|
22782
22808
|
const samples = Math.min(200, Math.max(24, Math.ceil(12 * secs / response)));
|
|
22783
22809
|
const points = [];
|
|
22784
22810
|
for (let i2 = 0; i2 <= samples; i2++) points.push(i2 === 0 ? 0 : i2 === samples ? 1 : Number(x2(secs * i2 / samples).toFixed(3)));
|
|
@@ -23749,8 +23775,8 @@ var init_base44_entities = __esm({
|
|
|
23749
23775
|
});
|
|
23750
23776
|
|
|
23751
23777
|
// ../../core/sdk/functions/src/index.ts
|
|
23752
|
-
function fail2(
|
|
23753
|
-
throw new Error(`defineFunction: ${
|
|
23778
|
+
function fail2(message2) {
|
|
23779
|
+
throw new Error(`defineFunction: ${message2}`);
|
|
23754
23780
|
}
|
|
23755
23781
|
function validateName(name) {
|
|
23756
23782
|
if (typeof name !== "string") fail2("name must be a string");
|
|
@@ -29765,7 +29791,7 @@ var init_preview2 = __esm({
|
|
|
29765
29791
|
const out2 = [];
|
|
29766
29792
|
const err = [];
|
|
29767
29793
|
let settled = false;
|
|
29768
|
-
const
|
|
29794
|
+
const settle2 = (fn2, v2) => {
|
|
29769
29795
|
if (settled) return;
|
|
29770
29796
|
settled = true;
|
|
29771
29797
|
clearTimeout(timer);
|
|
@@ -29776,14 +29802,14 @@ var init_preview2 = __esm({
|
|
|
29776
29802
|
child.kill("SIGKILL");
|
|
29777
29803
|
} catch {
|
|
29778
29804
|
}
|
|
29779
|
-
|
|
29805
|
+
settle2(reject, new Error(`${cmd} ${args[0] ?? ""} timed out after ${timeoutMs}ms`));
|
|
29780
29806
|
}, timeoutMs);
|
|
29781
29807
|
child.stdout.on("data", (b2) => out2.push(b2));
|
|
29782
29808
|
child.stderr.on("data", (b2) => err.push(b2));
|
|
29783
|
-
child.on("error", (e2) =>
|
|
29809
|
+
child.on("error", (e2) => settle2(reject, e2));
|
|
29784
29810
|
child.on("close", (code) => {
|
|
29785
|
-
if (code === 0)
|
|
29786
|
-
else
|
|
29811
|
+
if (code === 0) settle2(resolve83, Buffer.concat(out2));
|
|
29812
|
+
else settle2(reject, new Error(`${cmd} exited ${code}: ${Buffer.concat(err).toString("utf8")}`));
|
|
29787
29813
|
});
|
|
29788
29814
|
});
|
|
29789
29815
|
},
|
|
@@ -31424,7 +31450,31 @@ function useBoundValues(ctx, bindings) {
|
|
|
31424
31450
|
}, [ctx.provider, key3]);
|
|
31425
31451
|
return values.length === paths2.length ? values : paths2.map(() => void 0);
|
|
31426
31452
|
}
|
|
31427
|
-
|
|
31453
|
+
function templateReadsService(template) {
|
|
31454
|
+
let reads2 = readsService.get(template);
|
|
31455
|
+
if (reads2 === void 0) {
|
|
31456
|
+
reads2 = JSON.stringify(template).indexOf("$service:") >= 0;
|
|
31457
|
+
readsService.set(template, reads2);
|
|
31458
|
+
}
|
|
31459
|
+
return reads2;
|
|
31460
|
+
}
|
|
31461
|
+
function sameJson(a2, b2) {
|
|
31462
|
+
if (a2 === b2) return true;
|
|
31463
|
+
if (a2 === null || b2 === null || typeof a2 !== "object" || typeof b2 !== "object") return false;
|
|
31464
|
+
if (Array.isArray(a2)) {
|
|
31465
|
+
if (!Array.isArray(b2) || a2.length !== b2.length) return false;
|
|
31466
|
+
for (let i2 = 0; i2 < a2.length; i2++) if (!sameJson(a2[i2], b2[i2])) return false;
|
|
31467
|
+
return true;
|
|
31468
|
+
}
|
|
31469
|
+
if (Array.isArray(b2)) return false;
|
|
31470
|
+
const ka2 = Object.keys(a2);
|
|
31471
|
+
if (ka2.length !== Object.keys(b2).length) return false;
|
|
31472
|
+
for (const k2 of ka2) {
|
|
31473
|
+
if (!Object.prototype.hasOwnProperty.call(b2, k2) || !sameJson(a2[k2], b2[k2])) return false;
|
|
31474
|
+
}
|
|
31475
|
+
return true;
|
|
31476
|
+
}
|
|
31477
|
+
var resolveScalarStatic, Bound, BoundList, readsService, BoundRow;
|
|
31428
31478
|
var init_bindings2 = __esm({
|
|
31429
31479
|
"../../core/web-renderer/src/bindings.tsx"() {
|
|
31430
31480
|
"use strict";
|
|
@@ -31451,12 +31501,18 @@ var init_bindings2 = __esm({
|
|
|
31451
31501
|
const arr2 = local ? ctx.itemScope?.[itemsPath.slice("$item.".length)] : bound2;
|
|
31452
31502
|
const items = Array.isArray(arr2) ? arr2 : [];
|
|
31453
31503
|
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
31504
|
const key3 = item?.id ?? i2;
|
|
31457
|
-
return /* @__PURE__ */ jsx3(
|
|
31505
|
+
return /* @__PURE__ */ jsx3(BoundRow, { ctx, template, item, index: i2, renderRow }, String(key3));
|
|
31458
31506
|
}) });
|
|
31459
31507
|
};
|
|
31508
|
+
readsService = /* @__PURE__ */ new WeakMap();
|
|
31509
|
+
BoundRow = React2.memo(
|
|
31510
|
+
({ ctx, template, item, index, renderRow }) => {
|
|
31511
|
+
const scope2 = item && typeof item === "object" ? { ...item, __index: index } : { value: item, __index: index };
|
|
31512
|
+
return /* @__PURE__ */ jsx3(Fragment, { children: renderRow(template, { ...ctx, itemScope: scope2 }) });
|
|
31513
|
+
},
|
|
31514
|
+
(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)
|
|
31515
|
+
);
|
|
31460
31516
|
}
|
|
31461
31517
|
});
|
|
31462
31518
|
|
|
@@ -33713,17 +33769,17 @@ var init_controls = __esm({
|
|
|
33713
33769
|
if (ni2 !== selIdx) select2(ni2);
|
|
33714
33770
|
};
|
|
33715
33771
|
const pagerRef = React7.useRef(null);
|
|
33716
|
-
const
|
|
33772
|
+
const settle2 = React7.useRef(void 0);
|
|
33717
33773
|
React7.useEffect(() => {
|
|
33718
33774
|
const el2 = pagerRef.current;
|
|
33719
33775
|
if (!el2 || !el2.clientWidth) return;
|
|
33720
33776
|
const x2 = selIdx * el2.clientWidth;
|
|
33721
33777
|
if (Math.abs(el2.scrollLeft - x2) > 1) el2.scrollTo?.({ left: x2, behavior: "smooth" });
|
|
33722
33778
|
}, [selIdx, pages2]);
|
|
33723
|
-
React7.useEffect(() => () => clearTimeout(
|
|
33779
|
+
React7.useEffect(() => () => clearTimeout(settle2.current), []);
|
|
33724
33780
|
const onPagerScroll = () => {
|
|
33725
|
-
clearTimeout(
|
|
33726
|
-
|
|
33781
|
+
clearTimeout(settle2.current);
|
|
33782
|
+
settle2.current = setTimeout(() => {
|
|
33727
33783
|
const el2 = pagerRef.current;
|
|
33728
33784
|
if (!el2 || !el2.clientWidth) return;
|
|
33729
33785
|
const i2 = Math.round(el2.scrollLeft / el2.clientWidth);
|
|
@@ -35124,7 +35180,7 @@ function Block({ b: b2, env, depth }) {
|
|
|
35124
35180
|
case "button":
|
|
35125
35181
|
return /* @__PURE__ */ jsx9(LinkButton, { label: b2.label, url: b2.url, env, testId: `${env.componentId}/${b2.id}` });
|
|
35126
35182
|
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((
|
|
35183
|
+
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
35184
|
case "card": {
|
|
35129
35185
|
const title = richContentCardTitle(b2);
|
|
35130
35186
|
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 +41749,10 @@ var init_pdf = __esm({
|
|
|
41693
41749
|
var $DOMException = function DOMException() {
|
|
41694
41750
|
anInstance(this, DOMExceptionPrototype);
|
|
41695
41751
|
var argumentsLength = arguments.length;
|
|
41696
|
-
var
|
|
41752
|
+
var message2 = normalizeStringArgument(argumentsLength < 1 ? void 0 : arguments[0]);
|
|
41697
41753
|
var name = normalizeStringArgument(argumentsLength < 2 ? void 0 : arguments[1], "Error");
|
|
41698
|
-
var that = new NativeDOMException(
|
|
41699
|
-
var error = new Error2(
|
|
41754
|
+
var that = new NativeDOMException(message2, name);
|
|
41755
|
+
var error = new Error2(message2);
|
|
41700
41756
|
error.name = DOM_EXCEPTION;
|
|
41701
41757
|
defineProperty(that, "stack", createPropertyDescriptor(1, clearErrorStack(error.stack, 1)));
|
|
41702
41758
|
inheritIfRequired(that, this, $DOMException);
|
|
@@ -42024,8 +42080,8 @@ var init_pdf = __esm({
|
|
|
42024
42080
|
};
|
|
42025
42081
|
verbosity = VerbosityLevel.WARNINGS;
|
|
42026
42082
|
BaseException = (function BaseExceptionClosure() {
|
|
42027
|
-
function BaseException2(
|
|
42028
|
-
this.message =
|
|
42083
|
+
function BaseException2(message2, name) {
|
|
42084
|
+
this.message = message2;
|
|
42029
42085
|
this.name = name;
|
|
42030
42086
|
}
|
|
42031
42087
|
BaseException2.prototype = new Error();
|
|
@@ -116575,9 +116631,9 @@ function ensurePressStyles() {
|
|
|
116575
116631
|
}
|
|
116576
116632
|
function idiomPressRules() {
|
|
116577
116633
|
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:${
|
|
116634
|
+
for (const [name, row2] of Object.entries(IDIOM_CONTROLS)) {
|
|
116635
|
+
const layer = `color-mix(in srgb,currentColor ${Math.round(row2.press.stateLayerOpacity * 100)}%,transparent)`;
|
|
116636
|
+
css += `[data-himalaya-idiom-press="${name}-highlight"]:active{opacity:${row2.press.highlightOpacity}!important}`;
|
|
116581
116637
|
css += `[data-himalaya-idiom-press="${name}-ripple"]:active{background-image:linear-gradient(${layer},${layer})!important}`;
|
|
116582
116638
|
}
|
|
116583
116639
|
return css;
|
|
@@ -117037,7 +117093,7 @@ function lottieRuntime(lib) {
|
|
|
117037
117093
|
} catch {
|
|
117038
117094
|
}
|
|
117039
117095
|
};
|
|
117040
|
-
const
|
|
117096
|
+
const settle2 = (el2) => {
|
|
117041
117097
|
const anim = lottieAnims.get(el2);
|
|
117042
117098
|
const host = el2;
|
|
117043
117099
|
const played = host.dataset.himalayaLottiePlayed;
|
|
@@ -117106,7 +117162,7 @@ function lottieRuntime(lib) {
|
|
|
117106
117162
|
const stamp = host.getAttribute("data-himalaya-lottie-play");
|
|
117107
117163
|
if (!anim) return;
|
|
117108
117164
|
if (!stamp) {
|
|
117109
|
-
|
|
117165
|
+
settle2(el2);
|
|
117110
117166
|
return;
|
|
117111
117167
|
}
|
|
117112
117168
|
if (host.dataset.himalayaLottiePlayed === stamp) return;
|
|
@@ -117123,7 +117179,7 @@ function lottieRuntime(lib) {
|
|
|
117123
117179
|
if (r3.type !== "attributes" || !(r3.target instanceof Element)) continue;
|
|
117124
117180
|
if (r3.attributeName === "data-himalaya-lottie") remount(r3.target);
|
|
117125
117181
|
else if (r3.attributeName === "data-himalaya-lottie-reduce") applyReduce(r3.target);
|
|
117126
|
-
else if (r3.attributeName === "data-himalaya-lottie-gen")
|
|
117182
|
+
else if (r3.attributeName === "data-himalaya-lottie-gen") settle2(r3.target);
|
|
117127
117183
|
else if (r3.attributeName === "data-himalaya-lottie-loop") applyLoop(r3.target);
|
|
117128
117184
|
else replay(r3.target);
|
|
117129
117185
|
}
|
|
@@ -118082,10 +118138,10 @@ function tableColumns(raw) {
|
|
|
118082
118138
|
};
|
|
118083
118139
|
});
|
|
118084
118140
|
}
|
|
118085
|
-
function dataTableCells(
|
|
118086
|
-
if (
|
|
118087
|
-
if (Array.isArray(
|
|
118088
|
-
const o2 =
|
|
118141
|
+
function dataTableCells(row2, columns) {
|
|
118142
|
+
if (row2 == null) return columns.map(() => "");
|
|
118143
|
+
if (Array.isArray(row2)) return columns.map((_2, i2) => row2[i2] == null ? "" : String(row2[i2]));
|
|
118144
|
+
const o2 = row2;
|
|
118089
118145
|
if (Array.isArray(o2.cells)) return columns.map((_2, i2) => o2.cells[i2] == null ? "" : String(o2.cells[i2]));
|
|
118090
118146
|
return columns.map((c2) => c2.key && o2[c2.key] != null ? String(o2[c2.key]) : "");
|
|
118091
118147
|
}
|
|
@@ -119116,11 +119172,11 @@ function renderInner(node, ctx) {
|
|
|
119116
119172
|
itemsPath,
|
|
119117
119173
|
template: items[0],
|
|
119118
119174
|
renderRow: (t2, ic) => {
|
|
119119
|
-
let
|
|
119120
|
-
if (boundStagger > 0 && React12.isValidElement(
|
|
119175
|
+
let row2 = renderNode(t2, asItem(ic));
|
|
119176
|
+
if (boundStagger > 0 && React12.isValidElement(row2)) {
|
|
119121
119177
|
const i2 = Number(ic.itemScope?.__index ?? 0);
|
|
119122
|
-
const prev =
|
|
119123
|
-
|
|
119178
|
+
const prev = row2.props.style ?? {};
|
|
119179
|
+
row2 = React12.cloneElement(row2, { style: { ...prev, animationDelay: `${i2 * boundStagger}ms` } });
|
|
119124
119180
|
}
|
|
119125
119181
|
if (boundSwipe && ctx.onAction && !props.horizontal) {
|
|
119126
119182
|
const leading = resolveSwipeActions(boundSwipe.leading, ic);
|
|
@@ -119136,12 +119192,12 @@ function renderInner(node, ctx) {
|
|
|
119136
119192
|
accent: C2("accentPrimary", "#116DFF"),
|
|
119137
119193
|
fg: C2("textPrimary", "#13171e"),
|
|
119138
119194
|
fontFamily: bodyFont(ctx),
|
|
119139
|
-
children:
|
|
119195
|
+
children: row2
|
|
119140
119196
|
}
|
|
119141
119197
|
);
|
|
119142
119198
|
}
|
|
119143
119199
|
}
|
|
119144
|
-
return
|
|
119200
|
+
return row2;
|
|
119145
119201
|
}
|
|
119146
119202
|
}
|
|
119147
119203
|
);
|
|
@@ -120534,9 +120590,9 @@ var init_renderNode = __esm({
|
|
|
120534
120590
|
const rawMessage = errorMessageFor({ rule: effectiveRule, value: local, workerError, catalog: validationCatalog });
|
|
120535
120591
|
const hasWorkerError = Boolean(workerError && workerError.trim());
|
|
120536
120592
|
const painted2 = rawMessage === null ? "" : translateOnly(rawMessage);
|
|
120537
|
-
const
|
|
120593
|
+
const message2 = !painted2.trim() || ruleMessagePending && !hasWorkerError ? null : painted2;
|
|
120538
120594
|
const [feedbackShown, setFeedbackShown] = React12.useState(false);
|
|
120539
|
-
const revealed =
|
|
120595
|
+
const revealed = message2 !== null && shouldRevealError({
|
|
120540
120596
|
rule,
|
|
120541
120597
|
feedbackShown,
|
|
120542
120598
|
hasWorkerError,
|
|
@@ -120687,7 +120743,7 @@ var init_renderNode = __esm({
|
|
|
120687
120743
|
),
|
|
120688
120744
|
props.trailingIcon && accIcon(props.trailingIcon)
|
|
120689
120745
|
] }),
|
|
120690
|
-
revealed ? /* @__PURE__ */ jsx11("span", { id: errorId, role: "alert", style: { fontFamily: bodyFont(ctx), fontSize: pxToRem(12), color: C2("danger", "#E62214"), paddingLeft: 2 }, children:
|
|
120746
|
+
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
120747
|
] });
|
|
120692
120748
|
};
|
|
120693
120749
|
MENU_ANCHOR_CONTROL = 'a[href], button, input, select, textarea, [tabindex]:not([tabindex="-1"]), [role="button"], [role="link"]';
|
|
@@ -121225,10 +121281,10 @@ var init_renderNode = __esm({
|
|
|
121225
121281
|
setStatus("playing");
|
|
121226
121282
|
setError("");
|
|
121227
121283
|
} catch (cause) {
|
|
121228
|
-
const
|
|
121284
|
+
const message2 = cause instanceof Error ? cause.message : "Autoplay blocked";
|
|
121229
121285
|
setStatus("blocked");
|
|
121230
|
-
setError(
|
|
121231
|
-
emit(props.onError, { state: "blocked", status: "blocked", error:
|
|
121286
|
+
setError(message2);
|
|
121287
|
+
emit(props.onError, { state: "blocked", status: "blocked", error: message2, code: "playback_blocked" });
|
|
121232
121288
|
}
|
|
121233
121289
|
}, [isYouTube, isUnsupportedProvider, emit, props.onError]);
|
|
121234
121290
|
const pause = React12.useCallback(() => {
|
|
@@ -121478,10 +121534,10 @@ var init_renderNode = __esm({
|
|
|
121478
121534
|
emit(props.onEnd, { state: "ended", status: "ended" });
|
|
121479
121535
|
},
|
|
121480
121536
|
onError: () => {
|
|
121481
|
-
const
|
|
121537
|
+
const message2 = "Unable to play this media source";
|
|
121482
121538
|
setStatus("error");
|
|
121483
|
-
setError(
|
|
121484
|
-
emit(props.onError, { state: "error", status: "error", error:
|
|
121539
|
+
setError(message2);
|
|
121540
|
+
emit(props.onError, { state: "error", status: "error", error: message2, code: "source_error" });
|
|
121485
121541
|
}
|
|
121486
121542
|
};
|
|
121487
121543
|
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 +121607,7 @@ var init_renderNode = __esm({
|
|
|
121551
121607
|
if (!retypeSrc) return;
|
|
121552
121608
|
let live3 = true;
|
|
121553
121609
|
let made = null;
|
|
121554
|
-
const
|
|
121610
|
+
const settle2 = (r3) => {
|
|
121555
121611
|
const u2 = r3?.url ?? null;
|
|
121556
121612
|
made = u2;
|
|
121557
121613
|
if (!live3) {
|
|
@@ -121560,7 +121616,7 @@ var init_renderNode = __esm({
|
|
|
121560
121616
|
}
|
|
121561
121617
|
setRetyped({ from: retypeSrc, url: u2, pageCount: r3?.pageCount ?? null });
|
|
121562
121618
|
};
|
|
121563
|
-
loadPdfFetch().then((m2) => m2.retypeAsPdfCounted(retypeSrc)).then(
|
|
121619
|
+
loadPdfFetch().then((m2) => m2.retypeAsPdfCounted(retypeSrc)).then(settle2, () => settle2(null));
|
|
121564
121620
|
return () => {
|
|
121565
121621
|
live3 = false;
|
|
121566
121622
|
if (made) URL.revokeObjectURL(made);
|
|
@@ -124475,7 +124531,7 @@ var init_renderNode = __esm({
|
|
|
124475
124531
|
const selectedId = isBinding(props.selectedId) ? boundSel : props.selectedId;
|
|
124476
124532
|
const selIdx = Math.max(0, opts.findIndex((o2) => o2?.id === selectedId));
|
|
124477
124533
|
const viewport = React12.useRef(null);
|
|
124478
|
-
const
|
|
124534
|
+
const settle2 = React12.useRef(void 0);
|
|
124479
124535
|
const pickerId = React12.useId();
|
|
124480
124536
|
const interactive = !!ctx.onAction && !!props.onChange;
|
|
124481
124537
|
const emit = (index) => {
|
|
@@ -124486,7 +124542,7 @@ var init_renderNode = __esm({
|
|
|
124486
124542
|
React12.useEffect(() => {
|
|
124487
124543
|
if (viewport.current) viewport.current.scrollTop = selIdx * 32;
|
|
124488
124544
|
}, [selIdx, opts.length]);
|
|
124489
|
-
React12.useEffect(() => () => clearTimeout(
|
|
124545
|
+
React12.useEffect(() => () => clearTimeout(settle2.current), []);
|
|
124490
124546
|
return /* @__PURE__ */ jsxs8("div", { style: { position: "relative", width: "100%", maxWidth: 220, height: 160, overflow: "hidden", background: C2("surfaceSecondary", "#f5f7fa"), borderRadius: 12, ...wrap }, children: [
|
|
124491
124547
|
/* @__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
124548
|
/* @__PURE__ */ jsx11(
|
|
@@ -124506,8 +124562,8 @@ var init_renderNode = __esm({
|
|
|
124506
124562
|
}
|
|
124507
124563
|
},
|
|
124508
124564
|
onScroll: () => {
|
|
124509
|
-
clearTimeout(
|
|
124510
|
-
|
|
124565
|
+
clearTimeout(settle2.current);
|
|
124566
|
+
settle2.current = setTimeout(() => emit(Math.max(0, Math.min(opts.length - 1, Math.round((viewport.current?.scrollTop ?? 0) / 32)))), 120);
|
|
124511
124567
|
},
|
|
124512
124568
|
style: { position: "relative", height: "100%", overflowY: "auto", scrollbarWidth: "none", scrollSnapType: "y mandatory", padding: "64px 0", boxSizing: "border-box" },
|
|
124513
124569
|
children: opts.map((o2, index) => /* @__PURE__ */ jsx11(
|
|
@@ -125289,7 +125345,7 @@ var init_renderNode = __esm({
|
|
|
125289
125345
|
] }),
|
|
125290
125346
|
/* @__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
125347
|
/* @__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
|
-
(
|
|
125348
|
+
(row2, ri2) => row2.map((cell2, ci2) => {
|
|
125293
125349
|
if (!cell2.inMonth && !showAdjacent) return /* @__PURE__ */ jsx11("div", { "aria-hidden": "true" }, `${ri2}-${ci2}`);
|
|
125294
125350
|
const dec = decByDate.get(cell2.date);
|
|
125295
125351
|
const disabled = dec?.disabled === true || !calWithinWindow(cell2.date, minDate, maxDate);
|
|
@@ -126347,8 +126403,8 @@ async function pngPageHtml(item) {
|
|
|
126347
126403
|
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
126404
|
}
|
|
126349
126405
|
function isMissingPlaywrightExecutable(error) {
|
|
126350
|
-
const
|
|
126351
|
-
return /Executable doesn't exist at/.test(
|
|
126406
|
+
const message2 = error?.message ?? "";
|
|
126407
|
+
return /Executable doesn't exist at/.test(message2) && /playwright install/.test(message2);
|
|
126352
126408
|
}
|
|
126353
126409
|
async function pngAvailable() {
|
|
126354
126410
|
let chromium;
|
|
@@ -127741,11 +127797,11 @@ function deepMerge3(base, patch) {
|
|
|
127741
127797
|
return out2;
|
|
127742
127798
|
}
|
|
127743
127799
|
function recordOverrideHistory(state, screenId, op, descriptor, notes) {
|
|
127744
|
-
const
|
|
127800
|
+
const row2 = { id: ++overrideHistorySeq, op, descriptor, notes, updatedAt: Math.floor(Date.now() / 1e3) };
|
|
127745
127801
|
const list2 = state.localOverrideHistory.get(screenId) ?? [];
|
|
127746
|
-
list2.unshift(
|
|
127802
|
+
list2.unshift(row2);
|
|
127747
127803
|
state.localOverrideHistory.set(screenId, list2);
|
|
127748
|
-
return
|
|
127804
|
+
return row2;
|
|
127749
127805
|
}
|
|
127750
127806
|
function send(res, status, body, headers2 = {}) {
|
|
127751
127807
|
res.statusCode = status;
|
|
@@ -128167,21 +128223,21 @@ async function handleOrionChatRequest(req, res) {
|
|
|
128167
128223
|
const { detectAgentHire, sendOrionChatMessage, extractAgentFromReply, localMaestroReply } = await import("./apps/orion-clone-live.js");
|
|
128168
128224
|
let body = "";
|
|
128169
128225
|
for await (const chunk of req) body += chunk;
|
|
128170
|
-
let
|
|
128226
|
+
let message2 = "";
|
|
128171
128227
|
let conversationId;
|
|
128172
128228
|
let attachment;
|
|
128173
128229
|
try {
|
|
128174
128230
|
const j2 = JSON.parse(body || "{}");
|
|
128175
|
-
|
|
128231
|
+
message2 = String(j2.message ?? "");
|
|
128176
128232
|
conversationId = j2.conversationId ? String(j2.conversationId) : void 0;
|
|
128177
128233
|
if (j2.attachment && typeof j2.attachment.dataUri === "string" && j2.attachment.dataUri) {
|
|
128178
128234
|
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
128235
|
}
|
|
128180
128236
|
} catch {
|
|
128181
128237
|
}
|
|
128182
|
-
if (!
|
|
128183
|
-
const hireIntent = detectAgentHire(
|
|
128184
|
-
const result = await sendOrionChatMessage(
|
|
128238
|
+
if (!message2.trim()) return sendJson(res, 400, { error: "message_required" }, cors);
|
|
128239
|
+
const hireIntent = detectAgentHire(message2);
|
|
128240
|
+
const result = await sendOrionChatMessage(message2, conversationId, attachment);
|
|
128185
128241
|
let agentCard;
|
|
128186
128242
|
let hireReply;
|
|
128187
128243
|
if (hireIntent) {
|
|
@@ -128194,7 +128250,7 @@ async function handleOrionChatRequest(req, res) {
|
|
|
128194
128250
|
}
|
|
128195
128251
|
}
|
|
128196
128252
|
if (!result || !result.reply || !result.reply.trim()) {
|
|
128197
|
-
const reply = hireReply ?? localMaestroReply(
|
|
128253
|
+
const reply = hireReply ?? localMaestroReply(message2);
|
|
128198
128254
|
return sendJson(res, 200, { conversationId: result?.conversationId ?? conversationId ?? "local-dev", reply, ...agentCard ? { agentCard } : {} }, { ...cors, "cache-control": "no-store" });
|
|
128199
128255
|
}
|
|
128200
128256
|
return sendJson(res, 200, { ...result, reply: hireReply ?? result.reply, ...agentCard ? { agentCard } : {} }, { ...cors, "cache-control": "no-store" });
|
|
@@ -128210,11 +128266,11 @@ async function handleOrionConversationRequest(req, res) {
|
|
|
128210
128266
|
async function handleOrionChatStreamRequest(req, res) {
|
|
128211
128267
|
let body = "";
|
|
128212
128268
|
for await (const chunk of req) body += chunk;
|
|
128213
|
-
let
|
|
128269
|
+
let message2 = "";
|
|
128214
128270
|
let conversationId;
|
|
128215
128271
|
try {
|
|
128216
128272
|
const j2 = JSON.parse(body || "{}");
|
|
128217
|
-
|
|
128273
|
+
message2 = String(j2.message ?? "");
|
|
128218
128274
|
conversationId = j2.conversationId ? String(j2.conversationId) : void 0;
|
|
128219
128275
|
} catch {
|
|
128220
128276
|
}
|
|
@@ -128225,7 +128281,7 @@ async function handleOrionChatStreamRequest(req, res) {
|
|
|
128225
128281
|
"access-control-allow-origin": "*"
|
|
128226
128282
|
});
|
|
128227
128283
|
const { openOrionChatStream } = await import("./apps/orion-clone-live.js");
|
|
128228
|
-
await openOrionChatStream(
|
|
128284
|
+
await openOrionChatStream(message2, conversationId, (sse) => {
|
|
128229
128285
|
try {
|
|
128230
128286
|
res.write(sse);
|
|
128231
128287
|
} catch {
|
|
@@ -129463,9 +129519,9 @@ async function handleWebWix(req, res, state) {
|
|
|
129463
129519
|
record2("proxy", r3.status, r3.body);
|
|
129464
129520
|
return reply(200, { status: r3.status, body: r3.body });
|
|
129465
129521
|
} catch (e2) {
|
|
129466
|
-
const
|
|
129467
|
-
record2("proxy", 0,
|
|
129468
|
-
return reply(200, { status: 0, body:
|
|
129522
|
+
const message2 = JSON.stringify({ error: String(e2?.message ?? e2) });
|
|
129523
|
+
record2("proxy", 0, message2);
|
|
129524
|
+
return reply(200, { status: 0, body: message2 });
|
|
129469
129525
|
}
|
|
129470
129526
|
}
|
|
129471
129527
|
if (path2 === "/v1/__webwix/logout" && req.method === "POST") {
|
|
@@ -129856,9 +129912,9 @@ async function handleDev(req, res, state) {
|
|
|
129856
129912
|
state.serverCache.clear();
|
|
129857
129913
|
return sendJson(res, 200, { status: "ok", bundle: name });
|
|
129858
129914
|
} catch (err) {
|
|
129859
|
-
const
|
|
129860
|
-
const status = /unknown bundle source/.test(
|
|
129861
|
-
return sendJson(res, status, { error: "rebuild_failed", bundle: name, message });
|
|
129915
|
+
const message2 = err.message;
|
|
129916
|
+
const status = /unknown bundle source/.test(message2) ? 404 : 500;
|
|
129917
|
+
return sendJson(res, status, { error: "rebuild_failed", bundle: name, message: message2 });
|
|
129862
129918
|
}
|
|
129863
129919
|
}
|
|
129864
129920
|
if (url === "/__dev/actions/log") {
|
|
@@ -130021,14 +130077,14 @@ async function handleAdminPlayground(req, res, state) {
|
|
|
130021
130077
|
if (revertMatch && req.method === "POST") {
|
|
130022
130078
|
const screenId = decodeURIComponent(revertMatch[1]);
|
|
130023
130079
|
const historyId = Number(new URLSearchParams(url.split("?")[1] ?? "").get("historyId"));
|
|
130024
|
-
const
|
|
130025
|
-
if (!
|
|
130026
|
-
if (
|
|
130080
|
+
const row2 = (state.localOverrideHistory.get(screenId) ?? []).find((r3) => r3.id === historyId);
|
|
130081
|
+
if (!row2) return sendJson(res, 404, { error: "history_row_not_found", screenId, historyId });
|
|
130082
|
+
if (row2.op === "delete" || row2.descriptor == null) {
|
|
130027
130083
|
state.localOverrides.delete(screenId);
|
|
130028
130084
|
recordOverrideHistory(state, screenId, "revert", null, `revert to #${historyId} (deleted)`);
|
|
130029
130085
|
} else {
|
|
130030
|
-
state.localOverrides.set(screenId,
|
|
130031
|
-
recordOverrideHistory(state, screenId, "revert",
|
|
130086
|
+
state.localOverrides.set(screenId, row2.descriptor);
|
|
130087
|
+
recordOverrideHistory(state, screenId, "revert", row2.descriptor, `revert to #${historyId}`);
|
|
130032
130088
|
}
|
|
130033
130089
|
invalidate(state, screenId);
|
|
130034
130090
|
return sendJson(res, 200, { status: "ok", screenId, revertedTo: historyId });
|
|
@@ -133124,8 +133180,8 @@ function emptiedBase44(data) {
|
|
|
133124
133180
|
const drain = (m2) => Object.fromEntries(Object.keys(m2).map((k2) => [k2, []]));
|
|
133125
133181
|
return { seed: drain(data.seed), sample: drain(data.sample) };
|
|
133126
133182
|
}
|
|
133127
|
-
function fail3(status, code,
|
|
133128
|
-
return { ok: false, error: { status, code, message } };
|
|
133183
|
+
function fail3(status, code, message2) {
|
|
133184
|
+
return { ok: false, error: { status, code, message: message2 } };
|
|
133129
133185
|
}
|
|
133130
133186
|
function parseObject2(raw) {
|
|
133131
133187
|
if (raw && typeof raw === "object" && !Array.isArray(raw)) return raw;
|
|
@@ -133215,11 +133271,11 @@ function compareScalar(a2, b2) {
|
|
|
133215
133271
|
function scalarEqual(a2, b2) {
|
|
133216
133272
|
return isScalar(a2) && isScalar(b2) && a2 === b2;
|
|
133217
133273
|
}
|
|
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 =
|
|
133274
|
+
function evalCondition(row2, c2) {
|
|
133275
|
+
if ("and" in c2) return c2.and.every((s2) => evalCondition(row2, s2));
|
|
133276
|
+
if ("or" in c2) return c2.or.some((s2) => evalCondition(row2, s2));
|
|
133277
|
+
if ("not" in c2) return !evalCondition(row2, c2.not);
|
|
133278
|
+
const rv = row2[c2.field];
|
|
133223
133279
|
switch (c2.op) {
|
|
133224
133280
|
case "eq":
|
|
133225
133281
|
return scalarEqual(rv, c2.value);
|
|
@@ -133367,26 +133423,26 @@ function seedTokens(state, limit = 48) {
|
|
|
133367
133423
|
}
|
|
133368
133424
|
function synthesizeInput(control, resolve83, tokens2) {
|
|
133369
133425
|
const id = `${control.type}.${control.callback}`;
|
|
133370
|
-
const
|
|
133371
|
-
if (!
|
|
133426
|
+
const row2 = SYNTHESIZED_CONTROLS[id];
|
|
133427
|
+
if (!row2) return null;
|
|
133372
133428
|
const props = control.props;
|
|
133373
133429
|
if (hasRowBinding(props)) return null;
|
|
133374
|
-
if (
|
|
133430
|
+
if (row2.from === "declared-options") {
|
|
133375
133431
|
const ids = declaredOptionIds(props, resolve83);
|
|
133376
133432
|
if (!ids.length) return null;
|
|
133377
|
-
if (
|
|
133433
|
+
if (row2.encoding === "string-array") {
|
|
133378
133434
|
const currentRaw2 = resolved(props.selectedIds, resolve83);
|
|
133379
133435
|
const current3 = (Array.isArray(currentRaw2) ? currentRaw2 : []).filter((x2) => typeof x2 === "string");
|
|
133380
133436
|
const pick5 = ids.find((o2) => !current3.includes(o2));
|
|
133381
133437
|
if (pick5 === void 0) return null;
|
|
133382
133438
|
const value2 = props.multiSelect === true ? [...current3, pick5] : [pick5];
|
|
133383
|
-
return { key:
|
|
133439
|
+
return { key: row2.key, value: value2, from: row2.from, current: current3, control: id };
|
|
133384
133440
|
}
|
|
133385
133441
|
const currentRaw = resolved(props.selectedId, resolve83);
|
|
133386
133442
|
const current2 = typeof currentRaw === "string" ? currentRaw : void 0;
|
|
133387
133443
|
const pick4 = ids.find((o2) => o2 !== current2);
|
|
133388
133444
|
if (pick4 === void 0) return null;
|
|
133389
|
-
return { key:
|
|
133445
|
+
return { key: row2.key, value: pick4, from: row2.from, current: current2, control: id };
|
|
133390
133446
|
}
|
|
133391
133447
|
if (!acceptsWords(props) || !acceptsWords(control.wrapper ?? {})) return null;
|
|
133392
133448
|
const binding2 = typeof props.valuePath === "string" ? props.valuePath : typeof props.value === "string" && props.value.startsWith("$service:") ? props.value : void 0;
|
|
@@ -133396,7 +133452,7 @@ function synthesizeInput(control, resolve83, tokens2) {
|
|
|
133396
133452
|
const max = typeof props.maxLength === "number" && props.maxLength > 0 ? props.maxLength : void 0;
|
|
133397
133453
|
const pick3 = tokens2().find((t2) => t2 !== current && (max === void 0 || t2.length <= max));
|
|
133398
133454
|
if (pick3 === void 0) return null;
|
|
133399
|
-
return { key:
|
|
133455
|
+
return { key: row2.key, value: pick3, from: row2.from, current, control: id };
|
|
133400
133456
|
}
|
|
133401
133457
|
function acceptsWords(props) {
|
|
133402
133458
|
if (props.secure === true) return false;
|
|
@@ -133678,8 +133734,8 @@ function onAppearOf(payload) {
|
|
|
133678
133734
|
function rootOnAppear(descriptor) {
|
|
133679
133735
|
return onAppearOf(descriptor?.payload);
|
|
133680
133736
|
}
|
|
133681
|
-
function isTransportReject(
|
|
133682
|
-
return
|
|
133737
|
+
function isTransportReject(message2) {
|
|
133738
|
+
return message2 === REJECT_ALL_MESSAGE || message2.startsWith("no data layer served ");
|
|
133683
133739
|
}
|
|
133684
133740
|
function isUnservedRequest(e2) {
|
|
133685
133741
|
const m2 = e2 instanceof Error ? e2.message : typeof e2 === "string" ? e2 : "";
|
|
@@ -133895,11 +133951,11 @@ function localDatabaseAnswer(schema, store, queue, method, params) {
|
|
|
133895
133951
|
if (!obj5 || typeof obj5.id !== "string") {
|
|
133896
133952
|
throw new Error("local_database.upsert: object with string id required");
|
|
133897
133953
|
}
|
|
133898
|
-
const
|
|
133899
|
-
const at2 = rows.findIndex((r3) => r3.id ===
|
|
133954
|
+
const row2 = detached(obj5);
|
|
133955
|
+
const at2 = rows.findIndex((r3) => r3.id === row2.id);
|
|
133900
133956
|
const next = [...rows];
|
|
133901
|
-
if (at2 >= 0) next[at2] =
|
|
133902
|
-
else next.push(
|
|
133957
|
+
if (at2 >= 0) next[at2] = row2;
|
|
133958
|
+
else next.push(row2);
|
|
133903
133959
|
store.set(entity, next);
|
|
133904
133960
|
return {};
|
|
133905
133961
|
}
|
|
@@ -134478,13 +134534,13 @@ async function crawlScreen(opts) {
|
|
|
134478
134534
|
async function crawlScreenJourney(opts) {
|
|
134479
134535
|
return withSwallowedRejections(async () => {
|
|
134480
134536
|
const findings = [];
|
|
134481
|
-
const fail6 = (
|
|
134537
|
+
const fail6 = (message2, step) => {
|
|
134482
134538
|
findings.push({
|
|
134483
134539
|
screen: opts.screenId,
|
|
134484
134540
|
trigger: step ? { tap: step.component ?? null, key: "journey", action: step.action } : "boot",
|
|
134485
134541
|
invariant: "journey-failed",
|
|
134486
134542
|
severity: "error",
|
|
134487
|
-
message,
|
|
134543
|
+
message: message2,
|
|
134488
134544
|
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
134545
|
});
|
|
134490
134546
|
};
|
|
@@ -135405,11 +135461,11 @@ async function crawlScreenDeep(opts, deep) {
|
|
|
135405
135461
|
return { findings: dedupe(findings), nodesVisited: visited.size, dispatches, capped, ...effects.length ? { effects } : {} };
|
|
135406
135462
|
});
|
|
135407
135463
|
}
|
|
135408
|
-
function effectiveSiteForRow(site,
|
|
135464
|
+
function effectiveSiteForRow(site, row2) {
|
|
135409
135465
|
const merged = { ...site.params ?? {}, ...site.args ?? {} };
|
|
135410
135466
|
const substituted = {};
|
|
135411
135467
|
for (const [k2, v2] of Object.entries(merged)) {
|
|
135412
|
-
substituted[k2] = typeof v2 === "string" && v2.startsWith("$item.") ? pathValue(
|
|
135468
|
+
substituted[k2] = typeof v2 === "string" && v2.startsWith("$item.") ? pathValue(row2, v2.slice("$item.".length)) : v2 === "$item" ? row2 : v2;
|
|
135413
135469
|
}
|
|
135414
135470
|
return { ...site, params: substituted, args: void 0 };
|
|
135415
135471
|
}
|
|
@@ -135603,8 +135659,8 @@ async function crawlScreenRelations(opts) {
|
|
|
135603
135659
|
const undoIsRowBound = isRowBound(b2);
|
|
135604
135660
|
const after = await replay([a2, b2], (i2, bootState, prev) => {
|
|
135605
135661
|
if (i2 !== 1) return null;
|
|
135606
|
-
const
|
|
135607
|
-
if (
|
|
135662
|
+
const row2 = newlyAddedRow(bootState, prev, b2.itemsPath);
|
|
135663
|
+
if (row2) return row2;
|
|
135608
135664
|
return undoIsRowBound ? UNBINDABLE_ROW : null;
|
|
135609
135665
|
});
|
|
135610
135666
|
if (!after) continue;
|
|
@@ -135663,7 +135719,7 @@ var init_screen_crawl = __esm({
|
|
|
135663
135719
|
WIX_DATA_QUERY = /\/wix-data\/v2\/items\/query$/;
|
|
135664
135720
|
WIX_DATA_ANY = /\/wix-data\//;
|
|
135665
135721
|
CAPABILITY_ACTION = /^capability\.([a-z0-9_]+)\.([A-Za-z0-9_]+)$/;
|
|
135666
|
-
detached = (
|
|
135722
|
+
detached = (row2) => JSON.parse(JSON.stringify(row2));
|
|
135667
135723
|
CRAWL_CLOCK = Date.parse("2026-01-01T00:00:00.000Z");
|
|
135668
135724
|
MEMBER_IDENTITY_ACTION = /memberIdentity|member\.identity|currentMember/i;
|
|
135669
135725
|
BLANK_WHEN_BOUND = {
|
|
@@ -138424,7 +138480,7 @@ function penalty(m2, size) {
|
|
|
138424
138480
|
if (c2 === m2[y2][x2 + 1] && c2 === m2[y2 + 1][x2] && c2 === m2[y2 + 1][x2 + 1]) score += 3;
|
|
138425
138481
|
}
|
|
138426
138482
|
let dark = 0;
|
|
138427
|
-
for (const
|
|
138483
|
+
for (const row2 of m2) for (const c2 of row2) if (c2) dark++;
|
|
138428
138484
|
const total = size * size;
|
|
138429
138485
|
score += Math.floor(Math.abs(dark * 20 - total * 10) / total) * 10;
|
|
138430
138486
|
return score;
|
|
@@ -138497,7 +138553,7 @@ function encodeQr(text11) {
|
|
|
138497
138553
|
}
|
|
138498
138554
|
let best = null, bestMask = 0, bestScore = Infinity;
|
|
138499
138555
|
for (let mask = 0; mask < 8; mask++) {
|
|
138500
|
-
const cand = modules.map((
|
|
138556
|
+
const cand = modules.map((row2) => [...row2]);
|
|
138501
138557
|
for (let y2 = 0; y2 < size; y2++)
|
|
138502
138558
|
for (let x2 = 0; x2 < size; x2++) if (!reserved[y2][x2] && MASKS[mask](x2, y2)) cand[y2][x2] = !cand[y2][x2];
|
|
138503
138559
|
applyFormat(cand, size, mask);
|
|
@@ -139109,7 +139165,7 @@ function lanOf(value2) {
|
|
|
139109
139165
|
return null;
|
|
139110
139166
|
}
|
|
139111
139167
|
try {
|
|
139112
|
-
return { url, qr: encodeQr(url).modules.map((
|
|
139168
|
+
return { url, qr: encodeQr(url).modules.map((row2) => row2.map((m2) => m2 ? "1" : "0").join("")) };
|
|
139113
139169
|
} catch {
|
|
139114
139170
|
return { url, qr: null };
|
|
139115
139171
|
}
|
|
@@ -140620,11 +140676,11 @@ function validateAmpersand(xmlData, i2) {
|
|
|
140620
140676
|
}
|
|
140621
140677
|
return i2;
|
|
140622
140678
|
}
|
|
140623
|
-
function getErrorObject(code,
|
|
140679
|
+
function getErrorObject(code, message2, lineNumber) {
|
|
140624
140680
|
return {
|
|
140625
140681
|
err: {
|
|
140626
140682
|
code,
|
|
140627
|
-
msg:
|
|
140683
|
+
msg: message2,
|
|
140628
140684
|
line: lineNumber.line || lineNumber,
|
|
140629
140685
|
col: lineNumber.col
|
|
140630
140686
|
}
|
|
@@ -147832,6 +147888,7 @@ var init_home_descriptor = __esm({
|
|
|
147832
147888
|
var template_trim_exports = {};
|
|
147833
147889
|
__export(template_trim_exports, {
|
|
147834
147890
|
TrimRefusal: () => TrimRefusal,
|
|
147891
|
+
bundlesOf: () => bundlesOf,
|
|
147835
147892
|
comparable: () => comparable,
|
|
147836
147893
|
compareErrors: () => compareErrors,
|
|
147837
147894
|
leftoverNavRefs: () => leftoverNavRefs,
|
|
@@ -148058,8 +148115,8 @@ function rowTemplateTarget(entry, removed) {
|
|
|
148058
148115
|
if (!isNode3(entry)) return void 0;
|
|
148059
148116
|
const props = entry.body.props;
|
|
148060
148117
|
if (!props?.itemsPath || !Array.isArray(props.items)) return void 0;
|
|
148061
|
-
for (const
|
|
148062
|
-
const to2 = tapTarget(
|
|
148118
|
+
for (const row2 of props.items) {
|
|
148119
|
+
const to2 = tapTarget(row2);
|
|
148063
148120
|
if (to2 && removed(to2)) return to2;
|
|
148064
148121
|
}
|
|
148065
148122
|
return void 0;
|
|
@@ -148713,17 +148770,17 @@ async function runTemplateTrim(req, deps) {
|
|
|
148713
148770
|
validate: validate6 ? { counts: validate6.counts ?? null, ...validate6.tail ? { tail: validate6.tail } : {} } : null
|
|
148714
148771
|
});
|
|
148715
148772
|
const abort = (error, cause, validate6) => {
|
|
148716
|
-
const
|
|
148773
|
+
const message2 = cause?.message ?? String(cause);
|
|
148717
148774
|
try {
|
|
148718
148775
|
restore();
|
|
148719
148776
|
} catch (e2) {
|
|
148720
148777
|
return {
|
|
148721
148778
|
code: 1,
|
|
148722
|
-
result: { ok: false, error: `${error} (${
|
|
148779
|
+
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
148780
|
};
|
|
148724
148781
|
}
|
|
148725
148782
|
dropBackup();
|
|
148726
|
-
return { code: 1, result: { ok: false, error: `${error} (${
|
|
148783
|
+
return { code: 1, result: { ok: false, error: `${error} (${message2}); every file was restored`, rolledBack: true, ...base(validate6) } };
|
|
148727
148784
|
};
|
|
148728
148785
|
try {
|
|
148729
148786
|
mkdirSync20(join34(backup, "dev"), { recursive: true });
|
|
@@ -148855,8 +148912,8 @@ var init_template_trim = __esm({
|
|
|
148855
148912
|
init_home_descriptor();
|
|
148856
148913
|
TrimRefusal = class extends Error {
|
|
148857
148914
|
detail;
|
|
148858
|
-
constructor(
|
|
148859
|
-
super(
|
|
148915
|
+
constructor(message2, detail = {}) {
|
|
148916
|
+
super(message2);
|
|
148860
148917
|
this.detail = detail;
|
|
148861
148918
|
}
|
|
148862
148919
|
};
|
|
@@ -148887,6 +148944,129 @@ var init_template_trim = __esm({
|
|
|
148887
148944
|
}
|
|
148888
148945
|
});
|
|
148889
148946
|
|
|
148947
|
+
// src/template-evaluate.ts
|
|
148948
|
+
var template_evaluate_exports = {};
|
|
148949
|
+
__export(template_evaluate_exports, {
|
|
148950
|
+
evaluatedView: () => evaluatedView,
|
|
148951
|
+
templatedLabel: () => templatedLabel
|
|
148952
|
+
});
|
|
148953
|
+
async function settle(work, what) {
|
|
148954
|
+
let timer;
|
|
148955
|
+
try {
|
|
148956
|
+
return await Promise.race([
|
|
148957
|
+
Promise.resolve().then(work),
|
|
148958
|
+
new Promise((_2, reject) => {
|
|
148959
|
+
timer = setTimeout(() => reject(new Error(`${what} did not finish within ${BUILD_TIMEOUT_MS / 1e3}s`)), BUILD_TIMEOUT_MS);
|
|
148960
|
+
})
|
|
148961
|
+
]);
|
|
148962
|
+
} finally {
|
|
148963
|
+
clearTimeout(timer);
|
|
148964
|
+
}
|
|
148965
|
+
}
|
|
148966
|
+
function captureCount(pattern) {
|
|
148967
|
+
try {
|
|
148968
|
+
return (new RegExp(`${pattern.source}|`).exec("")?.length ?? 1) - 1;
|
|
148969
|
+
} catch {
|
|
148970
|
+
return 1;
|
|
148971
|
+
}
|
|
148972
|
+
}
|
|
148973
|
+
function buildContext(module, name) {
|
|
148974
|
+
let store = {};
|
|
148975
|
+
try {
|
|
148976
|
+
store = module.createStore?.(name) ?? {};
|
|
148977
|
+
} catch {
|
|
148978
|
+
store = {};
|
|
148979
|
+
}
|
|
148980
|
+
return {
|
|
148981
|
+
store,
|
|
148982
|
+
toggles: {},
|
|
148983
|
+
query: new URLSearchParams(),
|
|
148984
|
+
caller: { entitled: false },
|
|
148985
|
+
serverBaseUrl: "http://localhost",
|
|
148986
|
+
bundleIntegrity: () => "sha256-unpinned",
|
|
148987
|
+
asset: () => null
|
|
148988
|
+
};
|
|
148989
|
+
}
|
|
148990
|
+
function row(label3, kind, built, buildError) {
|
|
148991
|
+
const block = built && typeof built === "object" && !Array.isArray(built) ? built : {};
|
|
148992
|
+
const json8 = JSON.stringify(block, null, 2) ?? "{}";
|
|
148993
|
+
return {
|
|
148994
|
+
label: label3,
|
|
148995
|
+
kind,
|
|
148996
|
+
block,
|
|
148997
|
+
bundles: buildError ? [] : bundlesOf(block),
|
|
148998
|
+
lines: json8.split("\n").length,
|
|
148999
|
+
bytes: Buffer.byteLength(json8),
|
|
149000
|
+
...buildError ? { buildError } : {}
|
|
149001
|
+
};
|
|
149002
|
+
}
|
|
149003
|
+
async function buildTemplated(t2, ctx) {
|
|
149004
|
+
const placeholder3 = Array.from({ length: Math.max(1, captureCount(t2.pattern)) }, () => ID_PLACEHOLDER);
|
|
149005
|
+
let error;
|
|
149006
|
+
try {
|
|
149007
|
+
const built = await settle(() => t2.build(ctx, placeholder3), `the templated route ${t2.display}`);
|
|
149008
|
+
if (built) return { built };
|
|
149009
|
+
} catch (e2) {
|
|
149010
|
+
error = message(e2);
|
|
149011
|
+
}
|
|
149012
|
+
if (typeof t2.seedIds === "function") {
|
|
149013
|
+
try {
|
|
149014
|
+
const ids = await settle(() => t2.seedIds(ctx), `seedIds of ${t2.display}`);
|
|
149015
|
+
for (const id of Array.isArray(ids) ? ids.slice(0, 20) : []) {
|
|
149016
|
+
const m2 = typeof id === "string" ? t2.pattern.exec(id) : null;
|
|
149017
|
+
if (!m2) continue;
|
|
149018
|
+
const built = await settle(() => t2.build(ctx, m2.slice(1)), `the templated route ${t2.display}`);
|
|
149019
|
+
if (built) return { built };
|
|
149020
|
+
}
|
|
149021
|
+
} catch (e2) {
|
|
149022
|
+
error ??= message(e2);
|
|
149023
|
+
}
|
|
149024
|
+
}
|
|
149025
|
+
return { error: error ?? "the builder returned no descriptor" };
|
|
149026
|
+
}
|
|
149027
|
+
async function evaluatedView(dir) {
|
|
149028
|
+
const { loadContent: loadContent2 } = await Promise.resolve().then(() => (init_loader(), loader_exports));
|
|
149029
|
+
(await Promise.resolve().then(() => (init_build(), build_exports))).bundledRuntimeDir();
|
|
149030
|
+
let loaded;
|
|
149031
|
+
try {
|
|
149032
|
+
loaded = await loadContent2(dir);
|
|
149033
|
+
} catch (e2) {
|
|
149034
|
+
throw new TrimRefusal(`dev/index.ts could not be loaded to read its screens: ${message(e2)}`);
|
|
149035
|
+
}
|
|
149036
|
+
const m2 = loaded.module;
|
|
149037
|
+
const ctx = buildContext(m2, loaded.name);
|
|
149038
|
+
const routes = [];
|
|
149039
|
+
for (const [id, build3] of Object.entries(m2.screens?.exact ?? {})) {
|
|
149040
|
+
try {
|
|
149041
|
+
const built = await settle(() => build3(ctx), `the screen ${id}`);
|
|
149042
|
+
routes.push(built ? row(id, "screen", built) : row(id, "screen", void 0, "the builder returned no descriptor"));
|
|
149043
|
+
} catch (e2) {
|
|
149044
|
+
routes.push(row(id, "screen", void 0, message(e2)));
|
|
149045
|
+
}
|
|
149046
|
+
}
|
|
149047
|
+
for (const t2 of m2.screens?.templated ?? []) {
|
|
149048
|
+
const { built, error } = await buildTemplated(t2, ctx);
|
|
149049
|
+
routes.push(row(templatedLabel(String(t2.display)), "templated", built, built ? void 0 : error));
|
|
149050
|
+
}
|
|
149051
|
+
const nav = m2.config?.navigation;
|
|
149052
|
+
return {
|
|
149053
|
+
layout: "evaluated",
|
|
149054
|
+
home: String(m2.homeScreenId ?? ""),
|
|
149055
|
+
routes,
|
|
149056
|
+
nav: nav && typeof nav === "object" && !Array.isArray(nav) ? nav : {}
|
|
149057
|
+
};
|
|
149058
|
+
}
|
|
149059
|
+
var BUILD_TIMEOUT_MS, ID_PLACEHOLDER, templatedLabel, message;
|
|
149060
|
+
var init_template_evaluate = __esm({
|
|
149061
|
+
"src/template-evaluate.ts"() {
|
|
149062
|
+
init_template_trim();
|
|
149063
|
+
BUILD_TIMEOUT_MS = 1e4;
|
|
149064
|
+
ID_PLACEHOLDER = "__HIMI_ID__";
|
|
149065
|
+
templatedLabel = (display) => display.replace(/[[{].*$/, "").replace(/[_/]+$/, "") || display;
|
|
149066
|
+
message = (e2) => e2 instanceof Error ? e2.message : String(e2);
|
|
149067
|
+
}
|
|
149068
|
+
});
|
|
149069
|
+
|
|
148890
149070
|
// src/template-adopt.ts
|
|
148891
149071
|
var template_adopt_exports = {};
|
|
148892
149072
|
__export(template_adopt_exports, {
|
|
@@ -148899,6 +149079,7 @@ __export(template_adopt_exports, {
|
|
|
148899
149079
|
copyHits: () => copyHits,
|
|
148900
149080
|
droppedPrimaryTaps: () => droppedPrimaryTaps,
|
|
148901
149081
|
findRoute: () => findRoute,
|
|
149082
|
+
inspectAnyLayout: () => inspectAnyLayout,
|
|
148902
149083
|
inspectApp: () => inspectApp,
|
|
148903
149084
|
inventorySummary: () => inventorySummary,
|
|
148904
149085
|
keepFromSpec: () => keepFromSpec,
|
|
@@ -149051,8 +149232,8 @@ function copyHits(dir, re2, limit = 200) {
|
|
|
149051
149232
|
}
|
|
149052
149233
|
return { hits, total };
|
|
149053
149234
|
}
|
|
149054
|
-
function navigationOf(
|
|
149055
|
-
const nav =
|
|
149235
|
+
function navigationOf(navValue) {
|
|
149236
|
+
const nav = navValue ?? {};
|
|
149056
149237
|
const tabs = (nav.tabBar?.items ?? []).map((t2) => t2.screenId).filter((s2) => typeof s2 === "string");
|
|
149057
149238
|
return { tabs, linkable: Array.isArray(nav.linkableScreens) ? nav.linkableScreens.length : 0 };
|
|
149058
149239
|
}
|
|
@@ -149070,9 +149251,40 @@ function journeysFor(screen, actions) {
|
|
|
149070
149251
|
expectText: ["<FILL: text the screen shows once the submit succeeds>"]
|
|
149071
149252
|
}));
|
|
149072
149253
|
}
|
|
149254
|
+
function parsedView(src) {
|
|
149255
|
+
const app = parseApp(src.dev, src.config);
|
|
149256
|
+
return {
|
|
149257
|
+
layout: "generated",
|
|
149258
|
+
home: app.home.label,
|
|
149259
|
+
routes: app.routes.map((r3) => ({
|
|
149260
|
+
label: r3.label,
|
|
149261
|
+
kind: r3.kind,
|
|
149262
|
+
block: r3.block,
|
|
149263
|
+
bundles: r3.bundles,
|
|
149264
|
+
lines: src.dev.slice(r3.lineStart, r3.end).split("\n").length - 1,
|
|
149265
|
+
bytes: r3.end - r3.lineStart
|
|
149266
|
+
})),
|
|
149267
|
+
nav: app.nav.value
|
|
149268
|
+
};
|
|
149269
|
+
}
|
|
149073
149270
|
function inspectApp(dir) {
|
|
149074
149271
|
const src = readAppSources(dir);
|
|
149075
|
-
|
|
149272
|
+
return inventoryOf(dir, src, parsedView(src));
|
|
149273
|
+
}
|
|
149274
|
+
async function inspectAnyLayout(dir) {
|
|
149275
|
+
const src = readAppSources(dir);
|
|
149276
|
+
let view;
|
|
149277
|
+
try {
|
|
149278
|
+
view = parsedView(src);
|
|
149279
|
+
} catch (e2) {
|
|
149280
|
+
if (!(e2 instanceof TrimRefusal)) throw e2;
|
|
149281
|
+
const { evaluatedView: evaluatedView2 } = await Promise.resolve().then(() => (init_template_evaluate(), template_evaluate_exports));
|
|
149282
|
+
view = await evaluatedView2(dir);
|
|
149283
|
+
return { ...inventoryOf(dir, src, view), layoutNote: e2.message };
|
|
149284
|
+
}
|
|
149285
|
+
return inventoryOf(dir, src, view);
|
|
149286
|
+
}
|
|
149287
|
+
function inventoryOf(dir, src, app) {
|
|
149076
149288
|
const reach = workerReach(src);
|
|
149077
149289
|
const bootRequests = [];
|
|
149078
149290
|
const matrix = [];
|
|
@@ -149084,10 +149296,11 @@ function inspectApp(dir) {
|
|
|
149084
149296
|
screens.push({
|
|
149085
149297
|
id: r3.label,
|
|
149086
149298
|
kind: r3.kind,
|
|
149087
|
-
lines:
|
|
149088
|
-
bytes: r3.
|
|
149299
|
+
lines: r3.lines,
|
|
149300
|
+
bytes: r3.bytes,
|
|
149089
149301
|
workers: r3.bundles,
|
|
149090
|
-
onAppear: [...new Set(appear.map((a2) => a2.actionId))]
|
|
149302
|
+
onAppear: [...new Set(appear.map((a2) => a2.actionId))],
|
|
149303
|
+
...r3.buildError ? { buildError: r3.buildError } : {}
|
|
149091
149304
|
});
|
|
149092
149305
|
for (const a2 of appear) {
|
|
149093
149306
|
for (const w2 of r3.bundles) {
|
|
@@ -149095,33 +149308,37 @@ function inspectApp(dir) {
|
|
|
149095
149308
|
if (!reaches(wr2)) continue;
|
|
149096
149309
|
const via = [...wr2.wixModules, ...wr2.rawWixApi ? ["wixApi"] : [], ...wr2.fetch ? ["fetch"] : []];
|
|
149097
149310
|
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
|
|
149311
|
+
bootRequests.push({ screen: r3.label, actionId: a2.actionId, worker: w2, via, home: r3.label === app.home });
|
|
149099
149312
|
}
|
|
149100
149313
|
}
|
|
149101
149314
|
}
|
|
149102
149315
|
const pick3 = (k2) => [...new Set(actions.filter((a2) => a2.kind === k2).map((a2) => a2.action))].sort();
|
|
149103
|
-
const
|
|
149316
|
+
const row2 = {
|
|
149104
149317
|
screen: r3.label,
|
|
149105
149318
|
reads: [...new Set(r3.bundles.flatMap((w2) => reach.get(w2)?.wixModules ?? []))].sort(),
|
|
149106
149319
|
writes: pick3("write"),
|
|
149107
149320
|
destructive: pick3("destructive"),
|
|
149108
149321
|
payment: pick3("payment")
|
|
149109
149322
|
};
|
|
149110
|
-
const prior = matrix.find((m2) => m2.screen ===
|
|
149323
|
+
const prior = matrix.find((m2) => m2.screen === row2.screen);
|
|
149111
149324
|
if (prior) {
|
|
149112
|
-
for (const k2 of ["reads", "writes", "destructive", "payment"]) prior[k2] = [.../* @__PURE__ */ new Set([...prior[k2], ...
|
|
149113
|
-
} else if (
|
|
149325
|
+
for (const k2 of ["reads", "writes", "destructive", "payment"]) prior[k2] = [.../* @__PURE__ */ new Set([...prior[k2], ...row2[k2]])].sort();
|
|
149326
|
+
} else if (row2.writes.length || row2.destructive.length || row2.payment.length) matrix.push(row2);
|
|
149114
149327
|
journeys.push(...journeysFor(r3.label, actions));
|
|
149115
149328
|
}
|
|
149329
|
+
const unreadScreens = screens.filter((s2) => s2.buildError).map((s2) => s2.id);
|
|
149116
149330
|
return {
|
|
149117
149331
|
ok: true,
|
|
149118
149332
|
dir,
|
|
149119
|
-
|
|
149333
|
+
layout: app.layout,
|
|
149334
|
+
home: app.home,
|
|
149120
149335
|
screens,
|
|
149121
149336
|
workers: [...reach.values()],
|
|
149122
|
-
navigation: navigationOf(app),
|
|
149337
|
+
navigation: navigationOf(app.nav),
|
|
149123
149338
|
bootRequests,
|
|
149124
|
-
|
|
149339
|
+
// The preflight errs to "may request": a screen it could not read is not proof of offline.
|
|
149340
|
+
bootsOffline: bootRequests.length === 0 && unreadScreens.length === 0,
|
|
149341
|
+
...unreadScreens.length ? { unreadScreens } : {},
|
|
149125
149342
|
placeholders: copyHits(dir, PLACEHOLDER),
|
|
149126
149343
|
sampleCopy: copyHits(dir, SAMPLE_COPY, 50),
|
|
149127
149344
|
matrix,
|
|
@@ -149151,11 +149368,12 @@ function inventorySummary(inv) {
|
|
|
149151
149368
|
bootsOffline: inv.bootsOffline,
|
|
149152
149369
|
bootRequests: inv.bootRequests.length,
|
|
149153
149370
|
...inv.bootRequests.some((b2) => b2.home) ? { homeRequestsAtBoot: true } : {},
|
|
149371
|
+
...inv.unreadScreens?.length ? { unreadScreens: inv.unreadScreens.length } : {},
|
|
149154
149372
|
placeholders: inv.placeholders.total,
|
|
149155
149373
|
sampleCopy: inv.sampleCopy.total,
|
|
149156
149374
|
riskyScreens: inv.matrix.length,
|
|
149157
149375
|
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}.`
|
|
149376
|
+
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
149377
|
};
|
|
149160
149378
|
}
|
|
149161
149379
|
function writeNoFollow(dir, rel, body) {
|
|
@@ -150770,7 +150988,7 @@ function ignoredChange(relPath, isDirectory = () => false, rasterDir = "assets/h
|
|
|
150770
150988
|
}
|
|
150771
150989
|
if (!parts.length) return true;
|
|
150772
150990
|
const [top] = parts;
|
|
150773
|
-
if ([".himi", "dist", "node_modules", ".git", ".build", ...AGENT_TOOLING_DIRS].includes(top)) return true;
|
|
150991
|
+
if ([".himi", ".wix", "dist", "node_modules", ".git", ".build", ...AGENT_TOOLING_DIRS].includes(top)) return true;
|
|
150774
150992
|
if (parts.length === 1 && AGENT_TOOLING_ROOT_FILES.includes(top)) return true;
|
|
150775
150993
|
if ((top === "shots" || top === "evidence") && (parts.length > 1 || isDirectory(top))) return true;
|
|
150776
150994
|
const name = parts[parts.length - 1];
|
|
@@ -151094,10 +151312,10 @@ function screenStateOf(services, html, opts = {}) {
|
|
|
151094
151312
|
let empty2;
|
|
151095
151313
|
for (const top of states) for (const s2 of layers2(top)) {
|
|
151096
151314
|
const status = typeof s2.status === "string" ? s2.status.toLowerCase() : typeof s2.phase === "string" ? s2.phase.toLowerCase() : void 0;
|
|
151097
|
-
const
|
|
151315
|
+
const message2 = errorMessageOf(s2);
|
|
151098
151316
|
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 =
|
|
151317
|
+
if (flagged && !(message2 && page !== void 0 && !painted(message2, page)) || message2 && page !== void 0 && painted(message2, page)) {
|
|
151318
|
+
const line = message2 && painted(message2, page) ? quotableLine(message2) : void 0;
|
|
151101
151319
|
return { state: "error", ...line ? { line } : {}, ...opts.offline ? { offline: true } : {} };
|
|
151102
151320
|
}
|
|
151103
151321
|
if (status === "loading" || s2.isLoading === true || s2.noLoading === false) loading = true;
|
|
@@ -151161,9 +151379,9 @@ function homeStateCaveat(state) {
|
|
|
151161
151379
|
if (state.state === "loading") return "the home screen is still on its loading state (its data never finished loading)";
|
|
151162
151380
|
return `the home screen shows its empty state${quote}`;
|
|
151163
151381
|
}
|
|
151164
|
-
function withHomeCaveat(
|
|
151165
|
-
if (!caveat) return
|
|
151166
|
-
const body =
|
|
151382
|
+
function withHomeCaveat(message2, caveat) {
|
|
151383
|
+
if (!caveat) return message2;
|
|
151384
|
+
const body = message2.endsWith(".") ? message2.slice(0, -1) : message2;
|
|
151167
151385
|
return `${body} \u2014 but ${caveat}.`;
|
|
151168
151386
|
}
|
|
151169
151387
|
var SHOT_STATES_FILE, KEEP, LINE_MAX, str4, sha256Of;
|
|
@@ -151665,8 +151883,8 @@ async function openBoardForSession(dir, cwd = process.cwd()) {
|
|
|
151665
151883
|
return { opened: false, error: `the build board was not created: ${e2.message} \u2014 \`himi studio --no-open\` in the app retries it` };
|
|
151666
151884
|
}
|
|
151667
151885
|
}
|
|
151668
|
-
function journal(dir, milestone,
|
|
151669
|
-
const r3 = journalMilestone(dir, { milestone, message, ...extra });
|
|
151886
|
+
function journal(dir, milestone, message2, extra) {
|
|
151887
|
+
const r3 = journalMilestone(dir, { milestone, message: message2, ...extra });
|
|
151670
151888
|
return r3.journaled ? { journaled: true, milestone, message: r3.entry.message } : void 0;
|
|
151671
151889
|
}
|
|
151672
151890
|
function stillBuilding(dir, image, now) {
|
|
@@ -151693,7 +151911,7 @@ function afterRenderPng(dir, input) {
|
|
|
151693
151911
|
let postcard;
|
|
151694
151912
|
if (isHome) {
|
|
151695
151913
|
const d2 = initDivergence(dir);
|
|
151696
|
-
const said = (
|
|
151914
|
+
const said = (message2) => withHomeCaveat(message2, homeCaveat(dir, input.pngFile));
|
|
151697
151915
|
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
151916
|
postcard ??= stillBuilding(dir, input.pngFile, input.now ?? /* @__PURE__ */ new Date());
|
|
151699
151917
|
}
|
|
@@ -151711,8 +151929,8 @@ function testPostcardMessage(s2) {
|
|
|
151711
151929
|
const unreached = s2.unreached ? `, ${plural2(s2.unreached, "screen")} nothing links to` : "";
|
|
151712
151930
|
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
151931
|
}
|
|
151714
|
-
function testPostcardCounts(
|
|
151715
|
-
const head =
|
|
151932
|
+
function testPostcardCounts(message2) {
|
|
151933
|
+
const head = message2.split(". ")[0];
|
|
151716
151934
|
const counts = /* @__PURE__ */ new Map();
|
|
151717
151935
|
const num4 = (re2, label3) => {
|
|
151718
151936
|
const m2 = re2.exec(head);
|
|
@@ -152770,8 +152988,8 @@ function tokenNumericIssuesFor(dir) {
|
|
|
152770
152988
|
}
|
|
152771
152989
|
function tokenColorIssues(dir, tokensPathOverride) {
|
|
152772
152990
|
const issues = [];
|
|
152773
|
-
const error = (
|
|
152774
|
-
const warn3 = (
|
|
152991
|
+
const error = (message2) => issues.push({ screen: null, pass: "tokens", severity: "error", message: message2 });
|
|
152992
|
+
const warn3 = (message2) => issues.push({ screen: null, pass: "tokens", severity: "warning", message: message2 });
|
|
152775
152993
|
const configured = tokensPathOverride ? { path: tokensPathOverride } : configuredTokensPath(dir);
|
|
152776
152994
|
if (configured.computed) {
|
|
152777
152995
|
warn3(
|
|
@@ -153324,6 +153542,15 @@ function syntaxErrors(file2, text11) {
|
|
|
153324
153542
|
const out2 = ts7.transpileModule(text11, { fileName: file2, reportDiagnostics: true, compilerOptions: { target: ts7.ScriptTarget.ES2022 } });
|
|
153325
153543
|
return (out2.diagnostics ?? []).map((d2) => ts7.flattenDiagnosticMessageText(d2.messageText, "\n"));
|
|
153326
153544
|
}
|
|
153545
|
+
function parses(dev, config) {
|
|
153546
|
+
try {
|
|
153547
|
+
parseApp(dev, config);
|
|
153548
|
+
return true;
|
|
153549
|
+
} catch (e2) {
|
|
153550
|
+
if (e2 instanceof TrimRefusal) return false;
|
|
153551
|
+
throw e2;
|
|
153552
|
+
}
|
|
153553
|
+
}
|
|
153327
153554
|
function sweepCopy(dir, pairs, dryRun) {
|
|
153328
153555
|
for (const [from] of pairs) {
|
|
153329
153556
|
if (from.trim().length < 3) throw new TrimRefusal(`refusing to sweep "${from}": a replacement source must be at least 3 characters`);
|
|
@@ -153362,12 +153589,14 @@ function sweepCopy(dir, pairs, dryRun) {
|
|
|
153362
153589
|
if (errors.length) throw new TrimRefusal(`the sweep would break ${f2} \u2014 nothing written: ${errors[0]}`);
|
|
153363
153590
|
next.set(f2, out2);
|
|
153364
153591
|
}
|
|
153365
|
-
const
|
|
153366
|
-
const
|
|
153367
|
-
|
|
153368
|
-
|
|
153369
|
-
|
|
153370
|
-
|
|
153592
|
+
const devBefore = readFileSync59(join49(dir, "dev", "index.ts"), "utf8");
|
|
153593
|
+
const configBefore = readFileSync59(join49(dir, "config.ts"), "utf8");
|
|
153594
|
+
if (parses(devBefore, configBefore)) {
|
|
153595
|
+
try {
|
|
153596
|
+
parseApp(next.get("dev/index.ts") ?? devBefore, next.get("config.ts") ?? configBefore);
|
|
153597
|
+
} catch (e2) {
|
|
153598
|
+
throw new TrimRefusal(`the sweep would leave dev/index.ts or config.ts unparseable \u2014 nothing written: ${e2.message}`);
|
|
153599
|
+
}
|
|
153371
153600
|
}
|
|
153372
153601
|
if (!dryRun) for (const [f2, t2] of next) writeFileSync20(join49(dir, f2), t2);
|
|
153373
153602
|
const g2 = new RegExp(PLACEHOLDER.source, `${PLACEHOLDER.flags.replace("g", "")}g`);
|
|
@@ -153654,12 +153883,12 @@ function recommendTemplates(input) {
|
|
|
153654
153883
|
const owner = OWNER_WORDS.test(text11);
|
|
153655
153884
|
const want = new Set(tokens(text11));
|
|
153656
153885
|
const byName3 = /* @__PURE__ */ new Map();
|
|
153657
|
-
for (const
|
|
153886
|
+
for (const row2 of input.catalog) {
|
|
153658
153887
|
const reasons = [];
|
|
153659
153888
|
let score = 0;
|
|
153660
|
-
const isOwner = /owner/.test(
|
|
153889
|
+
const isOwner = /owner/.test(row2.name);
|
|
153661
153890
|
if (want.size) {
|
|
153662
|
-
const hay = new Set(tokens([
|
|
153891
|
+
const hay = new Set(tokens([row2.name, row2.title ?? "", row2.description ?? "", ...row2.tags ?? [], row2.category ?? ""].join(" ")));
|
|
153663
153892
|
const hit = [...want].filter((t2) => hay.has(t2));
|
|
153664
153893
|
if (hit.length) {
|
|
153665
153894
|
score += hit.length / want.size;
|
|
@@ -153674,7 +153903,7 @@ function recommendTemplates(input) {
|
|
|
153674
153903
|
score -= 0.3;
|
|
153675
153904
|
}
|
|
153676
153905
|
}
|
|
153677
|
-
byName3.set(
|
|
153906
|
+
byName3.set(row2.name, { name: row2.name, score, reasons, ...row2.source ? { source: row2.source } : {} });
|
|
153678
153907
|
}
|
|
153679
153908
|
if (input.verticals?.length) {
|
|
153680
153909
|
for (const c2 of scoreOverlays(input.verticals, "")) {
|
|
@@ -156453,8 +156682,8 @@ function navConfigPathErrors(config) {
|
|
|
156453
156682
|
if (!tabs && !rail) {
|
|
156454
156683
|
const home = typeof config.homeScreenId === "string" && config.homeScreenId.length > 0 ? config.homeScreenId : void 0;
|
|
156455
156684
|
const rows = list2(obj5(config.drawer)?.items);
|
|
156456
|
-
const
|
|
156457
|
-
homes.push(["drawer.items",
|
|
156685
|
+
const row2 = home !== void 0 ? rows.find(([it2]) => it2.screenId === home) : firstOf(obj5(config.drawer)?.items, true);
|
|
156686
|
+
homes.push(["drawer.items", row2]);
|
|
156458
156687
|
}
|
|
156459
156688
|
for (const [where, first] of homes) {
|
|
156460
156689
|
if (first && first[0].hiddenUntilResolved) {
|
|
@@ -156483,9 +156712,9 @@ __export(nav_lint_exports, {
|
|
|
156483
156712
|
});
|
|
156484
156713
|
async function navIssues(dir, strict) {
|
|
156485
156714
|
const issues = [];
|
|
156486
|
-
const push = (severity, ruleCode,
|
|
156487
|
-
const error = (ruleCode,
|
|
156488
|
-
const warn3 = (ruleCode,
|
|
156715
|
+
const push = (severity, ruleCode, message2) => issues.push({ screen: null, pass: "nav", severity, message: message2, ruleCode });
|
|
156716
|
+
const error = (ruleCode, message2) => push("error", ruleCode, message2);
|
|
156717
|
+
const warn3 = (ruleCode, message2) => push(strict ? "error" : "warning", ruleCode, message2);
|
|
156489
156718
|
let cfg;
|
|
156490
156719
|
try {
|
|
156491
156720
|
cfg = await loadAppConfigModule(dir);
|
|
@@ -156552,10 +156781,10 @@ async function navIssues(dir, strict) {
|
|
|
156552
156781
|
);
|
|
156553
156782
|
}
|
|
156554
156783
|
const servedHome = homeScreenIdOf(dir) ?? void 0;
|
|
156555
|
-
for (const
|
|
156556
|
-
error("nav-path-malformed", `navigation.${
|
|
156784
|
+
for (const message2 of navConfigPathErrors({ ...nav, homeScreenId: servedHome })) {
|
|
156785
|
+
error("nav-path-malformed", `navigation.${message2}`);
|
|
156557
156786
|
}
|
|
156558
|
-
for (const
|
|
156787
|
+
for (const message2 of navSharedIdErrors(nav)) error("nav-row-id-shadows-tab", `navigation.${message2}`);
|
|
156559
156788
|
const topBarDefault = nav.topBarDefault;
|
|
156560
156789
|
if (isPlainObject2(topBarDefault)) {
|
|
156561
156790
|
for (const key3 of SCREEN_ONLY_TOP_BAR_KEYS) {
|
|
@@ -156685,14 +156914,14 @@ function navSharedIdErrors(nav) {
|
|
|
156685
156914
|
for (const [tab] of items("tabBar")) if (typeof tab.id === "string" && !tabScreens.has(tab.id)) tabScreens.set(tab.id, tab.screenId);
|
|
156686
156915
|
const out2 = [];
|
|
156687
156916
|
for (const key3 of ["drawer", "sidebar"]) {
|
|
156688
|
-
for (const [
|
|
156689
|
-
if (typeof
|
|
156690
|
-
const tabScreen = tabScreens.get(
|
|
156917
|
+
for (const [row2, i2] of items(key3)) {
|
|
156918
|
+
if (typeof row2.id !== "string" || !tabScreens.has(row2.id)) continue;
|
|
156919
|
+
const tabScreen = tabScreens.get(row2.id);
|
|
156691
156920
|
if (typeof tabScreen !== "string") continue;
|
|
156692
|
-
if (key3 === "drawer" && (
|
|
156693
|
-
if (typeof
|
|
156921
|
+
if (key3 === "drawer" && (row2.role === "section" || row2.role === "note")) continue;
|
|
156922
|
+
if (typeof row2.screenId !== "string" || row2.screenId === "" || row2.screenId === tabScreen) continue;
|
|
156694
156923
|
out2.push(
|
|
156695
|
-
`${key3}.items[${i2}] "${
|
|
156924
|
+
`${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
156925
|
);
|
|
156697
156926
|
}
|
|
156698
156927
|
}
|
|
@@ -156964,8 +157193,8 @@ var init_base44_types = __esm({
|
|
|
156964
157193
|
SCALAR = { string: "string", number: "number", integer: "number", boolean: "boolean" };
|
|
156965
157194
|
key2 = (k2) => /^[A-Za-z_$][A-Za-z0-9_$]*$/.test(k2) ? k2 : JSON.stringify(k2);
|
|
156966
157195
|
Base44TypesError = class extends Error {
|
|
156967
|
-
constructor(code,
|
|
156968
|
-
super(
|
|
157196
|
+
constructor(code, message2) {
|
|
157197
|
+
super(message2);
|
|
156969
157198
|
this.code = code;
|
|
156970
157199
|
}
|
|
156971
157200
|
};
|
|
@@ -157853,10 +158082,10 @@ function parseDataAccess(text11, from) {
|
|
|
157853
158082
|
const rows = [];
|
|
157854
158083
|
for (const line of lines.slice(1)) {
|
|
157855
158084
|
if (/^\|?\s*:?-+:?\s*(\|\s*:?-+:?\s*)*\|?$/.test(line)) continue;
|
|
157856
|
-
const
|
|
157857
|
-
const screen = unquote(
|
|
158085
|
+
const row2 = cells(line);
|
|
158086
|
+
const screen = unquote(row2[screenCol] ?? "");
|
|
157858
158087
|
if (!screen) continue;
|
|
157859
|
-
const cell2 = unquote(
|
|
158088
|
+
const cell2 = unquote(row2[writesCol] ?? "");
|
|
157860
158089
|
const entries = splitEntries(cell2).filter((e2) => !isNoneEntry(e2));
|
|
157861
158090
|
rows.push({ screen, allowed: NONE.test(cell2) || !entries.length ? null : entries });
|
|
157862
158091
|
}
|
|
@@ -157905,10 +158134,10 @@ function pathPattern(p2) {
|
|
|
157905
158134
|
function unapprovedWriteFindings(writes, plan) {
|
|
157906
158135
|
if (!plan) return [];
|
|
157907
158136
|
const byScreen = /* @__PURE__ */ new Map();
|
|
157908
|
-
for (const
|
|
157909
|
-
const list2 = byScreen.get(
|
|
157910
|
-
list2.push(
|
|
157911
|
-
byScreen.set(
|
|
158137
|
+
for (const row2 of plan.rows) {
|
|
158138
|
+
const list2 = byScreen.get(row2.screen) ?? [];
|
|
158139
|
+
list2.push(row2);
|
|
158140
|
+
byScreen.set(row2.screen, list2);
|
|
157912
158141
|
}
|
|
157913
158142
|
const findings = [];
|
|
157914
158143
|
for (const w2 of writes) {
|
|
@@ -160374,25 +160603,25 @@ function createLocalTestSandbox() {
|
|
|
160374
160603
|
hasData: Boolean(context.dataApi && context.capabilities?.includes("data")),
|
|
160375
160604
|
hasResourceAdmin: Boolean(context.dataApi && context.capabilities?.includes("resource_admin"))
|
|
160376
160605
|
};
|
|
160377
|
-
port1.on("message", async (
|
|
160606
|
+
port1.on("message", async (message2) => {
|
|
160378
160607
|
try {
|
|
160379
160608
|
let value2;
|
|
160380
|
-
if (
|
|
160381
|
-
else if (
|
|
160382
|
-
else if (
|
|
160383
|
-
const response = await (context.http || context.httpApi).fetch(String(
|
|
160609
|
+
if (message2.capability === "wixApi" && context.wixApi) value2 = await context.wixApi.call(...message2.args);
|
|
160610
|
+
else if (message2.capability === "secrets" && (context.secrets || context.secretsApi)) value2 = await (context.secrets || context.secretsApi).get(String(message2.args[0]));
|
|
160611
|
+
else if (message2.capability === "http" && (context.http || context.httpApi)) {
|
|
160612
|
+
const response = await (context.http || context.httpApi).fetch(String(message2.args[0]), message2.args[1]);
|
|
160384
160613
|
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:
|
|
160614
|
+
} else if (message2.capability === "functions.call" && context.functionsApi) {
|
|
160615
|
+
value2 = await context.functionsApi.call(String(message2.args[0]), message2.args[1], message2.args[2]);
|
|
160616
|
+
} else if (message2.capability === "functions.enqueue" && context.functionsApi?.enqueue) {
|
|
160617
|
+
value2 = await context.functionsApi.enqueue(String(message2.args[0]), message2.args[1], message2.args[2]);
|
|
160618
|
+
} else if (message2.capability === "data" && context.dataApi) {
|
|
160619
|
+
value2 = await context.dataApi.call(message2.args[0], String(message2.args[1]), message2.args[2]);
|
|
160620
|
+
} else throw new Error(`${message2.capability} capability is not configured`);
|
|
160621
|
+
port1.postMessage({ id: message2.id, ok: true, value: value2 });
|
|
160393
160622
|
} catch (error) {
|
|
160394
160623
|
port1.postMessage({
|
|
160395
|
-
id:
|
|
160624
|
+
id: message2.id,
|
|
160396
160625
|
ok: false,
|
|
160397
160626
|
error: error instanceof Error ? { message: error.message, name: error.name, code: error.code } : { message: String(error) }
|
|
160398
160627
|
});
|
|
@@ -160427,14 +160656,14 @@ function createLocalTestSandbox() {
|
|
|
160427
160656
|
return;
|
|
160428
160657
|
}
|
|
160429
160658
|
signal?.addEventListener("abort", abortHandler, { once: true });
|
|
160430
|
-
worker.on("message", (
|
|
160431
|
-
if (
|
|
160659
|
+
worker.on("message", (message2) => {
|
|
160660
|
+
if (message2.ready) {
|
|
160432
160661
|
clearTimeout(timer);
|
|
160433
160662
|
timer = setTimeout(() => finish2(() => reject(new SandboxError("timeout", `execution exceeded ${limits.timeoutMs}ms`))), Math.max(1, limits.timeoutMs));
|
|
160434
160663
|
return;
|
|
160435
160664
|
}
|
|
160436
|
-
if (
|
|
160437
|
-
else finish2(() => reject(new SandboxError("execution_failed",
|
|
160665
|
+
if (message2.ok) finish2(() => resolve83({ value: message2.value, durationMs: Date.now() - started }));
|
|
160666
|
+
else finish2(() => reject(new SandboxError("execution_failed", message2.message ?? "handler failed")));
|
|
160438
160667
|
});
|
|
160439
160668
|
worker.once("error", (error) => finish2(() => reject(new SandboxError("execution_failed", error.message))));
|
|
160440
160669
|
worker.once("exit", (code) => {
|
|
@@ -160449,8 +160678,8 @@ var init_sandbox = __esm({
|
|
|
160449
160678
|
"../../core/functions-runtime/src/sandbox.ts"() {
|
|
160450
160679
|
SandboxError = class extends Error {
|
|
160451
160680
|
code;
|
|
160452
|
-
constructor(code,
|
|
160453
|
-
super(`${code}: ${
|
|
160681
|
+
constructor(code, message2) {
|
|
160682
|
+
super(`${code}: ${message2}`);
|
|
160454
160683
|
this.name = "SandboxError";
|
|
160455
160684
|
this.code = code;
|
|
160456
160685
|
}
|
|
@@ -160559,8 +160788,8 @@ var FunctionCallError, NAME;
|
|
|
160559
160788
|
var init_calls = __esm({
|
|
160560
160789
|
"../../core/functions-runtime/src/calls.ts"() {
|
|
160561
160790
|
FunctionCallError = class extends Error {
|
|
160562
|
-
constructor(code,
|
|
160563
|
-
super(`${code}: ${
|
|
160791
|
+
constructor(code, message2) {
|
|
160792
|
+
super(`${code}: ${message2}`);
|
|
160564
160793
|
this.code = code;
|
|
160565
160794
|
this.name = "FunctionCallError";
|
|
160566
160795
|
}
|
|
@@ -160629,8 +160858,8 @@ var FunctionQueueError;
|
|
|
160629
160858
|
var init_queue = __esm({
|
|
160630
160859
|
"../../core/functions-runtime/src/queue.ts"() {
|
|
160631
160860
|
FunctionQueueError = class extends Error {
|
|
160632
|
-
constructor(code,
|
|
160633
|
-
super(`${code}: ${
|
|
160861
|
+
constructor(code, message2) {
|
|
160862
|
+
super(`${code}: ${message2}`);
|
|
160634
160863
|
this.code = code;
|
|
160635
160864
|
this.name = "FunctionQueueError";
|
|
160636
160865
|
}
|
|
@@ -160759,8 +160988,8 @@ function verifyPlan(scope2, plan) {
|
|
|
160759
160988
|
const { hash: hash2, ...unsigned } = plan;
|
|
160760
160989
|
if (!equalScope(scope2, plan.scope) || hashResourcePlan(unsigned) !== hash2) throw new ResourceApplyError("invalid_plan", "plan hash or app/site/environment scope does not match");
|
|
160761
160990
|
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",
|
|
160991
|
+
const invalid = (message2) => {
|
|
160992
|
+
throw new ResourceApplyError("invalid_plan", message2);
|
|
160764
160993
|
};
|
|
160765
160994
|
for (const operation of plan.operations) {
|
|
160766
160995
|
if (operation.kind === "create-kv" || operation.kind === "update-kv") {
|
|
@@ -160829,8 +161058,8 @@ var init_apply = __esm({
|
|
|
160829
161058
|
init_schema2();
|
|
160830
161059
|
init_tombstones();
|
|
160831
161060
|
ResourceApplyError = class extends Error {
|
|
160832
|
-
constructor(code,
|
|
160833
|
-
super(`${code}: ${
|
|
161061
|
+
constructor(code, message2) {
|
|
161062
|
+
super(`${code}: ${message2}`);
|
|
160834
161063
|
this.code = code;
|
|
160835
161064
|
this.name = "ResourceApplyError";
|
|
160836
161065
|
}
|
|
@@ -161057,8 +161286,8 @@ function json2(status, body, requestId2, extra = {}) {
|
|
|
161057
161286
|
headers: { "content-type": "application/json; charset=utf-8", "cache-control": "no-store", "x-request-id": requestId2, ...extra }
|
|
161058
161287
|
});
|
|
161059
161288
|
}
|
|
161060
|
-
function errorResponse(status, code,
|
|
161061
|
-
return json2(status, { error: { code, message:
|
|
161289
|
+
function errorResponse(status, code, message2, requestId2) {
|
|
161290
|
+
return json2(status, { error: { code, message: message2.slice(0, MAX_LOG_MESSAGE), requestId: requestId2 }, requestId: requestId2 }, requestId2, { "access-control-allow-origin": "*" });
|
|
161062
161291
|
}
|
|
161063
161292
|
function routeMatch(template, actual) {
|
|
161064
161293
|
const expected = template.split("/").filter(Boolean);
|
|
@@ -161355,11 +161584,11 @@ function makeFunctionsHandler(options) {
|
|
|
161355
161584
|
return json2(200, value2, id, { "access-control-allow-origin": "*" });
|
|
161356
161585
|
} catch (error) {
|
|
161357
161586
|
finish2("error");
|
|
161358
|
-
const
|
|
161587
|
+
const message2 = error instanceof Error ? error.message : String(error);
|
|
161359
161588
|
const code = error instanceof SandboxError || error instanceof FunctionCallError ? error.code : "execution_failed";
|
|
161360
161589
|
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
161590
|
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,
|
|
161591
|
+
return errorResponse(status, responseCode, message2, id);
|
|
161363
161592
|
}
|
|
161364
161593
|
};
|
|
161365
161594
|
}
|
|
@@ -161864,7 +162093,7 @@ var init_file_tools = __esm({
|
|
|
161864
162093
|
MAX_LISTED = 2e3;
|
|
161865
162094
|
CONTENT_MARKER = "himalaya.content.json";
|
|
161866
162095
|
ok = (o2) => ({ content: [{ type: "text", text: JSON.stringify(o2, null, 2) }] });
|
|
161867
|
-
refuse5 = (error,
|
|
162096
|
+
refuse5 = (error, message2) => ({ content: [{ type: "text", text: JSON.stringify({ ok: false, error, message: message2 }, null, 2) }], isError: true });
|
|
161868
162097
|
DIR = z2.string().optional().describe("The app folder, relative to the workspace folder. Default: the workspace folder itself.");
|
|
161869
162098
|
WRITE_ANN = { readOnlyHint: false, destructiveHint: true, idempotentHint: true, openWorldHint: false };
|
|
161870
162099
|
}
|
|
@@ -162638,8 +162867,8 @@ var init_open_url = __esm({
|
|
|
162638
162867
|
// src/ux-audit.ts
|
|
162639
162868
|
import { existsSync as existsSync72, readFileSync as readFileSync83, readdirSync as readdirSync32 } from "node:fs";
|
|
162640
162869
|
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" });
|
|
162870
|
+
function issue(issues, strict, code, message2, path2) {
|
|
162871
|
+
issues.push({ code, message: message2, ...path2 ? { path: path2 } : {}, severity: strict ? "error" : "warning" });
|
|
162643
162872
|
}
|
|
162644
162873
|
function readText2(path2) {
|
|
162645
162874
|
try {
|
|
@@ -162702,8 +162931,8 @@ function auditUx(content, strict = false) {
|
|
|
162702
162931
|
}
|
|
162703
162932
|
const malformedChecks = record2.checks !== void 0 && !Array.isArray(record2.checks);
|
|
162704
162933
|
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" });
|
|
162934
|
+
const message2 = malformedChecks ? `${platform} audit has a malformed checks list; it must be an array.` : `${platform} audit needs the checks that were driven.`;
|
|
162935
|
+
issues.push({ code: `missing-${platform}-checks`, message: message2, path: UX_EVIDENCE_PATH, severity: "error" });
|
|
162707
162936
|
}
|
|
162708
162937
|
if (record2.status === "unavailable" && !record2.reason?.trim()) {
|
|
162709
162938
|
issues.push({ code: `missing-${platform}-reason`, message: `${platform} is unavailable but has no reason.`, path: UX_EVIDENCE_PATH, severity: "error" });
|
|
@@ -164601,23 +164830,23 @@ function syncCoverage(evidenceDir, contentDir2, write2 = true) {
|
|
|
164601
164830
|
const old = existed ? obj3(JSON.parse(readFileSync90(path2, "utf8"))) : {};
|
|
164602
164831
|
const hashesChanged = existed && JSON.stringify(old.sourceHashes) !== JSON.stringify(current.sourceHashes);
|
|
164603
164832
|
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(
|
|
164833
|
+
const byId = new Map(prior.map((row2) => [row2.id, row2]));
|
|
164834
|
+
const known = new Set(current.requirements.map((row2) => row2.id));
|
|
164835
|
+
const removed = prior.filter((row2) => !known.has(row2.id)).map((row2) => row2.id);
|
|
164836
|
+
const added = current.requirements.filter((row2) => !byId.has(row2.id)).length;
|
|
164837
|
+
const changed = current.requirements.filter((row2) => {
|
|
164838
|
+
const previous = byId.get(row2.id);
|
|
164839
|
+
return previous && (previous.kind !== row2.kind || previous.source !== row2.source || previous.description !== row2.description || previous.platform !== row2.platform);
|
|
164840
|
+
}).map((row2) => row2.id);
|
|
164841
|
+
current.requirements = current.requirements.map((row2) => {
|
|
164842
|
+
const previous = byId.get(row2.id);
|
|
164614
164843
|
return previous ? {
|
|
164615
|
-
...
|
|
164844
|
+
...row2,
|
|
164616
164845
|
...previous.target ? { target: previous.target } : {},
|
|
164617
164846
|
...!hashesChanged && previous.status ? { status: previous.status } : {},
|
|
164618
164847
|
...!hashesChanged && previous.verification ? { verification: previous.verification } : {},
|
|
164619
164848
|
...previous.adaptation ? { adaptation: previous.adaptation } : {}
|
|
164620
|
-
} :
|
|
164849
|
+
} : row2;
|
|
164621
164850
|
});
|
|
164622
164851
|
if (write2 && removed.length === 0) writeFileSync33(path2, JSON.stringify(current, null, 2) + "\n");
|
|
164623
164852
|
return { coverage: current, added, removed, changed, hashesChanged, existed };
|
|
@@ -164640,31 +164869,31 @@ function verifyCoverage(evidenceDir, contentDir2, releaseHash, builtScreenIds) {
|
|
|
164640
164869
|
const contentManifest = join85(resolve64(contentDir2), "himalaya.content.json");
|
|
164641
164870
|
const declaredScreens = existsSync79(contentManifest) ? obj3(obj3(JSON.parse(readFileSync90(contentManifest, "utf8"))).screens) : void 0;
|
|
164642
164871
|
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 =
|
|
164872
|
+
for (const row2 of rows) {
|
|
164873
|
+
const id = typeof row2.id === "string" ? row2.id : void 0;
|
|
164874
|
+
const kind = row2.kind;
|
|
164646
164875
|
if (!id || !Object.hasOwn(REQUIRED_CHECK, kind)) {
|
|
164647
164876
|
issues.push({ id, message: "Invalid requirement identity or kind." });
|
|
164648
164877
|
continue;
|
|
164649
164878
|
}
|
|
164650
|
-
const status =
|
|
164879
|
+
const status = row2.status;
|
|
164651
164880
|
if (status !== "supported" && status !== "adapted" && status !== "conditional") {
|
|
164652
164881
|
issues.push({ id, message: "Requirement is unresolved or has no status." });
|
|
164653
164882
|
continue;
|
|
164654
164883
|
}
|
|
164655
|
-
const target = obj3(
|
|
164884
|
+
const target = obj3(row2.target);
|
|
164656
164885
|
if (typeof target.screenId !== "string" || !target.screenId.trim()) issues.push({ id, message: "Target screen mapping is absent." });
|
|
164657
164886
|
else if (!availableScreens) issues.push({ id, message: "Target screens are unavailable for verification; supply a built release or a declared screen map." });
|
|
164658
164887
|
else if (!availableScreens.has(target.screenId)) issues.push({ id, message: `Target screen ${target.screenId} is absent from the built release or app declaration.` });
|
|
164659
164888
|
if ((kind === "interaction" || kind === "top-bar") && (typeof target.controlId !== "string" || !target.controlId.trim())) {
|
|
164660
164889
|
issues.push({ id, message: "Target control mapping is absent." });
|
|
164661
164890
|
}
|
|
164662
|
-
const adaptation = obj3(
|
|
164891
|
+
const adaptation = obj3(row2.adaptation);
|
|
164663
164892
|
if (status === "adapted" && (!String(adaptation.instruction ?? "").trim() || !String(adaptation.explanation ?? "").trim())) {
|
|
164664
164893
|
issues.push({ id, message: "Adaptation must cite the user instruction and explain the change." });
|
|
164665
164894
|
}
|
|
164666
164895
|
const required3 = REQUIRED_CHECK[kind];
|
|
164667
|
-
const checks = Array.isArray(
|
|
164896
|
+
const checks = Array.isArray(row2.verification) ? row2.verification.map(obj3) : [];
|
|
164668
164897
|
const matching = checks.filter((check) => check.check === required3);
|
|
164669
164898
|
if (!matching.length) {
|
|
164670
164899
|
issues.push({ id, message: `Required check ${required3} has no evidence.` });
|
|
@@ -164698,7 +164927,7 @@ function verifyCoverage(evidenceDir, contentDir2, releaseHash, builtScreenIds) {
|
|
|
164698
164927
|
}
|
|
164699
164928
|
}
|
|
164700
164929
|
}
|
|
164701
|
-
return { ok: issues.length === 0, count: rows.length, requirementIds: rows.map((
|
|
164930
|
+
return { ok: issues.length === 0, count: rows.length, requirementIds: rows.map((row2) => String(row2.id ?? "")), issues };
|
|
164702
164931
|
}
|
|
164703
164932
|
var obj3, sha, REQUIRED_CHECK, COVERAGE_FILE, NATIVE_PROOF_FILE;
|
|
164704
164933
|
var init_coverage2 = __esm({
|
|
@@ -165038,8 +165267,8 @@ function validate3(evidenceDir, contentDir2) {
|
|
|
165038
165267
|
if (existsSync80(coveragePath)) {
|
|
165039
165268
|
try {
|
|
165040
165269
|
const coverage = readJson7(coveragePath);
|
|
165041
|
-
for (const
|
|
165042
|
-
const entry = object7(
|
|
165270
|
+
for (const row2 of Array.isArray(coverage.requirements) ? coverage.requirements : []) {
|
|
165271
|
+
const entry = object7(row2) ?? {};
|
|
165043
165272
|
if (entry.kind !== "route" || typeof entry.source !== "string" || !/^\/screens\/[^/]+$/.test(entry.source)) continue;
|
|
165044
165273
|
const screenId = entry.source.slice(9).replaceAll("~1", "/").replaceAll("~0", "~");
|
|
165045
165274
|
const targetScreen = object7(entry.target)?.screenId;
|
|
@@ -165518,7 +165747,7 @@ function patchHonesty(opts) {
|
|
|
165518
165747
|
return { attestation, source };
|
|
165519
165748
|
}
|
|
165520
165749
|
function partialPublishAllowed(rows, acceptPartial) {
|
|
165521
|
-
return !rows.some((
|
|
165750
|
+
return !rows.some((row2) => row2.slice === "screenMetadata") && (rows.length === 0 || acceptPartial);
|
|
165522
165751
|
}
|
|
165523
165752
|
var SELECTOR_KINDS;
|
|
165524
165753
|
var init_release_patch2 = __esm({
|
|
@@ -167814,37 +168043,37 @@ var init_preview_assets_generated = __esm({
|
|
|
167814
168043
|
"../../packages/serve/src/preview-assets.generated.ts"() {
|
|
167815
168044
|
init_preview_assets_format();
|
|
167816
168045
|
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-
|
|
168046
|
+
{ key: "assets/DashboardHost-D0AIh2Fi.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 2916, sha256: "eca2f8260addf4ead475e304f4bdb9aa3a5655aa9b9042a0107c73d3c5d8147f" },
|
|
168047
|
+
{ key: "assets/DevDrawer-Sm3GT4me.js", contentType: "application/javascript; charset=utf-8", offset: 2924, length: 16744, sha256: "1764380f2536a2da8715514073c657a2e7c1bcb8f299e5e8e273acae3bdc3164" },
|
|
168048
|
+
{ key: "assets/IdiomCompare-d9cqrgVi.js", contentType: "application/javascript; charset=utf-8", offset: 19668, length: 1892, sha256: "ea482691eaa9cda3d3239568d177e9332b94a0a59e9e9e5d269d059fe07ddd58" },
|
|
168049
|
+
{ key: "assets/LightboxViewer-NWgAZkvo.js", contentType: "application/javascript; charset=utf-8", offset: 21560, length: 8132, sha256: "21f6c5678752b22d095626e89c039bf1ab1cf566e9b0a880ddc7c64de2635f6a" },
|
|
168050
|
+
{ key: "assets/PhonePreviewControl-DmWDJR7y.js", contentType: "application/javascript; charset=utf-8", offset: 29692, length: 37729, sha256: "c528ff6a6503b5cecddcb95d98e7b10e71b38718513a992c95c3e61aac178c9a" },
|
|
168051
|
+
{ key: "assets/SchemeCompare-DAe05rjM.js", contentType: "application/javascript; charset=utf-8", offset: 67421, length: 1824, sha256: "ed47f5a463367279abfa343aaabb348b2cf419a48072a265442f84ba585976da" },
|
|
167823
168052
|
{ 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:
|
|
168053
|
+
{ key: "assets/index-DZLNpgeb.js", contentType: "application/javascript; charset=utf-8", offset: 69587, length: 1337208, sha256: "89aa5fffddb672994a2a13f4a209b5694ff41f2055b01d9d5837829682b7be6f" },
|
|
168054
|
+
{ key: "assets/pdf-DkBJdVwB.js", contentType: "application/javascript; charset=utf-8", offset: 1406795, length: 488199, sha256: "8d77ca7222c2580c60a06abe6c78163894a40593fae3a071e664a3a05110dbec" },
|
|
168055
|
+
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1894994, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
|
|
168056
|
+
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1895067, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
|
|
168057
|
+
{ key: "assets/pdfDocument-DKE-Ra33.js", contentType: "application/javascript; charset=utf-8", offset: 3212101, length: 3379, sha256: "675e5f6d7a6d04607c86b32573e1d28aa126a049f6df26e39d407a9cb3059fc9" },
|
|
168058
|
+
{ key: "assets/pdfFetch-Cc8i1I1h.js", contentType: "application/javascript; charset=utf-8", offset: 3215480, length: 2266, sha256: "1d21ad008921942217c9eac0c35b1713773b9d89c71e3ab4412781f7bb88f463" },
|
|
168059
|
+
{ key: "assets/webviewBridgeHost-Tij-rBHM.js", contentType: "application/javascript; charset=utf-8", offset: 3217746, length: 9781, sha256: "9ac08d6b6839d3927c9cd364e53a5b01992e534bf77247568e24b18b3e4d2bb7" },
|
|
168060
|
+
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3227527, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
|
|
168061
|
+
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3232137, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
|
|
168062
|
+
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3720721, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
|
|
168063
|
+
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3811645, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
|
|
168064
|
+
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3902629, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
|
|
168065
|
+
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 3993609, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
|
|
168066
|
+
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 4084481, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
|
|
168067
|
+
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4175461, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
|
|
168068
|
+
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4284097, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
|
|
168069
|
+
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4393181, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
|
|
168070
|
+
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4502229, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
|
|
168071
|
+
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4609929, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
|
|
168072
|
+
{ key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset: 4698037, length: 6748, sha256: "4a92459977d7cefa1a6a7e020c3a63509737f083b3f2773557c1a5771665811a" },
|
|
168073
|
+
{ key: "index.html", contentType: "text/html; charset=utf-8", offset: 4704785, length: 4947, sha256: "ce6250b8f09a5c349489f0db1b7410dbac5627087c11b4dddc7958fbde5641db" },
|
|
168074
|
+
{ key: "ios-glass-preview.css", contentType: "text/css; charset=utf-8", offset: 4709732, length: 7193, sha256: "a482f4796147c2a3893942e10ab225bd3b6f749f7125fe0330680d4c20ea0212" },
|
|
168075
|
+
{ key: "ios-glass-preview.svg", contentType: "image/svg+xml", offset: 4716925, length: 423, sha256: "b9cd5989d31464a0422f260a332af6be5add0b04de2148944de35158f3b75efc" },
|
|
168076
|
+
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4717348, length: 18778, sha256: "ba734d58c88281c71c01d9a2842a991d06f3ed91bf03449427ef11c7f6d1605d" }
|
|
167848
168077
|
];
|
|
167849
168078
|
}
|
|
167850
168079
|
});
|
|
@@ -168303,8 +168532,8 @@ function defaultGitOps(cwd = process.cwd()) {
|
|
|
168303
168532
|
return false;
|
|
168304
168533
|
}
|
|
168305
168534
|
},
|
|
168306
|
-
createTag(tag,
|
|
168307
|
-
run2(["tag", "-a", tag, "-m",
|
|
168535
|
+
createTag(tag, message2) {
|
|
168536
|
+
run2(["tag", "-a", tag, "-m", message2]);
|
|
168308
168537
|
},
|
|
168309
168538
|
pushTag(tag) {
|
|
168310
168539
|
run2(["push", "origin", tag]);
|
|
@@ -168541,8 +168770,8 @@ var init_iap_catalog_client = __esm({
|
|
|
168541
168770
|
}
|
|
168542
168771
|
};
|
|
168543
168772
|
IapCatalogError = class extends Error {
|
|
168544
|
-
constructor(code,
|
|
168545
|
-
super(
|
|
168773
|
+
constructor(code, message2, endpoint) {
|
|
168774
|
+
super(message2);
|
|
168546
168775
|
this.code = code;
|
|
168547
168776
|
this.endpoint = endpoint;
|
|
168548
168777
|
this.name = "IapCatalogError";
|
|
@@ -168796,8 +169025,8 @@ var init_iap_client = __esm({
|
|
|
168796
169025
|
TOKEN_LIFETIME_S = 1200;
|
|
168797
169026
|
TOKEN_REFRESH_MARGIN_S = 60;
|
|
168798
169027
|
AscError = class extends Error {
|
|
168799
|
-
constructor(kind,
|
|
168800
|
-
super(
|
|
169028
|
+
constructor(kind, message2, status, codes = [], detail = "", retryAfterMs2) {
|
|
169029
|
+
super(message2);
|
|
168801
169030
|
this.kind = kind;
|
|
168802
169031
|
this.status = status;
|
|
168803
169032
|
this.codes = codes;
|
|
@@ -170496,8 +170725,8 @@ var init_iap_plan = __esm({
|
|
|
170496
170725
|
init_iap_price_status();
|
|
170497
170726
|
init_iap_review_screenshot();
|
|
170498
170727
|
IapProvisionError = class extends Error {
|
|
170499
|
-
constructor(reason,
|
|
170500
|
-
super(
|
|
170728
|
+
constructor(reason, message2) {
|
|
170729
|
+
super(message2);
|
|
170501
170730
|
this.reason = reason;
|
|
170502
170731
|
this.name = "IapProvisionError";
|
|
170503
170732
|
}
|
|
@@ -170514,7 +170743,7 @@ var init_iap_plan = __esm({
|
|
|
170514
170743
|
isoDay = (date) => date.toISOString().slice(0, 10);
|
|
170515
170744
|
exactTarget = (price) => price.rule === "atLeast" ? void 0 : price.amount;
|
|
170516
170745
|
LEFTOVER_SCREENSHOT_STATES = /* @__PURE__ */ new Set(["AWAITING_UPLOAD", "FAILED"]);
|
|
170517
|
-
planError = (
|
|
170746
|
+
planError = (message2) => new IapProvisionError("plan", message2);
|
|
170518
170747
|
}
|
|
170519
170748
|
});
|
|
170520
170749
|
|
|
@@ -171363,9 +171592,9 @@ function redactValue(v2) {
|
|
|
171363
171592
|
if (v2 && typeof v2 === "object") return redactRow(v2);
|
|
171364
171593
|
return v2;
|
|
171365
171594
|
}
|
|
171366
|
-
function redactRow(
|
|
171595
|
+
function redactRow(row2) {
|
|
171367
171596
|
const out2 = {};
|
|
171368
|
-
for (const [k2, v2] of Object.entries(
|
|
171597
|
+
for (const [k2, v2] of Object.entries(row2)) {
|
|
171369
171598
|
out2[k2] = isSecretKey(k2) && v2 !== null && v2 !== void 0 && v2 !== "" ? "[redacted]" : redactValue(v2);
|
|
171370
171599
|
}
|
|
171371
171600
|
return out2;
|
|
@@ -172311,7 +172540,7 @@ function isItemRow(fields, entityId, price) {
|
|
|
172311
172540
|
return values.some((v2) => v2.toLowerCase() === entityId.toLowerCase()) && values.some((v2) => visibleText2(v2).includes(price));
|
|
172312
172541
|
}
|
|
172313
172542
|
function rowOffersPurchase(value2, entityId, price) {
|
|
172314
|
-
if (Array.isArray(value2)) return value2.some((
|
|
172543
|
+
if (Array.isArray(value2)) return value2.some((row2) => rowOffersPurchase(row2, entityId, price));
|
|
172315
172544
|
if (!value2 || typeof value2 !== "object") return false;
|
|
172316
172545
|
const fields = value2;
|
|
172317
172546
|
if (isItemRow(fields, entityId, price)) return offersPurchase(fields);
|
|
@@ -173123,11 +173352,11 @@ function firstProblem(report3) {
|
|
|
173123
173352
|
function printConnect(out2, report3, heading) {
|
|
173124
173353
|
out2.line(`himi store iap connect \u2014 ${heading}`);
|
|
173125
173354
|
out2.line(` ${pad("site")}${report3.site} \xB7 bundle ${report3.bundleId}`);
|
|
173126
|
-
const
|
|
173127
|
-
|
|
173128
|
-
|
|
173129
|
-
|
|
173130
|
-
for (const mapping of report3.mappings)
|
|
173355
|
+
const row2 = (label3, step) => out2.line(` ${pad(label3)}${step.state.padEnd(9)}${step.detail}`);
|
|
173356
|
+
row2("app", report3.app);
|
|
173357
|
+
row2("key", report3.credentials);
|
|
173358
|
+
row2("provider", report3.provider);
|
|
173359
|
+
for (const mapping of report3.mappings) row2("mapping", mapping);
|
|
173131
173360
|
if (report3.purchasesAppId) out2.line(` ${pad("binding")}wixIap: { purchasesAppId: "${report3.purchasesAppId}" }`);
|
|
173132
173361
|
}
|
|
173133
173362
|
function printConfig(out2, config, note) {
|
|
@@ -175888,8 +176117,8 @@ var init_base44_adopt = __esm({
|
|
|
175888
176117
|
BUILTINS = new Set(BASE44_BUILTIN_FIELDS);
|
|
175889
176118
|
ENTITY_NAME2 = /^[A-Za-z][A-Za-z0-9]*$/;
|
|
175890
176119
|
AdoptError = class extends Error {
|
|
175891
|
-
constructor(code,
|
|
175892
|
-
super(
|
|
176120
|
+
constructor(code, message2, exit = 1, extra = {}) {
|
|
176121
|
+
super(message2);
|
|
175893
176122
|
this.code = code;
|
|
175894
176123
|
this.exit = exit;
|
|
175895
176124
|
this.extra = extra;
|
|
@@ -176078,8 +176307,8 @@ var init_plan4 = __esm({
|
|
|
176078
176307
|
"src/base44-screens/plan.ts"() {
|
|
176079
176308
|
init_base44_schema();
|
|
176080
176309
|
PlanError = class extends Error {
|
|
176081
|
-
constructor(code,
|
|
176082
|
-
super(
|
|
176310
|
+
constructor(code, message2, extra = {}) {
|
|
176311
|
+
super(message2);
|
|
176083
176312
|
this.code = code;
|
|
176084
176313
|
this.extra = extra;
|
|
176085
176314
|
this.name = "PlanError";
|
|
@@ -176622,7 +176851,7 @@ async function seedBase44Entities(opts) {
|
|
|
176622
176851
|
continue;
|
|
176623
176852
|
}
|
|
176624
176853
|
const declared = new Set((spec.fields ?? []).map((f2) => f2.key));
|
|
176625
|
-
const clean2 = rows.map((
|
|
176854
|
+
const clean2 = rows.map((row2) => Object.fromEntries(Object.entries(row2).filter(([k2]) => declared.has(k2))));
|
|
176626
176855
|
const dropped = [...new Set(rows.flatMap((r3) => Object.keys(r3).filter((k2) => !declared.has(k2))))];
|
|
176627
176856
|
if (dropped.length) (report3.droppedKeys ??= {})[name] = dropped;
|
|
176628
176857
|
if (clean2.some((r3) => Object.keys(r3).length === 0)) {
|
|
@@ -177182,8 +177411,8 @@ var init_functions2 = __esm({
|
|
|
177182
177411
|
MAX_FILES = 200;
|
|
177183
177412
|
MAX_BYTES = 5 * 1024 * 1024;
|
|
177184
177413
|
FunctionSourceError = class extends Error {
|
|
177185
|
-
constructor(code,
|
|
177186
|
-
super(
|
|
177414
|
+
constructor(code, message2) {
|
|
177415
|
+
super(message2);
|
|
177187
177416
|
this.code = code;
|
|
177188
177417
|
}
|
|
177189
177418
|
};
|
|
@@ -178572,10 +178801,10 @@ async function readCms(call, opts = {}) {
|
|
|
178572
178801
|
query: { paging: { limit: 5 } }
|
|
178573
178802
|
});
|
|
178574
178803
|
const items = asArr(q2.data?.dataItems);
|
|
178575
|
-
const samples = items.slice(0, 5).map((
|
|
178576
|
-
const dataObj2 =
|
|
178804
|
+
const samples = items.slice(0, 5).map((row2, i2) => {
|
|
178805
|
+
const dataObj2 = row2.data && typeof row2.data === "object" ? row2.data : row2;
|
|
178577
178806
|
const title = sampleTitle(dataObj2);
|
|
178578
|
-
return { id: str8(
|
|
178807
|
+
return { id: str8(row2.id ?? dataObj2._id) || `row-${i2}`, ...title ? { title } : {} };
|
|
178579
178808
|
});
|
|
178580
178809
|
out2.push({
|
|
178581
178810
|
id,
|
|
@@ -181493,10 +181722,10 @@ function isString(data) {
|
|
|
181493
181722
|
function isObject(data) {
|
|
181494
181723
|
return objectToString(data) === "[object Object]";
|
|
181495
181724
|
}
|
|
181496
|
-
function validate4(bool2, cbOrMessage,
|
|
181725
|
+
function validate4(bool2, cbOrMessage, message2) {
|
|
181497
181726
|
if (bool2) return;
|
|
181498
181727
|
const cb = typeof cbOrMessage === "function" ? cbOrMessage : void 0;
|
|
181499
|
-
let options = typeof cbOrMessage === "function" ?
|
|
181728
|
+
let options = typeof cbOrMessage === "function" ? message2 : cbOrMessage;
|
|
181500
181729
|
if (!isObject(options)) options = "[object Object]";
|
|
181501
181730
|
const err = new ParameterError(safeToString(options));
|
|
181502
181731
|
if (cb) cb(err);
|
|
@@ -184286,7 +184515,7 @@ async function queryBase44Entities(opts) {
|
|
|
184286
184515
|
const declared = [];
|
|
184287
184516
|
for (const spec of specs) {
|
|
184288
184517
|
const physical = physicalEntityName(spec, app);
|
|
184289
|
-
const
|
|
184518
|
+
const row2 = {
|
|
184290
184519
|
entity: isAdoptedEntity(spec) ? spec.base44Name : spec.name,
|
|
184291
184520
|
physical,
|
|
184292
184521
|
ownership: isAdoptedEntity(spec) ? "adopted" : "owned",
|
|
@@ -184295,18 +184524,18 @@ async function queryBase44Entities(opts) {
|
|
|
184295
184524
|
};
|
|
184296
184525
|
const remote = live3?.get(physical);
|
|
184297
184526
|
if (live3 && !remote) {
|
|
184298
|
-
|
|
184527
|
+
row2.drift.push({ entity: physical, kind: "missing", detail: `entity "${physical}" is declared but the live app does not have it` });
|
|
184299
184528
|
} else {
|
|
184300
|
-
if (remote)
|
|
184529
|
+
if (remote) row2.drift = diffEntityFields(spec, remote);
|
|
184301
184530
|
try {
|
|
184302
184531
|
const c2 = await countRows(ports, appId2, physical, cap);
|
|
184303
|
-
|
|
184304
|
-
if (c2.capped)
|
|
184532
|
+
row2.rows = c2.rows;
|
|
184533
|
+
if (c2.capped) row2.capped = true;
|
|
184305
184534
|
} catch (e2) {
|
|
184306
|
-
|
|
184535
|
+
row2.countError = e2.message;
|
|
184307
184536
|
}
|
|
184308
184537
|
}
|
|
184309
|
-
declared.push(
|
|
184538
|
+
declared.push(row2);
|
|
184310
184539
|
}
|
|
184311
184540
|
const known = new Set(declared.map((d2) => d2.physical));
|
|
184312
184541
|
const foreignNames = live3 ? [...live3.keys()].filter((n2) => !known.has(n2)).sort() : [];
|
|
@@ -184340,8 +184569,8 @@ var OneAppError;
|
|
|
184340
184569
|
var init_errors2 = __esm({
|
|
184341
184570
|
"src/one-app/errors.ts"() {
|
|
184342
184571
|
OneAppError = class extends Error {
|
|
184343
|
-
constructor(code,
|
|
184344
|
-
super(
|
|
184572
|
+
constructor(code, message2, details) {
|
|
184573
|
+
super(message2);
|
|
184345
184574
|
this.code = code;
|
|
184346
184575
|
this.details = details;
|
|
184347
184576
|
this.name = "OneAppError";
|
|
@@ -184490,8 +184719,8 @@ async function collectOneApp(input, deps = {}) {
|
|
|
184490
184719
|
if (!response.ok) {
|
|
184491
184720
|
controller.abort();
|
|
184492
184721
|
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,
|
|
184722
|
+
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.";
|
|
184723
|
+
throw new OneAppError(code, message2, { stage, httpStatus: response.status });
|
|
184495
184724
|
}
|
|
184496
184725
|
const length = Number(response.headers.get("content-length"));
|
|
184497
184726
|
if (Number.isFinite(length) && length > maxBytes) {
|
|
@@ -185334,8 +185563,8 @@ function siteAppRequirementsFrom(appId2, entry) {
|
|
|
185334
185563
|
};
|
|
185335
185564
|
}
|
|
185336
185565
|
function messageOf2(err) {
|
|
185337
|
-
const
|
|
185338
|
-
return typeof
|
|
185566
|
+
const message2 = err?.message;
|
|
185567
|
+
return typeof message2 === "string" && message2 ? message2 : String(err);
|
|
185339
185568
|
}
|
|
185340
185569
|
function decideSiteApp(input) {
|
|
185341
185570
|
const fallback = (pickedAppId, reason) => ({ appId: DEFAULT_SITE_APP, source: "fallback", pickedAppId, reason });
|
|
@@ -186181,9 +186410,9 @@ function textFields(look) {
|
|
|
186181
186410
|
return out2;
|
|
186182
186411
|
}
|
|
186183
186412
|
function pushWhere(map, key3, value2, where) {
|
|
186184
|
-
const
|
|
186185
|
-
if (!
|
|
186186
|
-
map.set(key3,
|
|
186413
|
+
const row2 = map.get(key3) ?? { value: value2, where: [] };
|
|
186414
|
+
if (!row2.where.includes(where) && row2.where.length < CAP4.where) row2.where.push(where);
|
|
186415
|
+
map.set(key3, row2);
|
|
186187
186416
|
}
|
|
186188
186417
|
function templateContacts(identity, fields) {
|
|
186189
186418
|
const hits = /* @__PURE__ */ new Map();
|
|
@@ -190188,21 +190417,21 @@ import { basename as basename26, join as join120 } from "node:path";
|
|
|
190188
190417
|
function runId(now = /* @__PURE__ */ new Date()) {
|
|
190189
190418
|
return now.toISOString().replace(/[-:]/g, "").replace(/\..*/, "").replace("T", "-");
|
|
190190
190419
|
}
|
|
190191
|
-
function rowStatus(
|
|
190420
|
+
function rowStatus(row2, thresholds) {
|
|
190192
190421
|
const fail6 = [], warn3 = [];
|
|
190193
|
-
if (
|
|
190194
|
-
const parityExpected =
|
|
190195
|
-
const questions = [["design (web vs mockup)",
|
|
190422
|
+
if (row2.error) warn3.push(`${row2.error.code}: ${row2.error.message}`);
|
|
190423
|
+
const parityExpected = row2.frames.some((f2) => (f2.surface === "ios" || f2.surface === "android") && f2.file);
|
|
190424
|
+
const questions = [["design (web vs mockup)", row2.judge.design], ...parityExpected ? [["parity (native vs web)", row2.judge.parity]] : []];
|
|
190196
190425
|
for (const [question, v2] of questions) {
|
|
190197
190426
|
if (v2 === "mismatch") fail6.push(`judge: ${question} mismatch`);
|
|
190198
190427
|
else if (v2 === "partial") warn3.push(`judge: ${question} partial`);
|
|
190199
190428
|
}
|
|
190200
|
-
if (
|
|
190201
|
-
warn3.push(`judge: cannot tell${
|
|
190429
|
+
if (row2.judge.design === "cannot_tell" || row2.judge.parity === "cannot_tell" && parityExpected) {
|
|
190430
|
+
warn3.push(`judge: cannot tell${row2.judge.reason ? ` (${row2.judge.reason})` : ""}`);
|
|
190202
190431
|
}
|
|
190203
|
-
for (const f2 of
|
|
190204
|
-
if (
|
|
190205
|
-
const design =
|
|
190432
|
+
for (const f2 of row2.frames) if (f2.skipped) warn3.push(`${f2.surface} skipped: ${f2.skipped.reason}`);
|
|
190433
|
+
if (row2.frames.some((f2) => f2.noReference)) warn3.push("no_reference: the mockup does not style this variant");
|
|
190434
|
+
const design = row2.scores.find((s2) => s2.a === "mockup" && s2.b === "web");
|
|
190206
190435
|
if (!thresholds || !design) {
|
|
190207
190436
|
} else if (design.global < thresholds.fail) fail6.push(`score: mockup\u2194web ${design.global} < fail ${thresholds.fail}`);
|
|
190208
190437
|
else if (design.global < thresholds.warn) warn3.push(`score: mockup\u2194web ${design.global} < warn ${thresholds.warn}`);
|
|
@@ -190269,11 +190498,11 @@ async function runFidelity(root, opts = {}) {
|
|
|
190269
190498
|
const parity = captured.has("ios") || captured.has("android") ? verdict.parity : "cannot_tell";
|
|
190270
190499
|
verdict = { ...verdict, parity, verdict: worse(verdict.design, parity), findings: verdict.findings.filter((f2) => captured.has(f2.surface)) };
|
|
190271
190500
|
}
|
|
190272
|
-
const
|
|
190273
|
-
rows.push({ ...
|
|
190501
|
+
const row2 = { screen, variant, frames, scores, judge: verdict, ...stripFile ? { strip: stripFile } : {}, ...error ? { error } : {} };
|
|
190502
|
+
rows.push({ ...row2, ...rowStatus(row2, fidelityThresholds(manifest2, screen)) });
|
|
190274
190503
|
} catch (e2) {
|
|
190275
|
-
const
|
|
190276
|
-
rows.push({ ...
|
|
190504
|
+
const row2 = { screen, variant, frames, scores: [], judge: skippedJudge("the row did not finish"), error: { code: "fidelity_row_failed", message: e2.message } };
|
|
190505
|
+
rows.push({ ...row2, ...rowStatus(row2, fidelityThresholds(manifest2, screen)) });
|
|
190277
190506
|
}
|
|
190278
190507
|
}
|
|
190279
190508
|
}
|
|
@@ -190635,7 +190864,7 @@ var ServeCliClient = class {
|
|
|
190635
190864
|
* One probe costs one extra request only for files that were already going to fail. */
|
|
190636
190865
|
async telemetrySend(events) {
|
|
190637
190866
|
const post = (batch) => this.request("telemetry", "POST", "/v1/telemetry/ingest", { body: batch, headers: this.telHeaders() });
|
|
190638
|
-
const
|
|
190867
|
+
const settle2 = (r3, posted) => {
|
|
190639
190868
|
const j2 = r3.json && typeof r3.json === "object" ? r3.json : null;
|
|
190640
190869
|
const n2 = (k2) => typeof j2?.[k2] === "number" ? j2[k2] : 0;
|
|
190641
190870
|
const counted = typeof j2?.accepted === "number";
|
|
@@ -190645,11 +190874,11 @@ var ServeCliClient = class {
|
|
|
190645
190874
|
return { ...r3, ok: false, json: { ...j2 ?? {}, ok: false } };
|
|
190646
190875
|
};
|
|
190647
190876
|
const first = await post(events);
|
|
190648
|
-
if (first.status !== 413 || events.length <= 1) return
|
|
190877
|
+
if (first.status !== 413 || events.length <= 1) return settle2(first, events.length);
|
|
190649
190878
|
const body = first.json;
|
|
190650
|
-
if (!body || body.error !== "batch_too_large") return
|
|
190879
|
+
if (!body || body.error !== "batch_too_large") return settle2(first, events.length);
|
|
190651
190880
|
const limit = typeof body.limit === "number" && Number.isInteger(body.limit) && body.limit > 0 ? body.limit : null;
|
|
190652
|
-
if (limit === null || limit >= events.length) return
|
|
190881
|
+
if (limit === null || limit >= events.length) return settle2(first, events.length);
|
|
190653
190882
|
const totals = { accepted: 0, dropped: 0, failed: 0 };
|
|
190654
190883
|
const add = (r3) => {
|
|
190655
190884
|
const j2 = r3.json;
|
|
@@ -190665,14 +190894,14 @@ var ServeCliClient = class {
|
|
|
190665
190894
|
last = await post(chunk);
|
|
190666
190895
|
add(last);
|
|
190667
190896
|
if (!last.ok) {
|
|
190668
|
-
return
|
|
190897
|
+
return settle2(
|
|
190669
190898
|
{ ...last, json: { ...last.json ?? {}, ...totals, batched: { limit, sent, ...totals, failedAt: i2 } } },
|
|
190670
190899
|
events.length
|
|
190671
190900
|
);
|
|
190672
190901
|
}
|
|
190673
190902
|
sent += chunk.length;
|
|
190674
190903
|
}
|
|
190675
|
-
return
|
|
190904
|
+
return settle2(
|
|
190676
190905
|
{ ...last, json: { ...last.json ?? {}, ...totals, batched: { limit, sent, ...totals } } },
|
|
190677
190906
|
events.length
|
|
190678
190907
|
);
|
|
@@ -191205,14 +191434,16 @@ var USAGE = `himi \u2014 the Himalaya authoring CLI (remote dev loop)
|
|
|
191205
191434
|
and typed-journey stubs. Writes .himi/adopt.json, .himi/adopt-matrix.md and
|
|
191206
191435
|
.himi/himi-test.stub.json (--dry-run writes nothing)
|
|
191207
191436
|
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)
|
|
191437
|
+
list dev/index.ts screens (size, workers, onAppear) in any layout \u2014 a hand-written
|
|
191438
|
+
dev/index.ts is read by evaluating it, as validate does; --show prints ONE entry so
|
|
191209
191439
|
nobody reads the whole file; --write puts an edited entry back (re-parsed, refused
|
|
191210
191440
|
if it breaks the file or changes the screen count)
|
|
191211
191441
|
--add appends a NEW screen entry and registers it in linkableScreens (--parent/--tab)
|
|
191212
191442
|
himi template sweep --set "Old=>New" [--set \u2026] | --map <file.json> [--content <dir>] [--dry-run]
|
|
191213
191443
|
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
|
|
191444
|
+
identifiers) across dev/index.ts, config.ts, tokens.json and tier5-src; syntax-checks
|
|
191445
|
+
every changed file (and re-parses a generated SCREENS map) before writing, and
|
|
191446
|
+
reports placeholdersLeft
|
|
191216
191447
|
himi template recommend [--text <description>] [--verticals a,b] [--book <site analyze dir>] [--remote]
|
|
191217
191448
|
rank the catalog for one business: description words + owner-vs-customer, and the
|
|
191218
191449
|
site's installed verticals (the same scoring site analyze uses)
|
|
@@ -192619,7 +192850,7 @@ async function adoptAtInit(dir) {
|
|
|
192619
192850
|
const layout = /SCREENS = runtimeSetting/.test(msg);
|
|
192620
192851
|
return {
|
|
192621
192852
|
adopt: {
|
|
192622
|
-
skipped: layout ? "no adoption inventory for this template: its dev/index.ts is not in the generated SCREENS layout,
|
|
192853
|
+
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
192854
|
}
|
|
192624
192855
|
};
|
|
192625
192856
|
}
|
|
@@ -192850,8 +193081,8 @@ var VALID_PLATFORM_KEYS2 = /* @__PURE__ */ new Set([
|
|
|
192850
193081
|
]);
|
|
192851
193082
|
function surfaceIssues(dir, surfaceNav, strict) {
|
|
192852
193083
|
const issues = [];
|
|
192853
|
-
const warn3 = (
|
|
192854
|
-
const error = (
|
|
193084
|
+
const warn3 = (message2) => issues.push({ screen: null, pass: "surfaces", severity: strict ? "error" : "warning", message: message2 });
|
|
193085
|
+
const error = (message2) => issues.push({ screen: null, pass: "surfaces", severity: "error", message: message2 });
|
|
192855
193086
|
let platforms = {};
|
|
192856
193087
|
let envelopeUnreadable = false;
|
|
192857
193088
|
const p2 = join45(dir, "platforms.json");
|
|
@@ -193077,16 +193308,14 @@ async function templateCommand(ctx) {
|
|
|
193077
193308
|
const dir = contentDir(flags);
|
|
193078
193309
|
try {
|
|
193079
193310
|
if (sub === "inspect") {
|
|
193080
|
-
const inv = adopt.
|
|
193311
|
+
const { layoutNote: _n2, ...inv } = await adopt.inspectAnyLayout(dir);
|
|
193081
193312
|
const written = flags["dry-run"] === true ? [] : adopt.writeInventory(dir, inv);
|
|
193082
193313
|
const { dir: _d, ...rest } = inv;
|
|
193083
193314
|
print({ ...rest, written, summary: adopt.inventorySummary(inv) });
|
|
193084
193315
|
return 0;
|
|
193085
193316
|
}
|
|
193086
193317
|
if (sub === "screens") {
|
|
193087
|
-
const src = adopt.readAppSources(dir);
|
|
193088
193318
|
const { parseApp: parseApp2 } = await Promise.resolve().then(() => (init_template_trim(), template_trim_exports));
|
|
193089
|
-
const app = parseApp2(src.dev, src.config);
|
|
193090
193319
|
const show = str3(flags.show);
|
|
193091
193320
|
const target = str3(flags.write);
|
|
193092
193321
|
const adding = str3(flags.add);
|
|
@@ -193103,18 +193332,22 @@ async function templateCommand(ctx) {
|
|
|
193103
193332
|
return 0;
|
|
193104
193333
|
}
|
|
193105
193334
|
if (show) {
|
|
193335
|
+
const src = adopt.readAppSources(dir);
|
|
193336
|
+
const app = parseApp2(src.dev, src.config);
|
|
193106
193337
|
const r3 = adopt.findRoute(app, show);
|
|
193107
193338
|
if (!r3) throw new TrimRefusal2(`no screen "${show}" in dev/index.ts \u2014 \`himi template screens\` lists the ids`);
|
|
193108
193339
|
io2.log(src.dev.slice(r3.lineStart, r3.end).replace(/\n$/, ""));
|
|
193109
193340
|
return 0;
|
|
193110
193341
|
}
|
|
193111
|
-
const inv = adopt.
|
|
193342
|
+
const inv = await adopt.inspectAnyLayout(dir);
|
|
193112
193343
|
print({
|
|
193113
193344
|
ok: true,
|
|
193345
|
+
layout: inv.layout,
|
|
193114
193346
|
home: inv.home,
|
|
193115
193347
|
count: inv.screens.length,
|
|
193116
193348
|
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)"
|
|
193349
|
+
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",
|
|
193350
|
+
...inv.layoutNote ? { layoutNote: inv.layoutNote } : {}
|
|
193118
193351
|
});
|
|
193119
193352
|
return 0;
|
|
193120
193353
|
}
|
|
@@ -193618,14 +193851,14 @@ import { join as join60 } from "node:path";
|
|
|
193618
193851
|
async function iconIssues(dir, strict, opts = {}) {
|
|
193619
193852
|
if (!existsSync60(join60(dir, "himalaya.content.json"))) return [];
|
|
193620
193853
|
const status = await iconStatus(dir);
|
|
193621
|
-
const issue2 = (severity,
|
|
193854
|
+
const issue2 = (severity, message2) => ({
|
|
193622
193855
|
screen: null,
|
|
193623
193856
|
pass: "icon",
|
|
193624
193857
|
severity,
|
|
193625
|
-
message
|
|
193858
|
+
message: message2
|
|
193626
193859
|
});
|
|
193627
193860
|
const playIssues = (status.play?.issues ?? []).map(
|
|
193628
|
-
(
|
|
193861
|
+
(message2) => issue2("error", `Play listing icon (${PLAY_LISTING_ICON}) ${message2}. Re-derive it with \`himi icon set <file.png>\`.`)
|
|
193629
193862
|
);
|
|
193630
193863
|
if (status.verdict === "missing") {
|
|
193631
193864
|
if (status.declared) {
|
|
@@ -193646,8 +193879,8 @@ async function iconIssues(dir, strict, opts = {}) {
|
|
|
193646
193879
|
`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
193880
|
));
|
|
193648
193881
|
}
|
|
193649
|
-
for (const
|
|
193650
|
-
out2.push(issue2("error", `launcher icon ${
|
|
193882
|
+
for (const message2 of status.byteIssues) {
|
|
193883
|
+
out2.push(issue2("error", `launcher icon ${message2}. Fix it with \`himi icon set <file.png>\`.`));
|
|
193651
193884
|
}
|
|
193652
193885
|
for (const f2 of status.pixelFindings) {
|
|
193653
193886
|
out2.push(issue2(f2.level === "error" ? "error" : strict ? "error" : "warning", f2.message));
|
|
@@ -194124,13 +194357,13 @@ async function progressCommand2(ctx) {
|
|
|
194124
194357
|
const journal2 = journalPath2(dir);
|
|
194125
194358
|
const isContentPackage = existsSync71(join75(dir, "himalaya.content.json"));
|
|
194126
194359
|
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
|
|
194360
|
+
const message2 = pos.slice(1).join(" ").trim();
|
|
194128
194361
|
const approvalFlags = ["approve", "done", "drop"].filter((f2) => flags[f2] !== void 0);
|
|
194129
194362
|
if (approvalFlags.length > 1) {
|
|
194130
194363
|
io2.error(JSON.stringify({ ok: false, error: "one_approval_action", hint: "pass one of --approve, --done or --drop per call" }));
|
|
194131
194364
|
return 2;
|
|
194132
194365
|
}
|
|
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 && (
|
|
194366
|
+
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
194367
|
io2.error(JSON.stringify({
|
|
194135
194368
|
ok: false,
|
|
194136
194369
|
error: flags.brief === true ? "brief_is_read_only" : "approval_is_its_own_call",
|
|
@@ -194148,7 +194381,7 @@ async function progressCommand2(ctx) {
|
|
|
194148
194381
|
}
|
|
194149
194382
|
const action = flag === "approve" ? "approved" : flag === "done" ? "done" : "dropped";
|
|
194150
194383
|
try {
|
|
194151
|
-
const { event, open } = appendApproval2(dir, { gate: ref.gate, ..."id" in ref && ref.id ? { id: ref.id } : {}, action, ...
|
|
194384
|
+
const { event, open } = appendApproval2(dir, { gate: ref.gate, ..."id" in ref && ref.id ? { id: ref.id } : {}, action, ...message2 ? { note: message2 } : {} });
|
|
194152
194385
|
print({ ok: true, approval: event, open, ...hint });
|
|
194153
194386
|
return 0;
|
|
194154
194387
|
} catch (e2) {
|
|
@@ -194167,7 +194400,7 @@ async function progressCommand2(ctx) {
|
|
|
194167
194400
|
io2.log(formatBrief2({ appName: appLabel2(dir), isContentPackage, summary: summary2, open, ...note ? { agentContextNote: note } : {} }));
|
|
194168
194401
|
return 0;
|
|
194169
194402
|
}
|
|
194170
|
-
if (!
|
|
194403
|
+
if (!message2) {
|
|
194171
194404
|
if (flags.step !== void 0 || flags.image !== void 0 || flags.notify === true || flags["no-image"] === true) {
|
|
194172
194405
|
io2.error(JSON.stringify({ ok: false, error: "message_required", hint: 'progress "<what changed>" --step <n> --image <png>' }));
|
|
194173
194406
|
return 2;
|
|
@@ -194205,8 +194438,8 @@ async function progressCommand2(ctx) {
|
|
|
194205
194438
|
} else imageNote = `no picture attached: ${auto.skipped}`;
|
|
194206
194439
|
}
|
|
194207
194440
|
try {
|
|
194208
|
-
const entry = appendProgress2(dir, { message, ...step ? { step } : {}, images });
|
|
194209
|
-
const notified = flags.notify === true ? await notifyDesktop2(`himi \xB7 ${appLabel2(dir) ?? "your app"}`,
|
|
194441
|
+
const entry = appendProgress2(dir, { message: message2, ...step ? { step } : {}, images });
|
|
194442
|
+
const notified = flags.notify === true ? await notifyDesktop2(`himi \xB7 ${appLabel2(dir) ?? "your app"}`, message2) : void 0;
|
|
194210
194443
|
const { count: count2 } = summarizeProgress2(readProgress2(dir).entries);
|
|
194211
194444
|
const imageAttached = (entry.images?.length ?? 0) > 0;
|
|
194212
194445
|
const handed = handover && isContentPackage ? (await Promise.resolve().then(() => (init_milestones(), milestones_exports))).afterHandoverPostcard(dir, { content: str3(flags.content) }) : null;
|
|
@@ -194627,7 +194860,7 @@ async function testCommand(ctx) {
|
|
|
194627
194860
|
continue;
|
|
194628
194861
|
}
|
|
194629
194862
|
try {
|
|
194630
|
-
const progress = (
|
|
194863
|
+
const progress = (message2) => io2.error(`[native ${availability.platform} ${(/* @__PURE__ */ new Date()).toISOString()}] ${message2}`);
|
|
194631
194864
|
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
194865
|
result = mergeNativeDecode2(result, nativeRun);
|
|
194633
194866
|
} catch (error) {
|
|
@@ -194811,13 +195044,13 @@ async function iconCommand(ctx) {
|
|
|
194811
195044
|
level: requireVerified ? "error" : "warn",
|
|
194812
195045
|
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
195046
|
}] : [],
|
|
194814
|
-
...status.byteIssues.map((
|
|
195047
|
+
...status.byteIssues.map((message2) => ({ level: "error", message: message2 })),
|
|
194815
195048
|
...status.pixelFindings,
|
|
194816
195049
|
// Play's rules, on the derived 512 — the other half of what `check` claims to
|
|
194817
195050
|
// validate. Kept distinct in the text so nobody applies Apple's answer to it.
|
|
194818
|
-
...(status.play?.issues ?? []).map((
|
|
195051
|
+
...(status.play?.issues ?? []).map((message2) => ({
|
|
194819
195052
|
level: "error",
|
|
194820
|
-
message: `Play listing icon (${status.play?.path.split("/").pop()}) ${
|
|
195053
|
+
message: `Play listing icon (${status.play?.path.split("/").pop()}) ${message2}`
|
|
194821
195054
|
}))
|
|
194822
195055
|
];
|
|
194823
195056
|
if (flags.json === true) {
|
|
@@ -196355,12 +196588,12 @@ async function runPackageCommand(ctx) {
|
|
|
196355
196588
|
const live3 = join91(running.releaseRoot, running.app);
|
|
196356
196589
|
const manifestOf = (tree) => JSON.parse(readFileSync96(join91(tree, "release-manifest.json"), "utf8"));
|
|
196357
196590
|
let current = manifestOf(live3);
|
|
196358
|
-
const failed3 = async (
|
|
196591
|
+
const failed3 = async (message2) => {
|
|
196359
196592
|
if (stopping) return;
|
|
196360
|
-
bus.publish("build.failed", { message });
|
|
196361
|
-
record2(running, { ok: false, at: (/* @__PURE__ */ new Date()).toISOString(), error:
|
|
196593
|
+
bus.publish("build.failed", { message: message2 });
|
|
196594
|
+
record2(running, { ok: false, at: (/* @__PURE__ */ new Date()).toISOString(), error: message2 });
|
|
196362
196595
|
await refreshBoard();
|
|
196363
|
-
io2.error(JSON.stringify({ watch: "build_failed", keptLastGood: true, message }));
|
|
196596
|
+
io2.error(JSON.stringify({ watch: "build_failed", keptLastGood: true, message: message2 }));
|
|
196364
196597
|
};
|
|
196365
196598
|
rebuild = watchKit.serialize(async () => {
|
|
196366
196599
|
const t0 = Date.now();
|
|
@@ -196911,13 +197144,13 @@ function diagnoseBody(body) {
|
|
|
196911
197144
|
const findings = body.findings;
|
|
196912
197145
|
if (!Array.isArray(findings)) return body;
|
|
196913
197146
|
const messageOf3 = (entry) => {
|
|
196914
|
-
const
|
|
196915
|
-
return typeof
|
|
197147
|
+
const message2 = entry && typeof entry === "object" ? entry.message : void 0;
|
|
197148
|
+
return typeof message2 === "string" ? message2 : void 0;
|
|
196916
197149
|
};
|
|
196917
|
-
const shown2 = new Set(findings.map(messageOf3).filter((
|
|
197150
|
+
const shown2 = new Set(findings.map(messageOf3).filter((message2) => message2 !== void 0));
|
|
196918
197151
|
const folded = (value2) => Array.isArray(value2) && value2.length > 0 && value2.every((entry) => {
|
|
196919
|
-
const
|
|
196920
|
-
return
|
|
197152
|
+
const message2 = messageOf3(entry);
|
|
197153
|
+
return message2 !== void 0 && shown2.has(message2);
|
|
196921
197154
|
});
|
|
196922
197155
|
const out2 = {};
|
|
196923
197156
|
const emptied = [];
|
|
@@ -199772,9 +200005,9 @@ async function seedCms(opts) {
|
|
|
199772
200005
|
}
|
|
199773
200006
|
if (!dryRun) {
|
|
199774
200007
|
const declaredKeys = new Set(spec.fields.map((f2) => f2.key));
|
|
199775
|
-
const clean2 = rows.map((
|
|
200008
|
+
const clean2 = rows.map((row2) => {
|
|
199776
200009
|
const out2 = {};
|
|
199777
|
-
for (const [k2, v2] of Object.entries(
|
|
200010
|
+
for (const [k2, v2] of Object.entries(row2)) if (declaredKeys.has(k2)) out2[k2] = v2;
|
|
199778
200011
|
return out2;
|
|
199779
200012
|
});
|
|
199780
200013
|
const droppedKeys = [...new Set(rows.flatMap((r3) => Object.keys(r3).filter((k2) => !declaredKeys.has(k2))))];
|
|
@@ -199787,11 +200020,11 @@ async function seedCms(opts) {
|
|
|
199787
200020
|
await mapLimit(
|
|
199788
200021
|
clean2,
|
|
199789
200022
|
4,
|
|
199790
|
-
(
|
|
200023
|
+
(row2, i2) => (
|
|
199791
200024
|
// Sent EXACTLY ONCE. An insert carries no idempotency key, so retrying a request
|
|
199792
200025
|
// that landed but whose response was lost silently duplicates the row — and a
|
|
199793
200026
|
// duplicate is worse than a reported failure the author can re-run deliberately.
|
|
199794
|
-
call("POST", "/wix-data/v2/items", { dataCollectionId: id, dataItem: { data:
|
|
200027
|
+
call("POST", "/wix-data/v2/items", { dataCollectionId: id, dataItem: { data: row2 } })
|
|
199795
200028
|
)
|
|
199796
200029
|
);
|
|
199797
200030
|
}
|
|
@@ -199937,7 +200170,7 @@ async function planData(options) {
|
|
|
199937
200170
|
kv.push({ name: spec.name, status: !remote.exists ? "missing" : drift ? "drift" : "ready", ...drift ? { detail: "declaration differs from provisioned KV metadata" } : {} });
|
|
199938
200171
|
}
|
|
199939
200172
|
const collections = await queryCms({ app: options.scope.app, cms: { collections: options.data?.collections ?? [] }, call: options.call });
|
|
199940
|
-
return { ok: kv.every((
|
|
200173
|
+
return { ok: kv.every((row2) => row2.status === "ready") && collections.ok, scope: { ...options.scope }, kv, collections, writes: 0 };
|
|
199941
200174
|
}
|
|
199942
200175
|
async function createData(options) {
|
|
199943
200176
|
const created = [];
|
|
@@ -200981,7 +201214,7 @@ himi v${cliVersion()} \u2014 run \`himi --version\`. If authoring commands fail
|
|
|
200981
201214
|
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
201215
|
notCarried,
|
|
200983
201216
|
carriedByPatch: ["screens", "bundles", "tokens", "appConfig"],
|
|
200984
|
-
hint: notCarried.some((
|
|
201217
|
+
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
201218
|
}), null, 2));
|
|
200986
201219
|
return 1;
|
|
200987
201220
|
}
|