@wix/himalaya-cli 0.1633.0 → 0.1635.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/dev-server/src/app-config.d.ts +1 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/dev-server/src/app-module.d.ts +2 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/wix-payments-contract.d.ts +22 -10
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/wix-payments-wire.d.ts +16 -6
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/sdk/iap/src/wix-payments.d.ts +11 -4
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/core/ts/src/schema.d.ts +6 -0
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/_types/stdlib/flows/iap-checkout/src/apple-iap-contract.d.ts +10 -4
- 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/iap-checkout.mjs +84 -16
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/iap.mjs +67 -10
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/screens.mjs +83 -15
- package/dist/authoring-runtime/node_modules/@wix/himalaya/dist/sdui.mjs +1 -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/67feb362281a3040ee05592769227c58a98ec3c8073dac95ecb5629141c67061.bin +56 -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/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 +6594 -5078
- package/dist/preview-assets.generated.bin +0 -0
- package/fixtures/wix-canned.json +34 -1
- package/guides/designing-himi-screens.md +5 -1
- package/guides/himi-json-output.md +16 -1
- package/guides/iap-products.md +8 -0
- package/guides/one-app-to-himi-app.md +81 -5
- package/guides/sdk-reference.json +56 -11
- package/guides/skill.md +1 -0
- package/package.json +3 -3
- package/templates/beauty-salon/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/beauty-salon/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/beauty-salon-owner/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/branded-lite/config.ts +7 -0
- package/templates/branded-lite/dev/index.ts +1109 -2307
- package/templates/branded-lite/himalaya.content.json +3 -0
- package/templates/branded-lite/l10n/en.json +6 -6
- 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/collection-contract.ts +0 -1
- package/templates/branded-lite/tier5-src/_shared/header-badges.ts +1 -1
- package/templates/branded-lite/tier5-src/_shared/himi-cms.ts +2 -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-cms/index.ts +160 -39
- 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/dev/index.ts +210 -2044
- package/templates/community-club/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/community-club/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/community-club/tier5-src/_shared/himi-cms.ts +2 -1
- package/templates/community-club/tier5-src/himi-branded-lite-cms/index.ts +160 -39
- package/templates/community-club-owner/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/events-meetups/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/events-meetups/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/events-meetups-owner/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/gym-fitness/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/gym-fitness/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/gym-fitness-owner/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/nonprofit-cause/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/nonprofit-cause/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/nonprofit-cause-owner/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/owner-lite/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/podcast-creator/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/podcast-creator/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/podcast-creator-owner/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/portfolio-creative/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/portfolio-creative/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/portfolio-creative-owner/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/restaurant/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/restaurant/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/restaurant-owner/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/retail-store/tier5-src/_shared/branded-lite-hosted.ts +1 -0
- package/templates/retail-store/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/retail-store-owner/tier5-src/_shared/collection-contract.ts +0 -1
- 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/collection-contract.ts +0 -1
- 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
- package/templates/yoga-studio/tier5-src/_shared/collection-contract.ts +0 -1
- package/templates/yoga-studio-owner/tier5-src/_shared/collection-contract.ts +0 -1
|
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",
|
|
@@ -2049,6 +2079,9 @@
|
|
|
2049
2079
|
}
|
|
2050
2080
|
]
|
|
2051
2081
|
},
|
|
2082
|
+
"POST /wix-data/v2/items/count": {
|
|
2083
|
+
"totalCount": 12
|
|
2084
|
+
},
|
|
2052
2085
|
"POST /wix-data/v2/items/query": {
|
|
2053
2086
|
"dataItems": [
|
|
2054
2087
|
{
|
|
@@ -334,7 +334,11 @@ scroll. *Reach for `SegmentedControl` for 2–4 in-content modes; `Tabs`/tab-bar
|
|
|
334
334
|
**Feedback & overlays** — `Banner` for a persistent inline message (with a retry action when a refresh fails over content you kept; a screen with nothing to show uses an `ErrorState`, see §5);
|
|
335
335
|
`Snackbar` for a transient confirmation; `AlertDialog` for a blocking decision (up to three `buttons`
|
|
336
336
|
— "Save / Discard / Cancel" — with roles `default` / `cancel` / `destructive`; a worker's
|
|
337
|
-
`ui.alert({ buttons })` resolves `{ buttonId }`)
|
|
337
|
+
`ui.alert({ buttons })` resolves `{ buttonId }`). Alerts share one slot: a second one replaces what
|
|
338
|
+
is up, and a second worker `ui.alert` rejects `ui_busy`. If your app can raise alerts from several places at
|
|
339
|
+
once (an error from a refresh while a first-run dialog is open), set `navigation: { presentationQueue: true }`
|
|
340
|
+
in `config.ts`: then they show one at a time in order, each worker call waiting for its own answer
|
|
341
|
+
(at most 5 wait — a 6th rejects `ui_queue_full` — and identical back-to-back alerts show once). `BottomSheet` for
|
|
338
342
|
contextual actions/detail; `Tooltip`/`Popover` for a small anchored hint. *Reach for `Snackbar`, not
|
|
339
343
|
`AlertDialog`, to confirm a completed action — don't block on success.* The `Snackbar` COMPONENT draws
|
|
340
344
|
inline where you place it; for a transient toast that floats at the bottom of the screen — an app
|
|
@@ -6,7 +6,7 @@ repurposed when human wording changes. New codes may be added; consumers must
|
|
|
6
6
|
handle an unknown code as a failure, without parsing prose.
|
|
7
7
|
|
|
8
8
|
**Rollout:** this contract is enforced for **`himi push`**, including `--only`,
|
|
9
|
-
first, for **`himi publish-size`**, for **`himi store iap connect`**, for **`himi site member-app`**, for **`himi fidelity`**, for the **`himi base44`** entity and function verbs, and for **`himi
|
|
9
|
+
first, for **`himi publish-size`**, for **`himi store iap connect`**, for **`himi site member-app`**, for **`himi fidelity`**, for the **`himi base44`** entity and function verbs, for **`himi l10n import`**, and for **`himi login --device`**. Other subcommands still have legacy failures without codes and are a
|
|
10
10
|
follow-up migration. This is an additive change: existing `error`, `errors`,
|
|
11
11
|
`message`, `hint`, status, body, and gate-specific fields stay as they were.
|
|
12
12
|
Some legacy envelopes have no singular `error` or `hint`; consumers must not
|
|
@@ -14,6 +14,19 @@ require those fields. Existing error-only push refusals now also carry `ok: fals
|
|
|
14
14
|
Output channels and process exit codes are unchanged. Read JSON failures on both
|
|
15
15
|
stdout and stderr; progress/warnings are not failure envelopes.
|
|
16
16
|
|
|
17
|
+
## `himi login --device` codes
|
|
18
|
+
|
|
19
|
+
| Code | Meaning |
|
|
20
|
+
| --- | --- |
|
|
21
|
+
| `device_issuer_unreachable` | The owner issuer could not be reached to start the device login. Exit 1. |
|
|
22
|
+
| `device_start_failed` | The issuer answered the start request without a usable device grant (a closed or older plane, a rate limit, a store outage). `status`, `error` and `hint` say which. Exit 1. |
|
|
23
|
+
| `device_timed_out` | Nobody approved within the code's lifetime (at most 10 minutes). Run `himi login --device` again. Exit 1. |
|
|
24
|
+
| `device_access_denied` | The owner pressed Deny on the approve page. Exit 1. |
|
|
25
|
+
| `device_code_expired` | The issuer reported the code expired before approval. Exit 1. |
|
|
26
|
+
| `device_login_failed` | Any other poll failure; `status` and `error` carry the issuer's answer. Exit 1. |
|
|
27
|
+
|
|
28
|
+
A `429` while polling is not a failure: the CLI backs off by the plane's `retryAfterSec` and keeps waiting.
|
|
29
|
+
|
|
17
30
|
## `himi sdk unverified` codes
|
|
18
31
|
|
|
19
32
|
| Code | Meaning |
|
|
@@ -112,6 +125,7 @@ return an empty array.
|
|
|
112
125
|
| `identity_source_unverified` | Collected source hashes or the business display name cannot be verified. Recollect older evidence that did not save business identity. |
|
|
113
126
|
| `identity_target_unverified` | The technical app slug, target compilation or complete built descriptors are unavailable. |
|
|
114
127
|
| `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. |
|
|
128
|
+
| `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
129
|
|
|
116
130
|
The check reads built descriptors, not every possible runtime string. A passing
|
|
117
131
|
result does not verify dynamic live data, translations, branding images or device
|
|
@@ -139,6 +153,7 @@ is a positional screen ID; use `--deep=<value>` to diagnose a nonnumeric depth.
|
|
|
139
153
|
| `ux_evidence_unreadable` | The UX evidence artifact cannot be read. |
|
|
140
154
|
| `lint_errors` | Build/lint validation found errors. |
|
|
141
155
|
| `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`. |
|
|
156
|
+
| `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
157
|
| `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
158
|
| `control_token_expired` | The selected control token has expired. |
|
|
144
159
|
| `app_source_contains_secrets` | Source archiving detected a possible credential. |
|
package/guides/iap-products.md
CHANGED
|
@@ -207,6 +207,14 @@ himi store iap draft --site <msid> --purchases-app <registration-id> --catalog-r
|
|
|
207
207
|
--bundle com.example.fitclub --base-territory USA --territories USA,CAN --out ./iap-products.json
|
|
208
208
|
```
|
|
209
209
|
|
|
210
|
+
Leave `--territories` out to sell each product in every country the app itself is sold in.
|
|
211
|
+
A product that is not sold in a country where the app is on sale shows "price unavailable"
|
|
212
|
+
there. With `--profile`, `draft` reads the app's countries from App Store Connect. A note
|
|
213
|
+
names every product that would still miss one of them, whether it got an explicit
|
|
214
|
+
`--territories` or was kept by `--merge` with its own countries. If the countries can't be
|
|
215
|
+
read (through `--purchases-app`, a failed read, or an app that is not on sale yet),
|
|
216
|
+
products are sold in the base territory only, and the note says so.
|
|
217
|
+
|
|
210
218
|
| Wix item | Drafted as |
|
|
211
219
|
|---|---|
|
|
212
220
|
| Digital store product, paid online program, one-time "unlimited" pricing plan | a non-consumable |
|
|
@@ -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,
|
|
@@ -1471,7 +1471,7 @@
|
|
|
1471
1471
|
"name": "NavigationConfig",
|
|
1472
1472
|
"kind": "interface",
|
|
1473
1473
|
"jsdoc": "/** Per-app navigation/deep-link config, served OTA at GET /v1/app-config/:appName. */",
|
|
1474
|
-
"decl": "export interface NavigationConfig {\n /** Tab-bar structure (which tabs; their icons/labels/badges). */\n tabBar?: TabBarConfig;\n /** Slide-in drawer / hamburger-menu destinations. */\n drawer?: DrawerConfig;\n /** Navigation chrome the shell draws.\n * Omitted ⇒ \"bottomTabs\". The shell (not the descriptor) reads this. */\n navKind?: NavKind;\n /** Destinations for \"sidebar\" mode.\n * Absent ⇒ the shell derives the rail from `tabBar.items`. */\n sidebar?: SidebarConfig;\n /** App-level default top bar; a per-screen\n * `ScreenDescriptor.topBar` fully replaces it (override, not merge). */\n topBarDefault?: TopBarConfig;\n /** The post-OS-splash brand surface (see `SplashConfig`). Absent / not enabled\n * ⇒ today's behavior. Operational per (live-flippable). */\n splash?: SplashConfig;\n /** App-level default locale. Operational per so a Hebrew (or Spanish)\n * branded app can pin RTL/l10n OTA without a launch flag. `default` is a\n * BCP-47 primary subtag; clients coerce unknown tags rather than failing the\n * envelope. `pin: true` skips the device/browser language; in-app `locale.set`\n * still wins. Absent ⇒ today's device-then-en behavior. */\n locale?: LocaleConfig;\n /** Effective orientations, resolved INSIDE\n * the binary's build-time envelope (config.ts `orientationEnvelope`). The\n * envelope is the ceiling and can never be OTA (iOS reads the plist before\n * any app code runs); this narrows within it. Always intersected with the\n * envelope — it can never widen it. Absent/empty ⇒ the envelope itself. */\n orientation?: OrientationConfig;\n /** Per-surface nav projection, keyed by catalog\n * surface id (`phone` | `tablet` | `desktop` | `mac` | `watch` | `wear` | `rn`).\n * Keyed the way `orientation` is keyed by device family and narrowed the same\n * way: a key outside the app's `platforms.json` envelope is DROPPED, never\n * honored (see `resolveSurfaceNav`). Absent key ⇒ that surface uses the default\n * projection, so an app that never thinks about surfaces is unaffected. */\n surfaces?: Record<string, SurfaceNavConfig>;\n /** The APP-LEVEL nav worker\n * that feeds every `*Path` binding on `NavTabItem` / `DrawerItem` /\n * `TopBarAction`. App-level, not a screen's worker, because chrome outlives\n * every screen: a cart badge must survive leaving the cart, and a flag-hidden\n * tab must stay hidden three pushes deep in another stack. Absent ⇒ paths stay\n * unresolved and the literals render — the worker enriches, it never gates. */\n navLogicBundle?: LogicBundleRef;\n /** Which nav badges ALSO drive the OS app-icon\n * badge. Each entry is `\"<kind>:<id>\"` (`tab` | `drawer` | `topBarAction`, the\n * spelling `navKey` uses); the icon shows the SUM of those slots' resolved counts.\n * Empty/absent ⇒ no mirroring. An entry naming a slot this build does not have is\n * ignored, never a blanked badge. Requires the `push` capability — `defineApp`\n * rejects the combination, because the badge would be set and never shown. */\n appIconBadgeSources?: string[];\n /** Signed release allowlist for contained browser Tier-5 `_stream` requests. */\n streamPolicy?: StreamPolicy;\n /** A site shell's URL space. A push tap, app link or\n * custom-scheme link whose URL is an https page on one of `site.origins` opens the\n * screen owning its path, and that screen's WebView loads the full URL. Absent ⇒\n * links resolve as before. Build it with `siteNavConfig()` from\n * `@himalaya/core/site-shell`; resolution is `resolveSiteLink()`. */\n site?: SiteNavConfig;\n /** amendment \"top-bar gap items\" — app-wide logo for tab-stack roots. */\n topBarLogo?: TopBarLogo;\n scheme: string;\n deepLinkPatterns: DeepLinkPattern[];\n linkableScreens: LinkableScreen[];\n}",
|
|
1474
|
+
"decl": "export interface NavigationConfig {\n /** Tab-bar structure (which tabs; their icons/labels/badges). */\n tabBar?: TabBarConfig;\n /** Slide-in drawer / hamburger-menu destinations. */\n drawer?: DrawerConfig;\n /** Navigation chrome the shell draws.\n * Omitted ⇒ \"bottomTabs\". The shell (not the descriptor) reads this. */\n navKind?: NavKind;\n /** Destinations for \"sidebar\" mode.\n * Absent ⇒ the shell derives the rail from `tabBar.items`. */\n sidebar?: SidebarConfig;\n /** App-level default top bar; a per-screen\n * `ScreenDescriptor.topBar` fully replaces it (override, not merge). */\n topBarDefault?: TopBarConfig;\n /** The post-OS-splash brand surface (see `SplashConfig`). Absent / not enabled\n * ⇒ today's behavior. Operational per (live-flippable). */\n splash?: SplashConfig;\n /** App-level default locale. Operational per so a Hebrew (or Spanish)\n * branded app can pin RTL/l10n OTA without a launch flag. `default` is a\n * BCP-47 primary subtag; clients coerce unknown tags rather than failing the\n * envelope. `pin: true` skips the device/browser language; in-app `locale.set`\n * still wins. Absent ⇒ today's device-then-en behavior. */\n locale?: LocaleConfig;\n /** Effective orientations, resolved INSIDE\n * the binary's build-time envelope (config.ts `orientationEnvelope`). The\n * envelope is the ceiling and can never be OTA (iOS reads the plist before\n * any app code runs); this narrows within it. Always intersected with the\n * envelope — it can never widen it. Absent/empty ⇒ the envelope itself. */\n orientation?: OrientationConfig;\n /** Per-surface nav projection, keyed by catalog\n * surface id (`phone` | `tablet` | `desktop` | `mac` | `watch` | `wear` | `rn`).\n * Keyed the way `orientation` is keyed by device family and narrowed the same\n * way: a key outside the app's `platforms.json` envelope is DROPPED, never\n * honored (see `resolveSurfaceNav`). Absent key ⇒ that surface uses the default\n * projection, so an app that never thinks about surfaces is unaffected. */\n surfaces?: Record<string, SurfaceNavConfig>;\n /** The APP-LEVEL nav worker\n * that feeds every `*Path` binding on `NavTabItem` / `DrawerItem` /\n * `TopBarAction`. App-level, not a screen's worker, because chrome outlives\n * every screen: a cart badge must survive leaving the cart, and a flag-hidden\n * tab must stay hidden three pushes deep in another stack. Absent ⇒ paths stay\n * unresolved and the literals render — the worker enriches, it never gates. */\n navLogicBundle?: LogicBundleRef;\n /** Which nav badges ALSO drive the OS app-icon\n * badge. Each entry is `\"<kind>:<id>\"` (`tab` | `drawer` | `topBarAction`, the\n * spelling `navKey` uses); the icon shows the SUM of those slots' resolved counts.\n * Empty/absent ⇒ no mirroring. An entry naming a slot this build does not have is\n * ignored, never a blanked badge. Requires the `push` capability — `defineApp`\n * rejects the combination, because the badge would be set and never shown. */\n appIconBadgeSources?: string[];\n /** Signed release allowlist for contained browser Tier-5 `_stream` requests. */\n streamPolicy?: StreamPolicy;\n /** A site shell's URL space. A push tap, app link or\n * custom-scheme link whose URL is an https page on one of `site.origins` opens the\n * screen owning its path, and that screen's WebView loads the full URL. Absent ⇒\n * links resolve as before. Build it with `siteNavConfig()` from\n * `@himalaya/core/site-shell`; resolution is `resolveSiteLink()`. */\n site?: SiteNavConfig;\n /** amendment \"top-bar gap items\" — app-wide logo for tab-stack roots. */\n topBarLogo?: TopBarLogo;\n /** Opt-in alert queue. `true` ⇒ every presented alert (worker `ui.alert`, the descriptor nav\n * `alert` verb, app services) shows one at a time in FIFO order per shell, instead of replacing\n * each other or rejecting `ui_busy`. At most 5 wait (a 6th worker call rejects `ui_queue_full`);\n * identical consecutive alerts show once. An inline `AlertDialog` component never enters the\n * queue. Absent ⇒ today's behaviour. */\n presentationQueue?: boolean;\n scheme: string;\n deepLinkPatterns: DeepLinkPattern[];\n linkableScreens: LinkableScreen[];\n}",
|
|
1475
1475
|
"verificationChecked": true
|
|
1476
1476
|
},
|
|
1477
1477
|
{
|
|
@@ -2913,7 +2913,7 @@
|
|
|
2913
2913
|
"name": "WixIapOperation",
|
|
2914
2914
|
"kind": "type",
|
|
2915
2915
|
"jsdoc": "",
|
|
2916
|
-
"decl": "export type WixIapOperation = \"startPayment\" | \"startItemPayment\" | \"completePayment\" | \"getPayment\";",
|
|
2916
|
+
"decl": "export type WixIapOperation = \"startPayment\" | \"startItemPayment\" | \"completePayment\" | \"cancelPayment\" | \"getPayment\";",
|
|
2917
2917
|
"verificationChecked": true
|
|
2918
2918
|
},
|
|
2919
2919
|
{
|
|
@@ -2927,7 +2927,7 @@
|
|
|
2927
2927
|
"name": "StartItemPaymentErrorCode",
|
|
2928
2928
|
"kind": "type",
|
|
2929
2929
|
"jsdoc": "",
|
|
2930
|
-
"decl": "export type StartItemPaymentErrorCode = \"PRODUCT_NOT_AVAILABLE\" | \"ALREADY_OWNED\" | \"ITEM_NOT_AVAILABLE\"\n | \"SITE_NOT_ACCEPTING_PAYMENTS\" | \"UNSUPPORTED_ORDER\";",
|
|
2930
|
+
"decl": "export type StartItemPaymentErrorCode = \"PRODUCT_NOT_AVAILABLE\" | \"ALREADY_OWNED\" | \"ITEM_NOT_AVAILABLE\"\n | \"SITE_NOT_ACCEPTING_PAYMENTS\" | \"UNSUPPORTED_ORDER\" | \"CATALOG_NOT_SUPPORTED\" | \"VERTICAL_ACCESS_DENIED\"\n | \"EVENT_CHECKOUT_NOT_ECOM\" | \"ALREADY_SUBSCRIBED\" | \"SUBSCRIPTION_NOT_IN_APP\" | \"BILLING_COUNTRY_REQUIRED\"\n | \"APP_NOT_CONFIGURED\" | \"NOT_BOOKING_OWNER\" | \"BOOKING_PAYMENT_PENDING\";",
|
|
2931
2931
|
"verificationChecked": true
|
|
2932
2932
|
},
|
|
2933
2933
|
{
|
|
@@ -2944,6 +2944,13 @@
|
|
|
2944
2944
|
"decl": "export type GetPaymentErrorCode = \"NOT_FOUND\";",
|
|
2945
2945
|
"verificationChecked": true
|
|
2946
2946
|
},
|
|
2947
|
+
{
|
|
2948
|
+
"name": "CancelPaymentErrorCode",
|
|
2949
|
+
"kind": "type",
|
|
2950
|
+
"jsdoc": "",
|
|
2951
|
+
"decl": "export type CancelPaymentErrorCode = \"NOT_PENDING\" | \"APP_NOT_CONFIGURED\" | \"NOT_FOUND\";",
|
|
2952
|
+
"verificationChecked": true
|
|
2953
|
+
},
|
|
2947
2954
|
{
|
|
2948
2955
|
"name": "WixIapFailureKind",
|
|
2949
2956
|
"kind": "type",
|
|
@@ -2968,8 +2975,8 @@
|
|
|
2968
2975
|
{
|
|
2969
2976
|
"name": "EcomCatalogReference",
|
|
2970
2977
|
"kind": "interface",
|
|
2971
|
-
"jsdoc": "/** One item a Wix catalog sells
|
|
2972
|
-
"decl": "export interface EcomCatalogReference {\n catalogItemId: string;\n catalogAppId: string;\n}",
|
|
2978
|
+
"jsdoc": "/** One item a Wix catalog sells, as eCom's `catalogReference` names it: the item id and its catalog\n * app. The purchases catalog sells it under `catalogItemId` as its `appProductId`. `options` go to\n * eCom unchanged and are each vertical's own: a plan's `{type: \"PLAN\", planOptions: {pricingVariantId}}`,\n * a booking's `{bookingId}`, a ticket's `{eventId}`, a Stores variant's `{variantId}`. Plain JSON only.\n * The quantity is always 1. */",
|
|
2979
|
+
"decl": "export interface EcomCatalogReference {\n catalogItemId: string;\n catalogAppId: string;\n options?: Record<string, unknown>;\n}",
|
|
2973
2980
|
"verificationChecked": true
|
|
2974
2981
|
},
|
|
2975
2982
|
{
|
|
@@ -2982,8 +2989,8 @@
|
|
|
2982
2989
|
{
|
|
2983
2990
|
"name": "StartItemPaymentResult",
|
|
2984
2991
|
"kind": "type",
|
|
2985
|
-
"jsdoc": "/** StartItemPayment places the member's
|
|
2986
|
-
"decl": "export type StartItemPaymentResult =\n | { status: \"started\"; payment: WixIapPayment; storeProductId: string; appAccountToken: string; ecomOrderId
|
|
2992
|
+
"jsdoc": "/** StartItemPayment places the member's order for one catalog item, charges it with `appleIAP` and\n * starts its Payment, all server-side. Four different ids come back: the vertical's record (the eCom\n * order, `ecomOrderId`; for Online Programs the join application, `joinApplicationId`, and no eCom\n * order), the Wix Payments charge (`payment.wixTransactionId`), the wix-iap Payment\n * (`payment.paymentId`) and the StoreKit `appAccountToken`. Keep them out of screen state. */",
|
|
2993
|
+
"decl": "export type StartItemPaymentResult =\n | { status: \"started\"; payment: WixIapPayment; storeProductId: string; appAccountToken: string; ecomOrderId?: string; joinApplicationId?: string }\n | WixIapFailure<StartItemPaymentErrorCode>\n | StartItemPaymentOutcomeUnknown;",
|
|
2987
2994
|
"verificationChecked": true
|
|
2988
2995
|
},
|
|
2989
2996
|
{
|
|
@@ -3000,6 +3007,13 @@
|
|
|
3000
3007
|
"decl": "export type GetPaymentResult = { status: \"found\"; payment: WixIapPayment } | WixIapFailure<GetPaymentErrorCode>;",
|
|
3001
3008
|
"verificationChecked": true
|
|
3002
3009
|
},
|
|
3010
|
+
{
|
|
3011
|
+
"name": "CancelPaymentResult",
|
|
3012
|
+
"kind": "type",
|
|
3013
|
+
"jsdoc": "/** `answered`: the Payment as CancelPayment left it, `canceling`, `canceled`, or `approved` when a\n * purchase the store already reported paid it instead. Only `canceled` means nothing was paid. */",
|
|
3014
|
+
"decl": "export type CancelPaymentResult = { status: \"answered\"; payment: WixIapPayment } | WixIapFailure<CancelPaymentErrorCode>;",
|
|
3015
|
+
"verificationChecked": true
|
|
3016
|
+
},
|
|
3003
3017
|
{
|
|
3004
3018
|
"name": "WixIapClientDependencies",
|
|
3005
3019
|
"kind": "interface",
|
|
@@ -3012,7 +3026,7 @@
|
|
|
3012
3026
|
"name": "WixIapClient",
|
|
3013
3027
|
"kind": "interface",
|
|
3014
3028
|
"jsdoc": "",
|
|
3015
|
-
"decl": "export interface WixIapClient {\n /** StartPayment for a pending `appleIAP` Wix Payments transaction the member placed. Returns the\n * store product to sell and this payment's `appAccountToken` to pass to StoreKit. */\n startPayment(input: { wixTransactionId: string }): Promise<StartPaymentResult>;\n /** StartItemPayment for one catalog item: the service places the member's
|
|
3029
|
+
"decl": "export interface WixIapClient {\n /** StartPayment for a pending `appleIAP` Wix Payments transaction the member placed. Returns the\n * store product to sell and this payment's `appAccountToken` to pass to StoreKit. */\n startPayment(input: { wixTransactionId: string }): Promise<StartPaymentResult>;\n /** StartItemPayment for one catalog item: the service places the member's order, charges it and\n * starts its Payment. Every call places a new order, so `outcomeUnknown` must never be resent as\n * if nothing happened. `storeCountryCode` is StoreKit's storefront country (alpha-3), sent when\n * known. Returns the store product, the token and the eCom order or join application. */\n startItemPayment(input: { item: EcomCatalogReference; storeCountryCode?: string }): Promise<StartItemPaymentResult>;\n /** CompletePayment with held Apple proof, sent unchanged: the service pays the payment whose\n * token the transaction carries. Success can still be `approving`. */\n completePayment(transaction: AppleTransaction): Promise<CompletePaymentResult>;\n /** GetPayment: one of the member's own Payments. */\n getPayment(input: { paymentId: string }): Promise<GetPaymentResult>;\n /** CancelPayment: the member dismissed the store sheet. The service cancels the pending Payment and\n * releases what its vertical held, unless a purchase the store already reported paid it. */\n cancelPayment(input: { paymentId: string }): Promise<CancelPaymentResult>;\n}",
|
|
3016
3030
|
"verificationChecked": true,
|
|
3017
3031
|
"verified": false
|
|
3018
3032
|
},
|
|
@@ -28162,6 +28176,37 @@
|
|
|
28162
28176
|
"decl": "export async function isFollowingMember(targetId: string): Promise<boolean>;",
|
|
28163
28177
|
"http": "POST /members/v3/followers/my/connections",
|
|
28164
28178
|
"verificationChecked": true
|
|
28179
|
+
},
|
|
28180
|
+
{
|
|
28181
|
+
"name": "WixMemberLastOpenApp",
|
|
28182
|
+
"kind": "interface",
|
|
28183
|
+
"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. */",
|
|
28184
|
+
"decl": "export interface WixMemberLastOpenApp {\n amount?: number;\n unit?: string;\n ts?: string;\n}",
|
|
28185
|
+
"verificationChecked": true
|
|
28186
|
+
},
|
|
28187
|
+
{
|
|
28188
|
+
"name": "WixMemberActivity",
|
|
28189
|
+
"kind": "interface",
|
|
28190
|
+
"jsdoc": "/** One member's activity from the One App members service. */",
|
|
28191
|
+
"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}",
|
|
28192
|
+
"verificationChecked": true
|
|
28193
|
+
},
|
|
28194
|
+
{
|
|
28195
|
+
"name": "queryMemberActivity",
|
|
28196
|
+
"kind": "function",
|
|
28197
|
+
"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. */",
|
|
28198
|
+
"decl": "export async function queryMemberActivity(ids: string[]): Promise<WixMemberActivity[]>;",
|
|
28199
|
+
"scope": "visitor",
|
|
28200
|
+
"verificationChecked": true
|
|
28201
|
+
},
|
|
28202
|
+
{
|
|
28203
|
+
"name": "listFollowedMembers",
|
|
28204
|
+
"kind": "function",
|
|
28205
|
+
"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. */",
|
|
28206
|
+
"decl": "export async function listFollowedMembers(targetIds: string[]): Promise<string[]>;",
|
|
28207
|
+
"http": "POST /members/v3/followers/my/connections",
|
|
28208
|
+
"scope": "visitor",
|
|
28209
|
+
"verificationChecked": true
|
|
28165
28210
|
}
|
|
28166
28211
|
]
|
|
28167
28212
|
},
|
|
@@ -28208,15 +28253,15 @@
|
|
|
28208
28253
|
{
|
|
28209
28254
|
"name": "queryNotifications",
|
|
28210
28255
|
"kind": "function",
|
|
28211
|
-
"jsdoc": "/** List the signed-in member's notifications, newest first. MOBILE channel. */",
|
|
28256
|
+
"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
28257
|
"decl": "export async function queryNotifications(limit = 25, options?: WixCallOptions): Promise<MfvNotification[]>;",
|
|
28213
28258
|
"verificationChecked": true
|
|
28214
28259
|
},
|
|
28215
28260
|
{
|
|
28216
28261
|
"name": "countUnseenNotifications",
|
|
28217
28262
|
"kind": "function",
|
|
28218
|
-
"jsdoc": "/** Source member-app MOBILE/UNSEEN aggregate, capped at 100.
|
|
28219
|
-
"decl": "export async function countUnseenNotifications(options
|
|
28263
|
+
"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. */",
|
|
28264
|
+
"decl": "export async function countUnseenNotifications(options?: { site?: string }): Promise<number>;",
|
|
28220
28265
|
"verificationChecked": true
|
|
28221
28266
|
},
|
|
28222
28267
|
{
|
package/guides/skill.md
CHANGED
|
@@ -184,6 +184,7 @@ and is also served at the public URL above. No repository access is required.
|
|
|
184
184
|
|
|
185
185
|
- **Your platform already holds the owner's Wix session or token** (they connected their Wix account to it): that token **is** the owner. Any valid Wix token can manage that account's apps, publishing included. Pipe it in — `printf '%s' "$TOKEN" | himi login --wix --wix-token-stdin --target wix` — or set `WIX_TOKEN` and run `himi login --wix --target wix`. Never put a token on the command line (argv shows in `ps` and transcripts) or in a file you commit, and never print it.
|
|
186
186
|
- **A server or CI job** with an account API key: `WIX_API_KEY` + `himi login --wix --target wix`.
|
|
187
|
+
- **You hold no token at all:** run `himi login --device --target wix`. It prints a link and a short code. Show the owner both, ask them to open the link on any device where they are signed in to wix.com, check the code matches and approve, then wait: the command returns once they approve (up to 10 minutes).
|
|
187
188
|
- **None of these:** stop and say exactly what is missing. Do not improvise another route to a himi token.
|
|
188
189
|
|
|
189
190
|
This replaces only the sign-in. The approval gates above still apply to every side effect.
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1635.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": "2eb0ec4acfa6663413f592cc6ba30c8888d6a7e736cb32e119b1f8ca"
|
|
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"],
|
|
@@ -92,7 +92,6 @@ export const COLLECTIONS: Record<string, CollectionConfig> = {
|
|
|
92
92
|
searchPlaceholder: 'Customer name, email or order #', sortLabels: { default: 'Newest', az: 'Customer A–Z', za: 'Customer Z–A' },
|
|
93
93
|
filterValues: ['Recent 7 days', 'Paid', 'Unpaid', 'Partially paid', 'Pending', 'Refunded', 'Partly refunded'] },
|
|
94
94
|
himiBrandedGroups: { rows: 'rows', title: 'name', subtitle: 'description', image: 'image', view: 'grid' },
|
|
95
|
-
himiBrandedCms: { rows: 'rows', title: 'name', subtitle: 'subtitle', view: 'grid' },
|
|
96
95
|
himiBrandedCmsCollection: { instanceInput: 'collection', rows: 'rows', title: 'title', subtitle: 'subtitle', view: 'list' },
|
|
97
96
|
himiBrandedOrders: { rows: 'rows', title: 'title', subtitle: 'subtitle', image: 'image', metadata: ['status', 'meta'], rowStyle: 'flat', view: 'list', backendQuery: true,
|
|
98
97
|
searchPlaceholder: 'Search by order number', countNoun: ['order', 'orders'], filterValues: ['Not fulfilled', 'Partially fulfilled', 'Fulfilled'],
|
|
@@ -92,7 +92,6 @@ export const COLLECTIONS: Record<string, CollectionConfig> = {
|
|
|
92
92
|
searchPlaceholder: 'Customer name, email or order #', sortLabels: { default: 'Newest', az: 'Customer A–Z', za: 'Customer Z–A' },
|
|
93
93
|
filterValues: ['Recent 7 days', 'Paid', 'Unpaid', 'Partially paid', 'Pending', 'Refunded', 'Partly refunded'] },
|
|
94
94
|
himiBrandedGroups: { rows: 'rows', title: 'name', subtitle: 'description', image: 'image', view: 'grid' },
|
|
95
|
-
himiBrandedCms: { rows: 'rows', title: 'name', subtitle: 'subtitle', view: 'grid' },
|
|
96
95
|
himiBrandedCmsCollection: { instanceInput: 'collection', rows: 'rows', title: 'title', subtitle: 'subtitle', view: 'list' },
|
|
97
96
|
himiBrandedOrders: { rows: 'rows', title: 'title', subtitle: 'subtitle', image: 'image', metadata: ['status', 'meta'], rowStyle: 'flat', view: 'list', backendQuery: true,
|
|
98
97
|
searchPlaceholder: 'Search by order number', countNoun: ['order', 'orders'], filterValues: ['Not fulfilled', 'Partially fulfilled', 'Fulfilled'],
|
|
@@ -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,
|