@stackonward/cli 0.0.1 → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +4588 -205
- package/dist/index.js.map +1 -1
- package/dist/resources/apple/.claude/docs/architecture-template.md +54 -0
- package/dist/resources/apple/.claude/docs/architecture.md +52 -0
- package/dist/resources/apple/.claude/docs/index.md +13 -0
- package/dist/resources/apple/.claude/docs/security-lifecycle.md +57 -0
- package/dist/resources/apple/.claude/docs/stack.md +93 -0
- package/dist/resources/apple/.claude/docs/verification.md +63 -0
- package/dist/resources/apple/AGENTS.md +397 -0
- package/dist/resources/apple/CLAUDE.md +397 -0
- package/dist/resources/apple/Gemfile +2 -0
- package/dist/resources/apple/Gemfile.lock +365 -0
- package/dist/resources/apple/_gitignore +14 -0
- package/dist/resources/apple/fastlane/Fastfile +123 -0
- package/dist/resources/components/nuxt/site-source/app/app.vue +42 -0
- package/dist/resources/components/nuxt/site-source/app/assets/css/site-shell.css +1035 -0
- package/dist/resources/components/nuxt/site-source/app/assets/icons/brand/.gitkeep +0 -0
- package/dist/resources/components/nuxt/site-source/app/assets/icons/common/.gitkeep +0 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ApplicationHeader.vue +35 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ApplicationShell.vue +56 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ApplicationSidebar.vue +40 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/BackToTop.vue +42 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ContentArticlePage.vue +40 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ContentListPage.vue +30 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/CookieConsent.vue +18 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/MarketingFooter.vue +52 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/MarketingHeader.vue +106 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/MarketingShell.vue +35 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/SiteBrand.vue +10 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/StaticPage.vue +21 -0
- package/dist/resources/components/nuxt/site-source/app/components/site/ToastViewport.vue +25 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/BaseButton.vue +86 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/BaseGradientBorder.vue +59 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/BaseModal.vue +131 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/BasePopover.vue +150 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/BaseText.vue +138 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/CheckoutStatus.vue +112 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/CheckoutSummary.vue +172 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/GoogleSignInButton.vue +113 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/InfiniteScroll.vue +123 -0
- package/dist/resources/components/nuxt/site-source/app/components/ui/YoutubeEmbed.vue +126 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useAnalytics.ts +24 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useCheckout.ts +121 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useConsent.ts +31 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useGoogleIdentity.ts +163 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useNavigation.ts +11 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useSeo.ts +33 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useSiteShell.ts +58 -0
- package/dist/resources/components/nuxt/site-source/app/composables/useToasts.ts +48 -0
- package/dist/resources/components/nuxt/site-source/app/layouts/app.vue +5 -0
- package/dist/resources/components/nuxt/site-source/app/layouts/default.vue +5 -0
- package/dist/resources/components/nuxt/site-source/app/plugins/analytics.client.ts +121 -0
- package/dist/resources/components/nuxt/site-source/app/plugins/google-identity.client.ts +24 -0
- package/dist/resources/components/nuxt/site-source/app/theme/accordion.ts +9 -0
- package/dist/resources/components/nuxt/site-source/app/theme/breadcrumb.ts +8 -0
- package/dist/resources/components/nuxt/site-source/app/theme/button.ts +92 -0
- package/dist/resources/components/nuxt/site-source/app/theme/carousel.ts +11 -0
- package/dist/resources/components/nuxt/site-source/app/theme/checkbox.ts +12 -0
- package/dist/resources/components/nuxt/site-source/app/theme/index.ts +30 -0
- package/dist/resources/components/nuxt/site-source/app/theme/input.ts +47 -0
- package/dist/resources/components/nuxt/site-source/app/theme/modal.ts +9 -0
- package/dist/resources/components/nuxt/site-source/app/theme/pagination.ts +6 -0
- package/dist/resources/components/nuxt/site-source/app/theme/select.ts +23 -0
- package/dist/resources/components/nuxt/site-source/app/theme/stepper.ts +10 -0
- package/dist/resources/components/nuxt/site-source/app/theme/toast.ts +8 -0
- package/dist/resources/components/nuxt/site-source/app/theme/tooltip.ts +6 -0
- package/dist/resources/components/nuxt/site-source/app/types/site-shell.ts +85 -0
- package/dist/resources/components/react/ui/Button.tsx +73 -0
- package/dist/resources/components/react/ui/Input.tsx +44 -0
- package/dist/resources/components/registry.json +355 -0
- package/dist/resources/components/vue/feedback/Toast.vue +120 -0
- package/dist/resources/components/vue/feedback/useToast.ts +70 -0
- package/dist/resources/components/vue/media/FileUpload.vue +229 -0
- package/dist/resources/components/vue/media/VideoPlayer.vue +157 -0
- package/dist/resources/components/vue/ui/AppImage.vue +147 -0
- package/dist/resources/components/vue/ui/BottomSheet.vue +217 -0
- package/dist/resources/components/vue/ui/Button.vue +154 -0
- package/dist/resources/components/vue/ui/Card.vue +111 -0
- package/dist/resources/components/vue/ui/Input.vue +113 -0
- package/dist/resources/components/vue/ui/Modal.vue +193 -0
- package/dist/resources/components/vue/ui/ScrollArea.vue +163 -0
- package/dist/resources/components/vue/ui/Tooltip.vue +115 -0
- package/dist/resources/registry.json +158 -0
- package/dist/resources/snippets/node/cache.ts +116 -0
- package/dist/resources/snippets/node/date.ts +126 -0
- package/dist/resources/snippets/node/logger.ts +104 -0
- package/dist/resources/snippets/node/validation.ts +132 -0
- package/dist/resources/snippets/react/useDebounce.ts +90 -0
- package/dist/resources/snippets/registry.json +65 -0
- package/dist/resources/snippets/vue/useAsync.ts +96 -0
- package/dist/resources/snippets/vue/usePagination.ts +102 -0
- package/dist/resources/templates/base/.claude/docs/architecture-template.md +459 -0
- package/dist/resources/templates/base/.claude/docs/architecture.md +137 -0
- package/dist/resources/templates/base/.claude/docs/index.md +42 -0
- package/dist/resources/templates/base/.claude/docs/security-lifecycle.md +129 -0
- package/dist/resources/templates/base/.claude/docs/verification.md +121 -0
- package/dist/resources/templates/base/AGENTS.md +415 -0
- package/dist/resources/templates/base/CLAUDE.md +415 -0
- package/dist/resources/templates/go-backend/.claude/docs/api-design.md +486 -0
- package/dist/resources/templates/go-backend/.claude/docs/architecture-template.md +449 -0
- package/dist/resources/templates/go-backend/.claude/docs/check-list.md +155 -0
- package/dist/resources/templates/go-backend/.claude/docs/database.md +369 -0
- package/dist/resources/templates/go-backend/.claude/docs/e2e-standards.md +161 -0
- package/dist/resources/templates/go-backend/.claude/docs/error-handling.md +558 -0
- package/dist/resources/templates/go-backend/.claude/docs/event-runtime-boundary.md +124 -0
- package/dist/resources/templates/go-backend/.claude/docs/identifier-contract.md +195 -0
- package/dist/resources/templates/go-backend/.claude/docs/index.md +22 -0
- package/dist/resources/templates/go-backend/.claude/docs/logging.md +314 -0
- package/dist/resources/templates/go-backend/.claude/docs/mediagen-provider-onboarding-sop.md +917 -0
- package/dist/resources/templates/go-backend/.claude/docs/mediagen-provider-quick-reference.md +195 -0
- package/dist/resources/templates/go-backend/.claude/docs/module-standards.md +309 -0
- package/dist/resources/templates/go-backend/.claude/docs/openapi-contract.md +141 -0
- package/dist/resources/templates/go-backend/.claude/docs/payment-gateway-onboarding.md +283 -0
- package/dist/resources/templates/go-backend/.claude/docs/platform-boundary.md +191 -0
- package/dist/resources/templates/go-backend/.claude/docs/quality-gates.md +112 -0
- package/dist/resources/templates/go-backend/.dockerignore +6 -0
- package/dist/resources/templates/go-backend/.env.example +13 -0
- package/dist/resources/templates/go-backend/.gitattributes +2 -0
- package/dist/resources/templates/go-backend/AGENTS.md +1139 -0
- package/dist/resources/templates/go-backend/CLAUDE.md +1139 -0
- package/dist/resources/templates/go-backend/Dockerfile +14 -0
- package/dist/resources/templates/go-backend/Makefile +71 -0
- package/dist/resources/templates/go-backend/README.md +66 -0
- package/dist/resources/templates/go-backend/_gitignore +10 -0
- package/dist/resources/templates/go-backend/api/openapi/README.md +29 -0
- package/dist/resources/templates/go-backend/api/openapi/dist/artifact-manifest.json +19 -0
- package/dist/resources/templates/go-backend/api/openapi/dist/conformance-matrix.json +276 -0
- package/dist/resources/templates/go-backend/api/openapi/document.go +30 -0
- package/dist/resources/templates/go-backend/api/openapi/package.json +28 -0
- package/dist/resources/templates/go-backend/api/openapi/pnpm-lock.yaml +3052 -0
- package/dist/resources/templates/go-backend/api/openapi/redocly-source.yaml +18 -0
- package/dist/resources/templates/go-backend/api/openapi/redocly.yaml +8 -0
- package/dist/resources/templates/go-backend/api/openapi/sdk-generators.json +16 -0
- package/dist/resources/templates/go-backend/api/openapi/service-registry.json +39 -0
- package/dist/resources/templates/go-backend/api/openapi/services/product-api/conformance/runtime.arazzo.yaml +65 -0
- package/dist/resources/templates/go-backend/api/openapi/services/product-api/dist/internal.openapi.json +327 -0
- package/dist/resources/templates/go-backend/api/openapi/services/product-api/dist/runtime-contract.json +56 -0
- package/dist/resources/templates/go-backend/api/openapi/services/product-api/openapi.yaml +222 -0
- package/dist/resources/templates/go-backend/api/openapi/services/worker/conformance/runtime.arazzo.yaml +65 -0
- package/dist/resources/templates/go-backend/api/openapi/services/worker/dist/internal.openapi.json +327 -0
- package/dist/resources/templates/go-backend/api/openapi/services/worker/dist/runtime-contract.json +56 -0
- package/dist/resources/templates/go-backend/api/openapi/services/worker/openapi.yaml +222 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/breaking.mjs +416 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/build.mjs +103 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/conformance_coverage.mjs +111 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/contract_compiler.mjs +62 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/contract_policy.mjs +208 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/delegated_contract.mjs +302 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/deterministic_archive.mjs +69 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/documentation_example_privacy.mjs +93 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/documentation_projection.mjs +498 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/documentation_quality.mjs +346 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/git_artifact_history.mjs +188 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/manifest.mjs +170 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/overlay.mjs +98 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/project.mjs +549 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/route_contract.mjs +156 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/runtime_conformance.mjs +193 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/scalar_asset_localization.mjs +164 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/sdk_generator.mjs +229 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/semantic_version.mjs +64 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/service_contract_inputs.mjs +16 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/breaking.test.mjs +365 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/build.test.mjs +42 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/conformance_coverage.test.mjs +88 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/contract_policy.test.mjs +257 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/delegated_contract.test.mjs +205 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/documentation_example_privacy.test.mjs +51 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/documentation_projection.test.mjs +368 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/documentation_quality.test.mjs +151 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/git_artifact_history.test.mjs +60 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/head_policy.test.mjs +8 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/overlay.test.mjs +44 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/projection.test.mjs +270 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/redocly_documentation_rules.test.mjs +146 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/release_manifest.test.mjs +76 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/route_contract.test.mjs +119 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/runtime_conformance.test.mjs +75 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/scalar_asset_localization.test.mjs +50 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/sdk_generator.test.mjs +31 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/semantic_version.test.mjs +60 -0
- package/dist/resources/templates/go-backend/api/openapi/tooling/test/service_contract_inputs.test.mjs +27 -0
- package/dist/resources/templates/go-backend/cmd/internal/runtime/resources.go +125 -0
- package/dist/resources/templates/go-backend/cmd/internal/runtime/runtime.go +102 -0
- package/dist/resources/templates/go-backend/cmd/internal/runtime/runtime_test.go +70 -0
- package/dist/resources/templates/go-backend/cmd/product-api/lifecycle_test.go +58 -0
- package/dist/resources/templates/go-backend/cmd/product-api/main.go +32 -0
- package/dist/resources/templates/go-backend/cmd/product-api/wire.go +13 -0
- package/dist/resources/templates/go-backend/cmd/product-api/wire_gen.go +94 -0
- package/dist/resources/templates/go-backend/cmd/worker/main.go +47 -0
- package/dist/resources/templates/go-backend/cmd/worker/wire.go +14 -0
- package/dist/resources/templates/go-backend/cmd/worker/wire_gen.go +111 -0
- package/dist/resources/templates/go-backend/configs/config.yaml +37 -0
- package/dist/resources/templates/go-backend/deployments/compose.yaml +71 -0
- package/dist/resources/templates/go-backend/docs/openapi-provenance.json +489 -0
- package/dist/resources/templates/go-backend/docs/runtime-provenance.json +175 -0
- package/dist/resources/templates/go-backend/docs/source-provenance.json +3568 -0
- package/dist/resources/templates/go-backend/docs/standards-provenance.json +1624 -0
- package/dist/resources/templates/go-backend/go.mod +256 -0
- package/dist/resources/templates/go-backend/go.sum +805 -0
- package/dist/resources/templates/go-backend/internal/common/canonicaljson/canonical.go +370 -0
- package/dist/resources/templates/go-backend/internal/common/canonicaljson/canonical_test.go +223 -0
- package/dist/resources/templates/go-backend/internal/common/checkoutbff/contracts.go +125 -0
- package/dist/resources/templates/go-backend/internal/common/checkoutbff/platform_client.go +212 -0
- package/dist/resources/templates/go-backend/internal/common/checkoutbff/platform_client_test.go +319 -0
- package/dist/resources/templates/go-backend/internal/common/contentaccess/contentaccess.go +50 -0
- package/dist/resources/templates/go-backend/internal/common/contracts/contact.go +85 -0
- package/dist/resources/templates/go-backend/internal/common/ctxutil/identity.go +20 -0
- package/dist/resources/templates/go-backend/internal/common/ctxutil/product.go +53 -0
- package/dist/resources/templates/go-backend/internal/common/enumdomain/payment.go +12 -0
- package/dist/resources/templates/go-backend/internal/common/enums/dto_admin.go +9 -0
- package/dist/resources/templates/go-backend/internal/common/enums/enum.go +1247 -0
- package/dist/resources/templates/go-backend/internal/common/enums/handler_admin.go +66 -0
- package/dist/resources/templates/go-backend/internal/common/enums/module.go +46 -0
- package/dist/resources/templates/go-backend/internal/common/enums/provider.go +10 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register.go +11 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_audit.go +274 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_command_replay.go +12 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_config.go +27 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_locale.go +37 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_ops.go +14 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_outbox.go +15 -0
- package/dist/resources/templates/go-backend/internal/common/enums/register_rule_expression.go +63 -0
- package/dist/resources/templates/go-backend/internal/common/enums/registry.go +77 -0
- package/dist/resources/templates/go-backend/internal/common/httporigin/origin.go +62 -0
- package/dist/resources/templates/go-backend/internal/common/httporigin/origin_test.go +38 -0
- package/dist/resources/templates/go-backend/internal/common/iamcredential/plaintext.go +35 -0
- package/dist/resources/templates/go-backend/internal/common/iamcredential/plaintext_test.go +29 -0
- package/dist/resources/templates/go-backend/internal/common/iamscope/scope.go +212 -0
- package/dist/resources/templates/go-backend/internal/common/iamscope/scope_binding.go +26 -0
- package/dist/resources/templates/go-backend/internal/common/iamscope/scope_filter.go +173 -0
- package/dist/resources/templates/go-backend/internal/common/iamscope/scope_filter_test.go +279 -0
- package/dist/resources/templates/go-backend/internal/common/internalapi/authorization_details.go +10 -0
- package/dist/resources/templates/go-backend/internal/common/internalapi/route_permission_policies.go +660 -0
- package/dist/resources/templates/go-backend/internal/common/internalapi/route_permission_policies_test.go +331 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/audience_token_source.go +166 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/bootstrap_token_exchanger.go +183 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/bound_service_token_signer.go +52 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/delegated_access_token_exchanger.go +189 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/delegated_access_token_exchanger_test.go +159 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/product_scoped_service_token_signer.go +92 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/provider.go +25 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/request_signer.go +86 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/resolver.go +69 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/resolver_test.go +42 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/route_scope.go +95 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/route_scope_test.go +78 -0
- package/dist/resources/templates/go-backend/internal/common/internalservice/service_identity_test.go +387 -0
- package/dist/resources/templates/go-backend/internal/common/jsonschema/compiler.go +100 -0
- package/dist/resources/templates/go-backend/internal/common/jsonschema/compiler_test.go +41 -0
- package/dist/resources/templates/go-backend/internal/common/jwksapi/handler.go +83 -0
- package/dist/resources/templates/go-backend/internal/common/jwksapi/handler_test.go +104 -0
- package/dist/resources/templates/go-backend/internal/common/locale/locale.go +145 -0
- package/dist/resources/templates/go-backend/internal/common/locale/locale_test.go +75 -0
- package/dist/resources/templates/go-backend/internal/common/mediaref/mediaref.go +54 -0
- package/dist/resources/templates/go-backend/internal/common/mediaref/mediaref_test.go +77 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/apikey_auth.go +320 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/apikey_throttle.go +158 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/auth.go +40 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/auth_test.go +50 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/client_context.go +86 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/cors.go +68 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/event_context.go +18 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/gateway_identity.go +279 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/helpers.go +159 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/iam_delegated_route_permission.go +171 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/iam_delegated_token_auth.go +151 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/iam_delegated_token_auth_test.go +99 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/iam_service_identity.go +138 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/iam_service_token_auth.go +74 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/idempotent.go +273 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/idempotent_test.go +83 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/internal_route_permission.go +45 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/internal_route_permission_test.go +186 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/logging.go +191 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/metrics.go +45 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/middleware_test.go +1516 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/principal_context.go +160 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/principal_context_test.go +355 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/product_context.go +100 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/recovery.go +40 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/referral_attribution.go +178 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/requestid.go +48 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/resource_permission.go +790 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/resource_permission_test.go +440 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/service_credential_auth.go +67 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/tenant.go +148 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/throttle.go +310 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/trusted_client_ip.go +23 -0
- package/dist/resources/templates/go-backend/internal/common/middleware/trusted_client_ip_test.go +60 -0
- package/dist/resources/templates/go-backend/internal/common/money/currency.go +25 -0
- package/dist/resources/templates/go-backend/internal/common/money/errors.go +23 -0
- package/dist/resources/templates/go-backend/internal/common/money/format.go +123 -0
- package/dist/resources/templates/go-backend/internal/common/money/format_test.go +204 -0
- package/dist/resources/templates/go-backend/internal/common/money/gateway.go +144 -0
- package/dist/resources/templates/go-backend/internal/common/money/gateway_test.go +165 -0
- package/dist/resources/templates/go-backend/internal/common/money/rounding.go +56 -0
- package/dist/resources/templates/go-backend/internal/common/money/rounding_test.go +51 -0
- package/dist/resources/templates/go-backend/internal/common/principal/context.go +56 -0
- package/dist/resources/templates/go-backend/internal/common/principal/principal.go +49 -0
- package/dist/resources/templates/go-backend/internal/common/productcode/code.go +24 -0
- package/dist/resources/templates/go-backend/internal/common/productcode/code_test.go +35 -0
- package/dist/resources/templates/go-backend/internal/common/providerconfig/schema.go +577 -0
- package/dist/resources/templates/go-backend/internal/common/providerconfig/schema_test.go +47 -0
- package/dist/resources/templates/go-backend/internal/common/requestprivacy/request.go +246 -0
- package/dist/resources/templates/go-backend/internal/common/requestprivacy/request_test.go +170 -0
- package/dist/resources/templates/go-backend/internal/common/response/pagination.go +60 -0
- package/dist/resources/templates/go-backend/internal/common/response/response.go +110 -0
- package/dist/resources/templates/go-backend/internal/common/response/response_test.go +463 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/ast.go +141 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/ast_test.go +81 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/canonical.go +184 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/canonical_test.go +319 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/decoder.go +555 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/decoder_test.go +260 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/errors.go +55 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/evaluator.go +96 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/evaluator_test.go +220 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/fuzz_test.go +116 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/limits.go +331 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/schema.go +412 -0
- package/dist/resources/templates/go-backend/internal/common/ruleexpression/schema_test.go +164 -0
- package/dist/resources/templates/go-backend/internal/common/runtimeinput/runtime_input.go +627 -0
- package/dist/resources/templates/go-backend/internal/common/runtimeinput/runtime_input_test.go +245 -0
- package/dist/resources/templates/go-backend/internal/common/semver/errors.go +6 -0
- package/dist/resources/templates/go-backend/internal/common/semver/semver.go +125 -0
- package/dist/resources/templates/go-backend/internal/common/semver/semver_test.go +205 -0
- package/dist/resources/templates/go-backend/internal/common/serviceidentity/audience.go +48 -0
- package/dist/resources/templates/go-backend/internal/common/serviceidentity/audience_test.go +35 -0
- package/dist/resources/templates/go-backend/internal/common/serviceidentity/resource_identifier.go +33 -0
- package/dist/resources/templates/go-backend/internal/common/serviceidentity/resource_identifier_test.go +32 -0
- package/dist/resources/templates/go-backend/internal/common/tradeno/generator.go +99 -0
- package/dist/resources/templates/go-backend/internal/common/tradeno/generator_test.go +396 -0
- package/dist/resources/templates/go-backend/internal/common/tradeno/prefix.go +247 -0
- package/dist/resources/templates/go-backend/internal/common/types/asset_url.go +11 -0
- package/dist/resources/templates/go-backend/internal/common/types/billing.go +89 -0
- package/dist/resources/templates/go-backend/internal/common/types/billing_test.go +77 -0
- package/dist/resources/templates/go-backend/internal/common/types/country.go +74 -0
- package/dist/resources/templates/go-backend/internal/common/types/country_test.go +28 -0
- package/dist/resources/templates/go-backend/internal/common/types/currency.go +60 -0
- package/dist/resources/templates/go-backend/internal/common/types/identifiers.go +41 -0
- package/dist/resources/templates/go-backend/internal/common/types/operator.go +28 -0
- package/dist/resources/templates/go-backend/internal/common/types/subscription_entitlement.go +24 -0
- package/dist/resources/templates/go-backend/internal/common/types/subscription_entitlement_test.go +35 -0
- package/dist/resources/templates/go-backend/internal/common/types/tier.go +72 -0
- package/dist/resources/templates/go-backend/internal/common/types/types.go +411 -0
- package/dist/resources/templates/go-backend/internal/common/types/types_test.go +295 -0
- package/dist/resources/templates/go-backend/internal/common/utils/constants.go +100 -0
- package/dist/resources/templates/go-backend/internal/common/utils/crypto.go +158 -0
- package/dist/resources/templates/go-backend/internal/common/utils/crypto_test.go +345 -0
- package/dist/resources/templates/go-backend/internal/common/utils/duration.go +25 -0
- package/dist/resources/templates/go-backend/internal/common/utils/helpers.go +18 -0
- package/dist/resources/templates/go-backend/internal/common/utils/json.go +62 -0
- package/dist/resources/templates/go-backend/internal/common/utils/json_test.go +76 -0
- package/dist/resources/templates/go-backend/internal/common/utils/pagination.go +51 -0
- package/dist/resources/templates/go-backend/internal/common/utils/pagination_test.go +45 -0
- package/dist/resources/templates/go-backend/internal/common/utils/pointer.go +107 -0
- package/dist/resources/templates/go-backend/internal/common/utils/pointer_test.go +15 -0
- package/dist/resources/templates/go-backend/internal/common/utils/slice.go +24 -0
- package/dist/resources/templates/go-backend/internal/common/utils/snowflake.go +110 -0
- package/dist/resources/templates/go-backend/internal/common/utils/snowflake_test.go +316 -0
- package/dist/resources/templates/go-backend/internal/common/utils/string.go +16 -0
- package/dist/resources/templates/go-backend/internal/common/utils/timefmt.go +42 -0
- package/dist/resources/templates/go-backend/internal/common/validator/validator.go +136 -0
- package/dist/resources/templates/go-backend/internal/common/validator/validator_test.go +240 -0
- package/dist/resources/templates/go-backend/internal/common/youtubeapi/client.go +224 -0
- package/dist/resources/templates/go-backend/internal/core/apicontract/document.go +269 -0
- package/dist/resources/templates/go-backend/internal/core/apicontract/document_test.go +104 -0
- package/dist/resources/templates/go-backend/internal/core/apicontract/route_validator.go +78 -0
- package/dist/resources/templates/go-backend/internal/core/apicontract/route_validator_test.go +108 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/assets/scalar-api-reference.js +2385 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/assets/scalar-api-reference.metadata.json +10 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/route.go +107 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/route_test.go +200 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/scalar.go +117 -0
- package/dist/resources/templates/go-backend/internal/core/apidocs/scalar_test.go +99 -0
- package/dist/resources/templates/go-backend/internal/core/audit/access_log_policy.go +91 -0
- package/dist/resources/templates/go-backend/internal/core/audit/access_log_policy_test.go +51 -0
- package/dist/resources/templates/go-backend/internal/core/audit/actor_resolver.go +36 -0
- package/dist/resources/templates/go-backend/internal/core/audit/constants.go +30 -0
- package/dist/resources/templates/go-backend/internal/core/audit/context.go +119 -0
- package/dist/resources/templates/go-backend/internal/core/audit/context_test.go +310 -0
- package/dist/resources/templates/go-backend/internal/core/audit/dto.go +468 -0
- package/dist/resources/templates/go-backend/internal/core/audit/dto_admin.go +172 -0
- package/dist/resources/templates/go-backend/internal/core/audit/enum.go +460 -0
- package/dist/resources/templates/go-backend/internal/core/audit/enum_test.go +314 -0
- package/dist/resources/templates/go-backend/internal/core/audit/errors.go +9 -0
- package/dist/resources/templates/go-backend/internal/core/audit/handler.go +568 -0
- package/dist/resources/templates/go-backend/internal/core/audit/listener.go +319 -0
- package/dist/resources/templates/go-backend/internal/core/audit/listener_test.go +98 -0
- package/dist/resources/templates/go-backend/internal/core/audit/middleware.go +669 -0
- package/dist/resources/templates/go-backend/internal/core/audit/middleware_test.go +268 -0
- package/dist/resources/templates/go-backend/internal/core/audit/model.go +306 -0
- package/dist/resources/templates/go-backend/internal/core/audit/partition_job.go +316 -0
- package/dist/resources/templates/go-backend/internal/core/audit/ports.go +9 -0
- package/dist/resources/templates/go-backend/internal/core/audit/provider.go +30 -0
- package/dist/resources/templates/go-backend/internal/core/audit/repository.go +1007 -0
- package/dist/resources/templates/go-backend/internal/core/audit/repository_test.go +934 -0
- package/dist/resources/templates/go-backend/internal/core/audit/router.go +85 -0
- package/dist/resources/templates/go-backend/internal/core/audit/service.go +770 -0
- package/dist/resources/templates/go-backend/internal/core/audit/service_test.go +331 -0
- package/dist/resources/templates/go-backend/internal/core/audit/vo_admin.go +475 -0
- package/dist/resources/templates/go-backend/internal/core/cache/config.go +30 -0
- package/dist/resources/templates/go-backend/internal/core/cache/key.go +41 -0
- package/dist/resources/templates/go-backend/internal/core/cache/key_test.go +62 -0
- package/dist/resources/templates/go-backend/internal/core/cache/l1.go +153 -0
- package/dist/resources/templates/go-backend/internal/core/cache/l1_test.go +212 -0
- package/dist/resources/templates/go-backend/internal/core/cache/manager.go +278 -0
- package/dist/resources/templates/go-backend/internal/core/cache/manager_provider.go +24 -0
- package/dist/resources/templates/go-backend/internal/core/cache/metrics.go +126 -0
- package/dist/resources/templates/go-backend/internal/core/cache/namespace.go +46 -0
- package/dist/resources/templates/go-backend/internal/core/cache/namespace_test.go +90 -0
- package/dist/resources/templates/go-backend/internal/core/cache/options.go +39 -0
- package/dist/resources/templates/go-backend/internal/core/cache/options_test.go +96 -0
- package/dist/resources/templates/go-backend/internal/core/cache/redis.go +311 -0
- package/dist/resources/templates/go-backend/internal/core/cache/redis_test.go +51 -0
- package/dist/resources/templates/go-backend/internal/core/cache/serializer.go +31 -0
- package/dist/resources/templates/go-backend/internal/core/cache/serializer_test.go +139 -0
- package/dist/resources/templates/go-backend/internal/core/cache/singleflight.go +53 -0
- package/dist/resources/templates/go-backend/internal/core/cache/singleflight_test.go +211 -0
- package/dist/resources/templates/go-backend/internal/core/cache/warming.go +86 -0
- package/dist/resources/templates/go-backend/internal/core/clock/clock.go +66 -0
- package/dist/resources/templates/go-backend/internal/core/clock/clock_test.go +26 -0
- package/dist/resources/templates/go-backend/internal/core/clock/runtime_clock.go +283 -0
- package/dist/resources/templates/go-backend/internal/core/clock/runtime_clock_test.go +98 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/errors.go +6 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/model.go +90 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/model_test.go +79 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/namespace.go +7 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/persistence.go +269 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/persistence_test.go +185 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/provider.go +9 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/repository.go +22 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/service.go +853 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/service_persistence_test.go +432 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/service_test.go +891 -0
- package/dist/resources/templates/go-backend/internal/core/commandreplay/types.go +121 -0
- package/dist/resources/templates/go-backend/internal/core/config/config.go +2069 -0
- package/dist/resources/templates/go-backend/internal/core/config/config_test.go +1122 -0
- package/dist/resources/templates/go-backend/internal/core/config/contract/contract_test.go +388 -0
- package/dist/resources/templates/go-backend/internal/core/config/contract/docs.go +198 -0
- package/dist/resources/templates/go-backend/internal/core/config/contract/verify.go +424 -0
- package/dist/resources/templates/go-backend/internal/core/config/enum.go +46 -0
- package/dist/resources/templates/go-backend/internal/core/config/metadata.go +717 -0
- package/dist/resources/templates/go-backend/internal/core/config/metadata_test.go +228 -0
- package/dist/resources/templates/go-backend/internal/core/config/product_admin_config_test.go +210 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/aes_gcm.go +111 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/aes_gcm_test.go +364 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/encryptor.go +12 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/envelope_encryptor.go +134 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/envelope_encryptor_test.go +118 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/pem.go +112 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/pem_test.go +44 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/provider.go +130 -0
- package/dist/resources/templates/go-backend/internal/core/crypto/provider_test.go +92 -0
- package/dist/resources/templates/go-backend/internal/core/database/base_model.go +24 -0
- package/dist/resources/templates/go-backend/internal/core/database/clickhouse.go +121 -0
- package/dist/resources/templates/go-backend/internal/core/database/database.go +112 -0
- package/dist/resources/templates/go-backend/internal/core/database/database_logger_test.go +95 -0
- package/dist/resources/templates/go-backend/internal/core/database/errors.go +25 -0
- package/dist/resources/templates/go-backend/internal/core/database/metrics_plugin.go +105 -0
- package/dist/resources/templates/go-backend/internal/core/database/pool_collector.go +71 -0
- package/dist/resources/templates/go-backend/internal/core/database/read_replica.go +520 -0
- package/dist/resources/templates/go-backend/internal/core/database/transaction.go +170 -0
- package/dist/resources/templates/go-backend/internal/core/database/transaction_test.go +282 -0
- package/dist/resources/templates/go-backend/internal/core/distlock/lock.go +353 -0
- package/dist/resources/templates/go-backend/internal/core/distlock/lock_test.go +106 -0
- package/dist/resources/templates/go-backend/internal/core/errors/handler.go +189 -0
- package/dist/resources/templates/go-backend/internal/core/errors/handler_test.go +515 -0
- package/dist/resources/templates/go-backend/internal/core/eventbus/eventbus.go +667 -0
- package/dist/resources/templates/go-backend/internal/core/eventbus/eventbus_test.go +792 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/noop.go +22 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/provider.go +20 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/publisher.go +38 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/redis.go +109 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/routing.go +104 -0
- package/dist/resources/templates/go-backend/internal/core/eventstream/routing_test.go +71 -0
- package/dist/resources/templates/go-backend/internal/core/geoip/model.go +19 -0
- package/dist/resources/templates/go-backend/internal/core/geoip/service.go +88 -0
- package/dist/resources/templates/go-backend/internal/core/health/health.go +333 -0
- package/dist/resources/templates/go-backend/internal/core/health/health_test.go +27 -0
- package/dist/resources/templates/go-backend/internal/core/httpclient/client.go +772 -0
- package/dist/resources/templates/go-backend/internal/core/httpclient/client_test.go +287 -0
- package/dist/resources/templates/go-backend/internal/core/httpclient/download.go +578 -0
- package/dist/resources/templates/go-backend/internal/core/httpclient/download_test.go +374 -0
- package/dist/resources/templates/go-backend/internal/core/jwtkeyring/jwk.go +38 -0
- package/dist/resources/templates/go-backend/internal/core/jwtkeyring/keyring.go +144 -0
- package/dist/resources/templates/go-backend/internal/core/jwtkeyring/keyring_test.go +128 -0
- package/dist/resources/templates/go-backend/internal/core/jwtkeyring/registry.go +60 -0
- package/dist/resources/templates/go-backend/internal/core/logger/logger.go +53 -0
- package/dist/resources/templates/go-backend/internal/core/logger/logger_test.go +194 -0
- package/dist/resources/templates/go-backend/internal/core/observability/metrics.go +358 -0
- package/dist/resources/templates/go-backend/internal/core/observability/sentry.go +445 -0
- package/dist/resources/templates/go-backend/internal/core/observability/sentry_privacy_test.go +175 -0
- package/dist/resources/templates/go-backend/internal/core/observability/tracing.go +187 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/model.go +314 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/model_test.go +77 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/persistence.go +51 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/provider.go +23 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/relay.go +1138 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/relay_postgres_test.go +257 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/relay_test.go +690 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/rescheduler.go +164 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/rescheduler_test.go +209 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/writer.go +249 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/writer_postgres_test.go +170 -0
- package/dist/resources/templates/go-backend/internal/core/outbox/writer_test.go +123 -0
- package/dist/resources/templates/go-backend/internal/core/provider.go +198 -0
- package/dist/resources/templates/go-backend/internal/core/queue/metrics_middleware.go +38 -0
- package/dist/resources/templates/go-backend/internal/core/queue/metrics_middleware_test.go +12 -0
- package/dist/resources/templates/go-backend/internal/core/queue/queue.go +288 -0
- package/dist/resources/templates/go-backend/internal/core/queue/queue_test.go +159 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/bulkhead.go +514 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/bulkhead_test.go +984 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/circuitbreaker.go +358 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/circuitbreaker_test.go +788 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/retry.go +318 -0
- package/dist/resources/templates/go-backend/internal/core/resilience/retry_test.go +735 -0
- package/dist/resources/templates/go-backend/internal/core/schedule/recorder.go +305 -0
- package/dist/resources/templates/go-backend/internal/core/schedule/run_context.go +124 -0
- package/dist/resources/templates/go-backend/internal/core/schedule/run_context_test.go +85 -0
- package/dist/resources/templates/go-backend/internal/core/schedule/scheduler.go +1589 -0
- package/dist/resources/templates/go-backend/internal/core/schedule/scheduler_control_test.go +808 -0
- package/dist/resources/templates/go-backend/internal/core/storage/oss_provider.go +398 -0
- package/dist/resources/templates/go-backend/internal/core/storage/oss_provider_test.go +89 -0
- package/dist/resources/templates/go-backend/internal/core/storage/path.go +110 -0
- package/dist/resources/templates/go-backend/internal/core/storage/path_test.go +301 -0
- package/dist/resources/templates/go-backend/internal/core/storage/s3_provider.go +489 -0
- package/dist/resources/templates/go-backend/internal/core/storage/s3_provider_test.go +60 -0
- package/dist/resources/templates/go-backend/internal/core/storage/storage.go +268 -0
- package/dist/resources/templates/go-backend/internal/core/storage/validation.go +225 -0
- package/dist/resources/templates/go-backend/internal/core/storage/validation_test.go +495 -0
- package/dist/resources/templates/go-backend/internal/core/temporal/logger.go +38 -0
- package/dist/resources/templates/go-backend/internal/core/temporal/provider.go +126 -0
- package/dist/resources/templates/go-backend/internal/core/temporal/provider_test.go +67 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/client.go +282 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/client_test.go +81 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/config.go +58 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/handler.go +53 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/hub.go +269 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/message.go +273 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/notifier.go +92 -0
- package/dist/resources/templates/go-backend/internal/core/websocket/provider.go +33 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/action.go +77 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/action_test.go +238 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/condition.go +107 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/decision.go +256 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/enum.go +643 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/errors.go +102 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/principal_record.go +21 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/product_context.go +486 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/resource.go +215 -0
- package/dist/resources/templates/go-backend/internal/integrations/onex/iam/resource_test.go +242 -0
- package/dist/resources/templates/go-backend/internal/products/README.md +5 -0
- package/dist/resources/templates/go-backend/internal/sharedevents/README.md +5 -0
- package/dist/resources/templates/go-backend/migrations/000001_infrastructure.down.sql +13 -0
- package/dist/resources/templates/go-backend/migrations/000001_infrastructure.up.sql +886 -0
- package/dist/resources/templates/go-backend/pkg/apierror/error.go +327 -0
- package/dist/resources/templates/go-backend/pkg/apierror/error_code.go +65 -0
- package/dist/resources/templates/go-backend/pkg/apierror/error_test.go +41 -0
- package/dist/resources/templates/go-backend/pkg/apierror/error_type.go +14 -0
- package/dist/resources/templates/go-backend/pkg/apierror/http_response.go +216 -0
- package/dist/resources/templates/go-backend/pkg/apierror/http_response_test.go +216 -0
- package/dist/resources/templates/go-backend/scripts/check-openapi-clean-deletion.sh +54 -0
- package/dist/resources/templates/go-backend/scripts/test-migrations.sh +32 -0
- package/dist/resources/templates/go-backend/tests/infrastructure.sql +69 -0
- package/dist/resources/templates/mcp-server/.claude/docs/stack.md +338 -0
- package/dist/resources/templates/mcp-server/.editorconfig +13 -0
- package/dist/resources/templates/mcp-server/.env.example +8 -0
- package/dist/resources/templates/mcp-server/.github/ISSUE_TEMPLATE/bug_report.yml +104 -0
- package/dist/resources/templates/mcp-server/.github/ISSUE_TEMPLATE/feature_request.yml +54 -0
- package/dist/resources/templates/mcp-server/.github/PULL_REQUEST_TEMPLATE.md +36 -0
- package/dist/resources/templates/mcp-server/.github/workflows/ci.yml +78 -0
- package/dist/resources/templates/mcp-server/.husky/commit-msg +1 -0
- package/dist/resources/templates/mcp-server/.husky/pre-commit +1 -0
- package/dist/resources/templates/mcp-server/.lintstagedrc.json +4 -0
- package/dist/resources/templates/mcp-server/.nvmrc +1 -0
- package/dist/resources/templates/mcp-server/.prettierrc +8 -0
- package/dist/resources/templates/mcp-server/CONTRIBUTING.md +184 -0
- package/dist/resources/templates/mcp-server/Dockerfile +23 -0
- package/dist/resources/templates/mcp-server/LICENSE +21 -0
- package/dist/resources/templates/mcp-server/README.md +123 -0
- package/dist/resources/templates/mcp-server/_gitignore +26 -0
- package/dist/resources/templates/mcp-server/commitlint.config.js +24 -0
- package/dist/resources/templates/mcp-server/eslint.config.js +30 -0
- package/dist/resources/templates/mcp-server/package.json +72 -0
- package/dist/resources/templates/mcp-server/src/index.ts +27 -0
- package/dist/resources/templates/mcp-server/src/resources.ts +33 -0
- package/dist/resources/templates/mcp-server/src/services/.gitkeep +0 -0
- package/dist/resources/templates/mcp-server/src/tools.ts +43 -0
- package/dist/resources/templates/mcp-server/src/types/index.ts +19 -0
- package/dist/resources/templates/mcp-server/src/utils/index.ts +31 -0
- package/dist/resources/templates/mcp-server/tsconfig.json +22 -0
- package/dist/resources/templates/mcp-server/tsup.config.ts +14 -0
- package/dist/resources/templates/mcp-server/vitest.config.ts +15 -0
- package/dist/resources/templates/nuxt/.claude/docs/stack.md +666 -0
- package/dist/resources/templates/nuxt/.editorconfig +15 -0
- package/dist/resources/templates/nuxt/.env.example +22 -0
- package/dist/resources/templates/nuxt/.github/workflows/ci.yml +34 -0
- package/dist/resources/templates/nuxt/.husky/commit-msg +1 -0
- package/dist/resources/templates/nuxt/.husky/pre-commit +1 -0
- package/dist/resources/templates/nuxt/.nvmrc +1 -0
- package/dist/resources/templates/nuxt/.prettierignore +9 -0
- package/dist/resources/templates/nuxt/.prettierrc +1 -0
- package/dist/resources/templates/nuxt/README.md +23 -0
- package/dist/resources/templates/nuxt/_gitignore +7 -0
- package/dist/resources/templates/nuxt/app/app.config.ts +105 -0
- package/dist/resources/templates/nuxt/app/i18n/locales/en.json +5 -0
- package/dist/resources/templates/nuxt/app/pages/app/index.vue +224 -0
- package/dist/resources/templates/nuxt/app/pages/authors/[slug].vue +37 -0
- package/dist/resources/templates/nuxt/app/pages/blog/[slug].vue +55 -0
- package/dist/resources/templates/nuxt/app/pages/blog/category/[category].vue +38 -0
- package/dist/resources/templates/nuxt/app/pages/blog/index.vue +46 -0
- package/dist/resources/templates/nuxt/app/pages/index.vue +626 -0
- package/dist/resources/templates/nuxt/app/pages/legal/privacy.vue +21 -0
- package/dist/resources/templates/nuxt/app/pages/legal/terms.vue +21 -0
- package/dist/resources/templates/nuxt/app/pages/ui/index.vue +397 -0
- package/dist/resources/templates/nuxt/commitlint.config.mjs +1 -0
- package/dist/resources/templates/nuxt/eslint.config.mjs +4 -0
- package/dist/resources/templates/nuxt/lint-staged.config.mjs +8 -0
- package/dist/resources/templates/nuxt/nuxt.config.ts +71 -0
- package/dist/resources/templates/nuxt/package.json +67 -0
- package/dist/resources/templates/nuxt/public/apple-touch-icon.png +0 -0
- package/dist/resources/templates/nuxt/public/favicon.ico +0 -0
- package/dist/resources/templates/nuxt/public/favicon.svg +5 -0
- package/dist/resources/templates/nuxt/public/icon-16x16.png +0 -0
- package/dist/resources/templates/nuxt/public/icon-192x192.png +0 -0
- package/dist/resources/templates/nuxt/public/icon-32x32.png +0 -0
- package/dist/resources/templates/nuxt/public/icon-512x512.png +0 -0
- package/dist/resources/templates/nuxt/public/logo.svg +6 -0
- package/dist/resources/templates/nuxt/public/media/hero-product-gallery.png +0 -0
- package/dist/resources/templates/nuxt/server/api/content/sitemap-urls.get.ts +12 -0
- package/dist/resources/templates/nuxt/server/api/preview.get.ts +9 -0
- package/dist/resources/templates/nuxt/stylelint.config.mjs +3 -0
- package/dist/resources/templates/nuxt/test/e2e/rendering.test.ts +13 -0
- package/dist/resources/templates/nuxt/tsconfig.json +3 -0
- package/dist/resources/templates/nuxt/vitest.config.ts +8 -0
- package/package.json +16 -12
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils/constants.ts","../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/project.ts","../src/utils/registry.ts","../src/utils/registry-install.ts","../src/commands/add.ts","../src/utils/nuxt-config.ts","../src/commands/list.ts","../src/commands/update.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { init } from \"./commands/init.js\";\nimport { add } from \"./commands/add.js\";\nimport { list } from \"./commands/list.js\";\nimport { update } from \"./commands/update.js\";\n\nconst program = new Command();\n\nprogram\n .name(\"stackonward\")\n .description(\"Create projects and install reusable components, snippets, and configurations\")\n .version(\"0.0.1\");\n\nprogram\n .command(\"init [name]\")\n .description(\"Create a new project from template\")\n .option(\"-t, --template <template>\", \"Template to use\")\n .option(\"-d, --dir <directory>\", \"Target directory\")\n .option(\"--skip-install\", \"Skip dependency installation\")\n .option(\"--skip-git\", \"Skip git initialization\")\n .action(init);\n\nprogram\n .command(\"add [items...]\")\n .description(\"Add components or snippets to your project\")\n .option(\"-c, --component\", \"Add component(s)\")\n .option(\"-s, --snippet\", \"Add snippet(s)\")\n .option(\"-a, --all\", \"Add all items in category\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-o, --overwrite\", \"Overwrite existing files\")\n .option(\"-p, --path <path>\", \"Custom install path\")\n .action(add);\n\nprogram\n .command(\"list [type]\")\n .description(\"List available templates, components, or snippets\")\n .option(\"-t, --templates\", \"List templates\")\n .option(\"-c, --components\", \"List components\")\n .option(\"-s, --snippets\", \"List snippets\")\n .action(list);\n\nprogram\n .command(\"update [items...]\")\n .description(\"Update configs or components\")\n .option(\"-c, --config\", \"Update config files\")\n .option(\"--all\", \"Update all\")\n .action(update);\n\nprogram.parse();\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { TEMPLATES, PATHS, type TemplateName } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { copyFiles, copyTemplate, isDirEmpty } from \"../utils/fs.js\";\nimport { runInstall, initGit } from \"../utils/project.js\";\nimport { loadRegistry } from \"../utils/registry.js\";\nimport { buildComponentInstallPlan } from \"../utils/registry-install.js\";\n\ninterface InitOptions {\n template?: string;\n dir?: string;\n skipInstall?: boolean;\n skipGit?: boolean;\n}\n\nexport async function init(name: string | undefined, options: InitOptions): Promise<void> {\n logger.br();\n logger.title(\"StackOnward - Project Initializer\");\n logger.br();\n\n // Step 1: Get project name\n let projectName = name;\n if (!projectName) {\n const response = await prompts({\n type: \"text\",\n name: \"name\",\n message: \"Project name:\",\n initial: \"my-project\",\n validate: (value: string) =>\n /^[a-z0-9-_]+$/i.test(value) || \"Project name can only contain letters, numbers, - and _\",\n });\n projectName = response.name;\n }\n\n if (!projectName) {\n logger.error(\"Project name is required\");\n process.exit(1);\n }\n\n // Step 2: Get target directory\n const targetDir = options.dir\n ? path.resolve(options.dir)\n : path.resolve(process.cwd(), projectName);\n\n // Check if directory exists and is not empty\n if (!(await isDirEmpty(targetDir))) {\n const { overwrite } = await prompts({\n type: \"confirm\",\n name: \"overwrite\",\n message: `Directory ${path.basename(targetDir)} is not empty. Overwrite?`,\n initial: false,\n });\n\n if (!overwrite) {\n logger.info(\"Operation cancelled\");\n process.exit(0);\n }\n\n await fs.emptyDir(targetDir);\n }\n\n // Step 3: Select template\n let template = options.template as TemplateName | undefined;\n if (!template || !TEMPLATES[template]) {\n const templateChoices = Object.entries(TEMPLATES).map(([key, value]) => ({\n title: value.name,\n description: value.description,\n value: key,\n }));\n\n const response = await prompts({\n type: \"select\",\n name: \"template\",\n message: \"Select a template:\",\n choices: templateChoices,\n });\n\n template = response.template;\n }\n\n if (!template) {\n logger.error(\"Template selection is required\");\n process.exit(1);\n }\n\n const templateInfo = TEMPLATES[template];\n const templatePath = path.join(PATHS.templates, templateInfo.path);\n\n // Check if template exists\n if (!(await fs.pathExists(templatePath))) {\n logger.error(`Template \"${template}\" not found at ${templatePath}`);\n logger.info(\"Available templates:\");\n Object.entries(TEMPLATES).forEach(([key, val]) => {\n logger.info(` - ${key}: ${val.description}`);\n });\n process.exit(1);\n }\n\n // Step 4: Get author name (for LICENSE, package.json, etc.)\n const { author } = await prompts({\n type: \"text\",\n name: \"author\",\n message: \"Author name (for LICENSE and package.json):\",\n initial: process.env.USER || \"your-name\",\n });\n\n // Step 5: Copy template\n const spinner = ora(\"Creating project...\").start();\n\n try {\n await copyTemplate(templatePath, targetDir, {\n projectName,\n PROJECT_NAME: projectName,\n author: author || \"your-name\",\n year: new Date().getFullYear().toString(),\n });\n await installTemplateRegistryItems(templateInfo, targetDir);\n\n spinner.succeed(\"Project created\");\n } catch (error) {\n spinner.fail(\"Failed to create project\");\n throw error;\n }\n\n // Step 6: Install dependencies\n if (!options.skipInstall) {\n const { shouldInstall } = await prompts({\n type: \"confirm\",\n name: \"shouldInstall\",\n message: \"Install dependencies?\",\n initial: true,\n });\n\n if (shouldInstall) {\n const installSpinner = ora(\"Installing dependencies...\").start();\n try {\n await runInstall(targetDir);\n installSpinner.succeed(\"Dependencies installed\");\n } catch (error) {\n installSpinner.fail(\"Failed to install dependencies\");\n logger.warn(\"You can install dependencies manually later\");\n }\n }\n }\n\n // Step 7: Initialize git\n if (!options.skipGit) {\n const { shouldGit } = await prompts({\n type: \"confirm\",\n name: \"shouldGit\",\n message: \"Initialize git repository?\",\n initial: true,\n });\n\n if (shouldGit) {\n const gitSpinner = ora(\"Initializing git...\").start();\n try {\n await initGit(targetDir);\n gitSpinner.succeed(\"Git repository initialized\");\n } catch (error) {\n gitSpinner.fail(\"Failed to initialize git\");\n }\n }\n }\n\n // Done!\n logger.br();\n logger.success(\"Project ready!\");\n logger.br();\n logger.info(\"Next steps:\");\n logger.info(` cd ${path.relative(process.cwd(), targetDir)}`);\n if (options.skipInstall) {\n logger.info(\" pnpm install\");\n }\n logger.info(\" pnpm dev\");\n logger.br();\n}\n\nasync function installTemplateRegistryItems(\n templateInfo: (typeof TEMPLATES)[TemplateName],\n targetDir: string,\n): Promise<void> {\n const registryItems = \"registryItems\" in templateInfo ? templateInfo.registryItems : undefined;\n if (!registryItems?.length) {\n return;\n }\n\n const registry = await loadRegistry();\n const installPlan = buildComponentInstallPlan({\n componentKeys: [...registryItems],\n framework: \"nuxt\",\n projectRoot: targetDir,\n registry,\n });\n\n await copyFiles(installPlan.filesToCopy, false);\n}\n","import { fileURLToPath } from \"url\";\nimport { dirname, resolve } from \"path\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// Root of the StackOnward workspace where templates, components, and registries are stored.\n// From dist/index.js: dist -> cli -> packages -> repository root.\nexport const STACKONWARD_ROOT = resolve(__dirname, \"../../..\");\n\n// Paths to different resource directories\nexport const PATHS = {\n templates: resolve(STACKONWARD_ROOT, \"packages/templates\"),\n components: resolve(STACKONWARD_ROOT, \"packages/components\"),\n snippets: resolve(STACKONWARD_ROOT, \"packages/snippets\"),\n configs: resolve(STACKONWARD_ROOT, \"packages/configs\"),\n packagesRegistry: resolve(STACKONWARD_ROOT, \"packages/registry.json\"),\n} as const;\n\n// Available templates\nexport const TEMPLATES = {\n \"mcp-server\": {\n name: \"MCP Server\",\n description: \"Model Context Protocol server template\",\n path: \"mcp-server\",\n },\n \"node-cli\": {\n name: \"Node CLI\",\n description: \"Node.js CLI tool template\",\n path: \"node-cli\",\n },\n nuxt: {\n name: \"Nuxt\",\n description: \"Nuxt 4 product-site starter with editable registry-installed source\",\n path: \"nuxt\",\n registryItems: [\"nuxt-site-source\"],\n },\n \"vue-spa\": {\n name: \"Vue SPA\",\n description: \"Vue 3 Single Page Application template\",\n path: \"vue-spa\",\n },\n next: {\n name: \"Next.js\",\n description: \"Next.js React application template\",\n path: \"next\",\n },\n} as const;\n\nexport type TemplateName = keyof typeof TEMPLATES;\n\n// Framework detection patterns\nexport const FRAMEWORK_PATTERNS = {\n nuxt: [\"nuxt\"],\n vue: [\"vue\", \"nuxt\"],\n react: [\"react\", \"next\"],\n node: [\"node\", \"express\", \"fastify\", \"mcp\"],\n} as const;\n\n// Default file paths for components\nexport const DEFAULT_PATHS = {\n nuxt: {\n components: \"app/components\",\n composables: \"app/composables\",\n utils: \"app/utils\",\n },\n vue: {\n components: \"src/components\",\n composables: \"src/composables\",\n utils: \"src/utils\",\n },\n react: {\n components: \"src/components\",\n hooks: \"src/hooks\",\n utils: \"src/utils\",\n },\n node: {\n utils: \"src/utils\",\n services: \"src/services\",\n },\n} as const;\n","import { blue, green, red, yellow, cyan, bold, dim } from \"kolorist\";\n\nexport const logger = {\n info: (msg: string) => console.log(blue(\"info\"), msg),\n success: (msg: string) => console.log(green(\"success\"), msg),\n warn: (msg: string) => console.log(yellow(\"warn\"), msg),\n error: (msg: string) => console.log(red(\"error\"), msg),\n\n // Styled outputs\n title: (msg: string) => console.log(bold(cyan(msg))),\n subtitle: (msg: string) => console.log(dim(msg)),\n step: (step: number, total: number, msg: string) => console.log(dim(`[${step}/${total}]`), msg),\n\n // Blank line\n br: () => console.log(),\n\n // Box output for important messages\n box: (title: string, content: string[]) => {\n const maxLen = Math.max(title.length, ...content.map((c) => c.length));\n const border = \"─\".repeat(maxLen + 2);\n\n console.log(`┌${border}┐`);\n console.log(`│ ${bold(title.padEnd(maxLen))} │`);\n console.log(`├${border}┤`);\n content.forEach((line) => {\n console.log(`│ ${line.padEnd(maxLen)} │`);\n });\n console.log(`└${border}┘`);\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { glob } from \"glob\";\n\n/**\n * Copy directory with template variable replacement\n */\nexport async function copyTemplate(\n src: string,\n dest: string,\n variables: Record<string, string> = {},\n): Promise<void> {\n await fs.ensureDir(dest);\n\n const files = await glob(\"**/*\", {\n cwd: src,\n dot: true,\n nodir: true,\n ignore: [\"**/node_modules/**\", \"**/.git/**\"],\n });\n\n for (const file of files) {\n const srcPath = path.join(src, file);\n let destPath = path.join(dest, file);\n\n // Replace template variables in filename\n for (const [key, value] of Object.entries(variables)) {\n destPath = destPath.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), value);\n }\n\n await fs.ensureDir(path.dirname(destPath));\n\n // Check if file is text and should be processed\n if (isTextFile(file)) {\n let content = await fs.readFile(srcPath, \"utf-8\");\n\n // Replace template variables in content\n for (const [key, value] of Object.entries(variables)) {\n content = content.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), value);\n }\n\n await fs.writeFile(destPath, content);\n } else {\n await fs.copy(srcPath, destPath);\n }\n }\n}\n\n/**\n * Copy specific files to destination\n */\nexport async function copyFiles(\n files: { src: string; dest: string }[],\n overwrite = false,\n): Promise<{ copied: string[]; skipped: string[] }> {\n const copied: string[] = [];\n const skipped: string[] = [];\n\n for (const { src, dest } of files) {\n if (!overwrite && (await fs.pathExists(dest))) {\n skipped.push(dest);\n continue;\n }\n\n await fs.ensureDir(path.dirname(dest));\n await fs.copy(src, dest);\n copied.push(dest);\n }\n\n return { copied, skipped };\n}\n\n/**\n * Check if file is a text file that should be processed for template variables\n */\nfunction isTextFile(filename: string): boolean {\n const textExtensions = [\n \".ts\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".vue\",\n \".json\",\n \".md\",\n \".yml\",\n \".yaml\",\n \".html\",\n \".css\",\n \".scss\",\n \".less\",\n \".txt\",\n \".env\",\n \".env.example\",\n \".gitignore\",\n \".prettierrc\",\n \".eslintrc\",\n \".editorconfig\",\n ];\n\n const ext = path.extname(filename).toLowerCase();\n const basename = path.basename(filename);\n\n return (\n textExtensions.includes(ext) || basename.startsWith(\".\") || !ext // Files without extension are often config files\n );\n}\n\n/**\n * Read and parse JSON file\n */\nexport async function readJson<T>(filePath: string): Promise<T | null> {\n try {\n return await fs.readJson(filePath);\n } catch {\n return null;\n }\n}\n\n/**\n * Write JSON file with formatting\n */\nexport async function writeJson(filePath: string, data: unknown): Promise<void> {\n await fs.writeJson(filePath, data, { spaces: 2 });\n}\n\n/**\n * Check if directory is empty\n */\nexport async function isDirEmpty(dir: string): Promise<boolean> {\n if (!(await fs.pathExists(dir))) return true;\n const files = await fs.readdir(dir);\n return files.length === 0;\n}\n\n/**\n * Get relative path from cwd\n */\nexport function relativePath(absolutePath: string): string {\n return path.relative(process.cwd(), absolutePath);\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { execa } from \"execa\";\nimport { type FRAMEWORK_PATTERNS } from \"./constants.js\";\n\nexport interface ProjectInfo {\n name: string;\n root: string;\n packageJson: Record<string, unknown> | null;\n framework: keyof typeof FRAMEWORK_PATTERNS | null;\n hasTypeScript: boolean;\n packageManager: \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n}\n\n/**\n * Detect project information from current directory\n */\nexport async function detectProject(cwd = process.cwd()): Promise<ProjectInfo> {\n const packageJsonPath = path.join(cwd, \"package.json\");\n const packageJson = (await fs.pathExists(packageJsonPath))\n ? await fs.readJson(packageJsonPath)\n : null;\n\n return {\n name: packageJson?.name || path.basename(cwd),\n root: cwd,\n packageJson,\n framework: detectFramework(packageJson),\n hasTypeScript: await hasTypeScript(cwd),\n packageManager: await detectPackageManager(cwd),\n };\n}\n\n/**\n * Detect framework from package.json dependencies\n */\nfunction detectFramework(\n packageJson: Record<string, unknown> | null,\n): keyof typeof FRAMEWORK_PATTERNS | null {\n if (!packageJson) return null;\n\n const deps = {\n ...(packageJson.dependencies as Record<string, string> | undefined),\n ...(packageJson.devDependencies as Record<string, string> | undefined),\n };\n\n if (deps.nuxt) return \"nuxt\";\n if (deps.vue) return \"vue\";\n if (deps.next || deps.react) return \"react\";\n if (deps.express || deps.fastify || deps[\"@modelcontextprotocol/sdk\"]) return \"node\";\n\n return null;\n}\n\n/**\n * Check if project uses TypeScript\n */\nasync function hasTypeScript(cwd: string): Promise<boolean> {\n return (\n (await fs.pathExists(path.join(cwd, \"tsconfig.json\"))) ||\n (await fs.pathExists(path.join(cwd, \"tsconfig.base.json\")))\n );\n}\n\n/**\n * Detect package manager from lock files\n */\nasync function detectPackageManager(cwd: string): Promise<\"npm\" | \"pnpm\" | \"yarn\" | \"bun\"> {\n if (await fs.pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (await fs.pathExists(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (await fs.pathExists(path.join(cwd, \"bun.lockb\"))) return \"bun\";\n return \"npm\";\n}\n\n/**\n * Install dependencies using detected package manager\n */\nexport async function installDependencies(\n cwd: string,\n deps: string[],\n isDev = false,\n): Promise<void> {\n const pm = await detectPackageManager(cwd);\n\n const args: string[] = [];\n\n switch (pm) {\n case \"pnpm\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-D\");\n break;\n case \"yarn\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-D\");\n break;\n case \"bun\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-d\");\n break;\n default:\n args.push(\"install\", ...deps);\n if (isDev) args.push(\"--save-dev\");\n }\n\n await execa(pm, args, { cwd, stdio: \"inherit\" });\n}\n\n/**\n * Run package manager install\n */\nexport async function runInstall(cwd: string): Promise<void> {\n const pm = await detectPackageManager(cwd);\n await execa(pm, [\"install\"], { cwd, stdio: \"inherit\" });\n}\n\n/**\n * Initialize git repository\n */\nexport async function initGit(cwd: string): Promise<void> {\n await execa(\"git\", [\"init\"], { cwd });\n await execa(\"git\", [\"add\", \"-A\"], { cwd });\n await execa(\"git\", [\"commit\", \"-m\", \"chore: initial commit\"], { cwd });\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { PATHS } from \"./constants.js\";\n\nexport interface ComponentMeta {\n name: string;\n description: string;\n files: RegistryFile[];\n dependencies: string[];\n devDependencies: string[];\n registryDependencies: string[];\n framework: \"nuxt\" | \"vue\" | \"react\" | \"universal\";\n category: string;\n}\n\nexport interface SnippetMeta {\n name: string;\n description: string;\n files: RegistryFile[];\n dependencies: string[];\n devDependencies: string[];\n framework: \"nuxt\" | \"vue\" | \"react\" | \"node\" | \"universal\";\n category: string;\n}\n\nexport type RegistryFile =\n | string\n | {\n path: string;\n target?: string;\n };\n\n/** 可安装的包:npm 普通依赖,或 Nuxt layer(装包 + patch extends) */\nexport interface PackageMeta {\n name: string;\n description: string;\n type: \"npm\" | \"layer\";\n version?: string;\n}\n\nexport interface Registry {\n components: Record<string, ComponentMeta>;\n snippets: Record<string, SnippetMeta>;\n packages: Record<string, PackageMeta>;\n}\n\nlet registryCache: Registry | null = null;\n\n/**\n * Load the component/snippet registry\n */\nexport async function loadRegistry(): Promise<Registry> {\n if (registryCache) return registryCache;\n\n const componentsRegistry = await loadComponentsRegistry();\n const snippetsRegistry = await loadSnippetsRegistry();\n const packagesRegistry = await loadPackagesRegistry();\n\n registryCache = {\n components: componentsRegistry,\n snippets: snippetsRegistry,\n packages: packagesRegistry,\n };\n\n return registryCache;\n}\n\nasync function loadPackagesRegistry(): Promise<Record<string, PackageMeta>> {\n if (await fs.pathExists(PATHS.packagesRegistry)) {\n return await fs.readJson(PATHS.packagesRegistry);\n }\n return {};\n}\n\nasync function loadComponentsRegistry(): Promise<Record<string, ComponentMeta>> {\n const registryPath = path.join(PATHS.components, \"registry.json\");\n if (await fs.pathExists(registryPath)) {\n return await fs.readJson(registryPath);\n }\n return {};\n}\n\nasync function loadSnippetsRegistry(): Promise<Record<string, SnippetMeta>> {\n const registryPath = path.join(PATHS.snippets, \"registry.json\");\n if (await fs.pathExists(registryPath)) {\n return await fs.readJson(registryPath);\n }\n return {};\n}\n\n/**\n * Resolve all dependencies for a component (including nested registry dependencies)\n */\nexport function resolveComponentDependencies(\n componentName: string,\n registry: Registry,\n resolved: Set<string> = new Set(),\n): ComponentMeta[] {\n if (resolved.has(componentName)) return [];\n\n const component = registry.components[componentName];\n if (!component) {\n throw new Error(`Component \"${componentName}\" not found in registry`);\n }\n\n resolved.add(componentName);\n\n const deps: ComponentMeta[] = [];\n\n // Resolve registry dependencies first\n for (const depName of component.registryDependencies) {\n deps.push(...resolveComponentDependencies(depName, registry, resolved));\n }\n\n deps.push(component);\n return deps;\n}\n\n/**\n * Get all available components for a framework\n */\nexport function getComponentsByFramework(\n registry: Registry,\n framework: \"nuxt\" | \"vue\" | \"react\",\n): ComponentMeta[] {\n return Object.values(registry.components).filter(\n (c) =>\n c.framework === framework ||\n c.framework === \"universal\" ||\n (framework === \"nuxt\" && c.framework === \"vue\"),\n );\n}\n\n/**\n * Get all available snippets for a framework\n */\nexport function getSnippetsByFramework(\n registry: Registry,\n framework: \"nuxt\" | \"vue\" | \"react\" | \"node\",\n): SnippetMeta[] {\n return Object.values(registry.snippets).filter(\n (s) =>\n s.framework === framework ||\n s.framework === \"universal\" ||\n (framework === \"nuxt\" && s.framework === \"vue\"),\n );\n}\n\n/**\n * Group items by category\n */\nexport function groupByCategory<T extends { category: string }>(items: T[]): Record<string, T[]> {\n return items.reduce(\n (acc, item) => {\n if (!acc[item.category]) {\n acc[item.category] = [];\n }\n acc[item.category].push(item);\n return acc;\n },\n {} as Record<string, T[]>,\n );\n}\n","import path from \"path\";\nimport { DEFAULT_PATHS, PATHS } from \"./constants.js\";\nimport {\n resolveComponentDependencies,\n type ComponentMeta,\n type Registry,\n type RegistryFile,\n} from \"./registry.js\";\n\nexport type ComponentFramework = \"nuxt\" | \"vue\" | \"react\";\n\nexport interface ComponentInstallPlan {\n components: ComponentMeta[];\n dependencies: string[];\n devDependencies: string[];\n filesToCopy: { src: string; dest: string }[];\n}\n\nexport function resolveComponentFramework(framework: string | null): ComponentFramework | null {\n if (framework === \"nuxt\" || framework === \"vue\" || framework === \"react\") {\n return framework;\n }\n return null;\n}\n\nexport function findComponentKey(registry: Registry, component: ComponentMeta): string {\n const match = Object.entries(registry.components).find(\n ([, candidate]) => candidate === component,\n );\n return match?.[0] ?? component.name.toLowerCase();\n}\n\nexport function buildComponentInstallPlan(input: {\n componentKeys: string[];\n framework: ComponentFramework;\n projectRoot: string;\n registry: Registry;\n targetBase?: string;\n}): ComponentInstallPlan {\n const selectedComponents = input.componentKeys.flatMap((key) =>\n resolveComponentDependencies(key, input.registry),\n );\n const components = [\n ...new Map(\n selectedComponents.map((component) => [\n findComponentKey(input.registry, component),\n component,\n ]),\n ).values(),\n ];\n\n const filesToCopy = components.flatMap((component) =>\n component.files.map((file) =>\n resolveComponentFile({\n component,\n file,\n framework: input.framework,\n projectRoot: input.projectRoot,\n targetBase: input.targetBase,\n }),\n ),\n );\n\n return {\n components,\n dependencies: [...new Set(components.flatMap((component) => component.dependencies))],\n devDependencies: [...new Set(components.flatMap((component) => component.devDependencies))],\n filesToCopy,\n };\n}\n\nfunction resolveComponentFile(input: {\n component: ComponentMeta;\n file: RegistryFile;\n framework: ComponentFramework;\n projectRoot: string;\n targetBase?: string;\n}): { src: string; dest: string } {\n const normalized = typeof input.file === \"string\" ? { path: input.file } : input.file;\n const sourceFramework =\n input.component.framework === \"universal\" ? input.framework : input.component.framework;\n const sourcePath = path.join(PATHS.components, sourceFramework, normalized.path);\n\n if (normalized.target) {\n return {\n src: sourcePath,\n dest: path.resolve(input.projectRoot, normalized.target),\n };\n }\n\n const targetBase =\n input.targetBase || DEFAULT_PATHS[input.framework]?.components || \"src/components\";\n\n return {\n src: sourcePath,\n dest: path.resolve(input.projectRoot, targetBase, path.basename(normalized.path)),\n };\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { PATHS, DEFAULT_PATHS } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { copyFiles } from \"../utils/fs.js\";\nimport { detectProject, installDependencies } from \"../utils/project.js\";\nimport { patchNuxtConfigExtends } from \"../utils/nuxt-config.js\";\nimport {\n buildComponentInstallPlan,\n findComponentKey,\n resolveComponentFramework,\n} from \"../utils/registry-install.js\";\nimport {\n loadRegistry,\n resolveComponentDependencies,\n getComponentsByFramework,\n getSnippetsByFramework,\n groupByCategory,\n type ComponentMeta,\n type PackageMeta,\n type SnippetMeta,\n} from \"../utils/registry.js\";\n\ninterface AddOptions {\n component?: boolean;\n snippet?: boolean;\n all?: boolean;\n yes?: boolean;\n overwrite?: boolean;\n path?: string;\n}\n\nexport async function add(items: string[], options: AddOptions): Promise<void> {\n logger.br();\n\n // Detect project info\n const project = await detectProject();\n\n if (!project.packageJson) {\n logger.error(\"No package.json found. Please run this command in a project directory.\");\n process.exit(1);\n }\n\n // Load registry\n const registry = await loadRegistry();\n\n // Package dispatch (npm / layer) takes precedence for matching names\n const packageItems = items.filter((i) => registry.packages[i]).map((i) => registry.packages[i]!);\n if (packageItems.length > 0) {\n await addPackages(packageItems, project);\n }\n const nonPackageItems = items.filter((i) => !registry.packages[i]);\n if (items.length > 0 && nonPackageItems.length === 0) return;\n\n // Determine what type of items to add\n const isComponent = options.component || (!options.snippet && !options.component);\n const isSnippet = options.snippet;\n\n if (isComponent) {\n await addComponents(nonPackageItems, options, project, registry);\n } else if (isSnippet) {\n await addSnippets(nonPackageItems, options, project, registry);\n }\n}\n\n/** 安装 npm/layer 类型的包;layer 额外 patch 项目 nuxt.config 的 extends */\nasync function addPackages(\n packages: PackageMeta[],\n project: Awaited<ReturnType<typeof detectProject>>,\n): Promise<void> {\n for (const pkg of packages) {\n const spec = pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name;\n const spinner = ora(`Installing ${pkg.name}...`).start();\n try {\n await installDependencies(project.root, [spec]);\n spinner.succeed(`Installed ${pkg.name}`);\n } catch (error) {\n spinner.fail(`Failed to install ${pkg.name}`);\n throw error;\n }\n if (pkg.type === \"layer\") {\n await patchProjectNuxtConfig(project.root, pkg.name);\n }\n }\n}\n\nasync function patchProjectNuxtConfig(root: string, layer: string): Promise<void> {\n const candidates = [\"nuxt.config.ts\", \"nuxt.config.js\", \"nuxt.config.mjs\"];\n for (const file of candidates) {\n const configPath = path.join(root, file);\n if (!(await fs.pathExists(configPath))) continue;\n const source = await fs.readFile(configPath, \"utf8\");\n try {\n const patched = patchNuxtConfigExtends(source, layer);\n if (patched === source) {\n logger.info(`${layer} already in ${file} extends`);\n } else {\n await fs.writeFile(configPath, patched);\n logger.success(`Added ${layer} to ${file} extends`);\n }\n } catch {\n logger.warn(`Could not auto-patch ${file}; add \"${layer}\" to extends manually`);\n }\n return;\n }\n logger.warn(`No nuxt.config found; add \"${layer}\" to your nuxt.config extends manually`);\n}\n\nasync function addComponents(\n items: string[],\n options: AddOptions,\n project: Awaited<ReturnType<typeof detectProject>>,\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n): Promise<void> {\n const framework = resolveComponentFramework(project.framework);\n\n if (!framework) {\n logger.error(\"Could not detect framework. Supported: Nuxt, Vue, React\");\n process.exit(1);\n }\n\n const availableComponents = getComponentsByFramework(registry, framework);\n\n if (availableComponents.length === 0) {\n logger.warn(`No components available for ${framework}`);\n return;\n }\n\n let selectedComponents: ComponentMeta[] = [];\n\n if (options.all) {\n // Add all components\n selectedComponents = availableComponents;\n } else if (items.length > 0) {\n // Add specified components\n for (const item of items) {\n try {\n const deps = resolveComponentDependencies(item, registry);\n selectedComponents.push(...deps);\n } catch (error) {\n logger.error((error as Error).message);\n process.exit(1);\n }\n }\n } else {\n // Interactive selection\n const grouped = groupByCategory(availableComponents);\n const choices = Object.entries(grouped).flatMap(([category, components]) => [\n { title: category, disabled: true, value: \"\" },\n ...components.map((c) => ({\n title: ` ${c.name}`,\n description: c.description,\n value: findComponentKey(registry, c),\n })),\n ]);\n\n const response = await prompts({\n type: \"multiselect\",\n name: \"components\",\n message: \"Select components to add:\",\n choices,\n hint: \"- Space to select. Return to submit\",\n });\n\n if (!response.components || response.components.length === 0) {\n logger.info(\"No components selected\");\n return;\n }\n\n for (const name of response.components) {\n const deps = resolveComponentDependencies(name, registry);\n selectedComponents.push(...deps);\n }\n }\n\n const componentKeys = [\n ...new Set(selectedComponents.map((component) => findComponentKey(registry, component))),\n ];\n\n if (selectedComponents.length === 0) {\n logger.info(\"No components to add\");\n return;\n }\n\n // Confirm\n if (!options.yes) {\n logger.info(\"Components to add:\");\n selectedComponents.forEach((c) => logger.info(` - ${c.name}`));\n logger.br();\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Proceed?\",\n initial: true,\n });\n\n if (!confirm) {\n logger.info(\"Cancelled\");\n return;\n }\n }\n\n const installPlan = buildComponentInstallPlan({\n componentKeys,\n framework,\n projectRoot: project.root,\n registry,\n targetBase: options.path,\n });\n\n // Copy files\n const spinner = ora(\"Adding components...\").start();\n\n try {\n const { copied, skipped } = await copyFiles(installPlan.filesToCopy, options.overwrite);\n\n spinner.succeed(`Added ${copied.length} file(s)`);\n\n if (skipped.length > 0) {\n logger.warn(`Skipped ${skipped.length} existing file(s). Use --overwrite to replace.`);\n }\n } catch (error) {\n spinner.fail(\"Failed to add components\");\n throw error;\n }\n\n // Install dependencies\n const uniqueDeps = installPlan.dependencies;\n const uniqueDevDeps = installPlan.devDependencies;\n\n if (uniqueDeps.length > 0 || uniqueDevDeps.length > 0) {\n const { shouldInstall } = options.yes\n ? { shouldInstall: true }\n : await prompts({\n type: \"confirm\",\n name: \"shouldInstall\",\n message: \"Install required dependencies?\",\n initial: true,\n });\n\n if (shouldInstall) {\n const installSpinner = ora(\"Installing dependencies...\").start();\n try {\n if (uniqueDeps.length > 0) {\n await installDependencies(project.root, uniqueDeps, false);\n }\n if (uniqueDevDeps.length > 0) {\n await installDependencies(project.root, uniqueDevDeps, true);\n }\n installSpinner.succeed(\"Dependencies installed\");\n } catch (error) {\n installSpinner.fail(\"Failed to install some dependencies\");\n }\n }\n }\n\n logger.br();\n logger.success(\"Done!\");\n}\n\nasync function addSnippets(\n items: string[],\n options: AddOptions,\n project: Awaited<ReturnType<typeof detectProject>>,\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n): Promise<void> {\n const framework =\n project.framework === \"nuxt\"\n ? \"nuxt\"\n : project.framework === \"vue\"\n ? \"vue\"\n : project.framework === \"react\"\n ? \"react\"\n : \"node\";\n\n const availableSnippets = getSnippetsByFramework(registry, framework);\n\n if (availableSnippets.length === 0) {\n logger.warn(`No snippets available for ${framework}`);\n return;\n }\n\n let selectedSnippets: SnippetMeta[] = [];\n\n if (options.all) {\n selectedSnippets = availableSnippets;\n } else if (items.length > 0) {\n for (const item of items) {\n const snippet = registry.snippets[item];\n if (!snippet) {\n logger.error(`Snippet \"${item}\" not found`);\n process.exit(1);\n }\n selectedSnippets.push(snippet);\n }\n } else {\n const grouped = groupByCategory(availableSnippets);\n const choices = Object.entries(grouped).flatMap(([category, snippets]) => [\n { title: category, disabled: true, value: \"\" },\n ...snippets.map((s) => ({\n title: ` ${s.name}`,\n description: s.description,\n value: s.name.toLowerCase(),\n })),\n ]);\n\n const response = await prompts({\n type: \"multiselect\",\n name: \"snippets\",\n message: \"Select snippets to add:\",\n choices,\n hint: \"- Space to select. Return to submit\",\n });\n\n if (!response.snippets || response.snippets.length === 0) {\n logger.info(\"No snippets selected\");\n return;\n }\n\n selectedSnippets = response.snippets.map((name: string) => registry.snippets[name]);\n }\n\n if (selectedSnippets.length === 0) {\n logger.info(\"No snippets to add\");\n return;\n }\n\n // Confirm\n if (!options.yes) {\n logger.info(\"Snippets to add:\");\n selectedSnippets.forEach((s) => logger.info(` - ${s.name}`));\n logger.br();\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Proceed?\",\n initial: true,\n });\n\n if (!confirm) {\n logger.info(\"Cancelled\");\n return;\n }\n }\n\n // Determine target path\n const targetBase = options.path || DEFAULT_PATHS[framework]?.utils || \"src/utils\";\n const targetDir = path.resolve(project.root, targetBase);\n\n // Copy files\n const spinner = ora(\"Adding snippets...\").start();\n\n const filesToCopy: { src: string; dest: string }[] = [];\n\n for (const snippet of selectedSnippets) {\n // Use snippet's own framework for source path (node, vue, react, or universal -> node)\n const snippetFramework = snippet.framework === \"universal\" ? \"node\" : snippet.framework;\n const snippetDir = path.join(PATHS.snippets, snippetFramework);\n\n for (const file of snippet.files) {\n const normalized = typeof file === \"string\" ? { path: file } : file;\n filesToCopy.push({\n src: path.join(snippetDir, normalized.path),\n dest: normalized.target\n ? path.resolve(project.root, normalized.target)\n : path.join(targetDir, path.basename(normalized.path)),\n });\n }\n }\n\n try {\n const { copied, skipped } = await copyFiles(filesToCopy, options.overwrite);\n spinner.succeed(`Added ${copied.length} file(s)`);\n\n if (skipped.length > 0) {\n logger.warn(`Skipped ${skipped.length} existing file(s)`);\n }\n } catch (error) {\n spinner.fail(\"Failed to add snippets\");\n throw error;\n }\n\n logger.br();\n logger.success(\"Done!\");\n}\n","function escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * 幂等地把一个 layer 加入 nuxt.config 的 `extends` 数组。\n * - 已含该 layer → 原样返回\n * - 已有 extends 数组 → 在数组头插入\n * - 仅有 defineNuxtConfig({ ... }) → 注入 extends\n * - 都识别不了 → 抛错,由调用方提示手动添加\n */\nexport function patchNuxtConfigExtends(source: string, layer: string): string {\n const already = new RegExp(`extends\\\\s*:\\\\s*\\\\[[^\\\\]]*['\"]${escapeRegExp(layer)}['\"]`);\n if (already.test(source)) return source;\n\n const extendsArray = /extends\\s*:\\s*\\[/;\n if (extendsArray.test(source)) {\n return source.replace(extendsArray, (match) => `${match}\"${layer}\", `);\n }\n\n const define = /defineNuxtConfig\\(\\{/;\n if (define.test(source)) {\n return source.replace(define, (match) => `${match}\\n extends: [\"${layer}\"],`);\n }\n\n throw new Error(\n \"Could not locate defineNuxtConfig in nuxt.config; add the layer to `extends` manually\",\n );\n}\n","import { TEMPLATES } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n loadRegistry,\n groupByCategory,\n type ComponentMeta,\n type SnippetMeta,\n} from \"../utils/registry.js\";\n\ninterface ListOptions {\n templates?: boolean;\n components?: boolean;\n snippets?: boolean;\n}\n\nexport async function list(type: string | undefined, options: ListOptions): Promise<void> {\n logger.br();\n\n const showAll = !options.templates && !options.components && !options.snippets && !type;\n const showTemplates = options.templates || type === \"templates\" || showAll;\n const showComponents = options.components || type === \"components\" || showAll;\n const showSnippets = options.snippets || type === \"snippets\" || showAll;\n\n if (showTemplates) {\n listTemplates();\n }\n\n if (showComponents) {\n await listComponents();\n }\n\n if (showSnippets) {\n await listSnippets();\n }\n}\n\nfunction listTemplates(): void {\n logger.title(\"Templates\");\n logger.br();\n\n const entries = Object.entries(TEMPLATES);\n\n if (entries.length === 0) {\n logger.info(\" No templates available\");\n } else {\n for (const [key, template] of entries) {\n logger.info(` ${key}`);\n logger.subtitle(` ${template.description}`);\n }\n }\n\n logger.br();\n logger.subtitle(\" Usage: stackonward init --template <name>\");\n logger.br();\n}\n\nasync function listComponents(): Promise<void> {\n logger.title(\"Components\");\n logger.br();\n\n const registry = await loadRegistry();\n const components = Object.values(registry.components);\n\n if (components.length === 0) {\n logger.info(\" No components available\");\n logger.br();\n return;\n }\n\n // Group by framework first\n const byFramework: Record<string, ComponentMeta[]> = {};\n for (const component of components) {\n const fw = component.framework;\n if (!byFramework[fw]) byFramework[fw] = [];\n byFramework[fw].push(component);\n }\n\n for (const [framework, fwComponents] of Object.entries(byFramework)) {\n logger.info(` [${framework}]`);\n\n const grouped = groupByCategory(fwComponents);\n\n for (const [category, catComponents] of Object.entries(grouped)) {\n logger.subtitle(` ${category}/`);\n for (const component of catComponents) {\n logger.info(` - ${component.name.toLowerCase()}: ${component.description}`);\n }\n }\n\n logger.br();\n }\n\n logger.subtitle(\" Usage: stackonward add <component-name>\");\n logger.br();\n}\n\nasync function listSnippets(): Promise<void> {\n logger.title(\"Snippets\");\n logger.br();\n\n const registry = await loadRegistry();\n const snippets = Object.values(registry.snippets);\n\n if (snippets.length === 0) {\n logger.info(\" No snippets available\");\n logger.br();\n return;\n }\n\n // Group by framework first\n const byFramework: Record<string, SnippetMeta[]> = {};\n for (const snippet of snippets) {\n const fw = snippet.framework;\n if (!byFramework[fw]) byFramework[fw] = [];\n byFramework[fw].push(snippet);\n }\n\n for (const [framework, fwSnippets] of Object.entries(byFramework)) {\n logger.info(` [${framework}]`);\n\n const grouped = groupByCategory(fwSnippets);\n\n for (const [category, catSnippets] of Object.entries(grouped)) {\n logger.subtitle(` ${category}/`);\n for (const snippet of catSnippets) {\n logger.info(` - ${snippet.name.toLowerCase()}: ${snippet.description}`);\n }\n }\n\n logger.br();\n }\n\n logger.subtitle(\" Usage: stackonward add -s <snippet-name>\");\n logger.br();\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { PATHS } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { copyFiles } from \"../utils/fs.js\";\nimport { detectProject } from \"../utils/project.js\";\n\ninterface UpdateOptions {\n config?: boolean;\n all?: boolean;\n}\n\nconst CONFIG_FILES = [\n { name: \"ESLint\", file: \"eslint.config.js\", source: \"eslint-config\" },\n { name: \"Prettier\", file: \".prettierrc\", source: \"prettier-config\" },\n { name: \"EditorConfig\", file: \".editorconfig\", source: \"base\" },\n { name: \"Commitlint\", file: \"commitlint.config.js\", source: \"base\" },\n { name: \"Lint-staged\", file: \".lintstagedrc.json\", source: \"base\" },\n] as const;\n\nexport async function update(items: string[], options: UpdateOptions): Promise<void> {\n logger.br();\n\n const project = await detectProject();\n\n if (!project.packageJson) {\n logger.error(\"No package.json found. Please run this command in a project directory.\");\n process.exit(1);\n }\n\n if (options.config || options.all) {\n await updateConfigs(project, items);\n } else {\n // Default to config update\n await updateConfigs(project, items);\n }\n}\n\nasync function updateConfigs(\n project: Awaited<ReturnType<typeof detectProject>>,\n specificConfigs: string[],\n): Promise<void> {\n logger.title(\"Update Configuration Files\");\n logger.br();\n\n let configsToUpdate: (typeof CONFIG_FILES)[number][] = [...CONFIG_FILES];\n\n if (specificConfigs.length > 0) {\n configsToUpdate = CONFIG_FILES.filter((c) =>\n specificConfigs.some(\n (s) => c.name.toLowerCase().includes(s.toLowerCase()) || c.file.includes(s),\n ),\n );\n\n if (configsToUpdate.length === 0) {\n logger.error(\"No matching config files found\");\n logger.info(\"Available configs:\");\n CONFIG_FILES.forEach((c) => logger.info(` - ${c.name} (${c.file})`));\n return;\n }\n } else {\n // Interactive selection\n const choices = CONFIG_FILES.map((c) => ({\n title: c.name,\n description: c.file,\n value: c.file,\n selected: false,\n }));\n\n const response = await prompts({\n type: \"multiselect\",\n name: \"configs\",\n message: \"Select configs to update:\",\n choices,\n hint: \"- Space to select. Return to submit\",\n });\n\n if (!response.configs || response.configs.length === 0) {\n logger.info(\"No configs selected\");\n return;\n }\n\n configsToUpdate = CONFIG_FILES.filter((c) => response.configs.includes(c.file));\n }\n\n // Check which files exist\n const existingConfigs: (typeof CONFIG_FILES)[number][] = [];\n const newConfigs: (typeof CONFIG_FILES)[number][] = [];\n\n for (const config of configsToUpdate) {\n const targetPath = path.join(project.root, config.file);\n if (await fs.pathExists(targetPath)) {\n existingConfigs.push(config);\n } else {\n newConfigs.push(config);\n }\n }\n\n if (existingConfigs.length > 0) {\n logger.warn(\"The following files will be overwritten:\");\n existingConfigs.forEach((c) => logger.warn(` - ${c.file}`));\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Continue?\",\n initial: false,\n });\n\n if (!confirm) {\n logger.info(\"Cancelled\");\n return;\n }\n }\n\n const spinner = ora(\"Updating configs...\").start();\n\n const filesToCopy: { src: string; dest: string }[] = [];\n\n for (const config of configsToUpdate) {\n // Try to find the source file\n const sourcePaths = [\n path.join(PATHS.configs, config.source, config.file),\n path.join(PATHS.templates, \"base\", config.file),\n ];\n\n let sourcePath: string | null = null;\n for (const sp of sourcePaths) {\n if (await fs.pathExists(sp)) {\n sourcePath = sp;\n break;\n }\n }\n\n if (sourcePath) {\n filesToCopy.push({\n src: sourcePath,\n dest: path.join(project.root, config.file),\n });\n } else {\n logger.warn(`Source not found for ${config.file}`);\n }\n }\n\n try {\n const { copied } = await copyFiles(filesToCopy, true);\n spinner.succeed(`Updated ${copied.length} config file(s)`);\n } catch (error) {\n spinner.fail(\"Failed to update configs\");\n throw error;\n }\n\n logger.br();\n logger.success(\"Done!\");\n}\n"],"mappings":"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","names":["path","fs","fs","path","fs","path","fs","path","path","path","path","fs","path","fs","prompts","ora","ora","path","fs","prompts","path","fs","prompts","ora","prompts","path","fs","ora"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/commands/init.ts","../src/utils/constants.ts","../src/utils/logger.ts","../src/utils/fs.ts","../src/utils/project.ts","../src/utils/registry.ts","../src/utils/registry-install.ts","../src/commands/add.ts","../src/utils/nuxt-config.ts","../src/commands/list.ts","../src/commands/apple.ts","../src/apple/contracts.ts","../src/apple/manifest.ts","../src/apple/credentials.ts","../src/apple/api.ts","../src/apple/state.ts","../src/apple/plan.ts","../src/apple/execute.ts","../src/apple/resources/identifiers.ts","../src/apple/resources/metadata.ts","../src/apple/resources/catalog.ts","../src/apple/resources/assets.ts","../src/apple/resources/pricing.ts","../src/apple/resources/offers.ts","../src/apple/resources/app-commerce.ts","../src/apple/resources/review.ts","../src/apple/resources/release.ts","../src/apple/resources/testflight.ts","../src/apple/process.ts","../src/apple/fastlane.ts","../src/apple/resources/build.ts","../src/apple/resources/native.ts","../src/apple/resources/inspection.ts"],"sourcesContent":["import { Command } from \"commander\";\nimport { init } from \"./commands/init.js\";\nimport { add } from \"./commands/add.js\";\nimport { list } from \"./commands/list.js\";\nimport { registerApple } from \"./commands/apple.js\";\n\ndeclare const __STACKONWARD_CLI_VERSION__: string;\n\nconst program = new Command();\n\nprogram\n .name(\"stackonward\")\n .description(\"Create projects and install reusable components and snippets\")\n .version(__STACKONWARD_CLI_VERSION__);\n\nprogram\n .command(\"init [name]\")\n .description(\"Create a new project from template\")\n .option(\"-t, --template <template>\", \"Template to use\")\n .option(\"-d, --dir <directory>\", \"Target directory\")\n .option(\"--skip-install\", \"Skip dependency installation\")\n .option(\"--skip-git\", \"Skip git initialization\")\n .option(\"--module <module>\", \"Go module path (required for go-backend)\")\n .option(\"--author <author>\", \"Author name\")\n .option(\"-y, --yes\", \"Use defaults without interactive prompts\")\n .action(init);\n\nprogram\n .command(\"add [items...]\")\n .description(\"Add components or snippets to your project\")\n .option(\"-c, --component\", \"Add component(s)\")\n .option(\"-s, --snippet\", \"Add snippet(s)\")\n .option(\"-a, --all\", \"Add all items in category\")\n .option(\"-y, --yes\", \"Skip confirmation prompts\")\n .option(\"-o, --overwrite\", \"Overwrite existing files\")\n .option(\"-p, --path <path>\", \"Custom install path\")\n .action(add);\n\nprogram\n .command(\"list [type]\")\n .description(\"List available templates, components, or snippets\")\n .option(\"-t, --templates\", \"List templates\")\n .option(\"-c, --components\", \"List components\")\n .option(\"-s, --snippets\", \"List snippets\")\n .action(list);\n\nregisterApple(program);\nawait program.parseAsync();\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { execa } from \"execa\";\nimport { TEMPLATES, PATHS, type TemplateName } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { copyFiles, copyTemplate, isDirEmpty } from \"../utils/fs.js\";\nimport { createInitialCommit, initializeGitRepository, runInstall } from \"../utils/project.js\";\nimport { loadRegistry } from \"../utils/registry.js\";\nimport { buildComponentInstallPlan } from \"../utils/registry-install.js\";\n\ninterface InitOptions {\n template?: string;\n dir?: string;\n skipInstall?: boolean;\n skipGit?: boolean;\n module?: string;\n author?: string;\n yes?: boolean;\n}\n\nconst PROMPT_OPTIONS = {\n onCancel: () => {\n throw new Error(\"Initialization cancelled\");\n },\n};\n\nexport async function init(name: string | undefined, options: InitOptions): Promise<void> {\n logger.br();\n logger.title(\"StackOnward - Project Initializer\");\n logger.br();\n\n if (options.template && !Object.hasOwn(TEMPLATES, options.template)) {\n throw new Error(`Unknown template: ${options.template}`);\n }\n if (options.yes && (!name || !options.template)) {\n throw new Error(\"Project name and --template are required with --yes\");\n }\n\n let projectName = name;\n if (!projectName) {\n const response = await prompts(\n {\n type: \"text\",\n name: \"name\",\n message: \"Project name:\",\n initial: \"my-project\",\n validate: (value: string) =>\n /^[a-z0-9-_]+$/i.test(value) || \"Project name can only contain letters, numbers, - and _\",\n },\n PROMPT_OPTIONS,\n );\n projectName = response.name;\n }\n\n if (!projectName) {\n logger.error(\"Project name is required\");\n process.exit(1);\n }\n\n if (!/^[a-zA-Z0-9][a-zA-Z0-9_-]*$/.test(projectName)) {\n throw new Error(\"Invalid project name\");\n }\n\n const targetDir = options.dir\n ? path.resolve(options.dir)\n : path.resolve(process.cwd(), projectName);\n\n if (!(await isDirEmpty(targetDir))) {\n throw new Error(\n \"Target directory must be empty; initialization does not overwrite existing projects\",\n );\n }\n\n let template = options.template as TemplateName | undefined;\n if (!template || !TEMPLATES[template]) {\n const templateChoices = Object.entries(TEMPLATES).map(([key, value]) => ({\n title: value.name,\n description: value.description,\n value: key,\n }));\n\n const response = await prompts(\n {\n type: \"select\",\n name: \"template\",\n message: \"Select a template:\",\n choices: templateChoices,\n },\n PROMPT_OPTIONS,\n );\n\n template = response.template;\n }\n\n if (!template) {\n logger.error(\"Template selection is required\");\n process.exit(1);\n }\n\n const templateInfo = TEMPLATES[template];\n if (templateInfo.runtime === \"go\") {\n if (!/^[a-z0-9][a-z0-9_-]*$/.test(projectName)) {\n throw new Error(\n \"Go project names must use lowercase letters, numbers, hyphens or underscores\",\n );\n }\n validateGoModule(options.module);\n }\n const templatePath = path.join(PATHS.templates, templateInfo.path);\n\n if (!(await fs.pathExists(templatePath))) {\n logger.error(`Template \"${template}\" not found at ${templatePath}`);\n logger.info(\"Available templates:\");\n Object.entries(TEMPLATES).forEach(([key, val]) => {\n logger.info(` - ${key}: ${val.description}`);\n });\n process.exit(1);\n }\n\n const { author } =\n options.author || options.yes\n ? { author: options.author || process.env.USER || \"\" }\n : await prompts(\n {\n type: \"text\",\n name: \"author\",\n message: \"Author name (for LICENSE and package.json):\",\n initial: process.env.USER || \"your-name\",\n },\n PROMPT_OPTIONS,\n );\n\n const { shouldInstall } = options.skipInstall\n ? { shouldInstall: false }\n : options.yes\n ? { shouldInstall: true }\n : await prompts(\n {\n type: \"confirm\",\n name: \"shouldInstall\",\n message: \"Install dependencies?\",\n initial: true,\n },\n PROMPT_OPTIONS,\n );\n const { shouldGit } = options.skipGit\n ? { shouldGit: false }\n : options.yes\n ? { shouldGit: true }\n : await prompts(\n {\n type: \"confirm\",\n name: \"shouldGit\",\n message: \"Initialize git repository?\",\n initial: true,\n },\n PROMPT_OPTIONS,\n );\n\n const spinner = ora(\"Creating project...\").start();\n\n try {\n await copyTemplate(templatePath, targetDir, {\n projectName,\n PROJECT_NAME: projectName,\n author: author || \"your-name\",\n year: new Date().getFullYear().toString(),\n module: options.module || \"\",\n });\n if (templateInfo.runtime === \"go\") {\n // module 替换可能改变导入排序,生成后使用 Go 官方格式化器。\n await execa(\"gofmt\", [\"-w\", \"cmd\", \"internal\", \"pkg\", \"api\"], { cwd: targetDir });\n }\n // 通用规范集中维护,技术栈规范由所选模板提供。\n if (templateInfo.standards === \"base\") {\n const standardsPath = path.join(PATHS.templates, \"base\");\n await copyTemplate(path.join(standardsPath, \".claude\"), path.join(targetDir, \".claude\"));\n await copyFiles(\n [\"AGENTS.md\", \"CLAUDE.md\"].map((file) => ({\n src: path.join(standardsPath, file),\n dest: path.join(targetDir, file),\n })),\n );\n }\n await installTemplateRegistryItems(templateInfo, targetDir);\n\n spinner.succeed(\"Project created\");\n } catch (error) {\n spinner.fail(\"Failed to create project\");\n throw error;\n }\n\n if (shouldGit) {\n const gitSpinner = ora(\"Initializing git repository...\").start();\n try {\n await initializeGitRepository(targetDir);\n gitSpinner.succeed(\"Git repository initialized\");\n } catch (error) {\n gitSpinner.fail(\"Failed to initialize git repository\");\n throw error;\n }\n }\n\n if (shouldInstall) {\n const installSpinner = ora(\"Installing dependencies...\").start();\n try {\n if (templateInfo.runtime === \"go\") {\n await execa(\"go\", [\"mod\", \"download\"], { cwd: targetDir, stdio: \"inherit\" });\n } else {\n await runInstall(targetDir);\n }\n installSpinner.succeed(\"Dependencies installed\");\n } catch (error) {\n installSpinner.fail(\"Failed to install dependencies\");\n throw error;\n }\n }\n\n if (shouldGit) {\n const commitSpinner = ora(\"Creating initial commit...\").start();\n try {\n await createInitialCommit(targetDir);\n commitSpinner.succeed(\"Initial commit created\");\n } catch (error) {\n commitSpinner.fail(\"Failed to create initial commit\");\n throw error;\n }\n }\n\n logger.br();\n logger.success(\"Project ready!\");\n logger.br();\n logger.info(\"Next steps:\");\n logger.info(` cd ${path.relative(process.cwd(), targetDir)}`);\n if (!shouldInstall) {\n logger.info(templateInfo.runtime === \"go\" ? \" go mod download\" : \" pnpm install\");\n }\n if (templateInfo.runtime === \"go\") logger.info(\" make openapi-install\");\n logger.info(templateInfo.runtime === \"go\" ? \" make check\" : \" pnpm dev\");\n logger.br();\n}\n\nfunction validateGoModule(module: string | undefined): void {\n if (\n !module ||\n !/^[a-z0-9]+(?:[.-][a-z0-9]+)+\\/[a-zA-Z0-9_-]+(?:\\/[a-zA-Z0-9_-]+)*$/.test(module)\n ) {\n throw new Error(\"A valid --module path such as example.com/team/service is required\");\n }\n}\n\nasync function installTemplateRegistryItems(\n templateInfo: (typeof TEMPLATES)[TemplateName],\n targetDir: string,\n): Promise<void> {\n const registryItems = \"registryItems\" in templateInfo ? templateInfo.registryItems : undefined;\n if (!registryItems?.length) {\n return;\n }\n\n const registry = await loadRegistry();\n const installPlan = buildComponentInstallPlan({\n componentKeys: [...registryItems],\n framework: \"nuxt\",\n projectRoot: targetDir,\n registry,\n });\n\n await copyFiles(installPlan.filesToCopy, false);\n}\n","import { fileURLToPath } from \"url\";\nimport { dirname, resolve } from \"path\";\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\n// 构建制品携带完整资源,安装后不读取调用者或源码仓库目录。\nconst RESOURCE_ROOT = resolve(__dirname, \"resources\");\n\n// Paths to different resource directories\nexport const PATHS = {\n apple: resolve(RESOURCE_ROOT, \"apple\"),\n templates: resolve(RESOURCE_ROOT, \"templates\"),\n components: resolve(RESOURCE_ROOT, \"components\"),\n snippets: resolve(RESOURCE_ROOT, \"snippets\"),\n packagesRegistry: resolve(RESOURCE_ROOT, \"registry.json\"),\n} as const;\n\n// Available templates\nexport const TEMPLATES = {\n \"mcp-server\": {\n runtime: \"node\",\n standards: \"base\",\n name: \"MCP Server\",\n description: \"Model Context Protocol server template\",\n path: \"mcp-server\",\n },\n nuxt: {\n runtime: \"node\",\n standards: \"base\",\n name: \"Nuxt\",\n description: \"Nuxt 4 product-site starter with editable registry-installed source\",\n path: \"nuxt\",\n registryItems: [\"nuxt-site-source\"],\n },\n \"go-backend\": {\n name: \"Go Backend\",\n description:\n \"Source-derived Go backend foundation with Wire and complete engineering standards\",\n path: \"go-backend\",\n runtime: \"go\",\n standards: \"self\",\n },\n} as const;\n\nexport type TemplateName = keyof typeof TEMPLATES;\n\n// Framework detection patterns\nexport const FRAMEWORK_PATTERNS = {\n nuxt: [\"nuxt\"],\n vue: [\"vue\", \"nuxt\"],\n react: [\"react\", \"next\"],\n node: [\"node\", \"express\", \"fastify\", \"mcp\"],\n} as const;\n\n// Default file paths for components\nexport const DEFAULT_PATHS = {\n nuxt: {\n components: \"app/components\",\n composables: \"app/composables\",\n utils: \"app/utils\",\n },\n vue: {\n components: \"src/components\",\n composables: \"src/composables\",\n utils: \"src/utils\",\n },\n react: {\n components: \"src/components\",\n hooks: \"src/hooks\",\n utils: \"src/utils\",\n },\n node: {\n utils: \"src/utils\",\n services: \"src/services\",\n },\n} as const;\n","import { blue, green, red, yellow, cyan, bold, dim } from \"kolorist\";\n\nexport const logger = {\n info: (msg: string) => console.log(blue(\"info\"), msg),\n success: (msg: string) => console.log(green(\"success\"), msg),\n warn: (msg: string) => console.log(yellow(\"warn\"), msg),\n error: (msg: string) => console.log(red(\"error\"), msg),\n\n // Styled outputs\n title: (msg: string) => console.log(bold(cyan(msg))),\n subtitle: (msg: string) => console.log(dim(msg)),\n step: (step: number, total: number, msg: string) => console.log(dim(`[${step}/${total}]`), msg),\n\n // Blank line\n br: () => console.log(),\n\n // Box output for important messages\n box: (title: string, content: string[]) => {\n const maxLen = Math.max(title.length, ...content.map((c) => c.length));\n const border = \"─\".repeat(maxLen + 2);\n\n console.log(`┌${border}┐`);\n console.log(`│ ${bold(title.padEnd(maxLen))} │`);\n console.log(`├${border}┤`);\n content.forEach((line) => {\n console.log(`│ ${line.padEnd(maxLen)} │`);\n });\n console.log(`└${border}┘`);\n },\n};\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { glob } from \"glob\";\n\n/**\n * Copy directory with template variable replacement\n */\nexport async function copyTemplate(\n src: string,\n dest: string,\n variables: Record<string, string> = {},\n): Promise<void> {\n await fs.ensureDir(dest);\n\n const files = await glob(\"**/*\", {\n cwd: src,\n dot: true,\n nodir: true,\n ignore: [\"**/node_modules/**\", \"**/.git/**\", \"**/tmp/**\", \"**/bin/**\"],\n });\n\n for (const file of files) {\n const srcPath = path.join(src, file);\n let destPath = path.join(dest, file);\n if (path.basename(file) === \"_gitignore\") {\n destPath = path.join(path.dirname(destPath), \".gitignore\");\n }\n\n // Replace template variables in filename\n for (const [key, value] of Object.entries(variables)) {\n destPath = destPath.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), () => value);\n }\n\n await fs.ensureDir(path.dirname(destPath));\n\n // Check if file is text and should be processed\n if (isTextFile(file)) {\n let content = await fs.readFile(srcPath, \"utf-8\");\n\n // Replace template variables in content\n for (const [key, value] of Object.entries(variables)) {\n content = content.replace(new RegExp(`\\\\{\\\\{${key}\\\\}\\\\}`, \"g\"), () => value);\n }\n\n await fs.writeFile(destPath, content);\n await fs.chmod(destPath, (await fs.stat(srcPath)).mode);\n } else {\n await fs.copy(srcPath, destPath);\n }\n }\n}\n\n/**\n * Copy specific files to destination\n */\nexport async function copyFiles(\n files: { src: string; dest: string }[],\n overwrite = false,\n): Promise<{ copied: string[]; skipped: string[] }> {\n const copied: string[] = [];\n const skipped: string[] = [];\n\n for (const { src, dest } of files) {\n if (!overwrite && (await fs.pathExists(dest))) {\n skipped.push(dest);\n continue;\n }\n\n await fs.ensureDir(path.dirname(dest));\n await fs.copy(src, dest);\n copied.push(dest);\n }\n\n return { copied, skipped };\n}\n\n/**\n * Check if file is a text file that should be processed for template variables\n */\nfunction isTextFile(filename: string): boolean {\n const textExtensions = [\n \".ts\",\n \".go\",\n \".mod\",\n \".sum\",\n \".sh\",\n \".mjs\",\n \".sql\",\n \".tsx\",\n \".js\",\n \".jsx\",\n \".vue\",\n \".json\",\n \".md\",\n \".yml\",\n \".yaml\",\n \".html\",\n \".css\",\n \".scss\",\n \".less\",\n \".txt\",\n \".env\",\n \".env.example\",\n \".gitignore\",\n \".prettierrc\",\n \".eslintrc\",\n \".editorconfig\",\n ];\n\n const ext = path.extname(filename).toLowerCase();\n const basename = path.basename(filename);\n\n return (\n textExtensions.includes(ext) || basename.startsWith(\".\") || !ext // Files without extension are often config files\n );\n}\n\n/**\n * Read and parse JSON file\n */\nexport async function readJson<T>(filePath: string): Promise<T | null> {\n try {\n return await fs.readJson(filePath);\n } catch {\n return null;\n }\n}\n\n/**\n * Write JSON file with formatting\n */\nexport async function writeJson(filePath: string, data: unknown): Promise<void> {\n await fs.writeJson(filePath, data, { spaces: 2 });\n}\n\n/**\n * Check if directory is empty\n */\nexport async function isDirEmpty(dir: string): Promise<boolean> {\n if (!(await fs.pathExists(dir))) return true;\n const files = await fs.readdir(dir);\n return files.length === 0;\n}\n\n/**\n * Get relative path from cwd\n */\nexport function relativePath(absolutePath: string): string {\n return path.relative(process.cwd(), absolutePath);\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { execa } from \"execa\";\nimport { type FRAMEWORK_PATTERNS } from \"./constants.js\";\n\nexport interface ProjectInfo {\n name: string;\n root: string;\n packageJson: Record<string, unknown> | null;\n framework: keyof typeof FRAMEWORK_PATTERNS | null;\n hasTypeScript: boolean;\n packageManager: \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n}\n\n/** 从当前目录识别项目。 */\nexport async function detectProject(cwd = process.cwd()): Promise<ProjectInfo> {\n const packageJsonPath = path.join(cwd, \"package.json\");\n const packageJson = (await fs.pathExists(packageJsonPath))\n ? await fs.readJson(packageJsonPath)\n : null;\n\n return {\n name: packageJson?.name || path.basename(cwd),\n root: cwd,\n packageJson,\n framework: detectFramework(packageJson),\n hasTypeScript: await hasTypeScript(cwd),\n packageManager: await detectPackageManager(cwd, packageJson),\n };\n}\n\n/** 从清单依赖识别框架。 */\nfunction detectFramework(\n packageJson: Record<string, unknown> | null,\n): keyof typeof FRAMEWORK_PATTERNS | null {\n if (!packageJson) return null;\n\n const deps = {\n ...(packageJson.dependencies as Record<string, string> | undefined),\n ...(packageJson.devDependencies as Record<string, string> | undefined),\n };\n\n if (deps.nuxt) return \"nuxt\";\n if (deps.vue) return \"vue\";\n if (deps.next || deps.react) return \"react\";\n if (deps.express || deps.fastify || deps[\"@modelcontextprotocol/sdk\"]) return \"node\";\n\n return null;\n}\n\n/** 判断项目是否使用 TypeScript。 */\nasync function hasTypeScript(cwd: string): Promise<boolean> {\n return (\n (await fs.pathExists(path.join(cwd, \"tsconfig.json\"))) ||\n (await fs.pathExists(path.join(cwd, \"tsconfig.base.json\")))\n );\n}\n\n/** 优先使用清单声明,再根据锁文件识别包管理器。 */\nasync function detectPackageManager(\n cwd: string,\n packageJson?: Record<string, unknown> | null,\n): Promise<\"npm\" | \"pnpm\" | \"yarn\" | \"bun\"> {\n const manifest =\n packageJson === undefined\n ? (await fs.pathExists(path.join(cwd, \"package.json\")))\n ? ((await fs.readJson(path.join(cwd, \"package.json\"))) as Record<string, unknown>)\n : null\n : packageJson;\n if (manifest?.packageManager !== undefined) {\n if (typeof manifest.packageManager !== \"string\") {\n throw new Error(\"packageManager must be a string in <name>@<version> format\");\n }\n const match = /^(npm|pnpm|yarn|bun)@[^\\s]+$/.exec(manifest.packageManager);\n if (!match) {\n throw new Error(`Unsupported packageManager: ${manifest.packageManager}`);\n }\n return match[1] as \"npm\" | \"pnpm\" | \"yarn\" | \"bun\";\n }\n if (await fs.pathExists(path.join(cwd, \"pnpm-lock.yaml\"))) return \"pnpm\";\n if (await fs.pathExists(path.join(cwd, \"yarn.lock\"))) return \"yarn\";\n if (\n (await fs.pathExists(path.join(cwd, \"bun.lock\"))) ||\n (await fs.pathExists(path.join(cwd, \"bun.lockb\")))\n )\n return \"bun\";\n return \"npm\";\n}\n\n/** 使用项目声明的包管理器安装依赖。 */\nexport async function installDependencies(\n cwd: string,\n deps: string[],\n isDev = false,\n): Promise<void> {\n const pm = await detectPackageManager(cwd);\n\n const args: string[] = [];\n\n switch (pm) {\n case \"pnpm\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-D\");\n break;\n case \"yarn\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-D\");\n break;\n case \"bun\":\n args.push(\"add\", ...deps);\n if (isDev) args.push(\"-d\");\n break;\n default:\n args.push(\"install\", ...deps);\n if (isDev) args.push(\"--save-dev\");\n }\n\n await execa(pm, args, { cwd, stdio: \"inherit\" });\n}\n\n/** 安装项目清单中的完整依赖。 */\nexport async function runInstall(cwd: string): Promise<void> {\n const pm = await detectPackageManager(cwd);\n await execa(pm, [\"install\"], { cwd, stdio: \"inherit\" });\n}\n\n/** 初始化空 Git 仓库。 */\nexport async function initializeGitRepository(cwd: string): Promise<void> {\n await execa(\"git\", [\"init\"], { cwd });\n}\n\n/** 提交完成物化的项目状态。 */\nexport async function createInitialCommit(cwd: string): Promise<void> {\n await execa(\"git\", [\"add\", \"-A\"], { cwd });\n await execa(\"git\", [\"commit\", \"-m\", \"chore: initial commit\"], { cwd });\n}\n","import fs from \"fs-extra\";\nimport path from \"path\";\nimport { PATHS } from \"./constants.js\";\n\nexport interface ComponentMeta {\n name: string;\n description: string;\n files: RegistryFile[];\n dependencies: string[];\n devDependencies: string[];\n registryDependencies: string[];\n framework: \"nuxt\" | \"vue\" | \"react\" | \"universal\";\n category: string;\n}\n\nexport interface SnippetMeta {\n name: string;\n description: string;\n files: RegistryFile[];\n dependencies: string[];\n devDependencies: string[];\n framework: \"nuxt\" | \"vue\" | \"react\" | \"node\" | \"universal\";\n category: string;\n}\n\nexport type RegistryFile =\n | string\n | {\n path: string;\n target?: string;\n };\n\n/** 可安装的包:npm 普通依赖,或 Nuxt layer(装包 + patch extends) */\nexport interface PackageMeta {\n name: string;\n description: string;\n type: \"npm\" | \"layer\";\n version?: string;\n}\n\nexport interface Registry {\n components: Record<string, ComponentMeta>;\n snippets: Record<string, SnippetMeta>;\n packages: Record<string, PackageMeta>;\n}\n\nlet registryCache: Registry | null = null;\n\n/**\n * Load the component/snippet registry\n */\nexport async function loadRegistry(): Promise<Registry> {\n if (registryCache) return registryCache;\n\n const componentsRegistry = await loadComponentsRegistry();\n const snippetsRegistry = await loadSnippetsRegistry();\n const packagesRegistry = await loadPackagesRegistry();\n\n registryCache = {\n components: componentsRegistry,\n snippets: snippetsRegistry,\n packages: packagesRegistry,\n };\n\n return registryCache;\n}\n\nasync function loadPackagesRegistry(): Promise<Record<string, PackageMeta>> {\n if (await fs.pathExists(PATHS.packagesRegistry)) {\n return await fs.readJson(PATHS.packagesRegistry);\n }\n return {};\n}\n\nasync function loadComponentsRegistry(): Promise<Record<string, ComponentMeta>> {\n const registryPath = path.join(PATHS.components, \"registry.json\");\n if (await fs.pathExists(registryPath)) {\n return await fs.readJson(registryPath);\n }\n return {};\n}\n\nasync function loadSnippetsRegistry(): Promise<Record<string, SnippetMeta>> {\n const registryPath = path.join(PATHS.snippets, \"registry.json\");\n if (await fs.pathExists(registryPath)) {\n return await fs.readJson(registryPath);\n }\n return {};\n}\n\n/**\n * Resolve all dependencies for a component (including nested registry dependencies)\n */\nexport function resolveComponentDependencies(\n componentName: string,\n registry: Registry,\n resolved: Set<string> = new Set(),\n): ComponentMeta[] {\n if (resolved.has(componentName)) return [];\n\n const component = registry.components[componentName];\n if (!component) {\n throw new Error(`Component \"${componentName}\" not found in registry`);\n }\n\n resolved.add(componentName);\n\n const deps: ComponentMeta[] = [];\n\n // Resolve registry dependencies first\n for (const depName of component.registryDependencies) {\n deps.push(...resolveComponentDependencies(depName, registry, resolved));\n }\n\n deps.push(component);\n return deps;\n}\n\n/**\n * Get all available components for a framework\n */\nexport function getComponentsByFramework(\n registry: Registry,\n framework: \"nuxt\" | \"vue\" | \"react\",\n): ComponentMeta[] {\n return Object.values(registry.components).filter(\n (c) =>\n c.framework === framework ||\n c.framework === \"universal\" ||\n (framework === \"nuxt\" && c.framework === \"vue\"),\n );\n}\n\n/**\n * Get all available snippets for a framework\n */\nexport function getSnippetsByFramework(\n registry: Registry,\n framework: \"nuxt\" | \"vue\" | \"react\" | \"node\",\n): SnippetMeta[] {\n return Object.values(registry.snippets).filter(\n (s) =>\n s.framework === framework ||\n s.framework === \"universal\" ||\n (framework === \"nuxt\" && s.framework === \"vue\"),\n );\n}\n\n/**\n * Group items by category\n */\nexport function groupByCategory<T extends { category: string }>(items: T[]): Record<string, T[]> {\n return items.reduce(\n (acc, item) => {\n if (!acc[item.category]) {\n acc[item.category] = [];\n }\n acc[item.category].push(item);\n return acc;\n },\n {} as Record<string, T[]>,\n );\n}\n","import path from \"path\";\nimport { DEFAULT_PATHS, PATHS } from \"./constants.js\";\nimport {\n resolveComponentDependencies,\n type ComponentMeta,\n type Registry,\n type RegistryFile,\n} from \"./registry.js\";\n\nexport type ComponentFramework = \"nuxt\" | \"vue\" | \"react\";\n\nexport interface ComponentInstallPlan {\n components: ComponentMeta[];\n dependencies: string[];\n devDependencies: string[];\n filesToCopy: { src: string; dest: string }[];\n}\n\nexport function resolveComponentFramework(framework: string | null): ComponentFramework | null {\n if (framework === \"nuxt\" || framework === \"vue\" || framework === \"react\") {\n return framework;\n }\n return null;\n}\n\nexport function findComponentKey(registry: Registry, component: ComponentMeta): string {\n const match = Object.entries(registry.components).find(\n ([, candidate]) => candidate === component,\n );\n return match?.[0] ?? component.name.toLowerCase();\n}\n\nexport function buildComponentInstallPlan(input: {\n componentKeys: string[];\n framework: ComponentFramework;\n projectRoot: string;\n registry: Registry;\n targetBase?: string;\n}): ComponentInstallPlan {\n const selectedComponents = input.componentKeys.flatMap((key) =>\n resolveComponentDependencies(key, input.registry),\n );\n const components = [\n ...new Map(\n selectedComponents.map((component) => [\n findComponentKey(input.registry, component),\n component,\n ]),\n ).values(),\n ];\n\n const filesToCopy = components.flatMap((component) =>\n component.files.map((file) =>\n resolveComponentFile({\n component,\n file,\n framework: input.framework,\n projectRoot: input.projectRoot,\n targetBase: input.targetBase,\n }),\n ),\n );\n\n return {\n components,\n dependencies: [...new Set(components.flatMap((component) => component.dependencies))],\n devDependencies: [...new Set(components.flatMap((component) => component.devDependencies))],\n filesToCopy,\n };\n}\n\nfunction resolveComponentFile(input: {\n component: ComponentMeta;\n file: RegistryFile;\n framework: ComponentFramework;\n projectRoot: string;\n targetBase?: string;\n}): { src: string; dest: string } {\n const normalized = typeof input.file === \"string\" ? { path: input.file } : input.file;\n const sourceFramework =\n input.component.framework === \"universal\" ? input.framework : input.component.framework;\n const sourcePath = path.join(PATHS.components, sourceFramework, normalized.path);\n\n if (normalized.target) {\n return {\n src: sourcePath,\n dest: path.resolve(input.projectRoot, normalized.target),\n };\n }\n\n const targetBase =\n input.targetBase || DEFAULT_PATHS[input.framework]?.components || \"src/components\";\n\n return {\n src: sourcePath,\n dest: path.resolve(input.projectRoot, targetBase, path.basename(normalized.path)),\n };\n}\n","import path from \"path\";\nimport fs from \"fs-extra\";\nimport prompts from \"prompts\";\nimport ora from \"ora\";\nimport { PATHS, DEFAULT_PATHS } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport { copyFiles } from \"../utils/fs.js\";\nimport { detectProject, installDependencies } from \"../utils/project.js\";\nimport { patchNuxtConfigExtends } from \"../utils/nuxt-config.js\";\nimport {\n buildComponentInstallPlan,\n findComponentKey,\n resolveComponentFramework,\n} from \"../utils/registry-install.js\";\nimport {\n loadRegistry,\n resolveComponentDependencies,\n getComponentsByFramework,\n getSnippetsByFramework,\n groupByCategory,\n type ComponentMeta,\n type PackageMeta,\n type SnippetMeta,\n} from \"../utils/registry.js\";\n\ninterface AddOptions {\n component?: boolean;\n snippet?: boolean;\n all?: boolean;\n yes?: boolean;\n overwrite?: boolean;\n path?: string;\n}\n\nexport async function add(items: string[], options: AddOptions): Promise<void> {\n logger.br();\n\n // Detect project info\n const project = await detectProject();\n\n if (!project.packageJson) {\n logger.error(\"No package.json found. Please run this command in a project directory.\");\n process.exit(1);\n }\n\n // Load registry\n const registry = await loadRegistry();\n\n // Package dispatch (npm / layer) takes precedence for matching names\n const packageItems = items.filter((i) => registry.packages[i]).map((i) => registry.packages[i]!);\n if (packageItems.length > 0) {\n await addPackages(packageItems, project);\n }\n const nonPackageItems = items.filter((i) => !registry.packages[i]);\n if (items.length > 0 && nonPackageItems.length === 0) return;\n\n // Determine what type of items to add\n const isComponent = options.component || (!options.snippet && !options.component);\n const isSnippet = options.snippet;\n\n if (isComponent) {\n await addComponents(nonPackageItems, options, project, registry);\n } else if (isSnippet) {\n await addSnippets(nonPackageItems, options, project, registry);\n }\n}\n\n/** 安装 npm/layer 类型的包;layer 额外 patch 项目 nuxt.config 的 extends */\nasync function addPackages(\n packages: PackageMeta[],\n project: Awaited<ReturnType<typeof detectProject>>,\n): Promise<void> {\n for (const pkg of packages) {\n const spec = pkg.version ? `${pkg.name}@${pkg.version}` : pkg.name;\n const spinner = ora(`Installing ${pkg.name}...`).start();\n try {\n await installDependencies(project.root, [spec]);\n spinner.succeed(`Installed ${pkg.name}`);\n } catch (error) {\n spinner.fail(`Failed to install ${pkg.name}`);\n throw error;\n }\n if (pkg.type === \"layer\") {\n await patchProjectNuxtConfig(project.root, pkg.name);\n }\n }\n}\n\nasync function patchProjectNuxtConfig(root: string, layer: string): Promise<void> {\n const candidates = [\"nuxt.config.ts\", \"nuxt.config.js\", \"nuxt.config.mjs\"];\n for (const file of candidates) {\n const configPath = path.join(root, file);\n if (!(await fs.pathExists(configPath))) continue;\n const source = await fs.readFile(configPath, \"utf8\");\n try {\n const patched = patchNuxtConfigExtends(source, layer);\n if (patched === source) {\n logger.info(`${layer} already in ${file} extends`);\n } else {\n await fs.writeFile(configPath, patched);\n logger.success(`Added ${layer} to ${file} extends`);\n }\n } catch {\n logger.warn(`Could not auto-patch ${file}; add \"${layer}\" to extends manually`);\n }\n return;\n }\n logger.warn(`No nuxt.config found; add \"${layer}\" to your nuxt.config extends manually`);\n}\n\nasync function addComponents(\n items: string[],\n options: AddOptions,\n project: Awaited<ReturnType<typeof detectProject>>,\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n): Promise<void> {\n const framework = resolveComponentFramework(project.framework);\n\n if (!framework) {\n logger.error(\"Could not detect framework. Supported: Nuxt, Vue, React\");\n process.exit(1);\n }\n\n const availableComponents = getComponentsByFramework(registry, framework);\n\n if (availableComponents.length === 0) {\n logger.warn(`No components available for ${framework}`);\n return;\n }\n\n let selectedComponents: ComponentMeta[] = [];\n\n if (options.all) {\n // Add all components\n selectedComponents = availableComponents;\n } else if (items.length > 0) {\n // Add specified components\n for (const item of items) {\n try {\n const deps = resolveComponentDependencies(item, registry);\n selectedComponents.push(...deps);\n } catch (error) {\n logger.error((error as Error).message);\n process.exit(1);\n }\n }\n } else {\n // Interactive selection\n const grouped = groupByCategory(availableComponents);\n const choices = Object.entries(grouped).flatMap(([category, components]) => [\n { title: category, disabled: true, value: \"\" },\n ...components.map((c) => ({\n title: ` ${c.name}`,\n description: c.description,\n value: findComponentKey(registry, c),\n })),\n ]);\n\n const response = await prompts({\n type: \"multiselect\",\n name: \"components\",\n message: \"Select components to add:\",\n choices,\n hint: \"- Space to select. Return to submit\",\n });\n\n if (!response.components || response.components.length === 0) {\n logger.info(\"No components selected\");\n return;\n }\n\n for (const name of response.components) {\n const deps = resolveComponentDependencies(name, registry);\n selectedComponents.push(...deps);\n }\n }\n\n const componentKeys = [\n ...new Set(selectedComponents.map((component) => findComponentKey(registry, component))),\n ];\n\n if (selectedComponents.length === 0) {\n logger.info(\"No components to add\");\n return;\n }\n\n // Confirm\n if (!options.yes) {\n logger.info(\"Components to add:\");\n selectedComponents.forEach((c) => logger.info(` - ${c.name}`));\n logger.br();\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Proceed?\",\n initial: true,\n });\n\n if (!confirm) {\n logger.info(\"Cancelled\");\n return;\n }\n }\n\n const installPlan = buildComponentInstallPlan({\n componentKeys,\n framework,\n projectRoot: project.root,\n registry,\n targetBase: options.path,\n });\n\n // Copy files\n const spinner = ora(\"Adding components...\").start();\n\n try {\n const { copied, skipped } = await copyFiles(installPlan.filesToCopy, options.overwrite);\n\n spinner.succeed(`Added ${copied.length} file(s)`);\n\n if (skipped.length > 0) {\n logger.warn(`Skipped ${skipped.length} existing file(s). Use --overwrite to replace.`);\n }\n } catch (error) {\n spinner.fail(\"Failed to add components\");\n throw error;\n }\n\n // Install dependencies\n const uniqueDeps = installPlan.dependencies;\n const uniqueDevDeps = installPlan.devDependencies;\n\n if (uniqueDeps.length > 0 || uniqueDevDeps.length > 0) {\n const { shouldInstall } = options.yes\n ? { shouldInstall: true }\n : await prompts({\n type: \"confirm\",\n name: \"shouldInstall\",\n message: \"Install required dependencies?\",\n initial: true,\n });\n\n if (shouldInstall) {\n const installSpinner = ora(\"Installing dependencies...\").start();\n try {\n if (uniqueDeps.length > 0) {\n await installDependencies(project.root, uniqueDeps, false);\n }\n if (uniqueDevDeps.length > 0) {\n await installDependencies(project.root, uniqueDevDeps, true);\n }\n installSpinner.succeed(\"Dependencies installed\");\n } catch (error) {\n installSpinner.fail(\"Failed to install some dependencies\");\n }\n }\n }\n\n logger.br();\n logger.success(\"Done!\");\n}\n\nasync function addSnippets(\n items: string[],\n options: AddOptions,\n project: Awaited<ReturnType<typeof detectProject>>,\n registry: Awaited<ReturnType<typeof loadRegistry>>,\n): Promise<void> {\n const framework =\n project.framework === \"nuxt\"\n ? \"nuxt\"\n : project.framework === \"vue\"\n ? \"vue\"\n : project.framework === \"react\"\n ? \"react\"\n : \"node\";\n\n const availableSnippets = getSnippetsByFramework(registry, framework);\n\n if (availableSnippets.length === 0) {\n logger.warn(`No snippets available for ${framework}`);\n return;\n }\n\n let selectedSnippets: SnippetMeta[] = [];\n\n if (options.all) {\n selectedSnippets = availableSnippets;\n } else if (items.length > 0) {\n for (const item of items) {\n const snippet = registry.snippets[item];\n if (!snippet) {\n logger.error(`Snippet \"${item}\" not found`);\n process.exit(1);\n }\n selectedSnippets.push(snippet);\n }\n } else {\n const grouped = groupByCategory(availableSnippets);\n const choices = Object.entries(grouped).flatMap(([category, snippets]) => [\n { title: category, disabled: true, value: \"\" },\n ...snippets.map((s) => ({\n title: ` ${s.name}`,\n description: s.description,\n value: s.name.toLowerCase(),\n })),\n ]);\n\n const response = await prompts({\n type: \"multiselect\",\n name: \"snippets\",\n message: \"Select snippets to add:\",\n choices,\n hint: \"- Space to select. Return to submit\",\n });\n\n if (!response.snippets || response.snippets.length === 0) {\n logger.info(\"No snippets selected\");\n return;\n }\n\n selectedSnippets = response.snippets.map((name: string) => registry.snippets[name]);\n }\n\n if (selectedSnippets.length === 0) {\n logger.info(\"No snippets to add\");\n return;\n }\n\n // Confirm\n if (!options.yes) {\n logger.info(\"Snippets to add:\");\n selectedSnippets.forEach((s) => logger.info(` - ${s.name}`));\n logger.br();\n\n const { confirm } = await prompts({\n type: \"confirm\",\n name: \"confirm\",\n message: \"Proceed?\",\n initial: true,\n });\n\n if (!confirm) {\n logger.info(\"Cancelled\");\n return;\n }\n }\n\n // Determine target path\n const targetBase = options.path || DEFAULT_PATHS[framework]?.utils || \"src/utils\";\n const targetDir = path.resolve(project.root, targetBase);\n\n // Copy files\n const spinner = ora(\"Adding snippets...\").start();\n\n const filesToCopy: { src: string; dest: string }[] = [];\n\n for (const snippet of selectedSnippets) {\n // Use snippet's own framework for source path (node, vue, react, or universal -> node)\n const snippetFramework = snippet.framework === \"universal\" ? \"node\" : snippet.framework;\n const snippetDir = path.join(PATHS.snippets, snippetFramework);\n\n for (const file of snippet.files) {\n const normalized = typeof file === \"string\" ? { path: file } : file;\n filesToCopy.push({\n src: path.join(snippetDir, normalized.path),\n dest: normalized.target\n ? path.resolve(project.root, normalized.target)\n : path.join(targetDir, path.basename(normalized.path)),\n });\n }\n }\n\n try {\n const { copied, skipped } = await copyFiles(filesToCopy, options.overwrite);\n spinner.succeed(`Added ${copied.length} file(s)`);\n\n if (skipped.length > 0) {\n logger.warn(`Skipped ${skipped.length} existing file(s)`);\n }\n } catch (error) {\n spinner.fail(\"Failed to add snippets\");\n throw error;\n }\n\n logger.br();\n logger.success(\"Done!\");\n}\n","function escapeRegExp(value: string): string {\n return value.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\");\n}\n\n/**\n * 幂等地把一个 layer 加入 nuxt.config 的 `extends` 数组。\n * - 已含该 layer → 原样返回\n * - 已有 extends 数组 → 在数组头插入\n * - 仅有 defineNuxtConfig({ ... }) → 注入 extends\n * - 都识别不了 → 抛错,由调用方提示手动添加\n */\nexport function patchNuxtConfigExtends(source: string, layer: string): string {\n const already = new RegExp(`extends\\\\s*:\\\\s*\\\\[[^\\\\]]*['\"]${escapeRegExp(layer)}['\"]`);\n if (already.test(source)) return source;\n\n const extendsArray = /extends\\s*:\\s*\\[/;\n if (extendsArray.test(source)) {\n return source.replace(extendsArray, (match) => `${match}\"${layer}\", `);\n }\n\n const define = /defineNuxtConfig\\(\\{/;\n if (define.test(source)) {\n return source.replace(define, (match) => `${match}\\n extends: [\"${layer}\"],`);\n }\n\n throw new Error(\n \"Could not locate defineNuxtConfig in nuxt.config; add the layer to `extends` manually\",\n );\n}\n","import { TEMPLATES } from \"../utils/constants.js\";\nimport { logger } from \"../utils/logger.js\";\nimport {\n loadRegistry,\n groupByCategory,\n type ComponentMeta,\n type SnippetMeta,\n} from \"../utils/registry.js\";\n\ninterface ListOptions {\n templates?: boolean;\n components?: boolean;\n snippets?: boolean;\n}\n\nexport async function list(type: string | undefined, options: ListOptions): Promise<void> {\n logger.br();\n\n const showAll = !options.templates && !options.components && !options.snippets && !type;\n const showTemplates = options.templates || type === \"templates\" || showAll;\n const showComponents = options.components || type === \"components\" || showAll;\n const showSnippets = options.snippets || type === \"snippets\" || showAll;\n\n if (showTemplates) {\n listTemplates();\n }\n\n if (showComponents) {\n await listComponents();\n }\n\n if (showSnippets) {\n await listSnippets();\n }\n}\n\nfunction listTemplates(): void {\n logger.title(\"Templates\");\n logger.br();\n\n const entries = Object.entries(TEMPLATES);\n\n if (entries.length === 0) {\n logger.info(\" No templates available\");\n } else {\n for (const [key, template] of entries) {\n logger.info(` ${key}`);\n logger.subtitle(` ${template.description}`);\n }\n }\n\n logger.br();\n logger.subtitle(\" Usage: stackonward init --template <name>\");\n logger.br();\n}\n\nasync function listComponents(): Promise<void> {\n logger.title(\"Components\");\n logger.br();\n\n const registry = await loadRegistry();\n const components = Object.values(registry.components);\n\n if (components.length === 0) {\n logger.info(\" No components available\");\n logger.br();\n return;\n }\n\n // Group by framework first\n const byFramework: Record<string, ComponentMeta[]> = {};\n for (const component of components) {\n const fw = component.framework;\n if (!byFramework[fw]) byFramework[fw] = [];\n byFramework[fw].push(component);\n }\n\n for (const [framework, fwComponents] of Object.entries(byFramework)) {\n logger.info(` [${framework}]`);\n\n const grouped = groupByCategory(fwComponents);\n\n for (const [category, catComponents] of Object.entries(grouped)) {\n logger.subtitle(` ${category}/`);\n for (const component of catComponents) {\n logger.info(` - ${component.name.toLowerCase()}: ${component.description}`);\n }\n }\n\n logger.br();\n }\n\n logger.subtitle(\" Usage: stackonward add <component-name>\");\n logger.br();\n}\n\nasync function listSnippets(): Promise<void> {\n logger.title(\"Snippets\");\n logger.br();\n\n const registry = await loadRegistry();\n const snippets = Object.values(registry.snippets);\n\n if (snippets.length === 0) {\n logger.info(\" No snippets available\");\n logger.br();\n return;\n }\n\n // Group by framework first\n const byFramework: Record<string, SnippetMeta[]> = {};\n for (const snippet of snippets) {\n const fw = snippet.framework;\n if (!byFramework[fw]) byFramework[fw] = [];\n byFramework[fw].push(snippet);\n }\n\n for (const [framework, fwSnippets] of Object.entries(byFramework)) {\n logger.info(` [${framework}]`);\n\n const grouped = groupByCategory(fwSnippets);\n\n for (const [category, catSnippets] of Object.entries(grouped)) {\n logger.subtitle(` ${category}/`);\n for (const snippet of catSnippets) {\n logger.info(` - ${snippet.name.toLowerCase()}: ${snippet.description}`);\n }\n }\n\n logger.br();\n }\n\n logger.subtitle(\" Usage: stackonward add -s <snippet-name>\");\n logger.br();\n}\n","import { Command } from \"commander\";\nimport { z } from \"zod\";\nimport path from \"node:path\";\nimport os from \"node:os\";\nimport { mkdir, writeFile, readFile, realpath } from \"node:fs/promises\";\nimport { copyTemplate, copyFiles, isDirEmpty } from \"../utils/fs.js\";\nimport { PATHS } from \"../utils/constants.js\";\nimport {\n DeliveryError,\n intents,\n parseIntent,\n type CommandResult,\n type DeliveryPlan,\n} from \"../apple/contracts.js\";\nimport {\n loadManifest,\n manifestSchema,\n parseSchema,\n readJsonFile,\n validateStage,\n fileDigest,\n} from \"../apple/manifest.js\";\nimport { loadCredentials } from \"../apple/credentials.js\";\nimport { createAppleGateway } from \"../apple/api.js\";\nimport { bindingPath, readBindings, writePrivateJson } from \"../apple/state.js\";\nimport { PlanBuilder } from \"../apple/plan.js\";\nimport { executePlan } from \"../apple/execute.js\";\nimport { planIdentifiers, findApp } from \"../apple/resources/identifiers.js\";\nimport { planMetadata } from \"../apple/resources/metadata.js\";\nimport { planCatalog } from \"../apple/resources/catalog.js\";\nimport {\n planAssets,\n planCatalogAssets,\n planReviewAttachments,\n createAssetTransfer,\n} from \"../apple/resources/assets.js\";\nimport { planPricing } from \"../apple/resources/pricing.js\";\nimport { planOffers } from \"../apple/resources/offers.js\";\nimport { planAppCommerce } from \"../apple/resources/app-commerce.js\";\nimport { planReview } from \"../apple/resources/review.js\";\nimport { planRelease } from \"../apple/resources/release.js\";\nimport { planTestFlight } from \"../apple/resources/testflight.js\";\nimport { createProcessRunner } from \"../apple/process.js\";\nimport { createAppleBuildTools } from \"../apple/fastlane.js\";\nimport { planSigning, planBuild, planUpload } from \"../apple/resources/build.js\";\nimport { planNative } from \"../apple/resources/native.js\";\nimport { inspectDelivery, runtimeHandoff } from \"../apple/resources/inspection.js\";\nimport { validateImage } from \"../apple/resources/assets.js\";\n\ninterface Options {\n manifest: string;\n account?: string;\n scope: string;\n intent?: string;\n state?: string;\n plan?: string;\n out?: string;\n yes?: boolean;\n json?: boolean;\n offline?: boolean;\n}\n\n/** 输出只使用本工具定义的安全字段,不序列化异常或供应商正文。 */\nasync function guarded(run: () => Promise<unknown>, json = false): Promise<void> {\n try {\n const result = await run();\n process.stdout.write(JSON.stringify(result, null, json ? undefined : 2) + \"\\n\");\n } catch (error) {\n const failure =\n error instanceof DeliveryError ? error : new DeliveryError(\"apple_command_failed\", 5);\n process.stdout.write(\n JSON.stringify({\n schemaVersion: 1,\n outcome: failure.exitCode === 7 ? \"unknown\" : \"failed\",\n code: failure.code,\n field: failure.field,\n httpStatus: failure.httpStatus,\n }) + \"\\n\",\n );\n process.exitCode = failure.exitCode;\n }\n}\n\nexport function registerApple(program: Command): void {\n const apple = program\n .command(\"apple\")\n .description(\"Plan, reconcile and verify Apple app delivery\");\n apple\n .command(\"import-assets <directory> <files...>\")\n .description(\"Copy explicit local artwork into an empty product asset directory\")\n .action((directory: string, files: string[]) =>\n guarded(async () => {\n const target = path.resolve(directory);\n if (!(await isDirEmpty(target)))\n throw new DeliveryError(\"initialization_directory_not_empty\", 2);\n const inputs = await Promise.all(\n files.map(async (filename) => {\n const source = await realpath(filename),\n name = path.basename(source),\n bytes = await readFile(source);\n if (!/\\.(png|jpe?g|mp4|mov)$/i.test(name))\n throw new DeliveryError(\"unsupported_asset_format\", 2);\n if (/\\.(png|jpe?g)$/i.test(name)) validateImage(bytes);\n return { source, name, sha256: fileDigest(bytes) };\n }),\n );\n if (new Set(inputs.map((v) => v.name.toLowerCase())).size !== inputs.length)\n throw new DeliveryError(\"duplicate_asset_filename\", 2);\n const copied = await copyFiles(\n inputs.map((v) => ({ src: v.source, dest: path.join(target, v.name) })),\n );\n if (copied.skipped.length) throw new DeliveryError(\"asset_destination_changed\", 4);\n for (const input of inputs) {\n if (fileDigest(await readFile(path.join(target, input.name))) !== input.sha256)\n throw new DeliveryError(\"asset_source_changed\", 4);\n }\n await writeFile(\n path.join(target, \"provenance.json\"),\n JSON.stringify(\n { schemaVersion: 1, files: inputs.map(({ name, sha256 }) => ({ file: name, sha256 })) },\n null,\n 2,\n ) + \"\\n\",\n { flag: \"wx\" },\n );\n return {\n outcome: \"verified\",\n files: inputs.map(({ name, sha256 }) => ({ file: name, sha256 })),\n };\n }),\n );\n for (const mode of [\"status\", \"export\", \"handoff\"] as const)\n apple\n .command(mode)\n .description(\"Read Apple resources without publishing or changing configuration\")\n .requiredOption(\"--manifest <file>\", \"Product manifest\")\n .requiredOption(\"--account <file>\", \"Private account JSON\")\n .option(\"--state <directory>\", \"Private binding directory\")\n .option(\"--out <file>\", \"New private JSON export file\")\n .option(\"--json\", \"Machine-readable JSON\")\n .action((options: Options) =>\n guarded(async () => {\n const loaded = await loadManifest(path.resolve(options.manifest));\n const credentials = await loadCredentials(path.resolve(options.account!));\n const state = path.resolve(\n options.state ??\n path.join(\n os.homedir(),\n \".stackonward\",\n \"apple\",\n credentials.fingerprint,\n loaded.manifest.app.bundleId,\n ),\n );\n const bindings = await readBindings(\n bindingPath(state, credentials.fingerprint, loaded.manifest.app.bundleId),\n );\n const builder = new PlanBuilder(\n loaded,\n parseIntent(\"setup\", \"reconcile\"),\n credentials.fingerprint,\n Date.now(),\n bindings,\n );\n const api = createAppleGateway(credentials);\n if (mode === \"export\" && !options.out)\n throw new DeliveryError(\"export_destination_required\", 2);\n const result =\n mode === \"handoff\"\n ? await runtimeHandoff(builder, api)\n : {\n schemaVersion: 1,\n bundleId: loaded.manifest.app.bundleId,\n resources: await inspectDelivery(builder, api, mode === \"export\"),\n manualRequirements: builder.requirements,\n };\n if (options.out) {\n const destination = path.resolve(options.out);\n await mkdir(path.dirname(destination), { recursive: true, mode: 0o700 });\n await writeFile(destination, JSON.stringify(result, null, 2) + \"\\n\", {\n flag: \"wx\",\n mode: 0o600,\n });\n }\n return result;\n }, options.json),\n );\n apple\n .command(\"schema\")\n .description(\"Print the versioned manifest JSON Schema\")\n .action(() => guarded(async () => z.toJSONSchema(manifestSchema)));\n apple\n .command(\"init <directory>\")\n .description(\"Create an empty Apple delivery workspace\")\n .requiredOption(\"--bundle-id <id>\", \"Explicit iOS bundle identifier\")\n .requiredOption(\"--name <name>\", \"App display name\")\n .action((directory: string, options: { bundleId: string; name: string }) =>\n guarded(async () => {\n const manifest = parseSchema(manifestSchema, {\n schemaVersion: 1,\n app: { bundleId: options.bundleId, name: options.name, platform: \"IOS\" },\n });\n const target = path.resolve(directory);\n if (!(await isDirEmpty(target)))\n throw new DeliveryError(\"initialization_directory_not_empty\", 2);\n await mkdir(target, { recursive: true });\n await copyTemplate(PATHS.apple, target);\n await writeFile(path.join(target, \"app.json\"), JSON.stringify(manifest, null, 2) + \"\\n\", {\n flag: \"wx\",\n });\n await writeFile(\n path.join(target, \"manifest.schema.json\"),\n JSON.stringify(z.toJSONSchema(manifestSchema), null, 2) + \"\\n\",\n { flag: \"wx\" },\n );\n return {\n schemaVersion: 1,\n outcome: \"verified\",\n directory: target,\n verifiedChecks: [\"manifest\", \"bundled-resources\"],\n };\n }),\n );\n for (const mode of [\"preflight\", \"plan\", \"apply\", \"verify\"] as const) {\n apple\n .command(mode)\n .description(`${mode} one explicitly selected delivery scope`)\n .requiredOption(\"--manifest <file>\", \"Product manifest\")\n .requiredOption(\"--scope <scope>\", `Scope: ${Object.keys(intents).join(\", \")}`)\n .option(\"--intent <action>\", \"Explicit action within the scope\")\n .option(\"--account <file>\", \"Private account JSON (mode 0600)\")\n .option(\"--state <directory>\", \"Private durable state directory\")\n .option(\"--plan <file>\", \"Saved plan to revalidate and apply\")\n .option(\"--out <file>\", \"Save private plan JSON\")\n .option(\"--offline\", \"Validate local configuration only\")\n .option(\"--yes\", \"Execute the exact saved intent\")\n .option(\"--json\", \"Machine-readable JSON\")\n .action((options: Options) => guarded(() => runApple(mode, options), options.json));\n }\n}\n\nasync function runApple(\n mode: \"preflight\" | \"plan\" | \"apply\" | \"verify\",\n options: Options,\n): Promise<unknown> {\n const intent = parseIntent(options.scope, options.intent ?? \"reconcile\");\n const loaded = await loadManifest(path.resolve(options.manifest));\n validateStage(loaded.manifest, intent.scope);\n if (options.offline) {\n if (mode !== \"preflight\") throw new DeliveryError(\"offline_requires_preflight\", 2);\n return {\n schemaVersion: 1,\n scope: intent.scope,\n outcome: \"verified\",\n verifiedChecks: [\"local-manifest\", \"referenced-files\"],\n remoteVerified: false,\n inputDigest: loaded.inputDigest,\n };\n }\n if (!options.account) throw new DeliveryError(\"account_configuration_required\", 2);\n const credentials = await loadCredentials(path.resolve(options.account));\n const state = path.resolve(\n options.state ??\n path.join(\n os.homedir(),\n \".stackonward\",\n \"apple\",\n credentials.fingerprint,\n loaded.manifest.app.bundleId,\n ),\n );\n const controller = new AbortController();\n const cancel = () => controller.abort();\n process.once(\"SIGINT\", cancel);\n process.once(\"SIGTERM\", cancel);\n try {\n const api = createAppleGateway(credentials, { signal: controller.signal });\n const prepare = async () => {\n const current = await loadManifest(path.resolve(options.manifest));\n const bindings = await readBindings(\n bindingPath(state, credentials.fingerprint, current.manifest.app.bundleId),\n );\n const builder = new PlanBuilder(\n current,\n intent,\n credentials.fingerprint,\n Date.now(),\n bindings,\n );\n const transfer = createAssetTransfer({ signal: controller.signal });\n const runner = createProcessRunner(controller.signal);\n const buildTools = createAppleBuildTools(\n current,\n credentials,\n runner,\n PATHS.apple,\n controller.signal,\n );\n switch (intent.scope) {\n case \"setup\":\n await planIdentifiers(builder, api);\n break;\n case \"native\":\n await planNative(builder, credentials, buildTools);\n break;\n case \"metadata\":\n await planMetadata(builder, api);\n break;\n case \"catalog\":\n await planCatalog(builder, api);\n break;\n case \"assets\":\n if (current.manifest.assets) await planAssets(builder, api, transfer);\n if (intent.action === \"reconcile\") {\n await planCatalogAssets(builder, api, transfer);\n await planReviewAttachments(builder, api, transfer);\n }\n break;\n case \"pricing\":\n if (await findApp(builder, api)) {\n if (current.manifest.catalog) {\n await planPricing(builder, api);\n await planOffers(builder, api);\n }\n await planAppCommerce(builder, api);\n }\n break;\n case \"review\":\n if (await findApp(builder, api)) await planReview(builder, api);\n break;\n case \"release\":\n await planRelease(builder, api);\n break;\n case \"testflight\":\n if (await findApp(builder, api)) await planTestFlight(builder, api);\n break;\n case \"signing\":\n await planSigning(builder, credentials, buildTools);\n break;\n case \"build\":\n await planBuild(builder, credentials, buildTools, runner);\n break;\n case \"upload\":\n if (await findApp(builder, api))\n await planUpload(builder, api, credentials, buildTools, runner, controller.signal);\n break;\n }\n return builder.finish();\n };\n if (mode === \"apply\") {\n if (!options.yes || !options.plan)\n throw new DeliveryError(\"saved_plan_and_explicit_execution_required\", 2);\n const saved = (await readJsonFile(path.resolve(options.plan))) as DeliveryPlan;\n if (\n !saved ||\n typeof saved !== \"object\" ||\n saved.scope !== intent.scope ||\n saved.intent?.action !== intent.action ||\n saved.accountFingerprint !== credentials.fingerprint ||\n saved.bundleId !== loaded.manifest.app.bundleId\n )\n throw new DeliveryError(\"plan_identity_mismatch\", 4);\n const result = await executePlan(saved, prepare, state, controller.signal);\n process.exitCode =\n result.receipt.outcome === \"verified\"\n ? 0\n : result.receipt.outcome === \"blocked\"\n ? 6\n : result.receipt.outcome === \"unknown\"\n ? 7\n : result.receipt.outcome === \"cancelled\"\n ? 130\n : 5;\n return result;\n }\n const prepared = await prepare();\n if (mode === \"plan\") {\n if (options.out) await writePrivateJson(path.resolve(options.out), prepared.plan);\n return prepared.plan;\n }\n const outcome =\n prepared.plan.manualRequirements.length ||\n (mode === \"verify\" && prepared.plan.operations.length)\n ? \"blocked\"\n : \"verified\";\n if (outcome === \"blocked\") process.exitCode = prepared.plan.manualRequirements.length ? 6 : 4;\n return {\n schemaVersion: 1,\n scope: intent.scope,\n intent,\n outcome,\n verifiedChecks: [\n \"local-manifest\",\n ...([\"native\", \"build\", \"signing\"].includes(intent.scope)\n ? [\"local-toolchain\"]\n : [\"authenticated-api-read\"]),\n ...(mode === \"verify\" && outcome === \"verified\" ? [\"desired-state\"] : []),\n ],\n pendingOperations: prepared.plan.operations,\n resources: prepared.resources,\n manualRequirements: prepared.plan.manualRequirements,\n } satisfies CommandResult & { pendingOperations: unknown[] };\n } finally {\n process.off(\"SIGINT\", cancel);\n process.off(\"SIGTERM\", cancel);\n }\n}\n","export const intents = {\n setup: [\"reconcile\"],\n native: [\"configure\"],\n metadata: [\"reconcile\"],\n assets: [\"reconcile\", \"remove-owned-assets\"],\n catalog: [\"reconcile\"],\n pricing: [\"reconcile\"],\n signing: [\"initialize\", \"sync\"],\n build: [\"archive\"],\n upload: [\"upload\"],\n testflight: [\"prepare\", \"review\", \"distribute\", \"invite\"],\n review: [\"prepare\", \"submit\", \"withdraw\"],\n release: [\"configure\", \"publish\", \"pause\", \"resume\", \"complete\"],\n} as const;\nexport type Scope = keyof typeof intents;\nexport type Intent = { [S in Scope]: { scope: S; action: (typeof intents)[S][number] } }[Scope];\nexport type Outcome = \"verified\" | \"blocked\" | \"failed\" | \"unknown\" | \"cancelled\";\nexport interface ResourceReference {\n type: string;\n id: string;\n}\nexport interface AppleResource extends ResourceReference {\n attributes: Record<string, unknown>;\n relationships?: Record<string, { data?: ResourceReference | ResourceReference[] | null }>;\n}\nexport interface ManualRequirement {\n code: string;\n stage: Scope;\n reason: string;\n consoleUrl: string;\n evidence: \"remote-readback\" | \"operator-attestation\";\n blockedOperationIds: string[];\n}\nexport interface Operation {\n id: string;\n resourceKey: string;\n action:\n | \"create\"\n | \"update\"\n | \"upload\"\n | \"submit\"\n | \"release\"\n | \"withdraw\"\n | \"distribute\"\n | \"invite\"\n | \"pause\"\n | \"resume\"\n | \"complete\"\n | \"remove-owned-asset\";\n fields: string[];\n dependencies: string[];\n beforeDigest: string;\n desiredDigest: string;\n}\nexport interface DeliveryPlan {\n schemaVersion: 1;\n scope: Scope;\n intent: Intent;\n accountFingerprint: string;\n bundleId: string;\n appId?: string;\n inputDigest: string;\n snapshotDigest: string;\n createdAt: string;\n expiresAt: string;\n operations: Operation[];\n commercialConfiguration?: Record<string, unknown>;\n manualRequirements: ManualRequirement[];\n}\nexport interface ExecutionReceipt {\n executionId: string;\n scope: Scope;\n intent: Intent;\n inputDigest: string;\n outcome: Outcome;\n completed: ResourceReference[];\n pending: string[];\n manualRequirements: ManualRequirement[];\n failure?: { code: string; httpStatus?: number; field?: string; retryable: boolean };\n}\nexport interface CommandResult {\n schemaVersion: 1;\n scope: Scope;\n intent?: Intent;\n outcome: Outcome;\n code?: string;\n verifiedChecks: string[];\n resources: ResourceReference[];\n manualRequirements: ManualRequirement[];\n receiptPath?: string;\n}\nexport interface Clock {\n now(): number;\n sleep(ms: number, signal?: AbortSignal): Promise<void>;\n}\nexport interface ProcessRunner {\n run(\n executable: string,\n args: string[],\n options: {\n cwd: string;\n env: Record<string, string>;\n timeoutMs: number;\n signal?: AbortSignal;\n },\n ): Promise<{ stdout: string; stderr: string }>;\n}\nexport interface AppleGateway {\n list(path: string, query?: Record<string, string>): Promise<AppleResource[]>;\n read(path: string): Promise<AppleResource>;\n create(\n path: string,\n type: string,\n attributes: Record<string, unknown>,\n relationships?: Record<string, unknown>,\n included?: Record<string, unknown>[],\n ): Promise<AppleResource>;\n update(\n path: string,\n resource: ResourceReference,\n attributes: Record<string, unknown>,\n relationships?: Record<string, unknown>,\n ): Promise<AppleResource>;\n remove(path: string): Promise<void>;\n relationship(\n path: string,\n data: ResourceReference[],\n method?: \"POST\" | \"PATCH\" | \"DELETE\",\n ): Promise<void>;\n}\n\n/** 只允许固定错误码进入命令输出,供应商正文和密钥不进入消息。 */\nexport class DeliveryError extends Error {\n constructor(\n readonly code: string,\n readonly exitCode: number,\n readonly field?: string,\n readonly httpStatus?: number,\n readonly retryable = false,\n readonly writeRejected = false,\n ) {\n super(code);\n this.name = \"DeliveryError\";\n }\n}\n\n/** 阶段与动作共同限定执行授权,不接受任意字符串透传到供应商。 */\nexport function parseIntent(scope: string, action: string): Intent {\n if (!Object.hasOwn(intents, scope)) throw new DeliveryError(\"invalid_scope\", 2, \"scope\");\n const selected = scope as Scope;\n if (!(intents[selected] as readonly string[]).includes(action)) {\n throw new DeliveryError(\"invalid_intent\", 2, \"intent\");\n }\n return { scope: selected, action } as Intent;\n}\n","import { z } from \"zod\";\nimport { readFile, realpath, stat } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { createHash } from \"node:crypto\";\nimport { DeliveryError, type Scope } from \"./contracts.js\";\n\nconst text = z.string().min(1);\nconst id = z.string().regex(/^[A-Za-z0-9_-]+$/);\nconst locale = z.string().regex(/^[a-z]{2,3}(?:-[A-Za-z]{2,4})?$/);\nconst territory = z.string().regex(/^[A-Z]{3}$/);\nconst file = text;\nconst decimal = z.string().regex(/^(0|[1-9]\\d*)(\\.\\d{1,3})?$/);\nconst url = z.url({ protocol: /^https$/ });\nconst period = z.enum([\n \"ONE_WEEK\",\n \"ONE_MONTH\",\n \"TWO_MONTHS\",\n \"THREE_MONTHS\",\n \"SIX_MONTHS\",\n \"ONE_YEAR\",\n]);\nconst localizedProduct = z.strictObject({\n locale,\n name: text.max(30),\n description: z.string().max(55).optional(),\n});\nconst price = z.strictObject({\n territory,\n customerPrice: decimal,\n currency: z.string().regex(/^[A-Z]{3}$/),\n pricePointId: text.optional(),\n startDate: z.iso.date().optional(),\n preserveCurrentPrice: z.boolean().optional(),\n});\nconst appPrice = price\n .omit({ preserveCurrentPrice: true })\n .extend({ endDate: z.iso.date().optional() });\nconst asset = z.strictObject({\n file,\n locale: locale.optional(),\n displayType: id.optional(),\n order: z.number().int().min(0).optional(),\n previewType: id.optional(),\n previewFrameTimeCode: text.optional(),\n});\nconst fields = z.strictObject({\n name: z.string().max(30).optional(),\n subtitle: z.string().max(30).optional(),\n privacyPolicyUrl: url.optional(),\n privacyChoicesUrl: url.optional(),\n description: z.string().max(4000).optional(),\n keywords: z.string().max(100).optional(),\n promotionalText: z.string().max(170).optional(),\n whatsNew: z.string().max(4000).optional(),\n supportUrl: url.optional(),\n marketingUrl: url.optional(),\n});\nconst group = z.strictObject({\n key: id,\n remoteId: id.optional(),\n name: text,\n localizations: z\n .array(z.strictObject({ locale, name: text.max(75), customAppName: text.max(30).optional() }))\n .default([]),\n});\nconst offerDuration = z.enum([\n \"THREE_DAYS\",\n \"ONE_WEEK\",\n \"TWO_WEEKS\",\n \"ONE_MONTH\",\n \"TWO_MONTHS\",\n \"THREE_MONTHS\",\n \"SIX_MONTHS\",\n \"ONE_YEAR\",\n]);\nconst offerBase = {\n key: id,\n duration: offerDuration,\n numberOfPeriods: z.number().int().positive(),\n offerMode: z.enum([\"FREE_TRIAL\", \"PAY_AS_YOU_GO\", \"PAY_UP_FRONT\"]),\n prices: z.array(z.strictObject({ territory, pricePointId: text.optional() })).min(1),\n};\nconst offer = z.discriminatedUnion(\"kind\", [\n z.strictObject({\n ...offerBase,\n kind: z.literal(\"introductory\"),\n startDate: z.iso.date(),\n endDate: z.iso.date().optional(),\n }),\n z.strictObject({ ...offerBase, kind: z.literal(\"promotional\"), name: text, offerCode: text }),\n z.strictObject({\n ...offerBase,\n kind: z.literal(\"code\"),\n name: text,\n customerEligibilities: z.array(z.enum([\"NEW\", \"EXISTING\", \"EXPIRED\"])).min(1),\n offerEligibility: z.enum([\"STACK_WITH_INTRO_OFFERS\", \"REPLACE_INTRO_OFFERS\"]),\n autoRenewEnabled: z.boolean(),\n }),\n]);\nconst itemBase = {\n productId: z\n .string()\n .regex(/^[A-Za-z0-9_.-]+$/)\n .max(100),\n name: text.max(64),\n familySharable: z.boolean().optional(),\n reviewNote: z.string().optional(),\n localizations: z.array(localizedProduct).default([]),\n promotionalImage: file.optional(),\n reviewScreenshot: file.optional(),\n replaceReviewScreenshotId: id.optional(),\n prices: z.array(price).default([]),\n availability: z\n .strictObject({\n territories: z.array(territory).min(1),\n availableInNewTerritories: z.boolean(),\n })\n .optional(),\n};\nconst subscription = z.strictObject({\n ...itemBase,\n kind: z.literal(\"subscription\"),\n groupKey: id,\n duration: period,\n level: z.number().int().min(1).max(100),\n offers: z.array(offer).default([]),\n});\nconst purchase = z.strictObject({\n ...itemBase,\n kind: z.enum([\"CONSUMABLE\", \"NON_CONSUMABLE\", \"NON_RENEWING_SUBSCRIPTION\"]),\n baseTerritory: territory.optional(),\n prices: z.array(appPrice).default([]),\n});\nexport const manifestSchema = z.strictObject({\n schemaVersion: z.literal(1),\n app: z.strictObject({\n bundleId: z.string().regex(/^[A-Za-z0-9-]+(?:\\.[A-Za-z0-9-]+){2,}$/),\n name: text.max(50),\n platform: z.literal(\"IOS\"),\n sku: text.optional(),\n primaryLocale: locale.optional(),\n appId: z.string().regex(/^\\d+$/).optional(),\n }),\n capabilities: z\n .strictObject({\n signInWithApple: z.literal(true).optional(),\n pushNotifications: z.literal(true).optional(),\n inAppPurchase: z.literal(true).optional(),\n })\n .default({}),\n metadata: z\n .strictObject({\n localizations: z.array(z.strictObject({ locale, file })).default([]),\n primaryCategory: id.optional(),\n secondaryCategory: id.optional(),\n copyright: text.optional(),\n ageRatingFile: file.optional(),\n licenseAgreementFile: file.optional(),\n })\n .optional(),\n assets: z\n .strictObject({\n icon: file.optional(),\n iconVariants: z.strictObject({ dark: file.optional(), tinted: file.optional() }).optional(),\n screenshots: z.array(asset).default([]),\n previews: z.array(asset).default([]),\n removeOwnedIds: z\n .array(z.strictObject({ type: z.enum([\"appScreenshots\", \"appPreviews\"]), id }))\n .default([]),\n })\n .optional(),\n catalog: z\n .strictObject({\n groups: z.array(group).default([]),\n items: z.array(z.discriminatedUnion(\"kind\", [subscription, purchase])).default([]),\n gracePeriod: z\n .strictObject({\n optIn: z.boolean(),\n sandboxOptIn: z.boolean(),\n duration: z.enum([\"THREE_DAYS\", \"SIXTEEN_DAYS\", \"TWENTY_EIGHT_DAYS\"]),\n renewalType: z.enum([\"ALL_RENEWALS\", \"PAID_TO_PAID_ONLY\"]),\n })\n .optional(),\n })\n .optional(),\n availability: z\n .strictObject({\n territories: z.array(territory).min(1),\n availableInNewTerritories: z.boolean(),\n })\n .optional(),\n appPricing: z\n .strictObject({ baseTerritory: territory, prices: z.array(appPrice).min(1) })\n .optional(),\n release: z\n .strictObject({\n version: z.string().regex(/^\\d+(?:\\.\\d+){0,2}$/),\n buildNumber: z.string().regex(/^\\d+(?:\\.\\d+){0,2}$/),\n buildId: id.optional(),\n mode: z.enum([\"MANUAL\", \"AFTER_APPROVAL\", \"SCHEDULED\"]).default(\"MANUAL\"),\n earliestReleaseDate: z.iso.datetime().optional(),\n reviewSubmissionId: id.optional(),\n reviewItems: z\n .strictObject({\n includeApp: z.boolean(),\n productIds: z.array(text),\n groupKeys: z.array(id),\n })\n .optional(),\n phasedRelease: z.boolean().optional(),\n phasedReleaseId: id.optional(),\n firstPurchaseTypes: z\n .array(\n z.enum([\"subscription\", \"CONSUMABLE\", \"NON_CONSUMABLE\", \"NON_RENEWING_SUBSCRIPTION\"]),\n )\n .default([]),\n })\n .optional(),\n review: z\n .strictObject({\n credentialsRef: file,\n notesFile: file.optional(),\n attachments: z.array(file).default([]),\n })\n .optional(),\n declarations: z\n .array(\n z.strictObject({\n code: id,\n file,\n confirmed: z.boolean(),\n evidence: z.enum([\"operator-attestation\", \"remote-readback\"]),\n consoleUrl: url,\n }),\n )\n .default([]),\n build: z\n .strictObject({\n kind: z.enum([\"flutter\", \"xcode\"]),\n projectRoot: file,\n projectPath: file,\n scheme: text,\n targetName: text,\n configuration: text.default(\"Release\"),\n flutterExecutable: file.optional(),\n bundleExecutable: file.optional(),\n additionalTargets: z.array(z.strictObject({ name: text, bundleId: text })).default([]),\n flutterVersion: text.optional(),\n xcodeVersion: text,\n publicDefinesFile: file.optional(),\n workspace: file.optional(),\n iconSetPath: file.optional(),\n infoPlistPath: file.optional(),\n entitlementsPath: file.optional(),\n outputPath: file.default(\"build/apple\"),\n })\n .optional(),\n signing: z\n .strictObject({\n storageUrl: url,\n profileType: z.enum([\"appstore\", \"development\", \"adhoc\"]),\n bundleIds: z.array(text).min(1),\n readonly: z.boolean().default(true),\n })\n .optional(),\n testflight: z\n .strictObject({\n groupIds: z.array(id).default([]),\n betaDescription: z.string().optional(),\n feedbackEmail: z.email().optional(),\n whatsNew: z.string().optional(),\n locale: locale.optional(),\n external: z.boolean().default(false),\n notifyTesters: z.boolean().default(false),\n invitationsRef: file.optional(),\n })\n .optional(),\n});\nexport type Manifest = z.infer<typeof manifestSchema>;\nexport type CatalogItem = NonNullable<Manifest[\"catalog\"]>[\"items\"][number];\nexport type LocaleFields = z.infer<typeof fields>;\nexport const accountSchema = z.strictObject({\n teamId: z.string().regex(/^[A-Z0-9]{10}$/),\n keyId: z.string().regex(/^[A-Z0-9]{10}$/),\n issuerId: z.uuid(),\n privateKeyPath: text,\n signingSecretsFile: file.optional(),\n});\nexport type Account = z.infer<typeof accountSchema>;\nexport interface LoadedManifest {\n manifest: Manifest;\n directory: string;\n inputDigest: string;\n files: Map<string, Buffer>;\n}\n\n/** JSON 错误只报告字段位置,不回显可能包含密钥的输入值。 */\nexport function parseSchema<T>(schema: z.ZodType<T>, input: unknown): T {\n const result = schema.safeParse(input);\n if (!result.success)\n throw new DeliveryError(\"invalid_configuration\", 2, result.error.issues[0]?.path.join(\".\"));\n return result.data;\n}\n\n/** 固定键序使配置摘要不随 JSON 的格式或对象键顺序改变。 */\nexport function canonical(value: unknown): string {\n if (value === undefined) return \"null\";\n if (value === null || typeof value !== \"object\") return JSON.stringify(value);\n if (Array.isArray(value)) return `[${value.map(canonical).join(\",\")}]`;\n return `{${Object.entries(value)\n .filter(([, v]) => v !== undefined)\n .sort(([a], [b]) => a.localeCompare(b))\n .map(([k, v]) => `${JSON.stringify(k)}:${canonical(v)}`)\n .join(\",\")}}`;\n}\nexport function digest(value: unknown): string {\n return createHash(\"sha256\").update(canonical(value)).digest(\"hex\");\n}\nexport function fileDigest(bytes: Buffer): string {\n return createHash(\"sha256\").update(bytes).digest(\"hex\");\n}\n\nexport async function readJsonFile(filename: string): Promise<unknown> {\n let value: string;\n try {\n value = await readFile(filename, \"utf8\");\n } catch {\n throw new DeliveryError(\"file_unreadable\", 2, filename);\n }\n try {\n return JSON.parse(value);\n } catch {\n throw new DeliveryError(\"invalid_json\", 2, filename);\n }\n}\n\n/** 以实际路径约束资源目录,阻止符号链接将发布输入引向其它文件。 */\nexport async function resolveFile(root: string, relative: string): Promise<string> {\n const base = await realpath(root);\n let target: string;\n try {\n target = await realpath(path.resolve(base, relative));\n } catch {\n throw new DeliveryError(\"file_unreadable\", 2, relative);\n }\n if (!target.startsWith(base + path.sep) || !(await stat(target)).isFile())\n throw new DeliveryError(\"asset_path_outside_root\", 2, relative);\n return target;\n}\n\nexport async function loadManifest(filename: string): Promise<LoadedManifest> {\n const manifest = parseSchema(manifestSchema, await readJsonFile(filename));\n const directory = path.dirname(await realpath(filename));\n const files = new Map<string, Buffer>();\n const paths = [\n ...(manifest.metadata?.localizations.map((v) => v.file) ?? []),\n manifest.metadata?.ageRatingFile,\n manifest.metadata?.licenseAgreementFile,\n manifest.assets?.icon,\n manifest.assets?.iconVariants?.dark,\n manifest.assets?.iconVariants?.tinted,\n ...(manifest.assets?.screenshots.map((v) => v.file) ?? []),\n ...(manifest.assets?.previews.map((v) => v.file) ?? []),\n ...(manifest.catalog?.items.flatMap((v) => [v.promotionalImage, v.reviewScreenshot]) ?? []),\n manifest.review?.notesFile,\n ...(manifest.review?.attachments ?? []),\n ...manifest.declarations.map((v) => v.file),\n ];\n for (const name of paths)\n if (name) files.set(name, await readFile(await resolveFile(directory, name)));\n for (const entry of manifest.metadata?.localizations ?? [])\n parseSchema(fields, JSON.parse(files.get(entry.file)!.toString(\"utf8\")));\n unique(manifest.metadata?.localizations.map((v) => v.locale) ?? [], \"metadata.localizations\");\n unique(manifest.catalog?.groups.map((v) => v.key) ?? [], \"catalog.groups\");\n unique(manifest.catalog?.items.map((v) => v.productId) ?? [], \"catalog.items\");\n for (const item of manifest.catalog?.items ?? []) {\n unique(\n item.localizations.map((v) => v.locale),\n `catalog.${item.productId}.localizations`,\n );\n if (item.kind === \"subscription\") {\n unique(\n item.offers.map((v) => v.key),\n `catalog.${item.productId}.offers`,\n );\n for (const offer of item.offers) {\n unique(\n offer.prices.map((v) => v.territory),\n `catalog.${item.productId}.offers.${offer.key}.prices`,\n );\n if (offer.kind === \"introductory\" && offer.endDate && offer.endDate <= offer.startDate)\n throw new DeliveryError(\"offer_date_interval_invalid\", 2, offer.key);\n }\n }\n if (\n item.kind === \"subscription\" &&\n !manifest.catalog?.groups.some((g) => g.key === item.groupKey)\n )\n throw new DeliveryError(\"subscription_group_missing\", 2, item.productId);\n }\n for (const group of manifest.catalog?.groups ?? [])\n unique(\n group.localizations.map((v) => v.locale),\n `catalog.groups.${group.key}.localizations`,\n );\n for (const prices of [\n manifest.appPricing?.prices ?? [],\n ...(manifest.catalog?.items.filter((v) => v.kind !== \"subscription\").map((v) => v.prices) ??\n []),\n ])\n for (const region of new Set(prices.map((v) => v.territory))) {\n const intervals = prices\n .filter((v) => v.territory === region)\n .sort((a, b) => (a.startDate ?? \"\").localeCompare(b.startDate ?? \"\"));\n for (let i = 0; i < intervals.length; i++) {\n const current = intervals[i],\n previous = intervals[i - 1];\n if (\n (current.endDate && current.startDate && current.endDate <= current.startDate) ||\n (previous &&\n (!previous.endDate || !current.startDate || previous.endDate > current.startDate))\n )\n throw new DeliveryError(\"app_price_interval_invalid\", 2, region);\n }\n }\n if (manifest.release?.mode === \"SCHEDULED\" && !manifest.release.earliestReleaseDate)\n throw new DeliveryError(\"release_date_required\", 2);\n return {\n manifest,\n directory,\n files,\n inputDigest: digest({\n manifest,\n files: [...files].map(([name, data]) => [name, fileDigest(data)]),\n }),\n };\n}\n\nfunction unique(values: string[], field: string): void {\n if (new Set(values).size !== values.length)\n throw new DeliveryError(\"duplicate_configuration_key\", 2, field);\n}\nexport function localeFields(loaded: LoadedManifest, filename: string): LocaleFields {\n return parseSchema(fields, JSON.parse(loaded.files.get(filename)!.toString(\"utf8\")));\n}\n\nexport function validateStage(manifest: Manifest, scope: Scope): void {\n const required: Partial<Record<Scope, boolean>> = {\n metadata: !!manifest.metadata,\n assets:\n !!manifest.assets ||\n !!manifest.catalog?.items.some((v) => v.promotionalImage || v.reviewScreenshot) ||\n !!manifest.review?.attachments.length,\n catalog: !!manifest.catalog,\n pricing: !!manifest.catalog || !!manifest.appPricing || !!manifest.availability,\n native: !!manifest.build,\n build: !!manifest.build && !!manifest.release && !!manifest.signing,\n upload: !!manifest.build && !!manifest.release && !!manifest.signing,\n signing: !!manifest.signing,\n testflight: !!manifest.testflight,\n review: !!manifest.release,\n release: !!manifest.release,\n };\n if (required[scope] === false) throw new DeliveryError(\"stage_configuration_required\", 2, scope);\n}\n","import { createPrivateKey, sign } from \"node:crypto\";\nimport { readFile, stat, realpath } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { DeliveryError } from \"./contracts.js\";\nimport { accountSchema, parseSchema, readJsonFile, digest, type Account } from \"./manifest.js\";\n\nexport interface AppleCredentials {\n account: Account;\n fingerprint: string;\n token(): string;\n}\n\n/** 密钥只在单次调用内持有,签名结果不持久化。 */\nexport async function loadCredentials(filename: string, now = Date.now): Promise<AppleCredentials> {\n await requirePrivateFile(filename);\n const account = parseSchema(accountSchema, await readJsonFile(filename));\n const privateKeyPath = await realpath(\n path.resolve(path.dirname(filename), account.privateKeyPath),\n );\n await requirePrivateFile(privateKeyPath);\n let key;\n try {\n key = createPrivateKey(await readFile(privateKeyPath));\n } catch {\n throw new DeliveryError(\"invalid_private_key\", 2);\n }\n if (key.asymmetricKeyType !== \"ec\" || key.asymmetricKeyDetails?.namedCurve !== \"prime256v1\") {\n throw new DeliveryError(\"invalid_signing_curve\", 2);\n }\n return {\n account: {\n ...account,\n privateKeyPath,\n ...(account.signingSecretsFile\n ? { signingSecretsFile: path.resolve(path.dirname(filename), account.signingSecretsFile) }\n : {}),\n },\n fingerprint: digest({\n teamId: account.teamId,\n keyId: account.keyId,\n issuerId: account.issuerId,\n }),\n token() {\n const seconds = Math.floor(now() / 1000);\n const encode = (v: unknown) => Buffer.from(JSON.stringify(v)).toString(\"base64url\");\n const message = `${encode({ alg: \"ES256\", kid: account.keyId, typ: \"JWT\" })}.${encode({ iss: account.issuerId, iat: seconds, exp: seconds + 300, aud: \"appstoreconnect-v1\" })}`;\n return `${message}.${sign(\"sha256\", Buffer.from(message), { key, dsaEncoding: \"ieee-p1363\" }).toString(\"base64url\")}`;\n },\n };\n}\n\nexport async function requirePrivateFile(filename: string): Promise<void> {\n let info;\n try {\n info = await stat(filename);\n } catch {\n throw new DeliveryError(\"credential_file_unreadable\", 2);\n }\n if (\n !info.isFile() ||\n (info.mode & 0o077) !== 0 ||\n (process.getuid && info.uid !== process.getuid())\n ) {\n throw new DeliveryError(\"credential_file_permissions\", 2);\n }\n}\n","import { createApiClient, ApiHttpError, NormalizedApiError } from \"@stackonward/api-client\";\nimport { z } from \"zod\";\nimport { setTimeout as delay } from \"node:timers/promises\";\nimport {\n DeliveryError,\n type AppleGateway,\n type AppleResource,\n type ResourceReference,\n type Clock,\n} from \"./contracts.js\";\nimport type { AppleCredentials } from \"./credentials.js\";\n\nexport const APPLE_ORIGIN = \"https://api.appstoreconnect.apple.com\";\nconst reference = z.object({ type: z.string().min(1), id: z.string().min(1) });\nconst resource = reference.extend({\n attributes: z.record(z.string(), z.unknown()).default({}),\n relationships: z\n .record(\n z.string(),\n z.object({ data: z.union([reference, z.array(reference), z.null()]).optional() }),\n )\n .optional(),\n});\nexport const systemClock: Clock = {\n now: Date.now,\n async sleep(ms, signal) {\n await delay(ms, undefined, { signal });\n },\n};\n\n/** API 凭据只能发往官方 origin;资源上传不使用这个客户端。 */\nexport function createAppleGateway(\n credentials: AppleCredentials,\n options: { fetch?: typeof fetch; clock?: Clock; signal?: AbortSignal } = {},\n): AppleGateway {\n const fetcher = options.fetch ?? globalThis.fetch;\n const clock = options.clock ?? systemClock;\n const transport = createApiClient({\n baseUrl: APPLE_ORIGIN,\n timeout: 20_000,\n maxRetries: 0,\n headers: () => ({\n Authorization: `Bearer ${credentials.token()}`,\n \"User-Agent\": \"stackonward-apple/1\",\n }),\n fetch: async (input, init) => {\n const url = new URL(\n typeof input === \"string\" ? input : input instanceof URL ? input.href : input.url,\n );\n if (url.origin !== APPLE_ORIGIN || url.username || url.password)\n throw new DeliveryError(\"untrusted_api_origin\", 2);\n return fetcher(input, { ...init, redirect: \"error\" });\n },\n });\n function apiPath(value: string): string {\n const url = new URL(value, APPLE_ORIGIN);\n if (\n url.origin !== APPLE_ORIGIN ||\n !/^\\/v[12]\\//.test(url.pathname) ||\n url.username ||\n url.password ||\n url.hash\n )\n throw new DeliveryError(\"invalid_api_path\", 2);\n return url.pathname + url.search;\n }\n async function request(\n method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\",\n location: string,\n body?: unknown,\n ): Promise<unknown> {\n if (options.signal?.aborted) throw new DeliveryError(\"cancelled\", 130);\n for (let attempt = 0; ; attempt++) {\n try {\n return await transport.request<unknown>(method, apiPath(location), {\n body,\n signal: options.signal,\n });\n } catch (error) {\n if (options.signal?.aborted)\n throw new DeliveryError(\n method === \"GET\" ? \"cancelled\" : \"apple_write_outcome_unknown\",\n method === \"GET\" ? 130 : 7,\n );\n const status = error instanceof NormalizedApiError ? error.statusCode : undefined;\n const retryable =\n status === 408 ||\n status === 429 ||\n (status !== undefined && status >= 500) ||\n (error instanceof NormalizedApiError && [\"network\", \"timeout\"].includes(error.kind));\n if (method === \"GET\" && retryable && attempt < 3) {\n const raw = error instanceof NormalizedApiError ? error.cause : undefined;\n const retry =\n raw instanceof ApiHttpError ? raw.response.headers.get(\"retry-after\") : null;\n const wait = retry\n ? /^\\d+$/.test(retry)\n ? Number(retry) * 1000\n : Date.parse(retry) - clock.now()\n : 500 * 2 ** attempt;\n await clock.sleep(\n Math.min(60_000, Math.max(500, Number.isFinite(wait) ? wait : 500)) +\n Math.floor(Math.random() * 100),\n options.signal,\n );\n continue;\n }\n if (error instanceof DeliveryError) throw error;\n const writeRejected =\n method !== \"GET\" &&\n status !== undefined &&\n status >= 400 &&\n status < 500 &&\n status !== 408;\n if (status === 401 || status === 403)\n throw new DeliveryError(\n status === 401 ? \"apple_authentication_failed\" : \"apple_permission_denied\",\n 3,\n undefined,\n status,\n false,\n writeRejected,\n );\n if (status === 409 || status === 422)\n throw new DeliveryError(\n \"apple_resource_conflict\",\n 4,\n undefined,\n status,\n false,\n writeRejected,\n );\n if (method !== \"GET\" && retryable && !writeRejected)\n throw new DeliveryError(\"apple_write_outcome_unknown\", 7, undefined, status);\n throw new DeliveryError(\n \"apple_request_failed\",\n 5,\n undefined,\n status,\n method === \"GET\" && retryable,\n writeRejected,\n );\n }\n }\n }\n function decode(value: unknown): AppleResource {\n const parsed = z.object({ data: resource }).safeParse(value);\n if (!parsed.success) throw new DeliveryError(\"invalid_apple_response\", 5);\n return parsed.data.data;\n }\n return {\n async list(location, query = {}) {\n const url = new URL(apiPath(location), APPLE_ORIGIN);\n for (const [key, value] of Object.entries(query)) url.searchParams.set(key, value);\n let next: string | null = url.href;\n const visited = new Set<string>();\n const all: AppleResource[] = [];\n while (next) {\n const current = apiPath(next);\n if (visited.has(current) || visited.size >= 1000)\n throw new DeliveryError(\"invalid_apple_pagination\", 5);\n visited.add(current);\n const parsed = z\n .object({\n data: z.array(resource),\n links: z.object({ next: z.string().nullable().optional() }).optional(),\n })\n .safeParse(await request(\"GET\", current));\n if (!parsed.success) throw new DeliveryError(\"invalid_apple_response\", 5);\n all.push(...parsed.data.data);\n next = parsed.data.links?.next ?? null;\n }\n return all;\n },\n async read(location) {\n return decode(await request(\"GET\", location));\n },\n async create(location, type, attributes, relationships, included) {\n return decode(\n await request(\"POST\", location, {\n data: {\n type,\n ...(Object.keys(attributes).length ? { attributes } : {}),\n ...(relationships ? { relationships } : {}),\n },\n ...(included ? { included } : {}),\n }),\n );\n },\n async update(location, ref, attributes, relationships) {\n return decode(\n await request(\"PATCH\", location, {\n data: {\n type: ref.type,\n id: ref.id,\n ...(Object.keys(attributes).length ? { attributes } : {}),\n ...(relationships ? { relationships } : {}),\n },\n }),\n );\n },\n async remove(location) {\n await request(\"DELETE\", location);\n },\n async relationship(location, data, method = \"POST\") {\n await request(method, location, { data });\n },\n };\n}\n\nexport function relation(type: string, id: string): { data: ResourceReference } {\n return { data: { type, id } };\n}\nexport function selectOne(values: AppleResource[], code: string): AppleResource | undefined {\n if (values.length > 1) throw new DeliveryError(code, 4);\n return values[0];\n}\nexport function stringAttribute(resource: AppleResource, field: string): string {\n const value = resource.attributes[field];\n if (typeof value !== \"string\") throw new DeliveryError(\"invalid_apple_attribute\", 5, field);\n return value;\n}\n\n/** 父资源已确认存在时,可选关系的 404 表示尚未配置;权限与传输失败必须保留。 */\nexport async function readOptionalRelationship<T>(read: () => Promise<T>): Promise<T | undefined> {\n try {\n return await read();\n } catch (error) {\n if (error instanceof DeliveryError && error.httpStatus === 404) return undefined;\n throw error;\n }\n}\n","import { mkdir, open, rename, rm, lstat, realpath, readFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { z } from \"zod\";\nimport path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { DeliveryError, type ResourceReference } from \"./contracts.js\";\nimport { digest, parseSchema } from \"./manifest.js\";\n\n/** 写入私有执行目录时拒绝符号链接,避免覆盖调用者的其它文件。 */\nexport async function privateDirectory(directory: string): Promise<string> {\n await mkdir(directory, { recursive: true, mode: 0o700 });\n const info = await lstat(directory);\n if (!info.isDirectory() || info.isSymbolicLink() || (info.mode & 0o077) !== 0)\n throw new DeliveryError(\"state_directory_permissions\", 2);\n return realpath(directory);\n}\nexport async function writePrivateJson(filename: string, value: unknown): Promise<void> {\n const directory = await privateDirectory(path.dirname(filename));\n const target = path.join(directory, path.basename(filename));\n const temporary = path.join(directory, `.${randomUUID()}.json`);\n const handle = await open(temporary, \"wx\", 0o600);\n try {\n await handle.writeFile(JSON.stringify(value, null, 2) + \"\\n\");\n await handle.sync();\n } finally {\n await handle.close();\n }\n try {\n await rename(temporary, target);\n } finally {\n await rm(temporary, { force: true });\n }\n}\n\n/** 锁只保证同机单写者;CI 必须为相同账号和 App 配置串行组。 */\nexport async function acquireLock(\n _directory: string,\n fingerprint: string,\n bundleId: string,\n): Promise<() => Promise<void>> {\n const root = await privateDirectory(path.join(os.homedir(), \".stackonward\", \"apple-locks\"));\n const lock = path.join(root, `${digest({ fingerprint, bundleId })}.lock`);\n let handle;\n try {\n handle = await open(lock, \"wx\", 0o600);\n } catch {\n throw new DeliveryError(\"delivery_locked\", 4);\n }\n await handle.writeFile(JSON.stringify({ pid: process.pid, startedAt: new Date().toISOString() }));\n await handle.close();\n return async () => {\n await rm(lock);\n };\n}\n\nconst bindingsSchema = z.record(z.string(), z.strictObject({ type: z.string(), id: z.string() }));\nexport function bindingPath(directory: string, fingerprint: string, bundleId: string): string {\n return path.join(directory, `${digest({ fingerprint, bundleId })}.bindings.json`);\n}\nexport async function readBindings(filename: string): Promise<Record<string, ResourceReference>> {\n let bytes: string;\n try {\n bytes = await readFile(filename, \"utf8\");\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") return {};\n throw new DeliveryError(\"bindings_unreadable\", 2);\n }\n try {\n return parseSchema(bindingsSchema, JSON.parse(bytes));\n } catch {\n throw new DeliveryError(\"invalid_bindings\", 2);\n }\n}\n","import {\n DeliveryError,\n type AppleResource,\n type DeliveryPlan,\n type Intent,\n type ManualRequirement,\n type Operation,\n type ResourceReference,\n} from \"./contracts.js\";\nimport { canonical, digest, type LoadedManifest } from \"./manifest.js\";\n\nexport interface Change {\n operation: Operation;\n resumeBoundResource?: boolean;\n apply(): Promise<ResourceReference>;\n}\nexport interface PreparedDelivery {\n plan: DeliveryPlan;\n changes: Change[];\n resources: ResourceReference[];\n satisfied: Record<string, string>;\n connectRecorder(record: (key: string, value: ResourceReference) => Promise<void>): void;\n}\n\n/** 闭包只由具名资源适配器构造;磁盘计划不能指定请求或可执行代码。 */\nexport class PlanBuilder {\n readonly changes: Change[] = [];\n readonly requirements: ManualRequirement[] = [];\n readonly resources = new Map<string, AppleResource>();\n private snapshots: Record<string, unknown> = {};\n private satisfiedDigests: Record<string, string> = {};\n private recorder?: (key: string, value: ResourceReference) => Promise<void>;\n constructor(\n readonly loaded: LoadedManifest,\n readonly intent: Intent,\n readonly fingerprint: string,\n readonly now: number,\n readonly bindings: Record<string, ResourceReference> = {},\n ) {}\n\n async record(key: string, value: ResourceReference): Promise<void> {\n await this.recorder?.(key, { type: value.type, id: value.id });\n }\n\n observe(key: string, current: AppleResource | undefined): void {\n this.snapshots[key] = current ?? null;\n if (current) this.resources.set(key, current);\n }\n satisfy(key: string, desired: unknown): void {\n this.satisfiedDigests[key] = digest(desired);\n }\n require(key: string): AppleResource {\n const value = this.resources.get(key);\n if (!value) throw new DeliveryError(\"resource_dependency_missing\", 4, key);\n return value;\n }\n manual(\n code: string,\n reason: string,\n blockedOperationIds: string[],\n consoleUrl = \"https://appstoreconnect.apple.com/apps\",\n ): void {\n this.requirements.push({\n code,\n stage: this.intent.scope,\n reason,\n blockedOperationIds,\n consoleUrl,\n evidence: \"remote-readback\",\n });\n }\n ensure(\n key: string,\n current: AppleResource | undefined,\n desired: Record<string, unknown>,\n create: () => Promise<AppleResource>,\n update: (value: AppleResource, changed: Record<string, unknown>) => Promise<AppleResource>,\n dependencies: string[] = [],\n ): void {\n this.observe(key, current);\n const changed = Object.fromEntries(\n Object.entries(desired).filter(\n ([field, value]) => canonical(current?.attributes[field]) !== canonical(value),\n ),\n );\n if (current && Object.keys(changed).length === 0) {\n this.satisfy(key, desired);\n return;\n }\n this.add(\n key,\n current ? \"update\" : \"create\",\n current?.attributes ?? null,\n desired,\n Object.keys(changed),\n async () => {\n const result = current ? await update(current, changed) : await create();\n this.resources.set(key, result);\n for (const [field, expected] of Object.entries(desired))\n if (canonical(result.attributes[field]) !== canonical(expected))\n throw new DeliveryError(\"resource_readback_mismatch\", 5, `${key}.${field}`);\n return result;\n },\n dependencies,\n );\n }\n add(\n key: string,\n action: Operation[\"action\"],\n before: unknown,\n desired: unknown,\n fields: string[],\n effect: () => Promise<ResourceReference>,\n dependencies: string[] = [],\n resumeBoundResource = false,\n ): void {\n const operation: Operation = {\n id: key,\n resourceKey: key,\n action,\n fields,\n dependencies,\n beforeDigest: digest(before),\n desiredDigest: digest(desired),\n };\n if (this.changes.some((c) => c.operation.id === key))\n throw new DeliveryError(\"duplicate_operation\", 2, key);\n this.changes.push({\n operation,\n resumeBoundResource,\n apply: async () => {\n const result = await effect();\n await this.record(key, result);\n if (!this.resources.has(key)) this.resources.set(key, { ...result, attributes: {} });\n return result;\n },\n });\n }\n finish(): PreparedDelivery {\n return {\n plan: {\n schemaVersion: 1,\n intent: this.intent,\n scope: this.intent.scope,\n accountFingerprint: this.fingerprint,\n bundleId: this.loaded.manifest.app.bundleId,\n appId: this.loaded.manifest.app.appId,\n inputDigest: this.loaded.inputDigest,\n snapshotDigest: digest(this.snapshots),\n createdAt: new Date(this.now).toISOString(),\n expiresAt: new Date(this.now + 900_000).toISOString(),\n operations: this.changes.map((c) => c.operation),\n manualRequirements: this.requirements,\n ...(this.intent.scope === \"pricing\"\n ? {\n commercialConfiguration: {\n appPricing: this.loaded.manifest.appPricing,\n availability: this.loaded.manifest.availability,\n gracePeriod: this.loaded.manifest.catalog?.gracePeriod,\n products: this.loaded.manifest.catalog?.items.map((item) => ({\n productId: item.productId,\n prices: item.prices,\n availability: item.availability,\n ...(item.kind === \"subscription\"\n ? { offers: item.offers }\n : { baseTerritory: item.baseTerritory }),\n })),\n },\n }\n : {}),\n },\n changes: this.changes,\n resources: [...this.resources.values()].map(({ type, id }) => ({ type, id })),\n satisfied: this.satisfiedDigests,\n connectRecorder: (record) => {\n this.recorder = record;\n },\n };\n }\n}\n\nexport function verifyPlan(saved: DeliveryPlan, fresh: DeliveryPlan, now: number): void {\n if (\n saved.schemaVersion !== 1 ||\n !Number.isFinite(Date.parse(saved.createdAt)) ||\n !Number.isFinite(Date.parse(saved.expiresAt)) ||\n Date.parse(saved.expiresAt) <= Date.parse(saved.createdAt) ||\n now >= Date.parse(saved.expiresAt) ||\n Date.parse(saved.createdAt) > now ||\n Date.parse(saved.expiresAt) - Date.parse(saved.createdAt) > 900_000\n )\n throw new DeliveryError(\"plan_expired\", 4);\n for (const field of [\n \"intent\",\n \"scope\",\n \"accountFingerprint\",\n \"bundleId\",\n \"appId\",\n \"inputDigest\",\n \"snapshotDigest\",\n \"operations\",\n \"manualRequirements\",\n \"commercialConfiguration\",\n ] as const) {\n if (canonical(saved[field]) !== canonical(fresh[field]))\n throw new DeliveryError(\"plan_stale\", 4, field);\n }\n}\n","import path from \"node:path\";\nimport { randomUUID } from \"node:crypto\";\nimport { DeliveryError, type DeliveryPlan, type ExecutionReceipt } from \"./contracts.js\";\nimport { verifyPlan, type PreparedDelivery } from \"./plan.js\";\nimport { acquireLock, writePrivateJson, bindingPath, readBindings } from \"./state.js\";\nimport { readJsonFile, digest, parseSchema } from \"./manifest.js\";\nimport { access } from \"node:fs/promises\";\nimport { z } from \"zod\";\n\n/** 执行前在锁内重建计划,只执行与已确认意图和输入相同的闭包。 */\nexport async function executePlan(\n saved: DeliveryPlan,\n prepare: () => Promise<PreparedDelivery>,\n stateDirectory: string,\n signal?: AbortSignal,\n): Promise<{ receipt: ExecutionReceipt; receiptPath: string }> {\n const unlock = await acquireLock(stateDirectory, saved.accountFingerprint, saved.bundleId);\n const receiptPath = path.join(stateDirectory, `${randomUUID()}.receipt.json`);\n try {\n const fresh = await prepare();\n verifyPlan(saved, fresh.plan, Date.now());\n for (const change of fresh.changes) {\n const action = change.operation.action;\n const special: Record<string, string[]> = {\n \"assets.remove-owned-assets\": [\"remove-owned-asset\"],\n \"review.submit\": [\"submit\"],\n \"review.withdraw\": [\"withdraw\"],\n \"review.prepare\": [\"create\", \"update\"],\n \"testflight.invite\": [\"invite\"],\n \"testflight.distribute\": [\"distribute\"],\n \"testflight.review\": [\"submit\"],\n \"release.publish\": [\"release\"],\n \"release.pause\": [\"pause\"],\n \"release.resume\": [\"resume\"],\n \"release.complete\": [\"complete\"],\n };\n const allowed = special[`${saved.scope}.${saved.intent.action}`] ?? [\n \"create\",\n \"update\",\n \"upload\",\n ];\n if (!allowed.includes(action))\n throw new DeliveryError(\"operation_outside_intent\", 4, change.operation.id);\n }\n const bindingsFile = bindingPath(stateDirectory, saved.accountFingerprint, saved.bundleId);\n const bindings = await readBindings(bindingsFile);\n const journalPath = path.join(\n stateDirectory,\n `${digest({ account: saved.accountFingerprint, bundle: saved.bundleId })}.journal.json`,\n );\n let journal: Record<\n string,\n { desiredDigest: string; status: \"in-flight\" | \"unknown\" | \"verified\" | \"rejected\" }\n > = {};\n let journalExists = true;\n try {\n await access(journalPath);\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code === \"ENOENT\") journalExists = false;\n else throw error;\n }\n if (journalExists)\n journal = parseSchema(\n z.record(\n z.string(),\n z.strictObject({\n desiredDigest: z.string(),\n status: z.enum([\"in-flight\", \"unknown\", \"verified\", \"rejected\"]),\n }),\n ),\n await readJsonFile(journalPath),\n );\n for (const [key, desiredDigest] of Object.entries(fresh.satisfied)) {\n const entry = journal[`${saved.scope}.${key}`];\n if (entry?.desiredDigest === desiredDigest) entry.status = \"verified\";\n }\n await writePrivateJson(journalPath, journal);\n fresh.connectRecorder(async (key, value) => {\n bindings[key] = value;\n await writePrivateJson(bindingsFile, bindings);\n });\n const receipt: ExecutionReceipt = {\n executionId: randomUUID(),\n intent: saved.intent,\n scope: saved.scope,\n inputDigest: saved.inputDigest,\n outcome: \"unknown\",\n completed: [],\n pending: saved.operations.map((v) => v.id),\n manualRequirements: fresh.plan.manualRequirements,\n };\n const blocked = new Set(receipt.manualRequirements.flatMap((r) => r.blockedOperationIds));\n const completed = new Set<string>();\n let activeJournalKey: string | undefined;\n try {\n for (const change of fresh.changes) {\n if (signal?.aborted) throw new DeliveryError(\"cancelled\", 130);\n if (\n blocked.has(change.operation.id) ||\n change.operation.dependencies.some((dep) => blocked.has(dep))\n ) {\n blocked.add(change.operation.id);\n continue;\n }\n if (\n change.operation.dependencies.some(\n (dep) => fresh.changes.some((v) => v.operation.id === dep) && !completed.has(dep),\n )\n )\n throw new DeliveryError(\"operation_dependency_incomplete\", 4);\n const journalKey = `${saved.scope}.${change.operation.id}`;\n const unresolved = journal[journalKey];\n if (\n unresolved &&\n ![\"verified\", \"rejected\"].includes(unresolved.status) &&\n !(\n change.resumeBoundResource &&\n bindings[change.operation.resourceKey] &&\n unresolved.desiredDigest === change.operation.desiredDigest\n )\n )\n throw new DeliveryError(\"previous_write_requires_reconciliation\", 7, change.operation.id);\n activeJournalKey = journalKey;\n journal[journalKey] = {\n desiredDigest: change.operation.desiredDigest,\n status: \"in-flight\",\n };\n await writePrivateJson(journalPath, journal);\n await writePrivateJson(receiptPath, receipt);\n const resource = await change.apply();\n receipt.completed.push({ type: resource.type, id: resource.id });\n completed.add(change.operation.id);\n receipt.pending = receipt.pending.filter((id) => id !== change.operation.id);\n journal[journalKey].status = \"verified\";\n await writePrivateJson(journalPath, journal);\n activeJournalKey = undefined;\n await writePrivateJson(receiptPath, receipt);\n }\n receipt.outcome = receipt.manualRequirements.length ? \"blocked\" : \"verified\";\n } catch (error) {\n const failure =\n error instanceof DeliveryError ? error : new DeliveryError(\"delivery_operation_failed\", 5);\n if (activeJournalKey) {\n const local =\n saved.scope === \"native\" ||\n saved.scope === \"build\" ||\n (saved.scope === \"signing\" && saved.intent.action === \"sync\");\n journal[activeJournalKey].status = local || failure.writeRejected ? \"rejected\" : \"unknown\";\n await writePrivateJson(journalPath, journal);\n }\n receipt.outcome =\n failure.exitCode === 7 ||\n (activeJournalKey && journal[activeJournalKey].status === \"unknown\")\n ? \"unknown\"\n : failure.exitCode === 130\n ? \"cancelled\"\n : \"failed\";\n receipt.failure = {\n code: failure.code,\n httpStatus: failure.httpStatus,\n field: failure.field,\n retryable: failure.retryable,\n };\n }\n await writePrivateJson(receiptPath, receipt);\n return { receipt, receiptPath };\n } finally {\n await unlock();\n }\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { selectOne, relation } from \"../api.js\";\nimport type { PlanBuilder } from \"../plan.js\";\n\nexport async function findApp(\n builder: PlanBuilder,\n api: AppleGateway,\n): Promise<AppleResource | undefined> {\n const config = builder.loaded.manifest.app;\n const app = selectOne(\n await api.list(\"/v1/apps\", { \"filter[bundleId]\": config.bundleId, limit: \"200\" }),\n \"ambiguous_app\",\n );\n if (\n app &&\n (app.attributes.bundleId !== config.bundleId ||\n (config.appId && app.id !== config.appId) ||\n (config.sku && app.attributes.sku !== config.sku) ||\n (config.primaryLocale && app.attributes.primaryLocale !== config.primaryLocale))\n )\n throw new DeliveryError(\"app_identity_mismatch\", 4);\n builder.observe(\"app\", app);\n if (!app)\n builder.manual(\n \"app_record_required\",\n \"Create the App Store Connect record using the configured Bundle ID, SKU and primary locale.\",\n [\"app.bind\"],\n );\n return app;\n}\n\n/** 只管理显式启用的能力,未声明的已有能力保持原样。 */\nexport async function planIdentifiers(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const { app: config, capabilities } = builder.loaded.manifest;\n const bundle = selectOne(\n await api.list(\"/v1/bundleIds\", { \"filter[identifier]\": config.bundleId, limit: \"200\" }),\n \"ambiguous_bundle_id\",\n );\n if (bundle && bundle.attributes.identifier !== config.bundleId)\n throw new DeliveryError(\"bundle_identity_mismatch\", 4);\n const desired = { identifier: config.bundleId, name: config.name, platform: \"UNIVERSAL\" };\n builder.ensure(\n \"bundle\",\n bundle,\n desired,\n async () => {\n const value = await api.create(\"/v1/bundleIds\", \"bundleIds\", desired);\n return api.read(`/v1/bundleIds/${value.id}`);\n },\n async (value, fields) => {\n if (fields.identifier || fields.platform)\n throw new DeliveryError(\"bundle_immutable_field\", 4);\n await api.update(`/v1/bundleIds/${value.id}`, value, fields);\n return api.read(`/v1/bundleIds/${value.id}`);\n },\n );\n const current = bundle ? await api.list(`/v1/bundleIds/${bundle.id}/bundleIdCapabilities`) : [];\n for (const [field, type] of Object.entries({\n signInWithApple: \"APPLE_ID_AUTH\",\n pushNotifications: \"PUSH_NOTIFICATIONS\",\n inAppPurchase: \"IN_APP_PURCHASE\",\n })) {\n const enabled = capabilities[field as keyof typeof capabilities];\n if (enabled === undefined) continue;\n const existing = selectOne(\n current.filter((v) => v.attributes.capabilityType === type),\n \"ambiguous_capability\",\n );\n builder.observe(`capability.${type}`, existing);\n const settings =\n type === \"APPLE_ID_AUTH\"\n ? [\n {\n key: \"APPLE_ID_AUTH_APP_CONSENT\",\n options: [{ key: \"PRIMARY_APP_CONSENT\", enabled: true }],\n },\n ]\n : undefined;\n const agrees = existing && (!settings || primaryConsentEnabled(existing));\n if (agrees) {\n builder.satisfy(`capability.${type}`, { capabilityType: type, settings });\n continue;\n }\n builder.add(\n `capability.${type}`,\n existing ? \"update\" : \"create\",\n existing?.attributes ?? null,\n { capabilityType: type, settings },\n [\"capabilityType\", ...(settings ? [\"settings\"] : [])],\n async () => {\n const parent = builder.require(\"bundle\");\n if (existing)\n await api.update(`/v1/bundleIdCapabilities/${existing.id}`, existing, { settings });\n else\n await api.create(\n \"/v1/bundleIdCapabilities\",\n \"bundleIdCapabilities\",\n { capabilityType: type, ...(settings ? { settings } : {}) },\n { bundleId: relation(\"bundleIds\", parent.id) },\n );\n const found = selectOne(\n (await api.list(`/v1/bundleIds/${parent.id}/bundleIdCapabilities`)).filter(\n (v) => v.attributes.capabilityType === type,\n ),\n \"ambiguous_capability\",\n );\n if (!found) throw new DeliveryError(\"capability_readback_failed\", 5);\n if (settings && !primaryConsentEnabled(found))\n throw new DeliveryError(\"capability_settings_mismatch\", 5);\n return found;\n },\n [\"bundle\"],\n );\n }\n await findApp(builder, api);\n}\n\nfunction primaryConsentEnabled(value: AppleResource): boolean {\n return (\n Array.isArray(value.attributes.settings) &&\n value.attributes.settings.some((setting: unknown) => {\n if (\n !setting ||\n typeof setting !== \"object\" ||\n !(\"key\" in setting) ||\n setting.key !== \"APPLE_ID_AUTH_APP_CONSENT\" ||\n !(\"options\" in setting) ||\n !Array.isArray(setting.options)\n )\n return false;\n return setting.options.some(\n (option: unknown) =>\n !!option &&\n typeof option === \"object\" &&\n \"key\" in option &&\n option.key === \"PRIMARY_APP_CONSENT\" &&\n (!(\"enabled\" in option) || option.enabled === true),\n );\n })\n );\n}\n","import { z } from \"zod\";\nimport type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { localeFields, parseSchema, readJsonFile, canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { requirePrivateFile } from \"../credentials.js\";\nimport path from \"node:path\";\nimport { findApp } from \"./identifiers.js\";\n\nconst editable = new Set([\n \"PREPARE_FOR_SUBMISSION\",\n \"DEVELOPER_REJECTED\",\n \"REJECTED\",\n \"METADATA_REJECTED\",\n]);\nexport function assertEditable(value: AppleResource): void {\n const state = value.attributes.appStoreState ?? value.attributes.state;\n if (typeof state !== \"string\" || !editable.has(state))\n throw new DeliveryError(\"resource_not_editable\", 4, value.type);\n}\n\n/** 精确版本查找;没有版本配置时不选择远端最新构建。 */\nexport async function appVersion(\n builder: PlanBuilder,\n api: AppleGateway,\n create = false,\n): Promise<AppleResource | undefined> {\n const app = builder.resources.get(\"app\") ?? (await findApp(builder, api));\n if (!app) return;\n const release = builder.loaded.manifest.release;\n if (!release) throw new DeliveryError(\"release_configuration_required\", 2);\n const version = selectOne(\n (\n await api.list(`/v1/apps/${app.id}/appStoreVersions`, {\n \"filter[platform]\": \"IOS\",\n \"filter[versionString]\": release.version,\n })\n ).filter(\n (v) => v.attributes.versionString === release.version && v.attributes.platform === \"IOS\",\n ),\n \"ambiguous_app_version\",\n );\n builder.observe(\"app.version\", version);\n if (!version && create) {\n const desired = { versionString: release.version, platform: \"IOS\", releaseType: \"MANUAL\" };\n builder.ensure(\n \"app.version\",\n undefined,\n desired,\n async () => {\n const value = await api.create(\"/v1/appStoreVersions\", \"appStoreVersions\", desired, {\n app: relation(\"apps\", app.id),\n });\n return api.read(`/v1/appStoreVersions/${value.id}`);\n },\n async () => {\n throw new DeliveryError(\"unexpected_version_update\", 4);\n },\n );\n } else if (!version)\n builder.manual(\n \"app_version_required\",\n \"Prepare the configured App Store version before this operation.\",\n [\"app.version\"],\n );\n return version;\n}\n\nexport async function planMetadata(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const app = await findApp(builder, api);\n if (!app) return;\n const config = builder.loaded.manifest.metadata;\n if (!config) throw new DeliveryError(\"metadata_configuration_required\", 2);\n const version = await appVersion(builder, api, true);\n const versionState = version?.attributes.appStoreState ?? version?.attributes.state;\n const info = selectOne(\n (await api.list(`/v1/apps/${app.id}/appInfos`)).filter((v) =>\n versionState && !editable.has(String(versionState))\n ? (v.attributes.appStoreState ?? v.attributes.state) === versionState\n : editable.has(String(v.attributes.appStoreState ?? v.attributes.state)),\n ),\n \"ambiguous_editable_app_info\",\n );\n if (!info) throw new DeliveryError(\"editable_app_info_required\", 4);\n builder.observe(\"app.info\", info);\n const infoLocales = await api.list(`/v1/appInfos/${info.id}/appInfoLocalizations`);\n const versionLocales = version\n ? await api.list(`/v1/appStoreVersions/${version.id}/appStoreVersionLocalizations`)\n : [];\n for (const local of config.localizations) {\n const values = localeFields(builder.loaded, local.file);\n const common = Object.fromEntries(\n Object.entries(values).filter(([key]) =>\n [\"name\", \"subtitle\", \"privacyPolicyUrl\", \"privacyChoicesUrl\"].includes(key),\n ),\n );\n const versionFields = Object.fromEntries(\n Object.entries(values).filter(([key]) => !Object.hasOwn(common, key)),\n );\n for (const [kind, list, desiredFields, parentKey, parentType, relationshipKey] of [\n [\"appInfoLocalizations\", infoLocales, common, \"app.info\", \"appInfos\", \"appInfo\"],\n [\n \"appStoreVersionLocalizations\",\n versionLocales,\n versionFields,\n \"app.version\",\n \"appStoreVersions\",\n \"appStoreVersion\",\n ],\n ] as const) {\n if (!Object.keys(desiredFields).length) continue;\n const current = selectOne(\n list.filter((v) => v.attributes.locale === local.locale),\n \"ambiguous_localization\",\n );\n const modifiedFields = Object.keys(desiredFields).filter(\n (field) => canonical(current?.attributes[field]) !== canonical(desiredFields[field]),\n );\n const target = kind === \"appInfoLocalizations\" ? info : version;\n const liveFields =\n kind === \"appInfoLocalizations\"\n ? [\"privacyPolicyUrl\", \"privacyChoicesUrl\"]\n : [\"promotionalText\"];\n if (target && modifiedFields.some((field) => !liveFields.includes(field)))\n assertEditable(target);\n if (!current && kind === \"appInfoLocalizations\" && !common.name)\n throw new DeliveryError(\"localized_name_required\", 2, local.locale);\n const desired = { locale: local.locale, ...desiredFields };\n builder.ensure(\n `${kind}.${local.locale}`,\n current,\n desired,\n async () => {\n const created = await api.create(`/v1/${kind}`, kind, desired, {\n [relationshipKey]: relation(parentType, builder.require(parentKey).id),\n });\n return api.read(`/v1/${kind}/${created.id}`);\n },\n async (value, fields) => {\n const { locale: ignored, ...patch } = fields;\n if (ignored) throw new DeliveryError(\"locale_immutable\", 4);\n await api.update(`/v1/${kind}/${value.id}`, value, patch);\n return api.read(`/v1/${kind}/${value.id}`);\n },\n [parentKey],\n );\n }\n }\n if (config.copyright !== undefined && version?.attributes.copyright !== config.copyright) {\n if (version) assertEditable(version);\n const desired = { copyright: config.copyright };\n builder.add(\n \"app.copyright\",\n \"update\",\n version?.attributes.copyright,\n desired,\n [\"copyright\"],\n async () => {\n const target = builder.require(\"app.version\");\n await api.update(`/v1/appStoreVersions/${target.id}`, target, desired);\n const read = await api.read(`/v1/appStoreVersions/${target.id}`);\n if (read.attributes.copyright !== desired.copyright)\n throw new DeliveryError(\"metadata_readback_failed\", 5);\n return read;\n },\n [\"app.version\"],\n );\n }\n for (const field of [\"primaryCategory\", \"secondaryCategory\"] as const) {\n const desired = config[field];\n if (desired === undefined) continue;\n const category = await api.read(`/v1/appCategories/${encodeURIComponent(desired)}`);\n const currentInfo = await api.read(`/v1/appInfos/${info.id}?include=${field}`);\n const linked = currentInfo.relationships?.[field]?.data;\n if (linked && !Array.isArray(linked) && linked.id === category.id) continue;\n assertEditable(info);\n builder.add(`app.${field}`, \"update\", linked, category.id, [field], async () => {\n await api.update(\n `/v1/appInfos/${info.id}`,\n info,\n {},\n { [field]: relation(\"appCategories\", category.id) },\n );\n const result = await api.read(`/v1/appInfos/${info.id}?include=${field}`);\n if (\n canonical(result.relationships?.[field]?.data) !==\n canonical({ type: \"appCategories\", id: category.id })\n )\n throw new DeliveryError(\"category_readback_failed\", 5);\n return result;\n });\n }\n if (config.ageRatingFile) await planAgeRating(builder, api, info, config.ageRatingFile);\n if (config.licenseAgreementFile)\n await planLicense(builder, api, app, config.licenseAgreementFile);\n if (builder.loaded.manifest.review) await planReviewInformation(builder, api, version);\n}\n\nconst frequency = z.enum([\n \"NONE\",\n \"INFREQUENT_OR_MILD\",\n \"FREQUENT_OR_INTENSE\",\n \"INFREQUENT\",\n \"FREQUENT\",\n]);\nconst ageSchema = z.strictObject({\n advertising: z.boolean().optional(),\n alcoholTobaccoOrDrugUseOrReferences: frequency.optional(),\n contests: frequency.optional(),\n gambling: z.boolean().optional(),\n gamblingSimulated: frequency.optional(),\n gunsOrOtherWeapons: frequency.optional(),\n healthOrWellnessTopics: z.boolean().optional(),\n lootBox: z.boolean().optional(),\n medicalOrTreatmentInformation: frequency.optional(),\n messagingAndChat: z.boolean().optional(),\n parentalControls: z.boolean().optional(),\n profanityOrCrudeHumor: frequency.optional(),\n ageAssurance: z.boolean().optional(),\n sexualContentGraphicAndNudity: frequency.optional(),\n sexualContentOrNudity: frequency.optional(),\n horrorOrFearThemes: frequency.optional(),\n matureOrSuggestiveThemes: frequency.optional(),\n unrestrictedWebAccess: z.boolean().optional(),\n userGeneratedContent: z.boolean().optional(),\n violenceCartoonOrFantasy: frequency.optional(),\n violenceRealisticProlongedGraphicOrSadistic: frequency.optional(),\n violenceRealistic: frequency.optional(),\n ageRatingOverrideV2: z\n .enum([\"NONE\", \"NINE_PLUS\", \"THIRTEEN_PLUS\", \"SIXTEEN_PLUS\", \"EIGHTEEN_PLUS\", \"UNRATED\"])\n .optional(),\n koreaAgeRatingOverride: z.enum([\"NONE\", \"FIFTEEN_PLUS\", \"NINETEEN_PLUS\"]).optional(),\n developerAgeRatingInfoUrl: z.url().optional(),\n kidsAgeBand: z.enum([\"FIVE_AND_UNDER\", \"SIX_TO_EIGHT\", \"NINE_TO_ELEVEN\"]).optional(),\n});\nasync function planAgeRating(\n builder: PlanBuilder,\n api: AppleGateway,\n info: AppleResource,\n filename: string,\n): Promise<void> {\n const desired = parseSchema(\n ageSchema,\n JSON.parse(builder.loaded.files.get(filename)!.toString(\"utf8\")),\n );\n const current = await api.read(`/v1/appInfos/${info.id}/ageRatingDeclaration`);\n builder.ensure(\n \"app.ageRating\",\n current,\n desired,\n async () => {\n throw new DeliveryError(\"age_rating_resource_missing\", 4);\n },\n async (value, fields) => {\n await api.update(`/v1/ageRatingDeclarations/${value.id}`, value, fields);\n return api.read(`/v1/ageRatingDeclarations/${value.id}`);\n },\n );\n}\nasync function planLicense(\n builder: PlanBuilder,\n api: AppleGateway,\n app: AppleResource,\n filename: string,\n): Promise<void> {\n const desired = parseSchema(\n z.strictObject({\n agreementText: z.string().min(1),\n territories: z.array(z.string().regex(/^[A-Z]{3}$/)).min(1),\n }),\n JSON.parse(builder.loaded.files.get(filename)!.toString(\"utf8\")),\n );\n const fullApp = await api.read(`/v1/apps/${app.id}?include=endUserLicenseAgreement`);\n const ref = fullApp.relationships?.endUserLicenseAgreement?.data;\n const current =\n ref && !Array.isArray(ref)\n ? await api.read(`/v1/endUserLicenseAgreements/${ref.id}`)\n : undefined;\n const relationships = {\n app: relation(\"apps\", app.id),\n territories: { data: desired.territories.map((id) => ({ type: \"territories\", id })) },\n };\n const currentTerritories = current\n ? await api.list(`/v1/endUserLicenseAgreements/${current.id}/territories`)\n : [];\n const projection = {\n agreementText: current?.attributes.agreementText,\n territories: currentTerritories.map((v) => v.id).sort(),\n };\n if (\n canonical(projection) ===\n canonical({ ...desired, territories: [...desired.territories].sort() })\n )\n return;\n builder.add(\n \"app.license\",\n current ? \"update\" : \"create\",\n projection,\n desired,\n [\"agreementText\", \"territories\"],\n async () => {\n const result = current\n ? await api.update(\n `/v1/endUserLicenseAgreements/${current.id}`,\n current,\n { agreementText: desired.agreementText },\n { territories: relationships.territories },\n )\n : await api.create(\n \"/v1/endUserLicenseAgreements\",\n \"endUserLicenseAgreements\",\n { agreementText: desired.agreementText },\n relationships,\n );\n const value = await api.read(`/v1/endUserLicenseAgreements/${result.id}`);\n const regions = await api.list(`/v1/endUserLicenseAgreements/${result.id}/territories`);\n if (\n value.attributes.agreementText !== desired.agreementText ||\n canonical(regions.map((v) => v.id).sort()) !== canonical([...desired.territories].sort())\n )\n throw new DeliveryError(\"license_readback_failed\", 5);\n return value;\n },\n );\n}\n\nexport async function planReviewInformation(\n builder: PlanBuilder,\n api: AppleGateway,\n version?: AppleResource,\n): Promise<void> {\n const config = builder.loaded.manifest.review;\n if (!config) return;\n const location = path.resolve(builder.loaded.directory, config.credentialsRef);\n await requirePrivateFile(location);\n const desired = parseSchema(\n z.strictObject({\n contactFirstName: z.string().min(1),\n contactLastName: z.string().min(1),\n contactEmail: z.email(),\n contactPhone: z.string().regex(/^\\+[1-9]\\d{6,14}$/),\n demoAccountRequired: z.boolean(),\n demoAccountName: z.string().optional(),\n demoAccountPassword: z.string().optional(),\n }),\n await readJsonFile(location),\n );\n if (desired.demoAccountRequired && (!desired.demoAccountName || !desired.demoAccountPassword))\n throw new DeliveryError(\"review_demo_credentials_required\", 2);\n const attributes = {\n ...desired,\n ...(config.notesFile\n ? { notes: builder.loaded.files.get(config.notesFile)!.toString(\"utf8\") }\n : {}),\n };\n let current: AppleResource | undefined;\n if (version) {\n const full = await api.read(`/v1/appStoreVersions/${version.id}?include=appStoreReviewDetail`);\n const ref = full.relationships?.appStoreReviewDetail?.data;\n if (ref && !Array.isArray(ref)) current = await api.read(`/v1/appStoreReviewDetails/${ref.id}`);\n }\n builder.ensure(\n \"app.reviewInformation\",\n current,\n attributes,\n async () => {\n const created = await api.create(\n \"/v1/appStoreReviewDetails\",\n \"appStoreReviewDetails\",\n attributes,\n { appStoreVersion: relation(\"appStoreVersions\", builder.require(\"app.version\").id) },\n );\n return api.read(`/v1/appStoreReviewDetails/${created.id}`);\n },\n async (value, changed) => {\n await api.update(`/v1/appStoreReviewDetails/${value.id}`, value, changed);\n return api.read(`/v1/appStoreReviewDetails/${value.id}`);\n },\n [\"app.version\"],\n );\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { canonical, type CatalogItem } from \"../manifest.js\";\nimport { createHash } from \"node:crypto\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { findApp } from \"./identifiers.js\";\n\nexport function itemKey(item: CatalogItem): string {\n return `product.${item.productId}`;\n}\nexport function itemPath(item: CatalogItem, id: string): string {\n return item.kind === \"subscription\" ? `/v1/subscriptions/${id}` : `/v2/inAppPurchases/${id}`;\n}\n\n/** 商品 ID 与组关系稳定;可审核元数据始终使用独立版本。 */\nexport async function planCatalog(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const config = builder.loaded.manifest.catalog;\n if (!config) throw new DeliveryError(\"catalog_configuration_required\", 2);\n const app = await findApp(builder, api);\n if (!app) return;\n const groups = await api.list(`/v1/apps/${app.id}/subscriptionGroups`);\n for (const group of config.groups) {\n const key = `group.${group.key}`;\n const remoteId = group.remoteId ?? builder.bindings[key]?.id;\n const existing = remoteId\n ? selectOne(\n groups.filter((v) => v.id === remoteId),\n \"ambiguous_subscription_group\",\n )\n : undefined;\n if (remoteId && !existing)\n throw new DeliveryError(\"subscription_group_binding_mismatch\", 4, group.key);\n if (!remoteId && groups.some((v) => v.attributes.referenceName === group.name)) {\n builder.manual(\n \"subscription_group_binding_required\",\n \"Set the existing group's remoteId before managing it.\",\n [key],\n );\n continue;\n }\n const desired = { referenceName: group.name };\n builder.ensure(\n key,\n existing,\n desired,\n async () => {\n const value = await api.create(\"/v1/subscriptionGroups\", \"subscriptionGroups\", desired, {\n app: relation(\"apps\", app.id),\n });\n await builder.record(key, value);\n return api.read(`/v1/subscriptionGroups/${value.id}`);\n },\n async (value, fields) => {\n await api.update(`/v1/subscriptionGroups/${value.id}`, value, fields);\n return api.read(`/v1/subscriptionGroups/${value.id}`);\n },\n );\n await planProductVersion(\n builder,\n api,\n key,\n \"subscriptionGroup\",\n existing,\n group.localizations.map((v) => ({\n locale: v.locale,\n name: v.name,\n ...(v.customAppName ? { customAppName: v.customAppName } : {}),\n })),\n );\n }\n const purchases = await api.list(`/v1/apps/${app.id}/inAppPurchasesV2`);\n for (const item of config.items) {\n const key = itemKey(item);\n const groupKey = item.kind === \"subscription\" ? `group.${item.groupKey}` : undefined;\n const parent = groupKey ? builder.resources.get(groupKey) : app;\n if (groupKey && builder.requirements.some((v) => v.blockedOperationIds.includes(groupKey))) {\n builder.manual(\n \"subscription_group_binding_required\",\n \"Bind the subscription group before configuring its products.\",\n [key],\n );\n continue;\n }\n const collection =\n item.kind === \"subscription\"\n ? parent\n ? await api.list(`/v1/subscriptionGroups/${parent.id}/subscriptions`)\n : []\n : purchases;\n const current = selectOne(\n collection.filter((v) => v.attributes.productId === item.productId),\n \"ambiguous_product_id\",\n );\n const desired = {\n productId: item.productId,\n name: item.name,\n ...(item.familySharable === undefined ? {} : { familySharable: item.familySharable }),\n ...(item.reviewNote === undefined ? {} : { reviewNote: item.reviewNote }),\n ...(item.kind === \"subscription\"\n ? { subscriptionPeriod: item.duration, groupLevel: item.level }\n : { inAppPurchaseType: item.kind }),\n };\n if (\n current &&\n item.kind !== \"subscription\" &&\n current.attributes.inAppPurchaseType !== item.kind\n )\n throw new DeliveryError(\"product_type_immutable\", 4, item.productId);\n builder.ensure(\n key,\n current,\n desired,\n async () => {\n const location = item.kind === \"subscription\" ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\";\n const type = item.kind === \"subscription\" ? \"subscriptions\" : \"inAppPurchases\";\n const relationships =\n item.kind === \"subscription\"\n ? { group: relation(\"subscriptionGroups\", builder.require(groupKey!).id) }\n : { app: relation(\"apps\", app.id) };\n const value = await api.create(location, type, desired, relationships);\n return api.read(itemPath(item, value.id));\n },\n async (value, fields) => {\n if (fields.productId || fields.inAppPurchaseType)\n throw new DeliveryError(\"product_identity_immutable\", 4, item.productId);\n await api.update(itemPath(item, value.id), value, fields);\n return api.read(itemPath(item, value.id));\n },\n groupKey ? [groupKey] : [],\n );\n await planProductVersion(\n builder,\n api,\n key,\n item.kind === \"subscription\" ? \"subscription\" : \"inAppPurchase\",\n current,\n item.localizations,\n item.promotionalImage,\n );\n }\n}\n\ntype VersionKind = \"subscriptionGroup\" | \"subscription\" | \"inAppPurchase\";\nconst versionSpec = {\n subscriptionGroup: {\n parents: \"subscriptionGroups\",\n versions: \"subscriptionGroupVersions\",\n localizations: \"subscriptionGroupLocalizations\",\n relation: \"subscriptionGroup\",\n parentApi: \"v1\",\n },\n subscription: {\n parents: \"subscriptions\",\n versions: \"subscriptionVersions\",\n localizations: \"subscriptionLocalizations\",\n relation: \"subscription\",\n parentApi: \"v1\",\n },\n inAppPurchase: {\n parents: \"inAppPurchases\",\n versions: \"inAppPurchaseVersions\",\n localizations: \"inAppPurchaseLocalizations\",\n relation: \"inAppPurchase\",\n parentApi: \"v2\",\n },\n} as const;\n\nasync function planProductVersion(\n builder: PlanBuilder,\n api: AppleGateway,\n parentKey: string,\n kind: VersionKind,\n parent: AppleResource | undefined,\n localizations: { locale: string; name: string; description?: string; customAppName?: string }[],\n promotionalImage?: string,\n): Promise<void> {\n if (!localizations.length && !promotionalImage) return;\n const spec = versionSpec[kind];\n const key = `${parentKey}.version`;\n const versions = parent\n ? await api.list(`/${spec.parentApi}/${spec.parents}/${parent.id}/versions`)\n : [];\n const draft = selectOne(\n versions.filter((v) => v.attributes.state === \"PREPARE_FOR_SUBMISSION\"),\n \"ambiguous_product_draft\",\n );\n const approved = selectOne(\n versions.filter((v) => [\"APPROVED\", \"ACCEPTED\"].includes(String(v.attributes.state))),\n \"ambiguous_approved_product_version\",\n );\n let version = draft ?? approved;\n let existing = version ? await api.list(`/v1/${spec.versions}/${version.id}/localizations`) : [];\n let changed = localizations.some((local) => {\n const found = selectOne(\n existing.filter((v) => v.attributes.locale === local.locale),\n \"ambiguous_product_localization\",\n );\n return (\n !found ||\n Object.entries(local).some(\n ([field, value]) => canonical(found.attributes[field]) !== canonical(value),\n )\n );\n });\n if (promotionalImage && version) {\n const checksum = createHash(\"md5\")\n .update(builder.loaded.files.get(promotionalImage)!)\n .digest(\"hex\");\n const bound = builder.bindings[`${parentKey}.promotionImage.${checksum}`];\n changed ||= !(await api.list(`/v1/${spec.versions}/${version.id}/images`)).some(\n (v) =>\n v.id === bound?.id &&\n (v.attributes.assetDeliveryState as { state?: string } | undefined)?.state === \"COMPLETE\",\n );\n }\n if (changed && !draft) {\n if (\n versions.some((v) =>\n [\"READY_FOR_REVIEW\", \"WAITING_FOR_REVIEW\", \"IN_REVIEW\"].includes(\n String(v.attributes.state),\n ),\n )\n )\n throw new DeliveryError(\"product_version_in_review\", 4, parentKey);\n version = undefined;\n existing = [];\n }\n builder.ensure(\n key,\n version,\n {},\n async () => {\n const value = await api.create(\n `/v1/${spec.versions}`,\n spec.versions,\n {},\n { [spec.relation]: relation(spec.parents, builder.require(parentKey).id) },\n );\n return api.read(`/v1/${spec.versions}/${value.id}`);\n },\n async () => {\n throw new DeliveryError(\"product_version_readonly\", 4);\n },\n [parentKey],\n );\n for (const local of localizations) {\n const current = selectOne(\n existing.filter((v) => v.attributes.locale === local.locale),\n \"ambiguous_product_localization\",\n );\n const desired = { ...local };\n builder.ensure(\n `${key}.${local.locale}`,\n current,\n desired,\n async () => {\n const value = await api.create(`/v2/${spec.localizations}`, spec.localizations, desired, {\n version: relation(spec.versions, builder.require(key).id),\n });\n return api.read(`/v2/${spec.localizations}/${value.id}`);\n },\n async (value, fields) => {\n await api.update(`/v2/${spec.localizations}/${value.id}`, value, fields);\n return api.read(`/v2/${spec.localizations}/${value.id}`);\n },\n [key],\n );\n }\n}\n\n/** 用于只读后续阶段的精确商品绑定,不创建或更新商品。 */\nexport async function readCatalog(\n builder: PlanBuilder,\n api: AppleGateway,\n): Promise<Map<string, AppleResource>> {\n const app = builder.resources.get(\"app\") ?? (await findApp(builder, api));\n const found = new Map<string, AppleResource>();\n if (!app) return found;\n const config = builder.loaded.manifest.catalog;\n if (!config) return found;\n const groups = await api.list(`/v1/apps/${app.id}/subscriptionGroups`);\n const purchases = await api.list(`/v1/apps/${app.id}/inAppPurchasesV2`);\n for (const item of config.items) {\n let rows = purchases;\n if (item.kind === \"subscription\") {\n const group = config.groups.find((v) => v.key === item.groupKey)!;\n const remoteId = group.remoteId ?? builder.bindings[`group.${group.key}`]?.id;\n const parent = remoteId ? groups.find((v) => v.id === remoteId) : undefined;\n if (!parent) throw new DeliveryError(\"subscription_group_binding_required\", 4, group.key);\n rows = await api.list(`/v1/subscriptionGroups/${parent.id}/subscriptions`);\n }\n const value = selectOne(\n rows.filter((v) => v.attributes.productId === item.productId),\n \"ambiguous_product_id\",\n );\n if (!value) throw new DeliveryError(\"catalog_product_required\", 4, item.productId);\n builder.observe(itemKey(item), value);\n found.set(item.productId, value);\n }\n return found;\n}\n","import { z } from \"zod\";\nimport { createHash } from \"node:crypto\";\nimport { lookup } from \"node:dns/promises\";\nimport { isIP } from \"node:net\";\nimport { request as httpsRequest } from \"node:https\";\nimport path from \"node:path\";\nimport type { AppleGateway, AppleResource, Clock } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne, systemClock } from \"../api.js\";\nimport { canonical, parseSchema } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { appVersion, assertEditable } from \"./metadata.js\";\nimport { readCatalog, itemKey } from \"./catalog.js\";\n\nconst uploadSchema = z\n .array(\n z.object({\n method: z.literal(\"PUT\"),\n url: z.url(),\n offset: z.number().int().min(0),\n length: z.number().int().positive(),\n requestHeaders: z.array(z.object({ name: z.string(), value: z.string() })),\n }),\n )\n .min(1);\n\nfunction isPublicAddress(value: string): boolean {\n if (isIP(value) === 4) {\n const [a, b] = value.split(\".\").map(Number);\n return (\n a !== 0 &&\n a !== 10 &&\n a !== 127 &&\n a < 224 &&\n !(a === 169 && b === 254) &&\n !(a === 172 && b >= 16 && b <= 31) &&\n !(a === 192 && b === 168) &&\n !(a === 100 && b >= 64 && b <= 127)\n );\n }\n if (isIP(value) === 6) return /^2[0-9a-f]{3}:/i.test(value);\n return false;\n}\n\nexport interface AssetTransfer {\n upload(reservation: AppleResource, bytes: Buffer, signal?: AbortSignal): Promise<void>;\n}\n\n/** 仅接收已认证 API 返回的上传描述,绝不复用 Apple 管理 API 的 Bearer。 */\nexport function createAssetTransfer(\n options: { fetch?: typeof fetch; resolve?: typeof lookup; signal?: AbortSignal } = {},\n): AssetTransfer {\n return {\n async upload(reservation, bytes, signal) {\n signal ??= options.signal;\n const operations = parseSchema(uploadSchema, reservation.attributes.uploadOperations);\n const sorted = [...operations].sort((a, b) => a.offset - b.offset);\n let end = 0;\n for (const part of sorted) {\n if (part.offset !== end || part.offset + part.length > bytes.length)\n throw new DeliveryError(\"invalid_upload_ranges\", 5);\n end += part.length;\n }\n if (end !== bytes.length) throw new DeliveryError(\"incomplete_upload_ranges\", 5);\n for (const part of operations) {\n const url = new URL(part.url);\n if (\n url.protocol !== \"https:\" ||\n url.username ||\n url.password ||\n (url.port && url.port !== \"443\") ||\n isIP(url.hostname)\n )\n throw new DeliveryError(\"untrusted_upload_destination\", 5);\n const addresses = await (options.resolve ?? lookup)(url.hostname, { all: true });\n if (!addresses.length || addresses.some((v) => !isPublicAddress(v.address)))\n throw new DeliveryError(\"untrusted_upload_destination\", 5);\n const headers = new Headers();\n for (const header of part.requestHeaders) {\n if (\n /^(host|cookie|proxy-authorization)$/i.test(header.name) ||\n /^bearer /i.test(header.value)\n )\n throw new DeliveryError(\"unsafe_upload_header\", 5);\n headers.set(header.name, header.value);\n }\n const abort = signal\n ? AbortSignal.any([signal, AbortSignal.timeout(60_000)])\n : AbortSignal.timeout(60_000);\n const chunk = bytes.subarray(part.offset, part.offset + part.length);\n const status = options.fetch\n ? (\n await options.fetch(url, {\n method: \"PUT\",\n headers,\n body: new Uint8Array(chunk),\n signal: abort,\n redirect: \"error\",\n })\n ).status\n : await new Promise<number>((resolve, reject) => {\n // 固定已验证的地址,连接时不能再次 DNS 解析到内网。\n const req = httpsRequest(\n url,\n {\n method: \"PUT\",\n headers: Object.fromEntries(headers),\n signal: abort,\n family: addresses[0].family,\n lookup: (_host, _settings, done) =>\n done(null, addresses[0].address, addresses[0].family),\n },\n (response) => {\n response.resume();\n response.once(\"end\", () => resolve(response.statusCode ?? 0));\n },\n );\n req.once(\"error\", () => reject(new DeliveryError(\"asset_transfer_failed\", 5)));\n req.end(chunk);\n });\n if (status < 200 || status >= 300)\n throw new DeliveryError(\"asset_transfer_failed\", 5, undefined, status);\n }\n },\n };\n}\n\nexport async function uploadAsset(\n api: AppleGateway,\n transfer: AssetTransfer,\n endpoint: string,\n type: string,\n attributes: Record<string, unknown>,\n relationships: Record<string, unknown>,\n bytes: Buffer,\n clock: Clock = systemClock,\n resume?: AppleResource,\n record?: (resource: AppleResource) => Promise<void>,\n signal?: AbortSignal,\n): Promise<AppleResource> {\n const reservation = resume ?? (await api.create(endpoint, type, attributes, relationships));\n await record?.(reservation);\n const state = (reservation.attributes.assetDeliveryState as { state?: string } | undefined)\n ?.state;\n if (state === \"FAILED\") throw new DeliveryError(\"asset_processing_failed\", 5);\n if (state === \"COMPLETE\") return reservation;\n if (state !== \"UPLOAD_COMPLETE\" && state !== \"PROCESSING\") {\n await transfer.upload(reservation, bytes, signal);\n await api.update(`${endpoint}/${reservation.id}`, reservation, {\n uploaded: true,\n ...(!endpoint.startsWith(\"/v2/\")\n ? { sourceFileChecksum: createHash(\"md5\").update(bytes).digest(\"hex\") }\n : {}),\n });\n }\n for (let attempt = 0; attempt < 30; attempt++) {\n const current = await api.read(`${endpoint}/${reservation.id}`);\n const state = current.attributes.assetDeliveryState;\n if (state && typeof state === \"object\" && \"state\" in state) {\n if (state.state === \"COMPLETE\") return current;\n if (state.state === \"FAILED\") throw new DeliveryError(\"asset_processing_failed\", 5);\n }\n await clock.sleep(2000, signal);\n }\n throw new DeliveryError(\"asset_processing_timeout\", 5);\n}\n\n/** 校验 PNG 结构和透明通道;JPEG/视频由上传处理器提供最终格式校验。 */\nexport function validateImage(bytes: Buffer, square = false): void {\n if (bytes.length > 10 * 1024 * 1024) throw new DeliveryError(\"image_too_large\", 2);\n if (!bytes.subarray(0, 8).equals(Buffer.from([137, 80, 78, 71, 13, 10, 26, 10]))) {\n if (\n !square &&\n bytes[0] === 255 &&\n bytes[1] === 216 &&\n bytes.at(-2) === 255 &&\n bytes.at(-1) === 217\n )\n return;\n throw new DeliveryError(\"png_image_required\", 2);\n }\n if (bytes.length < 33 || bytes.toString(\"ascii\", 12, 16) !== \"IHDR\")\n throw new DeliveryError(\"invalid_png\", 2);\n const width = bytes.readUInt32BE(16),\n height = bytes.readUInt32BE(20);\n if (\n !width ||\n !height ||\n width > 10000 ||\n height > 10000 ||\n (square && (width !== 1024 || height !== 1024))\n )\n throw new DeliveryError(\"image_dimensions_invalid\", 2);\n if ([4, 6].includes(bytes[25])) throw new DeliveryError(\"image_alpha_not_allowed\", 2);\n let offset = 8;\n let ended = false;\n while (offset + 12 <= bytes.length) {\n const size = bytes.readUInt32BE(offset);\n const type = bytes.toString(\"ascii\", offset + 4, offset + 8);\n if (size > bytes.length - offset - 12) throw new DeliveryError(\"invalid_png\", 2);\n if (type === \"tRNS\") throw new DeliveryError(\"image_alpha_not_allowed\", 2);\n offset += size + 12;\n if (type === \"IEND\") {\n ended = true;\n break;\n }\n }\n if (!ended) throw new DeliveryError(\"invalid_png\", 2);\n}\n\nexport async function planAssets(\n builder: PlanBuilder,\n api: AppleGateway,\n transfer: AssetTransfer,\n): Promise<void> {\n const config = builder.loaded.manifest.assets;\n if (!config) throw new DeliveryError(\"assets_configuration_required\", 2);\n if (config.icon) validateImage(builder.loaded.files.get(config.icon)!, true);\n const version = await appVersion(builder, api);\n if (!version) return;\n assertEditable(version);\n const locales = await api.list(`/v1/appStoreVersions/${version.id}/appStoreVersionLocalizations`);\n const ordering = new Map<\n string,\n {\n type: string;\n filesType: string;\n existing: AppleResource[];\n keys: { key: string; order: number }[];\n }\n >();\n const managed = new Map<string, AppleResource>();\n for (const [media, inputs] of [\n [\"screenshot\", config.screenshots],\n [\"preview\", config.previews],\n ] as const) {\n for (const input of inputs) {\n if (!input.locale || !input.displayType)\n throw new DeliveryError(\"asset_locale_and_display_required\", 2, input.file);\n const locale = selectOne(\n locales.filter((v) => v.attributes.locale === input.locale),\n \"ambiguous_localization\",\n );\n if (!locale) throw new DeliveryError(\"asset_localization_required\", 4, input.locale);\n const setsType = media === \"screenshot\" ? \"appScreenshotSets\" : \"appPreviewSets\";\n const filesType = media === \"screenshot\" ? \"appScreenshots\" : \"appPreviews\";\n const displayField = media === \"screenshot\" ? \"screenshotDisplayType\" : \"previewType\";\n const display =\n media === \"screenshot\" ? input.displayType : (input.previewType ?? input.displayType);\n const setKey = `assetSet.${media}.${input.locale}.${display}`;\n let set = builder.resources.get(setKey);\n if (!set && !builder.changes.some((v) => v.operation.id === setKey)) {\n set = selectOne(\n (await api.list(`/v1/appStoreVersionLocalizations/${locale.id}/${setsType}`)).filter(\n (v) => v.attributes[displayField] === display,\n ),\n \"ambiguous_asset_set\",\n );\n if (!set && builder.intent.action === \"remove-owned-assets\") continue;\n builder.ensure(\n setKey,\n set,\n { [displayField]: display },\n async () => {\n const created = await api.create(\n `/v1/${setsType}`,\n setsType,\n { [displayField]: display },\n { appStoreVersionLocalization: relation(\"appStoreVersionLocalizations\", locale.id) },\n );\n return api.read(`/v1/${setsType}/${created.id}`);\n },\n async () => {\n throw new DeliveryError(\"asset_set_immutable\", 4);\n },\n );\n }\n const bytes = builder.loaded.files.get(input.file)!;\n if (media === \"screenshot\") validateImage(bytes);\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n const existing = set ? await api.list(`/v1/${setsType}/${set.id}/${filesType}`) : [];\n for (const resource of existing) managed.set(resource.id, resource);\n if (builder.intent.action === \"remove-owned-assets\") continue;\n const assetKey = `${setKey}.file.${input.file}.${checksum}`;\n const group = ordering.get(setKey) ?? { type: setsType, filesType, existing, keys: [] };\n group.keys.push({ key: assetKey, order: input.order ?? group.keys.length });\n ordering.set(setKey, group);\n const matched = selectOne(\n existing.filter((v) => v.attributes.sourceFileChecksum === checksum),\n \"ambiguous_asset_checksum\",\n );\n const state = matched?.attributes.assetDeliveryState as { state?: string } | undefined;\n if (matched && state?.state === \"COMPLETE\") {\n builder.observe(assetKey, matched);\n continue;\n }\n const bound = builder.bindings[assetKey];\n const resume = bound\n ? existing.find((v) => v.id === bound.id && v.type === bound.type)\n : undefined;\n if (bound && !resume) throw new DeliveryError(\"asset_binding_mismatch\", 4, assetKey);\n builder.add(\n assetKey,\n \"upload\",\n existing.map((v) => ({\n id: v.id,\n checksum: v.attributes.sourceFileChecksum,\n state: v.attributes.assetDeliveryState,\n })),\n { checksum, order: input.order },\n [\"file\", \"locale\", \"displayType\"],\n async () => {\n return uploadAsset(\n api,\n transfer,\n `/v1/${filesType}`,\n filesType,\n {\n fileName: path.basename(input.file),\n fileSize: bytes.length,\n ...(media === \"preview\"\n ? {\n mimeType: input.file.endsWith(\".mov\") ? \"video/quicktime\" : \"video/mp4\",\n previewFrameTimeCode: input.previewFrameTimeCode,\n }\n : {}),\n },\n {\n [media === \"screenshot\" ? \"appScreenshotSet\" : \"appPreviewSet\"]: relation(\n setsType,\n builder.require(setKey).id,\n ),\n },\n bytes,\n systemClock,\n resume,\n (value) => builder.record(assetKey, value),\n );\n },\n [setKey],\n !!resume,\n );\n }\n }\n if (builder.intent.action === \"remove-owned-assets\") {\n for (const target of config.removeOwnedIds) {\n const binding = Object.values(builder.bindings).find(\n (v) => v.id === target.id && v.type === target.type,\n );\n if (!binding) throw new DeliveryError(\"asset_ownership_evidence_required\", 4, target.id);\n if (!managed.has(target.id)) {\n try {\n await api.read(`/v1/${target.type}/${target.id}`);\n } catch (error) {\n if (error instanceof DeliveryError && error.httpStatus === 404) continue;\n throw error;\n }\n throw new DeliveryError(\"asset_ownership_evidence_required\", 4, target.id);\n }\n builder.add(\n `asset.remove.${target.id}`,\n \"remove-owned-asset\",\n managed.get(target.id),\n null,\n [\"id\"],\n async () => {\n await api.remove(`/v1/${target.type}/${target.id}`);\n try {\n await api.read(`/v1/${target.type}/${target.id}`);\n } catch (error) {\n if (error instanceof DeliveryError && error.httpStatus === 404) return target;\n throw error;\n }\n throw new DeliveryError(\"asset_removal_readback_failed\", 5);\n },\n );\n }\n return;\n }\n for (const [key, group] of ordering) {\n const keys = [...group.keys].sort((a, b) => a.order - b.order).map((v) => v.key);\n if (new Set(group.keys.map((v) => v.order)).size !== keys.length)\n throw new DeliveryError(\"duplicate_asset_order\", 2, key);\n const knownIds = keys.map((k) => builder.resources.get(k)?.id);\n const remaining = group.existing.filter((v) => !knownIds.includes(v.id)).map((v) => v.id);\n if (\n knownIds.every(Boolean) &&\n canonical([...knownIds, ...remaining]) === canonical(group.existing.map((v) => v.id))\n )\n continue;\n builder.add(\n `${key}.order`,\n \"update\",\n group.existing.map((v) => v.id),\n keys,\n [\"order\"],\n async () => {\n const ids = keys.map((k) => builder.require(k).id);\n const all = [...ids, ...group.existing.map((v) => v.id).filter((id) => !ids.includes(id))];\n const parent = builder.require(key);\n await api.relationship(\n `/v1/${group.type}/${parent.id}/relationships/${group.filesType}`,\n all.map((id) => ({ type: group.filesType, id })),\n \"PATCH\",\n );\n const read = await api.list(`/v1/${group.type}/${parent.id}/${group.filesType}`);\n if (canonical(read.map((v) => v.id)) !== canonical(all))\n throw new DeliveryError(\"asset_order_readback_failed\", 5);\n return parent;\n },\n [key, ...keys],\n );\n }\n}\n\nexport async function planCatalogAssets(\n builder: PlanBuilder,\n api: AppleGateway,\n transfer: AssetTransfer,\n): Promise<void> {\n const products = await readCatalog(builder, api);\n for (const item of builder.loaded.manifest.catalog?.items ?? []) {\n const parent = products.get(item.productId);\n if (!parent) continue;\n const subscription = item.kind === \"subscription\";\n for (const [usage, filename] of [\n [\"promotion\", item.promotionalImage],\n [\"review\", item.reviewScreenshot],\n ] as const) {\n if (!filename) continue;\n const bytes = builder.loaded.files.get(filename)!;\n validateImage(bytes, usage === \"promotion\");\n const type =\n usage === \"promotion\"\n ? subscription\n ? \"subscriptionImages\"\n : \"inAppPurchaseImages\"\n : subscription\n ? \"subscriptionAppStoreReviewScreenshots\"\n : \"inAppPurchaseAppStoreReviewScreenshots\";\n const versionType = subscription ? \"subscriptionVersions\" : \"inAppPurchaseVersions\";\n let target = parent;\n let current: AppleResource[];\n if (usage === \"promotion\") {\n const versions = await api.list(\n `${subscription ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\"}/${parent.id}/versions`,\n );\n const draft =\n selectOne(\n versions.filter((v) => v.attributes.state === \"PREPARE_FOR_SUBMISSION\"),\n \"ambiguous_product_draft\",\n ) ??\n selectOne(\n versions.filter((v) => [\"APPROVED\", \"ACCEPTED\"].includes(String(v.attributes.state))),\n \"ambiguous_product_version\",\n );\n if (!draft) throw new DeliveryError(\"product_draft_required_for_image\", 4, item.productId);\n target = draft;\n current = await api.list(`/v1/${versionType}/${draft.id}/images`);\n } else {\n const full = await api.read(\n `${subscription ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\"}/${parent.id}?include=appStoreReviewScreenshot`,\n );\n const ref = full.relationships?.appStoreReviewScreenshot?.data;\n current = ref && !Array.isArray(ref) ? [await api.read(`/v1/${type}/${ref.id}`)] : [];\n }\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n const key = `${itemKey(item)}.${usage}Image.${checksum}`;\n const resume = current.find((v) => v.id === builder.bindings[key]?.id);\n if (\n current.some(\n (v) =>\n (usage === \"promotion\"\n ? v.id === resume?.id\n : v.attributes.sourceFileChecksum === checksum) &&\n (v.attributes.assetDeliveryState as { state?: string } | undefined)?.state ===\n \"COMPLETE\",\n )\n )\n continue;\n if (usage === \"promotion\" && target.attributes.state !== \"PREPARE_FOR_SUBMISSION\")\n throw new DeliveryError(\"product_draft_required_for_image\", 4, item.productId);\n if (\n usage === \"review\" &&\n current.length &&\n !resume &&\n (!item.replaceReviewScreenshotId ||\n !current.some((v) => v.id === item.replaceReviewScreenshotId) ||\n !Object.values(builder.bindings).some(\n (v) => v.id === item.replaceReviewScreenshotId && v.type === type,\n ))\n )\n throw new DeliveryError(\"owned_review_screenshot_replacement_required\", 4, item.productId);\n builder.add(\n key,\n \"upload\",\n current.map((v) => ({ id: v.id, state: v.attributes.assetDeliveryState })),\n { checksum, replaceReviewScreenshotId: item.replaceReviewScreenshotId },\n [\"image\", ...(item.replaceReviewScreenshotId ? [\"replaceReviewScreenshotId\"] : [])],\n async () => {\n if (usage === \"review\" && current.length && !resume)\n await api.remove(`/v1/${type}/${item.replaceReviewScreenshotId}`);\n return uploadAsset(\n api,\n transfer,\n `/${usage === \"promotion\" ? \"v2\" : \"v1\"}/${type}`,\n type,\n { fileName: path.basename(filename), fileSize: bytes.length },\n {\n [usage === \"promotion\"\n ? \"version\"\n : subscription\n ? \"subscription\"\n : \"inAppPurchaseV2\"]: relation(\n usage === \"promotion\" ? versionType : parent.type,\n target.id,\n ),\n },\n bytes,\n systemClock,\n resume,\n (value) => builder.record(key, value),\n );\n },\n [],\n !!resume,\n );\n }\n }\n}\n\nexport async function planReviewAttachments(\n builder: PlanBuilder,\n api: AppleGateway,\n transfer: AssetTransfer,\n): Promise<void> {\n const files = builder.loaded.manifest.review?.attachments ?? [];\n if (!files.length) return;\n const version = await appVersion(builder, api);\n if (!version) return;\n assertEditable(version);\n const full = await api.read(`/v1/appStoreVersions/${version.id}?include=appStoreReviewDetail`);\n const ref = full.relationships?.appStoreReviewDetail?.data;\n if (!ref || Array.isArray(ref)) throw new DeliveryError(\"review_information_required\", 4);\n const current = await api.list(`/v1/appStoreReviewDetails/${ref.id}/appStoreReviewAttachments`);\n for (const filename of files) {\n const bytes = builder.loaded.files.get(filename)!;\n const checksum = createHash(\"md5\").update(bytes).digest(\"hex\");\n const key = `reviewAttachment.${version.id}.${checksum}`;\n const matched = selectOne(\n current.filter((v) => v.attributes.sourceFileChecksum === checksum),\n \"ambiguous_review_attachment\",\n );\n if (\n (matched?.attributes.assetDeliveryState as { state?: string } | undefined)?.state ===\n \"COMPLETE\"\n ) {\n builder.observe(key, matched);\n continue;\n }\n const resume = current.find((v) => v.id === builder.bindings[key]?.id);\n builder.add(\n key,\n \"upload\",\n resume,\n { checksum, detailId: ref.id },\n [\"file\"],\n () =>\n uploadAsset(\n api,\n transfer,\n \"/v1/appStoreReviewAttachments\",\n \"appStoreReviewAttachments\",\n { fileName: path.basename(filename), fileSize: bytes.length },\n { appStoreReviewDetail: relation(\"appStoreReviewDetails\", ref.id) },\n bytes,\n systemClock,\n resume,\n (value) => builder.record(key, value),\n ),\n [],\n !!resume,\n );\n }\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { readOptionalRelationship, relation, selectOne } from \"../api.js\";\nimport { canonical, digest, type CatalogItem } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { itemKey, itemPath, readCatalog } from \"./catalog.js\";\n\nfunction amount(value: unknown): string {\n if (typeof value !== \"string\" || !/^\\d+(?:\\.\\d+)?$/.test(value))\n throw new DeliveryError(\"invalid_price_amount\", 5);\n const [whole, fraction = \"\"] = value.split(\".\");\n return `${whole.replace(/^0+(?=\\d)/, \"\")}.${fraction.replace(/0+$/, \"\")}`;\n}\nfunction linked(value: AppleResource, relationship: string): string | undefined {\n const ref = value.relationships?.[relationship]?.data;\n return ref && !Array.isArray(ref) ? ref.id : undefined;\n}\n\nexport async function planPricing(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n if (!builder.loaded.manifest.catalog)\n throw new DeliveryError(\"catalog_configuration_required\", 2);\n const resources = await readCatalog(builder, api);\n const territories = await api.list(\"/v1/territories\");\n for (const item of builder.loaded.manifest.catalog.items) {\n const product = resources.get(item.productId);\n if (!product) continue;\n if (item.availability) await planAvailability(builder, api, item, product);\n if (!item.prices.length) continue;\n const points: { config: CatalogItem[\"prices\"][number]; resource: AppleResource }[] = [];\n for (const price of item.prices) {\n const territory = territories.find((value) => value.id === price.territory);\n if (!territory) throw new DeliveryError(\"territory_unavailable\", 2, price.territory);\n if (territory.attributes.currency !== price.currency)\n throw new DeliveryError(\"territory_currency_mismatch\", 2, price.territory);\n const candidates = await api.list(`${itemPath(item, product.id)}/pricePoints`, {\n \"filter[territory]\": price.territory,\n limit: \"8000\",\n });\n const point = selectOne(\n candidates.filter(\n (v) =>\n amount(v.attributes.customerPrice) === amount(price.customerPrice) &&\n (!price.pricePointId || price.pricePointId === v.id),\n ),\n \"ambiguous_price_point\",\n );\n if (!point) throw new DeliveryError(\"price_point_unavailable\", 2, price.territory);\n points.push({ config: price, resource: point });\n }\n if (item.kind === \"subscription\") {\n const current = await api.list(`/v1/subscriptions/${product.id}/prices`, {\n include: \"subscriptionPricePoint,territory\",\n });\n builder.observe(`${itemKey(item)}.prices`, {\n type: \"subscriptionPrices\",\n id: product.id,\n attributes: { values: current },\n });\n for (const { config, resource: point } of points) {\n const existing = current.filter((v) => linked(v, \"territory\") === config.territory);\n if (!(\"preserveCurrentPrice\" in config) || config.preserveCurrentPrice === undefined)\n throw new DeliveryError(\"price_preservation_choice_required\", 2, config.territory);\n const key = `${itemKey(item)}.price.${config.territory}.${config.startDate ?? \"current\"}`;\n if (\n existing.some(\n (v) =>\n v.attributes.preserved !== true &&\n linked(v, \"subscriptionPricePoint\") === point.id &&\n (v.attributes.startDate ?? null) === (config.startDate ?? null),\n )\n ) {\n if (builder.bindings[`${key}.preservation`]?.id !== digest(config))\n throw new DeliveryError(\"price_preservation_evidence_required\", 4, config.territory);\n continue;\n }\n builder.add(\n key,\n \"create\",\n existing,\n config,\n [\"price\", \"startDate\", \"preserveCurrentPrice\"],\n async () => {\n const created = await api.create(\n \"/v1/subscriptionPrices\",\n \"subscriptionPrices\",\n {\n startDate: config.startDate ?? null,\n preserveCurrentPrice: config.preserveCurrentPrice,\n },\n {\n subscription: relation(\"subscriptions\", product.id),\n subscriptionPricePoint: relation(\"subscriptionPricePoints\", point.id),\n territory: relation(\"territories\", config.territory),\n },\n );\n const verified = (\n await api.list(`/v1/subscriptions/${product.id}/prices`, {\n include: \"subscriptionPricePoint,territory\",\n \"filter[territory]\": config.territory,\n })\n ).find((v) => v.id === created.id);\n if (\n !verified ||\n linked(verified, \"subscriptionPricePoint\") !== point.id ||\n linked(verified, \"territory\") !== config.territory ||\n (verified.attributes.startDate ?? null) !== (config.startDate ?? null)\n )\n throw new DeliveryError(\"price_readback_failed\", 5);\n await builder.record(`${key}.preservation`, {\n type: \"subscriptionPricePolicies\",\n id: digest(config),\n });\n return verified;\n },\n );\n }\n } else {\n if (!item.baseTerritory)\n throw new DeliveryError(\"base_territory_required\", 2, item.productId);\n const full = await api.read(`/v2/inAppPurchases/${product.id}?include=iapPriceSchedule`);\n const scheduleId = linked(full, \"iapPriceSchedule\");\n const base = scheduleId\n ? await api.read(`/v1/inAppPurchasePriceSchedules/${scheduleId}/baseTerritory`)\n : undefined;\n const existing = scheduleId\n ? await api.list(`/v1/inAppPurchasePriceSchedules/${scheduleId}/manualPrices`, {\n include: \"inAppPurchasePricePoint,territory\",\n })\n : [];\n const expected = points\n .map((p) => ({\n point: p.resource.id,\n date: p.config.startDate ?? null,\n endDate: \"endDate\" in p.config ? (p.config.endDate ?? null) : null,\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n const actual = existing\n .map((p) => ({\n point: linked(p, \"inAppPurchasePricePoint\"),\n date: p.attributes.startDate ?? null,\n endDate: p.attributes.endDate ?? null,\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n if (canonical(expected) === canonical(actual) && base?.id === item.baseTerritory) continue;\n builder.add(\n `${itemKey(item)}.priceSchedule`,\n \"create\",\n { prices: existing, base: base?.id },\n { baseTerritory: item.baseTerritory, prices: points.map((p) => p.config) },\n [\"priceSchedule\"],\n async () => {\n const included = points.map((p, index) => ({\n type: \"inAppPurchasePrices\",\n id: \"${price-\" + index + \"}\",\n attributes: {\n startDate: p.config.startDate ?? null,\n endDate: \"endDate\" in p.config ? (p.config.endDate ?? null) : null,\n },\n relationships: {\n inAppPurchaseV2: relation(\"inAppPurchases\", product.id),\n inAppPurchasePricePoint: relation(\"inAppPurchasePricePoints\", p.resource.id),\n },\n }));\n const result = await api.create(\n \"/v1/inAppPurchasePriceSchedules\",\n \"inAppPurchasePriceSchedules\",\n {},\n {\n inAppPurchase: relation(\"inAppPurchases\", product.id),\n baseTerritory: relation(\"territories\", item.baseTerritory!),\n manualPrices: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const prices = await api.list(\n `/v1/inAppPurchasePriceSchedules/${result.id}/manualPrices`,\n { include: \"inAppPurchasePricePoint\" },\n );\n const values = prices\n .map((p) => ({\n point: linked(p, \"inAppPurchasePricePoint\"),\n date: p.attributes.startDate ?? null,\n endDate: p.attributes.endDate ?? null,\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n const verifiedBase = await api.read(\n `/v1/inAppPurchasePriceSchedules/${result.id}/baseTerritory`,\n );\n if (canonical(expected) !== canonical(values) || verifiedBase.id !== item.baseTerritory)\n throw new DeliveryError(\"price_schedule_readback_failed\", 5);\n return result;\n },\n );\n }\n }\n}\n\nasync function planAvailability(\n builder: PlanBuilder,\n api: AppleGateway,\n item: CatalogItem,\n product: AppleResource,\n): Promise<void> {\n const config = item.availability!;\n const subscription = item.kind === \"subscription\";\n const type = subscription ? \"subscriptionAvailabilities\" : \"inAppPurchaseAvailabilities\";\n const relationship = subscription ? \"subscriptionAvailability\" : \"inAppPurchaseAvailability\";\n const current = await readOptionalRelationship(() =>\n api.read(`${itemPath(item, product.id)}/${relationship}`),\n );\n const territories = current\n ? await api.list(`/v1/${type}/${current.id}/availableTerritories`)\n : [];\n const projection = {\n availableInNewTerritories: current?.attributes.availableInNewTerritories,\n territories: territories.map((v) => v.id).sort(),\n };\n const desired = {\n availableInNewTerritories: config.availableInNewTerritories,\n territories: [...config.territories].sort(),\n };\n if (canonical(projection) === canonical(desired)) return;\n builder.add(\n `${itemKey(item)}.availability`,\n \"create\",\n projection,\n desired,\n [\"territories\", \"availableInNewTerritories\"],\n async () => {\n const created = await api.create(\n `/v1/${type}`,\n type,\n { availableInNewTerritories: config.availableInNewTerritories },\n {\n [subscription ? \"subscription\" : \"inAppPurchase\"]: relation(product.type, product.id),\n availableTerritories: {\n data: config.territories.map((id) => ({ type: \"territories\", id })),\n },\n },\n );\n const read = await api.read(`/v1/${type}/${created.id}`);\n const regions = await api.list(`/v1/${type}/${created.id}/availableTerritories`);\n if (\n read.attributes.availableInNewTerritories !== config.availableInNewTerritories ||\n canonical(regions.map((v) => v.id).sort()) !== canonical(desired.territories)\n )\n throw new DeliveryError(\"availability_readback_failed\", 5);\n return read;\n },\n );\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { readCatalog } from \"./catalog.js\";\n\n/** 优惠配置是商业输入;新优惠不会自动替换已售出或已领取的优惠。 */\nexport async function planOffers(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const catalog = builder.loaded.manifest.catalog;\n if (!catalog) return;\n const products = await readCatalog(builder, api);\n const territories = catalog.items.some(\n (item) => item.kind === \"subscription\" && item.offers.length,\n )\n ? await api.list(\"/v1/territories\")\n : [];\n for (const item of catalog.items) {\n if (item.kind !== \"subscription\") continue;\n const parent = products.get(item.productId);\n if (!parent) continue;\n for (const offer of item.offers) {\n const type =\n offer.kind === \"introductory\"\n ? \"subscriptionIntroductoryOffers\"\n : offer.kind === \"promotional\"\n ? \"subscriptionPromotionalOffers\"\n : \"subscriptionOfferCodes\";\n const collection =\n offer.kind === \"introductory\"\n ? \"introductoryOffers\"\n : offer.kind === \"promotional\"\n ? \"promotionalOffers\"\n : \"offerCodes\";\n const existing = await api.list(\n `/v1/subscriptions/${parent.id}/${collection}`,\n offer.kind === \"introductory\" ? { include: \"territory,subscriptionPricePoint\" } : {},\n );\n const key = `offer.${item.productId}.${offer.key}`;\n const common = {\n duration: offer.duration,\n numberOfPeriods: offer.numberOfPeriods,\n offerMode: offer.offerMode,\n };\n for (const price of offer.prices) {\n if (offer.offerMode !== \"FREE_TRIAL\" && !price.pricePointId)\n throw new DeliveryError(\"offer_price_point_required\", 2, offer.key);\n if (!territories.some((value) => value.id === price.territory))\n throw new DeliveryError(\"territory_unavailable\", 2, price.territory);\n if (\n price.pricePointId &&\n !(\n await api.list(`/v1/subscriptions/${parent.id}/pricePoints`, {\n \"filter[territory]\": price.territory,\n })\n ).some((v) => v.id === price.pricePointId)\n )\n throw new DeliveryError(\"offer_price_point_ownership_mismatch\", 4, offer.key);\n }\n if (offer.kind === \"introductory\") {\n for (const price of offer.prices) {\n const current = selectOne(\n existing.filter((v) => {\n const region = v.relationships?.territory?.data;\n return (\n region &&\n !Array.isArray(region) &&\n region.id === price.territory &&\n v.attributes.startDate === offer.startDate\n );\n }),\n \"ambiguous_introductory_offer\",\n );\n const attributes = {\n ...common,\n startDate: offer.startDate,\n endDate: offer.endDate ?? null,\n };\n const expectedPoint = current?.relationships?.subscriptionPricePoint?.data;\n if (current) {\n if (\n Object.entries(attributes).some(\n ([k, v]) => canonical(current.attributes[k]) !== canonical(v),\n ) ||\n (price.pricePointId &&\n (!expectedPoint ||\n Array.isArray(expectedPoint) ||\n expectedPoint.id !== price.pricePointId))\n )\n throw new DeliveryError(\"existing_offer_is_immutable\", 4, offer.key);\n continue;\n }\n builder.add(\n `${key}.${price.territory}`,\n \"create\",\n null,\n { attributes, price },\n [\"offer\"],\n async () => {\n const result = await api.create(`/v1/${type}`, type, attributes, {\n subscription: relation(\"subscriptions\", parent.id),\n territory: relation(\"territories\", price.territory),\n ...(price.pricePointId\n ? {\n subscriptionPricePoint: relation(\n \"subscriptionPricePoints\",\n price.pricePointId,\n ),\n }\n : {}),\n });\n const read = (\n await api.list(`/v1/subscriptions/${parent.id}/introductoryOffers`, {\n include: \"territory,subscriptionPricePoint\",\n })\n ).find((v) => v.id === result.id);\n if (!read) throw new DeliveryError(\"introductory_offer_readback_failed\", 5);\n verifyAttributes(read, attributes);\n verifyPrices([read], [price], offer.offerMode === \"FREE_TRIAL\");\n return read;\n },\n );\n }\n } else {\n const current = selectOne(\n existing.filter((v) =>\n offer.kind === \"promotional\"\n ? v.attributes.offerCode === offer.offerCode\n : v.attributes.name === offer.name,\n ),\n \"ambiguous_subscription_offer\",\n );\n const attributes = {\n ...common,\n name: offer.name,\n ...(offer.kind === \"promotional\"\n ? { offerCode: offer.offerCode }\n : {\n customerEligibilities: offer.customerEligibilities,\n offerEligibility: offer.offerEligibility,\n autoRenewEnabled: offer.autoRenewEnabled,\n }),\n };\n const priceType =\n offer.kind === \"promotional\"\n ? \"subscriptionPromotionalOfferPrices\"\n : \"subscriptionOfferCodePrices\";\n if (current) {\n verifyAttributes(current, attributes);\n const prices = await api.list(`/v1/${type}/${current.id}/prices`, {\n include: \"territory,subscriptionPricePoint\",\n });\n verifyPrices(prices, offer.prices, offer.offerMode === \"FREE_TRIAL\");\n continue;\n }\n builder.add(key, \"create\", null, offer, [\"offer\", \"prices\"], async () => {\n const included = offer.prices.map((price, i) => ({\n type: priceType,\n id: \"${price-\" + i + \"}\",\n relationships: {\n territory: relation(\"territories\", price.territory),\n ...(price.pricePointId\n ? {\n subscriptionPricePoint: relation(\"subscriptionPricePoints\", price.pricePointId),\n }\n : {}),\n },\n }));\n const result = await api.create(\n `/v1/${type}`,\n type,\n attributes,\n {\n subscription: relation(\"subscriptions\", parent.id),\n prices: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const read = await api.read(`/v1/${type}/${result.id}`);\n verifyAttributes(read, attributes);\n verifyPrices(\n await api.list(`/v1/${type}/${result.id}/prices`, {\n include: \"territory,subscriptionPricePoint\",\n }),\n offer.prices,\n offer.offerMode === \"FREE_TRIAL\",\n );\n return read;\n });\n }\n }\n }\n if (catalog.gracePeriod) {\n const current = await api.read(`/v1/apps/${builder.require(\"app\").id}/subscriptionGracePeriod`);\n builder.ensure(\n \"subscription.gracePeriod\",\n current,\n catalog.gracePeriod,\n async () => {\n throw new DeliveryError(\"subscription_grace_period_missing\", 4);\n },\n async (value, fields) => {\n await api.update(`/v1/subscriptionGracePeriods/${value.id}`, value, fields);\n return api.read(`/v1/subscriptionGracePeriods/${value.id}`);\n },\n );\n }\n}\nfunction verifyAttributes(resource: AppleResource, desired: Record<string, unknown>): void {\n if (\n Object.entries(desired).some(\n ([key, value]) => canonical(resource.attributes[key]) !== canonical(value),\n )\n )\n throw new DeliveryError(\"offer_attributes_mismatch\", 4);\n}\n\nfunction verifyPrices(\n resources: AppleResource[],\n desired: { territory: string; pricePointId?: string }[],\n free: boolean,\n): void {\n const project = resources.map((value) => {\n const territory = value.relationships?.territory?.data,\n point = value.relationships?.subscriptionPricePoint?.data;\n if (!territory || Array.isArray(territory) || (point && Array.isArray(point)))\n throw new DeliveryError(\"offer_price_relationship_missing\", 5);\n return { territory: territory.id, ...(!free ? { pricePointId: point?.id } : {}) };\n });\n const expected = desired.map((value) => ({\n territory: value.territory,\n ...(!free ? { pricePointId: value.pricePointId } : {}),\n }));\n const sort = (values: typeof expected) =>\n values.sort((a, b) => a.territory.localeCompare(b.territory));\n if (canonical(sort(project)) !== canonical(sort(expected)))\n throw new DeliveryError(\"offer_prices_mismatch\", 4);\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { readOptionalRelationship, relation, selectOne } from \"../api.js\";\nimport { canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\n\nfunction linked(value: AppleResource, key: string): string | undefined {\n const ref = value.relationships?.[key]?.data;\n return ref && !Array.isArray(ref) ? ref.id : undefined;\n}\nexport async function planAppCommerce(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const app = builder.require(\"app\"),\n { availability, appPricing } = builder.loaded.manifest;\n if (availability) {\n const current = await readOptionalRelationship(() =>\n api.read(`/v1/apps/${app.id}/appAvailabilityV2`),\n );\n const territories = current\n ? await api.list(`/v2/appAvailabilities/${current.id}/territoryAvailabilities`, {\n include: \"territory\",\n })\n : [];\n const before = {\n availableInNewTerritories: current?.attributes.availableInNewTerritories,\n territories: territories\n .filter((v) => v.attributes.available === true)\n .map((v) => linked(v, \"territory\"))\n .sort(),\n };\n const desired = { ...availability, territories: [...availability.territories].sort() };\n if (canonical(before) !== canonical(desired))\n builder.add(\n \"app.availability\",\n \"create\",\n before,\n desired,\n [\"territories\", \"availableInNewTerritories\"],\n async () => {\n const included = availability.territories.map((id, i) => ({\n type: \"territoryAvailabilities\",\n id: \"${territory-\" + i + \"}\",\n attributes: { available: true },\n relationships: { territory: relation(\"territories\", id) },\n }));\n const created = await api.create(\n \"/v2/appAvailabilities\",\n \"appAvailabilities\",\n { availableInNewTerritories: availability.availableInNewTerritories },\n {\n app: relation(\"apps\", app.id),\n territoryAvailabilities: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const value = await api.read(`/v2/appAvailabilities/${created.id}`);\n const regions = await api.list(\n `/v2/appAvailabilities/${created.id}/territoryAvailabilities`,\n { include: \"territory\" },\n );\n if (\n value.attributes.availableInNewTerritories !== desired.availableInNewTerritories ||\n canonical(\n regions\n .filter((v) => v.attributes.available === true)\n .map((v) => linked(v, \"territory\"))\n .sort(),\n ) !== canonical(desired.territories)\n )\n throw new DeliveryError(\"app_availability_readback_failed\", 5);\n return value;\n },\n );\n }\n if (appPricing) {\n const desired: {\n id: string;\n startDate: string | null;\n endDate: string | null;\n territory: string;\n }[] = [];\n const territories = await api.list(\"/v1/territories\");\n for (const price of appPricing.prices) {\n const territory = territories.find((value) => value.id === price.territory);\n if (!territory) throw new DeliveryError(\"territory_unavailable\", 2, price.territory);\n if (territory.attributes.currency !== price.currency)\n throw new DeliveryError(\"territory_currency_mismatch\", 2);\n const points = await api.list(`/v1/apps/${app.id}/appPricePoints`, {\n \"filter[territory]\": price.territory,\n limit: \"200\",\n });\n const normalize = (v: unknown) =>\n typeof v === \"string\" ? v.replace(/\\.0+$/, \"\").replace(/(\\.\\d*?)0+$/, \"$1\") : undefined;\n const point = selectOne(\n points.filter(\n (v) =>\n normalize(v.attributes.customerPrice) === normalize(price.customerPrice) &&\n (!price.pricePointId || v.id === price.pricePointId),\n ),\n \"ambiguous_app_price_point\",\n );\n if (!point) throw new DeliveryError(\"app_price_point_unavailable\", 2, price.territory);\n desired.push({\n id: point.id,\n startDate: price.startDate ?? null,\n endDate: price.endDate ?? null,\n territory: price.territory,\n });\n }\n const schedule = await readOptionalRelationship(() =>\n api.read(`/v1/apps/${app.id}/appPriceSchedule`),\n );\n const currentId = schedule?.id;\n const base = currentId\n ? await api.read(`/v1/appPriceSchedules/${currentId}/baseTerritory`)\n : undefined;\n const current = currentId\n ? ((await readOptionalRelationship(() =>\n api.list(`/v1/appPriceSchedules/${currentId}/manualPrices`, {\n include: \"appPricePoint,territory\",\n }),\n )) ?? [])\n : [];\n const before = {\n baseTerritory: base?.id,\n prices: current\n .map((v) => ({\n id: linked(v, \"appPricePoint\"),\n startDate: v.attributes.startDate ?? null,\n endDate: v.attributes.endDate ?? null,\n territory: linked(v, \"territory\"),\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b))),\n };\n const target = {\n baseTerritory: appPricing.baseTerritory,\n prices: desired.sort((a, b) => canonical(a).localeCompare(canonical(b))),\n };\n if (canonical(before) === canonical(target)) return;\n builder.add(\n \"app.priceSchedule\",\n \"create\",\n before,\n target,\n [\"baseTerritory\", \"prices\"],\n async () => {\n const included = desired.map((v, i) => ({\n type: \"appPrices\",\n id: \"${price-\" + i + \"}\",\n attributes: { startDate: v.startDate, endDate: v.endDate },\n relationships: { appPricePoint: relation(\"appPricePoints\", v.id) },\n }));\n const result = await api.create(\n \"/v1/appPriceSchedules\",\n \"appPriceSchedules\",\n {},\n {\n app: relation(\"apps\", app.id),\n baseTerritory: relation(\"territories\", appPricing.baseTerritory),\n manualPrices: { data: included.map((v) => ({ type: v.type, id: v.id })) },\n },\n included,\n );\n const base = await api.read(`/v1/appPriceSchedules/${result.id}/baseTerritory`);\n const read = await api.list(`/v1/appPriceSchedules/${result.id}/manualPrices`, {\n include: \"appPricePoint,territory\",\n });\n const values = read\n .map((v) => ({\n id: linked(v, \"appPricePoint\"),\n startDate: v.attributes.startDate ?? null,\n endDate: v.attributes.endDate ?? null,\n territory: linked(v, \"territory\"),\n }))\n .sort((a, b) => canonical(a).localeCompare(canonical(b)));\n if (base.id !== appPricing.baseTerritory || canonical(values) !== canonical(target.prices))\n throw new DeliveryError(\"app_price_readback_failed\", 5);\n return result;\n },\n );\n }\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { canonical } from \"../manifest.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { appVersion } from \"./metadata.js\";\nimport { readCatalog } from \"./catalog.js\";\n\nexport async function selectedBuild(\n builder: PlanBuilder,\n api: AppleGateway,\n allowProcessing = false,\n): Promise<AppleResource | undefined> {\n const app = builder.require(\"app\"),\n release = builder.loaded.manifest.release;\n if (!release) throw new DeliveryError(\"release_configuration_required\", 2);\n const candidates = await api.list(\"/v1/builds\", {\n \"filter[app]\": app.id,\n \"filter[version]\": release.buildNumber,\n include: \"preReleaseVersion\",\n });\n const exact: AppleResource[] = [];\n for (const candidate of candidates) {\n if (release.buildId && release.buildId !== candidate.id) continue;\n const ref = candidate.relationships?.preReleaseVersion?.data;\n if (!ref || Array.isArray(ref)) throw new DeliveryError(\"build_prerelease_version_missing\", 5);\n const pre = await api.read(`/v1/preReleaseVersions/${ref.id}`);\n if (\n candidate.attributes.version === release.buildNumber &&\n pre.attributes.version === release.version &&\n pre.attributes.platform === \"IOS\"\n )\n exact.push(candidate);\n }\n const build = selectOne(exact, \"ambiguous_build\");\n if (!build) {\n if (!allowProcessing)\n builder.manual(\n \"processed_build_required\",\n \"Upload and process the configured version and build number.\",\n [\"review.prepare\", \"review.submit\", \"testflight.distribute\"],\n );\n return;\n }\n if (\n allowProcessing &&\n build.attributes.processingState === \"PROCESSING\" &&\n build.attributes.expired !== true\n )\n return build;\n if (build.attributes.processingState !== \"VALID\" || build.attributes.expired === true)\n throw new DeliveryError(\"build_not_available\", 4);\n builder.observe(\"build\", build);\n return build;\n}\n\nexport async function planReview(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const app = builder.require(\"app\"),\n release = builder.loaded.manifest.release;\n if (!release) throw new DeliveryError(\"release_configuration_required\", 2);\n if (builder.intent.action === \"withdraw\") {\n if (!release.reviewSubmissionId) throw new DeliveryError(\"review_submission_id_required\", 2);\n const submission = await ownedSubmission(api, app.id, release.reviewSubmissionId);\n builder.observe(\"review\", submission);\n if (submission.attributes.state === \"CANCELING\" || submission.attributes.state === \"COMPLETE\")\n return;\n if (\n ![\"WAITING_FOR_REVIEW\", \"IN_REVIEW\", \"UNRESOLVED_ISSUES\"].includes(\n String(submission.attributes.state),\n )\n )\n throw new DeliveryError(\"review_cannot_withdraw\", 4);\n builder.add(\n \"review.withdraw\",\n \"withdraw\",\n submission.attributes,\n { canceled: true },\n [\"canceled\"],\n async () => {\n await api.update(`/v1/reviewSubmissions/${submission.id}`, submission, { canceled: true });\n const read = await api.read(`/v1/reviewSubmissions/${submission.id}`);\n if (![\"CANCELING\", \"COMPLETE\"].includes(String(read.attributes.state)))\n throw new DeliveryError(\"withdrawal_pending\", 5);\n return read;\n },\n );\n return;\n }\n const selection = release.reviewItems;\n if (\n !selection ||\n (!selection.includeApp && !selection.productIds.length && !selection.groupKeys.length)\n )\n throw new DeliveryError(\"review_item_selection_required\", 2);\n const version = selection.includeApp ? await appVersion(builder, api) : undefined;\n if (selection.includeApp && !version) return;\n const build = selection.includeApp ? await selectedBuild(builder, api) : undefined;\n if (selection.includeApp && !build) return;\n if (!builder.loaded.manifest.review)\n builder.manual(\n \"review_information_required\",\n \"Configure and verify the reviewer contact and demo account.\",\n [\"review.submit\"],\n );\n for (const code of [\"privacy\", \"encryption\", \"contentRights\", \"regionalCompliance\"]) {\n if (selection.includeApp && !builder.loaded.manifest.declarations.some((v) => v.code === code))\n builder.manual(\"release_declarations_required\", `Confirm the ${code} declaration.`, [\n \"review.submit\",\n ]);\n }\n for (const declaration of builder.loaded.manifest.declarations) {\n if (!declaration.confirmed || declaration.evidence === \"remote-readback\")\n builder.manual(\n \"declaration_verification_required\",\n `Verify declaration ${declaration.code} in its owning console.`,\n [\"review.submit\"],\n declaration.consoleUrl,\n );\n }\n if (version && build) {\n const full = await api.read(`/v1/appStoreVersions/${version.id}?include=build`);\n const selected = full.relationships?.build?.data;\n if (!selected || Array.isArray(selected) || selected.id !== build.id) {\n if (builder.intent.action === \"submit\")\n throw new DeliveryError(\"review_build_not_prepared\", 4);\n builder.add(\"review.build\", \"update\", selected, build.id, [\"build\"], async () => {\n await api.update(\n `/v1/appStoreVersions/${version.id}`,\n version,\n {},\n { build: relation(\"builds\", build.id) },\n );\n const read = await api.read(`/v1/appStoreVersions/${version.id}?include=build`);\n if (\n canonical(read.relationships?.build?.data) !== canonical({ type: \"builds\", id: build.id })\n )\n throw new DeliveryError(\"review_build_readback_failed\", 5);\n return read;\n });\n }\n }\n const submissions = await api.list(`/v1/apps/${app.id}/reviewSubmissions`);\n const submission = release.reviewSubmissionId\n ? selectOne(\n submissions.filter((v) => v.id === release.reviewSubmissionId),\n \"ambiguous_review_submission\",\n )\n : selectOne(\n submissions.filter(\n (v) => v.attributes.state === \"READY_FOR_REVIEW\" && v.attributes.platform === \"IOS\",\n ),\n \"ambiguous_review_draft\",\n );\n if (release.reviewSubmissionId && !submission)\n throw new DeliveryError(\"review_submission_ownership_mismatch\", 4);\n if (submission && submission.attributes.platform !== \"IOS\")\n throw new DeliveryError(\"review_platform_mismatch\", 4);\n const alreadySubmitted =\n submission &&\n [\"WAITING_FOR_REVIEW\", \"IN_REVIEW\"].includes(String(submission.attributes.state)) &&\n builder.intent.action === \"submit\";\n if (submission && submission.attributes.state !== \"READY_FOR_REVIEW\" && !alreadySubmitted)\n throw new DeliveryError(\"review_submission_not_editable\", 4);\n if (!submission && builder.intent.action === \"submit\")\n throw new DeliveryError(\"review_draft_required\", 4);\n builder.ensure(\n \"review\",\n submission,\n { platform: \"IOS\" },\n async () => {\n const created = await api.create(\n \"/v1/reviewSubmissions\",\n \"reviewSubmissions\",\n { platform: \"IOS\" },\n { app: relation(\"apps\", app.id) },\n );\n return api.read(`/v1/reviewSubmissions/${created.id}`);\n },\n async () => {\n throw new DeliveryError(\"review_platform_immutable\", 4);\n },\n );\n const existingItems = submission\n ? await api.list(`/v1/reviewSubmissions/${submission.id}/items`, {\n include:\n \"appStoreVersion,subscriptionVersion,inAppPurchaseVersion,subscriptionGroupVersion\",\n })\n : [];\n const submittedVersion = (value: AppleResource, relationship: string): boolean =>\n existingItems.some((item) => {\n const ref = item.relationships?.[relationship]?.data;\n return ref && !Array.isArray(ref) && ref.id === value.id;\n });\n const desiredItems: { relationship: string; type: string; id: string }[] = version\n ? [{ relationship: \"appStoreVersion\", type: \"appStoreVersions\", id: version.id }]\n : [];\n const products = selection.productIds.length\n ? await readCatalog(builder, api)\n : new Map<string, AppleResource>();\n const approvedTypes = new Set<string>();\n const allPurchases = selection.productIds.length\n ? await api.list(`/v1/apps/${app.id}/inAppPurchasesV2`)\n : [];\n for (const purchase of allPurchases)\n if (purchase.attributes.state === \"APPROVED\")\n approvedTypes.add(String(purchase.attributes.inAppPurchaseType));\n for (const group of selection.productIds.length\n ? await api.list(`/v1/apps/${app.id}/subscriptionGroups`)\n : []) {\n if (\n (await api.list(`/v1/subscriptionGroups/${group.id}/subscriptions`)).some(\n (v) => v.attributes.state === \"APPROVED\",\n )\n )\n approvedTypes.add(\"subscription\");\n }\n for (const item of builder.loaded.manifest.catalog?.items ?? []) {\n if (!selection.productIds.includes(item.productId)) continue;\n const product = products.get(item.productId);\n if (!product) continue;\n if (\n !alreadySubmitted &&\n (!approvedTypes.has(item.kind) || release.firstPurchaseTypes.includes(item.kind))\n ) {\n builder.manual(\n \"first_purchase_requires_console\",\n \"Submit the first purchase of this type with the app version in App Store Connect.\",\n [\"review.submit\"],\n );\n }\n const type = item.kind === \"subscription\" ? \"subscriptionVersions\" : \"inAppPurchaseVersions\";\n const versions = await api.list(\n `${item.kind === \"subscription\" ? \"/v1/subscriptions\" : \"/v2/inAppPurchases\"}/${product.id}/versions`,\n );\n const draft = selectOne(\n versions.filter((v) =>\n alreadySubmitted\n ? submittedVersion(\n v,\n item.kind === \"subscription\" ? \"subscriptionVersion\" : \"inAppPurchaseVersion\",\n )\n : [\"PREPARE_FOR_SUBMISSION\", \"READY_FOR_REVIEW\"].includes(String(v.attributes.state)),\n ),\n \"ambiguous_product_draft\",\n );\n if (!draft) throw new DeliveryError(\"review_product_version_required\", 4, item.productId);\n desiredItems.push({\n relationship: item.kind === \"subscription\" ? \"subscriptionVersion\" : \"inAppPurchaseVersion\",\n type,\n id: draft.id,\n });\n }\n for (const productId of selection.productIds)\n if (!builder.loaded.manifest.catalog?.items.some((v) => v.productId === productId))\n throw new DeliveryError(\"review_product_not_configured\", 2, productId);\n const allGroups = selection.groupKeys.length\n ? await api.list(`/v1/apps/${app.id}/subscriptionGroups`)\n : [];\n for (const key of selection.groupKeys) {\n const group = builder.loaded.manifest.catalog?.groups.find((v) => v.key === key);\n const remoteId = group?.remoteId ?? builder.bindings[`group.${key}`]?.id;\n if (!group || !allGroups.some((v) => v.id === remoteId))\n throw new DeliveryError(\"review_group_binding_required\", 4, key);\n const versions = await api.list(`/v1/subscriptionGroups/${remoteId}/versions`);\n const draft = selectOne(\n versions.filter((v) =>\n alreadySubmitted\n ? submittedVersion(v, \"subscriptionGroupVersion\")\n : [\"PREPARE_FOR_SUBMISSION\", \"READY_FOR_REVIEW\"].includes(String(v.attributes.state)),\n ),\n \"ambiguous_group_draft\",\n );\n if (!draft) throw new DeliveryError(\"review_group_draft_required\", 4, key);\n desiredItems.push({\n relationship: \"subscriptionGroupVersion\",\n type: \"subscriptionGroupVersions\",\n id: draft.id,\n });\n }\n if (!desiredItems.length) throw new DeliveryError(\"review_item_selection_empty\", 4);\n for (const desired of desiredItems) {\n const found = existingItems.some((v) => {\n const ref = v.relationships?.[desired.relationship]?.data;\n return ref && !Array.isArray(ref) && ref.id === desired.id;\n });\n if (found) continue;\n if (builder.intent.action === \"submit\") throw new DeliveryError(\"review_items_not_prepared\", 4);\n builder.add(\n `review.item.${desired.type}.${desired.id}`,\n \"create\",\n null,\n desired,\n [desired.relationship],\n async () => {\n const created = await api.create(\n \"/v1/reviewSubmissionItems\",\n \"reviewSubmissionItems\",\n {},\n {\n reviewSubmission: relation(\"reviewSubmissions\", builder.require(\"review\").id),\n [desired.relationship]: relation(desired.type, desired.id),\n },\n );\n return api.read(`/v1/reviewSubmissionItems/${created.id}`);\n },\n [\"review\"],\n );\n }\n if (builder.intent.action === \"submit\") {\n if (!release.reviewSubmissionId) throw new DeliveryError(\"review_submission_id_required\", 2);\n if (existingItems.length !== desiredItems.length)\n throw new DeliveryError(\"review_contains_unmanaged_items\", 4);\n if (alreadySubmitted) {\n builder.observe(\"review\", submission);\n return;\n }\n builder.add(\n \"review.submit\",\n \"submit\",\n submission?.attributes,\n desiredItems,\n [\"submitted\"],\n async () => {\n const target = builder.require(\"review\");\n await api.update(`/v1/reviewSubmissions/${target.id}`, target, { submitted: true });\n const read = await api.read(`/v1/reviewSubmissions/${target.id}`);\n if (\n ![\"WAITING_FOR_REVIEW\", \"IN_REVIEW\", \"COMPLETE\"].includes(String(read.attributes.state))\n )\n throw new DeliveryError(\"review_submission_pending\", 5);\n return read;\n },\n );\n }\n}\n\nasync function ownedSubmission(\n api: AppleGateway,\n appId: string,\n id: string,\n): Promise<AppleResource> {\n const found = (await api.list(`/v1/apps/${appId}/reviewSubmissions`)).find((v) => v.id === id);\n if (!found) throw new DeliveryError(\"review_submission_ownership_mismatch\", 4);\n return found;\n}\n","import type { AppleGateway } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, systemClock } from \"../api.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { appVersion, assertEditable } from \"./metadata.js\";\n\n/** 配置发布方式和实际发布使用不同意图,避免资料同步触发上线。 */\nexport async function planRelease(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const version = await appVersion(builder, api);\n if (!version) return;\n const config = builder.loaded.manifest.release!;\n const action = builder.intent.action;\n if (action === \"configure\") {\n const desired = {\n releaseType: config.mode,\n ...(config.mode === \"SCHEDULED\" ? { earliestReleaseDate: config.earliestReleaseDate } : {}),\n };\n builder.ensure(\n \"release.policy\",\n version,\n desired,\n async () => {\n throw new DeliveryError(\"app_version_required\", 4);\n },\n async (value, fields) => {\n assertEditable(value);\n await api.update(`/v1/appStoreVersions/${value.id}`, value, fields);\n return api.read(`/v1/appStoreVersions/${value.id}`);\n },\n );\n if (config.phasedRelease !== undefined) {\n const full = await api.read(\n `/v1/appStoreVersions/${version.id}?include=appStoreVersionPhasedRelease`,\n );\n const ref = full.relationships?.appStoreVersionPhasedRelease?.data;\n const current =\n ref && !Array.isArray(ref)\n ? await api.read(`/v1/appStoreVersionPhasedReleases/${ref.id}`)\n : undefined;\n if (!config.phasedRelease && current)\n throw new DeliveryError(\"phased_release_removal_requires_console\", 4);\n if (config.phasedRelease && !current)\n builder.add(\n \"release.phased\",\n \"create\",\n null,\n { phasedReleaseState: \"INACTIVE\" },\n [\"phasedReleaseState\"],\n async () => {\n assertEditable(version);\n const created = await api.create(\n \"/v1/appStoreVersionPhasedReleases\",\n \"appStoreVersionPhasedReleases\",\n { phasedReleaseState: \"INACTIVE\" },\n { appStoreVersion: relation(\"appStoreVersions\", version.id) },\n );\n const read = await api.read(`/v1/appStoreVersionPhasedReleases/${created.id}`);\n if (read.attributes.phasedReleaseState !== \"INACTIVE\")\n throw new DeliveryError(\"phased_release_readback_failed\", 5);\n return read;\n },\n );\n }\n return;\n }\n if (action === \"publish\") {\n if (version.attributes.appStoreState === \"READY_FOR_SALE\") return;\n if (version.attributes.appStoreState !== \"PENDING_DEVELOPER_RELEASE\")\n throw new DeliveryError(\"version_not_ready_for_release\", 4);\n builder.add(\n \"release.publish\",\n \"release\",\n version.attributes,\n { versionId: version.id },\n [\"release\"],\n async () => {\n await api.create(\n \"/v1/appStoreVersionReleaseRequests\",\n \"appStoreVersionReleaseRequests\",\n {},\n { appStoreVersion: relation(\"appStoreVersions\", version.id) },\n );\n for (let attempt = 0; attempt < 30; attempt++) {\n const read = await api.read(`/v1/appStoreVersions/${version.id}`);\n if (read.attributes.appStoreState === \"READY_FOR_SALE\") return read;\n await systemClock.sleep(2000);\n }\n throw new DeliveryError(\"release_processing_pending\", 5);\n },\n );\n return;\n }\n const phased = await api.read(`/v1/appStoreVersions/${version.id}/appStoreVersionPhasedRelease`);\n if (config.phasedReleaseId && phased.id !== config.phasedReleaseId)\n throw new DeliveryError(\"phased_release_identity_mismatch\", 4);\n const state = action === \"pause\" ? \"PAUSED\" : action === \"resume\" ? \"ACTIVE\" : \"COMPLETE\";\n if (phased.attributes.phasedReleaseState === state) return;\n const allowed =\n action === \"pause\" ? [\"ACTIVE\"] : action === \"resume\" ? [\"PAUSED\"] : [\"ACTIVE\", \"PAUSED\"];\n if (!allowed.includes(String(phased.attributes.phasedReleaseState)))\n throw new DeliveryError(\"phased_release_transition_invalid\", 4);\n builder.add(\n `release.${action}`,\n action === \"pause\" ? \"pause\" : action === \"resume\" ? \"resume\" : \"complete\",\n phased.attributes,\n { phasedReleaseState: state },\n [\"phasedReleaseState\"],\n async () => {\n await api.update(`/v1/appStoreVersionPhasedReleases/${phased.id}`, phased, {\n phasedReleaseState: state,\n });\n const read = await api.read(`/v1/appStoreVersionPhasedReleases/${phased.id}`);\n if (read.attributes.phasedReleaseState !== state)\n throw new DeliveryError(\"phased_release_readback_failed\", 5);\n return read;\n },\n );\n}\n","import path from \"node:path\";\nimport { z } from \"zod\";\nimport type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport { relation, selectOne } from \"../api.js\";\nimport { digest, parseSchema, readJsonFile } from \"../manifest.js\";\nimport { requirePrivateFile } from \"../credentials.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { selectedBuild } from \"./review.js\";\n\nexport async function planTestFlight(builder: PlanBuilder, api: AppleGateway): Promise<void> {\n const config = builder.loaded.manifest.testflight;\n if (!config) throw new DeliveryError(\"testflight_configuration_required\", 2);\n const app = builder.require(\"app\");\n const groups = await api.list(`/v1/apps/${app.id}/betaGroups`);\n const targets = config.groupIds.map((id) => {\n const value = groups.find((v) => v.id === id);\n if (!value || value.attributes.isInternalGroup === config.external)\n throw new DeliveryError(\"beta_group_ownership_or_type_mismatch\", 4, id);\n return value;\n });\n if (builder.intent.action === \"invite\") {\n if (!config.invitationsRef || !targets.length)\n throw new DeliveryError(\"explicit_testers_and_groups_required\", 2);\n const filename = path.resolve(builder.loaded.directory, config.invitationsRef);\n await requirePrivateFile(filename);\n const testers = parseSchema(\n z\n .array(\n z.strictObject({\n email: z.email(),\n firstName: z.string().min(1),\n lastName: z.string().min(1),\n }),\n )\n .min(1),\n await readJsonFile(filename),\n );\n for (const tester of testers) {\n const current = selectOne(\n await api.list(\"/v1/betaTesters\", { \"filter[email]\": tester.email }),\n \"ambiguous_beta_tester\",\n );\n const currentGroups = current\n ? await api.list(`/v1/betaTesters/${current.id}/betaGroups`)\n : [];\n const missing = targets.filter((v) => !currentGroups.some((g) => g.id === v.id));\n if (!missing.length) continue;\n const key = `testflight.tester.${digest(tester.email.toLowerCase()).slice(0, 24)}`;\n builder.add(\n key,\n \"invite\",\n { id: current?.id, groups: currentGroups.map((v) => v.id) },\n { tester, groups: missing.map((v) => v.id) },\n [\"tester\", \"groups\"],\n async () => {\n const value =\n current ??\n (await api.create(\"/v1/betaTesters\", \"betaTesters\", tester, {\n betaGroups: { data: missing.map((v) => ({ type: \"betaGroups\", id: v.id })) },\n }));\n await builder.record(key, value);\n if (current)\n await api.relationship(\n `/v1/betaTesters/${current.id}/relationships/betaGroups`,\n missing.map((v) => ({ type: \"betaGroups\", id: v.id })),\n );\n const read = await api.list(`/v1/betaTesters/${value.id}/betaGroups`);\n if (!targets.every((v) => read.some((g) => g.id === v.id)))\n throw new DeliveryError(\"beta_invitation_readback_failed\", 5);\n return value;\n },\n );\n }\n return;\n }\n const build = await selectedBuild(builder, api);\n if (!build) return;\n const details = await api.read(`/v1/builds/${build.id}/buildBetaDetail`);\n builder.observe(\"testflight.buildDetail\", details);\n if (builder.intent.action === \"prepare\") {\n builder.ensure(\n \"testflight.notifications\",\n details,\n { autoNotifyEnabled: config.notifyTesters },\n async () => {\n throw new DeliveryError(\"beta_detail_missing\", 4);\n },\n async (value, fields) => {\n await api.update(`/v1/buildBetaDetails/${value.id}`, value, fields);\n return api.read(`/v1/buildBetaDetails/${value.id}`);\n },\n );\n if (!config.locale) throw new DeliveryError(\"testflight_locale_required\", 2);\n const appLocales = await api.list(`/v1/apps/${app.id}/betaAppLocalizations`);\n const buildLocales = await api.list(`/v1/builds/${build.id}/betaBuildLocalizations`);\n for (const [type, rows, attributes, parent, relationship] of [\n [\n \"betaAppLocalizations\",\n appLocales,\n {\n locale: config.locale,\n ...(config.betaDescription !== undefined ? { description: config.betaDescription } : {}),\n ...(config.feedbackEmail ? { feedbackEmail: config.feedbackEmail } : {}),\n },\n app,\n \"app\",\n ],\n [\n \"betaBuildLocalizations\",\n buildLocales,\n {\n locale: config.locale,\n ...(config.whatsNew !== undefined ? { whatsNew: config.whatsNew } : {}),\n },\n build,\n \"build\",\n ],\n ] as const) {\n if (Object.keys(attributes).length === 1) continue;\n const current = selectOne(\n rows.filter((v) => v.attributes.locale === config.locale),\n \"ambiguous_beta_localization\",\n );\n builder.ensure(\n `testflight.${type}.${config.locale}`,\n current,\n attributes,\n async () => {\n const created = await api.create(`/v1/${type}`, type, attributes, {\n [relationship]: relation(parent.type, parent.id),\n });\n return api.read(`/v1/${type}/${created.id}`);\n },\n async (value, fields) => {\n await api.update(`/v1/${type}/${value.id}`, value, fields);\n return api.read(`/v1/${type}/${value.id}`);\n },\n );\n }\n return;\n }\n if (details.attributes.autoNotifyEnabled !== config.notifyTesters)\n throw new DeliveryError(\"beta_notification_policy_not_prepared\", 4);\n if (builder.intent.action === \"review\") {\n if (!config.external) throw new DeliveryError(\"external_testing_required\", 2);\n if (\n [\"WAITING_FOR_BETA_REVIEW\", \"IN_BETA_REVIEW\", \"BETA_APPROVED\", \"IN_BETA_TESTING\"].includes(\n String(details.attributes.externalBuildState),\n )\n )\n return;\n if (details.attributes.externalBuildState !== \"READY_FOR_BETA_SUBMISSION\")\n throw new DeliveryError(\"build_not_ready_for_beta_review\", 4);\n builder.add(\n \"testflight.review\",\n \"submit\",\n details.attributes,\n { buildId: build.id },\n [\"betaReview\"],\n async () => {\n const created = await api.create(\n \"/v1/betaAppReviewSubmissions\",\n \"betaAppReviewSubmissions\",\n {},\n { build: relation(\"builds\", build.id) },\n );\n const read = await api.read(`/v1/betaAppReviewSubmissions/${created.id}`);\n if (\n ![\"WAITING_FOR_REVIEW\", \"IN_REVIEW\", \"APPROVED\"].includes(\n String(read.attributes.betaReviewState),\n )\n )\n throw new DeliveryError(\"beta_review_pending\", 5);\n return read;\n },\n );\n return;\n }\n if (!targets.length) throw new DeliveryError(\"beta_groups_required\", 2);\n if (\n config.external &&\n ![\"BETA_APPROVED\", \"IN_BETA_TESTING\", \"READY_FOR_BETA_TESTING\"].includes(\n String(details.attributes.externalBuildState),\n )\n )\n throw new DeliveryError(\"external_beta_approval_required\", 4);\n for (const group of targets) {\n const current = await api.list(`/v1/betaGroups/${group.id}/builds`);\n if (current.some((v) => v.id === build.id)) continue;\n if (\n group.attributes.publicLinkEnabled === true ||\n group.attributes.hasAccessToAllBuilds === true\n )\n throw new DeliveryError(\"beta_group_automatic_distribution_requires_console\", 4, group.id);\n builder.add(\n `testflight.group.${group.id}`,\n \"distribute\",\n current.map((v) => v.id),\n build.id,\n [\"build\"],\n async () => {\n await api.relationship(`/v1/betaGroups/${group.id}/relationships/builds`, [\n { type: \"builds\", id: build.id },\n ]);\n const read = await api.list(`/v1/betaGroups/${group.id}/builds`);\n if (!read.some((v) => v.id === build.id))\n throw new DeliveryError(\"beta_distribution_readback_failed\", 5);\n return group;\n },\n );\n }\n}\n","import { execa } from \"execa\";\nimport type { ProcessRunner } from \"./contracts.js\";\nimport { DeliveryError } from \"./contracts.js\";\nimport path from \"node:path\";\nimport os from \"node:os\";\n\n/** 子进程不能继承任意业务凭据或把工具日志输出到终端。 */\nexport function createProcessRunner(signal?: AbortSignal): ProcessRunner {\n return {\n async run(executable, args, options) {\n try {\n const result = await execa(executable, args, {\n cwd: options.cwd,\n env: options.env,\n extendEnv: false,\n timeout: options.timeoutMs,\n cancelSignal: options.signal ?? signal,\n stdin: \"ignore\",\n stdout: \"pipe\",\n stderr: \"pipe\",\n maxBuffer: 4 * 1024 * 1024,\n });\n return { stdout: result.stdout, stderr: result.stderr };\n } catch {\n const cancelled = (options.signal ?? signal)?.aborted;\n throw new DeliveryError(\n cancelled ? \"cancelled\" : \"delivery_process_failed\",\n cancelled ? 130 : 5,\n );\n }\n },\n };\n}\nexport function toolEnvironment(): Record<string, string> {\n const env: Record<string, string> = {};\n for (const name of [\n \"PATH\",\n \"HOME\",\n \"TMPDIR\",\n \"LANG\",\n \"LC_ALL\",\n \"DEVELOPER_DIR\",\n \"SSL_CERT_FILE\",\n \"SSL_CERT_DIR\",\n ]) {\n const value = process.env[name];\n if (value !== undefined) env[name] = value;\n }\n return {\n ...env,\n CI: \"1\",\n FASTLANE_SKIP_UPDATE_CHECK: \"1\",\n FASTLANE_HIDE_CHANGELOG: \"1\",\n FASTLANE_OPT_OUT_USAGE: \"1\",\n FASTLANE_DISABLE_COLORS: \"1\",\n GIT_TERMINAL_PROMPT: \"0\",\n BUNDLE_FROZEN: \"true\",\n BUNDLE_PATH: path.join(os.homedir(), \".cache\", \"stackonward\", \"apple-gems\"),\n };\n}\n","import { mkdtemp, mkdir, readFile, rm, copyFile, realpath } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport path from \"node:path\";\nimport { randomBytes } from \"node:crypto\";\nimport { z } from \"zod\";\nimport type { ProcessRunner } from \"./contracts.js\";\nimport { DeliveryError } from \"./contracts.js\";\nimport type { AppleCredentials } from \"./credentials.js\";\nimport { requirePrivateFile } from \"./credentials.js\";\nimport { parseSchema, readJsonFile, fileDigest, type LoadedManifest } from \"./manifest.js\";\nimport { writePrivateJson } from \"./state.js\";\nimport { toolEnvironment } from \"./process.js\";\n\nexport interface AppleBuildTools {\n preflight(): Promise<void>;\n run(\n action: \"native\" | \"signing\" | \"archive\" | \"upload\",\n parameters: Record<string, unknown>,\n ): Promise<Record<string, unknown>>;\n}\nconst resultSchema = z.record(z.string(), z.unknown());\nconst signingSecrets = z.strictObject({\n password: z.string().min(1),\n gitBasicAuthorization: z.string().min(1).optional(),\n});\n\n/** Ruby 只运行随发行包锁定的 lane;资料不包含可执行 Ruby 或 shell。 */\nexport function createAppleBuildTools(\n loaded: LoadedManifest,\n credentials: AppleCredentials,\n runner: ProcessRunner,\n resourceDirectory: string,\n signal?: AbortSignal,\n): AppleBuildTools {\n const env = toolEnvironment();\n const bundle = loaded.manifest.build?.bundleExecutable ?? \"bundle\";\n const gemfile = path.join(loaded.directory, \"Gemfile\");\n return {\n async preflight() {\n if (process.platform !== \"darwin\") throw new DeliveryError(\"macos_required\", 4);\n for (const filename of [\"Gemfile\", \"Gemfile.lock\"]) {\n if (\n fileDigest(await readFile(path.join(resourceDirectory, filename))) !==\n fileDigest(await readFile(path.join(loaded.directory, filename)))\n )\n throw new DeliveryError(\"apple_toolchain_lock_mismatch\", 4, filename);\n }\n await runner.run(bundle, [\"check\"], {\n cwd: loaded.directory,\n env: { ...env, BUNDLE_GEMFILE: gemfile },\n timeoutMs: 30_000,\n signal,\n });\n const xcode = await runner.run(\"xcodebuild\", [\"-version\"], {\n cwd: loaded.directory,\n env,\n timeoutMs: 30_000,\n signal,\n });\n if (\n loaded.manifest.build &&\n xcode.stdout.split(\"\\n\")[0] !== `Xcode ${loaded.manifest.build.xcodeVersion}`\n )\n throw new DeliveryError(\"xcode_version_mismatch\", 4);\n },\n async run(action, parameters) {\n const root = await mkdtemp(path.join(os.tmpdir(), \"stackonward-apple-\"));\n try {\n const apiKeyPath = path.join(root, \"api-key.json\"),\n invocationPath = path.join(root, \"invocation.json\"),\n resultPath = path.join(root, \"result.json\");\n await writePrivateJson(apiKeyPath, {\n key_id: credentials.account.keyId,\n issuer_id: credentials.account.issuerId,\n key: await readFile(credentials.account.privateKeyPath, \"utf8\"),\n in_house: false,\n });\n let secrets: z.infer<typeof signingSecrets> | undefined;\n if (action === \"archive\" || action === \"signing\") {\n if (!credentials.account.signingSecretsFile)\n throw new DeliveryError(\"signing_secrets_required\", 4);\n await requirePrivateFile(credentials.account.signingSecretsFile);\n secrets = parseSchema(\n signingSecrets,\n await readJsonFile(credentials.account.signingSecretsFile),\n );\n }\n await mkdir(path.join(root, \"fastlane\"));\n await copyFile(\n path.join(resourceDirectory, \"fastlane\", \"Fastfile\"),\n path.join(root, \"fastlane\", \"Fastfile\"),\n );\n await writePrivateJson(invocationPath, {\n action,\n ...parameters,\n apiKeyPath,\n resultPath,\n teamId: credentials.account.teamId,\n bundleId: loaded.manifest.app.bundleId,\n signing: loaded.manifest.signing,\n keychainName: `stackonward-${path.basename(root)}`,\n keychainPassword: randomBytes(32).toString(\"hex\"),\n });\n try {\n await runner.run(bundle, [\"exec\", \"fastlane\", \"ios\", \"delivery\"], {\n cwd: await realpath(root),\n env: {\n ...env,\n BUNDLE_GEMFILE: gemfile,\n STACKONWARD_APPLE_INVOCATION: invocationPath,\n ...(secrets\n ? {\n MATCH_PASSWORD: secrets.password,\n ...(secrets.gitBasicAuthorization\n ? { MATCH_GIT_BASIC_AUTHORIZATION: secrets.gitBasicAuthorization }\n : {}),\n }\n : {}),\n },\n timeoutMs: action === \"archive\" ? 3_600_000 : 1_800_000,\n signal,\n });\n } catch (error) {\n if (action === \"upload\" || (action === \"signing\" && parameters.readOnly === false))\n throw new DeliveryError(\"apple_write_outcome_unknown\", 7);\n throw error;\n }\n return parseSchema(resultSchema, await readJsonFile(resultPath));\n } finally {\n await rm(root, { recursive: true, force: true });\n }\n },\n };\n}\n","import path from \"node:path\";\nimport { readFile, realpath, lstat, mkdtemp, rm, writeFile } from \"node:fs/promises\";\nimport os from \"node:os\";\nimport { z } from \"zod\";\nimport { X509Certificate } from \"node:crypto\";\nimport type { AppleGateway, ProcessRunner } from \"../contracts.js\";\nimport { DeliveryError } from \"../contracts.js\";\nimport type { AppleCredentials } from \"../credentials.js\";\nimport { requirePrivateFile } from \"../credentials.js\";\nimport type { AppleBuildTools } from \"../fastlane.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { digest, fileDigest, readJsonFile, parseSchema } from \"../manifest.js\";\nimport { toolEnvironment } from \"../process.js\";\nimport { writePrivateJson, privateDirectory } from \"../state.js\";\nimport { selectedBuild } from \"./review.js\";\nimport { systemClock } from \"../api.js\";\n\nconst artifactSchema = z.strictObject({\n schemaVersion: z.literal(1),\n bundleId: z.string(),\n teamId: z.string(),\n version: z.string(),\n buildNumber: z.string(),\n ipaPath: z.string(),\n sha256: z.string(),\n dsymPath: z.string(),\n dsymSha256: z.string(),\n sourceDigest: z.string(),\n inputDigest: z.string(),\n capabilities: z.record(z.string(), z.boolean()),\n});\n\nasync function projectPaths(\n builder: PlanBuilder,\n): Promise<{ root: string; project: string; output: string; workspace?: string }> {\n const build = builder.loaded.manifest.build;\n if (!build) throw new DeliveryError(\"build_configuration_required\", 2);\n const root = await realpath(path.resolve(builder.loaded.directory, build.projectRoot));\n const project = await realpath(path.resolve(root, build.projectPath));\n const workspace = build.workspace\n ? await realpath(path.resolve(root, build.workspace))\n : undefined;\n if (![project, ...(workspace ? [workspace] : [])].every((v) => v.startsWith(root + path.sep)))\n throw new DeliveryError(\"project_path_outside_root\", 2);\n const output = path.resolve(root, build.outputPath);\n if (!output.startsWith(root + path.sep)) throw new DeliveryError(\"build_output_outside_root\", 2);\n let ancestor = output;\n while (ancestor !== root) {\n try {\n await lstat(ancestor);\n const actual = await realpath(ancestor);\n if (!actual.startsWith(root + path.sep))\n throw new DeliveryError(\"build_output_outside_root\", 2);\n break;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n ancestor = path.dirname(ancestor);\n }\n return { root, project, output, workspace };\n}\n\nexport async function planSigning(\n builder: PlanBuilder,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n): Promise<void> {\n const config = builder.loaded.manifest.signing;\n if (!config || !config.bundleIds.includes(builder.loaded.manifest.app.bundleId))\n throw new DeliveryError(\"signing_configuration_required\", 2);\n if (!credentials.account.signingSecretsFile)\n throw new DeliveryError(\"signing_secrets_required\", 4);\n await requirePrivateFile(credentials.account.signingSecretsFile);\n if (builder.intent.action === \"initialize\" && config.readonly)\n throw new DeliveryError(\"signing_initialization_requires_writable_config\", 2);\n await tools.preflight();\n builder.add(\n \"signing.profiles\",\n \"update\",\n null,\n {\n team: credentials.account.teamId,\n ...config,\n readOnly: builder.intent.action !== \"initialize\",\n },\n [\"profiles\", \"certificates\"],\n async () => {\n const result = await tools.run(\"signing\", {\n readOnly: builder.intent.action !== \"initialize\",\n });\n const profiles = parseSchema(z.record(z.string(), z.string()), result.profiles);\n if (!config.bundleIds.every((id) => profiles[id]))\n throw new DeliveryError(\"signing_profiles_missing\", 5);\n return { type: \"signingProfiles\", id: digest(profiles) };\n },\n );\n}\n\nexport async function planBuild(\n builder: PlanBuilder,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n runner: ProcessRunner,\n): Promise<void> {\n const release = builder.loaded.manifest.release,\n config = builder.loaded.manifest.build;\n if (!release || !config) throw new DeliveryError(\"build_and_release_configuration_required\", 2);\n if (builder.loaded.manifest.signing?.profileType !== \"appstore\")\n throw new DeliveryError(\"appstore_signing_required\", 2);\n if (!credentials.account.signingSecretsFile)\n throw new DeliveryError(\"signing_secrets_required\", 4);\n await requirePrivateFile(credentials.account.signingSecretsFile);\n await tools.preflight();\n const paths = await projectPaths(builder),\n env = toolEnvironment();\n const sourceFingerprint = async () => {\n const tracked = await runner.run(\n \"git\",\n [\"ls-files\", \"-z\", \"--cached\", \"--others\", \"--exclude-standard\", \".\"],\n { cwd: paths.root, env, timeoutMs: 30_000 },\n );\n const inputs: [string, string][] = [];\n for (const name of [\n ...new Set([\n ...tracked.stdout.split(\"\\0\").filter(Boolean),\n ...(config.publicDefinesFile ? [config.publicDefinesFile] : []),\n ]),\n ].sort()) {\n const filename = await realpath(path.resolve(paths.root, name));\n if (!filename.startsWith(paths.root + path.sep))\n throw new DeliveryError(\"build_source_symlink_outside_root\", 2);\n if (filename.startsWith(paths.output + path.sep)) continue;\n inputs.push([name, fileDigest(await readFile(filename))]);\n }\n return digest(inputs);\n };\n const sourceDigest = await sourceFingerprint();\n builder.observe(\"build.inputs\", { type: \"localBuildInputs\", id: sourceDigest, attributes: {} });\n let previous: unknown;\n try {\n previous = JSON.parse(await readFile(path.join(paths.output, \"artifact.json\"), \"utf8\"));\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\")\n throw new DeliveryError(\"archive_attestation_unreadable\", 2);\n }\n if (previous) {\n const artifact = parseSchema(artifactSchema, previous);\n if (\n artifact.sourceDigest === sourceDigest &&\n artifact.inputDigest === builder.loaded.inputDigest &&\n artifact.teamId === credentials.account.teamId\n ) {\n if (\n (await realpath(artifact.ipaPath)) !== path.join(await realpath(paths.output), \"app.ipa\") ||\n fileDigest(await readFile(artifact.ipaPath)) !== artifact.sha256 ||\n !(await realpath(artifact.dsymPath)).startsWith(\n (await realpath(paths.output)) + path.sep,\n ) ||\n fileDigest(await readFile(artifact.dsymPath)) !== artifact.dsymSha256\n )\n throw new DeliveryError(\"archive_checksum_mismatch\", 5);\n await verifyArchive(artifact.ipaPath, builder, credentials, runner);\n builder.satisfy(\"build.archive\", {\n sourceDigest,\n inputDigest: builder.loaded.inputDigest,\n version: release.version,\n buildNumber: release.buildNumber,\n });\n return;\n }\n }\n builder.add(\n \"build.archive\",\n \"create\",\n null,\n {\n sourceDigest,\n inputDigest: builder.loaded.inputDigest,\n version: release.version,\n buildNumber: release.buildNumber,\n },\n [\"ipa\", \"dSYM\", \"attestation\"],\n async () => {\n const outputRoot = await privateDirectory(paths.output);\n if (!outputRoot.startsWith(paths.root + path.sep))\n throw new DeliveryError(\"build_output_outside_root\", 2);\n if ((await sourceFingerprint()) !== sourceDigest)\n throw new DeliveryError(\"build_inputs_changed\", 4);\n if (config.kind === \"flutter\") {\n if (!config.flutterVersion) throw new DeliveryError(\"flutter_version_required\", 2);\n const executable = config.flutterExecutable ?? \"flutter\";\n const version = await runner.run(executable, [\"--version\", \"--machine\"], {\n cwd: paths.root,\n env,\n timeoutMs: 30_000,\n });\n const info = parseSchema(\n z.object({ frameworkVersion: z.string() }),\n JSON.parse(version.stdout),\n );\n if (info.frameworkVersion !== config.flutterVersion)\n throw new DeliveryError(\"flutter_version_mismatch\", 4);\n const args = [\n \"build\",\n \"ios\",\n \"--config-only\",\n \"--release\",\n \"--no-pub\",\n \"--build-name\",\n release.version,\n \"--build-number\",\n release.buildNumber,\n ];\n if (config.publicDefinesFile) {\n const filename = await realpath(path.resolve(paths.root, config.publicDefinesFile));\n if (!filename.startsWith(paths.root + path.sep))\n throw new DeliveryError(\"build_defines_outside_root\", 2);\n const values = parseSchema(\n z.record(z.string(), z.union([z.string(), z.boolean(), z.number()])),\n await readJsonFile(filename),\n );\n if (\n Object.keys(values).some((key) =>\n /secret|password|private.?key|access.?token|refresh.?token/i.test(key),\n )\n )\n throw new DeliveryError(\"secret_in_public_build_defines\", 2);\n args.push(\"--dart-define-from-file\", filename);\n }\n await runner.run(executable, args, { cwd: paths.root, env, timeoutMs: 900_000 });\n }\n const result = await tools.run(\"archive\", {\n readOnly: true,\n outputDirectory: paths.output,\n version: release.version,\n buildNumber: release.buildNumber,\n project: {\n projectPath: paths.project,\n workspace: paths.workspace,\n scheme: config.scheme,\n configuration: config.configuration,\n },\n });\n const output = parseSchema(\n z.object({\n ipaPath: z.string(),\n sha256: z.string(),\n dsymPath: z.string(),\n dsymSha256: z.string(),\n }),\n result,\n );\n const ipaPath = await realpath(output.ipaPath);\n if (ipaPath !== path.join(await realpath(paths.output), \"app.ipa\"))\n throw new DeliveryError(\"unexpected_archive_path\", 5);\n const sha256 = fileDigest(await readFile(ipaPath));\n if (sha256 !== output.sha256) throw new DeliveryError(\"archive_checksum_mismatch\", 5);\n const dsymPath = await realpath(output.dsymPath);\n if (\n !dsymPath.startsWith((await realpath(paths.output)) + path.sep) ||\n fileDigest(await readFile(dsymPath)) !== output.dsymSha256\n )\n throw new DeliveryError(\"dsym_checksum_mismatch\", 5);\n await verifyArchive(ipaPath, builder, credentials, runner);\n if ((await sourceFingerprint()) !== sourceDigest)\n throw new DeliveryError(\"build_inputs_changed\", 4);\n await writePrivateJson(path.join(paths.output, \"artifact.json\"), {\n schemaVersion: 1,\n bundleId: builder.loaded.manifest.app.bundleId,\n teamId: credentials.account.teamId,\n version: release.version,\n buildNumber: release.buildNumber,\n ipaPath,\n sha256,\n dsymPath,\n dsymSha256: output.dsymSha256,\n sourceDigest,\n inputDigest: builder.loaded.inputDigest,\n capabilities: builder.loaded.manifest.capabilities,\n });\n return { type: \"ipaArchives\", id: sha256 };\n },\n );\n}\n\nexport async function verifyArchive(\n ipaPath: string,\n builder: PlanBuilder,\n credentials: AppleCredentials,\n runner: ProcessRunner,\n): Promise<void> {\n const root = await mkdtemp(path.join(os.tmpdir(), \"apple-archive-\")),\n env = toolEnvironment();\n try {\n const entries = await runner.run(\"unzip\", [\"-Z1\", ipaPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const names = entries.stdout.split(\"\\n\").filter(Boolean);\n if (names.some((v) => v.startsWith(\"/\") || v.split(\"/\").includes(\"..\") || v.includes(\"\\\\\")))\n throw new DeliveryError(\"unsafe_archive_path\", 2);\n const plists = names.filter((v) => /^Payload\\/[^/]+\\.app\\/Info.plist$/.test(v));\n if (plists.length !== 1) throw new DeliveryError(\"archive_main_app_ambiguous\", 5);\n const archiveListing = await runner.run(\"unzip\", [\"-Z\", \"-l\", ipaPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n if (archiveListing.stdout.split(\"\\n\").some((line) => /^l[rwx-]{9}/.test(line)))\n throw new DeliveryError(\"archive_symlink_not_allowed\", 2);\n await runner.run(\"unzip\", [\"-q\", ipaPath, \"-d\", root], { cwd: root, env, timeoutMs: 120_000 });\n const appPath = path.join(root, path.dirname(plists[0]));\n await runner.run(\"codesign\", [\"--verify\", \"--deep\", \"--strict\", appPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const info = await runner.run(\n \"plutil\",\n [\"-convert\", \"json\", \"-o\", \"-\", path.join(root, plists[0])],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n const plist = parseSchema(\n z.object({\n CFBundleIdentifier: z.string(),\n CFBundleShortVersionString: z.string(),\n CFBundleVersion: z.string(),\n }),\n JSON.parse(info.stdout),\n );\n if (\n plist.CFBundleIdentifier !== builder.loaded.manifest.app.bundleId ||\n plist.CFBundleShortVersionString !== builder.loaded.manifest.release!.version ||\n plist.CFBundleVersion !== builder.loaded.manifest.release!.buildNumber\n )\n throw new DeliveryError(\"archive_identity_mismatch\", 5);\n const signed = await runner.run(\"codesign\", [\"-d\", \"--entitlements\", \":-\", appPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const entitlementFile = path.join(root, \"entitlements.plist\");\n await writeFile(entitlementFile, signed.stdout, { mode: 0o600 });\n const converted = await runner.run(\"plutil\", [\"-convert\", \"json\", \"-o\", \"-\", entitlementFile], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const entitlements = parseSchema(\n z.record(z.string(), z.unknown()),\n JSON.parse(converted.stdout),\n );\n if (\n entitlements[\"com.apple.developer.team-identifier\"] !== credentials.account.teamId ||\n entitlements[\"application-identifier\"] !==\n `${credentials.account.teamId}.${plist.CFBundleIdentifier}`\n )\n throw new DeliveryError(\"archive_team_mismatch\", 5);\n if (\n builder.loaded.manifest.capabilities.pushNotifications &&\n entitlements[\"aps-environment\"] !== \"production\"\n )\n throw new DeliveryError(\"archive_push_entitlement_missing\", 5);\n if (\n builder.loaded.manifest.capabilities.signInWithApple &&\n (!Array.isArray(entitlements[\"com.apple.developer.applesignin\"]) ||\n !entitlements[\"com.apple.developer.applesignin\"].includes(\"Default\"))\n )\n throw new DeliveryError(\"archive_apple_login_entitlement_missing\", 5);\n for (const infoPath of names.filter((v) => /\\.(?:app|appex)\\/Info\\.plist$/.test(v))) {\n const targetPath = path.join(root, path.dirname(infoPath));\n await runner.run(\"codesign\", [\"--verify\", \"--strict\", targetPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const info = await runner.run(\n \"plutil\",\n [\"-convert\", \"json\", \"-o\", \"-\", path.join(root, infoPath)],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n const identifier = parseSchema(\n z.object({ CFBundleIdentifier: z.string() }),\n JSON.parse(info.stdout),\n ).CFBundleIdentifier;\n if (!builder.loaded.manifest.signing?.bundleIds.includes(identifier))\n throw new DeliveryError(\"archive_target_not_declared\", 5);\n const profileFile = path.join(targetPath, \"embedded.mobileprovision\");\n const profileXml = await runner.run(\"security\", [\"cms\", \"-D\", \"-i\", profileFile], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const decodedFile = path.join(root, \"profile.plist\");\n await writeFile(decodedFile, profileXml.stdout, { mode: 0o600 });\n const profileJson = await runner.run(\n builder.loaded.manifest.build?.bundleExecutable ?? \"bundle\",\n [\n \"exec\",\n \"ruby\",\n \"-rplist\",\n \"-rjson\",\n \"-rbase64\",\n \"-e\",\n 'p = Plist.parse_xml(ARGV.fetch(0)); p[\"ExpirationDate\"] = p.fetch(\"ExpirationDate\").iso8601; p[\"DeveloperCertificates\"] = p.fetch(\"DeveloperCertificates\").map { |v| Base64.strict_encode64(v.string) }; puts JSON.generate(p)',\n decodedFile,\n ],\n {\n cwd: root,\n env: { ...env, BUNDLE_GEMFILE: path.join(builder.loaded.directory, \"Gemfile\") },\n timeoutMs: 30_000,\n },\n );\n const profile = parseSchema(\n z.object({\n ExpirationDate: z.string(),\n TeamIdentifier: z.array(z.string()),\n DeveloperCertificates: z.array(z.string()),\n Entitlements: z.record(z.string(), z.unknown()),\n ProvisionedDevices: z.array(z.string()).optional(),\n ProvisionsAllDevices: z.boolean().optional(),\n }),\n JSON.parse(profileJson.stdout),\n );\n if (\n !Number.isFinite(Date.parse(profile.ExpirationDate)) ||\n Date.parse(profile.ExpirationDate) <= Date.now() ||\n !profile.TeamIdentifier.includes(credentials.account.teamId) ||\n profile.ProvisionedDevices ||\n profile.ProvisionsAllDevices ||\n profile.Entitlements[\"get-task-allow\"] === true ||\n profile.Entitlements[\"application-identifier\"] !==\n `${credentials.account.teamId}.${identifier}`\n )\n throw new DeliveryError(\"archive_profile_invalid\", 5);\n const targetSigned = await runner.run(\n \"codesign\",\n [\"-d\", \"--entitlements\", \":-\", targetPath],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n await writeFile(entitlementFile, targetSigned.stdout, { mode: 0o600 });\n const targetJson = await runner.run(\n \"plutil\",\n [\"-convert\", \"json\", \"-o\", \"-\", entitlementFile],\n { cwd: root, env, timeoutMs: 30_000 },\n );\n const targetEntitlements = parseSchema(\n z.record(z.string(), z.unknown()),\n JSON.parse(targetJson.stdout),\n );\n if (\n targetEntitlements[\"application-identifier\"] !==\n `${credentials.account.teamId}.${identifier}` ||\n targetEntitlements[\"com.apple.developer.team-identifier\"] !== credentials.account.teamId ||\n targetEntitlements[\"get-task-allow\"] === true\n )\n throw new DeliveryError(\"archive_target_entitlements_invalid\", 5);\n assertEntitlementsAuthorized(targetEntitlements, profile.Entitlements);\n const certPrefix = path.join(root, \"signing-certificate-\");\n await runner.run(\"codesign\", [\"-d\", \"--extract-certificates\", certPrefix, targetPath], {\n cwd: root,\n env,\n timeoutMs: 30_000,\n });\n const certificateBytes = await readFile(certPrefix + \"0\");\n const certificate = new X509Certificate(certificateBytes);\n if (\n Date.parse(certificate.validTo) <= Date.now() ||\n !profile.DeveloperCertificates.some((value) =>\n Buffer.from(value, \"base64\").equals(certificateBytes),\n )\n )\n throw new DeliveryError(\"archive_signing_certificate_mismatch\", 5);\n }\n } finally {\n await rm(root, { recursive: true, force: true });\n }\n}\n\n/** 签名使用的值必须在描述文件授权范围内;数组是集合子集,通配符只由授权方提供。 */\nexport function assertEntitlementsAuthorized(\n actual: Record<string, unknown>,\n allowed: Record<string, unknown>,\n): void {\n const matches = (value: unknown, policy: unknown): boolean => {\n if (typeof value === \"string\" && typeof policy === \"string\")\n return new RegExp(\n \"^\" +\n policy\n .split(\"*\")\n .map((v) => v.replace(/[.*+?^${}()|[\\]\\\\]/g, \"\\\\$&\"))\n .join(\".*\") +\n \"$\",\n ).test(value);\n if (Array.isArray(value))\n return Array.isArray(policy) && value.every((v) => policy.some((p) => matches(v, p)));\n if (\n value !== null &&\n typeof value === \"object\" &&\n policy !== null &&\n typeof policy === \"object\" &&\n !Array.isArray(policy)\n )\n return Object.entries(value).every(\n ([key, child]) =>\n Object.hasOwn(policy, key) && matches(child, (policy as Record<string, unknown>)[key]),\n );\n return value === policy;\n };\n if (!matches(actual, allowed)) throw new DeliveryError(\"archive_entitlements_not_authorized\", 5);\n}\n\nexport async function planUpload(\n builder: PlanBuilder,\n api: AppleGateway,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n runner: ProcessRunner,\n signal?: AbortSignal,\n): Promise<void> {\n const paths = await projectPaths(builder);\n const artifact = parseSchema(\n artifactSchema,\n await readJsonFile(path.join(paths.output, \"artifact.json\")),\n );\n if (\n artifact.bundleId !== builder.loaded.manifest.app.bundleId ||\n artifact.teamId !== credentials.account.teamId ||\n artifact.version !== builder.loaded.manifest.release?.version ||\n artifact.buildNumber !== builder.loaded.manifest.release?.buildNumber\n )\n throw new DeliveryError(\"archive_attestation_mismatch\", 4);\n if (\n (await realpath(artifact.ipaPath)) !== path.join(await realpath(paths.output), \"app.ipa\") ||\n fileDigest(await readFile(artifact.ipaPath)) !== artifact.sha256\n )\n throw new DeliveryError(\"archive_checksum_mismatch\", 4);\n await verifyArchive(artifact.ipaPath, builder, credentials, runner);\n await tools.preflight();\n const key = `upload.${artifact.sha256}`;\n const binding = builder.bindings[key];\n const accepted = binding?.type === \"acceptedUploads\" && binding.id === artifact.sha256;\n const existing = await selectedBuild(builder, api, true);\n if (existing && !accepted && (binding?.type !== \"builds\" || binding.id !== existing.id))\n throw new DeliveryError(\"existing_build_requires_upload_evidence\", 4);\n if (existing?.attributes.processingState === \"VALID\") {\n builder.satisfy(key, artifact);\n return;\n }\n builder.add(\n key,\n \"upload\",\n existing,\n artifact,\n [\"ipa\"],\n async () => {\n if (!accepted && !existing) {\n const result = await tools.run(\"upload\", {\n ipaPath: artifact.ipaPath,\n appId: builder.require(\"app\").id,\n });\n if (result.transportAccepted !== true)\n throw new DeliveryError(\"upload_transport_not_accepted\", 7);\n await builder.record(key, { type: \"acceptedUploads\", id: artifact.sha256 });\n }\n for (let attempt = 0; attempt < 30; attempt++) {\n const build = await selectedBuild(builder, api, true);\n if (build?.attributes.processingState === \"VALID\") return build;\n try {\n await systemClock.sleep(10_000, signal);\n } catch {\n throw new DeliveryError(\"build_processing_pending\", 7);\n }\n }\n throw new DeliveryError(\"build_processing_pending\", 7);\n },\n [],\n accepted || !!existing,\n );\n}\n","import path from \"node:path\";\nimport { realpath, lstat } from \"node:fs/promises\";\nimport { DeliveryError } from \"../contracts.js\";\nimport type { AppleCredentials } from \"../credentials.js\";\nimport type { AppleBuildTools } from \"../fastlane.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { canonical, fileDigest, resolveFile } from \"../manifest.js\";\nimport { validateImage } from \"./assets.js\";\n\nexport async function planNative(\n builder: PlanBuilder,\n credentials: AppleCredentials,\n tools: AppleBuildTools,\n): Promise<void> {\n const { build, app, assets, capabilities } = builder.loaded.manifest;\n if (!build?.infoPlistPath || !build.entitlementsPath || !build.iconSetPath)\n throw new DeliveryError(\"native_project_paths_required\", 2);\n await tools.preflight();\n const root = await realpath(path.resolve(builder.loaded.directory, build.projectRoot));\n const securePath = async (relative: string) => {\n const target = path.resolve(root, relative);\n if (!target.startsWith(root + path.sep)) throw new DeliveryError(\"native_path_outside_root\", 2);\n let parent = target;\n while (parent !== root) {\n try {\n await lstat(parent);\n const actual = await realpath(parent);\n if (!actual.startsWith(root + path.sep))\n throw new DeliveryError(\"native_path_outside_root\", 2);\n break;\n } catch (error) {\n if ((error as NodeJS.ErrnoException).code !== \"ENOENT\") throw error;\n }\n parent = path.dirname(parent);\n }\n return target;\n };\n const projectPath = await securePath(build.projectPath);\n const infoPlistPath = await securePath(build.infoPlistPath),\n entitlementsPath = await securePath(build.entitlementsPath),\n iconSetPath = await securePath(build.iconSetPath);\n const icons: { filename: string; source: string; luminosity?: string; sha256: string }[] = [];\n for (const [luminosity, name] of [\n [undefined, assets?.icon],\n [\"dark\", assets?.iconVariants?.dark],\n [\"tinted\", assets?.iconVariants?.tinted],\n ] as const) {\n if (!name) continue;\n validateImage(builder.loaded.files.get(name)!, true);\n icons.push({\n filename: luminosity ? `AppIcon-${luminosity}.png` : \"AppIcon.png\",\n luminosity,\n source: await resolveFile(builder.loaded.directory, name),\n sha256: fileDigest(builder.loaded.files.get(name)!),\n });\n }\n const parameters = {\n projectPath,\n targetName: build.targetName,\n infoPlistPath,\n entitlementsPath,\n iconSetPath,\n name: app.name,\n capabilities,\n icons,\n teamId: credentials.account.teamId,\n bundleId: app.bundleId,\n additionalTargets: build.additionalTargets,\n };\n const current = await tools.run(\"native\", { ...parameters, dryRun: true });\n if (current.matches === true) return;\n builder.add(\n \"native.project\",\n \"update\",\n current,\n parameters,\n [\"bundleId\", \"teamId\", \"displayName\", \"entitlements\", \"icons\"],\n async () => {\n const observed = await tools.run(\"native\", { ...parameters, dryRun: true });\n if (canonical(current) !== canonical(observed))\n throw new DeliveryError(\"native_project_changed\", 4);\n await tools.run(\"native\", { ...parameters, dryRun: false });\n const read = await tools.run(\"native\", { ...parameters, dryRun: true });\n if (read.matches !== true) throw new DeliveryError(\"native_project_readback_failed\", 5);\n return { type: \"nativeProjects\", id: app.bundleId };\n },\n );\n}\n","import type { AppleGateway, AppleResource } from \"../contracts.js\";\nimport type { PlanBuilder } from \"../plan.js\";\nimport { findApp } from \"./identifiers.js\";\nimport { readCatalog } from \"./catalog.js\";\n\nconst publicFields = [\n \"name\",\n \"bundleId\",\n \"sku\",\n \"primaryLocale\",\n \"platform\",\n \"versionString\",\n \"version\",\n \"appStoreState\",\n \"state\",\n \"processingState\",\n \"expired\",\n \"releaseType\",\n \"earliestReleaseDate\",\n \"locale\",\n \"subtitle\",\n \"privacyPolicyUrl\",\n \"privacyChoicesUrl\",\n \"description\",\n \"keywords\",\n \"promotionalText\",\n \"whatsNew\",\n \"supportUrl\",\n \"marketingUrl\",\n \"copyright\",\n \"productId\",\n \"referenceName\",\n \"subscriptionPeriod\",\n \"groupLevel\",\n \"inAppPurchaseType\",\n \"familySharable\",\n \"fileName\",\n \"fileSize\",\n \"sourceFileChecksum\",\n \"assetDeliveryState\",\n];\n\n/** 公开资料使用允许字段投影,供应商新增字段不能自动进入导出。 */\nexport function publicResource(value: AppleResource): AppleResource {\n const attributes = Object.fromEntries(\n publicFields\n .filter((key) => Object.hasOwn(value.attributes, key) && key !== \"assetDeliveryState\")\n .map((key) => [key, value.attributes[key]]),\n );\n const delivery = value.attributes.assetDeliveryState;\n if (delivery && typeof delivery === \"object\" && \"state\" in delivery)\n attributes.assetDeliveryState = { state: delivery.state };\n return { type: value.type, id: value.id, attributes };\n}\n\nexport async function inspectDelivery(\n builder: PlanBuilder,\n api: AppleGateway,\n materials = false,\n): Promise<AppleResource[]> {\n const rows: AppleResource[] = [];\n const bundles = await api.list(\"/v1/bundleIds\", {\n \"filter[identifier]\": builder.loaded.manifest.app.bundleId,\n });\n for (const bundle of bundles) {\n rows.push({\n type: bundle.type,\n id: bundle.id,\n attributes: {\n identifier: bundle.attributes.identifier,\n platform: bundle.attributes.platform,\n },\n });\n for (const capability of await api.list(`/v1/bundleIds/${bundle.id}/bundleIdCapabilities`))\n rows.push({\n type: capability.type,\n id: capability.id,\n attributes: { capabilityType: capability.attributes.capabilityType },\n });\n }\n const app = await findApp(builder, api);\n if (!app) return rows;\n rows.push(publicResource(app));\n const versions = await api.list(`/v1/apps/${app.id}/appStoreVersions`, {\n \"filter[platform]\": \"IOS\",\n });\n for (const version of versions.filter(\n (v) =>\n !builder.loaded.manifest.release ||\n v.attributes.versionString === builder.loaded.manifest.release.version,\n )) {\n rows.push(publicResource(version));\n if (materials) {\n const locales = await api.list(\n `/v1/appStoreVersions/${version.id}/appStoreVersionLocalizations`,\n );\n for (const locale of locales) {\n rows.push({\n ...publicResource(locale),\n relationships: { appStoreVersion: { data: { type: version.type, id: version.id } } },\n });\n for (const [sets, assets] of [\n [\"appScreenshotSets\", \"appScreenshots\"],\n [\"appPreviewSets\", \"appPreviews\"],\n ]) {\n for (const set of await api.list(\n `/v1/appStoreVersionLocalizations/${locale.id}/${sets}`,\n )) {\n rows.push({\n type: set.type,\n id: set.id,\n attributes: {\n screenshotDisplayType: set.attributes.screenshotDisplayType,\n previewType: set.attributes.previewType,\n },\n relationships: { localization: { data: { type: locale.type, id: locale.id } } },\n });\n for (const asset of await api.list(`/v1/${sets}/${set.id}/${assets}`))\n rows.push({\n ...publicResource(asset),\n relationships: { set: { data: { type: set.type, id: set.id } } },\n });\n }\n }\n }\n }\n }\n if (materials)\n for (const info of await api.list(`/v1/apps/${app.id}/appInfos`)) {\n rows.push(publicResource(info));\n for (const locale of await api.list(`/v1/appInfos/${info.id}/appInfoLocalizations`))\n rows.push({\n ...publicResource(locale),\n relationships: { appInfo: { data: { type: info.type, id: info.id } } },\n });\n }\n for (const row of await api.list(\"/v1/builds\", {\n \"filter[app]\": app.id,\n ...(builder.loaded.manifest.release\n ? { \"filter[version]\": builder.loaded.manifest.release.buildNumber }\n : {}),\n }))\n rows.push(publicResource(row));\n for (const submission of await api.list(`/v1/apps/${app.id}/reviewSubmissions`))\n rows.push(publicResource(submission));\n for (const product of (await readCatalog(builder, api)).values())\n rows.push(publicResource(product));\n return rows;\n}\n\nexport async function runtimeHandoff(\n builder: PlanBuilder,\n api: AppleGateway,\n): Promise<Record<string, unknown>> {\n const resources = await inspectDelivery(builder, api);\n const { app, capabilities, catalog } = builder.loaded.manifest;\n return {\n schemaVersion: 1,\n bundleId: app.bundleId,\n appId: builder.resources.get(\"app\")?.id,\n resources,\n productIds: catalog?.items.map((v) => v.productId) ?? [],\n requiredRuntimeConfiguration: {\n ...(capabilities.signInWithApple\n ? {\n identity: {\n audience: app.bundleId,\n required: [\"teamId\", \"appleLoginKeyId\", \"appleLoginPrivateKeyRef\"],\n verified: false,\n },\n }\n : {}),\n ...(capabilities.pushNotifications\n ? {\n notifications: {\n topic: app.bundleId,\n required: [\"apnsKeyId\", \"apnsPrivateKeyRef\", \"teamId\", \"environment\"],\n verified: false,\n },\n }\n : {}),\n ...(capabilities.inAppPurchase\n ? {\n commerce: {\n bundleId: app.bundleId,\n required: [\n \"appId\",\n \"issuerId\",\n \"inAppPurchaseKeyId\",\n \"inAppPurchasePrivateKeyRef\",\n \"environment\",\n \"serverNotificationUrl\",\n ],\n verified: false,\n },\n }\n : {}),\n },\n manualRequirements: builder.requirements,\n };\n}\n"],"mappings":"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","names":["path","fs","execa","file","fs","path","fs","path","fs","path","path","file","path","path","fs","execa","file","path","fs","prompts","ora","ora","file","path","fs","prompts","z","path","os","mkdir","writeFile","readFile","realpath","path","path","offer","group","readFile","stat","realpath","path","realpath","path","readFile","stat","z","z","init","url","id","realpath","readFile","z","path","realpath","path","z","readFile","fields","id","path","randomUUID","z","path","randomUUID","resource","id","fields","z","path","list","fields","linked","z","id","path","createHash","id","group","fields","createHash","z","createHash","path","z","url","resolve","createHash","state","locale","resource","group","path","id","subscription","price","territory","subscription","id","offer","price","fields","resource","territory","linked","id","price","territory","base","submission","purchase","group","id","fields","path","z","id","path","z","fields","group","execa","path","os","execa","mkdir","readFile","rm","realpath","os","path","z","z","path","readFile","os","mkdir","realpath","rm","path","readFile","realpath","lstat","mkdtemp","rm","os","z","z","realpath","path","lstat","id","readFile","mkdtemp","os","info","rm","path","realpath","lstat","realpath","path","lstat","locale","asset","program","path","realpath","readFile","writeFile","os","mkdir","z"]}
|