@wix/himalaya-cli 0.1318.0 → 0.1320.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/sdk-types/src/capabilities.generated.d.ts +2 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/theme/src/index.d.ts +21 -0
- 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/brand-color-math.d.ts +98 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/define-app.d.ts +1 -1
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +9 -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/brand-color-math.mjs +183 -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/dist/theme.mjs +189 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/package.json +8 -0
- package/dist/cli.mjs +574 -404
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/app-config.md +1 -1
- package/guides/capabilities.md +17 -0
- package/guides/designing-himi-screens.md +2 -0
- package/guides/importable-sdks.md +1 -0
- package/guides/qa-builds.md +34 -8
- package/guides/sdk-reference.json +39 -2
- package/guides/web-page-sdk-reference.md +1 -0
- package/package.json +2 -2
- package/templates/beauty-salon-owner/config.ts +1 -1
- package/templates/beauty-salon-owner/dev/index.ts +125 -24
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/beauty-salon-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/beauty-salon-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/brandy/README.md +5 -3
- package/templates/community-club-owner/config.ts +1 -1
- package/templates/community-club-owner/dev/index.ts +125 -24
- package/templates/community-club-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/community-club-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/community-club-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/events-meetups-owner/config.ts +1 -1
- package/templates/events-meetups-owner/dev/index.ts +125 -24
- package/templates/events-meetups-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/events-meetups-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/events-meetups-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/gym-fitness-owner/config.ts +1 -1
- package/templates/gym-fitness-owner/dev/index.ts +125 -24
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/gym-fitness-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/gym-fitness-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/nonprofit-cause-owner/config.ts +1 -1
- package/templates/nonprofit-cause-owner/dev/index.ts +125 -24
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/nonprofit-cause-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/nonprofit-cause-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/owner-lite/config.ts +1 -1
- package/templates/owner-lite/dev/index.ts +125 -24
- package/templates/owner-lite/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/owner-lite/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/owner-lite/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/podcast-creator-owner/config.ts +1 -1
- package/templates/podcast-creator-owner/dev/index.ts +125 -24
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/podcast-creator-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/podcast-creator-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/portfolio-creative-owner/config.ts +1 -1
- package/templates/portfolio-creative-owner/dev/index.ts +125 -24
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/portfolio-creative-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/portfolio-creative-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/restaurant-owner/config.ts +1 -1
- package/templates/restaurant-owner/dev/index.ts +125 -24
- package/templates/restaurant-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/restaurant-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/restaurant-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/retail-store-owner/config.ts +1 -1
- package/templates/retail-store-owner/dev/index.ts +125 -24
- package/templates/retail-store-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/retail-store-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/retail-store-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
- package/templates/yoga-studio-owner/config.ts +1 -1
- package/templates/yoga-studio-owner/dev/index.ts +125 -24
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-attachments.ts +41 -2
- package/templates/yoga-studio-owner/tier5-src/_shared/aria-chat.ts +59 -31
- package/templates/yoga-studio-owner/tier5-src/himi-owner-lite-aria/index.ts +154 -13
package/dist/cli.mjs
CHANGED
|
@@ -5031,6 +5031,10 @@ var init_build_lib = __esm({
|
|
|
5031
5031
|
"@himalaya/share": resolve8(REPO_ROOT4, "core/sdk/share/src/index.ts"),
|
|
5032
5032
|
"@himalaya/open-url": resolve8(REPO_ROOT4, "core/sdk/open-url/src/index.ts"),
|
|
5033
5033
|
"@himalaya/clipboard": resolve8(REPO_ROOT4, "core/sdk/clipboard/src/index.ts"),
|
|
5034
|
+
// RFC 0070 §3 — runtime brand overlay; and the brand colour rules it derives with, so a worker
|
|
5035
|
+
// can import the ONE implementation (filesystem-free, pinned by a test).
|
|
5036
|
+
"@himalaya/theme": resolve8(REPO_ROOT4, "core/sdk/theme/src/index.ts"),
|
|
5037
|
+
"@himalaya/core/brand-color-math": resolve8(REPO_ROOT4, "core/ts/src/brand-color-math.ts"),
|
|
5034
5038
|
"@himalaya/photos": resolve8(REPO_ROOT4, "core/sdk/photos/src/index.ts"),
|
|
5035
5039
|
// Credential-free raw binary PUT to a pre-signed upload URL (RFC 0002 capability).
|
|
5036
5040
|
"@himalaya/presigned-upload": resolve8(REPO_ROOT4, "core/sdk/presigned-upload/src/index.ts"),
|
|
@@ -5571,8 +5575,8 @@ var init_catalog_v2 = __esm({
|
|
|
5571
5575
|
"../html-to-t5/catalog.v2.json"() {
|
|
5572
5576
|
catalog_v2_default = {
|
|
5573
5577
|
encoding: "gzip-base64",
|
|
5574
|
-
sha256: "
|
|
5575
|
-
data: "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"
|
|
5578
|
+
sha256: "b746ae7d0ac398820517a135cfbb704eb89a7f866295a30cafd3a9a3eef54038",
|
|
5579
|
+
data: "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"
|
|
5576
5580
|
};
|
|
5577
5581
|
}
|
|
5578
5582
|
});
|
|
@@ -13418,6 +13422,7 @@ var init_player_host_manifest = __esm({
|
|
|
13418
13422
|
"speaker_diarization",
|
|
13419
13423
|
"speech",
|
|
13420
13424
|
"stream",
|
|
13425
|
+
"theme",
|
|
13421
13426
|
"ui",
|
|
13422
13427
|
"wix_api",
|
|
13423
13428
|
"wix_cashier",
|
|
@@ -16624,7 +16629,6 @@ function resolveIdiom(tokens2, ctx = {}) {
|
|
|
16624
16629
|
var IDIOM_CONTEXTS, UNSAFE_KEYS;
|
|
16625
16630
|
var init_idiom = __esm({
|
|
16626
16631
|
"../../core/ts/src/idiom.ts"() {
|
|
16627
|
-
"use strict";
|
|
16628
16632
|
IDIOM_CONTEXTS = {
|
|
16629
16633
|
ios: { native: ["ios"] },
|
|
16630
16634
|
android: { native: ["material"] },
|
|
@@ -20700,6 +20704,14 @@ var init_native_requirements = __esm({
|
|
|
20700
20704
|
]
|
|
20701
20705
|
}
|
|
20702
20706
|
},
|
|
20707
|
+
theme: {
|
|
20708
|
+
// RFC 0070 §3 — an in-memory token overlay in the shell. No OS permission, no framework.
|
|
20709
|
+
privacy: {
|
|
20710
|
+
reviewNotes: [
|
|
20711
|
+
"theme: recolours the app's accent tokens in memory for the hosted site \u2014 an on-device UI operation only. Nothing collected or transmitted; no usage string / required-reason API."
|
|
20712
|
+
]
|
|
20713
|
+
}
|
|
20714
|
+
},
|
|
20703
20715
|
presigned_upload: {
|
|
20704
20716
|
// No OS permission and no new native dependency: an HTTPS request on a
|
|
20705
20717
|
// credential-free URLSession / HttpURLConnection. INTERNET is already implied by
|
|
@@ -20839,15 +20851,19 @@ var init_native_requirements = __esm({
|
|
|
20839
20851
|
// WebRTC itself needs no permission, and Stage 1 is audio-only on purpose so an
|
|
20840
20852
|
// audio-only calling app never ships NSCameraUsageDescription (a real App Review
|
|
20841
20853
|
// liability). Video is the `calls_video` superset id, Stage 3.
|
|
20842
|
-
|
|
20854
|
+
// The WebRTC engine is the opt-in HimalayaCoreCalls / :himalaya-core-calls module (RFC 0044
|
|
20855
|
+
// Phase 2): linked only when the build set has `calls`, so no other binary carries libwebrtc.
|
|
20856
|
+
// Unlinked, the core's verbs answer unavailable / media_engine_unlinked.
|
|
20857
|
+
ios: {
|
|
20858
|
+
usageStrings: [{ key: "NSMicrophoneUsageDescription", suggested: "Talk to people with your microphone during a call." }],
|
|
20859
|
+
spmProducts: ["HimalayaCoreCalls"]
|
|
20860
|
+
},
|
|
20843
20861
|
macos: {
|
|
20844
20862
|
usageStrings: [{ key: "NSMicrophoneUsageDescription", suggested: "Talk to people with your microphone during a call." }],
|
|
20845
20863
|
entitlements: { "com.apple.security.device.audio-input": true }
|
|
20846
20864
|
},
|
|
20847
|
-
// The
|
|
20848
|
-
|
|
20849
|
-
// engine, but an app declaring calls must be able to request RECORD_AUDIO.
|
|
20850
|
-
android: { permissions: ["android.permission.RECORD_AUDIO"] },
|
|
20865
|
+
// The Android WebRTC arm opens the same microphone surface as iOS.
|
|
20866
|
+
android: { permissions: ["android.permission.RECORD_AUDIO"], gradleDeps: [":himalaya-core-calls"] },
|
|
20851
20867
|
privacy: {
|
|
20852
20868
|
reviewNotes: [
|
|
20853
20869
|
"calls: 1:1 real-time audio over WebRTC. The microphone stream is peer-to-peer and is NOT recorded or uploaded by the capability \u2014 it is encoded and sent directly to the other participant (DTLS-SRTP).",
|
|
@@ -21157,9 +21173,11 @@ var init_native_requirements = __esm({
|
|
|
21157
21173
|
base44: {
|
|
21158
21174
|
// A Base44 app's backend over HTTPS (@himalaya/base44) — no OS permission; INTERNET is a
|
|
21159
21175
|
// base manifest permission. The access token is stored in the Keychain / encrypted
|
|
21160
|
-
// prefs, which needs no entitlement. The
|
|
21161
|
-
//
|
|
21162
|
-
//
|
|
21176
|
+
// prefs, which needs no entitlement. The backend is the opt-in HimalayaCoreBase44 /
|
|
21177
|
+
// :core-runtime-base44 module (RFC 0044 Phase 2), linked only when the build set has `base44`;
|
|
21178
|
+
// the shell binds its own Base44 app id at boot (`Base44Capability.bind`).
|
|
21179
|
+
ios: { spmProducts: ["HimalayaCoreBase44"] },
|
|
21180
|
+
android: { gradleDeps: [":core-runtime-base44"] },
|
|
21163
21181
|
privacy: {
|
|
21164
21182
|
collectedDataTypes: [
|
|
21165
21183
|
{ type: "NSPrivacyCollectedDataTypeUserID", linked: true, tracking: false, purposes: [APP_FUNCTIONALITY] },
|
|
@@ -21294,13 +21312,11 @@ var init_native_requirements = __esm({
|
|
|
21294
21312
|
// OpenGL ES / WebGL, all of which are permissionless, and INTERNET is already a base
|
|
21295
21313
|
// manifest permission (not per-capability), so OTA pack download adds nothing either.
|
|
21296
21314
|
//
|
|
21297
|
-
//
|
|
21298
|
-
//
|
|
21299
|
-
//
|
|
21300
|
-
|
|
21301
|
-
|
|
21302
|
-
// the shells drop their hand-wiring would link the engine twice. Moving godot onto the
|
|
21303
|
-
// generic module markers is the Phase 2 follow-up for the hand-wired modules.
|
|
21315
|
+
// The engine is the opt-in HimalayaCoreGodot / :core-runtime-godot module (RFC 0044 Phase 2) —
|
|
21316
|
+
// the largest native footprint in the catalog (~72 MB iOS bundle / ~68 MB Android installed),
|
|
21317
|
+
// linked only when the build set has `godot`.
|
|
21318
|
+
ios: { spmProducts: ["HimalayaCoreGodot"] },
|
|
21319
|
+
android: { gradleDeps: [":core-runtime-godot"] },
|
|
21304
21320
|
privacy: {
|
|
21305
21321
|
reviewNotes: [
|
|
21306
21322
|
"godot: the game engine runs ENTIRELY on device and collects nothing \u2014 no identifiers, no analytics, no network egress of its own. There is therefore no collected-data type or required-reason API to declare. What the app itself reports about gameplay (score, progression) travels through the app's ordinary telemetry and is declared there, not here.",
|
|
@@ -21463,6 +21479,7 @@ var init_builtins = __esm({
|
|
|
21463
21479
|
"speech",
|
|
21464
21480
|
"system_intents",
|
|
21465
21481
|
"tasks",
|
|
21482
|
+
"theme",
|
|
21466
21483
|
"wix_cashier",
|
|
21467
21484
|
"wix_platform"
|
|
21468
21485
|
];
|
|
@@ -21491,9 +21508,26 @@ function capabilitiesOfModule(module) {
|
|
|
21491
21508
|
}
|
|
21492
21509
|
return { ios: ios.sort(), android: android.sort() };
|
|
21493
21510
|
}
|
|
21494
|
-
function
|
|
21511
|
+
function distributionOptIns(distributionJson) {
|
|
21512
|
+
if (!distributionJson) return [];
|
|
21513
|
+
let d2;
|
|
21514
|
+
try {
|
|
21515
|
+
d2 = JSON.parse(distributionJson);
|
|
21516
|
+
} catch {
|
|
21517
|
+
return [];
|
|
21518
|
+
}
|
|
21519
|
+
const at2 = (path2) => path2.split(".").reduce((o2, k2) => o2 && typeof o2 === "object" ? o2[k2] : void 0, d2);
|
|
21520
|
+
return NATIVE_MODULES.filter((m2) => m2.distributionOptIn && at2(m2.distributionOptIn) === true).map((m2) => m2.id).sort();
|
|
21521
|
+
}
|
|
21522
|
+
function modulesFor(buildSet2, optIns = []) {
|
|
21495
21523
|
const spm = /* @__PURE__ */ new Set();
|
|
21496
21524
|
const gradle = /* @__PURE__ */ new Set();
|
|
21525
|
+
for (const id of optIns) {
|
|
21526
|
+
const m2 = NATIVE_MODULES.find((x2) => x2.id === id);
|
|
21527
|
+
if (!m2?.distributionOptIn) throw new Error(`capability-catalog: ${id} is not a module an app opts into outside its build set`);
|
|
21528
|
+
if (m2.ios) spm.add(m2.ios.product);
|
|
21529
|
+
if (m2.android) gradle.add(m2.android.project);
|
|
21530
|
+
}
|
|
21497
21531
|
for (const raw of buildSet2) {
|
|
21498
21532
|
const req = CAPABILITY_NATIVE[catalogKey(raw)];
|
|
21499
21533
|
for (const p2 of req?.ios?.spmProducts ?? []) {
|
|
@@ -21535,7 +21569,7 @@ function componentModuleRequirements(components2, have, map = COMPONENT_MODULES,
|
|
|
21535
21569
|
}
|
|
21536
21570
|
return [...out2].sort();
|
|
21537
21571
|
}
|
|
21538
|
-
var NATIVE_MODULES,
|
|
21572
|
+
var NATIVE_MODULES, COMPONENT_MODULES;
|
|
21539
21573
|
var init_modules = __esm({
|
|
21540
21574
|
"../../core/sdk/capability-catalog/src/modules.ts"() {
|
|
21541
21575
|
init_native_requirements();
|
|
@@ -21561,6 +21595,18 @@ var init_modules = __esm({
|
|
|
21561
21595
|
id: "audio",
|
|
21562
21596
|
ios: { product: "HimalayaCoreAudio", path: "core/runtime/ios/HimalayaCoreAudio", macos: true }
|
|
21563
21597
|
},
|
|
21598
|
+
{
|
|
21599
|
+
// A Base44 app backend (base44/swift-sdk on Apple; a REST client on Android). The shell binds
|
|
21600
|
+
// its own Base44 app id through the core (`Base44Capability.bind`); the module only supplies
|
|
21601
|
+
// the backend, so the binding and the link are independent and order-free.
|
|
21602
|
+
id: "base44",
|
|
21603
|
+
ios: { product: "HimalayaCoreBase44", path: "core/runtime/ios/HimalayaCoreBase44", macos: true },
|
|
21604
|
+
android: {
|
|
21605
|
+
project: ":core-runtime-base44",
|
|
21606
|
+
dir: "core/runtime/android/io/himalaya/base44",
|
|
21607
|
+
installer: "io.himalaya.base44.Base44Sdk"
|
|
21608
|
+
}
|
|
21609
|
+
},
|
|
21564
21610
|
{
|
|
21565
21611
|
// LocalAuthentication / androidx.biometric (biometrics). The same backend answers the native
|
|
21566
21612
|
// login gate's BiometricAuthenticator, which keeps a core seam and degrades to no biometric
|
|
@@ -21586,6 +21632,16 @@ var init_modules = __esm({
|
|
|
21586
21632
|
installer: "io.himalaya.calendar.CalendarStore"
|
|
21587
21633
|
}
|
|
21588
21634
|
},
|
|
21635
|
+
{
|
|
21636
|
+
// The WebRTC media engine for `calls` (stasel/WebRTC on Apple, webrtc-sdk on Android).
|
|
21637
|
+
id: "calls",
|
|
21638
|
+
ios: { product: "HimalayaCoreCalls", path: "core/runtime/ios/HimalayaCoreCalls", macos: true },
|
|
21639
|
+
android: {
|
|
21640
|
+
project: ":himalaya-core-calls",
|
|
21641
|
+
dir: "core/runtime/android/io/himalaya/core-calls",
|
|
21642
|
+
installer: "io.himalaya.core.calls.HimalayaCoreCalls"
|
|
21643
|
+
}
|
|
21644
|
+
},
|
|
21589
21645
|
{
|
|
21590
21646
|
// Contacts / ContactsUI (contacts) / ContactsContract. macOS links it too (AppKit picker).
|
|
21591
21647
|
id: "contacts",
|
|
@@ -21596,6 +21652,16 @@ var init_modules = __esm({
|
|
|
21596
21652
|
installer: "io.himalaya.contacts.ContactsStore"
|
|
21597
21653
|
}
|
|
21598
21654
|
},
|
|
21655
|
+
{
|
|
21656
|
+
// The Godot engine behind the core's GameSurfaceRegistry (SwiftGodotKit / org.godotengine).
|
|
21657
|
+
id: "godot",
|
|
21658
|
+
ios: { product: "HimalayaCoreGodot", path: "core/runtime/ios/HimalayaCoreGodot", macos: true },
|
|
21659
|
+
android: {
|
|
21660
|
+
project: ":core-runtime-godot",
|
|
21661
|
+
dir: "core/runtime/android/io/himalaya/godot",
|
|
21662
|
+
installer: "io.himalaya.godot.GodotModule"
|
|
21663
|
+
}
|
|
21664
|
+
},
|
|
21599
21665
|
{
|
|
21600
21666
|
id: "health",
|
|
21601
21667
|
// macOS links it too and installs the honest UnavailableHealthBackend (no Health store on a Mac).
|
|
@@ -21682,6 +21748,19 @@ var init_modules = __esm({
|
|
|
21682
21748
|
installer: "io.himalaya.push.FirebasePush"
|
|
21683
21749
|
}
|
|
21684
21750
|
},
|
|
21751
|
+
{
|
|
21752
|
+
// Crash / error monitoring (sentry-cocoa / sentry-android) behind the core telemetry sink
|
|
21753
|
+
// builder's Sentry seam. Not a capability — no worker verb reaches it — so an app opts in
|
|
21754
|
+
// through distribution.json `monitoring.sentry`, not a build set.
|
|
21755
|
+
id: "sentry",
|
|
21756
|
+
ios: { product: "HimalayaCoreSentry", path: "core/runtime/ios/HimalayaCoreSentry", macos: true },
|
|
21757
|
+
android: {
|
|
21758
|
+
project: ":core-runtime-sentry",
|
|
21759
|
+
dir: "core/runtime/android/io/himalaya/sentry",
|
|
21760
|
+
installer: "io.himalaya.sentry.SentryModule"
|
|
21761
|
+
},
|
|
21762
|
+
distributionOptIn: "monitoring.sentry"
|
|
21763
|
+
},
|
|
21685
21764
|
{
|
|
21686
21765
|
// The Speech-framework engine (speech): SFSpeechRecognizer over AVAudioEngine capture, and
|
|
21687
21766
|
// AVSpeechSynthesizer. Split from the `audio` recorder (RFC 0044 Phase 2 grouped them) because
|
|
@@ -21701,11 +21780,6 @@ var init_modules = __esm({
|
|
|
21701
21780
|
ios: { product: "HimalayaCoreReminders", path: "core/runtime/ios/HimalayaCoreReminders" }
|
|
21702
21781
|
}
|
|
21703
21782
|
]);
|
|
21704
|
-
HAND_WIRED_MODULES = Object.freeze({
|
|
21705
|
-
base44: "HimalayaCoreBase44 / :core-runtime-base44 SDK",
|
|
21706
|
-
calls: "HimalayaCoreCalls / :himalaya-core-calls WebRTC engine",
|
|
21707
|
-
godot: "Godot SPM product / :core-runtime-godot engine"
|
|
21708
|
-
});
|
|
21709
21783
|
COMPONENT_MODULES = Object.freeze({
|
|
21710
21784
|
Video: "media",
|
|
21711
21785
|
MediaPlayer: "media",
|
|
@@ -21780,7 +21854,7 @@ function usageStringCopyFor(permissionCopy) {
|
|
|
21780
21854
|
}
|
|
21781
21855
|
return out2;
|
|
21782
21856
|
}
|
|
21783
|
-
var BRIDGE_CAPABILITY_IDS, KNOWN_CAPABILITY_IDS, CAPABILITY_LITERAL, BRIDGE_MARKERS, NEEDS_BOOT_WIRING, NOT_DIST_ADDABLE;
|
|
21857
|
+
var BRIDGE_CAPABILITY_IDS, KNOWN_CAPABILITY_IDS, CAPABILITY_LITERAL, BRIDGE_MARKERS, NEEDS_BOOT_WIRING, AWAITING_THIRD_PARTY_SIGN_OFF, NOT_DIST_ADDABLE;
|
|
21784
21858
|
var init_known = __esm({
|
|
21785
21859
|
"../../core/sdk/capability-catalog/src/known.ts"() {
|
|
21786
21860
|
init_builtins();
|
|
@@ -21814,16 +21888,20 @@ var init_known = __esm({
|
|
|
21814
21888
|
// and a shell's Android boot passes its own name — so an added one would report the wrong app.
|
|
21815
21889
|
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",
|
|
21816
21890
|
system_intents: "needs the shell to wire a SystemIntentsHost (app identity, deep-link routing and refresh), which no extensible shell does",
|
|
21817
|
-
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"
|
|
21891
|
+
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",
|
|
21892
|
+
// Linked generically since #4066, but the module is only the backend: which Base44 app it talks
|
|
21893
|
+
// to is the shell's binding (`Base44Capability.bind`, from its contract), which a build cannot add.
|
|
21894
|
+
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",
|
|
21895
|
+
// Linked generically since #4066, but the engine draws into the shell's own GameSurface view, and
|
|
21896
|
+
// on Android the shell must pick Godot's libc++_shared over the core's (himi-game's godotStl).
|
|
21897
|
+
godot: "needs the shell's GameSurface view and, on Android, its libc++_shared pick for the engine, which a build cannot add"
|
|
21898
|
+
});
|
|
21899
|
+
AWAITING_THIRD_PARTY_SIGN_OFF = Object.freeze({
|
|
21900
|
+
calls: "links the community libwebrtc engine (HimalayaCoreCalls / :himalaya-core-calls), whose third-party sign-off for store-shipping apps is still open, so a dist build does not add it to a customer binary"
|
|
21818
21901
|
});
|
|
21819
21902
|
NOT_DIST_ADDABLE = Object.freeze({
|
|
21820
21903
|
...NEEDS_BOOT_WIRING,
|
|
21821
|
-
...
|
|
21822
|
-
Object.entries(HAND_WIRED_MODULES).map(([id, module]) => [
|
|
21823
|
-
id,
|
|
21824
|
-
`needs the opt-in ${module} linked into the shell, which is still hand-wired (RFC 0044 Phase 2 follow-up), so a dist build cannot link it`
|
|
21825
|
-
])
|
|
21826
|
-
)
|
|
21904
|
+
...AWAITING_THIRD_PARTY_SIGN_OFF
|
|
21827
21905
|
});
|
|
21828
21906
|
}
|
|
21829
21907
|
});
|
|
@@ -22954,8 +23032,11 @@ function genNativeConfig(app, opts = {}) {
|
|
|
22954
23032
|
const dist = opts.extraCapabilities?.length ? resolveDistBake(app, ownIds, opts.extraCapabilities) : void 0;
|
|
22955
23033
|
const ids = dist ? dist.build : ownIds;
|
|
22956
23034
|
const healthLinked = ids.includes("health");
|
|
22957
|
-
const
|
|
22958
|
-
const
|
|
23035
|
+
const distJsonPath = join33(appDir(app), "distribution.json");
|
|
23036
|
+
const distJsonText = existsSync33(distJsonPath) ? readFileSync32(distJsonPath, "utf8") : void 0;
|
|
23037
|
+
const optIns = distributionOptIns(distJsonText);
|
|
23038
|
+
const binaryCore = isBinaryCore(configTs, distJsonText);
|
|
23039
|
+
const modules = binaryCore ? { spm: [], gradle: [], macos: [] } : modulesFor(ids, optIns);
|
|
22959
23040
|
const healthCopy = opts.permissionCopy?.health;
|
|
22960
23041
|
const distCopy = usageStringCopyFor(opts.permissionCopy);
|
|
22961
23042
|
const withCopy = (o2) => ({ ...o2 ?? {}, infoPlistCopy: { ...o2?.infoPlistCopy ?? {}, ...distCopy } });
|
|
@@ -23075,7 +23156,7 @@ function genNativeConfig(app, opts = {}) {
|
|
|
23075
23156
|
throw new Error(`${app}: dist capabilities need the ${LABEL_ANDROID_SERVICES} markers inside <application> in ${manifestPath}`);
|
|
23076
23157
|
}
|
|
23077
23158
|
const added = modulesFor(dist.added);
|
|
23078
|
-
const ownModules = modulesFor(ownIds);
|
|
23159
|
+
const ownModules = modulesFor(ownIds, optIns);
|
|
23079
23160
|
const addsSpm = added.spm.some((p2) => !ownModules.spm.includes(p2));
|
|
23080
23161
|
const addsGradle = added.gradle.some((p2) => !ownModules.gradle.includes(p2));
|
|
23081
23162
|
if (addsSpm || addsGradle) {
|
|
@@ -27291,6 +27372,7 @@ var init_capabilities_generated = __esm({
|
|
|
27291
27372
|
"speech": ["availability", "recognizeOnce", "speak", "stop", "streamNext", "streamStart", "streamStop", "transcribeFile"],
|
|
27292
27373
|
"system_intents": ["donate", "refreshShortcuts"],
|
|
27293
27374
|
"tasks": ["backend", "create", "getPermissionStatus", "list", "remove", "requestPermission", "setCompleted"],
|
|
27375
|
+
"theme": ["applyOverlay", "clearOverlay", "surfaces"],
|
|
27294
27376
|
"ui": ["alert", "snackbar"],
|
|
27295
27377
|
"wix_cashier": ["isAvailable", "proceedToPayment"]
|
|
27296
27378
|
};
|
|
@@ -27334,6 +27416,7 @@ var init_capabilities_generated = __esm({
|
|
|
27334
27416
|
"speech": ["@himalaya/speech"],
|
|
27335
27417
|
"system_intents": ["@himalaya/system-intents"],
|
|
27336
27418
|
"tasks": ["@himalaya/tasks"],
|
|
27419
|
+
"theme": ["@himalaya/theme"],
|
|
27337
27420
|
"ui": ["@himalaya/ui"],
|
|
27338
27421
|
"webview": ["@himalaya/webview"],
|
|
27339
27422
|
"wix_cashier": ["@himalaya/wix-cashier"],
|
|
@@ -27379,15 +27462,15 @@ var init_shell_capabilities_generated = __esm({
|
|
|
27379
27462
|
appDir: "apps/himi-owner-lite",
|
|
27380
27463
|
shared: false,
|
|
27381
27464
|
extensible: true,
|
|
27382
|
-
built: ["app_info", "biometrics", "camera", "clipboard", "live_activity", "local_database", "open_url", "presigned_upload", "push", "secure_storage", "share", "speech", "ui"],
|
|
27383
|
-
serves: ["app_info", "biometrics", "camera", "clipboard", "live_activity", "local_database", "open_url", "presigned_upload", "push", "secure_storage", "share", "speech", "ui"]
|
|
27465
|
+
built: ["app_info", "biometrics", "camera", "clipboard", "live_activity", "local_database", "open_url", "presigned_upload", "push", "secure_storage", "share", "speech", "ui", "wix_platform"],
|
|
27466
|
+
serves: ["app_info", "biometrics", "camera", "clipboard", "live_activity", "local_database", "open_url", "presigned_upload", "push", "secure_storage", "share", "speech", "ui", "wix_platform"]
|
|
27384
27467
|
},
|
|
27385
27468
|
"player": {
|
|
27386
27469
|
appDir: "apps/himi-player",
|
|
27387
27470
|
shared: true,
|
|
27388
27471
|
extensible: false,
|
|
27389
27472
|
built: ["animation", "audio_record_background", "biometrics", "calendar", "calls", "camera", "clipboard", "contacts", "haptic", "iap", "location", "media_playback", "motion", "on_device_ai", "photos", "push", "speech"],
|
|
27390
|
-
serves: ["animation", "app_info", "audio_record", "audio_record_background", "biometrics", "browser_auth", "calendar", "calls", "camera", "clipboard", "contacts", "file_picker", "files", "haptic", "himi_apps", "iap", "keyboard", "local_database", "location", "media_playback", "motion", "on_device_ai", "open_url", "pdf", "photos", "presigned_upload", "push", "release_control", "secure_storage", "share", "speaker_diarization", "speech", "stream", "ui", "wix_api", "wix_cashier", "wix_platform"]
|
|
27473
|
+
serves: ["animation", "app_info", "audio_record", "audio_record_background", "biometrics", "browser_auth", "calendar", "calls", "camera", "clipboard", "contacts", "file_picker", "files", "haptic", "himi_apps", "iap", "keyboard", "local_database", "location", "media_playback", "motion", "on_device_ai", "open_url", "pdf", "photos", "presigned_upload", "push", "release_control", "secure_storage", "share", "speaker_diarization", "speech", "stream", "theme", "ui", "wix_api", "wix_cashier", "wix_platform"]
|
|
27391
27474
|
}
|
|
27392
27475
|
};
|
|
27393
27476
|
}
|
|
@@ -42293,7 +42376,7 @@ var init_pdf = __esm({
|
|
|
42293
42376
|
var defineProperty = Object.defineProperty;
|
|
42294
42377
|
var stringSlice = uncurryThis("".slice);
|
|
42295
42378
|
var replace = uncurryThis("".replace);
|
|
42296
|
-
var
|
|
42379
|
+
var join83 = uncurryThis([].join);
|
|
42297
42380
|
var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function() {
|
|
42298
42381
|
return defineProperty(function() {
|
|
42299
42382
|
}, "length", { value: 8 }).length !== 8;
|
|
@@ -42320,7 +42403,7 @@ var init_pdf = __esm({
|
|
|
42320
42403
|
}
|
|
42321
42404
|
var state = enforceInternalState(value);
|
|
42322
42405
|
if (!hasOwn(state, "source")) {
|
|
42323
|
-
state.source =
|
|
42406
|
+
state.source = join83(TEMPLATE, typeof name == "string" ? name : "");
|
|
42324
42407
|
}
|
|
42325
42408
|
return value;
|
|
42326
42409
|
};
|
|
@@ -44843,7 +44926,7 @@ var init_pdf = __esm({
|
|
|
44843
44926
|
var charAt = uncurryThis("".charAt);
|
|
44844
44927
|
var Uint8Array2 = globalThis2.Uint8Array;
|
|
44845
44928
|
var $Array = globalThis2.Array;
|
|
44846
|
-
var
|
|
44929
|
+
var join83 = uncurryThis([].join);
|
|
44847
44930
|
var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array2 || !Uint8Array2.prototype.toBase64 || !(function() {
|
|
44848
44931
|
try {
|
|
44849
44932
|
var target = new Uint8Array2();
|
|
@@ -44889,7 +44972,7 @@ var init_pdf = __esm({
|
|
|
44889
44972
|
result[written++] = "=";
|
|
44890
44973
|
}
|
|
44891
44974
|
}
|
|
44892
|
-
return
|
|
44975
|
+
return join83(result, "");
|
|
44893
44976
|
}
|
|
44894
44977
|
});
|
|
44895
44978
|
},
|
|
@@ -44901,7 +44984,7 @@ var init_pdf = __esm({
|
|
|
44901
44984
|
var anUint8Array = __webpack_require__3(4154);
|
|
44902
44985
|
var notDetached = __webpack_require__3(5169);
|
|
44903
44986
|
var numberToString2 = uncurryThis(1.1.toString);
|
|
44904
|
-
var
|
|
44987
|
+
var join83 = uncurryThis([].join);
|
|
44905
44988
|
var $Array = Array;
|
|
44906
44989
|
var Uint8Array2 = globalThis2.Uint8Array;
|
|
44907
44990
|
var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array2 || !Uint8Array2.prototype.toHex || !(function() {
|
|
@@ -44921,7 +45004,7 @@ var init_pdf = __esm({
|
|
|
44921
45004
|
var hex2 = numberToString2(this[i2], 16);
|
|
44922
45005
|
result[i2] = hex2.length === 1 ? "0" + hex2 : hex2;
|
|
44923
45006
|
}
|
|
44924
|
-
return
|
|
45007
|
+
return join83(result, "");
|
|
44925
45008
|
}
|
|
44926
45009
|
});
|
|
44927
45010
|
},
|
|
@@ -147709,6 +147792,25 @@ var init_studio_reel = __esm({
|
|
|
147709
147792
|
}
|
|
147710
147793
|
});
|
|
147711
147794
|
|
|
147795
|
+
// src/home-screen-id.ts
|
|
147796
|
+
import { readFileSync as readFileSync64 } from "node:fs";
|
|
147797
|
+
import { join as join56 } from "node:path";
|
|
147798
|
+
function homeScreenIdOf(dir) {
|
|
147799
|
+
let src;
|
|
147800
|
+
try {
|
|
147801
|
+
src = readFileSync64(join56(dir, "dev", "index.ts"), "utf8");
|
|
147802
|
+
} catch {
|
|
147803
|
+
return null;
|
|
147804
|
+
}
|
|
147805
|
+
const m2 = /^[ \t]*homeScreenId[ \t]*:[ \t]*(?:"((?:[^"\\\n]|\\.)*)"|'((?:[^'\\\n]|\\.)*)')/m.exec(src);
|
|
147806
|
+
const id = m2 ? m2[1] ?? m2[2] : void 0;
|
|
147807
|
+
return id && /^[A-Za-z0-9_.\-/{}]+$/.test(id) ? id : null;
|
|
147808
|
+
}
|
|
147809
|
+
var init_home_screen_id = __esm({
|
|
147810
|
+
"src/home-screen-id.ts"() {
|
|
147811
|
+
}
|
|
147812
|
+
});
|
|
147813
|
+
|
|
147712
147814
|
// src/milestones.ts
|
|
147713
147815
|
var milestones_exports = {};
|
|
147714
147816
|
__export(milestones_exports, {
|
|
@@ -147764,20 +147866,9 @@ __export(milestones_exports, {
|
|
|
147764
147866
|
});
|
|
147765
147867
|
import { createHash as createHash32, randomUUID as randomUUID7 } from "node:crypto";
|
|
147766
147868
|
import { spawn as spawn5 } from "node:child_process";
|
|
147767
|
-
import { closeSync as closeSync5, existsSync as existsSync56, lstatSync as lstatSync19, readFileSync as
|
|
147869
|
+
import { closeSync as closeSync5, existsSync as existsSync56, lstatSync as lstatSync19, readFileSync as readFileSync65, statSync as statSync15 } from "node:fs";
|
|
147768
147870
|
import { createServer as createServer4 } from "node:net";
|
|
147769
|
-
import { basename as basename15, dirname as dirname32, isAbsolute as isAbsolute6, join as
|
|
147770
|
-
function homeScreenIdOf(dir) {
|
|
147771
|
-
let src;
|
|
147772
|
-
try {
|
|
147773
|
-
src = readFileSync64(join56(dir, "dev", "index.ts"), "utf8");
|
|
147774
|
-
} catch {
|
|
147775
|
-
return null;
|
|
147776
|
-
}
|
|
147777
|
-
const m2 = /^[ \t]*homeScreenId[ \t]*:[ \t]*(?:"((?:[^"\\\n]|\\.)*)"|'((?:[^'\\\n]|\\.)*)')/m.exec(src);
|
|
147778
|
-
const id = m2 ? m2[1] ?? m2[2] : void 0;
|
|
147779
|
-
return id && /^[A-Za-z0-9_.\-/{}]+$/.test(id) ? id : null;
|
|
147780
|
-
}
|
|
147871
|
+
import { basename as basename15, dirname as dirname32, isAbsolute as isAbsolute6, join as join57, relative as relative11, resolve as resolve48, sep as sep15 } from "node:path";
|
|
147781
147872
|
function homeShotPath(dir, home) {
|
|
147782
147873
|
const root = resolve48(dir);
|
|
147783
147874
|
const base = resolve48(root, ".himi", "shots");
|
|
@@ -147888,7 +147979,7 @@ function autoPictureGate(dir) {
|
|
|
147888
147979
|
}
|
|
147889
147980
|
async function homePictureAtValidate(dir, opts) {
|
|
147890
147981
|
if (!opts.ok) return { skipped: "validate found errors, so the picture was left as it is" };
|
|
147891
|
-
if (!existsSync56(
|
|
147982
|
+
if (!existsSync56(join57(dir, "himalaya.content.json"))) return { skipped: "not a content package" };
|
|
147892
147983
|
const env = opts.env ?? process.env;
|
|
147893
147984
|
if (ciSet(env)) return { skipped: "the CI environment variable is set" };
|
|
147894
147985
|
if (env.NODE_TEST_CONTEXT) return { skipped: "running under `node --test`" };
|
|
@@ -148112,16 +148203,16 @@ function rememberDraft(dir, releaseId, m2) {
|
|
|
148112
148203
|
...m2.tokensHash ? { tokensHash: m2.tokensHash } : {},
|
|
148113
148204
|
...m2.appConfigHash ? { appConfigHash: m2.appConfigHash } : {}
|
|
148114
148205
|
};
|
|
148115
|
-
writeFileAtomic(
|
|
148206
|
+
writeFileAtomic(join57(dir, LAST_DRAFT_FILE), `${JSON.stringify({ v: 1, releaseId, manifest })}
|
|
148116
148207
|
`);
|
|
148117
148208
|
} catch {
|
|
148118
148209
|
}
|
|
148119
148210
|
}
|
|
148120
148211
|
function lastDraft(dir) {
|
|
148121
148212
|
try {
|
|
148122
|
-
const file2 =
|
|
148213
|
+
const file2 = join57(dir, LAST_DRAFT_FILE);
|
|
148123
148214
|
if (!lstatSync19(file2).isFile()) return null;
|
|
148124
|
-
const r2 = JSON.parse(
|
|
148215
|
+
const r2 = JSON.parse(readFileSync65(file2, "utf8"));
|
|
148125
148216
|
const m2 = r2.manifest;
|
|
148126
148217
|
if (r2.v !== 1 || typeof r2.releaseId !== "string" || !m2 || typeof m2.screens !== "object" || !m2.screens || typeof m2.bundles !== "object" || !m2.bundles) return null;
|
|
148127
148218
|
return { releaseId: r2.releaseId, manifest: m2 };
|
|
@@ -148172,7 +148263,7 @@ function recordInitSource(dir, opts = {}) {
|
|
|
148172
148263
|
template: opts.template && TEMPLATE_NAME.test(opts.template) ? opts.template : null,
|
|
148173
148264
|
...opts.source ? { source: opts.source } : {}
|
|
148174
148265
|
};
|
|
148175
|
-
writeFileAtomic(
|
|
148266
|
+
writeFileAtomic(join57(dir, INIT_SOURCE_FILE), `${JSON.stringify(record2, null, 2)}
|
|
148176
148267
|
`);
|
|
148177
148268
|
return true;
|
|
148178
148269
|
} catch {
|
|
@@ -148180,10 +148271,10 @@ function recordInitSource(dir, opts = {}) {
|
|
|
148180
148271
|
}
|
|
148181
148272
|
}
|
|
148182
148273
|
function readInitSource(dir) {
|
|
148183
|
-
const file2 =
|
|
148274
|
+
const file2 = join57(dir, INIT_SOURCE_FILE);
|
|
148184
148275
|
try {
|
|
148185
148276
|
if (!lstatSync19(file2).isFile()) return null;
|
|
148186
|
-
const r2 = JSON.parse(
|
|
148277
|
+
const r2 = JSON.parse(readFileSync65(file2, "utf8"));
|
|
148187
148278
|
if (r2.v !== 1 || typeof r2.fingerprint !== "string" || !/^[0-9a-f]{64}$/.test(r2.fingerprint) || typeof r2.newestMs !== "number") return null;
|
|
148188
148279
|
return {
|
|
148189
148280
|
v: 1,
|
|
@@ -148252,10 +148343,10 @@ function homeShotForPostcard(dir, opts = {}) {
|
|
|
148252
148343
|
function contentHomePictures(dir, home) {
|
|
148253
148344
|
const out2 = [];
|
|
148254
148345
|
const shot = homeShotPath(dir, home);
|
|
148255
|
-
const hist = realDirIn(dir, HISTORY_DIR) ?
|
|
148346
|
+
const hist = realDirIn(dir, HISTORY_DIR) ? join57(dir, HISTORY_DIR) : null;
|
|
148256
148347
|
for (const r2 of recordedShots(dir, home)) {
|
|
148257
148348
|
if (r2.state.state !== "content") continue;
|
|
148258
|
-
for (const file2 of [shot, hist &&
|
|
148349
|
+
for (const file2 of [shot, hist && join57(hist, `${r2.sha256}.png`)]) {
|
|
148259
148350
|
try {
|
|
148260
148351
|
if (!file2 || !lstatSync19(file2).isFile() || sha256Of2(file2) !== r2.sha256) continue;
|
|
148261
148352
|
} catch {
|
|
@@ -148268,10 +148359,10 @@ function contentHomePictures(dir, home) {
|
|
|
148268
148359
|
return out2;
|
|
148269
148360
|
}
|
|
148270
148361
|
function readInitWatch(dir) {
|
|
148271
|
-
const file2 =
|
|
148362
|
+
const file2 = join57(dir, INIT_WATCH_FILE);
|
|
148272
148363
|
try {
|
|
148273
148364
|
if (!lstatSync19(file2).isFile()) return null;
|
|
148274
|
-
const r2 = JSON.parse(
|
|
148365
|
+
const r2 = JSON.parse(readFileSync65(file2, "utf8"));
|
|
148275
148366
|
if (r2.v !== 1 || typeof r2.pid !== "number" || !Number.isInteger(r2.pid) || r2.pid < 1) return null;
|
|
148276
148367
|
if (typeof r2.url !== "string" || !/^http:\/\/127\.0\.0\.1:\d+\//.test(r2.url) || typeof r2.board !== "string" || typeof r2.log !== "string" || typeof r2.startedAt !== "string") return null;
|
|
148277
148368
|
if (r2.root !== runRootId(dir)) return null;
|
|
@@ -148296,14 +148387,14 @@ function liveWatchRunning(dir, isAlive = pidAlive, now) {
|
|
|
148296
148387
|
}
|
|
148297
148388
|
function watchReminder(dir, opts = {}) {
|
|
148298
148389
|
try {
|
|
148299
|
-
if (!existsSync56(
|
|
148390
|
+
if (!existsSync56(join57(dir, "himalaya.content.json"))) return void 0;
|
|
148300
148391
|
const nowDate = opts.now ?? /* @__PURE__ */ new Date();
|
|
148301
148392
|
const live3 = liveWatch(dir, opts.isAlive, nowDate);
|
|
148302
148393
|
const now = nowDate.getTime();
|
|
148303
|
-
const file2 =
|
|
148394
|
+
const file2 = join57(dir, REMINDERS_FILE);
|
|
148304
148395
|
let last = Number.NaN;
|
|
148305
148396
|
try {
|
|
148306
|
-
if (lstatSync19(file2).isFile()) last = Date.parse(JSON.parse(
|
|
148397
|
+
if (lstatSync19(file2).isFile()) last = Date.parse(JSON.parse(readFileSync65(file2, "utf8")).watch ?? "");
|
|
148307
148398
|
} catch {
|
|
148308
148399
|
}
|
|
148309
148400
|
if (Number.isFinite(last) && now - last >= 0 && now - last < WATCH_REMINDER_EVERY_MS) return void 0;
|
|
@@ -148315,7 +148406,7 @@ function watchReminder(dir, opts = {}) {
|
|
|
148315
148406
|
}
|
|
148316
148407
|
const content = opts.content ?? displayPath(dir);
|
|
148317
148408
|
const remote = readInitSource(dir)?.source === "remote" ? "init did not start it because this template came off the serve plane \u2014 once you have read its code, " : "";
|
|
148318
|
-
return `${remote}start the live preview and leave it running: \`himi run --watch --content ${shellQuote(content)} &\` (the consent preflight first, if a worker or config calls Wix at boot) \u2014 it repaints on every save; the build board is ${shellQuote(
|
|
148409
|
+
return `${remote}start the live preview and leave it running: \`himi run --watch --content ${shellQuote(content)} &\` (the consent preflight first, if a worker or config calls Wix at boot) \u2014 it repaints on every save; the build board is ${shellQuote(join57(content, ".himi", "studio", "index.html"))}, or /__himi/studio/ on the preview`;
|
|
148319
148410
|
} catch {
|
|
148320
148411
|
return void 0;
|
|
148321
148412
|
}
|
|
@@ -148381,7 +148472,7 @@ async function startWatchAtInit(dir, opts) {
|
|
|
148381
148472
|
child.unref();
|
|
148382
148473
|
if (!child.pid) return { skipped: "the live preview did not start (no process) \u2014 start it yourself: `himi run --watch --content <dir> &`", ...note };
|
|
148383
148474
|
const record2 = { v: 1, pid: child.pid, root: runRootId(dir), url, board, log: WATCH_LOG, startedAt: now.toISOString() };
|
|
148384
|
-
if (realDirIn(dir, ".himi")) writeFileAtomic(
|
|
148475
|
+
if (realDirIn(dir, ".himi")) writeFileAtomic(join57(dir, INIT_WATCH_FILE), `${JSON.stringify(record2, null, 2)}
|
|
148385
148476
|
`);
|
|
148386
148477
|
return { started: true, pid: child.pid, url, board, log: WATCH_LOG, ...note };
|
|
148387
148478
|
} catch (e2) {
|
|
@@ -148396,7 +148487,7 @@ function watchRunning(w2) {
|
|
|
148396
148487
|
function doNowBlock(opts) {
|
|
148397
148488
|
const content = displayPath(opts.dir, opts.cwd);
|
|
148398
148489
|
const home = opts.home ?? "<homeScreenId>";
|
|
148399
|
-
const board =
|
|
148490
|
+
const board = join57(content, ".himi", "studio", "index.html");
|
|
148400
148491
|
const running = watchRunning(opts.watch);
|
|
148401
148492
|
const who = running?.by === "init" ? "init started it" : "already running";
|
|
148402
148493
|
const watch2 = running ? `${running.url} (${who}; the board: ${running.board}) \u2014 leave it running, and do not start another` : `\`himi run --watch${contentArg(content)} &\` and leave it running (the board: ${shellQuote(board)}, or /__himi/studio/ on the preview)`;
|
|
@@ -148415,7 +148506,7 @@ function writeHandoverReel(dir) {
|
|
|
148415
148506
|
try {
|
|
148416
148507
|
if (!realDirIn(dir, ".himi")) return { skipped: ".himi is not a real directory inside the package (a symlink?), so no making-of was written" };
|
|
148417
148508
|
const { html } = buildReel(dir);
|
|
148418
|
-
const file2 =
|
|
148509
|
+
const file2 = join57(dir, ".himi", "making-of.html");
|
|
148419
148510
|
writeFileAtomic(file2, html);
|
|
148420
148511
|
return { file: file2, hint: `hand ${basename15(file2)} to the owner at the handover \u2014 one self-contained page of their app taking shape; send it beside the preview link, never instead of it` };
|
|
148421
148512
|
} catch (e2) {
|
|
@@ -148423,11 +148514,11 @@ function writeHandoverReel(dir) {
|
|
|
148423
148514
|
}
|
|
148424
148515
|
}
|
|
148425
148516
|
function afterHandoverPostcard(dir, opts = {}) {
|
|
148426
|
-
const file2 =
|
|
148517
|
+
const file2 = join57(dir, ".himi", "making-of.html");
|
|
148427
148518
|
let fresh = false;
|
|
148428
148519
|
try {
|
|
148429
148520
|
const st2 = lstatSync19(file2);
|
|
148430
|
-
fresh = st2.isFile() && !st2.isSymbolicLink() && st2.mtimeMs >= statSync15(
|
|
148521
|
+
fresh = st2.isFile() && !st2.isSymbolicLink() && st2.mtimeMs >= statSync15(join57(dir, ".himi", "progress.jsonl")).mtimeMs;
|
|
148431
148522
|
} catch {
|
|
148432
148523
|
fresh = false;
|
|
148433
148524
|
}
|
|
@@ -148446,6 +148537,7 @@ var init_milestones = __esm({
|
|
|
148446
148537
|
init_screen_state();
|
|
148447
148538
|
init_shell_quote();
|
|
148448
148539
|
init_studio_reel();
|
|
148540
|
+
init_home_screen_id();
|
|
148449
148541
|
contentArg = (content) => content ? ` --content ${shellQuote(content)}` : "";
|
|
148450
148542
|
CONSENT_PREFLIGHT = "Consent preflight before a template preview";
|
|
148451
148543
|
CONSENT_PREFLIGHT_STEP = `consent preflight (skill: "${CONSENT_PREFLIGHT}"): if any worker or config can make Wix or external requests at boot, authorize or mock them first; if none can, go straight on`;
|
|
@@ -148458,13 +148550,13 @@ var init_milestones = __esm({
|
|
|
148458
148550
|
STILL_BUILDING_MESSAGE = "Still building: here's the home screen now.";
|
|
148459
148551
|
yourFirstLookMessage = (dir) => `First look at your app: ${appName(dir)}'s home screen, with your changes.`;
|
|
148460
148552
|
homeCaveat = (dir, image) => homeStateCaveat(shotStateFor(dir, image));
|
|
148461
|
-
LAST_DRAFT_FILE =
|
|
148462
|
-
INIT_SOURCE_FILE =
|
|
148553
|
+
LAST_DRAFT_FILE = join57(".himi", "last-draft.json");
|
|
148554
|
+
INIT_SOURCE_FILE = join57(".himi", "init-source.json");
|
|
148463
148555
|
STARTING_POINT_REF = "starting-point";
|
|
148464
148556
|
TEMPLATE_NAME = /^[A-Za-z0-9._-]{1,64}$/;
|
|
148465
|
-
sha256Of2 = (file2) => createHash32("sha256").update(
|
|
148557
|
+
sha256Of2 = (file2) => createHash32("sha256").update(readFileSync65(file2)).digest("hex");
|
|
148466
148558
|
WATCH_REMINDER_EVERY_MS = 10 * 60 * 1e3;
|
|
148467
|
-
REMINDERS_FILE =
|
|
148559
|
+
REMINDERS_FILE = join57(".himi", "reminders.json");
|
|
148468
148560
|
pidAlive = (pid) => {
|
|
148469
148561
|
try {
|
|
148470
148562
|
process.kill(pid, 0);
|
|
@@ -148473,7 +148565,7 @@ var init_milestones = __esm({
|
|
|
148473
148565
|
return e2.code === "EPERM";
|
|
148474
148566
|
}
|
|
148475
148567
|
};
|
|
148476
|
-
INIT_WATCH_FILE =
|
|
148568
|
+
INIT_WATCH_FILE = join57(".himi", "watch.json");
|
|
148477
148569
|
INIT_WATCH_STARTING_MS = 5 * 60 * 1e3;
|
|
148478
148570
|
INIT_WATCH_IDLE_MINUTES = 30;
|
|
148479
148571
|
WATCH_LOG = ".himi/watch.log";
|
|
@@ -148509,8 +148601,8 @@ __export(template_sweep_exports, {
|
|
|
148509
148601
|
sweepCopy: () => sweepCopy,
|
|
148510
148602
|
sweepPairs: () => sweepPairs
|
|
148511
148603
|
});
|
|
148512
|
-
import { readFileSync as
|
|
148513
|
-
import { join as
|
|
148604
|
+
import { readFileSync as readFileSync66, writeFileSync as writeFileSync24 } from "node:fs";
|
|
148605
|
+
import { join as join58 } from "node:path";
|
|
148514
148606
|
import ts7 from "typescript";
|
|
148515
148607
|
function isCopy(node, file2) {
|
|
148516
148608
|
const parent = node.parent;
|
|
@@ -148551,7 +148643,7 @@ function sweepCopy(dir, pairs, dryRun) {
|
|
|
148551
148643
|
const next = /* @__PURE__ */ new Map();
|
|
148552
148644
|
const replaced = pairs.map(([from, to2]) => ({ from, to: to2, files: {} }));
|
|
148553
148645
|
for (const f2 of files) {
|
|
148554
|
-
const text9 =
|
|
148646
|
+
const text9 = readFileSync66(join58(dir, f2), "utf8");
|
|
148555
148647
|
if (!pairs.some(([from]) => text9.includes(from) || text9.includes(JSON.stringify(from).slice(1, -1)))) continue;
|
|
148556
148648
|
const kind = f2.endsWith(".json") ? ts7.ScriptKind.JSON : f2.endsWith("x") ? ts7.ScriptKind.TSX : ts7.ScriptKind.TS;
|
|
148557
148649
|
const sf2 = ts7.createSourceFile(f2, text9, ts7.ScriptTarget.Latest, true, kind);
|
|
@@ -148580,16 +148672,16 @@ function sweepCopy(dir, pairs, dryRun) {
|
|
|
148580
148672
|
if (errors.length) throw new TrimRefusal(`the sweep would break ${f2} \u2014 nothing written: ${errors[0]}`);
|
|
148581
148673
|
next.set(f2, out2);
|
|
148582
148674
|
}
|
|
148583
|
-
const dev = next.get("dev/index.ts") ??
|
|
148584
|
-
const config = next.get("config.ts") ??
|
|
148675
|
+
const dev = next.get("dev/index.ts") ?? readFileSync66(join58(dir, "dev", "index.ts"), "utf8");
|
|
148676
|
+
const config = next.get("config.ts") ?? readFileSync66(join58(dir, "config.ts"), "utf8");
|
|
148585
148677
|
try {
|
|
148586
148678
|
parseApp(dev, config);
|
|
148587
148679
|
} catch (e2) {
|
|
148588
148680
|
throw new TrimRefusal(`the sweep would leave dev/index.ts or config.ts unparseable \u2014 nothing written: ${e2.message}`);
|
|
148589
148681
|
}
|
|
148590
|
-
if (!dryRun) for (const [f2, t2] of next) writeFileSync24(
|
|
148682
|
+
if (!dryRun) for (const [f2, t2] of next) writeFileSync24(join58(dir, f2), t2);
|
|
148591
148683
|
const g2 = new RegExp(PLACEHOLDER.source, `${PLACEHOLDER.flags.replace("g", "")}g`);
|
|
148592
|
-
const placeholdersLeft = all.reduce((n2, f2) => n2 + [...(next.get(f2) ??
|
|
148684
|
+
const placeholdersLeft = all.reduce((n2, f2) => n2 + [...(next.get(f2) ?? readFileSync66(join58(dir, f2), "utf8")).matchAll(g2)].length, 0);
|
|
148593
148685
|
return {
|
|
148594
148686
|
ok: true,
|
|
148595
148687
|
dryRun,
|
|
@@ -148606,7 +148698,7 @@ function sweepPairs(set, mapFile) {
|
|
|
148606
148698
|
pairs.push([s2.slice(0, at2), s2.slice(at2 + 2)]);
|
|
148607
148699
|
}
|
|
148608
148700
|
if (mapFile) {
|
|
148609
|
-
const map = JSON.parse(
|
|
148701
|
+
const map = JSON.parse(readFileSync66(mapFile, "utf8"));
|
|
148610
148702
|
for (const [k2, v2] of Object.entries(map)) {
|
|
148611
148703
|
if (typeof v2 !== "string") throw new TrimRefusal(`--map ${mapFile}: "${k2}" must map to a string`);
|
|
148612
148704
|
pairs.push([k2, v2]);
|
|
@@ -148851,18 +148943,18 @@ __export(template_recommend_exports, {
|
|
|
148851
148943
|
recommendTemplates: () => recommendTemplates,
|
|
148852
148944
|
verticalsFromBook: () => verticalsFromBook
|
|
148853
148945
|
});
|
|
148854
|
-
import { existsSync as existsSync57, readFileSync as
|
|
148855
|
-
import { join as
|
|
148946
|
+
import { existsSync as existsSync57, readFileSync as readFileSync67 } from "node:fs";
|
|
148947
|
+
import { join as join59 } from "node:path";
|
|
148856
148948
|
function verticalsFromBook(path2) {
|
|
148857
|
-
const dir = existsSync57(
|
|
148858
|
-
const overlay =
|
|
148949
|
+
const dir = existsSync57(join59(path2, "book.json")) || existsSync57(join59(path2, "provisioning.overlay.json")) ? path2 : join59(path2, ".himi", "business-book");
|
|
148950
|
+
const overlay = join59(dir, "provisioning.overlay.json");
|
|
148859
148951
|
if (existsSync57(overlay)) {
|
|
148860
|
-
const v2 = JSON.parse(
|
|
148952
|
+
const v2 = JSON.parse(readFileSync67(overlay, "utf8")).installedVerticals;
|
|
148861
148953
|
if (Array.isArray(v2) && v2.length) return v2.filter((x2) => typeof x2 === "string");
|
|
148862
148954
|
}
|
|
148863
|
-
const book =
|
|
148955
|
+
const book = join59(dir, "book.json");
|
|
148864
148956
|
if (existsSync57(book)) {
|
|
148865
|
-
const probes = JSON.parse(
|
|
148957
|
+
const probes = JSON.parse(readFileSync67(book, "utf8")).probes;
|
|
148866
148958
|
if (Array.isArray(probes)) return installedFromProbes(probes);
|
|
148867
148959
|
}
|
|
148868
148960
|
throw new Error(`no book.json / provisioning.overlay.json under ${path2} \u2014 run \`himi site analyze\` first, or pass --verticals`);
|
|
@@ -148922,6 +149014,78 @@ var init_template_recommend = __esm({
|
|
|
148922
149014
|
}
|
|
148923
149015
|
});
|
|
148924
149016
|
|
|
149017
|
+
// ../../core/ts/src/nav-slots.ts
|
|
149018
|
+
function navPathError(raw) {
|
|
149019
|
+
if (raw === void 0 || raw === null || raw === "") return null;
|
|
149020
|
+
if (typeof raw !== "string") return `${JSON.stringify(raw)} is not a $service: binding ($service:<service>.<path>)`;
|
|
149021
|
+
const t2 = raw.trim();
|
|
149022
|
+
if (t2.startsWith("$item.")) return `"${raw}": $item. means nothing outside a list row \u2014 nav chrome binds $service:<service>.<path>`;
|
|
149023
|
+
if (!t2.startsWith("$service:")) return `"${raw}" is not a $service: binding ($service:<service>.<path>)`;
|
|
149024
|
+
const path2 = t2.slice("$service:".length);
|
|
149025
|
+
if (path2.includes("/")) return `"${raw}": the separator is a dot, not a slash ($service:<service>.<path>)`;
|
|
149026
|
+
if (!/^[^.\s]+(\.[^.\s]+)+$/.test(path2)) return `"${raw}" must be $service:<service>.<dot.path>`;
|
|
149027
|
+
return null;
|
|
149028
|
+
}
|
|
149029
|
+
function navConfigPathErrors(config) {
|
|
149030
|
+
const errors = [];
|
|
149031
|
+
const list = (v2) => Array.isArray(v2) ? v2.flatMap((x2, i2) => x2 !== null && typeof x2 === "object" ? [[x2, i2]] : []) : [];
|
|
149032
|
+
const obj3 = (v2) => v2 !== null && typeof v2 === "object" && !Array.isArray(v2) ? v2 : void 0;
|
|
149033
|
+
const check = (where, raw) => {
|
|
149034
|
+
const e2 = navPathError(raw);
|
|
149035
|
+
if (e2) errors.push(`${where}: ${e2}`);
|
|
149036
|
+
};
|
|
149037
|
+
const item = (where, it2) => {
|
|
149038
|
+
check(`${where}.hiddenPath`, it2.hiddenPath);
|
|
149039
|
+
check(`${where}.labelPath`, it2.labelPath);
|
|
149040
|
+
check(`${where}.iconPath`, it2.iconPath);
|
|
149041
|
+
check(`${where}.badge.valuePath`, obj3(it2.badge)?.valuePath);
|
|
149042
|
+
if (it2.hiddenUntilResolved && !it2.hiddenPath) {
|
|
149043
|
+
errors.push(`${where}: hiddenUntilResolved without hiddenPath can never resolve, so the item would never show`);
|
|
149044
|
+
}
|
|
149045
|
+
};
|
|
149046
|
+
const header = (where, h2) => {
|
|
149047
|
+
if (!h2) return;
|
|
149048
|
+
check(`${where}.titlePath`, h2.titlePath);
|
|
149049
|
+
check(`${where}.subtitlePath`, h2.subtitlePath);
|
|
149050
|
+
check(`${where}.imageUrlPath`, h2.imageUrlPath);
|
|
149051
|
+
};
|
|
149052
|
+
for (const [it2, i2] of list(obj3(config.tabBar)?.items)) item(`tabBar.items[${i2}] "${it2.id}"`, it2);
|
|
149053
|
+
for (const [it2, i2] of list(obj3(config.sidebar)?.items)) item(`sidebar.items[${i2}] "${it2.id}"`, it2);
|
|
149054
|
+
for (const [it2, i2] of list(obj3(config.drawer)?.items)) item(`drawer.items[${i2}] "${it2.id}"`, it2);
|
|
149055
|
+
for (const [it2, i2] of list(obj3(config.topBarDefault)?.actions)) item(`topBarDefault.actions[${i2}] "${it2.id}"`, it2);
|
|
149056
|
+
header("drawer.header", obj3(obj3(config.drawer)?.header));
|
|
149057
|
+
const sidebarHeader = obj3(obj3(config.sidebar)?.header);
|
|
149058
|
+
header("sidebar.header", sidebarHeader);
|
|
149059
|
+
for (const key2 of ["titlePath", "subtitlePath", "imageUrlPath"]) {
|
|
149060
|
+
if (sidebarHeader?.[key2]) {
|
|
149061
|
+
errors.push(`sidebar.header.${key2}: sidebar header bindings are not rendered yet (#4116) \u2014 bind drawer.header, which the sidebar shows`);
|
|
149062
|
+
}
|
|
149063
|
+
}
|
|
149064
|
+
const firstOf = (v2, skip = false) => list(v2).find(([it2]) => !skip || it2.role !== "section" && it2.role !== "note");
|
|
149065
|
+
const tabs = firstOf(obj3(config.tabBar)?.items);
|
|
149066
|
+
const kind = typeof config.navKind === "string" ? config.navKind : "";
|
|
149067
|
+
const rail = kind === "drawer" ? void 0 : firstOf(obj3(config.sidebar)?.items);
|
|
149068
|
+
const homes = [];
|
|
149069
|
+
if (tabs && !(kind === "sidebar" && rail)) homes.push(["tabBar.items", tabs]);
|
|
149070
|
+
if (rail && (kind === "sidebar" || kind === "responsive" || !tabs)) homes.push(["sidebar.items", rail]);
|
|
149071
|
+
if (!tabs && !rail) {
|
|
149072
|
+
const home = typeof config.homeScreenId === "string" && config.homeScreenId.length > 0 ? config.homeScreenId : void 0;
|
|
149073
|
+
const rows = list(obj3(config.drawer)?.items);
|
|
149074
|
+
const row = home !== void 0 ? rows.find(([it2]) => it2.screenId === home) : firstOf(obj3(config.drawer)?.items, true);
|
|
149075
|
+
homes.push(["drawer.items", row]);
|
|
149076
|
+
}
|
|
149077
|
+
for (const [where, first] of homes) {
|
|
149078
|
+
if (first && first[0].hiddenUntilResolved) {
|
|
149079
|
+
errors.push(`${where}[${first[1]}] "${first[0].id}": the home destination cannot be hiddenUntilResolved \u2014 the boot route, deep links and push taps root on it; gate a later item instead`);
|
|
149080
|
+
}
|
|
149081
|
+
}
|
|
149082
|
+
return errors;
|
|
149083
|
+
}
|
|
149084
|
+
var init_nav_slots = __esm({
|
|
149085
|
+
"../../core/ts/src/nav-slots.ts"() {
|
|
149086
|
+
}
|
|
149087
|
+
});
|
|
149088
|
+
|
|
148925
149089
|
// src/nav-lint.ts
|
|
148926
149090
|
var nav_lint_exports = {};
|
|
148927
149091
|
__export(nav_lint_exports, {
|
|
@@ -149002,6 +149166,10 @@ async function navIssues(dir, strict) {
|
|
|
149002
149166
|
`navigation.navKind: unknown value ${JSON.stringify(nav.navKind)} \u2014 the client coalesces an unrecognized kind to "bottomTabs" (invariant 6) rather than failing, so this silently selects chrome you did not ask for. Valid kinds: ${[...NAV_KINDS].sort().join(", ")}.`
|
|
149003
149167
|
);
|
|
149004
149168
|
}
|
|
149169
|
+
const servedHome = homeScreenIdOf(dir) ?? void 0;
|
|
149170
|
+
for (const message of navConfigPathErrors({ ...nav, homeScreenId: servedHome })) {
|
|
149171
|
+
error("nav-path-malformed", `navigation.${message}`);
|
|
149172
|
+
}
|
|
149005
149173
|
const navKind = nav.navKind;
|
|
149006
149174
|
const effectiveBottomTabs = navKind === void 0 || navKind === "bottomTabs" || typeof navKind !== "string" || !NAV_KINDS.has(navKind);
|
|
149007
149175
|
const declaresOtherChrome = itemCount(nav.drawer) > 0 || itemCount(nav.sidebar) > 0;
|
|
@@ -149114,6 +149282,8 @@ var init_nav_lint = __esm({
|
|
|
149114
149282
|
"src/nav-lint.ts"() {
|
|
149115
149283
|
init_app_config_loader();
|
|
149116
149284
|
init_provisioning_facts();
|
|
149285
|
+
init_nav_slots();
|
|
149286
|
+
init_home_screen_id();
|
|
149117
149287
|
init_wix_push_links();
|
|
149118
149288
|
NAVIGATION_KEYS = /* @__PURE__ */ new Set([
|
|
149119
149289
|
"tabBar",
|
|
@@ -149169,8 +149339,8 @@ __export(eject_exports, {
|
|
|
149169
149339
|
EJECTABLE: () => EJECTABLE,
|
|
149170
149340
|
ejectModule: () => ejectModule
|
|
149171
149341
|
});
|
|
149172
|
-
import { existsSync as existsSync58, mkdirSync as mkdirSync28, readFileSync as
|
|
149173
|
-
import { dirname as dirname33, join as
|
|
149342
|
+
import { existsSync as existsSync58, mkdirSync as mkdirSync28, readFileSync as readFileSync68, writeFileSync as writeFileSync25 } from "node:fs";
|
|
149343
|
+
import { dirname as dirname33, join as join60, relative as relative12, resolve as resolve49, sep as sep16 } from "node:path";
|
|
149174
149344
|
function locate(repoRootOrCwd, mod) {
|
|
149175
149345
|
const inRepo = resolve49(repoRootOrCwd, `stdlib/flows/${mod}/src/index.ts`);
|
|
149176
149346
|
if (existsSync58(inRepo)) return { path: inRepo, form: "source" };
|
|
@@ -149199,7 +149369,7 @@ function ejectModule(opts) {
|
|
|
149199
149369
|
};
|
|
149200
149370
|
}
|
|
149201
149371
|
const ext = found.form === "source" ? "ts" : "mjs";
|
|
149202
|
-
const target =
|
|
149372
|
+
const target = join60(contentDir2, "tier5-src", "_ejected", `${mod}.${ext}`);
|
|
149203
149373
|
mkdirSync28(dirname33(target), { recursive: true });
|
|
149204
149374
|
const banner = `// EJECTED from @wix/himalaya/${mod}. This app owns this file now.
|
|
149205
149375
|
//
|
|
@@ -149213,7 +149383,7 @@ function ejectModule(opts) {
|
|
|
149213
149383
|
// gate still applies. Ejecting buys layout and flow, never the floor.
|
|
149214
149384
|
|
|
149215
149385
|
`;
|
|
149216
|
-
const normalized =
|
|
149386
|
+
const normalized = readFileSync68(found.path, "utf8").replace(
|
|
149217
149387
|
/(["'])@himalaya\/([a-z0-9-]+(?:\/[a-z0-9-]+)?)\1/g,
|
|
149218
149388
|
(_m, q2, sub) => `${q2}@wix/himalaya/${sub}${q2}`
|
|
149219
149389
|
);
|
|
@@ -149221,7 +149391,7 @@ function ejectModule(opts) {
|
|
|
149221
149391
|
const rewired = [];
|
|
149222
149392
|
for (const f2 of files) {
|
|
149223
149393
|
if (!existsSync58(f2)) continue;
|
|
149224
|
-
const before =
|
|
149394
|
+
const before = readFileSync68(f2, "utf8");
|
|
149225
149395
|
let after = before;
|
|
149226
149396
|
let rel = relative12(dirname33(f2), target).split(sep16).join("/").replace(/\.tsx?$/, ".js");
|
|
149227
149397
|
if (!rel.startsWith(".")) rel = `./${rel}`;
|
|
@@ -149341,8 +149511,8 @@ var init_app_map = __esm({
|
|
|
149341
149511
|
});
|
|
149342
149512
|
|
|
149343
149513
|
// src/wix-writes.ts
|
|
149344
|
-
import { existsSync as existsSync59, readFileSync as
|
|
149345
|
-
import { join as
|
|
149514
|
+
import { existsSync as existsSync59, readFileSync as readFileSync69 } from "node:fs";
|
|
149515
|
+
import { join as join61 } from "node:path";
|
|
149346
149516
|
function isProvenRead(method, path2) {
|
|
149347
149517
|
if (/[#\x00-\x1F\x7F]/.test(path2)) return false;
|
|
149348
149518
|
const verb = method.toUpperCase();
|
|
@@ -149460,11 +149630,11 @@ function parseDataAccess(text9, from) {
|
|
|
149460
149630
|
}
|
|
149461
149631
|
function readDataAccess(dir) {
|
|
149462
149632
|
for (const name of ["SPEC.md", "MOBILE-UX.md"]) {
|
|
149463
|
-
const p2 =
|
|
149633
|
+
const p2 = join61(dir, name);
|
|
149464
149634
|
if (!existsSync59(p2)) continue;
|
|
149465
149635
|
let text9;
|
|
149466
149636
|
try {
|
|
149467
|
-
text9 =
|
|
149637
|
+
text9 = readFileSync69(p2, "utf8");
|
|
149468
149638
|
} catch {
|
|
149469
149639
|
continue;
|
|
149470
149640
|
}
|
|
@@ -149578,14 +149748,14 @@ __export(test_exports, {
|
|
|
149578
149748
|
scopeDescriptors: () => scopeDescriptors,
|
|
149579
149749
|
writeRecordedMocks: () => writeRecordedMocks
|
|
149580
149750
|
});
|
|
149581
|
-
import { existsSync as existsSync60, mkdirSync as mkdirSync29, readFileSync as
|
|
149582
|
-
import { join as
|
|
149751
|
+
import { existsSync as existsSync60, mkdirSync as mkdirSync29, readFileSync as readFileSync70, writeFileSync as writeFileSync26 } from "node:fs";
|
|
149752
|
+
import { join as join62, resolve as resolve50 } from "node:path";
|
|
149583
149753
|
function readTestConfig(dir) {
|
|
149584
149754
|
const p2 = resolve50(dir, TEST_CONFIG_FILE);
|
|
149585
149755
|
if (!existsSync60(p2)) return {};
|
|
149586
149756
|
let parsed;
|
|
149587
149757
|
try {
|
|
149588
|
-
parsed = JSON.parse(
|
|
149758
|
+
parsed = JSON.parse(readFileSync70(p2, "utf8"));
|
|
149589
149759
|
} catch (e2) {
|
|
149590
149760
|
throw new Error(`${TEST_CONFIG_FILE} is not valid JSON \u2014 ${e2.message}`);
|
|
149591
149761
|
}
|
|
@@ -149632,7 +149802,7 @@ function readTestConfig(dir) {
|
|
|
149632
149802
|
function readNetRules(path2) {
|
|
149633
149803
|
let parsed;
|
|
149634
149804
|
try {
|
|
149635
|
-
parsed = JSON.parse(
|
|
149805
|
+
parsed = JSON.parse(readFileSync70(path2, "utf8"));
|
|
149636
149806
|
} catch (e2) {
|
|
149637
149807
|
throw new Error(`--net ${path2} could not be read as JSON \u2014 ${e2.message}`);
|
|
149638
149808
|
}
|
|
@@ -149669,7 +149839,7 @@ function readCannedResponses() {
|
|
|
149669
149839
|
];
|
|
149670
149840
|
for (const url of candidates) {
|
|
149671
149841
|
try {
|
|
149672
|
-
const parsed = JSON.parse(
|
|
149842
|
+
const parsed = JSON.parse(readFileSync70(url, "utf8"));
|
|
149673
149843
|
const byKey = {};
|
|
149674
149844
|
for (const [k2, v2] of Object.entries(parsed)) {
|
|
149675
149845
|
if (!k2.startsWith("//")) byKey[k2] = v2;
|
|
@@ -149759,8 +149929,8 @@ function writeRecordedMocks(opts) {
|
|
|
149759
149929
|
mkdir: (p2) => mkdirSync29(p2, { recursive: true }),
|
|
149760
149930
|
write: (p2, s2) => writeFileSync26(p2, s2)
|
|
149761
149931
|
};
|
|
149762
|
-
fs2.mkdir(
|
|
149763
|
-
fs2.write(
|
|
149932
|
+
fs2.mkdir(join62(opts.dir, "dev"));
|
|
149933
|
+
fs2.write(join62(opts.dir, "dev", "net-mocks.json"), JSON.stringify(opts.mocks, null, 2) + "\n");
|
|
149764
149934
|
return { ok: true, rules, to: "dev/net-mocks.json" };
|
|
149765
149935
|
}
|
|
149766
149936
|
function scopeDescriptors(descriptors, requestedIds, invalidScreens) {
|
|
@@ -150306,14 +150476,14 @@ var mobile_ux_lint_exports = {};
|
|
|
150306
150476
|
__export(mobile_ux_lint_exports, {
|
|
150307
150477
|
mobileUxIssues: () => mobileUxIssues
|
|
150308
150478
|
});
|
|
150309
|
-
import { existsSync as existsSync61, readFileSync as
|
|
150310
|
-
import { join as
|
|
150479
|
+
import { existsSync as existsSync61, readFileSync as readFileSync71 } from "node:fs";
|
|
150480
|
+
import { join as join63 } from "node:path";
|
|
150311
150481
|
function mobileUxIssues(dir, strict) {
|
|
150312
|
-
const file2 =
|
|
150482
|
+
const file2 = join63(dir, "MOBILE-UX.md");
|
|
150313
150483
|
if (!existsSync61(file2)) return [];
|
|
150314
150484
|
let text9;
|
|
150315
150485
|
try {
|
|
150316
|
-
text9 =
|
|
150486
|
+
text9 = readFileSync71(file2, "utf8");
|
|
150317
150487
|
} catch {
|
|
150318
150488
|
return [];
|
|
150319
150489
|
}
|
|
@@ -151994,8 +152164,8 @@ __export(functions_exports, {
|
|
|
151994
152164
|
resolveFunctionsTarget: () => resolveFunctionsTarget,
|
|
151995
152165
|
runRemoteFunctionOperation: () => runRemoteFunctionOperation
|
|
151996
152166
|
});
|
|
151997
|
-
import { readFileSync as
|
|
151998
|
-
import { join as
|
|
152167
|
+
import { readFileSync as readFileSync72, existsSync as existsSync62 } from "node:fs";
|
|
152168
|
+
import { join as join64, resolve as resolve51 } from "node:path";
|
|
151999
152169
|
function resolveFunctionsTarget(input) {
|
|
152000
152170
|
const explicitUrl = input.functionsUrl?.trim();
|
|
152001
152171
|
if (explicitUrl) return { mode: "remote", baseUrl: explicitUrl };
|
|
@@ -152014,9 +152184,9 @@ async function loadFunctionsApp(dir) {
|
|
|
152014
152184
|
}
|
|
152015
152185
|
const sources = {};
|
|
152016
152186
|
for (const definition of config.functions.functions) {
|
|
152017
|
-
const source = [".ts", ".js", ".mts", ".mjs"].map((extension) =>
|
|
152187
|
+
const source = [".ts", ".js", ".mts", ".mjs"].map((extension) => join64(loaded.dir, "functions", `${definition.name}${extension}`)).find(existsSync62);
|
|
152018
152188
|
if (!source) throw new Error(`missing source for function ${definition.name}; expected functions/${definition.name}.ts`);
|
|
152019
|
-
sources[definition.name] =
|
|
152189
|
+
sources[definition.name] = readFileSync72(source, "utf8");
|
|
152020
152190
|
}
|
|
152021
152191
|
const data = config.cms || config.data ? mergeDataResources(config) : void 0;
|
|
152022
152192
|
const dataErrors = validateDataResources(data, loaded.name).filter((issue2) => issue2.severity === "error");
|
|
@@ -152204,9 +152374,9 @@ var init_cli_bridge = __esm({
|
|
|
152204
152374
|
});
|
|
152205
152375
|
|
|
152206
152376
|
// src/mcp/file-tools.ts
|
|
152207
|
-
import { closeSync as closeSync6, constants as constants3, lstatSync as lstatSync20, mkdirSync as mkdirSync30, openSync as openSync5, readdirSync as readdirSync30, readFileSync as
|
|
152377
|
+
import { closeSync as closeSync6, constants as constants3, lstatSync as lstatSync20, mkdirSync as mkdirSync30, openSync as openSync5, readdirSync as readdirSync30, readFileSync as readFileSync73, realpathSync as realpathSync10, renameSync as renameSync11, rmSync as rmSync15, statSync as statSync16, writeSync, existsSync as existsSync63 } from "node:fs";
|
|
152208
152378
|
import { randomBytes as randomBytes4 } from "node:crypto";
|
|
152209
|
-
import { dirname as dirname34, isAbsolute as isAbsolute7, join as
|
|
152379
|
+
import { dirname as dirname34, isAbsolute as isAbsolute7, join as join65, relative as relative13, resolve as resolve52, sep as sep17 } from "node:path";
|
|
152210
152380
|
import * as z2 from "zod";
|
|
152211
152381
|
function within(root, p2) {
|
|
152212
152382
|
return p2 === root || p2.startsWith(root.endsWith(sep17) ? root : root + sep17);
|
|
@@ -152220,12 +152390,12 @@ function realish(p2) {
|
|
|
152220
152390
|
tail.unshift(cur.slice(up.length + (up.endsWith(sep17) ? 0 : 1)));
|
|
152221
152391
|
cur = up;
|
|
152222
152392
|
}
|
|
152223
|
-
return
|
|
152393
|
+
return join65(realpathSync10(cur), ...tail);
|
|
152224
152394
|
}
|
|
152225
152395
|
function symlinkComponent(base, abs) {
|
|
152226
152396
|
let cur = base;
|
|
152227
152397
|
for (const part of relative13(base, abs).split(sep17).filter(Boolean)) {
|
|
152228
|
-
cur =
|
|
152398
|
+
cur = join65(cur, part);
|
|
152229
152399
|
try {
|
|
152230
152400
|
if (lstatSync20(cur).isSymbolicLink()) return relative13(base, cur);
|
|
152231
152401
|
} catch {
|
|
@@ -152252,7 +152422,7 @@ async function confinedAppDir(args, deps) {
|
|
|
152252
152422
|
if (link) return refuse5("outside_workspace", `"${link}" is a symlink \u2014 the app folder must be a real folder in the workspace`);
|
|
152253
152423
|
const rel = relative13(root, dir);
|
|
152254
152424
|
if (rel && (isDeniedSourcePath(`${rel}/x`) || isDeniedSourcePath(`${rel.toLowerCase()}/x`))) return refuse5("denied", `"${rel}" is a folder this tool does not touch`);
|
|
152255
|
-
if (!existsSync63(
|
|
152425
|
+
if (!existsSync63(join65(dir, CONTENT_MARKER))) {
|
|
152256
152426
|
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`);
|
|
152257
152427
|
}
|
|
152258
152428
|
return dir;
|
|
@@ -152266,7 +152436,7 @@ function onDiskSpelling(abs) {
|
|
|
152266
152436
|
tail.unshift(cur.slice(up.length + (up.endsWith(sep17) ? 0 : 1)));
|
|
152267
152437
|
cur = up;
|
|
152268
152438
|
}
|
|
152269
|
-
return
|
|
152439
|
+
return join65(realpathSync10.native(cur), ...tail);
|
|
152270
152440
|
}
|
|
152271
152441
|
function denied(appDir3, abs) {
|
|
152272
152442
|
const rel = relative13(appDir3, abs);
|
|
@@ -152295,7 +152465,7 @@ function writeNoFollow2(appDir3, abs, content) {
|
|
|
152295
152465
|
mkdirSync30(dirname34(abs), { recursive: true });
|
|
152296
152466
|
const before = symlinkComponent(appDir3, abs);
|
|
152297
152467
|
if (before) throw new Error(`"${before}" became a symlink`);
|
|
152298
|
-
const tmp =
|
|
152468
|
+
const tmp = join65(dirname34(abs), `.himi-write-${process.pid}-${randomBytes4(6).toString("hex")}.tmp`);
|
|
152299
152469
|
const fd = openSync5(tmp, constants3.O_WRONLY | constants3.O_CREAT | constants3.O_EXCL | (constants3.O_NOFOLLOW ?? 0), 420);
|
|
152300
152470
|
try {
|
|
152301
152471
|
writeSync(fd, content);
|
|
@@ -152315,7 +152485,7 @@ function listFiles(appDir3) {
|
|
|
152315
152485
|
const parentRel = relative13(appDir3, d2);
|
|
152316
152486
|
for (const e2 of readdirSync30(d2, { withFileTypes: true }).sort((a2, b2) => a2.name.localeCompare(b2.name))) {
|
|
152317
152487
|
if (e2.isSymbolicLink()) continue;
|
|
152318
|
-
const p2 =
|
|
152488
|
+
const p2 = join65(d2, e2.name);
|
|
152319
152489
|
if (e2.isDirectory()) {
|
|
152320
152490
|
if (isDeniedSourceDir(e2.name, parentRel) || isDeniedSourceDir(e2.name.toLowerCase(), parentRel)) continue;
|
|
152321
152491
|
if (!walk2(p2)) return false;
|
|
@@ -152343,9 +152513,9 @@ function fileTools() {
|
|
|
152343
152513
|
const root = resolve52(await d2.defaultDir());
|
|
152344
152514
|
if (!existsSync63(root)) return ok({ ok: true, workspace: root, apps: [] });
|
|
152345
152515
|
const apps = [];
|
|
152346
|
-
if (existsSync63(
|
|
152516
|
+
if (existsSync63(join65(root, CONTENT_MARKER))) apps.push(".");
|
|
152347
152517
|
for (const e2 of readdirSync30(root, { withFileTypes: true })) {
|
|
152348
|
-
if (e2.isDirectory() && !e2.name.startsWith(".") && existsSync63(
|
|
152518
|
+
if (e2.isDirectory() && !e2.name.startsWith(".") && existsSync63(join65(root, e2.name, CONTENT_MARKER))) apps.push(e2.name);
|
|
152349
152519
|
}
|
|
152350
152520
|
return ok({ ok: true, workspace: root, apps: apps.sort() });
|
|
152351
152521
|
}
|
|
@@ -152377,7 +152547,7 @@ function fileTools() {
|
|
|
152377
152547
|
if (!existsSync63(p2) || !lstatSync20(p2).isFile()) return refuse5("not_found", `no file "${String(a2.path)}"`);
|
|
152378
152548
|
const size = statSync16(p2).size;
|
|
152379
152549
|
if (size > MAX_FILE_BYTES) return refuse5("too_large", `"${String(a2.path)}" is ${size} bytes \u2014 over the ${MAX_FILE_BYTES}-byte read limit`);
|
|
152380
|
-
return ok({ ok: true, path: a2.path, bytes: size, content:
|
|
152550
|
+
return ok({ ok: true, path: a2.path, bytes: size, content: readFileSync73(p2, "utf8") });
|
|
152381
152551
|
}
|
|
152382
152552
|
},
|
|
152383
152553
|
{
|
|
@@ -152989,7 +153159,7 @@ __export(server_exports, {
|
|
|
152989
153159
|
protectStdout: () => protectStdout,
|
|
152990
153160
|
startMcpServer: () => startMcpServer
|
|
152991
153161
|
});
|
|
152992
|
-
import { mkdirSync as mkdirSync31, readFileSync as
|
|
153162
|
+
import { mkdirSync as mkdirSync31, readFileSync as readFileSync74 } from "node:fs";
|
|
152993
153163
|
import { fileURLToPath as fileURLToPath22 } from "node:url";
|
|
152994
153164
|
import { McpServer } from "@modelcontextprotocol/server";
|
|
152995
153165
|
import { serveStdio, StdioServerTransport } from "@modelcontextprotocol/server/stdio";
|
|
@@ -153049,7 +153219,7 @@ async function startMcpServer(opts) {
|
|
|
153049
153219
|
status: (dir) => previewStatus(dir, previewDeps),
|
|
153050
153220
|
stop: (dir) => stopPreview(dir, previewDeps)
|
|
153051
153221
|
},
|
|
153052
|
-
readFile: (p2) =>
|
|
153222
|
+
readFile: (p2) => readFileSync74(p2),
|
|
153053
153223
|
login: createLoginSession({ ...defaultLoginDeps, selfCommand: previewDeps.selfCommand, ...opts.login }),
|
|
153054
153224
|
...opts.workspace ? { workspaceBoundary: opts.workspace } : {}
|
|
153055
153225
|
};
|
|
@@ -153093,9 +153263,9 @@ __export(native_decode_exports, {
|
|
|
153093
153263
|
runNativeDecode: () => runNativeDecode
|
|
153094
153264
|
});
|
|
153095
153265
|
import { execFileSync as execFileSync5, spawnSync as spawnSync2 } from "node:child_process";
|
|
153096
|
-
import { existsSync as existsSync64, mkdtempSync as mkdtempSync2, readFileSync as
|
|
153266
|
+
import { existsSync as existsSync64, mkdtempSync as mkdtempSync2, readFileSync as readFileSync75, rmSync as rmSync16, writeFileSync as writeFileSync27 } from "node:fs";
|
|
153097
153267
|
import { tmpdir as tmpdir3 } from "node:os";
|
|
153098
|
-
import { join as
|
|
153268
|
+
import { join as join66 } from "node:path";
|
|
153099
153269
|
import { fileURLToPath as fileURLToPath23 } from "node:url";
|
|
153100
153270
|
function nativeDecodePackageDir() {
|
|
153101
153271
|
return fileURLToPath23(new URL("../../../core/runtime/ios/HimalayaCore/", import.meta.url));
|
|
@@ -153105,8 +153275,8 @@ function nativeDecodeAndroidHarnessDir() {
|
|
|
153105
153275
|
}
|
|
153106
153276
|
function nativeOracleShipped() {
|
|
153107
153277
|
return {
|
|
153108
|
-
ios: existsSync64(
|
|
153109
|
-
android: existsSync64(
|
|
153278
|
+
ios: existsSync64(join66(nativeDecodePackageDir(), "Package.swift")),
|
|
153279
|
+
android: existsSync64(join66(nativeDecodeAndroidHarnessDir(), "gradlew"))
|
|
153110
153280
|
};
|
|
153111
153281
|
}
|
|
153112
153282
|
function detectNativeDecode(options = {}) {
|
|
@@ -153117,7 +153287,7 @@ function detectNativeDecode(options = {}) {
|
|
|
153117
153287
|
return { platform: "ios", available: false, reason: `the iOS decoder oracle requires macOS (darwin); this host is ${hostPlatform}` };
|
|
153118
153288
|
}
|
|
153119
153289
|
if (!swiftAvailable) return { platform: "ios", available: false, reason: "swift is not on PATH" };
|
|
153120
|
-
const packageAvailable = options.packageAvailable ?? existsSync64(
|
|
153290
|
+
const packageAvailable = options.packageAvailable ?? existsSync64(join66(packageDir, "Package.swift"));
|
|
153121
153291
|
if (!packageAvailable) {
|
|
153122
153292
|
return {
|
|
153123
153293
|
platform: "ios",
|
|
@@ -153129,7 +153299,7 @@ function detectNativeDecode(options = {}) {
|
|
|
153129
153299
|
}
|
|
153130
153300
|
function localPropertiesSdk(harnessDir) {
|
|
153131
153301
|
try {
|
|
153132
|
-
const match =
|
|
153302
|
+
const match = readFileSync75(join66(harnessDir, "local.properties"), "utf8").match(/^sdk\.dir\s*=\s*(.+)$/m);
|
|
153133
153303
|
return match?.[1]?.trim().replace(/\\([ :\\])/g, "$1") ?? null;
|
|
153134
153304
|
} catch {
|
|
153135
153305
|
return null;
|
|
@@ -153137,7 +153307,7 @@ function localPropertiesSdk(harnessDir) {
|
|
|
153137
153307
|
}
|
|
153138
153308
|
function detectAndroidNativeDecode(options = {}) {
|
|
153139
153309
|
const harnessDir = options.harnessDir ?? nativeDecodeAndroidHarnessDir();
|
|
153140
|
-
const gradlew =
|
|
153310
|
+
const gradlew = join66(harnessDir, "gradlew");
|
|
153141
153311
|
const gradlewAvailable = options.gradlewAvailable ?? existsSync64(gradlew);
|
|
153142
153312
|
if (!gradlewAvailable) {
|
|
153143
153313
|
return {
|
|
@@ -153220,14 +153390,14 @@ function parseNativeDecodeOutput(stdout, expectedScreenIds, platform = "ios") {
|
|
|
153220
153390
|
return verdicts;
|
|
153221
153391
|
}
|
|
153222
153392
|
function runNativeDecode(options) {
|
|
153223
|
-
const descriptorDir = mkdtempSync2(
|
|
153393
|
+
const descriptorDir = mkdtempSync2(join66(tmpdir3(), "himi-native-decode-"));
|
|
153224
153394
|
const startedAt = Date.now();
|
|
153225
153395
|
try {
|
|
153226
153396
|
for (const descriptor of options.descriptors) {
|
|
153227
153397
|
if (typeof descriptor.descriptorJson !== "string") {
|
|
153228
153398
|
throw new Error(`native decode cannot judge ${descriptor.screenId}: the release builder did not return its exact baked JSON bytes`);
|
|
153229
153399
|
}
|
|
153230
|
-
writeFileSync27(
|
|
153400
|
+
writeFileSync27(join66(descriptorDir, `${encodeURIComponent(descriptor.screenId)}.json`), descriptor.descriptorJson);
|
|
153231
153401
|
}
|
|
153232
153402
|
options.progress?.("building cached Swift oracle");
|
|
153233
153403
|
execFileSync5("swift", ["build", "--package-path", options.packageDir, "--product", "himi-decode-oracle"], {
|
|
@@ -153239,7 +153409,7 @@ function runNativeDecode(options) {
|
|
|
153239
153409
|
encoding: "utf8"
|
|
153240
153410
|
}).trim();
|
|
153241
153411
|
options.progress?.(`running real Swift decoder over ${options.descriptors.length} screen${options.descriptors.length === 1 ? "" : "s"}`);
|
|
153242
|
-
const stdout = execFileSync5(
|
|
153412
|
+
const stdout = execFileSync5(join66(binPath, "himi-decode-oracle"), ["--dir", descriptorDir], {
|
|
153243
153413
|
stdio: ["ignore", "pipe", "pipe"],
|
|
153244
153414
|
encoding: "utf8"
|
|
153245
153415
|
});
|
|
@@ -153257,15 +153427,15 @@ function runNativeDecode(options) {
|
|
|
153257
153427
|
}
|
|
153258
153428
|
}
|
|
153259
153429
|
function runAndroidNativeDecode(options) {
|
|
153260
|
-
const descriptorDir = mkdtempSync2(
|
|
153261
|
-
const outputPath =
|
|
153430
|
+
const descriptorDir = mkdtempSync2(join66(tmpdir3(), "himi-native-decode-android-"));
|
|
153431
|
+
const outputPath = join66(descriptorDir, "verdicts.ndjson");
|
|
153262
153432
|
const startedAt = Date.now();
|
|
153263
153433
|
try {
|
|
153264
153434
|
for (const descriptor of options.descriptors) {
|
|
153265
153435
|
if (typeof descriptor.descriptorJson !== "string") {
|
|
153266
153436
|
throw new Error(`native decode cannot judge ${descriptor.screenId}: the release builder did not return its exact baked JSON bytes`);
|
|
153267
153437
|
}
|
|
153268
|
-
writeFileSync27(
|
|
153438
|
+
writeFileSync27(join66(descriptorDir, `${encodeURIComponent(descriptor.screenId)}.json`), descriptor.descriptorJson);
|
|
153269
153439
|
}
|
|
153270
153440
|
options.progress?.(`running real Kotlin decoder over ${options.descriptors.length} screen${options.descriptors.length === 1 ? "" : "s"}`);
|
|
153271
153441
|
execFileSync5(options.gradlew, [
|
|
@@ -153280,7 +153450,7 @@ function runAndroidNativeDecode(options) {
|
|
|
153280
153450
|
stdio: ["ignore", "ignore", "pipe"],
|
|
153281
153451
|
encoding: "utf8"
|
|
153282
153452
|
});
|
|
153283
|
-
const stdout =
|
|
153453
|
+
const stdout = readFileSync75(outputPath, "utf8");
|
|
153284
153454
|
return {
|
|
153285
153455
|
platform: "android",
|
|
153286
153456
|
verdicts: parseNativeDecodeOutput(stdout, options.descriptors.map((descriptor) => descriptor.screenId), "android"),
|
|
@@ -153350,13 +153520,13 @@ __export(browser_authoring_exports, {
|
|
|
153350
153520
|
});
|
|
153351
153521
|
import { createServer as createServer5 } from "node:http";
|
|
153352
153522
|
import { createHash as createHash35, randomBytes as randomBytes5 } from "node:crypto";
|
|
153353
|
-
import { existsSync as existsSync65, readdirSync as readdirSync31, readFileSync as
|
|
153354
|
-
import { join as
|
|
153523
|
+
import { existsSync as existsSync65, readdirSync as readdirSync31, readFileSync as readFileSync76, realpathSync as realpathSync11, statSync as statSync17 } from "node:fs";
|
|
153524
|
+
import { join as join67, posix as posix3, relative as relative14, sep as sep18 } from "node:path";
|
|
153355
153525
|
function humanMs(ms2) {
|
|
153356
153526
|
return ms2 < 1e3 ? `${ms2}ms` : `${Math.round(ms2 / 1e3)}s`;
|
|
153357
153527
|
}
|
|
153358
153528
|
function collectWorkerSources(tier5SrcDir, bundleName) {
|
|
153359
|
-
const root =
|
|
153529
|
+
const root = join67(tier5SrcDir, bundleName);
|
|
153360
153530
|
const files = {};
|
|
153361
153531
|
const visitedDirs = /* @__PURE__ */ new Set();
|
|
153362
153532
|
const walk2 = (abs, rel) => {
|
|
@@ -153364,12 +153534,12 @@ function collectWorkerSources(tier5SrcDir, bundleName) {
|
|
|
153364
153534
|
if (visitedDirs.has(real)) return;
|
|
153365
153535
|
visitedDirs.add(real);
|
|
153366
153536
|
for (const name of readdirSync31(abs).sort()) {
|
|
153367
|
-
const childAbs =
|
|
153537
|
+
const childAbs = join67(abs, name);
|
|
153368
153538
|
const childRel = posix3.join(rel, name);
|
|
153369
153539
|
if (statSync17(childAbs).isDirectory()) {
|
|
153370
153540
|
walk2(childAbs, childRel);
|
|
153371
153541
|
} else if (/\.(ts|tsx|js|mjs|json)$/.test(name)) {
|
|
153372
|
-
files[childRel] =
|
|
153542
|
+
files[childRel] = readFileSync76(childAbs, "utf8");
|
|
153373
153543
|
}
|
|
153374
153544
|
}
|
|
153375
153545
|
};
|
|
@@ -153390,20 +153560,20 @@ function collectRelativeSiblings(files, tier5SrcDir) {
|
|
|
153390
153560
|
const spec = m2[1];
|
|
153391
153561
|
const virtual = posix3.normalize(posix3.join(dir, spec));
|
|
153392
153562
|
if (!virtual.startsWith("/tier5-src/")) continue;
|
|
153393
|
-
const onDisk =
|
|
153563
|
+
const onDisk = join67(tier5SrcDir, virtual.slice("/tier5-src/".length));
|
|
153394
153564
|
const candidates = [
|
|
153395
153565
|
onDisk,
|
|
153396
153566
|
`${onDisk}.ts`,
|
|
153397
153567
|
`${onDisk}.js`,
|
|
153398
153568
|
onDisk.replace(/\.js$/, ".ts"),
|
|
153399
|
-
|
|
153400
|
-
|
|
153569
|
+
join67(onDisk, "index.ts"),
|
|
153570
|
+
join67(onDisk, "index.js")
|
|
153401
153571
|
];
|
|
153402
153572
|
for (const abs of candidates) {
|
|
153403
153573
|
if (!existsSync65(abs) || statSync17(abs).isDirectory()) continue;
|
|
153404
153574
|
const key2 = `/tier5-src/${relative14(tier5SrcDir, abs).split(sep18).join(posix3.sep)}`;
|
|
153405
153575
|
if (key2 in files) break;
|
|
153406
|
-
files[key2] =
|
|
153576
|
+
files[key2] = readFileSync76(abs, "utf8");
|
|
153407
153577
|
queue.push(key2);
|
|
153408
153578
|
break;
|
|
153409
153579
|
}
|
|
@@ -153438,7 +153608,7 @@ function collectSdkModules(files, resolveSubpath) {
|
|
|
153438
153608
|
function sdkSubpathReader(resolve61) {
|
|
153439
153609
|
return (sub) => {
|
|
153440
153610
|
try {
|
|
153441
|
-
return
|
|
153611
|
+
return readFileSync76(resolve61(`@wix/himalaya/${sub}`), "utf8");
|
|
153442
153612
|
} catch {
|
|
153443
153613
|
return null;
|
|
153444
153614
|
}
|
|
@@ -153610,8 +153780,8 @@ __export(coverage_exports, {
|
|
|
153610
153780
|
suppressedNativeKeys: () => suppressedNativeKeys,
|
|
153611
153781
|
trendAndStore: () => trendAndStore
|
|
153612
153782
|
});
|
|
153613
|
-
import { existsSync as existsSync66, mkdirSync as mkdirSync32, readFileSync as
|
|
153614
|
-
import { dirname as dirname35, join as
|
|
153783
|
+
import { existsSync as existsSync66, mkdirSync as mkdirSync32, readFileSync as readFileSync77, writeFileSync as writeFileSync28 } from "node:fs";
|
|
153784
|
+
import { dirname as dirname35, join as join68 } from "node:path";
|
|
153615
153785
|
function suppressedNativeKeys(oracle) {
|
|
153616
153786
|
return [...oracle.ios ? [] : ["native-decode|ios"], ...oracle.android ? [] : ["native-decode|android"]];
|
|
153617
153787
|
}
|
|
@@ -153791,11 +153961,11 @@ function assembleLedger(r2, options = {}) {
|
|
|
153791
153961
|
return out2;
|
|
153792
153962
|
}
|
|
153793
153963
|
function trendAndStore(dir, entries, suppressed) {
|
|
153794
|
-
const p2 =
|
|
153964
|
+
const p2 = join68(dir, LEDGER_FILE);
|
|
153795
153965
|
let previous = null;
|
|
153796
153966
|
try {
|
|
153797
153967
|
if (existsSync66(p2)) {
|
|
153798
|
-
const parsed = JSON.parse(
|
|
153968
|
+
const parsed = JSON.parse(readFileSync77(p2, "utf8"));
|
|
153799
153969
|
if (Array.isArray(parsed.keys)) previous = parsed.keys.filter((k2) => typeof k2 === "string");
|
|
153800
153970
|
}
|
|
153801
153971
|
} catch {
|
|
@@ -153834,11 +154004,11 @@ function formatLedger(entries, trend) {
|
|
|
153834
154004
|
return out2.join("\n");
|
|
153835
154005
|
}
|
|
153836
154006
|
function diffAndStoreObservations(dir, current) {
|
|
153837
|
-
const p2 =
|
|
154007
|
+
const p2 = join68(dir, OBS_FILE);
|
|
153838
154008
|
let previous = null;
|
|
153839
154009
|
try {
|
|
153840
154010
|
if (existsSync66(p2)) {
|
|
153841
|
-
const parsed = JSON.parse(
|
|
154011
|
+
const parsed = JSON.parse(readFileSync77(p2, "utf8"));
|
|
153842
154012
|
if (parsed.screens && typeof parsed.screens === "object" && !Array.isArray(parsed.screens) && Object.values(parsed.screens).every(
|
|
153843
154013
|
(v2) => Array.isArray(v2) && v2.every((l2) => typeof l2 === "string")
|
|
153844
154014
|
)) {
|
|
@@ -153887,8 +154057,8 @@ var LEDGER_FILE, OBS_FILE;
|
|
|
153887
154057
|
var init_coverage = __esm({
|
|
153888
154058
|
"src/coverage.ts"() {
|
|
153889
154059
|
init_native_decode();
|
|
153890
|
-
LEDGER_FILE =
|
|
153891
|
-
OBS_FILE =
|
|
154060
|
+
LEDGER_FILE = join68(".himi", "test-ledger.json");
|
|
154061
|
+
OBS_FILE = join68(".himi", "test-observations.json");
|
|
153892
154062
|
}
|
|
153893
154063
|
});
|
|
153894
154064
|
|
|
@@ -153899,8 +154069,8 @@ __export(design_kits_exports, {
|
|
|
153899
154069
|
kitsDir: () => kitsDir,
|
|
153900
154070
|
listKits: () => listKits2
|
|
153901
154071
|
});
|
|
153902
|
-
import { existsSync as existsSync67, readFileSync as
|
|
153903
|
-
import { join as
|
|
154072
|
+
import { existsSync as existsSync67, readFileSync as readFileSync78, readdirSync as readdirSync32 } from "node:fs";
|
|
154073
|
+
import { join as join69, basename as basename16 } from "node:path";
|
|
153904
154074
|
import { fileURLToPath as fileURLToPath24 } from "node:url";
|
|
153905
154075
|
function kitsDir() {
|
|
153906
154076
|
return KIT_DIR_CANDIDATES.find((p2) => existsSync67(p2));
|
|
@@ -153927,7 +154097,7 @@ In a published @wix/himalaya-cli this is a packaging bug \u2014 the kits should
|
|
|
153927
154097
|
if (!kits.includes(name)) {
|
|
153928
154098
|
return { ok: false, kit: name, kits, problems: [`no design kit named "${name}". Available: ${kits.join(", ")}`] };
|
|
153929
154099
|
}
|
|
153930
|
-
const raw =
|
|
154100
|
+
const raw = readFileSync78(join69(dir, `${name}.json`), "utf8");
|
|
153931
154101
|
let parsed;
|
|
153932
154102
|
try {
|
|
153933
154103
|
parsed = JSON.parse(raw);
|
|
@@ -153951,9 +154121,9 @@ var init_design_kits = __esm({
|
|
|
153951
154121
|
"src/design-kits.ts"() {
|
|
153952
154122
|
KIT_DIR_CANDIDATES = [
|
|
153953
154123
|
// in-repo: tools/himi-cli/src/design-kits.ts → <repo>/stdlib/design-kits/
|
|
153954
|
-
|
|
154124
|
+
join69(fileURLToPath24(new URL("../../..", import.meta.url)), "stdlib", "design-kits"),
|
|
153955
154125
|
// published CLI: <pkg>/dist/cli.mjs → <pkg>/stdlib/design-kits/
|
|
153956
|
-
|
|
154126
|
+
join69(fileURLToPath24(new URL("..", import.meta.url)), "stdlib", "design-kits")
|
|
153957
154127
|
];
|
|
153958
154128
|
}
|
|
153959
154129
|
});
|
|
@@ -153967,11 +154137,11 @@ __export(assets_exports, {
|
|
|
153967
154137
|
removeAssetPayload: () => removeAssetPayload,
|
|
153968
154138
|
verifyReport: () => verifyReport
|
|
153969
154139
|
});
|
|
153970
|
-
import { readFileSync as
|
|
154140
|
+
import { readFileSync as readFileSync79 } from "node:fs";
|
|
153971
154141
|
import { basename as basename17 } from "node:path";
|
|
153972
154142
|
function declaredAssets(dir) {
|
|
153973
154143
|
return collectAssets(dir).map((a2) => {
|
|
153974
|
-
const bytes2 =
|
|
154144
|
+
const bytes2 = readFileSync79(a2.path);
|
|
153975
154145
|
return {
|
|
153976
154146
|
name: a2.name,
|
|
153977
154147
|
sha256: assetSha256(bytes2),
|
|
@@ -154048,7 +154218,7 @@ function verifyReport(dir, app, manifest) {
|
|
|
154048
154218
|
};
|
|
154049
154219
|
}
|
|
154050
154220
|
function addAssetPayload(manifest, filePath, opts) {
|
|
154051
|
-
const bytes2 =
|
|
154221
|
+
const bytes2 = readFileSync79(filePath);
|
|
154052
154222
|
const name = opts.name ?? basename17(filePath);
|
|
154053
154223
|
const sha2566 = assetSha256(bytes2);
|
|
154054
154224
|
const record2 = {
|
|
@@ -155803,25 +155973,25 @@ var init_preview_assets_generated = __esm({
|
|
|
155803
155973
|
"../../packages/serve/src/preview-assets.generated.ts"() {
|
|
155804
155974
|
init_preview_assets_format();
|
|
155805
155975
|
PREVIEW_ASSET_MANIFEST = [
|
|
155806
|
-
{ key: "assets/index-
|
|
155807
|
-
{ key: "assets/pdf-
|
|
155808
|
-
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
155809
|
-
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset:
|
|
155810
|
-
{ key: "assets/pdfDocument-
|
|
155811
|
-
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset:
|
|
155812
|
-
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset:
|
|
155813
|
-
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset:
|
|
155814
|
-
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
155815
|
-
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset:
|
|
155816
|
-
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset:
|
|
155817
|
-
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
155818
|
-
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset:
|
|
155819
|
-
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
155820
|
-
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset:
|
|
155821
|
-
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset:
|
|
155822
|
-
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
155823
|
-
{ key: "index.html", contentType: "text/html; charset=utf-8", offset:
|
|
155824
|
-
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset:
|
|
155976
|
+
{ key: "assets/index-CJyExZmR.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 1267377, sha256: "23b413452a6e70028fb774416f3f4b9bf13ee3a8cebbb190a40b093ebe35b317" },
|
|
155977
|
+
{ key: "assets/pdf-QU1lIzr-.js", contentType: "application/javascript; charset=utf-8", offset: 1267385, length: 488199, sha256: "337584d4ea08ba90a996f31eb8f2ca7c903ebadf9460770b940c07d07765d350" },
|
|
155978
|
+
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1755584, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
|
|
155979
|
+
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1755657, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
|
|
155980
|
+
{ key: "assets/pdfDocument-B-0h9-5Z.js", contentType: "application/javascript; charset=utf-8", offset: 3072691, length: 2858, sha256: "2e074889c84270b40b4b4788861ee57871f825c4eb5a502662491dfe43756439" },
|
|
155981
|
+
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3075549, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
|
|
155982
|
+
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3080159, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
|
|
155983
|
+
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3568743, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
|
|
155984
|
+
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3659667, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
|
|
155985
|
+
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3750651, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
|
|
155986
|
+
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 3841631, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
|
|
155987
|
+
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 3932503, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
|
|
155988
|
+
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4023483, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
|
|
155989
|
+
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4132119, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
|
|
155990
|
+
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4241203, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
|
|
155991
|
+
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4350251, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
|
|
155992
|
+
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4457951, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
|
|
155993
|
+
{ key: "index.html", contentType: "text/html; charset=utf-8", offset: 4546059, length: 4947, sha256: "74acaa1d5ec20a866e7617de37033e3f3147a56814f0f73f445fa8e1bd570ea0" },
|
|
155994
|
+
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4551006, length: 17344, sha256: "d057298d75e7373e5e2c4d11b7d1bcbea88e03af555ba63d97641c78509c58e4" }
|
|
155825
155995
|
];
|
|
155826
155996
|
}
|
|
155827
155997
|
});
|
|
@@ -155839,9 +156009,9 @@ __export(run_exports, {
|
|
|
155839
156009
|
runPackage: () => runPackage,
|
|
155840
156010
|
withoutProdServe: () => withoutProdServe
|
|
155841
156011
|
});
|
|
155842
|
-
import { cpSync as cpSync2, existsSync as existsSync68, mkdirSync as mkdirSync33, mkdtempSync as mkdtempSync3, readFileSync as
|
|
156012
|
+
import { cpSync as cpSync2, existsSync as existsSync68, mkdirSync as mkdirSync33, mkdtempSync as mkdtempSync3, readFileSync as readFileSync80, rmSync as rmSync17, statSync as statSync18 } from "node:fs";
|
|
155843
156013
|
import { networkInterfaces as osNetworkInterfaces, tmpdir as tmpdir4 } from "node:os";
|
|
155844
|
-
import { dirname as dirname36, join as
|
|
156014
|
+
import { dirname as dirname36, join as join70 } from "node:path";
|
|
155845
156015
|
import { fileURLToPath as fileURLToPath25 } from "node:url";
|
|
155846
156016
|
function makePackageRunHandler(opts) {
|
|
155847
156017
|
const store = new FileReleaseStore(opts.releaseRoot);
|
|
@@ -155870,7 +156040,7 @@ async function fetchBytes(url) {
|
|
|
155870
156040
|
async function resolvePackage(source, workDir) {
|
|
155871
156041
|
const isUrl2 = /^https?:\/\//i.test(source);
|
|
155872
156042
|
if (!isUrl2 && existsSync68(source) && statSync18(source).isDirectory()) {
|
|
155873
|
-
const appDirManifest =
|
|
156043
|
+
const appDirManifest = join70(source, "release-manifest.json");
|
|
155874
156044
|
if (existsSync68(appDirManifest)) {
|
|
155875
156045
|
const opened2 = openPackageDir(source);
|
|
155876
156046
|
if (!opened2.validation.ok) {
|
|
@@ -155880,9 +156050,9 @@ async function resolvePackage(source, workDir) {
|
|
|
155880
156050
|
const app2 = opened2.header?.app ?? opened2.manifest?.app;
|
|
155881
156051
|
if (!app2) throw new Error(`${source} has no app id (no himi-package.json and no manifest.app)`);
|
|
155882
156052
|
if (!isSafeAppId(app2)) throw new Error(`${source} declares an unsafe app id ${JSON.stringify(app2)} \u2014 refusing to open it`);
|
|
155883
|
-
const root2 = workDir ?? mkdtempSync3(
|
|
155884
|
-
const target =
|
|
155885
|
-
if (
|
|
156053
|
+
const root2 = workDir ?? mkdtempSync3(join70(tmpdir4(), "himi-run-"));
|
|
156054
|
+
const target = join70(root2, app2);
|
|
156055
|
+
if (join70(source) !== target) {
|
|
155886
156056
|
mkdirSync33(root2, { recursive: true });
|
|
155887
156057
|
rmSync17(target, { recursive: true, force: true });
|
|
155888
156058
|
cpSync2(source, target, { recursive: true });
|
|
@@ -155899,8 +156069,8 @@ async function resolvePackage(source, workDir) {
|
|
|
155899
156069
|
}
|
|
155900
156070
|
throw new Error(`${source} is a directory but has no release-manifest.json \u2014 is it a package?`);
|
|
155901
156071
|
}
|
|
155902
|
-
const bytes2 = isUrl2 ? await fetchBytes(source) :
|
|
155903
|
-
const root = workDir ?? mkdtempSync3(
|
|
156072
|
+
const bytes2 = isUrl2 ? await fetchBytes(source) : readFileSync80(source);
|
|
156073
|
+
const root = workDir ?? mkdtempSync3(join70(tmpdir4(), "himi-run-"));
|
|
155904
156074
|
const { app, appDir: appDir3 } = unpackTo(bytes2, root);
|
|
155905
156075
|
const opened = openPackageDir(appDir3);
|
|
155906
156076
|
if (!opened.validation.ok) {
|
|
@@ -155923,14 +156093,14 @@ async function loadPreviewAssets() {
|
|
|
155923
156093
|
const mod = await Promise.resolve().then(() => (init_preview_assets_generated(), preview_assets_generated_exports));
|
|
155924
156094
|
const here = dirname36(fileURLToPath25(import.meta.url));
|
|
155925
156095
|
const candidates = [
|
|
155926
|
-
|
|
156096
|
+
join70(here, "preview-assets.generated.bin"),
|
|
155927
156097
|
// published: copied next to the bundled CLI
|
|
155928
|
-
|
|
156098
|
+
join70(here, "../../../packages/serve/src/preview-assets.generated.bin")
|
|
155929
156099
|
// in-repo checkout
|
|
155930
156100
|
];
|
|
155931
156101
|
for (const path2 of candidates) {
|
|
155932
156102
|
if (!existsSync68(path2)) continue;
|
|
155933
|
-
const blob =
|
|
156103
|
+
const blob = readFileSync80(path2);
|
|
155934
156104
|
return mod.assemblePreviewAssetsFromBlob(new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength));
|
|
155935
156105
|
}
|
|
155936
156106
|
return /* @__PURE__ */ new Map();
|
|
@@ -156067,7 +156237,7 @@ __export(run_browser_exports, {
|
|
|
156067
156237
|
runInBrowser: () => runInBrowser
|
|
156068
156238
|
});
|
|
156069
156239
|
import { createServer as createServer7 } from "node:http";
|
|
156070
|
-
import { existsSync as existsSync69, readFileSync as
|
|
156240
|
+
import { existsSync as existsSync69, readFileSync as readFileSync81 } from "node:fs";
|
|
156071
156241
|
import { spawnSync as spawnSync3 } from "node:child_process";
|
|
156072
156242
|
import { dirname as dirname37, resolve as resolve54 } from "node:path";
|
|
156073
156243
|
import { fileURLToPath as fileURLToPath26 } from "node:url";
|
|
@@ -156175,7 +156345,7 @@ async function runInBrowser(releaseRoot, app, header, opts = {}) {
|
|
|
156175
156345
|
}
|
|
156176
156346
|
let bytes2;
|
|
156177
156347
|
try {
|
|
156178
|
-
bytes2 =
|
|
156348
|
+
bytes2 = readFileSync81(resolve54(stagedDir(), name));
|
|
156179
156349
|
} catch (e2) {
|
|
156180
156350
|
res.writeHead(503, { "content-type": "application/json" });
|
|
156181
156351
|
res.end(JSON.stringify({ error: "browser_plane_unstaged", file: name, detail: String(e2) }));
|
|
@@ -156228,14 +156398,14 @@ var hhp_preview_exports = {};
|
|
|
156228
156398
|
__export(hhp_preview_exports, {
|
|
156229
156399
|
hhpPreviewResponse: () => hhpPreviewResponse
|
|
156230
156400
|
});
|
|
156231
|
-
import { existsSync as existsSync70, readFileSync as
|
|
156232
|
-
import { join as
|
|
156401
|
+
import { existsSync as existsSync70, readFileSync as readFileSync82 } from "node:fs";
|
|
156402
|
+
import { join as join71 } from "node:path";
|
|
156233
156403
|
function hhpPreviewResponse(root, request) {
|
|
156234
|
-
if (new URL(request.url).pathname !== "/__himi/hhp-preview" || !existsSync70(
|
|
156404
|
+
if (new URL(request.url).pathname !== "/__himi/hhp-preview" || !existsSync70(join71(root, "hhp.json"))) return null;
|
|
156235
156405
|
if (request.method !== "GET") return new Response(null, { status: 405 });
|
|
156236
156406
|
try {
|
|
156237
156407
|
const file2 = localPath(root, ".himi/hhp-preview.json");
|
|
156238
|
-
const authored2 = existsSync70(file2) ? JSON.parse(
|
|
156408
|
+
const authored2 = existsSync70(file2) ? JSON.parse(readFileSync82(file2, "utf8")) : {};
|
|
156239
156409
|
if (authored2.mockCapabilities && (!Array.isArray(authored2.mockCapabilities) || authored2.mockCapabilities.some((v2) => typeof v2 !== "string"))) throw new Error("mockCapabilities must be a string array.");
|
|
156240
156410
|
const fixtures = authored2.fixtures ?? {};
|
|
156241
156411
|
if (typeof fixtures !== "object" || Array.isArray(fixtures) || fixtures === null) throw new Error("fixtures must be an object.");
|
|
@@ -156385,7 +156555,7 @@ var init_embedded_bundles = __esm({
|
|
|
156385
156555
|
});
|
|
156386
156556
|
|
|
156387
156557
|
// ../store-release/register-bundle.ts
|
|
156388
|
-
import { readFileSync as
|
|
156558
|
+
import { readFileSync as readFileSync83 } from "node:fs";
|
|
156389
156559
|
import { createPrivateKey as createPrivateKey4, sign as sign2 } from "node:crypto";
|
|
156390
156560
|
function b64url2(b2) {
|
|
156391
156561
|
return Buffer.from(b2).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
@@ -156403,7 +156573,7 @@ function bundleIdBody(identifier, name, platform = "IOS") {
|
|
|
156403
156573
|
async function registerBundleId(opts) {
|
|
156404
156574
|
const env = requireEnv(["ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_KEY_PATH"]);
|
|
156405
156575
|
assertCredentialOutsideRepo("ASC_KEY_PATH", env.ASC_KEY_PATH);
|
|
156406
|
-
const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID,
|
|
156576
|
+
const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID, readFileSync83(env.ASC_KEY_PATH, "utf8"), Math.floor(Date.now() / 1e3));
|
|
156407
156577
|
const res = await fetch(`${ASC_API}/v1/bundleIds`, {
|
|
156408
156578
|
method: "POST",
|
|
156409
156579
|
headers: { Authorization: `Bearer ${jwt}`, "Content-Type": "application/json" },
|
|
@@ -156433,7 +156603,7 @@ async function main() {
|
|
|
156433
156603
|
}
|
|
156434
156604
|
const ni2 = rest.indexOf("--name");
|
|
156435
156605
|
const name = ni2 >= 0 ? rest[ni2 + 1] : cfg.app ?? app;
|
|
156436
|
-
const yml =
|
|
156606
|
+
const yml = readFileSync83(iosProjectYml(app), "utf8");
|
|
156437
156607
|
for (const { id, label: label2 } of [{ id: identifier, label: name }, ...embeddedBundles(yml).map((b2) => ({
|
|
156438
156608
|
id: embeddedBundleId(identifier, b2),
|
|
156439
156609
|
label: `${name} ${embeddedAppIdLabel(b2)}`
|
|
@@ -157842,19 +158012,19 @@ __export(credential_profile_exports, {
|
|
|
157842
158012
|
profilePath: () => profilePath,
|
|
157843
158013
|
resolveStoreCredentials: () => resolveStoreCredentials
|
|
157844
158014
|
});
|
|
157845
|
-
import { existsSync as existsSync71, readFileSync as
|
|
158015
|
+
import { existsSync as existsSync71, readFileSync as readFileSync84 } from "node:fs";
|
|
157846
158016
|
import { homedir as homedir6 } from "node:os";
|
|
157847
|
-
import { join as
|
|
158017
|
+
import { join as join72 } from "node:path";
|
|
157848
158018
|
function credentialsDir(home = homedir6()) {
|
|
157849
|
-
return
|
|
158019
|
+
return join72(home, ".himalaya", "store-credentials");
|
|
157850
158020
|
}
|
|
157851
158021
|
function profilePath(name, home = homedir6()) {
|
|
157852
158022
|
if (!PROFILE_NAME.test(name)) {
|
|
157853
158023
|
throw new Error(
|
|
157854
|
-
`credential profile ${JSON.stringify(name)} is not a profile name \u2014 use letters, digits, ".", "_" or "-" starting with a letter or digit. It names ${
|
|
158024
|
+
`credential profile ${JSON.stringify(name)} is not a profile name \u2014 use letters, digits, ".", "_" or "-" starting with a letter or digit. It names ${join72(credentialsDir(home), "<name>.json")}; it is never a path.`
|
|
157855
158025
|
);
|
|
157856
158026
|
}
|
|
157857
|
-
return
|
|
158027
|
+
return join72(credentialsDir(home), `${name}.json`);
|
|
157858
158028
|
}
|
|
157859
158029
|
function parseProfile(text9, label2) {
|
|
157860
158030
|
let doc;
|
|
@@ -157885,7 +158055,7 @@ function resolveStoreCredentials(opts) {
|
|
|
157885
158055
|
const { app, cfg } = opts;
|
|
157886
158056
|
const env = opts.env ?? process.env;
|
|
157887
158057
|
const home = opts.home ?? homedir6();
|
|
157888
|
-
const read = opts.readProfile ?? ((p2) =>
|
|
158058
|
+
const read = opts.readProfile ?? ((p2) => readFileSync84(p2, "utf8"));
|
|
157889
158059
|
const exists = opts.profileExists ?? existsSync71;
|
|
157890
158060
|
const ios = cfg.ios ?? {};
|
|
157891
158061
|
const flagName = opts.profileFlag?.trim();
|
|
@@ -157952,7 +158122,7 @@ var init_credential_profile = __esm({
|
|
|
157952
158122
|
|
|
157953
158123
|
// ../store-release/iap-credentials.ts
|
|
157954
158124
|
import { createHash as createHash37 } from "node:crypto";
|
|
157955
|
-
import { existsSync as existsSync72, readFileSync as
|
|
158125
|
+
import { existsSync as existsSync72, readFileSync as readFileSync85, realpathSync as realpathSync12 } from "node:fs";
|
|
157956
158126
|
import { homedir as homedir7 } from "node:os";
|
|
157957
158127
|
function accountFingerprint(keyId, issuerId) {
|
|
157958
158128
|
return `sha256:${createHash37("sha256").update(`${issuerId}:${keyId}`).digest("hex").slice(0, 16)}`;
|
|
@@ -157986,7 +158156,7 @@ function canonicalKeyPath(path2, profile, realpath) {
|
|
|
157986
158156
|
function resolveIapCredentials(options) {
|
|
157987
158157
|
const { target } = options;
|
|
157988
158158
|
const home = options.home ?? homedir7();
|
|
157989
|
-
const readFile3 = options.readFile ?? ((p2) =>
|
|
158159
|
+
const readFile3 = options.readFile ?? ((p2) => readFileSync85(p2, "utf8"));
|
|
157990
158160
|
const realpath = options.realpath ?? realpathSync12;
|
|
157991
158161
|
const profile = requireExplicitProfile(options.profileFlag, target);
|
|
157992
158162
|
const creds = resolveStoreCredentials({
|
|
@@ -158307,7 +158477,7 @@ __export(version_exports, {
|
|
|
158307
158477
|
stampTargetVersion: () => stampTargetVersion,
|
|
158308
158478
|
stampVersionKeys: () => stampVersionKeys
|
|
158309
158479
|
});
|
|
158310
|
-
import { readFileSync as
|
|
158480
|
+
import { readFileSync as readFileSync86, writeFileSync as writeFileSync29 } from "node:fs";
|
|
158311
158481
|
function readIosVersion(projectYml) {
|
|
158312
158482
|
const marketing = matchScalar(projectYml, "CFBundleShortVersionString");
|
|
158313
158483
|
const build3 = matchScalar(projectYml, "CFBundleVersion");
|
|
@@ -158454,8 +158624,8 @@ function setAndroidVersion(gradle, v2) {
|
|
|
158454
158624
|
function bumpVersion(app, opts) {
|
|
158455
158625
|
const iosPath = iosProjectYml(app);
|
|
158456
158626
|
const gradlePath = androidGradle(app);
|
|
158457
|
-
const iosYml =
|
|
158458
|
-
const gradle =
|
|
158627
|
+
const iosYml = readFileSync86(iosPath, "utf8");
|
|
158628
|
+
const gradle = readFileSync86(gradlePath, "utf8");
|
|
158459
158629
|
const current = readIosVersion(iosYml);
|
|
158460
158630
|
const next = {
|
|
158461
158631
|
marketing: opts.marketing ?? current.marketing,
|
|
@@ -158485,8 +158655,8 @@ var init_store_spec = __esm({
|
|
|
158485
158655
|
});
|
|
158486
158656
|
|
|
158487
158657
|
// src/iap-config-edit.ts
|
|
158488
|
-
import { existsSync as existsSync73, readFileSync as
|
|
158489
|
-
import { basename as basename18, join as
|
|
158658
|
+
import { existsSync as existsSync73, readFileSync as readFileSync87 } from "node:fs";
|
|
158659
|
+
import { basename as basename18, join as join73 } from "node:path";
|
|
158490
158660
|
import ts8 from "typescript";
|
|
158491
158661
|
function bindPurchasesAppInConfig(source, options) {
|
|
158492
158662
|
const fileName = options.fileName ?? "config.ts";
|
|
@@ -158565,16 +158735,16 @@ function capabilityFinding(app, fileName) {
|
|
|
158565
158735
|
}
|
|
158566
158736
|
function withStoreBundle(dir, options) {
|
|
158567
158737
|
if (options.storeBundleId) return options;
|
|
158568
|
-
const path2 =
|
|
158738
|
+
const path2 = join73(dir, "store", "store.config.yaml");
|
|
158569
158739
|
if (!existsSync73(path2)) return options;
|
|
158570
|
-
const storeBundleId = parseStoreConfig(
|
|
158740
|
+
const storeBundleId = parseStoreConfig(readFileSync87(path2, "utf8")).ios?.bundleId;
|
|
158571
158741
|
return storeBundleId ? { ...options, storeBundleId } : options;
|
|
158572
158742
|
}
|
|
158573
158743
|
function previewIapConfigEdit(dir, options) {
|
|
158574
158744
|
const path2 = configEntry(dir);
|
|
158575
158745
|
if (!path2) return void 0;
|
|
158576
158746
|
if (isSymlink2(path2)) return { path: path2, changed: false, applied: [], conflicts: [], instructions: [`${basename18(path2)} is a symlink, so it would not be edited: add the purchases app in the file it points to.`] };
|
|
158577
|
-
const { changed, applied, conflicts, instructions } = bindPurchasesAppInConfig(
|
|
158747
|
+
const { changed, applied, conflicts, instructions } = bindPurchasesAppInConfig(readFileSync87(path2, "utf8"), { ...withStoreBundle(dir, options), fileName: basename18(path2) });
|
|
158578
158748
|
return { path: path2, changed, applied, conflicts, instructions };
|
|
158579
158749
|
}
|
|
158580
158750
|
async function applyIapConfigEdit(dir, options, validate4) {
|
|
@@ -158583,7 +158753,7 @@ async function applyIapConfigEdit(dir, options, validate4) {
|
|
|
158583
158753
|
const fileName = basename18(path2);
|
|
158584
158754
|
const refuse7 = (why) => ({ path: path2, changed: false, applied: [], conflicts: [], instructions: [why] });
|
|
158585
158755
|
if (isSymlink2(path2)) return refuse7(`${fileName} is a symlink, so it was not edited: add the purchases app in the file it points to.`);
|
|
158586
|
-
const original =
|
|
158756
|
+
const original = readFileSync87(path2, "utf8");
|
|
158587
158757
|
const edit = bindPurchasesAppInConfig(original, { ...withStoreBundle(dir, options), fileName });
|
|
158588
158758
|
const { applied, conflicts, instructions } = edit;
|
|
158589
158759
|
if (!edit.changed) return { path: path2, changed: false, applied, conflicts, instructions };
|
|
@@ -159056,9 +159226,9 @@ __export(store_iap_exports, {
|
|
|
159056
159226
|
runStoreIap: () => runStoreIap
|
|
159057
159227
|
});
|
|
159058
159228
|
import { randomUUID as randomUUID8 } from "node:crypto";
|
|
159059
|
-
import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync34, readFileSync as
|
|
159229
|
+
import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync34, readFileSync as readFileSync88, realpathSync as realpathSync13, rmSync as rmSync18, writeFileSync as writeFileSync30 } from "node:fs";
|
|
159060
159230
|
import { homedir as homedir8, hostname } from "node:os";
|
|
159061
|
-
import { join as
|
|
159231
|
+
import { join as join74 } from "node:path";
|
|
159062
159232
|
function scrubDeep(value, scrub) {
|
|
159063
159233
|
if (typeof value === "string") return scrub(value);
|
|
159064
159234
|
if (Array.isArray(value)) return value.map((v2) => scrubDeep(v2, scrub));
|
|
@@ -159514,14 +159684,14 @@ function fileJournal(path2) {
|
|
|
159514
159684
|
}
|
|
159515
159685
|
function readLockSummary(path2) {
|
|
159516
159686
|
try {
|
|
159517
|
-
const { pid, host, at: at2 } = JSON.parse(
|
|
159687
|
+
const { pid, host, at: at2 } = JSON.parse(readFileSync88(path2, "utf8"));
|
|
159518
159688
|
return `pid ${pid} on ${host} since ${at2}`;
|
|
159519
159689
|
} catch {
|
|
159520
159690
|
return "unreadable lock";
|
|
159521
159691
|
}
|
|
159522
159692
|
}
|
|
159523
159693
|
function acquireApplyLock(dir, appleAppId) {
|
|
159524
|
-
const path2 =
|
|
159694
|
+
const path2 = join74(dir, "apply.lock");
|
|
159525
159695
|
const stamp = JSON.stringify({ pid: process.pid, host: hostname(), at: (/* @__PURE__ */ new Date()).toISOString(), token: randomUUID8() });
|
|
159526
159696
|
try {
|
|
159527
159697
|
writeFileSync30(path2, stamp, { flag: "wx", mode: 384 });
|
|
@@ -159534,7 +159704,7 @@ function acquireApplyLock(dir, appleAppId) {
|
|
|
159534
159704
|
return () => {
|
|
159535
159705
|
let current = "";
|
|
159536
159706
|
try {
|
|
159537
|
-
current =
|
|
159707
|
+
current = readFileSync88(path2, "utf8");
|
|
159538
159708
|
} catch {
|
|
159539
159709
|
return;
|
|
159540
159710
|
}
|
|
@@ -159542,7 +159712,7 @@ function acquireApplyLock(dir, appleAppId) {
|
|
|
159542
159712
|
};
|
|
159543
159713
|
}
|
|
159544
159714
|
function stateDir(appleAppId) {
|
|
159545
|
-
const dir =
|
|
159715
|
+
const dir = join74(homedir8(), ".himalaya", "store-iap", appleAppId);
|
|
159546
159716
|
mkdirSync34(dir, { recursive: true, mode: 448 });
|
|
159547
159717
|
return dir;
|
|
159548
159718
|
}
|
|
@@ -159558,11 +159728,11 @@ async function confirmOnTerminal(question) {
|
|
|
159558
159728
|
}
|
|
159559
159729
|
function defaultStoreIapDeps() {
|
|
159560
159730
|
return {
|
|
159561
|
-
readFile: (path2) =>
|
|
159731
|
+
readFile: (path2) => readFileSync88(path2, "utf8"),
|
|
159562
159732
|
writeFileAtomic,
|
|
159563
159733
|
resolveCredentials: ({ profileFlag, target }) => resolveIapCredentials({ profileFlag, target }),
|
|
159564
159734
|
createApi: (key2) => createIapApi(createAscClient({ key: key2 })),
|
|
159565
|
-
openJournal: (appleAppId) => fileJournal(
|
|
159735
|
+
openJournal: (appleAppId) => fileJournal(join74(stateDir(appleAppId), "journal.jsonl")),
|
|
159566
159736
|
acquireLock: (appleAppId) => acquireApplyLock(stateDir(appleAppId), appleAppId),
|
|
159567
159737
|
canPrompt: () => process.stdin.isTTY === true,
|
|
159568
159738
|
wixTransport: (siteId) => ownerTransport(siteId),
|
|
@@ -160040,9 +160210,9 @@ __export(preflight_app_exports, {
|
|
|
160040
160210
|
preflightApp: () => preflightApp,
|
|
160041
160211
|
profileAccount: () => profileAccount
|
|
160042
160212
|
});
|
|
160043
|
-
import { readFileSync as
|
|
160213
|
+
import { readFileSync as readFileSync89, existsSync as existsSync74, readdirSync as readdirSync33, statSync as statSync19 } from "node:fs";
|
|
160044
160214
|
import { createHash as createHash39 } from "node:crypto";
|
|
160045
|
-
import { join as
|
|
160215
|
+
import { join as join75 } from "node:path";
|
|
160046
160216
|
function analyze(projectYml, storeConfig, icon, account) {
|
|
160047
160217
|
const f2 = [];
|
|
160048
160218
|
const has = (re2, s2) => re2.test(s2);
|
|
@@ -160106,13 +160276,13 @@ function profileAccount(app, storeConfig, opts = {}) {
|
|
|
160106
160276
|
}
|
|
160107
160277
|
}
|
|
160108
160278
|
async function preflightApp(app, opts = {}) {
|
|
160109
|
-
const projectYml = existsSync74(iosProjectYml(app)) ?
|
|
160110
|
-
const storeConfig = existsSync74(storeConfigPath(app)) ?
|
|
160279
|
+
const projectYml = existsSync74(iosProjectYml(app)) ? readFileSync89(iosProjectYml(app), "utf8") : "";
|
|
160280
|
+
const storeConfig = existsSync74(storeConfigPath(app)) ? readFileSync89(storeConfigPath(app), "utf8") : "";
|
|
160111
160281
|
if (!storeConfig) return [{ level: "error", message: `no apps/${app}/store/store.config.yaml \u2014 run /setup-store-signing first.` }];
|
|
160112
160282
|
const findings = analyze(
|
|
160113
160283
|
projectYml,
|
|
160114
160284
|
storeConfig,
|
|
160115
|
-
await appIconState(
|
|
160285
|
+
await appIconState(join75(appDir(app), "ios")),
|
|
160116
160286
|
profileAccount(app, storeConfig, opts)
|
|
160117
160287
|
);
|
|
160118
160288
|
findings.push(...analyzeListing(metadataFilesPresent(app), listScreenshots(app)));
|
|
@@ -160141,16 +160311,16 @@ function analyzeSubmissionRecord(appLevel, review, opts) {
|
|
|
160141
160311
|
return f2;
|
|
160142
160312
|
}
|
|
160143
160313
|
function appLevelMetadataFiles(app, locale = "en-US") {
|
|
160144
|
-
const root =
|
|
160314
|
+
const root = join75(storeDir(app), "metadata");
|
|
160145
160315
|
const out2 = /* @__PURE__ */ new Set();
|
|
160146
160316
|
if (existsSync74(root)) {
|
|
160147
160317
|
for (const n2 of readdirSync33(root)) if (n2.endsWith(".txt")) out2.add(n2);
|
|
160148
160318
|
}
|
|
160149
|
-
if (existsSync74(
|
|
160319
|
+
if (existsSync74(join75(root, locale, "privacy_url.txt"))) out2.add("privacy_url.txt");
|
|
160150
160320
|
return out2;
|
|
160151
160321
|
}
|
|
160152
160322
|
function reviewInfoFiles(app) {
|
|
160153
|
-
const dir =
|
|
160323
|
+
const dir = join75(storeDir(app), "review_information");
|
|
160154
160324
|
if (!existsSync74(dir)) return /* @__PURE__ */ new Set();
|
|
160155
160325
|
return new Set(readdirSync33(dir).filter((n2) => n2.endsWith(".txt")));
|
|
160156
160326
|
}
|
|
@@ -160261,12 +160431,12 @@ function analyzePlayListing(assets) {
|
|
|
160261
160431
|
return f2;
|
|
160262
160432
|
}
|
|
160263
160433
|
function playListingAssets(app, locale = "en-US") {
|
|
160264
|
-
const dir =
|
|
160434
|
+
const dir = join75(storeDir(app), "play", locale, "images");
|
|
160265
160435
|
const read = (names) => {
|
|
160266
160436
|
for (const name of names) {
|
|
160267
|
-
const p2 =
|
|
160437
|
+
const p2 = join75(dir, name);
|
|
160268
160438
|
try {
|
|
160269
|
-
if (statSync19(p2).isFile()) return { name, bytes:
|
|
160439
|
+
if (statSync19(p2).isFile()) return { name, bytes: readFileSync89(p2) };
|
|
160270
160440
|
} catch {
|
|
160271
160441
|
}
|
|
160272
160442
|
}
|
|
@@ -160297,26 +160467,26 @@ function analyzeListing(metaFiles, shots) {
|
|
|
160297
160467
|
return f2;
|
|
160298
160468
|
}
|
|
160299
160469
|
function metadataFilesPresent(app, locale = "en-US") {
|
|
160300
|
-
const dir =
|
|
160470
|
+
const dir = join75(storeDir(app), "metadata", locale);
|
|
160301
160471
|
if (!existsSync74(dir)) return /* @__PURE__ */ new Set();
|
|
160302
160472
|
return new Set(readdirSync33(dir).filter((n2) => n2.endsWith(".txt")));
|
|
160303
160473
|
}
|
|
160304
160474
|
function listScreenshots(app, locale = "en-US") {
|
|
160305
160475
|
const out2 = [];
|
|
160306
|
-
const flat =
|
|
160476
|
+
const flat = join75(storeDir(app), "screenshots", locale);
|
|
160307
160477
|
if (existsSync74(flat)) {
|
|
160308
160478
|
for (const png of readdirSync33(flat).filter((n2) => n2.endsWith(".png"))) {
|
|
160309
|
-
const sz = pngSize(
|
|
160479
|
+
const sz = pngSize(readFileSync89(join75(flat, png)));
|
|
160310
160480
|
if (sz) out2.push({ name: png, w: sz.w, h: sz.h });
|
|
160311
160481
|
}
|
|
160312
160482
|
}
|
|
160313
|
-
const legacy =
|
|
160483
|
+
const legacy = join75(storeDir(app), "metadata", locale, "screenshots");
|
|
160314
160484
|
if (existsSync74(legacy)) {
|
|
160315
160485
|
for (const deviceDir of readdirSync33(legacy)) {
|
|
160316
|
-
const d2 =
|
|
160486
|
+
const d2 = join75(legacy, deviceDir);
|
|
160317
160487
|
if (!statSync19(d2).isDirectory()) continue;
|
|
160318
160488
|
for (const png of readdirSync33(d2).filter((n2) => n2.endsWith(".png"))) {
|
|
160319
|
-
const sz = pngSize(
|
|
160489
|
+
const sz = pngSize(readFileSync89(join75(d2, png)));
|
|
160320
160490
|
if (sz) out2.push({ name: `${deviceDir}/${png}`, w: sz.w, h: sz.h });
|
|
160321
160491
|
}
|
|
160322
160492
|
}
|
|
@@ -160324,13 +160494,13 @@ function listScreenshots(app, locale = "en-US") {
|
|
|
160324
160494
|
return out2;
|
|
160325
160495
|
}
|
|
160326
160496
|
function placeholderHashes2() {
|
|
160327
|
-
const templateIos =
|
|
160497
|
+
const templateIos = join75(appDir("_template"), "ios");
|
|
160328
160498
|
if (!existsSync74(templateIos)) return [LEGACY_PLACEHOLDER_SHA2562];
|
|
160329
160499
|
for (const target of readdirSync33(templateIos)) {
|
|
160330
|
-
const p2 =
|
|
160500
|
+
const p2 = join75(templateIos, target, "Assets.xcassets", "AppIcon.appiconset", "icon_1024.png");
|
|
160331
160501
|
try {
|
|
160332
160502
|
if (!statSync19(p2).isFile()) continue;
|
|
160333
|
-
return [LEGACY_PLACEHOLDER_SHA2562, createHash39("sha256").update(
|
|
160503
|
+
return [LEGACY_PLACEHOLDER_SHA2562, createHash39("sha256").update(readFileSync89(p2)).digest("hex")];
|
|
160334
160504
|
} catch {
|
|
160335
160505
|
}
|
|
160336
160506
|
}
|
|
@@ -160363,10 +160533,10 @@ async function pixelIssues(bytes2) {
|
|
|
160363
160533
|
async function appIconState(iosDir) {
|
|
160364
160534
|
if (!existsSync74(iosDir)) return { exists: false, isPlaceholder: false, storeIssues: [] };
|
|
160365
160535
|
for (const target of readdirSync33(iosDir)) {
|
|
160366
|
-
const p2 =
|
|
160536
|
+
const p2 = join75(iosDir, target, "Assets.xcassets", "AppIcon.appiconset", "icon_1024.png");
|
|
160367
160537
|
try {
|
|
160368
160538
|
if (!statSync19(p2).isFile()) continue;
|
|
160369
|
-
const bytes2 =
|
|
160539
|
+
const bytes2 = readFileSync89(p2);
|
|
160370
160540
|
const hash2 = createHash39("sha256").update(bytes2).digest("hex");
|
|
160371
160541
|
const pixels = await pixelIssues(bytes2);
|
|
160372
160542
|
return {
|
|
@@ -160433,7 +160603,7 @@ __export(asc_status_exports, {
|
|
|
160433
160603
|
ascStatus: () => ascStatus,
|
|
160434
160604
|
buildVerdict: () => buildVerdict
|
|
160435
160605
|
});
|
|
160436
|
-
import { readFileSync as
|
|
160606
|
+
import { readFileSync as readFileSync90 } from "node:fs";
|
|
160437
160607
|
function buildVerdict(builds) {
|
|
160438
160608
|
if (!builds.length) {
|
|
160439
160609
|
return "NO builds registered \u2014 if you uploaded recently and it's been >15 min, the binary was REJECTED IN PROCESSING (reason is email-only; run validate-binary.ts / scan-purpose-strings.ts to reproduce it).";
|
|
@@ -160447,7 +160617,7 @@ function buildVerdict(builds) {
|
|
|
160447
160617
|
function client(creds) {
|
|
160448
160618
|
const env = creds ?? requireEnv(["ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_KEY_PATH"]);
|
|
160449
160619
|
assertCredentialOutsideRepo("ASC_KEY_PATH", env.ASC_KEY_PATH);
|
|
160450
|
-
const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID,
|
|
160620
|
+
const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID, readFileSync90(env.ASC_KEY_PATH, "utf8"), Math.floor(Date.now() / 1e3));
|
|
160451
160621
|
return async (path2) => {
|
|
160452
160622
|
const r2 = await fetch(`${ASC}${path2}`, { headers: { Authorization: `Bearer ${jwt}` } });
|
|
160453
160623
|
return { status: r2.status, json: await r2.json().catch(() => ({})) };
|
|
@@ -160607,7 +160777,7 @@ __export(secrets_exports, {
|
|
|
160607
160777
|
runRemoteSecretsCommand: () => runRemoteSecretsCommand,
|
|
160608
160778
|
runSecretsCommand: () => runSecretsCommand
|
|
160609
160779
|
});
|
|
160610
|
-
import { readFileSync as
|
|
160780
|
+
import { readFileSync as readFileSync91 } from "node:fs";
|
|
160611
160781
|
function environment(value) {
|
|
160612
160782
|
if (value === "preview" || value === "production") return value;
|
|
160613
160783
|
throw new Error("--environment must be preview or production");
|
|
@@ -160638,7 +160808,7 @@ async function runSecretsCommand(operation, flags, io2, options = {}) {
|
|
|
160638
160808
|
io2.log(JSON.stringify(await vault.list({ app, environment: env })));
|
|
160639
160809
|
return 0;
|
|
160640
160810
|
}
|
|
160641
|
-
const value = options.readValue ? options.readValue() :
|
|
160811
|
+
const value = options.readValue ? options.readValue() : readFileSync91(0, "utf8").replace(/\r?\n$/, "");
|
|
160642
160812
|
if (operation === "set") await vault.set({ app, environment: env, name, value });
|
|
160643
160813
|
else if (operation === "rotate") await vault.rotate({ app, environment: env, name, value });
|
|
160644
160814
|
else throw new Error(`unknown secrets operation ${operation}`);
|
|
@@ -160667,7 +160837,7 @@ async function runRemoteSecretsCommand(operation, flags, io2, options) {
|
|
|
160667
160837
|
}
|
|
160668
160838
|
let body;
|
|
160669
160839
|
if (operation !== "list") {
|
|
160670
|
-
const value = options.readValue ? options.readValue() :
|
|
160840
|
+
const value = options.readValue ? options.readValue() : readFileSync91(0, "utf8").replace(/\r?\n$/, "");
|
|
160671
160841
|
body = JSON.stringify({ value });
|
|
160672
160842
|
}
|
|
160673
160843
|
const response = await (options.fetchImpl ?? fetch)(url, { method: operation === "list" ? "GET" : operation === "set" ? "PUT" : "POST", headers: headers2, body });
|
|
@@ -161165,15 +161335,15 @@ __export(notify_exports, {
|
|
|
161165
161335
|
runNotify: () => runNotify,
|
|
161166
161336
|
saveAdminSession: () => saveAdminSession
|
|
161167
161337
|
});
|
|
161168
|
-
import { chmodSync as chmodSync3, mkdirSync as mkdirSync35, readFileSync as
|
|
161338
|
+
import { chmodSync as chmodSync3, mkdirSync as mkdirSync35, readFileSync as readFileSync92, writeFileSync as writeFileSync31 } from "node:fs";
|
|
161169
161339
|
import { homedir as homedir9 } from "node:os";
|
|
161170
|
-
import { dirname as dirname39, join as
|
|
161340
|
+
import { dirname as dirname39, join as join76 } from "node:path";
|
|
161171
161341
|
function defaultSessionsPath() {
|
|
161172
|
-
return process.env.HIMI_ADMIN_SESSIONS_FILE ??
|
|
161342
|
+
return process.env.HIMI_ADMIN_SESSIONS_FILE ?? join76(homedir9(), ".himalaya", "admin-sessions.json");
|
|
161173
161343
|
}
|
|
161174
161344
|
function loadSessionsFile(path2 = defaultSessionsPath()) {
|
|
161175
161345
|
try {
|
|
161176
|
-
return JSON.parse(
|
|
161346
|
+
return JSON.parse(readFileSync92(path2, "utf8"));
|
|
161177
161347
|
} catch {
|
|
161178
161348
|
return {};
|
|
161179
161349
|
}
|
|
@@ -161550,20 +161720,20 @@ __export(base44_auth_exports, {
|
|
|
161550
161720
|
usableBase44Auth: () => usableBase44Auth,
|
|
161551
161721
|
writeBase44Session: () => writeBase44Session
|
|
161552
161722
|
});
|
|
161553
|
-
import { chmodSync as chmodSync4, existsSync as existsSync75, mkdirSync as mkdirSync36, readFileSync as
|
|
161723
|
+
import { chmodSync as chmodSync4, existsSync as existsSync75, mkdirSync as mkdirSync36, readFileSync as readFileSync93, rmSync as rmSync19, writeFileSync as writeFileSync32 } from "node:fs";
|
|
161554
161724
|
import { homedir as homedir10 } from "node:os";
|
|
161555
|
-
import { dirname as dirname40, join as
|
|
161725
|
+
import { dirname as dirname40, join as join77 } from "node:path";
|
|
161556
161726
|
function base44ApiBase(env = process.env) {
|
|
161557
161727
|
return (env.BASE44_API_URL?.trim() || "https://app.base44.com").replace(/\/+$/, "");
|
|
161558
161728
|
}
|
|
161559
161729
|
function base44SessionPath(home = homedir10()) {
|
|
161560
|
-
return
|
|
161730
|
+
return join77(home, ".himi", "base44", "session.json");
|
|
161561
161731
|
}
|
|
161562
161732
|
function readBase44Session(home) {
|
|
161563
161733
|
const p2 = base44SessionPath(home);
|
|
161564
161734
|
if (!existsSync75(p2)) return void 0;
|
|
161565
161735
|
try {
|
|
161566
|
-
const s2 = JSON.parse(
|
|
161736
|
+
const s2 = JSON.parse(readFileSync93(p2, "utf8"));
|
|
161567
161737
|
return typeof s2.accessToken === "string" && s2.accessToken ? s2 : void 0;
|
|
161568
161738
|
} catch {
|
|
161569
161739
|
return void 0;
|
|
@@ -161674,9 +161844,9 @@ async function base44DeviceLogin(opts) {
|
|
|
161674
161844
|
throw new Error("the Base44 sign-in code expired before it was approved \u2014 run `himi base44 login` again");
|
|
161675
161845
|
}
|
|
161676
161846
|
function importBase44CliSession(home = homedir10(), env = process.env) {
|
|
161677
|
-
const src =
|
|
161847
|
+
const src = join77(home, ".base44", "auth", "auth.json");
|
|
161678
161848
|
if (!existsSync75(src)) throw new Error(`no Base44 CLI session at ${src} \u2014 run \`npx base44 login\` first, or use \`himi base44 login\``);
|
|
161679
|
-
const a2 = JSON.parse(
|
|
161849
|
+
const a2 = JSON.parse(readFileSync93(src, "utf8"));
|
|
161680
161850
|
if (typeof a2.accessToken !== "string" || !a2.accessToken) throw new Error(`${src} holds no access token`);
|
|
161681
161851
|
const session = {
|
|
161682
161852
|
accessToken: a2.accessToken,
|
|
@@ -163811,7 +163981,7 @@ var init_brand_font = __esm({
|
|
|
163811
163981
|
|
|
163812
163982
|
// src/site-analyze/write-artifacts.ts
|
|
163813
163983
|
import { mkdirSync as mkdirSync37, writeFileSync as writeFileSync33 } from "node:fs";
|
|
163814
|
-
import { join as
|
|
163984
|
+
import { join as join78 } from "node:path";
|
|
163815
163985
|
function attachVeloSources(book, sources, put) {
|
|
163816
163986
|
const byPath = new Map((sources ?? []).map((s2) => [s2.path, s2.text]));
|
|
163817
163987
|
for (const f2 of book.velo.files) {
|
|
@@ -163966,12 +164136,12 @@ async function downloadMedia(book, fetchImpl, put) {
|
|
|
163966
164136
|
}
|
|
163967
164137
|
async function writeBusinessBook(result, opts) {
|
|
163968
164138
|
const out2 = opts.outDir;
|
|
163969
|
-
mkdirSync37(
|
|
163970
|
-
mkdirSync37(
|
|
164139
|
+
mkdirSync37(join78(out2, "evidence/pages"), { recursive: true });
|
|
164140
|
+
mkdirSync37(join78(out2, "media/catalog"), { recursive: true });
|
|
163971
164141
|
const files = [];
|
|
163972
164142
|
const put = (rel, body) => {
|
|
163973
|
-
const p2 =
|
|
163974
|
-
mkdirSync37(
|
|
164143
|
+
const p2 = join78(out2, rel);
|
|
164144
|
+
mkdirSync37(join78(p2, ".."), { recursive: true });
|
|
163975
164145
|
writeFileSync33(p2, body);
|
|
163976
164146
|
files.push(rel);
|
|
163977
164147
|
};
|
|
@@ -164875,11 +165045,11 @@ var init_analyze = __esm({
|
|
|
164875
165045
|
});
|
|
164876
165046
|
|
|
164877
165047
|
// src/base44-analyze/write-artifacts.ts
|
|
164878
|
-
import { existsSync as existsSync76, mkdirSync as mkdirSync38, readFileSync as
|
|
164879
|
-
import { dirname as dirname41, join as
|
|
165048
|
+
import { existsSync as existsSync76, mkdirSync as mkdirSync38, readFileSync as readFileSync94, rmSync as rmSync20, writeFileSync as writeFileSync34 } from "node:fs";
|
|
165049
|
+
import { dirname as dirname41, join as join79, resolve as resolve56, sep as sep19 } from "node:path";
|
|
164880
165050
|
function isBookFolder(dir) {
|
|
164881
165051
|
try {
|
|
164882
|
-
return JSON.parse(
|
|
165052
|
+
return JSON.parse(readFileSync94(join79(dir, "book.json"), "utf8")).kind === "base44-app-book";
|
|
164883
165053
|
} catch {
|
|
164884
165054
|
return false;
|
|
164885
165055
|
}
|
|
@@ -164966,24 +165136,24 @@ function writeBase44Book(result, outDir, opts = {}) {
|
|
|
164966
165136
|
const md = renderBookMd(book);
|
|
164967
165137
|
assertNoSecrets(json6);
|
|
164968
165138
|
assertNoSecrets(md);
|
|
164969
|
-
const owned = ["book.json", "BOOK.md", "source", "screenshots"].filter((n2) => existsSync76(
|
|
165139
|
+
const owned = ["book.json", "BOOK.md", "source", "screenshots"].filter((n2) => existsSync76(join79(out2, n2)));
|
|
164970
165140
|
if (owned.length) {
|
|
164971
165141
|
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`);
|
|
164972
|
-
for (const d2 of ["source", "screenshots"]) rmSync20(
|
|
165142
|
+
for (const d2 of ["source", "screenshots"]) rmSync20(join79(out2, d2), { recursive: true, force: true });
|
|
164973
165143
|
}
|
|
164974
165144
|
mkdirSync38(out2, { recursive: true });
|
|
164975
|
-
writeFileSync34(
|
|
164976
|
-
writeFileSync34(
|
|
165145
|
+
writeFileSync34(join79(out2, "book.json"), json6);
|
|
165146
|
+
writeFileSync34(join79(out2, "BOOK.md"), md);
|
|
164977
165147
|
files.push("book.json", "BOOK.md");
|
|
164978
165148
|
for (const s2 of shots) {
|
|
164979
|
-
mkdirSync38(
|
|
164980
|
-
writeFileSync34(
|
|
165149
|
+
mkdirSync38(join79(out2, "screenshots"), { recursive: true });
|
|
165150
|
+
writeFileSync34(join79(out2, "screenshots", s2.filename), s2.bytes);
|
|
164981
165151
|
files.push(`screenshots/${s2.filename}`);
|
|
164982
165152
|
}
|
|
164983
|
-
const sourceRoot =
|
|
165153
|
+
const sourceRoot = join79(out2, "source");
|
|
164984
165154
|
for (const f2 of result.sourceFiles) {
|
|
164985
165155
|
if (!safeRel(f2.path)) continue;
|
|
164986
|
-
const dest =
|
|
165156
|
+
const dest = join79(sourceRoot, ...f2.path.split("/"));
|
|
164987
165157
|
if (!dest.startsWith(sourceRoot + sep19)) continue;
|
|
164988
165158
|
mkdirSync38(dirname41(dest), { recursive: true });
|
|
164989
165159
|
writeFileSync34(dest, f2.bytes);
|
|
@@ -168529,7 +168699,7 @@ __export(cli_exports, {
|
|
|
168529
168699
|
import { execFile } from "node:child_process";
|
|
168530
168700
|
import { mkdirSync as mkdirSync39, mkdtempSync as mkdtempSync4, rmSync as rmSync21, writeFileSync as writeFileSync35 } from "node:fs";
|
|
168531
168701
|
import { tmpdir as tmpdir5 } from "node:os";
|
|
168532
|
-
import { join as
|
|
168702
|
+
import { join as join80, resolve as resolve57 } from "node:path";
|
|
168533
168703
|
import { promisify } from "node:util";
|
|
168534
168704
|
function projectDownloader(apiFetch, apiBase, token, extract = systemTar) {
|
|
168535
168705
|
return async (appId2) => {
|
|
@@ -168542,11 +168712,11 @@ function projectDownloader(apiFetch, apiBase, token, extract = systemTar) {
|
|
|
168542
168712
|
}
|
|
168543
168713
|
const bytes2 = await readCapped(res, MAX_TARBALL_BYTES);
|
|
168544
168714
|
if (!bytes2) throw new Error(`project download is over the ${MAX_TARBALL_BYTES}-byte cap`);
|
|
168545
|
-
const root = mkdtempSync4(
|
|
168715
|
+
const root = mkdtempSync4(join80(tmpdir5(), "himi-base44-"));
|
|
168546
168716
|
const cleanup = () => rmSync21(root, { recursive: true, force: true });
|
|
168547
168717
|
try {
|
|
168548
|
-
const archive =
|
|
168549
|
-
const dir =
|
|
168718
|
+
const archive = join80(root, "project.tar");
|
|
168719
|
+
const dir = join80(root, "project");
|
|
168550
168720
|
writeFileSync35(archive, bytes2);
|
|
168551
168721
|
mkdirSync39(dir);
|
|
168552
168722
|
await extract(archive, dir);
|
|
@@ -169841,8 +170011,8 @@ var init_customer_build = __esm({
|
|
|
169841
170011
|
});
|
|
169842
170012
|
|
|
169843
170013
|
// src/site-analyze/apply.ts
|
|
169844
|
-
import { existsSync as existsSync77, readFileSync as
|
|
169845
|
-
import { dirname as dirname42, isAbsolute as isAbsolute8, join as
|
|
170014
|
+
import { existsSync as existsSync77, readFileSync as readFileSync95, writeFileSync as writeFileSync36, copyFileSync as copyFileSync2, mkdirSync as mkdirSync40, realpathSync as realpathSync14, statSync as statSync20 } from "node:fs";
|
|
170015
|
+
import { dirname as dirname42, isAbsolute as isAbsolute8, join as join81, resolve as resolve58, sep as sep20 } from "node:path";
|
|
169846
170016
|
import { spawnSync as spawnSync4 } from "node:child_process";
|
|
169847
170017
|
function unpairedRedirectNote(overlay) {
|
|
169848
170018
|
if (!overlay.wix?.clientId || overlay.wix.redirectUri) return void 0;
|
|
@@ -169857,7 +170027,7 @@ function committedShellProvisioning(path2) {
|
|
|
169857
170027
|
function findRepoRoot(cwd) {
|
|
169858
170028
|
let dir = cwd;
|
|
169859
170029
|
for (let i2 = 0; i2 < 8; i2++) {
|
|
169860
|
-
if (SHELL_NAMES2.some((name) => existsSync77(
|
|
170030
|
+
if (SHELL_NAMES2.some((name) => existsSync77(join81(dir, shellAppDir(name), "package.json")))) return dir;
|
|
169861
170031
|
const next = dirname42(dir);
|
|
169862
170032
|
if (next === dir) break;
|
|
169863
170033
|
dir = next;
|
|
@@ -169960,11 +170130,11 @@ function sameKnownSite(previous, next) {
|
|
|
169960
170130
|
}
|
|
169961
170131
|
function buildMergedContract(options) {
|
|
169962
170132
|
const { appDir: appDir3, packageDir, overlay } = options;
|
|
169963
|
-
const committedPath =
|
|
170133
|
+
const committedPath = join81(appDir3, "provisioning.json");
|
|
169964
170134
|
if (!existsSync77(committedPath)) {
|
|
169965
170135
|
throw new Error(`shell has no committed provisioning.json at ${committedPath} to build a contract from`);
|
|
169966
170136
|
}
|
|
169967
|
-
const committed = JSON.parse(
|
|
170137
|
+
const committed = JSON.parse(readFileSync95(committedPath, "utf8"));
|
|
169968
170138
|
const merged = mergeCustomerOwned(committed, overlay);
|
|
169969
170139
|
const overlayFontFamily = (overlay.branding ?? {}).fontFamily;
|
|
169970
170140
|
const branding = merged.branding ?? {};
|
|
@@ -169976,7 +170146,7 @@ function buildMergedContract(options) {
|
|
|
169976
170146
|
};
|
|
169977
170147
|
const stage = (fromRel, toRel) => {
|
|
169978
170148
|
const from = contained(packageDir, fromRel);
|
|
169979
|
-
const to2 = contained(
|
|
170149
|
+
const to2 = contained(join81(appDir3, STAGED), toRel.slice(STAGED.length + 1));
|
|
169980
170150
|
if (!from || !to2 || !existsSync77(from)) return void 0;
|
|
169981
170151
|
let real;
|
|
169982
170152
|
let realRoot;
|
|
@@ -169999,11 +170169,11 @@ function buildMergedContract(options) {
|
|
|
169999
170169
|
};
|
|
170000
170170
|
const icon = stage("media/icon.png", `${STAGED}/icon.png`);
|
|
170001
170171
|
if (icon) branding.appIconPath = icon;
|
|
170002
|
-
const facesPath =
|
|
170172
|
+
const facesPath = join81(packageDir, "media/fonts/faces.json");
|
|
170003
170173
|
if (existsSync77(facesPath)) {
|
|
170004
170174
|
let faces = [];
|
|
170005
170175
|
try {
|
|
170006
|
-
const parsed = JSON.parse(
|
|
170176
|
+
const parsed = JSON.parse(readFileSync95(facesPath, "utf8"));
|
|
170007
170177
|
faces = Array.isArray(parsed) ? parsed : [];
|
|
170008
170178
|
} catch {
|
|
170009
170179
|
faces = [];
|
|
@@ -170024,9 +170194,9 @@ function buildMergedContract(options) {
|
|
|
170024
170194
|
merged.branding = branding;
|
|
170025
170195
|
const body = `${JSON.stringify(merged, null, 2)}
|
|
170026
170196
|
`;
|
|
170027
|
-
const path2 =
|
|
170197
|
+
const path2 = join81(packageDir, "provisioning.contract.json");
|
|
170028
170198
|
writeFileSync36(path2, body);
|
|
170029
|
-
const localPath2 =
|
|
170199
|
+
const localPath2 = join81(appDir3, LOCAL_CONTRACT_REL);
|
|
170030
170200
|
mkdirSync40(dirname42(localPath2), { recursive: true });
|
|
170031
170201
|
writeFileSync36(localPath2, body);
|
|
170032
170202
|
staged.push(localPath2);
|
|
@@ -170061,10 +170231,10 @@ function catalogTypography(overlay, template) {
|
|
|
170061
170231
|
function staticFaqFor(overlay, overlayPath) {
|
|
170062
170232
|
const own4 = overlay.faq;
|
|
170063
170233
|
if (own4 !== void 0) return deriveStaticFaq(own4);
|
|
170064
|
-
const bookPath =
|
|
170234
|
+
const bookPath = join81(dirname42(resolve58(overlayPath)), "book.json");
|
|
170065
170235
|
if (!existsSync77(bookPath)) return void 0;
|
|
170066
170236
|
try {
|
|
170067
|
-
const book = JSON.parse(
|
|
170237
|
+
const book = JSON.parse(readFileSync95(bookPath, "utf8"));
|
|
170068
170238
|
const copy = book?.copy;
|
|
170069
170239
|
if (!copy || typeof copy !== "object" || copy.unavailable) return void 0;
|
|
170070
170240
|
const pairs = deriveStaticFaq(copy.faq);
|
|
@@ -170078,10 +170248,10 @@ function staticGalleriesFor(overlay, overlayPath) {
|
|
|
170078
170248
|
if (overlay.galleries !== void 0) return deriveStaticGalleries(
|
|
170079
170249
|
overlay.galleries.map((gallery) => ({ role: "gallery", title: gallery.title, galleryImageUrls: gallery.photos }))
|
|
170080
170250
|
);
|
|
170081
|
-
const bookPath =
|
|
170251
|
+
const bookPath = join81(dirname42(resolve58(overlayPath)), "book.json");
|
|
170082
170252
|
if (!existsSync77(bookPath)) return void 0;
|
|
170083
170253
|
try {
|
|
170084
|
-
const book = JSON.parse(
|
|
170254
|
+
const book = JSON.parse(readFileSync95(bookPath, "utf8"));
|
|
170085
170255
|
if (!book.look || book.look.unavailable || !Array.isArray(book.look.pages)) return void 0;
|
|
170086
170256
|
const galleries = deriveStaticGalleries(book.look.pages);
|
|
170087
170257
|
return galleries.length || book.look.complete === true ? galleries : void 0;
|
|
@@ -170093,8 +170263,8 @@ async function applyOverlays(input) {
|
|
|
170093
170263
|
const cwd = resolve58(input.cwd);
|
|
170094
170264
|
const shell = input.shell ?? DEFAULT_BRANDABLE_SHELL;
|
|
170095
170265
|
assertKnownShell(shell);
|
|
170096
|
-
const overlay = JSON.parse(
|
|
170097
|
-
const tokens2 = JSON.parse(
|
|
170266
|
+
const overlay = JSON.parse(readFileSync95(input.overlayPath, "utf8"));
|
|
170267
|
+
const tokens2 = JSON.parse(readFileSync95(input.tokensPath, "utf8"));
|
|
170098
170268
|
const faq = staticFaqFor(overlay, input.overlayPath);
|
|
170099
170269
|
if (faq !== void 0) overlay.faq = faq;
|
|
170100
170270
|
const galleries = staticGalleriesFor(overlay, input.overlayPath);
|
|
@@ -170111,9 +170281,9 @@ async function applyOverlays(input) {
|
|
|
170111
170281
|
`shell "${shell}" cannot bake a customer brand \u2014 it ships no prepare:customer script`
|
|
170112
170282
|
);
|
|
170113
170283
|
}
|
|
170114
|
-
const appDir3 =
|
|
170115
|
-
const committedPath =
|
|
170116
|
-
const committedSite = existsSync77(committedPath) ? JSON.parse(
|
|
170284
|
+
const appDir3 = join81(repoRoot2, shellAppDir(shell));
|
|
170285
|
+
const committedPath = join81(appDir3, "provisioning.json");
|
|
170286
|
+
const committedSite = existsSync77(committedPath) ? JSON.parse(readFileSync95(committedPath, "utf8")).site : void 0;
|
|
170117
170287
|
if (committedSite !== void 0 && overlay.site === void 0) {
|
|
170118
170288
|
throw new Error(
|
|
170119
170289
|
`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.`
|
|
@@ -170140,9 +170310,9 @@ async function applyOverlays(input) {
|
|
|
170140
170310
|
note: `prepare:customer --contract with a merged contract (committed provisioning.json untouched)${unpairedInRepo ? ` \xB7 ${unpairedInRepo}` : ""}`
|
|
170141
170311
|
};
|
|
170142
170312
|
}
|
|
170143
|
-
const pkgProv =
|
|
170313
|
+
const pkgProv = join81(cwd, "provisioning.json");
|
|
170144
170314
|
assertNotCommitted(pkgProv, input.forbiddenProvisioning);
|
|
170145
|
-
const contentPath =
|
|
170315
|
+
const contentPath = join81(cwd, "himalaya.content.json");
|
|
170146
170316
|
const syncViewNames = (before, after) => {
|
|
170147
170317
|
const content = readContentManifest(cwd);
|
|
170148
170318
|
if (!content) return;
|
|
@@ -170155,7 +170325,7 @@ async function applyOverlays(input) {
|
|
|
170155
170325
|
let packageFaq = faq;
|
|
170156
170326
|
let packageGalleries = galleries;
|
|
170157
170327
|
if (existsSync77(pkgProv)) {
|
|
170158
|
-
const cur = JSON.parse(
|
|
170328
|
+
const cur = JSON.parse(readFileSync95(pkgProv, "utf8"));
|
|
170159
170329
|
if (galleries === void 0 && !sameKnownSite(cur, overlay)) overlay.galleries = [];
|
|
170160
170330
|
const merged = deepMerge4(cur, overlay);
|
|
170161
170331
|
packageFaq = merged.faq;
|
|
@@ -170171,9 +170341,9 @@ async function applyOverlays(input) {
|
|
|
170171
170341
|
if (Array.isArray(packageGalleries) && packageGalleries.length && !overlay.installedVerticals.includes("galleries")) {
|
|
170172
170342
|
overlay.installedVerticals.push("galleries");
|
|
170173
170343
|
}
|
|
170174
|
-
const pkgTokens =
|
|
170344
|
+
const pkgTokens = join81(cwd, "tokens.json");
|
|
170175
170345
|
if (existsSync77(pkgTokens) && (tokens2.colors || tokens2.typography)) {
|
|
170176
|
-
const cur = JSON.parse(
|
|
170346
|
+
const cur = JSON.parse(readFileSync95(pkgTokens, "utf8"));
|
|
170177
170347
|
let tokensIn = tokens2;
|
|
170178
170348
|
if (tokens2.typography) {
|
|
170179
170349
|
const fonts = catalogTypography(tokens2.typography, cur.typography);
|
|
@@ -170198,9 +170368,9 @@ async function applyOverlays(input) {
|
|
|
170198
170368
|
wrote.push(pkgTokens);
|
|
170199
170369
|
}
|
|
170200
170370
|
const homeAction = homeRefreshActionId(shell);
|
|
170201
|
-
const homeSrc =
|
|
170371
|
+
const homeSrc = join81(cwd, "dev/index.ts");
|
|
170202
170372
|
if (homeAction && existsSync77(homeSrc)) {
|
|
170203
|
-
const prev =
|
|
170373
|
+
const prev = readFileSync95(homeSrc, "utf8");
|
|
170204
170374
|
const patched = patchBrandParams(prev, overlay, homeAction);
|
|
170205
170375
|
let next = patched.src;
|
|
170206
170376
|
if (!patched.foreign && faq?.length && prev.includes('"tier5.himiBrandedFaq.load"') && !prev.includes('"staticFaq"')) {
|
|
@@ -171199,7 +171369,7 @@ __export(cli_exports2, {
|
|
|
171199
171369
|
runSiteAnalyze: () => runSiteAnalyze,
|
|
171200
171370
|
runSiteFunctionCli: () => runSiteFunctionCli
|
|
171201
171371
|
});
|
|
171202
|
-
import { existsSync as existsSync78, readFileSync as
|
|
171372
|
+
import { existsSync as existsSync78, readFileSync as readFileSync96 } from "node:fs";
|
|
171203
171373
|
import { resolve as resolve59 } from "node:path";
|
|
171204
171374
|
function applyNeedsClient(shell) {
|
|
171205
171375
|
if (shell === void 0 || !SHELL_NAMES2.includes(shell)) return true;
|
|
@@ -171258,7 +171428,7 @@ async function runSiteAnalyze(opts) {
|
|
|
171258
171428
|
const prevOverlayPath = resolve59(outDir, "provisioning.overlay.json");
|
|
171259
171429
|
const prevSite = existsSync78(prevOverlayPath) ? (() => {
|
|
171260
171430
|
try {
|
|
171261
|
-
return JSON.parse(
|
|
171431
|
+
return JSON.parse(readFileSync96(prevOverlayPath, "utf8")).site;
|
|
171262
171432
|
} catch {
|
|
171263
171433
|
return void 0;
|
|
171264
171434
|
}
|
|
@@ -171277,7 +171447,7 @@ async function runSiteAnalyze(opts) {
|
|
|
171277
171447
|
}
|
|
171278
171448
|
const previousOverlay = resolve59(outDir, "provisioning.overlay.json");
|
|
171279
171449
|
carryOverGoals(
|
|
171280
|
-
existsSync78(previousOverlay) ?
|
|
171450
|
+
existsSync78(previousOverlay) ? readFileSync96(previousOverlay, "utf8") : void 0,
|
|
171281
171451
|
result.provisioningOverlay
|
|
171282
171452
|
);
|
|
171283
171453
|
const ownerCall = ownerAuth ? ownerTransportFrom(fetchImpl, ownerAuth) : void 0;
|
|
@@ -171335,7 +171505,7 @@ async function runSiteFunctionCli(opts) {
|
|
|
171335
171505
|
let source;
|
|
171336
171506
|
if (opts.sourcePath) {
|
|
171337
171507
|
const p2 = resolve59(opts.cwd ?? process.cwd(), opts.sourcePath);
|
|
171338
|
-
source =
|
|
171508
|
+
source = readFileSync96(p2, "utf8");
|
|
171339
171509
|
}
|
|
171340
171510
|
let body;
|
|
171341
171511
|
if (opts.bodyRaw != null) {
|
|
@@ -171365,7 +171535,7 @@ async function runSiteFunctionCli(opts) {
|
|
|
171365
171535
|
function base44BookRoutes(bookPath, siteUrl) {
|
|
171366
171536
|
if (!existsSync78(bookPath)) return void 0;
|
|
171367
171537
|
try {
|
|
171368
|
-
const book = JSON.parse(
|
|
171538
|
+
const book = JSON.parse(readFileSync96(bookPath, "utf8"));
|
|
171369
171539
|
if (book.kind !== "base44-app-book" || !Array.isArray(book.routes)) return void 0;
|
|
171370
171540
|
const host = (u2) => {
|
|
171371
171541
|
try {
|
|
@@ -171620,7 +171790,7 @@ __export(site_create_exports, {
|
|
|
171620
171790
|
runSiteList: () => runSiteList,
|
|
171621
171791
|
writeProvisioningBinding: () => writeProvisioningBinding
|
|
171622
171792
|
});
|
|
171623
|
-
import { existsSync as existsSync79, readFileSync as
|
|
171793
|
+
import { existsSync as existsSync79, readFileSync as readFileSync97, writeFileSync as writeFileSync37 } from "node:fs";
|
|
171624
171794
|
import { resolve as resolvePath2 } from "node:path";
|
|
171625
171795
|
function oauthClientName(projectName) {
|
|
171626
171796
|
return `${projectName} client`;
|
|
@@ -171769,7 +171939,7 @@ async function runSiteCreate(opts) {
|
|
|
171769
171939
|
if (!wantOauthApp) return { ...base, nextSteps: nextSteps(metaSiteId) };
|
|
171770
171940
|
return { ...base, clientId, redirectUri, nextSteps: nextSteps(metaSiteId, clientId) };
|
|
171771
171941
|
}
|
|
171772
|
-
function writeProvisioningBinding(target, binding2, fs2 = { existsSync: existsSync79, readFileSync:
|
|
171942
|
+
function writeProvisioningBinding(target, binding2, fs2 = { existsSync: existsSync79, readFileSync: readFileSync97, writeFileSync: writeFileSync37 }) {
|
|
171773
171943
|
const msid = binding2.siteId;
|
|
171774
171944
|
const path2 = resolvePath2(target);
|
|
171775
171945
|
const committed = committedShellProvisioning(path2);
|
|
@@ -172445,12 +172615,12 @@ var init_context = __esm({
|
|
|
172445
172615
|
});
|
|
172446
172616
|
|
|
172447
172617
|
// src/cli.ts
|
|
172448
|
-
import { mkdtempSync as mkdtempSync5, readFileSync as
|
|
172618
|
+
import { mkdtempSync as mkdtempSync5, readFileSync as readFileSync98, mkdirSync as mkdirSync41, writeFileSync as writeFileSync38, existsSync as existsSync80, rmSync as rmSync22, readdirSync as readdirSync34, statSync as statSync21, lstatSync as lstatSync21, accessSync, constants as constants4, renameSync as renameSync12, cpSync as cpSync3 } from "node:fs";
|
|
172449
172619
|
import { execFile as execFile2, execFileSync as execFileSync7, spawnSync as spawnSync5, spawn as spawn7 } from "node:child_process";
|
|
172450
172620
|
import { AsyncLocalStorage as AsyncLocalStorage2 } from "node:async_hooks";
|
|
172451
172621
|
import { createHash as createHash41, randomUUID as randomUUID11 } from "node:crypto";
|
|
172452
172622
|
import { tmpdir as tmpdir6, homedir as homedir11, hostname as hostname2 } from "node:os";
|
|
172453
|
-
import { join as
|
|
172623
|
+
import { join as join82, resolve as resolve60, relative as relative15, basename as basename19, dirname as dirname43 } from "node:path";
|
|
172454
172624
|
import { fileURLToPath as fileURLToPath27 } from "node:url";
|
|
172455
172625
|
|
|
172456
172626
|
// ../serve-cli/src/client.ts
|
|
@@ -174604,8 +174774,8 @@ var str9 = (v2) => typeof v2 === "string" ? v2 : void 0;
|
|
|
174604
174774
|
var num3 = (v2) => typeof v2 === "string" && v2 !== "" && Number.isFinite(Number(v2)) ? Number(v2) : void 0;
|
|
174605
174775
|
function embeddedTemplateCatalog() {
|
|
174606
174776
|
return availableTemplates().map((name) => {
|
|
174607
|
-
const path2 =
|
|
174608
|
-
const meta = JSON.parse(
|
|
174777
|
+
const path2 = join82(templateSourceDir(name), TEMPLATE_META_FILE);
|
|
174778
|
+
const meta = JSON.parse(readFileSync98(path2, "utf8"));
|
|
174609
174779
|
if (!meta || typeof meta.title !== "string" || typeof meta.description !== "string" || !Array.isArray(meta.tags)) {
|
|
174610
174780
|
throw new Error(`${path2} must be { title: string, description: string, tags: string[], category?: string }`);
|
|
174611
174781
|
}
|
|
@@ -175476,7 +175646,7 @@ var COMMANDS2 = [
|
|
|
175476
175646
|
];
|
|
175477
175647
|
function cliVersion() {
|
|
175478
175648
|
try {
|
|
175479
|
-
return JSON.parse(
|
|
175649
|
+
return JSON.parse(readFileSync98(new URL("../package.json", import.meta.url), "utf8")).version ?? "unknown";
|
|
175480
175650
|
} catch {
|
|
175481
175651
|
return "unknown";
|
|
175482
175652
|
}
|
|
@@ -175601,7 +175771,7 @@ function ageInDays(publishedAt, now = Date.now()) {
|
|
|
175601
175771
|
}
|
|
175602
175772
|
function packageVersion(path2) {
|
|
175603
175773
|
try {
|
|
175604
|
-
const version4 = JSON.parse(
|
|
175774
|
+
const version4 = JSON.parse(readFileSync98(path2, "utf8")).version;
|
|
175605
175775
|
return typeof version4 === "string" && version4 ? version4 : void 0;
|
|
175606
175776
|
} catch {
|
|
175607
175777
|
return void 0;
|
|
@@ -175610,7 +175780,7 @@ function packageVersion(path2) {
|
|
|
175610
175780
|
function resolvedSdkVersion(fromDir = process.cwd(), bundledManifest = new URL("./authoring-runtime/node_modules/@wix/himalaya/package.json", import.meta.url)) {
|
|
175611
175781
|
let dir = resolve60(fromDir);
|
|
175612
175782
|
for (; ; ) {
|
|
175613
|
-
const version4 = packageVersion(
|
|
175783
|
+
const version4 = packageVersion(join82(dir, "node_modules", "@wix", "himalaya", "package.json"));
|
|
175614
175784
|
if (version4) return { version: version4, source: "local" };
|
|
175615
175785
|
const parent = dirname43(dir);
|
|
175616
175786
|
if (parent === dir) break;
|
|
@@ -175620,7 +175790,7 @@ function resolvedSdkVersion(fromDir = process.cwd(), bundledManifest = new URL("
|
|
|
175620
175790
|
if (bundled) return { version: bundled, source: "bundled" };
|
|
175621
175791
|
try {
|
|
175622
175792
|
const root = execFileSync7("npm", ["root", "-g"], { stdio: ["ignore", "pipe", "ignore"] }).toString().trim();
|
|
175623
|
-
const version4 = root ? packageVersion(
|
|
175793
|
+
const version4 = root ? packageVersion(join82(root, "@wix", "himalaya", "package.json")) : void 0;
|
|
175624
175794
|
return version4 ? { version: version4, source: "global" } : {};
|
|
175625
175795
|
} catch {
|
|
175626
175796
|
return {};
|
|
@@ -175667,11 +175837,11 @@ var UPDATE_RETRY_AFTER_FAILURE_MS = 60 * 60 * 1e3;
|
|
|
175667
175837
|
var UPDATE_SNOOZE_MS = 24 * 60 * 60 * 1e3;
|
|
175668
175838
|
var UPDATE_REEXEC_ENV = "HIMI_UPDATED_ONCE";
|
|
175669
175839
|
function updateCachePath(env = process.env) {
|
|
175670
|
-
return env.HIMI_UPDATE_CACHE_FILE ??
|
|
175840
|
+
return env.HIMI_UPDATE_CACHE_FILE ?? join82(homedir11(), ".himalaya", "update-check.json");
|
|
175671
175841
|
}
|
|
175672
175842
|
function readUpdateCache(path2) {
|
|
175673
175843
|
try {
|
|
175674
|
-
const parsed = JSON.parse(
|
|
175844
|
+
const parsed = JSON.parse(readFileSync98(path2, "utf8"));
|
|
175675
175845
|
return parsed && typeof parsed === "object" ? parsed : {};
|
|
175676
175846
|
} catch {
|
|
175677
175847
|
return {};
|
|
@@ -175740,11 +175910,11 @@ function createUpdateRunner(spawn8 = spawnSync5) {
|
|
|
175740
175910
|
},
|
|
175741
175911
|
installedVersion: () => {
|
|
175742
175912
|
const root = globalNodeModulesRoot();
|
|
175743
|
-
return root ? packageVersion(
|
|
175913
|
+
return root ? packageVersion(join82(root, "@wix", "himalaya-cli", "package.json")) : void 0;
|
|
175744
175914
|
},
|
|
175745
175915
|
reexec: (argv) => {
|
|
175746
175916
|
const root = globalNodeModulesRoot();
|
|
175747
|
-
const entry = root ?
|
|
175917
|
+
const entry = root ? join82(root, "@wix", "himalaya-cli", "dist", "cli.mjs") : void 0;
|
|
175748
175918
|
if (!entry || !existsSync80(entry)) return void 0;
|
|
175749
175919
|
const result = spawnSync5(process.execPath, [entry, ...argv], {
|
|
175750
175920
|
// inherit keeps PIPED STDIN working — commands that read stdin must survive a re-exec.
|
|
@@ -175792,7 +175962,7 @@ function staleUpdateLockFile(cachePath, now) {
|
|
|
175792
175962
|
for (const path2 of [`${cachePath}.lock.break`, `${cachePath}.lock`]) {
|
|
175793
175963
|
let content;
|
|
175794
175964
|
try {
|
|
175795
|
-
content =
|
|
175965
|
+
content = readFileSync98(path2, "utf8");
|
|
175796
175966
|
} catch {
|
|
175797
175967
|
continue;
|
|
175798
175968
|
}
|
|
@@ -175815,7 +175985,7 @@ function acquireUpdateLock(cachePath, now, hooks = {}) {
|
|
|
175815
175985
|
const mine = lockStamp(now);
|
|
175816
175986
|
const readLock = (path2) => {
|
|
175817
175987
|
try {
|
|
175818
|
-
return
|
|
175988
|
+
return readFileSync98(path2, "utf8");
|
|
175819
175989
|
} catch {
|
|
175820
175990
|
return void 0;
|
|
175821
175991
|
}
|
|
@@ -176407,7 +176577,7 @@ function executableOnPath(name, env = process.env) {
|
|
|
176407
176577
|
const suffixes = process.platform === "win32" ? (env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean) : [""];
|
|
176408
176578
|
for (const dir of entries) {
|
|
176409
176579
|
for (const suffix of suffixes) {
|
|
176410
|
-
const candidate =
|
|
176580
|
+
const candidate = join82(dir, `${name}${suffix}`);
|
|
176411
176581
|
try {
|
|
176412
176582
|
if (!statSync21(candidate).isFile()) continue;
|
|
176413
176583
|
if (process.platform !== "win32") accessSync(candidate, constants4.X_OK);
|
|
@@ -176516,7 +176686,7 @@ async function nativeConfigAdvisories(app, configSource) {
|
|
|
176516
176686
|
const { iosProjectYml: iosProjectYml2 } = await Promise.resolve().then(() => (init_paths2(), paths_exports));
|
|
176517
176687
|
const { androidOptedIn: androidOptedIn3, LABEL_IOS_SPLASH: LABEL_IOS_SPLASH2 } = await Promise.resolve().then(() => (init_splash(), splash_exports));
|
|
176518
176688
|
const iosYmlPath = iosProjectYml2(app);
|
|
176519
|
-
const iosYml = existsSync80(iosYmlPath) ?
|
|
176689
|
+
const iosYml = existsSync80(iosYmlPath) ? readFileSync98(iosYmlPath, "utf8") : "";
|
|
176520
176690
|
let optedIn = iosYml.includes(LABEL_IOS_SPLASH2);
|
|
176521
176691
|
if (!optedIn) {
|
|
176522
176692
|
const { androidManifestPath: androidManifestPath3 } = await Promise.resolve().then(() => (init_gen_native_config(), gen_native_config_exports));
|
|
@@ -176530,7 +176700,7 @@ async function nativeConfigAdvisories(app, configSource) {
|
|
|
176530
176700
|
}
|
|
176531
176701
|
function readConfigSource(dir) {
|
|
176532
176702
|
try {
|
|
176533
|
-
return
|
|
176703
|
+
return readFileSync98(join82(dir, "config.ts"), "utf8");
|
|
176534
176704
|
} catch {
|
|
176535
176705
|
return null;
|
|
176536
176706
|
}
|
|
@@ -176584,7 +176754,7 @@ var NoBase44SlotError = class extends Error {
|
|
|
176584
176754
|
};
|
|
176585
176755
|
async function initFromRemoteTemplate(name, parentDir, template, c2, opts = {}) {
|
|
176586
176756
|
const dir = resolve60(parentDir, name);
|
|
176587
|
-
if (existsSync80(
|
|
176757
|
+
if (existsSync80(join82(dir, "himalaya.content.json"))) {
|
|
176588
176758
|
throw new Error(`content package already exists at ${dir}`);
|
|
176589
176759
|
}
|
|
176590
176760
|
const r2 = await c2.fetchTemplateSource(TEMPLATE_APP_PREFIX + template);
|
|
@@ -176645,7 +176815,7 @@ function restoreDestinationIssue(dest, force) {
|
|
|
176645
176815
|
function isHimalayaMonorepoCheckout(start) {
|
|
176646
176816
|
let dir = resolve60(start);
|
|
176647
176817
|
for (; ; ) {
|
|
176648
|
-
if (existsSync80(
|
|
176818
|
+
if (existsSync80(join82(dir, "tools", "himi-cli", "src", "cli.ts")) && existsSync80(join82(dir, "core", "serve", "src", "server.ts"))) return true;
|
|
176649
176819
|
const parent = dirname43(dir);
|
|
176650
176820
|
if (parent === dir) return false;
|
|
176651
176821
|
dir = parent;
|
|
@@ -176706,7 +176876,7 @@ function materializeForPreview(appDir3, slug, displayName2) {
|
|
|
176706
176876
|
Object.entries(files).map(([rel, body]) => [rel, rel === "himalaya.content.json" ? substituteIdentity(body, slug) : body])
|
|
176707
176877
|
);
|
|
176708
176878
|
const repoRoot2 = resolve60(fileURLToPath27(new URL("../../..", import.meta.url)));
|
|
176709
|
-
const root =
|
|
176879
|
+
const root = join82(repoRoot2, "node_modules", ".cache", "himi-template-preview");
|
|
176710
176880
|
const stillRunning = (pid) => {
|
|
176711
176881
|
try {
|
|
176712
176882
|
process.kill(pid, 0);
|
|
@@ -176720,12 +176890,12 @@ function materializeForPreview(appDir3, slug, displayName2) {
|
|
|
176720
176890
|
if (!entry.isDirectory()) continue;
|
|
176721
176891
|
const pid = Number(entry.name.startsWith(`${slug}-`) ? entry.name.slice(slug.length + 1) : NaN);
|
|
176722
176892
|
if (Number.isInteger(pid) && pid > 0 && pid !== process.pid && !stillRunning(pid)) {
|
|
176723
|
-
rmSync22(
|
|
176893
|
+
rmSync22(join82(root, entry.name), { recursive: true, force: true });
|
|
176724
176894
|
}
|
|
176725
176895
|
}
|
|
176726
176896
|
} catch {
|
|
176727
176897
|
}
|
|
176728
|
-
const dest =
|
|
176898
|
+
const dest = join82(root, `${slug}-${process.pid}`);
|
|
176729
176899
|
rmSync22(dest, { recursive: true, force: true });
|
|
176730
176900
|
mkdirSync41(dest, { recursive: true });
|
|
176731
176901
|
try {
|
|
@@ -176738,8 +176908,8 @@ function materializeForPreview(appDir3, slug, displayName2) {
|
|
|
176738
176908
|
}
|
|
176739
176909
|
async function appId(dir) {
|
|
176740
176910
|
try {
|
|
176741
|
-
const { readFileSync:
|
|
176742
|
-
const m2 = JSON.parse(
|
|
176911
|
+
const { readFileSync: readFileSync99 } = await import("node:fs");
|
|
176912
|
+
const m2 = JSON.parse(readFileSync99(join82(dir, "himalaya.content.json"), "utf8"));
|
|
176743
176913
|
if (m2.name) return m2.name;
|
|
176744
176914
|
} catch {
|
|
176745
176915
|
}
|
|
@@ -176747,8 +176917,8 @@ async function appId(dir) {
|
|
|
176747
176917
|
}
|
|
176748
176918
|
async function contentVisibility(dir) {
|
|
176749
176919
|
try {
|
|
176750
|
-
const { readFileSync:
|
|
176751
|
-
const m2 = JSON.parse(
|
|
176920
|
+
const { readFileSync: readFileSync99 } = await import("node:fs");
|
|
176921
|
+
const m2 = JSON.parse(readFileSync99(join82(dir, "himalaya.content.json"), "utf8"));
|
|
176752
176922
|
if (m2.visibility === "public" || m2.visibility === "unlisted") return m2.visibility;
|
|
176753
176923
|
} catch {
|
|
176754
176924
|
}
|
|
@@ -177037,7 +177207,7 @@ Seed your coding agent with \`himi agent-init\`. Guides: ${idx.portalUrl}`);
|
|
|
177037
177207
|
...res.removed.length ? { removed: res.removed, note: "older copies at the app root, moved to .himi/legacy-agent-files/ (a backup, in case one became app code) \u2014 the current ones live in .agents/skills/himalaya/" } : {},
|
|
177038
177208
|
// In a git repo the refresh moves the diff identity an earlier `himi test` attested (that
|
|
177039
177209
|
// hash is shared with the repo gates and deliberately exempts nothing but its own metadata).
|
|
177040
|
-
...existsSync80(
|
|
177210
|
+
...existsSync80(join82(dir, ".himi", "attestations", "latest.json")) ? { next: "if `himi push` then refuses the attestation as stale, re-run `himi test` \u2014 in a git checkout this refresh changed the tree it covered" } : {},
|
|
177041
177211
|
...res.skipped.length ? { skipped: res.skipped } : {},
|
|
177042
177212
|
portalUrl: idx.portalUrl
|
|
177043
177213
|
});
|
|
@@ -177060,7 +177230,7 @@ async function recordedReleaseForContentQuietly(dir, resolution, onDrift) {
|
|
|
177060
177230
|
try {
|
|
177061
177231
|
const { buildContentForValidation: buildContentForValidation2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
177062
177232
|
const bres = await buildContentForValidation2(dir, { resolution });
|
|
177063
|
-
out2 = mkdtempSync5(
|
|
177233
|
+
out2 = mkdtempSync5(join82(tmpdir6(), "himi-ux-record-"));
|
|
177064
177234
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
177065
177235
|
const outcome = await buildReleaseFromContent2(dir, out2, { ...hasWorkers ? { tier5Dir: bundleOutDir2(dir) } : {}, collect: { lint: true } });
|
|
177066
177236
|
const releaseId = outcome.manifest.releaseId;
|
|
@@ -177239,7 +177409,7 @@ async function producedWidgetFamilies(dir) {
|
|
|
177239
177409
|
let js2;
|
|
177240
177410
|
for (const candidate of [`${name}.bundle.js`, `${name}.js`, name]) {
|
|
177241
177411
|
try {
|
|
177242
|
-
js2 =
|
|
177412
|
+
js2 = readFileSync98(join82(outDir, candidate), "utf8");
|
|
177243
177413
|
break;
|
|
177244
177414
|
} catch {
|
|
177245
177415
|
}
|
|
@@ -177270,7 +177440,7 @@ async function producedWidgetFamilies(dir) {
|
|
|
177270
177440
|
}
|
|
177271
177441
|
return { families, source: "dist/bundles" };
|
|
177272
177442
|
}
|
|
177273
|
-
var boardOpen = (dir) => existsSync80(
|
|
177443
|
+
var boardOpen = (dir) => existsSync80(join82(dir, ".himi", "studio", "index.html"));
|
|
177274
177444
|
var BOARD_REFRESHERS = /* @__PURE__ */ new Set(["render", "test", "validate", "build", "push", "icon", "site", "ux", "progress"]);
|
|
177275
177445
|
async function leaveForBoard(dir, record2, value) {
|
|
177276
177446
|
if (!boardOpen(dir)) return;
|
|
@@ -177294,7 +177464,7 @@ async function liveMapFor(dir) {
|
|
|
177294
177464
|
}
|
|
177295
177465
|
var commandScratch = new AsyncLocalStorage2();
|
|
177296
177466
|
function commandScratchDir(prefix) {
|
|
177297
|
-
const dir = mkdtempSync5(
|
|
177467
|
+
const dir = mkdtempSync5(join82(tmpdir6(), prefix));
|
|
177298
177468
|
commandScratch.getStore()?.push(dir);
|
|
177299
177469
|
return dir;
|
|
177300
177470
|
}
|
|
@@ -177648,7 +177818,7 @@ himi v${cliVersion()} \u2014 run \`himi --version\`. If authoring commands fail
|
|
|
177648
177818
|
const owed = openApprovals2(readApprovals2(dir).events).length;
|
|
177649
177819
|
next.push(`carried the planning journal into the app (${carried.join(", ")}${owed ? `; ${owed} approval${owed === 1 ? "" : "s"} still owed` : ""}) \u2014 \`himi progress --brief\` there shows it`);
|
|
177650
177820
|
}
|
|
177651
|
-
const planInParent = ["SPEC.md", "MOBILE-UX.md"].filter((f2) => existsSync80(
|
|
177821
|
+
const planInParent = ["SPEC.md", "MOBILE-UX.md"].filter((f2) => existsSync80(join82(parentDir, f2)));
|
|
177652
177822
|
if (planInParent.length) {
|
|
177653
177823
|
next.push(`${planInParent.join(" and ")} in ${parentDir} ${planInParent.length > 1 ? "are" : "is"} not the app's \u2014 if that is the approved plan, move it over the template's boilerplate in ${dir}`);
|
|
177654
177824
|
}
|
|
@@ -177809,13 +177979,13 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177809
177979
|
if (adding) {
|
|
177810
177980
|
const from = str9(flags.from);
|
|
177811
177981
|
if (!from) throw new TrimRefusal2('--add <id> needs --from <file> holding the whole new SCREENS entry (` "<id>": { "screenId": "<id>", \u2026 },`)');
|
|
177812
|
-
print(adopt.addScreen(dir, adding,
|
|
177982
|
+
print(adopt.addScreen(dir, adding, readFileSync98(from, "utf8"), { parent: str9(flags.parent), tab: str9(flags.tab), displayName: str9(flags["display-name"]) }));
|
|
177813
177983
|
return 0;
|
|
177814
177984
|
}
|
|
177815
177985
|
if (target) {
|
|
177816
177986
|
const from = str9(flags.from);
|
|
177817
177987
|
if (!from) throw new TrimRefusal2("--write <id> needs --from <file> holding the whole entry, as --show prints it");
|
|
177818
|
-
print(adopt.replaceScreen(dir, target,
|
|
177988
|
+
print(adopt.replaceScreen(dir, target, readFileSync98(from, "utf8")));
|
|
177819
177989
|
return 0;
|
|
177820
177990
|
}
|
|
177821
177991
|
if (show) {
|
|
@@ -177897,7 +178067,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177897
178067
|
const { keepFromSpec: keepFromSpec2 } = await Promise.resolve().then(() => (init_template_adopt(), template_adopt_exports));
|
|
177898
178068
|
const dir = contentDir(flags);
|
|
177899
178069
|
try {
|
|
177900
|
-
const spec = keepFromSpec2(dir, str9(flags["from-spec"]) ??
|
|
178070
|
+
const spec = keepFromSpec2(dir, str9(flags["from-spec"]) ?? join82(dir, "SPEC.md"));
|
|
177901
178071
|
const own4 = typeof keep === "string" ? keep.split(",").map((k2) => k2.trim()).filter(Boolean) : [];
|
|
177902
178072
|
keep = [.../* @__PURE__ */ new Set([...spec.keep, ...own4])].join(",");
|
|
177903
178073
|
fromSpec = { fromSpec: {
|
|
@@ -177938,7 +178108,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177938
178108
|
const result = { ...outcome.result, ...fromSpec };
|
|
177939
178109
|
const adoptDir = contentDir(flags);
|
|
177940
178110
|
const kept = flags["dry-run"] !== true && (outcome.code === 0 || outcome.result.forcedKeep === true);
|
|
177941
|
-
if (kept && existsSync80(
|
|
178111
|
+
if (kept && existsSync80(join82(adoptDir, adoptBits.ADOPT_FILE))) {
|
|
177942
178112
|
try {
|
|
177943
178113
|
const inv = adoptBits.inspectApp(adoptDir);
|
|
177944
178114
|
adoptBits.writeInventory(adoptDir, inv, { companions: "if-missing" });
|
|
@@ -177967,7 +178137,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177967
178137
|
const sourceDir = resolve60(str9(flags["source-dir"]) ?? appDir3);
|
|
177968
178138
|
let meta;
|
|
177969
178139
|
try {
|
|
177970
|
-
meta = JSON.parse(
|
|
178140
|
+
meta = JSON.parse(readFileSync98(join82(sourceDir, TEMPLATE_META_FILE), "utf8"));
|
|
177971
178141
|
} catch {
|
|
177972
178142
|
io2.error(JSON.stringify({ error: `no ${TEMPLATE_META_FILE} in ${sourceDir} \u2014 a template must declare { title, description, tags } to be published`, hint: `add ${TEMPLATE_META_FILE} next to himalaya.content.json (or pass --source-dir <dir>)` }));
|
|
177973
178143
|
return 2;
|
|
@@ -177977,7 +178147,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177977
178147
|
return 2;
|
|
177978
178148
|
}
|
|
177979
178149
|
try {
|
|
177980
|
-
const appearance = extractTemplateAppearance(JSON.parse(
|
|
178150
|
+
const appearance = extractTemplateAppearance(JSON.parse(readFileSync98(join82(sourceDir, "tokens.json"), "utf8")));
|
|
177981
178151
|
meta = { ...appearance, ...meta };
|
|
177982
178152
|
} catch {
|
|
177983
178153
|
}
|
|
@@ -177999,7 +178169,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177999
178169
|
const force = flags.force === true;
|
|
178000
178170
|
const { buildContentForValidation: buildContentForValidation2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
178001
178171
|
const bres = await buildContentForValidation2(buildDir, { resolution: resolutionFlag(flags) });
|
|
178002
|
-
const out2 = mkdtempSync5(
|
|
178172
|
+
const out2 = mkdtempSync5(join82(tmpdir6(), "himi-template-"));
|
|
178003
178173
|
publishScratch.push(out2);
|
|
178004
178174
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
178005
178175
|
const outcome = await buildReleaseFromContent2(buildDir, out2, {
|
|
@@ -178056,7 +178226,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178056
178226
|
let iconHash;
|
|
178057
178227
|
if (iconPath) {
|
|
178058
178228
|
try {
|
|
178059
|
-
const bytes2 =
|
|
178229
|
+
const bytes2 = readFileSync98(iconPath);
|
|
178060
178230
|
payload.icon = bytes2.toString("base64");
|
|
178061
178231
|
iconHash = createHash41("sha256").update(bytes2).digest("hex");
|
|
178062
178232
|
} catch {
|
|
@@ -178355,7 +178525,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178355
178525
|
const path2 = dpxSessionTokenPath();
|
|
178356
178526
|
let raw;
|
|
178357
178527
|
try {
|
|
178358
|
-
raw =
|
|
178528
|
+
raw = readFileSync98(path2, "utf8");
|
|
178359
178529
|
} catch {
|
|
178360
178530
|
throw new Error(`no DPX BO session at ${path2}; run dpx auth login, write dpx auth token to that path, then himi login --dpx --target bo`);
|
|
178361
178531
|
}
|
|
@@ -178489,8 +178659,8 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178489
178659
|
const dir = resolve60(out2);
|
|
178490
178660
|
const files = himiPluginFiles2(skills.skillMd);
|
|
178491
178661
|
for (const f2 of files) {
|
|
178492
|
-
mkdirSync41(dirname43(
|
|
178493
|
-
writeFileSync38(
|
|
178662
|
+
mkdirSync41(dirname43(join82(dir, f2.path)), { recursive: true });
|
|
178663
|
+
writeFileSync38(join82(dir, f2.path), f2.text);
|
|
178494
178664
|
}
|
|
178495
178665
|
print({ ok: true, dir, files: files.map((f2) => f2.path), next: [`claude plugin validate ${dir}`, `claude --plugin-dir ${dir}`] });
|
|
178496
178666
|
return 0;
|
|
@@ -178507,13 +178677,13 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178507
178677
|
case "studio": {
|
|
178508
178678
|
const { openStudio: openStudio2 } = await Promise.resolve().then(() => (init_studio(), studio_exports));
|
|
178509
178679
|
const dir = contentDir(flags);
|
|
178510
|
-
if (!existsSync80(
|
|
178680
|
+
if (!existsSync80(join82(dir, "himalaya.content.json"))) {
|
|
178511
178681
|
io2.error(JSON.stringify({ ok: false, error: "not_a_content_package", dir, hint: "run from the app directory (or pass --content <dir>) \u2014 the board reads that package's .himi/" }));
|
|
178512
178682
|
return 2;
|
|
178513
178683
|
}
|
|
178514
178684
|
if (pos[1] === "reel") {
|
|
178515
178685
|
const { buildReel: buildReel2 } = await Promise.resolve().then(() => (init_studio_reel(), studio_reel_exports));
|
|
178516
|
-
const out2 = resolve60(str9(flags.out) ??
|
|
178686
|
+
const out2 = resolve60(str9(flags.out) ?? join82(dir, ".himi", "making-of.html"));
|
|
178517
178687
|
const { html, plan } = buildReel2(dir);
|
|
178518
178688
|
mkdirSync41(dirname43(out2), { recursive: true });
|
|
178519
178689
|
writeFileSync38(out2, html);
|
|
@@ -178585,7 +178755,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
178585
178755
|
} = await Promise.resolve().then(() => (init_progress(), progress_exports));
|
|
178586
178756
|
const dir = contentDir(flags);
|
|
178587
178757
|
const journal2 = journalPath2(dir);
|
|
178588
|
-
const isContentPackage = existsSync80(
|
|
178758
|
+
const isContentPackage = existsSync80(join82(dir, "himalaya.content.json"));
|
|
178589
178759
|
const hint = isContentPackage ? {} : { hint: "no himalaya.content.json here \u2014 run from the app directory (or pass --content <dir>) so the build board finds this journal" };
|
|
178590
178760
|
const message = pos.slice(1).join(" ").trim();
|
|
178591
178761
|
const approvalFlags = ["approve", "done", "drop"].filter((f2) => flags[f2] !== void 0);
|
|
@@ -178737,7 +178907,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
178737
178907
|
case "test": {
|
|
178738
178908
|
const dir = contentDir(flags);
|
|
178739
178909
|
const structuredOutput = flags.json === true || io2.isTTY !== true;
|
|
178740
|
-
if (existsSync80(
|
|
178910
|
+
if (existsSync80(join82(dir, "functions"))) {
|
|
178741
178911
|
const { invokeLocalFunction: invokeLocalFunction2, loadFunctionsApp: loadFunctionsApp2 } = await Promise.resolve().then(() => (init_functions(), functions_exports));
|
|
178742
178912
|
const loaded = await loadFunctionsApp2(dir);
|
|
178743
178913
|
const results = [];
|
|
@@ -178869,7 +179039,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
178869
179039
|
io2.error(JSON.stringify({ error: `screen "${screen.screenId}" has no Tier-5 worker, so there is nothing for the browser loop to build` }));
|
|
178870
179040
|
return 2;
|
|
178871
179041
|
}
|
|
178872
|
-
const sources = collectWorkerSources2(
|
|
179042
|
+
const sources = collectWorkerSources2(join82(dir, "tier5-src"), screen.bundleName);
|
|
178873
179043
|
if (!sources) {
|
|
178874
179044
|
io2.error(JSON.stringify({ error: `no worker source found at tier5-src/${screen.bundleName} \u2014 the browser loop compiles SOURCE, not the built bundle` }));
|
|
178875
179045
|
return 2;
|
|
@@ -179047,7 +179217,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
179047
179217
|
const sp = await runShotsPass2({
|
|
179048
179218
|
descriptors: scopeDescriptors2(outcome.descriptors ?? [], pos.slice(1), invalidScreens),
|
|
179049
179219
|
tokens: outcome.tokens,
|
|
179050
|
-
outDir:
|
|
179220
|
+
outDir: join82(dir, ".himi", "shots"),
|
|
179051
179221
|
width: 390,
|
|
179052
179222
|
layers: { rules: shotRules, ...cmsSeed ? { cmsSeed } : {}, ...canned ? { canned: canned.byKey } : {} },
|
|
179053
179223
|
...budgetMs ? { budgetMs } : {},
|
|
@@ -179087,7 +179257,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
179087
179257
|
releaseId: result.releaseId,
|
|
179088
179258
|
releasePayload: release2,
|
|
179089
179259
|
descriptors: attestedDescriptors,
|
|
179090
|
-
screenshots: Object.fromEntries(writtenShots.filter((name) => crawledScreens.has(name.replace(/\.png$/, ""))).map((name) => [name.replace(/\.png$/, ""),
|
|
179260
|
+
screenshots: Object.fromEntries(writtenShots.filter((name) => crawledScreens.has(name.replace(/\.png$/, ""))).map((name) => [name.replace(/\.png$/, ""), join82(dir, ".himi", "shots", name)])),
|
|
179091
179261
|
coverage: {
|
|
179092
179262
|
screens: crawledScreens.size,
|
|
179093
179263
|
actionsDispatched: result.actions.exercised,
|
|
@@ -179212,7 +179382,7 @@ ${[...afterRun.next, ...testReminder ? [testReminder] : []].join("\n")}`);
|
|
|
179212
179382
|
return 2;
|
|
179213
179383
|
}
|
|
179214
179384
|
try {
|
|
179215
|
-
const raw = stateArg.trim().startsWith("{") ? stateArg :
|
|
179385
|
+
const raw = stateArg.trim().startsWith("{") ? stateArg : readFileSync98(stateArg.replace(/^@/, ""), "utf8");
|
|
179216
179386
|
injectedState = JSON.parse(raw);
|
|
179217
179387
|
} catch (e2) {
|
|
179218
179388
|
io2.error(JSON.stringify({ error: `--state must be inline JSON or a path to a .json file \u2014 ${e2.message}` }));
|
|
@@ -179227,7 +179397,7 @@ ${[...afterRun.next, ...testReminder ? [testReminder] : []].join("\n")}`);
|
|
|
179227
179397
|
return 2;
|
|
179228
179398
|
}
|
|
179229
179399
|
try {
|
|
179230
|
-
const raw = inputArg.trim().startsWith("{") ? inputArg :
|
|
179400
|
+
const raw = inputArg.trim().startsWith("{") ? inputArg : readFileSync98(inputArg.replace(/^@/, ""), "utf8");
|
|
179231
179401
|
const parsed = JSON.parse(raw);
|
|
179232
179402
|
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("must be a JSON object");
|
|
179233
179403
|
injectedInput = parsed;
|
|
@@ -179309,7 +179479,7 @@ ${[...afterRun.next, ...testReminder ? [testReminder] : []].join("\n")}`);
|
|
|
179309
179479
|
const diagnostics = (outcome.lint ?? []).find((s2) => s2.screenId === screenId)?.issues ?? [];
|
|
179310
179480
|
let pngFile;
|
|
179311
179481
|
let attestationPngFile;
|
|
179312
|
-
const shotPath =
|
|
179482
|
+
const shotPath = join82(dir, ".himi", "shots", `${screenId}.png`);
|
|
179313
179483
|
const pngTarget = typeof flags.png === "string" ? str9(flags.png) : flags.png === true ? shotPath : void 0;
|
|
179314
179484
|
if (pngTarget && r2.pngBase64) {
|
|
179315
179485
|
pngFile = writePngFile(pngTarget, r2.pngBase64);
|
|
@@ -179681,7 +179851,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
179681
179851
|
io2.error(JSON.stringify({ error: `${dest} already exists and is not empty`, hint: "pass --force to write into it anyway (merging, and naming what it keeps), --replace to restore exactly what was archived, or --out/--name to land somewhere else" }));
|
|
179682
179852
|
return 1;
|
|
179683
179853
|
}
|
|
179684
|
-
if (replace && occupied && !existsSync80(
|
|
179854
|
+
if (replace && occupied && !existsSync80(join82(dest, "himalaya.content.json"))) {
|
|
179685
179855
|
io2.error(JSON.stringify({
|
|
179686
179856
|
error: `${dest} is not a content package \u2014 refusing to --replace it`,
|
|
179687
179857
|
hint: "--replace only clears a directory that holds himalaya.content.json. Check --out/--name, or pass --force to merge into it instead."
|
|
@@ -180389,7 +180559,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180389
180559
|
}
|
|
180390
180560
|
const { buildContentForValidation: buildContentForValidation2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
180391
180561
|
const bres = await buildContentForValidation2(dir, { resolution: resolutionFlag(flags) });
|
|
180392
|
-
const built = mkdtempSync5(
|
|
180562
|
+
const built = mkdtempSync5(join82(tmpdir6(), "himi-pack-"));
|
|
180393
180563
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
180394
180564
|
const outcome = await buildReleaseFromContent2(dir, built, {
|
|
180395
180565
|
...hasWorkers ? { tier5Dir: bundleOutDir2(dir) } : {},
|
|
@@ -180596,7 +180766,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180596
180766
|
}));
|
|
180597
180767
|
return 1;
|
|
180598
180768
|
}
|
|
180599
|
-
const archive =
|
|
180769
|
+
const archive = readFileSync98(resolve60(file2));
|
|
180600
180770
|
const result = await client2().createPackageShare({
|
|
180601
180771
|
app: opened.header.app,
|
|
180602
180772
|
releaseId: opened.header.releaseId,
|
|
@@ -180693,11 +180863,11 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180693
180863
|
const app = await appId(dir2);
|
|
180694
180864
|
const { buildContentBundles: buildContentBundles2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
180695
180865
|
const bres = await buildContentBundles2(dir2, { resolution: resolutionFlag(flags) });
|
|
180696
|
-
temp = mkdtempSync5(
|
|
180866
|
+
temp = mkdtempSync5(join82(tmpdir6(), "himi-run-build-"));
|
|
180697
180867
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
180698
180868
|
const initial = await buildReleaseFromContent2(dir2, temp, { ...hasWorkers ? { tier5Dir: bundleOutDir2(dir2) } : {} });
|
|
180699
180869
|
servedMissing = initial.missingBundles;
|
|
180700
|
-
source =
|
|
180870
|
+
source = join82(temp, app);
|
|
180701
180871
|
}
|
|
180702
180872
|
const chromeArg = str9(flags.chrome) ?? "preview";
|
|
180703
180873
|
if (chromeArg !== "preview" && chromeArg !== "app") {
|
|
@@ -180736,7 +180906,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180736
180906
|
if (!recordKit) return;
|
|
180737
180907
|
startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
180738
180908
|
const failure = record2(served2, { ok: true, at: startedAt });
|
|
180739
|
-
if (!recorded) io2.error(JSON.stringify({ run: "run_record_skipped", message: `${failure ?? `${
|
|
180909
|
+
if (!recorded) io2.error(JSON.stringify({ run: "run_record_skipped", message: `${failure ?? `${join82(dir, ".himi")} is not a real directory`}, so the build board will not frame this preview.` }));
|
|
180740
180910
|
await refreshBoard();
|
|
180741
180911
|
};
|
|
180742
180912
|
const retract = async () => {
|
|
@@ -180772,7 +180942,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180772
180942
|
const watchKit = watch2 ? await Promise.resolve().then(() => (init_run_watch(), run_watch_exports)) : null;
|
|
180773
180943
|
const hhpPreviewRoute = watch2 ? (await Promise.resolve().then(() => (init_hhp_preview(), hhp_preview_exports))).hhpPreviewResponse : null;
|
|
180774
180944
|
const bus = watchKit ? new watchKit.ReloadBus() : void 0;
|
|
180775
|
-
if (watch2) served = mkdtempSync5(
|
|
180945
|
+
if (watch2) served = mkdtempSync5(join82(tmpdir6(), "himi-run-served-"));
|
|
180776
180946
|
const running = await runPackage2(source, {
|
|
180777
180947
|
port,
|
|
180778
180948
|
chrome: chromeArg,
|
|
@@ -180801,8 +180971,8 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180801
180971
|
await announce(running);
|
|
180802
180972
|
if (watchKit && bus) {
|
|
180803
180973
|
const { buildContentBundles: buildContentBundles2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
180804
|
-
const live3 =
|
|
180805
|
-
const manifestOf = (tree) => JSON.parse(
|
|
180974
|
+
const live3 = join82(running.releaseRoot, running.app);
|
|
180975
|
+
const manifestOf = (tree) => JSON.parse(readFileSync98(join82(tree, "release-manifest.json"), "utf8"));
|
|
180806
180976
|
let current = manifestOf(live3);
|
|
180807
180977
|
const failed3 = async (message) => {
|
|
180808
180978
|
if (stopping) return;
|
|
@@ -180813,7 +180983,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180813
180983
|
};
|
|
180814
180984
|
rebuild = watchKit.serialize(async () => {
|
|
180815
180985
|
const t0 = Date.now();
|
|
180816
|
-
const next = mkdtempSync5(
|
|
180986
|
+
const next = mkdtempSync5(join82(tmpdir6(), "himi-run-build-"));
|
|
180817
180987
|
try {
|
|
180818
180988
|
const bres = await buildContentBundles2(dir, { resolution: resolutionFlag(flags) });
|
|
180819
180989
|
if (bres.compileErrors.length) {
|
|
@@ -180830,16 +181000,16 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180830
181000
|
return;
|
|
180831
181001
|
}
|
|
180832
181002
|
if (stopping) return;
|
|
180833
|
-
const fresh = manifestOf(
|
|
181003
|
+
const fresh = manifestOf(join82(next, running.app));
|
|
180834
181004
|
const diff = watchKit.diffReleases(current, fresh);
|
|
180835
181005
|
const { describeChanges: describeChanges2, headline: headline2 } = await Promise.resolve().then(() => (init_build_changes(), build_changes_exports));
|
|
180836
|
-
const changes = describeChanges2(live3,
|
|
181006
|
+
const changes = describeChanges2(live3, join82(next, running.app), diff);
|
|
180837
181007
|
const retired = `${live3}.retired-${Date.now()}`;
|
|
180838
181008
|
renameSync12(live3, retired);
|
|
180839
181009
|
try {
|
|
180840
|
-
renameSync12(
|
|
181010
|
+
renameSync12(join82(next, running.app), live3);
|
|
180841
181011
|
} catch {
|
|
180842
|
-
cpSync3(
|
|
181012
|
+
cpSync3(join82(next, running.app), live3, { recursive: true });
|
|
180843
181013
|
}
|
|
180844
181014
|
rmSync22(retired, { recursive: true, force: true });
|
|
180845
181015
|
current = fresh;
|
|
@@ -181522,7 +181692,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181522
181692
|
lintNote: "`himi patch` sends a raw file. Nothing here built or linted your app \u2014 `himi push --only <selector>` is the same edit with the full lint gate in front of it."
|
|
181523
181693
|
};
|
|
181524
181694
|
if (kind === "tokens" || kind === "app-config") {
|
|
181525
|
-
const body =
|
|
181695
|
+
const body = readFileSync98(file2, "utf8");
|
|
181526
181696
|
const patch2 = kind === "tokens" ? { tokens: body } : { appConfig: body };
|
|
181527
181697
|
return runReleasePatch({
|
|
181528
181698
|
...common,
|
|
@@ -181537,7 +181707,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181537
181707
|
io2.error(JSON.stringify({ error: "patch screen needs a <screenId>", usage: PATCH_USAGE }));
|
|
181538
181708
|
return 2;
|
|
181539
181709
|
}
|
|
181540
|
-
const descriptor =
|
|
181710
|
+
const descriptor = readFileSync98(file2, "utf8");
|
|
181541
181711
|
try {
|
|
181542
181712
|
JSON.parse(descriptor);
|
|
181543
181713
|
} catch (e2) {
|
|
@@ -181577,7 +181747,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181577
181747
|
extra: { kind, screen: id, file: { path: file2, bytes: Buffer.byteLength(descriptor, "utf8") } }
|
|
181578
181748
|
});
|
|
181579
181749
|
}
|
|
181580
|
-
const bytes2 =
|
|
181750
|
+
const bytes2 = readFileSync98(file2);
|
|
181581
181751
|
const sha2 = createHash41("sha256").update(bytes2).digest("hex");
|
|
181582
181752
|
const forScreens = (str9(flags["for-screen"]) ?? "").split(",").map((s2) => s2.trim()).filter(Boolean);
|
|
181583
181753
|
if (flags["no-rebind"] !== void 0 && flags["no-rebind"] !== true) {
|
|
@@ -181721,7 +181891,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181721
181891
|
}
|
|
181722
181892
|
let def;
|
|
181723
181893
|
try {
|
|
181724
|
-
const parsed = JSON.parse(arg.startsWith("@") ?
|
|
181894
|
+
const parsed = JSON.parse(arg.startsWith("@") ? readFileSync98(arg.slice(1), "utf8") : arg);
|
|
181725
181895
|
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
181726
181896
|
io2.error(JSON.stringify({ error: "invalid_definition", problems: [`--definition must be a JSON object, got ${Array.isArray(parsed) ? "an array" : parsed === null ? "null" : typeof parsed}`] }));
|
|
181727
181897
|
return 2;
|
|
@@ -182003,7 +182173,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
182003
182173
|
const rememberLastDist = async (jobs2) => {
|
|
182004
182174
|
try {
|
|
182005
182175
|
const dir = contentDir(flags);
|
|
182006
|
-
if (!existsSync80(
|
|
182176
|
+
if (!existsSync80(join82(dir, "himalaya.content.json"))) return;
|
|
182007
182177
|
const { lastDistFromJob: lastDistFromJob2, writeLastDist: writeLastDist2 } = await Promise.resolve().then(() => (init_capabilities(), capabilities_exports));
|
|
182008
182178
|
const own4 = await appId(dir);
|
|
182009
182179
|
for (const job of jobs2) {
|
|
@@ -182241,7 +182411,7 @@ ${label2}`);
|
|
|
182241
182411
|
const platform = str9(flags.platform)?.split(",").map((p2) => p2.trim()).filter(Boolean);
|
|
182242
182412
|
{
|
|
182243
182413
|
const distDir = contentDir(flags);
|
|
182244
|
-
if (existsSync80(
|
|
182414
|
+
if (existsSync80(join82(distDir, "himalaya.content.json"))) {
|
|
182245
182415
|
const issues = await iconIssues(distDir, flags.strict === true, { requireDeclared: true, requireVerified: true });
|
|
182246
182416
|
const errors = issues.filter((i2) => i2.severity === "error");
|
|
182247
182417
|
for (const i2 of issues.filter((i3) => i3.severity === "warning")) {
|
|
@@ -182580,7 +182750,7 @@ ${label2}`);
|
|
|
182580
182750
|
const dpxPath = dpxSessionTokenPath();
|
|
182581
182751
|
let dpx;
|
|
182582
182752
|
try {
|
|
182583
|
-
dpx =
|
|
182753
|
+
dpx = readFileSync98(dpxPath, "utf8").trim();
|
|
182584
182754
|
} catch {
|
|
182585
182755
|
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` }));
|
|
182586
182756
|
return 1;
|
|
@@ -183001,7 +183171,7 @@ ${report3.ok ? "OK \u2014 data + serve plane reachable." : typeof report3.hint =
|
|
|
183001
183171
|
const path2 = dpxSessionTokenPath();
|
|
183002
183172
|
let raw;
|
|
183003
183173
|
try {
|
|
183004
|
-
raw =
|
|
183174
|
+
raw = readFileSync98(path2, "utf8");
|
|
183005
183175
|
} catch {
|
|
183006
183176
|
io2.error(JSON.stringify({ error: `no DPX BO session at ${path2}` }));
|
|
183007
183177
|
return 1;
|