@wix/himalaya-cli 0.1317.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 +475 -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;
|
|
@@ -7586,6 +7589,7 @@ function resolveTranslation(value, catalog3, sourceCatalog) {
|
|
|
7586
7589
|
var BINDING_SIGILS, BINDING_SIGIL_RE, TRANSLATION_PREFIX, TRANSLATION_KEY_RE;
|
|
7587
7590
|
var init_bindings = __esm({
|
|
7588
7591
|
"../../core/ts/src/bindings.ts"() {
|
|
7592
|
+
"use strict";
|
|
7589
7593
|
BINDING_SIGILS = ["service", "flag", "item", "t"];
|
|
7590
7594
|
BINDING_SIGIL_RE = new RegExp(
|
|
7591
7595
|
`^\\$(?:${BINDING_SIGILS.filter((s2) => s2 !== "t").join("|")})\\b|^\\$t:`
|
|
@@ -13417,6 +13421,7 @@ var init_player_host_manifest = __esm({
|
|
|
13417
13421
|
"speaker_diarization",
|
|
13418
13422
|
"speech",
|
|
13419
13423
|
"stream",
|
|
13424
|
+
"theme",
|
|
13420
13425
|
"ui",
|
|
13421
13426
|
"wix_api",
|
|
13422
13427
|
"wix_cashier",
|
|
@@ -20103,7 +20108,7 @@ var init_catalog_cache = __esm({
|
|
|
20103
20108
|
this.save({ ...before, latestAvailable, latestCompatible });
|
|
20104
20109
|
fail(
|
|
20105
20110
|
"catalog_incompatible",
|
|
20106
|
-
"requested kit is absent/incompatible; keep installed kit and inspect himi docs status"
|
|
20111
|
+
"requested kit is absent/incompatible; keep installed kit and inspect himi docs status, or refresh --unpin to follow the current catalog"
|
|
20107
20112
|
);
|
|
20108
20113
|
}
|
|
20109
20114
|
const manifestBytes = await this.download(
|
|
@@ -20698,6 +20703,14 @@ var init_native_requirements = __esm({
|
|
|
20698
20703
|
]
|
|
20699
20704
|
}
|
|
20700
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
|
+
},
|
|
20701
20714
|
presigned_upload: {
|
|
20702
20715
|
// No OS permission and no new native dependency: an HTTPS request on a
|
|
20703
20716
|
// credential-free URLSession / HttpURLConnection. INTERNET is already implied by
|
|
@@ -21461,6 +21474,7 @@ var init_builtins = __esm({
|
|
|
21461
21474
|
"speech",
|
|
21462
21475
|
"system_intents",
|
|
21463
21476
|
"tasks",
|
|
21477
|
+
"theme",
|
|
21464
21478
|
"wix_cashier",
|
|
21465
21479
|
"wix_platform"
|
|
21466
21480
|
];
|
|
@@ -27289,6 +27303,7 @@ var init_capabilities_generated = __esm({
|
|
|
27289
27303
|
"speech": ["availability", "recognizeOnce", "speak", "stop", "streamNext", "streamStart", "streamStop", "transcribeFile"],
|
|
27290
27304
|
"system_intents": ["donate", "refreshShortcuts"],
|
|
27291
27305
|
"tasks": ["backend", "create", "getPermissionStatus", "list", "remove", "requestPermission", "setCompleted"],
|
|
27306
|
+
"theme": ["applyOverlay", "clearOverlay", "surfaces"],
|
|
27292
27307
|
"ui": ["alert", "snackbar"],
|
|
27293
27308
|
"wix_cashier": ["isAvailable", "proceedToPayment"]
|
|
27294
27309
|
};
|
|
@@ -27332,6 +27347,7 @@ var init_capabilities_generated = __esm({
|
|
|
27332
27347
|
"speech": ["@himalaya/speech"],
|
|
27333
27348
|
"system_intents": ["@himalaya/system-intents"],
|
|
27334
27349
|
"tasks": ["@himalaya/tasks"],
|
|
27350
|
+
"theme": ["@himalaya/theme"],
|
|
27335
27351
|
"ui": ["@himalaya/ui"],
|
|
27336
27352
|
"webview": ["@himalaya/webview"],
|
|
27337
27353
|
"wix_cashier": ["@himalaya/wix-cashier"],
|
|
@@ -27377,15 +27393,15 @@ var init_shell_capabilities_generated = __esm({
|
|
|
27377
27393
|
appDir: "apps/himi-owner-lite",
|
|
27378
27394
|
shared: false,
|
|
27379
27395
|
extensible: true,
|
|
27380
|
-
built: ["app_info", "biometrics", "camera", "clipboard", "live_activity", "local_database", "open_url", "presigned_upload", "push", "secure_storage", "share", "speech", "ui"],
|
|
27381
|
-
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"]
|
|
27382
27398
|
},
|
|
27383
27399
|
"player": {
|
|
27384
27400
|
appDir: "apps/himi-player",
|
|
27385
27401
|
shared: true,
|
|
27386
27402
|
extensible: false,
|
|
27387
27403
|
built: ["animation", "audio_record_background", "biometrics", "calendar", "calls", "camera", "clipboard", "contacts", "haptic", "iap", "location", "media_playback", "motion", "on_device_ai", "photos", "push", "speech"],
|
|
27388
|
-
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"]
|
|
27389
27405
|
}
|
|
27390
27406
|
};
|
|
27391
27407
|
}
|
|
@@ -42291,7 +42307,7 @@ var init_pdf = __esm({
|
|
|
42291
42307
|
var defineProperty = Object.defineProperty;
|
|
42292
42308
|
var stringSlice = uncurryThis("".slice);
|
|
42293
42309
|
var replace = uncurryThis("".replace);
|
|
42294
|
-
var
|
|
42310
|
+
var join83 = uncurryThis([].join);
|
|
42295
42311
|
var CONFIGURABLE_LENGTH = DESCRIPTORS && !fails(function() {
|
|
42296
42312
|
return defineProperty(function() {
|
|
42297
42313
|
}, "length", { value: 8 }).length !== 8;
|
|
@@ -42318,7 +42334,7 @@ var init_pdf = __esm({
|
|
|
42318
42334
|
}
|
|
42319
42335
|
var state = enforceInternalState(value);
|
|
42320
42336
|
if (!hasOwn(state, "source")) {
|
|
42321
|
-
state.source =
|
|
42337
|
+
state.source = join83(TEMPLATE, typeof name == "string" ? name : "");
|
|
42322
42338
|
}
|
|
42323
42339
|
return value;
|
|
42324
42340
|
};
|
|
@@ -44841,7 +44857,7 @@ var init_pdf = __esm({
|
|
|
44841
44857
|
var charAt = uncurryThis("".charAt);
|
|
44842
44858
|
var Uint8Array2 = globalThis2.Uint8Array;
|
|
44843
44859
|
var $Array = globalThis2.Array;
|
|
44844
|
-
var
|
|
44860
|
+
var join83 = uncurryThis([].join);
|
|
44845
44861
|
var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array2 || !Uint8Array2.prototype.toBase64 || !(function() {
|
|
44846
44862
|
try {
|
|
44847
44863
|
var target = new Uint8Array2();
|
|
@@ -44887,7 +44903,7 @@ var init_pdf = __esm({
|
|
|
44887
44903
|
result[written++] = "=";
|
|
44888
44904
|
}
|
|
44889
44905
|
}
|
|
44890
|
-
return
|
|
44906
|
+
return join83(result, "");
|
|
44891
44907
|
}
|
|
44892
44908
|
});
|
|
44893
44909
|
},
|
|
@@ -44899,7 +44915,7 @@ var init_pdf = __esm({
|
|
|
44899
44915
|
var anUint8Array = __webpack_require__3(4154);
|
|
44900
44916
|
var notDetached = __webpack_require__3(5169);
|
|
44901
44917
|
var numberToString2 = uncurryThis(1.1.toString);
|
|
44902
|
-
var
|
|
44918
|
+
var join83 = uncurryThis([].join);
|
|
44903
44919
|
var $Array = Array;
|
|
44904
44920
|
var Uint8Array2 = globalThis2.Uint8Array;
|
|
44905
44921
|
var INCORRECT_BEHAVIOR_OR_DOESNT_EXISTS = !Uint8Array2 || !Uint8Array2.prototype.toHex || !(function() {
|
|
@@ -44919,7 +44935,7 @@ var init_pdf = __esm({
|
|
|
44919
44935
|
var hex2 = numberToString2(this[i2], 16);
|
|
44920
44936
|
result[i2] = hex2.length === 1 ? "0" + hex2 : hex2;
|
|
44921
44937
|
}
|
|
44922
|
-
return
|
|
44938
|
+
return join83(result, "");
|
|
44923
44939
|
}
|
|
44924
44940
|
});
|
|
44925
44941
|
},
|
|
@@ -147707,6 +147723,25 @@ var init_studio_reel = __esm({
|
|
|
147707
147723
|
}
|
|
147708
147724
|
});
|
|
147709
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
|
+
|
|
147710
147745
|
// src/milestones.ts
|
|
147711
147746
|
var milestones_exports = {};
|
|
147712
147747
|
__export(milestones_exports, {
|
|
@@ -147762,20 +147797,9 @@ __export(milestones_exports, {
|
|
|
147762
147797
|
});
|
|
147763
147798
|
import { createHash as createHash32, randomUUID as randomUUID7 } from "node:crypto";
|
|
147764
147799
|
import { spawn as spawn5 } from "node:child_process";
|
|
147765
|
-
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";
|
|
147766
147801
|
import { createServer as createServer4 } from "node:net";
|
|
147767
|
-
import { basename as basename15, dirname as dirname32, isAbsolute as isAbsolute6, join as
|
|
147768
|
-
function homeScreenIdOf(dir) {
|
|
147769
|
-
let src;
|
|
147770
|
-
try {
|
|
147771
|
-
src = readFileSync64(join56(dir, "dev", "index.ts"), "utf8");
|
|
147772
|
-
} catch {
|
|
147773
|
-
return null;
|
|
147774
|
-
}
|
|
147775
|
-
const m2 = /^[ \t]*homeScreenId[ \t]*:[ \t]*(?:"((?:[^"\\\n]|\\.)*)"|'((?:[^'\\\n]|\\.)*)')/m.exec(src);
|
|
147776
|
-
const id = m2 ? m2[1] ?? m2[2] : void 0;
|
|
147777
|
-
return id && /^[A-Za-z0-9_.\-/{}]+$/.test(id) ? id : null;
|
|
147778
|
-
}
|
|
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";
|
|
147779
147803
|
function homeShotPath(dir, home) {
|
|
147780
147804
|
const root = resolve48(dir);
|
|
147781
147805
|
const base = resolve48(root, ".himi", "shots");
|
|
@@ -147886,7 +147910,7 @@ function autoPictureGate(dir) {
|
|
|
147886
147910
|
}
|
|
147887
147911
|
async function homePictureAtValidate(dir, opts) {
|
|
147888
147912
|
if (!opts.ok) return { skipped: "validate found errors, so the picture was left as it is" };
|
|
147889
|
-
if (!existsSync56(
|
|
147913
|
+
if (!existsSync56(join57(dir, "himalaya.content.json"))) return { skipped: "not a content package" };
|
|
147890
147914
|
const env = opts.env ?? process.env;
|
|
147891
147915
|
if (ciSet(env)) return { skipped: "the CI environment variable is set" };
|
|
147892
147916
|
if (env.NODE_TEST_CONTEXT) return { skipped: "running under `node --test`" };
|
|
@@ -148110,16 +148134,16 @@ function rememberDraft(dir, releaseId, m2) {
|
|
|
148110
148134
|
...m2.tokensHash ? { tokensHash: m2.tokensHash } : {},
|
|
148111
148135
|
...m2.appConfigHash ? { appConfigHash: m2.appConfigHash } : {}
|
|
148112
148136
|
};
|
|
148113
|
-
writeFileAtomic(
|
|
148137
|
+
writeFileAtomic(join57(dir, LAST_DRAFT_FILE), `${JSON.stringify({ v: 1, releaseId, manifest })}
|
|
148114
148138
|
`);
|
|
148115
148139
|
} catch {
|
|
148116
148140
|
}
|
|
148117
148141
|
}
|
|
148118
148142
|
function lastDraft(dir) {
|
|
148119
148143
|
try {
|
|
148120
|
-
const file2 =
|
|
148144
|
+
const file2 = join57(dir, LAST_DRAFT_FILE);
|
|
148121
148145
|
if (!lstatSync19(file2).isFile()) return null;
|
|
148122
|
-
const r2 = JSON.parse(
|
|
148146
|
+
const r2 = JSON.parse(readFileSync65(file2, "utf8"));
|
|
148123
148147
|
const m2 = r2.manifest;
|
|
148124
148148
|
if (r2.v !== 1 || typeof r2.releaseId !== "string" || !m2 || typeof m2.screens !== "object" || !m2.screens || typeof m2.bundles !== "object" || !m2.bundles) return null;
|
|
148125
148149
|
return { releaseId: r2.releaseId, manifest: m2 };
|
|
@@ -148170,7 +148194,7 @@ function recordInitSource(dir, opts = {}) {
|
|
|
148170
148194
|
template: opts.template && TEMPLATE_NAME.test(opts.template) ? opts.template : null,
|
|
148171
148195
|
...opts.source ? { source: opts.source } : {}
|
|
148172
148196
|
};
|
|
148173
|
-
writeFileAtomic(
|
|
148197
|
+
writeFileAtomic(join57(dir, INIT_SOURCE_FILE), `${JSON.stringify(record2, null, 2)}
|
|
148174
148198
|
`);
|
|
148175
148199
|
return true;
|
|
148176
148200
|
} catch {
|
|
@@ -148178,10 +148202,10 @@ function recordInitSource(dir, opts = {}) {
|
|
|
148178
148202
|
}
|
|
148179
148203
|
}
|
|
148180
148204
|
function readInitSource(dir) {
|
|
148181
|
-
const file2 =
|
|
148205
|
+
const file2 = join57(dir, INIT_SOURCE_FILE);
|
|
148182
148206
|
try {
|
|
148183
148207
|
if (!lstatSync19(file2).isFile()) return null;
|
|
148184
|
-
const r2 = JSON.parse(
|
|
148208
|
+
const r2 = JSON.parse(readFileSync65(file2, "utf8"));
|
|
148185
148209
|
if (r2.v !== 1 || typeof r2.fingerprint !== "string" || !/^[0-9a-f]{64}$/.test(r2.fingerprint) || typeof r2.newestMs !== "number") return null;
|
|
148186
148210
|
return {
|
|
148187
148211
|
v: 1,
|
|
@@ -148250,10 +148274,10 @@ function homeShotForPostcard(dir, opts = {}) {
|
|
|
148250
148274
|
function contentHomePictures(dir, home) {
|
|
148251
148275
|
const out2 = [];
|
|
148252
148276
|
const shot = homeShotPath(dir, home);
|
|
148253
|
-
const hist = realDirIn(dir, HISTORY_DIR) ?
|
|
148277
|
+
const hist = realDirIn(dir, HISTORY_DIR) ? join57(dir, HISTORY_DIR) : null;
|
|
148254
148278
|
for (const r2 of recordedShots(dir, home)) {
|
|
148255
148279
|
if (r2.state.state !== "content") continue;
|
|
148256
|
-
for (const file2 of [shot, hist &&
|
|
148280
|
+
for (const file2 of [shot, hist && join57(hist, `${r2.sha256}.png`)]) {
|
|
148257
148281
|
try {
|
|
148258
148282
|
if (!file2 || !lstatSync19(file2).isFile() || sha256Of2(file2) !== r2.sha256) continue;
|
|
148259
148283
|
} catch {
|
|
@@ -148266,10 +148290,10 @@ function contentHomePictures(dir, home) {
|
|
|
148266
148290
|
return out2;
|
|
148267
148291
|
}
|
|
148268
148292
|
function readInitWatch(dir) {
|
|
148269
|
-
const file2 =
|
|
148293
|
+
const file2 = join57(dir, INIT_WATCH_FILE);
|
|
148270
148294
|
try {
|
|
148271
148295
|
if (!lstatSync19(file2).isFile()) return null;
|
|
148272
|
-
const r2 = JSON.parse(
|
|
148296
|
+
const r2 = JSON.parse(readFileSync65(file2, "utf8"));
|
|
148273
148297
|
if (r2.v !== 1 || typeof r2.pid !== "number" || !Number.isInteger(r2.pid) || r2.pid < 1) return null;
|
|
148274
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;
|
|
148275
148299
|
if (r2.root !== runRootId(dir)) return null;
|
|
@@ -148294,14 +148318,14 @@ function liveWatchRunning(dir, isAlive = pidAlive, now) {
|
|
|
148294
148318
|
}
|
|
148295
148319
|
function watchReminder(dir, opts = {}) {
|
|
148296
148320
|
try {
|
|
148297
|
-
if (!existsSync56(
|
|
148321
|
+
if (!existsSync56(join57(dir, "himalaya.content.json"))) return void 0;
|
|
148298
148322
|
const nowDate = opts.now ?? /* @__PURE__ */ new Date();
|
|
148299
148323
|
const live3 = liveWatch(dir, opts.isAlive, nowDate);
|
|
148300
148324
|
const now = nowDate.getTime();
|
|
148301
|
-
const file2 =
|
|
148325
|
+
const file2 = join57(dir, REMINDERS_FILE);
|
|
148302
148326
|
let last = Number.NaN;
|
|
148303
148327
|
try {
|
|
148304
|
-
if (lstatSync19(file2).isFile()) last = Date.parse(JSON.parse(
|
|
148328
|
+
if (lstatSync19(file2).isFile()) last = Date.parse(JSON.parse(readFileSync65(file2, "utf8")).watch ?? "");
|
|
148305
148329
|
} catch {
|
|
148306
148330
|
}
|
|
148307
148331
|
if (Number.isFinite(last) && now - last >= 0 && now - last < WATCH_REMINDER_EVERY_MS) return void 0;
|
|
@@ -148313,7 +148337,7 @@ function watchReminder(dir, opts = {}) {
|
|
|
148313
148337
|
}
|
|
148314
148338
|
const content = opts.content ?? displayPath(dir);
|
|
148315
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, " : "";
|
|
148316
|
-
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`;
|
|
148317
148341
|
} catch {
|
|
148318
148342
|
return void 0;
|
|
148319
148343
|
}
|
|
@@ -148379,7 +148403,7 @@ async function startWatchAtInit(dir, opts) {
|
|
|
148379
148403
|
child.unref();
|
|
148380
148404
|
if (!child.pid) return { skipped: "the live preview did not start (no process) \u2014 start it yourself: `himi run --watch --content <dir> &`", ...note };
|
|
148381
148405
|
const record2 = { v: 1, pid: child.pid, root: runRootId(dir), url, board, log: WATCH_LOG, startedAt: now.toISOString() };
|
|
148382
|
-
if (realDirIn(dir, ".himi")) writeFileAtomic(
|
|
148406
|
+
if (realDirIn(dir, ".himi")) writeFileAtomic(join57(dir, INIT_WATCH_FILE), `${JSON.stringify(record2, null, 2)}
|
|
148383
148407
|
`);
|
|
148384
148408
|
return { started: true, pid: child.pid, url, board, log: WATCH_LOG, ...note };
|
|
148385
148409
|
} catch (e2) {
|
|
@@ -148394,7 +148418,7 @@ function watchRunning(w2) {
|
|
|
148394
148418
|
function doNowBlock(opts) {
|
|
148395
148419
|
const content = displayPath(opts.dir, opts.cwd);
|
|
148396
148420
|
const home = opts.home ?? "<homeScreenId>";
|
|
148397
|
-
const board =
|
|
148421
|
+
const board = join57(content, ".himi", "studio", "index.html");
|
|
148398
148422
|
const running = watchRunning(opts.watch);
|
|
148399
148423
|
const who = running?.by === "init" ? "init started it" : "already running";
|
|
148400
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)`;
|
|
@@ -148413,7 +148437,7 @@ function writeHandoverReel(dir) {
|
|
|
148413
148437
|
try {
|
|
148414
148438
|
if (!realDirIn(dir, ".himi")) return { skipped: ".himi is not a real directory inside the package (a symlink?), so no making-of was written" };
|
|
148415
148439
|
const { html } = buildReel(dir);
|
|
148416
|
-
const file2 =
|
|
148440
|
+
const file2 = join57(dir, ".himi", "making-of.html");
|
|
148417
148441
|
writeFileAtomic(file2, html);
|
|
148418
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` };
|
|
148419
148443
|
} catch (e2) {
|
|
@@ -148421,11 +148445,11 @@ function writeHandoverReel(dir) {
|
|
|
148421
148445
|
}
|
|
148422
148446
|
}
|
|
148423
148447
|
function afterHandoverPostcard(dir, opts = {}) {
|
|
148424
|
-
const file2 =
|
|
148448
|
+
const file2 = join57(dir, ".himi", "making-of.html");
|
|
148425
148449
|
let fresh = false;
|
|
148426
148450
|
try {
|
|
148427
148451
|
const st2 = lstatSync19(file2);
|
|
148428
|
-
fresh = st2.isFile() && !st2.isSymbolicLink() && st2.mtimeMs >= statSync15(
|
|
148452
|
+
fresh = st2.isFile() && !st2.isSymbolicLink() && st2.mtimeMs >= statSync15(join57(dir, ".himi", "progress.jsonl")).mtimeMs;
|
|
148429
148453
|
} catch {
|
|
148430
148454
|
fresh = false;
|
|
148431
148455
|
}
|
|
@@ -148444,6 +148468,7 @@ var init_milestones = __esm({
|
|
|
148444
148468
|
init_screen_state();
|
|
148445
148469
|
init_shell_quote();
|
|
148446
148470
|
init_studio_reel();
|
|
148471
|
+
init_home_screen_id();
|
|
148447
148472
|
contentArg = (content) => content ? ` --content ${shellQuote(content)}` : "";
|
|
148448
148473
|
CONSENT_PREFLIGHT = "Consent preflight before a template preview";
|
|
148449
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`;
|
|
@@ -148456,13 +148481,13 @@ var init_milestones = __esm({
|
|
|
148456
148481
|
STILL_BUILDING_MESSAGE = "Still building: here's the home screen now.";
|
|
148457
148482
|
yourFirstLookMessage = (dir) => `First look at your app: ${appName(dir)}'s home screen, with your changes.`;
|
|
148458
148483
|
homeCaveat = (dir, image) => homeStateCaveat(shotStateFor(dir, image));
|
|
148459
|
-
LAST_DRAFT_FILE =
|
|
148460
|
-
INIT_SOURCE_FILE =
|
|
148484
|
+
LAST_DRAFT_FILE = join57(".himi", "last-draft.json");
|
|
148485
|
+
INIT_SOURCE_FILE = join57(".himi", "init-source.json");
|
|
148461
148486
|
STARTING_POINT_REF = "starting-point";
|
|
148462
148487
|
TEMPLATE_NAME = /^[A-Za-z0-9._-]{1,64}$/;
|
|
148463
|
-
sha256Of2 = (file2) => createHash32("sha256").update(
|
|
148488
|
+
sha256Of2 = (file2) => createHash32("sha256").update(readFileSync65(file2)).digest("hex");
|
|
148464
148489
|
WATCH_REMINDER_EVERY_MS = 10 * 60 * 1e3;
|
|
148465
|
-
REMINDERS_FILE =
|
|
148490
|
+
REMINDERS_FILE = join57(".himi", "reminders.json");
|
|
148466
148491
|
pidAlive = (pid) => {
|
|
148467
148492
|
try {
|
|
148468
148493
|
process.kill(pid, 0);
|
|
@@ -148471,7 +148496,7 @@ var init_milestones = __esm({
|
|
|
148471
148496
|
return e2.code === "EPERM";
|
|
148472
148497
|
}
|
|
148473
148498
|
};
|
|
148474
|
-
INIT_WATCH_FILE =
|
|
148499
|
+
INIT_WATCH_FILE = join57(".himi", "watch.json");
|
|
148475
148500
|
INIT_WATCH_STARTING_MS = 5 * 60 * 1e3;
|
|
148476
148501
|
INIT_WATCH_IDLE_MINUTES = 30;
|
|
148477
148502
|
WATCH_LOG = ".himi/watch.log";
|
|
@@ -148507,8 +148532,8 @@ __export(template_sweep_exports, {
|
|
|
148507
148532
|
sweepCopy: () => sweepCopy,
|
|
148508
148533
|
sweepPairs: () => sweepPairs
|
|
148509
148534
|
});
|
|
148510
|
-
import { readFileSync as
|
|
148511
|
-
import { join as
|
|
148535
|
+
import { readFileSync as readFileSync66, writeFileSync as writeFileSync24 } from "node:fs";
|
|
148536
|
+
import { join as join58 } from "node:path";
|
|
148512
148537
|
import ts7 from "typescript";
|
|
148513
148538
|
function isCopy(node, file2) {
|
|
148514
148539
|
const parent = node.parent;
|
|
@@ -148549,7 +148574,7 @@ function sweepCopy(dir, pairs, dryRun) {
|
|
|
148549
148574
|
const next = /* @__PURE__ */ new Map();
|
|
148550
148575
|
const replaced = pairs.map(([from, to2]) => ({ from, to: to2, files: {} }));
|
|
148551
148576
|
for (const f2 of files) {
|
|
148552
|
-
const text9 =
|
|
148577
|
+
const text9 = readFileSync66(join58(dir, f2), "utf8");
|
|
148553
148578
|
if (!pairs.some(([from]) => text9.includes(from) || text9.includes(JSON.stringify(from).slice(1, -1)))) continue;
|
|
148554
148579
|
const kind = f2.endsWith(".json") ? ts7.ScriptKind.JSON : f2.endsWith("x") ? ts7.ScriptKind.TSX : ts7.ScriptKind.TS;
|
|
148555
148580
|
const sf2 = ts7.createSourceFile(f2, text9, ts7.ScriptTarget.Latest, true, kind);
|
|
@@ -148578,16 +148603,16 @@ function sweepCopy(dir, pairs, dryRun) {
|
|
|
148578
148603
|
if (errors.length) throw new TrimRefusal(`the sweep would break ${f2} \u2014 nothing written: ${errors[0]}`);
|
|
148579
148604
|
next.set(f2, out2);
|
|
148580
148605
|
}
|
|
148581
|
-
const dev = next.get("dev/index.ts") ??
|
|
148582
|
-
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");
|
|
148583
148608
|
try {
|
|
148584
148609
|
parseApp(dev, config);
|
|
148585
148610
|
} catch (e2) {
|
|
148586
148611
|
throw new TrimRefusal(`the sweep would leave dev/index.ts or config.ts unparseable \u2014 nothing written: ${e2.message}`);
|
|
148587
148612
|
}
|
|
148588
|
-
if (!dryRun) for (const [f2, t2] of next) writeFileSync24(
|
|
148613
|
+
if (!dryRun) for (const [f2, t2] of next) writeFileSync24(join58(dir, f2), t2);
|
|
148589
148614
|
const g2 = new RegExp(PLACEHOLDER.source, `${PLACEHOLDER.flags.replace("g", "")}g`);
|
|
148590
|
-
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);
|
|
148591
148616
|
return {
|
|
148592
148617
|
ok: true,
|
|
148593
148618
|
dryRun,
|
|
@@ -148604,7 +148629,7 @@ function sweepPairs(set, mapFile) {
|
|
|
148604
148629
|
pairs.push([s2.slice(0, at2), s2.slice(at2 + 2)]);
|
|
148605
148630
|
}
|
|
148606
148631
|
if (mapFile) {
|
|
148607
|
-
const map = JSON.parse(
|
|
148632
|
+
const map = JSON.parse(readFileSync66(mapFile, "utf8"));
|
|
148608
148633
|
for (const [k2, v2] of Object.entries(map)) {
|
|
148609
148634
|
if (typeof v2 !== "string") throw new TrimRefusal(`--map ${mapFile}: "${k2}" must map to a string`);
|
|
148610
148635
|
pairs.push([k2, v2]);
|
|
@@ -148849,18 +148874,18 @@ __export(template_recommend_exports, {
|
|
|
148849
148874
|
recommendTemplates: () => recommendTemplates,
|
|
148850
148875
|
verticalsFromBook: () => verticalsFromBook
|
|
148851
148876
|
});
|
|
148852
|
-
import { existsSync as existsSync57, readFileSync as
|
|
148853
|
-
import { join as
|
|
148877
|
+
import { existsSync as existsSync57, readFileSync as readFileSync67 } from "node:fs";
|
|
148878
|
+
import { join as join59 } from "node:path";
|
|
148854
148879
|
function verticalsFromBook(path2) {
|
|
148855
|
-
const dir = existsSync57(
|
|
148856
|
-
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");
|
|
148857
148882
|
if (existsSync57(overlay)) {
|
|
148858
|
-
const v2 = JSON.parse(
|
|
148883
|
+
const v2 = JSON.parse(readFileSync67(overlay, "utf8")).installedVerticals;
|
|
148859
148884
|
if (Array.isArray(v2) && v2.length) return v2.filter((x2) => typeof x2 === "string");
|
|
148860
148885
|
}
|
|
148861
|
-
const book =
|
|
148886
|
+
const book = join59(dir, "book.json");
|
|
148862
148887
|
if (existsSync57(book)) {
|
|
148863
|
-
const probes = JSON.parse(
|
|
148888
|
+
const probes = JSON.parse(readFileSync67(book, "utf8")).probes;
|
|
148864
148889
|
if (Array.isArray(probes)) return installedFromProbes(probes);
|
|
148865
148890
|
}
|
|
148866
148891
|
throw new Error(`no book.json / provisioning.overlay.json under ${path2} \u2014 run \`himi site analyze\` first, or pass --verticals`);
|
|
@@ -148920,6 +148945,78 @@ var init_template_recommend = __esm({
|
|
|
148920
148945
|
}
|
|
148921
148946
|
});
|
|
148922
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
|
+
|
|
148923
149020
|
// src/nav-lint.ts
|
|
148924
149021
|
var nav_lint_exports = {};
|
|
148925
149022
|
__export(nav_lint_exports, {
|
|
@@ -149000,6 +149097,10 @@ async function navIssues(dir, strict) {
|
|
|
149000
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(", ")}.`
|
|
149001
149098
|
);
|
|
149002
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
|
+
}
|
|
149003
149104
|
const navKind = nav.navKind;
|
|
149004
149105
|
const effectiveBottomTabs = navKind === void 0 || navKind === "bottomTabs" || typeof navKind !== "string" || !NAV_KINDS.has(navKind);
|
|
149005
149106
|
const declaresOtherChrome = itemCount(nav.drawer) > 0 || itemCount(nav.sidebar) > 0;
|
|
@@ -149112,6 +149213,8 @@ var init_nav_lint = __esm({
|
|
|
149112
149213
|
"src/nav-lint.ts"() {
|
|
149113
149214
|
init_app_config_loader();
|
|
149114
149215
|
init_provisioning_facts();
|
|
149216
|
+
init_nav_slots();
|
|
149217
|
+
init_home_screen_id();
|
|
149115
149218
|
init_wix_push_links();
|
|
149116
149219
|
NAVIGATION_KEYS = /* @__PURE__ */ new Set([
|
|
149117
149220
|
"tabBar",
|
|
@@ -149167,8 +149270,8 @@ __export(eject_exports, {
|
|
|
149167
149270
|
EJECTABLE: () => EJECTABLE,
|
|
149168
149271
|
ejectModule: () => ejectModule
|
|
149169
149272
|
});
|
|
149170
|
-
import { existsSync as existsSync58, mkdirSync as mkdirSync28, readFileSync as
|
|
149171
|
-
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";
|
|
149172
149275
|
function locate(repoRootOrCwd, mod) {
|
|
149173
149276
|
const inRepo = resolve49(repoRootOrCwd, `stdlib/flows/${mod}/src/index.ts`);
|
|
149174
149277
|
if (existsSync58(inRepo)) return { path: inRepo, form: "source" };
|
|
@@ -149197,7 +149300,7 @@ function ejectModule(opts) {
|
|
|
149197
149300
|
};
|
|
149198
149301
|
}
|
|
149199
149302
|
const ext = found.form === "source" ? "ts" : "mjs";
|
|
149200
|
-
const target =
|
|
149303
|
+
const target = join60(contentDir2, "tier5-src", "_ejected", `${mod}.${ext}`);
|
|
149201
149304
|
mkdirSync28(dirname33(target), { recursive: true });
|
|
149202
149305
|
const banner = `// EJECTED from @wix/himalaya/${mod}. This app owns this file now.
|
|
149203
149306
|
//
|
|
@@ -149211,7 +149314,7 @@ function ejectModule(opts) {
|
|
|
149211
149314
|
// gate still applies. Ejecting buys layout and flow, never the floor.
|
|
149212
149315
|
|
|
149213
149316
|
`;
|
|
149214
|
-
const normalized =
|
|
149317
|
+
const normalized = readFileSync68(found.path, "utf8").replace(
|
|
149215
149318
|
/(["'])@himalaya\/([a-z0-9-]+(?:\/[a-z0-9-]+)?)\1/g,
|
|
149216
149319
|
(_m, q2, sub) => `${q2}@wix/himalaya/${sub}${q2}`
|
|
149217
149320
|
);
|
|
@@ -149219,7 +149322,7 @@ function ejectModule(opts) {
|
|
|
149219
149322
|
const rewired = [];
|
|
149220
149323
|
for (const f2 of files) {
|
|
149221
149324
|
if (!existsSync58(f2)) continue;
|
|
149222
|
-
const before =
|
|
149325
|
+
const before = readFileSync68(f2, "utf8");
|
|
149223
149326
|
let after = before;
|
|
149224
149327
|
let rel = relative12(dirname33(f2), target).split(sep16).join("/").replace(/\.tsx?$/, ".js");
|
|
149225
149328
|
if (!rel.startsWith(".")) rel = `./${rel}`;
|
|
@@ -149339,8 +149442,8 @@ var init_app_map = __esm({
|
|
|
149339
149442
|
});
|
|
149340
149443
|
|
|
149341
149444
|
// src/wix-writes.ts
|
|
149342
|
-
import { existsSync as existsSync59, readFileSync as
|
|
149343
|
-
import { join as
|
|
149445
|
+
import { existsSync as existsSync59, readFileSync as readFileSync69 } from "node:fs";
|
|
149446
|
+
import { join as join61 } from "node:path";
|
|
149344
149447
|
function isProvenRead(method, path2) {
|
|
149345
149448
|
if (/[#\x00-\x1F\x7F]/.test(path2)) return false;
|
|
149346
149449
|
const verb = method.toUpperCase();
|
|
@@ -149458,11 +149561,11 @@ function parseDataAccess(text9, from) {
|
|
|
149458
149561
|
}
|
|
149459
149562
|
function readDataAccess(dir) {
|
|
149460
149563
|
for (const name of ["SPEC.md", "MOBILE-UX.md"]) {
|
|
149461
|
-
const p2 =
|
|
149564
|
+
const p2 = join61(dir, name);
|
|
149462
149565
|
if (!existsSync59(p2)) continue;
|
|
149463
149566
|
let text9;
|
|
149464
149567
|
try {
|
|
149465
|
-
text9 =
|
|
149568
|
+
text9 = readFileSync69(p2, "utf8");
|
|
149466
149569
|
} catch {
|
|
149467
149570
|
continue;
|
|
149468
149571
|
}
|
|
@@ -149576,14 +149679,14 @@ __export(test_exports, {
|
|
|
149576
149679
|
scopeDescriptors: () => scopeDescriptors,
|
|
149577
149680
|
writeRecordedMocks: () => writeRecordedMocks
|
|
149578
149681
|
});
|
|
149579
|
-
import { existsSync as existsSync60, mkdirSync as mkdirSync29, readFileSync as
|
|
149580
|
-
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";
|
|
149581
149684
|
function readTestConfig(dir) {
|
|
149582
149685
|
const p2 = resolve50(dir, TEST_CONFIG_FILE);
|
|
149583
149686
|
if (!existsSync60(p2)) return {};
|
|
149584
149687
|
let parsed;
|
|
149585
149688
|
try {
|
|
149586
|
-
parsed = JSON.parse(
|
|
149689
|
+
parsed = JSON.parse(readFileSync70(p2, "utf8"));
|
|
149587
149690
|
} catch (e2) {
|
|
149588
149691
|
throw new Error(`${TEST_CONFIG_FILE} is not valid JSON \u2014 ${e2.message}`);
|
|
149589
149692
|
}
|
|
@@ -149630,7 +149733,7 @@ function readTestConfig(dir) {
|
|
|
149630
149733
|
function readNetRules(path2) {
|
|
149631
149734
|
let parsed;
|
|
149632
149735
|
try {
|
|
149633
|
-
parsed = JSON.parse(
|
|
149736
|
+
parsed = JSON.parse(readFileSync70(path2, "utf8"));
|
|
149634
149737
|
} catch (e2) {
|
|
149635
149738
|
throw new Error(`--net ${path2} could not be read as JSON \u2014 ${e2.message}`);
|
|
149636
149739
|
}
|
|
@@ -149667,7 +149770,7 @@ function readCannedResponses() {
|
|
|
149667
149770
|
];
|
|
149668
149771
|
for (const url of candidates) {
|
|
149669
149772
|
try {
|
|
149670
|
-
const parsed = JSON.parse(
|
|
149773
|
+
const parsed = JSON.parse(readFileSync70(url, "utf8"));
|
|
149671
149774
|
const byKey = {};
|
|
149672
149775
|
for (const [k2, v2] of Object.entries(parsed)) {
|
|
149673
149776
|
if (!k2.startsWith("//")) byKey[k2] = v2;
|
|
@@ -149757,8 +149860,8 @@ function writeRecordedMocks(opts) {
|
|
|
149757
149860
|
mkdir: (p2) => mkdirSync29(p2, { recursive: true }),
|
|
149758
149861
|
write: (p2, s2) => writeFileSync26(p2, s2)
|
|
149759
149862
|
};
|
|
149760
|
-
fs2.mkdir(
|
|
149761
|
-
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");
|
|
149762
149865
|
return { ok: true, rules, to: "dev/net-mocks.json" };
|
|
149763
149866
|
}
|
|
149764
149867
|
function scopeDescriptors(descriptors, requestedIds, invalidScreens) {
|
|
@@ -150304,14 +150407,14 @@ var mobile_ux_lint_exports = {};
|
|
|
150304
150407
|
__export(mobile_ux_lint_exports, {
|
|
150305
150408
|
mobileUxIssues: () => mobileUxIssues
|
|
150306
150409
|
});
|
|
150307
|
-
import { existsSync as existsSync61, readFileSync as
|
|
150308
|
-
import { join as
|
|
150410
|
+
import { existsSync as existsSync61, readFileSync as readFileSync71 } from "node:fs";
|
|
150411
|
+
import { join as join63 } from "node:path";
|
|
150309
150412
|
function mobileUxIssues(dir, strict) {
|
|
150310
|
-
const file2 =
|
|
150413
|
+
const file2 = join63(dir, "MOBILE-UX.md");
|
|
150311
150414
|
if (!existsSync61(file2)) return [];
|
|
150312
150415
|
let text9;
|
|
150313
150416
|
try {
|
|
150314
|
-
text9 =
|
|
150417
|
+
text9 = readFileSync71(file2, "utf8");
|
|
150315
150418
|
} catch {
|
|
150316
150419
|
return [];
|
|
150317
150420
|
}
|
|
@@ -151992,8 +152095,8 @@ __export(functions_exports, {
|
|
|
151992
152095
|
resolveFunctionsTarget: () => resolveFunctionsTarget,
|
|
151993
152096
|
runRemoteFunctionOperation: () => runRemoteFunctionOperation
|
|
151994
152097
|
});
|
|
151995
|
-
import { readFileSync as
|
|
151996
|
-
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";
|
|
151997
152100
|
function resolveFunctionsTarget(input) {
|
|
151998
152101
|
const explicitUrl = input.functionsUrl?.trim();
|
|
151999
152102
|
if (explicitUrl) return { mode: "remote", baseUrl: explicitUrl };
|
|
@@ -152012,9 +152115,9 @@ async function loadFunctionsApp(dir) {
|
|
|
152012
152115
|
}
|
|
152013
152116
|
const sources = {};
|
|
152014
152117
|
for (const definition of config.functions.functions) {
|
|
152015
|
-
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);
|
|
152016
152119
|
if (!source) throw new Error(`missing source for function ${definition.name}; expected functions/${definition.name}.ts`);
|
|
152017
|
-
sources[definition.name] =
|
|
152120
|
+
sources[definition.name] = readFileSync72(source, "utf8");
|
|
152018
152121
|
}
|
|
152019
152122
|
const data = config.cms || config.data ? mergeDataResources(config) : void 0;
|
|
152020
152123
|
const dataErrors = validateDataResources(data, loaded.name).filter((issue2) => issue2.severity === "error");
|
|
@@ -152202,9 +152305,9 @@ var init_cli_bridge = __esm({
|
|
|
152202
152305
|
});
|
|
152203
152306
|
|
|
152204
152307
|
// src/mcp/file-tools.ts
|
|
152205
|
-
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";
|
|
152206
152309
|
import { randomBytes as randomBytes4 } from "node:crypto";
|
|
152207
|
-
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";
|
|
152208
152311
|
import * as z2 from "zod";
|
|
152209
152312
|
function within(root, p2) {
|
|
152210
152313
|
return p2 === root || p2.startsWith(root.endsWith(sep17) ? root : root + sep17);
|
|
@@ -152218,12 +152321,12 @@ function realish(p2) {
|
|
|
152218
152321
|
tail.unshift(cur.slice(up.length + (up.endsWith(sep17) ? 0 : 1)));
|
|
152219
152322
|
cur = up;
|
|
152220
152323
|
}
|
|
152221
|
-
return
|
|
152324
|
+
return join65(realpathSync10(cur), ...tail);
|
|
152222
152325
|
}
|
|
152223
152326
|
function symlinkComponent(base, abs) {
|
|
152224
152327
|
let cur = base;
|
|
152225
152328
|
for (const part of relative13(base, abs).split(sep17).filter(Boolean)) {
|
|
152226
|
-
cur =
|
|
152329
|
+
cur = join65(cur, part);
|
|
152227
152330
|
try {
|
|
152228
152331
|
if (lstatSync20(cur).isSymbolicLink()) return relative13(base, cur);
|
|
152229
152332
|
} catch {
|
|
@@ -152250,7 +152353,7 @@ async function confinedAppDir(args, deps) {
|
|
|
152250
152353
|
if (link) return refuse5("outside_workspace", `"${link}" is a symlink \u2014 the app folder must be a real folder in the workspace`);
|
|
152251
152354
|
const rel = relative13(root, dir);
|
|
152252
152355
|
if (rel && (isDeniedSourcePath(`${rel}/x`) || isDeniedSourcePath(`${rel.toLowerCase()}/x`))) return refuse5("denied", `"${rel}" is a folder this tool does not touch`);
|
|
152253
|
-
if (!existsSync63(
|
|
152356
|
+
if (!existsSync63(join65(dir, CONTENT_MARKER))) {
|
|
152254
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`);
|
|
152255
152358
|
}
|
|
152256
152359
|
return dir;
|
|
@@ -152264,7 +152367,7 @@ function onDiskSpelling(abs) {
|
|
|
152264
152367
|
tail.unshift(cur.slice(up.length + (up.endsWith(sep17) ? 0 : 1)));
|
|
152265
152368
|
cur = up;
|
|
152266
152369
|
}
|
|
152267
|
-
return
|
|
152370
|
+
return join65(realpathSync10.native(cur), ...tail);
|
|
152268
152371
|
}
|
|
152269
152372
|
function denied(appDir3, abs) {
|
|
152270
152373
|
const rel = relative13(appDir3, abs);
|
|
@@ -152293,7 +152396,7 @@ function writeNoFollow2(appDir3, abs, content) {
|
|
|
152293
152396
|
mkdirSync30(dirname34(abs), { recursive: true });
|
|
152294
152397
|
const before = symlinkComponent(appDir3, abs);
|
|
152295
152398
|
if (before) throw new Error(`"${before}" became a symlink`);
|
|
152296
|
-
const tmp =
|
|
152399
|
+
const tmp = join65(dirname34(abs), `.himi-write-${process.pid}-${randomBytes4(6).toString("hex")}.tmp`);
|
|
152297
152400
|
const fd = openSync5(tmp, constants3.O_WRONLY | constants3.O_CREAT | constants3.O_EXCL | (constants3.O_NOFOLLOW ?? 0), 420);
|
|
152298
152401
|
try {
|
|
152299
152402
|
writeSync(fd, content);
|
|
@@ -152313,7 +152416,7 @@ function listFiles(appDir3) {
|
|
|
152313
152416
|
const parentRel = relative13(appDir3, d2);
|
|
152314
152417
|
for (const e2 of readdirSync30(d2, { withFileTypes: true }).sort((a2, b2) => a2.name.localeCompare(b2.name))) {
|
|
152315
152418
|
if (e2.isSymbolicLink()) continue;
|
|
152316
|
-
const p2 =
|
|
152419
|
+
const p2 = join65(d2, e2.name);
|
|
152317
152420
|
if (e2.isDirectory()) {
|
|
152318
152421
|
if (isDeniedSourceDir(e2.name, parentRel) || isDeniedSourceDir(e2.name.toLowerCase(), parentRel)) continue;
|
|
152319
152422
|
if (!walk2(p2)) return false;
|
|
@@ -152341,9 +152444,9 @@ function fileTools() {
|
|
|
152341
152444
|
const root = resolve52(await d2.defaultDir());
|
|
152342
152445
|
if (!existsSync63(root)) return ok({ ok: true, workspace: root, apps: [] });
|
|
152343
152446
|
const apps = [];
|
|
152344
|
-
if (existsSync63(
|
|
152447
|
+
if (existsSync63(join65(root, CONTENT_MARKER))) apps.push(".");
|
|
152345
152448
|
for (const e2 of readdirSync30(root, { withFileTypes: true })) {
|
|
152346
|
-
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);
|
|
152347
152450
|
}
|
|
152348
152451
|
return ok({ ok: true, workspace: root, apps: apps.sort() });
|
|
152349
152452
|
}
|
|
@@ -152375,7 +152478,7 @@ function fileTools() {
|
|
|
152375
152478
|
if (!existsSync63(p2) || !lstatSync20(p2).isFile()) return refuse5("not_found", `no file "${String(a2.path)}"`);
|
|
152376
152479
|
const size = statSync16(p2).size;
|
|
152377
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`);
|
|
152378
|
-
return ok({ ok: true, path: a2.path, bytes: size, content:
|
|
152481
|
+
return ok({ ok: true, path: a2.path, bytes: size, content: readFileSync73(p2, "utf8") });
|
|
152379
152482
|
}
|
|
152380
152483
|
},
|
|
152381
152484
|
{
|
|
@@ -152987,7 +153090,7 @@ __export(server_exports, {
|
|
|
152987
153090
|
protectStdout: () => protectStdout,
|
|
152988
153091
|
startMcpServer: () => startMcpServer
|
|
152989
153092
|
});
|
|
152990
|
-
import { mkdirSync as mkdirSync31, readFileSync as
|
|
153093
|
+
import { mkdirSync as mkdirSync31, readFileSync as readFileSync74 } from "node:fs";
|
|
152991
153094
|
import { fileURLToPath as fileURLToPath22 } from "node:url";
|
|
152992
153095
|
import { McpServer } from "@modelcontextprotocol/server";
|
|
152993
153096
|
import { serveStdio, StdioServerTransport } from "@modelcontextprotocol/server/stdio";
|
|
@@ -153047,7 +153150,7 @@ async function startMcpServer(opts) {
|
|
|
153047
153150
|
status: (dir) => previewStatus(dir, previewDeps),
|
|
153048
153151
|
stop: (dir) => stopPreview(dir, previewDeps)
|
|
153049
153152
|
},
|
|
153050
|
-
readFile: (p2) =>
|
|
153153
|
+
readFile: (p2) => readFileSync74(p2),
|
|
153051
153154
|
login: createLoginSession({ ...defaultLoginDeps, selfCommand: previewDeps.selfCommand, ...opts.login }),
|
|
153052
153155
|
...opts.workspace ? { workspaceBoundary: opts.workspace } : {}
|
|
153053
153156
|
};
|
|
@@ -153091,9 +153194,9 @@ __export(native_decode_exports, {
|
|
|
153091
153194
|
runNativeDecode: () => runNativeDecode
|
|
153092
153195
|
});
|
|
153093
153196
|
import { execFileSync as execFileSync5, spawnSync as spawnSync2 } from "node:child_process";
|
|
153094
|
-
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";
|
|
153095
153198
|
import { tmpdir as tmpdir3 } from "node:os";
|
|
153096
|
-
import { join as
|
|
153199
|
+
import { join as join66 } from "node:path";
|
|
153097
153200
|
import { fileURLToPath as fileURLToPath23 } from "node:url";
|
|
153098
153201
|
function nativeDecodePackageDir() {
|
|
153099
153202
|
return fileURLToPath23(new URL("../../../core/runtime/ios/HimalayaCore/", import.meta.url));
|
|
@@ -153103,8 +153206,8 @@ function nativeDecodeAndroidHarnessDir() {
|
|
|
153103
153206
|
}
|
|
153104
153207
|
function nativeOracleShipped() {
|
|
153105
153208
|
return {
|
|
153106
|
-
ios: existsSync64(
|
|
153107
|
-
android: existsSync64(
|
|
153209
|
+
ios: existsSync64(join66(nativeDecodePackageDir(), "Package.swift")),
|
|
153210
|
+
android: existsSync64(join66(nativeDecodeAndroidHarnessDir(), "gradlew"))
|
|
153108
153211
|
};
|
|
153109
153212
|
}
|
|
153110
153213
|
function detectNativeDecode(options = {}) {
|
|
@@ -153115,7 +153218,7 @@ function detectNativeDecode(options = {}) {
|
|
|
153115
153218
|
return { platform: "ios", available: false, reason: `the iOS decoder oracle requires macOS (darwin); this host is ${hostPlatform}` };
|
|
153116
153219
|
}
|
|
153117
153220
|
if (!swiftAvailable) return { platform: "ios", available: false, reason: "swift is not on PATH" };
|
|
153118
|
-
const packageAvailable = options.packageAvailable ?? existsSync64(
|
|
153221
|
+
const packageAvailable = options.packageAvailable ?? existsSync64(join66(packageDir, "Package.swift"));
|
|
153119
153222
|
if (!packageAvailable) {
|
|
153120
153223
|
return {
|
|
153121
153224
|
platform: "ios",
|
|
@@ -153127,7 +153230,7 @@ function detectNativeDecode(options = {}) {
|
|
|
153127
153230
|
}
|
|
153128
153231
|
function localPropertiesSdk(harnessDir) {
|
|
153129
153232
|
try {
|
|
153130
|
-
const match =
|
|
153233
|
+
const match = readFileSync75(join66(harnessDir, "local.properties"), "utf8").match(/^sdk\.dir\s*=\s*(.+)$/m);
|
|
153131
153234
|
return match?.[1]?.trim().replace(/\\([ :\\])/g, "$1") ?? null;
|
|
153132
153235
|
} catch {
|
|
153133
153236
|
return null;
|
|
@@ -153135,7 +153238,7 @@ function localPropertiesSdk(harnessDir) {
|
|
|
153135
153238
|
}
|
|
153136
153239
|
function detectAndroidNativeDecode(options = {}) {
|
|
153137
153240
|
const harnessDir = options.harnessDir ?? nativeDecodeAndroidHarnessDir();
|
|
153138
|
-
const gradlew =
|
|
153241
|
+
const gradlew = join66(harnessDir, "gradlew");
|
|
153139
153242
|
const gradlewAvailable = options.gradlewAvailable ?? existsSync64(gradlew);
|
|
153140
153243
|
if (!gradlewAvailable) {
|
|
153141
153244
|
return {
|
|
@@ -153218,14 +153321,14 @@ function parseNativeDecodeOutput(stdout, expectedScreenIds, platform = "ios") {
|
|
|
153218
153321
|
return verdicts;
|
|
153219
153322
|
}
|
|
153220
153323
|
function runNativeDecode(options) {
|
|
153221
|
-
const descriptorDir = mkdtempSync2(
|
|
153324
|
+
const descriptorDir = mkdtempSync2(join66(tmpdir3(), "himi-native-decode-"));
|
|
153222
153325
|
const startedAt = Date.now();
|
|
153223
153326
|
try {
|
|
153224
153327
|
for (const descriptor of options.descriptors) {
|
|
153225
153328
|
if (typeof descriptor.descriptorJson !== "string") {
|
|
153226
153329
|
throw new Error(`native decode cannot judge ${descriptor.screenId}: the release builder did not return its exact baked JSON bytes`);
|
|
153227
153330
|
}
|
|
153228
|
-
writeFileSync27(
|
|
153331
|
+
writeFileSync27(join66(descriptorDir, `${encodeURIComponent(descriptor.screenId)}.json`), descriptor.descriptorJson);
|
|
153229
153332
|
}
|
|
153230
153333
|
options.progress?.("building cached Swift oracle");
|
|
153231
153334
|
execFileSync5("swift", ["build", "--package-path", options.packageDir, "--product", "himi-decode-oracle"], {
|
|
@@ -153237,7 +153340,7 @@ function runNativeDecode(options) {
|
|
|
153237
153340
|
encoding: "utf8"
|
|
153238
153341
|
}).trim();
|
|
153239
153342
|
options.progress?.(`running real Swift decoder over ${options.descriptors.length} screen${options.descriptors.length === 1 ? "" : "s"}`);
|
|
153240
|
-
const stdout = execFileSync5(
|
|
153343
|
+
const stdout = execFileSync5(join66(binPath, "himi-decode-oracle"), ["--dir", descriptorDir], {
|
|
153241
153344
|
stdio: ["ignore", "pipe", "pipe"],
|
|
153242
153345
|
encoding: "utf8"
|
|
153243
153346
|
});
|
|
@@ -153255,15 +153358,15 @@ function runNativeDecode(options) {
|
|
|
153255
153358
|
}
|
|
153256
153359
|
}
|
|
153257
153360
|
function runAndroidNativeDecode(options) {
|
|
153258
|
-
const descriptorDir = mkdtempSync2(
|
|
153259
|
-
const outputPath =
|
|
153361
|
+
const descriptorDir = mkdtempSync2(join66(tmpdir3(), "himi-native-decode-android-"));
|
|
153362
|
+
const outputPath = join66(descriptorDir, "verdicts.ndjson");
|
|
153260
153363
|
const startedAt = Date.now();
|
|
153261
153364
|
try {
|
|
153262
153365
|
for (const descriptor of options.descriptors) {
|
|
153263
153366
|
if (typeof descriptor.descriptorJson !== "string") {
|
|
153264
153367
|
throw new Error(`native decode cannot judge ${descriptor.screenId}: the release builder did not return its exact baked JSON bytes`);
|
|
153265
153368
|
}
|
|
153266
|
-
writeFileSync27(
|
|
153369
|
+
writeFileSync27(join66(descriptorDir, `${encodeURIComponent(descriptor.screenId)}.json`), descriptor.descriptorJson);
|
|
153267
153370
|
}
|
|
153268
153371
|
options.progress?.(`running real Kotlin decoder over ${options.descriptors.length} screen${options.descriptors.length === 1 ? "" : "s"}`);
|
|
153269
153372
|
execFileSync5(options.gradlew, [
|
|
@@ -153278,7 +153381,7 @@ function runAndroidNativeDecode(options) {
|
|
|
153278
153381
|
stdio: ["ignore", "ignore", "pipe"],
|
|
153279
153382
|
encoding: "utf8"
|
|
153280
153383
|
});
|
|
153281
|
-
const stdout =
|
|
153384
|
+
const stdout = readFileSync75(outputPath, "utf8");
|
|
153282
153385
|
return {
|
|
153283
153386
|
platform: "android",
|
|
153284
153387
|
verdicts: parseNativeDecodeOutput(stdout, options.descriptors.map((descriptor) => descriptor.screenId), "android"),
|
|
@@ -153348,13 +153451,13 @@ __export(browser_authoring_exports, {
|
|
|
153348
153451
|
});
|
|
153349
153452
|
import { createServer as createServer5 } from "node:http";
|
|
153350
153453
|
import { createHash as createHash35, randomBytes as randomBytes5 } from "node:crypto";
|
|
153351
|
-
import { existsSync as existsSync65, readdirSync as readdirSync31, readFileSync as
|
|
153352
|
-
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";
|
|
153353
153456
|
function humanMs(ms2) {
|
|
153354
153457
|
return ms2 < 1e3 ? `${ms2}ms` : `${Math.round(ms2 / 1e3)}s`;
|
|
153355
153458
|
}
|
|
153356
153459
|
function collectWorkerSources(tier5SrcDir, bundleName) {
|
|
153357
|
-
const root =
|
|
153460
|
+
const root = join67(tier5SrcDir, bundleName);
|
|
153358
153461
|
const files = {};
|
|
153359
153462
|
const visitedDirs = /* @__PURE__ */ new Set();
|
|
153360
153463
|
const walk2 = (abs, rel) => {
|
|
@@ -153362,12 +153465,12 @@ function collectWorkerSources(tier5SrcDir, bundleName) {
|
|
|
153362
153465
|
if (visitedDirs.has(real)) return;
|
|
153363
153466
|
visitedDirs.add(real);
|
|
153364
153467
|
for (const name of readdirSync31(abs).sort()) {
|
|
153365
|
-
const childAbs =
|
|
153468
|
+
const childAbs = join67(abs, name);
|
|
153366
153469
|
const childRel = posix3.join(rel, name);
|
|
153367
153470
|
if (statSync17(childAbs).isDirectory()) {
|
|
153368
153471
|
walk2(childAbs, childRel);
|
|
153369
153472
|
} else if (/\.(ts|tsx|js|mjs|json)$/.test(name)) {
|
|
153370
|
-
files[childRel] =
|
|
153473
|
+
files[childRel] = readFileSync76(childAbs, "utf8");
|
|
153371
153474
|
}
|
|
153372
153475
|
}
|
|
153373
153476
|
};
|
|
@@ -153388,20 +153491,20 @@ function collectRelativeSiblings(files, tier5SrcDir) {
|
|
|
153388
153491
|
const spec = m2[1];
|
|
153389
153492
|
const virtual = posix3.normalize(posix3.join(dir, spec));
|
|
153390
153493
|
if (!virtual.startsWith("/tier5-src/")) continue;
|
|
153391
|
-
const onDisk =
|
|
153494
|
+
const onDisk = join67(tier5SrcDir, virtual.slice("/tier5-src/".length));
|
|
153392
153495
|
const candidates = [
|
|
153393
153496
|
onDisk,
|
|
153394
153497
|
`${onDisk}.ts`,
|
|
153395
153498
|
`${onDisk}.js`,
|
|
153396
153499
|
onDisk.replace(/\.js$/, ".ts"),
|
|
153397
|
-
|
|
153398
|
-
|
|
153500
|
+
join67(onDisk, "index.ts"),
|
|
153501
|
+
join67(onDisk, "index.js")
|
|
153399
153502
|
];
|
|
153400
153503
|
for (const abs of candidates) {
|
|
153401
153504
|
if (!existsSync65(abs) || statSync17(abs).isDirectory()) continue;
|
|
153402
153505
|
const key2 = `/tier5-src/${relative14(tier5SrcDir, abs).split(sep18).join(posix3.sep)}`;
|
|
153403
153506
|
if (key2 in files) break;
|
|
153404
|
-
files[key2] =
|
|
153507
|
+
files[key2] = readFileSync76(abs, "utf8");
|
|
153405
153508
|
queue.push(key2);
|
|
153406
153509
|
break;
|
|
153407
153510
|
}
|
|
@@ -153436,7 +153539,7 @@ function collectSdkModules(files, resolveSubpath) {
|
|
|
153436
153539
|
function sdkSubpathReader(resolve61) {
|
|
153437
153540
|
return (sub) => {
|
|
153438
153541
|
try {
|
|
153439
|
-
return
|
|
153542
|
+
return readFileSync76(resolve61(`@wix/himalaya/${sub}`), "utf8");
|
|
153440
153543
|
} catch {
|
|
153441
153544
|
return null;
|
|
153442
153545
|
}
|
|
@@ -153608,8 +153711,8 @@ __export(coverage_exports, {
|
|
|
153608
153711
|
suppressedNativeKeys: () => suppressedNativeKeys,
|
|
153609
153712
|
trendAndStore: () => trendAndStore
|
|
153610
153713
|
});
|
|
153611
|
-
import { existsSync as existsSync66, mkdirSync as mkdirSync32, readFileSync as
|
|
153612
|
-
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";
|
|
153613
153716
|
function suppressedNativeKeys(oracle) {
|
|
153614
153717
|
return [...oracle.ios ? [] : ["native-decode|ios"], ...oracle.android ? [] : ["native-decode|android"]];
|
|
153615
153718
|
}
|
|
@@ -153789,11 +153892,11 @@ function assembleLedger(r2, options = {}) {
|
|
|
153789
153892
|
return out2;
|
|
153790
153893
|
}
|
|
153791
153894
|
function trendAndStore(dir, entries, suppressed) {
|
|
153792
|
-
const p2 =
|
|
153895
|
+
const p2 = join68(dir, LEDGER_FILE);
|
|
153793
153896
|
let previous = null;
|
|
153794
153897
|
try {
|
|
153795
153898
|
if (existsSync66(p2)) {
|
|
153796
|
-
const parsed = JSON.parse(
|
|
153899
|
+
const parsed = JSON.parse(readFileSync77(p2, "utf8"));
|
|
153797
153900
|
if (Array.isArray(parsed.keys)) previous = parsed.keys.filter((k2) => typeof k2 === "string");
|
|
153798
153901
|
}
|
|
153799
153902
|
} catch {
|
|
@@ -153832,11 +153935,11 @@ function formatLedger(entries, trend) {
|
|
|
153832
153935
|
return out2.join("\n");
|
|
153833
153936
|
}
|
|
153834
153937
|
function diffAndStoreObservations(dir, current) {
|
|
153835
|
-
const p2 =
|
|
153938
|
+
const p2 = join68(dir, OBS_FILE);
|
|
153836
153939
|
let previous = null;
|
|
153837
153940
|
try {
|
|
153838
153941
|
if (existsSync66(p2)) {
|
|
153839
|
-
const parsed = JSON.parse(
|
|
153942
|
+
const parsed = JSON.parse(readFileSync77(p2, "utf8"));
|
|
153840
153943
|
if (parsed.screens && typeof parsed.screens === "object" && !Array.isArray(parsed.screens) && Object.values(parsed.screens).every(
|
|
153841
153944
|
(v2) => Array.isArray(v2) && v2.every((l2) => typeof l2 === "string")
|
|
153842
153945
|
)) {
|
|
@@ -153885,8 +153988,8 @@ var LEDGER_FILE, OBS_FILE;
|
|
|
153885
153988
|
var init_coverage = __esm({
|
|
153886
153989
|
"src/coverage.ts"() {
|
|
153887
153990
|
init_native_decode();
|
|
153888
|
-
LEDGER_FILE =
|
|
153889
|
-
OBS_FILE =
|
|
153991
|
+
LEDGER_FILE = join68(".himi", "test-ledger.json");
|
|
153992
|
+
OBS_FILE = join68(".himi", "test-observations.json");
|
|
153890
153993
|
}
|
|
153891
153994
|
});
|
|
153892
153995
|
|
|
@@ -153897,8 +154000,8 @@ __export(design_kits_exports, {
|
|
|
153897
154000
|
kitsDir: () => kitsDir,
|
|
153898
154001
|
listKits: () => listKits2
|
|
153899
154002
|
});
|
|
153900
|
-
import { existsSync as existsSync67, readFileSync as
|
|
153901
|
-
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";
|
|
153902
154005
|
import { fileURLToPath as fileURLToPath24 } from "node:url";
|
|
153903
154006
|
function kitsDir() {
|
|
153904
154007
|
return KIT_DIR_CANDIDATES.find((p2) => existsSync67(p2));
|
|
@@ -153925,7 +154028,7 @@ In a published @wix/himalaya-cli this is a packaging bug \u2014 the kits should
|
|
|
153925
154028
|
if (!kits.includes(name)) {
|
|
153926
154029
|
return { ok: false, kit: name, kits, problems: [`no design kit named "${name}". Available: ${kits.join(", ")}`] };
|
|
153927
154030
|
}
|
|
153928
|
-
const raw =
|
|
154031
|
+
const raw = readFileSync78(join69(dir, `${name}.json`), "utf8");
|
|
153929
154032
|
let parsed;
|
|
153930
154033
|
try {
|
|
153931
154034
|
parsed = JSON.parse(raw);
|
|
@@ -153949,9 +154052,9 @@ var init_design_kits = __esm({
|
|
|
153949
154052
|
"src/design-kits.ts"() {
|
|
153950
154053
|
KIT_DIR_CANDIDATES = [
|
|
153951
154054
|
// in-repo: tools/himi-cli/src/design-kits.ts → <repo>/stdlib/design-kits/
|
|
153952
|
-
|
|
154055
|
+
join69(fileURLToPath24(new URL("../../..", import.meta.url)), "stdlib", "design-kits"),
|
|
153953
154056
|
// published CLI: <pkg>/dist/cli.mjs → <pkg>/stdlib/design-kits/
|
|
153954
|
-
|
|
154057
|
+
join69(fileURLToPath24(new URL("..", import.meta.url)), "stdlib", "design-kits")
|
|
153955
154058
|
];
|
|
153956
154059
|
}
|
|
153957
154060
|
});
|
|
@@ -153965,11 +154068,11 @@ __export(assets_exports, {
|
|
|
153965
154068
|
removeAssetPayload: () => removeAssetPayload,
|
|
153966
154069
|
verifyReport: () => verifyReport
|
|
153967
154070
|
});
|
|
153968
|
-
import { readFileSync as
|
|
154071
|
+
import { readFileSync as readFileSync79 } from "node:fs";
|
|
153969
154072
|
import { basename as basename17 } from "node:path";
|
|
153970
154073
|
function declaredAssets(dir) {
|
|
153971
154074
|
return collectAssets(dir).map((a2) => {
|
|
153972
|
-
const bytes2 =
|
|
154075
|
+
const bytes2 = readFileSync79(a2.path);
|
|
153973
154076
|
return {
|
|
153974
154077
|
name: a2.name,
|
|
153975
154078
|
sha256: assetSha256(bytes2),
|
|
@@ -154046,7 +154149,7 @@ function verifyReport(dir, app, manifest) {
|
|
|
154046
154149
|
};
|
|
154047
154150
|
}
|
|
154048
154151
|
function addAssetPayload(manifest, filePath, opts) {
|
|
154049
|
-
const bytes2 =
|
|
154152
|
+
const bytes2 = readFileSync79(filePath);
|
|
154050
154153
|
const name = opts.name ?? basename17(filePath);
|
|
154051
154154
|
const sha2566 = assetSha256(bytes2);
|
|
154052
154155
|
const record2 = {
|
|
@@ -155801,25 +155904,25 @@ var init_preview_assets_generated = __esm({
|
|
|
155801
155904
|
"../../packages/serve/src/preview-assets.generated.ts"() {
|
|
155802
155905
|
init_preview_assets_format();
|
|
155803
155906
|
PREVIEW_ASSET_MANIFEST = [
|
|
155804
|
-
{ key: "assets/index-
|
|
155805
|
-
{ key: "assets/pdf-
|
|
155806
|
-
{ key: "assets/pdf.worker.min-BQa_JDET.js", contentType: "application/javascript; charset=utf-8", offset:
|
|
155807
|
-
{ key: "assets/pdf.worker.min-BmVo14Nb.mjs", contentType: "application/javascript; charset=utf-8", offset:
|
|
155808
|
-
{ key: "assets/pdfDocument-
|
|
155809
|
-
{ key: "fonts/Roboto-LICENSE.txt", contentType: "application/octet-stream", offset:
|
|
155810
|
-
{ key: "fonts/Roboto-Variable.ttf", contentType: "font/ttf", offset:
|
|
155811
|
-
{ key: "fonts/WixMadeforDisplay-Bold.ttf", contentType: "font/ttf", offset:
|
|
155812
|
-
{ key: "fonts/WixMadeforDisplay-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
155813
|
-
{ key: "fonts/WixMadeforDisplay-Medium.ttf", contentType: "font/ttf", offset:
|
|
155814
|
-
{ key: "fonts/WixMadeforDisplay-Regular.ttf", contentType: "font/ttf", offset:
|
|
155815
|
-
{ key: "fonts/WixMadeforDisplay-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
155816
|
-
{ key: "fonts/WixMadeforText-Bold.ttf", contentType: "font/ttf", offset:
|
|
155817
|
-
{ key: "fonts/WixMadeforText-ExtraBold.ttf", contentType: "font/ttf", offset:
|
|
155818
|
-
{ key: "fonts/WixMadeforText-Medium.ttf", contentType: "font/ttf", offset:
|
|
155819
|
-
{ key: "fonts/WixMadeforText-Regular.ttf", contentType: "font/ttf", offset:
|
|
155820
|
-
{ key: "fonts/WixMadeforText-SemiBold.ttf", contentType: "font/ttf", offset:
|
|
155821
|
-
{ key: "index.html", contentType: "text/html; charset=utf-8", offset:
|
|
155822
|
-
{ 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" }
|
|
155823
155926
|
];
|
|
155824
155927
|
}
|
|
155825
155928
|
});
|
|
@@ -155837,9 +155940,9 @@ __export(run_exports, {
|
|
|
155837
155940
|
runPackage: () => runPackage,
|
|
155838
155941
|
withoutProdServe: () => withoutProdServe
|
|
155839
155942
|
});
|
|
155840
|
-
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";
|
|
155841
155944
|
import { networkInterfaces as osNetworkInterfaces, tmpdir as tmpdir4 } from "node:os";
|
|
155842
|
-
import { dirname as dirname36, join as
|
|
155945
|
+
import { dirname as dirname36, join as join70 } from "node:path";
|
|
155843
155946
|
import { fileURLToPath as fileURLToPath25 } from "node:url";
|
|
155844
155947
|
function makePackageRunHandler(opts) {
|
|
155845
155948
|
const store = new FileReleaseStore(opts.releaseRoot);
|
|
@@ -155868,7 +155971,7 @@ async function fetchBytes(url) {
|
|
|
155868
155971
|
async function resolvePackage(source, workDir) {
|
|
155869
155972
|
const isUrl2 = /^https?:\/\//i.test(source);
|
|
155870
155973
|
if (!isUrl2 && existsSync68(source) && statSync18(source).isDirectory()) {
|
|
155871
|
-
const appDirManifest =
|
|
155974
|
+
const appDirManifest = join70(source, "release-manifest.json");
|
|
155872
155975
|
if (existsSync68(appDirManifest)) {
|
|
155873
155976
|
const opened2 = openPackageDir(source);
|
|
155874
155977
|
if (!opened2.validation.ok) {
|
|
@@ -155878,9 +155981,9 @@ async function resolvePackage(source, workDir) {
|
|
|
155878
155981
|
const app2 = opened2.header?.app ?? opened2.manifest?.app;
|
|
155879
155982
|
if (!app2) throw new Error(`${source} has no app id (no himi-package.json and no manifest.app)`);
|
|
155880
155983
|
if (!isSafeAppId(app2)) throw new Error(`${source} declares an unsafe app id ${JSON.stringify(app2)} \u2014 refusing to open it`);
|
|
155881
|
-
const root2 = workDir ?? mkdtempSync3(
|
|
155882
|
-
const target =
|
|
155883
|
-
if (
|
|
155984
|
+
const root2 = workDir ?? mkdtempSync3(join70(tmpdir4(), "himi-run-"));
|
|
155985
|
+
const target = join70(root2, app2);
|
|
155986
|
+
if (join70(source) !== target) {
|
|
155884
155987
|
mkdirSync33(root2, { recursive: true });
|
|
155885
155988
|
rmSync17(target, { recursive: true, force: true });
|
|
155886
155989
|
cpSync2(source, target, { recursive: true });
|
|
@@ -155897,8 +156000,8 @@ async function resolvePackage(source, workDir) {
|
|
|
155897
156000
|
}
|
|
155898
156001
|
throw new Error(`${source} is a directory but has no release-manifest.json \u2014 is it a package?`);
|
|
155899
156002
|
}
|
|
155900
|
-
const bytes2 = isUrl2 ? await fetchBytes(source) :
|
|
155901
|
-
const root = workDir ?? mkdtempSync3(
|
|
156003
|
+
const bytes2 = isUrl2 ? await fetchBytes(source) : readFileSync80(source);
|
|
156004
|
+
const root = workDir ?? mkdtempSync3(join70(tmpdir4(), "himi-run-"));
|
|
155902
156005
|
const { app, appDir: appDir3 } = unpackTo(bytes2, root);
|
|
155903
156006
|
const opened = openPackageDir(appDir3);
|
|
155904
156007
|
if (!opened.validation.ok) {
|
|
@@ -155921,14 +156024,14 @@ async function loadPreviewAssets() {
|
|
|
155921
156024
|
const mod = await Promise.resolve().then(() => (init_preview_assets_generated(), preview_assets_generated_exports));
|
|
155922
156025
|
const here = dirname36(fileURLToPath25(import.meta.url));
|
|
155923
156026
|
const candidates = [
|
|
155924
|
-
|
|
156027
|
+
join70(here, "preview-assets.generated.bin"),
|
|
155925
156028
|
// published: copied next to the bundled CLI
|
|
155926
|
-
|
|
156029
|
+
join70(here, "../../../packages/serve/src/preview-assets.generated.bin")
|
|
155927
156030
|
// in-repo checkout
|
|
155928
156031
|
];
|
|
155929
156032
|
for (const path2 of candidates) {
|
|
155930
156033
|
if (!existsSync68(path2)) continue;
|
|
155931
|
-
const blob =
|
|
156034
|
+
const blob = readFileSync80(path2);
|
|
155932
156035
|
return mod.assemblePreviewAssetsFromBlob(new Uint8Array(blob.buffer, blob.byteOffset, blob.byteLength));
|
|
155933
156036
|
}
|
|
155934
156037
|
return /* @__PURE__ */ new Map();
|
|
@@ -156065,7 +156168,7 @@ __export(run_browser_exports, {
|
|
|
156065
156168
|
runInBrowser: () => runInBrowser
|
|
156066
156169
|
});
|
|
156067
156170
|
import { createServer as createServer7 } from "node:http";
|
|
156068
|
-
import { existsSync as existsSync69, readFileSync as
|
|
156171
|
+
import { existsSync as existsSync69, readFileSync as readFileSync81 } from "node:fs";
|
|
156069
156172
|
import { spawnSync as spawnSync3 } from "node:child_process";
|
|
156070
156173
|
import { dirname as dirname37, resolve as resolve54 } from "node:path";
|
|
156071
156174
|
import { fileURLToPath as fileURLToPath26 } from "node:url";
|
|
@@ -156173,7 +156276,7 @@ async function runInBrowser(releaseRoot, app, header, opts = {}) {
|
|
|
156173
156276
|
}
|
|
156174
156277
|
let bytes2;
|
|
156175
156278
|
try {
|
|
156176
|
-
bytes2 =
|
|
156279
|
+
bytes2 = readFileSync81(resolve54(stagedDir(), name));
|
|
156177
156280
|
} catch (e2) {
|
|
156178
156281
|
res.writeHead(503, { "content-type": "application/json" });
|
|
156179
156282
|
res.end(JSON.stringify({ error: "browser_plane_unstaged", file: name, detail: String(e2) }));
|
|
@@ -156226,14 +156329,14 @@ var hhp_preview_exports = {};
|
|
|
156226
156329
|
__export(hhp_preview_exports, {
|
|
156227
156330
|
hhpPreviewResponse: () => hhpPreviewResponse
|
|
156228
156331
|
});
|
|
156229
|
-
import { existsSync as existsSync70, readFileSync as
|
|
156230
|
-
import { join as
|
|
156332
|
+
import { existsSync as existsSync70, readFileSync as readFileSync82 } from "node:fs";
|
|
156333
|
+
import { join as join71 } from "node:path";
|
|
156231
156334
|
function hhpPreviewResponse(root, request) {
|
|
156232
|
-
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;
|
|
156233
156336
|
if (request.method !== "GET") return new Response(null, { status: 405 });
|
|
156234
156337
|
try {
|
|
156235
156338
|
const file2 = localPath(root, ".himi/hhp-preview.json");
|
|
156236
|
-
const authored2 = existsSync70(file2) ? JSON.parse(
|
|
156339
|
+
const authored2 = existsSync70(file2) ? JSON.parse(readFileSync82(file2, "utf8")) : {};
|
|
156237
156340
|
if (authored2.mockCapabilities && (!Array.isArray(authored2.mockCapabilities) || authored2.mockCapabilities.some((v2) => typeof v2 !== "string"))) throw new Error("mockCapabilities must be a string array.");
|
|
156238
156341
|
const fixtures = authored2.fixtures ?? {};
|
|
156239
156342
|
if (typeof fixtures !== "object" || Array.isArray(fixtures) || fixtures === null) throw new Error("fixtures must be an object.");
|
|
@@ -156383,7 +156486,7 @@ var init_embedded_bundles = __esm({
|
|
|
156383
156486
|
});
|
|
156384
156487
|
|
|
156385
156488
|
// ../store-release/register-bundle.ts
|
|
156386
|
-
import { readFileSync as
|
|
156489
|
+
import { readFileSync as readFileSync83 } from "node:fs";
|
|
156387
156490
|
import { createPrivateKey as createPrivateKey4, sign as sign2 } from "node:crypto";
|
|
156388
156491
|
function b64url2(b2) {
|
|
156389
156492
|
return Buffer.from(b2).toString("base64").replace(/\+/g, "-").replace(/\//g, "_").replace(/=+$/, "");
|
|
@@ -156401,7 +156504,7 @@ function bundleIdBody(identifier, name, platform = "IOS") {
|
|
|
156401
156504
|
async function registerBundleId(opts) {
|
|
156402
156505
|
const env = requireEnv(["ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_KEY_PATH"]);
|
|
156403
156506
|
assertCredentialOutsideRepo("ASC_KEY_PATH", env.ASC_KEY_PATH);
|
|
156404
|
-
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));
|
|
156405
156508
|
const res = await fetch(`${ASC_API}/v1/bundleIds`, {
|
|
156406
156509
|
method: "POST",
|
|
156407
156510
|
headers: { Authorization: `Bearer ${jwt}`, "Content-Type": "application/json" },
|
|
@@ -156431,7 +156534,7 @@ async function main() {
|
|
|
156431
156534
|
}
|
|
156432
156535
|
const ni2 = rest.indexOf("--name");
|
|
156433
156536
|
const name = ni2 >= 0 ? rest[ni2 + 1] : cfg.app ?? app;
|
|
156434
|
-
const yml =
|
|
156537
|
+
const yml = readFileSync83(iosProjectYml(app), "utf8");
|
|
156435
156538
|
for (const { id, label: label2 } of [{ id: identifier, label: name }, ...embeddedBundles(yml).map((b2) => ({
|
|
156436
156539
|
id: embeddedBundleId(identifier, b2),
|
|
156437
156540
|
label: `${name} ${embeddedAppIdLabel(b2)}`
|
|
@@ -157840,19 +157943,19 @@ __export(credential_profile_exports, {
|
|
|
157840
157943
|
profilePath: () => profilePath,
|
|
157841
157944
|
resolveStoreCredentials: () => resolveStoreCredentials
|
|
157842
157945
|
});
|
|
157843
|
-
import { existsSync as existsSync71, readFileSync as
|
|
157946
|
+
import { existsSync as existsSync71, readFileSync as readFileSync84 } from "node:fs";
|
|
157844
157947
|
import { homedir as homedir6 } from "node:os";
|
|
157845
|
-
import { join as
|
|
157948
|
+
import { join as join72 } from "node:path";
|
|
157846
157949
|
function credentialsDir(home = homedir6()) {
|
|
157847
|
-
return
|
|
157950
|
+
return join72(home, ".himalaya", "store-credentials");
|
|
157848
157951
|
}
|
|
157849
157952
|
function profilePath(name, home = homedir6()) {
|
|
157850
157953
|
if (!PROFILE_NAME.test(name)) {
|
|
157851
157954
|
throw new Error(
|
|
157852
|
-
`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.`
|
|
157853
157956
|
);
|
|
157854
157957
|
}
|
|
157855
|
-
return
|
|
157958
|
+
return join72(credentialsDir(home), `${name}.json`);
|
|
157856
157959
|
}
|
|
157857
157960
|
function parseProfile(text9, label2) {
|
|
157858
157961
|
let doc;
|
|
@@ -157883,7 +157986,7 @@ function resolveStoreCredentials(opts) {
|
|
|
157883
157986
|
const { app, cfg } = opts;
|
|
157884
157987
|
const env = opts.env ?? process.env;
|
|
157885
157988
|
const home = opts.home ?? homedir6();
|
|
157886
|
-
const read = opts.readProfile ?? ((p2) =>
|
|
157989
|
+
const read = opts.readProfile ?? ((p2) => readFileSync84(p2, "utf8"));
|
|
157887
157990
|
const exists = opts.profileExists ?? existsSync71;
|
|
157888
157991
|
const ios = cfg.ios ?? {};
|
|
157889
157992
|
const flagName = opts.profileFlag?.trim();
|
|
@@ -157950,7 +158053,7 @@ var init_credential_profile = __esm({
|
|
|
157950
158053
|
|
|
157951
158054
|
// ../store-release/iap-credentials.ts
|
|
157952
158055
|
import { createHash as createHash37 } from "node:crypto";
|
|
157953
|
-
import { existsSync as existsSync72, readFileSync as
|
|
158056
|
+
import { existsSync as existsSync72, readFileSync as readFileSync85, realpathSync as realpathSync12 } from "node:fs";
|
|
157954
158057
|
import { homedir as homedir7 } from "node:os";
|
|
157955
158058
|
function accountFingerprint(keyId, issuerId) {
|
|
157956
158059
|
return `sha256:${createHash37("sha256").update(`${issuerId}:${keyId}`).digest("hex").slice(0, 16)}`;
|
|
@@ -157984,7 +158087,7 @@ function canonicalKeyPath(path2, profile, realpath) {
|
|
|
157984
158087
|
function resolveIapCredentials(options) {
|
|
157985
158088
|
const { target } = options;
|
|
157986
158089
|
const home = options.home ?? homedir7();
|
|
157987
|
-
const readFile3 = options.readFile ?? ((p2) =>
|
|
158090
|
+
const readFile3 = options.readFile ?? ((p2) => readFileSync85(p2, "utf8"));
|
|
157988
158091
|
const realpath = options.realpath ?? realpathSync12;
|
|
157989
158092
|
const profile = requireExplicitProfile(options.profileFlag, target);
|
|
157990
158093
|
const creds = resolveStoreCredentials({
|
|
@@ -158305,7 +158408,7 @@ __export(version_exports, {
|
|
|
158305
158408
|
stampTargetVersion: () => stampTargetVersion,
|
|
158306
158409
|
stampVersionKeys: () => stampVersionKeys
|
|
158307
158410
|
});
|
|
158308
|
-
import { readFileSync as
|
|
158411
|
+
import { readFileSync as readFileSync86, writeFileSync as writeFileSync29 } from "node:fs";
|
|
158309
158412
|
function readIosVersion(projectYml) {
|
|
158310
158413
|
const marketing = matchScalar(projectYml, "CFBundleShortVersionString");
|
|
158311
158414
|
const build3 = matchScalar(projectYml, "CFBundleVersion");
|
|
@@ -158452,8 +158555,8 @@ function setAndroidVersion(gradle, v2) {
|
|
|
158452
158555
|
function bumpVersion(app, opts) {
|
|
158453
158556
|
const iosPath = iosProjectYml(app);
|
|
158454
158557
|
const gradlePath = androidGradle(app);
|
|
158455
|
-
const iosYml =
|
|
158456
|
-
const gradle =
|
|
158558
|
+
const iosYml = readFileSync86(iosPath, "utf8");
|
|
158559
|
+
const gradle = readFileSync86(gradlePath, "utf8");
|
|
158457
158560
|
const current = readIosVersion(iosYml);
|
|
158458
158561
|
const next = {
|
|
158459
158562
|
marketing: opts.marketing ?? current.marketing,
|
|
@@ -158483,8 +158586,8 @@ var init_store_spec = __esm({
|
|
|
158483
158586
|
});
|
|
158484
158587
|
|
|
158485
158588
|
// src/iap-config-edit.ts
|
|
158486
|
-
import { existsSync as existsSync73, readFileSync as
|
|
158487
|
-
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";
|
|
158488
158591
|
import ts8 from "typescript";
|
|
158489
158592
|
function bindPurchasesAppInConfig(source, options) {
|
|
158490
158593
|
const fileName = options.fileName ?? "config.ts";
|
|
@@ -158563,16 +158666,16 @@ function capabilityFinding(app, fileName) {
|
|
|
158563
158666
|
}
|
|
158564
158667
|
function withStoreBundle(dir, options) {
|
|
158565
158668
|
if (options.storeBundleId) return options;
|
|
158566
|
-
const path2 =
|
|
158669
|
+
const path2 = join73(dir, "store", "store.config.yaml");
|
|
158567
158670
|
if (!existsSync73(path2)) return options;
|
|
158568
|
-
const storeBundleId = parseStoreConfig(
|
|
158671
|
+
const storeBundleId = parseStoreConfig(readFileSync87(path2, "utf8")).ios?.bundleId;
|
|
158569
158672
|
return storeBundleId ? { ...options, storeBundleId } : options;
|
|
158570
158673
|
}
|
|
158571
158674
|
function previewIapConfigEdit(dir, options) {
|
|
158572
158675
|
const path2 = configEntry(dir);
|
|
158573
158676
|
if (!path2) return void 0;
|
|
158574
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.`] };
|
|
158575
|
-
const { changed, applied, conflicts, instructions } = bindPurchasesAppInConfig(
|
|
158678
|
+
const { changed, applied, conflicts, instructions } = bindPurchasesAppInConfig(readFileSync87(path2, "utf8"), { ...withStoreBundle(dir, options), fileName: basename18(path2) });
|
|
158576
158679
|
return { path: path2, changed, applied, conflicts, instructions };
|
|
158577
158680
|
}
|
|
158578
158681
|
async function applyIapConfigEdit(dir, options, validate4) {
|
|
@@ -158581,7 +158684,7 @@ async function applyIapConfigEdit(dir, options, validate4) {
|
|
|
158581
158684
|
const fileName = basename18(path2);
|
|
158582
158685
|
const refuse7 = (why) => ({ path: path2, changed: false, applied: [], conflicts: [], instructions: [why] });
|
|
158583
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.`);
|
|
158584
|
-
const original =
|
|
158687
|
+
const original = readFileSync87(path2, "utf8");
|
|
158585
158688
|
const edit = bindPurchasesAppInConfig(original, { ...withStoreBundle(dir, options), fileName });
|
|
158586
158689
|
const { applied, conflicts, instructions } = edit;
|
|
158587
158690
|
if (!edit.changed) return { path: path2, changed: false, applied, conflicts, instructions };
|
|
@@ -159054,9 +159157,9 @@ __export(store_iap_exports, {
|
|
|
159054
159157
|
runStoreIap: () => runStoreIap
|
|
159055
159158
|
});
|
|
159056
159159
|
import { randomUUID as randomUUID8 } from "node:crypto";
|
|
159057
|
-
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";
|
|
159058
159161
|
import { homedir as homedir8, hostname } from "node:os";
|
|
159059
|
-
import { join as
|
|
159162
|
+
import { join as join74 } from "node:path";
|
|
159060
159163
|
function scrubDeep(value, scrub) {
|
|
159061
159164
|
if (typeof value === "string") return scrub(value);
|
|
159062
159165
|
if (Array.isArray(value)) return value.map((v2) => scrubDeep(v2, scrub));
|
|
@@ -159512,14 +159615,14 @@ function fileJournal(path2) {
|
|
|
159512
159615
|
}
|
|
159513
159616
|
function readLockSummary(path2) {
|
|
159514
159617
|
try {
|
|
159515
|
-
const { pid, host, at: at2 } = JSON.parse(
|
|
159618
|
+
const { pid, host, at: at2 } = JSON.parse(readFileSync88(path2, "utf8"));
|
|
159516
159619
|
return `pid ${pid} on ${host} since ${at2}`;
|
|
159517
159620
|
} catch {
|
|
159518
159621
|
return "unreadable lock";
|
|
159519
159622
|
}
|
|
159520
159623
|
}
|
|
159521
159624
|
function acquireApplyLock(dir, appleAppId) {
|
|
159522
|
-
const path2 =
|
|
159625
|
+
const path2 = join74(dir, "apply.lock");
|
|
159523
159626
|
const stamp = JSON.stringify({ pid: process.pid, host: hostname(), at: (/* @__PURE__ */ new Date()).toISOString(), token: randomUUID8() });
|
|
159524
159627
|
try {
|
|
159525
159628
|
writeFileSync30(path2, stamp, { flag: "wx", mode: 384 });
|
|
@@ -159532,7 +159635,7 @@ function acquireApplyLock(dir, appleAppId) {
|
|
|
159532
159635
|
return () => {
|
|
159533
159636
|
let current = "";
|
|
159534
159637
|
try {
|
|
159535
|
-
current =
|
|
159638
|
+
current = readFileSync88(path2, "utf8");
|
|
159536
159639
|
} catch {
|
|
159537
159640
|
return;
|
|
159538
159641
|
}
|
|
@@ -159540,7 +159643,7 @@ function acquireApplyLock(dir, appleAppId) {
|
|
|
159540
159643
|
};
|
|
159541
159644
|
}
|
|
159542
159645
|
function stateDir(appleAppId) {
|
|
159543
|
-
const dir =
|
|
159646
|
+
const dir = join74(homedir8(), ".himalaya", "store-iap", appleAppId);
|
|
159544
159647
|
mkdirSync34(dir, { recursive: true, mode: 448 });
|
|
159545
159648
|
return dir;
|
|
159546
159649
|
}
|
|
@@ -159556,11 +159659,11 @@ async function confirmOnTerminal(question) {
|
|
|
159556
159659
|
}
|
|
159557
159660
|
function defaultStoreIapDeps() {
|
|
159558
159661
|
return {
|
|
159559
|
-
readFile: (path2) =>
|
|
159662
|
+
readFile: (path2) => readFileSync88(path2, "utf8"),
|
|
159560
159663
|
writeFileAtomic,
|
|
159561
159664
|
resolveCredentials: ({ profileFlag, target }) => resolveIapCredentials({ profileFlag, target }),
|
|
159562
159665
|
createApi: (key2) => createIapApi(createAscClient({ key: key2 })),
|
|
159563
|
-
openJournal: (appleAppId) => fileJournal(
|
|
159666
|
+
openJournal: (appleAppId) => fileJournal(join74(stateDir(appleAppId), "journal.jsonl")),
|
|
159564
159667
|
acquireLock: (appleAppId) => acquireApplyLock(stateDir(appleAppId), appleAppId),
|
|
159565
159668
|
canPrompt: () => process.stdin.isTTY === true,
|
|
159566
159669
|
wixTransport: (siteId) => ownerTransport(siteId),
|
|
@@ -160038,9 +160141,9 @@ __export(preflight_app_exports, {
|
|
|
160038
160141
|
preflightApp: () => preflightApp,
|
|
160039
160142
|
profileAccount: () => profileAccount
|
|
160040
160143
|
});
|
|
160041
|
-
import { readFileSync as
|
|
160144
|
+
import { readFileSync as readFileSync89, existsSync as existsSync74, readdirSync as readdirSync33, statSync as statSync19 } from "node:fs";
|
|
160042
160145
|
import { createHash as createHash39 } from "node:crypto";
|
|
160043
|
-
import { join as
|
|
160146
|
+
import { join as join75 } from "node:path";
|
|
160044
160147
|
function analyze(projectYml, storeConfig, icon, account) {
|
|
160045
160148
|
const f2 = [];
|
|
160046
160149
|
const has = (re2, s2) => re2.test(s2);
|
|
@@ -160104,13 +160207,13 @@ function profileAccount(app, storeConfig, opts = {}) {
|
|
|
160104
160207
|
}
|
|
160105
160208
|
}
|
|
160106
160209
|
async function preflightApp(app, opts = {}) {
|
|
160107
|
-
const projectYml = existsSync74(iosProjectYml(app)) ?
|
|
160108
|
-
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") : "";
|
|
160109
160212
|
if (!storeConfig) return [{ level: "error", message: `no apps/${app}/store/store.config.yaml \u2014 run /setup-store-signing first.` }];
|
|
160110
160213
|
const findings = analyze(
|
|
160111
160214
|
projectYml,
|
|
160112
160215
|
storeConfig,
|
|
160113
|
-
await appIconState(
|
|
160216
|
+
await appIconState(join75(appDir(app), "ios")),
|
|
160114
160217
|
profileAccount(app, storeConfig, opts)
|
|
160115
160218
|
);
|
|
160116
160219
|
findings.push(...analyzeListing(metadataFilesPresent(app), listScreenshots(app)));
|
|
@@ -160139,16 +160242,16 @@ function analyzeSubmissionRecord(appLevel, review, opts) {
|
|
|
160139
160242
|
return f2;
|
|
160140
160243
|
}
|
|
160141
160244
|
function appLevelMetadataFiles(app, locale = "en-US") {
|
|
160142
|
-
const root =
|
|
160245
|
+
const root = join75(storeDir(app), "metadata");
|
|
160143
160246
|
const out2 = /* @__PURE__ */ new Set();
|
|
160144
160247
|
if (existsSync74(root)) {
|
|
160145
160248
|
for (const n2 of readdirSync33(root)) if (n2.endsWith(".txt")) out2.add(n2);
|
|
160146
160249
|
}
|
|
160147
|
-
if (existsSync74(
|
|
160250
|
+
if (existsSync74(join75(root, locale, "privacy_url.txt"))) out2.add("privacy_url.txt");
|
|
160148
160251
|
return out2;
|
|
160149
160252
|
}
|
|
160150
160253
|
function reviewInfoFiles(app) {
|
|
160151
|
-
const dir =
|
|
160254
|
+
const dir = join75(storeDir(app), "review_information");
|
|
160152
160255
|
if (!existsSync74(dir)) return /* @__PURE__ */ new Set();
|
|
160153
160256
|
return new Set(readdirSync33(dir).filter((n2) => n2.endsWith(".txt")));
|
|
160154
160257
|
}
|
|
@@ -160259,12 +160362,12 @@ function analyzePlayListing(assets) {
|
|
|
160259
160362
|
return f2;
|
|
160260
160363
|
}
|
|
160261
160364
|
function playListingAssets(app, locale = "en-US") {
|
|
160262
|
-
const dir =
|
|
160365
|
+
const dir = join75(storeDir(app), "play", locale, "images");
|
|
160263
160366
|
const read = (names) => {
|
|
160264
160367
|
for (const name of names) {
|
|
160265
|
-
const p2 =
|
|
160368
|
+
const p2 = join75(dir, name);
|
|
160266
160369
|
try {
|
|
160267
|
-
if (statSync19(p2).isFile()) return { name, bytes:
|
|
160370
|
+
if (statSync19(p2).isFile()) return { name, bytes: readFileSync89(p2) };
|
|
160268
160371
|
} catch {
|
|
160269
160372
|
}
|
|
160270
160373
|
}
|
|
@@ -160295,26 +160398,26 @@ function analyzeListing(metaFiles, shots) {
|
|
|
160295
160398
|
return f2;
|
|
160296
160399
|
}
|
|
160297
160400
|
function metadataFilesPresent(app, locale = "en-US") {
|
|
160298
|
-
const dir =
|
|
160401
|
+
const dir = join75(storeDir(app), "metadata", locale);
|
|
160299
160402
|
if (!existsSync74(dir)) return /* @__PURE__ */ new Set();
|
|
160300
160403
|
return new Set(readdirSync33(dir).filter((n2) => n2.endsWith(".txt")));
|
|
160301
160404
|
}
|
|
160302
160405
|
function listScreenshots(app, locale = "en-US") {
|
|
160303
160406
|
const out2 = [];
|
|
160304
|
-
const flat =
|
|
160407
|
+
const flat = join75(storeDir(app), "screenshots", locale);
|
|
160305
160408
|
if (existsSync74(flat)) {
|
|
160306
160409
|
for (const png of readdirSync33(flat).filter((n2) => n2.endsWith(".png"))) {
|
|
160307
|
-
const sz = pngSize(
|
|
160410
|
+
const sz = pngSize(readFileSync89(join75(flat, png)));
|
|
160308
160411
|
if (sz) out2.push({ name: png, w: sz.w, h: sz.h });
|
|
160309
160412
|
}
|
|
160310
160413
|
}
|
|
160311
|
-
const legacy =
|
|
160414
|
+
const legacy = join75(storeDir(app), "metadata", locale, "screenshots");
|
|
160312
160415
|
if (existsSync74(legacy)) {
|
|
160313
160416
|
for (const deviceDir of readdirSync33(legacy)) {
|
|
160314
|
-
const d2 =
|
|
160417
|
+
const d2 = join75(legacy, deviceDir);
|
|
160315
160418
|
if (!statSync19(d2).isDirectory()) continue;
|
|
160316
160419
|
for (const png of readdirSync33(d2).filter((n2) => n2.endsWith(".png"))) {
|
|
160317
|
-
const sz = pngSize(
|
|
160420
|
+
const sz = pngSize(readFileSync89(join75(d2, png)));
|
|
160318
160421
|
if (sz) out2.push({ name: `${deviceDir}/${png}`, w: sz.w, h: sz.h });
|
|
160319
160422
|
}
|
|
160320
160423
|
}
|
|
@@ -160322,13 +160425,13 @@ function listScreenshots(app, locale = "en-US") {
|
|
|
160322
160425
|
return out2;
|
|
160323
160426
|
}
|
|
160324
160427
|
function placeholderHashes2() {
|
|
160325
|
-
const templateIos =
|
|
160428
|
+
const templateIos = join75(appDir("_template"), "ios");
|
|
160326
160429
|
if (!existsSync74(templateIos)) return [LEGACY_PLACEHOLDER_SHA2562];
|
|
160327
160430
|
for (const target of readdirSync33(templateIos)) {
|
|
160328
|
-
const p2 =
|
|
160431
|
+
const p2 = join75(templateIos, target, "Assets.xcassets", "AppIcon.appiconset", "icon_1024.png");
|
|
160329
160432
|
try {
|
|
160330
160433
|
if (!statSync19(p2).isFile()) continue;
|
|
160331
|
-
return [LEGACY_PLACEHOLDER_SHA2562, createHash39("sha256").update(
|
|
160434
|
+
return [LEGACY_PLACEHOLDER_SHA2562, createHash39("sha256").update(readFileSync89(p2)).digest("hex")];
|
|
160332
160435
|
} catch {
|
|
160333
160436
|
}
|
|
160334
160437
|
}
|
|
@@ -160361,10 +160464,10 @@ async function pixelIssues(bytes2) {
|
|
|
160361
160464
|
async function appIconState(iosDir) {
|
|
160362
160465
|
if (!existsSync74(iosDir)) return { exists: false, isPlaceholder: false, storeIssues: [] };
|
|
160363
160466
|
for (const target of readdirSync33(iosDir)) {
|
|
160364
|
-
const p2 =
|
|
160467
|
+
const p2 = join75(iosDir, target, "Assets.xcassets", "AppIcon.appiconset", "icon_1024.png");
|
|
160365
160468
|
try {
|
|
160366
160469
|
if (!statSync19(p2).isFile()) continue;
|
|
160367
|
-
const bytes2 =
|
|
160470
|
+
const bytes2 = readFileSync89(p2);
|
|
160368
160471
|
const hash2 = createHash39("sha256").update(bytes2).digest("hex");
|
|
160369
160472
|
const pixels = await pixelIssues(bytes2);
|
|
160370
160473
|
return {
|
|
@@ -160431,7 +160534,7 @@ __export(asc_status_exports, {
|
|
|
160431
160534
|
ascStatus: () => ascStatus,
|
|
160432
160535
|
buildVerdict: () => buildVerdict
|
|
160433
160536
|
});
|
|
160434
|
-
import { readFileSync as
|
|
160537
|
+
import { readFileSync as readFileSync90 } from "node:fs";
|
|
160435
160538
|
function buildVerdict(builds) {
|
|
160436
160539
|
if (!builds.length) {
|
|
160437
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).";
|
|
@@ -160445,7 +160548,7 @@ function buildVerdict(builds) {
|
|
|
160445
160548
|
function client(creds) {
|
|
160446
160549
|
const env = creds ?? requireEnv(["ASC_KEY_ID", "ASC_ISSUER_ID", "ASC_KEY_PATH"]);
|
|
160447
160550
|
assertCredentialOutsideRepo("ASC_KEY_PATH", env.ASC_KEY_PATH);
|
|
160448
|
-
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));
|
|
160449
160552
|
return async (path2) => {
|
|
160450
160553
|
const r2 = await fetch(`${ASC}${path2}`, { headers: { Authorization: `Bearer ${jwt}` } });
|
|
160451
160554
|
return { status: r2.status, json: await r2.json().catch(() => ({})) };
|
|
@@ -160605,7 +160708,7 @@ __export(secrets_exports, {
|
|
|
160605
160708
|
runRemoteSecretsCommand: () => runRemoteSecretsCommand,
|
|
160606
160709
|
runSecretsCommand: () => runSecretsCommand
|
|
160607
160710
|
});
|
|
160608
|
-
import { readFileSync as
|
|
160711
|
+
import { readFileSync as readFileSync91 } from "node:fs";
|
|
160609
160712
|
function environment(value) {
|
|
160610
160713
|
if (value === "preview" || value === "production") return value;
|
|
160611
160714
|
throw new Error("--environment must be preview or production");
|
|
@@ -160636,7 +160739,7 @@ async function runSecretsCommand(operation, flags, io2, options = {}) {
|
|
|
160636
160739
|
io2.log(JSON.stringify(await vault.list({ app, environment: env })));
|
|
160637
160740
|
return 0;
|
|
160638
160741
|
}
|
|
160639
|
-
const value = options.readValue ? options.readValue() :
|
|
160742
|
+
const value = options.readValue ? options.readValue() : readFileSync91(0, "utf8").replace(/\r?\n$/, "");
|
|
160640
160743
|
if (operation === "set") await vault.set({ app, environment: env, name, value });
|
|
160641
160744
|
else if (operation === "rotate") await vault.rotate({ app, environment: env, name, value });
|
|
160642
160745
|
else throw new Error(`unknown secrets operation ${operation}`);
|
|
@@ -160665,7 +160768,7 @@ async function runRemoteSecretsCommand(operation, flags, io2, options) {
|
|
|
160665
160768
|
}
|
|
160666
160769
|
let body;
|
|
160667
160770
|
if (operation !== "list") {
|
|
160668
|
-
const value = options.readValue ? options.readValue() :
|
|
160771
|
+
const value = options.readValue ? options.readValue() : readFileSync91(0, "utf8").replace(/\r?\n$/, "");
|
|
160669
160772
|
body = JSON.stringify({ value });
|
|
160670
160773
|
}
|
|
160671
160774
|
const response = await (options.fetchImpl ?? fetch)(url, { method: operation === "list" ? "GET" : operation === "set" ? "PUT" : "POST", headers: headers2, body });
|
|
@@ -161163,15 +161266,15 @@ __export(notify_exports, {
|
|
|
161163
161266
|
runNotify: () => runNotify,
|
|
161164
161267
|
saveAdminSession: () => saveAdminSession
|
|
161165
161268
|
});
|
|
161166
|
-
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";
|
|
161167
161270
|
import { homedir as homedir9 } from "node:os";
|
|
161168
|
-
import { dirname as dirname39, join as
|
|
161271
|
+
import { dirname as dirname39, join as join76 } from "node:path";
|
|
161169
161272
|
function defaultSessionsPath() {
|
|
161170
|
-
return process.env.HIMI_ADMIN_SESSIONS_FILE ??
|
|
161273
|
+
return process.env.HIMI_ADMIN_SESSIONS_FILE ?? join76(homedir9(), ".himalaya", "admin-sessions.json");
|
|
161171
161274
|
}
|
|
161172
161275
|
function loadSessionsFile(path2 = defaultSessionsPath()) {
|
|
161173
161276
|
try {
|
|
161174
|
-
return JSON.parse(
|
|
161277
|
+
return JSON.parse(readFileSync92(path2, "utf8"));
|
|
161175
161278
|
} catch {
|
|
161176
161279
|
return {};
|
|
161177
161280
|
}
|
|
@@ -161548,20 +161651,20 @@ __export(base44_auth_exports, {
|
|
|
161548
161651
|
usableBase44Auth: () => usableBase44Auth,
|
|
161549
161652
|
writeBase44Session: () => writeBase44Session
|
|
161550
161653
|
});
|
|
161551
|
-
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";
|
|
161552
161655
|
import { homedir as homedir10 } from "node:os";
|
|
161553
|
-
import { dirname as dirname40, join as
|
|
161656
|
+
import { dirname as dirname40, join as join77 } from "node:path";
|
|
161554
161657
|
function base44ApiBase(env = process.env) {
|
|
161555
161658
|
return (env.BASE44_API_URL?.trim() || "https://app.base44.com").replace(/\/+$/, "");
|
|
161556
161659
|
}
|
|
161557
161660
|
function base44SessionPath(home = homedir10()) {
|
|
161558
|
-
return
|
|
161661
|
+
return join77(home, ".himi", "base44", "session.json");
|
|
161559
161662
|
}
|
|
161560
161663
|
function readBase44Session(home) {
|
|
161561
161664
|
const p2 = base44SessionPath(home);
|
|
161562
161665
|
if (!existsSync75(p2)) return void 0;
|
|
161563
161666
|
try {
|
|
161564
|
-
const s2 = JSON.parse(
|
|
161667
|
+
const s2 = JSON.parse(readFileSync93(p2, "utf8"));
|
|
161565
161668
|
return typeof s2.accessToken === "string" && s2.accessToken ? s2 : void 0;
|
|
161566
161669
|
} catch {
|
|
161567
161670
|
return void 0;
|
|
@@ -161672,9 +161775,9 @@ async function base44DeviceLogin(opts) {
|
|
|
161672
161775
|
throw new Error("the Base44 sign-in code expired before it was approved \u2014 run `himi base44 login` again");
|
|
161673
161776
|
}
|
|
161674
161777
|
function importBase44CliSession(home = homedir10(), env = process.env) {
|
|
161675
|
-
const src =
|
|
161778
|
+
const src = join77(home, ".base44", "auth", "auth.json");
|
|
161676
161779
|
if (!existsSync75(src)) throw new Error(`no Base44 CLI session at ${src} \u2014 run \`npx base44 login\` first, or use \`himi base44 login\``);
|
|
161677
|
-
const a2 = JSON.parse(
|
|
161780
|
+
const a2 = JSON.parse(readFileSync93(src, "utf8"));
|
|
161678
161781
|
if (typeof a2.accessToken !== "string" || !a2.accessToken) throw new Error(`${src} holds no access token`);
|
|
161679
161782
|
const session = {
|
|
161680
161783
|
accessToken: a2.accessToken,
|
|
@@ -163809,7 +163912,7 @@ var init_brand_font = __esm({
|
|
|
163809
163912
|
|
|
163810
163913
|
// src/site-analyze/write-artifacts.ts
|
|
163811
163914
|
import { mkdirSync as mkdirSync37, writeFileSync as writeFileSync33 } from "node:fs";
|
|
163812
|
-
import { join as
|
|
163915
|
+
import { join as join78 } from "node:path";
|
|
163813
163916
|
function attachVeloSources(book, sources, put) {
|
|
163814
163917
|
const byPath = new Map((sources ?? []).map((s2) => [s2.path, s2.text]));
|
|
163815
163918
|
for (const f2 of book.velo.files) {
|
|
@@ -163964,12 +164067,12 @@ async function downloadMedia(book, fetchImpl, put) {
|
|
|
163964
164067
|
}
|
|
163965
164068
|
async function writeBusinessBook(result, opts) {
|
|
163966
164069
|
const out2 = opts.outDir;
|
|
163967
|
-
mkdirSync37(
|
|
163968
|
-
mkdirSync37(
|
|
164070
|
+
mkdirSync37(join78(out2, "evidence/pages"), { recursive: true });
|
|
164071
|
+
mkdirSync37(join78(out2, "media/catalog"), { recursive: true });
|
|
163969
164072
|
const files = [];
|
|
163970
164073
|
const put = (rel, body) => {
|
|
163971
|
-
const p2 =
|
|
163972
|
-
mkdirSync37(
|
|
164074
|
+
const p2 = join78(out2, rel);
|
|
164075
|
+
mkdirSync37(join78(p2, ".."), { recursive: true });
|
|
163973
164076
|
writeFileSync33(p2, body);
|
|
163974
164077
|
files.push(rel);
|
|
163975
164078
|
};
|
|
@@ -164873,11 +164976,11 @@ var init_analyze = __esm({
|
|
|
164873
164976
|
});
|
|
164874
164977
|
|
|
164875
164978
|
// src/base44-analyze/write-artifacts.ts
|
|
164876
|
-
import { existsSync as existsSync76, mkdirSync as mkdirSync38, readFileSync as
|
|
164877
|
-
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";
|
|
164878
164981
|
function isBookFolder(dir) {
|
|
164879
164982
|
try {
|
|
164880
|
-
return JSON.parse(
|
|
164983
|
+
return JSON.parse(readFileSync94(join79(dir, "book.json"), "utf8")).kind === "base44-app-book";
|
|
164881
164984
|
} catch {
|
|
164882
164985
|
return false;
|
|
164883
164986
|
}
|
|
@@ -164964,24 +165067,24 @@ function writeBase44Book(result, outDir, opts = {}) {
|
|
|
164964
165067
|
const md = renderBookMd(book);
|
|
164965
165068
|
assertNoSecrets(json6);
|
|
164966
165069
|
assertNoSecrets(md);
|
|
164967
|
-
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)));
|
|
164968
165071
|
if (owned.length) {
|
|
164969
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`);
|
|
164970
|
-
for (const d2 of ["source", "screenshots"]) rmSync20(
|
|
165073
|
+
for (const d2 of ["source", "screenshots"]) rmSync20(join79(out2, d2), { recursive: true, force: true });
|
|
164971
165074
|
}
|
|
164972
165075
|
mkdirSync38(out2, { recursive: true });
|
|
164973
|
-
writeFileSync34(
|
|
164974
|
-
writeFileSync34(
|
|
165076
|
+
writeFileSync34(join79(out2, "book.json"), json6);
|
|
165077
|
+
writeFileSync34(join79(out2, "BOOK.md"), md);
|
|
164975
165078
|
files.push("book.json", "BOOK.md");
|
|
164976
165079
|
for (const s2 of shots) {
|
|
164977
|
-
mkdirSync38(
|
|
164978
|
-
writeFileSync34(
|
|
165080
|
+
mkdirSync38(join79(out2, "screenshots"), { recursive: true });
|
|
165081
|
+
writeFileSync34(join79(out2, "screenshots", s2.filename), s2.bytes);
|
|
164979
165082
|
files.push(`screenshots/${s2.filename}`);
|
|
164980
165083
|
}
|
|
164981
|
-
const sourceRoot =
|
|
165084
|
+
const sourceRoot = join79(out2, "source");
|
|
164982
165085
|
for (const f2 of result.sourceFiles) {
|
|
164983
165086
|
if (!safeRel(f2.path)) continue;
|
|
164984
|
-
const dest =
|
|
165087
|
+
const dest = join79(sourceRoot, ...f2.path.split("/"));
|
|
164985
165088
|
if (!dest.startsWith(sourceRoot + sep19)) continue;
|
|
164986
165089
|
mkdirSync38(dirname41(dest), { recursive: true });
|
|
164987
165090
|
writeFileSync34(dest, f2.bytes);
|
|
@@ -168527,7 +168630,7 @@ __export(cli_exports, {
|
|
|
168527
168630
|
import { execFile } from "node:child_process";
|
|
168528
168631
|
import { mkdirSync as mkdirSync39, mkdtempSync as mkdtempSync4, rmSync as rmSync21, writeFileSync as writeFileSync35 } from "node:fs";
|
|
168529
168632
|
import { tmpdir as tmpdir5 } from "node:os";
|
|
168530
|
-
import { join as
|
|
168633
|
+
import { join as join80, resolve as resolve57 } from "node:path";
|
|
168531
168634
|
import { promisify } from "node:util";
|
|
168532
168635
|
function projectDownloader(apiFetch, apiBase, token, extract = systemTar) {
|
|
168533
168636
|
return async (appId2) => {
|
|
@@ -168540,11 +168643,11 @@ function projectDownloader(apiFetch, apiBase, token, extract = systemTar) {
|
|
|
168540
168643
|
}
|
|
168541
168644
|
const bytes2 = await readCapped(res, MAX_TARBALL_BYTES);
|
|
168542
168645
|
if (!bytes2) throw new Error(`project download is over the ${MAX_TARBALL_BYTES}-byte cap`);
|
|
168543
|
-
const root = mkdtempSync4(
|
|
168646
|
+
const root = mkdtempSync4(join80(tmpdir5(), "himi-base44-"));
|
|
168544
168647
|
const cleanup = () => rmSync21(root, { recursive: true, force: true });
|
|
168545
168648
|
try {
|
|
168546
|
-
const archive =
|
|
168547
|
-
const dir =
|
|
168649
|
+
const archive = join80(root, "project.tar");
|
|
168650
|
+
const dir = join80(root, "project");
|
|
168548
168651
|
writeFileSync35(archive, bytes2);
|
|
168549
168652
|
mkdirSync39(dir);
|
|
168550
168653
|
await extract(archive, dir);
|
|
@@ -169839,8 +169942,8 @@ var init_customer_build = __esm({
|
|
|
169839
169942
|
});
|
|
169840
169943
|
|
|
169841
169944
|
// src/site-analyze/apply.ts
|
|
169842
|
-
import { existsSync as existsSync77, readFileSync as
|
|
169843
|
-
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";
|
|
169844
169947
|
import { spawnSync as spawnSync4 } from "node:child_process";
|
|
169845
169948
|
function unpairedRedirectNote(overlay) {
|
|
169846
169949
|
if (!overlay.wix?.clientId || overlay.wix.redirectUri) return void 0;
|
|
@@ -169855,7 +169958,7 @@ function committedShellProvisioning(path2) {
|
|
|
169855
169958
|
function findRepoRoot(cwd) {
|
|
169856
169959
|
let dir = cwd;
|
|
169857
169960
|
for (let i2 = 0; i2 < 8; i2++) {
|
|
169858
|
-
if (SHELL_NAMES2.some((name) => existsSync77(
|
|
169961
|
+
if (SHELL_NAMES2.some((name) => existsSync77(join81(dir, shellAppDir(name), "package.json")))) return dir;
|
|
169859
169962
|
const next = dirname42(dir);
|
|
169860
169963
|
if (next === dir) break;
|
|
169861
169964
|
dir = next;
|
|
@@ -169958,11 +170061,11 @@ function sameKnownSite(previous, next) {
|
|
|
169958
170061
|
}
|
|
169959
170062
|
function buildMergedContract(options) {
|
|
169960
170063
|
const { appDir: appDir3, packageDir, overlay } = options;
|
|
169961
|
-
const committedPath =
|
|
170064
|
+
const committedPath = join81(appDir3, "provisioning.json");
|
|
169962
170065
|
if (!existsSync77(committedPath)) {
|
|
169963
170066
|
throw new Error(`shell has no committed provisioning.json at ${committedPath} to build a contract from`);
|
|
169964
170067
|
}
|
|
169965
|
-
const committed = JSON.parse(
|
|
170068
|
+
const committed = JSON.parse(readFileSync95(committedPath, "utf8"));
|
|
169966
170069
|
const merged = mergeCustomerOwned(committed, overlay);
|
|
169967
170070
|
const overlayFontFamily = (overlay.branding ?? {}).fontFamily;
|
|
169968
170071
|
const branding = merged.branding ?? {};
|
|
@@ -169974,7 +170077,7 @@ function buildMergedContract(options) {
|
|
|
169974
170077
|
};
|
|
169975
170078
|
const stage = (fromRel, toRel) => {
|
|
169976
170079
|
const from = contained(packageDir, fromRel);
|
|
169977
|
-
const to2 = contained(
|
|
170080
|
+
const to2 = contained(join81(appDir3, STAGED), toRel.slice(STAGED.length + 1));
|
|
169978
170081
|
if (!from || !to2 || !existsSync77(from)) return void 0;
|
|
169979
170082
|
let real;
|
|
169980
170083
|
let realRoot;
|
|
@@ -169997,11 +170100,11 @@ function buildMergedContract(options) {
|
|
|
169997
170100
|
};
|
|
169998
170101
|
const icon = stage("media/icon.png", `${STAGED}/icon.png`);
|
|
169999
170102
|
if (icon) branding.appIconPath = icon;
|
|
170000
|
-
const facesPath =
|
|
170103
|
+
const facesPath = join81(packageDir, "media/fonts/faces.json");
|
|
170001
170104
|
if (existsSync77(facesPath)) {
|
|
170002
170105
|
let faces = [];
|
|
170003
170106
|
try {
|
|
170004
|
-
const parsed = JSON.parse(
|
|
170107
|
+
const parsed = JSON.parse(readFileSync95(facesPath, "utf8"));
|
|
170005
170108
|
faces = Array.isArray(parsed) ? parsed : [];
|
|
170006
170109
|
} catch {
|
|
170007
170110
|
faces = [];
|
|
@@ -170022,9 +170125,9 @@ function buildMergedContract(options) {
|
|
|
170022
170125
|
merged.branding = branding;
|
|
170023
170126
|
const body = `${JSON.stringify(merged, null, 2)}
|
|
170024
170127
|
`;
|
|
170025
|
-
const path2 =
|
|
170128
|
+
const path2 = join81(packageDir, "provisioning.contract.json");
|
|
170026
170129
|
writeFileSync36(path2, body);
|
|
170027
|
-
const localPath2 =
|
|
170130
|
+
const localPath2 = join81(appDir3, LOCAL_CONTRACT_REL);
|
|
170028
170131
|
mkdirSync40(dirname42(localPath2), { recursive: true });
|
|
170029
170132
|
writeFileSync36(localPath2, body);
|
|
170030
170133
|
staged.push(localPath2);
|
|
@@ -170059,10 +170162,10 @@ function catalogTypography(overlay, template) {
|
|
|
170059
170162
|
function staticFaqFor(overlay, overlayPath) {
|
|
170060
170163
|
const own4 = overlay.faq;
|
|
170061
170164
|
if (own4 !== void 0) return deriveStaticFaq(own4);
|
|
170062
|
-
const bookPath =
|
|
170165
|
+
const bookPath = join81(dirname42(resolve58(overlayPath)), "book.json");
|
|
170063
170166
|
if (!existsSync77(bookPath)) return void 0;
|
|
170064
170167
|
try {
|
|
170065
|
-
const book = JSON.parse(
|
|
170168
|
+
const book = JSON.parse(readFileSync95(bookPath, "utf8"));
|
|
170066
170169
|
const copy = book?.copy;
|
|
170067
170170
|
if (!copy || typeof copy !== "object" || copy.unavailable) return void 0;
|
|
170068
170171
|
const pairs = deriveStaticFaq(copy.faq);
|
|
@@ -170076,10 +170179,10 @@ function staticGalleriesFor(overlay, overlayPath) {
|
|
|
170076
170179
|
if (overlay.galleries !== void 0) return deriveStaticGalleries(
|
|
170077
170180
|
overlay.galleries.map((gallery) => ({ role: "gallery", title: gallery.title, galleryImageUrls: gallery.photos }))
|
|
170078
170181
|
);
|
|
170079
|
-
const bookPath =
|
|
170182
|
+
const bookPath = join81(dirname42(resolve58(overlayPath)), "book.json");
|
|
170080
170183
|
if (!existsSync77(bookPath)) return void 0;
|
|
170081
170184
|
try {
|
|
170082
|
-
const book = JSON.parse(
|
|
170185
|
+
const book = JSON.parse(readFileSync95(bookPath, "utf8"));
|
|
170083
170186
|
if (!book.look || book.look.unavailable || !Array.isArray(book.look.pages)) return void 0;
|
|
170084
170187
|
const galleries = deriveStaticGalleries(book.look.pages);
|
|
170085
170188
|
return galleries.length || book.look.complete === true ? galleries : void 0;
|
|
@@ -170091,8 +170194,8 @@ async function applyOverlays(input) {
|
|
|
170091
170194
|
const cwd = resolve58(input.cwd);
|
|
170092
170195
|
const shell = input.shell ?? DEFAULT_BRANDABLE_SHELL;
|
|
170093
170196
|
assertKnownShell(shell);
|
|
170094
|
-
const overlay = JSON.parse(
|
|
170095
|
-
const tokens2 = JSON.parse(
|
|
170197
|
+
const overlay = JSON.parse(readFileSync95(input.overlayPath, "utf8"));
|
|
170198
|
+
const tokens2 = JSON.parse(readFileSync95(input.tokensPath, "utf8"));
|
|
170096
170199
|
const faq = staticFaqFor(overlay, input.overlayPath);
|
|
170097
170200
|
if (faq !== void 0) overlay.faq = faq;
|
|
170098
170201
|
const galleries = staticGalleriesFor(overlay, input.overlayPath);
|
|
@@ -170109,9 +170212,9 @@ async function applyOverlays(input) {
|
|
|
170109
170212
|
`shell "${shell}" cannot bake a customer brand \u2014 it ships no prepare:customer script`
|
|
170110
170213
|
);
|
|
170111
170214
|
}
|
|
170112
|
-
const appDir3 =
|
|
170113
|
-
const committedPath =
|
|
170114
|
-
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;
|
|
170115
170218
|
if (committedSite !== void 0 && overlay.site === void 0) {
|
|
170116
170219
|
throw new Error(
|
|
170117
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.`
|
|
@@ -170138,9 +170241,9 @@ async function applyOverlays(input) {
|
|
|
170138
170241
|
note: `prepare:customer --contract with a merged contract (committed provisioning.json untouched)${unpairedInRepo ? ` \xB7 ${unpairedInRepo}` : ""}`
|
|
170139
170242
|
};
|
|
170140
170243
|
}
|
|
170141
|
-
const pkgProv =
|
|
170244
|
+
const pkgProv = join81(cwd, "provisioning.json");
|
|
170142
170245
|
assertNotCommitted(pkgProv, input.forbiddenProvisioning);
|
|
170143
|
-
const contentPath =
|
|
170246
|
+
const contentPath = join81(cwd, "himalaya.content.json");
|
|
170144
170247
|
const syncViewNames = (before, after) => {
|
|
170145
170248
|
const content = readContentManifest(cwd);
|
|
170146
170249
|
if (!content) return;
|
|
@@ -170153,7 +170256,7 @@ async function applyOverlays(input) {
|
|
|
170153
170256
|
let packageFaq = faq;
|
|
170154
170257
|
let packageGalleries = galleries;
|
|
170155
170258
|
if (existsSync77(pkgProv)) {
|
|
170156
|
-
const cur = JSON.parse(
|
|
170259
|
+
const cur = JSON.parse(readFileSync95(pkgProv, "utf8"));
|
|
170157
170260
|
if (galleries === void 0 && !sameKnownSite(cur, overlay)) overlay.galleries = [];
|
|
170158
170261
|
const merged = deepMerge4(cur, overlay);
|
|
170159
170262
|
packageFaq = merged.faq;
|
|
@@ -170169,9 +170272,9 @@ async function applyOverlays(input) {
|
|
|
170169
170272
|
if (Array.isArray(packageGalleries) && packageGalleries.length && !overlay.installedVerticals.includes("galleries")) {
|
|
170170
170273
|
overlay.installedVerticals.push("galleries");
|
|
170171
170274
|
}
|
|
170172
|
-
const pkgTokens =
|
|
170275
|
+
const pkgTokens = join81(cwd, "tokens.json");
|
|
170173
170276
|
if (existsSync77(pkgTokens) && (tokens2.colors || tokens2.typography)) {
|
|
170174
|
-
const cur = JSON.parse(
|
|
170277
|
+
const cur = JSON.parse(readFileSync95(pkgTokens, "utf8"));
|
|
170175
170278
|
let tokensIn = tokens2;
|
|
170176
170279
|
if (tokens2.typography) {
|
|
170177
170280
|
const fonts = catalogTypography(tokens2.typography, cur.typography);
|
|
@@ -170196,9 +170299,9 @@ async function applyOverlays(input) {
|
|
|
170196
170299
|
wrote.push(pkgTokens);
|
|
170197
170300
|
}
|
|
170198
170301
|
const homeAction = homeRefreshActionId(shell);
|
|
170199
|
-
const homeSrc =
|
|
170302
|
+
const homeSrc = join81(cwd, "dev/index.ts");
|
|
170200
170303
|
if (homeAction && existsSync77(homeSrc)) {
|
|
170201
|
-
const prev =
|
|
170304
|
+
const prev = readFileSync95(homeSrc, "utf8");
|
|
170202
170305
|
const patched = patchBrandParams(prev, overlay, homeAction);
|
|
170203
170306
|
let next = patched.src;
|
|
170204
170307
|
if (!patched.foreign && faq?.length && prev.includes('"tier5.himiBrandedFaq.load"') && !prev.includes('"staticFaq"')) {
|
|
@@ -171197,7 +171300,7 @@ __export(cli_exports2, {
|
|
|
171197
171300
|
runSiteAnalyze: () => runSiteAnalyze,
|
|
171198
171301
|
runSiteFunctionCli: () => runSiteFunctionCli
|
|
171199
171302
|
});
|
|
171200
|
-
import { existsSync as existsSync78, readFileSync as
|
|
171303
|
+
import { existsSync as existsSync78, readFileSync as readFileSync96 } from "node:fs";
|
|
171201
171304
|
import { resolve as resolve59 } from "node:path";
|
|
171202
171305
|
function applyNeedsClient(shell) {
|
|
171203
171306
|
if (shell === void 0 || !SHELL_NAMES2.includes(shell)) return true;
|
|
@@ -171256,7 +171359,7 @@ async function runSiteAnalyze(opts) {
|
|
|
171256
171359
|
const prevOverlayPath = resolve59(outDir, "provisioning.overlay.json");
|
|
171257
171360
|
const prevSite = existsSync78(prevOverlayPath) ? (() => {
|
|
171258
171361
|
try {
|
|
171259
|
-
return JSON.parse(
|
|
171362
|
+
return JSON.parse(readFileSync96(prevOverlayPath, "utf8")).site;
|
|
171260
171363
|
} catch {
|
|
171261
171364
|
return void 0;
|
|
171262
171365
|
}
|
|
@@ -171275,7 +171378,7 @@ async function runSiteAnalyze(opts) {
|
|
|
171275
171378
|
}
|
|
171276
171379
|
const previousOverlay = resolve59(outDir, "provisioning.overlay.json");
|
|
171277
171380
|
carryOverGoals(
|
|
171278
|
-
existsSync78(previousOverlay) ?
|
|
171381
|
+
existsSync78(previousOverlay) ? readFileSync96(previousOverlay, "utf8") : void 0,
|
|
171279
171382
|
result.provisioningOverlay
|
|
171280
171383
|
);
|
|
171281
171384
|
const ownerCall = ownerAuth ? ownerTransportFrom(fetchImpl, ownerAuth) : void 0;
|
|
@@ -171333,7 +171436,7 @@ async function runSiteFunctionCli(opts) {
|
|
|
171333
171436
|
let source;
|
|
171334
171437
|
if (opts.sourcePath) {
|
|
171335
171438
|
const p2 = resolve59(opts.cwd ?? process.cwd(), opts.sourcePath);
|
|
171336
|
-
source =
|
|
171439
|
+
source = readFileSync96(p2, "utf8");
|
|
171337
171440
|
}
|
|
171338
171441
|
let body;
|
|
171339
171442
|
if (opts.bodyRaw != null) {
|
|
@@ -171363,7 +171466,7 @@ async function runSiteFunctionCli(opts) {
|
|
|
171363
171466
|
function base44BookRoutes(bookPath, siteUrl) {
|
|
171364
171467
|
if (!existsSync78(bookPath)) return void 0;
|
|
171365
171468
|
try {
|
|
171366
|
-
const book = JSON.parse(
|
|
171469
|
+
const book = JSON.parse(readFileSync96(bookPath, "utf8"));
|
|
171367
171470
|
if (book.kind !== "base44-app-book" || !Array.isArray(book.routes)) return void 0;
|
|
171368
171471
|
const host = (u2) => {
|
|
171369
171472
|
try {
|
|
@@ -171618,7 +171721,7 @@ __export(site_create_exports, {
|
|
|
171618
171721
|
runSiteList: () => runSiteList,
|
|
171619
171722
|
writeProvisioningBinding: () => writeProvisioningBinding
|
|
171620
171723
|
});
|
|
171621
|
-
import { existsSync as existsSync79, readFileSync as
|
|
171724
|
+
import { existsSync as existsSync79, readFileSync as readFileSync97, writeFileSync as writeFileSync37 } from "node:fs";
|
|
171622
171725
|
import { resolve as resolvePath2 } from "node:path";
|
|
171623
171726
|
function oauthClientName(projectName) {
|
|
171624
171727
|
return `${projectName} client`;
|
|
@@ -171767,7 +171870,7 @@ async function runSiteCreate(opts) {
|
|
|
171767
171870
|
if (!wantOauthApp) return { ...base, nextSteps: nextSteps(metaSiteId) };
|
|
171768
171871
|
return { ...base, clientId, redirectUri, nextSteps: nextSteps(metaSiteId, clientId) };
|
|
171769
171872
|
}
|
|
171770
|
-
function writeProvisioningBinding(target, binding2, fs2 = { existsSync: existsSync79, readFileSync:
|
|
171873
|
+
function writeProvisioningBinding(target, binding2, fs2 = { existsSync: existsSync79, readFileSync: readFileSync97, writeFileSync: writeFileSync37 }) {
|
|
171771
171874
|
const msid = binding2.siteId;
|
|
171772
171875
|
const path2 = resolvePath2(target);
|
|
171773
171876
|
const committed = committedShellProvisioning(path2);
|
|
@@ -172443,12 +172546,12 @@ var init_context = __esm({
|
|
|
172443
172546
|
});
|
|
172444
172547
|
|
|
172445
172548
|
// src/cli.ts
|
|
172446
|
-
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";
|
|
172447
172550
|
import { execFile as execFile2, execFileSync as execFileSync7, spawnSync as spawnSync5, spawn as spawn7 } from "node:child_process";
|
|
172448
172551
|
import { AsyncLocalStorage as AsyncLocalStorage2 } from "node:async_hooks";
|
|
172449
172552
|
import { createHash as createHash41, randomUUID as randomUUID11 } from "node:crypto";
|
|
172450
172553
|
import { tmpdir as tmpdir6, homedir as homedir11, hostname as hostname2 } from "node:os";
|
|
172451
|
-
import { join as
|
|
172554
|
+
import { join as join82, resolve as resolve60, relative as relative15, basename as basename19, dirname as dirname43 } from "node:path";
|
|
172452
172555
|
import { fileURLToPath as fileURLToPath27 } from "node:url";
|
|
172453
172556
|
|
|
172454
172557
|
// ../serve-cli/src/client.ts
|
|
@@ -174602,8 +174705,8 @@ var str9 = (v2) => typeof v2 === "string" ? v2 : void 0;
|
|
|
174602
174705
|
var num3 = (v2) => typeof v2 === "string" && v2 !== "" && Number.isFinite(Number(v2)) ? Number(v2) : void 0;
|
|
174603
174706
|
function embeddedTemplateCatalog() {
|
|
174604
174707
|
return availableTemplates().map((name) => {
|
|
174605
|
-
const path2 =
|
|
174606
|
-
const meta = JSON.parse(
|
|
174708
|
+
const path2 = join82(templateSourceDir(name), TEMPLATE_META_FILE);
|
|
174709
|
+
const meta = JSON.parse(readFileSync98(path2, "utf8"));
|
|
174607
174710
|
if (!meta || typeof meta.title !== "string" || typeof meta.description !== "string" || !Array.isArray(meta.tags)) {
|
|
174608
174711
|
throw new Error(`${path2} must be { title: string, description: string, tags: string[], category?: string }`);
|
|
174609
174712
|
}
|
|
@@ -175474,7 +175577,7 @@ var COMMANDS2 = [
|
|
|
175474
175577
|
];
|
|
175475
175578
|
function cliVersion() {
|
|
175476
175579
|
try {
|
|
175477
|
-
return JSON.parse(
|
|
175580
|
+
return JSON.parse(readFileSync98(new URL("../package.json", import.meta.url), "utf8")).version ?? "unknown";
|
|
175478
175581
|
} catch {
|
|
175479
175582
|
return "unknown";
|
|
175480
175583
|
}
|
|
@@ -175599,7 +175702,7 @@ function ageInDays(publishedAt, now = Date.now()) {
|
|
|
175599
175702
|
}
|
|
175600
175703
|
function packageVersion(path2) {
|
|
175601
175704
|
try {
|
|
175602
|
-
const version4 = JSON.parse(
|
|
175705
|
+
const version4 = JSON.parse(readFileSync98(path2, "utf8")).version;
|
|
175603
175706
|
return typeof version4 === "string" && version4 ? version4 : void 0;
|
|
175604
175707
|
} catch {
|
|
175605
175708
|
return void 0;
|
|
@@ -175608,7 +175711,7 @@ function packageVersion(path2) {
|
|
|
175608
175711
|
function resolvedSdkVersion(fromDir = process.cwd(), bundledManifest = new URL("./authoring-runtime/node_modules/@wix/himalaya/package.json", import.meta.url)) {
|
|
175609
175712
|
let dir = resolve60(fromDir);
|
|
175610
175713
|
for (; ; ) {
|
|
175611
|
-
const version4 = packageVersion(
|
|
175714
|
+
const version4 = packageVersion(join82(dir, "node_modules", "@wix", "himalaya", "package.json"));
|
|
175612
175715
|
if (version4) return { version: version4, source: "local" };
|
|
175613
175716
|
const parent = dirname43(dir);
|
|
175614
175717
|
if (parent === dir) break;
|
|
@@ -175618,7 +175721,7 @@ function resolvedSdkVersion(fromDir = process.cwd(), bundledManifest = new URL("
|
|
|
175618
175721
|
if (bundled) return { version: bundled, source: "bundled" };
|
|
175619
175722
|
try {
|
|
175620
175723
|
const root = execFileSync7("npm", ["root", "-g"], { stdio: ["ignore", "pipe", "ignore"] }).toString().trim();
|
|
175621
|
-
const version4 = root ? packageVersion(
|
|
175724
|
+
const version4 = root ? packageVersion(join82(root, "@wix", "himalaya", "package.json")) : void 0;
|
|
175622
175725
|
return version4 ? { version: version4, source: "global" } : {};
|
|
175623
175726
|
} catch {
|
|
175624
175727
|
return {};
|
|
@@ -175665,11 +175768,11 @@ var UPDATE_RETRY_AFTER_FAILURE_MS = 60 * 60 * 1e3;
|
|
|
175665
175768
|
var UPDATE_SNOOZE_MS = 24 * 60 * 60 * 1e3;
|
|
175666
175769
|
var UPDATE_REEXEC_ENV = "HIMI_UPDATED_ONCE";
|
|
175667
175770
|
function updateCachePath(env = process.env) {
|
|
175668
|
-
return env.HIMI_UPDATE_CACHE_FILE ??
|
|
175771
|
+
return env.HIMI_UPDATE_CACHE_FILE ?? join82(homedir11(), ".himalaya", "update-check.json");
|
|
175669
175772
|
}
|
|
175670
175773
|
function readUpdateCache(path2) {
|
|
175671
175774
|
try {
|
|
175672
|
-
const parsed = JSON.parse(
|
|
175775
|
+
const parsed = JSON.parse(readFileSync98(path2, "utf8"));
|
|
175673
175776
|
return parsed && typeof parsed === "object" ? parsed : {};
|
|
175674
175777
|
} catch {
|
|
175675
175778
|
return {};
|
|
@@ -175738,11 +175841,11 @@ function createUpdateRunner(spawn8 = spawnSync5) {
|
|
|
175738
175841
|
},
|
|
175739
175842
|
installedVersion: () => {
|
|
175740
175843
|
const root = globalNodeModulesRoot();
|
|
175741
|
-
return root ? packageVersion(
|
|
175844
|
+
return root ? packageVersion(join82(root, "@wix", "himalaya-cli", "package.json")) : void 0;
|
|
175742
175845
|
},
|
|
175743
175846
|
reexec: (argv) => {
|
|
175744
175847
|
const root = globalNodeModulesRoot();
|
|
175745
|
-
const entry = root ?
|
|
175848
|
+
const entry = root ? join82(root, "@wix", "himalaya-cli", "dist", "cli.mjs") : void 0;
|
|
175746
175849
|
if (!entry || !existsSync80(entry)) return void 0;
|
|
175747
175850
|
const result = spawnSync5(process.execPath, [entry, ...argv], {
|
|
175748
175851
|
// inherit keeps PIPED STDIN working — commands that read stdin must survive a re-exec.
|
|
@@ -175790,7 +175893,7 @@ function staleUpdateLockFile(cachePath, now) {
|
|
|
175790
175893
|
for (const path2 of [`${cachePath}.lock.break`, `${cachePath}.lock`]) {
|
|
175791
175894
|
let content;
|
|
175792
175895
|
try {
|
|
175793
|
-
content =
|
|
175896
|
+
content = readFileSync98(path2, "utf8");
|
|
175794
175897
|
} catch {
|
|
175795
175898
|
continue;
|
|
175796
175899
|
}
|
|
@@ -175813,7 +175916,7 @@ function acquireUpdateLock(cachePath, now, hooks = {}) {
|
|
|
175813
175916
|
const mine = lockStamp(now);
|
|
175814
175917
|
const readLock = (path2) => {
|
|
175815
175918
|
try {
|
|
175816
|
-
return
|
|
175919
|
+
return readFileSync98(path2, "utf8");
|
|
175817
175920
|
} catch {
|
|
175818
175921
|
return void 0;
|
|
175819
175922
|
}
|
|
@@ -176405,7 +176508,7 @@ function executableOnPath(name, env = process.env) {
|
|
|
176405
176508
|
const suffixes = process.platform === "win32" ? (env.PATHEXT ?? ".COM;.EXE;.BAT;.CMD").split(";").filter(Boolean) : [""];
|
|
176406
176509
|
for (const dir of entries) {
|
|
176407
176510
|
for (const suffix of suffixes) {
|
|
176408
|
-
const candidate =
|
|
176511
|
+
const candidate = join82(dir, `${name}${suffix}`);
|
|
176409
176512
|
try {
|
|
176410
176513
|
if (!statSync21(candidate).isFile()) continue;
|
|
176411
176514
|
if (process.platform !== "win32") accessSync(candidate, constants4.X_OK);
|
|
@@ -176514,7 +176617,7 @@ async function nativeConfigAdvisories(app, configSource) {
|
|
|
176514
176617
|
const { iosProjectYml: iosProjectYml2 } = await Promise.resolve().then(() => (init_paths2(), paths_exports));
|
|
176515
176618
|
const { androidOptedIn: androidOptedIn3, LABEL_IOS_SPLASH: LABEL_IOS_SPLASH2 } = await Promise.resolve().then(() => (init_splash(), splash_exports));
|
|
176516
176619
|
const iosYmlPath = iosProjectYml2(app);
|
|
176517
|
-
const iosYml = existsSync80(iosYmlPath) ?
|
|
176620
|
+
const iosYml = existsSync80(iosYmlPath) ? readFileSync98(iosYmlPath, "utf8") : "";
|
|
176518
176621
|
let optedIn = iosYml.includes(LABEL_IOS_SPLASH2);
|
|
176519
176622
|
if (!optedIn) {
|
|
176520
176623
|
const { androidManifestPath: androidManifestPath3 } = await Promise.resolve().then(() => (init_gen_native_config(), gen_native_config_exports));
|
|
@@ -176528,7 +176631,7 @@ async function nativeConfigAdvisories(app, configSource) {
|
|
|
176528
176631
|
}
|
|
176529
176632
|
function readConfigSource(dir) {
|
|
176530
176633
|
try {
|
|
176531
|
-
return
|
|
176634
|
+
return readFileSync98(join82(dir, "config.ts"), "utf8");
|
|
176532
176635
|
} catch {
|
|
176533
176636
|
return null;
|
|
176534
176637
|
}
|
|
@@ -176582,7 +176685,7 @@ var NoBase44SlotError = class extends Error {
|
|
|
176582
176685
|
};
|
|
176583
176686
|
async function initFromRemoteTemplate(name, parentDir, template, c2, opts = {}) {
|
|
176584
176687
|
const dir = resolve60(parentDir, name);
|
|
176585
|
-
if (existsSync80(
|
|
176688
|
+
if (existsSync80(join82(dir, "himalaya.content.json"))) {
|
|
176586
176689
|
throw new Error(`content package already exists at ${dir}`);
|
|
176587
176690
|
}
|
|
176588
176691
|
const r2 = await c2.fetchTemplateSource(TEMPLATE_APP_PREFIX + template);
|
|
@@ -176643,7 +176746,7 @@ function restoreDestinationIssue(dest, force) {
|
|
|
176643
176746
|
function isHimalayaMonorepoCheckout(start) {
|
|
176644
176747
|
let dir = resolve60(start);
|
|
176645
176748
|
for (; ; ) {
|
|
176646
|
-
if (existsSync80(
|
|
176749
|
+
if (existsSync80(join82(dir, "tools", "himi-cli", "src", "cli.ts")) && existsSync80(join82(dir, "core", "serve", "src", "server.ts"))) return true;
|
|
176647
176750
|
const parent = dirname43(dir);
|
|
176648
176751
|
if (parent === dir) return false;
|
|
176649
176752
|
dir = parent;
|
|
@@ -176704,7 +176807,7 @@ function materializeForPreview(appDir3, slug, displayName2) {
|
|
|
176704
176807
|
Object.entries(files).map(([rel, body]) => [rel, rel === "himalaya.content.json" ? substituteIdentity(body, slug) : body])
|
|
176705
176808
|
);
|
|
176706
176809
|
const repoRoot2 = resolve60(fileURLToPath27(new URL("../../..", import.meta.url)));
|
|
176707
|
-
const root =
|
|
176810
|
+
const root = join82(repoRoot2, "node_modules", ".cache", "himi-template-preview");
|
|
176708
176811
|
const stillRunning = (pid) => {
|
|
176709
176812
|
try {
|
|
176710
176813
|
process.kill(pid, 0);
|
|
@@ -176718,12 +176821,12 @@ function materializeForPreview(appDir3, slug, displayName2) {
|
|
|
176718
176821
|
if (!entry.isDirectory()) continue;
|
|
176719
176822
|
const pid = Number(entry.name.startsWith(`${slug}-`) ? entry.name.slice(slug.length + 1) : NaN);
|
|
176720
176823
|
if (Number.isInteger(pid) && pid > 0 && pid !== process.pid && !stillRunning(pid)) {
|
|
176721
|
-
rmSync22(
|
|
176824
|
+
rmSync22(join82(root, entry.name), { recursive: true, force: true });
|
|
176722
176825
|
}
|
|
176723
176826
|
}
|
|
176724
176827
|
} catch {
|
|
176725
176828
|
}
|
|
176726
|
-
const dest =
|
|
176829
|
+
const dest = join82(root, `${slug}-${process.pid}`);
|
|
176727
176830
|
rmSync22(dest, { recursive: true, force: true });
|
|
176728
176831
|
mkdirSync41(dest, { recursive: true });
|
|
176729
176832
|
try {
|
|
@@ -176736,8 +176839,8 @@ function materializeForPreview(appDir3, slug, displayName2) {
|
|
|
176736
176839
|
}
|
|
176737
176840
|
async function appId(dir) {
|
|
176738
176841
|
try {
|
|
176739
|
-
const { readFileSync:
|
|
176740
|
-
const m2 = JSON.parse(
|
|
176842
|
+
const { readFileSync: readFileSync99 } = await import("node:fs");
|
|
176843
|
+
const m2 = JSON.parse(readFileSync99(join82(dir, "himalaya.content.json"), "utf8"));
|
|
176741
176844
|
if (m2.name) return m2.name;
|
|
176742
176845
|
} catch {
|
|
176743
176846
|
}
|
|
@@ -176745,8 +176848,8 @@ async function appId(dir) {
|
|
|
176745
176848
|
}
|
|
176746
176849
|
async function contentVisibility(dir) {
|
|
176747
176850
|
try {
|
|
176748
|
-
const { readFileSync:
|
|
176749
|
-
const m2 = JSON.parse(
|
|
176851
|
+
const { readFileSync: readFileSync99 } = await import("node:fs");
|
|
176852
|
+
const m2 = JSON.parse(readFileSync99(join82(dir, "himalaya.content.json"), "utf8"));
|
|
176750
176853
|
if (m2.visibility === "public" || m2.visibility === "unlisted") return m2.visibility;
|
|
176751
176854
|
} catch {
|
|
176752
176855
|
}
|
|
@@ -177035,7 +177138,7 @@ Seed your coding agent with \`himi agent-init\`. Guides: ${idx.portalUrl}`);
|
|
|
177035
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/" } : {},
|
|
177036
177139
|
// In a git repo the refresh moves the diff identity an earlier `himi test` attested (that
|
|
177037
177140
|
// hash is shared with the repo gates and deliberately exempts nothing but its own metadata).
|
|
177038
|
-
...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" } : {},
|
|
177039
177142
|
...res.skipped.length ? { skipped: res.skipped } : {},
|
|
177040
177143
|
portalUrl: idx.portalUrl
|
|
177041
177144
|
});
|
|
@@ -177058,7 +177161,7 @@ async function recordedReleaseForContentQuietly(dir, resolution, onDrift) {
|
|
|
177058
177161
|
try {
|
|
177059
177162
|
const { buildContentForValidation: buildContentForValidation2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
177060
177163
|
const bres = await buildContentForValidation2(dir, { resolution });
|
|
177061
|
-
out2 = mkdtempSync5(
|
|
177164
|
+
out2 = mkdtempSync5(join82(tmpdir6(), "himi-ux-record-"));
|
|
177062
177165
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
177063
177166
|
const outcome = await buildReleaseFromContent2(dir, out2, { ...hasWorkers ? { tier5Dir: bundleOutDir2(dir) } : {}, collect: { lint: true } });
|
|
177064
177167
|
const releaseId = outcome.manifest.releaseId;
|
|
@@ -177237,7 +177340,7 @@ async function producedWidgetFamilies(dir) {
|
|
|
177237
177340
|
let js2;
|
|
177238
177341
|
for (const candidate of [`${name}.bundle.js`, `${name}.js`, name]) {
|
|
177239
177342
|
try {
|
|
177240
|
-
js2 =
|
|
177343
|
+
js2 = readFileSync98(join82(outDir, candidate), "utf8");
|
|
177241
177344
|
break;
|
|
177242
177345
|
} catch {
|
|
177243
177346
|
}
|
|
@@ -177268,7 +177371,7 @@ async function producedWidgetFamilies(dir) {
|
|
|
177268
177371
|
}
|
|
177269
177372
|
return { families, source: "dist/bundles" };
|
|
177270
177373
|
}
|
|
177271
|
-
var boardOpen = (dir) => existsSync80(
|
|
177374
|
+
var boardOpen = (dir) => existsSync80(join82(dir, ".himi", "studio", "index.html"));
|
|
177272
177375
|
var BOARD_REFRESHERS = /* @__PURE__ */ new Set(["render", "test", "validate", "build", "push", "icon", "site", "ux", "progress"]);
|
|
177273
177376
|
async function leaveForBoard(dir, record2, value) {
|
|
177274
177377
|
if (!boardOpen(dir)) return;
|
|
@@ -177292,7 +177395,7 @@ async function liveMapFor(dir) {
|
|
|
177292
177395
|
}
|
|
177293
177396
|
var commandScratch = new AsyncLocalStorage2();
|
|
177294
177397
|
function commandScratchDir(prefix) {
|
|
177295
|
-
const dir = mkdtempSync5(
|
|
177398
|
+
const dir = mkdtempSync5(join82(tmpdir6(), prefix));
|
|
177296
177399
|
commandScratch.getStore()?.push(dir);
|
|
177297
177400
|
return dir;
|
|
177298
177401
|
}
|
|
@@ -177646,7 +177749,7 @@ himi v${cliVersion()} \u2014 run \`himi --version\`. If authoring commands fail
|
|
|
177646
177749
|
const owed = openApprovals2(readApprovals2(dir).events).length;
|
|
177647
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`);
|
|
177648
177751
|
}
|
|
177649
|
-
const planInParent = ["SPEC.md", "MOBILE-UX.md"].filter((f2) => existsSync80(
|
|
177752
|
+
const planInParent = ["SPEC.md", "MOBILE-UX.md"].filter((f2) => existsSync80(join82(parentDir, f2)));
|
|
177650
177753
|
if (planInParent.length) {
|
|
177651
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}`);
|
|
177652
177755
|
}
|
|
@@ -177807,13 +177910,13 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177807
177910
|
if (adding) {
|
|
177808
177911
|
const from = str9(flags.from);
|
|
177809
177912
|
if (!from) throw new TrimRefusal2('--add <id> needs --from <file> holding the whole new SCREENS entry (` "<id>": { "screenId": "<id>", \u2026 },`)');
|
|
177810
|
-
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"]) }));
|
|
177811
177914
|
return 0;
|
|
177812
177915
|
}
|
|
177813
177916
|
if (target) {
|
|
177814
177917
|
const from = str9(flags.from);
|
|
177815
177918
|
if (!from) throw new TrimRefusal2("--write <id> needs --from <file> holding the whole entry, as --show prints it");
|
|
177816
|
-
print(adopt.replaceScreen(dir, target,
|
|
177919
|
+
print(adopt.replaceScreen(dir, target, readFileSync98(from, "utf8")));
|
|
177817
177920
|
return 0;
|
|
177818
177921
|
}
|
|
177819
177922
|
if (show) {
|
|
@@ -177895,7 +177998,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177895
177998
|
const { keepFromSpec: keepFromSpec2 } = await Promise.resolve().then(() => (init_template_adopt(), template_adopt_exports));
|
|
177896
177999
|
const dir = contentDir(flags);
|
|
177897
178000
|
try {
|
|
177898
|
-
const spec = keepFromSpec2(dir, str9(flags["from-spec"]) ??
|
|
178001
|
+
const spec = keepFromSpec2(dir, str9(flags["from-spec"]) ?? join82(dir, "SPEC.md"));
|
|
177899
178002
|
const own4 = typeof keep === "string" ? keep.split(",").map((k2) => k2.trim()).filter(Boolean) : [];
|
|
177900
178003
|
keep = [.../* @__PURE__ */ new Set([...spec.keep, ...own4])].join(",");
|
|
177901
178004
|
fromSpec = { fromSpec: {
|
|
@@ -177936,7 +178039,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177936
178039
|
const result = { ...outcome.result, ...fromSpec };
|
|
177937
178040
|
const adoptDir = contentDir(flags);
|
|
177938
178041
|
const kept = flags["dry-run"] !== true && (outcome.code === 0 || outcome.result.forcedKeep === true);
|
|
177939
|
-
if (kept && existsSync80(
|
|
178042
|
+
if (kept && existsSync80(join82(adoptDir, adoptBits.ADOPT_FILE))) {
|
|
177940
178043
|
try {
|
|
177941
178044
|
const inv = adoptBits.inspectApp(adoptDir);
|
|
177942
178045
|
adoptBits.writeInventory(adoptDir, inv, { companions: "if-missing" });
|
|
@@ -177965,7 +178068,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177965
178068
|
const sourceDir = resolve60(str9(flags["source-dir"]) ?? appDir3);
|
|
177966
178069
|
let meta;
|
|
177967
178070
|
try {
|
|
177968
|
-
meta = JSON.parse(
|
|
178071
|
+
meta = JSON.parse(readFileSync98(join82(sourceDir, TEMPLATE_META_FILE), "utf8"));
|
|
177969
178072
|
} catch {
|
|
177970
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>)` }));
|
|
177971
178074
|
return 2;
|
|
@@ -177975,7 +178078,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177975
178078
|
return 2;
|
|
177976
178079
|
}
|
|
177977
178080
|
try {
|
|
177978
|
-
const appearance = extractTemplateAppearance(JSON.parse(
|
|
178081
|
+
const appearance = extractTemplateAppearance(JSON.parse(readFileSync98(join82(sourceDir, "tokens.json"), "utf8")));
|
|
177979
178082
|
meta = { ...appearance, ...meta };
|
|
177980
178083
|
} catch {
|
|
177981
178084
|
}
|
|
@@ -177997,7 +178100,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
177997
178100
|
const force = flags.force === true;
|
|
177998
178101
|
const { buildContentForValidation: buildContentForValidation2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
177999
178102
|
const bres = await buildContentForValidation2(buildDir, { resolution: resolutionFlag(flags) });
|
|
178000
|
-
const out2 = mkdtempSync5(
|
|
178103
|
+
const out2 = mkdtempSync5(join82(tmpdir6(), "himi-template-"));
|
|
178001
178104
|
publishScratch.push(out2);
|
|
178002
178105
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
178003
178106
|
const outcome = await buildReleaseFromContent2(buildDir, out2, {
|
|
@@ -178054,7 +178157,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178054
178157
|
let iconHash;
|
|
178055
178158
|
if (iconPath) {
|
|
178056
178159
|
try {
|
|
178057
|
-
const bytes2 =
|
|
178160
|
+
const bytes2 = readFileSync98(iconPath);
|
|
178058
178161
|
payload.icon = bytes2.toString("base64");
|
|
178059
178162
|
iconHash = createHash41("sha256").update(bytes2).digest("hex");
|
|
178060
178163
|
} catch {
|
|
@@ -178353,7 +178456,7 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178353
178456
|
const path2 = dpxSessionTokenPath();
|
|
178354
178457
|
let raw;
|
|
178355
178458
|
try {
|
|
178356
|
-
raw =
|
|
178459
|
+
raw = readFileSync98(path2, "utf8");
|
|
178357
178460
|
} catch {
|
|
178358
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`);
|
|
178359
178462
|
}
|
|
@@ -178487,8 +178590,8 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178487
178590
|
const dir = resolve60(out2);
|
|
178488
178591
|
const files = himiPluginFiles2(skills.skillMd);
|
|
178489
178592
|
for (const f2 of files) {
|
|
178490
|
-
mkdirSync41(dirname43(
|
|
178491
|
-
writeFileSync38(
|
|
178593
|
+
mkdirSync41(dirname43(join82(dir, f2.path)), { recursive: true });
|
|
178594
|
+
writeFileSync38(join82(dir, f2.path), f2.text);
|
|
178492
178595
|
}
|
|
178493
178596
|
print({ ok: true, dir, files: files.map((f2) => f2.path), next: [`claude plugin validate ${dir}`, `claude --plugin-dir ${dir}`] });
|
|
178494
178597
|
return 0;
|
|
@@ -178505,13 +178608,13 @@ ${doNow.map((l2) => ` ${l2}`).join("\n")}`);
|
|
|
178505
178608
|
case "studio": {
|
|
178506
178609
|
const { openStudio: openStudio2 } = await Promise.resolve().then(() => (init_studio(), studio_exports));
|
|
178507
178610
|
const dir = contentDir(flags);
|
|
178508
|
-
if (!existsSync80(
|
|
178611
|
+
if (!existsSync80(join82(dir, "himalaya.content.json"))) {
|
|
178509
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/" }));
|
|
178510
178613
|
return 2;
|
|
178511
178614
|
}
|
|
178512
178615
|
if (pos[1] === "reel") {
|
|
178513
178616
|
const { buildReel: buildReel2 } = await Promise.resolve().then(() => (init_studio_reel(), studio_reel_exports));
|
|
178514
|
-
const out2 = resolve60(str9(flags.out) ??
|
|
178617
|
+
const out2 = resolve60(str9(flags.out) ?? join82(dir, ".himi", "making-of.html"));
|
|
178515
178618
|
const { html, plan } = buildReel2(dir);
|
|
178516
178619
|
mkdirSync41(dirname43(out2), { recursive: true });
|
|
178517
178620
|
writeFileSync38(out2, html);
|
|
@@ -178583,7 +178686,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
178583
178686
|
} = await Promise.resolve().then(() => (init_progress(), progress_exports));
|
|
178584
178687
|
const dir = contentDir(flags);
|
|
178585
178688
|
const journal2 = journalPath2(dir);
|
|
178586
|
-
const isContentPackage = existsSync80(
|
|
178689
|
+
const isContentPackage = existsSync80(join82(dir, "himalaya.content.json"));
|
|
178587
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" };
|
|
178588
178691
|
const message = pos.slice(1).join(" ").trim();
|
|
178589
178692
|
const approvalFlags = ["approve", "done", "drop"].filter((f2) => flags[f2] !== void 0);
|
|
@@ -178735,7 +178838,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
178735
178838
|
case "test": {
|
|
178736
178839
|
const dir = contentDir(flags);
|
|
178737
178840
|
const structuredOutput = flags.json === true || io2.isTTY !== true;
|
|
178738
|
-
if (existsSync80(
|
|
178841
|
+
if (existsSync80(join82(dir, "functions"))) {
|
|
178739
178842
|
const { invokeLocalFunction: invokeLocalFunction2, loadFunctionsApp: loadFunctionsApp2 } = await Promise.resolve().then(() => (init_functions(), functions_exports));
|
|
178740
178843
|
const loaded = await loadFunctionsApp2(dir);
|
|
178741
178844
|
const results = [];
|
|
@@ -178867,7 +178970,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
178867
178970
|
io2.error(JSON.stringify({ error: `screen "${screen.screenId}" has no Tier-5 worker, so there is nothing for the browser loop to build` }));
|
|
178868
178971
|
return 2;
|
|
178869
178972
|
}
|
|
178870
|
-
const sources = collectWorkerSources2(
|
|
178973
|
+
const sources = collectWorkerSources2(join82(dir, "tier5-src"), screen.bundleName);
|
|
178871
178974
|
if (!sources) {
|
|
178872
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` }));
|
|
178873
178976
|
return 2;
|
|
@@ -179045,7 +179148,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
179045
179148
|
const sp = await runShotsPass2({
|
|
179046
179149
|
descriptors: scopeDescriptors2(outcome.descriptors ?? [], pos.slice(1), invalidScreens),
|
|
179047
179150
|
tokens: outcome.tokens,
|
|
179048
|
-
outDir:
|
|
179151
|
+
outDir: join82(dir, ".himi", "shots"),
|
|
179049
179152
|
width: 390,
|
|
179050
179153
|
layers: { rules: shotRules, ...cmsSeed ? { cmsSeed } : {}, ...canned ? { canned: canned.byKey } : {} },
|
|
179051
179154
|
...budgetMs ? { budgetMs } : {},
|
|
@@ -179085,7 +179188,7 @@ ${handover.hint[0].toUpperCase()}${handover.hint.slice(1)}.`);
|
|
|
179085
179188
|
releaseId: result.releaseId,
|
|
179086
179189
|
releasePayload: release2,
|
|
179087
179190
|
descriptors: attestedDescriptors,
|
|
179088
|
-
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)])),
|
|
179089
179192
|
coverage: {
|
|
179090
179193
|
screens: crawledScreens.size,
|
|
179091
179194
|
actionsDispatched: result.actions.exercised,
|
|
@@ -179210,7 +179313,7 @@ ${[...afterRun.next, ...testReminder ? [testReminder] : []].join("\n")}`);
|
|
|
179210
179313
|
return 2;
|
|
179211
179314
|
}
|
|
179212
179315
|
try {
|
|
179213
|
-
const raw = stateArg.trim().startsWith("{") ? stateArg :
|
|
179316
|
+
const raw = stateArg.trim().startsWith("{") ? stateArg : readFileSync98(stateArg.replace(/^@/, ""), "utf8");
|
|
179214
179317
|
injectedState = JSON.parse(raw);
|
|
179215
179318
|
} catch (e2) {
|
|
179216
179319
|
io2.error(JSON.stringify({ error: `--state must be inline JSON or a path to a .json file \u2014 ${e2.message}` }));
|
|
@@ -179225,7 +179328,7 @@ ${[...afterRun.next, ...testReminder ? [testReminder] : []].join("\n")}`);
|
|
|
179225
179328
|
return 2;
|
|
179226
179329
|
}
|
|
179227
179330
|
try {
|
|
179228
|
-
const raw = inputArg.trim().startsWith("{") ? inputArg :
|
|
179331
|
+
const raw = inputArg.trim().startsWith("{") ? inputArg : readFileSync98(inputArg.replace(/^@/, ""), "utf8");
|
|
179229
179332
|
const parsed = JSON.parse(raw);
|
|
179230
179333
|
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed)) throw new Error("must be a JSON object");
|
|
179231
179334
|
injectedInput = parsed;
|
|
@@ -179307,7 +179410,7 @@ ${[...afterRun.next, ...testReminder ? [testReminder] : []].join("\n")}`);
|
|
|
179307
179410
|
const diagnostics = (outcome.lint ?? []).find((s2) => s2.screenId === screenId)?.issues ?? [];
|
|
179308
179411
|
let pngFile;
|
|
179309
179412
|
let attestationPngFile;
|
|
179310
|
-
const shotPath =
|
|
179413
|
+
const shotPath = join82(dir, ".himi", "shots", `${screenId}.png`);
|
|
179311
179414
|
const pngTarget = typeof flags.png === "string" ? str9(flags.png) : flags.png === true ? shotPath : void 0;
|
|
179312
179415
|
if (pngTarget && r2.pngBase64) {
|
|
179313
179416
|
pngFile = writePngFile(pngTarget, r2.pngBase64);
|
|
@@ -179679,7 +179782,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
179679
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" }));
|
|
179680
179783
|
return 1;
|
|
179681
179784
|
}
|
|
179682
|
-
if (replace && occupied && !existsSync80(
|
|
179785
|
+
if (replace && occupied && !existsSync80(join82(dest, "himalaya.content.json"))) {
|
|
179683
179786
|
io2.error(JSON.stringify({
|
|
179684
179787
|
error: `${dest} is not a content package \u2014 refusing to --replace it`,
|
|
179685
179788
|
hint: "--replace only clears a directory that holds himalaya.content.json. Check --out/--name, or pass --force to merge into it instead."
|
|
@@ -180387,7 +180490,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180387
180490
|
}
|
|
180388
180491
|
const { buildContentForValidation: buildContentForValidation2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
180389
180492
|
const bres = await buildContentForValidation2(dir, { resolution: resolutionFlag(flags) });
|
|
180390
|
-
const built = mkdtempSync5(
|
|
180493
|
+
const built = mkdtempSync5(join82(tmpdir6(), "himi-pack-"));
|
|
180391
180494
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
180392
180495
|
const outcome = await buildReleaseFromContent2(dir, built, {
|
|
180393
180496
|
...hasWorkers ? { tier5Dir: bundleOutDir2(dir) } : {},
|
|
@@ -180594,7 +180697,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180594
180697
|
}));
|
|
180595
180698
|
return 1;
|
|
180596
180699
|
}
|
|
180597
|
-
const archive =
|
|
180700
|
+
const archive = readFileSync98(resolve60(file2));
|
|
180598
180701
|
const result = await client2().createPackageShare({
|
|
180599
180702
|
app: opened.header.app,
|
|
180600
180703
|
releaseId: opened.header.releaseId,
|
|
@@ -180691,11 +180794,11 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180691
180794
|
const app = await appId(dir2);
|
|
180692
180795
|
const { buildContentBundles: buildContentBundles2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
180693
180796
|
const bres = await buildContentBundles2(dir2, { resolution: resolutionFlag(flags) });
|
|
180694
|
-
temp = mkdtempSync5(
|
|
180797
|
+
temp = mkdtempSync5(join82(tmpdir6(), "himi-run-build-"));
|
|
180695
180798
|
const hasWorkers = bres.built.length > 0 || bres.compileErrors.length > 0;
|
|
180696
180799
|
const initial = await buildReleaseFromContent2(dir2, temp, { ...hasWorkers ? { tier5Dir: bundleOutDir2(dir2) } : {} });
|
|
180697
180800
|
servedMissing = initial.missingBundles;
|
|
180698
|
-
source =
|
|
180801
|
+
source = join82(temp, app);
|
|
180699
180802
|
}
|
|
180700
180803
|
const chromeArg = str9(flags.chrome) ?? "preview";
|
|
180701
180804
|
if (chromeArg !== "preview" && chromeArg !== "app") {
|
|
@@ -180734,7 +180837,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180734
180837
|
if (!recordKit) return;
|
|
180735
180838
|
startedAt = (/* @__PURE__ */ new Date()).toISOString();
|
|
180736
180839
|
const failure = record2(served2, { ok: true, at: startedAt });
|
|
180737
|
-
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.` }));
|
|
180738
180841
|
await refreshBoard();
|
|
180739
180842
|
};
|
|
180740
180843
|
const retract = async () => {
|
|
@@ -180770,7 +180873,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180770
180873
|
const watchKit = watch2 ? await Promise.resolve().then(() => (init_run_watch(), run_watch_exports)) : null;
|
|
180771
180874
|
const hhpPreviewRoute = watch2 ? (await Promise.resolve().then(() => (init_hhp_preview(), hhp_preview_exports))).hhpPreviewResponse : null;
|
|
180772
180875
|
const bus = watchKit ? new watchKit.ReloadBus() : void 0;
|
|
180773
|
-
if (watch2) served = mkdtempSync5(
|
|
180876
|
+
if (watch2) served = mkdtempSync5(join82(tmpdir6(), "himi-run-served-"));
|
|
180774
180877
|
const running = await runPackage2(source, {
|
|
180775
180878
|
port,
|
|
180776
180879
|
chrome: chromeArg,
|
|
@@ -180799,8 +180902,8 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180799
180902
|
await announce(running);
|
|
180800
180903
|
if (watchKit && bus) {
|
|
180801
180904
|
const { buildContentBundles: buildContentBundles2, buildReleaseFromContent: buildReleaseFromContent2, bundleOutDir: bundleOutDir2 } = await loadAuthoring();
|
|
180802
|
-
const live3 =
|
|
180803
|
-
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"));
|
|
180804
180907
|
let current = manifestOf(live3);
|
|
180805
180908
|
const failed3 = async (message) => {
|
|
180806
180909
|
if (stopping) return;
|
|
@@ -180811,7 +180914,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180811
180914
|
};
|
|
180812
180915
|
rebuild = watchKit.serialize(async () => {
|
|
180813
180916
|
const t0 = Date.now();
|
|
180814
|
-
const next = mkdtempSync5(
|
|
180917
|
+
const next = mkdtempSync5(join82(tmpdir6(), "himi-run-build-"));
|
|
180815
180918
|
try {
|
|
180816
180919
|
const bres = await buildContentBundles2(dir, { resolution: resolutionFlag(flags) });
|
|
180817
180920
|
if (bres.compileErrors.length) {
|
|
@@ -180828,16 +180931,16 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
180828
180931
|
return;
|
|
180829
180932
|
}
|
|
180830
180933
|
if (stopping) return;
|
|
180831
|
-
const fresh = manifestOf(
|
|
180934
|
+
const fresh = manifestOf(join82(next, running.app));
|
|
180832
180935
|
const diff = watchKit.diffReleases(current, fresh);
|
|
180833
180936
|
const { describeChanges: describeChanges2, headline: headline2 } = await Promise.resolve().then(() => (init_build_changes(), build_changes_exports));
|
|
180834
|
-
const changes = describeChanges2(live3,
|
|
180937
|
+
const changes = describeChanges2(live3, join82(next, running.app), diff);
|
|
180835
180938
|
const retired = `${live3}.retired-${Date.now()}`;
|
|
180836
180939
|
renameSync12(live3, retired);
|
|
180837
180940
|
try {
|
|
180838
|
-
renameSync12(
|
|
180941
|
+
renameSync12(join82(next, running.app), live3);
|
|
180839
180942
|
} catch {
|
|
180840
|
-
cpSync3(
|
|
180943
|
+
cpSync3(join82(next, running.app), live3, { recursive: true });
|
|
180841
180944
|
}
|
|
180842
180945
|
rmSync22(retired, { recursive: true, force: true });
|
|
180843
180946
|
current = fresh;
|
|
@@ -181520,7 +181623,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181520
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."
|
|
181521
181624
|
};
|
|
181522
181625
|
if (kind === "tokens" || kind === "app-config") {
|
|
181523
|
-
const body =
|
|
181626
|
+
const body = readFileSync98(file2, "utf8");
|
|
181524
181627
|
const patch2 = kind === "tokens" ? { tokens: body } : { appConfig: body };
|
|
181525
181628
|
return runReleasePatch({
|
|
181526
181629
|
...common,
|
|
@@ -181535,7 +181638,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181535
181638
|
io2.error(JSON.stringify({ error: "patch screen needs a <screenId>", usage: PATCH_USAGE }));
|
|
181536
181639
|
return 2;
|
|
181537
181640
|
}
|
|
181538
|
-
const descriptor =
|
|
181641
|
+
const descriptor = readFileSync98(file2, "utf8");
|
|
181539
181642
|
try {
|
|
181540
181643
|
JSON.parse(descriptor);
|
|
181541
181644
|
} catch (e2) {
|
|
@@ -181575,7 +181678,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181575
181678
|
extra: { kind, screen: id, file: { path: file2, bytes: Buffer.byteLength(descriptor, "utf8") } }
|
|
181576
181679
|
});
|
|
181577
181680
|
}
|
|
181578
|
-
const bytes2 =
|
|
181681
|
+
const bytes2 = readFileSync98(file2);
|
|
181579
181682
|
const sha2 = createHash41("sha256").update(bytes2).digest("hex");
|
|
181580
181683
|
const forScreens = (str9(flags["for-screen"]) ?? "").split(",").map((s2) => s2.trim()).filter(Boolean);
|
|
181581
181684
|
if (flags["no-rebind"] !== void 0 && flags["no-rebind"] !== true) {
|
|
@@ -181719,7 +181822,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
181719
181822
|
}
|
|
181720
181823
|
let def;
|
|
181721
181824
|
try {
|
|
181722
|
-
const parsed = JSON.parse(arg.startsWith("@") ?
|
|
181825
|
+
const parsed = JSON.parse(arg.startsWith("@") ? readFileSync98(arg.slice(1), "utf8") : arg);
|
|
181723
181826
|
if (parsed === null || typeof parsed !== "object" || Array.isArray(parsed)) {
|
|
181724
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}`] }));
|
|
181725
181828
|
return 2;
|
|
@@ -182001,7 +182104,7 @@ default (no --glyph): ${DEFAULT_GLYPH2} \u2014 a mark that claims nothing, so th
|
|
|
182001
182104
|
const rememberLastDist = async (jobs2) => {
|
|
182002
182105
|
try {
|
|
182003
182106
|
const dir = contentDir(flags);
|
|
182004
|
-
if (!existsSync80(
|
|
182107
|
+
if (!existsSync80(join82(dir, "himalaya.content.json"))) return;
|
|
182005
182108
|
const { lastDistFromJob: lastDistFromJob2, writeLastDist: writeLastDist2 } = await Promise.resolve().then(() => (init_capabilities(), capabilities_exports));
|
|
182006
182109
|
const own4 = await appId(dir);
|
|
182007
182110
|
for (const job of jobs2) {
|
|
@@ -182239,7 +182342,7 @@ ${label2}`);
|
|
|
182239
182342
|
const platform = str9(flags.platform)?.split(",").map((p2) => p2.trim()).filter(Boolean);
|
|
182240
182343
|
{
|
|
182241
182344
|
const distDir = contentDir(flags);
|
|
182242
|
-
if (existsSync80(
|
|
182345
|
+
if (existsSync80(join82(distDir, "himalaya.content.json"))) {
|
|
182243
182346
|
const issues = await iconIssues(distDir, flags.strict === true, { requireDeclared: true, requireVerified: true });
|
|
182244
182347
|
const errors = issues.filter((i2) => i2.severity === "error");
|
|
182245
182348
|
for (const i2 of issues.filter((i3) => i3.severity === "warning")) {
|
|
@@ -182578,7 +182681,7 @@ ${label2}`);
|
|
|
182578
182681
|
const dpxPath = dpxSessionTokenPath();
|
|
182579
182682
|
let dpx;
|
|
182580
182683
|
try {
|
|
182581
|
-
dpx =
|
|
182684
|
+
dpx = readFileSync98(dpxPath, "utf8").trim();
|
|
182582
182685
|
} catch {
|
|
182583
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` }));
|
|
182584
182687
|
return 1;
|
|
@@ -182999,7 +183102,7 @@ ${report3.ok ? "OK \u2014 data + serve plane reachable." : typeof report3.hint =
|
|
|
182999
183102
|
const path2 = dpxSessionTokenPath();
|
|
183000
183103
|
let raw;
|
|
183001
183104
|
try {
|
|
183002
|
-
raw =
|
|
183105
|
+
raw = readFileSync98(path2, "utf8");
|
|
183003
183106
|
} catch {
|
|
183004
183107
|
io2.error(JSON.stringify({ error: `no DPX BO session at ${path2}` }));
|
|
183005
183108
|
return 1;
|