@wix/himalaya-cli 0.1597.0 → 0.1599.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/legacy-import/src/index.d.ts +30 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/sdk-types/src/capabilities.generated.d.ts +2 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/webview-page/src/capabilities.generated.d.ts +2 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/define-app.d.ts +12 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/legacy-import.d.ts +134 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/audio-record.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calendar.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/calls.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/contacts.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/core.mjs +184 -16
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/legacy-import.mjs +40 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/location.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/motion.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/photos.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdk-types.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/tasks.mjs +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/package.json +4 -0
- package/dist/cli.mjs +641 -510
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/app-config.md +1 -1
- package/guides/capabilities.md +1 -0
- package/guides/importable-sdks.md +1 -0
- package/guides/qa-builds.md +43 -1
- package/guides/sdk-reference.json +43 -0
- package/guides/web-page-native-sdk.md +1 -1
- package/guides/web-page-sdk-reference.md +1 -0
- package/package.json +2 -2
package/dist/cli.mjs
CHANGED
|
@@ -38,8 +38,8 @@ var init_define_HHP_CATALOG = __esm({
|
|
|
38
38
|
"<define:__HHP_CATALOG__>"() {
|
|
39
39
|
define_HHP_CATALOG_default = {
|
|
40
40
|
encoding: "gzip-base64",
|
|
41
|
-
sha256: "
|
|
42
|
-
data: "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"
|
|
41
|
+
sha256: "62f409944e6e4fc7356d2ce53520f71b4631dc67513c6f6671a01134c5808956",
|
|
42
|
+
data: "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"
|
|
43
43
|
};
|
|
44
44
|
}
|
|
45
45
|
});
|
|
@@ -1821,7 +1821,7 @@ function sentinelizeIdentity(body, identity) {
|
|
|
1821
1821
|
}
|
|
1822
1822
|
if (identity.name) {
|
|
1823
1823
|
const re2 = new RegExp(`\\b(${NAME_FIELDS.join("|")})(["']?\\s*[:=]\\s*)(["'])${escapeRe(identity.name)}\\3`, "g");
|
|
1824
|
-
out2 = out2.replace(re2, (_m, key3,
|
|
1824
|
+
out2 = out2.replace(re2, (_m, key3, sep26, q3) => `${key3}${sep26}${q3}__HIMI_APP_NAME__${q3}`);
|
|
1825
1825
|
}
|
|
1826
1826
|
return out2;
|
|
1827
1827
|
}
|
|
@@ -3339,7 +3339,7 @@ function distJobSpec(req) {
|
|
|
3339
3339
|
// not get to answer a per-shell question.
|
|
3340
3340
|
...req.provisioningEnv ? { HIMI_DIST_PROVISIONING_ENV: req.provisioningEnv } : {}
|
|
3341
3341
|
};
|
|
3342
|
-
const command =
|
|
3342
|
+
const command = `${req.runner === "linux" ? "linux:" : ""}dist:${req.platform} ${DIST_PARAMS_FLAG} ${encodeDistParams(envVars)}`;
|
|
3343
3343
|
if (command.length > MAX_COMMAND_CHARS) {
|
|
3344
3344
|
throw new Error(
|
|
3345
3345
|
`dist command is ${command.length} chars (cap ${MAX_COMMAND_CHARS}); shrink the job env \u2014 pass large values as a URL the Mac job fetches, as the brand contract does`
|
|
@@ -3547,7 +3547,7 @@ var init_dist_jobs = __esm({
|
|
|
3547
3547
|
DEFAULT_DIST_SIGNING = "wix-managed";
|
|
3548
3548
|
WIX_MANAGED_SIGNING_ALIASES = ["wix-managed", "wix", "pool-enterprise"];
|
|
3549
3549
|
DEFAULT_ANDROID_SIGNING = "qa-keystore";
|
|
3550
|
-
ANDROID_SIGNING_POLICIES = ["qa-keystore", "wix-keystore", "debug", "oneapp-debug"];
|
|
3550
|
+
ANDROID_SIGNING_POLICIES = ["qa-keystore", "wix-keystore", "debug", "oneapp-debug", "unsigned"];
|
|
3551
3551
|
ANDROID_SIGNING_ALIASES = {
|
|
3552
3552
|
// The canonical spellings, derived so the two lists cannot drift apart.
|
|
3553
3553
|
...Object.fromEntries(ANDROID_SIGNING_POLICIES.map((p2) => [p2, p2])),
|
|
@@ -3556,7 +3556,9 @@ var init_dist_jobs = __esm({
|
|
|
3556
3556
|
wix: "wix-keystore",
|
|
3557
3557
|
oneapp: "wix-keystore",
|
|
3558
3558
|
"one-app-debug": "oneapp-debug",
|
|
3559
|
-
oneappdebug: "oneapp-debug"
|
|
3559
|
+
oneappdebug: "oneapp-debug",
|
|
3560
|
+
// The CLI's word for an owner bundle. `unsigned` is the fact about the file, which the pool reports.
|
|
3561
|
+
owner: "unsigned"
|
|
3560
3562
|
};
|
|
3561
3563
|
DEFAULT_ANDROID_FORMAT = "apk";
|
|
3562
3564
|
ANDROID_FORMATS = ["apk", "aab"];
|
|
@@ -3595,8 +3597,8 @@ function committedProvisioningPath(name) {
|
|
|
3595
3597
|
function committedShellFor(path2) {
|
|
3596
3598
|
const normalized = path2.replace(/\\/g, "/");
|
|
3597
3599
|
return SHELL_NAMES.find((name) => {
|
|
3598
|
-
const
|
|
3599
|
-
return normalized ===
|
|
3600
|
+
const relative27 = committedProvisioningPath(name);
|
|
3601
|
+
return normalized === relative27 || normalized.endsWith(`/${relative27}`);
|
|
3600
3602
|
});
|
|
3601
3603
|
}
|
|
3602
3604
|
function isBrandable(repoRoot2, name) {
|
|
@@ -4993,8 +4995,8 @@ var init_catalog_cache = __esm({
|
|
|
4993
4995
|
|
|
4994
4996
|
// ../authoring-kit/ensure-authoring-client.mjs
|
|
4995
4997
|
import { spawnSync as spawnSync2 } from "node:child_process";
|
|
4996
|
-
import { existsSync as existsSync5, readdirSync as readdirSync4, readFileSync as readFileSync6, renameSync as renameSync2, rmSync as rmSync2, writeFileSync as writeFileSync4 } from "node:fs";
|
|
4997
|
-
import { basename as basename2, dirname as dirname6, join as join7, resolve as resolve4 } from "node:path";
|
|
4998
|
+
import { existsSync as existsSync5, lstatSync as lstatSync3, mkdirSync as mkdirSync4, readdirSync as readdirSync4, readFileSync as readFileSync6, renameSync as renameSync2, rmSync as rmSync2, writeFileSync as writeFileSync4 } from "node:fs";
|
|
4999
|
+
import { basename as basename2, dirname as dirname6, join as join7, relative, resolve as resolve4, sep as sep3 } from "node:path";
|
|
4998
5000
|
import { fileURLToPath as fileURLToPath3 } from "node:url";
|
|
4999
5001
|
function aggregatesStamp(root = REPO) {
|
|
5000
5002
|
return resolve4(root, "tools/authoring-kit/aggregates.stamp.json");
|
|
@@ -5063,7 +5065,7 @@ __export(guides_exports, {
|
|
|
5063
5065
|
withReferenceCache: () => withReferenceCache,
|
|
5064
5066
|
writeAgentContext: () => writeAgentContext
|
|
5065
5067
|
});
|
|
5066
|
-
import { readFileSync as readFileSync7, existsSync as existsSync6, mkdirSync as
|
|
5068
|
+
import { readFileSync as readFileSync7, existsSync as existsSync6, mkdirSync as mkdirSync5, writeFileSync as writeFileSync5, lstatSync as lstatSync4, readdirSync as readdirSync5, renameSync as renameSync3, rmdirSync } from "node:fs";
|
|
5067
5069
|
import { fileURLToPath as fileURLToPath4 } from "node:url";
|
|
5068
5070
|
import { dirname as dirname7, join as join8, resolve as resolve5 } from "node:path";
|
|
5069
5071
|
import { AsyncLocalStorage } from "node:async_hooks";
|
|
@@ -5283,8 +5285,8 @@ function removeLegacyRootCopies(targetDir) {
|
|
|
5283
5285
|
for (const rel of legacy) {
|
|
5284
5286
|
const p2 = linkFreeTarget(targetDir, rel);
|
|
5285
5287
|
const dest = linkFreeTarget(targetDir, `.himi/legacy-agent-files/${rel}`);
|
|
5286
|
-
if (p2 && dest && existsSync6(p2) &&
|
|
5287
|
-
|
|
5288
|
+
if (p2 && dest && existsSync6(p2) && lstatSync4(p2).isFile()) {
|
|
5289
|
+
mkdirSync5(dirname7(dest), { recursive: true });
|
|
5288
5290
|
renameSync3(p2, existsSync6(dest) ? `${dest}.${Date.now()}` : dest);
|
|
5289
5291
|
removed.push(rel);
|
|
5290
5292
|
}
|
|
@@ -5298,7 +5300,7 @@ function linkFreeTarget(dir, rel) {
|
|
|
5298
5300
|
for (const part4 of rel.split(/[\\/]+/).filter(Boolean)) {
|
|
5299
5301
|
at2 = join8(at2, part4);
|
|
5300
5302
|
try {
|
|
5301
|
-
if (
|
|
5303
|
+
if (lstatSync4(at2).isSymbolicLink()) return null;
|
|
5302
5304
|
} catch (e2) {
|
|
5303
5305
|
if (e2.code === "ENOENT") break;
|
|
5304
5306
|
return null;
|
|
@@ -5327,20 +5329,20 @@ function writeAgentContext(targetDir, opts = {}) {
|
|
|
5327
5329
|
const write2 = (rel, body) => {
|
|
5328
5330
|
const p2 = target(rel);
|
|
5329
5331
|
if (!p2) return;
|
|
5330
|
-
|
|
5332
|
+
mkdirSync5(dirname7(p2), { recursive: true });
|
|
5331
5333
|
writeFileSync5(p2, body);
|
|
5332
5334
|
files.push(rel);
|
|
5333
5335
|
};
|
|
5334
5336
|
const copy = (srcRel, destRel) => {
|
|
5335
5337
|
const p2 = target(destRel);
|
|
5336
5338
|
if (!p2) return;
|
|
5337
|
-
|
|
5339
|
+
mkdirSync5(dirname7(p2), { recursive: true });
|
|
5338
5340
|
writeFileSync5(p2, readReference(srcRel));
|
|
5339
5341
|
files.push(destRel);
|
|
5340
5342
|
};
|
|
5341
5343
|
const writeIfMissing = (rel, body) => {
|
|
5342
5344
|
try {
|
|
5343
|
-
|
|
5345
|
+
lstatSync4(join8(targetDir, rel));
|
|
5344
5346
|
return;
|
|
5345
5347
|
} catch {
|
|
5346
5348
|
write2(rel, body);
|
|
@@ -6761,9 +6763,9 @@ function compileV2(html, profile, options) {
|
|
|
6761
6763
|
if (!row2) error(el2, "HHP-BINDING-SCOPE", "Item bindings require a keyed list template.");
|
|
6762
6764
|
return raw;
|
|
6763
6765
|
}
|
|
6764
|
-
const
|
|
6765
|
-
if (!info4?.paths.has(
|
|
6766
|
-
return `$service:${serviceName}.${
|
|
6766
|
+
const relative27 = statePath(raw);
|
|
6767
|
+
if (!info4?.paths.has(relative27)) error(el2, "HHP-BINDING-PATH", `Unknown controller state path ${relative27}.`);
|
|
6768
|
+
return `$service:${serviceName}.${relative27}`;
|
|
6767
6769
|
}
|
|
6768
6770
|
const read = (value2, dotted) => dotted.split(".").reduce((current, key3) => current && typeof current === "object" && Object.hasOwn(current, key3) ? current[key3] : void 0, value2);
|
|
6769
6771
|
function rowValues(row2, raw) {
|
|
@@ -7403,8 +7405,8 @@ __export(progress_exports, {
|
|
|
7403
7405
|
import { spawn } from "node:child_process";
|
|
7404
7406
|
import { createHash as createHash4 } from "node:crypto";
|
|
7405
7407
|
import { randomUUID as randomUUID2 } from "node:crypto";
|
|
7406
|
-
import { appendFileSync, closeSync, existsSync as existsSync7, lstatSync as
|
|
7407
|
-
import { isAbsolute, join as join9, relative, resolve as resolve6, sep as
|
|
7408
|
+
import { appendFileSync, closeSync, existsSync as existsSync7, lstatSync as lstatSync5, mkdirSync as mkdirSync6, openSync, readdirSync as readdirSync6, readFileSync as readFileSync9, readSync, renameSync as renameSync4, rmSync as rmSync3, statSync as statSync2, writeFileSync as writeFileSync6 } from "node:fs";
|
|
7409
|
+
import { isAbsolute, join as join9, relative as relative2, resolve as resolve6, sep as sep4 } from "node:path";
|
|
7408
7410
|
function agentCovers(agent, cli) {
|
|
7409
7411
|
if (isCliEntry(agent)) return false;
|
|
7410
7412
|
const agentShas = shasOf(agent.images);
|
|
@@ -7458,11 +7460,11 @@ function realDirIn(dir, rel) {
|
|
|
7458
7460
|
for (const part4 of rel.split(/[\\/]+/).filter(Boolean)) {
|
|
7459
7461
|
at2 = join9(at2, part4);
|
|
7460
7462
|
try {
|
|
7461
|
-
if (!
|
|
7463
|
+
if (!lstatSync5(at2).isDirectory()) return null;
|
|
7462
7464
|
} catch (e2) {
|
|
7463
7465
|
if (e2.code !== "ENOENT") return null;
|
|
7464
|
-
|
|
7465
|
-
if (!
|
|
7466
|
+
mkdirSync6(at2);
|
|
7467
|
+
if (!lstatSync5(at2).isDirectory()) return null;
|
|
7466
7468
|
}
|
|
7467
7469
|
}
|
|
7468
7470
|
return at2;
|
|
@@ -7479,7 +7481,7 @@ function writeFileAtomic(file2, content) {
|
|
|
7479
7481
|
}
|
|
7480
7482
|
function isSymlink(file2) {
|
|
7481
7483
|
try {
|
|
7482
|
-
return
|
|
7484
|
+
return lstatSync5(file2).isSymbolicLink();
|
|
7483
7485
|
} catch {
|
|
7484
7486
|
return false;
|
|
7485
7487
|
}
|
|
@@ -7521,7 +7523,7 @@ function appendProgress(dir, input) {
|
|
|
7521
7523
|
return entry;
|
|
7522
7524
|
}
|
|
7523
7525
|
function packageRelative(dir, p2) {
|
|
7524
|
-
const rel =
|
|
7526
|
+
const rel = relative2(dir, resolve6(p2));
|
|
7525
7527
|
return rel && !rel.startsWith("..") && !isAbsolute(rel) ? toPosix(rel) : null;
|
|
7526
7528
|
}
|
|
7527
7529
|
function endsWithNewline(file2) {
|
|
@@ -7683,7 +7685,7 @@ function carryPlanningJournal(parentDir, appDir3) {
|
|
|
7683
7685
|
if (existsSync7(join9(parentDir, "himalaya.content.json"))) return [];
|
|
7684
7686
|
const src = join9(parentDir, ".himi");
|
|
7685
7687
|
try {
|
|
7686
|
-
if (!
|
|
7688
|
+
if (!lstatSync5(src).isDirectory()) return [];
|
|
7687
7689
|
} catch {
|
|
7688
7690
|
return [];
|
|
7689
7691
|
}
|
|
@@ -7700,12 +7702,12 @@ function carryPlanningJournal(parentDir, appDir3) {
|
|
|
7700
7702
|
const hist = join9(parentDir, HISTORY_DIR);
|
|
7701
7703
|
let names2 = [];
|
|
7702
7704
|
try {
|
|
7703
|
-
if (
|
|
7705
|
+
if (lstatSync5(hist).isDirectory()) names2 = readdirSync6(hist);
|
|
7704
7706
|
} catch {
|
|
7705
7707
|
}
|
|
7706
7708
|
for (const name of names2) {
|
|
7707
7709
|
const from = join9(hist, name);
|
|
7708
|
-
if (isSymlink(from) || !
|
|
7710
|
+
if (isSymlink(from) || !lstatSync5(from).isFile()) continue;
|
|
7709
7711
|
const bytes2 = readFileSync9(from);
|
|
7710
7712
|
archiveBytes(appDir3, bytes2);
|
|
7711
7713
|
}
|
|
@@ -7717,7 +7719,7 @@ function formatBrief(input) {
|
|
|
7717
7719
|
const who = `himi \u2014 ${input.appName ?? "this folder"}`;
|
|
7718
7720
|
const lines = [];
|
|
7719
7721
|
if (!summary2.count) {
|
|
7720
|
-
lines.push(`${who}: no journey journal yet (${PROGRESS_FILE.split(
|
|
7722
|
+
lines.push(`${who}: no journey journal yet (${PROGRESS_FILE.split(sep4).join("/")}).`);
|
|
7721
7723
|
lines.push(
|
|
7722
7724
|
'A new app starts with discovery (step 1). An app built before journaling existed continues from its current state instead: confirm with the customer that its SPEC.md was approved rather than re-running discovery. Either way, journal each milestone with `himi progress "<what changed>" --step <n>` so the next session can pick up from it.'
|
|
7723
7725
|
);
|
|
@@ -7799,7 +7801,7 @@ function appLabel(dir) {
|
|
|
7799
7801
|
}
|
|
7800
7802
|
function journalPath(dir) {
|
|
7801
7803
|
const abs = join9(dir, PROGRESS_FILE);
|
|
7802
|
-
const rel =
|
|
7804
|
+
const rel = relative2(process.cwd(), abs);
|
|
7803
7805
|
return rel && !rel.startsWith("..") ? rel : abs;
|
|
7804
7806
|
}
|
|
7805
7807
|
var JOURNEY_STEPS, CLI_AUTHOR, AUTO_MILESTONES, MILESTONE_STEP, AGENT_WINS_WITHIN_MS, isCliEntry, shasOf, PROGRESS_FILE, HISTORY_DIR, APPROVALS_FILE, APPROVAL_GATES, MAX_MESSAGE_CHARS, MAX_IMAGE_BYTES, ProgressError, toPosix, UnsafeHimiDirError, SECRET_SHAPES, looksSecret, REF_SHAPE, gateLabel, minute, NOTIFY_TIMEOUT_MS;
|
|
@@ -7833,7 +7835,7 @@ var init_progress = __esm({
|
|
|
7833
7835
|
this.code = code;
|
|
7834
7836
|
}
|
|
7835
7837
|
};
|
|
7836
|
-
toPosix = (p2) => p2.split(
|
|
7838
|
+
toPosix = (p2) => p2.split(sep4).join("/");
|
|
7837
7839
|
UnsafeHimiDirError = class extends Error {
|
|
7838
7840
|
constructor(rel) {
|
|
7839
7841
|
super(`${rel} is not a real directory inside the content package (a symlink?) \u2014 refusing to write through it`);
|
|
@@ -8520,7 +8522,7 @@ var init_run_identity = __esm({
|
|
|
8520
8522
|
|
|
8521
8523
|
// src/mcp/preview.ts
|
|
8522
8524
|
import { spawn as nodeSpawn } from "node:child_process";
|
|
8523
|
-
import { closeSync as closeSync2, constants as fsc, existsSync as existsSync8, lstatSync as
|
|
8525
|
+
import { closeSync as closeSync2, constants as fsc, existsSync as existsSync8, lstatSync as lstatSync6, mkdirSync as mkdirSync7, openSync as openSync2, readFileSync as readFileSync10, rmSync as rmSync4 } from "node:fs";
|
|
8524
8526
|
import { createServer } from "node:net";
|
|
8525
8527
|
import { basename as basename3, join as join10 } from "node:path";
|
|
8526
8528
|
function previewPortFor(appName2) {
|
|
@@ -8570,14 +8572,14 @@ async function recordState(dir, r3, deps) {
|
|
|
8570
8572
|
}
|
|
8571
8573
|
function openPreviewLog(dir, name = "preview.log") {
|
|
8572
8574
|
const himiDir2 = join10(dir, ".himi");
|
|
8573
|
-
if (existsSync8(himiDir2) && !
|
|
8575
|
+
if (existsSync8(himiDir2) && !lstatSync6(himiDir2).isDirectory()) {
|
|
8574
8576
|
throw new PreviewStartError(`${himiDir2} is not a real directory (a symlink?) \u2014 refusing to write the preview log through it`, "");
|
|
8575
8577
|
}
|
|
8576
|
-
|
|
8578
|
+
mkdirSync7(himiDir2, { recursive: true });
|
|
8577
8579
|
const path2 = join10(himiDir2, name);
|
|
8578
8580
|
let existing;
|
|
8579
8581
|
try {
|
|
8580
|
-
existing =
|
|
8582
|
+
existing = lstatSync6(path2);
|
|
8581
8583
|
} catch {
|
|
8582
8584
|
}
|
|
8583
8585
|
if (existing?.isDirectory()) {
|
|
@@ -8745,7 +8747,7 @@ var init_preview = __esm({
|
|
|
8745
8747
|
});
|
|
8746
8748
|
|
|
8747
8749
|
// src/mcp/client-configs.ts
|
|
8748
|
-
import { dirname as dirname8, relative as
|
|
8750
|
+
import { dirname as dirname8, relative as relative3, resolve as resolve8, sep as sep5 } from "node:path";
|
|
8749
8751
|
import { fileURLToPath as fileURLToPath5 } from "node:url";
|
|
8750
8752
|
function sourceCheckout(moduleUrl = import.meta.url) {
|
|
8751
8753
|
if (!moduleUrl.endsWith(".ts")) return null;
|
|
@@ -8843,8 +8845,8 @@ var init_client_configs = __esm({
|
|
|
8843
8845
|
NPM_PACKAGE = HIMI_NPM_PACKAGE;
|
|
8844
8846
|
HERE2 = dirname8(fileURLToPath5(import.meta.url));
|
|
8845
8847
|
inside = (child, parent) => {
|
|
8846
|
-
const rel =
|
|
8847
|
-
return rel === "" || !rel.startsWith("..") && !rel.startsWith(
|
|
8848
|
+
const rel = relative3(parent, child);
|
|
8849
|
+
return rel === "" || !rel.startsWith("..") && !rel.startsWith(sep5) && !/^[A-Za-z]:/.test(rel);
|
|
8848
8850
|
};
|
|
8849
8851
|
same = (a2, b2) => JSON.stringify(a2) === JSON.stringify(b2);
|
|
8850
8852
|
out = (o2) => `${JSON.stringify(o2, null, 2)}
|
|
@@ -8875,7 +8877,7 @@ __export(agent_context_exports, {
|
|
|
8875
8877
|
withoutBlock: () => withoutBlock,
|
|
8876
8878
|
writeAgentLayer: () => writeAgentLayer
|
|
8877
8879
|
});
|
|
8878
|
-
import { existsSync as existsSync9, lstatSync as
|
|
8880
|
+
import { existsSync as existsSync9, lstatSync as lstatSync7, mkdirSync as mkdirSync8, readFileSync as readFileSync11, realpathSync as realpathSync2, writeFileSync as writeFileSync7 } from "node:fs";
|
|
8879
8881
|
import { dirname as dirname9, join as join11 } from "node:path";
|
|
8880
8882
|
function beginMarker(version5) {
|
|
8881
8883
|
return `${BLOCK_BEGIN} v=${version5} \u2014 written by \`himi agent-init\`; edit OUTSIDE this block, it is replaced on refresh -->`;
|
|
@@ -8962,7 +8964,7 @@ perform the step. Reading the pages of a site the customer already published nee
|
|
|
8962
8964
|
}
|
|
8963
8965
|
function claudeLinksToAgents(dir) {
|
|
8964
8966
|
try {
|
|
8965
|
-
if (!
|
|
8967
|
+
if (!lstatSync7(join11(dir, "CLAUDE.md")).isSymbolicLink()) return false;
|
|
8966
8968
|
return realpathSync2(join11(dir, "CLAUDE.md")) === realpathSync2(join11(dir, "AGENTS.md"));
|
|
8967
8969
|
} catch {
|
|
8968
8970
|
return false;
|
|
@@ -9052,7 +9054,7 @@ function writeAgentLayer(dir, opts) {
|
|
|
9052
9054
|
skipped.push({ file: posix(rel), reason: LINKED_PATH_REASON });
|
|
9053
9055
|
return;
|
|
9054
9056
|
}
|
|
9055
|
-
|
|
9057
|
+
mkdirSync8(dirname9(p2), { recursive: true });
|
|
9056
9058
|
if (readOrNull(p2) !== body) writeFileSync7(p2, body);
|
|
9057
9059
|
files.push(posix(rel));
|
|
9058
9060
|
};
|
|
@@ -9225,8 +9227,8 @@ __export(build_lib_exports, {
|
|
|
9225
9227
|
umbrellaRewritePlugin: () => umbrellaRewritePlugin
|
|
9226
9228
|
});
|
|
9227
9229
|
import { fileURLToPath as fileURLToPath6, pathToFileURL } from "node:url";
|
|
9228
|
-
import { basename as basename4, dirname as dirname10, join as join12, resolve as resolve9, sep as
|
|
9229
|
-
import { readdirSync as readdirSync7, existsSync as existsSync10, mkdirSync as
|
|
9230
|
+
import { basename as basename4, dirname as dirname10, join as join12, resolve as resolve9, sep as sep6 } from "node:path";
|
|
9231
|
+
import { readdirSync as readdirSync7, existsSync as existsSync10, mkdirSync as mkdirSync9, readFileSync as readFileSync12, realpathSync as realpathSync3, statSync as statSync3, writeFileSync as writeFileSync8 } from "node:fs";
|
|
9230
9232
|
async function loadCompiler() {
|
|
9231
9233
|
try {
|
|
9232
9234
|
const nativeCompiler = ["es", "build"].join("");
|
|
@@ -9273,7 +9275,7 @@ function realpathOrSelf(p2) {
|
|
|
9273
9275
|
}
|
|
9274
9276
|
}
|
|
9275
9277
|
function isUnder(p2, root) {
|
|
9276
|
-
return p2 === root || p2.startsWith(root +
|
|
9278
|
+
return p2 === root || p2.startsWith(root + sep6);
|
|
9277
9279
|
}
|
|
9278
9280
|
function confinementRoots(contentRoot2) {
|
|
9279
9281
|
const roots2 = /* @__PURE__ */ new Set();
|
|
@@ -9563,7 +9565,7 @@ function tsExtResolvePlugin() {
|
|
|
9563
9565
|
}
|
|
9564
9566
|
function importMetaUrlPlugin({ scope: scope2 } = {}) {
|
|
9565
9567
|
const scopes = scope2 ? [.../* @__PURE__ */ new Set([realpathOrSelf(scope2), resolve9(scope2)])] : [];
|
|
9566
|
-
const inScope = (p2) => scopes.some((r3) => p2 === r3 || p2.startsWith(r3 +
|
|
9568
|
+
const inScope = (p2) => scopes.some((r3) => p2 === r3 || p2.startsWith(r3 + sep6));
|
|
9567
9569
|
return {
|
|
9568
9570
|
name: "himalaya-import-meta-url",
|
|
9569
9571
|
setup(b2) {
|
|
@@ -9624,7 +9626,7 @@ async function buildBundle(name, opts = {}) {
|
|
|
9624
9626
|
} catch {
|
|
9625
9627
|
}
|
|
9626
9628
|
if (same3) continue;
|
|
9627
|
-
|
|
9629
|
+
mkdirSync9(dirname10(file2.path), { recursive: true });
|
|
9628
9630
|
writeFileSync8(file2.path, file2.contents);
|
|
9629
9631
|
}
|
|
9630
9632
|
return name;
|
|
@@ -10276,7 +10278,7 @@ var init_tier5_dir = __esm({
|
|
|
10276
10278
|
|
|
10277
10279
|
// src/tier5-typecheck.ts
|
|
10278
10280
|
import { existsSync as existsSync11, readFileSync as readFileSync13 } from "node:fs";
|
|
10279
|
-
import { relative as
|
|
10281
|
+
import { relative as relative4, resolve as resolve11, sep as sep7 } from "node:path";
|
|
10280
10282
|
import { pathToFileURL as pathToFileURL2 } from "node:url";
|
|
10281
10283
|
async function loadTypeScript() {
|
|
10282
10284
|
const runtime = process.env.HIMI_AUTHORING_RUNTIME_DIR;
|
|
@@ -10315,7 +10317,7 @@ function pathsFor(options) {
|
|
|
10315
10317
|
return declarationPaths(options.umbrellaDir);
|
|
10316
10318
|
}
|
|
10317
10319
|
function relativeFile(contentDir2, fileName) {
|
|
10318
|
-
return
|
|
10320
|
+
return relative4(contentDir2, fileName).split(sep7).join("/");
|
|
10319
10321
|
}
|
|
10320
10322
|
function belongsToContentWorkers(contentDir2, diagnostic) {
|
|
10321
10323
|
if (!diagnostic.file) return true;
|
|
@@ -10501,8 +10503,8 @@ var init_provisioning_facts = __esm({
|
|
|
10501
10503
|
|
|
10502
10504
|
// ../../core/dev-server/src/app-assets.ts
|
|
10503
10505
|
import { createHash as createHash6 } from "node:crypto";
|
|
10504
|
-
import { existsSync as existsSync12, lstatSync as
|
|
10505
|
-
import { join as join13, resolve as resolve13, sep as
|
|
10506
|
+
import { existsSync as existsSync12, lstatSync as lstatSync8, readFileSync as readFileSync15, readdirSync as readdirSync9, realpathSync as realpathSync4, statSync as statSync4 } from "node:fs";
|
|
10507
|
+
import { join as join13, resolve as resolve13, sep as sep8 } from "node:path";
|
|
10506
10508
|
function contentTypeFor(name) {
|
|
10507
10509
|
const ext = name.includes(".") ? name.slice(name.lastIndexOf(".") + 1).toLowerCase() : "";
|
|
10508
10510
|
return CONTENT_TYPES[ext] ?? "application/octet-stream";
|
|
@@ -10523,7 +10525,7 @@ function findAssetsDir(appDir3) {
|
|
|
10523
10525
|
const rel = typeof declared === "string" && declared ? declared : "assets";
|
|
10524
10526
|
const abs = resolve13(appDir3, rel);
|
|
10525
10527
|
const base = resolve13(appDir3);
|
|
10526
|
-
if (abs !== base && !abs.startsWith(base +
|
|
10528
|
+
if (abs !== base && !abs.startsWith(base + sep8)) return null;
|
|
10527
10529
|
return existsSync12(abs) && statSync4(abs).isDirectory() ? abs : null;
|
|
10528
10530
|
}
|
|
10529
10531
|
function readOtaOnlyPatterns(appDir3) {
|
|
@@ -10579,9 +10581,9 @@ function collectBrandFonts(appDir3) {
|
|
|
10579
10581
|
if (rel.startsWith("/") || rel.split("/").includes("..")) continue;
|
|
10580
10582
|
const path2 = join13(appDir3, rel);
|
|
10581
10583
|
try {
|
|
10582
|
-
if (!
|
|
10584
|
+
if (!lstatSync8(path2).isFile()) continue;
|
|
10583
10585
|
const root = realpathSync4(appDir3);
|
|
10584
|
-
if (!realpathSync4(path2).startsWith(root +
|
|
10586
|
+
if (!realpathSync4(path2).startsWith(root + sep8)) continue;
|
|
10585
10587
|
} catch {
|
|
10586
10588
|
continue;
|
|
10587
10589
|
}
|
|
@@ -15063,6 +15065,7 @@ function webViewOriginAllowed(url, origins) {
|
|
|
15063
15065
|
}
|
|
15064
15066
|
var init_webview_origin = __esm({
|
|
15065
15067
|
"../../core/ts/src/webview-origin.ts"() {
|
|
15068
|
+
"use strict";
|
|
15066
15069
|
init_define_HHP_CATALOG();
|
|
15067
15070
|
}
|
|
15068
15071
|
});
|
|
@@ -15701,8 +15704,8 @@ function textOf(node) {
|
|
|
15701
15704
|
function plainText(node) {
|
|
15702
15705
|
if (typeOf2(node) === "TEXT") return str(at(node, "textData", "text"));
|
|
15703
15706
|
const children = kids(node).filter(isObj);
|
|
15704
|
-
const
|
|
15705
|
-
return children.map(plainText).join(
|
|
15707
|
+
const sep26 = children.every((c2) => typeOf2(c2) === "TEXT") ? "" : "\n";
|
|
15708
|
+
return children.map(plainText).join(sep26);
|
|
15706
15709
|
}
|
|
15707
15710
|
function alignOf(v2) {
|
|
15708
15711
|
switch (v2) {
|
|
@@ -21588,16 +21591,83 @@ var init_contained_dev_module = __esm({
|
|
|
21588
21591
|
// ../authoring-kit/ensure-templates.mjs
|
|
21589
21592
|
import { spawnSync as spawnSync3 } from "node:child_process";
|
|
21590
21593
|
import { randomUUID as randomUUID3 } from "node:crypto";
|
|
21591
|
-
import { existsSync as existsSync15, mkdirSync as
|
|
21592
|
-
import { dirname as dirname11, join as join14, relative as
|
|
21594
|
+
import { existsSync as existsSync15, lstatSync as lstatSync9, mkdirSync as mkdirSync10, readFileSync as readFileSync16, readdirSync as readdirSync11, renameSync as renameSync5, rmSync as rmSync5, rmdirSync as rmdirSync2, statSync as statSync5, writeFileSync as writeFileSync9 } from "node:fs";
|
|
21595
|
+
import { dirname as dirname11, isAbsolute as isAbsolute2, join as join14, relative as relative5, resolve as resolve15, sep as sep9 } from "node:path";
|
|
21593
21596
|
import { fileURLToPath as fileURLToPath9 } from "node:url";
|
|
21597
|
+
function generationBase(outRoot) {
|
|
21598
|
+
const out2 = resolve15(outRoot);
|
|
21599
|
+
const tree = join14(sep9, TEMPLATES_REL);
|
|
21600
|
+
return out2.endsWith(tree) ? join14(out2.slice(0, -tree.length), GENERATION_REL, "templates") : out2;
|
|
21601
|
+
}
|
|
21594
21602
|
function stampPath(outRoot) {
|
|
21595
|
-
return `${outRoot}.stamp.json`;
|
|
21603
|
+
return `${generationBase(outRoot)}.stamp.json`;
|
|
21596
21604
|
}
|
|
21597
21605
|
function head(root) {
|
|
21598
21606
|
const r3 = spawnSync3("git", ["rev-parse", "HEAD"], { cwd: root, encoding: "utf8" });
|
|
21599
21607
|
return r3.status === 0 ? r3.stdout.trim() : null;
|
|
21600
21608
|
}
|
|
21609
|
+
function isLink(path2) {
|
|
21610
|
+
try {
|
|
21611
|
+
return lstatSync9(path2).isSymbolicLink();
|
|
21612
|
+
} catch (e2) {
|
|
21613
|
+
if (e2.code === "ENOENT" || e2.code === "ENOTDIR") return false;
|
|
21614
|
+
throw e2;
|
|
21615
|
+
}
|
|
21616
|
+
}
|
|
21617
|
+
function replaceLinkedRoot(path2, root = REPO2) {
|
|
21618
|
+
const out2 = resolve15(path2);
|
|
21619
|
+
const rel = relative5(root, out2);
|
|
21620
|
+
const outside = rel === ".." || rel.startsWith(`..${sep9}`) || isAbsolute2(rel);
|
|
21621
|
+
if (!outside && rel.split(sep9)[0] !== "node_modules") {
|
|
21622
|
+
for (let dir = dirname11(out2); dir !== root; dir = dirname11(dir)) {
|
|
21623
|
+
if (isLink(dir)) throw new Error(`${relative5(root, dir)} is a symlink: refusing to generate ${rel} through it`);
|
|
21624
|
+
}
|
|
21625
|
+
}
|
|
21626
|
+
if (isLink(out2)) rmSync5(out2);
|
|
21627
|
+
}
|
|
21628
|
+
function sweepLegacyGeneration(out2) {
|
|
21629
|
+
rmSync5(`${out2}.stamp.json`, { force: true });
|
|
21630
|
+
const lock = `${out2}.lock`;
|
|
21631
|
+
let held = false;
|
|
21632
|
+
try {
|
|
21633
|
+
held = lockAlive(lock, readOwner(lock));
|
|
21634
|
+
} catch {
|
|
21635
|
+
}
|
|
21636
|
+
if (!held) rmSync5(lock, { recursive: true, force: true });
|
|
21637
|
+
const mutex = `${lock}.takeover`;
|
|
21638
|
+
try {
|
|
21639
|
+
if (isLink(mutex) || Date.now() - statSync5(mutex).mtimeMs > PIDLESS_LOCK_GRACE_MS) rmSync5(mutex, { recursive: true, force: true });
|
|
21640
|
+
} catch {
|
|
21641
|
+
}
|
|
21642
|
+
const staging = `${out2}.staging`;
|
|
21643
|
+
if (isLink(staging)) return void rmSync5(staging);
|
|
21644
|
+
let staged;
|
|
21645
|
+
try {
|
|
21646
|
+
staged = readdirSync11(staging);
|
|
21647
|
+
} catch {
|
|
21648
|
+
return;
|
|
21649
|
+
}
|
|
21650
|
+
for (const name of staged) {
|
|
21651
|
+
const run2 = /\.build-(\d+)$/.exec(name);
|
|
21652
|
+
if (run2 && processAlive(Number(run2[1]))) continue;
|
|
21653
|
+
rmSync5(join14(staging, name), { recursive: true, force: true });
|
|
21654
|
+
}
|
|
21655
|
+
try {
|
|
21656
|
+
rmdirSync2(staging);
|
|
21657
|
+
} catch (e2) {
|
|
21658
|
+
if (!["ENOENT", "ENOTEMPTY", "EEXIST"].includes(e2.code)) throw e2;
|
|
21659
|
+
}
|
|
21660
|
+
}
|
|
21661
|
+
function prepareGeneration(outRoot, root = REPO2) {
|
|
21662
|
+
const out2 = resolve15(outRoot);
|
|
21663
|
+
replaceLinkedRoot(out2, root);
|
|
21664
|
+
const real = generationBase(out2) !== out2;
|
|
21665
|
+
if (real) replaceLinkedRoot(dirname11(generationBase(out2)), root);
|
|
21666
|
+
for (const path2 of [stagingRoot(out2), lockPath(out2), `${lockPath(out2)}.takeover`, stampPath(out2)]) {
|
|
21667
|
+
if (isLink(path2)) rmSync5(path2);
|
|
21668
|
+
}
|
|
21669
|
+
if (real) sweepLegacyGeneration(out2);
|
|
21670
|
+
}
|
|
21601
21671
|
function templatesReady(root = REPO2) {
|
|
21602
21672
|
const out2 = resolve15(root, TEMPLATES_REL);
|
|
21603
21673
|
if (!existsSync15(out2) || !existsSync15(stampPath(out2))) return false;
|
|
@@ -21610,8 +21680,11 @@ function templatesReady(root = REPO2) {
|
|
|
21610
21680
|
const now = head(root);
|
|
21611
21681
|
return now === null || stamp.head === now;
|
|
21612
21682
|
}
|
|
21683
|
+
function stagingRoot(outRoot) {
|
|
21684
|
+
return `${generationBase(outRoot)}.staging`;
|
|
21685
|
+
}
|
|
21613
21686
|
function lockPath(outRoot) {
|
|
21614
|
-
return `${outRoot}.lock`;
|
|
21687
|
+
return `${generationBase(outRoot)}.lock`;
|
|
21615
21688
|
}
|
|
21616
21689
|
function processAlive(pid) {
|
|
21617
21690
|
if (!Number.isInteger(pid) || pid <= 0) return false;
|
|
@@ -21637,7 +21710,7 @@ function lockAlive(lock, owner) {
|
|
|
21637
21710
|
function tryLock(lock, token) {
|
|
21638
21711
|
for (; ; ) {
|
|
21639
21712
|
try {
|
|
21640
|
-
|
|
21713
|
+
mkdirSync10(lock);
|
|
21641
21714
|
writeFileSync9(join14(lock, "pid"), token);
|
|
21642
21715
|
return true;
|
|
21643
21716
|
} catch (e2) {
|
|
@@ -21653,7 +21726,7 @@ function tryLock(lock, token) {
|
|
|
21653
21726
|
if (alive) return false;
|
|
21654
21727
|
const mutex = `${lock}.takeover`;
|
|
21655
21728
|
try {
|
|
21656
|
-
|
|
21729
|
+
mkdirSync10(mutex);
|
|
21657
21730
|
} catch (e2) {
|
|
21658
21731
|
if (e2.code !== "EEXIST") throw e2;
|
|
21659
21732
|
try {
|
|
@@ -21687,7 +21760,7 @@ ${randomUUID3()}`;
|
|
|
21687
21760
|
let waited = false;
|
|
21688
21761
|
while (!tryLock(lock, token)) {
|
|
21689
21762
|
if (Date.now() > deadline) {
|
|
21690
|
-
throw new Error(`another process has held ${
|
|
21763
|
+
throw new Error(`another process has held ${relative5(root, lock)} for over ${Math.round(waitMs / 1e3)}s \u2014 remove it if no generation is running`);
|
|
21691
21764
|
}
|
|
21692
21765
|
waited = true;
|
|
21693
21766
|
sleepSync(LOCK_POLL_MS);
|
|
@@ -21706,8 +21779,9 @@ function ensureTemplates({
|
|
|
21706
21779
|
if (env[TEMPLATES_FRESH]) return false;
|
|
21707
21780
|
if (!refresh && templatesReady(root)) return false;
|
|
21708
21781
|
const out2 = resolve15(root, TEMPLATES_REL);
|
|
21709
|
-
|
|
21782
|
+
prepareGeneration(out2, root);
|
|
21710
21783
|
const lock = lockPath(out2);
|
|
21784
|
+
mkdirSync10(dirname11(lock), { recursive: true });
|
|
21711
21785
|
const { token, waited } = acquireLock(lock, { root, waitMs });
|
|
21712
21786
|
try {
|
|
21713
21787
|
if (waited && templatesReady(root)) return false;
|
|
@@ -21729,12 +21803,13 @@ ${(r3.stderr || r3.stdout || "").trim()}`);
|
|
|
21729
21803
|
releaseLock(lock, token);
|
|
21730
21804
|
}
|
|
21731
21805
|
}
|
|
21732
|
-
var REPO2, TEMPLATES_REL, GENERATOR, TEMPLATES_FRESH, PIDLESS_LOCK_GRACE_MS, LOCK_POLL_MS, isMain;
|
|
21806
|
+
var REPO2, TEMPLATES_REL, GENERATION_REL, GENERATOR, TEMPLATES_FRESH, PIDLESS_LOCK_GRACE_MS, LOCK_POLL_MS, isMain;
|
|
21733
21807
|
var init_ensure_templates = __esm({
|
|
21734
21808
|
"../authoring-kit/ensure-templates.mjs"() {
|
|
21735
21809
|
init_define_HHP_CATALOG();
|
|
21736
21810
|
REPO2 = resolve15(dirname11(fileURLToPath9(import.meta.url)), "../..");
|
|
21737
21811
|
TEMPLATES_REL = "tools/himi-cli/templates";
|
|
21812
|
+
GENERATION_REL = "tools/.himi-templates";
|
|
21738
21813
|
GENERATOR = "tools/authoring-kit/gen-templates.mts";
|
|
21739
21814
|
TEMPLATES_FRESH = "HIMI_TEMPLATES_FRESH";
|
|
21740
21815
|
PIDLESS_LOCK_GRACE_MS = 3e4;
|
|
@@ -21754,8 +21829,8 @@ var init_ensure_templates = __esm({
|
|
|
21754
21829
|
|
|
21755
21830
|
// ../../core/dev-server/tier5-bundles-src/ensure-bundles.mjs
|
|
21756
21831
|
import { spawnSync as spawnSync4 } from "node:child_process";
|
|
21757
|
-
import { existsSync as existsSync16, mkdirSync as
|
|
21758
|
-
import { dirname as dirname12, relative as
|
|
21832
|
+
import { existsSync as existsSync16, mkdirSync as mkdirSync11, readFileSync as readFileSync17, rmSync as rmSync6 } from "node:fs";
|
|
21833
|
+
import { dirname as dirname12, relative as relative6, resolve as resolve16 } from "node:path";
|
|
21759
21834
|
import { fileURLToPath as fileURLToPath10 } from "node:url";
|
|
21760
21835
|
function head2(root) {
|
|
21761
21836
|
const r3 = spawnSync4("git", ["rev-parse", "HEAD"], { cwd: root, encoding: "utf8" });
|
|
@@ -21785,7 +21860,7 @@ function ensureBundles({
|
|
|
21785
21860
|
if (!existsSync16(resolve16(root, GENERATOR2))) return false;
|
|
21786
21861
|
if (!refresh && bundlesReady(root)) return false;
|
|
21787
21862
|
const out2 = resolve16(root, BUNDLES_REL);
|
|
21788
|
-
|
|
21863
|
+
mkdirSync11(dirname12(out2), { recursive: true });
|
|
21789
21864
|
const lock = lockPath(out2);
|
|
21790
21865
|
const { token, waited } = acquireLock(lock, { root, waitMs });
|
|
21791
21866
|
try {
|
|
@@ -21803,7 +21878,7 @@ function ensureBundles({
|
|
|
21803
21878
|
${(r3.stderr || r3.stdout || "").trim()}`);
|
|
21804
21879
|
}
|
|
21805
21880
|
if (!existsSync16(stampPath(out2))) {
|
|
21806
|
-
throw new Error(`${GENERATOR2} exited 0 but did not record a complete build in ${
|
|
21881
|
+
throw new Error(`${GENERATOR2} exited 0 but did not record a complete build in ${relative6(root, stampPath(out2))}`);
|
|
21807
21882
|
}
|
|
21808
21883
|
return true;
|
|
21809
21884
|
} finally {
|
|
@@ -21851,7 +21926,7 @@ __export(loader_exports, {
|
|
|
21851
21926
|
});
|
|
21852
21927
|
import { resolve as resolve17, basename as basename7, dirname as dirname13 } from "node:path";
|
|
21853
21928
|
import { randomUUID as randomUUID4 } from "node:crypto";
|
|
21854
|
-
import { existsSync as existsSync17, readdirSync as readdirSync12, readFileSync as readFileSync18, mkdirSync as
|
|
21929
|
+
import { existsSync as existsSync17, readdirSync as readdirSync12, readFileSync as readFileSync18, mkdirSync as mkdirSync12, rmSync as rmSync7 } from "node:fs";
|
|
21855
21930
|
import { pathToFileURL as pathToFileURL3, fileURLToPath as fileURLToPath11 } from "node:url";
|
|
21856
21931
|
function resolveWixWebAuthConfig(app) {
|
|
21857
21932
|
const auth = app?.meta.auth;
|
|
@@ -21894,7 +21969,7 @@ async function devModuleUrl(entry, dir, fresh = false, sourceCopy = false) {
|
|
|
21894
21969
|
const direct = !isOffRepo() && hasTypeScriptLoader;
|
|
21895
21970
|
if (direct && !fresh && !sourceCopy) return { url: pathToFileURL3(entry).href };
|
|
21896
21971
|
const out2 = resolve17(dir, sourceCopy ? `dist/.himi/dev-source-${randomUUID4()}.mjs` : fresh ? `dist/.himi/dev-${process.pid}-${++freshLoads}.mjs` : "dist/.himi/dev.mjs");
|
|
21897
|
-
|
|
21972
|
+
mkdirSync12(dirname13(out2), { recursive: true });
|
|
21898
21973
|
const buildOptions2 = direct ? { confineTo: dir } : {
|
|
21899
21974
|
// Plain Node must resolve the published-style umbrella entry points for
|
|
21900
21975
|
// both standalone and in-repo CLI content. In-repo workspace packages
|
|
@@ -22586,6 +22661,7 @@ var init_player_host_manifest = __esm({
|
|
|
22586
22661
|
"himi_apps",
|
|
22587
22662
|
"iap",
|
|
22588
22663
|
"keyboard",
|
|
22664
|
+
"legacy_import",
|
|
22589
22665
|
"live_activity",
|
|
22590
22666
|
"local_database",
|
|
22591
22667
|
"location",
|
|
@@ -22697,7 +22773,7 @@ __export(config_exports2, {
|
|
|
22697
22773
|
serializeRolloutYaml: () => serializeRolloutYaml,
|
|
22698
22774
|
validateOverlayPatch: () => validateOverlayPatch
|
|
22699
22775
|
});
|
|
22700
|
-
import { mkdirSync as
|
|
22776
|
+
import { mkdirSync as mkdirSync13, readFileSync as readFileSync19, writeFileSync as writeFileSync10 } from "node:fs";
|
|
22701
22777
|
import { dirname as dirname14, join as join15, resolve as resolve18 } from "node:path";
|
|
22702
22778
|
import { fileURLToPath as fileURLToPath12 } from "node:url";
|
|
22703
22779
|
function strip(line) {
|
|
@@ -22825,7 +22901,7 @@ function readJsonAt(app, file2, root) {
|
|
|
22825
22901
|
}
|
|
22826
22902
|
function writeJsonAt(app, file2, root, value2) {
|
|
22827
22903
|
const path2 = appConfigPath(app, file2, root);
|
|
22828
|
-
|
|
22904
|
+
mkdirSync13(dirname14(path2), { recursive: true });
|
|
22829
22905
|
writeFileSync10(path2, JSON.stringify(value2, null, 2) + "\n");
|
|
22830
22906
|
return path2;
|
|
22831
22907
|
}
|
|
@@ -23272,19 +23348,19 @@ var init_hhp_command = __esm({
|
|
|
23272
23348
|
});
|
|
23273
23349
|
|
|
23274
23350
|
// src/hhp.ts
|
|
23275
|
-
import { existsSync as existsSync20, readFileSync as readFileSync21, writeFileSync as writeFileSync11, mkdirSync as
|
|
23276
|
-
import { basename as basename8, dirname as dirname16, resolve as resolve21, relative as
|
|
23351
|
+
import { existsSync as existsSync20, readFileSync as readFileSync21, writeFileSync as writeFileSync11, mkdirSync as mkdirSync14, renameSync as renameSync6, rmSync as rmSync8, lstatSync as lstatSync10, readdirSync as readdirSync14 } from "node:fs";
|
|
23352
|
+
import { basename as basename8, dirname as dirname16, resolve as resolve21, relative as relative7, sep as sep10, join as join17 } from "node:path";
|
|
23277
23353
|
import { createHash as createHash7, randomUUID as randomUUID5 } from "node:crypto";
|
|
23278
23354
|
import ts3 from "typescript";
|
|
23279
23355
|
function localPath(root, path2, from = join17(root, "hhp.json")) {
|
|
23280
23356
|
if (/^[a-z]+:|^\/\//i.test(path2)) throw new Error("HHP source dependencies must be local files.");
|
|
23281
|
-
const target = resolve21(dirname16(from), path2), rel =
|
|
23282
|
-
if (rel.startsWith(`..${
|
|
23283
|
-
const components2 = rel.split(
|
|
23357
|
+
const target = resolve21(dirname16(from), path2), rel = relative7(resolve21(root), target);
|
|
23358
|
+
if (rel.startsWith(`..${sep10}`) || rel === ".." || !rel || target === resolve21(root)) throw new Error("HHP source path escapes the app.");
|
|
23359
|
+
const components2 = rel.split(sep10);
|
|
23284
23360
|
let current = resolve21(root);
|
|
23285
23361
|
for (const component of components2) {
|
|
23286
23362
|
current = join17(current, component);
|
|
23287
|
-
if (existsSync20(current) &&
|
|
23363
|
+
if (existsSync20(current) && lstatSync10(current).isSymbolicLink()) throw new Error("HHP paths cannot traverse symlinks.");
|
|
23288
23364
|
}
|
|
23289
23365
|
return target;
|
|
23290
23366
|
}
|
|
@@ -23417,13 +23493,13 @@ async function compileContentHhp(root, opts = {}) {
|
|
|
23417
23493
|
for (const dependency of result2.dependencies.filter((f2) => /\.tsx?$/.test(f2))) inspect2(dependency);
|
|
23418
23494
|
result2.manifest.requiredCapabilities = [...requiredCapabilities2].sort();
|
|
23419
23495
|
outputs.set(`dev/hhp/${id}.descriptor.json`, JSON.stringify(result2.descriptor, null, 2) + "\n");
|
|
23420
|
-
outputs.set(`dev/hhp/${id}.map.json`, JSON.stringify({ ...result2.manifest, nodes: Object.fromEntries(Object.entries(result2.sourceMap).map(([key3, node]) => [key3, { ...node, file:
|
|
23496
|
+
outputs.set(`dev/hhp/${id}.map.json`, JSON.stringify({ ...result2.manifest, nodes: Object.fromEntries(Object.entries(result2.sourceMap).map(([key3, node]) => [key3, { ...node, file: relative7(root, node.file).split(sep10).join("/") }])) }, null, 2) + "\n");
|
|
23421
23497
|
if (result2.worker && result2.bundleName) {
|
|
23422
23498
|
if (results.some((r3) => r3 !== result2 && r3.bundleName === result2.bundleName)) diagnostics.push({ code: "HHP-BUNDLE-ID", severity: "error", file: file2, line: 1, column: 1, message: "Screen ids normalize to the same bundle name." });
|
|
23423
23499
|
const workerRel = `tier5-src/${result2.bundleName}/index.ts`;
|
|
23424
23500
|
let worker = result2.worker;
|
|
23425
23501
|
for (const dependency of result2.dependencies.filter((f2) => /\.(controller|service)\.tsx?$/.test(f2)))
|
|
23426
|
-
worker = worker.replace(JSON.stringify(dependency), JSON.stringify(
|
|
23502
|
+
worker = worker.replace(JSON.stringify(dependency), JSON.stringify(relative7(dirname16(join17(root, workerRel)), dependency).split(sep10).join("/").replace(/\.tsx?$/, ".js")));
|
|
23427
23503
|
outputs.set(workerRel, worker);
|
|
23428
23504
|
}
|
|
23429
23505
|
}
|
|
@@ -23477,13 +23553,13 @@ async function compileContentHhp(root, opts = {}) {
|
|
|
23477
23553
|
for (const [path2, png] of rasters) {
|
|
23478
23554
|
if (!png) continue;
|
|
23479
23555
|
if (existsExact(path2) && readFileSync21(path2).equals(png)) continue;
|
|
23480
|
-
|
|
23556
|
+
mkdirSync14(dirname16(path2), { recursive: true });
|
|
23481
23557
|
writeFileSync11(`${path2}.tmp`, png);
|
|
23482
23558
|
rmSync8(path2, { force: true });
|
|
23483
23559
|
renameSync6(`${path2}.tmp`, path2);
|
|
23484
23560
|
}
|
|
23485
23561
|
const target = localPath(root, "dev/hhp"), stage = localPath(root, `dev/.hhp-${randomUUID5()}`), backup = `${stage}-old`;
|
|
23486
|
-
|
|
23562
|
+
mkdirSync14(stage, { recursive: true });
|
|
23487
23563
|
try {
|
|
23488
23564
|
for (const [rel, source] of outputs) if (rel.startsWith("dev/hhp/")) writeFileSync11(join17(stage, rel.slice(8)), source);
|
|
23489
23565
|
const workers = [...outputs].filter(([rel]) => rel.startsWith("tier5-src/"));
|
|
@@ -23496,7 +23572,7 @@ async function compileContentHhp(root, opts = {}) {
|
|
|
23496
23572
|
try {
|
|
23497
23573
|
for (const [rel, source] of workers) {
|
|
23498
23574
|
const path2 = localPath(root, rel);
|
|
23499
|
-
|
|
23575
|
+
mkdirSync14(dirname16(path2), { recursive: true });
|
|
23500
23576
|
writeFileSync11(`${path2}.tmp`, source);
|
|
23501
23577
|
renameSync6(`${path2}.tmp`, path2);
|
|
23502
23578
|
}
|
|
@@ -23513,7 +23589,7 @@ async function compileContentHhp(root, opts = {}) {
|
|
|
23513
23589
|
for (const [path2, source] of oldWorkers) {
|
|
23514
23590
|
if (source === null) rmSync8(path2, { force: true });
|
|
23515
23591
|
else {
|
|
23516
|
-
|
|
23592
|
+
mkdirSync14(dirname16(path2), { recursive: true });
|
|
23517
23593
|
writeFileSync11(path2, source);
|
|
23518
23594
|
}
|
|
23519
23595
|
}
|
|
@@ -23570,7 +23646,7 @@ export default defineController({
|
|
|
23570
23646
|
if ((await loadContent(root)).module.screens.exact[id]) throw new Error(`Screen id ${id} is already registered.`);
|
|
23571
23647
|
for (const [rel, body] of Object.entries(files)) {
|
|
23572
23648
|
const path2 = localPath(root, rel);
|
|
23573
|
-
|
|
23649
|
+
mkdirSync14(dirname16(path2), { recursive: true });
|
|
23574
23650
|
writeFileSync11(path2, body);
|
|
23575
23651
|
}
|
|
23576
23652
|
manifest2.screens[id] = { html: `screens/${id}.html` };
|
|
@@ -23583,7 +23659,7 @@ export default defineController({
|
|
|
23583
23659
|
const originalSettings = existsSync20(settings) ? readFileSync21(settings, "utf8") : "{}";
|
|
23584
23660
|
const updated = hhpEditorSettings(originalSettings);
|
|
23585
23661
|
if (originalSettings !== updated) {
|
|
23586
|
-
|
|
23662
|
+
mkdirSync14(dirname16(settings), { recursive: true });
|
|
23587
23663
|
writeFileSync11(settings, updated);
|
|
23588
23664
|
}
|
|
23589
23665
|
built.outputs.push(".vscode/settings.json");
|
|
@@ -23625,7 +23701,7 @@ var init_hhp = __esm({
|
|
|
23625
23701
|
});
|
|
23626
23702
|
|
|
23627
23703
|
// src/shared-drift.ts
|
|
23628
|
-
import { existsSync as existsSync21, lstatSync as
|
|
23704
|
+
import { existsSync as existsSync21, lstatSync as lstatSync11, readdirSync as readdirSync15, readFileSync as readFileSync22 } from "node:fs";
|
|
23629
23705
|
import { spawnSync as spawnSync5 } from "node:child_process";
|
|
23630
23706
|
import { basename as basename9, dirname as dirname17, join as join18, resolve as resolve22 } from "node:path";
|
|
23631
23707
|
import { fileURLToPath as fileURLToPath13 } from "node:url";
|
|
@@ -23677,7 +23753,7 @@ function missingSiblings(shippedFile, sharedDir) {
|
|
|
23677
23753
|
}
|
|
23678
23754
|
function hasEntry(p2) {
|
|
23679
23755
|
try {
|
|
23680
|
-
|
|
23756
|
+
lstatSync11(p2);
|
|
23681
23757
|
return true;
|
|
23682
23758
|
} catch {
|
|
23683
23759
|
return false;
|
|
@@ -23729,7 +23805,7 @@ function scanSharedDrift(contentDir2, templatesRoot) {
|
|
|
23729
23805
|
if (!templatesRoot || !existsSync21(templatesRoot)) return null;
|
|
23730
23806
|
const sharedDir = join18(contentDir2, SHARED_REL);
|
|
23731
23807
|
try {
|
|
23732
|
-
if (!
|
|
23808
|
+
if (!lstatSync11(sharedDir).isDirectory()) return null;
|
|
23733
23809
|
} catch {
|
|
23734
23810
|
return null;
|
|
23735
23811
|
}
|
|
@@ -23789,7 +23865,7 @@ var init_shared_drift = __esm({
|
|
|
23789
23865
|
SIBLING_IMPORT = /(?:from\s+|import\s+)(["'])\.\/([A-Za-z0-9_-]+)(?:\.js|\.ts)?\1/g;
|
|
23790
23866
|
isRealFile = (p2) => {
|
|
23791
23867
|
try {
|
|
23792
|
-
return
|
|
23868
|
+
return lstatSync11(p2).isFile();
|
|
23793
23869
|
} catch {
|
|
23794
23870
|
return false;
|
|
23795
23871
|
}
|
|
@@ -23817,7 +23893,7 @@ __export(build_exports, {
|
|
|
23817
23893
|
umbrellaVersion: () => umbrellaVersion,
|
|
23818
23894
|
umbrellaVersionIssue: () => umbrellaVersionIssue
|
|
23819
23895
|
});
|
|
23820
|
-
import { existsSync as existsSync22, readdirSync as readdirSync16, mkdirSync as
|
|
23896
|
+
import { existsSync as existsSync22, readdirSync as readdirSync16, mkdirSync as mkdirSync15, statSync as statSync6, symlinkSync, readFileSync as readFileSync23 } from "node:fs";
|
|
23821
23897
|
import { resolve as resolve23, join as join19, dirname as dirname18 } from "node:path";
|
|
23822
23898
|
import { fileURLToPath as fileURLToPath14 } from "node:url";
|
|
23823
23899
|
import { execFileSync } from "node:child_process";
|
|
@@ -23865,7 +23941,7 @@ function ensureUmbrella(contentDir2, globalPath = globalUmbrella()) {
|
|
|
23865
23941
|
if (!globalPath) return false;
|
|
23866
23942
|
try {
|
|
23867
23943
|
const scope2 = join19(contentDir2, "node_modules", "@wix");
|
|
23868
|
-
|
|
23944
|
+
mkdirSync15(scope2, { recursive: true });
|
|
23869
23945
|
const link = join19(scope2, "himalaya");
|
|
23870
23946
|
if (!existsSync22(link)) symlinkSync(globalPath, link, "dir");
|
|
23871
23947
|
return existsSync22(join19(link, "package.json"));
|
|
@@ -23968,7 +24044,7 @@ async function buildContentBundles(contentDir2, opts = {}) {
|
|
|
23968
24044
|
return { built, outDir, compileErrors: [{ bundle: "hhp", errors: [{ text: e2.message }] }], ...advisories };
|
|
23969
24045
|
}
|
|
23970
24046
|
if (!existsSync22(srcDir)) return { built, outDir, compileErrors, ...advisories };
|
|
23971
|
-
|
|
24047
|
+
mkdirSync15(outDir, { recursive: true });
|
|
23972
24048
|
for (const name of readdirSync16(srcDir).sort()) {
|
|
23973
24049
|
const entry = join19(srcDir, name, "index.ts");
|
|
23974
24050
|
if (!statSync6(join19(srcDir, name)).isDirectory() || !existsSync22(entry)) continue;
|
|
@@ -24027,7 +24103,7 @@ __export(app_config_loader_exports, {
|
|
|
24027
24103
|
makeBuildMemo: () => makeBuildMemo,
|
|
24028
24104
|
uninstallContainedAppConfigRealm: () => uninstallContainedAppConfigRealm
|
|
24029
24105
|
});
|
|
24030
|
-
import { existsSync as existsSync23, mkdirSync as
|
|
24106
|
+
import { existsSync as existsSync23, mkdirSync as mkdirSync16 } from "node:fs";
|
|
24031
24107
|
import { dirname as dirname19, join as join20, resolve as resolve24 } from "node:path";
|
|
24032
24108
|
import { pathToFileURL as pathToFileURL4 } from "node:url";
|
|
24033
24109
|
function configEntry(dir) {
|
|
@@ -24043,7 +24119,7 @@ async function buildConfigModuleUrl(entry, dir) {
|
|
|
24043
24119
|
const { bundledRuntimeDir: bundledRuntimeDir2 } = await Promise.resolve().then(() => (init_build(), build_exports));
|
|
24044
24120
|
bundledRuntimeDir2();
|
|
24045
24121
|
const out2 = resolve24(dir, "dist/.himi/config.mjs");
|
|
24046
|
-
|
|
24122
|
+
mkdirSync16(dirname19(out2), { recursive: true });
|
|
24047
24123
|
await buildAppEntry(entry, out2, { umbrella: true, resolveTsExtensions: true, absWorkingDir: dir, confineTo: dir });
|
|
24048
24124
|
return pathToFileURL4(out2).href;
|
|
24049
24125
|
}
|
|
@@ -24540,6 +24616,15 @@ var init_native_requirements = __esm({
|
|
|
24540
24616
|
]
|
|
24541
24617
|
}
|
|
24542
24618
|
},
|
|
24619
|
+
legacy_import: {
|
|
24620
|
+
// #4653 — reads the app's OWN container (an update of the same bundle id shares it) and its
|
|
24621
|
+
// own staging; no permission, entitlement or usage string on any platform.
|
|
24622
|
+
privacy: {
|
|
24623
|
+
reviewNotes: [
|
|
24624
|
+
"legacy-import: on the first launch after an update, reads data the PREVIOUS version of this same app left in its own container, keeps it in the app's protected Application Support (excluded from backup) and applies it only to the account that owned it. Nothing new is collected; nothing leaves the device through this capability. Telemetry records counts and durations, never values. No usage string / required-reason API."
|
|
24625
|
+
]
|
|
24626
|
+
}
|
|
24627
|
+
},
|
|
24543
24628
|
release_control: {
|
|
24544
24629
|
// No permission, entitlement, or usage string: the picker reads serve-control's PUBLIC
|
|
24545
24630
|
// release history and writes a local preference. Its risk is a PRODUCT risk (a user
|
|
@@ -25383,6 +25468,9 @@ var init_builtins = __esm({
|
|
|
25383
25468
|
"himi_apps",
|
|
25384
25469
|
"iap",
|
|
25385
25470
|
"keyboard",
|
|
25471
|
+
// #4653 — the legacy-import report. iOS is real; Android answers null until H12b; web is
|
|
25472
|
+
// always null (nothing to import in a browser).
|
|
25473
|
+
"legacy_import",
|
|
25386
25474
|
"live_activity",
|
|
25387
25475
|
"local_database",
|
|
25388
25476
|
"location",
|
|
@@ -25842,6 +25930,9 @@ var init_known = __esm({
|
|
|
25842
25930
|
app_info: "needs the shell's boot to configure it with the app id it reports, which a dist build's generic registration does not do",
|
|
25843
25931
|
system_intents: "needs the shell to wire a SystemIntentsHost (app identity, deep-link routing and refresh), which no extensible shell does",
|
|
25844
25932
|
release_control: "needs the shell's boot to configure it with the app id whose releases it switches, which a dist build's generic registration does not do",
|
|
25933
|
+
// #4653 — the report is only ever non-null if the shell's boot RUNS the importer (before auth)
|
|
25934
|
+
// and feeds it the signed-in principal; a generic registration does neither.
|
|
25935
|
+
legacy_import: "needs the shell's boot to run LegacyImporter before auth and feed it the signed-in principal, which a dist build's generic registration does not do",
|
|
25845
25936
|
// Linked generically since #4066, but the module is only the backend: which Base44 app it talks
|
|
25846
25937
|
// to is the shell's binding (`Base44Capability.bind`, from its contract), which a build cannot add.
|
|
25847
25938
|
base44: "needs the shell's boot to bind the Base44 app id it talks to (Base44Capability.bind), which a dist build's generic registration does not do",
|
|
@@ -27315,7 +27406,7 @@ var init_plan_fonts = __esm({
|
|
|
27315
27406
|
|
|
27316
27407
|
// ../font-bake/face-source.ts
|
|
27317
27408
|
import { createHash as createHash9 } from "node:crypto";
|
|
27318
|
-
import { existsSync as existsSync28, mkdirSync as
|
|
27409
|
+
import { existsSync as existsSync28, mkdirSync as mkdirSync17, readFileSync as readFileSync27, renameSync as renameSync7, rmSync as rmSync9, writeFileSync as writeFileSync12 } from "node:fs";
|
|
27319
27410
|
import { homedir as homedir3 } from "node:os";
|
|
27320
27411
|
import { basename as basename10, join as join23 } from "node:path";
|
|
27321
27412
|
import { fileURLToPath as fileURLToPath19 } from "node:url";
|
|
@@ -27349,7 +27440,7 @@ async function fetchUpstreamBytes(url) {
|
|
|
27349
27440
|
}
|
|
27350
27441
|
function writeCachedFace(bytes2) {
|
|
27351
27442
|
const hash3 = sha256Hex3(bytes2);
|
|
27352
|
-
|
|
27443
|
+
mkdirSync17(CACHE_DIR, { recursive: true });
|
|
27353
27444
|
const tmp = join23(CACHE_DIR, `.${hash3}.${process.pid}.${Date.now()}.tmp`);
|
|
27354
27445
|
try {
|
|
27355
27446
|
writeFileSync12(tmp, bytes2);
|
|
@@ -28224,7 +28315,7 @@ var init_inject = __esm({
|
|
|
28224
28315
|
});
|
|
28225
28316
|
|
|
28226
28317
|
// ../../core/dev-server/src/store.ts
|
|
28227
|
-
import { mkdirSync as
|
|
28318
|
+
import { mkdirSync as mkdirSync18 } from "node:fs";
|
|
28228
28319
|
import { dirname as dirname21, resolve as resolve27 } from "node:path";
|
|
28229
28320
|
import { fileURLToPath as fileURLToPath20 } from "node:url";
|
|
28230
28321
|
import { createRequire as createRequire2 } from "node:module";
|
|
@@ -28244,7 +28335,7 @@ var init_store2 = __esm({
|
|
|
28244
28335
|
/** The node:sqlite handle — opened, bootstrapped, and seeded on first access. */
|
|
28245
28336
|
get db() {
|
|
28246
28337
|
if (this._db) return this._db;
|
|
28247
|
-
|
|
28338
|
+
mkdirSync18(dirname21(this.dbPath), { recursive: true });
|
|
28248
28339
|
const { DatabaseSync } = nodeRequire("node:sqlite");
|
|
28249
28340
|
this._db = new DatabaseSync(this.dbPath, { timeout: 5e3 });
|
|
28250
28341
|
this.bootstrap();
|
|
@@ -28871,6 +28962,13 @@ var init_store_adopt = __esm({
|
|
|
28871
28962
|
}
|
|
28872
28963
|
});
|
|
28873
28964
|
|
|
28965
|
+
// ../../core/ts/src/legacy-import.ts
|
|
28966
|
+
var init_legacy_import = __esm({
|
|
28967
|
+
"../../core/ts/src/legacy-import.ts"() {
|
|
28968
|
+
init_define_HHP_CATALOG();
|
|
28969
|
+
}
|
|
28970
|
+
});
|
|
28971
|
+
|
|
28874
28972
|
// ../../core/ts/src/base44-entities.ts
|
|
28875
28973
|
var init_base44_entities = __esm({
|
|
28876
28974
|
"../../core/ts/src/base44-entities.ts"() {
|
|
@@ -29015,10 +29113,12 @@ var init_define_app = __esm({
|
|
|
29015
29113
|
init_distribution();
|
|
29016
29114
|
init_store_adopt();
|
|
29017
29115
|
init_auth_gate_screen();
|
|
29116
|
+
init_legacy_import();
|
|
29018
29117
|
init_schema2();
|
|
29019
29118
|
init_base44_entities();
|
|
29020
29119
|
init_src3();
|
|
29021
29120
|
init_cms();
|
|
29121
|
+
init_legacy_import();
|
|
29022
29122
|
init_base44_entities();
|
|
29023
29123
|
ALL_ORIENTATIONS = [
|
|
29024
29124
|
"portrait",
|
|
@@ -33178,7 +33278,7 @@ function redactBodyString(body) {
|
|
|
33178
33278
|
} catch {
|
|
33179
33279
|
}
|
|
33180
33280
|
}
|
|
33181
|
-
return body.replace(FORM_ASSIGNMENT_RE, (m2, name) => isSensitiveBodyName(name) ? `${name}=${REDACTED}` : m2).replace(JSON_FIELD_RE, (m2, name,
|
|
33281
|
+
return body.replace(FORM_ASSIGNMENT_RE, (m2, name) => isSensitiveBodyName(name) ? `${name}=${REDACTED}` : m2).replace(JSON_FIELD_RE, (m2, name, sep26) => isSensitiveBodyName(name) ? `"${name}"${sep26}"${REDACTED}"` : m2).replace(JSON_FIELD_UNTERMINATED_RE, (m2, name, sep26) => isSensitiveBodyName(name) ? `"${name}"${sep26}"${REDACTED}` : m2).replace(BEARER_RE, (_m, s2) => `${s2} ${REDACTED}`);
|
|
33182
33282
|
}
|
|
33183
33283
|
function createWixGatewayState() {
|
|
33184
33284
|
return { mode: "record", rules: [], traffic: [], clients: /* @__PURE__ */ new Set(), seq: 0, ruleSeq: 0 };
|
|
@@ -38741,10 +38841,10 @@ async function runRicosImageUpload(o2) {
|
|
|
38741
38841
|
} catch {
|
|
38742
38842
|
return fail7("read");
|
|
38743
38843
|
}
|
|
38744
|
-
const
|
|
38844
|
+
const sep26 = entry.uploadUrl.includes("?") ? "&" : "?";
|
|
38745
38845
|
let res;
|
|
38746
38846
|
try {
|
|
38747
|
-
res = await deps.fetch(`${entry.uploadUrl}${
|
|
38847
|
+
res = await deps.fetch(`${entry.uploadUrl}${sep26}filename=${encodeURIComponent(file2.fileName)}`, { method: "PUT", headers: { "Content-Type": file2.mimeType }, body });
|
|
38748
38848
|
} catch {
|
|
38749
38849
|
return fail7("put");
|
|
38750
38850
|
}
|
|
@@ -39387,10 +39487,10 @@ async function runMediaFieldUpload(o2) {
|
|
|
39387
39487
|
} catch (e2) {
|
|
39388
39488
|
return { ok: false, reason: e2 instanceof Deadline ? "timeout" : "read" };
|
|
39389
39489
|
}
|
|
39390
|
-
const
|
|
39490
|
+
const sep26 = uploadUrl.includes("?") ? "&" : "?";
|
|
39391
39491
|
let res;
|
|
39392
39492
|
try {
|
|
39393
|
-
res = await bounded2(deps.fetch(`${uploadUrl}${
|
|
39493
|
+
res = await bounded2(deps.fetch(`${uploadUrl}${sep26}filename=${encodeURIComponent(file2.fileName)}`, {
|
|
39394
39494
|
method: "PUT",
|
|
39395
39495
|
headers: { "Content-Type": file2.mimeType },
|
|
39396
39496
|
body,
|
|
@@ -123073,8 +123173,8 @@ function ensureCountUpRuntime() {
|
|
|
123073
123173
|
const neg = fixed.startsWith("-");
|
|
123074
123174
|
const body = neg ? fixed.slice(1) : fixed;
|
|
123075
123175
|
const [int2, frac] = body.split(".");
|
|
123076
|
-
const
|
|
123077
|
-
return (neg ? "-" : "") +
|
|
123176
|
+
const sep26 = int2.replace(/\B(?=(\d{3})+(?!\d))/g, ",");
|
|
123177
|
+
return (neg ? "-" : "") + sep26 + (frac ? "." + frac : "");
|
|
123078
123178
|
};
|
|
123079
123179
|
const animateEl = (el2) => {
|
|
123080
123180
|
const node = el2;
|
|
@@ -133783,7 +133883,7 @@ __export(widgets_exports, {
|
|
|
133783
133883
|
widgetScanRunCount: () => widgetScanRunCount
|
|
133784
133884
|
});
|
|
133785
133885
|
import { createHash as createHash15 } from "node:crypto";
|
|
133786
|
-
import { lstatSync as
|
|
133886
|
+
import { lstatSync as lstatSync12, readdirSync as readdirSync19, statSync as statSync8 } from "node:fs";
|
|
133787
133887
|
import { join as join27 } from "node:path";
|
|
133788
133888
|
import { inspect } from "node:util";
|
|
133789
133889
|
async function widgetRealm() {
|
|
@@ -133910,7 +134010,7 @@ function bundleDirFingerprint(roots2) {
|
|
|
133910
134010
|
} catch (err) {
|
|
133911
134011
|
const code = err.code;
|
|
133912
134012
|
if (code !== "ENOENT" && code !== "ENOTDIR" && code !== "ELOOP") throw err;
|
|
133913
|
-
st2 =
|
|
134013
|
+
st2 = lstatSync12(path2, { bigint: true });
|
|
133914
134014
|
hash3.update(`${root}\0${entry}\0unresolved\0${st2.ino}\0${st2.mtimeNs}\0${st2.ctimeNs}
|
|
133915
134015
|
`);
|
|
133916
134016
|
continue;
|
|
@@ -134534,8 +134634,8 @@ var init_widgets = __esm({
|
|
|
134534
134634
|
// ../../core/dev-server/src/index.ts
|
|
134535
134635
|
import { createServer as createServer2 } from "node:http";
|
|
134536
134636
|
import { readFile, stat } from "node:fs/promises";
|
|
134537
|
-
import { readFileSync as readFileSync37, existsSync as existsSync33, watch, mkdirSync as
|
|
134538
|
-
import { basename as basename11, dirname as dirname24, extname as extname2, join as join28, relative as
|
|
134637
|
+
import { readFileSync as readFileSync37, existsSync as existsSync33, watch, mkdirSync as mkdirSync19, rmSync as rmSync10 } from "node:fs";
|
|
134638
|
+
import { basename as basename11, dirname as dirname24, extname as extname2, join as join28, relative as relative8, resolve as resolve32, normalize as normalize4, sep as sep11 } from "node:path";
|
|
134539
134639
|
import { createHash as createHash16, randomUUID as randomUUID6 } from "node:crypto";
|
|
134540
134640
|
import { fileURLToPath as fileURLToPath24, pathToFileURL as pathToFileURL5 } from "node:url";
|
|
134541
134641
|
function readLogicBundle(read, tier5Dir, name) {
|
|
@@ -135362,7 +135462,7 @@ function startBundleArtifactWatcher(state) {
|
|
|
135362
135462
|
});
|
|
135363
135463
|
};
|
|
135364
135464
|
try {
|
|
135365
|
-
|
|
135465
|
+
mkdirSync19(TIER5_ROOT2, { recursive: true });
|
|
135366
135466
|
const watcher2 = watch(TIER5_ROOT2, { persistent: false }, (_event, filename) => {
|
|
135367
135467
|
const bundle = builtBundleName(filename);
|
|
135368
135468
|
if (!bundle) return;
|
|
@@ -135411,7 +135511,7 @@ function startBundleSourceWatcher(state) {
|
|
|
135411
135511
|
try {
|
|
135412
135512
|
const watcher2 = watch(TIER5_SRC_ROOT, { persistent: false, recursive: true }, (_event, filename) => {
|
|
135413
135513
|
if (!filename || !/\.(ts|tsx)$/.test(filename)) return;
|
|
135414
|
-
const name = filename.split(
|
|
135514
|
+
const name = filename.split(sep11)[0];
|
|
135415
135515
|
if (!name || name.startsWith(".")) return;
|
|
135416
135516
|
pending.add(name);
|
|
135417
135517
|
if (timer) clearTimeout(timer);
|
|
@@ -135490,7 +135590,7 @@ async function reloadAppModuleNow(state, opts) {
|
|
|
135490
135590
|
const current = state.app;
|
|
135491
135591
|
if (!current) return { ok: false, error: "no_app" };
|
|
135492
135592
|
const entry = resolve32(current.dir, "dev/index.ts");
|
|
135493
|
-
|
|
135593
|
+
mkdirSync19(HMR_TMP_DIR, { recursive: true });
|
|
135494
135594
|
const outfile = resolve32(HMR_TMP_DIR, `${current.name}-${++appReloadSeq}.mjs`);
|
|
135495
135595
|
try {
|
|
135496
135596
|
const lib = await import(pathToFileURL5(resolve32(TIER5_SRC_ROOT, "build-lib.mjs")).href);
|
|
@@ -135559,12 +135659,12 @@ function servedTokensHash(app) {
|
|
|
135559
135659
|
}
|
|
135560
135660
|
}
|
|
135561
135661
|
function appDependencyFiles(inputs, appDir3) {
|
|
135562
|
-
const inside2 = (root, p2) => p2 === root || p2.startsWith(root +
|
|
135662
|
+
const inside2 = (root, p2) => p2 === root || p2.startsWith(root + sep11);
|
|
135563
135663
|
const out2 = /* @__PURE__ */ new Set();
|
|
135564
135664
|
for (const raw of inputs) {
|
|
135565
135665
|
const p2 = resolve32(raw);
|
|
135566
135666
|
if (!inside2(ROOT6, p2) || inside2(resolve32(appDir3), p2) || inside2(HMR_TMP_DIR, p2)) continue;
|
|
135567
|
-
if (p2.split(
|
|
135667
|
+
if (p2.split(sep11).includes("node_modules")) continue;
|
|
135568
135668
|
out2.add(p2);
|
|
135569
135669
|
}
|
|
135570
135670
|
return [...out2].sort();
|
|
@@ -135594,7 +135694,7 @@ function syncAppDependencyWatchers(state, inputs) {
|
|
|
135594
135694
|
if (timer) clearTimeout(timer);
|
|
135595
135695
|
timer = setTimeout(() => {
|
|
135596
135696
|
timer = void 0;
|
|
135597
|
-
const files = [...changed].map((f2) =>
|
|
135697
|
+
const files = [...changed].map((f2) => relative8(ROOT6, f2));
|
|
135598
135698
|
changed.clear();
|
|
135599
135699
|
console.log(`[himalaya-dev] app dependency changed: ${files.join(", ")}`);
|
|
135600
135700
|
void reloadAppModule(state, { reason: "dependency_changed" });
|
|
@@ -135613,7 +135713,7 @@ async function primeAppDependencyWatchers(state) {
|
|
|
135613
135713
|
if (!current) return;
|
|
135614
135714
|
const entry = resolve32(current.dir, "dev/index.ts");
|
|
135615
135715
|
if (!existsSync33(entry)) return;
|
|
135616
|
-
|
|
135716
|
+
mkdirSync19(HMR_TMP_DIR, { recursive: true });
|
|
135617
135717
|
const outfile = resolve32(HMR_TMP_DIR, `${current.name}-deps-${++appReloadSeq}.mjs`);
|
|
135618
135718
|
try {
|
|
135619
135719
|
const lib = await import(pathToFileURL5(resolve32(TIER5_SRC_ROOT, "build-lib.mjs")).href);
|
|
@@ -135682,7 +135782,7 @@ function startAppSourceWatcher(state) {
|
|
|
135682
135782
|
try {
|
|
135683
135783
|
const watcher2 = watch(appDir3, { persistent: false, recursive: true }, (_event, filename) => {
|
|
135684
135784
|
if (!filename) return;
|
|
135685
|
-
const rel = String(filename).split(
|
|
135785
|
+
const rel = String(filename).split(sep11).join("/");
|
|
135686
135786
|
if (!classifyAppPath(rel)) return;
|
|
135687
135787
|
pending.add(rel);
|
|
135688
135788
|
if (timer) clearTimeout(timer);
|
|
@@ -137277,8 +137377,8 @@ async function handleActionHandlerBundleGet(res, app) {
|
|
|
137277
137377
|
}
|
|
137278
137378
|
async function serveStatic(req, res, root, prefix) {
|
|
137279
137379
|
const requested = decodeURIComponent((req.url ?? "").split("?")[0]);
|
|
137280
|
-
const
|
|
137281
|
-
const safe = normalize4(
|
|
137380
|
+
const relative27 = requested.replace(prefix, "").replace(/^\//, "");
|
|
137381
|
+
const safe = normalize4(relative27).replace(/^(\.\.[\/\\])+/, "");
|
|
137282
137382
|
const fullPath = resolve32(root, safe);
|
|
137283
137383
|
if (!fullPath.startsWith(root)) {
|
|
137284
137384
|
return send(res, 403, "forbidden");
|
|
@@ -138074,8 +138174,8 @@ var init_src6 = __esm({
|
|
|
138074
138174
|
});
|
|
138075
138175
|
|
|
138076
138176
|
// ../../core/serve-storage/src/file-store.ts
|
|
138077
|
-
import { mkdirSync as
|
|
138078
|
-
import { join as join29, resolve as resolve33, sep as
|
|
138177
|
+
import { mkdirSync as mkdirSync20, readFileSync as readFileSync38, rmSync as rmSync11, writeFileSync as writeFileSync13, readdirSync as readdirSync20, existsSync as existsSync34 } from "node:fs";
|
|
138178
|
+
import { join as join29, resolve as resolve33, sep as sep12 } from "node:path";
|
|
138079
138179
|
var FileReleaseStore;
|
|
138080
138180
|
var init_file_store = __esm({
|
|
138081
138181
|
"../../core/serve-storage/src/file-store.ts"() {
|
|
@@ -138113,7 +138213,7 @@ var init_file_store = __esm({
|
|
|
138113
138213
|
*/
|
|
138114
138214
|
appDir(app) {
|
|
138115
138215
|
const dir = resolve33(this.root, this.safe(app));
|
|
138116
|
-
if (!dir.startsWith(this.root +
|
|
138216
|
+
if (!dir.startsWith(this.root + sep12)) {
|
|
138117
138217
|
throw new Error(`unsafe app id ${JSON.stringify(app)}: ${dir} is not inside the store root`);
|
|
138118
138218
|
}
|
|
138119
138219
|
return dir;
|
|
@@ -138125,58 +138225,58 @@ var init_file_store = __esm({
|
|
|
138125
138225
|
async reset(app) {
|
|
138126
138226
|
const dir = this.appDir(app);
|
|
138127
138227
|
rmSync11(dir, { recursive: true, force: true });
|
|
138128
|
-
|
|
138129
|
-
|
|
138228
|
+
mkdirSync20(join29(dir, "screens"), { recursive: true });
|
|
138229
|
+
mkdirSync20(join29(dir, "bundles"), { recursive: true });
|
|
138130
138230
|
}
|
|
138131
138231
|
async remove(app) {
|
|
138132
138232
|
rmSync11(this.appDir(app), { recursive: true, force: true });
|
|
138133
138233
|
}
|
|
138134
138234
|
async putManifest(app, manifest2) {
|
|
138135
138235
|
validateFunctionManifest(manifest2);
|
|
138136
|
-
|
|
138236
|
+
mkdirSync20(this.appDir(app), { recursive: true });
|
|
138137
138237
|
writeFileSync13(join29(this.appDir(app), "release-manifest.json"), JSON.stringify(manifest2, null, 2));
|
|
138138
138238
|
}
|
|
138139
138239
|
async putScreen(app, screenId, json8) {
|
|
138140
138240
|
const dir = join29(this.appDir(app), "screens");
|
|
138141
|
-
|
|
138241
|
+
mkdirSync20(dir, { recursive: true });
|
|
138142
138242
|
writeFileSync13(join29(dir, `${this.safe(screenId)}.json`), json8);
|
|
138143
138243
|
}
|
|
138144
138244
|
async putBundle(app, sha2567, bytes2) {
|
|
138145
138245
|
const dir = join29(this.appDir(app), "bundles");
|
|
138146
|
-
|
|
138246
|
+
mkdirSync20(dir, { recursive: true });
|
|
138147
138247
|
writeFileSync13(join29(dir, `${this.safe(sha2567)}.bundle.js`), bytes2);
|
|
138148
138248
|
}
|
|
138149
138249
|
async putTokens(app, json8) {
|
|
138150
|
-
|
|
138250
|
+
mkdirSync20(this.appDir(app), { recursive: true });
|
|
138151
138251
|
writeFileSync13(join29(this.appDir(app), "tokens.json"), json8);
|
|
138152
138252
|
}
|
|
138153
138253
|
async putDoc(app, sha2567, json8) {
|
|
138154
138254
|
const dir = join29(this.appDir(app), "docs");
|
|
138155
|
-
|
|
138255
|
+
mkdirSync20(dir, { recursive: true });
|
|
138156
138256
|
writeFileSync13(join29(dir, `${this.safe(sha2567)}.json`), json8);
|
|
138157
138257
|
}
|
|
138158
138258
|
async putAppConfig(app, json8) {
|
|
138159
|
-
|
|
138259
|
+
mkdirSync20(this.appDir(app), { recursive: true });
|
|
138160
138260
|
writeFileSync13(join29(this.appDir(app), "app-config.json"), json8);
|
|
138161
138261
|
}
|
|
138162
138262
|
async putIcon(app, bytes2) {
|
|
138163
|
-
|
|
138263
|
+
mkdirSync20(this.appDir(app), { recursive: true });
|
|
138164
138264
|
writeFileSync13(join29(this.appDir(app), "icon.png"), bytes2);
|
|
138165
138265
|
}
|
|
138166
138266
|
async putWidget(app, widgetId, json8) {
|
|
138167
138267
|
const dir = join29(this.appDir(app), "widgets");
|
|
138168
|
-
|
|
138268
|
+
mkdirSync20(dir, { recursive: true });
|
|
138169
138269
|
writeFileSync13(join29(dir, `${this.safe(widgetId)}.json`), json8);
|
|
138170
138270
|
}
|
|
138171
138271
|
// Per-app settings (registry visibility) — release-independent, so it lives beside the
|
|
138172
138272
|
// manifest, not inside it. NOTE: listApps() keys on release-manifest.json/ledger presence,
|
|
138173
138273
|
// so a settings-only dir never lists an app.
|
|
138174
138274
|
async putAppSettings(app, settings) {
|
|
138175
|
-
|
|
138275
|
+
mkdirSync20(this.appDir(app), { recursive: true });
|
|
138176
138276
|
writeFileSync13(join29(this.appDir(app), "settings.json"), JSON.stringify(settings, null, 2));
|
|
138177
138277
|
}
|
|
138178
138278
|
async putOneAppEnrollment(app) {
|
|
138179
|
-
|
|
138279
|
+
mkdirSync20(this.appDir(app), { recursive: true });
|
|
138180
138280
|
writeFileSync13(join29(this.appDir(app), "one-app-enrollment"), "one-app-to-himi-app");
|
|
138181
138281
|
}
|
|
138182
138282
|
// Template scaffold source archive — a content-addressed JSON doc, so it rides the same
|
|
@@ -138189,7 +138289,7 @@ var init_file_store = __esm({
|
|
|
138189
138289
|
// bundles/<sha>.bundle.js, which bakes ".bundle.js" into the filename).
|
|
138190
138290
|
async putAsset(app, sha2567, bytes2) {
|
|
138191
138291
|
const dir = join29(this.appDir(app), "assets");
|
|
138192
|
-
|
|
138292
|
+
mkdirSync20(dir, { recursive: true });
|
|
138193
138293
|
writeFileSync13(join29(dir, this.safe(sha2567)), bytes2);
|
|
138194
138294
|
}
|
|
138195
138295
|
async getManifest(app) {
|
|
@@ -138259,7 +138359,7 @@ var init_file_store = __esm({
|
|
|
138259
138359
|
async putManifestVersioned(app, releaseId, manifest2) {
|
|
138260
138360
|
validateFunctionManifest(manifest2);
|
|
138261
138361
|
const dir = join29(this.appDir(app), "manifests");
|
|
138262
|
-
|
|
138362
|
+
mkdirSync20(dir, { recursive: true });
|
|
138263
138363
|
writeFileSync13(join29(dir, `${this.safe(releaseId)}.json`), JSON.stringify(manifest2, null, 2));
|
|
138264
138364
|
}
|
|
138265
138365
|
async getManifestById(app, releaseId) {
|
|
@@ -138280,7 +138380,7 @@ var init_file_store = __esm({
|
|
|
138280
138380
|
}
|
|
138281
138381
|
}
|
|
138282
138382
|
async appendRelease(app, entry) {
|
|
138283
|
-
|
|
138383
|
+
mkdirSync20(this.appDir(app), { recursive: true });
|
|
138284
138384
|
const ledger = await this.listReleases(app);
|
|
138285
138385
|
const i2 = ledger.findIndex((e2) => e2.releaseId === entry.releaseId);
|
|
138286
138386
|
if (i2 >= 0) ledger[i2] = entry;
|
|
@@ -138307,7 +138407,7 @@ var init_file_store = __esm({
|
|
|
138307
138407
|
async updateWipRecord(app, fn2) {
|
|
138308
138408
|
const next = fn2(this.readWipSync(app));
|
|
138309
138409
|
if (next === void 0) return false;
|
|
138310
|
-
|
|
138410
|
+
mkdirSync20(this.appDir(app), { recursive: true });
|
|
138311
138411
|
writeFileSync13(join29(this.appDir(app), "_wip.json"), JSON.stringify(next, null, 2));
|
|
138312
138412
|
return true;
|
|
138313
138413
|
}
|
|
@@ -140587,8 +140687,8 @@ async function crawlScreenInner(opts) {
|
|
|
140587
140687
|
if (linkable.has(target)) return true;
|
|
140588
140688
|
for (const base of linkable) {
|
|
140589
140689
|
if (target.length > base.length + 1 && target.startsWith(base)) {
|
|
140590
|
-
const
|
|
140591
|
-
if (
|
|
140690
|
+
const sep26 = target[base.length];
|
|
140691
|
+
if (sep26 === "_" || sep26 === "/") return true;
|
|
140592
140692
|
}
|
|
140593
140693
|
}
|
|
140594
140694
|
return false;
|
|
@@ -144510,13 +144610,13 @@ __export(studio_exports, {
|
|
|
144510
144610
|
});
|
|
144511
144611
|
import { createHash as createHash21 } from "node:crypto";
|
|
144512
144612
|
import { existsSync as existsSync38, readdirSync as readdirSync23, readFileSync as readFileSync42, realpathSync as realpathSync6, statSync as statSync9 } from "node:fs";
|
|
144513
|
-
import { basename as basename12, extname as extname3, join as join33, relative as
|
|
144613
|
+
import { basename as basename12, extname as extname3, join as join33, relative as relative9, resolve as resolve35, sep as sep13 } from "node:path";
|
|
144514
144614
|
import { pathToFileURL as pathToFileURL6 } from "node:url";
|
|
144515
144615
|
function realInside(dir, abs) {
|
|
144516
144616
|
try {
|
|
144517
144617
|
const root = realpathSync6(dir);
|
|
144518
144618
|
const real = realpathSync6(abs);
|
|
144519
|
-
return real.startsWith(root +
|
|
144619
|
+
return real.startsWith(root + sep13) ? real : null;
|
|
144520
144620
|
} catch {
|
|
144521
144621
|
return null;
|
|
144522
144622
|
}
|
|
@@ -144533,7 +144633,7 @@ function archiveFile(dir, memory, abs) {
|
|
|
144533
144633
|
return null;
|
|
144534
144634
|
}
|
|
144535
144635
|
if (size === 0) return null;
|
|
144536
|
-
const key3 =
|
|
144636
|
+
const key3 = relative9(dir, abs);
|
|
144537
144637
|
const hit = memory.files?.[key3];
|
|
144538
144638
|
if (hit && hit.size === size && hit.mtimeMs === mtimeMs && hit.ino === ino && existsSync38(join33(dir, HISTORY_DIR, `${hit.sha}.${hit.ext}`))) {
|
|
144539
144639
|
return { sha: hit.sha, ext: hit.ext, file: `${hit.sha}.${hit.ext}` };
|
|
@@ -144954,7 +145054,7 @@ __export(cli_shared_exports, {
|
|
|
144954
145054
|
visibilityFlag: () => visibilityFlag,
|
|
144955
145055
|
writePngFile: () => writePngFile
|
|
144956
145056
|
});
|
|
144957
|
-
import { mkdtempSync, readFileSync as readFileSync43, mkdirSync as
|
|
145057
|
+
import { mkdtempSync, readFileSync as readFileSync43, mkdirSync as mkdirSync21, writeFileSync as writeFileSync14, existsSync as existsSync39, rmSync as rmSync12, readdirSync as readdirSync24, lstatSync as lstatSync13 } from "node:fs";
|
|
144958
145058
|
import { AsyncLocalStorage as AsyncLocalStorage2 } from "node:async_hooks";
|
|
144959
145059
|
import { tmpdir as tmpdir2 } from "node:os";
|
|
144960
145060
|
import { join as join34, resolve as resolve36, basename as basename13, dirname as dirname26 } from "node:path";
|
|
@@ -145107,7 +145207,7 @@ function nativeConfigTokenNotice(configSource, optedIn) {
|
|
|
145107
145207
|
return `launch-screen token ${list2} also feeds the BUILD-TIME native launch screen (tools/native-config) \u2014 an OTA-only change to its value updates the live app but NOT the baked launch screen until the next native build (regenerate: npm run native-config -- <app>)`;
|
|
145108
145208
|
}
|
|
145109
145209
|
function writePngFile(path2, base64) {
|
|
145110
|
-
|
|
145210
|
+
mkdirSync21(dirname26(path2), { recursive: true });
|
|
145111
145211
|
writeFileSync14(path2, Buffer.from(base64, "base64"));
|
|
145112
145212
|
return path2;
|
|
145113
145213
|
}
|
|
@@ -145150,7 +145250,7 @@ function renameRestoredSource(restored, declaredApp, renamed) {
|
|
|
145150
145250
|
function symlinkDestinationIssue(dest) {
|
|
145151
145251
|
let kind;
|
|
145152
145252
|
try {
|
|
145153
|
-
kind =
|
|
145253
|
+
kind = lstatSync13(dest);
|
|
145154
145254
|
} catch {
|
|
145155
145255
|
return null;
|
|
145156
145256
|
}
|
|
@@ -145214,7 +145314,7 @@ function materializeForPreview(appDir3, slug, displayName3) {
|
|
|
145214
145314
|
}
|
|
145215
145315
|
const dest = join34(root, `${slug}-${process.pid}`);
|
|
145216
145316
|
rmSync12(dest, { recursive: true, force: true });
|
|
145217
|
-
|
|
145317
|
+
mkdirSync21(dest, { recursive: true });
|
|
145218
145318
|
try {
|
|
145219
145319
|
materializeSource(forBuild, displayName3, dest, slug);
|
|
145220
145320
|
} catch (e2) {
|
|
@@ -145225,8 +145325,8 @@ function materializeForPreview(appDir3, slug, displayName3) {
|
|
|
145225
145325
|
}
|
|
145226
145326
|
async function appId(dir) {
|
|
145227
145327
|
try {
|
|
145228
|
-
const { readFileSync:
|
|
145229
|
-
const m2 = JSON.parse(
|
|
145328
|
+
const { readFileSync: readFileSync139 } = await import("node:fs");
|
|
145329
|
+
const m2 = JSON.parse(readFileSync139(join34(dir, "himalaya.content.json"), "utf8"));
|
|
145230
145330
|
if (m2.name) return m2.name;
|
|
145231
145331
|
} catch {
|
|
145232
145332
|
}
|
|
@@ -145459,7 +145559,7 @@ var init_cli_shared = __esm({
|
|
|
145459
145559
|
});
|
|
145460
145560
|
|
|
145461
145561
|
// src/self-update.ts
|
|
145462
|
-
import { readFileSync as readFileSync44, mkdirSync as
|
|
145562
|
+
import { readFileSync as readFileSync44, mkdirSync as mkdirSync22, writeFileSync as writeFileSync15, existsSync as existsSync40, rmSync as rmSync13, statSync as statSync10, accessSync, constants } from "node:fs";
|
|
145463
145563
|
import { execFile, execFileSync as execFileSync3, spawnSync as spawnSync6 } from "node:child_process";
|
|
145464
145564
|
import { randomUUID as randomUUID7 } from "node:crypto";
|
|
145465
145565
|
import { homedir as homedir8, hostname } from "node:os";
|
|
@@ -145646,7 +145746,7 @@ function readUpdateCache(path2) {
|
|
|
145646
145746
|
}
|
|
145647
145747
|
function writeUpdateCache(path2, cache2) {
|
|
145648
145748
|
try {
|
|
145649
|
-
|
|
145749
|
+
mkdirSync22(dirname27(path2), { recursive: true, mode: 448 });
|
|
145650
145750
|
writeFileSync15(path2, JSON.stringify(cache2, null, 2) + "\n", { mode: 384 });
|
|
145651
145751
|
} catch {
|
|
145652
145752
|
}
|
|
@@ -145800,7 +145900,7 @@ function acquireUpdateLock(cachePath, now, hooks = {}) {
|
|
|
145800
145900
|
};
|
|
145801
145901
|
const release2 = () => removeIfMine(lockPath2);
|
|
145802
145902
|
try {
|
|
145803
|
-
|
|
145903
|
+
mkdirSync22(dirname27(lockPath2), { recursive: true, mode: 448 });
|
|
145804
145904
|
} catch {
|
|
145805
145905
|
return () => {
|
|
145806
145906
|
};
|
|
@@ -147081,10 +147181,10 @@ __export(preflight_exports, {
|
|
|
147081
147181
|
requireEnv: () => requireEnv
|
|
147082
147182
|
});
|
|
147083
147183
|
import { existsSync as existsSync43, readFileSync as readFileSync47 } from "node:fs";
|
|
147084
|
-
import { isAbsolute as
|
|
147184
|
+
import { isAbsolute as isAbsolute3, relative as relative10, resolve as resolve39 } from "node:path";
|
|
147085
147185
|
function isInsideRepo(p2) {
|
|
147086
|
-
const rel =
|
|
147087
|
-
return rel !== "" && !rel.startsWith("..") && !
|
|
147186
|
+
const rel = relative10(REPO_ROOT, resolve39(p2));
|
|
147187
|
+
return rel !== "" && !rel.startsWith("..") && !isAbsolute3(rel);
|
|
147088
147188
|
}
|
|
147089
147189
|
function assertCredentialOutsideRepo(label3, p2) {
|
|
147090
147190
|
if (isInsideRepo(p2)) {
|
|
@@ -150690,21 +150790,21 @@ var init_Matcher = __esm({
|
|
|
150690
150790
|
* @returns {string}
|
|
150691
150791
|
*/
|
|
150692
150792
|
toString(separator, includeNamespace = true) {
|
|
150693
|
-
const
|
|
150694
|
-
const isDefault =
|
|
150793
|
+
const sep26 = separator || this.separator;
|
|
150794
|
+
const isDefault = sep26 === this.separator && includeNamespace === true;
|
|
150695
150795
|
if (isDefault) {
|
|
150696
150796
|
if (this._pathStringCache !== null) {
|
|
150697
150797
|
return this._pathStringCache;
|
|
150698
150798
|
}
|
|
150699
150799
|
const result = this.path.map(
|
|
150700
150800
|
(n2) => n2.namespace ? `${n2.namespace}:${n2.tag}` : n2.tag
|
|
150701
|
-
).join(
|
|
150801
|
+
).join(sep26);
|
|
150702
150802
|
this._pathStringCache = result;
|
|
150703
150803
|
return result;
|
|
150704
150804
|
}
|
|
150705
150805
|
return this.path.map(
|
|
150706
150806
|
(n2) => includeNamespace && n2.namespace ? `${n2.namespace}:${n2.tag}` : n2.tag
|
|
150707
|
-
).join(
|
|
150807
|
+
).join(sep26);
|
|
150708
150808
|
}
|
|
150709
150809
|
/**
|
|
150710
150810
|
* Get path as array of tag names.
|
|
@@ -151414,77 +151514,77 @@ var init_redos = __esm({
|
|
|
151414
151514
|
});
|
|
151415
151515
|
|
|
151416
151516
|
// ../../node_modules/is-unsafe/src/contexts/nosql.js
|
|
151417
|
-
var
|
|
151517
|
+
var sep14, NOSQL_PATTERNS, nosql_default;
|
|
151418
151518
|
var init_nosql = __esm({
|
|
151419
151519
|
"../../node_modules/is-unsafe/src/contexts/nosql.js"() {
|
|
151420
151520
|
init_define_HHP_CATALOG();
|
|
151421
|
-
|
|
151521
|
+
sep14 = `["'\\s]*:`;
|
|
151422
151522
|
NOSQL_PATTERNS = [
|
|
151423
151523
|
// ─── MongoDB $ operator injection ────────────────────────────────────────
|
|
151424
151524
|
{
|
|
151425
151525
|
id: "nosql-where-operator",
|
|
151426
151526
|
description: "$where \u2014 executes arbitrary JavaScript server-side in MongoDB",
|
|
151427
|
-
pattern: new RegExp(`\\$where${
|
|
151527
|
+
pattern: new RegExp(`\\$where${sep14}`, "i")
|
|
151428
151528
|
},
|
|
151429
151529
|
{
|
|
151430
151530
|
id: "nosql-ne-operator",
|
|
151431
151531
|
description: '$ne \u2014 "not equal" operator used to bypass equality checks',
|
|
151432
|
-
pattern: new RegExp(`\\$ne${
|
|
151532
|
+
pattern: new RegExp(`\\$ne${sep14}`, "i")
|
|
151433
151533
|
},
|
|
151434
151534
|
{
|
|
151435
151535
|
id: "nosql-gt-operator",
|
|
151436
151536
|
description: '$gt \u2014 "greater than" used to bypass password/value checks',
|
|
151437
|
-
pattern: new RegExp(`\\$gte?${
|
|
151537
|
+
pattern: new RegExp(`\\$gte?${sep14}`, "i")
|
|
151438
151538
|
},
|
|
151439
151539
|
{
|
|
151440
151540
|
id: "nosql-lt-operator",
|
|
151441
151541
|
description: '$lt / $lte \u2014 "less than" bypass variants',
|
|
151442
|
-
pattern: new RegExp(`\\$lte?${
|
|
151542
|
+
pattern: new RegExp(`\\$lte?${sep14}`, "i")
|
|
151443
151543
|
},
|
|
151444
151544
|
{
|
|
151445
151545
|
id: "nosql-regex-operator",
|
|
151446
151546
|
description: "$regex \u2014 can be used to extract data character by character (blind injection)",
|
|
151447
|
-
pattern: new RegExp(`\\$regex${
|
|
151547
|
+
pattern: new RegExp(`\\$regex${sep14}`, "i")
|
|
151448
151548
|
},
|
|
151449
151549
|
{
|
|
151450
151550
|
id: "nosql-or-operator",
|
|
151451
151551
|
description: "$or \u2014 logical OR; used to create always-true conditions",
|
|
151452
|
-
pattern: new RegExp(`\\$or${
|
|
151552
|
+
pattern: new RegExp(`\\$or${sep14}\\s*\\[`, "i")
|
|
151453
151553
|
},
|
|
151454
151554
|
{
|
|
151455
151555
|
id: "nosql-and-operator",
|
|
151456
151556
|
description: "$and \u2014 logical AND operator injection",
|
|
151457
|
-
pattern: new RegExp(`\\$and${
|
|
151557
|
+
pattern: new RegExp(`\\$and${sep14}\\s*\\[`, "i")
|
|
151458
151558
|
},
|
|
151459
151559
|
{
|
|
151460
151560
|
id: "nosql-nor-operator",
|
|
151461
151561
|
description: "$nor \u2014 logical NOR operator injection",
|
|
151462
|
-
pattern: new RegExp(`\\$nor${
|
|
151562
|
+
pattern: new RegExp(`\\$nor${sep14}\\s*\\[`, "i")
|
|
151463
151563
|
},
|
|
151464
151564
|
{
|
|
151465
151565
|
id: "nosql-exists-operator",
|
|
151466
151566
|
description: "$exists \u2014 can enumerate fields to determine schema",
|
|
151467
|
-
pattern: new RegExp(`\\$exists${
|
|
151567
|
+
pattern: new RegExp(`\\$exists${sep14}`, "i")
|
|
151468
151568
|
},
|
|
151469
151569
|
{
|
|
151470
151570
|
id: "nosql-in-operator",
|
|
151471
151571
|
description: "$in \u2014 matches any value in a list; can enumerate values",
|
|
151472
|
-
pattern: new RegExp(`\\$in${
|
|
151572
|
+
pattern: new RegExp(`\\$in${sep14}\\s*\\[`, "i")
|
|
151473
151573
|
},
|
|
151474
151574
|
{
|
|
151475
151575
|
id: "nosql-expr-operator",
|
|
151476
151576
|
description: "$expr \u2014 allows aggregation expressions in queries (MongoDB 3.6+)",
|
|
151477
|
-
pattern: new RegExp(`\\$expr${
|
|
151577
|
+
pattern: new RegExp(`\\$expr${sep14}`, "i")
|
|
151478
151578
|
},
|
|
151479
151579
|
{
|
|
151480
151580
|
id: "nosql-function-operator",
|
|
151481
151581
|
description: "$function \u2014 executes arbitrary JavaScript in MongoDB 4.4+",
|
|
151482
|
-
pattern: new RegExp(`\\$function${
|
|
151582
|
+
pattern: new RegExp(`\\$function${sep14}`, "i")
|
|
151483
151583
|
},
|
|
151484
151584
|
{
|
|
151485
151585
|
id: "nosql-accumulator-operator",
|
|
151486
151586
|
description: "$accumulator \u2014 custom aggregation with arbitrary JS execution",
|
|
151487
|
-
pattern: new RegExp(`\\$accumulator${
|
|
151587
|
+
pattern: new RegExp(`\\$accumulator${sep14}`, "i")
|
|
151488
151588
|
},
|
|
151489
151589
|
// ─── Prototype pollution ─────────────────────────────────────────────────
|
|
151490
151590
|
{
|
|
@@ -153915,7 +154015,7 @@ var init_customer_signing_inspect = __esm({
|
|
|
153915
154015
|
});
|
|
153916
154016
|
|
|
153917
154017
|
// src/push-onboarding.ts
|
|
153918
|
-
import { existsSync as existsSync44, mkdirSync as
|
|
154018
|
+
import { existsSync as existsSync44, mkdirSync as mkdirSync23, readFileSync as readFileSync48, statSync as statSync11, writeFileSync as writeFileSync16, chmodSync as chmodSync2 } from "node:fs";
|
|
153919
154019
|
import { basename as basename14, dirname as dirname28, join as join36, resolve as resolve40 } from "node:path";
|
|
153920
154020
|
function readJson4(path2) {
|
|
153921
154021
|
try {
|
|
@@ -154065,7 +154165,7 @@ function readPushOnboarding(dir) {
|
|
|
154065
154165
|
}
|
|
154066
154166
|
function writeFile(dir, file2) {
|
|
154067
154167
|
const path2 = join36(resolve40(dir), PUSH_ONBOARDING_PATH);
|
|
154068
|
-
|
|
154168
|
+
mkdirSync23(dirname28(path2), { recursive: true, mode: 448 });
|
|
154069
154169
|
writeFileSync16(path2, JSON.stringify(file2, null, 2) + "\n", { mode: 384 });
|
|
154070
154170
|
try {
|
|
154071
154171
|
chmodSync2(path2, 384);
|
|
@@ -154164,7 +154264,7 @@ __export(signing_inspect_exports, {
|
|
|
154164
154264
|
runSigningInspect: () => runSigningInspect
|
|
154165
154265
|
});
|
|
154166
154266
|
import { existsSync as existsSync45, readFileSync as readFileSync49, statSync as statSync12 } from "node:fs";
|
|
154167
|
-
import { isAbsolute as
|
|
154267
|
+
import { isAbsolute as isAbsolute4, resolve as resolve41 } from "node:path";
|
|
154168
154268
|
function fail5(io2, code, fields = {}) {
|
|
154169
154269
|
io2.error(JSON.stringify({ ok: false, code, ...fields }));
|
|
154170
154270
|
return code.endsWith("_required") || code.endsWith("_usage") ? 2 : 1;
|
|
@@ -154220,7 +154320,7 @@ async function runSigningInspect(pos, flags, io2, deps = {}) {
|
|
|
154220
154320
|
hint: "Pass --bundle-id --team-id and ASC key flags, or set ASC_KEY_PATH / ASC_KEY_ID / ASC_ISSUER_ID."
|
|
154221
154321
|
});
|
|
154222
154322
|
}
|
|
154223
|
-
const resolvedKey =
|
|
154323
|
+
const resolvedKey = isAbsolute4(keyFile) ? keyFile : resolve41(process.cwd(), keyFile);
|
|
154224
154324
|
try {
|
|
154225
154325
|
assertCredentialOutsideRepo("asc-key-file", resolvedKey);
|
|
154226
154326
|
} catch (error) {
|
|
@@ -154245,8 +154345,8 @@ async function runSigningInspect(pos, flags, io2, deps = {}) {
|
|
|
154245
154345
|
error: "local asset check needs --cert-file, --cert-password, and --profile-file together"
|
|
154246
154346
|
});
|
|
154247
154347
|
}
|
|
154248
|
-
const certPath =
|
|
154249
|
-
const profilePath2 =
|
|
154348
|
+
const certPath = isAbsolute4(certFile) ? certFile : resolve41(process.cwd(), certFile);
|
|
154349
|
+
const profilePath2 = isAbsolute4(profileFile) ? profileFile : resolve41(process.cwd(), profileFile);
|
|
154250
154350
|
try {
|
|
154251
154351
|
assertCredentialOutsideRepo("cert-file", certPath);
|
|
154252
154352
|
assertCredentialOutsideRepo("profile-file", profilePath2);
|
|
@@ -154301,12 +154401,12 @@ __export(content_manifest_exports, {
|
|
|
154301
154401
|
writeContentManifest: () => writeContentManifest
|
|
154302
154402
|
});
|
|
154303
154403
|
import { randomUUID as randomUUID8 } from "node:crypto";
|
|
154304
|
-
import { constants as constants2, lstatSync as
|
|
154404
|
+
import { constants as constants2, lstatSync as lstatSync14, readFileSync as readFileSync50, realpathSync as realpathSync7, writeFileSync as writeFileSync17, renameSync as renameSync9, openSync as openSync3, closeSync as closeSync3, unlinkSync as unlinkSync2 } from "node:fs";
|
|
154305
154405
|
import { join as join37 } from "node:path";
|
|
154306
154406
|
function contentManifestPath(dir) {
|
|
154307
154407
|
const path2 = join37(realpathSync7(dir), "himalaya.content.json");
|
|
154308
154408
|
try {
|
|
154309
|
-
if (
|
|
154409
|
+
if (lstatSync14(path2).isSymbolicLink()) throw new Error("himalaya.content.json is a symlink \u2014 refusing to read or write through it");
|
|
154310
154410
|
} catch (error) {
|
|
154311
154411
|
if (error.code !== "ENOENT") throw error;
|
|
154312
154412
|
}
|
|
@@ -154823,7 +154923,7 @@ __export(template_trim_exports, {
|
|
|
154823
154923
|
runTemplateTrim: () => runTemplateTrim,
|
|
154824
154924
|
trimCapabilities: () => trimCapabilities
|
|
154825
154925
|
});
|
|
154826
|
-
import { cpSync, existsSync as existsSync46, mkdirSync as
|
|
154926
|
+
import { cpSync, existsSync as existsSync46, mkdirSync as mkdirSync24, readdirSync as readdirSync25, readFileSync as readFileSync51, renameSync as renameSync10, rmSync as rmSync14, statSync as statSync13, writeFileSync as writeFileSync18 } from "node:fs";
|
|
154827
154927
|
import { dirname as dirname29, join as join38 } from "node:path";
|
|
154828
154928
|
import ts5 from "typescript";
|
|
154829
154929
|
function routeMatcher(pattern) {
|
|
@@ -155855,9 +155955,9 @@ async function runTemplateTrim(req, deps) {
|
|
|
155855
155955
|
return { code: 1, result: { ok: false, error: `${error} (${message2}); every file was restored`, rolledBack: true, ...base(validate6) } };
|
|
155856
155956
|
};
|
|
155857
155957
|
try {
|
|
155858
|
-
|
|
155958
|
+
mkdirSync24(join38(backup, "dev"), { recursive: true });
|
|
155859
155959
|
for (const [path2, rel] of originals) cpSync(path2, join38(backup, rel));
|
|
155860
|
-
if (plan.removedWorkers.length)
|
|
155960
|
+
if (plan.removedWorkers.length) mkdirSync24(join38(backup, "tier5-src"), { recursive: true });
|
|
155861
155961
|
} catch (e2) {
|
|
155862
155962
|
dropBackup();
|
|
155863
155963
|
return { code: 1, result: { ok: false, error: `could not back up the app before trimming it (${e2.message}); nothing was changed`, rolledBack: true, ...base() } };
|
|
@@ -156155,7 +156255,7 @@ __export(template_adopt_exports, {
|
|
|
156155
156255
|
workerReach: () => workerReach,
|
|
156156
156256
|
writeInventory: () => writeInventory
|
|
156157
156257
|
});
|
|
156158
|
-
import { existsSync as existsSync47, lstatSync as
|
|
156258
|
+
import { existsSync as existsSync47, lstatSync as lstatSync15, mkdirSync as mkdirSync25, readdirSync as readdirSync26, readFileSync as readFileSync52, renameSync as renameSync11, statSync as statSync14, writeFileSync as writeFileSync19 } from "node:fs";
|
|
156159
156259
|
import { dirname as dirname30, join as join39, posix as posix2 } from "node:path";
|
|
156160
156260
|
import ts6 from "typescript";
|
|
156161
156261
|
function readAppSources(dir) {
|
|
@@ -156499,9 +156599,9 @@ function inventorySummary(inv) {
|
|
|
156499
156599
|
function writeNoFollow(dir, rel, body) {
|
|
156500
156600
|
const p2 = join39(dir, rel);
|
|
156501
156601
|
const parent = dirname30(p2);
|
|
156502
|
-
if (existsSync47(parent) &&
|
|
156503
|
-
|
|
156504
|
-
if (existsSync47(p2) &&
|
|
156602
|
+
if (existsSync47(parent) && lstatSync15(parent).isSymbolicLink()) throw new TrimRefusal(`${dirname30(rel)} is a symlink \u2014 refusing to write through it`);
|
|
156603
|
+
mkdirSync25(parent, { recursive: true });
|
|
156604
|
+
if (existsSync47(p2) && lstatSync15(p2).isSymbolicLink()) throw new TrimRefusal(`${rel} is a symlink \u2014 refusing to write through it`);
|
|
156505
156605
|
const tmp = `${p2}.${process.pid}.${Date.now()}.tmp`;
|
|
156506
156606
|
writeFileSync19(tmp, body, { flag: "wx" });
|
|
156507
156607
|
renameSync11(tmp, p2);
|
|
@@ -156555,7 +156655,7 @@ function replaceScreen(dir, id, entry) {
|
|
|
156555
156655
|
}
|
|
156556
156656
|
for (const rel of ["dev", "dev/index.ts"]) {
|
|
156557
156657
|
const p2 = join39(dir, rel);
|
|
156558
|
-
if (existsSync47(p2) &&
|
|
156658
|
+
if (existsSync47(p2) && lstatSync15(p2).isSymbolicLink()) throw new TrimRefusal(`${rel} is a symlink \u2014 refusing to write through it (dev/index.ts left unchanged)`);
|
|
156559
156659
|
}
|
|
156560
156660
|
writeNoFollow(dir, "dev/index.ts", next);
|
|
156561
156661
|
return { ok: true, screen: id, bytes: body.length };
|
|
@@ -156619,7 +156719,7 @@ function addScreen(dir, id, entry, opts = {}) {
|
|
|
156619
156719
|
}
|
|
156620
156720
|
for (const rel of ["dev", "dev/index.ts", ...config !== src.config ? ["config.ts"] : [], ...contentWithView !== void 0 ? ["himalaya.content.json"] : []]) {
|
|
156621
156721
|
const p2 = join39(dir, rel);
|
|
156622
|
-
if (existsSync47(p2) &&
|
|
156722
|
+
if (existsSync47(p2) && lstatSync15(p2).isSymbolicLink()) throw new TrimRefusal(`${rel} is a symlink \u2014 refusing to write through it (nothing written)`);
|
|
156623
156723
|
}
|
|
156624
156724
|
writeNoFollow(dir, "dev/index.ts", dev);
|
|
156625
156725
|
if (config !== src.config) writeNoFollow(dir, "config.ts", config);
|
|
@@ -156918,7 +157018,7 @@ var init_hosted_owner = __esm({
|
|
|
156918
157018
|
});
|
|
156919
157019
|
|
|
156920
157020
|
// src/config-source-edit.ts
|
|
156921
|
-
import { lstatSync as
|
|
157021
|
+
import { lstatSync as lstatSync16 } from "node:fs";
|
|
156922
157022
|
import { join as join40 } from "node:path";
|
|
156923
157023
|
import ts7 from "typescript";
|
|
156924
157024
|
function defineAppLiteral(file2) {
|
|
@@ -157024,7 +157124,7 @@ function backUpConfig(dir, folder, fileName, original) {
|
|
|
157024
157124
|
}
|
|
157025
157125
|
function isSymlink2(path2) {
|
|
157026
157126
|
try {
|
|
157027
|
-
return
|
|
157127
|
+
return lstatSync16(path2).isSymbolicLink();
|
|
157028
157128
|
} catch {
|
|
157029
157129
|
return false;
|
|
157030
157130
|
}
|
|
@@ -157511,7 +157611,7 @@ __export(pack_exports, {
|
|
|
157511
157611
|
});
|
|
157512
157612
|
import { createHash as createHash24 } from "node:crypto";
|
|
157513
157613
|
import { deflateRawSync, inflateRawSync } from "node:zlib";
|
|
157514
|
-
import { existsSync as existsSync48, mkdirSync as
|
|
157614
|
+
import { existsSync as existsSync48, mkdirSync as mkdirSync26, readFileSync as readFileSync54, readdirSync as readdirSync27, rmSync as rmSync15, statSync as statSync15, writeFileSync as writeFileSync20 } from "node:fs";
|
|
157515
157615
|
import { dirname as dirname31, join as join41, resolve as resolve43 } from "node:path";
|
|
157516
157616
|
function writeZip(entries) {
|
|
157517
157617
|
const sorted2 = entries.slice().sort((a2, b2) => a2.path < b2.path ? -1 : a2.path > b2.path ? 1 : 0);
|
|
@@ -157690,7 +157790,7 @@ function packRelease(releaseRoot, app, out2, opts = {}) {
|
|
|
157690
157790
|
const buf = writeZip(all);
|
|
157691
157791
|
const isDir2 = existsSync48(out2) && statSync15(out2).isDirectory();
|
|
157692
157792
|
const outFile = isDir2 ? join41(resolve43(out2), packageFileName(app, header.releaseId)) : resolve43(out2);
|
|
157693
|
-
|
|
157793
|
+
mkdirSync26(dirname31(outFile), { recursive: true });
|
|
157694
157794
|
writeFileSync20(outFile, buf);
|
|
157695
157795
|
return { app, releaseId: header.releaseId, header, out: outFile, bytes: buf.length, entryCount: all.length, skipped };
|
|
157696
157796
|
}
|
|
@@ -157734,7 +157834,7 @@ function packReleaseToDir(releaseRoot, app, outDir, opts = {}) {
|
|
|
157734
157834
|
let bytes2 = 0;
|
|
157735
157835
|
for (const entry of all) {
|
|
157736
157836
|
const target = join41(dest, entry.path);
|
|
157737
|
-
|
|
157837
|
+
mkdirSync26(dirname31(target), { recursive: true });
|
|
157738
157838
|
writeFileSync20(target, entry.bytes);
|
|
157739
157839
|
bytes2 += entry.bytes.length;
|
|
157740
157840
|
}
|
|
@@ -157816,7 +157916,7 @@ function unpackTo(buf, dest, appFallback) {
|
|
|
157816
157916
|
rmSync15(appDir3, { recursive: true, force: true });
|
|
157817
157917
|
for (const [rel, bytes2] of entries) {
|
|
157818
157918
|
const target = join41(appDir3, rel);
|
|
157819
|
-
|
|
157919
|
+
mkdirSync26(dirname31(target), { recursive: true });
|
|
157820
157920
|
writeFileSync20(target, bytes2);
|
|
157821
157921
|
}
|
|
157822
157922
|
return { root, appDir: appDir3, app };
|
|
@@ -157856,8 +157956,8 @@ __export(app_source_exports, {
|
|
|
157856
157956
|
zipAppSource: () => zipAppSource
|
|
157857
157957
|
});
|
|
157858
157958
|
import { createHash as createHash25 } from "node:crypto";
|
|
157859
|
-
import { readdirSync as readdirSync28, lstatSync as
|
|
157860
|
-
import { join as join42, resolve as resolve44, sep as
|
|
157959
|
+
import { readdirSync as readdirSync28, lstatSync as lstatSync17, readFileSync as readFileSync55, mkdirSync as mkdirSync27, writeFileSync as writeFileSync21, existsSync as existsSync49, rmSync as rmSync16, rmdirSync as rmdirSync3, unlinkSync as unlinkSync3 } from "node:fs";
|
|
157960
|
+
import { join as join42, resolve as resolve44, sep as sep15 } from "node:path";
|
|
157861
157961
|
import { createRequire as createRequire4 } from "node:module";
|
|
157862
157962
|
import { deflateRawSync as deflateRawSync2 } from "node:zlib";
|
|
157863
157963
|
function walkSourceTree(dir, file2, skip, enter = () => {
|
|
@@ -157866,7 +157966,7 @@ function walkSourceTree(dir, file2, skip, enter = () => {
|
|
|
157866
157966
|
enter(relDir);
|
|
157867
157967
|
for (const name of readdirSync28(join42(dir, relDir))) {
|
|
157868
157968
|
const rel = relDir ? join42(relDir, name) : name;
|
|
157869
|
-
const st2 =
|
|
157969
|
+
const st2 = lstatSync17(join42(dir, rel));
|
|
157870
157970
|
if (st2.isSymbolicLink()) {
|
|
157871
157971
|
skip(rel);
|
|
157872
157972
|
continue;
|
|
@@ -157880,7 +157980,7 @@ function walkSourceTree(dir, file2, skip, enter = () => {
|
|
|
157880
157980
|
skip(rel);
|
|
157881
157981
|
continue;
|
|
157882
157982
|
}
|
|
157883
|
-
file2(rel.split(
|
|
157983
|
+
file2(rel.split(sep15).join("/"), rel);
|
|
157884
157984
|
}
|
|
157885
157985
|
};
|
|
157886
157986
|
walk2("");
|
|
@@ -157940,14 +158040,14 @@ function renderInputRootDirs(dir) {
|
|
|
157940
158040
|
}
|
|
157941
158041
|
function newestSourceChangeMs(dir) {
|
|
157942
158042
|
const roots2 = renderInputRootDirs(dir);
|
|
157943
|
-
const inRead = (hostRel) => !roots2 || roots2.has(hostRel.split(
|
|
157944
|
-
const counts = (hostRel) => !hostRel.includes(
|
|
158043
|
+
const inRead = (hostRel) => !roots2 || roots2.has(hostRel.split(sep15)[0]);
|
|
158044
|
+
const counts = (hostRel) => !hostRel.includes(sep15) || inRead(hostRel);
|
|
157945
158045
|
let newest = 0;
|
|
157946
158046
|
walkSourceTree(
|
|
157947
158047
|
dir,
|
|
157948
158048
|
(archivePath, hostRel) => {
|
|
157949
158049
|
if (/\.md$/i.test(archivePath) || !counts(hostRel)) return;
|
|
157950
|
-
const m2 =
|
|
158050
|
+
const m2 = lstatSync17(join42(dir, hostRel)).mtimeMs;
|
|
157951
158051
|
if (m2 > newest) newest = m2;
|
|
157952
158052
|
},
|
|
157953
158053
|
() => {
|
|
@@ -157959,7 +158059,7 @@ function newestSourceChangeMs(dir) {
|
|
|
157959
158059
|
// Nor a root directory the render does not read: creating a file in `_qa/` moves `_qa/`.
|
|
157960
158060
|
(hostRel) => {
|
|
157961
158061
|
if (hostRel === "" || !inRead(hostRel)) return;
|
|
157962
|
-
const m2 =
|
|
158062
|
+
const m2 = lstatSync17(join42(dir, hostRel)).mtimeMs;
|
|
157963
158063
|
if (m2 > newest) newest = m2;
|
|
157964
158064
|
}
|
|
157965
158065
|
);
|
|
@@ -158007,7 +158107,7 @@ function readAppSource(zip) {
|
|
|
158007
158107
|
}
|
|
158008
158108
|
function pathKind(p2) {
|
|
158009
158109
|
try {
|
|
158010
|
-
return
|
|
158110
|
+
return lstatSync17(p2);
|
|
158011
158111
|
} catch {
|
|
158012
158112
|
return null;
|
|
158013
158113
|
}
|
|
@@ -158019,7 +158119,7 @@ function writeAppSource(entries, destDir) {
|
|
|
158019
158119
|
`refusing to restore into ${root}: the destination itself is a symlink, so every file would be written outside it. Remove it, or pass --out/--name somewhere else.`
|
|
158020
158120
|
);
|
|
158021
158121
|
}
|
|
158022
|
-
|
|
158122
|
+
mkdirSync27(root, { recursive: true });
|
|
158023
158123
|
const written = [];
|
|
158024
158124
|
for (const entry of entries) {
|
|
158025
158125
|
if (isDeniedSourcePath(entry.path)) continue;
|
|
@@ -158030,7 +158130,7 @@ function writeAppSource(entries, destDir) {
|
|
|
158030
158130
|
const kind = pathKind(dir);
|
|
158031
158131
|
if (kind?.isSymbolicLink()) unlinkSync3(dir);
|
|
158032
158132
|
else if (kind) continue;
|
|
158033
|
-
|
|
158133
|
+
mkdirSync27(dir);
|
|
158034
158134
|
}
|
|
158035
158135
|
const target = join42(root, ...segments);
|
|
158036
158136
|
if (pathKind(target)?.isSymbolicLink()) unlinkSync3(target);
|
|
@@ -158103,8 +158203,8 @@ function pruneEmptyDirs(root, rel, needed, removed) {
|
|
|
158103
158203
|
let empty2 = true;
|
|
158104
158204
|
for (const name of readdirSync28(rel ? join42(root, rel) : root)) {
|
|
158105
158205
|
const childRel = rel ? join42(rel, name) : name;
|
|
158106
|
-
const posix5 = childRel.split(
|
|
158107
|
-
const kind =
|
|
158206
|
+
const posix5 = childRel.split(sep15).join("/");
|
|
158207
|
+
const kind = lstatSync17(join42(root, childRel));
|
|
158108
158208
|
if (kind.isSymbolicLink() || !kind.isDirectory() || isDeniedSourceDir(name, rel)) {
|
|
158109
158209
|
empty2 = false;
|
|
158110
158210
|
continue;
|
|
@@ -158186,9 +158286,9 @@ __export(run_watch_exports, {
|
|
|
158186
158286
|
watchedContentDir: () => watchedContentDir,
|
|
158187
158287
|
writeRunRecord: () => writeRunRecord
|
|
158188
158288
|
});
|
|
158189
|
-
import { closeSync as closeSync4, constants as constants3, existsSync as existsSync50, fstatSync, lstatSync as
|
|
158289
|
+
import { closeSync as closeSync4, constants as constants3, existsSync as existsSync50, fstatSync, lstatSync as lstatSync18, statSync as statSync16, readdirSync as readdirSync29, mkdirSync as mkdirSync28, openSync as openSync4, readFileSync as readFileSync56, realpathSync as realpathSync8, renameSync as renameSync12, rmSync as rmSync17, writeFileSync as writeFileSync22, watch as fsWatch } from "node:fs";
|
|
158190
158290
|
import { randomUUID as randomUUID9 } from "node:crypto";
|
|
158191
|
-
import { extname as extname4, join as join43, relative as
|
|
158291
|
+
import { extname as extname4, join as join43, relative as relative11, resolve as resolve45, sep as sep16 } from "node:path";
|
|
158192
158292
|
function diffReleases(prev, next) {
|
|
158193
158293
|
const bundles = Object.keys(next.bundles).filter((b2) => prev.bundles[b2]?.sha256 !== next.bundles[b2].sha256).sort();
|
|
158194
158294
|
const changedBundles = new Set(bundles);
|
|
@@ -158216,7 +158316,7 @@ function reloadEvents(d2) {
|
|
|
158216
158316
|
function hhpRasterDir(dir) {
|
|
158217
158317
|
const assets = findAssetsDir(dir);
|
|
158218
158318
|
if (!assets) return null;
|
|
158219
|
-
const rel =
|
|
158319
|
+
const rel = relative11(dir, assets).split(sep16).join("/");
|
|
158220
158320
|
return rel ? `${rel}/hhp-raster` : "hhp-raster";
|
|
158221
158321
|
}
|
|
158222
158322
|
function ignoredChange(relPath, isDirectory = () => false, rasterDir = "assets/hhp-raster") {
|
|
@@ -158266,7 +158366,7 @@ function watchContent(dir, onChange, opts = {}) {
|
|
|
158266
158366
|
for (const name of entries) {
|
|
158267
158367
|
const path2 = join43(directory, String(name)), rel = prefix ? `${prefix}/${name}` : String(name);
|
|
158268
158368
|
try {
|
|
158269
|
-
const stat2 =
|
|
158369
|
+
const stat2 = lstatSync18(path2);
|
|
158270
158370
|
if (stat2.isSymbolicLink() || ignoredChange(rel, () => stat2.isDirectory(), rasterDir)) continue;
|
|
158271
158371
|
if (stat2.isDirectory()) visit(path2, rel);
|
|
158272
158372
|
else if (stat2.isFile()) files.set(rel, `${stat2.mtimeMs}:${stat2.ctimeMs}:${stat2.size}`);
|
|
@@ -158364,11 +158464,11 @@ function serialize(task) {
|
|
|
158364
158464
|
function himiDir(dir) {
|
|
158365
158465
|
const root = join43(dir, ".himi");
|
|
158366
158466
|
try {
|
|
158367
|
-
return
|
|
158467
|
+
return lstatSync18(root).isDirectory() ? root : null;
|
|
158368
158468
|
} catch (e2) {
|
|
158369
158469
|
if (e2.code !== "ENOENT") return null;
|
|
158370
|
-
|
|
158371
|
-
return
|
|
158470
|
+
mkdirSync28(root, { recursive: true });
|
|
158471
|
+
return lstatSync18(root).isDirectory() ? root : null;
|
|
158372
158472
|
}
|
|
158373
158473
|
}
|
|
158374
158474
|
function writeRunRecord(dir, record3) {
|
|
@@ -158388,7 +158488,7 @@ function writeRunRecord(dir, record3) {
|
|
|
158388
158488
|
function removeRunRecord(dir, owner) {
|
|
158389
158489
|
const root = join43(dir, ".himi");
|
|
158390
158490
|
try {
|
|
158391
|
-
if (!
|
|
158491
|
+
if (!lstatSync18(root).isDirectory()) return;
|
|
158392
158492
|
} catch {
|
|
158393
158493
|
return;
|
|
158394
158494
|
}
|
|
@@ -158406,7 +158506,7 @@ function removeRunRecord(dir, owner) {
|
|
|
158406
158506
|
function removeInitWatchRecord(dir, owner) {
|
|
158407
158507
|
const root = join43(dir, ".himi");
|
|
158408
158508
|
try {
|
|
158409
|
-
if (!
|
|
158509
|
+
if (!lstatSync18(root).isDirectory()) return;
|
|
158410
158510
|
} catch {
|
|
158411
158511
|
return;
|
|
158412
158512
|
}
|
|
@@ -158443,16 +158543,16 @@ function boardFile(dir, pathname) {
|
|
|
158443
158543
|
}
|
|
158444
158544
|
function readConfined(root, rel) {
|
|
158445
158545
|
try {
|
|
158446
|
-
if (!
|
|
158447
|
-
const parts = rel.split(
|
|
158546
|
+
if (!lstatSync18(root).isDirectory()) return null;
|
|
158547
|
+
const parts = rel.split(sep16);
|
|
158448
158548
|
let at2 = root;
|
|
158449
158549
|
for (let i2 = 0; i2 < parts.length; i2++) {
|
|
158450
158550
|
at2 = join43(at2, parts[i2]);
|
|
158451
|
-
const st2 =
|
|
158551
|
+
const st2 = lstatSync18(at2);
|
|
158452
158552
|
if (st2.isSymbolicLink() || !(i2 === parts.length - 1 ? st2.isFile() : st2.isDirectory())) return null;
|
|
158453
158553
|
}
|
|
158454
158554
|
const canonicalRoot = realpathSync8(root);
|
|
158455
|
-
if (!realpathSync8(at2).startsWith(canonicalRoot +
|
|
158555
|
+
if (!realpathSync8(at2).startsWith(canonicalRoot + sep16)) return null;
|
|
158456
158556
|
const fd = openSync4(at2, constants3.O_RDONLY | (constants3.O_NOFOLLOW ?? 0));
|
|
158457
158557
|
try {
|
|
158458
158558
|
if (!fstatSync(fd).isFile()) return null;
|
|
@@ -158516,7 +158616,7 @@ __export(screen_state_exports, {
|
|
|
158516
158616
|
withHomeCaveat: () => withHomeCaveat
|
|
158517
158617
|
});
|
|
158518
158618
|
import { createHash as createHash26 } from "node:crypto";
|
|
158519
|
-
import { lstatSync as
|
|
158619
|
+
import { lstatSync as lstatSync19, readFileSync as readFileSync57 } from "node:fs";
|
|
158520
158620
|
import { join as join44 } from "node:path";
|
|
158521
158621
|
function quotableLine(text13) {
|
|
158522
158622
|
if (!text13) return void 0;
|
|
@@ -158575,7 +158675,7 @@ function screenStateOf(services, html, opts = {}) {
|
|
|
158575
158675
|
function readRecord(dir) {
|
|
158576
158676
|
const file2 = join44(dir, SHOT_STATES_FILE);
|
|
158577
158677
|
try {
|
|
158578
|
-
if (!
|
|
158678
|
+
if (!lstatSync19(file2).isFile()) return {};
|
|
158579
158679
|
const r3 = JSON.parse(readFileSync57(file2, "utf8"));
|
|
158580
158680
|
return r3.v === 1 && r3.shots && typeof r3.shots === "object" ? r3.shots : {};
|
|
158581
158681
|
} catch {
|
|
@@ -158652,7 +158752,7 @@ __export(studio_reel_exports, {
|
|
|
158652
158752
|
utcDay: () => utcDay
|
|
158653
158753
|
});
|
|
158654
158754
|
import { createHash as createHash27 } from "node:crypto";
|
|
158655
|
-
import { lstatSync as
|
|
158755
|
+
import { lstatSync as lstatSync20, readFileSync as readFileSync58 } from "node:fs";
|
|
158656
158756
|
import { basename as basename16, join as join45 } from "node:path";
|
|
158657
158757
|
function loadMemory2(dir) {
|
|
158658
158758
|
const m2 = readJson5(join45(dir, ".himi", "studio", "memory.json"));
|
|
@@ -158737,7 +158837,7 @@ function inlineImages(dir, plan, budget = REEL_BUDGET_BYTES) {
|
|
|
158737
158837
|
if (!HISTORY_NAME.test(f2)) return null;
|
|
158738
158838
|
try {
|
|
158739
158839
|
const path2 = join45(dir, HISTORY_DIR, f2);
|
|
158740
|
-
const st2 =
|
|
158840
|
+
const st2 = lstatSync20(path2);
|
|
158741
158841
|
if (!st2.isFile() || st2.nlink !== 1) return null;
|
|
158742
158842
|
const bytes2 = readFileSync58(path2);
|
|
158743
158843
|
return createHash27("sha256").update(bytes2).digest("hex") === f2.slice(0, 64) && imageExtension(bytes2) === f2.slice(65) ? bytes2 : null;
|
|
@@ -158987,25 +159087,25 @@ __export(milestones_exports, {
|
|
|
158987
159087
|
});
|
|
158988
159088
|
import { createHash as createHash28, randomUUID as randomUUID10 } from "node:crypto";
|
|
158989
159089
|
import { spawn as spawn4 } from "node:child_process";
|
|
158990
|
-
import { closeSync as closeSync5, existsSync as existsSync51, lstatSync as
|
|
159090
|
+
import { closeSync as closeSync5, existsSync as existsSync51, lstatSync as lstatSync21, readFileSync as readFileSync60, statSync as statSync17 } from "node:fs";
|
|
158991
159091
|
import { createServer as createServer3 } from "node:net";
|
|
158992
|
-
import { basename as basename17, dirname as dirname33, isAbsolute as
|
|
159092
|
+
import { basename as basename17, dirname as dirname33, isAbsolute as isAbsolute5, join as join48, relative as relative12, resolve as resolve46, sep as sep17 } from "node:path";
|
|
158993
159093
|
function homeShotPath(dir, home) {
|
|
158994
159094
|
const root = resolve46(dir);
|
|
158995
159095
|
const base = resolve46(root, ".himi", "shots");
|
|
158996
159096
|
const shot = resolve46(base, `${home}.png`);
|
|
158997
|
-
if (!shot.startsWith(base +
|
|
158998
|
-
for (let p2 = shot; p2 !== root && p2.startsWith(root +
|
|
159097
|
+
if (!shot.startsWith(base + sep17)) return null;
|
|
159098
|
+
for (let p2 = shot; p2 !== root && p2.startsWith(root + sep17); p2 = dirname33(p2)) {
|
|
158999
159099
|
try {
|
|
159000
|
-
if (
|
|
159100
|
+
if (lstatSync21(p2).isSymbolicLink()) return null;
|
|
159001
159101
|
} catch {
|
|
159002
159102
|
}
|
|
159003
159103
|
}
|
|
159004
159104
|
return shot;
|
|
159005
159105
|
}
|
|
159006
159106
|
function displayPath(p2, cwd = process.cwd()) {
|
|
159007
|
-
const rel =
|
|
159008
|
-
return rel && !rel.startsWith("..") && !
|
|
159107
|
+
const rel = relative12(cwd, p2);
|
|
159108
|
+
return rel && !rel.startsWith("..") && !isAbsolute5(rel) ? rel : p2;
|
|
159009
159109
|
}
|
|
159010
159110
|
function progressCommand(opts) {
|
|
159011
159111
|
return `himi progress "<${opts.what}>"${opts.step ? ` --step ${opts.step}` : ""}${opts.image ? ` --image ${shellQuote(opts.image)}` : ""}${contentArg(opts.content)}`;
|
|
@@ -159145,8 +159245,8 @@ async function openBoardForSession(dir, cwd = process.cwd()) {
|
|
|
159145
159245
|
try {
|
|
159146
159246
|
const { openStudio: openStudio2 } = await Promise.resolve().then(() => (init_studio(), studio_exports));
|
|
159147
159247
|
const { page, url } = openStudio2(dir);
|
|
159148
|
-
const rel =
|
|
159149
|
-
return { page: rel && !rel.startsWith("..") && !
|
|
159248
|
+
const rel = relative12(cwd, page);
|
|
159249
|
+
return { page: rel && !rel.startsWith("..") && !isAbsolute5(rel) ? rel : page, url, opened: false };
|
|
159150
159250
|
} catch (e2) {
|
|
159151
159251
|
return { opened: false, error: `the build board was not created: ${e2.message} \u2014 \`himi studio --no-open\` in the app retries it` };
|
|
159152
159252
|
}
|
|
@@ -159332,7 +159432,7 @@ function rememberDraft(dir, releaseId, m2) {
|
|
|
159332
159432
|
function lastDraft(dir) {
|
|
159333
159433
|
try {
|
|
159334
159434
|
const file2 = join48(dir, LAST_DRAFT_FILE);
|
|
159335
|
-
if (!
|
|
159435
|
+
if (!lstatSync21(file2).isFile()) return null;
|
|
159336
159436
|
const r3 = JSON.parse(readFileSync60(file2, "utf8"));
|
|
159337
159437
|
const m2 = r3.manifest;
|
|
159338
159438
|
if (r3.v !== 1 || typeof r3.releaseId !== "string" || !m2 || typeof m2.screens !== "object" || !m2.screens || typeof m2.bundles !== "object" || !m2.bundles) return null;
|
|
@@ -159394,7 +159494,7 @@ function recordInitSource(dir, opts = {}) {
|
|
|
159394
159494
|
function readInitSource(dir) {
|
|
159395
159495
|
const file2 = join48(dir, INIT_SOURCE_FILE);
|
|
159396
159496
|
try {
|
|
159397
|
-
if (!
|
|
159497
|
+
if (!lstatSync21(file2).isFile()) return null;
|
|
159398
159498
|
const r3 = JSON.parse(readFileSync60(file2, "utf8"));
|
|
159399
159499
|
if (r3.v !== 1 || typeof r3.fingerprint !== "string" || !/^[0-9a-f]{64}$/.test(r3.fingerprint) || typeof r3.newestMs !== "number") return null;
|
|
159400
159500
|
return {
|
|
@@ -159469,7 +159569,7 @@ function contentHomePictures(dir, home) {
|
|
|
159469
159569
|
if (r3.state.state !== "content") continue;
|
|
159470
159570
|
for (const file2 of [shot, hist && join48(hist, `${r3.sha256}.png`)]) {
|
|
159471
159571
|
try {
|
|
159472
|
-
if (!file2 || !
|
|
159572
|
+
if (!file2 || !lstatSync21(file2).isFile() || sha256Of2(file2) !== r3.sha256) continue;
|
|
159473
159573
|
} catch {
|
|
159474
159574
|
continue;
|
|
159475
159575
|
}
|
|
@@ -159482,7 +159582,7 @@ function contentHomePictures(dir, home) {
|
|
|
159482
159582
|
function readInitWatch(dir) {
|
|
159483
159583
|
const file2 = join48(dir, INIT_WATCH_FILE);
|
|
159484
159584
|
try {
|
|
159485
|
-
if (!
|
|
159585
|
+
if (!lstatSync21(file2).isFile()) return null;
|
|
159486
159586
|
const r3 = JSON.parse(readFileSync60(file2, "utf8"));
|
|
159487
159587
|
if (r3.v !== 1 || typeof r3.pid !== "number" || !Number.isInteger(r3.pid) || r3.pid < 1) return null;
|
|
159488
159588
|
if (typeof r3.url !== "string" || !/^http:\/\/127\.0\.0\.1:\d+\//.test(r3.url) || typeof r3.board !== "string" || typeof r3.log !== "string" || typeof r3.startedAt !== "string") return null;
|
|
@@ -159515,7 +159615,7 @@ function watchReminder(dir, opts = {}) {
|
|
|
159515
159615
|
const file2 = join48(dir, REMINDERS_FILE);
|
|
159516
159616
|
let last = Number.NaN;
|
|
159517
159617
|
try {
|
|
159518
|
-
if (
|
|
159618
|
+
if (lstatSync21(file2).isFile()) last = Date.parse(JSON.parse(readFileSync60(file2, "utf8")).watch ?? "");
|
|
159519
159619
|
} catch {
|
|
159520
159620
|
}
|
|
159521
159621
|
if (Number.isFinite(last) && now - last >= 0 && now - last < WATCH_REMINDER_EVERY_MS) return void 0;
|
|
@@ -159638,7 +159738,7 @@ function afterHandoverPostcard(dir, opts = {}) {
|
|
|
159638
159738
|
const file2 = join48(dir, ".himi", "making-of.html");
|
|
159639
159739
|
let fresh = false;
|
|
159640
159740
|
try {
|
|
159641
|
-
const st2 =
|
|
159741
|
+
const st2 = lstatSync21(file2);
|
|
159642
159742
|
fresh = st2.isFile() && !st2.isSymbolicLink() && st2.mtimeMs >= statSync17(join48(dir, ".himi", "progress.jsonl")).mtimeMs;
|
|
159643
159743
|
} catch {
|
|
159644
159744
|
fresh = false;
|
|
@@ -161428,6 +161528,7 @@ var init_capabilities_generated = __esm({
|
|
|
161428
161528
|
"himi_apps": ["canOpen", "current", "hostInfo", "open"],
|
|
161429
161529
|
"iap": ["appBinding", "consume", "entitlements", "finishTransaction", "getPaywallConfig", "getProducts", "getUnfinishedTransactions", "purchase", "purchaseForVerification", "restore"],
|
|
161430
161530
|
"keyboard": ["dismiss"],
|
|
161531
|
+
"legacy_import": ["ack", "read"],
|
|
161431
161532
|
"live_activity": ["end", "start", "update"],
|
|
161432
161533
|
"local_database": ["availability", "count", "get", "getAll", "purge", "query", "queueDepth", "queueDrain", "queueEnqueue", "remove", "upsert"],
|
|
161433
161534
|
"location": ["backgroundStart", "backgroundStop", "getCurrent", "getPermissionStatus", "regionAdd", "regionClear", "regionList", "regionNext", "regionRemove", "regionSupport", "requestPermission", "watchNext", "watchStart", "watchStop"],
|
|
@@ -161475,6 +161576,7 @@ var init_capabilities_generated = __esm({
|
|
|
161475
161576
|
"himi_apps": ["@himalaya/himi-apps"],
|
|
161476
161577
|
"iap": ["@himalaya/iap"],
|
|
161477
161578
|
"keyboard": ["@himalaya/keyboard"],
|
|
161579
|
+
"legacy_import": ["@himalaya/legacy-import"],
|
|
161478
161580
|
"live_activity": ["@himalaya/live-activity"],
|
|
161479
161581
|
"local_database": ["@himalaya/local-db"],
|
|
161480
161582
|
"location": ["@himalaya/location"],
|
|
@@ -161551,7 +161653,7 @@ var init_shell_capabilities_generated = __esm({
|
|
|
161551
161653
|
shared: true,
|
|
161552
161654
|
extensible: false,
|
|
161553
161655
|
built: ["animation", "audio_record_background", "base44", "biometrics", "calendar", "calls", "camera", "clipboard", "contacts", "haptic", "health", "iap", "live_activity", "location", "media_playback", "motion", "on_device_ai", "photos", "push", "speech"],
|
|
161554
|
-
serves: ["animation", "app_info", "audio_record", "audio_record_background", "base44", "biometrics", "browser_auth", "calendar", "calls", "camera", "clipboard", "contacts", "file_picker", "files", "haptic", "health", "himi_apps", "iap", "keyboard", "live_activity", "local_database", "location", "media_playback", "motion", "network", "on_device_ai", "open_url", "pdf", "photos", "presigned_upload", "push", "release_control", "secure_storage", "share", "speaker_diarization", "speech", "stream", "theme", "torch", "ui", "wix_api", "wix_cashier", "wix_chat", "wix_platform"]
|
|
161656
|
+
serves: ["animation", "app_info", "audio_record", "audio_record_background", "base44", "biometrics", "browser_auth", "calendar", "calls", "camera", "clipboard", "contacts", "file_picker", "files", "haptic", "health", "himi_apps", "iap", "keyboard", "legacy_import", "live_activity", "local_database", "location", "media_playback", "motion", "network", "on_device_ai", "open_url", "pdf", "photos", "presigned_upload", "push", "release_control", "secure_storage", "share", "speaker_diarization", "speech", "stream", "theme", "torch", "ui", "wix_api", "wix_cashier", "wix_chat", "wix_platform"]
|
|
161555
161657
|
}
|
|
161556
161658
|
};
|
|
161557
161659
|
}
|
|
@@ -163256,7 +163358,7 @@ __export(gen_native_config_exports, {
|
|
|
163256
163358
|
xmlAttr: () => xmlAttr2,
|
|
163257
163359
|
yamlScalar: () => yamlScalar
|
|
163258
163360
|
});
|
|
163259
|
-
import { existsSync as existsSync61, mkdirSync as
|
|
163361
|
+
import { existsSync as existsSync61, mkdirSync as mkdirSync29, readFileSync as readFileSync71, readdirSync as readdirSync33, rmSync as rmSync18, statSync as statSync19, writeFileSync as writeFileSync25 } from "node:fs";
|
|
163260
163362
|
import { dirname as dirname36, join as join59 } from "node:path";
|
|
163261
163363
|
import { fileURLToPath as fileURLToPath28 } from "node:url";
|
|
163262
163364
|
function withoutComments(src) {
|
|
@@ -163778,7 +163880,7 @@ function applyWholeFile(path2, content, check) {
|
|
|
163778
163880
|
const current = existsSync61(path2) ? readFileSync71(path2, "utf8") : null;
|
|
163779
163881
|
if (current === content) return { path: path2, outcome: "unchanged" };
|
|
163780
163882
|
if (check) return { path: path2, outcome: "drift" };
|
|
163781
|
-
|
|
163883
|
+
mkdirSync29(dirname36(path2), { recursive: true });
|
|
163782
163884
|
writeFileSync25(path2, content);
|
|
163783
163885
|
return { path: path2, outcome: "written" };
|
|
163784
163886
|
}
|
|
@@ -164179,7 +164281,7 @@ __export(capabilities_exports, {
|
|
|
164179
164281
|
shellSupport: () => shellSupport,
|
|
164180
164282
|
writeLastDist: () => writeLastDist
|
|
164181
164283
|
});
|
|
164182
|
-
import { existsSync as existsSync62, lstatSync as
|
|
164284
|
+
import { existsSync as existsSync62, lstatSync as lstatSync22, readFileSync as readFileSync72 } from "node:fs";
|
|
164183
164285
|
import { join as join60 } from "node:path";
|
|
164184
164286
|
function declareHintFor(id) {
|
|
164185
164287
|
return catalogKey(id) === "app_services" ? "each calling screen's `logicBundle.declaredCapabilities` (the runtime gate) \u2014 an app need not list app_services in config.ts `capabilities`, which only a shell that hosts app services must (an HHP app declares it there, since HHP copies that list onto every screen)" : DECLARE_HINT;
|
|
@@ -164281,7 +164383,7 @@ async function writeLastDist(dir, rec) {
|
|
|
164281
164383
|
function readLastDist(dir) {
|
|
164282
164384
|
const path2 = join60(dir, LAST_DIST_FILE);
|
|
164283
164385
|
try {
|
|
164284
|
-
if (
|
|
164386
|
+
if (lstatSync22(join60(dir, ".himi")).isSymbolicLink() || lstatSync22(path2).isSymbolicLink()) return null;
|
|
164285
164387
|
} catch {
|
|
164286
164388
|
return null;
|
|
164287
164389
|
}
|
|
@@ -165125,7 +165227,7 @@ __export(base44_types_exports, {
|
|
|
165125
165227
|
renderBase44Types: () => renderBase44Types,
|
|
165126
165228
|
writeBase44Types: () => writeBase44Types
|
|
165127
165229
|
});
|
|
165128
|
-
import { existsSync as existsSync63, mkdirSync as
|
|
165230
|
+
import { existsSync as existsSync63, mkdirSync as mkdirSync30, readFileSync as readFileSync73, writeFileSync as writeFileSync26 } from "node:fs";
|
|
165129
165231
|
import { dirname as dirname37, join as join61 } from "node:path";
|
|
165130
165232
|
function logicalName(spec) {
|
|
165131
165233
|
return (isAdoptedEntity(spec) ? spec.base44Name : spec.name) ?? "";
|
|
@@ -165207,7 +165309,7 @@ async function writeBase44Types(dir, app) {
|
|
|
165207
165309
|
const path2 = join61(dir, BASE44_TYPES_PATH);
|
|
165208
165310
|
const changed = !existsSync63(path2) || readFileSync73(path2, "utf8") !== text13;
|
|
165209
165311
|
if (changed) {
|
|
165210
|
-
|
|
165312
|
+
mkdirSync30(dirname37(path2), { recursive: true });
|
|
165211
165313
|
writeFileSync26(path2, text13);
|
|
165212
165314
|
}
|
|
165213
165315
|
return { path: path2, changed, entities: text13.split("\nexport const ").length - 1 };
|
|
@@ -165359,8 +165461,8 @@ __export(eject_exports, {
|
|
|
165359
165461
|
EJECTABLE: () => EJECTABLE,
|
|
165360
165462
|
ejectModule: () => ejectModule
|
|
165361
165463
|
});
|
|
165362
|
-
import { existsSync as existsSync65, mkdirSync as
|
|
165363
|
-
import { dirname as dirname38, join as join63, relative as
|
|
165464
|
+
import { existsSync as existsSync65, mkdirSync as mkdirSync31, readFileSync as readFileSync75, writeFileSync as writeFileSync27 } from "node:fs";
|
|
165465
|
+
import { dirname as dirname38, join as join63, relative as relative13, resolve as resolve51, sep as sep18 } from "node:path";
|
|
165364
165466
|
function locate(repoRootOrCwd, mod) {
|
|
165365
165467
|
const inRepo = resolve51(repoRootOrCwd, `stdlib/flows/${mod}/src/index.ts`);
|
|
165366
165468
|
if (existsSync65(inRepo)) return { path: inRepo, form: "source" };
|
|
@@ -165390,7 +165492,7 @@ function ejectModule(opts) {
|
|
|
165390
165492
|
}
|
|
165391
165493
|
const ext = found.form === "source" ? "ts" : "mjs";
|
|
165392
165494
|
const target = join63(contentDir2, "tier5-src", "_ejected", `${mod}.${ext}`);
|
|
165393
|
-
|
|
165495
|
+
mkdirSync31(dirname38(target), { recursive: true });
|
|
165394
165496
|
const banner = `// EJECTED from @wix/himalaya/${mod}. This app owns this file now.
|
|
165395
165497
|
//
|
|
165396
165498
|
// Central fixes to @wix/himalaya/${mod} NO LONGER REACH THIS APP \u2014 including any
|
|
@@ -165413,7 +165515,7 @@ function ejectModule(opts) {
|
|
|
165413
165515
|
if (!existsSync65(f2)) continue;
|
|
165414
165516
|
const before = readFileSync75(f2, "utf8");
|
|
165415
165517
|
let after = before;
|
|
165416
|
-
let rel =
|
|
165518
|
+
let rel = relative13(dirname38(f2), target).split(sep18).join("/").replace(/\.tsx?$/, ".js");
|
|
165417
165519
|
if (!rel.startsWith(".")) rel = `./${rel}`;
|
|
165418
165520
|
for (const spec of specifiersFor(mod)) {
|
|
165419
165521
|
const q3 = spec.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
@@ -165594,8 +165696,8 @@ __export(icon_exports, {
|
|
|
165594
165696
|
writePreparedIcon: () => writePreparedIcon
|
|
165595
165697
|
});
|
|
165596
165698
|
import { createHash as createHash31 } from "node:crypto";
|
|
165597
|
-
import { accessSync as accessSync2, constants as constants4, existsSync as existsSync66, mkdirSync as
|
|
165598
|
-
import { basename as basename19, dirname as dirname39, join as join64, resolve as resolve52, sep as
|
|
165699
|
+
import { accessSync as accessSync2, constants as constants4, existsSync as existsSync66, mkdirSync as mkdirSync32, readFileSync as readFileSync76, statSync as statSync20, writeFileSync as writeFileSync28 } from "node:fs";
|
|
165700
|
+
import { basename as basename19, dirname as dirname39, join as join64, resolve as resolve52, sep as sep19 } from "node:path";
|
|
165599
165701
|
function readManifest(dir) {
|
|
165600
165702
|
try {
|
|
165601
165703
|
return JSON.parse(readFileSync76(join64(dir, MANIFEST), "utf8"));
|
|
@@ -165612,12 +165714,12 @@ function declaredIconName(dir) {
|
|
|
165612
165714
|
function iconDest(dir, name) {
|
|
165613
165715
|
const base = resolve52(dir);
|
|
165614
165716
|
const abs = resolve52(base, name);
|
|
165615
|
-
if (!abs.startsWith(base +
|
|
165717
|
+
if (!abs.startsWith(base + sep19)) {
|
|
165616
165718
|
throw new Error(
|
|
165617
165719
|
`himi icon: himalaya.content.json declares "icon": "${name}", which resolves outside the package (${abs}). Declare a path inside it, e.g. "${DEFAULT_CONTENT_ICON}".`
|
|
165618
165720
|
);
|
|
165619
165721
|
}
|
|
165620
|
-
|
|
165722
|
+
mkdirSync32(dirname39(abs), { recursive: true });
|
|
165621
165723
|
return abs;
|
|
165622
165724
|
}
|
|
165623
165725
|
function templateIconMatch(png) {
|
|
@@ -165973,8 +166075,8 @@ function baseOf(target, linkable, known) {
|
|
|
165973
166075
|
let best = null;
|
|
165974
166076
|
for (const base of linkable ?? []) {
|
|
165975
166077
|
if (!known.has(base) || target.length <= base.length + 1 || !target.startsWith(base)) continue;
|
|
165976
|
-
const
|
|
165977
|
-
if ((
|
|
166078
|
+
const sep26 = target[base.length];
|
|
166079
|
+
if ((sep26 === "_" || sep26 === "/") && (!best || base.length > best.length)) best = base;
|
|
165978
166080
|
}
|
|
165979
166081
|
return best;
|
|
165980
166082
|
}
|
|
@@ -166347,7 +166449,7 @@ __export(test_exports, {
|
|
|
166347
166449
|
scopeDescriptors: () => scopeDescriptors,
|
|
166348
166450
|
writeRecordedMocks: () => writeRecordedMocks
|
|
166349
166451
|
});
|
|
166350
|
-
import { existsSync as existsSync69, mkdirSync as
|
|
166452
|
+
import { existsSync as existsSync69, mkdirSync as mkdirSync33, readFileSync as readFileSync79, writeFileSync as writeFileSync29 } from "node:fs";
|
|
166351
166453
|
import { join as join68, resolve as resolve53 } from "node:path";
|
|
166352
166454
|
function readTestConfig(dir) {
|
|
166353
166455
|
const p2 = resolve53(dir, TEST_CONFIG_FILE);
|
|
@@ -166525,7 +166627,7 @@ function writeRecordedMocks(opts) {
|
|
|
166525
166627
|
};
|
|
166526
166628
|
}
|
|
166527
166629
|
const fs2 = opts.io ?? {
|
|
166528
|
-
mkdir: (p2) =>
|
|
166630
|
+
mkdir: (p2) => mkdirSync33(p2, { recursive: true }),
|
|
166529
166631
|
write: (p2, s2) => writeFileSync29(p2, s2)
|
|
166530
166632
|
};
|
|
166531
166633
|
fs2.mkdir(join68(opts.dir, "dev"));
|
|
@@ -167130,7 +167232,7 @@ var init_policy = __esm({
|
|
|
167130
167232
|
// ../pre-pr-review/scope.mjs
|
|
167131
167233
|
import { execFileSync as execFileSync4 } from "node:child_process";
|
|
167132
167234
|
import { createHash as createHash32 } from "node:crypto";
|
|
167133
|
-
import { resolve as resolve55, dirname as dirname41, isAbsolute as
|
|
167235
|
+
import { resolve as resolve55, dirname as dirname41, isAbsolute as isAbsolute6, join as join69 } from "node:path";
|
|
167134
167236
|
import { fileURLToPath as fileURLToPath30 } from "node:url";
|
|
167135
167237
|
function resolveRepoRoot2(cwd = process.cwd()) {
|
|
167136
167238
|
let top;
|
|
@@ -167175,8 +167277,8 @@ var init_scope = __esm({
|
|
|
167175
167277
|
|
|
167176
167278
|
// ../verify-gate/diff-hash.mjs
|
|
167177
167279
|
import {
|
|
167178
|
-
lstatSync as
|
|
167179
|
-
mkdirSync as
|
|
167280
|
+
lstatSync as lstatSync23,
|
|
167281
|
+
mkdirSync as mkdirSync34,
|
|
167180
167282
|
mkdtempSync as mkdtempSync3,
|
|
167181
167283
|
readFileSync as readFileSync80,
|
|
167182
167284
|
readlinkSync,
|
|
@@ -167289,7 +167391,7 @@ function validationDiffHash(cwd = process.cwd()) {
|
|
|
167289
167391
|
const deletedRecord = () => [`${Buffer.byteLength(path2)}:${path2}`, "deleted", stagedIdentity(headEntry, indexEntry, void 0), ""].join("\0");
|
|
167290
167392
|
let stat2;
|
|
167291
167393
|
try {
|
|
167292
|
-
stat2 =
|
|
167394
|
+
stat2 = lstatSync23(absolute);
|
|
167293
167395
|
} catch (error) {
|
|
167294
167396
|
if (error?.code === "ENOENT") return deletedRecord();
|
|
167295
167397
|
throw error;
|
|
@@ -167325,7 +167427,7 @@ function validationDiffHash(cwd = process.cwd()) {
|
|
|
167325
167427
|
}
|
|
167326
167428
|
} catch (error) {
|
|
167327
167429
|
try {
|
|
167328
|
-
|
|
167430
|
+
lstatSync23(absolute);
|
|
167329
167431
|
} catch (recheck) {
|
|
167330
167432
|
if (recheck?.code === "ENOENT") return deletedRecord();
|
|
167331
167433
|
}
|
|
@@ -167351,7 +167453,7 @@ function seed(repo, commands) {
|
|
|
167351
167453
|
}
|
|
167352
167454
|
function write(repo, rel, body) {
|
|
167353
167455
|
const absolute = resolve56(repo, rel);
|
|
167354
|
-
|
|
167456
|
+
mkdirSync34(dirname42(absolute), { recursive: true });
|
|
167355
167457
|
writeFileSync30(absolute, body);
|
|
167356
167458
|
}
|
|
167357
167459
|
function selfTestRepo({ withBase }) {
|
|
@@ -167523,8 +167625,8 @@ import { execFileSync as execFileSync5 } from "node:child_process";
|
|
|
167523
167625
|
import { createHash as createHash35, randomBytes as randomBytes2 } from "node:crypto";
|
|
167524
167626
|
import {
|
|
167525
167627
|
existsSync as existsSync70,
|
|
167526
|
-
lstatSync as
|
|
167527
|
-
mkdirSync as
|
|
167628
|
+
lstatSync as lstatSync24,
|
|
167629
|
+
mkdirSync as mkdirSync35,
|
|
167528
167630
|
realpathSync as realpathSync9,
|
|
167529
167631
|
readlinkSync as readlinkSync2,
|
|
167530
167632
|
readFileSync as readFileSync81,
|
|
@@ -167532,7 +167634,7 @@ import {
|
|
|
167532
167634
|
unlinkSync as unlinkSync4,
|
|
167533
167635
|
writeFileSync as writeFileSync31
|
|
167534
167636
|
} from "node:fs";
|
|
167535
|
-
import { basename as basename21, join as join71, relative as
|
|
167637
|
+
import { basename as basename21, join as join71, relative as relative14, resolve as resolve57 } from "node:path";
|
|
167536
167638
|
function attestationVersionOf(value2) {
|
|
167537
167639
|
if (!value2 || typeof value2 !== "object" || Array.isArray(value2)) return null;
|
|
167538
167640
|
const version5 = value2.attestation;
|
|
@@ -167582,7 +167684,7 @@ function repoRoot(contentDir2) {
|
|
|
167582
167684
|
function storedContentDir(contentDir2) {
|
|
167583
167685
|
const absolute = resolve57(contentDir2);
|
|
167584
167686
|
const root = repoRoot(absolute);
|
|
167585
|
-
return root ?
|
|
167687
|
+
return root ? relative14(root, absolute) || "." : ".";
|
|
167586
167688
|
}
|
|
167587
167689
|
function currentGitDiffHash(contentDir2) {
|
|
167588
167690
|
const root = repoRoot(resolve57(contentDir2));
|
|
@@ -167594,20 +167696,20 @@ function currentGitUntrackedHash(contentDir2) {
|
|
|
167594
167696
|
const absolute = realpathSync9.native(unresolved);
|
|
167595
167697
|
const root = repoRoot(absolute);
|
|
167596
167698
|
if (!root) return sourceTreeHash(absolute);
|
|
167597
|
-
const scope2 =
|
|
167699
|
+
const scope2 = relative14(root, absolute) || ".";
|
|
167598
167700
|
const listed = execFileSync5("git", ["-C", root, "ls-files", "--others", "--exclude-standard", "-z", "--", scope2], {
|
|
167599
167701
|
encoding: "utf8",
|
|
167600
167702
|
maxBuffer: GIT_HASH_MAX_BUFFER
|
|
167601
167703
|
});
|
|
167602
167704
|
const hash3 = createHash35("sha256");
|
|
167603
167705
|
for (const path2 of listed.split("\0").filter(Boolean).sort()) {
|
|
167604
|
-
const local =
|
|
167706
|
+
const local = relative14(absolute, join71(root, path2));
|
|
167605
167707
|
const segs = local.split(/[\\/]/);
|
|
167606
167708
|
if (NOT_ATTESTED_DIRS.has(segs[0])) continue;
|
|
167607
167709
|
if (segs.length === 1 && AGENT_TOOLING_ROOT_FILES.includes(segs[0])) continue;
|
|
167608
167710
|
if (MCP_HOST_CONFIG_FILES.includes(segs.join("/"))) continue;
|
|
167609
167711
|
const full = join71(root, path2);
|
|
167610
|
-
const stats =
|
|
167712
|
+
const stats = lstatSync24(full, { throwIfNoEntry: false });
|
|
167611
167713
|
if (!stats) continue;
|
|
167612
167714
|
const kind = stats.isSymbolicLink() ? "link" : stats.isDirectory() ? "dir" : stats.isFile() ? "file" : null;
|
|
167613
167715
|
if (!kind) continue;
|
|
@@ -167624,7 +167726,7 @@ function sourceTreeHash(root) {
|
|
|
167624
167726
|
for (const entry of readdirSync34(dir, { withFileTypes: true }).sort((a2, b2) => a2.name < b2.name ? -1 : a2.name > b2.name ? 1 : 0)) {
|
|
167625
167727
|
if (entry.isDirectory() && (entry.name === ".git" || entry.name === "node_modules" || NOT_ATTESTED_DIRS.has(entry.name))) continue;
|
|
167626
167728
|
const path2 = join71(dir, entry.name);
|
|
167627
|
-
const local =
|
|
167729
|
+
const local = relative14(root, path2);
|
|
167628
167730
|
if (dir === root && entry.isFile() && AGENT_TOOLING_ROOT_FILES.includes(entry.name)) continue;
|
|
167629
167731
|
if (MCP_HOST_CONFIG_FILES.includes(local.split(/[\\/]/).join("/"))) continue;
|
|
167630
167732
|
if (entry.isDirectory()) visit(path2);
|
|
@@ -167742,7 +167844,7 @@ function summaryOf2(attestation) {
|
|
|
167742
167844
|
function writeAttestation(input, opts = {}) {
|
|
167743
167845
|
const contentDir2 = resolve57(input.contentDir);
|
|
167744
167846
|
const dir = join71(contentDir2, ".himi", "attestations");
|
|
167745
|
-
|
|
167847
|
+
mkdirSync35(dir, { recursive: true });
|
|
167746
167848
|
const previous = readLatestAttestation(contentDir2);
|
|
167747
167849
|
const runId2 = `${(opts.now ?? (() => /* @__PURE__ */ new Date()))().toISOString()}-${(opts.randomSuffix ?? (() => randomBytes2(3).toString("hex")))()}`;
|
|
167748
167850
|
const descriptorHashes = Object.fromEntries(
|
|
@@ -167755,7 +167857,7 @@ function writeAttestation(input, opts = {}) {
|
|
|
167755
167857
|
const screenshots = Object.fromEntries(screenshotEntries.map(({ screen, hash: hash3 }) => [screen, hash3]));
|
|
167756
167858
|
for (const { bytes: bytes2, hash: hash3 } of screenshotEntries) {
|
|
167757
167859
|
const artifact = screenshotArtifactPath(contentDir2, hash3);
|
|
167758
|
-
|
|
167860
|
+
mkdirSync35(join71(dir, "artifacts"), { recursive: true });
|
|
167759
167861
|
if (!existsSync70(artifact)) writeFileSync31(artifact, bytes2);
|
|
167760
167862
|
}
|
|
167761
167863
|
const unsigned = {
|
|
@@ -167902,8 +168004,8 @@ var init_attestation = __esm({
|
|
|
167902
168004
|
});
|
|
167903
168005
|
|
|
167904
168006
|
// src/ux-evidence.ts
|
|
167905
|
-
import { existsSync as existsSync71, mkdirSync as
|
|
167906
|
-
import { dirname as dirname43, isAbsolute as
|
|
168007
|
+
import { existsSync as existsSync71, mkdirSync as mkdirSync36, readFileSync as readFileSync82, writeFileSync as writeFileSync32 } from "node:fs";
|
|
168008
|
+
import { dirname as dirname43, isAbsolute as isAbsolute7, join as join72, relative as relative15, resolve as resolve58 } from "node:path";
|
|
167907
168009
|
function isNativePlatform(value2) {
|
|
167908
168010
|
return typeof value2 === "string" && NATIVE_PLATFORMS.includes(value2);
|
|
167909
168011
|
}
|
|
@@ -167947,12 +168049,12 @@ function recordedRenderWidths(content) {
|
|
|
167947
168049
|
return renderEvidenceEntries(evidence).map((entry) => entry.width);
|
|
167948
168050
|
}
|
|
167949
168051
|
function writeEvidence(path2, evidence) {
|
|
167950
|
-
|
|
168052
|
+
mkdirSync36(dirname43(path2), { recursive: true });
|
|
167951
168053
|
writeFileSync32(path2, JSON.stringify(evidence, null, 2) + "\n");
|
|
167952
168054
|
}
|
|
167953
168055
|
function recordedFilePath(dir, file2) {
|
|
167954
|
-
const rel =
|
|
167955
|
-
return rel && !rel.startsWith("..") && !
|
|
168056
|
+
const rel = relative15(dir, resolve58(file2));
|
|
168057
|
+
return rel && !rel.startsWith("..") && !isAbsolute7(rel) ? rel : file2;
|
|
167956
168058
|
}
|
|
167957
168059
|
function recordRenderWidth(content, entry) {
|
|
167958
168060
|
try {
|
|
@@ -170003,12 +170105,12 @@ var init_cli_bridge = __esm({
|
|
|
170003
170105
|
});
|
|
170004
170106
|
|
|
170005
170107
|
// src/mcp/file-tools.ts
|
|
170006
|
-
import { closeSync as closeSync6, constants as constants5, lstatSync as
|
|
170108
|
+
import { closeSync as closeSync6, constants as constants5, lstatSync as lstatSync25, mkdirSync as mkdirSync37, openSync as openSync5, readdirSync as readdirSync35, readFileSync as readFileSync88, realpathSync as realpathSync10, renameSync as renameSync13, rmSync as rmSync21, statSync as statSync21, writeSync, existsSync as existsSync76 } from "node:fs";
|
|
170007
170109
|
import { randomBytes as randomBytes3 } from "node:crypto";
|
|
170008
|
-
import { dirname as dirname44, isAbsolute as
|
|
170110
|
+
import { dirname as dirname44, isAbsolute as isAbsolute8, join as join77, relative as relative16, resolve as resolve60, sep as sep20 } from "node:path";
|
|
170009
170111
|
import * as z2 from "zod";
|
|
170010
170112
|
function within(root, p2) {
|
|
170011
|
-
return p2 === root || p2.startsWith(root.endsWith(
|
|
170113
|
+
return p2 === root || p2.startsWith(root.endsWith(sep20) ? root : root + sep20);
|
|
170012
170114
|
}
|
|
170013
170115
|
function realish(p2) {
|
|
170014
170116
|
let cur = p2;
|
|
@@ -170016,17 +170118,17 @@ function realish(p2) {
|
|
|
170016
170118
|
while (!existsSync76(cur)) {
|
|
170017
170119
|
const up = dirname44(cur);
|
|
170018
170120
|
if (up === cur) break;
|
|
170019
|
-
tail.unshift(cur.slice(up.length + (up.endsWith(
|
|
170121
|
+
tail.unshift(cur.slice(up.length + (up.endsWith(sep20) ? 0 : 1)));
|
|
170020
170122
|
cur = up;
|
|
170021
170123
|
}
|
|
170022
170124
|
return join77(realpathSync10(cur), ...tail);
|
|
170023
170125
|
}
|
|
170024
170126
|
function symlinkComponent(base, abs) {
|
|
170025
170127
|
let cur = base;
|
|
170026
|
-
for (const part4 of
|
|
170128
|
+
for (const part4 of relative16(base, abs).split(sep20).filter(Boolean)) {
|
|
170027
170129
|
cur = join77(cur, part4);
|
|
170028
170130
|
try {
|
|
170029
|
-
if (
|
|
170131
|
+
if (lstatSync25(cur).isSymbolicLink()) return relative16(base, cur);
|
|
170030
170132
|
} catch {
|
|
170031
170133
|
return void 0;
|
|
170032
170134
|
}
|
|
@@ -170049,7 +170151,7 @@ async function confinedAppDir(args, deps) {
|
|
|
170049
170151
|
if (!within(root, dir) || !within(realpathSync10(root), realish(dir))) return refuse5("outside_workspace", `"${String(args.dir)}" is outside the workspace folder`);
|
|
170050
170152
|
const link = symlinkComponent(root, dir);
|
|
170051
170153
|
if (link) return refuse5("outside_workspace", `"${link}" is a symlink \u2014 the app folder must be a real folder in the workspace`);
|
|
170052
|
-
const rel =
|
|
170154
|
+
const rel = relative16(root, dir);
|
|
170053
170155
|
if (rel && (isDeniedSourcePath(`${rel}/x`) || isDeniedSourcePath(`${rel.toLowerCase()}/x`))) return refuse5("denied", `"${rel}" is a folder this tool does not touch`);
|
|
170054
170156
|
if (!existsSync76(join77(dir, CONTENT_MARKER))) {
|
|
170055
170157
|
return refuse5("not_an_app", `"${rel || "."}" is not an app folder (no ${CONTENT_MARKER}) \u2014 see himi_list_apps, or create one with himi_init`);
|
|
@@ -170062,16 +170164,16 @@ function onDiskSpelling(abs) {
|
|
|
170062
170164
|
while (!existsSync76(cur)) {
|
|
170063
170165
|
const up = dirname44(cur);
|
|
170064
170166
|
if (up === cur) break;
|
|
170065
|
-
tail.unshift(cur.slice(up.length + (up.endsWith(
|
|
170167
|
+
tail.unshift(cur.slice(up.length + (up.endsWith(sep20) ? 0 : 1)));
|
|
170066
170168
|
cur = up;
|
|
170067
170169
|
}
|
|
170068
170170
|
return join77(realpathSync10.native(cur), ...tail);
|
|
170069
170171
|
}
|
|
170070
170172
|
function denied(appDir3, abs) {
|
|
170071
|
-
const rel =
|
|
170173
|
+
const rel = relative16(appDir3, abs);
|
|
170072
170174
|
if (isDeniedSourcePath(rel) || isDeniedSourcePath(rel.toLowerCase())) return true;
|
|
170073
170175
|
try {
|
|
170074
|
-
return isDeniedSourcePath(
|
|
170176
|
+
return isDeniedSourcePath(relative16(realpathSync10.native(appDir3), onDiskSpelling(abs)));
|
|
170075
170177
|
} catch {
|
|
170076
170178
|
return true;
|
|
170077
170179
|
}
|
|
@@ -170079,7 +170181,7 @@ function denied(appDir3, abs) {
|
|
|
170079
170181
|
function confinedPath(appDir3, rel) {
|
|
170080
170182
|
if (typeof rel !== "string" || !rel.trim()) return { error: "a path is required" };
|
|
170081
170183
|
if (rel.includes("\0")) return { error: "a path may not contain NUL" };
|
|
170082
|
-
if (
|
|
170184
|
+
if (isAbsolute8(rel)) return { error: `"${rel}" is absolute \u2014 give a path inside the app folder` };
|
|
170083
170185
|
const abs = resolve60(appDir3, rel);
|
|
170084
170186
|
if (!within(appDir3, abs) || abs === appDir3) return { error: `"${rel}" is outside the app folder` };
|
|
170085
170187
|
const real = realish(abs);
|
|
@@ -170091,7 +170193,7 @@ function confinedPath(appDir3, rel) {
|
|
|
170091
170193
|
return abs;
|
|
170092
170194
|
}
|
|
170093
170195
|
function writeNoFollow2(appDir3, abs, content) {
|
|
170094
|
-
|
|
170196
|
+
mkdirSync37(dirname44(abs), { recursive: true });
|
|
170095
170197
|
const before = symlinkComponent(appDir3, abs);
|
|
170096
170198
|
if (before) throw new Error(`"${before}" became a symlink`);
|
|
170097
170199
|
const tmp = join77(dirname44(abs), `.himi-write-${process.pid}-${randomBytes3(6).toString("hex")}.tmp`);
|
|
@@ -170104,14 +170206,14 @@ function writeNoFollow2(appDir3, abs, content) {
|
|
|
170104
170206
|
const link = symlinkComponent(appDir3, abs);
|
|
170105
170207
|
if (link || !within(realpathSync10(appDir3), realpathSync10(dirname44(abs)))) {
|
|
170106
170208
|
rmSync21(tmp, { force: true });
|
|
170107
|
-
throw new Error(`"${link ??
|
|
170209
|
+
throw new Error(`"${link ?? relative16(appDir3, dirname44(abs))}" changed into a link while writing`);
|
|
170108
170210
|
}
|
|
170109
170211
|
renameSync13(tmp, abs);
|
|
170110
170212
|
}
|
|
170111
170213
|
function listFiles(appDir3) {
|
|
170112
170214
|
const files = [];
|
|
170113
170215
|
const walk2 = (d2) => {
|
|
170114
|
-
const parentRel =
|
|
170216
|
+
const parentRel = relative16(appDir3, d2);
|
|
170115
170217
|
for (const e2 of readdirSync35(d2, { withFileTypes: true }).sort((a2, b2) => a2.name.localeCompare(b2.name))) {
|
|
170116
170218
|
if (e2.isSymbolicLink()) continue;
|
|
170117
170219
|
const p2 = join77(d2, e2.name);
|
|
@@ -170119,10 +170221,10 @@ function listFiles(appDir3) {
|
|
|
170119
170221
|
if (isDeniedSourceDir(e2.name, parentRel) || isDeniedSourceDir(e2.name.toLowerCase(), parentRel)) continue;
|
|
170120
170222
|
if (!walk2(p2)) return false;
|
|
170121
170223
|
} else if (e2.isFile()) {
|
|
170122
|
-
const rel =
|
|
170224
|
+
const rel = relative16(appDir3, p2);
|
|
170123
170225
|
if (isDeniedSourcePath(rel) || isDeniedSourcePath(rel.toLowerCase())) continue;
|
|
170124
170226
|
if (files.length >= MAX_LISTED) return false;
|
|
170125
|
-
files.push({ path: rel.split(
|
|
170227
|
+
files.push({ path: rel.split(sep20).join("/"), bytes: statSync21(p2).size });
|
|
170126
170228
|
}
|
|
170127
170229
|
}
|
|
170128
170230
|
return true;
|
|
@@ -170173,7 +170275,7 @@ function fileTools() {
|
|
|
170173
170275
|
if (typeof app !== "string") return app;
|
|
170174
170276
|
const p2 = confinedPath(app, a2.path);
|
|
170175
170277
|
if (typeof p2 !== "string") return refuse5("bad_path", p2.error);
|
|
170176
|
-
if (!existsSync76(p2) || !
|
|
170278
|
+
if (!existsSync76(p2) || !lstatSync25(p2).isFile()) return refuse5("not_found", `no file "${String(a2.path)}"`);
|
|
170177
170279
|
const size = statSync21(p2).size;
|
|
170178
170280
|
if (size > MAX_FILE_BYTES) return refuse5("too_large", `"${String(a2.path)}" is ${size} bytes \u2014 over the ${MAX_FILE_BYTES}-byte read limit`);
|
|
170179
170281
|
return ok({ ok: true, path: a2.path, bytes: size, content: readFileSync88(p2, "utf8") });
|
|
@@ -170200,7 +170302,7 @@ function fileTools() {
|
|
|
170200
170302
|
if (typeof p2 !== "string") refused2.push({ path: f2.path, error: p2.error });
|
|
170201
170303
|
else if (typeof f2.content !== "string") refused2.push({ path: f2.path, error: "content must be text" });
|
|
170202
170304
|
else if (Buffer.byteLength(f2.content) > MAX_FILE_BYTES) refused2.push({ path: f2.path, error: `over the ${MAX_FILE_BYTES}-byte limit` });
|
|
170203
|
-
else if (existsSync76(p2) && !
|
|
170305
|
+
else if (existsSync76(p2) && !lstatSync25(p2).isFile()) refused2.push({ path: f2.path, error: "not a regular file" });
|
|
170204
170306
|
else if (planned2.some((q3) => q3.abs === p2)) refused2.push({ path: f2.path, error: "the same file twice in one call" });
|
|
170205
170307
|
else planned2.push({ abs: p2, rel: String(f2.path), content: f2.content });
|
|
170206
170308
|
}
|
|
@@ -170234,7 +170336,7 @@ function fileTools() {
|
|
|
170234
170336
|
const p2 = confinedPath(app, rel);
|
|
170235
170337
|
if (typeof p2 !== "string") refused2.push({ path: rel, error: p2.error });
|
|
170236
170338
|
else if (!existsSync76(p2)) refused2.push({ path: rel, error: "no such file" });
|
|
170237
|
-
else if (!
|
|
170339
|
+
else if (!lstatSync25(p2).isFile()) refused2.push({ path: rel, error: "not a regular file" });
|
|
170238
170340
|
else if (!planned2.includes(p2)) {
|
|
170239
170341
|
planned2.push(p2);
|
|
170240
170342
|
deleted.push(rel);
|
|
@@ -170265,7 +170367,7 @@ var init_file_tools = __esm({
|
|
|
170265
170367
|
|
|
170266
170368
|
// src/mcp/iap-tools.ts
|
|
170267
170369
|
import * as z3 from "zod";
|
|
170268
|
-
import { dirname as dirname45, relative as
|
|
170370
|
+
import { dirname as dirname45, relative as relative17, resolve as resolve61 } from "node:path";
|
|
170269
170371
|
async function paths(args, deps) {
|
|
170270
170372
|
const base = await deps.defaultDir();
|
|
170271
170373
|
const result = { ...args, workspaceDir: base };
|
|
@@ -170281,7 +170383,7 @@ function workspaceInputRefusal(args, deps, context) {
|
|
|
170281
170383
|
const why = workspaceRefusal(context.boundary, args[key3]);
|
|
170282
170384
|
if (why) return `${key3} ${why}`;
|
|
170283
170385
|
if (key3 !== "dir" && key3 !== "plist") {
|
|
170284
|
-
const confined = confinedPath(context.boundary,
|
|
170386
|
+
const confined = confinedPath(context.boundary, relative17(context.boundary, args[key3]));
|
|
170285
170387
|
if (typeof confined !== "string") return `${key3} ${confined.error}`;
|
|
170286
170388
|
}
|
|
170287
170389
|
}
|
|
@@ -170915,7 +171017,7 @@ __export(server_exports, {
|
|
|
170915
171017
|
protectStdout: () => protectStdout,
|
|
170916
171018
|
startMcpServer: () => startMcpServer
|
|
170917
171019
|
});
|
|
170918
|
-
import { mkdirSync as
|
|
171020
|
+
import { mkdirSync as mkdirSync38, readFileSync as readFileSync89 } from "node:fs";
|
|
170919
171021
|
import { fileURLToPath as fileURLToPath31 } from "node:url";
|
|
170920
171022
|
import { McpServer } from "@modelcontextprotocol/server";
|
|
170921
171023
|
import { serveStdio, StdioServerTransport } from "@modelcontextprotocol/server/stdio";
|
|
@@ -170954,7 +171056,7 @@ async function startMcpServer(opts) {
|
|
|
170954
171056
|
const runCli = createCliBridge(opts.run);
|
|
170955
171057
|
if (opts.workspace) {
|
|
170956
171058
|
try {
|
|
170957
|
-
|
|
171059
|
+
mkdirSync38(opts.workspace, { recursive: true });
|
|
170958
171060
|
} catch (e2) {
|
|
170959
171061
|
console.error(`[himi mcp] could not create the workspace folder ${opts.workspace}: ${e2.message}`);
|
|
170960
171062
|
}
|
|
@@ -171035,7 +171137,7 @@ var init_open_url = __esm({
|
|
|
171035
171137
|
|
|
171036
171138
|
// src/ux-audit.ts
|
|
171037
171139
|
import { existsSync as existsSync79, readFileSync as readFileSync90, readdirSync as readdirSync36 } from "node:fs";
|
|
171038
|
-
import { join as join81, relative as
|
|
171140
|
+
import { join as join81, relative as relative18, resolve as resolve65 } from "node:path";
|
|
171039
171141
|
function issue(issues, strict, code, message2, path2) {
|
|
171040
171142
|
issues.push({ code, message: message2, ...path2 ? { path: path2 } : {}, severity: strict ? "error" : "warning" });
|
|
171041
171143
|
}
|
|
@@ -171057,7 +171159,7 @@ function walkSource(dir, root = dir) {
|
|
|
171057
171159
|
if (!SOURCE_EXTENSIONS.has(ext)) continue;
|
|
171058
171160
|
const absolute = join81(dir, entry.name);
|
|
171059
171161
|
const text13 = readText2(absolute);
|
|
171060
|
-
if (text13 !== null) found.push({ path:
|
|
171162
|
+
if (text13 !== null) found.push({ path: relative18(root, absolute), text: text13 });
|
|
171061
171163
|
}
|
|
171062
171164
|
return found;
|
|
171063
171165
|
}
|
|
@@ -171190,7 +171292,7 @@ __export(native_decode_exports, {
|
|
|
171190
171292
|
runNativeDecode: () => runNativeDecode
|
|
171191
171293
|
});
|
|
171192
171294
|
import { execFileSync as execFileSync6, spawnSync as spawnSync8 } from "node:child_process";
|
|
171193
|
-
import { existsSync as existsSync80, mkdirSync as
|
|
171295
|
+
import { existsSync as existsSync80, mkdirSync as mkdirSync41, mkdtempSync as mkdtempSync5, readFileSync as readFileSync91, rmSync as rmSync23, writeFileSync as writeFileSync35 } from "node:fs";
|
|
171194
171296
|
import { homedir as homedir10, tmpdir as tmpdir6 } from "node:os";
|
|
171195
171297
|
import { join as join83 } from "node:path";
|
|
171196
171298
|
import { fileURLToPath as fileURLToPath32 } from "node:url";
|
|
@@ -171353,7 +171455,7 @@ function writeDecodeInputs(descriptorDir, descriptors, tokensJson) {
|
|
|
171353
171455
|
writeFileSync35(join83(descriptorDir, `${encodeURIComponent(descriptor.screenId)}.json`), descriptor.descriptorJson);
|
|
171354
171456
|
}
|
|
171355
171457
|
if (tokensJson === void 0) return void 0;
|
|
171356
|
-
|
|
171458
|
+
mkdirSync41(join83(descriptorDir, "tokens"));
|
|
171357
171459
|
const tokensPath = join83(descriptorDir, "tokens", NATIVE_TOKENS_DOCUMENT);
|
|
171358
171460
|
writeFileSync35(tokensPath, tokensJson);
|
|
171359
171461
|
return tokensPath;
|
|
@@ -171512,7 +171614,7 @@ __export(browser_authoring_exports, {
|
|
|
171512
171614
|
import { createServer as createServer4 } from "node:http";
|
|
171513
171615
|
import { createHash as createHash38, randomBytes as randomBytes4 } from "node:crypto";
|
|
171514
171616
|
import { existsSync as existsSync81, readdirSync as readdirSync37, readFileSync as readFileSync92, realpathSync as realpathSync11, statSync as statSync22 } from "node:fs";
|
|
171515
|
-
import { join as join84, posix as posix3, relative as
|
|
171617
|
+
import { join as join84, posix as posix3, relative as relative19, sep as sep21 } from "node:path";
|
|
171516
171618
|
function humanMs(ms2) {
|
|
171517
171619
|
return ms2 < 1e3 ? `${ms2}ms` : `${Math.round(ms2 / 1e3)}s`;
|
|
171518
171620
|
}
|
|
@@ -171562,7 +171664,7 @@ function collectRelativeSiblings(files, tier5SrcDir) {
|
|
|
171562
171664
|
];
|
|
171563
171665
|
for (const abs of candidates) {
|
|
171564
171666
|
if (!existsSync81(abs) || statSync22(abs).isDirectory()) continue;
|
|
171565
|
-
const key3 = `/tier5-src/${
|
|
171667
|
+
const key3 = `/tier5-src/${relative19(tier5SrcDir, abs).split(sep21).join(posix3.sep)}`;
|
|
171566
171668
|
if (key3 in files) break;
|
|
171567
171669
|
files[key3] = readFileSync92(abs, "utf8");
|
|
171568
171670
|
queue.push(key3);
|
|
@@ -171772,7 +171874,7 @@ __export(coverage_exports, {
|
|
|
171772
171874
|
suppressedNativeKeys: () => suppressedNativeKeys,
|
|
171773
171875
|
trendAndStore: () => trendAndStore
|
|
171774
171876
|
});
|
|
171775
|
-
import { existsSync as existsSync82, mkdirSync as
|
|
171877
|
+
import { existsSync as existsSync82, mkdirSync as mkdirSync42, readFileSync as readFileSync93, writeFileSync as writeFileSync36 } from "node:fs";
|
|
171776
171878
|
import { dirname as dirname48, join as join85 } from "node:path";
|
|
171777
171879
|
function suppressedNativeKeys(oracle) {
|
|
171778
171880
|
return [...oracle.ios ? [] : ["native-decode|ios"], ...oracle.android ? [] : ["native-decode|android"]];
|
|
@@ -171965,7 +172067,7 @@ function trendAndStore(dir, entries, suppressed) {
|
|
|
171965
172067
|
const current = entries.map((e2) => e2.key);
|
|
171966
172068
|
const stored = [.../* @__PURE__ */ new Set([...current, ...(previous ?? []).filter((key3) => (suppressed ?? []).includes(key3))])];
|
|
171967
172069
|
try {
|
|
171968
|
-
|
|
172070
|
+
mkdirSync42(dirname48(p2), { recursive: true });
|
|
171969
172071
|
writeFileSync36(p2, JSON.stringify({ keys: stored, ts: (/* @__PURE__ */ new Date()).toISOString() }, null, 2));
|
|
171970
172072
|
} catch {
|
|
171971
172073
|
return null;
|
|
@@ -172010,7 +172112,7 @@ function diffAndStoreObservations(dir, current) {
|
|
|
172010
172112
|
} catch {
|
|
172011
172113
|
}
|
|
172012
172114
|
try {
|
|
172013
|
-
|
|
172115
|
+
mkdirSync42(dirname48(p2), { recursive: true });
|
|
172014
172116
|
writeFileSync36(p2, JSON.stringify({ screens: current, ts: (/* @__PURE__ */ new Date()).toISOString() }, null, 2));
|
|
172015
172117
|
} catch {
|
|
172016
172118
|
return null;
|
|
@@ -174604,7 +174706,7 @@ var init_brand_font = __esm({
|
|
|
174604
174706
|
});
|
|
174605
174707
|
|
|
174606
174708
|
// src/site-analyze/write-artifacts.ts
|
|
174607
|
-
import { mkdirSync as
|
|
174709
|
+
import { mkdirSync as mkdirSync43, rmSync as rmSync25, writeFileSync as writeFileSync37 } from "node:fs";
|
|
174608
174710
|
import { join as join89 } from "node:path";
|
|
174609
174711
|
function attachVeloSources(book, sources, put) {
|
|
174610
174712
|
const byPath = new Map((sources ?? []).map((s2) => [s2.path, s2.text]));
|
|
@@ -174760,12 +174862,12 @@ async function downloadMedia(book, fetchImpl, put) {
|
|
|
174760
174862
|
}
|
|
174761
174863
|
async function writeBusinessBook(result, opts) {
|
|
174762
174864
|
const out2 = opts.outDir;
|
|
174763
|
-
|
|
174764
|
-
|
|
174865
|
+
mkdirSync43(join89(out2, "evidence/pages"), { recursive: true });
|
|
174866
|
+
mkdirSync43(join89(out2, "media/catalog"), { recursive: true });
|
|
174765
174867
|
const files = [];
|
|
174766
174868
|
const put = (rel, body) => {
|
|
174767
174869
|
const p2 = join89(out2, rel);
|
|
174768
|
-
|
|
174870
|
+
mkdirSync43(join89(p2, ".."), { recursive: true });
|
|
174769
174871
|
writeFileSync37(p2, body);
|
|
174770
174872
|
files.push(rel);
|
|
174771
174873
|
};
|
|
@@ -175364,7 +175466,7 @@ __export(coverage_exports2, {
|
|
|
175364
175466
|
});
|
|
175365
175467
|
import { createHash as createHash39 } from "node:crypto";
|
|
175366
175468
|
import { existsSync as existsSync85, readFileSync as readFileSync96, writeFileSync as writeFileSync38 } from "node:fs";
|
|
175367
|
-
import { isAbsolute as
|
|
175469
|
+
import { isAbsolute as isAbsolute9, join as join90, resolve as resolve67 } from "node:path";
|
|
175368
175470
|
function verifiedEvidence(evidenceDir) {
|
|
175369
175471
|
const manifest2 = obj4(JSON.parse(readFileSync96(join90(evidenceDir, "manifest.json"), "utf8")));
|
|
175370
175472
|
if (manifest2.workflow !== "one-app-to-himi-app" || manifest2.stage !== "collected") throw Error("One App evidence is not collected.");
|
|
@@ -175535,7 +175637,7 @@ function verifyNativeProof(contentDir2, releaseHash, requirementIds) {
|
|
|
175535
175637
|
continue;
|
|
175536
175638
|
}
|
|
175537
175639
|
const artifact = record3.artifact;
|
|
175538
|
-
if (typeof artifact !== "string" || !artifact.trim() ||
|
|
175640
|
+
if (typeof artifact !== "string" || !artifact.trim() || isAbsolute9(artifact) || artifact.split(/[\\/]/).includes("..") || !existsSync85(join90(root, artifact))) {
|
|
175539
175641
|
issues.push(`Native walkthrough check ${id} needs a reviewable artifact file.`);
|
|
175540
175642
|
}
|
|
175541
175643
|
}
|
|
@@ -175652,7 +175754,7 @@ function verifyCoverage(evidenceDir, contentDir2, releaseHash, builtScreenIds) {
|
|
|
175652
175754
|
}
|
|
175653
175755
|
for (const check of matching) {
|
|
175654
175756
|
const path2 = check.evidence;
|
|
175655
|
-
if (typeof path2 !== "string" || !path2.trim() ||
|
|
175757
|
+
if (typeof path2 !== "string" || !path2.trim() || isAbsolute9(path2) || path2.split(/[\\/]/).includes("..")) {
|
|
175656
175758
|
issues.push({ id, message: `Check ${required3} needs a safe relative evidence path.` });
|
|
175657
175759
|
} else if (!existsSync85(join90(resolve67(contentDir2), path2))) {
|
|
175658
175760
|
issues.push({ id, message: `Check ${required3} evidence file is absent: ${path2}.` });
|
|
@@ -175665,14 +175767,14 @@ function verifyCoverage(evidenceDir, contentDir2, releaseHash, builtScreenIds) {
|
|
|
175665
175767
|
issues.push({ id, message: `Check ${required3} has no latest passed record for this requirement and target.` });
|
|
175666
175768
|
} else {
|
|
175667
175769
|
const artifact = record3.artifact;
|
|
175668
|
-
if (typeof artifact !== "string" || !artifact.trim() ||
|
|
175770
|
+
if (typeof artifact !== "string" || !artifact.trim() || isAbsolute9(artifact) || artifact.split(/[\\/]/).includes("..") || !existsSync85(join90(resolve67(contentDir2), artifact))) {
|
|
175669
175771
|
issues.push({ id, message: `Check ${required3} needs a reviewable artifact file.` });
|
|
175670
175772
|
}
|
|
175671
175773
|
if (kind === "native-widget") {
|
|
175672
175774
|
const baseline = obj4(record3.sourceBaseline);
|
|
175673
175775
|
const context = obj4(record3.targetContext);
|
|
175674
175776
|
const sourceArtifact = baseline.artifact;
|
|
175675
|
-
if (baseline.kind !== "native-device" || typeof sourceArtifact !== "string" || !sourceArtifact.trim() ||
|
|
175777
|
+
if (baseline.kind !== "native-device" || typeof sourceArtifact !== "string" || !sourceArtifact.trim() || isAbsolute9(sourceArtifact) || sourceArtifact.split(/[\\/]/).includes("..") || !existsSync85(join90(resolve67(contentDir2), sourceArtifact))) {
|
|
175676
175778
|
issues.push({ id, message: "Native widget behavior needs a source-device baseline artifact; editor-only observations are unverified." });
|
|
175677
175779
|
}
|
|
175678
175780
|
if (!["siteId", "identityContext"].every((key3) => typeof baseline[key3] === "string" && String(baseline[key3]).trim() && baseline[key3] === context[key3]) || typeof sourceSiteId !== "string" || baseline.siteId !== sourceSiteId) {
|
|
@@ -176527,8 +176629,8 @@ __export(validate_design_exports, {
|
|
|
176527
176629
|
validateDesign: () => validateDesign
|
|
176528
176630
|
});
|
|
176529
176631
|
import { randomBytes as randomBytes5 } from "node:crypto";
|
|
176530
|
-
import { closeSync as closeSync7, constants as constants6, existsSync as existsSync89, lstatSync as
|
|
176531
|
-
import { dirname as dirname49, isAbsolute as
|
|
176632
|
+
import { closeSync as closeSync7, constants as constants6, existsSync as existsSync89, lstatSync as lstatSync26, openSync as openSync6, readFileSync as readFileSync100, realpathSync as realpathSync12, renameSync as renameSync14, unlinkSync as unlinkSync5, writeFileSync as writeFileSync40 } from "node:fs";
|
|
176633
|
+
import { dirname as dirname49, isAbsolute as isAbsolute10, join as join94, relative as relative20, resolve as resolve70, sep as sep22, win32 } from "node:path";
|
|
176532
176634
|
import ts12 from "typescript";
|
|
176533
176635
|
function readColorToken(tokens2, name) {
|
|
176534
176636
|
const entry = obj5(tokens2.colors)?.[name];
|
|
@@ -176747,33 +176849,33 @@ function activeIdiomNames(contentDir2, tokens2) {
|
|
|
176747
176849
|
return /* @__PURE__ */ new Set();
|
|
176748
176850
|
}
|
|
176749
176851
|
function writableTokensPath(contentDir2, location) {
|
|
176750
|
-
if (
|
|
176852
|
+
if (isAbsolute10(location) || win32.isAbsolute(location) || location.split(/[\\/]/).includes("..")) {
|
|
176751
176853
|
throw new Error("--fix requires a token path inside the content directory without traversal.");
|
|
176752
176854
|
}
|
|
176753
176855
|
const root = realpathSync12(contentDir2);
|
|
176754
176856
|
const path2 = resolve70(root, location);
|
|
176755
|
-
const rel =
|
|
176756
|
-
if (!rel || rel === ".." || rel.startsWith(`..${
|
|
176857
|
+
const rel = relative20(root, path2);
|
|
176858
|
+
if (!rel || rel === ".." || rel.startsWith(`..${sep22}`) || isAbsolute10(rel)) {
|
|
176757
176859
|
throw new Error("--fix requires a token path inside the content directory.");
|
|
176758
176860
|
}
|
|
176759
176861
|
let current = root;
|
|
176760
|
-
const parts = rel.split(
|
|
176862
|
+
const parts = rel.split(sep22);
|
|
176761
176863
|
for (const [index, part4] of parts.entries()) {
|
|
176762
176864
|
current = join94(current, part4);
|
|
176763
|
-
const stat2 =
|
|
176865
|
+
const stat2 = lstatSync26(current);
|
|
176764
176866
|
if (stat2.isSymbolicLink() || (index === parts.length - 1 ? !stat2.isFile() : !stat2.isDirectory())) {
|
|
176765
176867
|
throw new Error("--fix requires a regular token file under directories without symlinks.");
|
|
176766
176868
|
}
|
|
176767
176869
|
}
|
|
176768
|
-
const real =
|
|
176769
|
-
if (!real || real === ".." || real.startsWith(`..${
|
|
176870
|
+
const real = relative20(root, realpathSync12(path2));
|
|
176871
|
+
if (!real || real === ".." || real.startsWith(`..${sep22}`) || isAbsolute10(real)) {
|
|
176770
176872
|
throw new Error("--fix cannot write outside the content directory.");
|
|
176771
176873
|
}
|
|
176772
176874
|
return path2;
|
|
176773
176875
|
}
|
|
176774
176876
|
function writeFixedTokens(contentDir2, location, path2, tokens2) {
|
|
176775
176877
|
const temp = join94(dirname49(path2), `.himi-design-${process.pid}-${randomBytes5(6).toString("hex")}.tmp`);
|
|
176776
|
-
const mode =
|
|
176878
|
+
const mode = lstatSync26(path2).mode & 511;
|
|
176777
176879
|
const fd = openSync6(temp, constants6.O_WRONLY | constants6.O_CREAT | constants6.O_EXCL | (constants6.O_NOFOLLOW ?? 0), mode);
|
|
176778
176880
|
try {
|
|
176779
176881
|
try {
|
|
@@ -176965,12 +177067,12 @@ function safeEvidencePath(contentDir2, name) {
|
|
|
176965
177067
|
const root = realpathSync12(contentDir2);
|
|
176966
177068
|
const dir = realDirIn(root, ".himi/one-app");
|
|
176967
177069
|
if (!dir) throw new Error("The design evidence directory is not a regular directory.");
|
|
176968
|
-
const real =
|
|
176969
|
-
if (!real || real === ".." || real.startsWith(`..${
|
|
177070
|
+
const real = relative20(root, realpathSync12(dir));
|
|
177071
|
+
if (!real || real === ".." || real.startsWith(`..${sep22}`) || isAbsolute10(real)) {
|
|
176970
177072
|
throw new Error("The design evidence directory is outside the content directory.");
|
|
176971
177073
|
}
|
|
176972
177074
|
const path2 = join94(dir, name);
|
|
176973
|
-
const stat2 =
|
|
177075
|
+
const stat2 = lstatSync26(path2, { throwIfNoEntry: false });
|
|
176974
177076
|
if (stat2 && !stat2.isFile()) throw new Error("The design evidence file is not a regular file.");
|
|
176975
177077
|
return path2;
|
|
176976
177078
|
}
|
|
@@ -180052,44 +180154,44 @@ var init_preview_assets_generated = __esm({
|
|
|
180052
180154
|
init_define_HHP_CATALOG();
|
|
180053
180155
|
init_preview_assets_format();
|
|
180054
180156
|
PREVIEW_ASSET_MANIFEST = [
|
|
180055
|
-
{ key: "assets/DashboardHost
|
|
180056
|
-
{ key: "assets/DevDrawer-
|
|
180057
|
-
{ key: "assets/IdiomCompare-
|
|
180058
|
-
{ key: "assets/LightboxViewer-
|
|
180059
|
-
{ key: "assets/OfflineReadingBar-
|
|
180060
|
-
{ key: "assets/PhonePreviewControl-
|
|
180061
|
-
{ key: "assets/SchemeCompare-
|
|
180062
|
-
{ key: "assets/WixFrogTelemetrySink-
|
|
180157
|
+
{ key: "assets/DashboardHost--Wo75MEb.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 2971, sha256: "9f16ff8813c75250b296c2f7fd5904148408ec882daade74dfd7256ab841116f" },
|
|
180158
|
+
{ key: "assets/DevDrawer-CUUhA_4k.js", contentType: "application/javascript; charset=utf-8", offset: 2979, length: 16783, sha256: "d7379d5435e1f42d653f1dbc15f5584f9aa3cae7eabf8d5779342ab59af8f064" },
|
|
180159
|
+
{ key: "assets/IdiomCompare-BQ8xaS9X.js", contentType: "application/javascript; charset=utf-8", offset: 19762, length: 1926, sha256: "3c3ad7cb21733554a1029f317f5d17498648aa5bbe4d9ad654128299bda12985" },
|
|
180160
|
+
{ key: "assets/LightboxViewer-DXIIycZi.js", contentType: "application/javascript; charset=utf-8", offset: 21688, length: 8171, sha256: "f97499f47911dcf2f19f6199c12236559e32df337994b61edb72cd9f0f73743d" },
|
|
180161
|
+
{ key: "assets/OfflineReadingBar-DaSjhw5H.js", contentType: "application/javascript; charset=utf-8", offset: 29859, length: 1707, sha256: "cc0ced6ae7a34d34c90dbd765a9018880aa9657f1de7e38f4839ef494b68aaf8" },
|
|
180162
|
+
{ key: "assets/PhonePreviewControl-D8MpZ148.js", contentType: "application/javascript; charset=utf-8", offset: 31566, length: 37768, sha256: "d6837187711fb89cb762beccb1f23289a45b7c0adf56023c623893b82d5c64db" },
|
|
180163
|
+
{ key: "assets/SchemeCompare-C08F_1NC.js", contentType: "application/javascript; charset=utf-8", offset: 69334, length: 1858, sha256: "d24db4000236629dfe6191f91dab56421421477e2dda5a423d3766065a1107d9" },
|
|
180164
|
+
{ key: "assets/WixFrogTelemetrySink-D2Lk2X2m.js", contentType: "application/javascript; charset=utf-8", offset: 71192, length: 3165, sha256: "7a8b798af6b0900a8e925bfdb9ec62b378380975cf5c00af25d0cf33b39ba12f" },
|
|
180063
180165
|
{ key: "assets/calendar-ics-BvfIYWjG.js", contentType: "application/javascript; charset=utf-8", offset: 74357, length: 2192, sha256: "1636167041e9829ceccd3544297b86b8475c38bd2f759c4dbc17c813dc6e9254" },
|
|
180064
|
-
{ key: "assets/files-transfer-
|
|
180166
|
+
{ key: "assets/files-transfer-DJkAGGn4.js", contentType: "application/javascript; charset=utf-8", offset: 76549, length: 6446, sha256: "d2d71e724ad7e8cc0f2511625a605232762cc613e14a328b5192ac4163b902f8" },
|
|
180065
180167
|
{ key: "assets/glassPreviewBrowser-DONaOehd.js", contentType: "application/javascript; charset=utf-8", offset: 82995, length: 6578, sha256: "4402c4cddd2a564e7466cdf1e12a0e0277c0400b288e1e5eda1d23e797599d31" },
|
|
180066
180168
|
{ key: "assets/image-preparation-Cj4gldm6.js", contentType: "application/javascript; charset=utf-8", offset: 89573, length: 2704, sha256: "32944ea587c2f3b84389b66b50a850437560238f1c8d33b6275973ee04eee865" },
|
|
180067
|
-
{ key: "assets/index-
|
|
180068
|
-
{ key: "assets/jsx-runtime-CY_jTiqj.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
180069
|
-
{ key: "assets/pdf-
|
|
180070
|
-
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
180071
|
-
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset:
|
|
180072
|
-
{ key: "assets/pdfDocument-
|
|
180073
|
-
{ key: "assets/pdfFetch-Cc8i1I1h.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
180074
|
-
{ key: "assets/webviewBridgeHost-
|
|
180075
|
-
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset:
|
|
180076
|
-
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset:
|
|
180077
|
-
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset:
|
|
180078
|
-
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
180079
|
-
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset:
|
|
180080
|
-
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset:
|
|
180081
|
-
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
180082
|
-
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset:
|
|
180083
|
-
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
180084
|
-
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset:
|
|
180085
|
-
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset:
|
|
180086
|
-
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
180087
|
-
{ key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
180088
|
-
{ key: "index.html", contentType: "text/html; charset=utf-8", offset:
|
|
180089
|
-
{ key: "ios-glass-preview.css", contentType: "text/css; charset=utf-8", offset:
|
|
180090
|
-
{ key: "kit-tab-bar.css", contentType: "text/css; charset=utf-8", offset:
|
|
180091
|
-
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset:
|
|
180092
|
-
{ key: "t5-worker-frame.html", contentType: "text/html; charset=utf-8", offset:
|
|
180169
|
+
{ key: "assets/index-BoMtgO1j.js", contentType: "application/javascript; charset=utf-8", offset: 92277, length: 1494558, sha256: "eb0deba70b04f12f7a35e248bbe05e7adab4f655f596f2eb4bf501b2ff49f201" },
|
|
180170
|
+
{ key: "assets/jsx-runtime-CY_jTiqj.js", contentType: "application/javascript; charset=utf-8", offset: 1586835, length: 7624, sha256: "29dfba5b56f79a0b84d6b04d84d87617454baeba03c225f682ab2ab7ae2d5016" },
|
|
180171
|
+
{ key: "assets/pdf-TmaMTLyU.js", contentType: "application/javascript; charset=utf-8", offset: 1594459, length: 488199, sha256: "41a8a6ab79e3465a7b955a596951fac14aed11cd2108b294ae1028aa25cd9ea5" },
|
|
180172
|
+
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 2082658, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
|
|
180173
|
+
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 2082731, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
|
|
180174
|
+
{ key: "assets/pdfDocument-BzqLjXka.js", contentType: "application/javascript; charset=utf-8", offset: 3399765, length: 3453, sha256: "8c22a0d303cdc014532f5c98c74d9e16ad688c9c04b7b3c597205810311d8968" },
|
|
180175
|
+
{ key: "assets/pdfFetch-Cc8i1I1h.js", contentType: "application/javascript; charset=utf-8", offset: 3403218, length: 2266, sha256: "1d21ad008921942217c9eac0c35b1713773b9d89c71e3ab4412781f7bb88f463" },
|
|
180176
|
+
{ key: "assets/webviewBridgeHost-BmEurjBq.js", contentType: "application/javascript; charset=utf-8", offset: 3405484, length: 9888, sha256: "b8e03f5a683914103f1084c9e03038167716065647b2280a57a99d548cad9d1f" },
|
|
180177
|
+
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3415372, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
|
|
180178
|
+
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3419982, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
|
|
180179
|
+
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3908566, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
|
|
180180
|
+
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3999490, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
|
|
180181
|
+
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 4090474, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
|
|
180182
|
+
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 4181454, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
|
|
180183
|
+
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 4272326, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
|
|
180184
|
+
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4363306, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
|
|
180185
|
+
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4471942, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
|
|
180186
|
+
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4581026, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
|
|
180187
|
+
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4690074, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
|
|
180188
|
+
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4797774, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
|
|
180189
|
+
{ key: "himi-sw.js", contentType: "application/javascript; charset=utf-8", offset: 4885882, length: 6818, sha256: "835250c3d8004f27c2b67f9b471984351ba6df07b916d97e33b43c691200a18c" },
|
|
180190
|
+
{ key: "index.html", contentType: "text/html; charset=utf-8", offset: 4892700, length: 5037, sha256: "d3bd185a4b68f1301c35db67d6b2020c0cf1eaa67b335a1269c34babf3c46f6f" },
|
|
180191
|
+
{ key: "ios-glass-preview.css", contentType: "text/css; charset=utf-8", offset: 4897737, length: 11457, sha256: "6cb2b75264fa5fa2b4d28851878a5eab0712900e8b3a6c2370cc661d6d820805" },
|
|
180192
|
+
{ key: "kit-tab-bar.css", contentType: "text/css; charset=utf-8", offset: 4909194, length: 1171, sha256: "9e2c3a0faaf05d5471badf167a4d3bdf1c4e6dd65c432eea6d254158bfd99585" },
|
|
180193
|
+
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4910365, length: 23047, sha256: "20d1459e3f896f344e478e613d0c979a0de02e81a929a45d3a0ef6a53af36441" },
|
|
180194
|
+
{ key: "t5-worker-frame.html", contentType: "text/html; charset=utf-8", offset: 4933412, length: 23064, sha256: "8655cfe9c74212ec5dafecb49d2fdeb48b19f1bd8a710091e3e55631f9b4ab06" }
|
|
180093
180195
|
];
|
|
180094
180196
|
}
|
|
180095
180197
|
});
|
|
@@ -180108,7 +180210,7 @@ __export(run_exports, {
|
|
|
180108
180210
|
runPackage: () => runPackage,
|
|
180109
180211
|
withoutProdServe: () => withoutProdServe
|
|
180110
180212
|
});
|
|
180111
|
-
import { cpSync as cpSync2, existsSync as existsSync92, mkdirSync as
|
|
180213
|
+
import { cpSync as cpSync2, existsSync as existsSync92, mkdirSync as mkdirSync44, mkdtempSync as mkdtempSync8, readFileSync as readFileSync102, rmSync as rmSync28, statSync as statSync26 } from "node:fs";
|
|
180112
180214
|
import { networkInterfaces as osNetworkInterfaces, tmpdir as tmpdir9 } from "node:os";
|
|
180113
180215
|
import { dirname as dirname50, join as join97 } from "node:path";
|
|
180114
180216
|
import { fileURLToPath as fileURLToPath34 } from "node:url";
|
|
@@ -180154,7 +180256,7 @@ async function resolvePackage(source, workDir) {
|
|
|
180154
180256
|
const root2 = workDir ?? mkdtempSync8(join97(tmpdir9(), "himi-run-"));
|
|
180155
180257
|
const target = join97(root2, app2);
|
|
180156
180258
|
if (join97(source) !== target) {
|
|
180157
|
-
|
|
180259
|
+
mkdirSync44(root2, { recursive: true });
|
|
180158
180260
|
rmSync28(target, { recursive: true, force: true });
|
|
180159
180261
|
cpSync2(source, target, { recursive: true });
|
|
180160
180262
|
}
|
|
@@ -184476,7 +184578,7 @@ var init_store_iap_connect = __esm({
|
|
|
184476
184578
|
});
|
|
184477
184579
|
|
|
184478
184580
|
// src/store-iap-screenshots.ts
|
|
184479
|
-
import { dirname as dirname52, join as join103, relative as
|
|
184581
|
+
import { dirname as dirname52, join as join103, relative as relative22 } from "node:path";
|
|
184480
184582
|
function purchaseScreensFor(item) {
|
|
184481
184583
|
const screen = item.wix && PURCHASE_SCREENS[item.wix.entityType];
|
|
184482
184584
|
if (!screen || !item.wix) return [];
|
|
@@ -184604,7 +184706,7 @@ async function shoot(selected, run2, outDir) {
|
|
|
184604
184706
|
} catch (e2) {
|
|
184605
184707
|
return { ...report3, skipped: `could not save the screenshot: ${e2.message}` };
|
|
184606
184708
|
}
|
|
184607
|
-
return { ...report3, screenshot:
|
|
184709
|
+
return { ...report3, screenshot: relative22(dirname52(run2.manifestPath), path2) };
|
|
184608
184710
|
}
|
|
184609
184711
|
function visibleText2(html) {
|
|
184610
184712
|
return html.replace(/ | | /gi, "\xA0").replace(/&/g, "&");
|
|
@@ -184802,7 +184904,7 @@ __export(store_iap_exports, {
|
|
|
184802
184904
|
});
|
|
184803
184905
|
import { execFileSync as execFileSync8 } from "node:child_process";
|
|
184804
184906
|
import { randomUUID as randomUUID11 } from "node:crypto";
|
|
184805
|
-
import { appendFileSync as appendFileSync2, mkdirSync as
|
|
184907
|
+
import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync45, readFileSync as readFileSync115, realpathSync as realpathSync15, renameSync as renameSync16, rmSync as rmSync31, writeFileSync as writeFileSync41 } from "node:fs";
|
|
184806
184908
|
import { homedir as homedir13, hostname as hostname2 } from "node:os";
|
|
184807
184909
|
import { dirname as dirname53, join as join105, resolve as resolve76 } from "node:path";
|
|
184808
184910
|
function scrubDeep(value2, scrub) {
|
|
@@ -185432,7 +185534,7 @@ async function screenshotsCommand(flags, deps, out2) {
|
|
|
185432
185534
|
return report3.complete ? 0 : 1;
|
|
185433
185535
|
}
|
|
185434
185536
|
function writeBinaryFile(path2, bytes2) {
|
|
185435
|
-
|
|
185537
|
+
mkdirSync45(dirname53(path2), { recursive: true });
|
|
185436
185538
|
const partial = `${path2}.${process.pid}.partial`;
|
|
185437
185539
|
writeFileSync41(partial, bytes2);
|
|
185438
185540
|
renameSync16(partial, path2);
|
|
@@ -185494,7 +185596,7 @@ function acquireApplyLock(dir, appleAppId) {
|
|
|
185494
185596
|
}
|
|
185495
185597
|
function stateDir(appleAppId) {
|
|
185496
185598
|
const dir = join105(homedir13(), ".himalaya", "store-iap", appleAppId);
|
|
185497
|
-
|
|
185599
|
+
mkdirSync45(dir, { recursive: true, mode: 448 });
|
|
185498
185600
|
return dir;
|
|
185499
185601
|
}
|
|
185500
185602
|
async function confirmOnTerminal(question) {
|
|
@@ -186941,7 +187043,7 @@ __export(secrets_exports, {
|
|
|
186941
187043
|
runRemoteSecretsCommand: () => runRemoteSecretsCommand,
|
|
186942
187044
|
runSecretsCommand: () => runSecretsCommand
|
|
186943
187045
|
});
|
|
186944
|
-
import { readFileSync as
|
|
187046
|
+
import { readFileSync as readFileSync120 } from "node:fs";
|
|
186945
187047
|
function environment(value2) {
|
|
186946
187048
|
if (value2 === "preview" || value2 === "production") return value2;
|
|
186947
187049
|
throw new Error("--environment must be preview or production");
|
|
@@ -186972,7 +187074,7 @@ async function runSecretsCommand(operation, flags, io2, options = {}) {
|
|
|
186972
187074
|
io2.log(JSON.stringify(await vault.list({ app, environment: env })));
|
|
186973
187075
|
return 0;
|
|
186974
187076
|
}
|
|
186975
|
-
const value2 = options.readValue ? options.readValue() :
|
|
187077
|
+
const value2 = options.readValue ? options.readValue() : readFileSync120(0, "utf8").replace(/\r?\n$/, "");
|
|
186976
187078
|
if (operation === "set") await vault.set({ app, environment: env, name, value: value2 });
|
|
186977
187079
|
else if (operation === "rotate") await vault.rotate({ app, environment: env, name, value: value2 });
|
|
186978
187080
|
else throw new Error(`unknown secrets operation ${operation}`);
|
|
@@ -187001,7 +187103,7 @@ async function runRemoteSecretsCommand(operation, flags, io2, options) {
|
|
|
187001
187103
|
}
|
|
187002
187104
|
let body;
|
|
187003
187105
|
if (operation !== "list") {
|
|
187004
|
-
const value2 = options.readValue ? options.readValue() :
|
|
187106
|
+
const value2 = options.readValue ? options.readValue() : readFileSync120(0, "utf8").replace(/\r?\n$/, "");
|
|
187005
187107
|
body = JSON.stringify({ value: value2 });
|
|
187006
187108
|
}
|
|
187007
187109
|
const response = await (options.fetchImpl ?? fetch)(url, { method: operation === "list" ? "GET" : operation === "set" ? "PUT" : "POST", headers: headers2, body });
|
|
@@ -187509,7 +187611,7 @@ __export(notify_exports, {
|
|
|
187509
187611
|
runNotify: () => runNotify,
|
|
187510
187612
|
saveAdminSession: () => saveAdminSession
|
|
187511
187613
|
});
|
|
187512
|
-
import { chmodSync as chmodSync3, mkdirSync as
|
|
187614
|
+
import { chmodSync as chmodSync3, mkdirSync as mkdirSync46, readFileSync as readFileSync123, writeFileSync as writeFileSync43 } from "node:fs";
|
|
187513
187615
|
import { homedir as homedir14 } from "node:os";
|
|
187514
187616
|
import { dirname as dirname56, join as join111 } from "node:path";
|
|
187515
187617
|
function defaultSessionsPath() {
|
|
@@ -187517,7 +187619,7 @@ function defaultSessionsPath() {
|
|
|
187517
187619
|
}
|
|
187518
187620
|
function loadSessionsFile(path2 = defaultSessionsPath()) {
|
|
187519
187621
|
try {
|
|
187520
|
-
return JSON.parse(
|
|
187622
|
+
return JSON.parse(readFileSync123(path2, "utf8"));
|
|
187521
187623
|
} catch {
|
|
187522
187624
|
return {};
|
|
187523
187625
|
}
|
|
@@ -187525,7 +187627,7 @@ function loadSessionsFile(path2 = defaultSessionsPath()) {
|
|
|
187525
187627
|
function saveAdminSession(adminUrl, session, path2 = defaultSessionsPath()) {
|
|
187526
187628
|
const file2 = loadSessionsFile(path2);
|
|
187527
187629
|
file2.sessions = { ...file2.sessions, [adminUrl]: session };
|
|
187528
|
-
|
|
187630
|
+
mkdirSync46(dirname56(path2), { recursive: true, mode: 448 });
|
|
187529
187631
|
writeFileSync43(path2, JSON.stringify(file2, null, 2) + "\n", { mode: 384 });
|
|
187530
187632
|
try {
|
|
187531
187633
|
chmodSync3(dirname56(path2), 448);
|
|
@@ -187822,8 +187924,8 @@ __export(auth_gate_copy_exports, {
|
|
|
187822
187924
|
scanThrownMessages: () => scanThrownMessages
|
|
187823
187925
|
});
|
|
187824
187926
|
import { createHash as createHash50 } from "node:crypto";
|
|
187825
|
-
import { existsSync as existsSync104, readdirSync as readdirSync43, readFileSync as
|
|
187826
|
-
import { dirname as dirname57, join as join112, relative as
|
|
187927
|
+
import { existsSync as existsSync104, readdirSync as readdirSync43, readFileSync as readFileSync124, writeFileSync as writeFileSync44 } from "node:fs";
|
|
187928
|
+
import { dirname as dirname57, join as join112, relative as relative23, resolve as resolve79 } from "node:path";
|
|
187827
187929
|
import { fileURLToPath as fileURLToPath36 } from "node:url";
|
|
187828
187930
|
function discoverMessageSources() {
|
|
187829
187931
|
const roots2 = [
|
|
@@ -187843,7 +187945,7 @@ function discoverMessageSources() {
|
|
|
187843
187945
|
if (/^(?:test|tests|Tests|androidTest|build|node_modules|\.build)$/.test(name.name)) continue;
|
|
187844
187946
|
visit(child);
|
|
187845
187947
|
} else if (/\.(?:swift|kt)$/.test(name.name) && !GATE_SOURCES.includes(child)) {
|
|
187846
|
-
if (MESSAGE_FILE.test(
|
|
187948
|
+
if (MESSAGE_FILE.test(readFileSync124(join112(REPO_ROOT8, child), "utf8"))) out2.push(child);
|
|
187847
187949
|
}
|
|
187848
187950
|
}
|
|
187849
187951
|
};
|
|
@@ -187851,7 +187953,7 @@ function discoverMessageSources() {
|
|
|
187851
187953
|
return out2.sort();
|
|
187852
187954
|
}
|
|
187853
187955
|
function loadTable(path2 = TABLE_PATH) {
|
|
187854
|
-
const raw = JSON.parse(
|
|
187956
|
+
const raw = JSON.parse(readFileSync124(path2, "utf8"));
|
|
187855
187957
|
const out2 = {};
|
|
187856
187958
|
for (const [k2, v2] of Object.entries(raw)) {
|
|
187857
187959
|
if (k2.startsWith("_")) continue;
|
|
@@ -187925,7 +188027,7 @@ function nativeKeysPath(appDir3) {
|
|
|
187925
188027
|
function loadNativeKeys(appDir3) {
|
|
187926
188028
|
const p2 = nativeKeysPath(appDir3);
|
|
187927
188029
|
if (!existsSync104(p2)) return void 0;
|
|
187928
|
-
const raw = JSON.parse(
|
|
188030
|
+
const raw = JSON.parse(readFileSync124(p2, "utf8"));
|
|
187929
188031
|
if (!Array.isArray(raw.keys) || raw.keys.some((k2) => typeof k2 !== "string")) {
|
|
187930
188032
|
throw new Error(`${p2}: expected { "keys": string[] }`);
|
|
187931
188033
|
}
|
|
@@ -187934,7 +188036,7 @@ function loadNativeKeys(appDir3) {
|
|
|
187934
188036
|
function loadAppTable(appDir3) {
|
|
187935
188037
|
const p2 = join112(appDir3, "strings", "en.json");
|
|
187936
188038
|
if (!existsSync104(p2)) return {};
|
|
187937
|
-
const raw = JSON.parse(
|
|
188039
|
+
const raw = JSON.parse(readFileSync124(p2, "utf8"));
|
|
187938
188040
|
const out2 = {};
|
|
187939
188041
|
for (const [k2, v2] of Object.entries(raw)) if (!k2.startsWith("_") && typeof v2 === "string") out2[k2] = v2;
|
|
187940
188042
|
return out2;
|
|
@@ -188123,14 +188225,14 @@ function looksLikeCopy(text13) {
|
|
|
188123
188225
|
return /^[A-Z][a-z]/.test(t2);
|
|
188124
188226
|
}
|
|
188125
188227
|
function loadAllow(section3, path2 = ALLOW_PATH) {
|
|
188126
|
-
const raw = JSON.parse(
|
|
188228
|
+
const raw = JSON.parse(readFileSync124(path2, "utf8"));
|
|
188127
188229
|
const list2 = raw[section3] ?? [];
|
|
188128
188230
|
for (const e2 of list2) {
|
|
188129
188231
|
if (!e2.file || !e2.text || !e2.reason) throw new Error(`allowlist entry missing file/text/reason: ${JSON.stringify(e2)}`);
|
|
188130
188232
|
}
|
|
188131
188233
|
return list2;
|
|
188132
188234
|
}
|
|
188133
|
-
function scanProse(files, allow = [], read = (rel) =>
|
|
188235
|
+
function scanProse(files, allow = [], read = (rel) => readFileSync124(join112(REPO_ROOT8, rel), "utf8")) {
|
|
188134
188236
|
const hits = [];
|
|
188135
188237
|
const usedAllow = /* @__PURE__ */ new Set();
|
|
188136
188238
|
for (const file2 of files) {
|
|
@@ -188154,12 +188256,12 @@ function expectedOutputs(table = loadTable()) {
|
|
|
188154
188256
|
{ path: KOTLIN_OUT, content: renderKotlin(table) }
|
|
188155
188257
|
];
|
|
188156
188258
|
for (const p2 of appSourceCatalogs()) {
|
|
188157
|
-
const committed = JSON.parse(
|
|
188259
|
+
const committed = JSON.parse(readFileSync124(p2, "utf8"));
|
|
188158
188260
|
out2.push({ path: p2, content: serializeCatalog(injectAllNativeRows(committed, dirname57(dirname57(p2)), table)) });
|
|
188159
188261
|
}
|
|
188160
188262
|
return out2;
|
|
188161
188263
|
}
|
|
188162
|
-
function scanThrownMessages(files, read = (rel) =>
|
|
188264
|
+
function scanThrownMessages(files, read = (rel) => readFileSync124(join112(REPO_ROOT8, rel), "utf8")) {
|
|
188163
188265
|
const out2 = [];
|
|
188164
188266
|
for (const file2 of files) {
|
|
188165
188267
|
const src = read(file2);
|
|
@@ -188255,7 +188357,7 @@ var init_auth_gate_copy = __esm({
|
|
|
188255
188357
|
});
|
|
188256
188358
|
|
|
188257
188359
|
// ../l10n/extract.ts
|
|
188258
|
-
import { resolve as resolve80, join as join113, relative as
|
|
188360
|
+
import { resolve as resolve80, join as join113, relative as relative24, dirname as dirname58 } from "node:path";
|
|
188259
188361
|
import { createHash as createHash51 } from "node:crypto";
|
|
188260
188362
|
import { fileURLToPath as fileURLToPath37 } from "node:url";
|
|
188261
188363
|
function keyOf(source) {
|
|
@@ -188640,7 +188742,7 @@ __export(base44_adopt_exports, {
|
|
|
188640
188742
|
renderAdoptModule: () => renderAdoptModule,
|
|
188641
188743
|
runBase44Adopt: () => runBase44Adopt
|
|
188642
188744
|
});
|
|
188643
|
-
import { existsSync as existsSync106, readFileSync as
|
|
188745
|
+
import { existsSync as existsSync106, readFileSync as readFileSync126, writeFileSync as writeFileSync46 } from "node:fs";
|
|
188644
188746
|
import { join as join115, resolve as resolve82 } from "node:path";
|
|
188645
188747
|
function prop(entity, key3) {
|
|
188646
188748
|
const props2 = entity.schema?.properties;
|
|
@@ -188735,7 +188837,7 @@ function runBase44Adopt(opts) {
|
|
|
188735
188837
|
const bookPath = join115(bookDir, "book.json");
|
|
188736
188838
|
let book;
|
|
188737
188839
|
try {
|
|
188738
|
-
book = JSON.parse(
|
|
188840
|
+
book = JSON.parse(readFileSync126(bookPath, "utf8"));
|
|
188739
188841
|
if (!book || typeof book !== "object" || !Array.isArray(book.entities)) throw new Error("not a Base44 app book (no entities[])");
|
|
188740
188842
|
} catch (e2) {
|
|
188741
188843
|
throw new AdoptError("book_unreadable", `could not read ${bookPath}: ${e2.message}. Run \`himi base44 analyze --app-id <id>\` first.`);
|
|
@@ -189000,7 +189102,7 @@ __export(generate_exports, {
|
|
|
189000
189102
|
writeGenerated: () => writeGenerated
|
|
189001
189103
|
});
|
|
189002
189104
|
import { createHash as createHash52 } from "node:crypto";
|
|
189003
|
-
import { existsSync as existsSync107, mkdirSync as
|
|
189105
|
+
import { existsSync as existsSync107, mkdirSync as mkdirSync48, readdirSync as readdirSync45, readFileSync as readFileSync127, writeFileSync as writeFileSync47 } from "node:fs";
|
|
189004
189106
|
import { dirname as dirname60, join as join116 } from "node:path";
|
|
189005
189107
|
function withHeader(body) {
|
|
189006
189108
|
return `${GENERATED_HEADER}${sha2566(body)}
|
|
@@ -189129,13 +189231,13 @@ function writeGenerated(dir, files, opts = {}) {
|
|
|
189129
189231
|
let outcome;
|
|
189130
189232
|
if (!existsSync107(abs)) outcome = "written";
|
|
189131
189233
|
else {
|
|
189132
|
-
const cur =
|
|
189234
|
+
const cur = readFileSync127(abs, "utf8");
|
|
189133
189235
|
if (cur === next) outcome = "unchanged";
|
|
189134
189236
|
else if (isEdited(cur) && !opts.force) outcome = "skipped-edited";
|
|
189135
189237
|
else outcome = "written";
|
|
189136
189238
|
}
|
|
189137
189239
|
if (outcome === "written" && !opts.dryRun) {
|
|
189138
|
-
|
|
189240
|
+
mkdirSync48(dirname60(abs), { recursive: true });
|
|
189139
189241
|
writeFileSync47(abs, next);
|
|
189140
189242
|
}
|
|
189141
189243
|
out2.push({ path: f2.path, outcome });
|
|
@@ -189154,7 +189256,7 @@ function orphanedFiles(dir, current) {
|
|
|
189154
189256
|
}
|
|
189155
189257
|
for (const rel of candidates.sort()) {
|
|
189156
189258
|
if (keep.has(rel) || !existsSync107(join116(dir, rel))) continue;
|
|
189157
|
-
if (
|
|
189259
|
+
if (readFileSync127(join116(dir, rel), "utf8").startsWith(GENERATED_HEADER)) found.push(rel);
|
|
189158
189260
|
}
|
|
189159
189261
|
return found;
|
|
189160
189262
|
}
|
|
@@ -189193,7 +189295,7 @@ __export(base44_auth_exports, {
|
|
|
189193
189295
|
usableBase44Auth: () => usableBase44Auth,
|
|
189194
189296
|
writeBase44Session: () => writeBase44Session
|
|
189195
189297
|
});
|
|
189196
|
-
import { chmodSync as chmodSync4, existsSync as existsSync108, mkdirSync as
|
|
189298
|
+
import { chmodSync as chmodSync4, existsSync as existsSync108, mkdirSync as mkdirSync49, readFileSync as readFileSync128, rmSync as rmSync33, writeFileSync as writeFileSync48 } from "node:fs";
|
|
189197
189299
|
import { homedir as homedir15 } from "node:os";
|
|
189198
189300
|
import { dirname as dirname61, join as join117 } from "node:path";
|
|
189199
189301
|
function base44ApiBase(env = process.env) {
|
|
@@ -189206,7 +189308,7 @@ function readBase44Session(home) {
|
|
|
189206
189308
|
const p2 = base44SessionPath(home);
|
|
189207
189309
|
if (!existsSync108(p2)) return void 0;
|
|
189208
189310
|
try {
|
|
189209
|
-
const s2 = JSON.parse(
|
|
189311
|
+
const s2 = JSON.parse(readFileSync128(p2, "utf8"));
|
|
189210
189312
|
return typeof s2.accessToken === "string" && s2.accessToken ? s2 : void 0;
|
|
189211
189313
|
} catch {
|
|
189212
189314
|
return void 0;
|
|
@@ -189214,7 +189316,7 @@ function readBase44Session(home) {
|
|
|
189214
189316
|
}
|
|
189215
189317
|
function writeBase44Session(session, home) {
|
|
189216
189318
|
const p2 = base44SessionPath(home);
|
|
189217
|
-
|
|
189319
|
+
mkdirSync49(dirname61(p2), { recursive: true, mode: 448 });
|
|
189218
189320
|
writeFileSync48(p2, `${JSON.stringify(session, null, 2)}
|
|
189219
189321
|
`, { mode: 384 });
|
|
189220
189322
|
chmodSync4(p2, 384);
|
|
@@ -189326,7 +189428,7 @@ function hasBase44WriteScope(auth) {
|
|
|
189326
189428
|
function importBase44CliSession(home = homedir15(), env = process.env) {
|
|
189327
189429
|
const src = join117(home, ".base44", "auth", "auth.json");
|
|
189328
189430
|
if (!existsSync108(src)) throw new Error(`no Base44 CLI session at ${src} \u2014 run \`npx base44 login\` first, or use \`himi base44 login\``);
|
|
189329
|
-
const a2 = JSON.parse(
|
|
189431
|
+
const a2 = JSON.parse(readFileSync128(src, "utf8"));
|
|
189330
189432
|
if (typeof a2.accessToken !== "string" || !a2.accessToken) throw new Error(`${src} holds no access token`);
|
|
189331
189433
|
const session = {
|
|
189332
189434
|
accessToken: a2.accessToken,
|
|
@@ -189425,14 +189527,14 @@ __export(seed_exports, {
|
|
|
189425
189527
|
seedBase44Entities: () => seedBase44Entities,
|
|
189426
189528
|
writeBase44SeedRows: () => writeBase44SeedRows
|
|
189427
189529
|
});
|
|
189428
|
-
import { existsSync as existsSync109, readFileSync as
|
|
189530
|
+
import { existsSync as existsSync109, readFileSync as readFileSync129, writeFileSync as writeFileSync49 } from "node:fs";
|
|
189429
189531
|
import { join as join118 } from "node:path";
|
|
189430
189532
|
function readBase44SeedFile(dir) {
|
|
189431
189533
|
const file2 = join118(dir, BASE44_SEED_FILE);
|
|
189432
189534
|
if (!existsSync109(file2)) return {};
|
|
189433
189535
|
let parsed;
|
|
189434
189536
|
try {
|
|
189435
|
-
parsed = JSON.parse(
|
|
189537
|
+
parsed = JSON.parse(readFileSync129(file2, "utf8"));
|
|
189436
189538
|
} catch (e2) {
|
|
189437
189539
|
throw new SeedFileError(`${BASE44_SEED_FILE} is not valid JSON (${e2.message}). Fix or delete it.`);
|
|
189438
189540
|
}
|
|
@@ -189592,7 +189694,7 @@ function writeBase44SeedRows(opts) {
|
|
|
189592
189694
|
if (existsSync109(path2)) {
|
|
189593
189695
|
let parsed;
|
|
189594
189696
|
try {
|
|
189595
|
-
parsed = JSON.parse(
|
|
189697
|
+
parsed = JSON.parse(readFileSync129(path2, "utf8"));
|
|
189596
189698
|
} catch (e2) {
|
|
189597
189699
|
throw new SeedFileError(`${BASE44_SEED_FILE} is not valid JSON (${e2.message}). Refusing to regenerate, because overwriting it would discard the rows already in it.`);
|
|
189598
189700
|
}
|
|
@@ -189946,7 +190048,7 @@ __export(functions_exports2, {
|
|
|
189946
190048
|
markerContent: () => markerContent,
|
|
189947
190049
|
readFunctionSource: () => readFunctionSource
|
|
189948
190050
|
});
|
|
189949
|
-
import { existsSync as existsSync110, lstatSync as
|
|
190051
|
+
import { existsSync as existsSync110, lstatSync as lstatSync28 } from "node:fs";
|
|
189950
190052
|
import { join as join119 } from "node:path";
|
|
189951
190053
|
function markerContent(app) {
|
|
189952
190054
|
return `${JSON.stringify({ app, by: "himi" })}
|
|
@@ -189955,7 +190057,7 @@ function markerContent(app) {
|
|
|
189955
190057
|
function readFunctionSource(appDir3, name, app) {
|
|
189956
190058
|
const rel = `base44/functions/${name}/`;
|
|
189957
190059
|
const folder = join119(appDir3, "base44", "functions", name);
|
|
189958
|
-
if (!existsSync110(folder) || !
|
|
190060
|
+
if (!existsSync110(folder) || !lstatSync28(folder).isDirectory()) throw new FunctionSourceError("function_source_missing", `no source folder at ${rel}`);
|
|
189959
190061
|
const { entries, skipped } = collectAppSource(folder);
|
|
189960
190062
|
if (skipped.length) throw new FunctionSourceError("function_source_unsafe", `${rel} holds paths himi will not upload (symlinks or denied names): ${skipped.join(", ")} \u2014 remove them`);
|
|
189961
190063
|
const secrets = secretFindings(entries);
|
|
@@ -190296,7 +190398,7 @@ __export(apply_exports, {
|
|
|
190296
190398
|
createBase44Entities: () => createBase44Entities,
|
|
190297
190399
|
fileLedger: () => fileLedger
|
|
190298
190400
|
});
|
|
190299
|
-
import { existsSync as existsSync111, readFileSync as
|
|
190401
|
+
import { existsSync as existsSync111, readFileSync as readFileSync130, writeFileSync as writeFileSync50 } from "node:fs";
|
|
190300
190402
|
import { join as join120 } from "node:path";
|
|
190301
190403
|
function fileLedger(dir, appId2) {
|
|
190302
190404
|
const path2 = join120(dir, LEDGER_FILE2);
|
|
@@ -190304,7 +190406,7 @@ function fileLedger(dir, appId2) {
|
|
|
190304
190406
|
if (!existsSync111(path2)) return {};
|
|
190305
190407
|
let v2;
|
|
190306
190408
|
try {
|
|
190307
|
-
v2 = JSON.parse(
|
|
190409
|
+
v2 = JSON.parse(readFileSync130(path2, "utf8"));
|
|
190308
190410
|
} catch (e2) {
|
|
190309
190411
|
throw new LedgerError(`${LEDGER_FILE2} is not valid JSON (${e2.message}) \u2014 fix it (a merge conflict?) rather than let himi rewrite it`);
|
|
190310
190412
|
}
|
|
@@ -190956,11 +191058,11 @@ var init_analyze = __esm({
|
|
|
190956
191058
|
});
|
|
190957
191059
|
|
|
190958
191060
|
// src/base44-analyze/write-artifacts.ts
|
|
190959
|
-
import { existsSync as existsSync112, mkdirSync as
|
|
190960
|
-
import { dirname as dirname62, join as join121, resolve as resolve83, sep as
|
|
191061
|
+
import { existsSync as existsSync112, mkdirSync as mkdirSync50, readFileSync as readFileSync131, rmSync as rmSync34, writeFileSync as writeFileSync51 } from "node:fs";
|
|
191062
|
+
import { dirname as dirname62, join as join121, resolve as resolve83, sep as sep23 } from "node:path";
|
|
190961
191063
|
function isBookFolder(dir) {
|
|
190962
191064
|
try {
|
|
190963
|
-
return JSON.parse(
|
|
191065
|
+
return JSON.parse(readFileSync131(join121(dir, "book.json"), "utf8")).kind === "base44-app-book";
|
|
190964
191066
|
} catch {
|
|
190965
191067
|
return false;
|
|
190966
191068
|
}
|
|
@@ -191052,12 +191154,12 @@ function writeBase44Book(result, outDir, opts = {}) {
|
|
|
191052
191154
|
if (!isBookFolder(out2)) throw new Error(`refusing to write the app book into ${out2}: it already has ${owned.join(", ")} that ${owned.length === 1 ? "is" : "are"} not from an app book \u2014 pick an empty --out`);
|
|
191053
191155
|
for (const d2 of ["source", "screenshots"]) rmSync34(join121(out2, d2), { recursive: true, force: true });
|
|
191054
191156
|
}
|
|
191055
|
-
|
|
191157
|
+
mkdirSync50(out2, { recursive: true });
|
|
191056
191158
|
writeFileSync51(join121(out2, "book.json"), json8);
|
|
191057
191159
|
writeFileSync51(join121(out2, "BOOK.md"), md);
|
|
191058
191160
|
files.push("book.json", "BOOK.md");
|
|
191059
191161
|
for (const s2 of shots) {
|
|
191060
|
-
|
|
191162
|
+
mkdirSync50(join121(out2, "screenshots"), { recursive: true });
|
|
191061
191163
|
writeFileSync51(join121(out2, "screenshots", s2.filename), s2.bytes);
|
|
191062
191164
|
files.push(`screenshots/${s2.filename}`);
|
|
191063
191165
|
}
|
|
@@ -191065,8 +191167,8 @@ function writeBase44Book(result, outDir, opts = {}) {
|
|
|
191065
191167
|
for (const f2 of result.sourceFiles) {
|
|
191066
191168
|
if (!safeRel(f2.path)) continue;
|
|
191067
191169
|
const dest = join121(sourceRoot, ...f2.path.split("/"));
|
|
191068
|
-
if (!dest.startsWith(sourceRoot +
|
|
191069
|
-
|
|
191170
|
+
if (!dest.startsWith(sourceRoot + sep23)) continue;
|
|
191171
|
+
mkdirSync50(dirname62(dest), { recursive: true });
|
|
191070
191172
|
writeFileSync51(dest, f2.bytes);
|
|
191071
191173
|
}
|
|
191072
191174
|
if (result.sourceFiles.length) files.push(`source/ (${result.sourceFiles.length} files)`);
|
|
@@ -194613,7 +194715,7 @@ __export(cli_exports, {
|
|
|
194613
194715
|
systemTar: () => systemTar
|
|
194614
194716
|
});
|
|
194615
194717
|
import { execFile as execFile2 } from "node:child_process";
|
|
194616
|
-
import { mkdirSync as
|
|
194718
|
+
import { mkdirSync as mkdirSync51, mkdtempSync as mkdtempSync11, rmSync as rmSync35, writeFileSync as writeFileSync52 } from "node:fs";
|
|
194617
194719
|
import { tmpdir as tmpdir12 } from "node:os";
|
|
194618
194720
|
import { join as join122, resolve as resolve84 } from "node:path";
|
|
194619
194721
|
import { promisify } from "node:util";
|
|
@@ -194634,7 +194736,7 @@ function projectDownloader(apiFetch, apiBase, token, extract = systemTar) {
|
|
|
194634
194736
|
const archive = join122(root, "project.tar");
|
|
194635
194737
|
const dir = join122(root, "project");
|
|
194636
194738
|
writeFileSync52(archive, bytes2);
|
|
194637
|
-
|
|
194739
|
+
mkdirSync51(dir);
|
|
194638
194740
|
await extract(archive, dir);
|
|
194639
194741
|
return { dir, cleanup };
|
|
194640
194742
|
} catch (e2) {
|
|
@@ -195878,7 +195980,7 @@ var init_invite_plan = __esm({
|
|
|
195878
195980
|
});
|
|
195879
195981
|
|
|
195880
195982
|
// src/one-app/payment-review.ts
|
|
195881
|
-
import { readFileSync as
|
|
195983
|
+
import { readFileSync as readFileSync132 } from "node:fs";
|
|
195882
195984
|
import { join as join124, resolve as resolve86 } from "node:path";
|
|
195883
195985
|
function initialPaymentReview(metaSiteId) {
|
|
195884
195986
|
return {
|
|
@@ -195952,7 +196054,7 @@ function runPaymentReview(args, io2) {
|
|
|
195952
196054
|
const { manifest: manifest2 } = verifiedEvidence(evidenceDir);
|
|
195953
196055
|
const metaSiteId = obj6(manifest2.source).metaSiteId;
|
|
195954
196056
|
if (typeof metaSiteId !== "string") throw Error("Missing site binding");
|
|
195955
|
-
const review = JSON.parse(
|
|
196057
|
+
const review = JSON.parse(readFileSync132(join124(evidenceDir, "payment-review.json"), "utf8"));
|
|
195956
196058
|
const issues = paymentReviewIssues(review, metaSiteId);
|
|
195957
196059
|
if (issues.length) return fail7("payment_decision_required", issues, 1);
|
|
195958
196060
|
io2.log(JSON.stringify({ ok: true, stage: "payment-decisions-reviewed", evidenceDir, verification: "Recorded evidence and decisions checked; merchant readiness is not independently verified by this command." }));
|
|
@@ -196136,7 +196238,7 @@ __export(validate_identity_exports, {
|
|
|
196136
196238
|
runOneAppIdentityValidation: () => runOneAppIdentityValidation
|
|
196137
196239
|
});
|
|
196138
196240
|
import { createHash as createHash55 } from "node:crypto";
|
|
196139
|
-
import { existsSync as existsSync114, readFileSync as
|
|
196241
|
+
import { existsSync as existsSync114, readFileSync as readFileSync133 } from "node:fs";
|
|
196140
196242
|
import { join as join125, resolve as resolve87 } from "node:path";
|
|
196141
196243
|
function ricosTexts(documentJson) {
|
|
196142
196244
|
let root;
|
|
@@ -196193,7 +196295,7 @@ function literalSlugFindings(slug, displayName3, screens, authoredText = []) {
|
|
|
196193
196295
|
}
|
|
196194
196296
|
function sourceIdentity(evidenceDir) {
|
|
196195
196297
|
const { manifest: manifest2, raw } = verifiedEvidence(evidenceDir);
|
|
196196
|
-
const bytes2 =
|
|
196298
|
+
const bytes2 = readFileSync133(join125(evidenceDir, "business-context.json"));
|
|
196197
196299
|
const hash3 = createHash55("sha256").update(bytes2).digest("hex");
|
|
196198
196300
|
if (obj7(manifest2.sha256)["business-context.json"] !== hash3) throw Error("business-context.json differs from the collected evidence.");
|
|
196199
196301
|
const name = obj7(JSON.parse(bytes2.toString("utf8"))).displayName;
|
|
@@ -196214,7 +196316,7 @@ function sourceIdentity(evidenceDir) {
|
|
|
196214
196316
|
}
|
|
196215
196317
|
const pagesPath = join125(evidenceDir, "pages-content.json");
|
|
196216
196318
|
if (existsSync114(pagesPath)) {
|
|
196217
|
-
const pagesBytes =
|
|
196319
|
+
const pagesBytes = readFileSync133(pagesPath);
|
|
196218
196320
|
if (obj7(manifest2.sha256)["pages-content.json"] !== createHash55("sha256").update(pagesBytes).digest("hex")) throw Error("pages-content.json differs from the collected evidence.");
|
|
196219
196321
|
for (const document2 of obj7(JSON.parse(pagesBytes.toString("utf8"))).documents ?? []) authoredText.push(...ricosTexts(obj7(obj7(document2).page).documentJson));
|
|
196220
196322
|
}
|
|
@@ -196308,7 +196410,7 @@ __export(cli_exports2, {
|
|
|
196308
196410
|
ONE_APP_WORKFLOW: () => ONE_APP_WORKFLOW,
|
|
196309
196411
|
runOneAppCommand: () => runOneAppCommand
|
|
196310
196412
|
});
|
|
196311
|
-
import { closeSync as closeSync9, constants as constants9, lstatSync as
|
|
196413
|
+
import { closeSync as closeSync9, constants as constants9, lstatSync as lstatSync29, mkdirSync as mkdirSync52, openSync as openSync8, readFileSync as readFileSync134, realpathSync as realpathSync17, writeFileSync as writeFileSync53 } from "node:fs";
|
|
196312
196414
|
import { createHash as createHash56 } from "node:crypto";
|
|
196313
196415
|
import { isIP as isIP2 } from "node:net";
|
|
196314
196416
|
import { dirname as dirname63, join as join126, parse as parse3, resolve as resolve88 } from "node:path";
|
|
@@ -196379,9 +196481,9 @@ function readOptions(argv, cwd, commandIncluded) {
|
|
|
196379
196481
|
if (flags["prompt-file"] !== void 0) {
|
|
196380
196482
|
try {
|
|
196381
196483
|
const file2 = resolve88(cwd, flags["prompt-file"]);
|
|
196382
|
-
const stat2 =
|
|
196484
|
+
const stat2 = lstatSync29(file2);
|
|
196383
196485
|
if (!stat2.isFile() || stat2.size > MAX_PROMPT_BYTES) throw new Error("invalid prompt file");
|
|
196384
|
-
prompt =
|
|
196486
|
+
prompt = readFileSync134(file2, "utf8");
|
|
196385
196487
|
} catch {
|
|
196386
196488
|
throw new OneAppError("invalid_prompt", "Use a readable text file of at most 64 KiB for --prompt-file.");
|
|
196387
196489
|
}
|
|
@@ -196404,7 +196506,7 @@ function readOptions(argv, cwd, commandIncluded) {
|
|
|
196404
196506
|
}
|
|
196405
196507
|
function pathExists(path2) {
|
|
196406
196508
|
try {
|
|
196407
|
-
|
|
196509
|
+
lstatSync29(path2);
|
|
196408
196510
|
return true;
|
|
196409
196511
|
} catch (error) {
|
|
196410
196512
|
if (error.code === "ENOENT") return false;
|
|
@@ -196416,7 +196518,7 @@ function assertSafeParents(path2) {
|
|
|
196416
196518
|
let current = path2;
|
|
196417
196519
|
while (current !== root) {
|
|
196418
196520
|
try {
|
|
196419
|
-
const stat2 =
|
|
196521
|
+
const stat2 = lstatSync29(current);
|
|
196420
196522
|
if (stat2.isSymbolicLink() || !stat2.isDirectory()) {
|
|
196421
196523
|
throw new OneAppError("invalid_output_path", "Choose an output parent without symlinks or non-directory components.");
|
|
196422
196524
|
}
|
|
@@ -196537,12 +196639,12 @@ validate-payments checks site-bound payment evidence and explicit paid-flow deci
|
|
|
196537
196639
|
}
|
|
196538
196640
|
stage = "input";
|
|
196539
196641
|
try {
|
|
196540
|
-
|
|
196642
|
+
mkdirSync52(options.parentDir, { recursive: true, mode: 448 });
|
|
196541
196643
|
assertSafeParents(options.parentDir);
|
|
196542
|
-
|
|
196644
|
+
mkdirSync52(options.workspace, { mode: 448 });
|
|
196543
196645
|
if (realpathSync17(options.workspace) !== options.workspace) throw new Error("destination changed");
|
|
196544
196646
|
evidenceDir = join126(options.workspace, ".himi", "one-app");
|
|
196545
|
-
|
|
196647
|
+
mkdirSync52(evidenceDir, { recursive: true, mode: 448 });
|
|
196546
196648
|
} catch (error) {
|
|
196547
196649
|
if (error.code === "EEXIST") {
|
|
196548
196650
|
throw new OneAppError("output_exists", "The destination already exists. Choose a new --name or --dir.");
|
|
@@ -196708,6 +196810,7 @@ var init_spaces_host_manifest = __esm({
|
|
|
196708
196810
|
"himi_apps",
|
|
196709
196811
|
"iap",
|
|
196710
196812
|
"keyboard",
|
|
196813
|
+
"legacy_import",
|
|
196711
196814
|
"live_activity",
|
|
196712
196815
|
"local_database",
|
|
196713
196816
|
"media_playback",
|
|
@@ -196740,6 +196843,7 @@ var init_spaces_host_manifest = __esm({
|
|
|
196740
196843
|
"godot",
|
|
196741
196844
|
"himi_apps",
|
|
196742
196845
|
"keyboard",
|
|
196846
|
+
"legacy_import",
|
|
196743
196847
|
"network",
|
|
196744
196848
|
"on_device_ai",
|
|
196745
196849
|
"pdf",
|
|
@@ -196760,6 +196864,7 @@ var init_spaces_host_manifest = __esm({
|
|
|
196760
196864
|
"himi_apps",
|
|
196761
196865
|
"iap",
|
|
196762
196866
|
"keyboard",
|
|
196867
|
+
"legacy_import",
|
|
196763
196868
|
"live_activity",
|
|
196764
196869
|
"motion",
|
|
196765
196870
|
"network",
|
|
@@ -196781,6 +196886,7 @@ var init_spaces_host_manifest = __esm({
|
|
|
196781
196886
|
"godot",
|
|
196782
196887
|
"himi_apps",
|
|
196783
196888
|
"keyboard",
|
|
196889
|
+
"legacy_import",
|
|
196784
196890
|
"network",
|
|
196785
196891
|
"on_device_ai",
|
|
196786
196892
|
"pdf",
|
|
@@ -198687,8 +198793,8 @@ var init_customer_build = __esm({
|
|
|
198687
198793
|
});
|
|
198688
198794
|
|
|
198689
198795
|
// src/site-analyze/apply.ts
|
|
198690
|
-
import { existsSync as existsSync115, readFileSync as
|
|
198691
|
-
import { dirname as dirname64, isAbsolute as
|
|
198796
|
+
import { existsSync as existsSync115, readFileSync as readFileSync135, writeFileSync as writeFileSync54, copyFileSync as copyFileSync2, mkdirSync as mkdirSync53, realpathSync as realpathSync18, statSync as statSync31 } from "node:fs";
|
|
198797
|
+
import { dirname as dirname64, isAbsolute as isAbsolute11, join as join127, resolve as resolve89, sep as sep24 } from "node:path";
|
|
198692
198798
|
import { spawnSync as spawnSync10 } from "node:child_process";
|
|
198693
198799
|
function unpairedRedirectNote(overlay) {
|
|
198694
198800
|
if (!overlay.wix?.clientId || overlay.wix.redirectUri) return void 0;
|
|
@@ -198822,12 +198928,12 @@ function buildMergedContract(options) {
|
|
|
198822
198928
|
if (!existsSync115(committedPath)) {
|
|
198823
198929
|
throw new Error(`shell has no committed provisioning.json at ${committedPath} to build a contract from`);
|
|
198824
198930
|
}
|
|
198825
|
-
const committed = JSON.parse(
|
|
198931
|
+
const committed = JSON.parse(readFileSync135(committedPath, "utf8"));
|
|
198826
198932
|
const previousPath = join127(appDir3, LOCAL_CONTRACT_REL);
|
|
198827
198933
|
let evidenceOverlay = overlay;
|
|
198828
198934
|
if ((overlay.businessContact === void 0 || overlay.loyalty === void 0 || overlay.businessTimeZone === void 0) && existsSync115(previousPath)) {
|
|
198829
198935
|
try {
|
|
198830
|
-
const previous = JSON.parse(
|
|
198936
|
+
const previous = JSON.parse(readFileSync135(previousPath, "utf8"));
|
|
198831
198937
|
if (previous && typeof previous === "object" && !Array.isArray(previous) && sameKnownSite(previous, overlay)) {
|
|
198832
198938
|
evidenceOverlay = {
|
|
198833
198939
|
...overlay,
|
|
@@ -198844,9 +198950,9 @@ function buildMergedContract(options) {
|
|
|
198844
198950
|
const branding = merged.branding ?? {};
|
|
198845
198951
|
const staged = [];
|
|
198846
198952
|
const contained = (root, rel) => {
|
|
198847
|
-
if (
|
|
198953
|
+
if (isAbsolute11(rel)) return void 0;
|
|
198848
198954
|
const full = resolve89(root, rel);
|
|
198849
|
-
return full.startsWith(resolve89(root) +
|
|
198955
|
+
return full.startsWith(resolve89(root) + sep24) ? full : void 0;
|
|
198850
198956
|
};
|
|
198851
198957
|
const stage = (fromRel, toRel) => {
|
|
198852
198958
|
const from = contained(packageDir, fromRel);
|
|
@@ -198860,10 +198966,10 @@ function buildMergedContract(options) {
|
|
|
198860
198966
|
} catch {
|
|
198861
198967
|
return void 0;
|
|
198862
198968
|
}
|
|
198863
|
-
if (!real.startsWith(realRoot +
|
|
198969
|
+
if (!real.startsWith(realRoot + sep24)) return void 0;
|
|
198864
198970
|
try {
|
|
198865
198971
|
if (!statSync31(real).isFile()) return void 0;
|
|
198866
|
-
|
|
198972
|
+
mkdirSync53(dirname64(to2), { recursive: true });
|
|
198867
198973
|
copyFileSync2(real, to2);
|
|
198868
198974
|
} catch {
|
|
198869
198975
|
return void 0;
|
|
@@ -198877,7 +198983,7 @@ function buildMergedContract(options) {
|
|
|
198877
198983
|
if (existsSync115(facesPath)) {
|
|
198878
198984
|
let faces = [];
|
|
198879
198985
|
try {
|
|
198880
|
-
const parsed = JSON.parse(
|
|
198986
|
+
const parsed = JSON.parse(readFileSync135(facesPath, "utf8"));
|
|
198881
198987
|
faces = Array.isArray(parsed) ? parsed : [];
|
|
198882
198988
|
} catch {
|
|
198883
198989
|
faces = [];
|
|
@@ -198901,7 +199007,7 @@ function buildMergedContract(options) {
|
|
|
198901
199007
|
const path2 = join127(packageDir, "provisioning.contract.json");
|
|
198902
199008
|
writeFileSync54(path2, body);
|
|
198903
199009
|
const localPath2 = join127(appDir3, LOCAL_CONTRACT_REL);
|
|
198904
|
-
|
|
199010
|
+
mkdirSync53(dirname64(localPath2), { recursive: true });
|
|
198905
199011
|
writeFileSync54(localPath2, body);
|
|
198906
199012
|
staged.push(localPath2);
|
|
198907
199013
|
return { path: path2, staged };
|
|
@@ -198938,7 +199044,7 @@ function staticFaqFor(overlay, overlayPath) {
|
|
|
198938
199044
|
const bookPath = join127(dirname64(resolve89(overlayPath)), "book.json");
|
|
198939
199045
|
if (!existsSync115(bookPath)) return void 0;
|
|
198940
199046
|
try {
|
|
198941
|
-
const book = JSON.parse(
|
|
199047
|
+
const book = JSON.parse(readFileSync135(bookPath, "utf8"));
|
|
198942
199048
|
const copy = book?.copy;
|
|
198943
199049
|
if (!copy || typeof copy !== "object" || copy.unavailable) return void 0;
|
|
198944
199050
|
const pairs = deriveStaticFaq(copy.faq);
|
|
@@ -198955,7 +199061,7 @@ function staticGalleriesFor(overlay, overlayPath) {
|
|
|
198955
199061
|
const bookPath = join127(dirname64(resolve89(overlayPath)), "book.json");
|
|
198956
199062
|
if (!existsSync115(bookPath)) return void 0;
|
|
198957
199063
|
try {
|
|
198958
|
-
const book = JSON.parse(
|
|
199064
|
+
const book = JSON.parse(readFileSync135(bookPath, "utf8"));
|
|
198959
199065
|
if (!book.look || book.look.unavailable || !Array.isArray(book.look.pages)) return void 0;
|
|
198960
199066
|
const galleries = deriveStaticGalleries(book.look.pages);
|
|
198961
199067
|
return galleries.length || book.look.complete === true ? galleries : void 0;
|
|
@@ -198967,8 +199073,8 @@ async function applyOverlays(input) {
|
|
|
198967
199073
|
const cwd = resolve89(input.cwd);
|
|
198968
199074
|
const shell = input.shell ?? DEFAULT_BRANDABLE_SHELL;
|
|
198969
199075
|
assertKnownShell(shell);
|
|
198970
|
-
const overlay = JSON.parse(
|
|
198971
|
-
const tokens2 = JSON.parse(
|
|
199076
|
+
const overlay = JSON.parse(readFileSync135(input.overlayPath, "utf8"));
|
|
199077
|
+
const tokens2 = JSON.parse(readFileSync135(input.tokensPath, "utf8"));
|
|
198972
199078
|
const faq = staticFaqFor(overlay, input.overlayPath);
|
|
198973
199079
|
if (faq !== void 0) overlay.faq = faq;
|
|
198974
199080
|
const galleries = staticGalleriesFor(overlay, input.overlayPath);
|
|
@@ -198987,7 +199093,7 @@ async function applyOverlays(input) {
|
|
|
198987
199093
|
}
|
|
198988
199094
|
const appDir3 = join127(repoRoot2, shellAppDir(shell));
|
|
198989
199095
|
const committedPath = join127(appDir3, "provisioning.json");
|
|
198990
|
-
const committedSite = existsSync115(committedPath) ? JSON.parse(
|
|
199096
|
+
const committedSite = existsSync115(committedPath) ? JSON.parse(readFileSync135(committedPath, "utf8")).site : void 0;
|
|
198991
199097
|
if (committedSite !== void 0 && overlay.site === void 0) {
|
|
198992
199098
|
throw new Error(
|
|
198993
199099
|
`shell "${shell}" is a site shell: its contract names the customer's website (a \`site\` block), and this overlay has none. Re-run \`himi site analyze --url <site> --shell ${shell}\` to derive the site's page map (edit \`site.pages\` in provisioning.overlay.json if needed), then --apply.`
|
|
@@ -199029,7 +199135,7 @@ async function applyOverlays(input) {
|
|
|
199029
199135
|
let packageFaq = faq;
|
|
199030
199136
|
let packageGalleries = galleries;
|
|
199031
199137
|
if (existsSync115(pkgProv)) {
|
|
199032
|
-
const cur = JSON.parse(
|
|
199138
|
+
const cur = JSON.parse(readFileSync135(pkgProv, "utf8"));
|
|
199033
199139
|
if (galleries === void 0 && !sameKnownSite(cur, overlay)) overlay.galleries = [];
|
|
199034
199140
|
const merged = deepMerge4(cur, overlay);
|
|
199035
199141
|
if (overlay.businessContact !== void 0) merged.businessContact = overlay.businessContact;
|
|
@@ -199053,7 +199159,7 @@ async function applyOverlays(input) {
|
|
|
199053
199159
|
}
|
|
199054
199160
|
const pkgTokens = join127(cwd, "tokens.json");
|
|
199055
199161
|
if (existsSync115(pkgTokens) && (tokens2.colors || tokens2.typography)) {
|
|
199056
|
-
const cur = JSON.parse(
|
|
199162
|
+
const cur = JSON.parse(readFileSync135(pkgTokens, "utf8"));
|
|
199057
199163
|
let tokensIn = tokens2;
|
|
199058
199164
|
if (tokens2.typography) {
|
|
199059
199165
|
const fonts = catalogTypography(tokens2.typography, cur.typography);
|
|
@@ -199080,7 +199186,7 @@ async function applyOverlays(input) {
|
|
|
199080
199186
|
const homeAction = homeRefreshActionId(shell);
|
|
199081
199187
|
const homeSrc = join127(cwd, "dev/index.ts");
|
|
199082
199188
|
if (homeAction && existsSync115(homeSrc)) {
|
|
199083
|
-
const prev =
|
|
199189
|
+
const prev = readFileSync135(homeSrc, "utf8");
|
|
199084
199190
|
const patched = patchBrandParams(prev, overlay, homeAction);
|
|
199085
199191
|
let next = patched.src;
|
|
199086
199192
|
if (!patched.foreign && faq?.length && prev.includes('"tier5.himiBrandedFaq.load"') && !prev.includes('"staticFaq"')) {
|
|
@@ -200083,7 +200189,7 @@ __export(cli_exports3, {
|
|
|
200083
200189
|
runSiteAnalyze: () => runSiteAnalyze,
|
|
200084
200190
|
runSiteFunctionCli: () => runSiteFunctionCli
|
|
200085
200191
|
});
|
|
200086
|
-
import { existsSync as existsSync116, readFileSync as
|
|
200192
|
+
import { existsSync as existsSync116, readFileSync as readFileSync136 } from "node:fs";
|
|
200087
200193
|
import { resolve as resolve90 } from "node:path";
|
|
200088
200194
|
function applyNeedsClient(shell) {
|
|
200089
200195
|
if (shell === void 0 || !SHELL_NAMES.includes(shell)) return true;
|
|
@@ -200153,7 +200259,7 @@ async function runSiteAnalyze(opts) {
|
|
|
200153
200259
|
const prevOverlayPath = resolve90(outDir, "provisioning.overlay.json");
|
|
200154
200260
|
const prevSite = existsSync116(prevOverlayPath) ? (() => {
|
|
200155
200261
|
try {
|
|
200156
|
-
return JSON.parse(
|
|
200262
|
+
return JSON.parse(readFileSync136(prevOverlayPath, "utf8")).site;
|
|
200157
200263
|
} catch {
|
|
200158
200264
|
return void 0;
|
|
200159
200265
|
}
|
|
@@ -200172,7 +200278,7 @@ async function runSiteAnalyze(opts) {
|
|
|
200172
200278
|
}
|
|
200173
200279
|
const previousOverlay = resolve90(outDir, "provisioning.overlay.json");
|
|
200174
200280
|
carryOverGoals(
|
|
200175
|
-
existsSync116(previousOverlay) ?
|
|
200281
|
+
existsSync116(previousOverlay) ? readFileSync136(previousOverlay, "utf8") : void 0,
|
|
200176
200282
|
result.provisioningOverlay
|
|
200177
200283
|
);
|
|
200178
200284
|
const ownerCall = ownerAuth ? ownerTransportFrom(fetchImpl, ownerAuth) : void 0;
|
|
@@ -200230,7 +200336,7 @@ async function runSiteFunctionCli(opts) {
|
|
|
200230
200336
|
let source;
|
|
200231
200337
|
if (opts.sourcePath) {
|
|
200232
200338
|
const p2 = resolve90(opts.cwd ?? process.cwd(), opts.sourcePath);
|
|
200233
|
-
source =
|
|
200339
|
+
source = readFileSync136(p2, "utf8");
|
|
200234
200340
|
}
|
|
200235
200341
|
let body;
|
|
200236
200342
|
if (opts.bodyRaw != null) {
|
|
@@ -200260,7 +200366,7 @@ async function runSiteFunctionCli(opts) {
|
|
|
200260
200366
|
function base44BookRoutes(bookPath, siteUrl) {
|
|
200261
200367
|
if (!existsSync116(bookPath)) return void 0;
|
|
200262
200368
|
try {
|
|
200263
|
-
const book = JSON.parse(
|
|
200369
|
+
const book = JSON.parse(readFileSync136(bookPath, "utf8"));
|
|
200264
200370
|
if (book.kind !== "base44-app-book" || !Array.isArray(book.routes)) return void 0;
|
|
200265
200371
|
const host = (u2) => {
|
|
200266
200372
|
try {
|
|
@@ -200518,7 +200624,7 @@ __export(site_create_exports, {
|
|
|
200518
200624
|
runSiteList: () => runSiteList,
|
|
200519
200625
|
writeProvisioningBinding: () => writeProvisioningBinding
|
|
200520
200626
|
});
|
|
200521
|
-
import { existsSync as existsSync117, readFileSync as
|
|
200627
|
+
import { existsSync as existsSync117, readFileSync as readFileSync137, writeFileSync as writeFileSync55 } from "node:fs";
|
|
200522
200628
|
import { resolve as resolvePath2 } from "node:path";
|
|
200523
200629
|
function oauthClientName(projectName) {
|
|
200524
200630
|
return `${projectName} client`;
|
|
@@ -200667,7 +200773,7 @@ async function runSiteCreate(opts) {
|
|
|
200667
200773
|
if (!wantOauthApp) return { ...base, nextSteps: nextSteps(metaSiteId) };
|
|
200668
200774
|
return { ...base, clientId, redirectUri, nextSteps: nextSteps(metaSiteId, clientId) };
|
|
200669
200775
|
}
|
|
200670
|
-
function writeProvisioningBinding(target, binding2, fs2 = { existsSync: existsSync117, readFileSync:
|
|
200776
|
+
function writeProvisioningBinding(target, binding2, fs2 = { existsSync: existsSync117, readFileSync: readFileSync137, writeFileSync: writeFileSync55 }) {
|
|
200671
200777
|
const msid = binding2.siteId;
|
|
200672
200778
|
const path2 = resolvePath2(target);
|
|
200673
200779
|
const committed = committedShellProvisioning(path2);
|
|
@@ -201451,14 +201557,14 @@ __export(capture_exports, {
|
|
|
201451
201557
|
nativeNotConfigured: () => nativeNotConfigured,
|
|
201452
201558
|
variantWidth: () => variantWidth
|
|
201453
201559
|
});
|
|
201454
|
-
import { existsSync as existsSync118, mkdirSync as
|
|
201560
|
+
import { existsSync as existsSync118, mkdirSync as mkdirSync54, rmSync as rmSync36, writeFileSync as writeFileSync56 } from "node:fs";
|
|
201455
201561
|
import { join as join128 } from "node:path";
|
|
201456
201562
|
import { pathToFileURL as pathToFileURL10 } from "node:url";
|
|
201457
201563
|
function variantWidth(variant) {
|
|
201458
201564
|
return variant === "tablet" ? renderDeviceWidths().tablet : PHONE_WIDTH;
|
|
201459
201565
|
}
|
|
201460
201566
|
function frameFile(outDir, screen, variant, surface) {
|
|
201461
|
-
|
|
201567
|
+
mkdirSync54(outDir, { recursive: true });
|
|
201462
201568
|
return join128(outDir, `${screen}.${variant}.${surface}.png`);
|
|
201463
201569
|
}
|
|
201464
201570
|
async function captureMockup(root, screen, entry, variant, outDir, session) {
|
|
@@ -201603,7 +201709,7 @@ var init_capture = __esm({
|
|
|
201603
201709
|
|
|
201604
201710
|
// src/fidelity/judge.ts
|
|
201605
201711
|
import { spawn as spawn7 } from "node:child_process";
|
|
201606
|
-
import { copyFileSync as copyFileSync3, mkdtempSync as mkdtempSync12, readFileSync as
|
|
201712
|
+
import { copyFileSync as copyFileSync3, mkdtempSync as mkdtempSync12, readFileSync as readFileSync138, rmSync as rmSync37 } from "node:fs";
|
|
201607
201713
|
import { tmpdir as tmpdir13 } from "node:os";
|
|
201608
201714
|
import { basename as basename29, dirname as dirname65, join as join129, resolve as resolve91 } from "node:path";
|
|
201609
201715
|
import { fileURLToPath as fileURLToPath38 } from "node:url";
|
|
@@ -201639,8 +201745,8 @@ async function judgeStrip(strip3, screen, variant, opts = {}) {
|
|
|
201639
201745
|
const judgeDir = opts.judgeDir ?? SOURCE_JUDGE_DIR;
|
|
201640
201746
|
let prompt, schema;
|
|
201641
201747
|
try {
|
|
201642
|
-
prompt =
|
|
201643
|
-
schema =
|
|
201748
|
+
prompt = readFileSync138(resolve91(judgeDir, "JUDGE.md"), "utf8");
|
|
201749
|
+
schema = readFileSync138(resolve91(judgeDir, "verdict.schema.json"), "utf8");
|
|
201644
201750
|
} catch (e2) {
|
|
201645
201751
|
return cannotTell(`the judge prompt could not be read from ${judgeDir}: ${e2.message}`);
|
|
201646
201752
|
}
|
|
@@ -201864,7 +201970,7 @@ __export(run_exports2, {
|
|
|
201864
201970
|
runFidelity: () => runFidelity,
|
|
201865
201971
|
runId: () => runId
|
|
201866
201972
|
});
|
|
201867
|
-
import { mkdirSync as
|
|
201973
|
+
import { mkdirSync as mkdirSync55, writeFileSync as writeFileSync57 } from "node:fs";
|
|
201868
201974
|
import { basename as basename30, join as join132 } from "node:path";
|
|
201869
201975
|
function runId(now = /* @__PURE__ */ new Date()) {
|
|
201870
201976
|
return now.toISOString().replace(/[-:]/g, "").replace(/\..*/, "").replace("T", "-");
|
|
@@ -201899,7 +202005,7 @@ async function runFidelity(root, opts = {}) {
|
|
|
201899
202005
|
const run2 = opts.run ?? runId();
|
|
201900
202006
|
const dir = join132(opts.outRoot ?? join132(root, ".himi", "fidelity"), run2);
|
|
201901
202007
|
const framesDir = join132(dir, "frames");
|
|
201902
|
-
|
|
202008
|
+
mkdirSync55(framesDir, { recursive: true });
|
|
201903
202009
|
const session = opts.capture?.mockup ? void 0 : new MockupSession();
|
|
201904
202010
|
const mockup = opts.capture?.mockup ?? ((r3, s2, e2, v2, o2) => captureMockup(r3, s2, e2, v2, o2, session));
|
|
201905
202011
|
const web = opts.capture?.web ?? captureWebVariant;
|
|
@@ -202035,7 +202141,7 @@ __export(fidelity_exports, {
|
|
|
202035
202141
|
});
|
|
202036
202142
|
import { execFileSync as execFileSync10 } from "node:child_process";
|
|
202037
202143
|
import { existsSync as existsSync120, realpathSync as realpathSync19 } from "node:fs";
|
|
202038
|
-
import { join as join133, relative as
|
|
202144
|
+
import { join as join133, relative as relative26, sep as sep25 } from "node:path";
|
|
202039
202145
|
function himalayaRepoRoot(dir) {
|
|
202040
202146
|
let top;
|
|
202041
202147
|
try {
|
|
@@ -202044,8 +202150,8 @@ function himalayaRepoRoot(dir) {
|
|
|
202044
202150
|
return null;
|
|
202045
202151
|
}
|
|
202046
202152
|
if (!existsSync120(join133(top, "tools/judges/fidelity/JUDGE.md"))) return null;
|
|
202047
|
-
const rel =
|
|
202048
|
-
return rel.startsWith(`..${
|
|
202153
|
+
const rel = relative26(realpathSync19(top), realpathSync19(dir));
|
|
202154
|
+
return rel.startsWith(`..${sep25}`) || rel === ".." ? null : top;
|
|
202049
202155
|
}
|
|
202050
202156
|
function fidelityEnvelope(report3) {
|
|
202051
202157
|
return report3.status === "fail" ? { ok: false, code: "fidelity_rows_failed", ...report3 } : { ok: true, ...report3 };
|
|
@@ -202893,7 +202999,8 @@ var USAGE = `himi \u2014 the Himalaya authoring CLI (remote dev loop)
|
|
|
202893
202999
|
minBinaryVersion \u2014 all named in the output.
|
|
202894
203000
|
himi dist [--app <a>] [--platform ios,android] [--release <id>] [--allow-draft] [--target <t>]
|
|
202895
203001
|
[--shell branded-lite|owner-lite|brandy|base44|player|demo-app] [--signing wix-managed|byo]
|
|
202896
|
-
[--android-signing qa-keystore|wix-keystore|debug] [--aab]
|
|
203002
|
+
[--android-signing qa-keystore|wix-keystore|debug|owner] [--aab]
|
|
203003
|
+
[--package-name <id> --google-services <file>]
|
|
202897
203004
|
[--app-name <name> --app-icon-url <url>]
|
|
202898
203005
|
[--borrow-ios-id <bundleId>] [--no-wait] [--force] [--plan]
|
|
202899
203006
|
build an INSTALLABLE QA binary (signed IPA / APK) on
|
|
@@ -202939,10 +203046,16 @@ var USAGE = `himi \u2014 the Himalaya authoring CLI (remote dev loop)
|
|
|
202939
203046
|
link and QR for the APK. Android only. The bundle is
|
|
202940
203047
|
signed with the Wix production key (wix-keystore, the
|
|
202941
203048
|
upload key Branded apps use; any other
|
|
202942
|
-
--android-signing is refused), the APK with the QA
|
|
203049
|
+
--android-signing but owner is refused), the APK with the QA
|
|
202943
203050
|
key. The default stays an APK only. For a Containers
|
|
202944
203051
|
app, --aab --version <x.y.z> makes that the bundle's
|
|
202945
203052
|
versionName, which Google Play shows.
|
|
203053
|
+
--aab --android-signing owner --package-name <id>
|
|
203054
|
+
--google-services <file> builds an UNSIGNED bundle
|
|
203055
|
+
under your own package name and Firebase project,
|
|
203056
|
+
for an app bound to no Wix site, with no APK beside
|
|
203057
|
+
it. Sign it before uploading. Off until a plane
|
|
203058
|
+
switches it on (501 owner_bundles_unconfigured).
|
|
202946
203059
|
--app-name / --app-icon-url (together) give the binary
|
|
202947
203060
|
a name and icon in place of the release's; the icon is
|
|
202948
203061
|
a https://static.wixstatic.com/media/<file> URL. A
|
|
@@ -204733,7 +204846,7 @@ async function functionsCommand(ctx) {
|
|
|
204733
204846
|
// src/commands/mcp.ts
|
|
204734
204847
|
init_define_HHP_CATALOG();
|
|
204735
204848
|
init_guides();
|
|
204736
|
-
import { mkdirSync as
|
|
204849
|
+
import { mkdirSync as mkdirSync39, writeFileSync as writeFileSync33 } from "node:fs";
|
|
204737
204850
|
import { join as join78, resolve as resolve63, dirname as dirname46 } from "node:path";
|
|
204738
204851
|
init_cli_shared();
|
|
204739
204852
|
async function mcpCommand(ctx) {
|
|
@@ -204750,7 +204863,7 @@ async function mcpCommand(ctx) {
|
|
|
204750
204863
|
const dir2 = resolve63(out2);
|
|
204751
204864
|
const files2 = himiStudioPluginFiles2();
|
|
204752
204865
|
for (const f2 of files2) {
|
|
204753
|
-
|
|
204866
|
+
mkdirSync39(dirname46(join78(dir2, f2.path)), { recursive: true });
|
|
204754
204867
|
writeFileSync33(join78(dir2, f2.path), f2.text);
|
|
204755
204868
|
}
|
|
204756
204869
|
print({ ok: true, dir: dir2, files: files2.map((f2) => f2.path), next: [`claude plugin validate ${dir2}`, `claude --plugin-dir ${dir2}`] });
|
|
@@ -204766,7 +204879,7 @@ async function mcpCommand(ctx) {
|
|
|
204766
204879
|
const dir = resolve63(out2);
|
|
204767
204880
|
const files = himiPluginFiles2(skills.skillMd);
|
|
204768
204881
|
for (const f2 of files) {
|
|
204769
|
-
|
|
204882
|
+
mkdirSync39(dirname46(join78(dir, f2.path)), { recursive: true });
|
|
204770
204883
|
writeFileSync33(join78(dir, f2.path), f2.text);
|
|
204771
204884
|
}
|
|
204772
204885
|
print({ ok: true, dir, files: files.map((f2) => f2.path), next: [`claude plugin validate ${dir}`, `claude --plugin-dir ${dir}`] });
|
|
@@ -204785,7 +204898,7 @@ async function mcpCommand(ctx) {
|
|
|
204785
204898
|
// src/commands/studio.ts
|
|
204786
204899
|
init_define_HHP_CATALOG();
|
|
204787
204900
|
init_cli_shared();
|
|
204788
|
-
import { mkdirSync as
|
|
204901
|
+
import { mkdirSync as mkdirSync40, writeFileSync as writeFileSync34, existsSync as existsSync77 } from "node:fs";
|
|
204789
204902
|
import { join as join79, resolve as resolve64, basename as basename22, dirname as dirname47 } from "node:path";
|
|
204790
204903
|
async function studioCommand(ctx) {
|
|
204791
204904
|
const { io: io2, pos, flags, print } = ctx;
|
|
@@ -204799,7 +204912,7 @@ async function studioCommand(ctx) {
|
|
|
204799
204912
|
const { buildReel: buildReel2 } = await Promise.resolve().then(() => (init_studio_reel(), studio_reel_exports));
|
|
204800
204913
|
const out2 = resolve64(str3(flags.out) ?? join79(dir, ".himi", "making-of.html"));
|
|
204801
204914
|
const { html, plan } = buildReel2(dir);
|
|
204802
|
-
|
|
204915
|
+
mkdirSync40(dirname47(out2), { recursive: true });
|
|
204803
204916
|
writeFileSync34(out2, html);
|
|
204804
204917
|
const { pathToFileURL: pathToFileURL11 } = await import("node:url");
|
|
204805
204918
|
const url2 = pathToFileURL11(out2).href;
|
|
@@ -205902,7 +206015,7 @@ init_preview_surfaces();
|
|
|
205902
206015
|
init_lint_report();
|
|
205903
206016
|
import { createHash as createHash41 } from "node:crypto";
|
|
205904
206017
|
import { existsSync as existsSync90 } from "node:fs";
|
|
205905
|
-
import { join as join95, relative as
|
|
206018
|
+
import { join as join95, relative as relative21 } from "node:path";
|
|
205906
206019
|
init_owner_claim();
|
|
205907
206020
|
init_surface_lint();
|
|
205908
206021
|
init_token_lint();
|
|
@@ -205924,8 +206037,8 @@ function pushAuthHint(status, token, target, hasOwnerIssuer = true) {
|
|
|
205924
206037
|
}
|
|
205925
206038
|
async function contentVisibility(dir) {
|
|
205926
206039
|
try {
|
|
205927
|
-
const { readFileSync:
|
|
205928
|
-
const m2 = JSON.parse(
|
|
206040
|
+
const { readFileSync: readFileSync139 } = await import("node:fs");
|
|
206041
|
+
const m2 = JSON.parse(readFileSync139(join95(dir, "himalaya.content.json"), "utf8"));
|
|
205929
206042
|
if (m2.visibility === "public" || m2.visibility === "unlisted") return m2.visibility;
|
|
205930
206043
|
} catch {
|
|
205931
206044
|
}
|
|
@@ -206119,7 +206232,7 @@ async function pushCommand(ctx) {
|
|
|
206119
206232
|
}
|
|
206120
206233
|
}
|
|
206121
206234
|
const { shellQuote: shellQuote3 } = await Promise.resolve().then(() => (init_shell_quote(), shell_quote_exports));
|
|
206122
|
-
const contentRel =
|
|
206235
|
+
const contentRel = relative21(process.cwd(), dir) || ".";
|
|
206123
206236
|
const contentArg2 = shellQuote3(contentRel);
|
|
206124
206237
|
if (onlyRaw !== void 0) {
|
|
206125
206238
|
const onlyDraft = flags.draft === true;
|
|
@@ -208622,7 +208735,7 @@ async function testflightCommand(ctx) {
|
|
|
208622
208735
|
|
|
208623
208736
|
// src/commands/dist.ts
|
|
208624
208737
|
init_define_HHP_CATALOG();
|
|
208625
|
-
import { existsSync as existsSync101 } from "node:fs";
|
|
208738
|
+
import { existsSync as existsSync101, readFileSync as readFileSync118 } from "node:fs";
|
|
208626
208739
|
import { join as join107 } from "node:path";
|
|
208627
208740
|
init_wix_owner();
|
|
208628
208741
|
init_cli_shared();
|
|
@@ -208951,6 +209064,21 @@ ${label3}`);
|
|
|
208951
209064
|
}
|
|
208952
209065
|
}
|
|
208953
209066
|
}
|
|
209067
|
+
let googleServicesJson;
|
|
209068
|
+
const googleServicesPath = str3(flags["google-services"]);
|
|
209069
|
+
if (googleServicesPath) {
|
|
209070
|
+
try {
|
|
209071
|
+
googleServicesJson = readFileSync118(googleServicesPath, "utf8");
|
|
209072
|
+
} catch {
|
|
209073
|
+
print({
|
|
209074
|
+
ok: false,
|
|
209075
|
+
error: "google_services_unreadable",
|
|
209076
|
+
code: "google_services_unreadable",
|
|
209077
|
+
message: `could not read ${googleServicesPath}`
|
|
209078
|
+
});
|
|
209079
|
+
return 1;
|
|
209080
|
+
}
|
|
209081
|
+
}
|
|
208954
209082
|
let wixAuthorization;
|
|
208955
209083
|
const testflight = str3(flags.destination) === "testflight";
|
|
208956
209084
|
const customerTestflight = str3(flags.signing)?.trim().toLowerCase() === "byo" && testflight;
|
|
@@ -208966,7 +209094,7 @@ ${label3}`);
|
|
|
208966
209094
|
});
|
|
208967
209095
|
return 1;
|
|
208968
209096
|
}
|
|
208969
|
-
} else if (flags.aab === true || testflight && app !== "himi-player") {
|
|
209097
|
+
} else if (flags.aab === true && !["owner", "unsigned"].includes(str3(flags["android-signing"])?.trim().toLowerCase() ?? "") || testflight && app !== "himi-player") {
|
|
208970
209098
|
try {
|
|
208971
209099
|
c2.assertWixAuthorizationTarget();
|
|
208972
209100
|
wixAuthorization = await accountToken();
|
|
@@ -209020,6 +209148,9 @@ ${label3}`);
|
|
|
209020
209148
|
// A Play bundle instead of an APK. The plane validates it (Android only, link destination,
|
|
209021
209149
|
// a stable key) so every caller of the route gets the same refusal.
|
|
209022
209150
|
...flags.aab === true ? { androidFormat: "aab" } : {},
|
|
209151
|
+
// An owner bundle (--android-signing owner): the plane leaves it unsigned, under this name.
|
|
209152
|
+
...str3(flags["package-name"]) ? { androidPackageName: str3(flags["package-name"]) } : {},
|
|
209153
|
+
...googleServicesJson !== void 0 ? { googleServicesJson } : {},
|
|
209023
209154
|
// The App name and icon (a Wix Media file) a Containers app's store build ships under, in place
|
|
209024
209155
|
// of the release's; a store build needs both. Sent as typed, so the plane gives the refusals.
|
|
209025
209156
|
...str3(flags["app-name"]) !== void 0 ? { appName: str3(flags["app-name"]) } : {},
|
|
@@ -209106,7 +209237,7 @@ ${label3}`);
|
|
|
209106
209237
|
const installUrl = rec.platform === "ios" ? artifact?.installPageUrl : artifact?.downloadUrl ?? artifact?.installLink;
|
|
209107
209238
|
const handoff = rec.customerAppStore;
|
|
209108
209239
|
const handoffText = typeof handoff?.status === "string" ? ` testflight ${handoff.status}${handoff.error ? ` (${handoff.error})` : ""}` : "";
|
|
209109
|
-
io2.log(` ${rec.platform} ${rec.status}${handoffText}${installUrl ? isAab ? ` .aab for Google Play (not installable) \u2192 ${installUrl}` : ` install \u2192 ${installUrl}` : ""}`);
|
|
209240
|
+
io2.log(` ${rec.platform} ${rec.status}${handoffText}${installUrl ? isAab ? ` .aab for Google Play (${rec.ownerBundle ? "UNSIGNED: sign it before uploading" : "not installable"}) \u2192 ${installUrl}` : ` install \u2192 ${installUrl}` : ""}`);
|
|
209110
209241
|
if (isAab && artifact?.apk?.downloadUrl) io2.log(` ${rec.platform} install APK (same build, QA key) \u2192 ${artifact.apk.downloadUrl}`);
|
|
209111
209242
|
if (artifact?.caveat) io2.log(` \u26A0 ${artifact.caveat}`);
|
|
209112
209243
|
}
|
|
@@ -209128,7 +209259,7 @@ ${label3}`);
|
|
|
209128
209259
|
// src/commands/login.ts
|
|
209129
209260
|
init_define_HHP_CATALOG();
|
|
209130
209261
|
init_config();
|
|
209131
|
-
import { readFileSync as
|
|
209262
|
+
import { readFileSync as readFileSync119 } from "node:fs";
|
|
209132
209263
|
init_browser_login();
|
|
209133
209264
|
init_wix_owner();
|
|
209134
209265
|
init_owner_claim();
|
|
@@ -209349,7 +209480,7 @@ async function loginCommand(ctx) {
|
|
|
209349
209480
|
const dpxPath = dpxSessionTokenPath();
|
|
209350
209481
|
let dpx;
|
|
209351
209482
|
try {
|
|
209352
|
-
dpx =
|
|
209483
|
+
dpx = readFileSync119(dpxPath, "utf8").trim();
|
|
209353
209484
|
} catch {
|
|
209354
209485
|
io2.error(JSON.stringify({ error: `no dpx session at ${dpxPath} \u2014 run \`dpx auth login\` then \`dpx auth token > ${dpxPath}\` (dpx 2.x keeps its own state in ~/.dpx/auth.json and does NOT write the legacy session file), or omit --dpx` }));
|
|
209355
209486
|
return 1;
|
|
@@ -210219,7 +210350,7 @@ async function guideCommand(ctx) {
|
|
|
210219
210350
|
|
|
210220
210351
|
// src/commands/secrets.ts
|
|
210221
210352
|
init_define_HHP_CATALOG();
|
|
210222
|
-
import { readFileSync as
|
|
210353
|
+
import { readFileSync as readFileSync121 } from "node:fs";
|
|
210223
210354
|
init_cli_shared();
|
|
210224
210355
|
async function secretsCommand(ctx) {
|
|
210225
210356
|
const { io: io2, pos, flags } = ctx;
|
|
@@ -210240,7 +210371,7 @@ async function secretsCommand(ctx) {
|
|
|
210240
210371
|
const path2 = dpxSessionTokenPath();
|
|
210241
210372
|
let raw;
|
|
210242
210373
|
try {
|
|
210243
|
-
raw =
|
|
210374
|
+
raw = readFileSync121(path2, "utf8");
|
|
210244
210375
|
} catch {
|
|
210245
210376
|
io2.error(JSON.stringify({ error: `no DPX BO session at ${path2}` }));
|
|
210246
210377
|
return 1;
|
|
@@ -210263,7 +210394,7 @@ init_schema2();
|
|
|
210263
210394
|
init_define_HHP_CATALOG();
|
|
210264
210395
|
init_cms_schema();
|
|
210265
210396
|
init_wix_owner();
|
|
210266
|
-
import { existsSync as existsSync103, readFileSync as
|
|
210397
|
+
import { existsSync as existsSync103, readFileSync as readFileSync122, writeFileSync as writeFileSync42 } from "node:fs";
|
|
210267
210398
|
import { join as join110 } from "node:path";
|
|
210268
210399
|
var FOREIGN_DETAIL_LIMIT = 25;
|
|
210269
210400
|
var MAX_COLLECTION_PAGES = 40;
|
|
@@ -210788,7 +210919,7 @@ function readSeedFile(dir) {
|
|
|
210788
210919
|
if (!existsSync103(file2)) return {};
|
|
210789
210920
|
let parsed;
|
|
210790
210921
|
try {
|
|
210791
|
-
parsed = JSON.parse(
|
|
210922
|
+
parsed = JSON.parse(readFileSync122(file2, "utf8"));
|
|
210792
210923
|
} catch (e2) {
|
|
210793
210924
|
throw new Error(`cms-seed.json is not valid JSON (${e2.message}). Fix or delete it.`);
|
|
210794
210925
|
}
|
|
@@ -210850,7 +210981,7 @@ async function writeSeedRows(opts) {
|
|
|
210850
210981
|
if (existsSync103(file2)) {
|
|
210851
210982
|
let parsed;
|
|
210852
210983
|
try {
|
|
210853
|
-
parsed = JSON.parse(
|
|
210984
|
+
parsed = JSON.parse(readFileSync122(file2, "utf8"));
|
|
210854
210985
|
} catch (e2) {
|
|
210855
210986
|
throw new Error(
|
|
210856
210987
|
`cms-seed.json is not valid JSON (${e2.message}). Refusing to regenerate, because overwriting it would discard the rows already in it. Fix the JSON, or delete the file if you want a fresh set.`
|
|
@@ -211176,10 +211307,10 @@ import {
|
|
|
211176
211307
|
constants as constants8,
|
|
211177
211308
|
existsSync as existsSync105,
|
|
211178
211309
|
fstatSync as fstatSync2,
|
|
211179
|
-
lstatSync as
|
|
211180
|
-
mkdirSync as
|
|
211310
|
+
lstatSync as lstatSync27,
|
|
211311
|
+
mkdirSync as mkdirSync47,
|
|
211181
211312
|
openSync as openSync7,
|
|
211182
|
-
readFileSync as
|
|
211313
|
+
readFileSync as readFileSync125,
|
|
211183
211314
|
readdirSync as readdirSync44,
|
|
211184
211315
|
realpathSync as realpathSync16,
|
|
211185
211316
|
renameSync as renameSync17,
|
|
@@ -211187,20 +211318,20 @@ import {
|
|
|
211187
211318
|
statSync as statSync30,
|
|
211188
211319
|
writeFileSync as writeFileSync45
|
|
211189
211320
|
} from "node:fs";
|
|
211190
|
-
import { basename as basename28, dirname as dirname59, join as join114, relative as
|
|
211321
|
+
import { basename as basename28, dirname as dirname59, join as join114, relative as relative25, resolve as resolve81 } from "node:path";
|
|
211191
211322
|
var L10N_USAGE = "usage: himi l10n import --format oneapp <dir> (--app <slug> | --content <app dir>) [--locales en,he] [--source en] [--overwrite] [--json]";
|
|
211192
211323
|
var MESSAGES_FILE = /^messages_(.+)\.json$/;
|
|
211193
211324
|
var UnsafePath = class extends Error {
|
|
211194
211325
|
};
|
|
211195
211326
|
var isUnsafe2 = (e2) => e2 instanceof UnsafePath || e2?.code === "ELOOP";
|
|
211196
211327
|
function readRegularFile(path2) {
|
|
211197
|
-
const st2 =
|
|
211328
|
+
const st2 = lstatSync27(path2);
|
|
211198
211329
|
if (st2.isSymbolicLink()) throw new UnsafePath(`${path2} is a symbolic link`);
|
|
211199
211330
|
if (!st2.isFile()) throw new Error(`${path2} is not a regular file`);
|
|
211200
211331
|
const fd = openSync7(path2, constants8.O_RDONLY | (constants8.O_NOFOLLOW ?? 0));
|
|
211201
211332
|
try {
|
|
211202
211333
|
if (!fstatSync2(fd).isFile()) throw new Error(`${path2} is not a regular file`);
|
|
211203
|
-
return
|
|
211334
|
+
return readFileSync125(fd);
|
|
211204
211335
|
} finally {
|
|
211205
211336
|
closeSync8(fd);
|
|
211206
211337
|
}
|
|
@@ -211209,7 +211340,7 @@ function unsafeDestination(appDir3, tags) {
|
|
|
211209
211340
|
const l10nDir = join114(appDir3, "l10n");
|
|
211210
211341
|
for (const path2 of [l10nDir, ...tags.map((t2) => join114(l10nDir, `${t2}.json`))]) {
|
|
211211
211342
|
try {
|
|
211212
|
-
if (
|
|
211343
|
+
if (lstatSync27(path2).isSymbolicLink()) return `${relative25(process.cwd(), path2)} is a symbolic link`;
|
|
211213
211344
|
} catch (e2) {
|
|
211214
211345
|
const code = e2.code;
|
|
211215
211346
|
if (code !== "ENOENT" && code !== "ENOTDIR") throw e2;
|
|
@@ -211314,27 +211445,27 @@ async function l10nCommand(ctx) {
|
|
|
211314
211445
|
buf = readRegularFile(path2);
|
|
211315
211446
|
} catch (e2) {
|
|
211316
211447
|
if (isUnsafe2(e2)) {
|
|
211317
|
-
return fail7("unsafe_path", { error: `${
|
|
211448
|
+
return fail7("unsafe_path", { error: `${relative25(process.cwd(), path2)} is a symbolic link \u2014 the import does not follow links in the messages directory`, file: path2, hint: "copy the real file into the directory, or point <dir> at where the files actually live" }, 1);
|
|
211318
211449
|
}
|
|
211319
|
-
return fail7("messages_unreadable", { error: `${
|
|
211450
|
+
return fail7("messages_unreadable", { error: `${relative25(process.cwd(), path2)}: ${e2.message}`, file: path2 }, 1);
|
|
211320
211451
|
}
|
|
211321
211452
|
const text13 = buf.toString("utf8");
|
|
211322
211453
|
const utf16Bom = buf.length >= 2 && (buf[0] === 255 && buf[1] === 254 || buf[0] === 254 && buf[1] === 255);
|
|
211323
211454
|
if (utf16Bom || buf.includes(0) || Buffer.compare(Buffer.from(text13, "utf8"), buf) !== 0) {
|
|
211324
|
-
return fail7("messages_not_utf8", { error: `${
|
|
211455
|
+
return fail7("messages_not_utf8", { error: `${relative25(process.cwd(), path2)} is not valid UTF-8`, file: path2, hint: "re-encode the file as UTF-8 (UTF-16 exports are the usual cause)" }, 1);
|
|
211325
211456
|
}
|
|
211326
211457
|
let parsed;
|
|
211327
211458
|
try {
|
|
211328
211459
|
parsed = JSON.parse(text13.replace(/^\uFEFF/, ""));
|
|
211329
211460
|
} catch (e2) {
|
|
211330
|
-
return fail7("messages_unreadable", { error: `${
|
|
211461
|
+
return fail7("messages_unreadable", { error: `${relative25(process.cwd(), path2)}: ${e2.message}`, file: path2 }, 1);
|
|
211331
211462
|
}
|
|
211332
211463
|
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
211333
|
-
return fail7("messages_unreadable", { error: `${
|
|
211464
|
+
return fail7("messages_unreadable", { error: `${relative25(process.cwd(), path2)} is not an object of key \u2192 message`, file: path2 }, 1);
|
|
211334
211465
|
}
|
|
211335
211466
|
const bad2 = Object.entries(parsed).filter(([, v2]) => typeof v2 !== "string").map(([k2]) => k2);
|
|
211336
211467
|
if (bad2.length > 0) {
|
|
211337
|
-
return fail7("messages_unreadable", { error: `${
|
|
211468
|
+
return fail7("messages_unreadable", { error: `${relative25(process.cwd(), path2)} has non-string values`, file: path2, keys: bad2.slice(0, 5) }, 1);
|
|
211338
211469
|
}
|
|
211339
211470
|
files[tag] = parsed;
|
|
211340
211471
|
}
|
|
@@ -211344,7 +211475,7 @@ async function l10nCommand(ctx) {
|
|
|
211344
211475
|
try {
|
|
211345
211476
|
unsafe2 = unsafeDestination(appDir3, requested);
|
|
211346
211477
|
} catch (e2) {
|
|
211347
|
-
return fail7("catalog_write_failed", { error: `cannot inspect ${
|
|
211478
|
+
return fail7("catalog_write_failed", { error: `cannot inspect ${relative25(process.cwd(), join114(appDir3, "l10n"))}: ${e2.message}`, written: [] }, 1);
|
|
211348
211479
|
}
|
|
211349
211480
|
if (unsafe2 !== void 0) {
|
|
211350
211481
|
return fail7("unsafe_path", { error: `${unsafe2} \u2014 the import does not read or write through links`, hint: "replace the link with a real directory/file inside the app, then re-run" }, 1);
|
|
@@ -211360,7 +211491,7 @@ async function l10nCommand(ctx) {
|
|
|
211360
211491
|
existing[tag] = parsed;
|
|
211361
211492
|
} catch (e2) {
|
|
211362
211493
|
return fail7("catalog_unreadable", {
|
|
211363
|
-
error: `existing catalog ${
|
|
211494
|
+
error: `existing catalog ${relative25(process.cwd(), path2)} cannot be parsed \u2014 refusing to overwrite it`,
|
|
211364
211495
|
file: path2,
|
|
211365
211496
|
cause: e2.message
|
|
211366
211497
|
}, 1);
|
|
@@ -211419,7 +211550,7 @@ async function l10nCommand(ctx) {
|
|
|
211419
211550
|
}
|
|
211420
211551
|
const written = [];
|
|
211421
211552
|
try {
|
|
211422
|
-
|
|
211553
|
+
mkdirSync47(join114(appDir3, "l10n"), { recursive: true });
|
|
211423
211554
|
const swapped = unsafeDestination(appDir3, requested);
|
|
211424
211555
|
const l10nReal = realpathSync16(join114(appDir3, "l10n"));
|
|
211425
211556
|
if (swapped !== void 0 || l10nReal !== join114(realpathSync16(appDir3), "l10n")) {
|
|
@@ -211428,7 +211559,7 @@ async function l10nCommand(ctx) {
|
|
|
211428
211559
|
for (const tag of requested) {
|
|
211429
211560
|
const path2 = join114(appDir3, "l10n", `${tag}.json`);
|
|
211430
211561
|
writeCatalog(path2, JSON.stringify(catalogs[tag], null, 2) + "\n");
|
|
211431
|
-
written.push({ tag, path:
|
|
211562
|
+
written.push({ tag, path: relative25(process.cwd(), path2), count: Object.keys(catalogs[tag].messages).length });
|
|
211432
211563
|
}
|
|
211433
211564
|
} catch (e2) {
|
|
211434
211565
|
if (isUnsafe2(e2)) return fail7("unsafe_path", { error: `${e2.message} \u2014 nothing more was written`, written }, 1);
|