@wix/agent-skills 1.33.1 → 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 +2 -0
- package/package.json +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 +13 -3
- 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/events-dashboard-navigation.md +81 -0
- 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-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-replatform/resources/rp-target-wix/SPEC-product-reviews-and-blog-authorship.md +0 -330
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { isBlank } = require('./value-utils.js');
|
|
4
|
+
const { WIX_GIFT_CARDS_APP_ID } = require('./gift-card-build.js');
|
|
5
|
+
|
|
6
|
+
// rp-target-wix — given the bridge-plugin activity rows
|
|
7
|
+
// for one card, netted per source order, build the deterministic
|
|
8
|
+
// POST /ecom/v1/gift-cards/redeem request body: { code, amount, orderId, appId }.
|
|
9
|
+
//
|
|
10
|
+
// The mechanism itself is LIVE-VERIFIED IN ISOLATION 2026-08-17: a real Redeem Gift Card call against a real imported
|
|
11
|
+
// order correctly decremented a card's balance (10 -> 7) and returned a transactionId. What this
|
|
12
|
+
// module is BLOCKED on is the INPUT, not the mechanism: the activity row shape it consumes comes
|
|
13
|
+
// from the bridge plugin, which is code-only and not yet installed/live-tested on any
|
|
14
|
+
// real WordPress site. This builder is ready to consume that
|
|
15
|
+
// data the moment it exists.
|
|
16
|
+
//
|
|
17
|
+
// Ordering requirement: the source card's issuance must already
|
|
18
|
+
// be recorded in the crosswalk (gift-card-build.js ran first) and the order this redemption
|
|
19
|
+
// belongs to must already be imported (order-channel-build.js), before a
|
|
20
|
+
// redemption can be linked — this module does not check either precondition itself, it only
|
|
21
|
+
// requires the caller to already have both resolved ids in hand.
|
|
22
|
+
|
|
23
|
+
// A single activity row's `action` label is NOT independently confirmed against the plugin's
|
|
24
|
+
// exact stored string — the available evidence only documents the function name
|
|
25
|
+
// (`debit_gift_cards()`), not the literal VARCHAR value it writes. Classifying by the SIGN of
|
|
26
|
+
// `amount` instead is grounded directly in the plugin's own documented balance computation
|
|
27
|
+
// (balance = SUM(activity.amount)), not a guessed string.
|
|
28
|
+
function isRedemptionActivityRow(row) {
|
|
29
|
+
return row != null && Number(row.amount) < 0;
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
// Fixed 2026-08-18: a naive "replay every negative row" double-removes value the
|
|
33
|
+
// source has already restored. Most gift-card plugins (PW Gift Cards included, per its own
|
|
34
|
+
// debit/credit activity model) can credit a card back when an order tied
|
|
35
|
+
// to a prior debit is later cancelled, refunded, or fails — a -10/+10 pair for the SAME order
|
|
36
|
+
// must net to zero, not emit a 10.00 redemption. This exact reversal mechanism is not
|
|
37
|
+
// independently verified against the plugin's own PHP source in this repo yet, but netting per
|
|
38
|
+
// order is the only sound behavior regardless of the specific trigger, since ANY reversal for ANY
|
|
39
|
+
// reason produces exactly this shape: two-or-more rows, same order, opposite signs.
|
|
40
|
+
//
|
|
41
|
+
// Returns an array of 0 or 1 netted-activity objects (`{ orderId, amount, activityIds, rows }`) —
|
|
42
|
+
// an array, not a bare object, so a fully-reversed or never-redeemed order (net >= 0) can return
|
|
43
|
+
// "nothing to build" the same way a not-found lookup would, rather than a sentinel the caller has
|
|
44
|
+
// to remember to check.
|
|
45
|
+
function findRedemptionActivityForOrder(activityRows, sourceOrderId) {
|
|
46
|
+
const rowsForOrder = (activityRows || []).filter(
|
|
47
|
+
(row) => row != null && Number(row.order_id) === Number(sourceOrderId)
|
|
48
|
+
);
|
|
49
|
+
if (rowsForOrder.length === 0) return [];
|
|
50
|
+
|
|
51
|
+
const net = rowsForOrder.reduce((sum, row) => {
|
|
52
|
+
const rowAmount = Number(row.amount);
|
|
53
|
+
return sum + (Number.isFinite(rowAmount) ? rowAmount : 0);
|
|
54
|
+
}, 0);
|
|
55
|
+
|
|
56
|
+
// net >= 0: no debit at all for this order, or a later reversal already restored it in full —
|
|
57
|
+
// either way, nothing left to redeem in Wix.
|
|
58
|
+
if (net >= 0) return [];
|
|
59
|
+
|
|
60
|
+
return [{
|
|
61
|
+
orderId: sourceOrderId,
|
|
62
|
+
amount: net,
|
|
63
|
+
activityIds: rowsForOrder.map((row) => row.activity_id),
|
|
64
|
+
rows: rowsForOrder,
|
|
65
|
+
}];
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
// Fixed 2026-08-18: Policy C's own soundness has a precondition this
|
|
69
|
+
// module did not check. Replaying every order-linked redemption reaches the CORRECT final balance
|
|
70
|
+
// only when the drift between face value and the bridge's reported current balance is FULLY
|
|
71
|
+
// explained by order-linked activity. The bridge explicitly allows manual, non-order-linked
|
|
72
|
+
// adjustments (extract_order_id() returns null for these): a
|
|
73
|
+
// card can carry face value 25, a manual credit +5 (order_id null), and a real redemption -10
|
|
74
|
+
// (order-linked) — the bridge's own current balance is 20, but blindly replaying only the
|
|
75
|
+
// order-linked -10 debit would leave the Wix card at 25 - 10 = 15, silently wrong by 5.
|
|
76
|
+
//
|
|
77
|
+
// This is the pre-write reconciliation required before Policy C may be used
|
|
78
|
+
// for a card: predict the final balance IF only order-linked activity is replayed (summing, per
|
|
79
|
+
// order, the same net-per-order computation findRedemptionActivityForOrder itself uses — a
|
|
80
|
+
// net-positive order, like the one that issued the card, correctly contributes nothing to
|
|
81
|
+
// replay, exactly the way findRedemptionActivityForOrder already treats it), then compare that
|
|
82
|
+
// prediction against the bridge's own reported CURRENT balance (which sums literally every row,
|
|
83
|
+
// order-linked or not — no need to specifically detect "the issuance row" or "manual rows"; any
|
|
84
|
+
// unaccounted-for activity of any kind surfaces as a mismatch here). A mismatch means Policy C is
|
|
85
|
+
// not safe for this card — it must gap for manual review, or fall back to Policy B (create
|
|
86
|
+
// directly at the bridge's verified current balance) instead.
|
|
87
|
+
function verifyPolicyCReplaySufficiency({ activityRows, faceValue, bridgeCurrentBalance } = {}) {
|
|
88
|
+
const face = faceValue == null ? NaN : Number(faceValue);
|
|
89
|
+
const bridgeBalance = bridgeCurrentBalance == null ? NaN : Number(bridgeCurrentBalance);
|
|
90
|
+
if (!Number.isFinite(face) || !Number.isFinite(bridgeBalance)) {
|
|
91
|
+
return {
|
|
92
|
+
safe: false,
|
|
93
|
+
gap: {
|
|
94
|
+
code: 'policy-c-verification-missing-input',
|
|
95
|
+
summary: `faceValue (${JSON.stringify(faceValue)}) and bridgeCurrentBalance (${JSON.stringify(bridgeCurrentBalance)}) must both be finite numbers to verify Policy C is safe for this card.`,
|
|
96
|
+
},
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const orderIds = Array.from(
|
|
101
|
+
new Set((activityRows || []).map((row) => (row == null ? null : row.order_id)).filter((orderId) => orderId != null))
|
|
102
|
+
);
|
|
103
|
+
|
|
104
|
+
const totalReplayAmount = orderIds.reduce((sum, orderId) => {
|
|
105
|
+
const net = findRedemptionActivityForOrder(activityRows, orderId);
|
|
106
|
+
return sum + net.reduce((s, entry) => s + Math.abs(entry.amount), 0);
|
|
107
|
+
}, 0);
|
|
108
|
+
|
|
109
|
+
const predictedFinalBalance = Math.round((face - totalReplayAmount) * 100) / 100;
|
|
110
|
+
const roundedBridgeBalance = Math.round(bridgeBalance * 100) / 100;
|
|
111
|
+
const drift = Math.round((roundedBridgeBalance - predictedFinalBalance) * 100) / 100;
|
|
112
|
+
|
|
113
|
+
if (Math.abs(drift) > 0.005) {
|
|
114
|
+
return {
|
|
115
|
+
safe: false,
|
|
116
|
+
predictedFinalBalance,
|
|
117
|
+
bridgeCurrentBalance: roundedBridgeBalance,
|
|
118
|
+
drift,
|
|
119
|
+
gap: {
|
|
120
|
+
code: 'policy-c-unexplained-activity',
|
|
121
|
+
summary: `replaying only this card's order-linked activity would leave it at ${predictedFinalBalance}, but the bridge reports a current balance of ${roundedBridgeBalance} (drift ${drift}) — some activity (e.g. a manual, non-order-linked adjustment) is not accounted for by order-linked replay. Policy C is not safe for this card; either gap it for manual review, or use Policy B (create directly at the bridge's verified current balance) instead.`,
|
|
122
|
+
},
|
|
123
|
+
};
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return { safe: true, predictedFinalBalance, bridgeCurrentBalance: roundedBridgeBalance };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// One order's redemption -> one Redeem Gift Card body. `sourceOrderId` is the WooCommerce order
|
|
130
|
+
// id whose redemption is being linked; the netted activity for it is DERIVED INTERNALLY from
|
|
131
|
+
// `options.activityRows` via findRedemptionActivityForOrder — see the fix note below for why this
|
|
132
|
+
// is no longer a caller-supplied parameter. `wixCode` is the code the card was actually CREATED
|
|
133
|
+
// with (gift-card-build.js's payload.code — after any options.normalizeCode stripping), resolved
|
|
134
|
+
// from the crosswalk row this card's issuance produced (sourceStableKey
|
|
135
|
+
// `woocommerce:giftCard:<number>`), never re-derived from the raw source number here. `wixOrderId`
|
|
136
|
+
// is the real Wix order id returned by Import Order for the order this redemption belongs to.
|
|
137
|
+
//
|
|
138
|
+
// Fixed 2026-08-18: `options.balancePolicy` is now REQUIRED and must be
|
|
139
|
+
// `'C'` — the only one of the three balance policies (A, B, C) a redemption replay is
|
|
140
|
+
// safe under. Policy A is explicitly defined as "face value, no replay"; building a redemption
|
|
141
|
+
// for an 'A' card would contradict that policy's own accepted-overstatement design instead of
|
|
142
|
+
// implementing it (an 'A' card's overstatement is meant to be corrected manually, via
|
|
143
|
+
// disable-and-replace, or accepted — not silently patched by a redemption call the card's own
|
|
144
|
+
// policy never called for). Policy B already creates the card at its verified CURRENT balance —
|
|
145
|
+
// replaying the same historical redemption on a 'B' card would double-decrement it (once
|
|
146
|
+
// implicitly, by never having had the spend reflected in a face-value creation that never
|
|
147
|
+
// happened; once again by this call). 'C' is the one policy that means what a redemption call
|
|
148
|
+
// does: create at face value, then bring the balance down to correct by replaying real,
|
|
149
|
+
// order-linked redemptions — see gift-card-build.js's resolveCardBalance for its (identical to
|
|
150
|
+
// 'A') creation-time behavior.
|
|
151
|
+
//
|
|
152
|
+
// Fixed 2026-08-18: declaring Policy C is not by itself proof that
|
|
153
|
+
// replay will reach the correct balance for THIS card — see verifyPolicyCReplaySufficiency's own
|
|
154
|
+
// comment for the manual-adjustment failure mode this closes. `options.activityRows`,
|
|
155
|
+
// `options.faceValue`, and `options.bridgeCurrentBalance` are now REQUIRED alongside
|
|
156
|
+
// `balancePolicy: 'C'`, and this function runs that verification itself on every call rather than
|
|
157
|
+
// trusting a boolean the caller claims to have already checked — a card that fails verification
|
|
158
|
+
// gets a named gap here, never a payload.
|
|
159
|
+
//
|
|
160
|
+
// Fixed 2026-08-18: the fourth pass's own verification was DISCONNECTED
|
|
161
|
+
// from the payload it gated. `netActivity` used to be a second, independently caller-supplied
|
|
162
|
+
// argument — nothing checked that it was actually derived from the same `activityRows` the
|
|
163
|
+
// verification ran against, so a caller (or a bug) could pass activity rows that verify cleanly
|
|
164
|
+
// while separately passing a fabricated `netActivity.amount` and still get a real redemption
|
|
165
|
+
// payload built for an amount that was never verified at all. There is now exactly ONE source of
|
|
166
|
+
// truth: `sourceOrderId` plus `options.activityRows`, and this function derives the netted
|
|
167
|
+
// activity itself via `findRedemptionActivityForOrder` — the same call, on the same rows,
|
|
168
|
+
// `verifyPolicyCReplaySufficiency` already used — so the built payload can never diverge from
|
|
169
|
+
// what was verified.
|
|
170
|
+
function buildGiftCardRedemption(sourceOrderId, options) {
|
|
171
|
+
const { wixCode, wixOrderId, wixAppId = WIX_GIFT_CARDS_APP_ID, balancePolicy, activityRows, faceValue, bridgeCurrentBalance } = options || {};
|
|
172
|
+
const notes = [];
|
|
173
|
+
|
|
174
|
+
if (balancePolicy !== 'C') {
|
|
175
|
+
return {
|
|
176
|
+
payload: null,
|
|
177
|
+
gaps: [{
|
|
178
|
+
code: 'redemption-replay-requires-policy-c',
|
|
179
|
+
summary: `options.balancePolicy must be "C" to build a redemption — got ${JSON.stringify(balancePolicy)}. Policy A means "face value, no replay"; replaying a redemption on an 'A' card contradicts that policy instead of implementing it. Policy B already creates the card at its verified current balance; replaying the same redemption on a 'B' card would double-decrement it. Only a card explicitly declared Policy C — face value now, corrected later by replaying real order-linked redemptions — may be redeemed here.`,
|
|
180
|
+
}],
|
|
181
|
+
notes,
|
|
182
|
+
};
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
const verification = verifyPolicyCReplaySufficiency({ activityRows, faceValue, bridgeCurrentBalance });
|
|
186
|
+
if (!verification.safe) {
|
|
187
|
+
return { payload: null, gaps: [verification.gap], notes };
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
if (isBlank(wixCode)) {
|
|
191
|
+
return {
|
|
192
|
+
payload: null,
|
|
193
|
+
gaps: [{ code: 'missing-wix-code', summary: 'options.wixCode is required — resolve it from the crosswalk row this card was issued under (sourceStableKey woocommerce:giftCard:<number>) before building a redemption; never re-derive it from the raw source number, which may have been normalized at creation.' }],
|
|
194
|
+
notes,
|
|
195
|
+
};
|
|
196
|
+
}
|
|
197
|
+
if (isBlank(wixOrderId)) {
|
|
198
|
+
return {
|
|
199
|
+
payload: null,
|
|
200
|
+
gaps: [{ code: 'missing-wix-order-id', summary: 'options.wixOrderId is required — the order this redemption is linked to must already be imported before its redemptions can be recorded.' }],
|
|
201
|
+
notes,
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
// Derived from the SAME activityRows the verification above just ran against — never a
|
|
206
|
+
// separately caller-supplied value (see the fifth-pass fix note above).
|
|
207
|
+
const [netActivity = null] = findRedemptionActivityForOrder(activityRows, sourceOrderId);
|
|
208
|
+
|
|
209
|
+
const netAmount = netActivity == null ? null : Number(netActivity.amount);
|
|
210
|
+
if (netActivity == null || !Number.isFinite(netAmount) || netAmount >= 0) {
|
|
211
|
+
return {
|
|
212
|
+
payload: null,
|
|
213
|
+
gaps: [{
|
|
214
|
+
code: 'not-a-net-redemption',
|
|
215
|
+
summary: `net activity for order ${sourceOrderId} is "${netActivity && netActivity.amount}" — not a negative net amount once every activity row for this order is netted together, so there is nothing to redeem (either no debit occurred, or a later same-order reversal already restored it).`,
|
|
216
|
+
}],
|
|
217
|
+
notes,
|
|
218
|
+
};
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
const amount = Math.abs(netAmount);
|
|
222
|
+
if (amount <= 0) {
|
|
223
|
+
return {
|
|
224
|
+
payload: null,
|
|
225
|
+
gaps: [{ code: 'invalid-redemption-amount', summary: `net activity for order ${netActivity.orderId} has amount "${netActivity.amount}", not a positive value once its sign is taken.` }],
|
|
226
|
+
notes,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
notes.push(`redemption sourced from netted bridge-plugin activity for order_id ${netActivity.orderId} (activity rows: ${JSON.stringify(netActivity.activityIds)}) — net amount after any same-order reversal is ${netActivity.amount}.`);
|
|
231
|
+
|
|
232
|
+
return {
|
|
233
|
+
payload: {
|
|
234
|
+
code: wixCode,
|
|
235
|
+
amount: amount.toFixed(2),
|
|
236
|
+
orderId: wixOrderId,
|
|
237
|
+
appId: wixAppId,
|
|
238
|
+
},
|
|
239
|
+
gaps: [],
|
|
240
|
+
notes,
|
|
241
|
+
};
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
module.exports = {
|
|
245
|
+
isRedemptionActivityRow,
|
|
246
|
+
findRedemptionActivityForOrder,
|
|
247
|
+
verifyPolicyCReplaySufficiency,
|
|
248
|
+
buildGiftCardRedemption,
|
|
249
|
+
};
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Coupon usage per order, as the imported order's appliedDiscounts.
|
|
4
|
+
//
|
|
5
|
+
// There is no standalone write: an applied discount rides in the Import Order body (entity
|
|
6
|
+
// ecom/order-applied-discount, preferredWrite importOrder). So this module turns a source order's
|
|
7
|
+
// coupon lines into `appliedDiscounts[]` entries for the order body, resolving each code through
|
|
8
|
+
// the coupon crosswalk. A code the crosswalk cannot resolve produces NO entry and one unresolved
|
|
9
|
+
// report line -- a dangling reference would name a coupon that does not exist on the target.
|
|
10
|
+
//
|
|
11
|
+
// Every entry is the `coupon` one-of variant, which is the only honest one here: the discount
|
|
12
|
+
// genuinely was a coupon redemption. The plugin-computed `merchantDiscount` variant is a
|
|
13
|
+
// different entity (ecom/discount-rule's records) and is not this module's business.
|
|
14
|
+
//
|
|
15
|
+
// Pure. Amounts are kept as the source recorded them; Import Order stores money as-is and never
|
|
16
|
+
// recalculates, so the caller's priceSummary must already agree with these.
|
|
17
|
+
|
|
18
|
+
const OUTCOMES = Object.freeze({
|
|
19
|
+
WRITTEN: 'coupon-usage-written',
|
|
20
|
+
UNRESOLVED: 'coupon-usage-unresolved',
|
|
21
|
+
NONE: 'coupon-usage-none',
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
function canonicalAmount(value) {
|
|
25
|
+
const text = value === undefined || value === null ? '' : String(value).trim();
|
|
26
|
+
if (!/^-?\d+(\.\d+)?$/.test(text)) return null;
|
|
27
|
+
const n = Math.abs(Number(text));
|
|
28
|
+
return n.toFixed(2);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// `couponLines`: WooCommerce order `coupon_lines[]` ({ code, discount, discount_tax }) or any
|
|
32
|
+
// { code, discount } shape. `resolveCoupon(code)` -> { id, name? } | null (the coupon crosswalk).
|
|
33
|
+
function buildCouponAppliedDiscounts({ couponLines = [], resolveCoupon, includeTax = false } = {}) {
|
|
34
|
+
if (typeof resolveCoupon !== 'function') throw new Error('buildCouponAppliedDiscounts needs resolveCoupon(code) backed by the coupon crosswalk');
|
|
35
|
+
if (!Array.isArray(couponLines)) throw new Error('couponLines must be an array');
|
|
36
|
+
const appliedDiscounts = [];
|
|
37
|
+
const unresolved = [];
|
|
38
|
+
const findings = [];
|
|
39
|
+
for (const line of couponLines) {
|
|
40
|
+
const code = line && line.code !== undefined && line.code !== null ? String(line.code).trim() : '';
|
|
41
|
+
if (!code) { findings.push({ code: 'coupon-line-without-code' }); continue; }
|
|
42
|
+
let amount = canonicalAmount(line.discount);
|
|
43
|
+
if (amount === null) { unresolved.push({ code, reason: 'amount-not-decimal', discount: line.discount }); continue; }
|
|
44
|
+
if (includeTax) {
|
|
45
|
+
const tax = canonicalAmount(line.discount_tax);
|
|
46
|
+
if (tax !== null) amount = (Number(amount) + Number(tax)).toFixed(2);
|
|
47
|
+
}
|
|
48
|
+
const resolved = resolveCoupon(code);
|
|
49
|
+
if (!resolved || !resolved.id) {
|
|
50
|
+
unresolved.push({ code, reason: 'coupon-not-imported', amount });
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
appliedDiscounts.push({
|
|
54
|
+
// Order-level: WooCommerce records a coupon's total discount against the order, not per line.
|
|
55
|
+
discountType: 'GLOBAL',
|
|
56
|
+
coupon: { id: String(resolved.id), code, name: resolved.name ? String(resolved.name) : code, amount: { amount } },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
const outcome = couponLines.length === 0 ? OUTCOMES.NONE : (appliedDiscounts.length > 0 ? OUTCOMES.WRITTEN : OUTCOMES.UNRESOLVED);
|
|
60
|
+
return { appliedDiscounts, unresolved, findings, outcome, counts: { written: appliedDiscounts.length, unresolved: unresolved.length } };
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
module.exports = { OUTCOMES, buildCouponAppliedDiscounts, canonicalAmount };
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// An imported order carries its buyer's member id, resolved from the member crosswalk
|
|
4
|
+
// and corroborated, or it carries nothing.
|
|
5
|
+
//
|
|
6
|
+
// `buyerInfo.memberId` is what member-facing reads authorize on: a member-identity Get Order
|
|
7
|
+
// returns an order only if that member placed it, and the invoice download backend checks the
|
|
8
|
+
// same field. So an imported order with no memberId is invisible to its own buyer (dormant, no
|
|
9
|
+
// leak), and one with the WRONG memberId hands that member someone else's order and invoice, with
|
|
10
|
+
// both checks agreeing. Import Order stores whatever GUID it is given (verified live 2026-09-05:
|
|
11
|
+
// a memberId that is not a member is accepted and read back as-is). Nothing downstream catches a
|
|
12
|
+
// bad link, so this module fails CLOSED: a member id is set only when the crosswalk names it AND
|
|
13
|
+
// the member's login email is the order's billing email.
|
|
14
|
+
//
|
|
15
|
+
// Pure. The caller supplies the source order's customer id and billing email, and crosswalk
|
|
16
|
+
// lookups; this decides and stamps.
|
|
17
|
+
|
|
18
|
+
const crypto = require('node:crypto');
|
|
19
|
+
|
|
20
|
+
const OUTCOMES = Object.freeze({
|
|
21
|
+
LINKED: 'buyer-member-linked',
|
|
22
|
+
GUEST: 'buyer-guest',
|
|
23
|
+
NOT_IMPORTED: 'buyer-member-not-imported',
|
|
24
|
+
EMAIL_MISMATCH: 'buyer-member-email-mismatch',
|
|
25
|
+
CONTACT_ONLY: 'buyer-contact-only',
|
|
26
|
+
});
|
|
27
|
+
const GUID = /^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
28
|
+
const STAMP_VERSION = 'rp-order-buyer:v2';
|
|
29
|
+
// ASCII `local@domain.tld` only. Case-folding non-ASCII (the Kelvin sign folds to `k`) can make two
|
|
30
|
+
// distinct addresses equal, and a false link is the harm here; a non-ASCII address is simply not
|
|
31
|
+
// comparable and links nothing. Plus-addressing, dots and IDN forms are NOT normalized either --
|
|
32
|
+
// strict on purpose: a missed link is a reported finding, a wrong one is a leak.
|
|
33
|
+
const ASCII_EMAIL = /^[\x21-\x7e]+@[a-z0-9.-]+\.[a-z]{2,}$/;
|
|
34
|
+
|
|
35
|
+
function normalizeEmail(value) {
|
|
36
|
+
const raw = value === undefined || value === null ? '' : String(value).trim();
|
|
37
|
+
// ASCII is checked BEFORE case-folding: `toLowerCase()` turns the Kelvin sign into `k`, and a
|
|
38
|
+
// check after folding would have accepted it (the review's demonstration, reproduced in tests).
|
|
39
|
+
if (!/^[\x21-\x7e]+$/.test(raw)) return null;
|
|
40
|
+
const text = raw.toLowerCase();
|
|
41
|
+
return ASCII_EMAIL.test(text) && text.indexOf('@') === text.lastIndexOf('@') ? text : null;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
// JSON-encoded (no delimiter to inject), and covering the OUTCOME and finding codes as well as the
|
|
45
|
+
// ids: a review swapped `outcome` to "linked" on a mismatch result and the stamp still verified,
|
|
46
|
+
// so the report would have said linked while the body carried nothing.
|
|
47
|
+
function stampInput(buyer) {
|
|
48
|
+
return JSON.stringify([STAMP_VERSION, buyer.outcome || null, buyer.memberId || null, buyer.contactId || null, buyer.sourceCustomerId === undefined || buyer.sourceCustomerId === null ? null : String(buyer.sourceCustomerId), buyer.email || null, (buyer.findings || []).map((f) => f && f.code).sort()]);
|
|
49
|
+
}
|
|
50
|
+
function computeBuyerStamp(buyer) {
|
|
51
|
+
return crypto.createHash('sha256').update(stampInput(buyer)).digest('hex');
|
|
52
|
+
}
|
|
53
|
+
function verifyBuyerStamp(buyer) {
|
|
54
|
+
return Boolean(buyer && typeof buyer === 'object' && typeof buyer.buyerStamp === 'string' && buyer.buyerStamp === computeBuyerStamp(buyer));
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// `memberCrosswalk.get(sourceCustomerId)` -> { memberId, loginEmail } | null -- what this migration
|
|
58
|
+
// created (Create Member by loginEmail) keyed by the source user id.
|
|
59
|
+
// `contactCrosswalk.get(key)` -> contactId | null, keyed by source customer id, else by email.
|
|
60
|
+
async function resolveOrderBuyer({ sourceCustomerId = null, billingEmail = null, memberCrosswalk = null, contactCrosswalk = null } = {}) {
|
|
61
|
+
const findings = [];
|
|
62
|
+
const email = normalizeEmail(billingEmail);
|
|
63
|
+
// A WooCommerce customer id is a positive integer, possibly stringified, possibly zero-padded
|
|
64
|
+
// by a CSV. Anything else is a caller error, not a guest: `true` stringifies to "true" and a row
|
|
65
|
+
// keyed "true" would never exist, which silently under-links.
|
|
66
|
+
let customerId = null;
|
|
67
|
+
if (sourceCustomerId !== undefined && sourceCustomerId !== null && String(sourceCustomerId).trim() !== '') {
|
|
68
|
+
// A number above 2^53 has ALREADY been rounded by whoever parsed it; it cannot name a customer.
|
|
69
|
+
if (typeof sourceCustomerId === 'number' && !Number.isSafeInteger(sourceCustomerId)) throw new Error(`sourceCustomerId ${sourceCustomerId} is not a safe integer; pass large ids as strings`);
|
|
70
|
+
const raw = typeof sourceCustomerId === 'number' ? String(sourceCustomerId) : String(sourceCustomerId).trim();
|
|
71
|
+
if (!/^\d+(\.0+)?$/.test(raw)) throw new Error(`sourceCustomerId must be a non-negative integer (WooCommerce customer id), got ${JSON.stringify(sourceCustomerId)}`);
|
|
72
|
+
// Normalized as a STRING, never through Number(): above 2^53 that rounds, and review
|
|
73
|
+
// demonstrated "9007199254740993" keyed as ...992 -- another customer's row, and so another
|
|
74
|
+
// customer's order and invoice handed to the wrong member.
|
|
75
|
+
const digits = raw.replace(/\.0+$/, '').replace(/^0+(?=\d)/, '');
|
|
76
|
+
customerId = digits === '0' ? null : digits;
|
|
77
|
+
}
|
|
78
|
+
// An order that CARRIED an address `normalizeEmail` refused is a different thing
|
|
79
|
+
// from an order placed by a guest, and both end as `buyer-guest`. The outcome partition is
|
|
80
|
+
// unchanged (BUYER_OUTCOMES must keep summing to the order population); the finding rides
|
|
81
|
+
// alongside so the report can count "really a guest" apart from "we had a customer and their
|
|
82
|
+
// address was unusable". An ABSENT email is not a defect and gets no finding, and the address
|
|
83
|
+
// itself is never written down.
|
|
84
|
+
const billingEmailPresent = billingEmail !== undefined && billingEmail !== null && String(billingEmail).trim() !== '';
|
|
85
|
+
if (billingEmailPresent && email === null) {
|
|
86
|
+
findings.push({ code: 'buyer-email-unusable', ...(customerId ? { sourceCustomerId: customerId } : {}), orderEmailPresent: true });
|
|
87
|
+
}
|
|
88
|
+
let contactId = null;
|
|
89
|
+
if (contactCrosswalk && typeof contactCrosswalk.get === 'function') {
|
|
90
|
+
const byCustomer = customerId ? await contactCrosswalk.get(customerId) : null;
|
|
91
|
+
const byEmail = !byCustomer && email ? await contactCrosswalk.get(email) : null;
|
|
92
|
+
const found = byCustomer || byEmail;
|
|
93
|
+
if (found && GUID.test(String(found))) contactId = String(found);
|
|
94
|
+
else if (found) findings.push({ code: 'buyer-contact-id-not-guid', value: String(found).slice(0, 40) });
|
|
95
|
+
}
|
|
96
|
+
const finish = (outcome, memberId) => {
|
|
97
|
+
const buyer = { outcome, memberId: memberId || null, contactId, sourceCustomerId: customerId, email, findings };
|
|
98
|
+
buyer.buyerStamp = computeBuyerStamp(buyer);
|
|
99
|
+
return buyer;
|
|
100
|
+
};
|
|
101
|
+
if (!customerId) return finish(contactId ? OUTCOMES.CONTACT_ONLY : OUTCOMES.GUEST, null);
|
|
102
|
+
if (!memberCrosswalk || typeof memberCrosswalk.get !== 'function') throw new Error('resolveOrderBuyer needs a memberCrosswalk with get(sourceCustomerId) when the order has a customer id');
|
|
103
|
+
const row = await memberCrosswalk.get(customerId);
|
|
104
|
+
if (!row || !row.memberId) {
|
|
105
|
+
findings.push({ code: OUTCOMES.NOT_IMPORTED, sourceCustomerId: customerId });
|
|
106
|
+
return finish(OUTCOMES.NOT_IMPORTED, null);
|
|
107
|
+
}
|
|
108
|
+
if (!GUID.test(String(row.memberId))) {
|
|
109
|
+
findings.push({ code: 'buyer-member-id-not-guid', sourceCustomerId: customerId });
|
|
110
|
+
return finish(OUTCOMES.NOT_IMPORTED, null);
|
|
111
|
+
}
|
|
112
|
+
// Corroboration: the member the crosswalk names must be the person who placed the order. The
|
|
113
|
+
// login email is the identity Create Member deduplicated on; a row whose email disagrees with
|
|
114
|
+
// the order's billing email is a crosswalk pointing at the wrong person, which is the one
|
|
115
|
+
// outcome nothing downstream would catch.
|
|
116
|
+
const loginEmail = normalizeEmail(row.loginEmail);
|
|
117
|
+
if (!email || !loginEmail || email !== loginEmail) {
|
|
118
|
+
findings.push({ code: OUTCOMES.EMAIL_MISMATCH, sourceCustomerId: customerId, orderEmailPresent: Boolean(email), memberEmailPresent: Boolean(loginEmail) });
|
|
119
|
+
return finish(OUTCOMES.EMAIL_MISMATCH, null);
|
|
120
|
+
}
|
|
121
|
+
return finish(OUTCOMES.LINKED, String(row.memberId));
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
// The buyerInfo to put on the Import Order body, from a STAMPED resolver result. Refuses anything
|
|
125
|
+
// else, so a hand-built { memberId } cannot reach the order.
|
|
126
|
+
function buyerInfoFrom(buyer) {
|
|
127
|
+
if (!verifyBuyerStamp(buyer)) throw new Error('buyerInfo must come from resolveOrderBuyer (its stamp did not verify); a hand-built memberId is exactly the wrong-attribution risk this exists to prevent');
|
|
128
|
+
const info = {};
|
|
129
|
+
if (buyer.contactId) info.contactId = buyer.contactId;
|
|
130
|
+
if (buyer.memberId) info.memberId = buyer.memberId;
|
|
131
|
+
return info;
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
// The only keys a mapped order body may carry under buyerInfo BEFORE the composite sets the
|
|
135
|
+
// buyer: an email, and a contactId the contact import resolved. Everything else -- memberId under
|
|
136
|
+
// any spelling, visitorId, snake_case siblings -- is refused, because Wix's proto-JSON accepts
|
|
137
|
+
// `member_id` as readily as `memberId` and a refusal that checks one spelling checks nothing.
|
|
138
|
+
const BODY_BUYER_KEYS = Object.freeze(['contactId', 'email']);
|
|
139
|
+
// The only top-level keys allowed to normalize (letters-only, lowercase) to something containing
|
|
140
|
+
// "buyer" besides the `buyerInfo` container itself: legitimate, distinct Import Order scalars
|
|
141
|
+
// (see domains/ecom/entities/order.json's "scalar/enum fields, no dependency" list --
|
|
142
|
+
// buyerNote/tags/weightUnit/currency/taxIncludedInPrices/attributionSource/buyerLanguage) that
|
|
143
|
+
// order-transform.js's toWixOrder() always sets as an object key, even when its value is
|
|
144
|
+
// `undefined` (e.g. `{ buyerNote: source.customer_note || undefined }` still yields the key).
|
|
145
|
+
// Checked the full sibling list above for this same class of gap: only `buyerNote` and
|
|
146
|
+
// `buyerLanguage` normalize to contain "buyer" (tags/weightUnit/currency/taxIncludedInPrices/
|
|
147
|
+
// attributionSource do not), so those are the only two carve-outs needed here.
|
|
148
|
+
//
|
|
149
|
+
// BUG FIX (2026-09-28): `buyerLanguage` was missing from this set entirely, so a
|
|
150
|
+
// generated order-transform setting it would hit the same false "order/all: 0 landed" failure
|
|
151
|
+
// this guard exists to prevent -- the exact failure this file's other carve-out
|
|
152
|
+
// (`buyerNote`) was already added to fix, just for a sibling scalar this guard never carved out.
|
|
153
|
+
const ALLOWED_BUYER_ADJACENT_KEYS = new Set(['buyernote', 'buyerlanguage']);
|
|
154
|
+
function assertBodyBuyerInfo(order) {
|
|
155
|
+
for (const key of Object.keys(order || {})) {
|
|
156
|
+
if (key === 'buyerInfo') continue;
|
|
157
|
+
// this used to strip every non-letter character
|
|
158
|
+
// (`.replace(/[^a-z]/g, '')`), including digits, so a future `buyerNote2` or `buyer_note_1`
|
|
159
|
+
// normalized to the exact same string as the allowed `buyerNote`/`buyerLanguage` entries and
|
|
160
|
+
// was silently waved through -- the same enumeration-drift bug class that already caused two
|
|
161
|
+
// failures in this file where every order write was refused (`buyerNote`, then `buyerLanguage`).
|
|
162
|
+
// Strip only underscores (the test suite's `buyer_language` spelling must keep passing) and
|
|
163
|
+
// preserve digits, so a genuinely different, digit-bearing field name can never collide with
|
|
164
|
+
// an allowed one.
|
|
165
|
+
const normalized = key.toLowerCase().replace(/_/g, '');
|
|
166
|
+
if (!normalized.includes('buyer')) continue;
|
|
167
|
+
// BUG FIX (2026-09-27): the guard used to test `/buyer/i`
|
|
168
|
+
// against every top-level key, which also matched `buyerNote` and threw for 100% of orders,
|
|
169
|
+
// independent of any real data problem -- the root cause of every "order/all: 0 landed" run
|
|
170
|
+
// while it stood. The fix carves out only that one known-legitimate field by exact normalized name,
|
|
171
|
+
// rather than narrowing to an exact `buyerInfo` match -- a narrower check would have let a
|
|
172
|
+
// smuggled top-level `buyerId`/`buyerMemberId`/bare `buyer` scalar straight through with
|
|
173
|
+
// nothing else in this module (or the Import Order schema) refusing it. Any OTHER key that
|
|
174
|
+
// merely contains "buyer" -- the container under a variant spelling, or a scalar identity
|
|
175
|
+
// field under any name -- is refused; the buyer goes through `buyer` from resolveOrderBuyer
|
|
176
|
+
// and nowhere else.
|
|
177
|
+
if (ALLOWED_BUYER_ADJACENT_KEYS.has(normalized)) continue;
|
|
178
|
+
throw new Error(`order.${key} is not accepted; the buyer goes through \`buyer\` from resolveOrderBuyer`);
|
|
179
|
+
}
|
|
180
|
+
const info = order && order.buyerInfo;
|
|
181
|
+
if (info === undefined || info === null) return;
|
|
182
|
+
if (typeof info !== 'object' || Array.isArray(info)) throw new Error('order.buyerInfo must be an object');
|
|
183
|
+
const bad = Object.keys(info).filter((k) => !BODY_BUYER_KEYS.includes(k));
|
|
184
|
+
if (bad.length > 0) throw new Error(`order.buyerInfo may only carry ${BODY_BUYER_KEYS.join(', ')} before the composite sets the buyer; got ${bad.join(', ')} -- a member id is never the caller's to set`);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
module.exports = { OUTCOMES, BODY_BUYER_KEYS, ALLOWED_BUYER_ADJACENT_KEYS, normalizeEmail, resolveOrderBuyer, buyerInfoFrom, assertBodyBuyerInfo, computeBuyerStamp, verifyBuyerStamp };
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { isBlank } = require('./value-utils.js');
|
|
4
|
+
|
|
5
|
+
// rp-target-wix — the `channelInfo` segment of a POST /ecom/v1/orders/import
|
|
6
|
+
// request body. A small, standalone builder rather than a full order-payload builder because full
|
|
7
|
+
// order assembly (line items, discounts, refunds, tax, shipping) is explicitly out of scope here
|
|
8
|
+
// (left for rp-import-codegen, not yet built) — this covers exactly one piece:
|
|
9
|
+
// always setting a durable pointer back to the source order.
|
|
10
|
+
//
|
|
11
|
+
// `channelInfo.externalOrderId`/`externalOrderUrl` is a real, documented Wix order field
|
|
12
|
+
// ("Reference to an order ID from an external system" — dev.wix.com order object, verified
|
|
13
|
+
// 2026-08-17), not invented for this migration. It matters beyond idempotency: unlike the local
|
|
14
|
+
// crosswalk.ndjson, this is visible to the merchant and support staff directly on the
|
|
15
|
+
// order in the Wix dashboard.
|
|
16
|
+
//
|
|
17
|
+
// NOT runtime-verified: this builder has not itself been sent to a live Import Order call
|
|
18
|
+
// (live verification so far exercised gift-card issuance/redemption, not channelInfo). The
|
|
19
|
+
// shape matches the documented field, but treat it as code-exists-not-runtime-verified until a live Import Order call confirms it.
|
|
20
|
+
|
|
21
|
+
const CHANNEL_TYPE_OTHER_PLATFORM = 'OTHER_PLATFORM';
|
|
22
|
+
|
|
23
|
+
// `order` is the raw WooCommerce order (GET /wc/v3/orders/{id} shape) — only `order.id` is used.
|
|
24
|
+
// `options.externalOrderUrl`, if given, is passed through as-is. Deliberately NOT constructed
|
|
25
|
+
// here: a WooCommerce order's admin edit URL differs between legacy post-based storage
|
|
26
|
+
// (`post.php?post=<id>&action=edit`) and High-Performance Order Storage
|
|
27
|
+
// (`admin.php?page=wc-orders&action=edit&id=<id>`), and only the caller (which already knows the
|
|
28
|
+
// source site's admin base URL and storage mode) can tell which applies — guessing one would risk
|
|
29
|
+
// a dead link on the exact fact this field exists to make trustworthy. The URL is set only if
|
|
30
|
+
// constructible — omitting it here when the caller has nothing to pass is the correct,
|
|
31
|
+
// documented behavior, not a gap.
|
|
32
|
+
function buildChannelInfo(order, options) {
|
|
33
|
+
const { externalOrderUrl } = options || {};
|
|
34
|
+
const notes = [];
|
|
35
|
+
|
|
36
|
+
if (order == null || isBlank(order.id)) {
|
|
37
|
+
return {
|
|
38
|
+
channelInfo: null,
|
|
39
|
+
gaps: [{
|
|
40
|
+
code: 'missing-external-order-id',
|
|
41
|
+
summary: 'order.id is required to build channelInfo.externalOrderId — without it, this order has no durable pointer back to its source.',
|
|
42
|
+
}],
|
|
43
|
+
notes,
|
|
44
|
+
};
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
const channelInfo = {
|
|
48
|
+
type: CHANNEL_TYPE_OTHER_PLATFORM,
|
|
49
|
+
externalOrderId: String(order.id),
|
|
50
|
+
};
|
|
51
|
+
|
|
52
|
+
if (!isBlank(externalOrderUrl)) {
|
|
53
|
+
channelInfo.externalOrderUrl = externalOrderUrl;
|
|
54
|
+
} else {
|
|
55
|
+
notes.push('externalOrderUrl omitted — not constructible from the WooCommerce order alone (legacy post.php vs HPOS wc-orders admin URL shapes differ); pass options.externalOrderUrl when the caller can build it for this site.');
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
return { channelInfo, gaps: [], notes };
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
module.exports = {
|
|
62
|
+
CHANNEL_TYPE_OTHER_PLATFORM,
|
|
63
|
+
buildChannelInfo,
|
|
64
|
+
};
|