@funnycode/myclaude 0.1.67 → 0.1.69
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/LICENSE +21 -21
- package/dist/myclaude.js +15114 -12443
- package/dist/myclaude.mjs +15114 -12443
- package/package.json +125 -125
- package/seed/marketplaces/ecc/.claude/commands/add-language-rules.md +39 -0
- package/seed/marketplaces/ecc/.claude/commands/database-migration.md +36 -0
- package/seed/marketplaces/ecc/.claude/commands/feature-development.md +38 -0
- package/seed/marketplaces/ecc/.claude/ecc-tools.json +334 -0
- package/seed/marketplaces/ecc/.claude/enterprise/controls.md +15 -0
- package/seed/marketplaces/ecc/.claude/homunculus/instincts/inherited/everything-claude-code-instincts.yaml +162 -0
- package/seed/marketplaces/ecc/.claude/identity.json +14 -0
- package/seed/marketplaces/ecc/.claude/package-manager.json +4 -0
- package/seed/marketplaces/ecc/.claude/research/everything-claude-code-research-playbook.md +21 -0
- package/seed/marketplaces/ecc/.claude/rules/everything-claude-code-guardrails.md +43 -0
- package/seed/marketplaces/ecc/.claude/rules/node.md +56 -0
- package/seed/marketplaces/ecc/.claude/skills/everything-claude-code/SKILL.md +442 -0
- package/seed/marketplaces/ecc/.claude/team/everything-claude-code-team-config.json +15 -0
- package/seed/marketplaces/ecc/.opencode/package-lock.json +169 -169
- package/seed/marketplaces/ecc/.vscode/settings.json +17 -0
- package/seed/marketplaces/ecc/commands/aside.md +164 -164
- package/seed/marketplaces/ecc/commands/auto-update.md +28 -28
- package/seed/marketplaces/ecc/commands/build-fix.md +66 -66
- package/seed/marketplaces/ecc/commands/checkpoint.md +78 -78
- package/seed/marketplaces/ecc/commands/code-review.md +289 -289
- package/seed/marketplaces/ecc/commands/cost-report.md +107 -107
- package/seed/marketplaces/ecc/commands/cpp-build.md +173 -173
- package/seed/marketplaces/ecc/commands/cpp-review.md +132 -132
- package/seed/marketplaces/ecc/commands/cpp-test.md +251 -251
- package/seed/marketplaces/ecc/commands/ecc-guide.md +93 -93
- package/seed/marketplaces/ecc/commands/evolve.md +178 -178
- package/seed/marketplaces/ecc/commands/fastapi-review.md +39 -39
- package/seed/marketplaces/ecc/commands/feature-dev.md +49 -49
- package/seed/marketplaces/ecc/commands/flutter-build.md +164 -164
- package/seed/marketplaces/ecc/commands/flutter-review.md +116 -116
- package/seed/marketplaces/ecc/commands/flutter-test.md +144 -144
- package/seed/marketplaces/ecc/commands/gan-build.md +103 -103
- package/seed/marketplaces/ecc/commands/gan-design.md +39 -39
- package/seed/marketplaces/ecc/commands/go-build.md +183 -183
- package/seed/marketplaces/ecc/commands/go-review.md +148 -148
- package/seed/marketplaces/ecc/commands/go-test.md +268 -268
- package/seed/marketplaces/ecc/commands/gradle-build.md +70 -70
- package/seed/marketplaces/ecc/commands/harness-audit.md +84 -84
- package/seed/marketplaces/ecc/commands/hookify-configure.md +14 -14
- package/seed/marketplaces/ecc/commands/hookify-help.md +46 -46
- package/seed/marketplaces/ecc/commands/hookify-list.md +21 -21
- package/seed/marketplaces/ecc/commands/hookify.md +50 -50
- package/seed/marketplaces/ecc/commands/instinct-export.md +66 -66
- package/seed/marketplaces/ecc/commands/instinct-import.md +114 -114
- package/seed/marketplaces/ecc/commands/instinct-status.md +59 -59
- package/seed/marketplaces/ecc/commands/jira.md +106 -106
- package/seed/marketplaces/ecc/commands/kotlin-build.md +174 -174
- package/seed/marketplaces/ecc/commands/kotlin-review.md +140 -140
- package/seed/marketplaces/ecc/commands/kotlin-test.md +312 -312
- package/seed/marketplaces/ecc/commands/learn-eval.md +116 -116
- package/seed/marketplaces/ecc/commands/learn.md +74 -74
- package/seed/marketplaces/ecc/commands/loop-start.md +36 -36
- package/seed/marketplaces/ecc/commands/loop-status.md +77 -77
- package/seed/marketplaces/ecc/commands/marketing-campaign.md +129 -129
- package/seed/marketplaces/ecc/commands/model-route.md +30 -30
- package/seed/marketplaces/ecc/commands/multi-backend.md +162 -162
- package/seed/marketplaces/ecc/commands/multi-execute.md +319 -319
- package/seed/marketplaces/ecc/commands/multi-frontend.md +162 -162
- package/seed/marketplaces/ecc/commands/multi-plan.md +272 -272
- package/seed/marketplaces/ecc/commands/multi-workflow.md +195 -195
- package/seed/marketplaces/ecc/commands/plan-prd.md +160 -160
- package/seed/marketplaces/ecc/commands/plan.md +200 -200
- package/seed/marketplaces/ecc/commands/pm2.md +276 -276
- package/seed/marketplaces/ecc/commands/pr.md +184 -184
- package/seed/marketplaces/ecc/commands/project-init.md +86 -86
- package/seed/marketplaces/ecc/commands/projects.md +39 -39
- package/seed/marketplaces/ecc/commands/promote.md +41 -41
- package/seed/marketplaces/ecc/commands/prp-commit.md +112 -112
- package/seed/marketplaces/ecc/commands/prp-implement.md +385 -385
- package/seed/marketplaces/ecc/commands/prp-plan.md +502 -502
- package/seed/marketplaces/ecc/commands/prp-pr.md +184 -184
- package/seed/marketplaces/ecc/commands/prp-prd.md +447 -447
- package/seed/marketplaces/ecc/commands/prune.md +31 -31
- package/seed/marketplaces/ecc/commands/python-review.md +297 -297
- package/seed/marketplaces/ecc/commands/quality-gate.md +33 -33
- package/seed/marketplaces/ecc/commands/refactor-clean.md +84 -84
- package/seed/marketplaces/ecc/commands/resume-session.md +156 -156
- package/seed/marketplaces/ecc/commands/review-pr.md +37 -37
- package/seed/marketplaces/ecc/commands/rust-build.md +187 -187
- package/seed/marketplaces/ecc/commands/rust-review.md +142 -142
- package/seed/marketplaces/ecc/commands/rust-test.md +308 -308
- package/seed/marketplaces/ecc/commands/santa-loop.md +175 -175
- package/seed/marketplaces/ecc/commands/save-session.md +275 -275
- package/seed/marketplaces/ecc/commands/security-scan.md +92 -92
- package/seed/marketplaces/ecc/commands/sessions.md +339 -339
- package/seed/marketplaces/ecc/commands/setup-pm.md +80 -80
- package/seed/marketplaces/ecc/commands/skill-create.md +174 -174
- package/seed/marketplaces/ecc/commands/skill-health.md +54 -54
- package/seed/marketplaces/ecc/commands/test-coverage.md +73 -73
- package/seed/marketplaces/ecc/commands/update-codemaps.md +76 -76
- package/seed/marketplaces/ecc/commands/update-docs.md +88 -88
- package/seed/marketplaces/ecc/skills/accessibility/SKILL.md +146 -146
- package/seed/marketplaces/ecc/skills/agent-architecture-audit/SKILL.md +256 -256
- package/seed/marketplaces/ecc/skills/agent-eval/SKILL.md +145 -145
- package/seed/marketplaces/ecc/skills/agent-harness-construction/SKILL.md +73 -73
- package/seed/marketplaces/ecc/skills/agent-introspection-debugging/SKILL.md +153 -153
- package/seed/marketplaces/ecc/skills/agent-payment-x402/SKILL.md +224 -224
- package/seed/marketplaces/ecc/skills/agent-sort/SKILL.md +215 -215
- package/seed/marketplaces/ecc/skills/agentic-engineering/SKILL.md +63 -63
- package/seed/marketplaces/ecc/skills/agentic-os/SKILL.md +387 -387
- package/seed/marketplaces/ecc/skills/ai-first-engineering/SKILL.md +51 -51
- package/seed/marketplaces/ecc/skills/ai-regression-testing/SKILL.md +385 -385
- package/seed/marketplaces/ecc/skills/android-clean-architecture/SKILL.md +339 -339
- package/seed/marketplaces/ecc/skills/angular-developer/SKILL.md +154 -154
- package/seed/marketplaces/ecc/skills/angular-developer/references/angular-animations.md +160 -160
- package/seed/marketplaces/ecc/skills/angular-developer/references/angular-aria.md +410 -410
- package/seed/marketplaces/ecc/skills/angular-developer/references/cli.md +86 -86
- package/seed/marketplaces/ecc/skills/angular-developer/references/component-harnesses.md +59 -59
- package/seed/marketplaces/ecc/skills/angular-developer/references/component-styling.md +91 -91
- package/seed/marketplaces/ecc/skills/angular-developer/references/components.md +117 -117
- package/seed/marketplaces/ecc/skills/angular-developer/references/creating-services.md +97 -97
- package/seed/marketplaces/ecc/skills/angular-developer/references/data-resolvers.md +69 -69
- package/seed/marketplaces/ecc/skills/angular-developer/references/define-routes.md +67 -67
- package/seed/marketplaces/ecc/skills/angular-developer/references/defining-providers.md +72 -72
- package/seed/marketplaces/ecc/skills/angular-developer/references/di-fundamentals.md +120 -120
- package/seed/marketplaces/ecc/skills/angular-developer/references/e2e-testing.md +56 -56
- package/seed/marketplaces/ecc/skills/angular-developer/references/effects.md +83 -83
- package/seed/marketplaces/ecc/skills/angular-developer/references/hierarchical-injectors.md +43 -43
- package/seed/marketplaces/ecc/skills/angular-developer/references/host-elements.md +80 -80
- package/seed/marketplaces/ecc/skills/angular-developer/references/injection-context.md +63 -63
- package/seed/marketplaces/ecc/skills/angular-developer/references/inputs.md +101 -101
- package/seed/marketplaces/ecc/skills/angular-developer/references/linked-signal.md +59 -59
- package/seed/marketplaces/ecc/skills/angular-developer/references/loading-strategies.md +61 -61
- package/seed/marketplaces/ecc/skills/angular-developer/references/mcp.md +108 -108
- package/seed/marketplaces/ecc/skills/angular-developer/references/navigate-to-routes.md +69 -69
- package/seed/marketplaces/ecc/skills/angular-developer/references/outputs.md +86 -86
- package/seed/marketplaces/ecc/skills/angular-developer/references/reactive-forms.md +122 -122
- package/seed/marketplaces/ecc/skills/angular-developer/references/rendering-strategies.md +44 -44
- package/seed/marketplaces/ecc/skills/angular-developer/references/resource.md +77 -77
- package/seed/marketplaces/ecc/skills/angular-developer/references/route-animations.md +56 -56
- package/seed/marketplaces/ecc/skills/angular-developer/references/route-guards.md +52 -52
- package/seed/marketplaces/ecc/skills/angular-developer/references/router-lifecycle.md +45 -45
- package/seed/marketplaces/ecc/skills/angular-developer/references/router-testing.md +87 -87
- package/seed/marketplaces/ecc/skills/angular-developer/references/show-routes-with-outlets.md +68 -68
- package/seed/marketplaces/ecc/skills/angular-developer/references/signal-forms.md +795 -795
- package/seed/marketplaces/ecc/skills/angular-developer/references/signals-overview.md +94 -94
- package/seed/marketplaces/ecc/skills/angular-developer/references/tailwind-css.md +69 -69
- package/seed/marketplaces/ecc/skills/angular-developer/references/template-driven-forms.md +114 -114
- package/seed/marketplaces/ecc/skills/angular-developer/references/testing-fundamentals.md +65 -65
- package/seed/marketplaces/ecc/skills/api-connector-builder/SKILL.md +120 -120
- package/seed/marketplaces/ecc/skills/api-design/SKILL.md +523 -523
- package/seed/marketplaces/ecc/skills/architecture-decision-records/SKILL.md +179 -179
- package/seed/marketplaces/ecc/skills/article-writing/SKILL.md +79 -79
- package/seed/marketplaces/ecc/skills/automation-audit-ops/SKILL.md +142 -142
- package/seed/marketplaces/ecc/skills/autonomous-agent-harness/SKILL.md +273 -273
- package/seed/marketplaces/ecc/skills/autonomous-loops/SKILL.md +610 -610
- package/seed/marketplaces/ecc/skills/backend-patterns/SKILL.md +561 -561
- package/seed/marketplaces/ecc/skills/benchmark/SKILL.md +93 -93
- package/seed/marketplaces/ecc/skills/benchmark-optimization-loop/SKILL.md +69 -69
- package/seed/marketplaces/ecc/skills/blender-motion-state-inspection/SKILL.md +164 -164
- package/seed/marketplaces/ecc/skills/blueprint/SKILL.md +105 -105
- package/seed/marketplaces/ecc/skills/brand-voice/SKILL.md +97 -97
- package/seed/marketplaces/ecc/skills/brand-voice/references/voice-profile-schema.md +55 -55
- package/seed/marketplaces/ecc/skills/browser-qa/SKILL.md +87 -87
- package/seed/marketplaces/ecc/skills/bun-runtime/SKILL.md +84 -84
- package/seed/marketplaces/ecc/skills/canary-watch/SKILL.md +107 -107
- package/seed/marketplaces/ecc/skills/carrier-relationship-management/SKILL.md +212 -212
- package/seed/marketplaces/ecc/skills/cisco-ios-patterns/SKILL.md +163 -163
- package/seed/marketplaces/ecc/skills/ck/SKILL.md +147 -147
- package/seed/marketplaces/ecc/skills/ck/commands/forget.mjs +44 -44
- package/seed/marketplaces/ecc/skills/ck/commands/info.mjs +24 -24
- package/seed/marketplaces/ecc/skills/ck/commands/init.mjs +143 -143
- package/seed/marketplaces/ecc/skills/ck/commands/list.mjs +40 -40
- package/seed/marketplaces/ecc/skills/ck/commands/migrate.mjs +202 -202
- package/seed/marketplaces/ecc/skills/ck/commands/resume.mjs +36 -36
- package/seed/marketplaces/ecc/skills/ck/commands/save.mjs +210 -210
- package/seed/marketplaces/ecc/skills/ck/commands/shared.mjs +387 -387
- package/seed/marketplaces/ecc/skills/ck/hooks/session-start.mjs +224 -224
- package/seed/marketplaces/ecc/skills/claude-devfleet/SKILL.md +103 -103
- package/seed/marketplaces/ecc/skills/click-path-audit/SKILL.md +244 -244
- package/seed/marketplaces/ecc/skills/clickhouse-io/SKILL.md +439 -439
- package/seed/marketplaces/ecc/skills/code-tour/SKILL.md +236 -236
- package/seed/marketplaces/ecc/skills/codebase-onboarding/SKILL.md +233 -233
- package/seed/marketplaces/ecc/skills/coding-standards/SKILL.md +549 -549
- package/seed/marketplaces/ecc/skills/compose-multiplatform-patterns/SKILL.md +299 -299
- package/seed/marketplaces/ecc/skills/configure-ecc/SKILL.md +384 -384
- package/seed/marketplaces/ecc/skills/connections-optimizer/SKILL.md +189 -189
- package/seed/marketplaces/ecc/skills/content-engine/SKILL.md +131 -131
- package/seed/marketplaces/ecc/skills/content-hash-cache-pattern/SKILL.md +161 -161
- package/seed/marketplaces/ecc/skills/context-budget/SKILL.md +135 -135
- package/seed/marketplaces/ecc/skills/continuous-agent-loop/SKILL.md +45 -45
- package/seed/marketplaces/ecc/skills/continuous-learning/SKILL.md +131 -131
- package/seed/marketplaces/ecc/skills/continuous-learning/config.json +18 -18
- package/seed/marketplaces/ecc/skills/continuous-learning/evaluate-session.sh +69 -69
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/SKILL.md +360 -360
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/agents/observer-loop.sh +322 -322
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/agents/observer.md +198 -198
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/agents/session-guardian.sh +150 -150
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/agents/start-observer.sh +248 -248
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/config.json +8 -8
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/hooks/observe.sh +498 -498
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/scripts/detect-project.sh +322 -322
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/scripts/instinct-cli.py +1826 -1826
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/scripts/lib/homunculus-dir.sh +31 -31
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/scripts/migrate-homunculus.sh +62 -62
- package/seed/marketplaces/ecc/skills/continuous-learning-v2/scripts/test_parse_instinct.py +1018 -1018
- package/seed/marketplaces/ecc/skills/cost-aware-llm-pipeline/SKILL.md +183 -183
- package/seed/marketplaces/ecc/skills/cost-tracking/SKILL.md +147 -147
- package/seed/marketplaces/ecc/skills/council/SKILL.md +203 -203
- package/seed/marketplaces/ecc/skills/cpp-coding-standards/SKILL.md +723 -723
- package/seed/marketplaces/ecc/skills/cpp-testing/SKILL.md +324 -324
- package/seed/marketplaces/ecc/skills/crosspost/SKILL.md +111 -111
- package/seed/marketplaces/ecc/skills/csharp-testing/SKILL.md +321 -321
- package/seed/marketplaces/ecc/skills/customer-billing-ops/SKILL.md +140 -140
- package/seed/marketplaces/ecc/skills/customs-trade-compliance/SKILL.md +263 -263
- package/seed/marketplaces/ecc/skills/dart-flutter-patterns/SKILL.md +563 -563
- package/seed/marketplaces/ecc/skills/dashboard-builder/SKILL.md +108 -108
- package/seed/marketplaces/ecc/skills/data-scraper-agent/SKILL.md +764 -764
- package/seed/marketplaces/ecc/skills/data-throughput-accelerator/SKILL.md +72 -72
- package/seed/marketplaces/ecc/skills/database-migrations/SKILL.md +429 -429
- package/seed/marketplaces/ecc/skills/deep-research/SKILL.md +159 -159
- package/seed/marketplaces/ecc/skills/defi-amm-security/SKILL.md +166 -166
- package/seed/marketplaces/ecc/skills/deployment-patterns/SKILL.md +427 -427
- package/seed/marketplaces/ecc/skills/design-system/SKILL.md +82 -82
- package/seed/marketplaces/ecc/skills/django-celery/SKILL.md +457 -457
- package/seed/marketplaces/ecc/skills/django-patterns/SKILL.md +734 -734
- package/seed/marketplaces/ecc/skills/django-security/SKILL.md +593 -593
- package/seed/marketplaces/ecc/skills/django-tdd/SKILL.md +729 -729
- package/seed/marketplaces/ecc/skills/django-verification/SKILL.md +469 -469
- package/seed/marketplaces/ecc/skills/dmux-workflows/SKILL.md +191 -191
- package/seed/marketplaces/ecc/skills/docker-patterns/SKILL.md +364 -364
- package/seed/marketplaces/ecc/skills/documentation-lookup/SKILL.md +90 -90
- package/seed/marketplaces/ecc/skills/dotnet-patterns/SKILL.md +321 -321
- package/seed/marketplaces/ecc/skills/e2e-testing/SKILL.md +326 -326
- package/seed/marketplaces/ecc/skills/ecc-guide/SKILL.md +189 -189
- package/seed/marketplaces/ecc/skills/ecc-tools-cost-audit/SKILL.md +160 -160
- package/seed/marketplaces/ecc/skills/email-ops/SKILL.md +121 -121
- package/seed/marketplaces/ecc/skills/energy-procurement/SKILL.md +228 -228
- package/seed/marketplaces/ecc/skills/enterprise-agent-ops/SKILL.md +50 -50
- package/seed/marketplaces/ecc/skills/error-handling/SKILL.md +376 -376
- package/seed/marketplaces/ecc/skills/eval-harness/SKILL.md +270 -270
- package/seed/marketplaces/ecc/skills/evm-token-decimals/SKILL.md +130 -130
- package/seed/marketplaces/ecc/skills/exa-search/SKILL.md +107 -107
- package/seed/marketplaces/ecc/skills/fal-ai-media/SKILL.md +288 -288
- package/seed/marketplaces/ecc/skills/fastapi-patterns/SKILL.md +327 -327
- package/seed/marketplaces/ecc/skills/finance-billing-ops/SKILL.md +127 -127
- package/seed/marketplaces/ecc/skills/flox-environments/SKILL.md +496 -496
- package/seed/marketplaces/ecc/skills/flutter-dart-code-review/SKILL.md +435 -435
- package/seed/marketplaces/ecc/skills/foundation-models-on-device/SKILL.md +243 -243
- package/seed/marketplaces/ecc/skills/frontend-a11y/SKILL.md +446 -446
- package/seed/marketplaces/ecc/skills/frontend-design-direction/SKILL.md +92 -92
- package/seed/marketplaces/ecc/skills/frontend-patterns/SKILL.md +642 -642
- package/seed/marketplaces/ecc/skills/frontend-slides/SKILL.md +184 -184
- package/seed/marketplaces/ecc/skills/frontend-slides/STYLE_PRESETS.md +330 -330
- package/seed/marketplaces/ecc/skills/frontend-slides/animation-patterns.md +122 -122
- package/seed/marketplaces/ecc/skills/frontend-slides/html-template.md +419 -419
- package/seed/marketplaces/ecc/skills/frontend-slides/scripts/export-pdf.sh +418 -418
- package/seed/marketplaces/ecc/skills/frontend-slides/scripts/extract-pptx.py +96 -96
- package/seed/marketplaces/ecc/skills/frontend-slides/viewport-base.css +153 -153
- package/seed/marketplaces/ecc/skills/fsharp-testing/SKILL.md +280 -280
- package/seed/marketplaces/ecc/skills/gan-style-harness/SKILL.md +278 -278
- package/seed/marketplaces/ecc/skills/gateguard/SKILL.md +125 -125
- package/seed/marketplaces/ecc/skills/git-workflow/SKILL.md +715 -715
- package/seed/marketplaces/ecc/skills/github-ops/SKILL.md +144 -144
- package/seed/marketplaces/ecc/skills/golang-patterns/SKILL.md +674 -674
- package/seed/marketplaces/ecc/skills/golang-testing/SKILL.md +720 -720
- package/seed/marketplaces/ecc/skills/google-workspace-ops/SKILL.md +95 -95
- package/seed/marketplaces/ecc/skills/healthcare-cdss-patterns/SKILL.md +245 -245
- package/seed/marketplaces/ecc/skills/healthcare-emr-patterns/SKILL.md +159 -159
- package/seed/marketplaces/ecc/skills/healthcare-eval-harness/SKILL.md +207 -207
- package/seed/marketplaces/ecc/skills/healthcare-phi-compliance/SKILL.md +145 -145
- package/seed/marketplaces/ecc/skills/hermes-imports/SKILL.md +88 -88
- package/seed/marketplaces/ecc/skills/hexagonal-architecture/SKILL.md +276 -276
- package/seed/marketplaces/ecc/skills/hipaa-compliance/SKILL.md +78 -78
- package/seed/marketplaces/ecc/skills/homelab-network-readiness/SKILL.md +169 -169
- package/seed/marketplaces/ecc/skills/homelab-network-setup/SKILL.md +129 -129
- package/seed/marketplaces/ecc/skills/homelab-pihole-dns/SKILL.md +274 -274
- package/seed/marketplaces/ecc/skills/homelab-vlan-segmentation/SKILL.md +311 -311
- package/seed/marketplaces/ecc/skills/homelab-wireguard-vpn/SKILL.md +305 -305
- package/seed/marketplaces/ecc/skills/hookify-rules/SKILL.md +128 -128
- package/seed/marketplaces/ecc/skills/inventory-demand-planning/SKILL.md +247 -247
- package/seed/marketplaces/ecc/skills/investor-materials/SKILL.md +96 -96
- package/seed/marketplaces/ecc/skills/investor-outreach/SKILL.md +91 -91
- package/seed/marketplaces/ecc/skills/ios-icon-gen/SKILL.md +157 -157
- package/seed/marketplaces/ecc/skills/ios-icon-gen/scripts/generate_icons.swift +258 -258
- package/seed/marketplaces/ecc/skills/ios-icon-gen/scripts/iconify_gen.sh +235 -235
- package/seed/marketplaces/ecc/skills/iterative-retrieval/SKILL.md +211 -211
- package/seed/marketplaces/ecc/skills/ito-basket-compare/SKILL.md +63 -63
- package/seed/marketplaces/ecc/skills/ito-data-atlas-agent/SKILL.md +63 -63
- package/seed/marketplaces/ecc/skills/ito-market-intelligence/SKILL.md +60 -60
- package/seed/marketplaces/ecc/skills/ito-trade-planner/SKILL.md +67 -67
- package/seed/marketplaces/ecc/skills/java-coding-standards/SKILL.md +383 -383
- package/seed/marketplaces/ecc/skills/jira-integration/SKILL.md +293 -293
- package/seed/marketplaces/ecc/skills/jpa-patterns/SKILL.md +151 -151
- package/seed/marketplaces/ecc/skills/knowledge-ops/SKILL.md +154 -154
- package/seed/marketplaces/ecc/skills/kotlin-coroutines-flows/SKILL.md +284 -284
- package/seed/marketplaces/ecc/skills/kotlin-exposed-patterns/SKILL.md +719 -719
- package/seed/marketplaces/ecc/skills/kotlin-ktor-patterns/SKILL.md +689 -689
- package/seed/marketplaces/ecc/skills/kotlin-patterns/SKILL.md +711 -711
- package/seed/marketplaces/ecc/skills/kotlin-testing/SKILL.md +824 -824
- package/seed/marketplaces/ecc/skills/laravel-patterns/SKILL.md +415 -415
- package/seed/marketplaces/ecc/skills/laravel-plugin-discovery/SKILL.md +229 -229
- package/seed/marketplaces/ecc/skills/laravel-security/SKILL.md +285 -285
- package/seed/marketplaces/ecc/skills/laravel-tdd/SKILL.md +283 -283
- package/seed/marketplaces/ecc/skills/laravel-verification/SKILL.md +179 -179
- package/seed/marketplaces/ecc/skills/latency-critical-systems/SKILL.md +73 -73
- package/seed/marketplaces/ecc/skills/lead-intelligence/SKILL.md +321 -321
- package/seed/marketplaces/ecc/skills/lead-intelligence/agents/enrichment-agent.md +85 -85
- package/seed/marketplaces/ecc/skills/lead-intelligence/agents/mutual-mapper.md +75 -75
- package/seed/marketplaces/ecc/skills/lead-intelligence/agents/outreach-drafter.md +98 -98
- package/seed/marketplaces/ecc/skills/lead-intelligence/agents/signal-scorer.md +60 -60
- package/seed/marketplaces/ecc/skills/liquid-glass-design/SKILL.md +279 -279
- package/seed/marketplaces/ecc/skills/llm-trading-agent-security/SKILL.md +146 -146
- package/seed/marketplaces/ecc/skills/logistics-exception-management/SKILL.md +222 -222
- package/seed/marketplaces/ecc/skills/make-interfaces-feel-better/SKILL.md +151 -151
- package/seed/marketplaces/ecc/skills/manim-video/SKILL.md +89 -89
- package/seed/marketplaces/ecc/skills/manim-video/assets/network_graph_scene.py +52 -52
- package/seed/marketplaces/ecc/skills/market-research/SKILL.md +75 -75
- package/seed/marketplaces/ecc/skills/marketing-campaign/SKILL.md +113 -113
- package/seed/marketplaces/ecc/skills/mcp-server-patterns/SKILL.md +69 -69
- package/seed/marketplaces/ecc/skills/messages-ops/SKILL.md +104 -104
- package/seed/marketplaces/ecc/skills/mle-workflow/SKILL.md +346 -346
- package/seed/marketplaces/ecc/skills/motion-advanced/SKILL.md +596 -596
- package/seed/marketplaces/ecc/skills/motion-foundations/SKILL.md +299 -299
- package/seed/marketplaces/ecc/skills/motion-patterns/SKILL.md +435 -435
- package/seed/marketplaces/ecc/skills/motion-ui/SKILL.md +575 -575
- package/seed/marketplaces/ecc/skills/mysql-patterns/SKILL.md +412 -412
- package/seed/marketplaces/ecc/skills/nanoclaw-repl/SKILL.md +33 -33
- package/seed/marketplaces/ecc/skills/nestjs-patterns/SKILL.md +230 -230
- package/seed/marketplaces/ecc/skills/netmiko-ssh-automation/SKILL.md +173 -173
- package/seed/marketplaces/ecc/skills/network-bgp-diagnostics/SKILL.md +167 -167
- package/seed/marketplaces/ecc/skills/network-config-validation/SKILL.md +210 -210
- package/seed/marketplaces/ecc/skills/network-interface-health/SKILL.md +152 -152
- package/seed/marketplaces/ecc/skills/nextjs-turbopack/SKILL.md +57 -57
- package/seed/marketplaces/ecc/skills/nodejs-keccak256/SKILL.md +102 -102
- package/seed/marketplaces/ecc/skills/nutrient-document-processing/SKILL.md +167 -167
- package/seed/marketplaces/ecc/skills/nuxt4-patterns/SKILL.md +100 -100
- package/seed/marketplaces/ecc/skills/openclaw-persona-forge/SKILL.md +288 -288
- package/seed/marketplaces/ecc/skills/openclaw-persona-forge/gacha.py +224 -224
- package/seed/marketplaces/ecc/skills/openclaw-persona-forge/gacha.sh +5 -5
- package/seed/marketplaces/ecc/skills/openclaw-persona-forge/references/avatar-style.md +124 -124
- package/seed/marketplaces/ecc/skills/openclaw-persona-forge/references/boundary-rules.md +53 -53
- package/seed/marketplaces/ecc/skills/openclaw-persona-forge/references/error-handling.md +53 -53
- package/seed/marketplaces/ecc/skills/openclaw-persona-forge/references/identity-tension.md +48 -48
- package/seed/marketplaces/ecc/skills/openclaw-persona-forge/references/naming-system.md +39 -39
- package/seed/marketplaces/ecc/skills/openclaw-persona-forge/references/output-template.md +166 -166
- package/seed/marketplaces/ecc/skills/opensource-pipeline/SKILL.md +255 -255
- package/seed/marketplaces/ecc/skills/parallel-execution-optimizer/SKILL.md +72 -72
- package/seed/marketplaces/ecc/skills/perl-patterns/SKILL.md +504 -504
- package/seed/marketplaces/ecc/skills/perl-security/SKILL.md +503 -503
- package/seed/marketplaces/ecc/skills/perl-testing/SKILL.md +475 -475
- package/seed/marketplaces/ecc/skills/plan-orchestrate/SKILL.md +262 -262
- package/seed/marketplaces/ecc/skills/plankton-code-quality/SKILL.md +236 -236
- package/seed/marketplaces/ecc/skills/postgres-patterns/SKILL.md +147 -147
- package/seed/marketplaces/ecc/skills/prediction-market-oracle-research/SKILL.md +63 -63
- package/seed/marketplaces/ecc/skills/prediction-market-risk-review/SKILL.md +60 -60
- package/seed/marketplaces/ecc/skills/prisma-patterns/SKILL.md +371 -371
- package/seed/marketplaces/ecc/skills/product-capability/SKILL.md +141 -141
- package/seed/marketplaces/ecc/skills/product-lens/SKILL.md +92 -92
- package/seed/marketplaces/ecc/skills/production-audit/SKILL.md +206 -206
- package/seed/marketplaces/ecc/skills/production-scheduling/SKILL.md +238 -238
- package/seed/marketplaces/ecc/skills/project-flow-ops/SKILL.md +111 -111
- package/seed/marketplaces/ecc/skills/prompt-optimizer/SKILL.md +398 -398
- package/seed/marketplaces/ecc/skills/python-patterns/SKILL.md +750 -750
- package/seed/marketplaces/ecc/skills/python-testing/SKILL.md +816 -816
- package/seed/marketplaces/ecc/skills/pytorch-patterns/SKILL.md +396 -396
- package/seed/marketplaces/ecc/skills/quality-nonconformance/SKILL.md +260 -260
- package/seed/marketplaces/ecc/skills/quarkus-patterns/SKILL.md +722 -722
- package/seed/marketplaces/ecc/skills/quarkus-security/SKILL.md +467 -467
- package/seed/marketplaces/ecc/skills/quarkus-tdd/SKILL.md +811 -811
- package/seed/marketplaces/ecc/skills/quarkus-verification/SKILL.md +479 -479
- package/seed/marketplaces/ecc/skills/ralphinho-rfc-pipeline/SKILL.md +67 -67
- package/seed/marketplaces/ecc/skills/recsys-pipeline-architect/SKILL.md +114 -114
- package/seed/marketplaces/ecc/skills/recursive-decision-ledger/SKILL.md +79 -79
- package/seed/marketplaces/ecc/skills/redis-patterns/SKILL.md +403 -403
- package/seed/marketplaces/ecc/skills/regex-vs-llm-structured-text/SKILL.md +220 -220
- package/seed/marketplaces/ecc/skills/remotion-video-creation/SKILL.md +43 -43
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/3d.md +86 -86
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/animations.md +29 -29
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/assets/charts-bar-chart.tsx +173 -173
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/assets/text-animations-typewriter.tsx +100 -100
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/assets/text-animations-word-highlight.tsx +108 -108
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/assets.md +78 -78
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/audio.md +172 -172
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/calculate-metadata.md +104 -104
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/can-decode.md +75 -75
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/charts.md +58 -58
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/compositions.md +146 -146
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/display-captions.md +126 -126
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/extract-frames.md +229 -229
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/fonts.md +152 -152
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/get-audio-duration.md +58 -58
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/get-video-dimensions.md +68 -68
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/get-video-duration.md +58 -58
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/gifs.md +138 -138
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/images.md +130 -130
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/import-srt-captions.md +67 -67
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/lottie.md +67 -67
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/measuring-dom-nodes.md +34 -34
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/measuring-text.md +143 -143
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/sequencing.md +106 -106
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/tailwind.md +11 -11
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/text-animations.md +20 -20
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/timing.md +179 -179
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/transcribe-captions.md +19 -19
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/transitions.md +122 -122
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/trimming.md +52 -52
- package/seed/marketplaces/ecc/skills/remotion-video-creation/rules/videos.md +171 -171
- package/seed/marketplaces/ecc/skills/repo-scan/SKILL.md +78 -78
- package/seed/marketplaces/ecc/skills/research-ops/SKILL.md +112 -112
- package/seed/marketplaces/ecc/skills/returns-reverse-logistics/SKILL.md +240 -240
- package/seed/marketplaces/ecc/skills/rules-distill/SKILL.md +264 -264
- package/seed/marketplaces/ecc/skills/rules-distill/scripts/scan-rules.sh +58 -58
- package/seed/marketplaces/ecc/skills/rules-distill/scripts/scan-skills.sh +129 -129
- package/seed/marketplaces/ecc/skills/rust-patterns/SKILL.md +499 -499
- package/seed/marketplaces/ecc/skills/rust-testing/SKILL.md +500 -500
- package/seed/marketplaces/ecc/skills/safety-guard/SKILL.md +75 -75
- package/seed/marketplaces/ecc/skills/santa-method/SKILL.md +306 -306
- package/seed/marketplaces/ecc/skills/scientific-db-pubmed-database/SKILL.md +175 -175
- package/seed/marketplaces/ecc/skills/scientific-db-uspto-database/SKILL.md +177 -177
- package/seed/marketplaces/ecc/skills/scientific-pkg-gget/SKILL.md +166 -166
- package/seed/marketplaces/ecc/skills/scientific-thinking-literature-review/SKILL.md +192 -192
- package/seed/marketplaces/ecc/skills/scientific-thinking-scholar-evaluation/SKILL.md +160 -160
- package/seed/marketplaces/ecc/skills/search-first/SKILL.md +182 -182
- package/seed/marketplaces/ecc/skills/security-bounty-hunter/SKILL.md +99 -99
- package/seed/marketplaces/ecc/skills/security-review/SKILL.md +503 -503
- package/seed/marketplaces/ecc/skills/security-review/cloud-infrastructure-security.md +361 -361
- package/seed/marketplaces/ecc/skills/security-scan/SKILL.md +165 -165
- package/seed/marketplaces/ecc/skills/seo/SKILL.md +154 -154
- package/seed/marketplaces/ecc/skills/skill-comply/SKILL.md +58 -58
- package/seed/marketplaces/ecc/skills/skill-comply/fixtures/compliant_trace.jsonl +5 -5
- package/seed/marketplaces/ecc/skills/skill-comply/fixtures/noncompliant_trace.jsonl +3 -3
- package/seed/marketplaces/ecc/skills/skill-comply/fixtures/tdd_spec.yaml +44 -44
- package/seed/marketplaces/ecc/skills/skill-comply/prompts/classifier.md +24 -24
- package/seed/marketplaces/ecc/skills/skill-comply/prompts/scenario_generator.md +62 -62
- package/seed/marketplaces/ecc/skills/skill-comply/prompts/spec_generator.md +42 -42
- package/seed/marketplaces/ecc/skills/skill-comply/pyproject.toml +15 -15
- package/seed/marketplaces/ecc/skills/skill-comply/scripts/classifier.py +85 -85
- package/seed/marketplaces/ecc/skills/skill-comply/scripts/grader.py +124 -124
- package/seed/marketplaces/ecc/skills/skill-comply/scripts/parser.py +107 -107
- package/seed/marketplaces/ecc/skills/skill-comply/scripts/report.py +170 -170
- package/seed/marketplaces/ecc/skills/skill-comply/scripts/run.py +127 -127
- package/seed/marketplaces/ecc/skills/skill-comply/scripts/runner.py +186 -186
- package/seed/marketplaces/ecc/skills/skill-comply/scripts/scenario_generator.py +70 -70
- package/seed/marketplaces/ecc/skills/skill-comply/scripts/spec_generator.py +72 -72
- package/seed/marketplaces/ecc/skills/skill-comply/scripts/utils.py +13 -13
- package/seed/marketplaces/ecc/skills/skill-comply/tests/test_grader.py +197 -197
- package/seed/marketplaces/ecc/skills/skill-comply/tests/test_parser.py +90 -90
- package/seed/marketplaces/ecc/skills/skill-comply/tests/test_runner.py +172 -172
- package/seed/marketplaces/ecc/skills/skill-scout/SKILL.md +140 -140
- package/seed/marketplaces/ecc/skills/skill-stocktake/SKILL.md +194 -194
- package/seed/marketplaces/ecc/skills/skill-stocktake/scripts/quick-diff.sh +87 -87
- package/seed/marketplaces/ecc/skills/skill-stocktake/scripts/save-results.sh +56 -56
- package/seed/marketplaces/ecc/skills/skill-stocktake/scripts/scan.sh +170 -170
- package/seed/marketplaces/ecc/skills/social-graph-ranker/SKILL.md +154 -154
- package/seed/marketplaces/ecc/skills/social-publisher/SKILL.md +115 -115
- package/seed/marketplaces/ecc/skills/springboot-patterns/SKILL.md +314 -314
- package/seed/marketplaces/ecc/skills/springboot-security/SKILL.md +272 -272
- package/seed/marketplaces/ecc/skills/springboot-tdd/SKILL.md +158 -158
- package/seed/marketplaces/ecc/skills/springboot-verification/SKILL.md +231 -231
- package/seed/marketplaces/ecc/skills/strategic-compact/SKILL.md +131 -131
- package/seed/marketplaces/ecc/skills/swift-actor-persistence/SKILL.md +143 -143
- package/seed/marketplaces/ecc/skills/swift-concurrency-6-2/SKILL.md +216 -216
- package/seed/marketplaces/ecc/skills/swift-protocol-di-testing/SKILL.md +190 -190
- package/seed/marketplaces/ecc/skills/swiftui-patterns/SKILL.md +259 -259
- package/seed/marketplaces/ecc/skills/tdd-workflow/SKILL.md +463 -463
- package/seed/marketplaces/ecc/skills/team-builder/SKILL.md +168 -168
- package/seed/marketplaces/ecc/skills/terminal-ops/SKILL.md +109 -109
- package/seed/marketplaces/ecc/skills/tinystruct-patterns/SKILL.md +203 -203
- package/seed/marketplaces/ecc/skills/tinystruct-patterns/references/architecture.md +90 -90
- package/seed/marketplaces/ecc/skills/tinystruct-patterns/references/data-handling.md +60 -60
- package/seed/marketplaces/ecc/skills/tinystruct-patterns/references/database.md +99 -99
- package/seed/marketplaces/ecc/skills/tinystruct-patterns/references/routing.md +64 -64
- package/seed/marketplaces/ecc/skills/tinystruct-patterns/references/system-usage.md +97 -97
- package/seed/marketplaces/ecc/skills/tinystruct-patterns/references/testing.md +72 -72
- package/seed/marketplaces/ecc/skills/token-budget-advisor/SKILL.md +133 -133
- package/seed/marketplaces/ecc/skills/ui-demo/SKILL.md +465 -465
- package/seed/marketplaces/ecc/skills/ui-to-vue/SKILL.md +134 -134
- package/seed/marketplaces/ecc/skills/uncloud/SKILL.md +343 -343
- package/seed/marketplaces/ecc/skills/unified-notifications-ops/SKILL.md +187 -187
- package/seed/marketplaces/ecc/skills/verification-loop/SKILL.md +126 -126
- package/seed/marketplaces/ecc/skills/video-editing/SKILL.md +310 -310
- package/seed/marketplaces/ecc/skills/videodb/SKILL.md +374 -374
- package/seed/marketplaces/ecc/skills/videodb/reference/api-reference.md +550 -550
- package/seed/marketplaces/ecc/skills/videodb/reference/capture-reference.md +407 -407
- package/seed/marketplaces/ecc/skills/videodb/reference/capture.md +101 -101
- package/seed/marketplaces/ecc/skills/videodb/reference/editor.md +443 -443
- package/seed/marketplaces/ecc/skills/videodb/reference/generative.md +331 -331
- package/seed/marketplaces/ecc/skills/videodb/reference/rtstream-reference.md +564 -564
- package/seed/marketplaces/ecc/skills/videodb/reference/rtstream.md +65 -65
- package/seed/marketplaces/ecc/skills/videodb/reference/search.md +230 -230
- package/seed/marketplaces/ecc/skills/videodb/reference/streaming.md +406 -406
- package/seed/marketplaces/ecc/skills/videodb/reference/use-cases.md +118 -118
- package/seed/marketplaces/ecc/skills/videodb/scripts/ws_listener.py +282 -282
- package/seed/marketplaces/ecc/skills/visa-doc-translate/README.md +86 -86
- package/seed/marketplaces/ecc/skills/visa-doc-translate/SKILL.md +117 -117
- package/seed/marketplaces/ecc/skills/vite-patterns/SKILL.md +449 -449
- package/seed/marketplaces/ecc/skills/windows-desktop-e2e/SKILL.md +887 -887
- package/seed/marketplaces/ecc/skills/workspace-surface-audit/SKILL.md +125 -125
- package/seed/marketplaces/ecc/skills/x-api/SKILL.md +234 -234
- package/dist/SKILL-r7zmg5v7.md +0 -3
- package/dist/cli-mvr5k580.md +0 -3
- package/dist/server-zyhc2a9z.md +0 -3
|
@@ -1,83 +1,83 @@
|
|
|
1
|
-
# Side Effects with `effect` and `afterRenderEffect`
|
|
2
|
-
|
|
3
|
-
In Angular, an **effect** is an operation that runs whenever one or more signal values it tracks change.
|
|
4
|
-
|
|
5
|
-
## When to use `effect`
|
|
6
|
-
|
|
7
|
-
Effects are intended for syncing signal state to imperative, non-signal APIs.
|
|
8
|
-
|
|
9
|
-
**Valid Use Cases:**
|
|
10
|
-
|
|
11
|
-
- Logging analytics.
|
|
12
|
-
- Syncing state to `localStorage` or `sessionStorage`.
|
|
13
|
-
- Performing custom rendering to a `<canvas>` or 3rd-party charting library.
|
|
14
|
-
|
|
15
|
-
**CRITICAL RULE: DO NOT use effects to propagate state.**
|
|
16
|
-
If you find yourself using `.set()` or `.update()` on a signal _inside_ an effect to keep two signals in sync, you are making a mistake. This causes `ExpressionChangedAfterItHasBeenChecked` errors and infinite loops. **Always use `computed()` or `linkedSignal()` for state derivation.**
|
|
17
|
-
|
|
18
|
-
## Basic Usage
|
|
19
|
-
|
|
20
|
-
Effects execute asynchronously during the change detection process. They always run at least once.
|
|
21
|
-
|
|
22
|
-
```ts
|
|
23
|
-
import { Component, signal, effect } from '@angular/core';
|
|
24
|
-
|
|
25
|
-
@Component({...})
|
|
26
|
-
export class Example {
|
|
27
|
-
count = signal(0);
|
|
28
|
-
|
|
29
|
-
constructor() {
|
|
30
|
-
// Effect must be created in an injection context (e.g., a constructor)
|
|
31
|
-
effect((onCleanup) => {
|
|
32
|
-
console.log(`Count changed to ${this.count()}`);
|
|
33
|
-
|
|
34
|
-
const timer = setTimeout(() => console.log('Timer finished'), 1000);
|
|
35
|
-
|
|
36
|
-
// Cleanup function runs before the next execution, or when destroyed
|
|
37
|
-
onCleanup(() => clearTimeout(timer));
|
|
38
|
-
});
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
```
|
|
42
|
-
|
|
43
|
-
## DOM Manipulation with `afterRenderEffect`
|
|
44
|
-
|
|
45
|
-
Standard `effect` runs _before_ Angular updates the DOM. If you need to manually inspect or modify the DOM based on a signal change (e.g., integrating a 3rd party UI library), use `afterRenderEffect`.
|
|
46
|
-
|
|
47
|
-
`afterRenderEffect` runs after Angular has finished rendering the DOM.
|
|
48
|
-
|
|
49
|
-
### Render Phases
|
|
50
|
-
|
|
51
|
-
To prevent reflows (forced layout thrashing), `afterRenderEffect` forces you to divide your DOM reads and writes into specific phases.
|
|
52
|
-
|
|
53
|
-
```ts
|
|
54
|
-
import { Component, afterRenderEffect, viewChild, ElementRef } from '@angular/core';
|
|
55
|
-
|
|
56
|
-
@Component({...})
|
|
57
|
-
export class Chart {
|
|
58
|
-
canvas = viewChild.required<ElementRef>('canvas');
|
|
59
|
-
|
|
60
|
-
constructor() {
|
|
61
|
-
afterRenderEffect({
|
|
62
|
-
// 1. Read from the DOM
|
|
63
|
-
earlyRead: () => {
|
|
64
|
-
return this.canvas().nativeElement.getBoundingClientRect().width;
|
|
65
|
-
},
|
|
66
|
-
// 2. Write to the DOM (receives the result of the previous phase)
|
|
67
|
-
write: (width) => {
|
|
68
|
-
// NEVER read from the DOM in the write phase.
|
|
69
|
-
setupChart(this.canvas().nativeElement, width);
|
|
70
|
-
}
|
|
71
|
-
});
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
**Available Phases (executed in this order):**
|
|
77
|
-
|
|
78
|
-
1. `earlyRead`
|
|
79
|
-
2. `write` (Never read here)
|
|
80
|
-
3. `mixedReadWrite` (Avoid if possible)
|
|
81
|
-
4. `read` (Never write here)
|
|
82
|
-
|
|
83
|
-
_Note: `afterRenderEffect` only runs on the client, never during Server-Side Rendering (SSR)._
|
|
1
|
+
# Side Effects with `effect` and `afterRenderEffect`
|
|
2
|
+
|
|
3
|
+
In Angular, an **effect** is an operation that runs whenever one or more signal values it tracks change.
|
|
4
|
+
|
|
5
|
+
## When to use `effect`
|
|
6
|
+
|
|
7
|
+
Effects are intended for syncing signal state to imperative, non-signal APIs.
|
|
8
|
+
|
|
9
|
+
**Valid Use Cases:**
|
|
10
|
+
|
|
11
|
+
- Logging analytics.
|
|
12
|
+
- Syncing state to `localStorage` or `sessionStorage`.
|
|
13
|
+
- Performing custom rendering to a `<canvas>` or 3rd-party charting library.
|
|
14
|
+
|
|
15
|
+
**CRITICAL RULE: DO NOT use effects to propagate state.**
|
|
16
|
+
If you find yourself using `.set()` or `.update()` on a signal _inside_ an effect to keep two signals in sync, you are making a mistake. This causes `ExpressionChangedAfterItHasBeenChecked` errors and infinite loops. **Always use `computed()` or `linkedSignal()` for state derivation.**
|
|
17
|
+
|
|
18
|
+
## Basic Usage
|
|
19
|
+
|
|
20
|
+
Effects execute asynchronously during the change detection process. They always run at least once.
|
|
21
|
+
|
|
22
|
+
```ts
|
|
23
|
+
import { Component, signal, effect } from '@angular/core';
|
|
24
|
+
|
|
25
|
+
@Component({...})
|
|
26
|
+
export class Example {
|
|
27
|
+
count = signal(0);
|
|
28
|
+
|
|
29
|
+
constructor() {
|
|
30
|
+
// Effect must be created in an injection context (e.g., a constructor)
|
|
31
|
+
effect((onCleanup) => {
|
|
32
|
+
console.log(`Count changed to ${this.count()}`);
|
|
33
|
+
|
|
34
|
+
const timer = setTimeout(() => console.log('Timer finished'), 1000);
|
|
35
|
+
|
|
36
|
+
// Cleanup function runs before the next execution, or when destroyed
|
|
37
|
+
onCleanup(() => clearTimeout(timer));
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## DOM Manipulation with `afterRenderEffect`
|
|
44
|
+
|
|
45
|
+
Standard `effect` runs _before_ Angular updates the DOM. If you need to manually inspect or modify the DOM based on a signal change (e.g., integrating a 3rd party UI library), use `afterRenderEffect`.
|
|
46
|
+
|
|
47
|
+
`afterRenderEffect` runs after Angular has finished rendering the DOM.
|
|
48
|
+
|
|
49
|
+
### Render Phases
|
|
50
|
+
|
|
51
|
+
To prevent reflows (forced layout thrashing), `afterRenderEffect` forces you to divide your DOM reads and writes into specific phases.
|
|
52
|
+
|
|
53
|
+
```ts
|
|
54
|
+
import { Component, afterRenderEffect, viewChild, ElementRef } from '@angular/core';
|
|
55
|
+
|
|
56
|
+
@Component({...})
|
|
57
|
+
export class Chart {
|
|
58
|
+
canvas = viewChild.required<ElementRef>('canvas');
|
|
59
|
+
|
|
60
|
+
constructor() {
|
|
61
|
+
afterRenderEffect({
|
|
62
|
+
// 1. Read from the DOM
|
|
63
|
+
earlyRead: () => {
|
|
64
|
+
return this.canvas().nativeElement.getBoundingClientRect().width;
|
|
65
|
+
},
|
|
66
|
+
// 2. Write to the DOM (receives the result of the previous phase)
|
|
67
|
+
write: (width) => {
|
|
68
|
+
// NEVER read from the DOM in the write phase.
|
|
69
|
+
setupChart(this.canvas().nativeElement, width);
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
**Available Phases (executed in this order):**
|
|
77
|
+
|
|
78
|
+
1. `earlyRead`
|
|
79
|
+
2. `write` (Never read here)
|
|
80
|
+
3. `mixedReadWrite` (Avoid if possible)
|
|
81
|
+
4. `read` (Never write here)
|
|
82
|
+
|
|
83
|
+
_Note: `afterRenderEffect` only runs on the client, never during Server-Side Rendering (SSR)._
|
|
@@ -1,43 +1,43 @@
|
|
|
1
|
-
# Hierarchical Injectors
|
|
2
|
-
|
|
3
|
-
Angular's dependency injection system is hierarchical, meaning services can be scoped to different levels of the application.
|
|
4
|
-
|
|
5
|
-
## Types of Injector Hierarchies
|
|
6
|
-
|
|
7
|
-
1. **`EnvironmentInjector` Hierarchy**: Configured via `@Injectable({ providedIn: 'root' })` or `ApplicationConfig.providers` during bootstrap. These are global singletons.
|
|
8
|
-
2. **`ElementInjector` Hierarchy**: Created implicitly at each DOM element. Configured via the `providers` or `viewProviders` array in `@Component()` or `@Directive()`.
|
|
9
|
-
|
|
10
|
-
## Resolution Rules
|
|
11
|
-
|
|
12
|
-
When a dependency is requested, Angular resolves it in two phases:
|
|
13
|
-
|
|
14
|
-
1. It searches up the **`ElementInjector`** tree, starting from the requesting component/directive up to the root element.
|
|
15
|
-
2. If not found, it searches the **`EnvironmentInjector`** tree, starting from the closest environment injector up to the root.
|
|
16
|
-
3. If still not found, it throws an error (unless marked optional).
|
|
17
|
-
|
|
18
|
-
## Resolution Modifiers
|
|
19
|
-
|
|
20
|
-
You can alter how Angular searches for a dependency using the options object in `inject()`:
|
|
21
|
-
|
|
22
|
-
- **`optional`**: If the dependency isn't found, return `null` instead of throwing an error.
|
|
23
|
-
- **`self`**: Only check the current `ElementInjector`. Do not look up the parent tree.
|
|
24
|
-
- **`skipSelf`**: Start searching in the parent `ElementInjector`, skipping the current element.
|
|
25
|
-
- **`host`**: Stop searching when reaching the host component's view boundary.
|
|
26
|
-
|
|
27
|
-
```ts
|
|
28
|
-
@Component({...})
|
|
29
|
-
export class Example {
|
|
30
|
-
// Returns null if not found instead of crashing
|
|
31
|
-
optionalService = inject(MyService, { optional: true });
|
|
32
|
-
|
|
33
|
-
// Skips this component's providers, looks at parent
|
|
34
|
-
parentService = inject(ParentService, { skipSelf: true });
|
|
35
|
-
}
|
|
36
|
-
```
|
|
37
|
-
|
|
38
|
-
## `providers` vs `viewProviders`
|
|
39
|
-
|
|
40
|
-
When providing a service at the component level:
|
|
41
|
-
|
|
42
|
-
- **`providers`**: The service is available to the component, its view (template), and any **projected content** (`<ng-content>`).
|
|
43
|
-
- **`viewProviders`**: The service is available to the component and its view, but **NOT** to projected content. Use this to isolate services from content passed in by consumers.
|
|
1
|
+
# Hierarchical Injectors
|
|
2
|
+
|
|
3
|
+
Angular's dependency injection system is hierarchical, meaning services can be scoped to different levels of the application.
|
|
4
|
+
|
|
5
|
+
## Types of Injector Hierarchies
|
|
6
|
+
|
|
7
|
+
1. **`EnvironmentInjector` Hierarchy**: Configured via `@Injectable({ providedIn: 'root' })` or `ApplicationConfig.providers` during bootstrap. These are global singletons.
|
|
8
|
+
2. **`ElementInjector` Hierarchy**: Created implicitly at each DOM element. Configured via the `providers` or `viewProviders` array in `@Component()` or `@Directive()`.
|
|
9
|
+
|
|
10
|
+
## Resolution Rules
|
|
11
|
+
|
|
12
|
+
When a dependency is requested, Angular resolves it in two phases:
|
|
13
|
+
|
|
14
|
+
1. It searches up the **`ElementInjector`** tree, starting from the requesting component/directive up to the root element.
|
|
15
|
+
2. If not found, it searches the **`EnvironmentInjector`** tree, starting from the closest environment injector up to the root.
|
|
16
|
+
3. If still not found, it throws an error (unless marked optional).
|
|
17
|
+
|
|
18
|
+
## Resolution Modifiers
|
|
19
|
+
|
|
20
|
+
You can alter how Angular searches for a dependency using the options object in `inject()`:
|
|
21
|
+
|
|
22
|
+
- **`optional`**: If the dependency isn't found, return `null` instead of throwing an error.
|
|
23
|
+
- **`self`**: Only check the current `ElementInjector`. Do not look up the parent tree.
|
|
24
|
+
- **`skipSelf`**: Start searching in the parent `ElementInjector`, skipping the current element.
|
|
25
|
+
- **`host`**: Stop searching when reaching the host component's view boundary.
|
|
26
|
+
|
|
27
|
+
```ts
|
|
28
|
+
@Component({...})
|
|
29
|
+
export class Example {
|
|
30
|
+
// Returns null if not found instead of crashing
|
|
31
|
+
optionalService = inject(MyService, { optional: true });
|
|
32
|
+
|
|
33
|
+
// Skips this component's providers, looks at parent
|
|
34
|
+
parentService = inject(ParentService, { skipSelf: true });
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## `providers` vs `viewProviders`
|
|
39
|
+
|
|
40
|
+
When providing a service at the component level:
|
|
41
|
+
|
|
42
|
+
- **`providers`**: The service is available to the component, its view (template), and any **projected content** (`<ng-content>`).
|
|
43
|
+
- **`viewProviders`**: The service is available to the component and its view, but **NOT** to projected content. Use this to isolate services from content passed in by consumers.
|
|
@@ -1,80 +1,80 @@
|
|
|
1
|
-
# Component Host Elements
|
|
2
|
-
|
|
3
|
-
The **host element** is the DOM element that matches a component's selector. The component's template renders inside this element.
|
|
4
|
-
|
|
5
|
-
## Binding to the Host Element
|
|
6
|
-
|
|
7
|
-
Use the `host` property in the `@Component` decorator to bind properties, attributes, styles, and events to the host element. This is the **preferred approach** over legacy decorators.
|
|
8
|
-
|
|
9
|
-
```ts
|
|
10
|
-
@Component({
|
|
11
|
-
selector: 'custom-slider',
|
|
12
|
-
host: {
|
|
13
|
-
'role': 'slider', // Static attribute
|
|
14
|
-
'[attr.aria-valuenow]': 'value', // Attribute binding
|
|
15
|
-
'[class.active]': 'isActive()', // Class binding
|
|
16
|
-
'[style.color]': 'color()', // Style binding
|
|
17
|
-
'[tabIndex]': 'disabled ? -1 : 0', // Property binding
|
|
18
|
-
'(keydown)': 'onKeyDown($event)', // Event binding
|
|
19
|
-
},
|
|
20
|
-
})
|
|
21
|
-
export class CustomSlider {
|
|
22
|
-
value = 0;
|
|
23
|
-
disabled = false;
|
|
24
|
-
isActive = signal(false);
|
|
25
|
-
color = signal('blue');
|
|
26
|
-
|
|
27
|
-
onKeyDown(event: KeyboardEvent) {
|
|
28
|
-
/* ... */
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
```
|
|
32
|
-
|
|
33
|
-
## Legacy Decorators
|
|
34
|
-
|
|
35
|
-
`@HostBinding` and `@HostListener` are supported for backwards compatibility but should be avoided in new code.
|
|
36
|
-
|
|
37
|
-
```ts
|
|
38
|
-
export class CustomSlider {
|
|
39
|
-
@HostBinding('tabIndex')
|
|
40
|
-
get tabIndex() {
|
|
41
|
-
return this.disabled ? -1 : 0;
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
@HostListener('keydown', ['$event'])
|
|
45
|
-
onKeyDown(event: KeyboardEvent) {
|
|
46
|
-
/* ... */
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
```
|
|
50
|
-
|
|
51
|
-
## Binding Collisions
|
|
52
|
-
|
|
53
|
-
If both the component (host binding) and the consumer (template binding) bind to the same property:
|
|
54
|
-
|
|
55
|
-
1. **Static vs Static**: The instance (consumer) binding wins.
|
|
56
|
-
2. **Static vs Dynamic**: The dynamic binding wins.
|
|
57
|
-
3. **Dynamic vs Dynamic**: The component's host binding wins.
|
|
58
|
-
|
|
59
|
-
## Injecting Host Attributes
|
|
60
|
-
|
|
61
|
-
Use `HostAttributeToken` with the `inject` function to read static attributes from the host element at construction time.
|
|
62
|
-
|
|
63
|
-
```ts
|
|
64
|
-
import {Component, HostAttributeToken, inject} from '@angular/core';
|
|
65
|
-
|
|
66
|
-
@Component({
|
|
67
|
-
selector: 'app-btn',
|
|
68
|
-
template: `<ng-content />`,
|
|
69
|
-
})
|
|
70
|
-
export class AppButton {
|
|
71
|
-
// Throws error if 'type' is missing unless injected with { optional: true }
|
|
72
|
-
type = inject(new HostAttributeToken('type'));
|
|
73
|
-
}
|
|
74
|
-
```
|
|
75
|
-
|
|
76
|
-
Usage:
|
|
77
|
-
|
|
78
|
-
```html
|
|
79
|
-
<app-btn type="primary">Click Me</app-btn>
|
|
80
|
-
```
|
|
1
|
+
# Component Host Elements
|
|
2
|
+
|
|
3
|
+
The **host element** is the DOM element that matches a component's selector. The component's template renders inside this element.
|
|
4
|
+
|
|
5
|
+
## Binding to the Host Element
|
|
6
|
+
|
|
7
|
+
Use the `host` property in the `@Component` decorator to bind properties, attributes, styles, and events to the host element. This is the **preferred approach** over legacy decorators.
|
|
8
|
+
|
|
9
|
+
```ts
|
|
10
|
+
@Component({
|
|
11
|
+
selector: 'custom-slider',
|
|
12
|
+
host: {
|
|
13
|
+
'role': 'slider', // Static attribute
|
|
14
|
+
'[attr.aria-valuenow]': 'value', // Attribute binding
|
|
15
|
+
'[class.active]': 'isActive()', // Class binding
|
|
16
|
+
'[style.color]': 'color()', // Style binding
|
|
17
|
+
'[tabIndex]': 'disabled ? -1 : 0', // Property binding
|
|
18
|
+
'(keydown)': 'onKeyDown($event)', // Event binding
|
|
19
|
+
},
|
|
20
|
+
})
|
|
21
|
+
export class CustomSlider {
|
|
22
|
+
value = 0;
|
|
23
|
+
disabled = false;
|
|
24
|
+
isActive = signal(false);
|
|
25
|
+
color = signal('blue');
|
|
26
|
+
|
|
27
|
+
onKeyDown(event: KeyboardEvent) {
|
|
28
|
+
/* ... */
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
```
|
|
32
|
+
|
|
33
|
+
## Legacy Decorators
|
|
34
|
+
|
|
35
|
+
`@HostBinding` and `@HostListener` are supported for backwards compatibility but should be avoided in new code.
|
|
36
|
+
|
|
37
|
+
```ts
|
|
38
|
+
export class CustomSlider {
|
|
39
|
+
@HostBinding('tabIndex')
|
|
40
|
+
get tabIndex() {
|
|
41
|
+
return this.disabled ? -1 : 0;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
@HostListener('keydown', ['$event'])
|
|
45
|
+
onKeyDown(event: KeyboardEvent) {
|
|
46
|
+
/* ... */
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
## Binding Collisions
|
|
52
|
+
|
|
53
|
+
If both the component (host binding) and the consumer (template binding) bind to the same property:
|
|
54
|
+
|
|
55
|
+
1. **Static vs Static**: The instance (consumer) binding wins.
|
|
56
|
+
2. **Static vs Dynamic**: The dynamic binding wins.
|
|
57
|
+
3. **Dynamic vs Dynamic**: The component's host binding wins.
|
|
58
|
+
|
|
59
|
+
## Injecting Host Attributes
|
|
60
|
+
|
|
61
|
+
Use `HostAttributeToken` with the `inject` function to read static attributes from the host element at construction time.
|
|
62
|
+
|
|
63
|
+
```ts
|
|
64
|
+
import {Component, HostAttributeToken, inject} from '@angular/core';
|
|
65
|
+
|
|
66
|
+
@Component({
|
|
67
|
+
selector: 'app-btn',
|
|
68
|
+
template: `<ng-content />`,
|
|
69
|
+
})
|
|
70
|
+
export class AppButton {
|
|
71
|
+
// Throws error if 'type' is missing unless injected with { optional: true }
|
|
72
|
+
type = inject(new HostAttributeToken('type'));
|
|
73
|
+
}
|
|
74
|
+
```
|
|
75
|
+
|
|
76
|
+
Usage:
|
|
77
|
+
|
|
78
|
+
```html
|
|
79
|
+
<app-btn type="primary">Click Me</app-btn>
|
|
80
|
+
```
|
|
@@ -1,63 +1,63 @@
|
|
|
1
|
-
# Injection Context
|
|
2
|
-
|
|
3
|
-
The `inject()` function can only be used when code is executing within an **injection context**.
|
|
4
|
-
|
|
5
|
-
## Where is an Injection Context Available?
|
|
6
|
-
|
|
7
|
-
An injection context is automatically available in:
|
|
8
|
-
|
|
9
|
-
1. **Field initializers** of classes instantiated by DI (`@Injectable`, `@Component`, `@Directive`, `@Pipe`).
|
|
10
|
-
2. **Constructors** of classes instantiated by DI.
|
|
11
|
-
3. **Factory functions** specified in `useFactory` or `InjectionToken` configurations.
|
|
12
|
-
4. **Functional APIs** executed by Angular (e.g., functional route guards, resolvers, interceptors).
|
|
13
|
-
|
|
14
|
-
```ts
|
|
15
|
-
@Component({...})
|
|
16
|
-
export class Example {
|
|
17
|
-
// Valid: Field initializer
|
|
18
|
-
private router = inject(Router);
|
|
19
|
-
|
|
20
|
-
constructor() {
|
|
21
|
-
// Valid: Constructor
|
|
22
|
-
const http = inject(HttpClient);
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
onClick() {
|
|
26
|
-
// Invalid: Not an injection context
|
|
27
|
-
// const auth = inject(AuthService);
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
```
|
|
31
|
-
|
|
32
|
-
## `runInInjectionContext`
|
|
33
|
-
|
|
34
|
-
If you need to run a function within an injection context (often needed for dynamic component creation or testing), use `runInInjectionContext`. This requires access to an existing injector (like `EnvironmentInjector` or `Injector`).
|
|
35
|
-
|
|
36
|
-
```ts
|
|
37
|
-
import {Injectable, inject, EnvironmentInjector, runInInjectionContext} from '@angular/core';
|
|
38
|
-
|
|
39
|
-
@Injectable({providedIn: 'root'})
|
|
40
|
-
export class MyService {
|
|
41
|
-
private injector = inject(EnvironmentInjector);
|
|
42
|
-
|
|
43
|
-
doSomethingDynamic() {
|
|
44
|
-
runInInjectionContext(this.injector, () => {
|
|
45
|
-
// Now valid to use inject() here
|
|
46
|
-
const router = inject(Router);
|
|
47
|
-
});
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## `assertInInjectionContext`
|
|
53
|
-
|
|
54
|
-
Use `assertInInjectionContext` in utility functions to guarantee they are called from a valid context. It throws a clear error if not.
|
|
55
|
-
|
|
56
|
-
```ts
|
|
57
|
-
import {assertInInjectionContext, inject, ElementRef} from '@angular/core';
|
|
58
|
-
|
|
59
|
-
export function injectNativeElement<T extends Element>(): T {
|
|
60
|
-
assertInInjectionContext(injectNativeElement);
|
|
61
|
-
return inject(ElementRef).nativeElement;
|
|
62
|
-
}
|
|
63
|
-
```
|
|
1
|
+
# Injection Context
|
|
2
|
+
|
|
3
|
+
The `inject()` function can only be used when code is executing within an **injection context**.
|
|
4
|
+
|
|
5
|
+
## Where is an Injection Context Available?
|
|
6
|
+
|
|
7
|
+
An injection context is automatically available in:
|
|
8
|
+
|
|
9
|
+
1. **Field initializers** of classes instantiated by DI (`@Injectable`, `@Component`, `@Directive`, `@Pipe`).
|
|
10
|
+
2. **Constructors** of classes instantiated by DI.
|
|
11
|
+
3. **Factory functions** specified in `useFactory` or `InjectionToken` configurations.
|
|
12
|
+
4. **Functional APIs** executed by Angular (e.g., functional route guards, resolvers, interceptors).
|
|
13
|
+
|
|
14
|
+
```ts
|
|
15
|
+
@Component({...})
|
|
16
|
+
export class Example {
|
|
17
|
+
// Valid: Field initializer
|
|
18
|
+
private router = inject(Router);
|
|
19
|
+
|
|
20
|
+
constructor() {
|
|
21
|
+
// Valid: Constructor
|
|
22
|
+
const http = inject(HttpClient);
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
onClick() {
|
|
26
|
+
// Invalid: Not an injection context
|
|
27
|
+
// const auth = inject(AuthService);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
## `runInInjectionContext`
|
|
33
|
+
|
|
34
|
+
If you need to run a function within an injection context (often needed for dynamic component creation or testing), use `runInInjectionContext`. This requires access to an existing injector (like `EnvironmentInjector` or `Injector`).
|
|
35
|
+
|
|
36
|
+
```ts
|
|
37
|
+
import {Injectable, inject, EnvironmentInjector, runInInjectionContext} from '@angular/core';
|
|
38
|
+
|
|
39
|
+
@Injectable({providedIn: 'root'})
|
|
40
|
+
export class MyService {
|
|
41
|
+
private injector = inject(EnvironmentInjector);
|
|
42
|
+
|
|
43
|
+
doSomethingDynamic() {
|
|
44
|
+
runInInjectionContext(this.injector, () => {
|
|
45
|
+
// Now valid to use inject() here
|
|
46
|
+
const router = inject(Router);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
## `assertInInjectionContext`
|
|
53
|
+
|
|
54
|
+
Use `assertInInjectionContext` in utility functions to guarantee they are called from a valid context. It throws a clear error if not.
|
|
55
|
+
|
|
56
|
+
```ts
|
|
57
|
+
import {assertInInjectionContext, inject, ElementRef} from '@angular/core';
|
|
58
|
+
|
|
59
|
+
export function injectNativeElement<T extends Element>(): T {
|
|
60
|
+
assertInInjectionContext(injectNativeElement);
|
|
61
|
+
return inject(ElementRef).nativeElement;
|
|
62
|
+
}
|
|
63
|
+
```
|