@wix/himalaya-cli 0.1318.0 → 0.1319.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 +473 -372
- package/dist/preview-assets.generated.bin +0 -0
- package/guides/app-config.md +1 -1
- package/guides/importable-sdks.md +1 -0
- 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/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: "5f2471098dd499be17cb0e1aea71e52ba7ea49200cad460cc862b7973e64f171",
|
|
5579
|
+
data: "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"
|
|
5576
5580
|
};
|
|
5577
5581
|
}
|
|
5578
5582
|
});
|
|
@@ -7530,7 +7534,6 @@ function buttonVariant(style) {
|
|
|
7530
7534
|
var SYSTEM_FONT_FAMILY, TONAL_ELEVATION_ALPHA, BUTTON_MIN_HIT_TARGET, nonNegative, nonEmpty, own, COLOR_TOKEN_PROPS, TYPOGRAPHY_TOKEN_PROPS, BUTTON_VARIANTS;
|
|
7531
7535
|
var init_tokens = __esm({
|
|
7532
7536
|
"../../core/ts/src/tokens.ts"() {
|
|
7533
|
-
"use strict";
|
|
7534
7537
|
SYSTEM_FONT_FAMILY = "$system";
|
|
7535
7538
|
TONAL_ELEVATION_ALPHA = [0, 0.05, 0.08, 0.11, 0.12, 0.14];
|
|
7536
7539
|
BUTTON_MIN_HIT_TARGET = 44;
|
|
@@ -13418,6 +13421,7 @@ var init_player_host_manifest = __esm({
|
|
|
13418
13421
|
"speaker_diarization",
|
|
13419
13422
|
"speech",
|
|
13420
13423
|
"stream",
|
|
13424
|
+
"theme",
|
|
13421
13425
|
"ui",
|
|
13422
13426
|
"wix_api",
|
|
13423
13427
|
"wix_cashier",
|
|
@@ -16624,7 +16628,6 @@ function resolveIdiom(tokens2, ctx = {}) {
|
|
|
16624
16628
|
var IDIOM_CONTEXTS, UNSAFE_KEYS;
|
|
16625
16629
|
var init_idiom = __esm({
|
|
16626
16630
|
"../../core/ts/src/idiom.ts"() {
|
|
16627
|
-
"use strict";
|
|
16628
16631
|
IDIOM_CONTEXTS = {
|
|
16629
16632
|
ios: { native: ["ios"] },
|
|
16630
16633
|
android: { native: ["material"] },
|
|
@@ -20700,6 +20703,14 @@ var init_native_requirements = __esm({
|
|
|
20700
20703
|
]
|
|
20701
20704
|
}
|
|
20702
20705
|
},
|
|
20706
|
+
theme: {
|
|
20707
|
+
// RFC 0070 §3 — an in-memory token overlay in the shell. No OS permission, no framework.
|
|
20708
|
+
privacy: {
|
|
20709
|
+
reviewNotes: [
|
|
20710
|
+
"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."
|
|
20711
|
+
]
|
|
20712
|
+
}
|
|
20713
|
+
},
|
|
20703
20714
|
presigned_upload: {
|
|
20704
20715
|
// No OS permission and no new native dependency: an HTTPS request on a
|
|
20705
20716
|
// credential-free URLSession / HttpURLConnection. INTERNET is already implied by
|
|
@@ -21463,6 +21474,7 @@ var init_builtins = __esm({
|
|
|
21463
21474
|
"speech",
|
|
21464
21475
|
"system_intents",
|
|
21465
21476
|
"tasks",
|
|
21477
|
+
"theme",
|
|
21466
21478
|
"wix_cashier",
|
|
21467
21479
|
"wix_platform"
|
|
21468
21480
|
];
|
|
@@ -27291,6 +27303,7 @@ var init_capabilities_generated = __esm({
|
|
|
27291
27303
|
"speech": ["availability", "recognizeOnce", "speak", "stop", "streamNext", "streamStart", "streamStop", "transcribeFile"],
|
|
27292
27304
|
"system_intents": ["donate", "refreshShortcuts"],
|
|
27293
27305
|
"tasks": ["backend", "create", "getPermissionStatus", "list", "remove", "requestPermission", "setCompleted"],
|
|
27306
|
+
"theme": ["applyOverlay", "clearOverlay", "surfaces"],
|
|
27294
27307
|
"ui": ["alert", "snackbar"],
|
|
27295
27308
|
"wix_cashier": ["isAvailable", "proceedToPayment"]
|
|
27296
27309
|
};
|
|
@@ -27334,6 +27347,7 @@ var init_capabilities_generated = __esm({
|
|
|
27334
27347
|
"speech": ["@himalaya/speech"],
|
|
27335
27348
|
"system_intents": ["@himalaya/system-intents"],
|
|
27336
27349
|
"tasks": ["@himalaya/tasks"],
|
|
27350
|
+
"theme": ["@himalaya/theme"],
|
|
27337
27351
|
"ui": ["@himalaya/ui"],
|
|
27338
27352
|
"webview": ["@himalaya/webview"],
|
|
27339
27353
|
"wix_cashier": ["@himalaya/wix-cashier"],
|
|
@@ -27379,15 +27393,15 @@ var init_shell_capabilities_generated = __esm({
|
|
|
27379
27393
|
appDir: "apps/himi-owner-lite",
|
|
27380
27394
|
shared: false,
|
|
27381
27395
|
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"]
|
|
27396
|
+
built: ["app_info", "biometrics", "camera", "clipboard", "live_activity", "local_database", "open_url", "presigned_upload", "push", "secure_storage", "share", "speech", "ui", "wix_platform"],
|
|
27397
|
+
serves: ["app_info", "biometrics", "camera", "clipboard", "live_activity", "local_database", "open_url", "presigned_upload", "push", "secure_storage", "share", "speech", "ui", "wix_platform"]
|
|
27384
27398
|
},
|
|
27385
27399
|
"player": {
|
|
27386
27400
|
appDir: "apps/himi-player",
|
|
27387
27401
|
shared: true,
|
|
27388
27402
|
extensible: false,
|
|
27389
27403
|
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"]
|
|
27404
|
+
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
27405
|
}
|
|
27392
27406
|
};
|
|
27393
27407
|
}
|
|
@@ -42293,7 +42307,7 @@ var init_pdf = __esm({
|
|
|
42293
42307
|
var defineProperty = Object.defineProperty;
|
|
42294
42308
|
var stringSlice = uncurryThis("".slice);
|
|
42295
42309
|
var replace = uncurryThis("".replace);
|
|
42296
|
-
var
|
|
42310
|
+
var join83 = uncurryThis([].join);
|
|
42297
42311
|
var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function() {
|
|
42298
42312
|
return defineProperty(function() {
|
|
42299
42313
|
}, "length", { value: 8 }).length !== 8;
|
|
@@ -42320,7 +42334,7 @@ var init_pdf = __esm({
|
|
|
42320
42334
|
}
|
|
42321
42335
|
var state = enforceInternalState(value);
|
|
42322
42336
|
if (!hasOwn(state, "source")) {
|
|
42323
|
-
state.source =
|
|
42337
|
+
state.source = join83(TEMPLATE, typeof name == "string" ? name : "");
|
|
42324
42338
|
}
|
|
42325
42339
|
return value;
|
|
42326
42340
|
};
|
|
@@ -44843,7 +44857,7 @@ var init_pdf = __esm({
|
|
|
44843
44857
|
var charAt = uncurryThis("".charAt);
|
|
44844
44858
|
var Uint8Array2 = globalThis2.Uint8Array;
|
|
44845
44859
|
var $Array = globalThis2.Array;
|
|
44846
|
-
var
|
|
44860
|
+
var join83 = uncurryThis([].join);
|
|
44847
44861
|
var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array2 || !Uint8Array2.prototype.toBase64 || !(function() {
|
|
44848
44862
|
try {
|
|
44849
44863
|
var target = new Uint8Array2();
|
|
@@ -44889,7 +44903,7 @@ var init_pdf = __esm({
|
|
|
44889
44903
|
result[written++] = "=";
|
|
44890
44904
|
}
|
|
44891
44905
|
}
|
|
44892
|
-
return
|
|
44906
|
+
return join83(result, "");
|
|
44893
44907
|
}
|
|
44894
44908
|
});
|
|
44895
44909
|
},
|
|
@@ -44901,7 +44915,7 @@ var init_pdf = __esm({
|
|
|
44901
44915
|
var anUint8Array = __webpack_require__3(4154);
|
|
44902
44916
|
var notDetached = __webpack_require__3(5169);
|
|
44903
44917
|
var numberToString2 = uncurryThis(1.1.toString);
|
|
44904
|
-
var
|
|
44918
|
+
var join83 = uncurryThis([].join);
|
|
44905
44919
|
var $Array = Array;
|
|
44906
44920
|
var Uint8Array2 = globalThis2.Uint8Array;
|
|
44907
44921
|
var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array2 || !Uint8Array2.prototype.toHex || !(function() {
|
|
@@ -44921,7 +44935,7 @@ var init_pdf = __esm({
|
|
|
44921
44935
|
var hex2 = numberToString2(this[i2], 16);
|
|
44922
44936
|
result[i2] = hex2.length === 1 ? "0" + hex2 : hex2;
|
|
44923
44937
|
}
|
|
44924
|
-
return
|
|
44938
|
+
return join83(result, "");
|
|
44925
44939
|
}
|
|
44926
44940
|
});
|
|
44927
44941
|
},
|
|
@@ -147709,6 +147723,25 @@ var init_studio_reel = __esm({
|
|
|
147709
147723
|
}
|
|
147710
147724
|
});
|
|
147711
147725
|
|
|
147726
|
+
// src/home-screen-id.ts
|
|
147727
|
+
import { readFileSync as readFileSync64 } from "node:fs";
|
|
147728
|
+
import { join as join56 } from "node:path";
|
|
147729
|
+
function homeScreenIdOf(dir) {
|
|
147730
|
+
let src;
|
|
147731
|
+
try {
|
|
147732
|
+
src = readFileSync64(join56(dir, "dev", "index.ts"), "utf8");
|
|
147733
|
+
} catch {
|
|
147734
|
+
return null;
|
|
147735
|
+
}
|
|
147736
|
+
const m2 = /^[ \t]*homeScreenId[ \t]*:[ \t]*(?:"((?:[^"\\\n]|\\.)*)"|'((?:[^'\\\n]|\\.)*)')/m.exec(src);
|
|
147737
|
+
const id = m2 ? m2[1] ?? m2[2] : void 0;
|
|
147738
|
+
return id && /^[A-Za-z0-9_.\-/{}]+$/.test(id) ? id : null;
|
|
147739
|
+
}
|
|
147740
|
+
var init_home_screen_id = __esm({
|
|
147741
|
+
"src/home-screen-id.ts"() {
|
|
147742
|
+
}
|
|
147743
|
+
});
|
|
147744
|
+
|
|
147712
147745
|
// src/milestones.ts
|
|
147713
147746
|
var milestones_exports = {};
|
|
147714
147747
|
__export(milestones_exports, {
|
|
@@ -147764,20 +147797,9 @@ __export(milestones_exports, {
|
|
|
147764
147797
|
});
|
|
147765
147798
|
import { createHash as createHash32, randomUUID as randomUUID7 } from "node:crypto";
|
|
147766
147799
|
import { spawn as spawn5 } from "node:child_process";
|
|
147767
|
-
import { closeSync as closeSync5, existsSync as existsSync56, lstatSync as lstatSync19, readFileSync as
|
|
147800
|
+
import { closeSync as closeSync5, existsSync as existsSync56, lstatSync as lstatSync19, readFileSync as readFileSync65, statSync as statSync15 } from "node:fs";
|
|
147768
147801
|
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
|
-
}
|
|
147802
|
+
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
147803
|
function homeShotPath(dir, home) {
|
|
147782
147804
|
const root = resolve48(dir);
|
|
147783
147805
|
const base = resolve48(root, ".himi", "shots");
|
|
@@ -147888,7 +147910,7 @@ function autoPictureGate(dir) {
|
|
|
147888
147910
|
}
|
|
147889
147911
|
async function homePictureAtValidate(dir, opts) {
|
|
147890
147912
|
if (!opts.ok) return { skipped: "validate found errors, so the picture was left as it is" };
|
|
147891
|
-
if (!existsSync56(
|
|
147913
|
+
if (!existsSync56(join57(dir, "himalaya.content.json"))) return { skipped: "not a content package" };
|
|
147892
147914
|
const env = opts.env ?? process.env;
|
|
147893
147915
|
if (ciSet(env)) return { skipped: "the CI environment variable is set" };
|
|
147894
147916
|
if (env.NODE_TEST_CONTEXT) return { skipped: "running under `node --test`" };
|
|
@@ -148112,16 +148134,16 @@ function rememberDraft(dir, releaseId, m2) {
|
|
|
148112
148134
|
...m2.tokensHash ? { tokensHash: m2.tokensHash } : {},
|
|
148113
148135
|
...m2.appConfigHash ? { appConfigHash: m2.appConfigHash } : {}
|
|
148114
148136
|
};
|
|
148115
|
-
writeFileAtomic(
|
|
148137
|
+
writeFileAtomic(join57(dir, LAST_DRAFT_FILE), `${JSON.stringify({ v: 1, releaseId, manifest })}
|
|
148116
148138
|
`);
|
|
148117
148139
|
} catch {
|
|
148118
148140
|
}
|
|
148119
148141
|
}
|
|
148120
148142
|
function lastDraft(dir) {
|
|
148121
148143
|
try {
|
|
148122
|
-
const file2 =
|
|
148144
|
+
const file2 = join57(dir, LAST_DRAFT_FILE);
|
|
148123
148145
|
if (!lstatSync19(file2).isFile()) return null;
|
|
148124
|
-
const r2 = JSON.parse(
|
|
148146
|
+
const r2 = JSON.parse(readFileSync65(file2, "utf8"));
|
|
148125
148147
|
const m2 = r2.manifest;
|
|
148126
148148
|
if (r2.v !== 1 || typeof r2.releaseId !== "string" || !m2 || typeof m2.screens !== "object" || !m2.screens || typeof m2.bundles !== "object" || !m2.bundles) return null;
|
|
148127
148149
|
return { releaseId: r2.releaseId, manifest: m2 };
|
|
@@ -148172,7 +148194,7 @@ function recordInitSource(dir, opts = {}) {
|
|
|
148172
148194
|
template: opts.template && TEMPLATE_NAME.test(opts.template) ? opts.template : null,
|
|
148173
148195
|
...opts.source ? { source: opts.source } : {}
|
|
148174
148196
|
};
|
|
148175
|
-
writeFileAtomic(
|
|
148197
|
+
writeFileAtomic(join57(dir, INIT_SOURCE_FILE), `${JSON.stringify(record2, null, 2)}
|
|
148176
148198
|
`);
|
|
148177
148199
|
return true;
|
|
148178
148200
|
} catch {
|
|
@@ -148180,10 +148202,10 @@ function recordInitSource(dir, opts = {}) {
|
|
|
148180
148202
|
}
|
|
148181
148203
|
}
|
|
148182
148204
|
function readInitSource(dir) {
|
|
148183
|
-
const file2 =
|
|
148205
|
+
const file2 = join57(dir, INIT_SOURCE_FILE);
|
|
148184
148206
|
try {
|
|
148185
148207
|
if (!lstatSync19(file2).isFile()) return null;
|
|
148186
|
-
const r2 = JSON.parse(
|
|
148208
|
+
const r2 = JSON.parse(readFileSync65(file2, "utf8"));
|
|
148187
148209
|
if (r2.v !== 1 || typeof r2.fingerprint !== "string" || !/^[0-9a-f]{64}$/.test(r2.fingerprint) || typeof r2.newestMs !== "number") return null;
|
|
148188
148210
|
return {
|
|
148189
148211
|
v: 1,
|
|
@@ -148252,10 +148274,10 @@ function homeShotForPostcard(dir, opts = {}) {
|
|
|
148252
148274
|
function contentHomePictures(dir, home) {
|
|
148253
148275
|
const out2 = [];
|
|
148254
148276
|
const shot = homeShotPath(dir, home);
|
|
148255
|
-
const hist = realDirIn(dir, HISTORY_DIR) ?
|
|
148277
|
+
const hist = realDirIn(dir, HISTORY_DIR) ? join57(dir, HISTORY_DIR) : null;
|
|
148256
148278
|
for (const r2 of recordedShots(dir, home)) {
|
|
148257
148279
|
if (r2.state.state !== "content") continue;
|
|
148258
|
-
for (const file2 of [shot, hist &&
|
|
148280
|
+
for (const file2 of [shot, hist && join57(hist, `${r2.sha256}.png`)]) {
|
|
148259
148281
|
try {
|
|
148260
148282
|
if (!file2 || !lstatSync19(file2).isFile() || sha256Of2(file2) !== r2.sha256) continue;
|
|
148261
148283
|
} catch {
|
|
@@ -148268,10 +148290,10 @@ function contentHomePictures(dir, home) {
|
|
|
148268
148290
|
return out2;
|
|
148269
148291
|
}
|
|
148270
148292
|
function readInitWatch(dir) {
|
|
148271
|
-
const file2 =
|
|
148293
|
+
const file2 = join57(dir, INIT_WATCH_FILE);
|
|
148272
148294
|
try {
|
|
148273
148295
|
if (!lstatSync19(file2).isFile()) return null;
|
|
148274
|
-
const r2 = JSON.parse(
|
|
148296
|
+
const r2 = JSON.parse(readFileSync65(file2, "utf8"));
|
|
148275
148297
|
if (r2.v !== 1 || typeof r2.pid !== "number" || !Number.isInteger(r2.pid) || r2.pid < 1) return null;
|
|
148276
148298
|
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
148299
|
if (r2.root !== runRootId(dir)) return null;
|
|
@@ -148296,14 +148318,14 @@ function liveWatchRunning(dir, isAlive = pidAlive, now) {
|
|
|
148296
148318
|
}
|
|
148297
148319
|
function watchReminder(dir, opts = {}) {
|
|
148298
148320
|
try {
|
|
148299
|
-
if (!existsSync56(
|
|
148321
|
+
if (!existsSync56(join57(dir, "himalaya.content.json"))) return void 0;
|
|
148300
148322
|
const nowDate = opts.now ?? /* @__PURE__ */ new Date();
|
|
148301
148323
|
const live3 = liveWatch(dir, opts.isAlive, nowDate);
|
|
148302
148324
|
const now = nowDate.getTime();
|
|
148303
|
-
const file2 =
|
|
148325
|
+
const file2 = join57(dir, REMINDERS_FILE);
|
|
148304
148326
|
let last = Number.NaN;
|
|
148305
148327
|
try {
|
|
148306
|
-
if (lstatSync19(file2).isFile()) last = Date.parse(JSON.parse(
|
|
148328
|
+
if (lstatSync19(file2).isFile()) last = Date.parse(JSON.parse(readFileSync65(file2, "utf8")).watch ?? "");
|
|
148307
148329
|
} catch {
|
|
148308
148330
|
}
|
|
148309
148331
|
if (Number.isFinite(last) && now - last >= 0 && now - last < WATCH_REMINDER_EVERY_MS) return void 0;
|
|
@@ -148315,7 +148337,7 @@ function watchReminder(dir, opts = {}) {
|
|
|
148315
148337
|
}
|
|
148316
148338
|
const content = opts.content ?? displayPath(dir);
|
|
148317
148339
|
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(
|
|
148340
|
+
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
148341
|
} catch {
|
|
148320
148342
|
return void 0;
|
|
148321
148343
|
}
|
|
@@ -148381,7 +148403,7 @@ async function startWatchAtInit(dir, opts) {
|
|
|
148381
148403
|
child.unref();
|
|
148382
148404
|
if (!child.pid) return { skipped: "the live preview did not start (no process) \u2014 start it yourself: `himi run --watch --content <dir> &`", ...note };
|
|
148383
148405
|
const record2 = { v: 1, pid: child.pid, root: runRootId(dir), url, board, log: WATCH_LOG, startedAt: now.toISOString() };
|
|
148384
|
-
if (realDirIn(dir, ".himi")) writeFileAtomic(
|
|
148406
|
+
if (realDirIn(dir, ".himi")) writeFileAtomic(join57(dir, INIT_WATCH_FILE), `${JSON.stringify(record2, null, 2)}
|
|
148385
148407
|
`);
|
|
148386
148408
|
return { started: true, pid: child.pid, url, board, log: WATCH_LOG, ...note };
|
|
148387
148409
|
} catch (e2) {
|
|
@@ -148396,7 +148418,7 @@ function watchRunning(w2) {
|
|
|
148396
148418
|
function doNowBlock(opts) {
|
|
148397
148419
|
const content = displayPath(opts.dir, opts.cwd);
|
|
148398
148420
|
const home = opts.home ?? "<homeScreenId>";
|
|
148399
|
-
const board =
|
|
148421
|
+
const board = join57(content, ".himi", "studio", "index.html");
|
|
148400
148422
|
const running = watchRunning(opts.watch);
|
|
148401
148423
|
const who = running?.by === "init" ? "init started it" : "already running";
|
|
148402
148424
|
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 +148437,7 @@ function writeHandoverReel(dir) {
|
|
|
148415
148437
|
try {
|
|
148416
148438
|
if (!realDirIn(dir, ".himi")) return { skipped: ".himi is not a real directory inside the package (a symlink?), so no making-of was written" };
|
|
148417
148439
|
const { html } = buildReel(dir);
|
|
148418
|
-
const file2 =
|
|
148440
|
+
const file2 = join57(dir, ".himi", "making-of.html");
|
|
148419
148441
|
writeFileAtomic(file2, html);
|
|
148420
148442
|
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
148443
|
} catch (e2) {
|
|
@@ -148423,11 +148445,11 @@ function writeHandoverReel(dir) {
|
|
|
148423
148445
|
}
|
|
148424
148446
|
}
|
|
148425
148447
|
function afterHandoverPostcard(dir, opts = {}) {
|
|
148426
|
-
const file2 =
|
|
148448
|
+
const file2 = join57(dir, ".himi", "making-of.html");
|
|
148427
148449
|
let fresh = false;
|
|
148428
148450
|
try {
|
|
148429
148451
|
const st2 = lstatSync19(file2);
|
|
148430
|
-
fresh = st2.isFile() && !st2.isSymbolicLink() && st2.mtimeMs >= statSync15(
|
|
148452
|
+
fresh = st2.isFile() && !st2.isSymbolicLink() && st2.mtimeMs >= statSync15(join57(dir, ".himi", "progress.jsonl")).mtimeMs;
|
|
148431
148453
|
} catch {
|
|
148432
148454
|
fresh = false;
|
|
148433
148455
|
}
|
|
@@ -148446,6 +148468,7 @@ var init_milestones = __esm({
|
|
|
148446
148468
|
init_screen_state();
|
|
148447
148469
|
init_shell_quote();
|
|
148448
148470
|
init_studio_reel();
|
|
148471
|
+
init_home_screen_id();
|
|
148449
148472
|
contentArg = (content) => content ? ` --content ${shellQuote(content)}` : "";
|
|
148450
148473
|
CONSENT_PREFLIGHT = "Consent preflight before a template preview";
|
|
148451
148474
|
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 +148481,13 @@ var init_milestones = __esm({
|
|
|
148458
148481
|
STILL_BUILDING_MESSAGE = "Still building: here's the home screen now.";
|
|
148459
148482
|
yourFirstLookMessage = (dir) => `First look at your app: ${appName(dir)}'s home screen, with your changes.`;
|
|
148460
148483
|
homeCaveat = (dir, image) => homeStateCaveat(shotStateFor(dir, image));
|
|
148461
|
-
LAST_DRAFT_FILE =
|
|
148462
|
-
INIT_SOURCE_FILE =
|
|
148484
|
+
LAST_DRAFT_FILE = join57(".himi", "last-draft.json");
|
|
148485
|
+
INIT_SOURCE_FILE = join57(".himi", "init-source.json");
|
|
148463
148486
|
STARTING_POINT_REF = "starting-point";
|
|
148464
148487
|
TEMPLATE_NAME = /^[A-Za-z0-9._-]{1,64}$/;
|
|
148465
|
-
sha256Of2 = (file2) => createHash32("sha256").update(
|
|
148488
|
+
sha256Of2 = (file2) => createHash32("sha256").update(readFileSync65(file2)).digest("hex");
|
|
148466
148489
|
WATCH_REMINDER_EVERY_MS = 10 * 60 * 1e3;
|
|
148467
|
-
REMINDERS_FILE =
|
|
148490
|
+
REMINDERS_FILE = join57(".himi", "reminders.json");
|
|
148468
148491
|
pidAlive = (pid) => {
|
|
148469
148492
|
try {
|
|
148470
148493
|
process.kill(pid, 0);
|
|
@@ -148473,7 +148496,7 @@ var init_milestones = __esm({
|
|
|
148473
148496
|
return e2.code === "EPERM";
|
|
148474
148497
|
}
|
|
148475
148498
|
};
|
|
148476
|
-
INIT_WATCH_FILE =
|
|
148499
|
+
INIT_WATCH_FILE = join57(".himi", "watch.json");
|
|
148477
148500
|
INIT_WATCH_STARTING_MS = 5 * 60 * 1e3;
|
|
148478
148501
|
INIT_WATCH_IDLE_MINUTES = 30;
|
|
148479
148502
|
WATCH_LOG = ".himi/watch.log";
|
|
@@ -148509,8 +148532,8 @@ __export(template_sweep_exports, {
|
|
|
148509
148532
|
sweepCopy: () => sweepCopy,
|
|
148510
148533
|
sweepPairs: () => sweepPairs
|
|
148511
148534
|
});
|
|
148512
|
-
import { readFileSync as
|
|
148513
|
-
import { join as
|
|
148535
|
+
import { readFileSync as readFileSync66, writeFileSync as writeFileSync24 } from "node:fs";
|
|
148536
|
+
import { join as join58 } from "node:path";
|
|
148514
148537
|
import ts7 from "typescript";
|
|
148515
148538
|
function isCopy(node, file2) {
|
|
148516
148539
|
const parent = node.parent;
|
|
@@ -148551,7 +148574,7 @@ function sweepCopy(dir, pairs, dryRun) {
|
|
|
148551
148574
|
const next = /* @__PURE__ */ new Map();
|
|
148552
148575
|
const replaced = pairs.map(([from, to2]) => ({ from, to: to2, files: {} }));
|
|
148553
148576
|
for (const f2 of files) {
|
|
148554
|
-
const text9 =
|
|
148577
|
+
const text9 = readFileSync66(join58(dir, f2), "utf8");
|
|
148555
148578
|
if (!pairs.some(([from]) => text9.includes(from) || text9.includes(JSON.stringify(from).slice(1, -1)))) continue;
|
|
148556
148579
|
const kind = f2.endsWith(".json") ? ts7.ScriptKind.JSON : f2.endsWith("x") ? ts7.ScriptKind.TSX : ts7.ScriptKind.TS;
|
|
148557
148580
|
const sf2 = ts7.createSourceFile(f2, text9, ts7.ScriptTarget.Latest, true, kind);
|
|
@@ -148580,16 +148603,16 @@ function sweepCopy(dir, pairs, dryRun) {
|
|
|
148580
148603
|
if (errors.length) throw new TrimRefusal(`the sweep would break ${f2} \u2014 nothing written: ${errors[0]}`);
|
|
148581
148604
|
next.set(f2, out2);
|
|
148582
148605
|
}
|
|
148583
|
-
const dev = next.get("dev/index.ts") ??
|
|
148584
|
-
const config = next.get("config.ts") ??
|
|
148606
|
+
const dev = next.get("dev/index.ts") ?? readFileSync66(join58(dir, "dev", "index.ts"), "utf8");
|
|
148607
|
+
const config = next.get("config.ts") ?? readFileSync66(join58(dir, "config.ts"), "utf8");
|
|
148585
148608
|
try {
|
|
148586
148609
|
parseApp(dev, config);
|
|
148587
148610
|
} catch (e2) {
|
|
148588
148611
|
throw new TrimRefusal(`the sweep would leave dev/index.ts or config.ts unparseable \u2014 nothing written: ${e2.message}`);
|
|
148589
148612
|
}
|
|
148590
|
-
if (!dryRun) for (const [f2, t2] of next) writeFileSync24(
|
|
148613
|
+
if (!dryRun) for (const [f2, t2] of next) writeFileSync24(join58(dir, f2), t2);
|
|
148591
148614
|
const g2 = new RegExp(PLACEHOLDER.source, `${PLACEHOLDER.flags.replace("g", "")}g`);
|
|
148592
|
-
const placeholdersLeft = all.reduce((n2, f2) => n2 + [...(next.get(f2) ??
|
|
148615
|
+
const placeholdersLeft = all.reduce((n2, f2) => n2 + [...(next.get(f2) ?? readFileSync66(join58(dir, f2), "utf8")).matchAll(g2)].length, 0);
|
|
148593
148616
|
return {
|
|
148594
148617
|
ok: true,
|
|
148595
148618
|
dryRun,
|
|
@@ -148606,7 +148629,7 @@ function sweepPairs(set, mapFile) {
|
|
|
148606
148629
|
pairs.push([s2.slice(0, at2), s2.slice(at2 + 2)]);
|
|
148607
148630
|
}
|
|
148608
148631
|
if (mapFile) {
|
|
148609
|
-
const map = JSON.parse(
|
|
148632
|
+
const map = JSON.parse(readFileSync66(mapFile, "utf8"));
|
|
148610
148633
|
for (const [k2, v2] of Object.entries(map)) {
|
|
148611
148634
|
if (typeof v2 !== "string") throw new TrimRefusal(`--map ${mapFile}: "${k2}" must map to a string`);
|
|
148612
148635
|
pairs.push([k2, v2]);
|
|
@@ -148851,18 +148874,18 @@ __export(template_recommend_exports, {
|
|
|
148851
148874
|
recommendTemplates: () => recommendTemplates,
|
|
148852
148875
|
verticalsFromBook: () => verticalsFromBook
|
|
148853
148876
|
});
|
|
148854
|
-
import { existsSync as existsSync57, readFileSync as
|
|
148855
|
-
import { join as
|
|
148877
|
+
import { existsSync as existsSync57, readFileSync as readFileSync67 } from "node:fs";
|
|
148878
|
+
import { join as join59 } from "node:path";
|
|
148856
148879
|
function verticalsFromBook(path2) {
|
|
148857
|
-
const dir = existsSync57(
|
|
148858
|
-
const overlay =
|
|
148880
|
+
const dir = existsSync57(join59(path2, "book.json")) || existsSync57(join59(path2, "provisioning.overlay.json")) ? path2 : join59(path2, ".himi", "business-book");
|
|
148881
|
+
const overlay = join59(dir, "provisioning.overlay.json");
|
|
148859
148882
|
if (existsSync57(overlay)) {
|
|
148860
|
-
const v2 = JSON.parse(
|
|
148883
|
+
const v2 = JSON.parse(readFileSync67(overlay, "utf8")).installedVerticals;
|
|
148861
148884
|
if (Array.isArray(v2) && v2.length) return v2.filter((x2) => typeof x2 === "string");
|
|
148862
148885
|
}
|
|
148863
|
-
const book =
|
|
148886
|
+
const book = join59(dir, "book.json");
|
|
148864
148887
|
if (existsSync57(book)) {
|
|
148865
|
-
const probes = JSON.parse(
|
|
148888
|
+
const probes = JSON.parse(readFileSync67(book, "utf8")).probes;
|
|
148866
148889
|
if (Array.isArray(probes)) return installedFromProbes(probes);
|
|
148867
148890
|
}
|
|
148868
148891
|
throw new Error(`no book.json / provisioning.overlay.json under ${path2} \u2014 run \`himi site analyze\` first, or pass --verticals`);
|
|
@@ -148922,6 +148945,78 @@ var init_template_recommend = __esm({
|
|
|
148922
148945
|
}
|
|
148923
148946
|
});
|
|
148924
148947
|
|
|
148948
|
+
// ../../core/ts/src/nav-slots.ts
|
|
148949
|
+
function navPathError(raw) {
|
|
148950
|
+
if (raw === void 0 || raw === null || raw === "") return null;
|
|
148951
|
+
if (typeof raw !== "string") return `${JSON.stringify(raw)} is not a $service: binding ($service:<service>.<path>)`;
|
|
148952
|
+
const t2 = raw.trim();
|
|
148953
|
+
if (t2.startsWith("$item.")) return `"${raw}": $item. means nothing outside a list row \u2014 nav chrome binds $service:<service>.<path>`;
|
|
148954
|
+
if (!t2.startsWith("$service:")) return `"${raw}" is not a $service: binding ($service:<service>.<path>)`;
|
|
148955
|
+
const path2 = t2.slice("$service:".length);
|
|
148956
|
+
if (path2.includes("/")) return `"${raw}": the separator is a dot, not a slash ($service:<service>.<path>)`;
|
|
148957
|
+
if (!/^[^.\s]+(\.[^.\s]+)+$/.test(path2)) return `"${raw}" must be $service:<service>.<dot.path>`;
|
|
148958
|
+
return null;
|
|
148959
|
+
}
|
|
148960
|
+
function navConfigPathErrors(config) {
|
|
148961
|
+
const errors = [];
|
|
148962
|
+
const list = (v2) => Array.isArray(v2) ? v2.flatMap((x2, i2) => x2 !== null && typeof x2 === "object" ? [[x2, i2]] : []) : [];
|
|
148963
|
+
const obj3 = (v2) => v2 !== null && typeof v2 === "object" && !Array.isArray(v2) ? v2 : void 0;
|
|
148964
|
+
const check = (where, raw) => {
|
|
148965
|
+
const e2 = navPathError(raw);
|
|
148966
|
+
if (e2) errors.push(`${where}: ${e2}`);
|
|
148967
|
+
};
|
|
148968
|
+
const item = (where, it2) => {
|
|
148969
|
+
check(`${where}.hiddenPath`, it2.hiddenPath);
|
|
148970
|
+
check(`${where}.labelPath`, it2.labelPath);
|
|
148971
|
+
check(`${where}.iconPath`, it2.iconPath);
|
|
148972
|
+
check(`${where}.badge.valuePath`, obj3(it2.badge)?.valuePath);
|
|
148973
|
+
if (it2.hiddenUntilResolved && !it2.hiddenPath) {
|
|
148974
|
+
errors.push(`${where}: hiddenUntilResolved without hiddenPath can never resolve, so the item would never show`);
|
|
148975
|
+
}
|
|
148976
|
+
};
|
|
148977
|
+
const header = (where, h2) => {
|
|
148978
|
+
if (!h2) return;
|
|
148979
|
+
check(`${where}.titlePath`, h2.titlePath);
|
|
148980
|
+
check(`${where}.subtitlePath`, h2.subtitlePath);
|
|
148981
|
+
check(`${where}.imageUrlPath`, h2.imageUrlPath);
|
|
148982
|
+
};
|
|
148983
|
+
for (const [it2, i2] of list(obj3(config.tabBar)?.items)) item(`tabBar.items[${i2}] "${it2.id}"`, it2);
|
|
148984
|
+
for (const [it2, i2] of list(obj3(config.sidebar)?.items)) item(`sidebar.items[${i2}] "${it2.id}"`, it2);
|
|
148985
|
+
for (const [it2, i2] of list(obj3(config.drawer)?.items)) item(`drawer.items[${i2}] "${it2.id}"`, it2);
|
|
148986
|
+
for (const [it2, i2] of list(obj3(config.topBarDefault)?.actions)) item(`topBarDefault.actions[${i2}] "${it2.id}"`, it2);
|
|
148987
|
+
header("drawer.header", obj3(obj3(config.drawer)?.header));
|
|
148988
|
+
const sidebarHeader = obj3(obj3(config.sidebar)?.header);
|
|
148989
|
+
header("sidebar.header", sidebarHeader);
|
|
148990
|
+
for (const key2 of ["titlePath", "subtitlePath", "imageUrlPath"]) {
|
|
148991
|
+
if (sidebarHeader?.[key2]) {
|
|
148992
|
+
errors.push(`sidebar.header.${key2}: sidebar header bindings are not rendered yet (#4116) \u2014 bind drawer.header, which the sidebar shows`);
|
|
148993
|
+
}
|
|
148994
|
+
}
|
|
148995
|
+
const firstOf = (v2, skip = false) => list(v2).find(([it2]) => !skip || it2.role !== "section" && it2.role !== "note");
|
|
148996
|
+
const tabs = firstOf(obj3(config.tabBar)?.items);
|
|
148997
|
+
const kind = typeof config.navKind === "string" ? config.navKind : "";
|
|
148998
|
+
const rail = kind === "drawer" ? void 0 : firstOf(obj3(config.sidebar)?.items);
|
|
148999
|
+
const homes = [];
|
|
149000
|
+
if (tabs && !(kind === "sidebar" && rail)) homes.push(["tabBar.items", tabs]);
|
|
149001
|
+
if (rail && (kind === "sidebar" || kind === "responsive" || !tabs)) homes.push(["sidebar.items", rail]);
|
|
149002
|
+
if (!tabs && !rail) {
|
|
149003
|
+
const home = typeof config.homeScreenId === "string" && config.homeScreenId.length > 0 ? config.homeScreenId : void 0;
|
|
149004
|
+
const rows = list(obj3(config.drawer)?.items);
|
|
149005
|
+
const row = home !== void 0 ? rows.find(([it2]) => it2.screenId === home) : firstOf(obj3(config.drawer)?.items, true);
|
|
149006
|
+
homes.push(["drawer.items", row]);
|
|
149007
|
+
}
|
|
149008
|
+
for (const [where, first] of homes) {
|
|
149009
|
+
if (first && first[0].hiddenUntilResolved) {
|
|
149010
|
+
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`);
|
|
149011
|
+
}
|
|
149012
|
+
}
|
|
149013
|
+
return errors;
|
|
149014
|
+
}
|
|
149015
|
+
var init_nav_slots = __esm({
|
|
149016
|
+
"../../core/ts/src/nav-slots.ts"() {
|
|
149017
|
+
}
|
|
149018
|
+
});
|
|
149019
|
+
|
|
148925
149020
|
// src/nav-lint.ts
|
|
148926
149021
|
var nav_lint_exports = {};
|
|
148927
149022
|
__export(nav_lint_exports, {
|
|
@@ -149002,6 +149097,10 @@ async function navIssues(dir, strict) {
|
|
|
149002
149097
|
`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
149098
|
);
|
|
149004
149099
|
}
|
|
149100
|
+
const servedHome = homeScreenIdOf(dir) ?? void 0;
|
|
149101
|
+
for (const message of navConfigPathErrors({ ...nav, homeScreenId: servedHome })) {
|
|
149102
|
+
error("nav-path-malformed", `navigation.${message}`);
|
|
149103
|
+
}
|
|
149005
149104
|
const navKind = nav.navKind;
|
|
149006
149105
|
const effectiveBottomTabs = navKind === void 0 || navKind === "bottomTabs" || typeof navKind !== "string" || !NAV_KINDS.has(navKind);
|
|
149007
149106
|
const declaresOtherChrome = itemCount(nav.drawer) > 0 || itemCount(nav.sidebar) > 0;
|
|
@@ -149114,6 +149213,8 @@ var init_nav_lint = __esm({
|
|
|
149114
149213
|
"src/nav-lint.ts"() {
|
|
149115
149214
|
init_app_config_loader();
|
|
149116
149215
|
init_provisioning_facts();
|
|
149216
|
+
init_nav_slots();
|
|
149217
|
+
init_home_screen_id();
|
|
149117
149218
|
init_wix_push_links();
|
|
149118
149219
|
NAVIGATION_KEYS = /* @__PURE__ */ new Set([
|
|
149119
149220
|
"tabBar",
|
|
@@ -149169,8 +149270,8 @@ __export(eject_exports, {
|
|
|
149169
149270
|
EJECTABLE: () => EJECTABLE,
|
|
149170
149271
|
ejectModule: () => ejectModule
|
|
149171
149272
|
});
|
|
149172
|
-
import { existsSync as existsSync58, mkdirSync as mkdirSync28, readFileSync as
|
|
149173
|
-
import { dirname as dirname33, join as
|
|
149273
|
+
import { existsSync as existsSync58, mkdirSync as mkdirSync28, readFileSync as readFileSync68, writeFileSync as writeFileSync25 } from "node:fs";
|
|
149274
|
+
import { dirname as dirname33, join as join60, relative as relative12, resolve as resolve49, sep as sep16 } from "node:path";
|
|
149174
149275
|
function locate(repoRootOrCwd, mod) {
|
|
149175
149276
|
const inRepo = resolve49(repoRootOrCwd, `stdlib/flows/${mod}/src/index.ts`);
|
|
149176
149277
|
if (existsSync58(inRepo)) return { path: inRepo, form: "source" };
|
|
@@ -149199,7 +149300,7 @@ function ejectModule(opts) {
|
|
|
149199
149300
|
};
|
|
149200
149301
|
}
|
|
149201
149302
|
const ext = found.form === "source" ? "ts" : "mjs";
|
|
149202
|
-
const target =
|
|
149303
|
+
const target = join60(contentDir2, "tier5-src", "_ejected", `${mod}.${ext}`);
|
|
149203
149304
|
mkdirSync28(dirname33(target), { recursive: true });
|
|
149204
149305
|
const banner = `// EJECTED from @wix/himalaya/${mod}. This app owns this file now.
|
|
149205
149306
|
//
|
|
@@ -149213,7 +149314,7 @@ function ejectModule(opts) {
|
|
|
149213
149314
|
// gate still applies. Ejecting buys layout and flow, never the floor.
|
|
149214
149315
|
|
|
149215
149316
|
`;
|
|
149216
|
-
const normalized =
|
|
149317
|
+
const normalized = readFileSync68(found.path, "utf8").replace(
|
|
149217
149318
|
/(["'])@himalaya\/([a-z0-9-]+(?:\/[a-z0-9-]+)?)\1/g,
|
|
149218
149319
|
(_m, q2, sub) => `${q2}@wix/himalaya/${sub}${q2}`
|
|
149219
149320
|
);
|
|
@@ -149221,7 +149322,7 @@ function ejectModule(opts) {
|
|
|
149221
149322
|
const rewired = [];
|
|
149222
149323
|
for (const f2 of files) {
|
|
149223
149324
|
if (!existsSync58(f2)) continue;
|
|
149224
|
-
const before =
|
|
149325
|
+
const before = readFileSync68(f2, "utf8");
|
|
149225
149326
|
let after = before;
|
|
149226
149327
|
let rel = relative12(dirname33(f2), target).split(sep16).join("/").replace(/\.tsx?$/, ".js");
|
|
149227
149328
|
if (!rel.startsWith(".")) rel = `./${rel}`;
|
|
@@ -149341,8 +149442,8 @@ var init_app_map = __esm({
|
|
|
149341
149442
|
});
|
|
149342
149443
|
|
|
149343
149444
|
// src/wix-writes.ts
|
|
149344
|
-
import { existsSync as existsSync59, readFileSync as
|
|
149345
|
-
import { join as
|
|
149445
|
+
import { existsSync as existsSync59, readFileSync as readFileSync69 } from "node:fs";
|
|
149446
|
+
import { join as join61 } from "node:path";
|
|
149346
149447
|
function isProvenRead(method, path2) {
|
|
149347
149448
|
if (/[#\x00-\x1F\x7F]/.test(path2)) return false;
|
|
149348
149449
|
const verb = method.toUpperCase();
|
|
@@ -149460,11 +149561,11 @@ function parseDataAccess(text9, from) {
|
|
|
149460
149561
|
}
|
|
149461
149562
|
function readDataAccess(dir) {
|
|
149462
149563
|
for (const name of ["SPEC.md", "MOBILE-UX.md"]) {
|
|
149463
|
-
const p2 =
|
|
149564
|
+
const p2 = join61(dir, name);
|
|
149464
149565
|
if (!existsSync59(p2)) continue;
|
|
149465
149566
|
let text9;
|
|
149466
149567
|
try {
|
|
149467
|
-
text9 =
|
|
149568
|
+
text9 = readFileSync69(p2, "utf8");
|
|
149468
149569
|
} catch {
|
|
149469
149570
|
continue;
|
|
149470
149571
|
}
|
|
@@ -149578,14 +149679,14 @@ __export(test_exports, {
|
|
|
149578
149679
|
scopeDescriptors: () => scopeDescriptors,
|
|
149579
149680
|
writeRecordedMocks: () => writeRecordedMocks
|
|
149580
149681
|
});
|
|
149581
|
-
import { existsSync as existsSync60, mkdirSync as mkdirSync29, readFileSync as
|
|
149582
|
-
import { join as
|
|
149682
|
+
import { existsSync as existsSync60, mkdirSync as mkdirSync29, readFileSync as readFileSync70, writeFileSync as writeFileSync26 } from "node:fs";
|
|
149683
|
+
import { join as join62, resolve as resolve50 } from "node:path";
|
|
149583
149684
|
function readTestConfig(dir) {
|
|
149584
149685
|
const p2 = resolve50(dir, TEST_CONFIG_FILE);
|
|
149585
149686
|
if (!existsSync60(p2)) return {};
|
|
149586
149687
|
let parsed;
|
|
149587
149688
|
try {
|
|
149588
|
-
parsed = JSON.parse(
|
|
149689
|
+
parsed = JSON.parse(readFileSync70(p2, "utf8"));
|
|
149589
149690
|
} catch (e2) {
|
|
149590
149691
|
throw new Error(`${TEST_CONFIG_FILE} is not valid JSON \u2014 ${e2.message}`);
|
|
149591
149692
|
}
|
|
@@ -149632,7 +149733,7 @@ function readTestConfig(dir) {
|
|
|
149632
149733
|
function readNetRules(path2) {
|
|
149633
149734
|
let parsed;
|
|
149634
149735
|
try {
|
|
149635
|
-
parsed = JSON.parse(
|
|
149736
|
+
parsed = JSON.parse(readFileSync70(path2, "utf8"));
|
|
149636
149737
|
} catch (e2) {
|
|
149637
149738
|
throw new Error(`--net ${path2} could not be read as JSON \u2014 ${e2.message}`);
|
|
149638
149739
|
}
|
|
@@ -149669,7 +149770,7 @@ function readCannedResponses() {
|
|
|
149669
149770
|
];
|
|
149670
149771
|
for (const url of candidates) {
|
|
149671
149772
|
try {
|
|
149672
|
-
const parsed = JSON.parse(
|
|
149773
|
+
const parsed = JSON.parse(readFileSync70(url, "utf8"));
|
|
149673
149774
|
const byKey = {};
|
|
149674
149775
|
for (const [k2, v2] of Object.entries(parsed)) {
|
|
149675
149776
|
if (!k2.startsWith("//")) byKey[k2] = v2;
|
|
@@ -149759,8 +149860,8 @@ function writeRecordedMocks(opts) {
|
|
|
149759
149860
|
mkdir: (p2) => mkdirSync29(p2, { recursive: true }),
|
|
149760
149861
|
write: (p2, s2) => writeFileSync26(p2, s2)
|
|
149761
149862
|
};
|
|
149762
|
-
fs2.mkdir(
|
|
149763
|
-
fs2.write(
|
|
149863
|
+
fs2.mkdir(join62(opts.dir, "dev"));
|
|
149864
|
+
fs2.write(join62(opts.dir, "dev", "net-mocks.json"), JSON.stringify(opts.mocks, null, 2) + "\n");
|
|
149764
149865
|
return { ok: true, rules, to: "dev/net-mocks.json" };
|
|
149765
149866
|
}
|
|
149766
149867
|
function scopeDescriptors(descriptors, requestedIds, invalidScreens) {
|
|
@@ -150306,14 +150407,14 @@ var mobile_ux_lint_exports = {};
|
|
|
150306
150407
|
__export(mobile_ux_lint_exports, {
|
|
150307
150408
|
mobileUxIssues: () => mobileUxIssues
|
|
150308
150409
|
});
|
|
150309
|
-
import { existsSync as existsSync61, readFileSync as
|
|
150310
|
-
import { join as
|
|
150410
|
+
import { existsSync as existsSync61, readFileSync as readFileSync71 } from "node:fs";
|
|
150411
|
+
import { join as join63 } from "node:path";
|
|
150311
150412
|
function mobileUxIssues(dir, strict) {
|
|
150312
|
-
const file2 =
|
|
150413
|
+
const file2 = join63(dir, "MOBILE-UX.md");
|
|
150313
150414
|
if (!existsSync61(file2)) return [];
|
|
150314
150415
|
let text9;
|
|
150315
150416
|
try {
|
|
150316
|
-
text9 =
|
|
150417
|
+
text9 = readFileSync71(file2, "utf8");
|
|
150317
150418
|
} catch {
|
|
150318
150419
|
return [];
|
|
150319
150420
|
}
|
|
@@ -151994,8 +152095,8 @@ __export(functions_exports, {
|
|
|
151994
152095
|
resolveFunctionsTarget: () => resolveFunctionsTarget,
|
|
151995
152096
|
runRemoteFunctionOperation: () => runRemoteFunctionOperation
|
|
151996
152097
|
});
|
|
151997
|
-
import { readFileSync as
|
|
151998
|
-
import { join as
|
|
152098
|
+
import { readFileSync as readFileSync72, existsSync as existsSync62 } from "node:fs";
|
|
152099
|
+
import { join as join64, resolve as resolve51 } from "node:path";
|
|
151999
152100
|
function resolveFunctionsTarget(input) {
|
|
152000
152101
|
const explicitUrl = input.functionsUrl?.trim();
|
|
152001
152102
|
if (explicitUrl) return { mode: "remote", baseUrl: explicitUrl };
|
|
@@ -152014,9 +152115,9 @@ async function loadFunctionsApp(dir) {
|
|
|
152014
152115
|
}
|
|
152015
152116
|
const sources = {};
|
|
152016
152117
|
for (const definition of config.functions.functions) {
|
|
152017
|
-
const source = [".ts", ".js", ".mts", ".mjs"].map((extension) =>
|
|
152118
|
+
const source = [".ts", ".js", ".mts", ".mjs"].map((extension) => join64(loaded.dir, "functions", `${definition.name}${extension}`)).find(existsSync62);
|
|
152018
152119
|
if (!source) throw new Error(`missing source for function ${definition.name}; expected functions/${definition.name}.ts`);
|
|
152019
|
-
sources[definition.name] =
|
|
152120
|
+
sources[definition.name] = readFileSync72(source, "utf8");
|
|
152020
152121
|
}
|
|
152021
152122
|
const data = config.cms || config.data ? mergeDataResources(config) : void 0;
|
|
152022
152123
|
const dataErrors = validateDataResources(data, loaded.name).filter((issue2) => issue2.severity === "error");
|
|
@@ -152204,9 +152305,9 @@ var init_cli_bridge = __esm({
|
|
|
152204
152305
|
});
|
|
152205
152306
|
|
|
152206
152307
|
// 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
|
|
152308
|
+
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
152309
|
import { randomBytes as randomBytes4 } from "node:crypto";
|
|
152209
|
-
import { dirname as dirname34, isAbsolute as isAbsolute7, join as
|
|
152310
|
+
import { dirname as dirname34, isAbsolute as isAbsolute7, join as join65, relative as relative13, resolve as resolve52, sep as sep17 } from "node:path";
|
|
152210
152311
|
import * as z2 from "zod";
|
|
152211
152312
|
function within(root, p2) {
|
|
152212
152313
|
return p2 === root || p2.startsWith(root.endsWith(sep17) ? root : root + sep17);
|
|
@@ -152220,12 +152321,12 @@ function realish(p2) {
|
|
|
152220
152321
|
tail.unshift(cur.slice(up.length + (up.endsWith(sep17) ? 0 : 1)));
|
|
152221
152322
|
cur = up;
|
|
152222
152323
|
}
|
|
152223
|
-
return
|
|
152324
|
+
return join65(realpathSync10(cur), ...tail);
|
|
152224
152325
|
}
|
|
152225
152326
|
function symlinkComponent(base, abs) {
|
|
152226
152327
|
let cur = base;
|
|
152227
152328
|
for (const part of relative13(base, abs).split(sep17).filter(Boolean)) {
|
|
152228
|
-
cur =
|
|
152329
|
+
cur = join65(cur, part);
|
|
152229
152330
|
try {
|
|
152230
152331
|
if (lstatSync20(cur).isSymbolicLink()) return relative13(base, cur);
|
|
152231
152332
|
} catch {
|
|
@@ -152252,7 +152353,7 @@ async function confinedAppDir(args, deps) {
|
|
|
152252
152353
|
if (link) return refuse5("outside_workspace", `"${link}" is a symlink \u2014 the app folder must be a real folder in the workspace`);
|
|
152253
152354
|
const rel = relative13(root, dir);
|
|
152254
152355
|
if (rel && (isDeniedSourcePath(`${rel}/x`) || isDeniedSourcePath(`${rel.toLowerCase()}/x`))) return refuse5("denied", `"${rel}" is a folder this tool does not touch`);
|
|
152255
|
-
if (!existsSync63(
|
|
152356
|
+
if (!existsSync63(join65(dir, CONTENT_MARKER))) {
|
|
152256
152357
|
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
152358
|
}
|
|
152258
152359
|
return dir;
|
|
@@ -152266,7 +152367,7 @@ function onDiskSpelling(abs) {
|
|
|
152266
152367
|
tail.unshift(cur.slice(up.length + (up.endsWith(sep17) ? 0 : 1)));
|
|
152267
152368
|
cur = up;
|
|
152268
152369
|
}
|
|
152269
|
-
return
|
|
152370
|
+
return join65(realpathSync10.native(cur), ...tail);
|
|
152270
152371
|
}
|
|
152271
152372
|
function denied(appDir3, abs) {
|
|
152272
152373
|
const rel = relative13(appDir3, abs);
|
|
@@ -152295,7 +152396,7 @@ function writeNoFollow2(appDir3, abs, content) {
|
|
|
152295
152396
|
mkdirSync30(dirname34(abs), { recursive: true });
|
|
152296
152397
|
const before = symlinkComponent(appDir3, abs);
|
|
152297
152398
|
if (before) throw new Error(`"${before}" became a symlink`);
|
|
152298
|
-
const tmp =
|
|
152399
|
+
const tmp = join65(dirname34(abs), `.himi-write-${process.pid}-${randomBytes4(6).toString("hex")}.tmp`);
|
|
152299
152400
|
const fd = openSync5(tmp, constants3.O_WRONLY | constants3.O_CREAT | constants3.O_EXCL | (constants3.O_NOFOLLOW ?? 0), 420);
|
|
152300
152401
|
try {
|
|
152301
152402
|
writeSync(fd, content);
|
|
@@ -152315,7 +152416,7 @@ function listFiles(appDir3) {
|
|
|
152315
152416
|
const parentRel = relative13(appDir3, d2);
|
|
152316
152417
|
for (const e2 of readdirSync30(d2, { withFileTypes: true }).sort((a2, b2) => a2.name.localeCompare(b2.name))) {
|
|
152317
152418
|
if (e2.isSymbolicLink()) continue;
|
|
152318
|
-
const p2 =
|
|
152419
|
+
const p2 = join65(d2, e2.name);
|
|
152319
152420
|
if (e2.isDirectory()) {
|
|
152320
152421
|
if (isDeniedSourceDir(e2.name, parentRel) || isDeniedSourceDir(e2.name.toLowerCase(), parentRel)) continue;
|
|
152321
152422
|
if (!walk2(p2)) return false;
|
|
@@ -152343,9 +152444,9 @@ function fileTools() {
|
|
|
152343
152444
|
const root = resolve52(await d2.defaultDir());
|
|
152344
152445
|
if (!existsSync63(root)) return ok({ ok: true, workspace: root, apps: [] });
|
|
152345
152446
|
const apps = [];
|
|
152346
|
-
if (existsSync63(
|
|
152447
|
+
if (existsSync63(join65(root, CONTENT_MARKER))) apps.push(".");
|
|
152347
152448
|
for (const e2 of readdirSync30(root, { withFileTypes: true })) {
|
|
152348
|
-
if (e2.isDirectory() && !e2.name.startsWith(".") && existsSync63(
|
|
152449
|
+
if (e2.isDirectory() && !e2.name.startsWith(".") && existsSync63(join65(root, e2.name, CONTENT_MARKER))) apps.push(e2.name);
|
|
152349
152450
|
}
|
|
152350
152451
|
return ok({ ok: true, workspace: root, apps: apps.sort() });
|
|
152351
152452
|
}
|
|
@@ -152377,7 +152478,7 @@ function fileTools() {
|
|
|
152377
152478
|
if (!existsSync63(p2) || !lstatSync20(p2).isFile()) return refuse5("not_found", `no file "${String(a2.path)}"`);
|
|
152378
152479
|
const size = statSync16(p2).size;
|
|
152379
152480
|
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:
|
|
152481
|
+
return ok({ ok: true, path: a2.path, bytes: size, content: readFileSync73(p2, "utf8") });
|
|
152381
152482
|
}
|
|
152382
152483
|
},
|
|
152383
152484
|
{
|
|
@@ -152989,7 +153090,7 @@ __export(server_exports, {
|
|
|
152989
153090
|
protectStdout: () => protectStdout,
|
|
152990
153091
|
startMcpServer: () => startMcpServer
|
|
152991
153092
|
});
|
|
152992
|
-
import { mkdirSync as mkdirSync31, readFileSync as
|
|
153093
|
+
import { mkdirSync as mkdirSync31, readFileSync as readFileSync74 } from "node:fs";
|
|
152993
153094
|
import { fileURLToPath as fileURLToPath22 } from "node:url";
|
|
152994
153095
|
import { McpServer } from "@modelcontextprotocol/server";
|
|
152995
153096
|
import { serveStdio, StdioServerTransport } from "@modelcontextprotocol/server/stdio";
|
|
@@ -153049,7 +153150,7 @@ async function startMcpServer(opts) {
|
|
|
153049
153150
|
status: (dir) => previewStatus(dir, previewDeps),
|
|
153050
153151
|
stop: (dir) => stopPreview(dir, previewDeps)
|
|
153051
153152
|
},
|
|
153052
|
-
readFile: (p2) =>
|
|
153153
|
+
readFile: (p2) => readFileSync74(p2),
|
|
153053
153154
|
login: createLoginSession({ ...defaultLoginDeps, selfCommand: previewDeps.selfCommand, ...opts.login }),
|
|
153054
153155
|
...opts.workspace ? { workspaceBoundary: opts.workspace } : {}
|
|
153055
153156
|
};
|
|
@@ -153093,9 +153194,9 @@ __export(native_decode_exports, {
|
|
|
153093
153194
|
runNativeDecode: () => runNativeDecode
|
|
153094
153195
|
});
|
|
153095
153196
|
import { execFileSync as execFileSync5, spawnSync as spawnSync2 } from "node:child_process";
|
|
153096
|
-
import { existsSync as existsSync64, mkdtempSync as mkdtempSync2, readFileSync as
|
|
153197
|
+
import { existsSync as existsSync64, mkdtempSync as mkdtempSync2, readFileSync as readFileSync75, rmSync as rmSync16, writeFileSync as writeFileSync27 } from "node:fs";
|
|
153097
153198
|
import { tmpdir as tmpdir3 } from "node:os";
|
|
153098
|
-
import { join as
|
|
153199
|
+
import { join as join66 } from "node:path";
|
|
153099
153200
|
import { fileURLToPath as fileURLToPath23 } from "node:url";
|
|
153100
153201
|
function nativeDecodePackageDir() {
|
|
153101
153202
|
return fileURLToPath23(new URL("../../../core/runtime/ios/HimalayaCore/", import.meta.url));
|
|
@@ -153105,8 +153206,8 @@ function nativeDecodeAndroidHarnessDir() {
|
|
|
153105
153206
|
}
|
|
153106
153207
|
function nativeOracleShipped() {
|
|
153107
153208
|
return {
|
|
153108
|
-
ios: existsSync64(
|
|
153109
|
-
android: existsSync64(
|
|
153209
|
+
ios: existsSync64(join66(nativeDecodePackageDir(), "Package.swift")),
|
|
153210
|
+
android: existsSync64(join66(nativeDecodeAndroidHarnessDir(), "gradlew"))
|
|
153110
153211
|
};
|
|
153111
153212
|
}
|
|
153112
153213
|
function detectNativeDecode(options = {}) {
|
|
@@ -153117,7 +153218,7 @@ function detectNativeDecode(options = {}) {
|
|
|
153117
153218
|
return { platform: "ios", available: false, reason: `the iOS decoder oracle requires macOS (darwin); this host is ${hostPlatform}` };
|
|
153118
153219
|
}
|
|
153119
153220
|
if (!swiftAvailable) return { platform: "ios", available: false, reason: "swift is not on PATH" };
|
|
153120
|
-
const packageAvailable = options.packageAvailable ?? existsSync64(
|
|
153221
|
+
const packageAvailable = options.packageAvailable ?? existsSync64(join66(packageDir, "Package.swift"));
|
|
153121
153222
|
if (!packageAvailable) {
|
|
153122
153223
|
return {
|
|
153123
153224
|
platform: "ios",
|
|
@@ -153129,7 +153230,7 @@ function detectNativeDecode(options = {}) {
|
|
|
153129
153230
|
}
|
|
153130
153231
|
function localPropertiesSdk(harnessDir) {
|
|
153131
153232
|
try {
|
|
153132
|
-
const match =
|
|
153233
|
+
const match = readFileSync75(join66(harnessDir, "local.properties"), "utf8").match(/^sdk\.dir\s*=\s*(.+)$/m);
|
|
153133
153234
|
return match?.[1]?.trim().replace(/\\([ :\\])/g, "$1") ?? null;
|
|
153134
153235
|
} catch {
|
|
153135
153236
|
return null;
|
|
@@ -153137,7 +153238,7 @@ function localPropertiesSdk(harnessDir) {
|
|
|
153137
153238
|
}
|
|
153138
153239
|
function detectAndroidNativeDecode(options = {}) {
|
|
153139
153240
|
const harnessDir = options.harnessDir ?? nativeDecodeAndroidHarnessDir();
|
|
153140
|
-
const gradlew =
|
|
153241
|
+
const gradlew = join66(harnessDir, "gradlew");
|
|
153141
153242
|
const gradlewAvailable = options.gradlewAvailable ?? existsSync64(gradlew);
|
|
153142
153243
|
if (!gradlewAvailable) {
|
|
153143
153244
|
return {
|
|
@@ -153220,14 +153321,14 @@ function parseNativeDecodeOutput(stdout, expectedScreenIds, platform = "ios") {
|
|
|
153220
153321
|
return verdicts;
|
|
153221
153322
|
}
|
|
153222
153323
|
function runNativeDecode(options) {
|
|
153223
|
-
const descriptorDir = mkdtempSync2(
|
|
153324
|
+
const descriptorDir = mkdtempSync2(join66(tmpdir3(), "himi-native-decode-"));
|
|
153224
153325
|
const startedAt = Date.now();
|
|
153225
153326
|
try {
|
|
153226
153327
|
for (const descriptor of options.descriptors) {
|
|
153227
153328
|
if (typeof descriptor.descriptorJson !== "string") {
|
|
153228
153329
|
throw new Error(`native decode cannot judge ${descriptor.screenId}: the release builder did not return its exact baked JSON bytes`);
|
|
153229
153330
|
}
|
|
153230
|
-
writeFileSync27(
|
|
153331
|
+
writeFileSync27(join66(descriptorDir, `${encodeURIComponent(descriptor.screenId)}.json`), descriptor.descriptorJson);
|
|
153231
153332
|
}
|
|
153232
153333
|
options.progress?.("building cached Swift oracle");
|
|
153233
153334
|
execFileSync5("swift", ["build", "--package-path", options.packageDir, "--product", "himi-decode-oracle"], {
|
|
@@ -153239,7 +153340,7 @@ function runNativeDecode(options) {
|
|
|
153239
153340
|
encoding: "utf8"
|
|
153240
153341
|
}).trim();
|
|
153241
153342
|
options.progress?.(`running real Swift decoder over ${options.descriptors.length} screen${options.descriptors.length === 1 ? "" : "s"}`);
|
|
153242
|
-
const stdout = execFileSync5(
|
|
153343
|
+
const stdout = execFileSync5(join66(binPath, "himi-decode-oracle"), ["--dir", descriptorDir], {
|
|
153243
153344
|
stdio: ["ignore", "pipe", "pipe"],
|
|
153244
153345
|
encoding: "utf8"
|
|
153245
153346
|
});
|
|
@@ -153257,15 +153358,15 @@ function runNativeDecode(options) {
|
|
|
153257
153358
|
}
|
|
153258
153359
|
}
|
|
153259
153360
|
function runAndroidNativeDecode(options) {
|
|
153260
|
-
const descriptorDir = mkdtempSync2(
|
|
153261
|
-
const outputPath =
|
|
153361
|
+
const descriptorDir = mkdtempSync2(join66(tmpdir3(), "himi-native-decode-android-"));
|
|
153362
|
+
const outputPath = join66(descriptorDir, "verdicts.ndjson");
|
|
153262
153363
|
const startedAt = Date.now();
|
|
153263
153364
|
try {
|
|
153264
153365
|
for (const descriptor of options.descriptors) {
|
|
153265
153366
|
if (typeof descriptor.descriptorJson !== "string") {
|
|
153266
153367
|
throw new Error(`native decode cannot judge ${descriptor.screenId}: the release builder did not return its exact baked JSON bytes`);
|
|
153267
153368
|
}
|
|
153268
|
-
writeFileSync27(
|
|
153369
|
+
writeFileSync27(join66(descriptorDir, `${encodeURIComponent(descriptor.screenId)}.json`), descriptor.descriptorJson);
|
|
153269
153370
|
}
|
|
153270
153371
|
options.progress?.(`running real Kotlin decoder over ${options.descriptors.length} screen${options.descriptors.length === 1 ? "" : "s"}`);
|
|
153271
153372
|
execFileSync5(options.gradlew, [
|
|
@@ -153280,7 +153381,7 @@ function runAndroidNativeDecode(options) {
|
|
|
153280
153381
|
stdio: ["ignore", "ignore", "pipe"],
|
|
153281
153382
|
encoding: "utf8"
|
|
153282
153383
|
});
|
|
153283
|
-
const stdout =
|
|
153384
|
+
const stdout = readFileSync75(outputPath, "utf8");
|
|
153284
153385
|
return {
|
|
153285
153386
|
platform: "android",
|
|
153286
153387
|
verdicts: parseNativeDecodeOutput(stdout, options.descriptors.map((descriptor) => descriptor.screenId), "android"),
|
|
@@ -153350,13 +153451,13 @@ __export(browser_authoring_exports, {
|
|
|
153350
153451
|
});
|
|
153351
153452
|
import { createServer as createServer5 } from "node:http";
|
|
153352
153453
|
import { createHash as createHash35, randomBytes as randomBytes5 } from "node:crypto";
|
|
153353
|
-
import { existsSync as existsSync65, readdirSync as readdirSync31, readFileSync as
|
|
153354
|
-
import { join as
|
|
153454
|
+
import { existsSync as existsSync65, readdirSync as readdirSync31, readFileSync as readFileSync76, realpathSync as realpathSync11, statSync as statSync17 } from "node:fs";
|
|
153455
|
+
import { join as join67, posix as posix3, relative as relative14, sep as sep18 } from "node:path";
|
|
153355
153456
|
function humanMs(ms2) {
|
|
153356
153457
|
return ms2 < 1e3 ? `${ms2}ms` : `${Math.round(ms2 / 1e3)}s`;
|
|
153357
153458
|
}
|
|
153358
153459
|
function collectWorkerSources(tier5SrcDir, bundleName) {
|
|
153359
|
-
const root =
|
|
153460
|
+
const root = join67(tier5SrcDir, bundleName);
|
|
153360
153461
|
const files = {};
|
|
153361
153462
|
const visitedDirs = /* @__PURE__ */ new Set();
|
|
153362
153463
|
const walk2 = (abs, rel) => {
|
|
@@ -153364,12 +153465,12 @@ function collectWorkerSources(tier5SrcDir, bundleName) {
|
|
|
153364
153465
|
if (visitedDirs.has(real)) return;
|
|
153365
153466
|
visitedDirs.add(real);
|
|
153366
153467
|
for (const name of readdirSync31(abs).sort()) {
|
|
153367
|
-
const childAbs =
|
|
153468
|
+
const childAbs = join67(abs, name);
|
|
153368
153469
|
const childRel = posix3.join(rel, name);
|
|
153369
153470
|
if (statSync17(childAbs).isDirectory()) {
|
|
153370
153471
|
walk2(childAbs, childRel);
|
|
153371
153472
|
} else if (/\.(ts|tsx|js|mjs|json)$/.test(name)) {
|
|
153372
|
-
files[childRel] =
|
|
153473
|
+
files[childRel] = readFileSync76(childAbs, "utf8");
|
|
153373
153474
|
}
|
|
153374
153475
|
}
|
|
153375
153476
|
};
|
|
@@ -153390,20 +153491,20 @@ function collectRelativeSiblings(files, tier5SrcDir) {
|
|
|
153390
153491
|
const spec = m2[1];
|
|
153391
153492
|
const virtual = posix3.normalize(posix3.join(dir, spec));
|
|
153392
153493
|
if (!virtual.startsWith("/tier5-src/")) continue;
|
|
153393
|
-
const onDisk =
|
|
153494
|
+
const onDisk = join67(tier5SrcDir, virtual.slice("/tier5-src/".length));
|
|
153394
153495
|
const candidates = [
|
|
153395
153496
|
onDisk,
|
|
153396
153497
|
`${onDisk}.ts`,
|
|
153397
153498
|
`${onDisk}.js`,
|
|
153398
153499
|
onDisk.replace(/\.js$/, ".ts"),
|
|
153399
|
-
|
|
153400
|
-
|
|
153500
|
+
join67(onDisk, "index.ts"),
|
|
153501
|
+
join67(onDisk, "index.js")
|
|
153401
153502
|
];
|
|
153402
153503
|
for (const abs of candidates) {
|
|
153403
153504
|
if (!existsSync65(abs) || statSync17(abs).isDirectory()) continue;
|
|
153404
153505
|
const key2 = `/tier5-src/${relative14(tier5SrcDir, abs).split(sep18).join(posix3.sep)}`;
|
|
153405
153506
|
if (key2 in files) break;
|
|
153406
|
-
files[key2] =
|
|
153507
|
+
files[key2] = readFileSync76(abs, "utf8");
|
|
153407
153508
|
queue.push(key2);
|
|
153408
153509
|
break;
|
|
153409
153510
|
}
|
|
@@ -153438,7 +153539,7 @@ function collectSdkModules(files, resolveSubpath) {
|
|
|
153438
153539
|
function sdkSubpathReader(resolve61) {
|
|
153439
153540
|
return (sub) => {
|
|
153440
153541
|
try {
|
|
153441
|
-
return
|
|
153542
|
+
return readFileSync76(resolve61(`@wix/himalaya/${sub}`), "utf8");
|
|
153442
153543
|
} catch {
|
|
153443
153544
|
return null;
|
|
153444
153545
|
}
|
|
@@ -153610,8 +153711,8 @@ __export(coverage_exports, {
|
|
|
153610
153711
|
suppressedNativeKeys: () => suppressedNativeKeys,
|
|
153611
153712
|
trendAndStore: () => trendAndStore
|
|
153612
153713
|
});
|
|
153613
|
-
import { existsSync as existsSync66, mkdirSync as mkdirSync32, readFileSync as
|
|
153614
|
-
import { dirname as dirname35, join as
|
|
153714
|
+
import { existsSync as existsSync66, mkdirSync as mkdirSync32, readFileSync as readFileSync77, writeFileSync as writeFileSync28 } from "node:fs";
|
|
153715
|
+
import { dirname as dirname35, join as join68 } from "node:path";
|
|
153615
153716
|
function suppressedNativeKeys(oracle) {
|
|
153616
153717
|
return [...oracle.ios ? [] : ["native-decode|ios"], ...oracle.android ? [] : ["native-decode|android"]];
|
|
153617
153718
|
}
|
|
@@ -153791,11 +153892,11 @@ function assembleLedger(r2, options = {}) {
|
|
|
153791
153892
|
return out2;
|
|
153792
153893
|
}
|
|
153793
153894
|
function trendAndStore(dir, entries, suppressed) {
|
|
153794
|
-
const p2 =
|
|
153895
|
+
const p2 = join68(dir, LEDGER_FILE);
|
|
153795
153896
|
let previous = null;
|
|
153796
153897
|
try {
|
|
153797
153898
|
if (existsSync66(p2)) {
|
|
153798
|
-
const parsed = JSON.parse(
|
|
153899
|
+
const parsed = JSON.parse(readFileSync77(p2, "utf8"));
|
|
153799
153900
|
if (Array.isArray(parsed.keys)) previous = parsed.keys.filter((k2) => typeof k2 === "string");
|
|
153800
153901
|
}
|
|
153801
153902
|
} catch {
|
|
@@ -153834,11 +153935,11 @@ function formatLedger(entries, trend) {
|
|
|
153834
153935
|
return out2.join("\n");
|
|
153835
153936
|
}
|
|
153836
153937
|
function diffAndStoreObservations(dir, current) {
|
|
153837
|
-
const p2 =
|
|
153938
|
+
const p2 = join68(dir, OBS_FILE);
|
|
153838
153939
|
let previous = null;
|
|
153839
153940
|
try {
|
|
153840
153941
|
if (existsSync66(p2)) {
|
|
153841
|
-
const parsed = JSON.parse(
|
|
153942
|
+
const parsed = JSON.parse(readFileSync77(p2, "utf8"));
|
|
153842
153943
|
if (parsed.screens && typeof parsed.screens === "object" && !Array.isArray(parsed.screens) && Object.values(parsed.screens).every(
|
|
153843
153944
|
(v2) => Array.isArray(v2) && v2.every((l2) => typeof l2 === "string")
|
|
153844
153945
|
)) {
|
|
@@ -153887,8 +153988,8 @@ var LEDGER_FILE, OBS_FILE;
|
|
|
153887
153988
|
var init_coverage = __esm({
|
|
153888
153989
|
"src/coverage.ts"() {
|
|
153889
153990
|
init_native_decode();
|
|
153890
|
-
LEDGER_FILE =
|
|
153891
|
-
OBS_FILE =
|
|
153991
|
+
LEDGER_FILE = join68(".himi", "test-ledger.json");
|
|
153992
|
+
OBS_FILE = join68(".himi", "test-observations.json");
|
|
153892
153993
|
}
|
|
153893
153994
|
});
|
|
153894
153995
|
|
|
@@ -153899,8 +154000,8 @@ __export(design_kits_exports, {
|
|
|
153899
154000
|
kitsDir: () => kitsDir,
|
|
153900
154001
|
listKits: () => listKits2
|
|
153901
154002
|
});
|
|
153902
|
-
import { existsSync as existsSync67, readFileSync as
|
|
153903
|
-
import { join as
|
|
154003
|
+
import { existsSync as existsSync67, readFileSync as readFileSync78, readdirSync as readdirSync32 } from "node:fs";
|
|
154004
|
+
import { join as join69, basename as basename16 } from "node:path";
|
|
153904
154005
|
import { fileURLToPath as fileURLToPath24 } from "node:url";
|
|
153905
154006
|
function kitsDir() {
|
|
153906
154007
|
return KIT_DIR_CANDIDATES.find((p2) => existsSync67(p2));
|
|
@@ -153927,7 +154028,7 @@ In a published @wix/himalaya-cli this is a packaging bug \u2014 the kits should
|
|
|
153927
154028
|
if (!kits.includes(name)) {
|
|
153928
154029
|
return { ok: false, kit: name, kits, problems: [`no design kit named "${name}". Available: ${kits.join(", ")}`] };
|
|
153929
154030
|
}
|
|
153930
|
-
const raw =
|
|
154031
|
+
const raw = readFileSync78(join69(dir, `${name}.json`), "utf8");
|
|
153931
154032
|
let parsed;
|
|
153932
154033
|
try {
|
|
153933
154034
|
parsed = JSON.parse(raw);
|
|
@@ -153951,9 +154052,9 @@ var init_design_kits = __esm({
|
|
|
153951
154052
|
"src/design-kits.ts"() {
|
|
153952
154053
|
KIT_DIR_CANDIDATES = [
|
|
153953
154054
|
// in-repo: tools/himi-cli/src/design-kits.ts → <repo>/stdlib/design-kits/
|
|
153954
|
-
|
|
154055
|
+
join69(fileURLToPath24(new URL("../../..", import.meta.url)), "stdlib", "design-kits"),
|
|
153955
154056
|
// published CLI: <pkg>/dist/cli.mjs → <pkg>/stdlib/design-kits/
|
|
153956
|
-
|
|
154057
|
+
join69(fileURLToPath24(new URL("..", import.meta.url)), "stdlib", "design-kits")
|
|
153957
154058
|
];
|
|
153958
154059
|
}
|
|
153959
154060
|
});
|
|
@@ -153967,11 +154068,11 @@ __export(assets_exports, {
|
|
|
153967
154068
|
removeAssetPayload: () => removeAssetPayload,
|
|
153968
154069
|
verifyReport: () => verifyReport
|
|
153969
154070
|
});
|
|
153970
|
-
import { readFileSync as
|
|
154071
|
+
import { readFileSync as readFileSync79 } from "node:fs";
|
|
153971
154072
|
import { basename as basename17 } from "node:path";
|
|
153972
154073
|
function declaredAssets(dir) {
|
|
153973
154074
|
return collectAssets(dir).map((a2) => {
|
|
153974
|
-
const bytes2 =
|
|
154075
|
+
const bytes2 = readFileSync79(a2.path);
|
|
153975
154076
|
return {
|
|
153976
154077
|
name: a2.name,
|
|
153977
154078
|
sha256: assetSha256(bytes2),
|
|
@@ -154048,7 +154149,7 @@ function verifyReport(dir, app, manifest) {
|
|
|
154048
154149
|
};
|
|
154049
154150
|
}
|
|
154050
154151
|
function addAssetPayload(manifest, filePath, opts) {
|
|
154051
|
-
const bytes2 =
|
|
154152
|
+
const bytes2 = readFileSync79(filePath);
|
|
154052
154153
|
const name = opts.name ?? basename17(filePath);
|
|
154053
154154
|
const sha2566 = assetSha256(bytes2);
|
|
154054
154155
|
const record2 = {
|
|
@@ -155803,25 +155904,25 @@ var init_preview_assets_generated = __esm({
|
|
|
155803
155904
|
"../../packages/serve/src/preview-assets.generated.ts"() {
|
|
155804
155905
|
init_preview_assets_format();
|
|
155805
155906
|
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:
|
|
155907
|
+
{ key: "assets/index-CoUR7qoz.js", contentType: "application/javascript; charset=utf-8", offset: 8, length: 1266053, sha256: "25b34055136947d515d6057238d0dafc333d6009da327f01b74e06c4e462dd95" },
|
|
155908
|
+
{ key: "assets/pdf-BChnv3CJ.js", contentType: "application/javascript; charset=utf-8", offset: 1266061, length: 488199, sha256: "c6dab79264bcb608690696b385acfefd82a0e9734edd29763d1a0d12640f2487" },
|
|
155909
|
+
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset: 1754260, length: 73, sha256: "41bcfda4f3c8c0a81c785ea87c69afc8e7d0ed8c333324aee94c273d881bb6aa" },
|
|
155910
|
+
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset: 1754333, length: 1317034, sha256: "a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e" },
|
|
155911
|
+
{ key: "assets/pdfDocument-BEWILVUm.js", contentType: "application/javascript; charset=utf-8", offset: 3071367, length: 2858, sha256: "e99ccba3f1701bb444031ce7b5797d5e5bd1fb3a8ff9cbdb89eca78eaadbdddd" },
|
|
155912
|
+
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset: 3074225, length: 4610, sha256: "994062dd7af4186a739de55dd9e151c63b6301f8e2cbafc608d35c2e87da0cd2" },
|
|
155913
|
+
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset: 3078835, length: 488584, sha256: "d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134" },
|
|
155914
|
+
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset: 3567419, length: 90924, sha256: "ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf" },
|
|
155915
|
+
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset: 3658343, length: 90984, sha256: "bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa" },
|
|
155916
|
+
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset: 3749327, length: 90980, sha256: "368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5" },
|
|
155917
|
+
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset: 3840307, length: 90872, sha256: "97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1" },
|
|
155918
|
+
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset: 3931179, length: 90980, sha256: "642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e" },
|
|
155919
|
+
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset: 4022159, length: 108636, sha256: "37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29" },
|
|
155920
|
+
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset: 4130795, length: 109084, sha256: "62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9" },
|
|
155921
|
+
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset: 4239879, length: 109048, sha256: "4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02" },
|
|
155922
|
+
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset: 4348927, length: 107700, sha256: "dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5" },
|
|
155923
|
+
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset: 4456627, length: 88108, sha256: "dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b" },
|
|
155924
|
+
{ key: "index.html", contentType: "text/html; charset=utf-8", offset: 4544735, length: 4947, sha256: "2b60c2689097b5247dae440b6ad4d7816290fc6014b2d4000cf7c279e9fa2cd6" },
|
|
155925
|
+
{ key: "t5-frame.html", contentType: "text/html; charset=utf-8", offset: 4549682, length: 17344, sha256: "d057298d75e7373e5e2c4d11b7d1bcbea88e03af555ba63d97641c78509c58e4" }
|
|
155825
155926
|
];
|
|
155826
155927
|
}
|
|
155827
155928
|
});
|
|
@@ -155839,9 +155940,9 @@ __export(run_exports, {
|
|
|
155839
155940
|
runPackage: () => runPackage,
|
|
155840
155941
|
withoutProdServe: () => withoutProdServe
|
|
155841
155942
|
});
|
|
155842
|
-
import { cpSync as cpSync2, existsSync as existsSync68, mkdirSync as mkdirSync33, mkdtempSync as mkdtempSync3, readFileSync as
|
|
155943
|
+
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
155944
|
import { networkInterfaces as osNetworkInterfaces, tmpdir as tmpdir4 } from "node:os";
|
|
155844
|
-
import { dirname as dirname36, join as
|
|
155945
|
+
import { dirname as dirname36, join as join70 } from "node:path";
|
|
155845
155946
|
import { fileURLToPath as fileURLToPath25 } from "node:url";
|
|
155846
155947
|
function makePackageRunHandler(opts) {
|
|
155847
155948
|
const store = new FileReleaseStore(opts.releaseRoot);
|
|
@@ -155870,7 +155971,7 @@ async function fetchBytes(url) {
|
|
|
155870
155971
|
async function resolvePackage(source, workDir) {
|
|
155871
155972
|
const isUrl2 = /^https?:\/\//i.test(source);
|
|
155872
155973
|
if (!isUrl2 && existsSync68(source) && statSync18(source).isDirectory()) {
|
|
155873
|
-
const appDirManifest =
|
|
155974
|
+
const appDirManifest = join70(source, "release-manifest.json");
|
|
155874
155975
|
if (existsSync68(appDirManifest)) {
|
|
155875
155976
|
const opened2 = openPackageDir(source);
|
|
155876
155977
|
if (!opened2.validation.ok) {
|
|
@@ -155880,9 +155981,9 @@ async function resolvePackage(source, workDir) {
|
|
|
155880
155981
|
const app2 = opened2.header?.app ?? opened2.manifest?.app;
|
|
155881
155982
|
if (!app2) throw new Error(`${source} has no app id (no himi-package.json and no manifest.app)`);
|
|
155882
155983
|
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 (
|
|
155984
|
+
const root2 = workDir ?? mkdtempSync3(join70(tmpdir4(), "himi-run-"));
|
|
155985
|
+
const target = join70(root2, app2);
|
|
155986
|
+
if (join70(source) !== target) {
|
|
155886
155987
|
mkdirSync33(root2, { recursive: true });
|
|
155887
155988
|
rmSync17(target, { recursive: true, force: true });
|
|
155888
155989
|
cpSync2(source, target, { recursive: true });
|
|
@@ -155899,8 +156000,8 @@ async function resolvePackage(source, workDir) {
|
|
|
155899
156000
|
}
|
|
155900
156001
|
throw new Error(`${source} is a directory but has no release-manifest.json \u2014 is it a package?`);
|
|
155901
156002
|
}
|
|
155902
|
-
const bytes2 = isUrl2 ? await fetchBytes(source) :
|
|
155903
|
-
const root = workDir ?? mkdtempSync3(
|
|
156003
|
+
const bytes2 = isUrl2 ? await fetchBytes(source) : readFileSync80(source);
|
|
156004
|
+
const root = workDir ?? mkdtempSync3(join70(tmpdir4(), "himi-run-"));
|
|
155904
156005
|
const { app, appDir: appDir3 } = unpackTo(bytes2, root);
|
|
155905
156006
|
const opened = openPackageDir(appDir3);
|
|
155906
156007
|
if (!opened.validation.ok) {
|
|
@@ -155923,14 +156024,14 @@ async function loadPreviewAssets() {
|
|
|
155923
156024
|
const mod = await Promise.resolve().then(() => (init_preview_assets_generated(), preview_assets_generated_exports));
|
|
155924
156025
|
const here = dirname36(fileURLToPath25(import.meta.url));
|
|
155925
156026
|
const candidates = [
|
|
155926
|
-
|
|
156027
|
+
join70(here, "preview-assets.generated.bin"),
|
|
155927
156028
|
// published: copied next to the bundled CLI
|
|
155928
|
-
|
|
156029
|
+
join70(here, "../../../packages/serve/src/preview-assets.generated.bin")
|
|
155929
156030
|
// in-repo checkout
|
|
155930
156031
|
];
|
|
155931
156032
|
for (const path2 of candidates) {
|
|
155932
156033
|
if (!existsSync68(path2)) continue;
|
|
155933
|
-
const blob =
|
|
156034
|
+
const blob = readFileSync80(path2);
|
|
155934
156035
|
return mod.assemblePreviewAssetsFromBlob(new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength));
|
|
155935
156036
|
}
|
|
155936
156037
|
return /* @__PURE__ */ new Map();
|
|
@@ -156067,7 +156168,7 @@ __export(run_browser_exports, {
|
|
|
156067
156168
|
runInBrowser: () => runInBrowser
|
|
156068
156169
|
});
|
|
156069
156170
|
import { createServer as createServer7 } from "node:http";
|
|
156070
|
-
import { existsSync as existsSync69, readFileSync as
|
|
156171
|
+
import { existsSync as existsSync69, readFileSync as readFileSync81 } from "node:fs";
|
|
156071
156172
|
import { spawnSync as spawnSync3 } from "node:child_process";
|
|
156072
156173
|
import { dirname as dirname37, resolve as resolve54 } from "node:path";
|
|
156073
156174
|
import { fileURLToPath as fileURLToPath26 } from "node:url";
|
|
@@ -156175,7 +156276,7 @@ async function runInBrowser(releaseRoot, app, header, opts = {}) {
|
|
|
156175
156276
|
}
|
|
156176
156277
|
let bytes2;
|
|
156177
156278
|
try {
|
|
156178
|
-
bytes2 =
|
|
156279
|
+
bytes2 = readFileSync81(resolve54(stagedDir(), name));
|
|
156179
156280
|
} catch (e2) {
|
|
156180
156281
|
res.writeHead(503, { "content-type": "application/json" });
|
|
156181
156282
|
res.end(JSON.stringify({ error: "browser_plane_unstaged", file: name, detail: String(e2) }));
|
|
@@ -156228,14 +156329,14 @@ var hhp_preview_exports = {};
|
|
|
156228
156329
|
__export(hhp_preview_exports, {
|
|
156229
156330
|
hhpPreviewResponse: () => hhpPreviewResponse
|
|
156230
156331
|
});
|
|
156231
|
-
import { existsSync as existsSync70, readFileSync as
|
|
156232
|
-
import { join as
|
|
156332
|
+
import { existsSync as existsSync70, readFileSync as readFileSync82 } from "node:fs";
|
|
156333
|
+
import { join as join71 } from "node:path";
|
|
156233
156334
|
function hhpPreviewResponse(root, request) {
|
|
156234
|
-
if (new URL(request.url).pathname !== "/__himi/hhp-preview" || !existsSync70(
|
|
156335
|
+
if (new URL(request.url).pathname !== "/__himi/hhp-preview" || !existsSync70(join71(root, "hhp.json"))) return null;
|
|
156235
156336
|
if (request.method !== "GET") return new Response(null, { status: 405 });
|
|
156236
156337
|
try {
|
|
156237
156338
|
const file2 = localPath(root, ".himi/hhp-preview.json");
|
|
156238
|
-
const authored2 = existsSync70(file2) ? JSON.parse(
|
|
156339
|
+
const authored2 = existsSync70(file2) ? JSON.parse(readFileSync82(file2, "utf8")) : {};
|
|
156239
156340
|
if (authored2.mockCapabilities && (!Array.isArray(authored2.mockCapabilities) || authored2.mockCapabilities.some((v2) => typeof v2 !== "string"))) throw new Error("mockCapabilities must be a string array.");
|
|
156240
156341
|
const fixtures = authored2.fixtures ?? {};
|
|
156241
156342
|
if (typeof fixtures !== "object" || Array.isArray(fixtures) || fixtures === null) throw new Error("fixtures must be an object.");
|
|
@@ -156385,7 +156486,7 @@ var init_embedded_bundles = __esm({
|
|
|
156385
156486
|
});
|
|
156386
156487
|
|
|
156387
156488
|
// ../store-release/register-bundle.ts
|
|
156388
|
-
import { readFileSync as
|
|
156489
|
+
import { readFileSync as readFileSync83 } from "node:fs";
|
|
156389
156490
|
import { createPrivateKey as createPrivateKey4, sign as sign2 } from "node:crypto";
|
|
156390
156491
|
function b64url2(b2) {
|
|
156391
156492
|
return Buffer.from(b2).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
@@ -156403,7 +156504,7 @@ function bundleIdBody(identifier, name, platform = "IOS") {
|
|
|
156403
156504
|
async function registerBundleId(opts) {
|
|
156404
156505
|
const env = requireEnv(["ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_KEY_PATH"]);
|
|
156405
156506
|
assertCredentialOutsideRepo("ASC_KEY_PATH", env.ASC_KEY_PATH);
|
|
156406
|
-
const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID,
|
|
156507
|
+
const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID, readFileSync83(env.ASC_KEY_PATH, "utf8"), Math.floor(Date.now() / 1e3));
|
|
156407
156508
|
const res = await fetch(`${ASC_API}/v1/bundleIds`, {
|
|
156408
156509
|
method: "POST",
|
|
156409
156510
|
headers: { Authorization: `Bearer ${jwt}`, "Content-Type": "application/json" },
|
|
@@ -156433,7 +156534,7 @@ async function main() {
|
|
|
156433
156534
|
}
|
|
156434
156535
|
const ni2 = rest.indexOf("--name");
|
|
156435
156536
|
const name = ni2 >= 0 ? rest[ni2 + 1] : cfg.app ?? app;
|
|
156436
|
-
const yml =
|
|
156537
|
+
const yml = readFileSync83(iosProjectYml(app), "utf8");
|
|
156437
156538
|
for (const { id, label: label2 } of [{ id: identifier, label: name }, ...embeddedBundles(yml).map((b2) => ({
|
|
156438
156539
|
id: embeddedBundleId(identifier, b2),
|
|
156439
156540
|
label: `${name} ${embeddedAppIdLabel(b2)}`
|
|
@@ -157842,19 +157943,19 @@ __export(credential_profile_exports, {
|
|
|
157842
157943
|
profilePath: () => profilePath,
|
|
157843
157944
|
resolveStoreCredentials: () => resolveStoreCredentials
|
|
157844
157945
|
});
|
|
157845
|
-
import { existsSync as existsSync71, readFileSync as
|
|
157946
|
+
import { existsSync as existsSync71, readFileSync as readFileSync84 } from "node:fs";
|
|
157846
157947
|
import { homedir as homedir6 } from "node:os";
|
|
157847
|
-
import { join as
|
|
157948
|
+
import { join as join72 } from "node:path";
|
|
157848
157949
|
function credentialsDir(home = homedir6()) {
|
|
157849
|
-
return
|
|
157950
|
+
return join72(home, ".himalaya", "store-credentials");
|
|
157850
157951
|
}
|
|
157851
157952
|
function profilePath(name, home = homedir6()) {
|
|
157852
157953
|
if (!PROFILE_NAME.test(name)) {
|
|
157853
157954
|
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 ${
|
|
157955
|
+
`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
157956
|
);
|
|
157856
157957
|
}
|
|
157857
|
-
return
|
|
157958
|
+
return join72(credentialsDir(home), `${name}.json`);
|
|
157858
157959
|
}
|
|
157859
157960
|
function parseProfile(text9, label2) {
|
|
157860
157961
|
let doc;
|
|
@@ -157885,7 +157986,7 @@ function resolveStoreCredentials(opts) {
|
|
|
157885
157986
|
const { app, cfg } = opts;
|
|
157886
157987
|
const env = opts.env ?? process.env;
|
|
157887
157988
|
const home = opts.home ?? homedir6();
|
|
157888
|
-
const read = opts.readProfile ?? ((p2) =>
|
|
157989
|
+
const read = opts.readProfile ?? ((p2) => readFileSync84(p2, "utf8"));
|
|
157889
157990
|
const exists = opts.profileExists ?? existsSync71;
|
|
157890
157991
|
const ios = cfg.ios ?? {};
|
|
157891
157992
|
const flagName = opts.profileFlag?.trim();
|
|
@@ -157952,7 +158053,7 @@ var init_credential_profile = __esm({
|
|
|
157952
158053
|
|
|
157953
158054
|
// ../store-release/iap-credentials.ts
|
|
157954
158055
|
import { createHash as createHash37 } from "node:crypto";
|
|
157955
|
-
import { existsSync as existsSync72, readFileSync as
|
|
158056
|
+
import { existsSync as existsSync72, readFileSync as readFileSync85, realpathSync as realpathSync12 } from "node:fs";
|
|
157956
158057
|
import { homedir as homedir7 } from "node:os";
|
|
157957
158058
|
function accountFingerprint(keyId, issuerId) {
|
|
157958
158059
|
return `sha256:${createHash37("sha256").update(`${issuerId}:${keyId}`).digest("hex").slice(0, 16)}`;
|
|
@@ -157986,7 +158087,7 @@ function canonicalKeyPath(path2, profile, realpath) {
|
|
|
157986
158087
|
function resolveIapCredentials(options) {
|
|
157987
158088
|
const { target } = options;
|
|
157988
158089
|
const home = options.home ?? homedir7();
|
|
157989
|
-
const readFile3 = options.readFile ?? ((p2) =>
|
|
158090
|
+
const readFile3 = options.readFile ?? ((p2) => readFileSync85(p2, "utf8"));
|
|
157990
158091
|
const realpath = options.realpath ?? realpathSync12;
|
|
157991
158092
|
const profile = requireExplicitProfile(options.profileFlag, target);
|
|
157992
158093
|
const creds = resolveStoreCredentials({
|
|
@@ -158307,7 +158408,7 @@ __export(version_exports, {
|
|
|
158307
158408
|
stampTargetVersion: () => stampTargetVersion,
|
|
158308
158409
|
stampVersionKeys: () => stampVersionKeys
|
|
158309
158410
|
});
|
|
158310
|
-
import { readFileSync as
|
|
158411
|
+
import { readFileSync as readFileSync86, writeFileSync as writeFileSync29 } from "node:fs";
|
|
158311
158412
|
function readIosVersion(projectYml) {
|
|
158312
158413
|
const marketing = matchScalar(projectYml, "CFBundleShortVersionString");
|
|
158313
158414
|
const build3 = matchScalar(projectYml, "CFBundleVersion");
|
|
@@ -158454,8 +158555,8 @@ function setAndroidVersion(gradle, v2) {
|
|
|
158454
158555
|
function bumpVersion(app, opts) {
|
|
158455
158556
|
const iosPath = iosProjectYml(app);
|
|
158456
158557
|
const gradlePath = androidGradle(app);
|
|
158457
|
-
const iosYml =
|
|
158458
|
-
const gradle =
|
|
158558
|
+
const iosYml = readFileSync86(iosPath, "utf8");
|
|
158559
|
+
const gradle = readFileSync86(gradlePath, "utf8");
|
|
158459
158560
|
const current = readIosVersion(iosYml);
|
|
158460
158561
|
const next = {
|
|
158461
158562
|
marketing: opts.marketing ?? current.marketing,
|
|
@@ -158485,8 +158586,8 @@ var init_store_spec = __esm({
|
|
|
158485
158586
|
});
|
|
158486
158587
|
|
|
158487
158588
|
// src/iap-config-edit.ts
|
|
158488
|
-
import { existsSync as existsSync73, readFileSync as
|
|
158489
|
-
import { basename as basename18, join as
|
|
158589
|
+
import { existsSync as existsSync73, readFileSync as readFileSync87 } from "node:fs";
|
|
158590
|
+
import { basename as basename18, join as join73 } from "node:path";
|
|
158490
158591
|
import ts8 from "typescript";
|
|
158491
158592
|
function bindPurchasesAppInConfig(source, options) {
|
|
158492
158593
|
const fileName = options.fileName ?? "config.ts";
|
|
@@ -158565,16 +158666,16 @@ function capabilityFinding(app, fileName) {
|
|
|
158565
158666
|
}
|
|
158566
158667
|
function withStoreBundle(dir, options) {
|
|
158567
158668
|
if (options.storeBundleId) return options;
|
|
158568
|
-
const path2 =
|
|
158669
|
+
const path2 = join73(dir, "store", "store.config.yaml");
|
|
158569
158670
|
if (!existsSync73(path2)) return options;
|
|
158570
|
-
const storeBundleId = parseStoreConfig(
|
|
158671
|
+
const storeBundleId = parseStoreConfig(readFileSync87(path2, "utf8")).ios?.bundleId;
|
|
158571
158672
|
return storeBundleId ? { ...options, storeBundleId } : options;
|
|
158572
158673
|
}
|
|
158573
158674
|
function previewIapConfigEdit(dir, options) {
|
|
158574
158675
|
const path2 = configEntry(dir);
|
|
158575
158676
|
if (!path2) return void 0;
|
|
158576
158677
|
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(
|
|
158678
|
+
const { changed, applied, conflicts, instructions } = bindPurchasesAppInConfig(readFileSync87(path2, "utf8"), { ...withStoreBundle(dir, options), fileName: basename18(path2) });
|
|
158578
158679
|
return { path: path2, changed, applied, conflicts, instructions };
|
|
158579
158680
|
}
|
|
158580
158681
|
async function applyIapConfigEdit(dir, options, validate4) {
|
|
@@ -158583,7 +158684,7 @@ async function applyIapConfigEdit(dir, options, validate4) {
|
|
|
158583
158684
|
const fileName = basename18(path2);
|
|
158584
158685
|
const refuse7 = (why) => ({ path: path2, changed: false, applied: [], conflicts: [], instructions: [why] });
|
|
158585
158686
|
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 =
|
|
158687
|
+
const original = readFileSync87(path2, "utf8");
|
|
158587
158688
|
const edit = bindPurchasesAppInConfig(original, { ...withStoreBundle(dir, options), fileName });
|
|
158588
158689
|
const { applied, conflicts, instructions } = edit;
|
|
158589
158690
|
if (!edit.changed) return { path: path2, changed: false, applied, conflicts, instructions };
|
|
@@ -159056,9 +159157,9 @@ __export(store_iap_exports, {
|
|
|
159056
159157
|
runStoreIap: () => runStoreIap
|
|
159057
159158
|
});
|
|
159058
159159
|
import { randomUUID as randomUUID8 } from "node:crypto";
|
|
159059
|
-
import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync34, readFileSync as
|
|
159160
|
+
import { appendFileSync as appendFileSync2, mkdirSync as mkdirSync34, readFileSync as readFileSync88, realpathSync as realpathSync13, rmSync as rmSync18, writeFileSync as writeFileSync30 } from "node:fs";
|
|
159060
159161
|
import { homedir as homedir8, hostname } from "node:os";
|
|
159061
|
-
import { join as
|
|
159162
|
+
import { join as join74 } from "node:path";
|
|
159062
159163
|
function scrubDeep(value, scrub) {
|
|
159063
159164
|
if (typeof value === "string") return scrub(value);
|
|
159064
159165
|
if (Array.isArray(value)) return value.map((v2) => scrubDeep(v2, scrub));
|
|
@@ -159514,14 +159615,14 @@ function fileJournal(path2) {
|
|
|
159514
159615
|
}
|
|
159515
159616
|
function readLockSummary(path2) {
|
|
159516
159617
|
try {
|
|
159517
|
-
const { pid, host, at: at2 } = JSON.parse(
|
|
159618
|
+
const { pid, host, at: at2 } = JSON.parse(readFileSync88(path2, "utf8"));
|
|
159518
159619
|
return `pid ${pid} on ${host} since ${at2}`;
|
|
159519
159620
|
} catch {
|
|
159520
159621
|
return "unreadable lock";
|
|
159521
159622
|
}
|
|
159522
159623
|
}
|
|
159523
159624
|
function acquireApplyLock(dir, appleAppId) {
|
|
159524
|
-
const path2 =
|
|
159625
|
+
const path2 = join74(dir, "apply.lock");
|
|
159525
159626
|
const stamp = JSON.stringify({ pid: process.pid, host: hostname(), at: (/* @__PURE__ */ new Date()).toISOString(), token: randomUUID8() });
|
|
159526
159627
|
try {
|
|
159527
159628
|
writeFileSync30(path2, stamp, { flag: "wx", mode: 384 });
|
|
@@ -159534,7 +159635,7 @@ function acquireApplyLock(dir, appleAppId) {
|
|
|
159534
159635
|
return () => {
|
|
159535
159636
|
let current = "";
|
|
159536
159637
|
try {
|
|
159537
|
-
current =
|
|
159638
|
+
current = readFileSync88(path2, "utf8");
|
|
159538
159639
|
} catch {
|
|
159539
159640
|
return;
|
|
159540
159641
|
}
|
|
@@ -159542,7 +159643,7 @@ function acquireApplyLock(dir, appleAppId) {
|
|
|
159542
159643
|
};
|
|
159543
159644
|
}
|
|
159544
159645
|
function stateDir(appleAppId) {
|
|
159545
|
-
const dir =
|
|
159646
|
+
const dir = join74(homedir8(), ".himalaya", "store-iap", appleAppId);
|
|
159546
159647
|
mkdirSync34(dir, { recursive: true, mode: 448 });
|
|
159547
159648
|
return dir;
|
|
159548
159649
|
}
|
|
@@ -159558,11 +159659,11 @@ async function confirmOnTerminal(question) {
|
|
|
159558
159659
|
}
|
|
159559
159660
|
function defaultStoreIapDeps() {
|
|
159560
159661
|
return {
|
|
159561
|
-
readFile: (path2) =>
|
|
159662
|
+
readFile: (path2) => readFileSync88(path2, "utf8"),
|
|
159562
159663
|
writeFileAtomic,
|
|
159563
159664
|
resolveCredentials: ({ profileFlag, target }) => resolveIapCredentials({ profileFlag, target }),
|
|
159564
159665
|
createApi: (key2) => createIapApi(createAscClient({ key: key2 })),
|
|
159565
|
-
openJournal: (appleAppId) => fileJournal(
|
|
159666
|
+
openJournal: (appleAppId) => fileJournal(join74(stateDir(appleAppId), "journal.jsonl")),
|
|
159566
159667
|
acquireLock: (appleAppId) => acquireApplyLock(stateDir(appleAppId), appleAppId),
|
|
159567
159668
|
canPrompt: () => process.stdin.isTTY === true,
|
|
159568
159669
|
wixTransport: (siteId) => ownerTransport(siteId),
|
|
@@ -160040,9 +160141,9 @@ __export(preflight_app_exports, {
|
|
|
160040
160141
|
preflightApp: () => preflightApp,
|
|
160041
160142
|
profileAccount: () => profileAccount
|
|
160042
160143
|
});
|
|
160043
|
-
import { readFileSync as
|
|
160144
|
+
import { readFileSync as readFileSync89, existsSync as existsSync74, readdirSync as readdirSync33, statSync as statSync19 } from "node:fs";
|
|
160044
160145
|
import { createHash as createHash39 } from "node:crypto";
|
|
160045
|
-
import { join as
|
|
160146
|
+
import { join as join75 } from "node:path";
|
|
160046
160147
|
function analyze(projectYml, storeConfig, icon, account) {
|
|
160047
160148
|
const f2 = [];
|
|
160048
160149
|
const has = (re2, s2) => re2.test(s2);
|
|
@@ -160106,13 +160207,13 @@ function profileAccount(app, storeConfig, opts = {}) {
|
|
|
160106
160207
|
}
|
|
160107
160208
|
}
|
|
160108
160209
|
async function preflightApp(app, opts = {}) {
|
|
160109
|
-
const projectYml = existsSync74(iosProjectYml(app)) ?
|
|
160110
|
-
const storeConfig = existsSync74(storeConfigPath(app)) ?
|
|
160210
|
+
const projectYml = existsSync74(iosProjectYml(app)) ? readFileSync89(iosProjectYml(app), "utf8") : "";
|
|
160211
|
+
const storeConfig = existsSync74(storeConfigPath(app)) ? readFileSync89(storeConfigPath(app), "utf8") : "";
|
|
160111
160212
|
if (!storeConfig) return [{ level: "error", message: `no apps/${app}/store/store.config.yaml \u2014 run /setup-store-signing first.` }];
|
|
160112
160213
|
const findings = analyze(
|
|
160113
160214
|
projectYml,
|
|
160114
160215
|
storeConfig,
|
|
160115
|
-
await appIconState(
|
|
160216
|
+
await appIconState(join75(appDir(app), "ios")),
|
|
160116
160217
|
profileAccount(app, storeConfig, opts)
|
|
160117
160218
|
);
|
|
160118
160219
|
findings.push(...analyzeListing(metadataFilesPresent(app), listScreenshots(app)));
|
|
@@ -160141,16 +160242,16 @@ function analyzeSubmissionRecord(appLevel, review, opts) {
|
|
|
160141
160242
|
return f2;
|
|
160142
160243
|
}
|
|
160143
160244
|
function appLevelMetadataFiles(app, locale = "en-US") {
|
|
160144
|
-
const root =
|
|
160245
|
+
const root = join75(storeDir(app), "metadata");
|
|
160145
160246
|
const out2 = /* @__PURE__ */ new Set();
|
|
160146
160247
|
if (existsSync74(root)) {
|
|
160147
160248
|
for (const n2 of readdirSync33(root)) if (n2.endsWith(".txt")) out2.add(n2);
|
|
160148
160249
|
}
|
|
160149
|
-
if (existsSync74(
|
|
160250
|
+
if (existsSync74(join75(root, locale, "privacy_url.txt"))) out2.add("privacy_url.txt");
|
|
160150
160251
|
return out2;
|
|
160151
160252
|
}
|
|
160152
160253
|
function reviewInfoFiles(app) {
|
|
160153
|
-
const dir =
|
|
160254
|
+
const dir = join75(storeDir(app), "review_information");
|
|
160154
160255
|
if (!existsSync74(dir)) return /* @__PURE__ */ new Set();
|
|
160155
160256
|
return new Set(readdirSync33(dir).filter((n2) => n2.endsWith(".txt")));
|
|
160156
160257
|
}
|
|
@@ -160261,12 +160362,12 @@ function analyzePlayListing(assets) {
|
|
|
160261
160362
|
return f2;
|
|
160262
160363
|
}
|
|
160263
160364
|
function playListingAssets(app, locale = "en-US") {
|
|
160264
|
-
const dir =
|
|
160365
|
+
const dir = join75(storeDir(app), "play", locale, "images");
|
|
160265
160366
|
const read = (names) => {
|
|
160266
160367
|
for (const name of names) {
|
|
160267
|
-
const p2 =
|
|
160368
|
+
const p2 = join75(dir, name);
|
|
160268
160369
|
try {
|
|
160269
|
-
if (statSync19(p2).isFile()) return { name, bytes:
|
|
160370
|
+
if (statSync19(p2).isFile()) return { name, bytes: readFileSync89(p2) };
|
|
160270
160371
|
} catch {
|
|
160271
160372
|
}
|
|
160272
160373
|
}
|
|
@@ -160297,26 +160398,26 @@ function analyzeListing(metaFiles, shots) {
|
|
|
160297
160398
|
return f2;
|
|
160298
160399
|
}
|
|
160299
160400
|
function metadataFilesPresent(app, locale = "en-US") {
|
|
160300
|
-
const dir =
|
|
160401
|
+
const dir = join75(storeDir(app), "metadata", locale);
|
|
160301
160402
|
if (!existsSync74(dir)) return /* @__PURE__ */ new Set();
|
|
160302
160403
|
return new Set(readdirSync33(dir).filter((n2) => n2.endsWith(".txt")));
|
|
160303
160404
|
}
|
|
160304
160405
|
function listScreenshots(app, locale = "en-US") {
|
|
160305
160406
|
const out2 = [];
|
|
160306
|
-
const flat =
|
|
160407
|
+
const flat = join75(storeDir(app), "screenshots", locale);
|
|
160307
160408
|
if (existsSync74(flat)) {
|
|
160308
160409
|
for (const png of readdirSync33(flat).filter((n2) => n2.endsWith(".png"))) {
|
|
160309
|
-
const sz = pngSize(
|
|
160410
|
+
const sz = pngSize(readFileSync89(join75(flat, png)));
|
|
160310
160411
|
if (sz) out2.push({ name: png, w: sz.w, h: sz.h });
|
|
160311
160412
|
}
|
|
160312
160413
|
}
|
|
160313
|
-
const legacy =
|
|
160414
|
+
const legacy = join75(storeDir(app), "metadata", locale, "screenshots");
|
|
160314
160415
|
if (existsSync74(legacy)) {
|
|
160315
160416
|
for (const deviceDir of readdirSync33(legacy)) {
|
|
160316
|
-
const d2 =
|
|
160417
|
+
const d2 = join75(legacy, deviceDir);
|
|
160317
160418
|
if (!statSync19(d2).isDirectory()) continue;
|
|
160318
160419
|
for (const png of readdirSync33(d2).filter((n2) => n2.endsWith(".png"))) {
|
|
160319
|
-
const sz = pngSize(
|
|
160420
|
+
const sz = pngSize(readFileSync89(join75(d2, png)));
|
|
160320
160421
|
if (sz) out2.push({ name: `${deviceDir}/${png}`, w: sz.w, h: sz.h });
|
|
160321
160422
|
}
|
|
160322
160423
|
}
|
|
@@ -160324,13 +160425,13 @@ function listScreenshots(app, locale = "en-US") {
|
|
|
160324
160425
|
return out2;
|
|
160325
160426
|
}
|
|
160326
160427
|
function placeholderHashes2() {
|
|
160327
|
-
const templateIos =
|
|
160428
|
+
const templateIos = join75(appDir("_template"), "ios");
|
|
160328
160429
|
if (!existsSync74(templateIos)) return [LEGACY_PLACEHOLDER_SHA2562];
|
|
160329
160430
|
for (const target of readdirSync33(templateIos)) {
|
|
160330
|
-
const p2 =
|
|
160431
|
+
const p2 = join75(templateIos, target, "Assets.xcassets", "AppIcon.appiconset", "icon_1024.png");
|
|
160331
160432
|
try {
|
|
160332
160433
|
if (!statSync19(p2).isFile()) continue;
|
|
160333
|
-
return [LEGACY_PLACEHOLDER_SHA2562, createHash39("sha256").update(
|
|
160434
|
+
return [LEGACY_PLACEHOLDER_SHA2562, createHash39("sha256").update(readFileSync89(p2)).digest("hex")];
|
|
160334
160435
|
} catch {
|
|
160335
160436
|
}
|
|
160336
160437
|
}
|
|
@@ -160363,10 +160464,10 @@ async function pixelIssues(bytes2) {
|
|
|
160363
160464
|
async function appIconState(iosDir) {
|
|
160364
160465
|
if (!existsSync74(iosDir)) return { exists: false, isPlaceholder: false, storeIssues: [] };
|
|
160365
160466
|
for (const target of readdirSync33(iosDir)) {
|
|
160366
|
-
const p2 =
|
|
160467
|
+
const p2 = join75(iosDir, target, "Assets.xcassets", "AppIcon.appiconset", "icon_1024.png");
|
|
160367
160468
|
try {
|
|
160368
160469
|
if (!statSync19(p2).isFile()) continue;
|
|
160369
|
-
const bytes2 =
|
|
160470
|
+
const bytes2 = readFileSync89(p2);
|
|
160370
160471
|
const hash2 = createHash39("sha256").update(bytes2).digest("hex");
|
|
160371
160472
|
const pixels = await pixelIssues(bytes2);
|
|
160372
160473
|
return {
|
|
@@ -160433,7 +160534,7 @@ __export(asc_status_exports, {
|
|
|
160433
160534
|
ascStatus: () => ascStatus,
|
|
160434
160535
|
buildVerdict: () => buildVerdict
|
|
160435
160536
|
});
|
|
160436
|
-
import { readFileSync as
|
|
160537
|
+
import { readFileSync as readFileSync90 } from "node:fs";
|
|
160437
160538
|
function buildVerdict(builds) {
|
|
160438
160539
|
if (!builds.length) {
|
|
160439
160540
|
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 +160548,7 @@ function buildVerdict(builds) {
|
|
|
160447
160548
|
function client(creds) {
|
|
160448
160549
|
const env = creds ?? requireEnv(["ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_KEY_PATH"]);
|
|
160449
160550
|
assertCredentialOutsideRepo("ASC_KEY_PATH", env.ASC_KEY_PATH);
|
|
160450
|
-
const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID,
|
|
160551
|
+
const jwt = ascJwt(env.ASC_KEY_ID, env.ASC_ISSUER_ID, readFileSync90(env.ASC_KEY_PATH, "utf8"), Math.floor(Date.now() / 1e3));
|
|
160451
160552
|
return async (path2) => {
|
|
160452
160553
|
const r2 = await fetch(`${ASC}${path2}`, { headers: { Authorization: `Bearer ${jwt}` } });
|
|
160453
160554
|
return { status: r2.status, json: await r2.json().catch(() => ({})) };
|
|
@@ -160607,7 +160708,7 @@ __export(secrets_exports, {
|
|
|
160607
160708
|
runRemoteSecretsCommand: () => runRemoteSecretsCommand,
|
|
160608
160709
|
runSecretsCommand: () => runSecretsCommand
|
|
160609
160710
|
});
|
|
160610
|
-
import { readFileSync as
|
|
160711
|
+
import { readFileSync as readFileSync91 } from "node:fs";
|
|
160611
160712
|
function environment(value) {
|
|
160612
160713
|
if (value === "preview" || value === "production") return value;
|
|
160613
160714
|
throw new Error("--environment must be preview or production");
|
|
@@ -160638,7 +160739,7 @@ async function runSecretsCommand(operation, flags, io2, options = {}) {
|
|
|
160638
160739
|
io2.log(JSON.stringify(await vault.list({ app, environment: env })));
|
|
160639
160740
|
return 0;
|
|
160640
160741
|
}
|
|
160641
|
-
const value = options.readValue ? options.readValue() :
|
|
160742
|
+
const value = options.readValue ? options.readValue() : readFileSync91(0, "utf8").replace(/\r?\n$/, "");
|
|
160642
160743
|
if (operation === "set") await vault.set({ app, environment: env, name, value });
|
|
160643
160744
|
else if (operation === "rotate") await vault.rotate({ app, environment: env, name, value });
|
|
160644
160745
|
else throw new Error(`unknown secrets operation ${operation}`);
|
|
@@ -160667,7 +160768,7 @@ async function runRemoteSecretsCommand(operation, flags, io2, options) {
|
|
|
160667
160768
|
}
|
|
160668
160769
|
let body;
|
|
160669
160770
|
if (operation !== "list") {
|
|
160670
|
-
const value = options.readValue ? options.readValue() :
|
|
160771
|
+
const value = options.readValue ? options.readValue() : readFileSync91(0, "utf8").replace(/\r?\n$/, "");
|
|
160671
160772
|
body = JSON.stringify({ value });
|
|
160672
160773
|
}
|
|
160673
160774
|
const response = await (options.fetchImpl ?? fetch)(url, { method: operation === "list" ? "GET" : operation === "set" ? "PUT" : "POST", headers: headers2, body });
|
|
@@ -161165,15 +161266,15 @@ __export(notify_exports, {
|
|
|
161165
161266
|
runNotify: () => runNotify,
|
|
161166
161267
|
saveAdminSession: () => saveAdminSession
|
|
161167
161268
|
});
|
|
161168
|
-
import { chmodSync as chmodSync3, mkdirSync as mkdirSync35, readFileSync as
|
|
161269
|
+
import { chmodSync as chmodSync3, mkdirSync as mkdirSync35, readFileSync as readFileSync92, writeFileSync as writeFileSync31 } from "node:fs";
|
|
161169
161270
|
import { homedir as homedir9 } from "node:os";
|
|
161170
|
-
import { dirname as dirname39, join as
|
|
161271
|
+
import { dirname as dirname39, join as join76 } from "node:path";
|
|
161171
161272
|
function defaultSessionsPath() {
|
|
161172
|
-
return process.env.HIMI_ADMIN_SESSIONS_FILE ??
|
|
161273
|
+
return process.env.HIMI_ADMIN_SESSIONS_FILE ?? join76(homedir9(), ".himalaya", "admin-sessions.json");
|
|
161173
161274
|
}
|
|
161174
161275
|
function loadSessionsFile(path2 = defaultSessionsPath()) {
|
|
161175
161276
|
try {
|
|
161176
|
-
return JSON.parse(
|
|
161277
|
+
return JSON.parse(readFileSync92(path2, "utf8"));
|
|
161177
161278
|
} catch {
|
|
161178
161279
|
return {};
|
|
161179
161280
|
}
|
|
@@ -161550,20 +161651,20 @@ __export(base44_auth_exports, {
|
|
|
161550
161651
|
usableBase44Auth: () => usableBase44Auth,
|
|
161551
161652
|
writeBase44Session: () => writeBase44Session
|
|
161552
161653
|
});
|
|
161553
|
-
import { chmodSync as chmodSync4, existsSync as existsSync75, mkdirSync as mkdirSync36, readFileSync as
|
|
161654
|
+
import { chmodSync as chmodSync4, existsSync as existsSync75, mkdirSync as mkdirSync36, readFileSync as readFileSync93, rmSync as rmSync19, writeFileSync as writeFileSync32 } from "node:fs";
|
|
161554
161655
|
import { homedir as homedir10 } from "node:os";
|
|
161555
|
-
import { dirname as dirname40, join as
|
|
161656
|
+
import { dirname as dirname40, join as join77 } from "node:path";
|
|
161556
161657
|
function base44ApiBase(env = process.env) {
|
|
161557
161658
|
return (env.BASE44_API_URL?.trim() || "https://app.base44.com").replace(/\/+$/, "");
|
|
161558
161659
|
}
|
|
161559
161660
|
function base44SessionPath(home = homedir10()) {
|
|
161560
|
-
return
|
|
161661
|
+
return join77(home, ".himi", "base44", "session.json");
|
|
161561
161662
|
}
|
|
161562
161663
|
function readBase44Session(home) {
|
|
161563
161664
|
const p2 = base44SessionPath(home);
|
|
161564
161665
|
if (!existsSync75(p2)) return void 0;
|
|
161565
161666
|
try {
|
|
161566
|
-
const s2 = JSON.parse(
|
|
161667
|
+
const s2 = JSON.parse(readFileSync93(p2, "utf8"));
|
|
161567
161668
|
return typeof s2.accessToken === "string" && s2.accessToken ? s2 : void 0;
|
|
161568
161669
|
} catch {
|
|
161569
161670
|
return void 0;
|
|
@@ -161674,9 +161775,9 @@ async function base44DeviceLogin(opts) {
|
|
|
161674
161775
|
throw new Error("the Base44 sign-in code expired before it was approved \u2014 run `himi base44 login` again");
|
|
161675
161776
|
}
|
|
161676
161777
|
function importBase44CliSession(home = homedir10(), env = process.env) {
|
|
161677
|
-
const src =
|
|
161778
|
+
const src = join77(home, ".base44", "auth", "auth.json");
|
|
161678
161779
|
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(
|
|
161780
|
+
const a2 = JSON.parse(readFileSync93(src, "utf8"));
|
|
161680
161781
|
if (typeof a2.accessToken !== "string" || !a2.accessToken) throw new Error(`${src} holds no access token`);
|
|
161681
161782
|
const session = {
|
|
161682
161783
|
accessToken: a2.accessToken,
|
|
@@ -163811,7 +163912,7 @@ var init_brand_font = __esm({
|
|
|
163811
163912
|
|
|
163812
163913
|
// src/site-analyze/write-artifacts.ts
|
|
163813
163914
|
import { mkdirSync as mkdirSync37, writeFileSync as writeFileSync33 } from "node:fs";
|
|
163814
|
-
import { join as
|
|
163915
|
+
import { join as join78 } from "node:path";
|
|
163815
163916
|
function attachVeloSources(book, sources, put) {
|
|
163816
163917
|
const byPath = new Map((sources ?? []).map((s2) => [s2.path, s2.text]));
|
|
163817
163918
|
for (const f2 of book.velo.files) {
|
|
@@ -163966,12 +164067,12 @@ async function downloadMedia(book, fetchImpl, put) {
|
|
|
163966
164067
|
}
|
|
163967
164068
|
async function writeBusinessBook(result, opts) {
|
|
163968
164069
|
const out2 = opts.outDir;
|
|
163969
|
-
mkdirSync37(
|
|
163970
|
-
mkdirSync37(
|
|
164070
|
+
mkdirSync37(join78(out2, "evidence/pages"), { recursive: true });
|
|
164071
|
+
mkdirSync37(join78(out2, "media/catalog"), { recursive: true });
|
|
163971
164072
|
const files = [];
|
|
163972
164073
|
const put = (rel, body) => {
|
|
163973
|
-
const p2 =
|
|
163974
|
-
mkdirSync37(
|
|
164074
|
+
const p2 = join78(out2, rel);
|
|
164075
|
+
mkdirSync37(join78(p2, ".."), { recursive: true });
|
|
163975
164076
|
writeFileSync33(p2, body);
|
|
163976
164077
|
files.push(rel);
|
|
163977
164078
|
};
|
|
@@ -164875,11 +164976,11 @@ var init_analyze = __esm({
|
|
|
164875
164976
|
});
|
|
164876
164977
|
|
|
164877
164978
|
// src/base44-analyze/write-artifacts.ts
|
|
164878
|
-
import { existsSync as existsSync76, mkdirSync as mkdirSync38, readFileSync as
|
|
164879
|
-
import { dirname as dirname41, join as
|
|
164979
|
+
import { existsSync as existsSync76, mkdirSync as mkdirSync38, readFileSync as readFileSync94, rmSync as rmSync20, writeFileSync as writeFileSync34 } from "node:fs";
|
|
164980
|
+
import { dirname as dirname41, join as join79, resolve as resolve56, sep as sep19 } from "node:path";
|
|
164880
164981
|
function isBookFolder(dir) {
|
|
164881
164982
|
try {
|
|
164882
|
-
return JSON.parse(
|
|
164983
|
+
return JSON.parse(readFileSync94(join79(dir, "book.json"), "utf8")).kind === "base44-app-book";
|
|
164883
164984
|
} catch {
|
|
164884
164985
|
return false;
|
|
164885
164986
|
}
|
|
@@ -164966,24 +165067,24 @@ function writeBase44Book(result, outDir, opts = {}) {
|
|
|
164966
165067
|
const md = renderBookMd(book);
|
|
164967
165068
|
assertNoSecrets(json6);
|
|
164968
165069
|
assertNoSecrets(md);
|
|
164969
|
-
const owned = ["book.json", "BOOK.md", "source", "screenshots"].filter((n2) => existsSync76(
|
|
165070
|
+
const owned = ["book.json", "BOOK.md", "source", "screenshots"].filter((n2) => existsSync76(join79(out2, n2)));
|
|
164970
165071
|
if (owned.length) {
|
|
164971
165072
|
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(
|
|
165073
|
+
for (const d2 of ["source", "screenshots"]) rmSync20(join79(out2, d2), { recursive: true, force: true });
|
|
164973
165074
|
}
|
|
164974
165075
|
mkdirSync38(out2, { recursive: true });
|
|
164975
|
-
writeFileSync34(
|
|
164976
|
-
writeFileSync34(
|
|
165076
|
+
writeFileSync34(join79(out2, "book.json"), json6);
|
|
165077
|
+
writeFileSync34(join79(out2, "BOOK.md"), md);
|
|
164977
165078
|
files.push("book.json", "BOOK.md");
|
|
164978
165079
|
for (const s2 of shots) {
|
|
164979
|
-
mkdirSync38(
|
|
164980
|
-
writeFileSync34(
|
|
165080
|
+
mkdirSync38(join79(out2, "screenshots"), { recursive: true });
|
|
165081
|
+
writeFileSync34(join79(out2, "screenshots", s2.filename), s2.bytes);
|
|
164981
165082
|
files.push(`screenshots/${s2.filename}`);
|
|
164982
165083
|
}
|
|
164983
|
-
const sourceRoot =
|
|
165084
|
+
const sourceRoot = join79(out2, "source");
|
|
164984
165085
|
for (const f2 of result.sourceFiles) {
|
|
164985
165086
|
if (!safeRel(f2.path)) continue;
|
|
164986
|
-
const dest =
|
|
165087
|
+
const dest = join79(sourceRoot, ...f2.path.split("/"));
|
|
164987
165088
|
if (!dest.startsWith(sourceRoot + sep19)) continue;
|
|
164988
165089
|
mkdirSync38(dirname41(dest), { recursive: true });
|
|
164989
165090
|
writeFileSync34(dest, f2.bytes);
|
|
@@ -168529,7 +168630,7 @@ __export(cli_exports, {
|
|
|
168529
168630
|
import { execFile } from "node:child_process";
|
|
168530
168631
|
import { mkdirSync as mkdirSync39, mkdtempSync as mkdtempSync4, rmSync as rmSync21, writeFileSync as writeFileSync35 } from "node:fs";
|
|
168531
168632
|
import { tmpdir as tmpdir5 } from "node:os";
|
|
168532
|
-
import { join as
|
|
168633
|
+
import { join as join80, resolve as resolve57 } from "node:path";
|
|
168533
168634
|
import { promisify } from "node:util";
|
|
168534
168635
|
function projectDownloader(apiFetch, apiBase, token, extract = systemTar) {
|
|
168535
168636
|
return async (appId2) => {
|
|
@@ -168542,11 +168643,11 @@ function projectDownloader(apiFetch, apiBase, token, extract = systemTar) {
|
|
|
168542
168643
|
}
|
|
168543
168644
|
const bytes2 = await readCapped(res, MAX_TARBALL_BYTES);
|
|
168544
168645
|
if (!bytes2) throw new Error(`project download is over the ${MAX_TARBALL_BYTES}-byte cap`);
|
|
168545
|
-
const root = mkdtempSync4(
|
|
168646
|
+
const root = mkdtempSync4(join80(tmpdir5(), "himi-base44-"));
|
|
168546
168647
|
const cleanup = () => rmSync21(root, { recursive: true, force: true });
|
|
168547
168648
|
try {
|
|
168548
|
-
const archive =
|
|
168549
|
-
const dir =
|
|
168649
|
+
const archive = join80(root, "project.tar");
|
|
168650
|
+
const dir = join80(root, "project");
|
|
168550
168651
|
writeFileSync35(archive, bytes2);
|
|
168551
168652
|
mkdirSync39(dir);
|
|
168552
168653
|
await extract(archive, dir);
|
|
@@ -169841,8 +169942,8 @@ var init_customer_build = __esm({
|
|
|
169841
169942
|
});
|
|
169842
169943
|
|
|
169843
169944
|
// src/site-analyze/apply.ts
|
|
169844
|
-
import { existsSync as existsSync77, readFileSync as
|
|
169845
|
-
import { dirname as dirname42, isAbsolute as isAbsolute8, join as
|
|
169945
|
+
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";
|
|
169946
|
+
import { dirname as dirname42, isAbsolute as isAbsolute8, join as join81, resolve as resolve58, sep as sep20 } from "node:path";
|
|
169846
169947
|
import { spawnSync as spawnSync4 } from "node:child_process";
|
|
169847
169948
|
function unpairedRedirectNote(overlay) {
|
|
169848
169949
|
if (!overlay.wix?.clientId || overlay.wix.redirectUri) return void 0;
|
|
@@ -169857,7 +169958,7 @@ function committedShellProvisioning(path2) {
|
|
|
169857
169958
|
function findRepoRoot(cwd) {
|
|
169858
169959
|
let dir = cwd;
|
|
169859
169960
|
for (let i2 = 0; i2 < 8; i2++) {
|
|
169860
|
-
if (SHELL_NAMES2.some((name) => existsSync77(
|
|
169961
|
+
if (SHELL_NAMES2.some((name) => existsSync77(join81(dir, shellAppDir(name), "package.json")))) return dir;
|
|
169861
169962
|
const next = dirname42(dir);
|
|
169862
169963
|
if (next === dir) break;
|
|
169863
169964
|
dir = next;
|
|
@@ -169960,11 +170061,11 @@ function sameKnownSite(previous, next) {
|
|
|
169960
170061
|
}
|
|
169961
170062
|
function buildMergedContract(options) {
|
|
169962
170063
|
const { appDir: appDir3, packageDir, overlay } = options;
|
|
169963
|
-
const committedPath =
|
|
170064
|
+
const committedPath = join81(appDir3, "provisioning.json");
|
|
169964
170065
|
if (!existsSync77(committedPath)) {
|
|
169965
170066
|
throw new Error(`shell has no committed provisioning.json at ${committedPath} to build a contract from`);
|
|
169966
170067
|
}
|
|
169967
|
-
const committed = JSON.parse(
|
|
170068
|
+
const committed = JSON.parse(readFileSync95(committedPath, "utf8"));
|
|
169968
170069
|
const merged = mergeCustomerOwned(committed, overlay);
|
|
169969
170070
|
const overlayFontFamily = (overlay.branding ?? {}).fontFamily;
|
|
169970
170071
|
const branding = merged.branding ?? {};
|
|
@@ -169976,7 +170077,7 @@ function buildMergedContract(options) {
|
|
|
169976
170077
|
};
|
|
169977
170078
|
const stage = (fromRel, toRel) => {
|
|
169978
170079
|
const from = contained(packageDir, fromRel);
|
|
169979
|
-
const to2 = contained(
|
|
170080
|
+
const to2 = contained(join81(appDir3, STAGED), toRel.slice(STAGED.length + 1));
|
|
169980
170081
|
if (!from || !to2 || !existsSync77(from)) return void 0;
|
|
169981
170082
|
let real;
|
|
169982
170083
|
let realRoot;
|
|
@@ -169999,11 +170100,11 @@ function buildMergedContract(options) {
|
|
|
169999
170100
|
};
|
|
170000
170101
|
const icon = stage("media/icon.png", `${STAGED}/icon.png`);
|
|
170001
170102
|
if (icon) branding.appIconPath = icon;
|
|
170002
|
-
const facesPath =
|
|
170103
|
+
const facesPath = join81(packageDir, "media/fonts/faces.json");
|
|
170003
170104
|
if (existsSync77(facesPath)) {
|
|
170004
170105
|
let faces = [];
|
|
170005
170106
|
try {
|
|
170006
|
-
const parsed = JSON.parse(
|
|
170107
|
+
const parsed = JSON.parse(readFileSync95(facesPath, "utf8"));
|
|
170007
170108
|
faces = Array.isArray(parsed) ? parsed : [];
|
|
170008
170109
|
} catch {
|
|
170009
170110
|
faces = [];
|
|
@@ -170024,9 +170125,9 @@ function buildMergedContract(options) {
|
|
|
170024
170125
|
merged.branding = branding;
|
|
170025
170126
|
const body = `${JSON.stringify(merged, null, 2)}
|
|
170026
170127
|
`;
|
|
170027
|
-
const path2 =
|
|
170128
|
+
const path2 = join81(packageDir, "provisioning.contract.json");
|
|
170028
170129
|
writeFileSync36(path2, body);
|
|
170029
|
-
const localPath2 =
|
|
170130
|
+
const localPath2 = join81(appDir3, LOCAL_CONTRACT_REL);
|
|
170030
170131
|
mkdirSync40(dirname42(localPath2), { recursive: true });
|
|
170031
170132
|
writeFileSync36(localPath2, body);
|
|
170032
170133
|
staged.push(localPath2);
|
|
@@ -170061,10 +170162,10 @@ function catalogTypography(overlay, template) {
|
|
|
170061
170162
|
function staticFaqFor(overlay, overlayPath) {
|
|
170062
170163
|
const own4 = overlay.faq;
|
|
170063
170164
|
if (own4 !== void 0) return deriveStaticFaq(own4);
|
|
170064
|
-
const bookPath =
|
|
170165
|
+
const bookPath = join81(dirname42(resolve58(overlayPath)), "book.json");
|
|
170065
170166
|
if (!existsSync77(bookPath)) return void 0;
|
|
170066
170167
|
try {
|
|
170067
|
-
const book = JSON.parse(
|
|
170168
|
+
const book = JSON.parse(readFileSync95(bookPath, "utf8"));
|
|
170068
170169
|
const copy = book?.copy;
|
|
170069
170170
|
if (!copy || typeof copy !== "object" || copy.unavailable) return void 0;
|
|
170070
170171
|
const pairs = deriveStaticFaq(copy.faq);
|
|
@@ -170078,10 +170179,10 @@ function staticGalleriesFor(overlay, overlayPath) {
|
|
|
170078
170179
|
if (overlay.galleries !== void 0) return deriveStaticGalleries(
|
|
170079
170180
|
overlay.galleries.map((gallery) => ({ role: "gallery", title: gallery.title, galleryImageUrls: gallery.photos }))
|
|
170080
170181
|
);
|
|
170081
|
-
const bookPath =
|
|
170182
|
+
const bookPath = join81(dirname42(resolve58(overlayPath)), "book.json");
|
|
170082
170183
|
if (!existsSync77(bookPath)) return void 0;
|
|
170083
170184
|
try {
|
|
170084
|
-
const book = JSON.parse(
|
|
170185
|
+
const book = JSON.parse(readFileSync95(bookPath, "utf8"));
|
|
170085
170186
|
if (!book.look || book.look.unavailable || !Array.isArray(book.look.pages)) return void 0;
|
|
170086
170187
|
const galleries = deriveStaticGalleries(book.look.pages);
|
|
170087
170188
|
return galleries.length || book.look.complete === true ? galleries : void 0;
|
|
@@ -170093,8 +170194,8 @@ async function applyOverlays(input) {
|
|
|
170093
170194
|
const cwd = resolve58(input.cwd);
|
|
170094
170195
|
const shell = input.shell ?? DEFAULT_BRANDABLE_SHELL;
|
|
170095
170196
|
assertKnownShell(shell);
|
|
170096
|
-
const overlay = JSON.parse(
|
|
170097
|
-
const tokens2 = JSON.parse(
|
|
170197
|
+
const overlay = JSON.parse(readFileSync95(input.overlayPath, "utf8"));
|
|
170198
|
+
const tokens2 = JSON.parse(readFileSync95(input.tokensPath, "utf8"));
|
|
170098
170199
|
const faq = staticFaqFor(overlay, input.overlayPath);
|
|
170099
170200
|
if (faq !== void 0) overlay.faq = faq;
|
|
170100
170201
|
const galleries = staticGalleriesFor(overlay, input.overlayPath);
|
|
@@ -170111,9 +170212,9 @@ async function applyOverlays(input) {
|
|
|
170111
170212
|
`shell "${shell}" cannot bake a customer brand \u2014 it ships no prepare:customer script`
|
|
170112
170213
|
);
|
|
170113
170214
|
}
|
|
170114
|
-
const appDir3 =
|
|
170115
|
-
const committedPath =
|
|
170116
|
-
const committedSite = existsSync77(committedPath) ? JSON.parse(
|
|
170215
|
+
const appDir3 = join81(repoRoot2, shellAppDir(shell));
|
|
170216
|
+
const committedPath = join81(appDir3, "provisioning.json");
|
|
170217
|
+
const committedSite = existsSync77(committedPath) ? JSON.parse(readFileSync95(committedPath, "utf8")).site : void 0;
|
|
170117
170218
|
if (committedSite !== void 0 && overlay.site === void 0) {
|
|
170118
170219
|
throw new Error(
|
|
170119
170220
|
`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 +170241,9 @@ async function applyOverlays(input) {
|
|
|
170140
170241
|
note: `prepare:customer --contract with a merged contract (committed provisioning.json untouched)${unpairedInRepo ? ` \xB7 ${unpairedInRepo}` : ""}`
|
|
170141
170242
|
};
|
|
170142
170243
|
}
|
|
170143
|
-
const pkgProv =
|
|
170244
|
+
const pkgProv = join81(cwd, "provisioning.json");
|
|
170144
170245
|
assertNotCommitted(pkgProv, input.forbiddenProvisioning);
|
|
170145
|
-
const contentPath =
|
|
170246
|
+
const contentPath = join81(cwd, "himalaya.content.json");
|
|
170146
170247
|
const syncViewNames = (before, after) => {
|
|
170147
170248
|
const content = readContentManifest(cwd);
|
|
170148
170249
|
if (!content) return;
|
|
@@ -170155,7 +170256,7 @@ async function applyOverlays(input) {
|
|
|
170155
170256
|
let packageFaq = faq;
|
|
170156
170257
|
let packageGalleries = galleries;
|
|
170157
170258
|
if (existsSync77(pkgProv)) {
|
|
170158
|
-
const cur = JSON.parse(
|
|
170259
|
+
const cur = JSON.parse(readFileSync95(pkgProv, "utf8"));
|
|
170159
170260
|
if (galleries === void 0 && !sameKnownSite(cur, overlay)) overlay.galleries = [];
|
|
170160
170261
|
const merged = deepMerge4(cur, overlay);
|
|
170161
170262
|
packageFaq = merged.faq;
|
|
@@ -170171,9 +170272,9 @@ async function applyOverlays(input) {
|
|
|
170171
170272
|
if (Array.isArray(packageGalleries) && packageGalleries.length && !overlay.installedVerticals.includes("galleries")) {
|
|
170172
170273
|
overlay.installedVerticals.push("galleries");
|
|
170173
170274
|
}
|
|
170174
|
-
const pkgTokens =
|
|
170275
|
+
const pkgTokens = join81(cwd, "tokens.json");
|
|
170175
170276
|
if (existsSync77(pkgTokens) && (tokens2.colors || tokens2.typography)) {
|
|
170176
|
-
const cur = JSON.parse(
|
|
170277
|
+
const cur = JSON.parse(readFileSync95(pkgTokens, "utf8"));
|
|
170177
170278
|
let tokensIn = tokens2;
|
|
170178
170279
|
if (tokens2.typography) {
|
|
170179
170280
|
const fonts = catalogTypography(tokens2.typography, cur.typography);
|
|
@@ -170198,9 +170299,9 @@ async function applyOverlays(input) {
|
|
|
170198
170299
|
wrote.push(pkgTokens);
|
|
170199
170300
|
}
|
|
170200
170301
|
const homeAction = homeRefreshActionId(shell);
|
|
170201
|
-
const homeSrc =
|
|
170302
|
+
const homeSrc = join81(cwd, "dev/index.ts");
|
|
170202
170303
|
if (homeAction && existsSync77(homeSrc)) {
|
|
170203
|
-
const prev =
|
|
170304
|
+
const prev = readFileSync95(homeSrc, "utf8");
|
|
170204
170305
|
const patched = patchBrandParams(prev, overlay, homeAction);
|
|
170205
170306
|
let next = patched.src;
|
|
170206
170307
|
if (!patched.foreign && faq?.length && prev.includes('"tier5.himiBrandedFaq.load"') && !prev.includes('"staticFaq"')) {
|
|
@@ -171199,7 +171300,7 @@ __export(cli_exports2, {
|
|
|
171199
171300
|
runSiteAnalyze: () => runSiteAnalyze,
|
|
171200
171301
|
runSiteFunctionCli: () => runSiteFunctionCli
|
|
171201
171302
|
});
|
|
171202
|
-
import { existsSync as existsSync78, readFileSync as
|
|
171303
|
+
import { existsSync as existsSync78, readFileSync as readFileSync96 } from "node:fs";
|
|
171203
171304
|
import { resolve as resolve59 } from "node:path";
|
|
171204
171305
|
function applyNeedsClient(shell) {
|
|
171205
171306
|
if (shell === void 0 || !SHELL_NAMES2.includes(shell)) return true;
|
|
@@ -171258,7 +171359,7 @@ async function runSiteAnalyze(opts) {
|
|
|
171258
171359
|
const prevOverlayPath = resolve59(outDir, "provisioning.overlay.json");
|
|
171259
171360
|
const prevSite = existsSync78(prevOverlayPath) ? (() => {
|
|
171260
171361
|
try {
|
|
171261
|
-
return JSON.parse(
|
|
171362
|
+
return JSON.parse(readFileSync96(prevOverlayPath, "utf8")).site;
|
|
171262
171363
|
} catch {
|
|
171263
171364
|
return void 0;
|
|
171264
171365
|
}
|
|
@@ -171277,7 +171378,7 @@ async function runSiteAnalyze(opts) {
|
|
|
171277
171378
|
}
|
|
171278
171379
|
const previousOverlay = resolve59(outDir, "provisioning.overlay.json");
|
|
171279
171380
|
carryOverGoals(
|
|
171280
|
-
existsSync78(previousOverlay) ?
|
|
171381
|
+
existsSync78(previousOverlay) ? readFileSync96(previousOverlay, "utf8") : void 0,
|
|
171281
171382
|
result.provisioningOverlay
|
|
171282
171383
|
);
|
|
171283
171384
|
const ownerCall = ownerAuth ? ownerTransportFrom(fetchImpl, ownerAuth) : void 0;
|
|
@@ -171335,7 +171436,7 @@ async function runSiteFunctionCli(opts) {
|
|
|
171335
171436
|
let source;
|
|
171336
171437
|
if (opts.sourcePath) {
|
|
171337
171438
|
const p2 = resolve59(opts.cwd ?? process.cwd(), opts.sourcePath);
|
|
171338
|
-
source =
|
|
171439
|
+
source = readFileSync96(p2, "utf8");
|
|
171339
171440
|
}
|
|
171340
171441
|
let body;
|
|
171341
171442
|
if (opts.bodyRaw != null) {
|
|
@@ -171365,7 +171466,7 @@ async function runSiteFunctionCli(opts) {
|
|
|
171365
171466
|
function base44BookRoutes(bookPath, siteUrl) {
|
|
171366
171467
|
if (!existsSync78(bookPath)) return void 0;
|
|
171367
171468
|
try {
|
|
171368
|
-
const book = JSON.parse(
|
|
171469
|
+
const book = JSON.parse(readFileSync96(bookPath, "utf8"));
|
|
171369
171470
|
if (book.kind !== "base44-app-book" || !Array.isArray(book.routes)) return void 0;
|
|
171370
171471
|
const host = (u2) => {
|
|
171371
171472
|
try {
|
|
@@ -171620,7 +171721,7 @@ __export(site_create_exports, {
|
|
|
171620
171721
|
runSiteList: () => runSiteList,
|
|
171621
171722
|
writeProvisioningBinding: () => writeProvisioningBinding
|
|
171622
171723
|
});
|
|
171623
|
-
import { existsSync as existsSync79, readFileSync as
|
|
171724
|
+
import { existsSync as existsSync79, readFileSync as readFileSync97, writeFileSync as writeFileSync37 } from "node:fs";
|
|
171624
171725
|
import { resolve as resolvePath2 } from "node:path";
|
|
171625
171726
|
function oauthClientName(projectName) {
|
|
171626
171727
|
return `${projectName} client`;
|
|
@@ -171769,7 +171870,7 @@ async function runSiteCreate(opts) {
|
|
|
171769
171870
|
if (!wantOauthApp) return { ...base, nextSteps: nextSteps(metaSiteId) };
|
|
171770
171871
|
return { ...base, clientId, redirectUri, nextSteps: nextSteps(metaSiteId, clientId) };
|
|
171771
171872
|
}
|
|
171772
|
-
function writeProvisioningBinding(target, binding2, fs2 = { existsSync: existsSync79, readFileSync:
|
|
171873
|
+
function writeProvisioningBinding(target, binding2, fs2 = { existsSync: existsSync79, readFileSync: readFileSync97, writeFileSync: writeFileSync37 }) {
|
|
171773
171874
|
const msid = binding2.siteId;
|
|
171774
171875
|
const path2 = resolvePath2(target);
|
|
171775
171876
|
const committed = committedShellProvisioning(path2);
|
|
@@ -172445,12 +172546,12 @@ var init_context = __esm({
|
|
|
172445
172546
|
});
|
|
172446
172547
|
|
|
172447
172548
|
// src/cli.ts
|
|
172448
|
-
import { mkdtempSync as mkdtempSync5, readFileSync as
|
|
172549
|
+
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
172550
|
import { execFile as execFile2, execFileSync as execFileSync7, spawnSync as spawnSync5, spawn as spawn7 } from "node:child_process";
|
|
172450
172551
|
import { AsyncLocalStorage as AsyncLocalStorage2 } from "node:async_hooks";
|
|
172451
172552
|
import { createHash as createHash41, randomUUID as randomUUID11 } from "node:crypto";
|
|
172452
172553
|
import { tmpdir as tmpdir6, homedir as homedir11, hostname as hostname2 } from "node:os";
|
|
172453
|
-
import { join as
|
|
172554
|
+
import { join as join82, resolve as resolve60, relative as relative15, basename as basename19, dirname as dirname43 } from "node:path";
|
|
172454
172555
|
import { fileURLToPath as fileURLToPath27 } from "node:url";
|
|
172455
172556
|
|
|
172456
172557
|
// ../serve-cli/src/client.ts
|
|
@@ -174604,8 +174705,8 @@ var str9 = (v2) => typeof v2 === "string" ? v2 : void 0;
|
|
|
174604
174705
|
var num3 = (v2) => typeof v2 === "string" && v2 !== "" && Number.isFinite(Number(v2)) ? Number(v2) : void 0;
|
|
174605
174706
|
function embeddedTemplateCatalog() {
|
|
174606
174707
|
return availableTemplates().map((name) => {
|
|
174607
|
-
const path2 =
|
|
174608
|
-
const meta = JSON.parse(
|
|
174708
|
+
const path2 = join82(templateSourceDir(name), TEMPLATE_META_FILE);
|
|
174709
|
+
const meta = JSON.parse(readFileSync98(path2, "utf8"));
|
|
174609
174710
|
if (!meta || typeof meta.title !== "string" || typeof meta.description !== "string" || !Array.isArray(meta.tags)) {
|
|
174610
174711
|
throw new Error(`${path2} must be { title: string, description: string, tags: string[], category?: string }`);
|
|
174611
174712
|
}
|
|
@@ -175476,7 +175577,7 @@ var COMMANDS2 = [
|
|
|
175476
175577
|
];
|
|
175477
175578
|
function cliVersion() {
|
|
175478
175579
|
try {
|
|
175479
|
-
return JSON.parse(
|
|
175580
|
+
return JSON.parse(readFileSync98(new URL("../package.json", import.meta.url), "utf8")).version ?? "unknown";
|
|
175480
175581
|
} catch {
|
|
175481
175582
|
return "unknown";
|
|
175482
175583
|
}
|
|
@@ -175601,7 +175702,7 @@ function ageInDays(publishedAt, now = Date.now()) {
|
|
|
175601
175702
|
}
|
|
175602
175703
|
function packageVersion(path2) {
|
|
175603
175704
|
try {
|
|
175604
|
-
const version4 = JSON.parse(
|
|
175705
|
+
const version4 = JSON.parse(readFileSync98(path2, "utf8")).version;
|
|
175605
175706
|
return typeof version4 === "string" && version4 ? version4 : void 0;
|
|
175606
175707
|
} catch {
|
|
175607
175708
|
return void 0;
|
|
@@ -175610,7 +175711,7 @@ function packageVersion(path2) {
|
|
|
175610
175711
|
function resolvedSdkVersion(fromDir = process.cwd(), bundledManifest = new URL("./authoring-runtime/node_modules/@wix/himalaya/package.json", import.meta.url)) {
|
|
175611
175712
|
let dir = resolve60(fromDir);
|
|
175612
175713
|
for (; ; ) {
|
|
175613
|
-
const version4 = packageVersion(
|
|
175714
|
+
const version4 = packageVersion(join82(dir, "node_modules", "@wix", "himalaya", "package.json"));
|
|
175614
175715
|
if (version4) return { version: version4, source: "local" };
|
|
175615
175716
|
const parent = dirname43(dir);
|
|
175616
175717
|
if (parent === dir) break;
|
|
@@ -175620,7 +175721,7 @@ function resolvedSdkVersion(fromDir = process.cwd(), bundledManifest = new URL("
|
|
|
175620
175721
|
if (bundled) return { version: bundled, source: "bundled" };
|
|
175621
175722
|
try {
|
|
175622
175723
|
const root = execFileSync7("npm", ["root", "-g"], { stdio: ["ignore", "pipe", "ignore"] }).toString().trim();
|
|
175623
|
-
const version4 = root ? packageVersion(
|
|
175724
|
+
const version4 = root ? packageVersion(join82(root, "@wix", "himalaya", "package.json")) : void 0;
|
|
175624
175725
|
return version4 ? { version: version4, source: "global" } : {};
|
|
175625
175726
|
} catch {
|
|
175626
175727
|
return {};
|
|
@@ -175667,11 +175768,11 @@ var UPDATE_RETRY_AFTER_FAILURE_MS = 60 * 60 * 1e3;
|
|
|
175667
175768
|
var UPDATE_SNOOZE_MS = 24 * 60 * 60 * 1e3;
|
|
175668
175769
|
var UPDATE_REEXEC_ENV = "HIMI_UPDATED_ONCE";
|
|
175669
175770
|
function updateCachePath(env = process.env) {
|
|
175670
|
-
return env.HIMI_UPDATE_CACHE_FILE ??
|
|
175771
|
+
return env.HIMI_UPDATE_CACHE_FILE ?? join82(homedir11(), ".himalaya", "update-check.json");
|
|
175671
175772
|
}
|
|
175672
175773
|
function readUpdateCache(path2) {
|
|
175673
175774
|
try {
|
|
175674
|
-
const parsed = JSON.parse(
|
|
175775
|
+
const parsed = JSON.parse(readFileSync98(path2, "utf8"));
|
|
175675
175776
|
return parsed && typeof parsed === "object" ? parsed : {};
|
|
175676
175777
|
} catch {
|
|
175677
175778
|
return {};
|
|
@@ -175740,11 +175841,11 @@ function createUpdateRunner(spawn8 = spawnSync5) {
|
|
|
175740
175841
|
},
|
|
175741
175842
|
installedVersion: () => {
|
|
175742
175843
|
const root = globalNodeModulesRoot();
|
|
175743
|
-
return root ? packageVersion(
|
|
175844
|
+
return root ? packageVersion(join82(root, "@wix", "himalaya-cli", "package.json")) : void 0;
|
|
175744
175845
|
},
|
|
175745
175846
|
reexec: (argv) => {
|
|
175746
175847
|
const root = globalNodeModulesRoot();
|
|
175747
|
-
const entry = root ?
|
|
175848
|
+
const entry = root ? join82(root, "@wix", "himalaya-cli", "dist", "cli.mjs") : void 0;
|
|
175748
175849
|
if (!entry || !existsSync80(entry)) return void 0;
|
|
175749
175850
|
const result = spawnSync5(process.execPath, [entry, ...argv], {
|
|
175750
175851
|
// inherit keeps PIPED STDIN working — commands that read stdin must survive a re-exec.
|
|
@@ -175792,7 +175893,7 @@ function staleUpdateLockFile(cachePath, now) {
|
|
|
175792
175893
|
for (const path2 of [`${cachePath}.lock.break`, `${cachePath}.lock`]) {
|
|
175793
175894
|
let content;
|
|
175794
175895
|
try {
|
|
175795
|
-
content =
|
|
175896
|
+
content = readFileSync98(path2, "utf8");
|
|
175796
175897
|
} catch {
|
|
175797
175898
|
continue;
|
|
175798
175899
|
}
|
|
@@ -175815,7 +175916,7 @@ function acquireUpdateLock(cachePath, now, hooks = {}) {
|
|
|
175815
175916
|
const mine = lockStamp(now);
|
|
175816
175917
|
const readLock = (path2) => {
|
|
175817
175918
|
try {
|
|
175818
|
-
return
|
|
175919
|
+
return readFileSync98(path2, "utf8");
|
|
175819
175920
|
} catch {
|
|
175820
175921
|
return void 0;
|
|
175821
175922
|
}
|
|
@@ -176407,7 +176508,7 @@ function executableOnPath(name, env = process.env) {
|
|
|
176407
176508
|
const suffixes = process.platform === "win32" ? (env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean) : [""];
|
|
176408
176509
|
for (const dir of entries) {
|
|
176409
176510
|
for (const suffix of suffixes) {
|
|
176410
|
-
const candidate =
|
|
176511
|
+
const candidate = join82(dir, `${name}${suffix}`);
|
|
176411
176512
|
try {
|
|
176412
176513
|
if (!statSync21(candidate).isFile()) continue;
|
|
176413
176514
|
if (process.platform !== "win32") accessSync(candidate, constants4.X_OK);
|
|
@@ -176516,7 +176617,7 @@ async function nativeConfigAdvisories(app, configSource) {
|
|
|
176516
176617
|
const { iosProjectYml: iosProjectYml2 } = await Promise.resolve().then(() => (init_paths2(), paths_exports));
|
|
176517
176618
|
const { androidOptedIn: androidOptedIn3, LABEL_IOS_SPLASH: LABEL_IOS_SPLASH2 } = await Promise.resolve().then(() => (init_splash(), splash_exports));
|
|
176518
176619
|
const iosYmlPath = iosProjectYml2(app);
|
|
176519
|
-
const iosYml = existsSync80(iosYmlPath) ?
|
|
176620
|
+
const iosYml = existsSync80(iosYmlPath) ? readFileSync98(iosYmlPath, "utf8") : "";
|
|
176520
176621
|
let optedIn = iosYml.includes(LABEL_IOS_SPLASH2);
|
|
176521
176622
|
if (!optedIn) {
|
|
176522
176623
|
const { androidManifestPath: androidManifestPath3 } = await Promise.resolve().then(() => (init_gen_native_config(), gen_native_config_exports));
|
|
@@ -176530,7 +176631,7 @@ async function nativeConfigAdvisories(app, configSource) {
|
|
|
176530
176631
|
}
|
|
176531
176632
|
function readConfigSource(dir) {
|
|
176532
176633
|
try {
|
|
176533
|
-
return
|
|
176634
|
+
return readFileSync98(join82(dir, "config.ts"), "utf8");
|
|
176534
176635
|
} catch {
|
|
176535
176636
|
return null;
|
|
176536
176637
|
}
|
|
@@ -176584,7 +176685,7 @@ var NoBase44SlotError = class extends Error {
|
|
|
176584
176685
|
};
|
|
176585
176686
|
async function initFromRemoteTemplate(name, parentDir, template, c2, opts = {}) {
|
|
176586
176687
|
const dir = resolve60(parentDir, name);
|
|
176587
|
-
if (existsSync80(
|
|
176688
|
+
if (existsSync80(join82(dir, "himalaya.content.json"))) {
|
|
176588
176689
|
throw new Error(`content package already exists at ${dir}`);
|
|
176589
176690
|
}
|
|
176590
176691
|
const r2 = await c2.fetchTemplateSource(TEMPLATE_APP_PREFIX + template);
|
|
@@ -176645,7 +176746,7 @@ function restoreDestinationIssue(dest, force) {
|
|
|
176645
176746
|
function isHimalayaMonorepoCheckout(start) {
|
|
176646
176747
|
let dir = resolve60(start);
|
|
176647
176748
|
for (; ; ) {
|
|
176648
|
-
if (existsSync80(
|
|
176749
|
+
if (existsSync80(join82(dir, "tools", "himi-cli", "src", "cli.ts")) && existsSync80(join82(dir, "core", "serve", "src", "server.ts"))) return true;
|
|
176649
176750
|
const parent = dirname43(dir);
|
|
176650
176751
|
if (parent === dir) return false;
|
|
176651
176752
|
dir = parent;
|
|
@@ -176706,7 +176807,7 @@ function materializeForPreview(appDir3, slug, displayName2) {
|
|
|
176706
176807
|
Object.entries(files).map(([rel, body]) => [rel, rel === "himalaya.content.json" ? substituteIdentity(body, slug) : body])
|
|
176707
176808
|
);
|
|
176708
176809
|
const repoRoot2 = resolve60(fileURLToPath27(new URL("../../..", import.meta.url)));
|
|
176709
|
-
const root =
|
|
176810
|
+
const root = join82(repoRoot2, "node_modules", ".cache", "himi-template-preview");
|
|
176710
176811
|
const stillRunning = (pid) => {
|
|
176711
176812
|
try {
|
|
176712
176813
|
process.kill(pid, 0);
|
|
@@ -176720,12 +176821,12 @@ function materializeForPreview(appDir3, slug, displayName2) {
|
|
|
176720
176821
|
if (!entry.isDirectory()) continue;
|
|
176721
176822
|
const pid = Number(entry.name.startsWith(`${slug}-`) ? entry.name.slice(slug.length + 1) : NaN);
|
|
176722
176823
|
if (Number.isInteger(pid) && pid > 0 && pid !== process.pid && !stillRunning(pid)) {
|
|
176723
|
-
rmSync22(
|
|
176824
|
+
rmSync22(join82(root, entry.name), { recursive: true, force: true });
|
|
176724
176825
|
}
|
|
176725
176826
|
}
|
|
176726
176827
|
} catch {
|
|
176727
176828
|
}
|
|
176728
|
-
const dest =
|
|
176829
|
+
const dest = join82(root, `${slug}-${process.pid}`);
|
|
176729
176830
|
rmSync22(dest, { recursive: true, force: true });
|
|
176730
176831
|
mkdirSync41(dest, { recursive: true });
|
|
176731
176832
|
try {
|
|
@@ -176738,8 +176839,8 @@ function materializeForPreview(appDir3, slug, displayName2) {
|
|
|
176738
176839
|
}
|
|
176739
176840
|
async function appId(dir) {
|
|
176740
176841
|
try {
|
|
176741
|
-
const { readFileSync:
|
|
176742
|
-
const m2 = JSON.parse(
|
|
176842
|
+
const { readFileSync: readFileSync99 } = await import("node:fs");
|
|
176843
|
+
const m2 = JSON.parse(readFileSync99(join82(dir, "himalaya.content.json"), "utf8"));
|
|
176743
176844
|
if (m2.name) return m2.name;
|
|
176744
176845
|
} catch {
|
|
176745
176846
|
}
|
|
@@ -176747,8 +176848,8 @@ async function appId(dir) {
|
|
|
176747
176848
|
}
|
|
176748
176849
|
async function contentVisibility(dir) {
|
|
176749
176850
|
try {
|
|
176750
|
-
const { readFileSync:
|
|
176751
|
-
const m2 = JSON.parse(
|
|
176851
|
+
const { readFileSync: readFileSync99 } = await import("node:fs");
|
|
176852
|
+
const m2 = JSON.parse(readFileSync99(join82(dir, "himalaya.content.json"), "utf8"));
|
|
176752
176853
|
if (m2.visibility === "public" || m2.visibility === "unlisted") return m2.visibility;
|
|
176753
176854
|
} catch {
|
|
176754
176855
|
}
|
|
@@ -177037,7 +177138,7 @@ Seed your coding agent with \`himi agent-init\`. Guides: ${idx.portalUrl}`);
|
|
|
177037
177138
|
...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
177139
|
// In a git repo the refresh moves the diff identity an earlier `himi test` attested (that
|
|
177039
177140
|
// hash is shared with the repo gates and deliberately exempts nothing but its own metadata).
|
|
177040
|
-
...existsSync80(
|
|
177141
|
+
...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
177142
|
...res.skipped.length ? { skipped: res.skipped } : {},
|
|
177042
177143
|
portalUrl: idx.portalUrl
|
|
177043
177144
|
});
|
|
@@ -177060,7 +177161,7 @@ async function recordedReleaseForContentQuietly(dir, resolution, onDrift) {
|
|
|
177060
177161
|
try {
|
|
177061
177162
|
const { buildContentForValidation: buildContentForValidation2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
177062
177163
|
const bres = await buildContentForValidation2(dir, { resolution });
|
|
177063
|
-
out2 = mkdtempSync5(
|
|
177164
|
+
out2 = mkdtempSync5(join82(tmpdir6(), "himi-ux-record-"));
|
|
177064
177165
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
177065
177166
|
const outcome = await buildReleaseFromContent2(dir, out2, { ...hasWorkers ? { tier5Dir: bundleOutDir2(dir) } : {}, collect: { lint: true } });
|
|
177066
177167
|
const releaseId = outcome.manifest.releaseId;
|
|
@@ -177239,7 +177340,7 @@ async function producedWidgetFamilies(dir) {
|
|
|
177239
177340
|
let js2;
|
|
177240
177341
|
for (const candidate of [`${name}.bundle.js`, `${name}.js`, name]) {
|
|
177241
177342
|
try {
|
|
177242
|
-
js2 =
|
|
177343
|
+
js2 = readFileSync98(join82(outDir, candidate), "utf8");
|
|
177243
177344
|
break;
|
|
177244
177345
|
} catch {
|
|
177245
177346
|
}
|
|
@@ -177270,7 +177371,7 @@ async function producedWidgetFamilies(dir) {
|
|
|
177270
177371
|
}
|
|
177271
177372
|
return { families, source: "dist/bundles" };
|
|
177272
177373
|
}
|
|
177273
|
-
var boardOpen = (dir) => existsSync80(
|
|
177374
|
+
var boardOpen = (dir) => existsSync80(join82(dir, ".himi", "studio", "index.html"));
|
|
177274
177375
|
var BOARD_REFRESHERS = /* @__PURE__ */ new Set(["render", "test", "validate", "build", "push", "icon", "site", "ux", "progress"]);
|
|
177275
177376
|
async function leaveForBoard(dir, record2, value) {
|
|
177276
177377
|
if (!boardOpen(dir)) return;
|
|
@@ -177294,7 +177395,7 @@ async function liveMapFor(dir) {
|
|
|
177294
177395
|
}
|
|
177295
177396
|
var commandScratch = new AsyncLocalStorage2();
|
|
177296
177397
|
function commandScratchDir(prefix) {
|
|
177297
|
-
const dir = mkdtempSync5(
|
|
177398
|
+
const dir = mkdtempSync5(join82(tmpdir6(), prefix));
|
|
177298
177399
|
commandScratch.getStore()?.push(dir);
|
|
177299
177400
|
return dir;
|
|
177300
177401
|
}
|
|
@@ -177648,7 +177749,7 @@ himi v${cliVersion()} \u2014 run \`himi --version\`. If authoring commands fail
|
|
|
177648
177749
|
const owed = openApprovals2(readApprovals2(dir).events).length;
|
|
177649
177750
|
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
177751
|
}
|
|
177651
|
-
const planInParent = ["SPEC.md", "MOBILE-UX.md"].filter((f2) => existsSync80(
|
|
177752
|
+
const planInParent = ["SPEC.md", "MOBILE-UX.md"].filter((f2) => existsSync80(join82(parentDir, f2)));
|
|
177652
177753
|
if (planInParent.length) {
|
|
177653
177754
|
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
177755
|
}
|
|
@@ -177809,13 +177910,13 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177809
177910
|
if (adding) {
|
|
177810
177911
|
const from = str9(flags.from);
|
|
177811
177912
|
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,
|
|
177913
|
+
print(adopt.addScreen(dir, adding, readFileSync98(from, "utf8"), { parent: str9(flags.parent), tab: str9(flags.tab), displayName: str9(flags["display-name"]) }));
|
|
177813
177914
|
return 0;
|
|
177814
177915
|
}
|
|
177815
177916
|
if (target) {
|
|
177816
177917
|
const from = str9(flags.from);
|
|
177817
177918
|
if (!from) throw new TrimRefusal2("--write <id> needs --from <file> holding the whole entry, as --show prints it");
|
|
177818
|
-
print(adopt.replaceScreen(dir, target,
|
|
177919
|
+
print(adopt.replaceScreen(dir, target, readFileSync98(from, "utf8")));
|
|
177819
177920
|
return 0;
|
|
177820
177921
|
}
|
|
177821
177922
|
if (show) {
|
|
@@ -177897,7 +177998,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177897
177998
|
const { keepFromSpec: keepFromSpec2 } = await Promise.resolve().then(() => (init_template_adopt(), template_adopt_exports));
|
|
177898
177999
|
const dir = contentDir(flags);
|
|
177899
178000
|
try {
|
|
177900
|
-
const spec = keepFromSpec2(dir, str9(flags["from-spec"]) ??
|
|
178001
|
+
const spec = keepFromSpec2(dir, str9(flags["from-spec"]) ?? join82(dir, "SPEC.md"));
|
|
177901
178002
|
const own4 = typeof keep === "string" ? keep.split(",").map((k2) => k2.trim()).filter(Boolean) : [];
|
|
177902
178003
|
keep = [.../* @__PURE__ */ new Set([...spec.keep, ...own4])].join(",");
|
|
177903
178004
|
fromSpec = { fromSpec: {
|
|
@@ -177938,7 +178039,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177938
178039
|
const result = { ...outcome.result, ...fromSpec };
|
|
177939
178040
|
const adoptDir = contentDir(flags);
|
|
177940
178041
|
const kept = flags["dry-run"] !== true && (outcome.code === 0 || outcome.result.forcedKeep === true);
|
|
177941
|
-
if (kept && existsSync80(
|
|
178042
|
+
if (kept && existsSync80(join82(adoptDir, adoptBits.ADOPT_FILE))) {
|
|
177942
178043
|
try {
|
|
177943
178044
|
const inv = adoptBits.inspectApp(adoptDir);
|
|
177944
178045
|
adoptBits.writeInventory(adoptDir, inv, { companions: "if-missing" });
|
|
@@ -177967,7 +178068,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177967
178068
|
const sourceDir = resolve60(str9(flags["source-dir"]) ?? appDir3);
|
|
177968
178069
|
let meta;
|
|
177969
178070
|
try {
|
|
177970
|
-
meta = JSON.parse(
|
|
178071
|
+
meta = JSON.parse(readFileSync98(join82(sourceDir, TEMPLATE_META_FILE), "utf8"));
|
|
177971
178072
|
} catch {
|
|
177972
178073
|
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
178074
|
return 2;
|
|
@@ -177977,7 +178078,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177977
178078
|
return 2;
|
|
177978
178079
|
}
|
|
177979
178080
|
try {
|
|
177980
|
-
const appearance = extractTemplateAppearance(JSON.parse(
|
|
178081
|
+
const appearance = extractTemplateAppearance(JSON.parse(readFileSync98(join82(sourceDir, "tokens.json"), "utf8")));
|
|
177981
178082
|
meta = { ...appearance, ...meta };
|
|
177982
178083
|
} catch {
|
|
177983
178084
|
}
|
|
@@ -177999,7 +178100,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177999
178100
|
const force = flags.force === true;
|
|
178000
178101
|
const { buildContentForValidation: buildContentForValidation2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
178001
178102
|
const bres = await buildContentForValidation2(buildDir, { resolution: resolutionFlag(flags) });
|
|
178002
|
-
const out2 = mkdtempSync5(
|
|
178103
|
+
const out2 = mkdtempSync5(join82(tmpdir6(), "himi-template-"));
|
|
178003
178104
|
publishScratch.push(out2);
|
|
178004
178105
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
178005
178106
|
const outcome = await buildReleaseFromContent2(buildDir, out2, {
|
|
@@ -178056,7 +178157,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178056
178157
|
let iconHash;
|
|
178057
178158
|
if (iconPath) {
|
|
178058
178159
|
try {
|
|
178059
|
-
const bytes2 =
|
|
178160
|
+
const bytes2 = readFileSync98(iconPath);
|
|
178060
178161
|
payload.icon = bytes2.toString("base64");
|
|
178061
178162
|
iconHash = createHash41("sha256").update(bytes2).digest("hex");
|
|
178062
178163
|
} catch {
|
|
@@ -178355,7 +178456,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178355
178456
|
const path2 = dpxSessionTokenPath();
|
|
178356
178457
|
let raw;
|
|
178357
178458
|
try {
|
|
178358
|
-
raw =
|
|
178459
|
+
raw = readFileSync98(path2, "utf8");
|
|
178359
178460
|
} catch {
|
|
178360
178461
|
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
178462
|
}
|
|
@@ -178489,8 +178590,8 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178489
178590
|
const dir = resolve60(out2);
|
|
178490
178591
|
const files = himiPluginFiles2(skills.skillMd);
|
|
178491
178592
|
for (const f2 of files) {
|
|
178492
|
-
mkdirSync41(dirname43(
|
|
178493
|
-
writeFileSync38(
|
|
178593
|
+
mkdirSync41(dirname43(join82(dir, f2.path)), { recursive: true });
|
|
178594
|
+
writeFileSync38(join82(dir, f2.path), f2.text);
|
|
178494
178595
|
}
|
|
178495
178596
|
print({ ok: true, dir, files: files.map((f2) => f2.path), next: [`claude plugin validate ${dir}`, `claude --plugin-dir ${dir}`] });
|
|
178496
178597
|
return 0;
|
|
@@ -178507,13 +178608,13 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178507
178608
|
case "studio": {
|
|
178508
178609
|
const { openStudio: openStudio2 } = await Promise.resolve().then(() => (init_studio(), studio_exports));
|
|
178509
178610
|
const dir = contentDir(flags);
|
|
178510
|
-
if (!existsSync80(
|
|
178611
|
+
if (!existsSync80(join82(dir, "himalaya.content.json"))) {
|
|
178511
178612
|
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
178613
|
return 2;
|
|
178513
178614
|
}
|
|
178514
178615
|
if (pos[1] === "reel") {
|
|
178515
178616
|
const { buildReel: buildReel2 } = await Promise.resolve().then(() => (init_studio_reel(), studio_reel_exports));
|
|
178516
|
-
const out2 = resolve60(str9(flags.out) ??
|
|
178617
|
+
const out2 = resolve60(str9(flags.out) ?? join82(dir, ".himi", "making-of.html"));
|
|
178517
178618
|
const { html, plan } = buildReel2(dir);
|
|
178518
178619
|
mkdirSync41(dirname43(out2), { recursive: true });
|
|
178519
178620
|
writeFileSync38(out2, html);
|
|
@@ -178585,7 +178686,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
178585
178686
|
} = await Promise.resolve().then(() => (init_progress(), progress_exports));
|
|
178586
178687
|
const dir = contentDir(flags);
|
|
178587
178688
|
const journal2 = journalPath2(dir);
|
|
178588
|
-
const isContentPackage = existsSync80(
|
|
178689
|
+
const isContentPackage = existsSync80(join82(dir, "himalaya.content.json"));
|
|
178589
178690
|
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
178691
|
const message = pos.slice(1).join(" ").trim();
|
|
178591
178692
|
const approvalFlags = ["approve", "done", "drop"].filter((f2) => flags[f2] !== void 0);
|
|
@@ -178737,7 +178838,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
178737
178838
|
case "test": {
|
|
178738
178839
|
const dir = contentDir(flags);
|
|
178739
178840
|
const structuredOutput = flags.json === true || io2.isTTY !== true;
|
|
178740
|
-
if (existsSync80(
|
|
178841
|
+
if (existsSync80(join82(dir, "functions"))) {
|
|
178741
178842
|
const { invokeLocalFunction: invokeLocalFunction2, loadFunctionsApp: loadFunctionsApp2 } = await Promise.resolve().then(() => (init_functions(), functions_exports));
|
|
178742
178843
|
const loaded = await loadFunctionsApp2(dir);
|
|
178743
178844
|
const results = [];
|
|
@@ -178869,7 +178970,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
178869
178970
|
io2.error(JSON.stringify({ error: `screen "${screen.screenId}" has no Tier-5 worker, so there is nothing for the browser loop to build` }));
|
|
178870
178971
|
return 2;
|
|
178871
178972
|
}
|
|
178872
|
-
const sources = collectWorkerSources2(
|
|
178973
|
+
const sources = collectWorkerSources2(join82(dir, "tier5-src"), screen.bundleName);
|
|
178873
178974
|
if (!sources) {
|
|
178874
178975
|
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
178976
|
return 2;
|
|
@@ -179047,7 +179148,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
179047
179148
|
const sp = await runShotsPass2({
|
|
179048
179149
|
descriptors: scopeDescriptors2(outcome.descriptors ?? [], pos.slice(1), invalidScreens),
|
|
179049
179150
|
tokens: outcome.tokens,
|
|
179050
|
-
outDir:
|
|
179151
|
+
outDir: join82(dir, ".himi", "shots"),
|
|
179051
179152
|
width: 390,
|
|
179052
179153
|
layers: { rules: shotRules, ...cmsSeed ? { cmsSeed } : {}, ...canned ? { canned: canned.byKey } : {} },
|
|
179053
179154
|
...budgetMs ? { budgetMs } : {},
|
|
@@ -179087,7 +179188,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
179087
179188
|
releaseId: result.releaseId,
|
|
179088
179189
|
releasePayload: release2,
|
|
179089
179190
|
descriptors: attestedDescriptors,
|
|
179090
|
-
screenshots: Object.fromEntries(writtenShots.filter((name) => crawledScreens.has(name.replace(/\.png$/, ""))).map((name) => [name.replace(/\.png$/, ""),
|
|
179191
|
+
screenshots: Object.fromEntries(writtenShots.filter((name) => crawledScreens.has(name.replace(/\.png$/, ""))).map((name) => [name.replace(/\.png$/, ""), join82(dir, ".himi", "shots", name)])),
|
|
179091
179192
|
coverage: {
|
|
179092
179193
|
screens: crawledScreens.size,
|
|
179093
179194
|
actionsDispatched: result.actions.exercised,
|
|
@@ -179212,7 +179313,7 @@ ${[...afterRun.next, ...testReminder ? [testReminder] : []].join("\n")}`);
|
|
|
179212
179313
|
return 2;
|
|
179213
179314
|
}
|
|
179214
179315
|
try {
|
|
179215
|
-
const raw = stateArg.trim().startsWith("{") ? stateArg :
|
|
179316
|
+
const raw = stateArg.trim().startsWith("{") ? stateArg : readFileSync98(stateArg.replace(/^@/, ""), "utf8");
|
|
179216
179317
|
injectedState = JSON.parse(raw);
|
|
179217
179318
|
} catch (e2) {
|
|
179218
179319
|
io2.error(JSON.stringify({ error: `--state must be inline JSON or a path to a .json file \u2014 ${e2.message}` }));
|
|
@@ -179227,7 +179328,7 @@ ${[...afterRun.next, ...testReminder ? [testReminder] : []].join("\n")}`);
|
|
|
179227
179328
|
return 2;
|
|
179228
179329
|
}
|
|
179229
179330
|
try {
|
|
179230
|
-
const raw = inputArg.trim().startsWith("{") ? inputArg :
|
|
179331
|
+
const raw = inputArg.trim().startsWith("{") ? inputArg : readFileSync98(inputArg.replace(/^@/, ""), "utf8");
|
|
179231
179332
|
const parsed = JSON.parse(raw);
|
|
179232
179333
|
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("must be a JSON object");
|
|
179233
179334
|
injectedInput = parsed;
|
|
@@ -179309,7 +179410,7 @@ ${[...afterRun.next, ...testReminder ? [testReminder] : []].join("\n")}`);
|
|
|
179309
179410
|
const diagnostics = (outcome.lint ?? []).find((s2) => s2.screenId === screenId)?.issues ?? [];
|
|
179310
179411
|
let pngFile;
|
|
179311
179412
|
let attestationPngFile;
|
|
179312
|
-
const shotPath =
|
|
179413
|
+
const shotPath = join82(dir, ".himi", "shots", `${screenId}.png`);
|
|
179313
179414
|
const pngTarget = typeof flags.png === "string" ? str9(flags.png) : flags.png === true ? shotPath : void 0;
|
|
179314
179415
|
if (pngTarget && r2.pngBase64) {
|
|
179315
179416
|
pngFile = writePngFile(pngTarget, r2.pngBase64);
|
|
@@ -179681,7 +179782,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
179681
179782
|
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
179783
|
return 1;
|
|
179683
179784
|
}
|
|
179684
|
-
if (replace && occupied && !existsSync80(
|
|
179785
|
+
if (replace && occupied && !existsSync80(join82(dest, "himalaya.content.json"))) {
|
|
179685
179786
|
io2.error(JSON.stringify({
|
|
179686
179787
|
error: `${dest} is not a content package \u2014 refusing to --replace it`,
|
|
179687
179788
|
hint: "--replace only clears a directory that holds himalaya.content.json. Check --out/--name, or pass --force to merge into it instead."
|
|
@@ -180389,7 +180490,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180389
180490
|
}
|
|
180390
180491
|
const { buildContentForValidation: buildContentForValidation2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
180391
180492
|
const bres = await buildContentForValidation2(dir, { resolution: resolutionFlag(flags) });
|
|
180392
|
-
const built = mkdtempSync5(
|
|
180493
|
+
const built = mkdtempSync5(join82(tmpdir6(), "himi-pack-"));
|
|
180393
180494
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
180394
180495
|
const outcome = await buildReleaseFromContent2(dir, built, {
|
|
180395
180496
|
...hasWorkers ? { tier5Dir: bundleOutDir2(dir) } : {},
|
|
@@ -180596,7 +180697,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180596
180697
|
}));
|
|
180597
180698
|
return 1;
|
|
180598
180699
|
}
|
|
180599
|
-
const archive =
|
|
180700
|
+
const archive = readFileSync98(resolve60(file2));
|
|
180600
180701
|
const result = await client2().createPackageShare({
|
|
180601
180702
|
app: opened.header.app,
|
|
180602
180703
|
releaseId: opened.header.releaseId,
|
|
@@ -180693,11 +180794,11 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180693
180794
|
const app = await appId(dir2);
|
|
180694
180795
|
const { buildContentBundles: buildContentBundles2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
180695
180796
|
const bres = await buildContentBundles2(dir2, { resolution: resolutionFlag(flags) });
|
|
180696
|
-
temp = mkdtempSync5(
|
|
180797
|
+
temp = mkdtempSync5(join82(tmpdir6(), "himi-run-build-"));
|
|
180697
180798
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
180698
180799
|
const initial = await buildReleaseFromContent2(dir2, temp, { ...hasWorkers ? { tier5Dir: bundleOutDir2(dir2) } : {} });
|
|
180699
180800
|
servedMissing = initial.missingBundles;
|
|
180700
|
-
source =
|
|
180801
|
+
source = join82(temp, app);
|
|
180701
180802
|
}
|
|
180702
180803
|
const chromeArg = str9(flags.chrome) ?? "preview";
|
|
180703
180804
|
if (chromeArg !== "preview" && chromeArg !== "app") {
|
|
@@ -180736,7 +180837,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180736
180837
|
if (!recordKit) return;
|
|
180737
180838
|
startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
180738
180839
|
const failure = record2(served2, { ok: true, at: startedAt });
|
|
180739
|
-
if (!recorded) io2.error(JSON.stringify({ run: "run_record_skipped", message: `${failure ?? `${
|
|
180840
|
+
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
180841
|
await refreshBoard();
|
|
180741
180842
|
};
|
|
180742
180843
|
const retract = async () => {
|
|
@@ -180772,7 +180873,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180772
180873
|
const watchKit = watch2 ? await Promise.resolve().then(() => (init_run_watch(), run_watch_exports)) : null;
|
|
180773
180874
|
const hhpPreviewRoute = watch2 ? (await Promise.resolve().then(() => (init_hhp_preview(), hhp_preview_exports))).hhpPreviewResponse : null;
|
|
180774
180875
|
const bus = watchKit ? new watchKit.ReloadBus() : void 0;
|
|
180775
|
-
if (watch2) served = mkdtempSync5(
|
|
180876
|
+
if (watch2) served = mkdtempSync5(join82(tmpdir6(), "himi-run-served-"));
|
|
180776
180877
|
const running = await runPackage2(source, {
|
|
180777
180878
|
port,
|
|
180778
180879
|
chrome: chromeArg,
|
|
@@ -180801,8 +180902,8 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180801
180902
|
await announce(running);
|
|
180802
180903
|
if (watchKit && bus) {
|
|
180803
180904
|
const { buildContentBundles: buildContentBundles2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
180804
|
-
const live3 =
|
|
180805
|
-
const manifestOf = (tree) => JSON.parse(
|
|
180905
|
+
const live3 = join82(running.releaseRoot, running.app);
|
|
180906
|
+
const manifestOf = (tree) => JSON.parse(readFileSync98(join82(tree, "release-manifest.json"), "utf8"));
|
|
180806
180907
|
let current = manifestOf(live3);
|
|
180807
180908
|
const failed3 = async (message) => {
|
|
180808
180909
|
if (stopping) return;
|
|
@@ -180813,7 +180914,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180813
180914
|
};
|
|
180814
180915
|
rebuild = watchKit.serialize(async () => {
|
|
180815
180916
|
const t0 = Date.now();
|
|
180816
|
-
const next = mkdtempSync5(
|
|
180917
|
+
const next = mkdtempSync5(join82(tmpdir6(), "himi-run-build-"));
|
|
180817
180918
|
try {
|
|
180818
180919
|
const bres = await buildContentBundles2(dir, { resolution: resolutionFlag(flags) });
|
|
180819
180920
|
if (bres.compileErrors.length) {
|
|
@@ -180830,16 +180931,16 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180830
180931
|
return;
|
|
180831
180932
|
}
|
|
180832
180933
|
if (stopping) return;
|
|
180833
|
-
const fresh = manifestOf(
|
|
180934
|
+
const fresh = manifestOf(join82(next, running.app));
|
|
180834
180935
|
const diff = watchKit.diffReleases(current, fresh);
|
|
180835
180936
|
const { describeChanges: describeChanges2, headline: headline2 } = await Promise.resolve().then(() => (init_build_changes(), build_changes_exports));
|
|
180836
|
-
const changes = describeChanges2(live3,
|
|
180937
|
+
const changes = describeChanges2(live3, join82(next, running.app), diff);
|
|
180837
180938
|
const retired = `${live3}.retired-${Date.now()}`;
|
|
180838
180939
|
renameSync12(live3, retired);
|
|
180839
180940
|
try {
|
|
180840
|
-
renameSync12(
|
|
180941
|
+
renameSync12(join82(next, running.app), live3);
|
|
180841
180942
|
} catch {
|
|
180842
|
-
cpSync3(
|
|
180943
|
+
cpSync3(join82(next, running.app), live3, { recursive: true });
|
|
180843
180944
|
}
|
|
180844
180945
|
rmSync22(retired, { recursive: true, force: true });
|
|
180845
180946
|
current = fresh;
|
|
@@ -181522,7 +181623,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181522
181623
|
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
181624
|
};
|
|
181524
181625
|
if (kind === "tokens" || kind === "app-config") {
|
|
181525
|
-
const body =
|
|
181626
|
+
const body = readFileSync98(file2, "utf8");
|
|
181526
181627
|
const patch2 = kind === "tokens" ? { tokens: body } : { appConfig: body };
|
|
181527
181628
|
return runReleasePatch({
|
|
181528
181629
|
...common,
|
|
@@ -181537,7 +181638,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181537
181638
|
io2.error(JSON.stringify({ error: "patch screen needs a <screenId>", usage: PATCH_USAGE }));
|
|
181538
181639
|
return 2;
|
|
181539
181640
|
}
|
|
181540
|
-
const descriptor =
|
|
181641
|
+
const descriptor = readFileSync98(file2, "utf8");
|
|
181541
181642
|
try {
|
|
181542
181643
|
JSON.parse(descriptor);
|
|
181543
181644
|
} catch (e2) {
|
|
@@ -181577,7 +181678,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181577
181678
|
extra: { kind, screen: id, file: { path: file2, bytes: Buffer.byteLength(descriptor, "utf8") } }
|
|
181578
181679
|
});
|
|
181579
181680
|
}
|
|
181580
|
-
const bytes2 =
|
|
181681
|
+
const bytes2 = readFileSync98(file2);
|
|
181581
181682
|
const sha2 = createHash41("sha256").update(bytes2).digest("hex");
|
|
181582
181683
|
const forScreens = (str9(flags["for-screen"]) ?? "").split(",").map((s2) => s2.trim()).filter(Boolean);
|
|
181583
181684
|
if (flags["no-rebind"] !== void 0 && flags["no-rebind"] !== true) {
|
|
@@ -181721,7 +181822,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181721
181822
|
}
|
|
181722
181823
|
let def;
|
|
181723
181824
|
try {
|
|
181724
|
-
const parsed = JSON.parse(arg.startsWith("@") ?
|
|
181825
|
+
const parsed = JSON.parse(arg.startsWith("@") ? readFileSync98(arg.slice(1), "utf8") : arg);
|
|
181725
181826
|
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
181726
181827
|
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
181828
|
return 2;
|
|
@@ -182003,7 +182104,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
182003
182104
|
const rememberLastDist = async (jobs2) => {
|
|
182004
182105
|
try {
|
|
182005
182106
|
const dir = contentDir(flags);
|
|
182006
|
-
if (!existsSync80(
|
|
182107
|
+
if (!existsSync80(join82(dir, "himalaya.content.json"))) return;
|
|
182007
182108
|
const { lastDistFromJob: lastDistFromJob2, writeLastDist: writeLastDist2 } = await Promise.resolve().then(() => (init_capabilities(), capabilities_exports));
|
|
182008
182109
|
const own4 = await appId(dir);
|
|
182009
182110
|
for (const job of jobs2) {
|
|
@@ -182241,7 +182342,7 @@ ${label2}`);
|
|
|
182241
182342
|
const platform = str9(flags.platform)?.split(",").map((p2) => p2.trim()).filter(Boolean);
|
|
182242
182343
|
{
|
|
182243
182344
|
const distDir = contentDir(flags);
|
|
182244
|
-
if (existsSync80(
|
|
182345
|
+
if (existsSync80(join82(distDir, "himalaya.content.json"))) {
|
|
182245
182346
|
const issues = await iconIssues(distDir, flags.strict === true, { requireDeclared: true, requireVerified: true });
|
|
182246
182347
|
const errors = issues.filter((i2) => i2.severity === "error");
|
|
182247
182348
|
for (const i2 of issues.filter((i3) => i3.severity === "warning")) {
|
|
@@ -182580,7 +182681,7 @@ ${label2}`);
|
|
|
182580
182681
|
const dpxPath = dpxSessionTokenPath();
|
|
182581
182682
|
let dpx;
|
|
182582
182683
|
try {
|
|
182583
|
-
dpx =
|
|
182684
|
+
dpx = readFileSync98(dpxPath, "utf8").trim();
|
|
182584
182685
|
} catch {
|
|
182585
182686
|
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
182687
|
return 1;
|
|
@@ -183001,7 +183102,7 @@ ${report3.ok ? "OK \u2014 data + serve plane reachable." : typeof report3.hint =
|
|
|
183001
183102
|
const path2 = dpxSessionTokenPath();
|
|
183002
183103
|
let raw;
|
|
183003
183104
|
try {
|
|
183004
|
-
raw =
|
|
183105
|
+
raw = readFileSync98(path2, "utf8");
|
|
183005
183106
|
} catch {
|
|
183006
183107
|
io2.error(JSON.stringify({ error: `no DPX BO session at ${path2}` }));
|
|
183007
183108
|
return 1;
|