@wix/himalaya-cli 0.1633.0 → 0.1634.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/members-feed-viewer/src/index.d.ts +10 -6
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/wix-sdk/members-v1/src/index.d.ts +34 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-members-feed-viewer.mjs +8 -7
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/wix-members.mjs +29 -0
- package/dist/browser-plane/assets.json +166 -0
- package/dist/browser-plane/host.html +156 -0
- package/dist/browser-plane/package-reader.js +4 -0
- package/dist/browser-plane/preview-deferred/368faca44fb9f7207e4af784e94750b1ee59c1098b8689e0f4a918926f244fb5.bin +0 -0
- package/dist/browser-plane/preview-deferred/37c179b4fefb63ea9637322b84583a2df53aa226c150294eea1675c14b1b8e29.bin +0 -0
- package/dist/browser-plane/preview-deferred/4ecf270136af928612c76fe4ebade91d8156975e5ea4c0cf9225501dd1788e02.bin +0 -0
- package/dist/browser-plane/preview-deferred/521a0e528916d678d7588b2cddf3dadd3bb959a6d62426382f61c77a82017e35.bin +1 -0
- package/dist/browser-plane/preview-deferred/62e2fe4718129f36ecdb0ae4de385bd6b81ecc876146447167c6c140fad699a9.bin +0 -0
- package/dist/browser-plane/preview-deferred/642feab8a48ddf6c7a89d7c2a7c0edfa0e6e773f671287e460e222703563191e.bin +0 -0
- package/dist/browser-plane/preview-deferred/97ed8f1a6772abe26e3d8af5cecfc4b02faa94497d585b0398b5053b739a70c1.bin +0 -0
- package/dist/browser-plane/preview-deferred/a33cfe728c584fdba4fcc1fd54bcdc2f9f2f13889ddbb5b2bd1d0f8cbe49b84e.bin +28 -0
- package/dist/browser-plane/preview-deferred/bf4c16a2774edd38a921edf3099469866cd74c094fd596f3fa4e81f54a04dfaa.bin +0 -0
- package/dist/browser-plane/preview-deferred/c3457ce58c96b65f303fec0ddf5f06733004eaf9e21e62302b155ec63a7765f7.bin +56 -0
- package/dist/browser-plane/preview-deferred/d7598e12c5dbef095ff8272cfc55da0250bd07fbdecbac8a530b9b277872a134.bin +0 -0
- package/dist/browser-plane/preview-deferred/dced97a77624bc5f8b1ae65850360908297f4588e09feb6f22792d29dc7e765b.bin +0 -0
- package/dist/browser-plane/preview-deferred/dee56f09fd3efc127c1ea95557edc74110c1460a46287da36e0af25efd341ef5.bin +0 -0
- package/dist/browser-plane/preview-deferred/ec4c7d63772d980d6e147b2df6215fd2737e4b04cebe0cf7e11dc695fb63cdcf.bin +0 -0
- package/dist/browser-plane/sw.js +13 -0
- package/dist/browser-plane/t5-frame.html +350 -0
- package/dist/browser-plane/t5-worker-frame.html +350 -0
- package/dist/cli.mjs +6412 -5067
- package/dist/preview-assets.generated.bin +0 -0
- package/fixtures/wix-canned.json +31 -1
- package/guides/himi-json-output.md +2 -0
- package/guides/one-app-to-himi-app.md +81 -5
- package/guides/sdk-reference.json +34 -3
- package/package.json +3 -3
- package/templates/beauty-salon/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/branded-lite/config.ts +7 -0
- package/templates/branded-lite/dev/index.ts +719 -83
- package/templates/branded-lite/himalaya.content.json +3 -0
- package/templates/branded-lite/l10n/en.json +4 -2
- package/templates/branded-lite/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/branded-lite/tier5-src/_shared/business-chat-history.ts +4 -1
- package/templates/branded-lite/tier5-src/_shared/business-chat-presenter.ts +2 -7
- package/templates/branded-lite/tier5-src/_shared/header-badges.ts +1 -1
- package/templates/branded-lite/tier5-src/_shared/inbox-rooms.ts +68 -0
- package/templates/branded-lite/tier5-src/_shared/member-activity.ts +34 -0
- package/templates/branded-lite/tier5-src/_shared/member-row-extras.ts +167 -0
- package/templates/branded-lite/tier5-src/_shared/notification-target.ts +141 -0
- package/templates/branded-lite/tier5-src/_shared/source-badges.ts +6 -4
- package/templates/branded-lite/tier5-src/_shared/wix-member-links.ts +114 -0
- package/templates/branded-lite/tier5-src/business-chat/index.ts +114 -59
- package/templates/branded-lite/tier5-src/himi-branded-lite-inbox/index.ts +83 -0
- package/templates/branded-lite/tier5-src/himi-branded-lite-notifications/index.ts +62 -7
- package/templates/branded-lite/tier5-src/wix-spaces-members/index.ts +60 -12
- package/templates/community-club/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/events-meetups/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/gym-fitness/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/nonprofit-cause/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/podcast-creator/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/portfolio-creative/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/restaurant/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/retail-store/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/salon-spa/dev/index.ts +112 -70
- package/templates/salon-spa/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/salon-spa/tier5-src/_shared/business-chat-history.ts +4 -1
- package/templates/salon-spa/tier5-src/_shared/business-chat-presenter.ts +2 -7
- package/templates/salon-spa/tier5-src/_shared/inbox-rooms.ts +68 -0
- package/templates/salon-spa/tier5-src/business-chat/index.ts +114 -59
- package/templates/yoga-studio/tier5-src/_shared/branded-lite-hosted.ts +1 -0
|
Binary file
|
package/fixtures/wix-canned.json
CHANGED
|
@@ -1230,6 +1230,36 @@
|
|
|
1230
1230
|
"count": 2
|
|
1231
1231
|
}
|
|
1232
1232
|
},
|
|
1233
|
+
"POST /badges/v4/assignments/query": {
|
|
1234
|
+
"badgeAssignments": [
|
|
1235
|
+
{
|
|
1236
|
+
"id": "asg-0001",
|
|
1237
|
+
"badgeId": "bdg-0001",
|
|
1238
|
+
"memberId": "mem-0001"
|
|
1239
|
+
}
|
|
1240
|
+
],
|
|
1241
|
+
"pagingMetadata": {
|
|
1242
|
+
"count": 1,
|
|
1243
|
+
"hasNext": false
|
|
1244
|
+
}
|
|
1245
|
+
},
|
|
1246
|
+
"POST https://apps.wix.com/_api/members-one-app/api/members": {
|
|
1247
|
+
"items": [
|
|
1248
|
+
{
|
|
1249
|
+
"id": "mem-0001",
|
|
1250
|
+
"displayName": "Dana R.",
|
|
1251
|
+
"member": {
|
|
1252
|
+
"role": "MEMBER",
|
|
1253
|
+
"online": false,
|
|
1254
|
+
"lastOpenApp": {
|
|
1255
|
+
"amount": 3,
|
|
1256
|
+
"unit": "hour"
|
|
1257
|
+
}
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
],
|
|
1261
|
+
"total": 1
|
|
1262
|
+
},
|
|
1233
1263
|
"POST /badges/v4/badges/query": {
|
|
1234
1264
|
"badges": [
|
|
1235
1265
|
{
|
|
@@ -1408,7 +1438,7 @@
|
|
|
1408
1438
|
]
|
|
1409
1439
|
}
|
|
1410
1440
|
},
|
|
1411
|
-
"POST /members-feed-viewer/v1/members-viewer-feed-notifications/query": {
|
|
1441
|
+
"POST /_api/members-feed-viewer/v1/members-viewer-feed-notifications/query": {
|
|
1412
1442
|
"viewerFeedNotifications": [
|
|
1413
1443
|
{
|
|
1414
1444
|
"id": "ntf-0001",
|
|
@@ -112,6 +112,7 @@ return an empty array.
|
|
|
112
112
|
| `identity_source_unverified` | Collected source hashes or the business display name cannot be verified. Recollect older evidence that did not save business identity. |
|
|
113
113
|
| `identity_target_unverified` | The technical app slug, target compilation or complete built descriptors are unavailable. |
|
|
114
114
|
| `literal_slug_visible` | Built display text or the known business-chat identity seed contains the technical slug instead of the collected business identity, without matching exact authored source copy. |
|
|
115
|
+
| `app_name_is_slug` | `config.ts`'s `name` (the launcher label and the screens that show the app name) is still the technical slug, while the built display text has no literal slug to report. The result carries `appName` with a `hint`; `--fix` writes the collected business name into `config.ts` (only a literal equal to the slug is rewritten, never a name the author chose). |
|
|
115
116
|
|
|
116
117
|
The check reads built descriptors, not every possible runtime string. A passing
|
|
117
118
|
result does not verify dynamic live data, translations, branding images or device
|
|
@@ -139,6 +140,7 @@ is a positional screen ID; use `--deep=<value>` to diagnose a nonnumeric depth.
|
|
|
139
140
|
| `ux_evidence_unreadable` | The UX evidence artifact cannot be read. |
|
|
140
141
|
| `lint_errors` | Build/lint validation found errors. |
|
|
141
142
|
| `depth_budget_exceeded` | A screen or a bound list/grid row template nests deeper, or has more components, than the depth budget (`depth-budget` validator pass), or any of its JSON — props, modifiers, `input`, action `args` — nests past the raw-JSON ceiling of 256 levels. Each `issues[]` entry with `pass: "depth-budget"` carries the JSON `path` of the deepest node (the tree root for a node count, the first value past the ceiling for raw JSON), the `limit` and the `actual` value. Takes precedence over `lint_errors`, and `--force` does not override it: content over the budget overflows the renderer's stack on devices already in the field. Flatten the layout and push again. `himi patch screen` refuses an over-deep raw descriptor with the same code, before any network request, and `himi pack` / `himi template publish` refuse with it even under `--force`. |
|
|
143
|
+
| `placeholder_site_binding` | The app declares `wix_api` and uses the `wix-consumer` auth provider, but its resolved auth still has the scaffold placeholder `clientId` (`YOUR_WIX_CLIENT_ID`) or `siteUrl` (`https://your-site.example.com`), and it is not bound to a source site through the One App identity. Nothing is published: every Wix call would fail. Bind the site (`himi one-app provision` for a One App migration; otherwise a real clientId and siteUrl). `--force` does not override it. |
|
|
142
144
|
| `one_app_readiness_failed` | Reserved legacy refusal code. One App migration readiness is now advisory: publish and promotion report structured warnings instead. Other independent release checks may still refuse a push. |
|
|
143
145
|
| `control_token_expired` | The selected control token has expired. |
|
|
144
146
|
| `app_source_contains_secrets` | Source archiving detected a possible credential. |
|
|
@@ -163,6 +163,7 @@ The CLI's versioned native-widget inventory supplies these rows automatically.
|
|
|
163
163
|
| `achievements_carousel_section` | The same Program state/display rules, default limit 5 and page dots. |
|
|
164
164
|
| `newBlog_postlist_vertical_section`, `newBlog_compact_post_list_vertical_section` | Row display options, unlimited paging or a limited count with See All Posts, and layout. Coverage derives these per placement from the authored settings: see "Generate blog post lists from their settings". |
|
|
165
165
|
| `events_list_section` | Date badge, Share and the appropriate RSVP/ticket action. |
|
|
166
|
+
| `platform_elements_image_section` | Press behavior. `onPressType: "openAsModal"` opens the image full screen: tap it with the reserved `himi.lightbox` action and `args.images` set to `[{ "url": <the image url>, "alt": <its accessibility label> }]`. `nothing` and a `none` action need no tap. Coverage derives the row per placement from the authored value. |
|
|
166
167
|
| `platform_general_members_section`, `platform_general_members_section_bp` | Effective member strip and directory journey: totals/search, alphabetical sections, Follow, activity/privacy. Distinguish badge chips from actual viewed-member program progress. |
|
|
167
168
|
| `file_share_section` | Signed-in-only file/folder section. Preserve access rules, instance settings and View All (`media.openFileShareListScreen`); a media gallery is not File Share. |
|
|
168
169
|
| `events_guests_section` | Signed-in-only guests for the configured event, preserving the event selector, guest privacy and display settings; an avatar summary is not the full guest list. |
|
|
@@ -282,7 +283,10 @@ the same values:
|
|
|
282
283
|
- **Row facts.** Every `displayOptions` key set to `true` is shown: `author` (avatar, name and the
|
|
283
284
|
admin badge), `comments` (comment count), `likes`, `times_viewed`, `post_date`, `reading_time`,
|
|
284
285
|
`cover_image`. Bind each from the post and its metrics. A row that shows a fixed subset such as
|
|
285
|
-
date, views and likes is a gap. A key that is `false` or absent stays hidden.
|
|
286
|
+
date, views and likes is a gap. A key that is `false` or absent stays hidden. Blog v3 `queryPosts` returns no
|
|
287
|
+
view, like or comment counts unless the request asks for `fieldsets: ["METRICS"]` (without it every count reads
|
|
288
|
+
0), and only the author's `memberId`: resolve the name and photo with `getMember` and show the author only when
|
|
289
|
+
the member resolves. A count the API did not return stays hidden, never 0.
|
|
286
290
|
- **Unlimited.** `contentSettings.postsPerCategory: "unlimited"` follows the page cursor to the last
|
|
287
291
|
post. Bind `pagination.cursor` and `pagination.onLoadMore` as described in `himi docs
|
|
288
292
|
designing-himi-screens`; a fixed first page (for example 20 posts) is not an unlimited list.
|
|
@@ -427,7 +431,9 @@ Apply these interpretation rules:
|
|
|
427
431
|
It resolves the effective source theme with the reader the source app instance
|
|
428
432
|
actually uses, then compares the resolved primary, background and content colors,
|
|
429
433
|
each button's `borderRadius` and `outlineWidth`, and resolved heading/body font families
|
|
430
|
-
against the app's `tokens.json`.
|
|
434
|
+
against the app's `tokens.json`. A Branded theme that stores only `primaryColor`
|
|
435
|
+
(no `colors`) is still compared: that value is the app's brand color, so the template's
|
|
436
|
+
default accent fails the check until `--fix` writes it.
|
|
431
437
|
Hex case and shorthand are normalized; an absent button token is compared with the
|
|
432
438
|
value the renderer draws (an outline only on `secondary`; a radius of `radius.pill`,
|
|
433
439
|
else 24), not called a difference. A variant without its own radius must draw the
|
|
@@ -504,6 +510,22 @@ Apply these interpretation rules:
|
|
|
504
510
|
list then shows no Ended label for a time without an offset, which is correct, and a
|
|
505
511
|
`business_time_zone_unavailable` warning says so. A re-apply keeps the zone for the same site and
|
|
506
512
|
drops it for another.
|
|
513
|
+
- **Write the verified values with the CLI.** Run `himi one-app provision --evidence-dir .himi/one-app --content .`
|
|
514
|
+
after scaffolding. From the collected evidence it sets `currency` on `himi_loyalty` and `businessTimeZone` on
|
|
515
|
+
`himi_services`, `himi_service` and `himi_time` (a value it could not verify stays as the template ships it;
|
|
516
|
+
nothing is invented). It writes the business name into `config.ts`'s `name` and over the slug `himi init` baked
|
|
517
|
+
into displayed names (display slots only, never ids or URLs; a name you chose is kept), so the normal flow needs
|
|
518
|
+
no `validate-identity --fix`. It states the bottom bar as native (`navigation.tabBar.presentation: "native"`; an
|
|
519
|
+
explicit `"kit"` is kept; the output's `tabBar` reports `set`, `unchanged` or `absent`). When the collection
|
|
520
|
+
recorded `memberChat: true` (never a guess), it opens the member Inbox from every baked door (the top-bar chat
|
|
521
|
+
action, the drawer's Inbox item, the chat thread's parent and "Back to inbox", the Profile link) if the scaffold
|
|
522
|
+
contains `himi_inbox`; otherwise the output's `chat` says `unverified` and the doors keep opening
|
|
523
|
+
`himi_business_chat`. `himi one-app header-badges` writes the top-bar action, so run provision again after it.
|
|
524
|
+
It also **binds the app to the source site**: the scaffold's `WixConsumerAuthProvider` carries placeholders
|
|
525
|
+
(`YOUR_WIX_CLIENT_ID`, `your-site.example.com`) that make every Wix read fail, so provision writes
|
|
526
|
+
`visitorSource: "one-app"`, the collected `metaSiteId` and `siteUrl` (a real clientId you set is kept;
|
|
527
|
+
`siteBinding` reports `set`, `unchanged`, `unverified` or `absent`). `himi push` refuses a Wix-backed app that
|
|
528
|
+
still has the placeholders (code `placeholder_site_binding`, no `--force`). It is safe to run again.
|
|
507
529
|
- **Native navigation is the migration target.** Use the shell's native top bar
|
|
508
530
|
and, for bottom-tab navigation, `navigation.tabBar.presentation: "native"`.
|
|
509
531
|
Do not recreate the source Detailed header, call `detailedHeader`, or insert a
|
|
@@ -536,6 +558,20 @@ Apply these interpretation rules:
|
|
|
536
558
|
totals. A collected total is a source snapshot. Only use an injected live
|
|
537
559
|
count reader when its public, site-bound permission path has been verified.
|
|
538
560
|
See the screens SDK's downloadable business-contact guide for the full recipe.
|
|
561
|
+
- **Chat opens the Inbox when the source allows member chat.** The source top-bar chat
|
|
562
|
+
button opens a member-to-business room only when the branded app's `inbox.chatType`
|
|
563
|
+
is `MEMBER_TO_BUSINESS`; in every other case, including an app whose config has no
|
|
564
|
+
`inbox` at all, it opens the Inbox: a list of the member's conversations with the
|
|
565
|
+
business and with other members, plus a way to start a new chat with a member.
|
|
566
|
+
`collect` reads that setting from the app's public mobile config, as a Visitor, and
|
|
567
|
+
records it in `inbox-settings.json` (`chatType` and its `source`) and `manifest.json`
|
|
568
|
+
`memberChat`: `true` or `false`, or `null` when it could not be read or the source is
|
|
569
|
+
a free One App (warning `inbox_chat_type_unknown`). Carry it: when `memberChat` is
|
|
570
|
+
`true`, set provisioning `memberChat: true` and point the top-bar chat action at
|
|
571
|
+
`himi_inbox`; every other Inbox entry (tab, drawer, Explore, Profile) follows the same
|
|
572
|
+
flag. When it is `false` or `null` leave `memberChat` unset and keep the top-bar chat
|
|
573
|
+
on `himi_business_chat`. Never turn member chat on from a guess: an owner who limited
|
|
574
|
+
the app to the business must not gain a member chat.
|
|
539
575
|
- Emit resolved native actions in `navigation.topBarDefault` or a complete
|
|
540
576
|
per-screen `topBar` override. The shell owns back/menu controls. Per-screen
|
|
541
577
|
actions support `hiddenPath` when `navigation.topBarDefault.actions` declares
|
|
@@ -682,8 +718,9 @@ Apply these interpretation rules:
|
|
|
682
718
|
output against the source. A persistent nav worker needs a supported refresh
|
|
683
719
|
path; a screen-only load, page-row count or foreground push receipt count is
|
|
684
720
|
insufficient. The source Member notification aggregate is MOBILE/UNSEEN, capped
|
|
685
|
-
at100. `countUnseenNotifications(
|
|
686
|
-
|
|
721
|
+
at100. `countUnseenNotifications()` reads that aggregate through the source Member
|
|
722
|
+
route. Name no site: a bound host sends its own, and the multi-tenant Player (no
|
|
723
|
+
bound site) lets the Member credential decide and refuses any named one. It requires the updated native core, rebuilt
|
|
687
724
|
consuming binaries and published SDK; default web and old binaries remain
|
|
688
725
|
unavailable for this reader. Never replace that refusal with zero.
|
|
689
726
|
Chat counts unread rooms, while legacy cart counters can include unsynced local
|
|
@@ -1257,6 +1294,24 @@ function call in the literal makes them fail with "expected a `"<screenId>": {`
|
|
|
1257
1294
|
authored descriptor". Blank lines and whole-line `//` comments between entries are
|
|
1258
1295
|
accepted.
|
|
1259
1296
|
|
|
1297
|
+
Do not write a generator of your own. `himi one-app generate --evidence-dir .himi/one-app --content .` turns each
|
|
1298
|
+
source page into a screen descriptor from the collected evidence alone: the screen id and title come from the page's
|
|
1299
|
+
source label, and styles, alignment, buttons, images and their tap (`openAsModal` opens full screen), the contact
|
|
1300
|
+
section and the business description are read from the source. A section it has no mapping for is reported with
|
|
1301
|
+
`sections_unmapped` and nothing stands in for it. Data sections use shared modules and recipes
|
|
1302
|
+
(`recipes/*.json`) when the scaffold ships them; the current starter ships none, so today they take the fallback
|
|
1303
|
+
below. A page with such modules gets ONE worker, `tier5-src/page-<screen>/index.ts`, that registers the modules
|
|
1304
|
+
its sections use (blog list, programs carousel, inline events). A page that is only a template vertical (programs list,
|
|
1305
|
+
members, loyalty, shop, groups feed) opens the template's screen, and a groups feed passes the source's own title,
|
|
1306
|
+
"Group list" label and post count. A data section never vanishes: when the shared modules cannot honor its settings
|
|
1307
|
+
(featured-only lists, another post layout, events or groups limited to a chosen set) or its recipe is missing from the
|
|
1308
|
+
scaffold, it keeps its place as the source's title and a "See All" button that opens the page showing that data,
|
|
1309
|
+
and the reason is listed in `gaps`, never approximated as the real list. Only a section with no mapping at all stays
|
|
1310
|
+
in `unmapped`. The first four visible pages become the bottom tabs and the rest the More screen. The output names the
|
|
1311
|
+
published `revision` and `fetchedAt` of the evidence it read, so a migration generated from older evidence shows the
|
|
1312
|
+
old value: run `himi one-app migrate` again to refresh it before the final check. The file it writes is the
|
|
1313
|
+
`--upsert` input below.
|
|
1314
|
+
|
|
1260
1315
|
So generate descriptors as data and write them with the CLI:
|
|
1261
1316
|
|
|
1262
1317
|
```sh
|
|
@@ -1266,11 +1321,27 @@ himi template screens --upsert --from .himi/one-app/gen/screens.json
|
|
|
1266
1321
|
The file is one JSON object, `{ "<screenId>": <ScreenDescriptor>, … }`. Each existing
|
|
1267
1322
|
id is replaced in place; each new id is added and registered in
|
|
1268
1323
|
`navigation.linkableScreens`. One invalid entry refuses the batch and restores every
|
|
1269
|
-
file. A
|
|
1324
|
+
file. A screen that starts with an empty slot (a `Spacer`, a container with no children, an
|
|
1325
|
+
`Image` with no url) is refused: when a source header is dropped, do not leave its place behind,
|
|
1326
|
+
because the slot paints a blank band under the toolbar. A builder call such as `detailedHeader(...)` written inline in `dev/index.ts`
|
|
1270
1327
|
cannot be inspected: call the builder in your generator and serialize the value it
|
|
1271
1328
|
returns. Run the generator inside the app (after `npm install`), so
|
|
1272
1329
|
`@wix/himalaya/screens` resolves to the app's own dependency.
|
|
1273
1330
|
|
|
1331
|
+
### Repoint the template's tab ids
|
|
1332
|
+
|
|
1333
|
+
The template's `navigation.linkableScreens` entries and its home and profile tabs carry its own tab ids (`"home"`,
|
|
1334
|
+
`"profile"`, the vertical tabs). Your `navigation.tabBar` replaces those tabs, so every entry whose `tabId` is not
|
|
1335
|
+
one of yours is a leftover. `himi validate --strict` reports each as `nav-linkable-tab-unknown` and lists your real
|
|
1336
|
+
ids; nothing repoints them, because the right tab depends on where the source shows the screen:
|
|
1337
|
+
|
|
1338
|
+
- a screen the source opens from a tab keeps that tab's id;
|
|
1339
|
+
- a screen reached from the overflow list takes the id of the **More** tab only if you created one; a template with no More tab uses `""`;
|
|
1340
|
+
- a screen with no tab owner takes `""`, the default stack.
|
|
1341
|
+
|
|
1342
|
+
Check `homeScreenId` and any `himi.open` target that still names a template screen (`"home"`, `"profile"`) the same
|
|
1343
|
+
way: it must be a screen your `SCREENS` map defines.
|
|
1344
|
+
|
|
1274
1345
|
### Preserve the template features the source exposes
|
|
1275
1346
|
|
|
1276
1347
|
Treat trimming as a source-feature decision, not a list of screens reached during
|
|
@@ -1292,6 +1363,11 @@ After applying identity and before claiming completion, run:
|
|
|
1292
1363
|
himi one-app validate-identity --evidence-dir .himi/one-app --content . --json
|
|
1293
1364
|
```
|
|
1294
1365
|
|
|
1366
|
+
`himi init` names a scaffold after its technical slug, and `config.ts`'s `name` is the app's
|
|
1367
|
+
display name (launcher label and the screens that show it). The command also fails with
|
|
1368
|
+
`app_name_is_slug` while that name is still the slug; `--fix` writes the collected business
|
|
1369
|
+
name into it (only a literal equal to the slug is rewritten, never a name you chose).
|
|
1370
|
+
|
|
1295
1371
|
The command verifies the collected business-name hash, builds the current content,
|
|
1296
1372
|
and checks emitted screen titles, supported component display fields and the known
|
|
1297
1373
|
business-chat identity seed for accidental literal slugs. It ignores route IDs,
|
|
@@ -28162,6 +28162,37 @@
|
|
|
28162
28162
|
"decl": "export async function isFollowingMember(targetId: string): Promise<boolean>;",
|
|
28163
28163
|
"http": "POST /members/v3/followers/my/connections",
|
|
28164
28164
|
"verificationChecked": true
|
|
28165
|
+
},
|
|
28166
|
+
{
|
|
28167
|
+
"name": "WixMemberLastOpenApp",
|
|
28168
|
+
"kind": "interface",
|
|
28169
|
+
"jsdoc": "/** When a member last opened the app, as the One App computes it: `unit` is \"min\", \"hour\" or \"day\", and `ts`\n * (epoch milliseconds, as a string) is there for a day count the One App prints as a date. */",
|
|
28170
|
+
"decl": "export interface WixMemberLastOpenApp {\n amount?: number;\n unit?: string;\n ts?: string;\n}",
|
|
28171
|
+
"verificationChecked": true
|
|
28172
|
+
},
|
|
28173
|
+
{
|
|
28174
|
+
"name": "WixMemberActivity",
|
|
28175
|
+
"kind": "interface",
|
|
28176
|
+
"jsdoc": "/** One member's activity from the One App members service. */",
|
|
28177
|
+
"decl": "export interface WixMemberActivity {\n id: string;\n /** Server role, e.g. \"MEMBER\". */\n role?: string;\n online: boolean;\n /** `null` for a member who never opened the app. */\n lastOpenApp: WixMemberLastOpenApp | null;\n}",
|
|
28178
|
+
"verificationChecked": true
|
|
28179
|
+
},
|
|
28180
|
+
{
|
|
28181
|
+
"name": "queryMemberActivity",
|
|
28182
|
+
"kind": "function",
|
|
28183
|
+
"jsdoc": "/** Role and last-active for up to 100 members by id — POST apps.wix.com/_api/members-one-app/api/members.\n * Public Members v1 carries neither: `lastLoginDate` is a login time and needs the owner-only FULL field\n * set. The One App service answers a Visitor with this, so a members list can show \"Active 11h ago\".\n * A member id the service does not know is left out of the answer.\n *\n * Pinned One App member source, like the notification count: it needs a native runtime that allows this\n * one route for the bound business. Older native builds and web reject, so callers treat a rejection as\n * \"no activity to show\", never as an error in their own list.\n *\n * @scope visitor — a Visitor reads it as well as a signed-in member; the native runtime allows only the bound business's route. */",
|
|
28184
|
+
"decl": "export async function queryMemberActivity(ids: string[]): Promise<WixMemberActivity[]>;",
|
|
28185
|
+
"scope": "visitor",
|
|
28186
|
+
"verificationChecked": true
|
|
28187
|
+
},
|
|
28188
|
+
{
|
|
28189
|
+
"name": "listFollowedMembers",
|
|
28190
|
+
"kind": "function",
|
|
28191
|
+
"jsdoc": "/** Which of `targetIds` the signed-in member follows, in ONE call — POST\n * /members/v3/followers/my/connections. For a members list that shows a Follow control per row.\n * A Visitor gets an empty answer (no connections), so nothing here needs a sign-in; callers still\n * skip the call for a Visitor.\n *\n * @scope visitor — an anonymous visitor session is enough; it answers an empty list when nobody is signed in. */",
|
|
28192
|
+
"decl": "export async function listFollowedMembers(targetIds: string[]): Promise<string[]>;",
|
|
28193
|
+
"http": "POST /members/v3/followers/my/connections",
|
|
28194
|
+
"scope": "visitor",
|
|
28195
|
+
"verificationChecked": true
|
|
28165
28196
|
}
|
|
28166
28197
|
]
|
|
28167
28198
|
},
|
|
@@ -28208,15 +28239,15 @@
|
|
|
28208
28239
|
{
|
|
28209
28240
|
"name": "queryNotifications",
|
|
28210
28241
|
"kind": "function",
|
|
28211
|
-
"jsdoc": "/** List the signed-in member's notifications, newest first. MOBILE channel. */",
|
|
28242
|
+
"jsdoc": "/** List the signed-in member's notifications, newest first. MOBILE channel. Needs a Member\n * transport: a Visitor is refused (403) and an old native build refuses the route, so both\n * reject. The bound site is stamped by the host, so no site argument is needed. */",
|
|
28212
28243
|
"decl": "export async function queryNotifications(limit = 25, options?: WixCallOptions): Promise<MfvNotification[]>;",
|
|
28213
28244
|
"verificationChecked": true
|
|
28214
28245
|
},
|
|
28215
28246
|
{
|
|
28216
28247
|
"name": "countUnseenNotifications",
|
|
28217
28248
|
"kind": "function",
|
|
28218
|
-
"jsdoc": "/** Source member-app MOBILE/UNSEEN aggregate, capped at 100.
|
|
28219
|
-
"decl": "export async function countUnseenNotifications(options
|
|
28249
|
+
"jsdoc": "/** Source member-app MOBILE/UNSEEN aggregate, capped at 100. Needs a Member transport; old native\n * binaries and web reject. A missing, malformed or failed result is unavailable, never an\n * authoritative zero. The host fixes the business: a bound capability sends its own site, and the\n * multi-tenant Player (no bound site) lets the Member credential decide. `site` is optional and only\n * ever names the bound site: native refuses any other, and an unbound host refuses every named one. */",
|
|
28250
|
+
"decl": "export async function countUnseenNotifications(options?: { site?: string }): Promise<number>;",
|
|
28220
28251
|
"verificationChecked": true
|
|
28221
28252
|
},
|
|
28222
28253
|
{
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1634.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"description": "himi — the Himalaya authoring CLI. Build a Tier-5 content package on your own machine, push it to the production serve as a draft, preview it on web + Himi Player, and read worker logs back — the remote dev loop. Wraps @himalaya/serve-cli for transport.",
|
|
6
6
|
"keywords": [
|
|
@@ -30,7 +30,7 @@
|
|
|
30
30
|
"himi": "node --import tsx src/cli.ts",
|
|
31
31
|
"gen:guides": "npm --prefix ../.. run authoring:gen",
|
|
32
32
|
"build": "node --import tsx ../authoring-kit/gen-templates.mts && node ../authoring-kit/bundle.mjs && npm run build:dist",
|
|
33
|
-
"build:dist": "node --import tsx ../html-to-t5/vocab-gen/gen-v2.ts && node scripts/bundle.mjs && node scripts/stage-authoring-runtime.mjs",
|
|
33
|
+
"build:dist": "node --import tsx ../html-to-t5/vocab-gen/gen-v2.ts && node scripts/bundle.mjs && node scripts/stage-authoring-runtime.mjs && node scripts/stage-browser-plane.mjs",
|
|
34
34
|
"test": "node ../../tools/ci/run-tests.mjs --package tools/himi-cli --"
|
|
35
35
|
},
|
|
36
36
|
"dependencies": {
|
|
@@ -72,5 +72,5 @@
|
|
|
72
72
|
"artifactId": "himalaya-cli"
|
|
73
73
|
}
|
|
74
74
|
},
|
|
75
|
-
"falconPackageHash": "
|
|
75
|
+
"falconPackageHash": "7e33d424d99d05998b91ee4390198d50459ab4ce4a5aec4d4c999ae1"
|
|
76
76
|
}
|
|
@@ -97,6 +97,7 @@ export const HOSTED_SCREEN_VERTICALS: Readonly<Record<string, readonly BrandedLi
|
|
|
97
97
|
himi_gift_card: ["giftCards"],
|
|
98
98
|
himi_gift_cards: ["giftCards"],
|
|
99
99
|
himi_groups: ["groups"],
|
|
100
|
+
himi_inbox: ["inbox"],
|
|
100
101
|
himi_group_about: ["groups"],
|
|
101
102
|
himi_my_groups: ["groups"],
|
|
102
103
|
himi_invoice: ["invoices"],
|
|
@@ -371,6 +371,13 @@ export default defineApp({
|
|
|
371
371
|
"parentScreenId": "himi_account",
|
|
372
372
|
"tabId": "profile"
|
|
373
373
|
},
|
|
374
|
+
{
|
|
375
|
+
"screenId": "himi_inbox",
|
|
376
|
+
"isPublic": true,
|
|
377
|
+
"paramKeys": [],
|
|
378
|
+
"parentScreenId": "",
|
|
379
|
+
"tabId": ""
|
|
380
|
+
},
|
|
374
381
|
{
|
|
375
382
|
"screenId": "himi_business_chat",
|
|
376
383
|
"isPublic": true,
|