@wix/himalaya-cli 0.1154.0 → 0.1155.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.
|
Binary file
|
package/guides/himi-test.md
CHANGED
|
@@ -116,6 +116,7 @@ Only **unambiguous** defects, so a green run stays worth trusting:
|
|
|
116
116
|
| `non-finite-number` | error | `NaN` / `Infinity` in worker state — the wrong-total / missing-operand reducer bug. Read live, before the JSON trip to the host flattens it to `null`. On device it renders as an **empty** label, not the text "NaN". |
|
|
117
117
|
| `placeholder-in-text` | error | `undefined`, `null`, `NaN`, `[object Object]` or a JSON blob rendered as visible text. |
|
|
118
118
|
| `unsubstituted-binding` | error | A raw `$service:` / `$item` token, or an unresolved `$t:` i18n key, reaching visible text. |
|
|
119
|
+
| `item-field-missing` | error | A list row template binds `$item.<field>`, but none of the list's real rows carries `<field>`: the web preview paints `item.<field>` as text and native paints nothing (a worker emitting `jobType` while the template reads `$item.type`). Judged only against real rows, and on the first segment. `warning` when the prop declares `collapseWhenEmpty`. |
|
|
119
120
|
| `unresolved-wix-media` | error | A media-typed prop holding a raw Wix media handle/id the renderer cannot load. |
|
|
120
121
|
| `binding-unresolved` | error / warning | A `$service:` binding aimed at state the worker never defines. It is an error when the missing value can leave visible UI blank. A direct prop with sibling `collapseWhenEmpty: true` is an advisory warning instead: the renderer deliberately removes that zero-size optional chrome, while the warning keeps the omitted contract auditable. |
|
|
121
122
|
| `nav-param-dropped` | error | A bound `himi.open` param that resolves to nothing, so the target opens without it and error-cards. |
|
package/guides/iap-products.md
CHANGED
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
# Registering digital products as App Store in-app purchases (`himi store iap`)
|
|
2
2
|
|
|
3
|
-
`himi store iap` registers an app owner's **
|
|
4
|
-
|
|
3
|
+
`himi store iap` registers an app owner's **digital products** in the owner's existing
|
|
4
|
+
App Store Connect app. It configures each product's draft metadata, an exact
|
|
5
5
|
initial price and explicit territories. It then exports a Wix→Apple mapping for a future
|
|
6
6
|
backend import.
|
|
7
7
|
|
|
8
8
|
It is an administration workflow, not a build: it never builds, signs or bumps a version,
|
|
9
|
-
and it runs anywhere `himi` is installed. An owner needs only a
|
|
10
|
-
|
|
9
|
+
and it runs anywhere `himi` is installed. An owner needs only a credential profile, plus
|
|
10
|
+
either a manifest or a Wix site for `draft` to read. It does not run during an app build or
|
|
11
|
+
a customer checkout.
|
|
11
12
|
|
|
12
|
-
|
|
13
|
-
|
|
13
|
+
It registers one-time **non-consumables**, and **consumable price tiers** for large
|
|
14
|
+
catalogs. Subscriptions are refused before anything reaches Apple.
|
|
14
15
|
|
|
15
16
|
## Before you start
|
|
16
17
|
|
|
@@ -33,6 +34,56 @@ is refused before anything reaches Apple.
|
|
|
33
34
|
There is **no ambient fallback**. `--profile` is required, and exported `ASC_*` variables
|
|
34
35
|
are never used to decide which account to write to.
|
|
35
36
|
|
|
37
|
+
## Drafting the manifest from your Wix catalog
|
|
38
|
+
|
|
39
|
+
You don't have to write the manifest by hand. `draft` reads the site's whole catalog —
|
|
40
|
+
every page of Wix Stores (Catalog V3 or V1), Online Programs and Pricing Plans — and writes
|
|
41
|
+
a manifest of everything that can be sold:
|
|
42
|
+
|
|
43
|
+
```bash
|
|
44
|
+
himi store iap draft --site <msid> --profile fit-club-owner --apple-app 6450000001 \
|
|
45
|
+
--bundle com.example.fitclub --base-territory USA --territories USA,CAN --out ./iap-products.json
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
| Wix item | Drafted as |
|
|
49
|
+
|---|---|
|
|
50
|
+
| Digital store product, paid online program, one-time "unlimited" pricing plan | a non-consumable |
|
|
51
|
+
| Physical product | skipped: physical goods are never sold through in-app purchase |
|
|
52
|
+
| Recurring or time-limited pricing plan | skipped: App Store subscriptions are a separate API |
|
|
53
|
+
| Free, hidden (unpublished, archived or not visible) or unclassified item | skipped |
|
|
54
|
+
| Item priced in another currency than the base territory | skipped |
|
|
55
|
+
| Bookings services and events | never read: real-world services can't be in-app purchases |
|
|
56
|
+
|
|
57
|
+
- **Product ids come from the Wix id** (`<bundle>.product.<wix-id>`, and `.program.` or
|
|
58
|
+
`.plan.` for those sources), so drafting the same catalog again gives the same ids.
|
|
59
|
+
- **Prices use the rule `atLeast`:** the lowest Apple price point at or above the Wix
|
|
60
|
+
price. `plan` shows the Apple price each new product will get before anything is written.
|
|
61
|
+
- **Names and descriptions are cut to Apple's limits,** and HTML becomes plain text.
|
|
62
|
+
- **`--merge <manifest>` keeps an earlier manifest's mappings.** Anything it already maps
|
|
63
|
+
keeps its product id, and only new catalog items are added. Use it on every redraft,
|
|
64
|
+
because product ids are permanent.
|
|
65
|
+
- **`--report <file>`** saves the skipped items and their reasons.
|
|
66
|
+
- **The draft is a starting point.** Review or trim it if you like, then run `plan` as
|
|
67
|
+
usual. Nothing in App Store Connect changes until `apply`.
|
|
68
|
+
|
|
69
|
+
### Price tiers for large catalogs: `--mode tiers`
|
|
70
|
+
|
|
71
|
+
Thousands of items would mean thousands of Apple products, each needing App Review.
|
|
72
|
+
`--mode tiers` drafts **one consumable per Apple price point** instead (for example
|
|
73
|
+
`<bundle>.tier.usd_1_99`). Each tier lists, under `unlocks`, every Wix item it pays for.
|
|
74
|
+
|
|
75
|
+
- **Wix prices are grouped by the Apple point they resolve to.** Items at 1.10, 1.50 and
|
|
76
|
+
1.99 USD all go into the 1.99 tier, and the shopper pays the tier's Apple price.
|
|
77
|
+
- **An item priced above Apple's highest point is skipped,** with its reason.
|
|
78
|
+
- **This needs Apple's price grid,** read through any in-app purchase the app already has.
|
|
79
|
+
If the app has none yet, tiers are keyed by Wix price and the draft says so; redraft
|
|
80
|
+
once the first product exists.
|
|
81
|
+
|
|
82
|
+
A shopper buys the tier, and the backend grants the item they chose.
|
|
83
|
+
|
|
84
|
+
Apple can't restore a consumable, so each unlocked item must be recorded against the
|
|
85
|
+
shopper's Wix member account. That delivery is the backend's job, not this command's.
|
|
86
|
+
|
|
36
87
|
## The manifest
|
|
37
88
|
|
|
38
89
|
The manifest is an explicit, versioned selection. Nothing is inferred from names or prices,
|
|
@@ -74,19 +125,27 @@ Rules, all checked locally before any request:
|
|
|
74
125
|
- **`classification`** must be `"digital"`. Physical goods and unclassified products are
|
|
75
126
|
refused. The classification is your configuration; this command does not make Apple's
|
|
76
127
|
policy decisions for you.
|
|
77
|
-
- **`productId`** must be stable,
|
|
78
|
-
**immutable** once created, so
|
|
79
|
-
- **`
|
|
80
|
-
|
|
128
|
+
- **`productId`** must be stable: drafted from the Wix id, or chosen by you. Apple product
|
|
129
|
+
ids and types are **immutable** once created, so an id is never regenerated.
|
|
130
|
+
- **`type`** is `"nonConsumable"` or `"consumable"`. A consumable price tier names
|
|
131
|
+
`unlocks` (a list of `{entityType, entityId, entitlement}`) instead of `wix`; every other
|
|
132
|
+
item names exactly one `wix` entity.
|
|
133
|
+
- **`price.amount`** is a decimal **string**. Under the default `price.rule` of `"exact"`
|
|
134
|
+
it must match one of Apple's price points exactly; it is never rounded, and a nearby
|
|
135
|
+
price is never substituted. With `"rule": "atLeast"` it takes the lowest point at or
|
|
136
|
+
above the amount, and `plan` shows which.
|
|
137
|
+
- **Apple's field limits:** display name 2–30 characters, description at most 45,
|
|
138
|
+
reference name at most 64, product id at most 100, review note at most 4,000.
|
|
81
139
|
- **`territories`** is an explicit list that includes the base territory. Availability
|
|
82
140
|
never extends to future territories automatically.
|
|
83
141
|
- **Duplicates are refused:** a product id, Wix entity, entitlement or reference name
|
|
84
|
-
used twice.
|
|
142
|
+
used twice, including a Wix entity mapped both directly and through a tier.
|
|
85
143
|
- **Unknown keys are refused, at every level.** So is any string that looks like a key or a token.
|
|
86
144
|
|
|
87
145
|
## The workflow
|
|
88
146
|
|
|
89
147
|
```bash
|
|
148
|
+
himi store iap draft --site <msid> --profile fit-club-owner --apple-app 6450000001 --bundle com.example.fitclub --base-territory USA --out ./iap-products.json
|
|
90
149
|
himi store iap plan --manifest ./iap-products.json --profile fit-club-owner --out ./iap-plan.json
|
|
91
150
|
himi store iap apply --plan ./iap-plan.json --profile fit-club-owner --out ./iap-result.json
|
|
92
151
|
himi store iap status --manifest ./iap-products.json --profile fit-club-owner --json
|
|
@@ -138,6 +197,19 @@ created. The plan marks this in the item's `notes`.
|
|
|
138
197
|
it reads everything back.
|
|
139
198
|
5. Writes the result file, even when the run is partial.
|
|
140
199
|
|
|
200
|
+
**Large catalogs.** App Store Connect allows about 3,600 API requests an hour per key.
|
|
201
|
+
Registering a new product takes about ten, and each run also lists the app's products once.
|
|
202
|
+
|
|
203
|
+
- **`apply --limit <n>`** creates at most `n` new products per run and reports the rest as
|
|
204
|
+
`deferred`. Rerunning the same plan continues where the last run stopped.
|
|
205
|
+
- **Only products with planned writes are re-read.** Products the plan reused are reported
|
|
206
|
+
from the plan.
|
|
207
|
+
- **Per-item registration of thousands of products still takes many hours.** Every one
|
|
208
|
+
also needs App Review, so prefer `--mode tiers` at that scale.
|
|
209
|
+
- **Rate limits are handled:** throttled reads wait for Apple's `Retry-After` and retry.
|
|
210
|
+
- **Plans and results with more than 50 products print a summary,** including any products
|
|
211
|
+
whose Apple price is higher than requested. The files always list every product.
|
|
212
|
+
|
|
141
213
|
**When a write's outcome is unknown** (a lost response, a timeout, a 409), apply reads
|
|
142
214
|
Apple again before doing anything else:
|
|
143
215
|
|
|
@@ -154,7 +226,8 @@ to save it in the same shape as the result file.
|
|
|
154
226
|
|
|
155
227
|
Local state lives in `~/.himalaya/store-iap/<appleAppId>/`:
|
|
156
228
|
|
|
157
|
-
- **`journal.
|
|
229
|
+
- **`journal.jsonl`** is an append-only record of identifiers and step outcomes, one line
|
|
230
|
+
per step. Nothing
|
|
158
231
|
reads it back to decide anything. Every run re-reads the target app, and a product Apple
|
|
159
232
|
hasn't listed yet is caught by apply's read-before-retry, so deleting the journal is
|
|
160
233
|
always safe.
|
|
@@ -165,11 +238,11 @@ Local state lives in `~/.himalaya/store-iap/<appleAppId>/`:
|
|
|
165
238
|
|
|
166
239
|
Each item has two parts:
|
|
167
240
|
|
|
168
|
-
- **`mapping`** — the Wix site/app/bundle, the Wix entity and entitlement,
|
|
169
|
-
id, the Apple resource id and the product type.
|
|
241
|
+
- **`mapping`** — the Wix site/app/bundle, the Wix entity and entitlement (or, for a price
|
|
242
|
+
tier, its `unlocks`), the Apple product id, the Apple resource id and the product type.
|
|
170
243
|
- **`provisioning`**:
|
|
171
244
|
- `outcome` — one of `created`, `updated`, `reused`, `conflict`, `partial`, `failed`
|
|
172
|
-
(`status` also reports `absent` and `incomplete`)
|
|
245
|
+
or `deferred` (`status` also reports `absent` and `incomplete`)
|
|
173
246
|
- per-step states and any conflicts
|
|
174
247
|
- `unmet` — where Apple still differs from the manifest
|
|
175
248
|
- the requested and observed price, availability and locales
|
|
@@ -207,9 +280,8 @@ future importer must authenticate ownership and re-read Apple before activating
|
|
|
207
280
|
|
|
208
281
|
Not in this version:
|
|
209
282
|
|
|
210
|
-
- subscriptions
|
|
283
|
+
- subscriptions
|
|
211
284
|
- review screenshot upload and submission
|
|
212
285
|
- changing a live price
|
|
213
|
-
- Wix catalog discovery
|
|
214
286
|
- Google Play
|
|
215
287
|
- backend import and checkout activation
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/himalaya-cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.1155.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": [
|
|
@@ -67,5 +67,5 @@
|
|
|
67
67
|
"artifactId": "himalaya-cli"
|
|
68
68
|
}
|
|
69
69
|
},
|
|
70
|
-
"falconPackageHash": "
|
|
70
|
+
"falconPackageHash": "fdcb8ee43c58cbb6299d582962eed54297bb7c2152984221e59fccd4"
|
|
71
71
|
}
|