@wix/agent-skills 1.33.0 → 1.34.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/README.md +23 -0
- package/package.json +2 -2
- package/skills/wix-app/references/DASHBOARD_PAGE.md +1 -1
- package/skills/wix-export/SKILL.md +83 -0
- package/skills/wix-harmony-editor/.publish-manifest.json +8 -0
- package/skills/wix-harmony-editor/COPY-SITE.md +494 -0
- package/skills/wix-harmony-editor/SKILL.md +317 -0
- package/skills/wix-harmony-editor/scripts/copy/build-description.mjs +249 -0
- package/skills/wix-harmony-editor/scripts/copy/check-description.mjs +225 -0
- package/skills/wix-harmony-editor/scripts/copy/check-mirror.mjs +89 -0
- package/skills/wix-harmony-editor/scripts/copy/compare-preview.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/deploy-description.mjs +212 -0
- package/skills/wix-harmony-editor/scripts/copy/desc-hash.mjs +44 -0
- package/skills/wix-harmony-editor/scripts/copy/editor-run.mjs +45 -0
- package/skills/wix-harmony-editor/scripts/copy/export-page.mjs +53 -0
- package/skills/wix-harmony-editor/scripts/copy/find-interactions.mjs +76 -0
- package/skills/wix-harmony-editor/scripts/copy/hide-scrollbars.mjs +16 -0
- package/skills/wix-harmony-editor/scripts/copy/import-media.mjs +150 -0
- package/skills/wix-harmony-editor/scripts/copy/link-url.mjs +27 -0
- package/skills/wix-harmony-editor/scripts/copy/lint-api.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/measure-source.mjs +211 -0
- package/skills/wix-harmony-editor/scripts/copy/merge-mirrors.mjs +29 -0
- package/skills/wix-harmony-editor/scripts/copy/mirror-site.mjs +92 -0
- package/skills/wix-harmony-editor/scripts/copy/mobile-stage.mjs +56 -0
- package/skills/wix-harmony-editor/scripts/copy/preview-widths.mjs +73 -0
- package/skills/wix-harmony-editor/scripts/copy/render-plate.mjs +67 -0
- package/skills/wix-harmony-editor/scripts/copy/serve-mirror.mjs +102 -0
- package/skills/wix-harmony-editor/scripts/copy/snapshot-capabilities.mjs +40 -0
- package/skills/wix-harmony-editor/scripts/copy/split-sections.mjs +191 -0
- package/skills/wix-harmony-editor/scripts/copy/upload-media-manager.mjs +61 -0
- package/skills/wix-harmony-editor/scripts/launch.sh +359 -0
- package/skills/wix-headless/SKILL.md +7 -2
- package/skills/wix-headless/references/CAPABILITIES.md +6 -1
- package/skills/wix-headless/references/DISCOVERY.md +2 -1
- package/skills/wix-headless/references/SDK_HANDOFF.md +6 -1
- package/skills/wix-headless/references/SEED.md +3 -2
- package/skills/wix-headless/references/SETUP.md +1 -0
- package/skills/wix-headless/references/inline-recipes/experience-donations.md +102 -0
- package/skills/wix-headless/references/inline-recipes/how-to-code-donations.md +146 -0
- package/skills/wix-headless/references/inline-recipes/setup-donations.md +15 -0
- package/skills/wix-headless/references/managed/CREATE.md +1 -1
- package/skills/wix-headless-kit/SKILL.md +110 -21
- package/skills/wix-headless-kit/guides/api-run.md +15 -13
- package/skills/wix-headless-kit/guides/existing-site.md +31 -0
- package/skills/wix-headless-kit/guides/migration.md +49 -17
- package/skills/wix-headless-kit/install/agents-md.mjs +1 -1
- package/skills/wix-headless-kit/install/context.mjs +61 -6
- package/skills/wix-headless-kit/install/pins.json +1 -1
- package/skills/wix-headless-kit/install/setup.mjs +107 -12
- package/skills/wix-headless-replatform/.publish-manifest.json +8 -0
- package/skills/wix-headless-replatform/SKILL.md +116 -0
- package/skills/wix-headless-replatform/agents/openai.yaml +6 -0
- package/skills/wix-headless-replatform/references/control-and-visual-fidelity-contract.md +43 -0
- package/skills/wix-headless-replatform/references/extraction-schema.md +187 -0
- package/skills/wix-headless-replatform/references/interaction-runtime-contract.md +137 -0
- package/skills/wix-headless-replatform/references/layout-blueprint-contract.md +41 -0
- package/skills/wix-headless-replatform/references/output-contract.md +93 -0
- package/skills/wix-headless-replatform/references/post-build-gap-contract.md +125 -0
- package/skills/wix-headless-replatform/references/qa-checklist.md +83 -0
- package/skills/wix-headless-replatform/references/safety.md +19 -0
- package/skills/wix-headless-replatform/references/ui-normalization-contract.md +70 -0
- package/skills/wix-headless-replatform/references/workflow.md +157 -0
- package/skills/wix-headless-replatform/registry/README.md +20 -0
- package/skills/wix-headless-replatform/registry/approvals/button/shadcn-default-ac60ef5.json +28 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/button.tsx +54 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/capabilities.json +60 -0
- package/skills/wix-headless-replatform/registry/items/button/shadcn-default-ac60ef5/contract.md +48 -0
- package/skills/wix-headless-replatform/registry/licenses/shadcn-ui-ac60ef5-MIT.txt +21 -0
- package/skills/wix-headless-replatform/registry/registry.json +36 -0
- package/skills/wix-headless-replatform/resources/rp-facelift/SKILL.md +32 -0
- package/skills/wix-headless-replatform/resources/rp-project-context/SKILL.md +62 -0
- package/skills/wix-headless-replatform/resources/rp-qa-gap-loop/SKILL.md +64 -0
- package/skills/wix-headless-replatform/resources/rp-source-evidence/SKILL.md +42 -0
- package/skills/wix-headless-replatform/resources/rp-ui-implementation/SKILL.md +73 -0
- package/skills/wix-headless-replatform/schemas/build-plan.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/candidate.schema.json +19 -0
- package/skills/wix-headless-replatform/schemas/common.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/decision-patch.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/decision-request.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/extraction-gap.schema.json +28 -0
- package/skills/wix-headless-replatform/schemas/extraction-manifest.schema.json +34 -0
- package/skills/wix-headless-replatform/schemas/final-report.schema.json +10 -0
- package/skills/wix-headless-replatform/schemas/foundation.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/metadata.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/observation-packet.schema.json +17 -0
- package/skills/wix-headless-replatform/schemas/page-capture.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/page-resolution.schema.json +33 -0
- package/skills/wix-headless-replatform/schemas/shared-chrome.schema.json +11 -0
- package/skills/wix-headless-replatform/schemas/unit.schema.json +40 -0
- package/skills/wix-headless-replatform/scripts/assemble-extraction.mjs +844 -0
- package/skills/wix-headless-replatform/scripts/benchmark-extraction.mjs +163 -0
- package/skills/wix-headless-replatform/scripts/browser-extraction-preflight.mjs +42 -0
- package/skills/wix-headless-replatform/scripts/build-extracted-homepage.mjs +228 -0
- package/skills/wix-headless-replatform/scripts/clear-wix-starter.mjs +87 -0
- package/skills/wix-headless-replatform/scripts/create-wix-project.mjs +505 -0
- package/skills/wix-headless-replatform/scripts/discover-urls.mjs +142 -0
- package/skills/wix-headless-replatform/scripts/extract-assets.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/extract-design-system.mjs +637 -0
- package/skills/wix-headless-replatform/scripts/extract-interactions.mjs +1903 -0
- package/skills/wix-headless-replatform/scripts/extract-page.mjs +2461 -0
- package/skills/wix-headless-replatform/scripts/extract-seo.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/extract-tokens.mjs +63 -0
- package/skills/wix-headless-replatform/scripts/finalize-extraction-report.mjs +126 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.mjs +180 -0
- package/skills/wix-headless-replatform/scripts/finalize-gap-review.test.mjs +98 -0
- package/skills/wix-headless-replatform/scripts/finalize-migration-website.mjs +103 -0
- package/skills/wix-headless-replatform/scripts/generate-control-state-contract.mjs +176 -0
- package/skills/wix-headless-replatform/scripts/generate-design-md.mjs +261 -0
- package/skills/wix-headless-replatform/scripts/generate-extraction-validators.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/generate-invoice-download-backend.mjs +342 -0
- package/skills/wix-headless-replatform/scripts/generate-layout-blueprint.mjs +140 -0
- package/skills/wix-headless-replatform/scripts/generate-repeater-cms.mjs +22 -0
- package/skills/wix-headless-replatform/scripts/generate-route-plan.mjs +143 -0
- package/skills/wix-headless-replatform/scripts/generate-scene-contract.mjs +288 -0
- package/skills/wix-headless-replatform/scripts/generate-ui-normalization.mjs +266 -0
- package/skills/wix-headless-replatform/scripts/generate-visual-assets.mjs +111 -0
- package/skills/wix-headless-replatform/scripts/lib/browser-tooling.mjs +570 -0
- package/skills/wix-headless-replatform/scripts/lib/common.mjs +329 -0
- package/skills/wix-headless-replatform/scripts/lib/component-capabilities.mjs +121 -0
- package/skills/wix-headless-replatform/scripts/lib/component-registry.mjs +282 -0
- package/skills/wix-headless-replatform/scripts/lib/content-boundary.mjs +61 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-contract.mjs +374 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-detectors.mjs +243 -0
- package/skills/wix-headless-replatform/scripts/lib/extraction-validators.generated.mjs +1139 -0
- package/skills/wix-headless-replatform/scripts/lib/font-contract.mjs +326 -0
- package/skills/wix-headless-replatform/scripts/lib/frontend-automation-state.mjs +184 -0
- package/skills/wix-headless-replatform/scripts/lib/gap-analysis.mjs +396 -0
- package/skills/wix-headless-replatform/scripts/lib/html-extract.mjs +168 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-bootstrap.mjs +10 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-runtime.mjs +194 -0
- package/skills/wix-headless-replatform/scripts/lib/interaction-timeline.mjs +348 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/classifiers.mjs +141 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/geometry.mjs +43 -0
- package/skills/wix-headless-replatform/scripts/lib/layout-blueprint/vocabulary.mjs +18 -0
- package/skills/wix-headless-replatform/scripts/lib/ui-normalization.css +64 -0
- package/skills/wix-headless-replatform/scripts/optimize-svg.mjs +31 -0
- package/skills/wix-headless-replatform/scripts/post-build-gap.mjs +358 -0
- package/skills/wix-headless-replatform/scripts/provision-repeater-cms.mjs +25 -0
- package/skills/wix-headless-replatform/scripts/record-gap-decision.mjs +39 -0
- package/skills/wix-headless-replatform/scripts/replay-extraction.mjs +107 -0
- package/skills/wix-headless-replatform/scripts/resolve-home-page.mjs +96 -0
- package/skills/wix-headless-replatform/scripts/site-clone.mjs +658 -0
- package/skills/wix-headless-replatform/scripts/validate-font-contract.mjs +29 -0
- package/skills/wix-headless-replatform/scripts/verify-interactions.mjs +669 -0
- package/skills/wix-headless-replatform/scripts/visual-qa.mjs +370 -0
- package/skills/wix-headless-templates/donations/INSTRUCTIONS.md +37 -24
- package/skills/wix-headless-templates/donations/app/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/app/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/app/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/app/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/app/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/app/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/app/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonateForm.tsx +49 -23
- package/skills/wix-headless-templates/donations/project/src/components/donations/DonationReceipt.tsx +6 -5
- package/skills/wix-headless-templates/donations/project/src/components/donations/GoalProgress.tsx +5 -5
- package/skills/wix-headless-templates/donations/project/src/wix/donations/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donation-store.ts +2 -2
- package/skills/wix-headless-templates/donations/project/src/wix/donations/donations-core.ts +12 -9
- package/skills/wix-headless-templates/donations/rest/campaigns.ts +4 -4
- package/skills/wix-headless-templates/donations/rest/donate.ts +7 -3
- package/skills/wix-headless-templates/donations/seed/SEED.md +12 -7
- package/skills/wix-headless-templates/donations/tests/donation-contract.test.mjs +71 -0
- package/skills/wix-headless-templates/donations/tests/donation-form.test.cjs +137 -0
- package/skills/wix-headless-templates/restaurants/INSTRUCTIONS.md +28 -14
- package/skills/wix-headless-templates/restaurants/app/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/app/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/app/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/project/src/components/restaurants/OrderCartDrawer.tsx +87 -5
- package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts +9 -1
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts +33 -4
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering-core.ts +100 -5
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/ordering.ts +101 -15
- package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/types.ts +35 -1
- package/skills/wix-headless-templates/restaurants/rest/ordering.ts +91 -14
- package/skills/wix-import/SKILL.md +90 -0
- package/skills/wix-manage/SKILL.md +38 -10
- package/skills/wix-manage/references/automations/actions.md +11 -11
- package/skills/wix-manage/references/automations/activation-status.md +6 -9
- package/skills/wix-manage/references/automations/api-catalog.md +48 -32
- package/skills/wix-manage/references/automations/automation-model.md +97 -22
- package/skills/wix-manage/references/automations/bracket-expressions.md +7 -7
- package/skills/wix-manage/references/automations/build-and-manage-automations.md +140 -309
- package/skills/wix-manage/references/automations/conditions.md +187 -0
- package/skills/wix-manage/references/automations/schemas-and-scheduling.md +191 -0
- package/skills/wix-manage/references/automations/special-actions.md +210 -0
- package/skills/wix-manage/references/automations/triggers.md +47 -10
- package/skills/wix-manage/references/automations/validation-and-verification.md +320 -0
- package/skills/wix-manage/references/custom-apps/use-app-tools.md +124 -0
- package/skills/wix-manage/references/dashboard-navigation/dashboard-navigation.md +2 -1
- package/skills/wix-manage/references/dashboard-navigation/routes.json +249 -0
- package/skills/wix-manage/references/donations/create-and-update-donation-campaigns.md +139 -0
- package/skills/wix-manage/references/events/create-wix-event.md +136 -73
- package/skills/wix-manage/references/events/events-dashboard-navigation.md +81 -0
- package/skills/wix-manage/references/events/manage-event-guests.md +366 -0
- package/skills/wix-manage/references/events/manage-event-tickets.md +293 -0
- package/skills/wix-manage/references/events/manage-wix-events.md +313 -55
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +127 -8
- package/skills/wix-manage/references/stores/update-product-with-options.md +58 -2
- package/skills/wix-replatform/.publish-manifest.json +5 -5
- package/skills/wix-replatform/CLI.md +162 -0
- package/skills/wix-replatform/README.md +52 -0
- package/skills/wix-replatform/SKILL.md +229 -684
- package/skills/wix-replatform/console/account.css +1 -0
- package/skills/wix-replatform/console/app.css +1 -0
- package/skills/wix-replatform/console/app.js +117 -0
- package/skills/wix-replatform/console/index.html +4 -0
- package/skills/wix-replatform/console/json.css +11 -0
- package/skills/wix-replatform/lib/agent-adapters/index.js +71 -0
- package/skills/wix-replatform/lib/app-page-routing.js +75 -0
- package/skills/wix-replatform/lib/artifact-freshness.js +11 -1
- package/skills/wix-replatform/lib/blocked-data-requests.js +427 -0
- package/skills/wix-replatform/lib/census-reconciliation.js +426 -0
- package/skills/wix-replatform/lib/completion-report.js +1393 -13
- package/skills/wix-replatform/lib/config-env.js +85 -11
- package/skills/wix-replatform/lib/confirmed-pictures.js +212 -0
- package/skills/wix-replatform/lib/dependency-readiness.js +423 -0
- package/skills/wix-replatform/lib/dependency-recovery.js +21 -0
- package/skills/wix-replatform/lib/destination-choice.js +163 -0
- package/skills/wix-replatform/lib/destination-handoff.js +62 -0
- package/skills/wix-replatform/lib/destination-http.js +81 -0
- package/skills/wix-replatform/lib/destination-route.js +98 -0
- package/skills/wix-replatform/lib/destination.js +919 -0
- package/skills/wix-replatform/lib/discovered-census.js +231 -0
- package/skills/wix-replatform/lib/discovered-set-status.js +255 -0
- package/skills/wix-replatform/lib/document-url-guard.js +203 -0
- package/skills/wix-replatform/lib/entity-qa-attestation.js +339 -0
- package/skills/wix-replatform/lib/entity-verification.js +18 -0
- package/skills/wix-replatform/lib/execution-capability.js +120 -0
- package/skills/wix-replatform/lib/execution-log.js +170 -0
- package/skills/wix-replatform/lib/execution-manifest.js +20 -2
- package/skills/wix-replatform/lib/execution-state.js +22 -0
- package/skills/wix-replatform/lib/expectations-ledger.js +96 -0
- package/skills/wix-replatform/lib/generated-plugin-handoff.js +140 -0
- package/skills/wix-replatform/lib/import-readiness-contract.js +23 -0
- package/skills/wix-replatform/lib/import-recovery.js +800 -6
- package/skills/wix-replatform/lib/imported-redirect-targets.js +608 -0
- package/skills/wix-replatform/lib/internal-link-reconciliation.js +166 -0
- package/skills/wix-replatform/lib/link-audit.js +173 -0
- package/skills/wix-replatform/lib/link-census.js +194 -0
- package/skills/wix-replatform/lib/link-plan.js +148 -0
- package/skills/wix-replatform/lib/link-verification.js +274 -0
- package/skills/wix-replatform/lib/link-write-journal.js +42 -0
- package/skills/wix-replatform/lib/local-state.js +869 -30
- package/skills/wix-replatform/lib/member-completion.js +658 -0
- package/skills/wix-replatform/lib/member-crosswalk.js +69 -0
- package/skills/wix-replatform/lib/member-outcome-registry.js +265 -0
- package/skills/wix-replatform/lib/migration-completion.js +311 -0
- package/skills/wix-replatform/lib/operator-identity.js +47 -0
- package/skills/wix-replatform/lib/orchestration-decisions.js +248 -0
- package/skills/wix-replatform/lib/orchestration-preflight.js +401 -19
- package/skills/wix-replatform/lib/orchestration-router.js +608 -32
- package/skills/wix-replatform/lib/orchestration-state.js +188 -12
- package/skills/wix-replatform/lib/order-reference-readiness.js +30 -0
- package/skills/wix-replatform/lib/payments-outcome-registry.js +200 -0
- package/skills/wix-replatform/lib/plugin-cms-fallback.js +618 -0
- package/skills/wix-replatform/lib/preservation-approval-stamp.js +54 -0
- package/skills/wix-replatform/lib/product-media-deferral.js +96 -0
- package/skills/wix-replatform/lib/progress-log.js +19 -3
- package/skills/wix-replatform/lib/read-back-approval.js +184 -0
- package/skills/wix-replatform/lib/read-back-comparison.js +136 -0
- package/skills/wix-replatform/lib/read-back-contract.js +243 -0
- package/skills/wix-replatform/lib/read-back-extract.js +118 -0
- package/skills/wix-replatform/lib/read-back-gate.js +734 -0
- package/skills/wix-replatform/lib/read-back-reads.js +94 -0
- package/skills/wix-replatform/lib/read-back-state.js +107 -0
- package/skills/wix-replatform/lib/read-back-summary.js +81 -0
- package/skills/wix-replatform/lib/rerun-conflicts.js +334 -0
- package/skills/wix-replatform/lib/run-controller.js +401 -0
- package/skills/wix-replatform/lib/seo-outcome-registry.js +45 -0
- package/skills/wix-replatform/lib/setup-verification.js +148 -0
- package/skills/wix-replatform/lib/source-access.js +231 -0
- package/skills/wix-replatform/lib/source-coverage.js +1130 -0
- package/skills/wix-replatform/lib/source-secrets.js +277 -0
- package/skills/wix-replatform/lib/structured-link-patch.js +59 -0
- package/skills/wix-replatform/lib/task-state.js +110 -0
- package/skills/wix-replatform/lib/url-preservation-report.js +319 -0
- package/skills/wix-replatform/lib/url-preservation-state.js +349 -1
- package/skills/wix-replatform/lib/url-redirect-plan.js +728 -0
- package/skills/wix-replatform/lib/url-verification.js +315 -0
- package/skills/wix-replatform/lib/user-action-effects.js +42 -0
- package/skills/wix-replatform/lib/user-actions.js +264 -0
- package/skills/wix-replatform/lib/website-handoff.js +1220 -0
- package/skills/wix-replatform/lib/wix-client-callers.js +54 -0
- package/skills/wix-replatform/lib/wix-dashboard-url.js +35 -0
- package/skills/wix-replatform/lib/write-verification-state.js +92 -0
- package/skills/wix-replatform/lib/write-verification.js +274 -0
- package/skills/wix-replatform/resources/rp-destination/SKILL.md +137 -0
- package/skills/wix-replatform/resources/rp-discovery/SKILL.md +189 -16
- package/skills/wix-replatform/resources/rp-discovery/scripts/promote-source-coverage.js +47 -0
- package/skills/wix-replatform/resources/rp-execute-import/SKILL.md +869 -29
- package/skills/wix-replatform/resources/rp-execute-import/scripts/shipping-estimate-audit.js +70 -0
- package/skills/wix-replatform/resources/rp-execute-setup/SKILL.md +195 -29
- package/skills/wix-replatform/resources/rp-execute-setup/scripts/execute-setup.js +442 -0
- package/skills/wix-replatform/resources/rp-execution-policy/SKILL.md +112 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/coupon-currency-plan-report.js +143 -0
- package/skills/wix-replatform/resources/rp-execution-policy/lib/payments-report.js +244 -0
- package/skills/wix-replatform/resources/rp-import-codegen/SKILL.md +2082 -38
- package/skills/wix-replatform/resources/rp-mapper/SKILL.md +528 -11
- package/skills/wix-replatform/resources/rp-mapper/lib/structure-bridge-planning.js +303 -0
- package/skills/wix-replatform/resources/rp-mapper/scripts/coverage-reconcile.js +88 -0
- package/skills/wix-replatform/resources/rp-mapper/wix-business-solutions-taxonomy.md +6 -5
- package/skills/wix-replatform/resources/rp-preflight/SKILL.md +40 -0
- package/skills/wix-replatform/resources/rp-project-intake/SKILL.md +55 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/SKILL.md +60 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/import-progress.js +89 -0
- package/skills/wix-replatform/resources/rp-quick-runtime/lib/limit-recovery.js +36 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/SKILL.md +123 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/quick-mode.json +124 -0
- package/skills/wix-replatform/resources/rp-quick-shopify/scripts/quick-mode.js +522 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/SKILL.md +56 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/quick-mode.json +91 -0
- package/skills/wix-replatform/resources/rp-quick-woocommerce/scripts/quick-mode.js +255 -0
- package/skills/wix-replatform/resources/rp-setup-discovery/SKILL.md +80 -10
- package/skills/wix-replatform/resources/rp-setup-discovery/scripts/quick-setup-plan.js +44 -0
- package/skills/wix-replatform/resources/rp-source-csv/SKILL.md +3 -0
- package/skills/wix-replatform/resources/rp-source-csv/lib/csv-fileset.js +0 -0
- package/skills/wix-replatform/resources/rp-source-csv/scripts/csv-discovery.js +21 -1
- package/skills/wix-replatform/resources/rp-source-inputs/SKILL.md +66 -0
- package/skills/wix-replatform/resources/rp-source-sfcc/SKILL.md +153 -0
- package/skills/wix-replatform/resources/rp-source-shopify/SKILL.md +394 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/discovery-reads.js +200 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/import-findings.js +34 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk-sqlite-worker.js +44 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-bulk.js +1470 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-cli.js +446 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-gift-cards.js +474 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-protected-fields.js +879 -0
- package/skills/wix-replatform/resources/rp-source-shopify/lib/shopify-session.js +426 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/articles.graphql +24 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/blogs.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/collections.graphql +40 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/customers.graphql +76 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/delivery-profiles.graphql +51 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/discounts.graphql +35 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/files.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/gift-cards.graphql +18 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/inventory.graphql +31 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/locations.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/menus.graphql +21 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/metaobjects.graphql +30 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-core.graphql +150 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-fulfillments.graphql +36 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/orders-refunds.graphql +48 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/pages.graphql +20 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-address.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-name.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-customers-phone.graphql +8 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-address.graphql +12 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-email.graphql +6 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-name.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/probe-orders-phone.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/products.graphql +73 -0
- package/skills/wix-replatform/resources/rp-source-shopify/queries/url-redirects.graphql +13 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-discovery.js +693 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-extract.js +283 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-gift-card-remedy.js +191 -0
- package/skills/wix-replatform/resources/rp-source-shopify/scripts/shopify-session-check.js +115 -0
- package/skills/wix-replatform/resources/rp-source-shopify/source-schema.example.json +201 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/PLUGIN-READ-PLANS.md +146 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/SKILL.md +736 -22
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/blocked-data-handlers.js +73 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.js +115 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/checkout-field-csv-parser.test-fixture.js +91 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/coupon-discovery.js +440 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/currency-gate.js +125 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.js +252 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-source-keys.json +183 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/gateway-summary.mjs +333 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/invoice-discovery.js +426 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-disposition.js +400 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-entity-read-plan.js +633 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/plugin-knowledge.js +1127 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.js +194 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/refund-corroboration.json +100 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/sampled-ids-batch.js +157 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/secret-value-guard.js +234 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/store-currency.js +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/structure-bridge-reader.js +755 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.js +1074 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wix-wp-plugin-v2-client.test-fixture.js +149 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/woo-inventory.js +25 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-http.js +204 -9
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-image-url.js +186 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-plugin-detect.js +1422 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-redirect-sources.js +343 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/wp-route-classifier.js +262 -26
- package/skills/wix-replatform/resources/rp-source-wordpress/lib/yoast-product-seo-evidence.js +272 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/README.md +373 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/advanced-custom-fields.json +101 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/back-in-stock-notifier-for-woocommerce.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/capabilities-pending-decision.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/cms-fallback-eligible.json +18 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/contact-form-7.json +104 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/facebook-for-woocommerce.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/fingerprint-aliases.json +49 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/free-gifts-for-woocommerce.json +94 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/index.json +863 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mailpoet.json +52 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/membership-for-woocommerce.json +161 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/mwb-bookings-for-woocommerce.json +180 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/no-migration-needed.json +286 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pricing-deals-for-woocommerce.json +79 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/product-extras-for-woocommerce.json +120 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/pw-woocommerce-gift-cards.json +128 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/requires-development.json +88 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seo-by-rank-math.json +80 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/seriously-simple-podcasting.json +46 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/strong-testimonials.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/subscriptions-for-woocommerce.json +99 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/tablepress.json +55 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/the-events-calendar.json +160 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/ti-woocommerce-wishlist.json +81 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-checkout-field-editor-pro.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-discount-rules.json +74 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woo-product-bundle.json +75 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-gift-cards.json +60 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-other-payment-gateway.json +44 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-pdf-invoices-packing-slips.json +57 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-product-addon.json +141 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/woocommerce-progressive-discounts.json +54 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wordpress-seo.json +158 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpc-composite-products.json +97 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/plugins/wpforms-lite.json +86 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/capture-store-settings.js +90 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge-validate.js +51 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/plugin-knowledge.js +103 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-discovery.js +1668 -33
- package/skills/wix-replatform/resources/rp-source-wordpress/scripts/wp-plugin-inventory.js +273 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/secret-value-patterns.v1.json +11 -0
- package/skills/wix-replatform/resources/rp-source-wordpress/sub-parts.json +13 -0
- package/skills/wix-replatform/resources/rp-target-wix/SKILL.md +446 -32
- package/skills/wix-replatform/resources/rp-target-wix/app-page-routing-capabilities.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/README.md +38 -2
- package/skills/wix-replatform/resources/rp-target-wix/domains/SERVICE-PLUGINS.md +322 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/docs-survey.json +70 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/domain.json +19 -9
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/category.json +42 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/comment.json +54 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/post.json +66 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/blog/entities/tag.json +38 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/docs-survey.json +332 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/domain.json +75 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/booking.json +181 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service-add-on.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/bookings/entities/service.json +180 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/docs-survey.json +161 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/domain.json +15 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/collection.json +39 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/data-item.json +47 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/cms/entities/reference.json +7 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/docs-survey.json +204 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/domain.json +17 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/contact.json +159 -15
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/email-subscription.json +80 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/crm/entities/label.json +48 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/docs-survey.json +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/domain.json +30 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/delivery-profile.json +171 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/discount-rule.json +182 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-applied-discount.json +129 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-invoice-document.json +192 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item-options.json +123 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-line-item.json +60 -12
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-merchant-note.json +112 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-payment.json +191 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order-refund.json +140 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/order.json +383 -18
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/pickup-location.json +122 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/shipping-option.json +98 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/ecom/entities/wishlist-item.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/docs-survey.json +128 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/domain.json +38 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/category.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/event.json +107 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/registration-form.json +89 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/rsvp.json +118 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/events/entities/ticket-definition.json +93 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/docs-survey.json +86 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/domain.json +56 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form-submission.json +121 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/forms/entities/form.json +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/domain.json +50 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/gift-cards/entities/gift-card.json +130 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/index.json +914 -24
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/domain.json +14 -4
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-file.json +45 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/media/entities/media-folder.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/docs-survey.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/domain.json +13 -3
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/badge.json +41 -7
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/custom-field.json +82 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member-about.json +77 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/members/entities/member.json +165 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/docs-survey.json +41 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/domain.json +46 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan-order.json +137 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/pricing-plans/entities/plan.json +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/docs-survey.json +7 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/domain.json +36 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/amazon-shop-connect.json +71 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/ebay-shop-connect.json +67 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/google-youtube-connect.json +72 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/meta-catalog-connect.json +74 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/pinterest-catalog-connect.json +69 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/sales-channels/entities/tiktok-catalog-connect.json +61 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/schema.json +28 -1
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/docs-survey.json +109 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/domain.json +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/item-seo-tags.json +148 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/seo-pattern.json +91 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/seo/entities/site-seo-tags.json +79 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/docs-survey.json +32 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/domain.json +49 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/site/entities/business-contact.json +103 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/docs-survey.json +203 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/domain.json +27 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/back-in-stock-request.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/brand.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/category.json +52 -8
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/coupon.json +214 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/inventory-item.json +93 -13
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-customization.json +111 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product-tag.json +52 -10
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/product.json +145 -14
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/promotion.json +84 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/review.json +178 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/stores/entities/subscription-product.json +87 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/docs-survey.json +106 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/domain.json +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/manual-tax-mapping.json +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-group.json +94 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-region.json +113 -0
- package/skills/wix-replatform/resources/rp-target-wix/domains/tax/entities/tax-settings.json +65 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-author-attribution.js +165 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-client.js +60 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-duplicates.js +201 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-ledger.js +306 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-report.js +229 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build-stage.js +55 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-build.js +715 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/blog-post-media.js +567 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/bulk-results.js +73 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-extended-fields.js +194 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contact-import.js +133 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/contract-ledger.js +13 -4
- package/skills/wix-replatform/resources/rp-target-wix/lib/coupon-redemption-drift.js +491 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/customer-member.js +104 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/data-extension-schema.js +673 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/domain-knowledge.js +453 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-balance-reconciliation.js +119 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-build.js +566 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/gift-card-redemption-build.js +249 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-applied-discount-build.js +63 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-buyer.js +187 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-channel-build.js +64 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-history.js +1027 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-invoice-contract.js +90 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/order-payment-mapping.js +420 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/pricing-plan-definition.js +177 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-import.js +151 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/product-seo.js +723 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/seo-redirects.js +353 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-build.js +1437 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/shipping-option-stage.js +354 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/store-config-build.js +134 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-category-attach.js +221 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-inventory.js +248 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/stores-verification.js +86 -3
- package/skills/wix-replatform/resources/rp-target-wix/lib/tax-build.js +231 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/url-mapper-transport.js +28 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/value-utils.js +14 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/variant-correlation.js +34 -0
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-build.js +166 -15
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-target-spec.js +19 -2
- package/skills/wix-replatform/resources/rp-target-wix/lib/wix-writers.js +4079 -257
- package/skills/wix-replatform/resources/rp-target-wix/lib/write-verification.js +3 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/docs-survey-sync.js +150 -0
- package/skills/wix-replatform/resources/rp-target-wix/scripts/domain-knowledge-validate.js +40 -2
- package/skills/wix-replatform/resources/rp-target-wix/scripts/verify-stores.js +6 -1
- package/skills/wix-replatform/resources/rp-telemetry/SKILL.md +148 -8
- package/skills/wix-replatform/resources/rp-telemetry/lib/bi-sink.js +83 -15
- package/skills/wix-replatform/resources/rp-telemetry/lib/telemetry-recorder.js +1119 -215
- package/skills/wix-replatform/resources/rp-telemetry/lib/transcript-digest.js +318 -0
- package/skills/wix-replatform/resources/rp-telemetry/scripts/meter-from-audit.js +2 -2
- package/skills/wix-replatform/resources/rp-telemetry/scripts/rp-telemetry.js +106 -4
- package/skills/wix-replatform/resources/rp-website-continuation/SKILL.md +94 -0
- package/skills/wix-replatform/scripts/census-reconciliation.js +25 -0
- package/skills/wix-replatform/scripts/cms-fallback.js +89 -0
- package/skills/wix-replatform/scripts/discovered-census.js +26 -0
- package/skills/wix-replatform/scripts/discovered-set-status.js +33 -0
- package/skills/wix-replatform/scripts/entity-qa-attestation.js +130 -0
- package/skills/wix-replatform/scripts/execution-health-check.js +415 -0
- package/skills/wix-replatform/scripts/execution-manifest-validate.js +1 -1
- package/skills/wix-replatform/scripts/execution-state-prepare.js +1 -1
- package/skills/wix-replatform/scripts/expectations-ledger.js +44 -0
- package/skills/wix-replatform/scripts/import-contract-verify.js +183 -0
- package/skills/wix-replatform/scripts/internal-link-audit.js +90 -0
- package/skills/wix-replatform/scripts/item-seo-tags-verify.js +205 -0
- package/skills/wix-replatform/scripts/migration-completion.js +76 -0
- package/skills/wix-replatform/scripts/orchestration-preflight.js +21 -2
- package/skills/wix-replatform/scripts/orchestration-route.js +32 -1
- package/skills/wix-replatform/scripts/orchestration-state.js +146 -10
- package/skills/wix-replatform/scripts/read-back-gate.js +175 -0
- package/skills/wix-replatform/scripts/replatform-console.js +146 -0
- package/skills/wix-replatform/scripts/replatform.js +436 -0
- package/skills/wix-replatform/scripts/source-secrets.js +77 -0
- package/skills/wix-replatform/scripts/url-redirects.js +286 -0
- package/skills/wix-replatform/scripts/user-action.js +58 -0
- package/skills/wix-replatform/scripts/website-handoff-generate.js +64 -0
- package/skills/wix-replatform/scripts/wix-dashboard-url.js +54 -0
- package/skills/wix-replatform/scripts/wix-destination.js +143 -0
- package/skills/wix-replatform/scripts/wix-headless-scaffold.js +762 -0
- package/skills/wix-vibe-headless/SKILL.md +7 -3
- package/skills/wix-vibe-headless/install/deploy.cjs +61 -34
- package/skills/wix-vibe-headless/platforms/base44.md +1 -0
- package/skills/wix-vibe-headless/references/donations/INSTRUCTIONS.md +88 -0
- package/skills/wix-vibe-headless/references/donations/app/rest/wix-donations.js +112 -0
- package/skills/wix-vibe-headless/references/donations/seed/SEED.md +11 -0
- package/skills/wix-vibe-headless/references/donations/tests/donations.test.mjs +258 -0
- package/skills/wix-vibe-headless/references/restaurants/INSTRUCTIONS.md +5 -2
- package/skills/wix-vibe-headless/references/restaurants/app/context/OrderCartContext.jsx +4 -1
- package/skills/wix-vibe-headless/references/restaurants/app/rest/wix-restaurants-ordering.js +67 -3
- package/skills/wix-vibe-headless/references/shared/app/rest/wix-client.js +4 -3
- package/skills/wix-manage/references/custom-apps/use-app-skills-and-app-tools.md +0 -208
- package/skills/wix-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
// Online-ordering rules and DTO mapping — transport-agnostic, imported by both ./ordering.ts (SDK)
|
|
2
2
|
// and the REST twin in templates/restaurants/rest/ordering.ts (fetch). The restaurant cart rides
|
|
3
3
|
// on the eCom current cart (Cart V2); what makes a line a RESTAURANT line is the catalogReference
|
|
4
|
-
// built here: the Orders app id plus options { operationId, menuId,
|
|
4
|
+
// built here: the Orders app id plus options { operationId, menuId, menuSectionId } (sectionId is
|
|
5
|
+
// sent too; Restaurants' checkout check reads menuSectionId) and, exactly as
|
|
5
6
|
// Wix's own ordering code sends them, the visitor's choices: options.priceVariant { id,
|
|
6
7
|
// formattedPrice }, options.modifierGroups [{ id, modifiers: [{ id, price, formattedPrice }] }],
|
|
7
8
|
// options.specialRequests. Raw entities carry `_id` (SDK) or `id` (REST). Has its own formatMoney
|
|
8
9
|
// (a copy of ../money.ts) so it stands alone when stripped. Imports are type-only except the zone
|
|
9
10
|
// helpers from ./time-core (deployed beside this file).
|
|
10
|
-
import type { FulfillmentMethodInfo, MenuItem, MenuOrderingInfo, OrderCart, OrderLine, OrderSelection, OrderingStatus, SiteMoney, WeeklyWindow } from "./types";
|
|
11
|
+
import type { DeliveryAddress, FulfillmentChoice, FulfillmentMethodInfo, FulfillmentTime, MenuItem, MenuOrderingInfo, OrderCart, OrderLine, OrderSelection, OrderingStatus, SiteMoney, WeeklyWindow } from "./types";
|
|
11
12
|
import type { ImgSrc, Raw } from "./menu-core";
|
|
12
|
-
import { zonedMinutes, zonedParts } from "./time-core";
|
|
13
|
+
import { zonedDayKey, zonedMinutes, zonedParts } from "./time-core";
|
|
13
14
|
|
|
14
15
|
/** The Restaurants Orders app id — every restaurant cart line's catalogReference.appId. */
|
|
15
16
|
export const RESTAURANTS_ORDERS_APP_ID = "9a5d83fd-8570-482e-81ab-cfa88942ee60";
|
|
@@ -169,6 +170,98 @@ export function toFulfillmentMethods(raws: Raw[], fulfillmentIds: string[], mone
|
|
|
169
170
|
}));
|
|
170
171
|
}
|
|
171
172
|
|
|
173
|
+
// ---- fulfillment choice ----------------------------------------------------------------------------------
|
|
174
|
+
// Restaurants reads the order's fulfillment from the cart's delivery method code, and the hosted
|
|
175
|
+
// checkout offers no pickup/delivery choice until one is set: "<TYPE>|ASAP" or
|
|
176
|
+
// "<TYPE>|<startEpochMs>|<endEpochMs>" for a scheduled slot.
|
|
177
|
+
|
|
178
|
+
/** The cart delivery-method code for a choice (no time → ASAP). */
|
|
179
|
+
export function fulfillmentCode(choice: Pick<FulfillmentChoice, "type" | "time">): string {
|
|
180
|
+
if (choice.time && choice.time.type !== choice.type) throw new Error("The chosen time is for a different fulfillment type.");
|
|
181
|
+
return choice.time?.code ?? `${choice.type}|ASAP`;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
const epochMs = (iso: unknown): number => new Date(String(iso ?? "")).getTime();
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* The operation's time slots → FulfillmentTime[] (ASAP first, then earliest first). `asapSlots` is
|
|
188
|
+
* the first-available response (one ASAP entry per type), `daySlots` a per-date response; both carry
|
|
189
|
+
* `timeslotsPerFulfillmentType` (the API spells the type field `fulfilmentType`). The calls return
|
|
190
|
+
* only orderable slots (blocked ones are left out), so there is nothing to filter.
|
|
191
|
+
*/
|
|
192
|
+
export function toFulfillmentTimes(asapSlots: Raw | null | undefined, daySlots: Raw | null | undefined): FulfillmentTime[] {
|
|
193
|
+
const out: FulfillmentTime[] = [];
|
|
194
|
+
const seen = new Set<string>();
|
|
195
|
+
for (const raw of [...((asapSlots?.timeslotsPerFulfillmentType ?? []) as Raw[]), ...((daySlots?.timeslotsPerFulfillmentType ?? []) as Raw[])]) {
|
|
196
|
+
const type = (raw.fulfilmentType ?? raw.fulfillmentType) === "DELIVERY" ? "DELIVERY" : "PICKUP";
|
|
197
|
+
const slot: Raw = raw.timeSlot ?? {};
|
|
198
|
+
const start = epochMs(slot.startTime), end = epochMs(slot.endTime ?? slot.startTime);
|
|
199
|
+
if (!Number.isFinite(start) || !Number.isFinite(end)) continue;
|
|
200
|
+
const asap = slot.orderSchedulingType === "ASAP";
|
|
201
|
+
const code = asap ? `${type}|ASAP` : `${type}|${start}|${end}`;
|
|
202
|
+
if (seen.has(code)) continue;
|
|
203
|
+
seen.add(code);
|
|
204
|
+
out.push({ type, code, asap, startIso: new Date(start).toISOString(), endIso: new Date(end).toISOString() });
|
|
205
|
+
}
|
|
206
|
+
return out.sort((a, b) => Number(b.asap) - Number(a.asap) || a.startIso.localeCompare(b.startIso));
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
/** The per-date slots query for a "YYYY-MM-DD" day at the restaurant (`date.day`, `date.month`, `date.year`). */
|
|
210
|
+
export function slotsDateQuery(dayKey: string): Record<string, string> {
|
|
211
|
+
const [year, month, day] = dayKey.split("-").map(Number);
|
|
212
|
+
return { "date.day": String(day), "date.month": String(month), "date.year": String(year) };
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
/**
|
|
216
|
+
* The time-slot calls' `deliveryAddress.*` query for a delivery address, so the delivery slots are
|
|
217
|
+
* those of the methods that deliver there ({} when there's no street or city yet).
|
|
218
|
+
*/
|
|
219
|
+
export function slotsAddressQuery(address: DeliveryAddress | undefined, region: { country: string; subdivision: string }): Record<string, string> {
|
|
220
|
+
if (!address?.addressLine?.trim() || !address.city?.trim()) return {};
|
|
221
|
+
const a = fulfillmentAddress({ type: "DELIVERY", address }, region) as DeliveryAddress;
|
|
222
|
+
const q: Record<string, string> = {};
|
|
223
|
+
for (const [k, v] of Object.entries(a)) if (v) q[`deliveryAddress.${k}`] = String(v);
|
|
224
|
+
return q;
|
|
225
|
+
}
|
|
226
|
+
|
|
227
|
+
/** Today at the restaurant, "YYYY-MM-DD" (the operation's timezone; "" → the visitor's). */
|
|
228
|
+
export const restaurantToday = (timeZone: string, now: Date = new Date()): string => zonedDayKey(now, timeZone);
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* The restaurant's country and subdivision ("US-CA"), from its pickup address or its delivery
|
|
232
|
+
* area's center. The cart needs a country before ANY delivery method — pickup included — is
|
|
233
|
+
* accepted (DELIVERY_METHOD_MISSING_ADDRESS), and Wix pre-fills one only from the visitor's location.
|
|
234
|
+
*/
|
|
235
|
+
export function toRestaurantRegion(rawMethods: Raw[]): { country: string; subdivision: string } {
|
|
236
|
+
for (const m of rawMethods) {
|
|
237
|
+
const a: Raw = m.pickupOptions?.address ?? m.deliveryOptions?.deliveryArea?.radiusOptions?.centerPointAddress ?? {};
|
|
238
|
+
if (!a.country) continue;
|
|
239
|
+
const sub = String(a.subdivision ?? "");
|
|
240
|
+
return { country: a.country, subdivision: sub && !sub.includes("-") ? `${a.country}-${sub}` : sub };
|
|
241
|
+
}
|
|
242
|
+
return { country: "", subdivision: "" };
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
/**
|
|
246
|
+
* The address a choice puts on the cart: the delivery address with the restaurant's country and
|
|
247
|
+
* subdivision filled in, or for pickup just the restaurant's country. Refuses a delivery choice
|
|
248
|
+
* without the fields Restaurants requires (street, city, country).
|
|
249
|
+
*/
|
|
250
|
+
export function fulfillmentAddress(choice: FulfillmentChoice, region: { country: string; subdivision: string }): DeliveryAddress | { country: string; subdivision?: string } {
|
|
251
|
+
if (choice.type !== "DELIVERY") {
|
|
252
|
+
if (!region.country) throw new Error("Pickup isn't set up for online orders. Choose delivery.");
|
|
253
|
+
return { country: region.country, ...(region.subdivision ? { subdivision: region.subdivision } : {}) };
|
|
254
|
+
}
|
|
255
|
+
const a = choice.address;
|
|
256
|
+
const country = a?.country?.trim() || region.country;
|
|
257
|
+
const subdivision = a?.subdivision?.trim() || (country === region.country ? region.subdivision : "");
|
|
258
|
+
if (!a?.addressLine?.trim() || !a.city?.trim() || !country) throw new Error("Enter a delivery address: street and city.");
|
|
259
|
+
return { ...a, country, ...(subdivision ? { subdivision } : {}) };
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
/** The message for a delivery method the cart refused: the address is outside every delivery area. */
|
|
263
|
+
export const NOT_DELIVERABLE = "We don't deliver to this address. Choose pickup or another address.";
|
|
264
|
+
|
|
172
265
|
// ---- cart --------------------------------------------------------------------------------------------------------
|
|
173
266
|
|
|
174
267
|
export function toOrderLine(raw: Raw, currency: string, imgSrc: ImgSrc): OrderLine {
|
|
@@ -192,10 +285,11 @@ export function toOrderLine(raw: Raw, currency: string, imgSrc: ImgSrc): OrderLi
|
|
|
192
285
|
export function toOrderCart(raw: Raw | null, subtotal: string, imgSrc: ImgSrc): OrderCart {
|
|
193
286
|
const currency = cartCurrency(raw);
|
|
194
287
|
const lines = ((raw?.lineItems ?? []) as Raw[]).map((l) => toOrderLine(l, currency, imgSrc));
|
|
195
|
-
|
|
288
|
+
const delivery: Raw = raw?.deliveryInfo ?? {};
|
|
289
|
+
return { lines, itemCount: lines.reduce((n, l) => n + l.quantity, 0), subtotal, currency, fulfillmentCode: delivery.method?.code ?? "" };
|
|
196
290
|
}
|
|
197
291
|
|
|
198
|
-
/** The after-discount subtotal from a cart estimate; "" when unknown. Fees
|
|
292
|
+
/** The after-discount subtotal from a cart estimate; "" when unknown. Fees and tax resolve at checkout. */
|
|
199
293
|
export function estimateSubtotal(estimate: Raw | null | undefined, raw: Raw): string {
|
|
200
294
|
return formatMoney(estimate?.summary?.priceSummary?.subtotal, cartCurrency(raw));
|
|
201
295
|
}
|
|
@@ -243,6 +337,7 @@ export function orderCatalogItem(
|
|
|
243
337
|
options: {
|
|
244
338
|
operationId: ctx.operationId,
|
|
245
339
|
menuId: ctx.menuId,
|
|
340
|
+
menuSectionId: ctx.sectionId, // what Restaurants' checkout validates the dish against
|
|
246
341
|
sectionId: ctx.sectionId,
|
|
247
342
|
...(variant ? { priceVariant: { id: variant.variantId, formattedPrice: variant.price } } : {}),
|
|
248
343
|
...(modifierGroups.length ? { modifierGroups } : {}),
|
|
@@ -4,11 +4,13 @@
|
|
|
4
4
|
// the transport only. Copy as-is; extend by calling these exports, never by editing them. The
|
|
5
5
|
// request shapes are exact and rewriting them is how carts break:
|
|
6
6
|
// - the catalogReference appId is the ORDERS app (9a5d83fd-…), never the Stores id;
|
|
7
|
-
// - options MUST carry operationId + menuId +
|
|
7
|
+
// - options MUST carry operationId + menuId + menuSectionId (sectionId rides along);
|
|
8
8
|
// - the visitor's choices ride in options.priceVariant / options.modifierGroups /
|
|
9
|
-
// options.specialRequests, the keys Wix's own ordering code sends (built in ordering-core)
|
|
9
|
+
// options.specialRequests, the keys Wix's own ordering code sends (built in ordering-core);
|
|
10
|
+
// - the fulfillment (pickup/delivery + time) is the cart's delivery method code, set BEFORE the
|
|
11
|
+
// checkout redirect: the hosted checkout has no picker for it and refuses the order without it.
|
|
10
12
|
// Failures are loud: throws on a missing or paused ordering operation, an invalid selection,
|
|
11
|
-
// unavailable lines, and an empty order at checkout — surface the message
|
|
13
|
+
// unavailable lines, an undeliverable address, and an empty order at checkout — surface the message.
|
|
12
14
|
// docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders/operations/list-operations.md
|
|
13
15
|
// docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders/menu-ordering-settings/query-menu-ordering-settings.md
|
|
14
16
|
// docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders/fulfillment-methods/list-fulfillment-methods.md
|
|
@@ -17,6 +19,10 @@
|
|
|
17
19
|
// docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/add-line-items-to-current-cart.md
|
|
18
20
|
// docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/update-line-items.md
|
|
19
21
|
// docs: https://dev.wix.com/docs/api-reference/business-management/headless/redirects/create-redirect-session.md
|
|
22
|
+
// docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/set-delivery-method-for-current-cart.md
|
|
23
|
+
// docs: https://dev.wix.com/docs/api-reference/business-solutions/e-commerce/purchase-flow/cart-v2/update-current-cart.md
|
|
24
|
+
// docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders/operations/calculate-available-time-slots-for-date.md
|
|
25
|
+
// docs: https://dev.wix.com/docs/api-reference/business-solutions/restaurants/online-orders/operations/calculate-first-available-time-slot-per-fulfillment-type.md
|
|
20
26
|
import {
|
|
21
27
|
operations as operationsModule,
|
|
22
28
|
fulfillmentMethods as fulfillmentModule,
|
|
@@ -25,25 +31,33 @@ import {
|
|
|
25
31
|
} from "@wix/restaurants";
|
|
26
32
|
import { currentCartV2 } from "@wix/ecom";
|
|
27
33
|
import { redirects as redirectsModule } from "@wix/redirects";
|
|
28
|
-
import { wixModule } from "../sdk";
|
|
34
|
+
import { wixFetch, wixModule } from "../sdk";
|
|
29
35
|
import { imgSrc } from "../media";
|
|
30
36
|
import { fetchSiteMoney } from "./menu";
|
|
31
37
|
import { initialSelection, nextCursor, validateSelection, type Raw } from "./menu-core";
|
|
32
38
|
import {
|
|
39
|
+
NOT_DELIVERABLE,
|
|
33
40
|
RESTAURANTS_ORDERS_APP_ID,
|
|
34
41
|
assertOrderAdded,
|
|
35
42
|
assertOrderCheckoutable,
|
|
36
43
|
assertOrderContext,
|
|
37
44
|
assertOrderable,
|
|
38
45
|
estimateSubtotal,
|
|
46
|
+
fulfillmentAddress,
|
|
47
|
+
fulfillmentCode,
|
|
39
48
|
orderCatalogItem,
|
|
40
49
|
rawId,
|
|
41
50
|
resolveOperation,
|
|
51
|
+
restaurantToday,
|
|
52
|
+
slotsAddressQuery,
|
|
53
|
+
slotsDateQuery,
|
|
42
54
|
toFulfillmentMethods,
|
|
55
|
+
toFulfillmentTimes,
|
|
43
56
|
toMenuOrderingMap,
|
|
44
57
|
toOrderCart,
|
|
58
|
+
toRestaurantRegion,
|
|
45
59
|
} from "./ordering-core";
|
|
46
|
-
import type { FulfillmentMethodInfo, MenuItem, MenuOrderingInfo, OrderCart, OrderSelection, OrderingStatus } from "./types";
|
|
60
|
+
import type { DeliveryAddress, FulfillmentChoice, FulfillmentMethodInfo, FulfillmentTime, MenuItem, MenuOrderingInfo, OrderCart, OrderSelection, OrderingStatus } from "./types";
|
|
47
61
|
|
|
48
62
|
export { RESTAURANTS_ORDERS_APP_ID };
|
|
49
63
|
|
|
@@ -98,12 +112,24 @@ export async function fetchMenuOrdering(): Promise<Record<string, MenuOrderingIn
|
|
|
98
112
|
|
|
99
113
|
/**
|
|
100
114
|
* The operation's enabled pickup/delivery methods (operation.fulfillmentIds only), fees and
|
|
101
|
-
* minimums formatted in the site currency —
|
|
115
|
+
* minimums formatted in the site currency — what the fulfillment picker offers.
|
|
102
116
|
*/
|
|
103
117
|
export async function fetchFulfillmentMethods(): Promise<FulfillmentMethodInfo[]> {
|
|
104
118
|
try {
|
|
105
|
-
const [status, money] = await Promise.all([resolveOrdering(), fetchSiteMoney()]);
|
|
119
|
+
const [status, money, raws] = await Promise.all([resolveOrdering(), fetchSiteMoney(), listFulfillmentRaws()]);
|
|
120
|
+
return toFulfillmentMethods(raws, status.fulfillmentIds, money);
|
|
121
|
+
} catch {
|
|
122
|
+
return []; // ordering still works without the list (pickup ASAP)
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
// The operation's raw fulfillment methods (operation.fulfillmentIds only), read once per session.
|
|
127
|
+
let fulfillmentRawsPromise: Promise<Raw[]> | null = null;
|
|
128
|
+
function listFulfillmentRaws(): Promise<Raw[]> {
|
|
129
|
+
fulfillmentRawsPromise ??= (async () => {
|
|
130
|
+
const status = await resolveOrdering();
|
|
106
131
|
if (!status.fulfillmentIds.length) return [];
|
|
132
|
+
const wanted = new Set(status.fulfillmentIds);
|
|
107
133
|
const raws: Raw[] = [];
|
|
108
134
|
let cursor: string | null = null;
|
|
109
135
|
do {
|
|
@@ -111,10 +137,12 @@ export async function fetchFulfillmentMethods(): Promise<FulfillmentMethodInfo[]
|
|
|
111
137
|
raws.push(...((res.fulfillmentMethods ?? []) as Raw[]));
|
|
112
138
|
cursor = nextCursor(res);
|
|
113
139
|
} while (cursor);
|
|
114
|
-
return
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
|
|
140
|
+
return raws.filter((m) => wanted.has(rawId(m)));
|
|
141
|
+
})().catch((e) => {
|
|
142
|
+
fulfillmentRawsPromise = null; // transient failure — allow a retry on the next call
|
|
143
|
+
throw e;
|
|
144
|
+
});
|
|
145
|
+
return fulfillmentRawsPromise;
|
|
118
146
|
}
|
|
119
147
|
|
|
120
148
|
// A line's attributes.image may come back absent — join the menu items' images by the line's
|
|
@@ -212,17 +240,75 @@ export async function removeOrderLine(lineItemId: string): Promise<OrderCart> {
|
|
|
212
240
|
return readCartWithSubtotal(cart as Raw);
|
|
213
241
|
}
|
|
214
242
|
|
|
243
|
+
// A raw Cart V2 / operations call under the SDK's auth, for the few calls this transport makes
|
|
244
|
+
// by path. Throws an Error carrying the API's code (`.code`).
|
|
245
|
+
async function wixJson(path: string, init?: RequestInit): Promise<Raw> {
|
|
246
|
+
const res = await wixFetch(path, { ...init, headers: { "Content-Type": "application/json", ...(init?.headers ?? {}) } });
|
|
247
|
+
const body: Raw = await res.json().catch(() => ({}));
|
|
248
|
+
if (!res.ok) {
|
|
249
|
+
const err = new Error(body?.message || `Request failed (${res.status})`) as Error & { code?: string };
|
|
250
|
+
err.code = body?.details?.applicationError?.code;
|
|
251
|
+
throw err;
|
|
252
|
+
}
|
|
253
|
+
return body;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
/**
|
|
257
|
+
* The times the order can be fulfilled at: ASAP for each type, then the scheduled slots of `dayKey`
|
|
258
|
+
* ("YYYY-MM-DD" at the restaurant; default today), ASAP first. Pass the delivery `address` once the
|
|
259
|
+
* visitor has entered it: the delivery times are then those of the methods that deliver there (none
|
|
260
|
+
* when no method does). [] when there is no operation. Pass the chosen entry to setOrderFulfillment as `time`.
|
|
261
|
+
*/
|
|
262
|
+
export async function fetchFulfillmentTimes(dayKey?: string, address?: DeliveryAddress): Promise<FulfillmentTime[]> {
|
|
263
|
+
const { operationId, timeZone } = await resolveOrdering();
|
|
264
|
+
if (!operationId) return [];
|
|
265
|
+
const base = `/restaurants-operations/v1/operations/${operationId}`;
|
|
266
|
+
const where = slotsAddressQuery(address, address ? toRestaurantRegion(await listFulfillmentRaws()) : { country: "", subdivision: "" });
|
|
267
|
+
const day = new URLSearchParams({ ...slotsDateQuery(dayKey ?? restaurantToday(timeZone)), ...where });
|
|
268
|
+
const first = new URLSearchParams(where).toString();
|
|
269
|
+
const [asap, slots] = await Promise.all([
|
|
270
|
+
wixJson(`${base}/first-available-time-slot-per-fulfillment-type${first ? `?${first}` : ""}`, { method: "GET" }),
|
|
271
|
+
wixJson(`${base}/available-time-slots-per-date?${day}`, { method: "GET" }),
|
|
272
|
+
]);
|
|
273
|
+
return toFulfillmentTimes(asap, slots);
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Set how and when the order is fulfilled: pickup or delivery, a time from fetchFulfillmentTimes
|
|
278
|
+
* (omitted → ASAP), and for delivery the address (street, city; country and subdivision default to
|
|
279
|
+
* the restaurant's). Pickup puts the restaurant's country on the cart, which Wix requires before
|
|
280
|
+
* any delivery method. Throws NOT_DELIVERABLE when the address is outside every delivery area.
|
|
281
|
+
*/
|
|
282
|
+
export async function setOrderFulfillment(choice: FulfillmentChoice): Promise<OrderCart> {
|
|
283
|
+
const address = fulfillmentAddress(choice, toRestaurantRegion(await listFulfillmentRaws()));
|
|
284
|
+
await wixJson("/ecom/v2/carts/current", { method: "PATCH", body: JSON.stringify({ cart: { deliveryInfo: { address } } }) });
|
|
285
|
+
try {
|
|
286
|
+
const res = await wixJson("/ecom/v2/carts/current/set-delivery-method", { method: "POST", body: JSON.stringify({ deliveryMethod: { code: fulfillmentCode(choice) } }) });
|
|
287
|
+
return readCartWithSubtotal(res.cart ?? null);
|
|
288
|
+
} catch (e) {
|
|
289
|
+
if ((e as { code?: string }).code === "DELIVERY_METHOD_NOT_FOUND") {
|
|
290
|
+
throw new Error(choice.type === "DELIVERY" ? NOT_DELIVERABLE : "This pickup time isn't available. Choose another time.");
|
|
291
|
+
}
|
|
292
|
+
throw e;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
|
|
215
296
|
/**
|
|
216
297
|
* Start the Wix-hosted checkout for the current order and return the URL to navigate to.
|
|
217
|
-
* The cart's id IS the checkout id — no separate checkout-creation call.
|
|
218
|
-
*
|
|
219
|
-
* browser: the return origin must be window.location.origin
|
|
220
|
-
* request origin (http behind the proxy → the return redirect 403s).
|
|
298
|
+
* The cart's id IS the checkout id — no separate checkout-creation call. The fulfillment must be
|
|
299
|
+
* on the cart first (setOrderFulfillment); a cart with none gets pickup ASAP. Payment is collected
|
|
300
|
+
* on the hosted page. Call from the browser: the return origin must be window.location.origin
|
|
301
|
+
* (https), never a server-derived request origin (http behind the proxy → the return redirect 403s).
|
|
221
302
|
*/
|
|
222
303
|
export async function orderCheckoutUrl(): Promise<string> {
|
|
223
304
|
const { cart } = await cartApi.getCurrentCart();
|
|
224
305
|
const raw = cart as Raw;
|
|
225
306
|
assertOrderCheckoutable(raw);
|
|
307
|
+
if (!raw.deliveryInfo?.method?.code) {
|
|
308
|
+
await setOrderFulfillment({ type: "PICKUP" }).catch(() => {
|
|
309
|
+
throw new Error("Choose pickup or delivery before checkout.");
|
|
310
|
+
});
|
|
311
|
+
}
|
|
226
312
|
const origin = typeof window !== "undefined" ? window.location.origin : "";
|
|
227
313
|
const session = await redirects.createRedirectSession({
|
|
228
314
|
ecomCheckout: { checkoutId: rawId(raw) },
|
|
@@ -190,7 +190,7 @@ export interface MenuOrderingInfo {
|
|
|
190
190
|
};
|
|
191
191
|
}
|
|
192
192
|
|
|
193
|
-
/** A pickup/delivery method the operation offers (
|
|
193
|
+
/** A pickup/delivery method the operation offers (display: name, fee, minimum). */
|
|
194
194
|
export interface FulfillmentMethodInfo {
|
|
195
195
|
id: string;
|
|
196
196
|
type: "PICKUP" | "DELIVERY";
|
|
@@ -203,6 +203,38 @@ export interface FulfillmentMethodInfo {
|
|
|
203
203
|
minOrderPriceAmount: string;
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
+
/**
|
|
207
|
+
* A time the order can be fulfilled at, from the operation's time slots. `code` is what the cart's
|
|
208
|
+
* delivery method takes ("PICKUP|ASAP", or "PICKUP|<startMs>|<endMs>" for a scheduled slot).
|
|
209
|
+
*/
|
|
210
|
+
export interface FulfillmentTime {
|
|
211
|
+
type: "PICKUP" | "DELIVERY";
|
|
212
|
+
code: string;
|
|
213
|
+
asap: boolean;
|
|
214
|
+
/** ISO start/end (equal for a point in time); render in OrderingStatus.timeZone. */
|
|
215
|
+
startIso: string;
|
|
216
|
+
endIso: string;
|
|
217
|
+
}
|
|
218
|
+
|
|
219
|
+
/**
|
|
220
|
+
* A delivery address. country (ISO-3166 alpha-2) and subdivision ("US-CA") default to the
|
|
221
|
+
* restaurant's when omitted — delivery is local.
|
|
222
|
+
*/
|
|
223
|
+
export interface DeliveryAddress {
|
|
224
|
+
addressLine: string;
|
|
225
|
+
city: string;
|
|
226
|
+
postalCode?: string;
|
|
227
|
+
country?: string;
|
|
228
|
+
subdivision?: string;
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
/** The visitor's fulfillment: pickup or delivery, a time (omitted → ASAP), and the address for delivery. */
|
|
232
|
+
export interface FulfillmentChoice {
|
|
233
|
+
type: "PICKUP" | "DELIVERY";
|
|
234
|
+
time?: FulfillmentTime;
|
|
235
|
+
address?: DeliveryAddress;
|
|
236
|
+
}
|
|
237
|
+
|
|
206
238
|
export interface OrderLine {
|
|
207
239
|
/** The cart line id — what update/remove take (NOT the menu item id). */
|
|
208
240
|
lineItemId: string;
|
|
@@ -227,6 +259,8 @@ export interface OrderCart {
|
|
|
227
259
|
/** Formatted subtotal (after discounts) — from the cart estimate, not hand-summed. */
|
|
228
260
|
subtotal: string;
|
|
229
261
|
currency: string;
|
|
262
|
+
/** The fulfillment code set on the cart ("PICKUP|ASAP", …); "" when none is set yet. */
|
|
263
|
+
fulfillmentCode: string;
|
|
230
264
|
}
|
|
231
265
|
|
|
232
266
|
/** A custom question the owner added to the reservation form. */
|
|
@@ -1,13 +1,51 @@
|
|
|
1
|
-
// REFERENCE slide-over order cart with quantity stepper, remove, live subtotal,
|
|
2
|
-
// Wix-hosted checkout. Mount ONCE per page;
|
|
3
|
-
// complete; per the skill's model you design your
|
|
1
|
+
// REFERENCE slide-over order cart with quantity stepper, remove, live subtotal, pickup/delivery
|
|
2
|
+
// with a time (and the address for delivery), and the Wix-hosted checkout. Mount ONCE per page;
|
|
3
|
+
// opens via useOrderCart().openCart(). Correct and complete; per the skill's model you design your
|
|
4
|
+
// own chrome on useOrderCart.
|
|
5
|
+
import { useState } from "react";
|
|
4
6
|
import { useOrderCart } from "../../hooks/restaurants/useOrderCart";
|
|
5
7
|
import { imgAttrs } from "../../wix/media";
|
|
8
|
+
import { zonedDateTimeLabel, zonedDayKey, zonedTimeLabel } from "../../wix/restaurants/time-core";
|
|
9
|
+
import type { FulfillmentChoice } from "../../wix/restaurants/types";
|
|
6
10
|
|
|
7
11
|
export default function OrderCartDrawer() {
|
|
8
|
-
const { cart, open, closeCart, busy, error, updateQuantity, removeLine, checkout } = useOrderCart();
|
|
12
|
+
const { cart, open, closeCart, busy, error, updateQuantity, removeLine, checkout, fulfillment, fulfillmentTimes, orderingStatus, chooseFulfillment, loadFulfillmentTimes } = useOrderCart();
|
|
13
|
+
const types = [...new Set((fulfillment ?? []).map((m) => m.type))];
|
|
14
|
+
const [type, setType] = useState<"PICKUP" | "DELIVERY" | null>(null);
|
|
15
|
+
const [timeCode, setTimeCode] = useState("");
|
|
16
|
+
const [street, setStreet] = useState("");
|
|
17
|
+
const [city, setCity] = useState("");
|
|
18
|
+
const [postalCode, setPostalCode] = useState("");
|
|
9
19
|
if (!open) return null;
|
|
10
20
|
const lines = cart?.lines ?? [];
|
|
21
|
+
const chosenType = type ?? (types.includes("PICKUP") || !types.length ? "PICKUP" : "DELIVERY");
|
|
22
|
+
const times = (fulfillmentTimes ?? []).filter((t) => t.type === chosenType);
|
|
23
|
+
const tz = orderingStatus?.timeZone ?? "";
|
|
24
|
+
const today = zonedDayKey(new Date(), tz);
|
|
25
|
+
// A slot on a later day than today (at the restaurant) carries its date: "Fri, Oct 24, 9:00 AM".
|
|
26
|
+
const timeLabel = (iso: string, asap: boolean) => {
|
|
27
|
+
const d = new Date(iso);
|
|
28
|
+
if (asap) return `As soon as possible (about ${zonedTimeLabel(d, tz)})`;
|
|
29
|
+
return zonedDayKey(d, tz) === today ? zonedTimeLabel(d, tz) : zonedDateTimeLabel(d, tz);
|
|
30
|
+
};
|
|
31
|
+
const deliveryMethod = (fulfillment ?? []).find((m) => m.type === "DELIVERY");
|
|
32
|
+
|
|
33
|
+
// Once street and city are in, delivery times come only from the methods that deliver there.
|
|
34
|
+
function refreshDeliveryTimes() {
|
|
35
|
+
if (street.trim() && city.trim()) void loadFulfillmentTimes(undefined, { addressLine: street, city, postalCode });
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async function placeOrder() {
|
|
39
|
+
const choice: FulfillmentChoice = {
|
|
40
|
+
type: chosenType,
|
|
41
|
+
time: times.find((t) => t.code === timeCode),
|
|
42
|
+
...(chosenType === "DELIVERY"
|
|
43
|
+
? { address: { addressLine: street, city, postalCode } } // country and subdivision: the restaurant's
|
|
44
|
+
: {}),
|
|
45
|
+
};
|
|
46
|
+
await chooseFulfillment(choice); // the hosted checkout refuses an order with no fulfillment
|
|
47
|
+
await checkout();
|
|
48
|
+
}
|
|
11
49
|
|
|
12
50
|
return (
|
|
13
51
|
<div
|
|
@@ -104,11 +142,55 @@ export default function OrderCartDrawer() {
|
|
|
104
142
|
<strong className="font-semibold">{cart.subtotal}</strong>
|
|
105
143
|
</div>
|
|
106
144
|
)}
|
|
145
|
+
{types.length > 1 && (
|
|
146
|
+
<div role="radiogroup" aria-label="Pickup or delivery" className="mb-3 grid grid-cols-2 gap-2">
|
|
147
|
+
{(["PICKUP", "DELIVERY"] as const).map((t) => (
|
|
148
|
+
<button
|
|
149
|
+
key={t}
|
|
150
|
+
type="button"
|
|
151
|
+
role="radio"
|
|
152
|
+
aria-checked={chosenType === t}
|
|
153
|
+
onClick={() => { setType(t); setTimeCode(""); }}
|
|
154
|
+
className={`rounded-control border py-2 text-sm ${chosenType === t ? "border-primary font-semibold" : "border-border text-muted-foreground"}`}
|
|
155
|
+
>
|
|
156
|
+
{t === "PICKUP" ? "Pickup" : "Delivery"}
|
|
157
|
+
</button>
|
|
158
|
+
))}
|
|
159
|
+
</div>
|
|
160
|
+
)}
|
|
161
|
+
{chosenType === "DELIVERY" && (
|
|
162
|
+
<div className="mb-3 grid gap-2">
|
|
163
|
+
<input aria-label="Street address" placeholder="Street address" value={street} onChange={(e) => setStreet(e.target.value)} onBlur={refreshDeliveryTimes} className="rounded-control border border-border bg-background px-3 py-2 text-sm" />
|
|
164
|
+
<div className="grid grid-cols-2 gap-2">
|
|
165
|
+
<input aria-label="City" placeholder="City" value={city} onChange={(e) => setCity(e.target.value)} onBlur={refreshDeliveryTimes} className="rounded-control border border-border bg-background px-3 py-2 text-sm" />
|
|
166
|
+
<input aria-label="Postal code" placeholder="Postal code" value={postalCode} onChange={(e) => setPostalCode(e.target.value)} className="rounded-control border border-border bg-background px-3 py-2 text-sm" />
|
|
167
|
+
</div>
|
|
168
|
+
{deliveryMethod && (deliveryMethod.fee || deliveryMethod.minOrderPrice) && (
|
|
169
|
+
<p className="text-xs text-muted-foreground">
|
|
170
|
+
{[deliveryMethod.fee && `Delivery ${deliveryMethod.fee}`, deliveryMethod.minOrderPrice && `minimum order ${deliveryMethod.minOrderPrice}`].filter(Boolean).join(" · ")}
|
|
171
|
+
</p>
|
|
172
|
+
)}
|
|
173
|
+
</div>
|
|
174
|
+
)}
|
|
175
|
+
{times.length > 0 && (
|
|
176
|
+
<select
|
|
177
|
+
aria-label={chosenType === "PICKUP" ? "Pickup time" : "Delivery time"}
|
|
178
|
+
value={timeCode}
|
|
179
|
+
onChange={(e) => setTimeCode(e.target.value)}
|
|
180
|
+
className="mb-4 w-full rounded-control border border-border bg-background px-3 py-2 text-sm"
|
|
181
|
+
>
|
|
182
|
+
{times.map((t) => (
|
|
183
|
+
<option key={t.code} value={t.asap ? "" : t.code}>
|
|
184
|
+
{timeLabel(t.startIso, t.asap)}
|
|
185
|
+
</option>
|
|
186
|
+
))}
|
|
187
|
+
</select>
|
|
188
|
+
)}
|
|
107
189
|
{error && <p className="mb-3 text-xs text-destructive">{error}</p>}
|
|
108
190
|
<button
|
|
109
191
|
type="button"
|
|
110
192
|
disabled={busy}
|
|
111
|
-
onClick={() =>
|
|
193
|
+
onClick={() => placeOrder().catch(() => {})}
|
|
112
194
|
className="w-full rounded-control bg-primary py-3.5 text-sm font-semibold text-primary-foreground transition-opacity hover:opacity-90 disabled:opacity-50"
|
|
113
195
|
>
|
|
114
196
|
{busy ? "One moment…" : "Checkout"}
|
package/skills/wix-headless-templates/restaurants/project/src/hooks/restaurants/useOrderCart.ts
CHANGED
|
@@ -3,9 +3,11 @@
|
|
|
3
3
|
import { useSyncExternalStore } from "react";
|
|
4
4
|
import {
|
|
5
5
|
addOrderLine,
|
|
6
|
+
chooseFulfillment,
|
|
6
7
|
getOrderCartState,
|
|
7
8
|
goToOrderCheckout,
|
|
8
9
|
isMenuOrderable,
|
|
10
|
+
loadFulfillmentTimes,
|
|
9
11
|
refreshOrderCart,
|
|
10
12
|
removeLineFromOrder,
|
|
11
13
|
setOrderCartOpen,
|
|
@@ -13,7 +15,7 @@ import {
|
|
|
13
15
|
updateOrderLineQuantity,
|
|
14
16
|
type OrderCartState,
|
|
15
17
|
} from "../../wix/restaurants/order-store";
|
|
16
|
-
import type { MenuItem, OrderSelection } from "../../wix/restaurants/types";
|
|
18
|
+
import type { DeliveryAddress, FulfillmentChoice, MenuItem, OrderSelection } from "../../wix/restaurants/types";
|
|
17
19
|
|
|
18
20
|
const SERVER_STATE = getOrderCartState();
|
|
19
21
|
|
|
@@ -29,6 +31,10 @@ export interface UseOrderCart extends OrderCartState {
|
|
|
29
31
|
menuOrderable: (menuId: string) => boolean | null;
|
|
30
32
|
updateQuantity: (lineItemId: string, quantity: number) => Promise<void>;
|
|
31
33
|
removeLine: (lineItemId: string) => Promise<void>;
|
|
34
|
+
/** Set pickup or delivery, the time (a fulfillmentTimes entry; omitted → ASAP), and the delivery address. */
|
|
35
|
+
chooseFulfillment: (choice: FulfillmentChoice) => Promise<void>;
|
|
36
|
+
/** Reload fulfillmentTimes for another day ("YYYY-MM-DD" at the restaurant) and/or a delivery address. */
|
|
37
|
+
loadFulfillmentTimes: (dayKey?: string, address?: DeliveryAddress) => Promise<void>;
|
|
32
38
|
checkout: () => Promise<void>;
|
|
33
39
|
openCart: () => void;
|
|
34
40
|
closeCart: () => void;
|
|
@@ -44,6 +50,8 @@ export function useOrderCart(): UseOrderCart {
|
|
|
44
50
|
menuOrderable: isMenuOrderable,
|
|
45
51
|
updateQuantity: updateOrderLineQuantity,
|
|
46
52
|
removeLine: removeLineFromOrder,
|
|
53
|
+
chooseFulfillment,
|
|
54
|
+
loadFulfillmentTimes,
|
|
47
55
|
checkout: goToOrderCheckout,
|
|
48
56
|
openCart: () => setOrderCartOpen(true),
|
|
49
57
|
closeCart: () => setOrderCartOpen(false),
|
package/skills/wix-headless-templates/restaurants/project/src/wix/restaurants/order-store.ts
CHANGED
|
@@ -4,16 +4,18 @@
|
|
|
4
4
|
// Consume it through useOrderCart() (hooks/), or subscribe directly. Besides the cart it holds
|
|
5
5
|
// the site's ordering gates: the operation's state and each menu's ordering settings, so an add
|
|
6
6
|
// control can read "accepting orders?" and "is THIS menu orderable now?" without a fetch of its own.
|
|
7
|
-
import type { FulfillmentMethodInfo, MenuItem, MenuOrderingInfo, OrderCart, OrderSelection, OrderingStatus } from "./types";
|
|
7
|
+
import type { DeliveryAddress, FulfillmentChoice, FulfillmentMethodInfo, FulfillmentTime, MenuItem, MenuOrderingInfo, OrderCart, OrderSelection, OrderingStatus } from "./types";
|
|
8
8
|
import { menuOrderable } from "./ordering-core";
|
|
9
9
|
import {
|
|
10
10
|
addToOrder as apiAdd,
|
|
11
11
|
fetchFulfillmentMethods,
|
|
12
|
+
fetchFulfillmentTimes,
|
|
12
13
|
fetchMenuOrdering,
|
|
13
14
|
fetchOrderCart,
|
|
14
15
|
orderCheckoutUrl,
|
|
15
16
|
removeOrderLine as apiRemove,
|
|
16
17
|
resolveOrdering,
|
|
18
|
+
setOrderFulfillment,
|
|
17
19
|
updateOrderQuantity as apiUpdate,
|
|
18
20
|
} from "./ordering";
|
|
19
21
|
|
|
@@ -25,8 +27,12 @@ export interface OrderCartState {
|
|
|
25
27
|
orderingStatus: OrderingStatus | null;
|
|
26
28
|
/** Per-menu ordering settings under the operation, keyed by menuId; null while loading or when unreadable. */
|
|
27
29
|
menuOrdering: Record<string, MenuOrderingInfo> | null;
|
|
28
|
-
/** The operation's enabled pickup/delivery methods,
|
|
30
|
+
/** The operation's enabled pickup/delivery methods (names, fees, minimums); null while loading. */
|
|
29
31
|
fulfillment: FulfillmentMethodInfo[] | null;
|
|
32
|
+
/** When the order can be fulfilled (ASAP first, then today's slots); null while loading or unreadable. */
|
|
33
|
+
fulfillmentTimes: FulfillmentTime[] | null;
|
|
34
|
+
/** The fulfillment last set on the cart through chooseFulfillment; null → none chosen (checkout uses pickup ASAP). */
|
|
35
|
+
fulfillmentChoice: FulfillmentChoice | null;
|
|
30
36
|
/**
|
|
31
37
|
* True while any cart operation is in flight — the DRAWER's flag (its steppers, remove and
|
|
32
38
|
* checkout controls), not a dish card's: a card disables its own add control on `pendingItemId`,
|
|
@@ -41,7 +47,7 @@ export interface OrderCartState {
|
|
|
41
47
|
open: boolean;
|
|
42
48
|
}
|
|
43
49
|
|
|
44
|
-
const EMPTY: OrderCartState = { cart: null, ordering: null, orderingStatus: null, menuOrdering: null, fulfillment: null, busy: false, pendingItemId: null, error: null, open: false };
|
|
50
|
+
const EMPTY: OrderCartState = { cart: null, ordering: null, orderingStatus: null, menuOrdering: null, fulfillment: null, fulfillmentTimes: null, fulfillmentChoice: null, busy: false, pendingItemId: null, error: null, open: false };
|
|
45
51
|
|
|
46
52
|
let state: OrderCartState = EMPTY;
|
|
47
53
|
const listeners = new Set<() => void>();
|
|
@@ -65,6 +71,7 @@ export function subscribeOrderCart(listener: () => void): () => void {
|
|
|
65
71
|
void resolveOrdering().then((s) => setState({ ordering: s.status === "ENABLED", orderingStatus: s }));
|
|
66
72
|
void fetchMenuOrdering().then((m) => setState({ menuOrdering: m })).catch(() => setState({ menuOrdering: null }));
|
|
67
73
|
void fetchFulfillmentMethods().then((f) => setState({ fulfillment: f }));
|
|
74
|
+
void loadFulfillmentTimes();
|
|
68
75
|
}
|
|
69
76
|
return () => listeners.delete(listener);
|
|
70
77
|
}
|
|
@@ -124,7 +131,29 @@ export async function removeLineFromOrder(lineItemId: string): Promise<void> {
|
|
|
124
131
|
await run(() => apiRemove(lineItemId));
|
|
125
132
|
}
|
|
126
133
|
|
|
127
|
-
/**
|
|
134
|
+
/**
|
|
135
|
+
* Load the fulfillment times for `dayKey` ("YYYY-MM-DD" at the restaurant; default today). Pass the
|
|
136
|
+
* delivery address once entered: delivery times then come only from methods that deliver there.
|
|
137
|
+
*/
|
|
138
|
+
export async function loadFulfillmentTimes(dayKey?: string, address?: DeliveryAddress): Promise<void> {
|
|
139
|
+
try {
|
|
140
|
+
setState({ fulfillmentTimes: await fetchFulfillmentTimes(dayKey, address) });
|
|
141
|
+
} catch {
|
|
142
|
+
setState({ fulfillmentTimes: null }); // unreadable — checkout still works on ASAP
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/**
|
|
147
|
+
* Set pickup or delivery, the time (a fulfillmentTimes entry; omitted → ASAP) and, for delivery,
|
|
148
|
+
* the address on the order. Throws (and sets .error) when the address isn't delivered to or the
|
|
149
|
+
* time is gone.
|
|
150
|
+
*/
|
|
151
|
+
export async function chooseFulfillment(choice: FulfillmentChoice): Promise<void> {
|
|
152
|
+
await run(() => setOrderFulfillment(choice));
|
|
153
|
+
setState({ fulfillmentChoice: choice });
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
/** Navigate to the Wix-hosted checkout (pickup ASAP when no fulfillment was chosen). Never hand-build a checkout URL. */
|
|
128
157
|
export async function goToOrderCheckout(): Promise<void> {
|
|
129
158
|
setState({ busy: true, error: null });
|
|
130
159
|
try {
|