@wix/agent-skills 1.33.1 → 1.35.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 +3 -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 +14 -4
- package/skills/wix-manage/references/blog/how-to-create-blog-posts.md +2 -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/events-dashboard-navigation.md +81 -0
- package/skills/wix-manage/references/seo/manage-content-plan.md +207 -222
- package/skills/wix-manage/references/sites/manage-oauth-apps.md +1 -0
- package/skills/wix-manage/references/sites/upload-static-site.md +128 -8
- package/skills/wix-readme/SKILL.md +166 -0
- 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,231 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const { isBlank } = require('./value-utils.js');
|
|
4
|
+
|
|
5
|
+
// rp-target-wix — the DETERMINISTIC WooCommerce tax-rate -> Wix Tax payload builder.
|
|
6
|
+
//
|
|
7
|
+
// Mirrors wix-build.js's role for Stores products: everything here implements, as plain code,
|
|
8
|
+
// the mapping rules already recorded as prose in domains/tax/{domain.json,entities/*.json}. Do
|
|
9
|
+
// not re-derive these rules by LLM judgement per project — read them here, and if a rule changes,
|
|
10
|
+
// change it here and in the domain JSON's mappingGuidance together, since they must stay the same
|
|
11
|
+
// fact stated twice (once for humans, once as code).
|
|
12
|
+
//
|
|
13
|
+
// Scope: Tax Groups / Tax Regions / Manual Tax Mappings only. Tax Settings is a single
|
|
14
|
+
// site-level upsert (see domains/tax/entities/tax-settings.json) with no payload-shaping
|
|
15
|
+
// logic worth a builder — just a boolean passthrough.
|
|
16
|
+
|
|
17
|
+
// ISO 3166-1 alpha-2 countries Wix accepts a `subdivision` for (dev.wix.com Tax Region object,
|
|
18
|
+
// verified live 2026-08-12). Any other country must omit subdivision (or pass '*').
|
|
19
|
+
const SUBDIVISION_ELIGIBLE_COUNTRIES = new Set([
|
|
20
|
+
'AU', 'BR', 'CA', 'FR', 'DE', 'IN', 'IT', 'MX', 'NL', 'PT', 'ES', 'AE', 'GB', 'US',
|
|
21
|
+
]);
|
|
22
|
+
|
|
23
|
+
// Countries Tax Region create rejects outright (dev.wix.com, "embargoed-countries-rejected").
|
|
24
|
+
const EMBARGOED_COUNTRIES = new Set(['CU', 'IR', 'KP', 'SY']);
|
|
25
|
+
|
|
26
|
+
// WooCommerce's `state` column format varies by version/site — sometimes bare ("NY"), sometimes
|
|
27
|
+
// country-prefixed ("US-NY"). Wix stores ISO 3166-2 WITHOUT the country prefix. Never invent a
|
|
28
|
+
// subdivision for a country outside the eligible set — pass none (country-level region) instead.
|
|
29
|
+
function normalizeSubdivision(country, rawState) {
|
|
30
|
+
const countryCode = String(country || '').trim().toUpperCase();
|
|
31
|
+
if (isBlank(rawState)) return undefined;
|
|
32
|
+
if (!SUBDIVISION_ELIGIBLE_COUNTRIES.has(countryCode)) return undefined;
|
|
33
|
+
const raw = String(rawState).trim().toUpperCase();
|
|
34
|
+
const prefix = `${countryCode}-`;
|
|
35
|
+
return raw.startsWith(prefix) ? raw.slice(prefix.length) : raw;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
// WooCommerce `rate` is a PERCENTAGE (e.g. "7.5000"). Wix `taxRate` is a decimal-string FRACTION
|
|
39
|
+
// with at most 6 decimal places (e.g. "0.075"). A number, integer, or percent-string all 400.
|
|
40
|
+
function toWixTaxRateFraction(percentage) {
|
|
41
|
+
const n = Number(percentage);
|
|
42
|
+
if (!Number.isFinite(n)) {
|
|
43
|
+
throw new Error(`toWixTaxRateFraction: "${percentage}" is not a finite number`);
|
|
44
|
+
}
|
|
45
|
+
let fixed = (n / 100).toFixed(6);
|
|
46
|
+
if (fixed.includes('.')) {
|
|
47
|
+
fixed = fixed.replace(/0+$/, '');
|
|
48
|
+
if (fixed.endsWith('.')) fixed += '0';
|
|
49
|
+
}
|
|
50
|
+
return fixed;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// One Wix Tax Region per distinct (country, subdivision) pair — a source can have several rate
|
|
54
|
+
// rows (standard/reduced/zero) sharing one region, which fan out to separate Manual Tax Mappings
|
|
55
|
+
// against that ONE region rather than one region each.
|
|
56
|
+
function groupTaxRatesByRegion(taxRates) {
|
|
57
|
+
const regions = new Map();
|
|
58
|
+
for (const rate of taxRates || []) {
|
|
59
|
+
const country = String(rate.country || '').trim().toUpperCase();
|
|
60
|
+
if (!country) continue;
|
|
61
|
+
const subdivision = normalizeSubdivision(country, rate.state);
|
|
62
|
+
const key = taxRegionDedupeKey({ country, subdivision });
|
|
63
|
+
if (!regions.has(key)) {
|
|
64
|
+
regions.set(key, { country, subdivision, rates: [] });
|
|
65
|
+
}
|
|
66
|
+
regions.get(key).rates.push(rate);
|
|
67
|
+
}
|
|
68
|
+
return [...regions.values()];
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
function taxRegionDedupeKey({ country, subdivision }) {
|
|
72
|
+
return `${String(country || '').trim().toUpperCase()}|${subdivision || ''}`;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function isEmbargoedCountry(country) {
|
|
76
|
+
return EMBARGOED_COUNTRIES.has(String(country || '').trim().toUpperCase());
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// `appId` must be resolved live per site via listTaxCalculators/resolveManualTaxCalculatorAppId
|
|
80
|
+
// in wix-writers.js — never hardcoded here, since it's installation-scoped and differs per site.
|
|
81
|
+
function buildTaxRegionInput({ country, subdivision }, { appId, taxIncludedInPrice = false }) {
|
|
82
|
+
if (!appId) throw new Error('buildTaxRegionInput: appId is required (resolve live, never hardcode)');
|
|
83
|
+
const taxRegion = { country: String(country).trim().toUpperCase(), appId, taxIncludedInPrice };
|
|
84
|
+
if (subdivision) taxRegion.subdivision = subdivision;
|
|
85
|
+
return taxRegion;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
function buildTaxGroupInput({ name }) {
|
|
89
|
+
if (isBlank(name)) throw new Error('buildTaxGroupInput: name is required');
|
|
90
|
+
return { name: String(name).trim() };
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// `taxGroupId`/`taxRegionId` must already exist — resolve both from their own crosswalks before
|
|
94
|
+
// calling. `taxName` is cosmetic (shown at checkout) and never affects the calculated amount.
|
|
95
|
+
function buildManualTaxMappingInput(rate, { taxGroupId, taxRegionId }) {
|
|
96
|
+
if (!taxGroupId) throw new Error('buildManualTaxMappingInput: taxGroupId is required');
|
|
97
|
+
if (!taxRegionId) throw new Error('buildManualTaxMappingInput: taxRegionId is required');
|
|
98
|
+
const mapping = {
|
|
99
|
+
taxGroupId,
|
|
100
|
+
taxRegionId,
|
|
101
|
+
taxRate: toWixTaxRateFraction(rate.rate),
|
|
102
|
+
};
|
|
103
|
+
if (!isBlank(rate.name)) mapping.taxName = String(rate.name).trim();
|
|
104
|
+
return mapping;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// Create Manual Tax Mapping 409s on a duplicate (taxRegionId, taxGroupId, taxName, taxType,
|
|
108
|
+
// jurisdiction, jurisdictionType) — dedupe on that composite key before creating, since
|
|
109
|
+
// WooCommerce rows differing only in `priority` (no Wix equivalent) would otherwise re-collide.
|
|
110
|
+
//
|
|
111
|
+
// LIVE-VERIFIED 2026-08-15: Query Manual Tax Mapping returns the STRING "UNDEFINED" for an unset
|
|
112
|
+
// `jurisdictionType` (not "" and not the field's absence), while a freshly-built mappingInput that
|
|
113
|
+
// never sets the field is plain JS `undefined` — so comparing a fetched mapping against a
|
|
114
|
+
// newly-built one for the same (region, group) 409'd instead of correctly deduping. Normalize both
|
|
115
|
+
// "" and "UNDEFINED" to the same bucket so a fetched existing mapping and a freshly-built one that
|
|
116
|
+
// both mean "no jurisdictionType" produce the same key.
|
|
117
|
+
function normalizeDedupeField(value) {
|
|
118
|
+
const s = String(value || '').trim();
|
|
119
|
+
return s === 'UNDEFINED' ? '' : s;
|
|
120
|
+
}
|
|
121
|
+
function manualTaxMappingDedupeKey({ taxRegionId, taxGroupId, taxName, taxType, jurisdiction, jurisdictionType }) {
|
|
122
|
+
return [
|
|
123
|
+
taxRegionId,
|
|
124
|
+
taxGroupId,
|
|
125
|
+
normalizeDedupeField(taxName),
|
|
126
|
+
normalizeDedupeField(taxType),
|
|
127
|
+
normalizeDedupeField(jurisdiction),
|
|
128
|
+
normalizeDedupeField(jurisdictionType),
|
|
129
|
+
].join('|');
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
// The four Wix "default" tax groups every site has (VERIFIED live 2026-08-12 via
|
|
133
|
+
// List Default Tax Groups: "Shipping and delivery", "Products", "Services", "Cancellation
|
|
134
|
+
// fees" — see tax-group.json's query-tax-groups-excludes-defaults pitfall). WooCommerce has no
|
|
135
|
+
// equivalent split: a `class: "standard"` rate (or a blank class) is the store's ONE general
|
|
136
|
+
// rate, not a products-only rate — WooCommerce's own `shipping` boolean on a tax rate row
|
|
137
|
+
// exists specifically because the rate is meant to reach beyond products. Wix's
|
|
138
|
+
// Products/Shipping and delivery/Services/Cancellation fees groups are BILLING categories, not
|
|
139
|
+
// TAX-RATE categories, so mapping a standard rate to "Products" only silently zero-rates every
|
|
140
|
+
// other category in that region — a group with no manual tax mapping calculates to EXACTLY
|
|
141
|
+
// ZERO tax (VERIFIED live 2026-08-12, see manual-tax-mapping.json's
|
|
142
|
+
// unmapped-tax-group-calculates-to-exactly-zero-tax finding). That is undercharging, not a
|
|
143
|
+
// faithful migration, so a standard-class rate must get one mapping per default group.
|
|
144
|
+
const DEFAULT_GROUP_NAMES = ['Products', 'Shipping and delivery', 'Services', 'Cancellation fees'];
|
|
145
|
+
|
|
146
|
+
// Which already-created Wix tax groups a WooCommerce rate's Manual Tax Mapping(s) should
|
|
147
|
+
// target. `defaultGroups` is List Default Tax Groups' result; `customGroups` is this project's
|
|
148
|
+
// own created-group tracking, each carrying the `sourceTaxClass` it was created for (from
|
|
149
|
+
// planCustomTaxGroups's plan — a plain Query Tax Groups result has no such field, since Wix
|
|
150
|
+
// itself doesn't know why a custom group exists).
|
|
151
|
+
//
|
|
152
|
+
// A `standard` (or blank) class rate targets every DEFAULT group — never a class-specific
|
|
153
|
+
// custom group (a reduced-rate/zero-rate group exists so a product TAGGED with that class gets
|
|
154
|
+
// a different rate than the store's general one, not the same rate broadened everywhere), and
|
|
155
|
+
// never the Tax Exempt group (no mapping is how exempt is represented at all — this falls out
|
|
156
|
+
// naturally here since Tax Exempt's `sourceTaxClass` is null and no rate's class is ever null).
|
|
157
|
+
// A non-standard class rate targets ONLY its own matching custom group.
|
|
158
|
+
//
|
|
159
|
+
// List Default Tax Groups' own schema (dev.wix.com, checked 2026-08-15) has no locale-invariant
|
|
160
|
+
// key for "which billing category is this" — a TaxGroup is only {id, name, revision, dates}, and
|
|
161
|
+
// the docs' own worked example returns a completely different default set ("Standard Tax") than
|
|
162
|
+
// a live site returns, confirming `name` genuinely varies per site/locale and isn't a fixed
|
|
163
|
+
// constant. `name` is matched here anyway because it's the ONLY field the API offers for this —
|
|
164
|
+
// but matching zero (or some but not all four) of DEFAULT_GROUP_NAMES on a translated or
|
|
165
|
+
// differently-configured site must never fall through to a silent partial fan-out: that would
|
|
166
|
+
// reproduce the exact silent-undercharging bug this function exists to fix, just triggered by
|
|
167
|
+
// site language/config instead of an incomplete implementation. Fail loudly instead, so a human
|
|
168
|
+
// resolves the real name mismatch before any mapping is created.
|
|
169
|
+
function groupsForRate(rate, { defaultGroups = [], customGroups = [] } = {}) {
|
|
170
|
+
const taxClass = String(rate?.class || 'standard').trim() || 'standard';
|
|
171
|
+
if (taxClass === 'standard') {
|
|
172
|
+
const matched = defaultGroups.filter((group) => DEFAULT_GROUP_NAMES.includes(String(group?.name || '').trim()));
|
|
173
|
+
if (matched.length !== DEFAULT_GROUP_NAMES.length) {
|
|
174
|
+
const foundNames = matched.map((group) => group.name);
|
|
175
|
+
const missing = DEFAULT_GROUP_NAMES.filter((name) => !foundNames.includes(name));
|
|
176
|
+
throw new Error(
|
|
177
|
+
`groupsForRate: expected all ${DEFAULT_GROUP_NAMES.length} default tax groups (${DEFAULT_GROUP_NAMES.join(', ')}), `
|
|
178
|
+
+ `found only ${matched.length} (missing: ${missing.join(', ')}). This site's default tax group names may be `
|
|
179
|
+
+ 'translated or otherwise non-standard -- resolve the real names via List Default Tax Groups before mapping, '
|
|
180
|
+
+ 'do not silently map to a partial set.',
|
|
181
|
+
);
|
|
182
|
+
}
|
|
183
|
+
return matched;
|
|
184
|
+
}
|
|
185
|
+
return customGroups.filter((group) => group?.sourceTaxClass === taxClass);
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
// Only create a custom tax group when a real per-product signal exists — never speculatively,
|
|
189
|
+
// just because wc/v3/taxes/classes lists WooCommerce's unused defaults (reduced-rate/zero-rate).
|
|
190
|
+
// `products` here is the discovered wc/v3/products record shape (`tax_class`, `tax_status`).
|
|
191
|
+
function planCustomTaxGroups(products) {
|
|
192
|
+
const plans = [];
|
|
193
|
+
const classesInUse = new Set();
|
|
194
|
+
let hasExempt = false;
|
|
195
|
+
for (const product of products || []) {
|
|
196
|
+
const taxClass = String(product.tax_class || 'standard').trim() || 'standard';
|
|
197
|
+
if (taxClass !== 'standard') classesInUse.add(taxClass);
|
|
198
|
+
if (String(product.tax_status || 'taxable').trim() === 'none') hasExempt = true;
|
|
199
|
+
}
|
|
200
|
+
for (const taxClass of classesInUse) {
|
|
201
|
+
plans.push({ name: taxClass, sourceTaxClass: taxClass, reason: 'non-default WooCommerce tax_class actually assigned to at least one product' });
|
|
202
|
+
}
|
|
203
|
+
if (hasExempt) {
|
|
204
|
+
plans.push({ name: 'Tax Exempt', sourceTaxClass: null, exempt: true, reason: 'at least one product has tax_status=none — dedicated group, deliberately no manual tax mapping in any region' });
|
|
205
|
+
}
|
|
206
|
+
return plans;
|
|
207
|
+
}
|
|
208
|
+
|
|
209
|
+
// "No source has any tax-rate rows" is the majority case — the
|
|
210
|
+
// correct action is to create nothing speculative, not to pre-create empty regions/mappings.
|
|
211
|
+
function shouldSkipTaxDomain(taxRates) {
|
|
212
|
+
return !Array.isArray(taxRates) || taxRates.length === 0;
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
module.exports = {
|
|
216
|
+
SUBDIVISION_ELIGIBLE_COUNTRIES,
|
|
217
|
+
EMBARGOED_COUNTRIES,
|
|
218
|
+
normalizeSubdivision,
|
|
219
|
+
toWixTaxRateFraction,
|
|
220
|
+
groupTaxRatesByRegion,
|
|
221
|
+
taxRegionDedupeKey,
|
|
222
|
+
isEmbargoedCountry,
|
|
223
|
+
buildTaxRegionInput,
|
|
224
|
+
buildTaxGroupInput,
|
|
225
|
+
buildManualTaxMappingInput,
|
|
226
|
+
manualTaxMappingDedupeKey,
|
|
227
|
+
DEFAULT_GROUP_NAMES,
|
|
228
|
+
groupsForRate,
|
|
229
|
+
planCustomTaxGroups,
|
|
230
|
+
shouldSkipTaxDomain,
|
|
231
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
const WRITER_ROOT = '/_api/url-mapper/writer/v1/url-mapping';
|
|
4
|
+
|
|
5
|
+
function createUrlMapperTransport({ send, inspectDestination }) {
|
|
6
|
+
if (typeof send !== 'function' || typeof inspectDestination !== 'function') throw new Error('authenticated sender and destination inspection required');
|
|
7
|
+
return {
|
|
8
|
+
inspectDestination,
|
|
9
|
+
async read(key) {
|
|
10
|
+
const result = await send({ method: 'GET', path: `${WRITER_ROOT}/${encodeURIComponent(key)}` });
|
|
11
|
+
if (result && (result.code === 'URL_MAPPER_NOT_FOUND' || result.status === 404)) return null;
|
|
12
|
+
const mapping = result && (result.urlMapping || result.mappingRecord || result);
|
|
13
|
+
if (!mapping || typeof mapping.mapping !== 'string' || typeof mapping.pageIdentifier !== 'string') {
|
|
14
|
+
throw new Error(`URL Mapper read-back for ${key} lacks saved mapping or page identifier`);
|
|
15
|
+
}
|
|
16
|
+
return mapping;
|
|
17
|
+
},
|
|
18
|
+
async write(payload, capability, { mode }) {
|
|
19
|
+
if (!capability || payload.key !== capability.key || payload.urlMapping?.pageIdentifier !== capability.pageIdentifier) {
|
|
20
|
+
throw new Error('URL Mapper payload differs from capability knowledge');
|
|
21
|
+
}
|
|
22
|
+
if (!['create', 'update'].includes(mode)) throw new Error('URL Mapper write mode required');
|
|
23
|
+
return send({ method: mode === 'create' ? 'POST' : 'PUT', path: `${WRITER_ROOT}/${encodeURIComponent(payload.key)}`, body: payload });
|
|
24
|
+
},
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
module.exports = { WRITER_ROOT, createUrlMapperTransport };
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Shared scalar-value helpers used across the rp-target-wix builders (tax-build.js,
|
|
4
|
+
// shipping-build.js, gift-card-build.js, ...). Kept tiny and dependency-free on purpose — this is
|
|
5
|
+
// not a general utils dumping ground, just the one helper that was independently duplicated
|
|
6
|
+
// byte-for-byte in three builder files.
|
|
7
|
+
|
|
8
|
+
function isBlank(value) {
|
|
9
|
+
return value == null || String(value).trim() === '';
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
module.exports = {
|
|
13
|
+
isBlank,
|
|
14
|
+
};
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
// Shared deterministic one-to-one comparison; response order is never an identity.
|
|
4
|
+
function resolveInventoryRows(canonical, target) {
|
|
5
|
+
if (!target || !target.id || !Array.isArray(target.variantsInfo?.variants)) throw new Error('Target product omitted variant identities');
|
|
6
|
+
// Stores V3 may re-case option and choice names on write ("ALTERNATIV" reads back
|
|
7
|
+
// "Alternativ", "10m" reads back "10M"; LIVE-VERIFIED 2026-10-15), so names match
|
|
8
|
+
// case-insensitively. A case-only collision still fails below as an ambiguous match.
|
|
9
|
+
const key = (choices) => JSON.stringify(choices.map(c => [String(c.optionName).toLowerCase(), String(c.choiceName).toLowerCase()]).sort((a, b) => JSON.stringify(a).localeCompare(JSON.stringify(b))));
|
|
10
|
+
const targetByChoices = new Map();
|
|
11
|
+
for (const variant of target.variantsInfo.variants) {
|
|
12
|
+
if (!variant.id) throw new Error('Target variant omitted identity');
|
|
13
|
+
const choices = (variant.choices || []).map(c => {
|
|
14
|
+
if (c.optionChoiceNames) return c.optionChoiceNames;
|
|
15
|
+
const options = (target.options || []).filter(o => o.id === c.optionChoiceIds?.optionId);
|
|
16
|
+
if (options.length !== 1) throw new Error('Target option identity is missing or ambiguous');
|
|
17
|
+
const values = (options[0].choicesSettings?.choices || []).filter(v => v.choiceId === c.optionChoiceIds.choiceId);
|
|
18
|
+
if (values.length !== 1) throw new Error('Target choice identity is missing or ambiguous');
|
|
19
|
+
return { optionName: options[0].name, choiceName: values[0].name };
|
|
20
|
+
});
|
|
21
|
+
const identity = key(choices);
|
|
22
|
+
if (targetByChoices.has(identity)) throw new Error('Ambiguous target variant choices');
|
|
23
|
+
targetByChoices.set(identity, variant.id);
|
|
24
|
+
}
|
|
25
|
+
const matched = new Set();
|
|
26
|
+
return canonical.variants.map(variant => {
|
|
27
|
+
const variantId = targetByChoices.get(key(variant.choices));
|
|
28
|
+
if (!variantId || matched.has(variantId)) throw new Error('Source variant has no unique target match');
|
|
29
|
+
matched.add(variantId);
|
|
30
|
+
return { productId: target.id, variantId, inventory: { inStock: variant.inStock } };
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
module.exports = { resolveInventoryRows };
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
// worse artifact than the twenty lines it replaces. The spec still owns WHICH canonical fields
|
|
14
14
|
// route through them, so coverage reporting stays complete.
|
|
15
15
|
|
|
16
|
+
const { inventoryForVariant } = require('./stores-inventory.js');
|
|
16
17
|
const { STORES_V3_TARGET, CATEGORY_TARGET, CANONICAL_FIELDS } = require('./wix-target-spec.js');
|
|
17
18
|
|
|
18
19
|
// --- coercion --------------------------------------------------------------
|
|
@@ -27,13 +28,51 @@ function money(amount) {
|
|
|
27
28
|
// Wix rejects a slug containing ^!“”$%&'*+,.:;<>=?@\/()[]{}_|` ~#. Vendors mint illegal ones
|
|
28
29
|
// routinely — Shopify turns a decimal size into an underscore (ph-5_5), which 400s the whole
|
|
29
30
|
// bulk batch, so this runs on EVERY slug rather than being a vendor quirk.
|
|
31
|
+
//
|
|
32
|
+
// CORRECTED 2026-09-27: this used to collapse to `[^a-z0-9-]+` — an ASCII allowlist that also
|
|
33
|
+
// stripped every non-Latin letter (Hebrew, Chinese, Cyrillic, ...), silently sanitizing an
|
|
34
|
+
// all-non-Latin slug down to near-empty. Confirmed live: non-Latin (e.g. Hebrew)
|
|
35
|
+
// product slugs written via direct PATCH read back byte-identical (see
|
|
36
|
+
// domains/stores/entities/product.json's wordpress-percent-encoded-slug pitfall, which only
|
|
37
|
+
// documents Wix stripping literal '%', never a non-Latin-letter rejection). Stripping non-Latin
|
|
38
|
+
// letters here would otherwise silently defeat decodeWpSlug's percent-decode for every non-Latin
|
|
39
|
+
// source site: decode restores the real non-Latin text, then this function threw it away again.
|
|
40
|
+
//
|
|
41
|
+
// REWRITTEN 2026-09-29: a hand
|
|
42
|
+
// enumerated punctuation BLOCKLIST is what the comment above still describes Wix's actual rule as
|
|
43
|
+
// -- but successive checks each found a DIFFERENT class of character neither this
|
|
44
|
+
// blocklist nor its two follow-on patches (C0/C1 control bytes, then Cf zero-width/format chars)
|
|
45
|
+
// happened to cover, most recently other Unicode symbols/punctuation entirely outside all three
|
|
46
|
+
// enumerations (™, §, •, an em dash, ½, ...). A blocklist enumeration is structurally incomplete
|
|
47
|
+
// by construction -- there is always a next uncovered class -- so this is now the other shape of
|
|
48
|
+
// the same rule, an ALLOWLIST of what to KEEP: Unicode letters (\p{L}, live-verified safe: the non-Latin
|
|
49
|
+
// slugs above), combining marks (\p{M}, so a decomposed accented letter written as base +
|
|
50
|
+
// combining accent, e.g. "e" + U+0301, survives as one unit instead of splitting into a hyphen),
|
|
51
|
+
// and decimal digits (\p{Nd} specifically, not the broader \p{N} -- Unicode "Other Number" also
|
|
52
|
+
// covers vulgar fractions and Roman numerals like "½"/"Ⅷ", which are exactly the kind of
|
|
53
|
+
// symbol-shaped character this rewrite exists to stop assuming is a safe slug character just
|
|
54
|
+
// because it happens to be a "number"). Everything outside that set -- known punctuation, control
|
|
55
|
+
// bytes, format chars, or a class nobody has hit yet -- becomes a hyphen. An allowlist by category
|
|
56
|
+
// is exhaustive; a blocklist enumeration cannot be, which is the whole reason this needed a 4th
|
|
57
|
+
// patch after three were already shipped.
|
|
58
|
+
const WIX_SLUG_ILLEGAL_CHARS = /[^\p{L}\p{M}\p{Nd}-]/gu;
|
|
30
59
|
function toWixSlug(raw) {
|
|
31
60
|
const slug = String(raw == null ? '' : raw)
|
|
32
61
|
.toLowerCase()
|
|
33
|
-
.replace(/[
|
|
62
|
+
.replace(/[\s_]+/g, '-')
|
|
63
|
+
.replace(WIX_SLUG_ILLEGAL_CHARS, '-')
|
|
34
64
|
.replace(/-{2,}/g, '-')
|
|
35
65
|
.replace(/^-+|-+$/g, '');
|
|
36
|
-
|
|
66
|
+
// Non-empty is not enough: \p{M} combining marks (kept above for a decomposed accented
|
|
67
|
+
// letter, base + combining accent) also cover invisible marks like emoji variation selectors
|
|
68
|
+
// (U+FE0F etc), so an emoji/symbol-only title -- "heavy black heart" + VS-16, say -- can
|
|
69
|
+
// sanitize to a slug made of nothing but an invisible character. Require the survivor to carry
|
|
70
|
+
// at least one actual letter or digit; anything else is the same "no usable slug" case as
|
|
71
|
+
// sanitizing to empty, and gets the same deterministic-source-id-fallback treatment from the
|
|
72
|
+
// caller.
|
|
73
|
+
if (!slug || !/[\p{L}\p{Nd}]/u.test(slug)) {
|
|
74
|
+
throw new Error(`toWixSlug: "${raw}" sanitizes to an empty slug`);
|
|
75
|
+
}
|
|
37
76
|
return slug;
|
|
38
77
|
}
|
|
39
78
|
|
|
@@ -52,6 +91,34 @@ function isBlank(value) {
|
|
|
52
91
|
return value == null || value === '' || (Array.isArray(value) && value.length === 0);
|
|
53
92
|
}
|
|
54
93
|
|
|
94
|
+
// Classification is deliberately based on visible text, while the value returned to Wix retains
|
|
95
|
+
// its source HTML. WooCommerce descriptions regularly contain empty wrappers, , or the
|
|
96
|
+
// stock "Lorem ipsum" filler; importing any of those is equivalent to importing no copy.
|
|
97
|
+
function normalizedDescriptionText(value) {
|
|
98
|
+
return String(value == null ? '' : value)
|
|
99
|
+
.replace(/<!--[\s\S]*?-->/g, ' ')
|
|
100
|
+
.replace(/<[^>]*>/g, ' ')
|
|
101
|
+
.replace(/&(nbsp|#0*160|#x0*a0);/gi, ' ')
|
|
102
|
+
.replace(/&(amp|quot|#0*39|#x0*27);/gi, ' ')
|
|
103
|
+
.normalize('NFKC')
|
|
104
|
+
.replace(/\s+/g, ' ')
|
|
105
|
+
.trim();
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
function isPlaceholderDescription(value) {
|
|
109
|
+
return normalizedDescriptionText(value).toLowerCase().startsWith('lorem ipsum');
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// Wix Stores has one product description, whereas WooCommerce supplies a short, above-the-fold
|
|
113
|
+
// body and a long body. Preserve each non-placeholder source body in source reading order. The
|
|
114
|
+
// horizontal rule is intentional content structure, not a visual approximation with blank lines.
|
|
115
|
+
function composeProductDescription({ description, shortDescription } = {}) {
|
|
116
|
+
const long = normalizedDescriptionText(description) && !isPlaceholderDescription(description) ? description : undefined;
|
|
117
|
+
const short = normalizedDescriptionText(shortDescription) && !isPlaceholderDescription(shortDescription) ? shortDescription : undefined;
|
|
118
|
+
if (short && long) return `${short}\n<hr />\n${long}`;
|
|
119
|
+
return short || long;
|
|
120
|
+
}
|
|
121
|
+
|
|
55
122
|
// --- structural builders ---------------------------------------------------
|
|
56
123
|
// Option definitions are derived from the variants' own choices, so a value that never occurs
|
|
57
124
|
// cannot produce a phantom choice. Order is first-seen, which preserves the source's ordering.
|
|
@@ -73,7 +140,7 @@ function buildOptions(product) {
|
|
|
73
140
|
// A variant references its option choices BY NAME; the API returns server-assigned choice ids.
|
|
74
141
|
// An empty `choices: []` is the correct encoding of "this product has no real options" — it must
|
|
75
142
|
// produce a single default variant, never a synthetic one-choice option.
|
|
76
|
-
function buildVariants(product, { inStock
|
|
143
|
+
function buildVariants(product, { inStock } = {}) {
|
|
77
144
|
return (product.variants || []).map((variant) => {
|
|
78
145
|
const out = {
|
|
79
146
|
visible: coerceBoolean(variant.visible, true),
|
|
@@ -85,8 +152,9 @@ function buildVariants(product, { inStock = true } = {}) {
|
|
|
85
152
|
},
|
|
86
153
|
})),
|
|
87
154
|
price: buildVariantPrice(variant),
|
|
88
|
-
inventoryItem: { inStock },
|
|
89
155
|
};
|
|
156
|
+
const inventory = inventoryForVariant(variant, { inStock });
|
|
157
|
+
if (inventory) out.inventoryItem = inventory;
|
|
90
158
|
if (!isBlank(variant.sku)) out.sku = String(variant.sku);
|
|
91
159
|
// Weight is expected already converted to the site's unit by the adapter; the canonical field
|
|
92
160
|
// carries a number, not a unit-bearing string.
|
|
@@ -127,16 +195,57 @@ function buildVariantPrice(variant) {
|
|
|
127
195
|
// product's main media, so caller-side ordering matters.
|
|
128
196
|
// TRAP: reading these back needs `?fields=MEDIA_ITEMS_INFO`; a plain GET returns only media.main
|
|
129
197
|
// and looks empty even on a successful ingest.
|
|
198
|
+
//
|
|
199
|
+
// The url this emits is a REQUEST TO FETCH, not a stored file. Wix returns 200 before it has
|
|
200
|
+
// fetched anything, and a failed background fetch drops the item and leaves the product with an
|
|
201
|
+
// EMPTY gallery — silently, and after the old image was already replaced. A caller
|
|
202
|
+
// that writes this media and trusts the 200 has not finished; use
|
|
203
|
+
// `patchStoresProductMediaVerified` or run an equivalent read-back sweep.
|
|
204
|
+
//
|
|
205
|
+
// `image.url` MUST arrive already resolved to the source's original, maximum-resolution file and
|
|
206
|
+
// already percent-encoded. Wix copies exactly the one file this URL points at and
|
|
207
|
+
// generates every derivative from it, with no way to raise the quality afterwards — so a crop
|
|
208
|
+
// passed here is that product's permanent ceiling. Do not "helpfully" reach back to a raw source
|
|
209
|
+
// field such as `src` here; the source adapter owns that choice and knows which of the several
|
|
210
|
+
// URLs the source offered is the biggest.
|
|
130
211
|
function buildMedia(product) {
|
|
131
212
|
const items = (product.images || [])
|
|
132
213
|
.filter((image) => image && image.fetchable !== false && !isBlank(image.url))
|
|
133
|
-
.map((image) => ({
|
|
214
|
+
.map((image) => ({
|
|
215
|
+
url: image.url,
|
|
216
|
+
...(isBlank(image.altText) ? {} : { altText: image.altText }),
|
|
217
|
+
...(isBlank(image.displayName) ? {} : { displayName: image.displayName }),
|
|
218
|
+
}));
|
|
134
219
|
return items.length ? { itemsInfo: { items } } : null;
|
|
135
220
|
}
|
|
136
221
|
|
|
137
|
-
//
|
|
138
|
-
//
|
|
139
|
-
|
|
222
|
+
// A product that carries `seoEvidence` (an evidence-contract source such as Yoast on
|
|
223
|
+
// WooCommerce) emits a tag ONLY for a proven per-field override, or for the owner's explicit
|
|
224
|
+
// `materialize` choice via `seoPlan` (rp-target-wix/lib/product-seo.js planProductSeo). Its
|
|
225
|
+
// `seoTitle`/`seoDescription` are ignored: on such sources those are rendered template output,
|
|
226
|
+
// and writing them turns an inherited pattern into a hard per-product override. A proven override
|
|
227
|
+
// is written even when it equals the product name.
|
|
228
|
+
//
|
|
229
|
+
// A product WITHOUT `seoEvidence` is the legacy CSV path (Shopify/Magento/BigCommerce SEO
|
|
230
|
+
// columns are authored per-product values): unchanged, including the duplicate-of-name skip.
|
|
231
|
+
function buildSeoData(product, { seoPlan } = {}) {
|
|
232
|
+
if (product.seoEvidence !== undefined && product.seoEvidence !== null) {
|
|
233
|
+
let tags;
|
|
234
|
+
if (seoPlan) {
|
|
235
|
+
if (seoPlan.productId !== undefined && product.sourceId != null && String(seoPlan.productId) !== String(product.sourceId)) {
|
|
236
|
+
throw new Error(`buildSeoData: seoPlan for ${seoPlan.productId} passed for product ${product.sourceId}`);
|
|
237
|
+
}
|
|
238
|
+
tags = seoPlan.tags;
|
|
239
|
+
} else {
|
|
240
|
+
tags = [];
|
|
241
|
+
const ev = product.seoEvidence;
|
|
242
|
+
if (ev.title && ev.title.state === 'override' && !isBlank(ev.title.value)) tags.push({ type: 'title', children: String(ev.title.value) });
|
|
243
|
+
if (ev.description && ev.description.state === 'override' && !isBlank(ev.description.value)) {
|
|
244
|
+
tags.push({ type: 'meta', props: { name: 'description', content: String(ev.description.value) } });
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return tags.length ? { tags: tags.map((tag) => JSON.parse(JSON.stringify(tag))) } : null;
|
|
248
|
+
}
|
|
140
249
|
const tags = [];
|
|
141
250
|
if (!isBlank(product.seoTitle) && String(product.seoTitle).trim() !== String(product.name || '').trim()) {
|
|
142
251
|
tags.push({ type: 'title', children: String(product.seoTitle) });
|
|
@@ -158,19 +267,56 @@ function setPath(target, path, value) {
|
|
|
158
267
|
cursor[parts[parts.length - 1]] = value;
|
|
159
268
|
}
|
|
160
269
|
|
|
270
|
+
// `sourceDeclaredOptionNames` says which options the SOURCE declared, independent of
|
|
271
|
+
// whether any variant choices could be resolved from them. `choices: []` must keep meaning "no
|
|
272
|
+
// real options", so a product that declared options yet built none is a LOST-options product,
|
|
273
|
+
// and it throws unless the caller passes the user's own recorded decision for THIS product. The
|
|
274
|
+
// decision is bound twice (key and value both name `product.sourceId`), so product A's entry can
|
|
275
|
+
// never be replayed for B, even by rebuilding the key from B's id.
|
|
276
|
+
function isValidOptionLossDecision(product, decision) {
|
|
277
|
+
if (!decision || typeof decision !== 'object') return false;
|
|
278
|
+
const { key, entry } = decision;
|
|
279
|
+
const sourceId = product.sourceId == null ? '' : String(product.sourceId);
|
|
280
|
+
if (!sourceId.trim() || key !== `optionLoss:${sourceId}`) return false;
|
|
281
|
+
if (!entry || typeof entry !== 'object' || entry.source !== 'user') return false;
|
|
282
|
+
const value = entry.value;
|
|
283
|
+
if (!value || typeof value !== 'object') return false;
|
|
284
|
+
if (value.accept !== 'default-variant' || value.sourceProductId !== sourceId) return false;
|
|
285
|
+
const declared = product.sourceDeclaredOptionNames;
|
|
286
|
+
const accepted = value.declaredOptionNames;
|
|
287
|
+
return (
|
|
288
|
+
Array.isArray(accepted) &&
|
|
289
|
+
accepted.length === declared.length &&
|
|
290
|
+
accepted.every((name, index) => name === declared[index])
|
|
291
|
+
);
|
|
292
|
+
}
|
|
293
|
+
|
|
294
|
+
function assertDeclaredOptionsResolved(product, options, optionLossDecision) {
|
|
295
|
+
const declared = product.sourceDeclaredOptionNames;
|
|
296
|
+
if (declared === undefined || declared === null) return;
|
|
297
|
+
if (!Array.isArray(declared)) {
|
|
298
|
+
throw new Error(`buildProduct: "${product.name}" sourceDeclaredOptionNames must be an array of option names`);
|
|
299
|
+
}
|
|
300
|
+
if (!declared.length || options.length) return;
|
|
301
|
+
if (isValidOptionLossDecision(product, optionLossDecision)) return;
|
|
302
|
+
throw new Error(
|
|
303
|
+
`buildProduct: "${product.name}" (${product.sourceId}) declared options [${declared.join(', ')}] but resolved to zero; record the loss in mapping-gaps.json (no valid human optionLoss decision for this product).`,
|
|
304
|
+
);
|
|
305
|
+
}
|
|
306
|
+
|
|
161
307
|
// Builds the Stores V3 create body from a canonical product record.
|
|
162
|
-
//
|
|
163
|
-
//
|
|
164
|
-
|
|
165
|
-
function buildProduct(product, { inStock = true, target = STORES_V3_TARGET } = {}) {
|
|
308
|
+
// Explicit variant stock wins. A caller may supply an approved fallback for missing stock;
|
|
309
|
+
// there is no implicit availability default. Codegen reports variants without stock evidence.
|
|
310
|
+
function buildProduct(product, { inStock, target = STORES_V3_TARGET, optionLossDecision, seoPlan } = {}) {
|
|
166
311
|
if (isBlank(product.name)) throw new Error('buildProduct: product.name is required');
|
|
167
312
|
const body = { ...target.constants };
|
|
313
|
+
const composedDescription = composeProductDescription(product);
|
|
168
314
|
|
|
169
315
|
// Spec-driven scalars.
|
|
170
316
|
for (const [canonicalPath, fieldSpec] of Object.entries(target.fields)) {
|
|
171
317
|
if (!fieldSpec.payloadPath) continue; // structural: handled below
|
|
172
318
|
const key = canonicalPath.replace(/^product\./, '');
|
|
173
|
-
let value = product[key];
|
|
319
|
+
let value = canonicalPath === 'product.description' ? composedDescription : product[key];
|
|
174
320
|
const def = CANONICAL_FIELDS[canonicalPath] || {};
|
|
175
321
|
if (isBlank(value) && def.default !== undefined) value = def.default;
|
|
176
322
|
if (isBlank(value) && typeof value !== 'boolean') continue;
|
|
@@ -189,10 +335,11 @@ function buildProduct(product, { inStock = true, target = STORES_V3_TARGET } = {
|
|
|
189
335
|
|
|
190
336
|
// Structural builders, declared in the spec via `via`.
|
|
191
337
|
const options = buildOptions(product);
|
|
338
|
+
assertDeclaredOptionsResolved(product, options, optionLossDecision);
|
|
192
339
|
if (options.length) body.options = options;
|
|
193
340
|
const media = buildMedia(product);
|
|
194
341
|
if (media) body.media = media;
|
|
195
|
-
const seoData = buildSeoData(product);
|
|
342
|
+
const seoData = buildSeoData(product, { seoPlan });
|
|
196
343
|
if (seoData) body.seoData = seoData;
|
|
197
344
|
body.variantsInfo = { variants: buildVariants(product, { inStock }) };
|
|
198
345
|
if (!body.variantsInfo.variants.length) {
|
|
@@ -204,7 +351,7 @@ function buildProduct(product, { inStock = true, target = STORES_V3_TARGET } = {
|
|
|
204
351
|
// --- category --------------------------------------------------------------
|
|
205
352
|
// Categories are created depth-ascending so a parent id is always resolvable. Dedupe against a
|
|
206
353
|
// live site must key on name + PARENT, never name alone: a real tree repeats a name at different
|
|
207
|
-
// depths (e.g. "
|
|
354
|
+
// depths (e.g. "Accessories" under two different parents).
|
|
208
355
|
function buildCategory(category, { categoryIdByPath = new Map(), target = CATEGORY_TARGET } = {}) {
|
|
209
356
|
if (isBlank(category.name)) throw new Error('buildCategory: category.name is required');
|
|
210
357
|
const body = { ...target.constants };
|
|
@@ -226,7 +373,11 @@ function buildCategory(category, { categoryIdByPath = new Map(), target = CATEGO
|
|
|
226
373
|
module.exports = {
|
|
227
374
|
money,
|
|
228
375
|
toWixSlug,
|
|
376
|
+
WIX_SLUG_ILLEGAL_CHARS,
|
|
229
377
|
coerceBoolean,
|
|
378
|
+
normalizedDescriptionText,
|
|
379
|
+
isPlaceholderDescription,
|
|
380
|
+
composeProductDescription,
|
|
230
381
|
buildOptions,
|
|
231
382
|
buildVariants,
|
|
232
383
|
buildVariantPrice,
|