vybekiit 0.4.0 → 0.6.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/bin.js +840 -296
- package/dist/global-skills/add-ai/SKILL.md +53 -0
- package/dist/global-skills/add-analytics/SKILL.md +65 -0
- package/dist/global-skills/add-app-clip/SKILL.md +280 -0
- package/dist/global-skills/add-app-clip/agents/openai.yaml +4 -0
- package/dist/global-skills/add-app-clip/references/native-module.md +96 -0
- package/dist/global-skills/add-blog/SKILL.md +49 -0
- package/dist/global-skills/add-crud/SKILL.md +28 -0
- package/dist/global-skills/add-files/SKILL.md +65 -0
- package/dist/global-skills/add-images/SKILL.md +64 -0
- package/dist/global-skills/add-language/SKILL.md +44 -0
- package/dist/global-skills/add-notifications/SKILL.md +61 -0
- package/dist/global-skills/add-realtime/SKILL.md +49 -0
- package/dist/global-skills/add-route/SKILL.md +28 -0
- package/dist/global-skills/add-search/SKILL.md +43 -0
- package/dist/global-skills/add-signin/SKILL.md +78 -0
- package/dist/global-skills/add-teams/SKILL.md +64 -0
- package/dist/global-skills/add-upload/SKILL.md +27 -0
- package/dist/global-skills/aws-cdk/SKILL.md +72 -0
- package/dist/global-skills/aws-cdk/references/bootstrap-and-project-setup.md +257 -0
- package/dist/global-skills/aws-cdk/references/compliance-and-drift.md +193 -0
- package/dist/global-skills/aws-cdk/references/construct-patterns.md +315 -0
- package/dist/global-skills/aws-cdk/references/import-and-migrate.md +184 -0
- package/dist/global-skills/aws-cdk/references/refactor-and-prevent-replacement.md +198 -0
- package/dist/global-skills/aws-cdk/references/troubleshooting-credentials.md +183 -0
- package/dist/global-skills/aws-cdk/references/troubleshooting-deployment.md +293 -0
- package/dist/global-skills/aws-cdk/references/troubleshooting-synth.md +274 -0
- package/dist/global-skills/aws-cdk/references/v1-to-v2-migration.md +119 -0
- package/dist/global-skills/aws-cloudformation/SKILL.md +88 -0
- package/dist/global-skills/aws-cloudformation/references/author-cloudformation-best-practices.script.md +179 -0
- package/dist/global-skills/aws-cloudformation/references/check-cloudformation-template-compliance.script.md +159 -0
- package/dist/global-skills/aws-cloudformation/references/cloudformation-pre-deploy-validation.script.md +217 -0
- package/dist/global-skills/aws-cloudformation/references/deploy-with-express-mode.script.md +271 -0
- package/dist/global-skills/aws-cloudformation/references/lookup-resource-properties.script.md +130 -0
- package/dist/global-skills/aws-cloudformation/references/troubleshoot-deployment.script.md +200 -0
- package/dist/global-skills/aws-cloudformation/references/validate-cloudformation-template.script.md +135 -0
- package/dist/global-skills/aws-serverless/SKILL.md +51 -0
- package/dist/global-skills/aws-serverless/assets/powertools-handler.py +49 -0
- package/dist/global-skills/aws-serverless/references/api-gateway.md +553 -0
- package/dist/global-skills/aws-serverless/references/architecture.md +262 -0
- package/dist/global-skills/aws-serverless/references/concurrency.md +200 -0
- package/dist/global-skills/aws-serverless/references/deployment.md +94 -0
- package/dist/global-skills/aws-serverless/references/event-sources.md +484 -0
- package/dist/global-skills/aws-serverless/references/lambda.md +548 -0
- package/dist/global-skills/aws-serverless/references/orchestration.md +449 -0
- package/dist/global-skills/aws-serverless/references/production.md +493 -0
- package/dist/global-skills/aws-serverless/references/troubleshooting.md +711 -0
- package/dist/global-skills/back-up-my-code/SKILL.md +48 -0
- package/dist/global-skills/better-auth-best-practices/SKILL.md +182 -0
- package/dist/global-skills/better-auth-security-best-practices/SKILL.md +432 -0
- package/dist/global-skills/building-native-ui/SKILL.md +377 -0
- package/dist/global-skills/building-native-ui/agents/openai.yaml +4 -0
- package/dist/global-skills/building-native-ui/references/animations.md +220 -0
- package/dist/global-skills/building-native-ui/references/controls.md +270 -0
- package/dist/global-skills/building-native-ui/references/form-sheet.md +253 -0
- package/dist/global-skills/building-native-ui/references/gradients.md +106 -0
- package/dist/global-skills/building-native-ui/references/icons.md +213 -0
- package/dist/global-skills/building-native-ui/references/media.md +198 -0
- package/dist/global-skills/building-native-ui/references/route-structure.md +229 -0
- package/dist/global-skills/building-native-ui/references/search.md +248 -0
- package/dist/global-skills/building-native-ui/references/storage.md +121 -0
- package/dist/global-skills/building-native-ui/references/tabs.md +433 -0
- package/dist/global-skills/building-native-ui/references/toolbar-and-headers.md +284 -0
- package/dist/global-skills/building-native-ui/references/visual-effects.md +197 -0
- package/dist/global-skills/building-native-ui/references/webgpu-three.md +605 -0
- package/dist/global-skills/building-native-ui/references/zoom-transitions.md +158 -0
- package/dist/global-skills/buy-domain/SKILL.md +64 -0
- package/dist/global-skills/check-safety/SKILL.md +94 -0
- package/dist/global-skills/claimable-postgres/SKILL.md +249 -0
- package/dist/global-skills/configure-capabilities/SKILL.md +38 -0
- package/dist/global-skills/connect-account/SKILL.md +64 -0
- package/dist/global-skills/connect-account-backend/SKILL.md +41 -0
- package/dist/global-skills/create-auth-skill/SKILL.md +321 -0
- package/dist/global-skills/design-my-data/SKILL.md +48 -0
- package/dist/global-skills/doctor/SKILL.md +84 -0
- package/dist/global-skills/eas-app-stores/SKILL.md +152 -0
- package/dist/global-skills/eas-app-stores/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-app-stores/references/app-store-metadata.md +497 -0
- package/dist/global-skills/eas-app-stores/references/ios-app-store.md +371 -0
- package/dist/global-skills/eas-app-stores/references/play-store.md +246 -0
- package/dist/global-skills/eas-app-stores/references/testflight.md +58 -0
- package/dist/global-skills/eas-app-stores/references/workflows.md +120 -0
- package/dist/global-skills/eas-hosting/SKILL.md +423 -0
- package/dist/global-skills/eas-hosting/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-observe/SKILL.md +32 -0
- package/dist/global-skills/eas-observe/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-observe/references/metrics.md +47 -0
- package/dist/global-skills/eas-observe/references/queries.md +342 -0
- package/dist/global-skills/eas-observe/references/setup.md +317 -0
- package/dist/global-skills/eas-simulator/SKILL.md +156 -0
- package/dist/global-skills/eas-simulator/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-simulator/references/controllers.md +67 -0
- package/dist/global-skills/eas-simulator/references/run-your-app.md +185 -0
- package/dist/global-skills/eas-simulator/references/troubleshooting.md +38 -0
- package/dist/global-skills/eas-update-insights/SKILL.md +230 -0
- package/dist/global-skills/eas-update-insights/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-update-insights/references/channel-insights-schema.md +47 -0
- package/dist/global-skills/eas-update-insights/references/update-insights-schema.md +69 -0
- package/dist/global-skills/eas-workflows/SKILL.md +94 -0
- package/dist/global-skills/eas-workflows/agents/openai.yaml +4 -0
- package/dist/global-skills/eas-workflows/scripts/fetch.js +109 -0
- package/dist/global-skills/eas-workflows/scripts/package.json +11 -0
- package/dist/global-skills/eas-workflows/scripts/validate.js +84 -0
- package/dist/global-skills/email-best-practices/SKILL.md +73 -0
- package/dist/global-skills/expo-api-routes/SKILL.md +368 -0
- package/dist/global-skills/expo-api-routes/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-app-clip/SKILL.md +282 -0
- package/dist/global-skills/expo-app-clip/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-app-clip/references/native-module.md +96 -0
- package/dist/global-skills/expo-brownfield/SKILL.md +54 -0
- package/dist/global-skills/expo-brownfield/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-brownfield/references/brownfield-integrated.md +526 -0
- package/dist/global-skills/expo-brownfield/references/brownfield-isolated.md +402 -0
- package/dist/global-skills/expo-brownfield/references/comparison.md +63 -0
- package/dist/global-skills/expo-brownfield/references/troubleshooting.md +88 -0
- package/dist/global-skills/expo-cicd-workflows/SKILL.md +92 -0
- package/dist/global-skills/expo-cicd-workflows/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-cicd-workflows/scripts/fetch.js +109 -0
- package/dist/global-skills/expo-cicd-workflows/scripts/package.json +11 -0
- package/dist/global-skills/expo-cicd-workflows/scripts/validate.js +84 -0
- package/dist/global-skills/expo-data-fetching/SKILL.md +449 -0
- package/dist/global-skills/expo-data-fetching/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-data-fetching/references/expo-router-loaders.md +341 -0
- package/dist/global-skills/expo-data-fetching/references/offline-and-cancellation.md +68 -0
- package/dist/global-skills/expo-deployment/SKILL.md +167 -0
- package/dist/global-skills/expo-deployment/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-deployment/references/app-store-metadata.md +497 -0
- package/dist/global-skills/expo-deployment/references/ios-app-store.md +371 -0
- package/dist/global-skills/expo-deployment/references/play-store.md +246 -0
- package/dist/global-skills/expo-deployment/references/testflight.md +58 -0
- package/dist/global-skills/expo-deployment/references/workflows.md +160 -0
- package/dist/global-skills/expo-dev-client/SKILL.md +174 -0
- package/dist/global-skills/expo-dev-client/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-dom/SKILL.md +417 -0
- package/dist/global-skills/expo-dom/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-examples/SKILL.md +99 -0
- package/dist/global-skills/expo-examples/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-examples/references/catalog.md +105 -0
- package/dist/global-skills/expo-module/SKILL.md +141 -0
- package/dist/global-skills/expo-module/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-module/references/config-plugin.md +90 -0
- package/dist/global-skills/expo-module/references/create-expo-module.md +206 -0
- package/dist/global-skills/expo-module/references/lifecycle.md +127 -0
- package/dist/global-skills/expo-module/references/module-config.md +48 -0
- package/dist/global-skills/expo-module/references/native-module.md +286 -0
- package/dist/global-skills/expo-module/references/native-view.md +171 -0
- package/dist/global-skills/expo-native-ui/SKILL.md +181 -0
- package/dist/global-skills/expo-native-ui/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-native-ui/references/animations.md +220 -0
- package/dist/global-skills/expo-native-ui/references/controls.md +270 -0
- package/dist/global-skills/expo-native-ui/references/gradients.md +106 -0
- package/dist/global-skills/expo-native-ui/references/icons.md +213 -0
- package/dist/global-skills/expo-native-ui/references/media.md +198 -0
- package/dist/global-skills/expo-native-ui/references/storage.md +121 -0
- package/dist/global-skills/expo-native-ui/references/visual-effects.md +197 -0
- package/dist/global-skills/expo-native-ui/references/webgpu-three.md +605 -0
- package/dist/global-skills/expo-observe/SKILL.md +30 -0
- package/dist/global-skills/expo-observe/references/metrics.md +47 -0
- package/dist/global-skills/expo-observe/references/queries.md +342 -0
- package/dist/global-skills/expo-observe/references/setup.md +317 -0
- package/dist/global-skills/expo-router/SKILL.md +230 -0
- package/dist/global-skills/expo-router/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-router/references/form-sheet.md +253 -0
- package/dist/global-skills/expo-router/references/route-structure.md +229 -0
- package/dist/global-skills/expo-router/references/search.md +248 -0
- package/dist/global-skills/expo-router/references/tabs.md +433 -0
- package/dist/global-skills/expo-router/references/toolbar-and-headers.md +284 -0
- package/dist/global-skills/expo-router/references/zoom-transitions.md +158 -0
- package/dist/global-skills/expo-skill-eval/SKILL.md +314 -0
- package/dist/global-skills/expo-skill-eval/agents/visual-grader.md +52 -0
- package/dist/global-skills/expo-skill-eval/references/design-rubric.md +45 -0
- package/dist/global-skills/expo-skill-eval/references/runtime-matrix.md +34 -0
- package/dist/global-skills/expo-skill-eval/scripts/check-static.sh +64 -0
- package/dist/global-skills/expo-skill-eval/scripts/clean-fixture.sh +56 -0
- package/dist/global-skills/expo-skill-eval/scripts/generate_viewer.py +450 -0
- package/dist/global-skills/expo-skill-eval/scripts/latest-sdk.sh +46 -0
- package/dist/global-skills/expo-skill-eval/scripts/make-fixture.sh +95 -0
- package/dist/global-skills/expo-skill-eval/scripts/make-workspace.sh +31 -0
- package/dist/global-skills/expo-skill-eval/scripts/snapshot-android.sh +284 -0
- package/dist/global-skills/expo-skill-eval/scripts/snapshot-ios.sh +132 -0
- package/dist/global-skills/expo-skill-eval/scripts/snapshot-web.sh +61 -0
- package/dist/global-skills/expo-skill-feedback/SKILL.md +54 -0
- package/dist/global-skills/expo-skill-feedback/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-skill-feedback/scripts/skill-event.cjs +180 -0
- package/dist/global-skills/expo-skill-feedback/scripts/skill-feedback.cjs +118 -0
- package/dist/global-skills/expo-skill-feedback/scripts/telemetry.cjs +65 -0
- package/dist/global-skills/expo-skill-feedback/scripts/telemetry_common.cjs +171 -0
- package/dist/global-skills/expo-tailwind-setup/SKILL.md +480 -0
- package/dist/global-skills/expo-tailwind-setup/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-ui/SKILL.md +47 -0
- package/dist/global-skills/expo-ui/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-ui/references/drop-in-replacements.md +27 -0
- package/dist/global-skills/expo-ui/references/jetpack-compose.md +73 -0
- package/dist/global-skills/expo-ui/references/swift-ui.md +73 -0
- package/dist/global-skills/expo-ui/references/universal.md +73 -0
- package/dist/global-skills/expo-ui/scripts/list-components.js +193 -0
- package/dist/global-skills/expo-upgrade/SKILL.md +134 -0
- package/dist/global-skills/expo-upgrade/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-upgrade/references/expo-av-to-audio.md +132 -0
- package/dist/global-skills/expo-upgrade/references/expo-av-to-video.md +160 -0
- package/dist/global-skills/expo-upgrade/references/native-tabs.md +124 -0
- package/dist/global-skills/expo-upgrade/references/new-architecture.md +79 -0
- package/dist/global-skills/expo-upgrade/references/react-19.md +79 -0
- package/dist/global-skills/expo-upgrade/references/react-compiler.md +59 -0
- package/dist/global-skills/expo-upgrade/references/react-navigation-to-expo-router.md +61 -0
- package/dist/global-skills/expo-web-to-native/SKILL.md +83 -0
- package/dist/global-skills/expo-web-to-native/agents/openai.yaml +4 -0
- package/dist/global-skills/expo-web-to-native/references/false-friends.md +119 -0
- package/dist/global-skills/expo-web-to-native/references/native-patterns.md +39 -0
- package/dist/global-skills/expo-web-to-native/references/run-as-goal.md +48 -0
- package/dist/global-skills/expo-web-to-native/references/verify-on-device.md +45 -0
- package/dist/global-skills/firebase-ai-logic-basics/SKILL.md +165 -0
- package/dist/global-skills/firebase-ai-logic-basics/references/flutter_setup.md +95 -0
- package/dist/global-skills/firebase-ai-logic-basics/references/ios_setup.md +156 -0
- package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_android.md +157 -0
- package/dist/global-skills/firebase-ai-logic-basics/references/usage_patterns_web.md +186 -0
- package/dist/global-skills/firebase-app-hosting-basics/SKILL.md +73 -0
- package/dist/global-skills/firebase-app-hosting-basics/references/cli_commands.md +85 -0
- package/dist/global-skills/firebase-app-hosting-basics/references/configuration.md +59 -0
- package/dist/global-skills/firebase-app-hosting-basics/references/emulation.md +59 -0
- package/dist/global-skills/firebase-auth-basics/SKILL.md +118 -0
- package/dist/global-skills/firebase-auth-basics/references/client_sdk_android.md +160 -0
- package/dist/global-skills/firebase-auth-basics/references/client_sdk_web.md +301 -0
- package/dist/global-skills/firebase-auth-basics/references/flutter_setup.md +149 -0
- package/dist/global-skills/firebase-auth-basics/references/ios_setup.md +87 -0
- package/dist/global-skills/firebase-auth-basics/references/security_rules.md +49 -0
- package/dist/global-skills/firebase-basics/SKILL.md +148 -0
- package/dist/global-skills/firebase-basics/references/android_setup.md +41 -0
- package/dist/global-skills/firebase-basics/references/firebase-cli-guide.md +18 -0
- package/dist/global-skills/firebase-basics/references/firebase-service-init.md +20 -0
- package/dist/global-skills/firebase-basics/references/flutter_setup.md +143 -0
- package/dist/global-skills/firebase-basics/references/ios_setup.md +113 -0
- package/dist/global-skills/firebase-basics/references/local-env-setup.md +80 -0
- package/dist/global-skills/firebase-basics/references/refresh/android_studio.md +41 -0
- package/dist/global-skills/firebase-basics/references/refresh/antigravity.md +64 -0
- package/dist/global-skills/firebase-basics/references/refresh/claude.md +12 -0
- package/dist/global-skills/firebase-basics/references/refresh/gemini-cli.md +13 -0
- package/dist/global-skills/firebase-basics/references/refresh/other-agents.md +67 -0
- package/dist/global-skills/firebase-basics/references/setup/android_studio.md +23 -0
- package/dist/global-skills/firebase-basics/references/setup/antigravity.md +98 -0
- package/dist/global-skills/firebase-basics/references/setup/claude_code.md +45 -0
- package/dist/global-skills/firebase-basics/references/setup/cursor.md +93 -0
- package/dist/global-skills/firebase-basics/references/setup/gemini_cli.md +53 -0
- package/dist/global-skills/firebase-basics/references/setup/github_copilot.md +104 -0
- package/dist/global-skills/firebase-basics/references/setup/other_agents.md +99 -0
- package/dist/global-skills/firebase-basics/references/web_setup.md +77 -0
- package/dist/global-skills/firebase-crashlytics/SKILL.md +42 -0
- package/dist/global-skills/firebase-crashlytics/references/android_setup.md +152 -0
- package/dist/global-skills/firebase-crashlytics/references/ios_setup.md +115 -0
- package/dist/global-skills/firebase-data-connect/SKILL.md +191 -0
- package/dist/global-skills/firebase-data-connect/examples.md +638 -0
- package/dist/global-skills/firebase-data-connect/reference/cloud_functions.md +184 -0
- package/dist/global-skills/firebase-data-connect/reference/config.md +271 -0
- package/dist/global-skills/firebase-data-connect/reference/data_seeding.md +185 -0
- package/dist/global-skills/firebase-data-connect/reference/native_sql.md +170 -0
- package/dist/global-skills/firebase-data-connect/reference/operations.md +385 -0
- package/dist/global-skills/firebase-data-connect/reference/realtime.md +210 -0
- package/dist/global-skills/firebase-data-connect/reference/schema.md +290 -0
- package/dist/global-skills/firebase-data-connect/reference/sdk_admin_node.md +141 -0
- package/dist/global-skills/firebase-data-connect/reference/sdk_android.md +126 -0
- package/dist/global-skills/firebase-data-connect/reference/sdk_flutter.md +134 -0
- package/dist/global-skills/firebase-data-connect/reference/sdk_ios.md +157 -0
- package/dist/global-skills/firebase-data-connect/reference/sdk_web.md +146 -0
- package/dist/global-skills/firebase-data-connect/reference/search.md +264 -0
- package/dist/global-skills/firebase-data-connect/reference/security.md +295 -0
- package/dist/global-skills/firebase-data-connect/templates.md +318 -0
- package/dist/global-skills/firebase-firestore/SKILL.md +89 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/android_sdk_usage.md +230 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/data_model.md +66 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/flutter_setup.md +180 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/indexes.md +135 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/ios_setup.md +189 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/provisioning.md +118 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/python_sdk_usage.md +138 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/security_rules.md +577 -0
- package/dist/global-skills/firebase-firestore/references/enterprise/web_sdk_usage.md +127 -0
- package/dist/global-skills/firebase-firestore/references/standard/android_sdk_usage.md +193 -0
- package/dist/global-skills/firebase-firestore/references/standard/flutter_setup.md +176 -0
- package/dist/global-skills/firebase-firestore/references/standard/indexes.md +113 -0
- package/dist/global-skills/firebase-firestore/references/standard/ios_setup.md +174 -0
- package/dist/global-skills/firebase-firestore/references/standard/provisioning.md +110 -0
- package/dist/global-skills/firebase-firestore/references/standard/security_rules.md +577 -0
- package/dist/global-skills/firebase-firestore/references/standard/web_sdk_usage.md +192 -0
- package/dist/global-skills/firebase-hosting-basics/SKILL.md +64 -0
- package/dist/global-skills/firebase-hosting-basics/references/configuration.md +115 -0
- package/dist/global-skills/firebase-hosting-basics/references/deploying.md +48 -0
- package/dist/global-skills/firebase-remote-config-basics/SKILL.md +124 -0
- package/dist/global-skills/firebase-remote-config-basics/references/android_setup.md +91 -0
- package/dist/global-skills/firebase-remote-config-basics/references/ios_setup.md +89 -0
- package/dist/global-skills/firebase-security-rules-auditor/SKILL.md +70 -0
- package/dist/global-skills/go-live/SKILL.md +90 -0
- package/dist/global-skills/harden/SKILL.md +101 -0
- package/dist/global-skills/instrument-feature-flags/SKILL.md +88 -0
- package/dist/global-skills/instrument-feature-flags/references/adding-feature-flag-code.md +3578 -0
- package/dist/global-skills/instrument-feature-flags/references/android.md +146 -0
- package/dist/global-skills/instrument-feature-flags/references/api.md +194 -0
- package/dist/global-skills/instrument-feature-flags/references/best-practices.md +231 -0
- package/dist/global-skills/instrument-feature-flags/references/django.md +263 -0
- package/dist/global-skills/instrument-feature-flags/references/dotnet.md +763 -0
- package/dist/global-skills/instrument-feature-flags/references/elixir.md +47 -0
- package/dist/global-skills/instrument-feature-flags/references/flask.md +131 -0
- package/dist/global-skills/instrument-feature-flags/references/flutter.md +212 -0
- package/dist/global-skills/instrument-feature-flags/references/go.md +208 -0
- package/dist/global-skills/instrument-feature-flags/references/ios.md +146 -0
- package/dist/global-skills/instrument-feature-flags/references/java.md +94 -0
- package/dist/global-skills/instrument-feature-flags/references/laravel.md +170 -0
- package/dist/global-skills/instrument-feature-flags/references/next-js.md +383 -0
- package/dist/global-skills/instrument-feature-flags/references/nodejs.md +216 -0
- package/dist/global-skills/instrument-feature-flags/references/php.md +187 -0
- package/dist/global-skills/instrument-feature-flags/references/python.md +191 -0
- package/dist/global-skills/instrument-feature-flags/references/react-native.md +166 -0
- package/dist/global-skills/instrument-feature-flags/references/react.md +302 -0
- package/dist/global-skills/instrument-feature-flags/references/ruby-on-rails.md +604 -0
- package/dist/global-skills/instrument-feature-flags/references/ruby.md +200 -0
- package/dist/global-skills/instrument-feature-flags/references/rust.md +222 -0
- package/dist/global-skills/instrument-feature-flags/references/usage.md +600 -0
- package/dist/global-skills/instrument-feature-flags/references/web.md +193 -0
- package/dist/global-skills/instrument-product-analytics/SKILL.md +139 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-android.md +1639 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-angular.md +944 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-hybrid.md +1001 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-ssr.md +1004 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-static.md +720 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-astro-view-transitions.md +810 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-django.md +1167 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-expo.md +1412 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-fastapi.md +1585 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-flask.md +1208 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-laravel.md +2267 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-next-app-router.md +712 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-next-pages-router.md +767 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-nuxt-3-6.md +939 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-nuxt-4.md +1078 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-php.md +527 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-python.md +481 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-native.md +1823 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-6.md +582 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-data.md +892 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-declarative.md +649 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-react-router-7-framework.md +1218 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-tanstack-router-code-based.md +793 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-react-tanstack-router-file-based.md +780 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby-on-rails.md +1320 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-ruby.md +452 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-sveltekit.md +854 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-swift.md +665 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-tanstack-start.md +1199 -0
- package/dist/global-skills/instrument-product-analytics/references/EXAMPLE-vue-3.md +910 -0
- package/dist/global-skills/instrument-product-analytics/references/android.md +811 -0
- package/dist/global-skills/instrument-product-analytics/references/angular.md +376 -0
- package/dist/global-skills/instrument-product-analytics/references/astro.md +165 -0
- package/dist/global-skills/instrument-product-analytics/references/configuration.md +299 -0
- package/dist/global-skills/instrument-product-analytics/references/django.md +263 -0
- package/dist/global-skills/instrument-product-analytics/references/dotnet.md +763 -0
- package/dist/global-skills/instrument-product-analytics/references/elixir.md +414 -0
- package/dist/global-skills/instrument-product-analytics/references/flask.md +131 -0
- package/dist/global-skills/instrument-product-analytics/references/flutter.md +845 -0
- package/dist/global-skills/instrument-product-analytics/references/go.md +567 -0
- package/dist/global-skills/instrument-product-analytics/references/identify-users.md +272 -0
- package/dist/global-skills/instrument-product-analytics/references/ios.md +154 -0
- package/dist/global-skills/instrument-product-analytics/references/laravel.md +170 -0
- package/dist/global-skills/instrument-product-analytics/references/next-js.md +383 -0
- package/dist/global-skills/instrument-product-analytics/references/nuxt-js-3-6.md +244 -0
- package/dist/global-skills/instrument-product-analytics/references/nuxt-js.md +253 -0
- package/dist/global-skills/instrument-product-analytics/references/php.md +646 -0
- package/dist/global-skills/instrument-product-analytics/references/posthog-python.md +1675 -0
- package/dist/global-skills/instrument-product-analytics/references/python.md +898 -0
- package/dist/global-skills/instrument-product-analytics/references/react-native.md +1338 -0
- package/dist/global-skills/instrument-product-analytics/references/react-router-v6.md +376 -0
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-data-mode.md +364 -0
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-declarative-mode.md +376 -0
- package/dist/global-skills/instrument-product-analytics/references/react-router-v7-framework-mode.md +479 -0
- package/dist/global-skills/instrument-product-analytics/references/ruby-on-rails.md +604 -0
- package/dist/global-skills/instrument-product-analytics/references/ruby.md +759 -0
- package/dist/global-skills/instrument-product-analytics/references/svelte.md +234 -0
- package/dist/global-skills/instrument-product-analytics/references/tanstack-start.md +193 -0
- package/dist/global-skills/instrument-product-analytics/references/usage.md +600 -0
- package/dist/global-skills/instrument-product-analytics/references/vue-js.md +306 -0
- package/dist/global-skills/manifest.json +125 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/SKILL.md +284 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/connection-configs.md +298 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/development-workflow.md +304 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/mcp-troubleshooting.md +55 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/output-diagnostics.md +150 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/pipeline-patterns.md +457 -0
- package/dist/global-skills/mongodb-atlas-stream-processing/references/sizing-and-parallelism.md +178 -0
- package/dist/global-skills/mongodb-connection/SKILL.md +201 -0
- package/dist/global-skills/mongodb-connection/references/monitoring-guide.md +191 -0
- package/dist/global-skills/mongodb-mcp-setup/SKILL.md +324 -0
- package/dist/global-skills/mongodb-natural-language-querying/SKILL.md +195 -0
- package/dist/global-skills/mongodb-query-optimizer/SKILL.md +150 -0
- package/dist/global-skills/mongodb-query-optimizer/references/aggregation-optimization.md +210 -0
- package/dist/global-skills/mongodb-query-optimizer/references/antipattern-examples.md +74 -0
- package/dist/global-skills/mongodb-query-optimizer/references/core-indexing-principles.md +134 -0
- package/dist/global-skills/mongodb-query-optimizer/references/update-query-examples.md +39 -0
- package/dist/global-skills/mongodb-schema-design/SKILL.md +181 -0
- package/dist/global-skills/mongodb-schema-design/references/antipattern-excessive-lookups.md +84 -0
- package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-collections.md +91 -0
- package/dist/global-skills/mongodb-schema-design/references/antipattern-unnecessary-indexes.md +95 -0
- package/dist/global-skills/mongodb-schema-design/references/fundamental-document-model.md +91 -0
- package/dist/global-skills/mongodb-schema-design/references/fundamental-document-size.md +226 -0
- package/dist/global-skills/mongodb-schema-design/references/fundamental-embed-vs-reference.md +418 -0
- package/dist/global-skills/mongodb-schema-design/references/fundamental-schema-validation.md +131 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-approximation.md +80 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-archive.md +143 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-attribute.md +77 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-bucket.md +102 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-computed.md +162 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-document-versioning.md +166 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-extended-reference.md +72 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-outlier.md +159 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-polymorphic.md +167 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-schema-versioning.md +273 -0
- package/dist/global-skills/mongodb-schema-design/references/pattern-time-series-collections.md +190 -0
- package/dist/global-skills/mongodb-schema-design/references/source-query-stats.md +123 -0
- package/dist/global-skills/mongodb-schema-design/references/source-slow-query-logs.md +63 -0
- package/dist/global-skills/mongodb-search-and-ai/SKILL.md +142 -0
- package/dist/global-skills/mongodb-search-and-ai/references/hybrid-search.md +697 -0
- package/dist/global-skills/mongodb-search-and-ai/references/lexical-search-indexing.md +584 -0
- package/dist/global-skills/mongodb-search-and-ai/references/lexical-search-querying.md +636 -0
- package/dist/global-skills/mongodb-search-and-ai/references/vector-search.md +746 -0
- package/dist/global-skills/native-data-fetching/SKILL.md +505 -0
- package/dist/global-skills/native-data-fetching/agents/openai.yaml +4 -0
- package/dist/global-skills/native-data-fetching/references/expo-router-loaders.md +341 -0
- package/dist/global-skills/neon/SKILL.md +343 -0
- package/dist/global-skills/neon-ai-gateway/SKILL.md +236 -0
- package/dist/global-skills/neon-functions/SKILL.md +490 -0
- package/dist/global-skills/neon-functions/references/ai-sdk.md +139 -0
- package/dist/global-skills/neon-functions/references/hono-websockets.md +145 -0
- package/dist/global-skills/neon-functions/references/mastra-studio.md +127 -0
- package/dist/global-skills/neon-functions/references/mcp.md +137 -0
- package/dist/global-skills/neon-functions/references/sentry.md +131 -0
- package/dist/global-skills/neon-functions/references/sse.md +143 -0
- package/dist/global-skills/neon-object-storage/SKILL.md +197 -0
- package/dist/global-skills/neon-postgres/SKILL.md +376 -0
- package/dist/global-skills/neon-postgres-branches/SKILL.md +281 -0
- package/dist/global-skills/neon-postgres-egress-optimizer/SKILL.md +247 -0
- package/dist/global-skills/onboarding/SKILL.md +101 -0
- package/dist/global-skills/plan-my-idea/SKILL.md +67 -0
- package/dist/global-skills/publish-app/SKILL.md +72 -0
- package/dist/global-skills/publish-extension/SKILL.md +47 -0
- package/dist/global-skills/resend/SKILL.md +294 -0
- package/dist/global-skills/resend/references/api-keys.md +98 -0
- package/dist/global-skills/resend/references/automations.md +228 -0
- package/dist/global-skills/resend/references/broadcasts.md +125 -0
- package/dist/global-skills/resend/references/contact-properties.md +111 -0
- package/dist/global-skills/resend/references/contacts.md +174 -0
- package/dist/global-skills/resend/references/domains.md +179 -0
- package/dist/global-skills/resend/references/events.md +119 -0
- package/dist/global-skills/resend/references/fetch-all-templates.mjs +37 -0
- package/dist/global-skills/resend/references/installation.md +142 -0
- package/dist/global-skills/resend/references/logs.md +161 -0
- package/dist/global-skills/resend/references/receiving.md +287 -0
- package/dist/global-skills/resend/references/segments.md +77 -0
- package/dist/global-skills/resend/references/sending/batch-email-examples.md +807 -0
- package/dist/global-skills/resend/references/sending/best-practices.md +453 -0
- package/dist/global-skills/resend/references/sending/email-management.md +135 -0
- package/dist/global-skills/resend/references/sending/overview.md +209 -0
- package/dist/global-skills/resend/references/sending/single-email-examples.md +470 -0
- package/dist/global-skills/resend/references/templates.md +202 -0
- package/dist/global-skills/resend/references/topics.md +104 -0
- package/dist/global-skills/resend/references/webhooks.md +317 -0
- package/dist/global-skills/reset-password/SKILL.md +59 -0
- package/dist/global-skills/save-data/SKILL.md +70 -0
- package/dist/global-skills/sentry-sdk-setup/SKILL.md +116 -0
- package/dist/global-skills/sentry-workflow/SKILL.md +32 -0
- package/dist/global-skills/setup-email/SKILL.md +69 -0
- package/dist/global-skills/setup-payments/SKILL.md +82 -0
- package/dist/global-skills/setup-sms/SKILL.md +51 -0
- package/dist/global-skills/sign-in-with-email-link/SKILL.md +53 -0
- package/dist/global-skills/sign-in-with-google/SKILL.md +68 -0
- package/dist/global-skills/sign-in-with-phone/SKILL.md +53 -0
- package/dist/global-skills/stripe-best-practices/SKILL.md +48 -0
- package/dist/global-skills/stripe-best-practices/references/billing.md +58 -0
- package/dist/global-skills/stripe-best-practices/references/connect.md +173 -0
- package/dist/global-skills/stripe-best-practices/references/payments.md +79 -0
- package/dist/global-skills/stripe-best-practices/references/security.md +109 -0
- package/dist/global-skills/stripe-best-practices/references/tax.md +37 -0
- package/dist/global-skills/stripe-best-practices/references/treasury.md +16 -0
- package/dist/global-skills/supabase/CHANGELOG.md +53 -0
- package/dist/global-skills/supabase/SKILL.md +145 -0
- package/dist/global-skills/supabase/assets/feedback-issue-template.md +17 -0
- package/dist/global-skills/supabase/references/skill-feedback.md +17 -0
- package/dist/global-skills/supabase-postgres-best-practices/CHANGELOG.md +43 -0
- package/dist/global-skills/supabase-postgres-best-practices/SKILL.md +64 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/_contributing.md +170 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/_sections.md +39 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/_template.md +34 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/advanced-full-text-search.md +55 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/advanced-jsonb-indexing.md +49 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/conn-idle-timeout.md +46 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/conn-limits.md +44 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/conn-pooling.md +41 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/conn-prepared-statements.md +46 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/data-batch-inserts.md +54 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/data-n-plus-one.md +53 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/data-pagination.md +50 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/data-upsert.md +50 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/lock-advisory.md +56 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/lock-deadlock-prevention.md +68 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/lock-short-transactions.md +50 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/lock-skip-locked.md +54 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/monitor-explain-analyze.md +45 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/monitor-pg-stat-statements.md +55 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/monitor-vacuum-analyze.md +55 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/query-composite-indexes.md +44 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/query-covering-indexes.md +40 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/query-index-types.md +48 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/query-missing-indexes.md +43 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/query-partial-indexes.md +45 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-constraints.md +80 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-data-types.md +46 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-foreign-key-indexes.md +59 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-lowercase-identifiers.md +55 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-partitioning.md +55 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/schema-primary-keys.md +61 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/security-privileges.md +54 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/security-rls-basics.md +50 -0
- package/dist/global-skills/supabase-postgres-best-practices/references/security-rls-performance.md +63 -0
- package/dist/global-skills/track-errors/SKILL.md +67 -0
- package/dist/global-skills/update-kit/SKILL.md +75 -0
- package/dist/global-skills/upgrading-expo/SKILL.md +134 -0
- package/dist/global-skills/upgrading-expo/agents/openai.yaml +4 -0
- package/dist/global-skills/upgrading-expo/references/expo-av-to-audio.md +132 -0
- package/dist/global-skills/upgrading-expo/references/expo-av-to-video.md +160 -0
- package/dist/global-skills/upgrading-expo/references/native-tabs.md +124 -0
- package/dist/global-skills/upgrading-expo/references/new-architecture.md +79 -0
- package/dist/global-skills/upgrading-expo/references/react-19.md +79 -0
- package/dist/global-skills/upgrading-expo/references/react-compiler.md +59 -0
- package/dist/global-skills/upgrading-expo/references/react-navigation-to-expo-router.md +61 -0
- package/dist/global-skills/use-dom/SKILL.md +417 -0
- package/dist/global-skills/use-dom/agents/openai.yaml +4 -0
- package/dist/global-skills/use-kit-mcp/SKILL.md +100 -0
- package/dist/global-skills/use-railway/SKILL.md +357 -0
- package/dist/global-skills/use-railway/references/analyze-db-mongo.md +84 -0
- package/dist/global-skills/use-railway/references/analyze-db-mysql.md +254 -0
- package/dist/global-skills/use-railway/references/analyze-db-postgres.md +479 -0
- package/dist/global-skills/use-railway/references/analyze-db-redis.md +208 -0
- package/dist/global-skills/use-railway/references/analyze-db.md +344 -0
- package/dist/global-skills/use-railway/references/configure.md +359 -0
- package/dist/global-skills/use-railway/references/deploy.md +225 -0
- package/dist/global-skills/use-railway/references/feature-flags.md +89 -0
- package/dist/global-skills/use-railway/references/iac.md +108 -0
- package/dist/global-skills/use-railway/references/operate.md +273 -0
- package/dist/global-skills/use-railway/references/request.md +262 -0
- package/dist/global-skills/use-railway/references/sandbox.md +167 -0
- package/dist/global-skills/use-railway/references/setup.md +364 -0
- package/dist/global-skills/use-railway/scripts/analyze-mongo.py +1549 -0
- package/dist/global-skills/use-railway/scripts/analyze-mysql.py +1195 -0
- package/dist/global-skills/use-railway/scripts/analyze-postgres.py +3058 -0
- package/dist/global-skills/use-railway/scripts/analyze-redis.py +1090 -0
- package/dist/global-skills/use-railway/scripts/dal.py +671 -0
- package/dist/global-skills/use-railway/scripts/enable-pg-stats.py +170 -0
- package/dist/global-skills/use-railway/scripts/pg-extensions.py +370 -0
- package/dist/global-skills/use-railway/scripts/railway-api.sh +52 -0
- package/dist/global-skills/vercel-composition-patterns/AGENTS.md +946 -0
- package/dist/global-skills/vercel-composition-patterns/README.md +60 -0
- package/dist/global-skills/vercel-composition-patterns/SKILL.md +89 -0
- package/dist/global-skills/vercel-composition-patterns/metadata.json +11 -0
- package/dist/global-skills/vercel-composition-patterns/rules/_sections.md +29 -0
- package/dist/global-skills/vercel-composition-patterns/rules/_template.md +24 -0
- package/dist/global-skills/vercel-composition-patterns/rules/architecture-avoid-boolean-props.md +100 -0
- package/dist/global-skills/vercel-composition-patterns/rules/architecture-compound-components.md +112 -0
- package/dist/global-skills/vercel-composition-patterns/rules/patterns-children-over-render-props.md +87 -0
- package/dist/global-skills/vercel-composition-patterns/rules/patterns-explicit-variants.md +100 -0
- package/dist/global-skills/vercel-composition-patterns/rules/react19-no-forwardref.md +42 -0
- package/dist/global-skills/vercel-composition-patterns/rules/state-context-interface.md +191 -0
- package/dist/global-skills/vercel-composition-patterns/rules/state-decouple-implementation.md +113 -0
- package/dist/global-skills/vercel-composition-patterns/rules/state-lift-state.md +125 -0
- package/dist/global-skills/vercel-react-best-practices/AGENTS.md +3810 -0
- package/dist/global-skills/vercel-react-best-practices/README.md +123 -0
- package/dist/global-skills/vercel-react-best-practices/SKILL.md +149 -0
- package/dist/global-skills/vercel-react-best-practices/metadata.json +15 -0
- package/dist/global-skills/vercel-react-best-practices/rules/_sections.md +46 -0
- package/dist/global-skills/vercel-react-best-practices/rules/_template.md +28 -0
- package/dist/global-skills/vercel-react-best-practices/rules/advanced-effect-event-deps.md +56 -0
- package/dist/global-skills/vercel-react-best-practices/rules/advanced-event-handler-refs.md +55 -0
- package/dist/global-skills/vercel-react-best-practices/rules/advanced-init-once.md +42 -0
- package/dist/global-skills/vercel-react-best-practices/rules/advanced-use-latest.md +39 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-api-routes.md +38 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-cheap-condition-before-await.md +37 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-defer-await.md +82 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-dependencies.md +51 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-parallel.md +28 -0
- package/dist/global-skills/vercel-react-best-practices/rules/async-suspense-boundaries.md +99 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-analyzable-paths.md +63 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-barrel-imports.md +60 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-conditional.md +31 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-defer-third-party.md +49 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-dynamic-imports.md +35 -0
- package/dist/global-skills/vercel-react-best-practices/rules/bundle-preload.md +50 -0
- package/dist/global-skills/vercel-react-best-practices/rules/client-event-listeners.md +74 -0
- package/dist/global-skills/vercel-react-best-practices/rules/client-localstorage-schema.md +71 -0
- package/dist/global-skills/vercel-react-best-practices/rules/client-passive-event-listeners.md +48 -0
- package/dist/global-skills/vercel-react-best-practices/rules/client-swr-dedup.md +56 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-batch-dom-css.md +107 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-cache-function-results.md +80 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-cache-property-access.md +28 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-cache-storage.md +70 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-combine-iterations.md +32 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-early-exit.md +50 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-flatmap-filter.md +60 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-hoist-regexp.md +45 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-index-maps.md +37 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-length-check-first.md +49 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-min-max-loop.md +82 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-request-idle-callback.md +105 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-set-map-lookups.md +24 -0
- package/dist/global-skills/vercel-react-best-practices/rules/js-tosorted-immutable.md +57 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-activity.md +26 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-animate-svg-wrapper.md +47 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-conditional-render.md +40 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-content-visibility.md +38 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-hoist-jsx.md +46 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-hydration-no-flicker.md +82 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-hydration-suppress-warning.md +30 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-resource-hints.md +85 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-script-defer-async.md +68 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-svg-precision.md +28 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rendering-usetransition-loading.md +75 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-defer-reads.md +39 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-dependencies.md +45 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-derived-state-no-effect.md +40 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-derived-state.md +29 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-functional-setstate.md +74 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-lazy-state-init.md +58 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-memo-with-default-value.md +38 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-memo.md +44 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-move-effect-to-event.md +45 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-no-inline-components.md +82 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-simple-expression-in-memo.md +35 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-split-combined-hooks.md +64 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-transitions.md +40 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-use-deferred-value.md +59 -0
- package/dist/global-skills/vercel-react-best-practices/rules/rerender-use-ref-transient-values.md +73 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-after-nonblocking.md +73 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-auth-actions.md +96 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-cache-lru.md +41 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-cache-react.md +76 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-dedup-props.md +65 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-hoist-static-io.md +149 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-no-shared-module-state.md +50 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-parallel-fetching.md +83 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-parallel-nested-fetching.md +34 -0
- package/dist/global-skills/vercel-react-best-practices/rules/server-serialization.md +38 -0
- package/dist/global-skills/web-to-native/SKILL.md +83 -0
- package/dist/global-skills/web-to-native/references/false-friends.md +119 -0
- package/dist/global-skills/web-to-native/references/native-patterns.md +39 -0
- package/dist/global-skills/web-to-native/references/run-as-goal.md +48 -0
- package/dist/global-skills/web-to-native/references/verify-on-device.md +45 -0
- package/dist/global-skills/wire-auth/SKILL.md +28 -0
- package/dist/global-skills/wire-database/SKILL.md +28 -0
- package/dist/global-skills/wire-email/SKILL.md +27 -0
- package/dist/global-skills/wire-payments/SKILL.md +27 -0
- package/dist/global-skills/workers-best-practices/SKILL.md +127 -0
- package/dist/global-skills/workers-best-practices/references/review.md +174 -0
- package/dist/global-skills/workers-best-practices/references/rules.md +463 -0
- package/dist/global-skills/wrangler/SKILL.md +922 -0
- package/dist/global-skills/xcode-project-setup/SKILL.md +140 -0
- package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Package.resolved +41 -0
- package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Package.swift +17 -0
- package/dist/global-skills/xcode-project-setup/scripts/xcode_spm_setup/Sources/main.swift +232 -0
- package/package.json +21 -20
- package/LICENSE.md +0 -47
- package/dist/index.js +0 -21593
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
# Cloud Firestore in Flutter
|
|
2
|
+
|
|
3
|
+
This guide covers basic CRUD operations, type-safe data modeling, and real-time
|
|
4
|
+
streams when using Cloud Firestore in a Flutter application via the
|
|
5
|
+
`cloud_firestore` package.
|
|
6
|
+
|
|
7
|
+
## 1. Setup
|
|
8
|
+
|
|
9
|
+
Ensure you have added the required dependency:
|
|
10
|
+
|
|
11
|
+
```bash
|
|
12
|
+
flutter pub add cloud_firestore
|
|
13
|
+
```
|
|
14
|
+
|
|
15
|
+
Also, ensure FlutterFire is configured properly for your target platforms.
|
|
16
|
+
|
|
17
|
+
______________________________________________________________________
|
|
18
|
+
|
|
19
|
+
## 2. Best Practices: Type-Safe Models
|
|
20
|
+
|
|
21
|
+
Instead of passing raw `Map<String, dynamic>` maps throughout your UI layer,
|
|
22
|
+
define a domain model class with `fromFirestore` and `toFirestore` converters to
|
|
23
|
+
maintain type safety.
|
|
24
|
+
|
|
25
|
+
```dart
|
|
26
|
+
import 'package:cloud_firestore/cloud_firestore.dart';
|
|
27
|
+
|
|
28
|
+
class Item {
|
|
29
|
+
final String id;
|
|
30
|
+
final String name;
|
|
31
|
+
final String ownerId;
|
|
32
|
+
final DateTime createdAt;
|
|
33
|
+
|
|
34
|
+
Item({
|
|
35
|
+
required this.id,
|
|
36
|
+
required this.name,
|
|
37
|
+
required this.ownerId,
|
|
38
|
+
required this.createdAt,
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
factory Item.fromFirestore(DocumentSnapshot doc) {
|
|
42
|
+
final data = doc.data() as Map<String, dynamic>? ?? {};
|
|
43
|
+
return Item(
|
|
44
|
+
id: doc.id,
|
|
45
|
+
name: data['name'] as String? ?? '',
|
|
46
|
+
ownerId: data['ownerId'] as String? ?? '',
|
|
47
|
+
createdAt: data['createdAt'] is Timestamp
|
|
48
|
+
? (data['createdAt'] as Timestamp).toDate()
|
|
49
|
+
: DateTime.now(),
|
|
50
|
+
);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
Map<String, dynamic> toFirestore() {
|
|
54
|
+
return {
|
|
55
|
+
'name': name,
|
|
56
|
+
'ownerId': ownerId,
|
|
57
|
+
'createdAt': Timestamp.fromDate(createdAt),
|
|
58
|
+
};
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
______________________________________________________________________
|
|
64
|
+
|
|
65
|
+
## 3. The Service Layer
|
|
66
|
+
|
|
67
|
+
Encapsulate all database interactions within a dedicated service class to keep
|
|
68
|
+
your UI code clean and testable.
|
|
69
|
+
|
|
70
|
+
### Initialization & References
|
|
71
|
+
|
|
72
|
+
```dart
|
|
73
|
+
class ItemService {
|
|
74
|
+
// For Enterprise Native Mode, you often need to specify a non-default database ID:
|
|
75
|
+
final FirebaseFirestore _db = FirebaseFirestore.instanceFor(
|
|
76
|
+
app: Firebase.app(),
|
|
77
|
+
databaseId: 'my-database-id',
|
|
78
|
+
);
|
|
79
|
+
|
|
80
|
+
// Define your collection reference
|
|
81
|
+
CollectionReference get _itemsRef => _db.collection('items');
|
|
82
|
+
|
|
83
|
+
// 1. Create Data
|
|
84
|
+
Future<void> createItem(Item item) async {
|
|
85
|
+
try {
|
|
86
|
+
await _itemsRef.add(item.toFirestore());
|
|
87
|
+
} catch (e) {
|
|
88
|
+
print("Error creating document: $e");
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// 2. Read Data (One-Time Fetch)
|
|
93
|
+
Future<List<Item>> fetchItems(String ownerId) async {
|
|
94
|
+
try {
|
|
95
|
+
final querySnapshot = await _itemsRef
|
|
96
|
+
.where('ownerId', isEqualTo: ownerId)
|
|
97
|
+
.orderBy('createdAt', descending: true)
|
|
98
|
+
.get();
|
|
99
|
+
|
|
100
|
+
return querySnapshot.docs.map((doc) => Item.fromFirestore(doc)).toList();
|
|
101
|
+
} catch (e) {
|
|
102
|
+
print("Error fetching documents: $e");
|
|
103
|
+
return [];
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
// 3. Read Data (Real-Time Stream)
|
|
108
|
+
Stream<List<Item>> streamItems(String ownerId) {
|
|
109
|
+
return _itemsRef
|
|
110
|
+
.where('ownerId', isEqualTo: ownerId)
|
|
111
|
+
.snapshots()
|
|
112
|
+
.map((snapshot) {
|
|
113
|
+
// If a custom composite index is missing during prototyping, apply sorting client-side:
|
|
114
|
+
final items = snapshot.docs.map((doc) => Item.fromFirestore(doc)).toList();
|
|
115
|
+
items.sort((a, b) => b.createdAt.compareTo(a.createdAt));
|
|
116
|
+
return items;
|
|
117
|
+
});
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// 4. Update Data
|
|
121
|
+
Future<void> updateItemName(String id, String newName) async {
|
|
122
|
+
try {
|
|
123
|
+
await _itemsRef.doc(id).update({'name': newName});
|
|
124
|
+
} catch (e) {
|
|
125
|
+
print("Error updating document: $e");
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
// 5. Delete Data
|
|
130
|
+
Future<void> deleteItem(String id) async {
|
|
131
|
+
try {
|
|
132
|
+
await _itemsRef.doc(id).delete();
|
|
133
|
+
} catch (e) {
|
|
134
|
+
print("Error deleting document: $e");
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
```
|
|
139
|
+
|
|
140
|
+
______________________________________________________________________
|
|
141
|
+
|
|
142
|
+
## 4. Listening to Streams in the UI (`StreamBuilder`)
|
|
143
|
+
|
|
144
|
+
Use Flutter's `StreamBuilder` to rebuild the interface reactively whenever data
|
|
145
|
+
changes in your database collection.
|
|
146
|
+
|
|
147
|
+
```dart
|
|
148
|
+
StreamBuilder<List<Item>>(
|
|
149
|
+
stream: itemService.streamItems(currentUser.uid),
|
|
150
|
+
builder: (context, snapshot) {
|
|
151
|
+
if (snapshot.hasError) {
|
|
152
|
+
return const Center(child: Text('Failed to load data'));
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
if (snapshot.connectionState == ConnectionState.waiting) {
|
|
156
|
+
return const Center(child: CircularProgressIndicator());
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
final items = snapshot.data ?? [];
|
|
160
|
+
|
|
161
|
+
if (items.isEmpty) {
|
|
162
|
+
return const Center(child: Text('No items found.'));
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
return ListView.builder(
|
|
166
|
+
itemCount: items.length,
|
|
167
|
+
itemBuilder: (context, index) {
|
|
168
|
+
final item = items[index];
|
|
169
|
+
return ListTile(
|
|
170
|
+
title: Text(item.name),
|
|
171
|
+
trailing: IconButton(
|
|
172
|
+
icon: const Icon(Icons.delete),
|
|
173
|
+
onPressed: () => itemService.deleteItem(item.id),
|
|
174
|
+
),
|
|
175
|
+
);
|
|
176
|
+
},
|
|
177
|
+
);
|
|
178
|
+
},
|
|
179
|
+
);
|
|
180
|
+
```
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
# Firestore Indexes Reference
|
|
2
|
+
|
|
3
|
+
Indexes helps to improve query performance. Firestore Enterprise edition does
|
|
4
|
+
not create any indexes by default. By default, Firestore Enterprise performs a
|
|
5
|
+
full collection scan to find documents that match a query, which can be slow and
|
|
6
|
+
expensive for large collections. To avoid this, you can create indexes to
|
|
7
|
+
optimize your queries.
|
|
8
|
+
|
|
9
|
+
## Index Structure
|
|
10
|
+
|
|
11
|
+
An index consists of the following:
|
|
12
|
+
|
|
13
|
+
- a collection ID.
|
|
14
|
+
- a list of fields in the given collection.
|
|
15
|
+
- an order, either ascending or descending, for each field.
|
|
16
|
+
|
|
17
|
+
### Index Ordering
|
|
18
|
+
|
|
19
|
+
The order and sort direction of each field uniquely defines the index. For
|
|
20
|
+
example, the following indexes are two distinct indexes and not interchangeable:
|
|
21
|
+
|
|
22
|
+
- Field name `name` (ascending) and `population` (descending)
|
|
23
|
+
- Field name `name` (descending) and `population` (ascending)
|
|
24
|
+
|
|
25
|
+
### Index Density
|
|
26
|
+
|
|
27
|
+
Dense indexes: By default, Firestore indexes store data from all documents in a
|
|
28
|
+
collection. An index entry will be added for a document regardless of whether
|
|
29
|
+
the document contains any of the fields specified in the index. Non-existent
|
|
30
|
+
fields are treated as having a NULL value when generating index entries.
|
|
31
|
+
|
|
32
|
+
Sparse indexes: To change this behavior, you can define the index as a sparse
|
|
33
|
+
index. A sparse index indexes only the documents in the collection that contain
|
|
34
|
+
a value (including null) for at least one of the indexed fields. A sparse index
|
|
35
|
+
reduces storage costs and can improve performance.
|
|
36
|
+
|
|
37
|
+
### Unique Indexes
|
|
38
|
+
|
|
39
|
+
You can use unique index option to enforce unique values for the indexed fields.
|
|
40
|
+
For indexes on multiple fields, each combination of values must be unique across
|
|
41
|
+
the index. The database rejects any update and insert operations that attempt to
|
|
42
|
+
create index entries with duplicate values.
|
|
43
|
+
|
|
44
|
+
## Query Support Examples
|
|
45
|
+
|
|
46
|
+
| Query Type | Index Required |
|
|
47
|
+
| :--------------------------------------------------------- | :----------------------------------- |
|
|
48
|
+
| **Simple Equality**<br>\`where("a", | Single-Field Index on field `a` |
|
|
49
|
+
| : "==", 1)\` : : | |
|
|
50
|
+
| **Simple Range/Sort**<br>\`where("a", | Single-Field Index on field `a` |
|
|
51
|
+
| : ">", 1).orderBy("a")\` : : | |
|
|
52
|
+
| **Multiple Equality**<br>\`where("a", | Single-Field Index on field `a` and |
|
|
53
|
+
| : "==", 1).where("b", "==", 2)` :`b\` : | |
|
|
54
|
+
| \*\*Equality + | **Composite Index** on field `a` and |
|
|
55
|
+
| : Range/Sort\*\*<br>`where("a", "==", : `b\` : | |
|
|
56
|
+
| : 1).where("b", ">", 2)\` : : | |
|
|
57
|
+
| **Multiple Ranges**<br>\`where("a", | **Composite Index** on field `a` and |
|
|
58
|
+
| : ">", 1).where("b", ">", 2)` :`b\` : | |
|
|
59
|
+
| \*\*Array Contains + | **Composite Index** on field `tags` |
|
|
60
|
+
| : Equality\*\*<br>`where("tags", : and `active\` : | |
|
|
61
|
+
| : "array-contains", : : | |
|
|
62
|
+
| : "news").where("active", "==", true)\` : : | |
|
|
63
|
+
|
|
64
|
+
If no indexes is present, Firestore Enterprise will perform a full collection
|
|
65
|
+
scan to find documents that match a query.
|
|
66
|
+
|
|
67
|
+
## Management
|
|
68
|
+
|
|
69
|
+
### Config files
|
|
70
|
+
|
|
71
|
+
Your indexes should be defined in `firestore.indexes.json` (pointed to by
|
|
72
|
+
`firebase.json`).
|
|
73
|
+
|
|
74
|
+
Define a dense index:
|
|
75
|
+
|
|
76
|
+
```json
|
|
77
|
+
{
|
|
78
|
+
"indexes": [
|
|
79
|
+
{
|
|
80
|
+
"collectionGroup": "cities",
|
|
81
|
+
"queryScope": "COLLECTION",
|
|
82
|
+
"density": "DENSE",
|
|
83
|
+
"fields": [
|
|
84
|
+
{ "fieldPath": "country", "order": "ASCENDING" },
|
|
85
|
+
{ "fieldPath": "population", "order": "DESCENDING" }
|
|
86
|
+
]
|
|
87
|
+
}
|
|
88
|
+
],
|
|
89
|
+
"fieldOverrides": []
|
|
90
|
+
}
|
|
91
|
+
```
|
|
92
|
+
|
|
93
|
+
Define a sparse-any index:
|
|
94
|
+
|
|
95
|
+
```json
|
|
96
|
+
{
|
|
97
|
+
"indexes": [
|
|
98
|
+
{
|
|
99
|
+
"collectionGroup": "cities",
|
|
100
|
+
"queryScope": "COLLECTION",
|
|
101
|
+
"density": "SPARSE_ANY",
|
|
102
|
+
"fields": [
|
|
103
|
+
{ "fieldPath": "country", "order": "ASCENDING" },
|
|
104
|
+
{ "fieldPath": "population", "order": "DESCENDING" }
|
|
105
|
+
]
|
|
106
|
+
}
|
|
107
|
+
],
|
|
108
|
+
"fieldOverrides": []
|
|
109
|
+
}
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
Define a unique index:
|
|
113
|
+
|
|
114
|
+
```json
|
|
115
|
+
{
|
|
116
|
+
"indexes": [
|
|
117
|
+
{
|
|
118
|
+
"collectionGroup": "cities",
|
|
119
|
+
"queryScope": "COLLECTION",
|
|
120
|
+
"density": "SPARSE_ANY",
|
|
121
|
+
"unique": true,
|
|
122
|
+
"fields": [
|
|
123
|
+
{ "fieldPath": "country", "order": "ASCENDING" },
|
|
124
|
+
{ "fieldPath": "population", "order": "DESCENDING" }
|
|
125
|
+
]
|
|
126
|
+
}
|
|
127
|
+
],
|
|
128
|
+
"fieldOverrides": []
|
|
129
|
+
}
|
|
130
|
+
```
|
|
131
|
+
|
|
132
|
+
### CLI Commands
|
|
133
|
+
|
|
134
|
+
Deploy indexes only:
|
|
135
|
+
`bash npx firebase-tools@latest -y deploy --only firestore:indexes`
|
|
@@ -0,0 +1,189 @@
|
|
|
1
|
+
# Firestore Enterprise Native Mode on iOS
|
|
2
|
+
|
|
3
|
+
This guide walks you through using the Cloud Firestore SDK in your iOS app using
|
|
4
|
+
Swift.
|
|
5
|
+
|
|
6
|
+
# ⛔️ CRITICAL RULE: NO FirebaseFirestoreSwift ⛔️
|
|
7
|
+
|
|
8
|
+
UNDER NO CIRCUMSTANCES should you import, link against, or configure a project
|
|
9
|
+
to use `FirebaseFirestoreSwift`.
|
|
10
|
+
|
|
11
|
+
As of Firebase SDK v11+, all Swift-specific features (including `@DocumentID`,
|
|
12
|
+
`@ServerTimestamp`, and `Codable` support) have been fully merged into the main
|
|
13
|
+
`FirebaseFirestore` module.
|
|
14
|
+
|
|
15
|
+
- NEVER add `.external(name: "FirebaseFirestoreSwift")` or similar to SPM or
|
|
16
|
+
Xcode configurations.
|
|
17
|
+
- NEVER write `import FirebaseFirestoreSwift` in any Swift file.
|
|
18
|
+
- ONLY use `import FirebaseFirestore`.
|
|
19
|
+
|
|
20
|
+
This is a zero-tolerance constraint. Using `FirebaseFirestoreSwift` is
|
|
21
|
+
fundamentally incorrect and unacceptable.
|
|
22
|
+
|
|
23
|
+
# ⛔️ CRITICAL RULE: NO INLINE INITIALIZATION ⛔️
|
|
24
|
+
|
|
25
|
+
NEVER write `let db = Firestore.firestore()` or `Firestore.firestore(database:)`
|
|
26
|
+
as an inline class or struct property if there is ANY chance the object is
|
|
27
|
+
instantiated before `FirebaseApp.configure()` executes in the app root.
|
|
28
|
+
|
|
29
|
+
- **FATAL CRASH:**
|
|
30
|
+
`@Observable class DataManager { let db = Firestore.firestore() }` initialized
|
|
31
|
+
as a `@State` in the App root.
|
|
32
|
+
- **SAFE PATTERN:** Initialize `Firestore.firestore()` lazily
|
|
33
|
+
(`lazy var db = Firestore.firestore()`) OR explicitly initialize the manager
|
|
34
|
+
*after* `FirebaseApp.configure()` finishes.
|
|
35
|
+
|
|
36
|
+
## 1. Import and Initialize
|
|
37
|
+
|
|
38
|
+
Ensure you have installed the `FirebaseFirestore` SDK. Use the
|
|
39
|
+
`xcode-project-setup` skill to automate adding the SPM dependency to the Xcode
|
|
40
|
+
project.
|
|
41
|
+
|
|
42
|
+
```swift
|
|
43
|
+
import FirebaseFirestore
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Initialize an instance of Cloud Firestore. **CRITICAL**: Enterprise databases
|
|
47
|
+
require a custom database ID and cannot use the `(default)` instance.
|
|
48
|
+
|
|
49
|
+
```swift
|
|
50
|
+
// Replace "your-enterprise-database-id" with your actual database ID
|
|
51
|
+
let db = Firestore.firestore(database: "your-enterprise-database-id")
|
|
52
|
+
```
|
|
53
|
+
|
|
54
|
+
## 2. Type-Safe Data Models (Codable)
|
|
55
|
+
|
|
56
|
+
To leverage modern Swift data modeling, define your data as `Codable` structs.
|
|
57
|
+
The main `FirebaseFirestore` module automatically supports mapping these types.
|
|
58
|
+
|
|
59
|
+
```swift
|
|
60
|
+
struct User: Codable {
|
|
61
|
+
@DocumentID var id: String?
|
|
62
|
+
var firstName: String
|
|
63
|
+
var lastName: String
|
|
64
|
+
var born: Int
|
|
65
|
+
}
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 3. Basic CRUD Operations
|
|
69
|
+
|
|
70
|
+
The operations are identical to standard Firestore, but ensure you use the `db`
|
|
71
|
+
instance initialized with your Enterprise database ID.
|
|
72
|
+
|
|
73
|
+
### Writing Data (Modern Concurrency & Codable)
|
|
74
|
+
|
|
75
|
+
```swift
|
|
76
|
+
let user = User(firstName: "Ada", lastName: "Lovelace", born: 1815)
|
|
77
|
+
|
|
78
|
+
do {
|
|
79
|
+
// Add a new document with a generated ID using Codable
|
|
80
|
+
let ref = try db.collection("users").addDocument(from: user)
|
|
81
|
+
print("Document added with ID: \(ref.documentID)")
|
|
82
|
+
} catch {
|
|
83
|
+
print("Error adding document: \(error)")
|
|
84
|
+
}
|
|
85
|
+
```
|
|
86
|
+
|
|
87
|
+
### Reading Data (Modern Concurrency & Codable)
|
|
88
|
+
|
|
89
|
+
```swift
|
|
90
|
+
do {
|
|
91
|
+
let querySnapshot = try await db.collection("users").getDocuments()
|
|
92
|
+
|
|
93
|
+
// Map documents to the User struct automatically
|
|
94
|
+
let users = querySnapshot.documents.compactMap { document in
|
|
95
|
+
try? document.data(as: User.self)
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
for user in users {
|
|
99
|
+
print("Found user: \(user.firstName) \(user.lastName)")
|
|
100
|
+
}
|
|
101
|
+
} catch {
|
|
102
|
+
print("Error getting documents: \(error)")
|
|
103
|
+
}
|
|
104
|
+
```
|
|
105
|
+
|
|
106
|
+
## 4. Pipeline Queries
|
|
107
|
+
|
|
108
|
+
Firestore Enterprise supports Pipeline operations for complex queries.
|
|
109
|
+
|
|
110
|
+
### Initialization
|
|
111
|
+
|
|
112
|
+
```swift
|
|
113
|
+
let pipeline = db.pipeline()
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
### Examples
|
|
117
|
+
|
|
118
|
+
```swift
|
|
119
|
+
// Return all documents across all collections in the database
|
|
120
|
+
let results = try await db.pipeline().database().execute()
|
|
121
|
+
|
|
122
|
+
// Filtered query
|
|
123
|
+
let results = try await db.pipeline()
|
|
124
|
+
.collection("cities")
|
|
125
|
+
.where(Field("name").equal(Constant("Toronto")))
|
|
126
|
+
.execute()
|
|
127
|
+
|
|
128
|
+
// Compound query
|
|
129
|
+
let results = try await db.pipeline()
|
|
130
|
+
.collection("books")
|
|
131
|
+
.where(Field("rating").equal(5) && Field("published").lessThan(1900))
|
|
132
|
+
.execute()
|
|
133
|
+
```
|
|
134
|
+
|
|
135
|
+
## 5. Realtime Listeners in SwiftUI (Lifecycle Best Practices)
|
|
136
|
+
|
|
137
|
+
When implementing Firestore realtime listeners (`addSnapshotListener`) within a
|
|
138
|
+
SwiftUI application, you **MUST** tie the listener lifecycle to the view's
|
|
139
|
+
identity using `.task(id:)`, NOT `.onDisappear`.
|
|
140
|
+
|
|
141
|
+
### ⛔️ UNSAFE PATTERN (.onDisappear)
|
|
142
|
+
|
|
143
|
+
Presenting a `.sheet` or `.fullScreenCover` can trigger the underlying view's
|
|
144
|
+
`onDisappear` method. If you stop your listener here, the feed will stop
|
|
145
|
+
updating while the sheet is open, and won't resume when it's dismissed.
|
|
146
|
+
|
|
147
|
+
### ✅ SAFE PATTERN (.task with deinit)
|
|
148
|
+
|
|
149
|
+
Because `addSnapshotListener` is a synchronous call, placing it inside a `.task`
|
|
150
|
+
means the task completes immediately. This breaks SwiftUI's automatic
|
|
151
|
+
cancellation mechanism.
|
|
152
|
+
|
|
153
|
+
To safely manage traditional Firebase listeners in SwiftUI, you must use
|
|
154
|
+
**`deinit`** to handle memory cleanup when the view is destroyed, and
|
|
155
|
+
**`.task(id:)`** to handle data identity changes while the view is active.
|
|
156
|
+
|
|
157
|
+
```swift
|
|
158
|
+
import SwiftUI
|
|
159
|
+
import FirebaseFirestore
|
|
160
|
+
|
|
161
|
+
@MainActor
|
|
162
|
+
@Observable
|
|
163
|
+
final class DataManager {
|
|
164
|
+
private var listenerHandle: ListenerRegistration?
|
|
165
|
+
var data: [String] = []
|
|
166
|
+
|
|
167
|
+
func startListening(for userId: String) {
|
|
168
|
+
// 1. Clean up any existing listener to prevent duplicates if the ID changes
|
|
169
|
+
stopListening()
|
|
170
|
+
|
|
171
|
+
// 2. Start the regular listener and capture the handle
|
|
172
|
+
// Note: Using the global default instance here, make sure to use your enterprise instance if applicable
|
|
173
|
+
// For enterprise, you might need to pass the db instance or use a shared manager.
|
|
174
|
+
listenerHandle = Firestore.firestore(database: "your-enterprise-database-id").collection("users").document(userId).addSnapshotListener { snapshot, error in
|
|
175
|
+
// Handle updates
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
func stopListening() {
|
|
180
|
+
listenerHandle?.remove()
|
|
181
|
+
listenerHandle = nil
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
// 3. Guarantee cleanup when the View is destroyed and this object is deallocated
|
|
185
|
+
isolated deinit {
|
|
186
|
+
stopListening()
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
```
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
# Provisioning Firestore Enterprise Native Mode
|
|
2
|
+
|
|
3
|
+
## Manual Initialization
|
|
4
|
+
|
|
5
|
+
Initialize the following firebase configuration files manually. Do not use
|
|
6
|
+
`npx -y firebase-tools@latest init`, as it expects interactive inputs.
|
|
7
|
+
|
|
8
|
+
1. **Create a Firestore Enterprise Database**: Create a Firestore Enterprise
|
|
9
|
+
database using the Firebase CLI.
|
|
10
|
+
1. **Create `firebase.json`**: This file contains database configuration for the
|
|
11
|
+
Firebase CLI.
|
|
12
|
+
1. **Create `firestore.rules`**: This file contains your security rules.
|
|
13
|
+
1. **Create `firestore.indexes.json`**: This file contains your index
|
|
14
|
+
definitions.
|
|
15
|
+
|
|
16
|
+
### 1. Create a Firestore Enterprise Database
|
|
17
|
+
|
|
18
|
+
If the user needs to create a new database, ask the user what location to use.
|
|
19
|
+
Run `npx -y firebase-tools@latest firestore:locations` to get the list of
|
|
20
|
+
options. Suggest colocating with other resources if applicable.
|
|
21
|
+
|
|
22
|
+
Use the following command to create a Firestore Enterprise database:
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
firebase firestore:databases:create my-database-id \
|
|
26
|
+
--location="<selected-location>" \
|
|
27
|
+
--edition="enterprise" \
|
|
28
|
+
--firestore-data-access="ENABLED" \
|
|
29
|
+
--mongodb-compatible-data-access="DISABLED"
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
This will create an enterprise database in the selected location with native
|
|
33
|
+
mode enabled. A database id is required to create an enterprise database and the
|
|
34
|
+
database id must not be `(default)`. To enable realtime-updates feature, use
|
|
35
|
+
`--realtime-updates` flag.
|
|
36
|
+
|
|
37
|
+
```bash
|
|
38
|
+
firebase firestore:databases:create my-database-id \
|
|
39
|
+
--location="<selected-location>" \
|
|
40
|
+
--edition="enterprise" \
|
|
41
|
+
--firestore-data-access="ENABLED" \
|
|
42
|
+
--mongodb-compatible-data-access="DISABLED" \
|
|
43
|
+
--realtime-updates="ENABLED"
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
### 2. Create `firebase.json`
|
|
47
|
+
|
|
48
|
+
Create a file named `firebase.json` in your project root with the following
|
|
49
|
+
content (edit `database` and `location` to match the ones you created above). If
|
|
50
|
+
this file already exists, instead append to the existing JSON:
|
|
51
|
+
|
|
52
|
+
```json
|
|
53
|
+
{
|
|
54
|
+
"firestore": {
|
|
55
|
+
"rules": "firestore.rules",
|
|
56
|
+
"indexes": "firestore.indexes.json",
|
|
57
|
+
"edition": "enterprise",
|
|
58
|
+
"database": "my-database-id",
|
|
59
|
+
"location": "<selected-location>"
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
```
|
|
63
|
+
|
|
64
|
+
### 2. Create `firestore.rules`
|
|
65
|
+
|
|
66
|
+
Create a file named `firestore.rules`. A good starting point (locking down the
|
|
67
|
+
database) is:
|
|
68
|
+
|
|
69
|
+
```
|
|
70
|
+
rules_version = '2';
|
|
71
|
+
service cloud.firestore {
|
|
72
|
+
match /databases/{database}/documents {
|
|
73
|
+
match /{document=**} {
|
|
74
|
+
allow read, write: if false;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
*See [security_rules.md](security_rules.md) for how to write actual rules.*
|
|
81
|
+
|
|
82
|
+
### 3. Create `firestore.indexes.json`
|
|
83
|
+
|
|
84
|
+
Create a file named `firestore.indexes.json` with an empty configuration to
|
|
85
|
+
start:
|
|
86
|
+
|
|
87
|
+
```json
|
|
88
|
+
{
|
|
89
|
+
"indexes": [],
|
|
90
|
+
"fieldOverrides": []
|
|
91
|
+
}
|
|
92
|
+
```
|
|
93
|
+
|
|
94
|
+
*See [indexes.md](indexes.md) for how to configure indexes.*
|
|
95
|
+
|
|
96
|
+
## Deploy rules and indexes
|
|
97
|
+
|
|
98
|
+
```bash
|
|
99
|
+
# To deploy all rules and indexes
|
|
100
|
+
firebase deploy --only firestore
|
|
101
|
+
|
|
102
|
+
# To deploy just rules
|
|
103
|
+
firebase deploy --only firestore:rules
|
|
104
|
+
|
|
105
|
+
# To deploy just indexes
|
|
106
|
+
firebase deploy --only firestore:indexes
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Local Emulation
|
|
110
|
+
|
|
111
|
+
To run Firestore locally for development and testing:
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
firebase emulators:start --only firestore
|
|
115
|
+
```
|
|
116
|
+
|
|
117
|
+
This starts the Firestore emulator, typically on port 8080. You can interact
|
|
118
|
+
with it using the Emulator UI (usually at http://localhost:4000/firestore).
|