moai-adk 0.34.0__py3-none-any.whl → 1.1.0__py3-none-any.whl
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.
- moai_adk/__main__.py +136 -5
- moai_adk/astgrep/__init__.py +37 -0
- moai_adk/astgrep/analyzer.py +522 -0
- moai_adk/astgrep/models.py +124 -0
- moai_adk/astgrep/rules.py +179 -0
- moai_adk/cli/commands/analyze.py +11 -2
- moai_adk/cli/commands/doctor.py +7 -1
- moai_adk/cli/commands/init.py +321 -11
- moai_adk/cli/commands/language.py +7 -1
- moai_adk/cli/commands/rank.py +449 -0
- moai_adk/cli/commands/status.py +7 -1
- moai_adk/cli/commands/switch.py +325 -0
- moai_adk/cli/commands/update.py +296 -23
- moai_adk/cli/prompts/init_prompts.py +362 -66
- moai_adk/cli/prompts/translations/__init__.py +573 -0
- moai_adk/cli/ui/prompts.py +61 -2
- moai_adk/cli/worktree/cli.py +106 -1
- moai_adk/cli/worktree/manager.py +155 -0
- moai_adk/core/config/unified.py +244 -63
- moai_adk/core/credentials.py +264 -0
- moai_adk/core/error_recovery_system.py +22 -4
- moai_adk/core/git/conflict_detector.py +10 -1
- moai_adk/core/git/event_detector.py +16 -5
- moai_adk/core/integration/engine.py +2 -2
- moai_adk/core/integration/integration_tester.py +5 -5
- moai_adk/core/language_config_resolver.py +9 -3
- moai_adk/core/merge/analyzer.py +509 -324
- moai_adk/core/migration/alfred_to_moai_migrator.py +7 -1
- moai_adk/core/migration/backup_manager.py +54 -4
- moai_adk/core/migration/file_migrator.py +174 -2
- moai_adk/core/migration/interactive_checkbox_ui.py +42 -31
- moai_adk/core/migration/version_detector.py +123 -19
- moai_adk/core/migration/version_migrator.py +44 -9
- moai_adk/core/model_allocator.py +241 -0
- moai_adk/core/project/backup_utils.py +12 -2
- moai_adk/core/project/initializer.py +44 -87
- moai_adk/core/project/phase_executor.py +95 -33
- moai_adk/core/project/validator.py +16 -1
- moai_adk/core/quality/trust_checker.py +30 -10
- moai_adk/core/rollback_manager.py +60 -25
- moai_adk/core/template/backup.py +88 -6
- moai_adk/core/template/config.py +33 -9
- moai_adk/core/template/merger.py +34 -8
- moai_adk/core/template/processor.py +334 -11
- moai_adk/core/template_engine.py +10 -1
- moai_adk/core/template_variable_synchronizer.py +16 -2
- moai_adk/core/version_sync.py +54 -6
- moai_adk/foundation/__init__.py +1 -20
- moai_adk/foundation/testing.py +1 -1
- moai_adk/loop/__init__.py +54 -0
- moai_adk/loop/controller.py +305 -0
- moai_adk/loop/feedback.py +230 -0
- moai_adk/loop/state.py +209 -0
- moai_adk/loop/storage.py +220 -0
- moai_adk/lsp/__init__.py +70 -0
- moai_adk/lsp/client.py +320 -0
- moai_adk/lsp/models.py +261 -0
- moai_adk/lsp/protocol.py +404 -0
- moai_adk/lsp/server_manager.py +248 -0
- moai_adk/project/configuration.py +8 -1
- moai_adk/py.typed +0 -0
- moai_adk/ralph/__init__.py +37 -0
- moai_adk/ralph/engine.py +307 -0
- moai_adk/rank/__init__.py +21 -0
- moai_adk/rank/auth.py +425 -0
- moai_adk/rank/client.py +557 -0
- moai_adk/rank/config.py +147 -0
- moai_adk/rank/hook.py +1503 -0
- moai_adk/rank/py.typed +0 -0
- moai_adk/statusline/__init__.py +3 -0
- moai_adk/statusline/enhanced_output_style_detector.py +5 -5
- moai_adk/statusline/main.py +20 -1
- moai_adk/statusline/memory_collector.py +268 -0
- moai_adk/statusline/renderer.py +54 -38
- moai_adk/tag_system/__init__.py +48 -0
- moai_adk/tag_system/atomic_ops.py +117 -0
- moai_adk/tag_system/linkage.py +335 -0
- moai_adk/tag_system/parser.py +176 -0
- moai_adk/tag_system/validator.py +200 -0
- moai_adk/templates/.claude/agents/moai/builder-agent.md +19 -3
- moai_adk/templates/.claude/agents/moai/builder-command.md +62 -16
- moai_adk/templates/.claude/agents/moai/builder-plugin.md +763 -0
- moai_adk/templates/.claude/agents/moai/builder-skill.md +21 -5
- moai_adk/templates/.claude/agents/moai/expert-backend.md +103 -39
- moai_adk/templates/.claude/agents/moai/expert-debug.md +9 -3
- moai_adk/templates/.claude/agents/moai/expert-devops.md +16 -14
- moai_adk/templates/.claude/agents/moai/expert-frontend.md +45 -31
- moai_adk/templates/.claude/agents/moai/expert-performance.md +13 -9
- moai_adk/templates/.claude/agents/moai/expert-refactoring.md +228 -0
- moai_adk/templates/.claude/agents/moai/expert-security.md +19 -3
- moai_adk/templates/.claude/agents/moai/expert-testing.md +13 -9
- moai_adk/templates/.claude/agents/moai/manager-claude-code.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-docs.md +10 -5
- moai_adk/templates/.claude/agents/moai/manager-git.md +99 -27
- moai_adk/templates/.claude/agents/moai/manager-project.md +87 -7
- moai_adk/templates/.claude/agents/moai/manager-quality.md +22 -5
- moai_adk/templates/.claude/agents/moai/manager-spec.md +8 -2
- moai_adk/templates/.claude/agents/moai/manager-strategy.md +45 -14
- moai_adk/templates/.claude/agents/moai/manager-tdd.md +16 -3
- moai_adk/templates/.claude/commands/moai/0-project.md +239 -1185
- moai_adk/templates/.claude/commands/moai/1-plan.md +383 -363
- moai_adk/templates/.claude/commands/moai/2-run.md +254 -347
- moai_adk/templates/.claude/commands/moai/3-sync.md +174 -100
- moai_adk/templates/.claude/commands/moai/9-feedback.md +49 -33
- moai_adk/templates/.claude/commands/moai/alfred.md +339 -0
- moai_adk/templates/.claude/commands/moai/cancel-loop.md +163 -0
- moai_adk/templates/.claude/commands/moai/fix.md +264 -0
- moai_adk/templates/.claude/commands/moai/loop.md +363 -0
- moai_adk/templates/.claude/hooks/moai/lib/README.md +143 -0
- moai_adk/templates/.claude/hooks/moai/lib/__init__.py +37 -81
- moai_adk/templates/.claude/hooks/moai/lib/alfred_detector.py +105 -0
- moai_adk/templates/.claude/hooks/moai/lib/atomic_write.py +122 -0
- moai_adk/templates/.claude/hooks/moai/lib/checkpoint.py +4 -1
- moai_adk/templates/.claude/hooks/moai/lib/common.py +35 -5
- moai_adk/templates/.claude/hooks/moai/lib/config.py +376 -0
- moai_adk/templates/.claude/hooks/moai/lib/config_manager.py +24 -28
- moai_adk/templates/.claude/hooks/moai/lib/config_validator.py +14 -14
- moai_adk/templates/.claude/hooks/moai/lib/enhanced_output_style_detector.py +372 -0
- moai_adk/templates/.claude/hooks/moai/lib/exceptions.py +171 -0
- moai_adk/templates/.claude/hooks/moai/lib/file_utils.py +95 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_collector.py +190 -0
- moai_adk/templates/.claude/hooks/moai/lib/git_operations_manager.py +15 -13
- moai_adk/templates/.claude/hooks/moai/lib/language_detector.py +298 -0
- moai_adk/templates/.claude/hooks/moai/lib/language_validator.py +125 -25
- moai_adk/templates/.claude/hooks/moai/lib/main.py +341 -0
- moai_adk/templates/.claude/hooks/moai/lib/memory_collector.py +268 -0
- moai_adk/templates/.claude/hooks/moai/lib/metrics_tracker.py +78 -0
- moai_adk/templates/.claude/hooks/moai/lib/models.py +9 -7
- moai_adk/templates/.claude/hooks/moai/lib/path_utils.py +204 -13
- moai_adk/templates/.claude/hooks/moai/lib/project.py +23 -14
- moai_adk/templates/.claude/hooks/moai/lib/renderer.py +359 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_linkage.py +333 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_parser.py +176 -0
- moai_adk/templates/.claude/hooks/moai/lib/tag_validator.py +200 -0
- moai_adk/templates/.claude/hooks/moai/lib/timeout.py +5 -5
- moai_adk/templates/.claude/hooks/moai/lib/tool_registry.py +896 -0
- moai_adk/templates/.claude/hooks/moai/lib/unified_timeout_manager.py +30 -18
- moai_adk/templates/.claude/hooks/moai/lib/update_checker.py +129 -0
- moai_adk/templates/.claude/hooks/moai/lib/version_reader.py +741 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__ast_grep_scan.py +276 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__code_formatter.py +255 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__coverage_guard.py +325 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__linter.py +315 -0
- moai_adk/templates/.claude/hooks/moai/post_tool__lsp_diagnostic.py +508 -0
- moai_adk/templates/.claude/hooks/moai/pre_commit__tag_validator.py +287 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__security_guard.py +268 -0
- moai_adk/templates/.claude/hooks/moai/pre_tool__tdd_enforcer.py +208 -0
- moai_adk/templates/.claude/hooks/moai/session_end__auto_cleanup.py +93 -61
- moai_adk/templates/.claude/hooks/moai/session_end__rank_submit.py +69 -0
- moai_adk/templates/.claude/hooks/moai/session_start__show_project_info.py +165 -70
- moai_adk/templates/.claude/hooks/moai/shared/utils/announcement_translator.py +206 -0
- moai_adk/templates/.claude/hooks/moai/stop__loop_controller.py +621 -0
- moai_adk/templates/.claude/output-styles/moai/alfred.md +758 -0
- moai_adk/templates/.claude/output-styles/moai/r2d2.md +86 -3
- moai_adk/templates/.claude/output-styles/moai/yoda.md +2 -2
- moai_adk/templates/.claude/settings.json +154 -77
- moai_adk/templates/.claude/skills/moai-docs-generation/SKILL.md +252 -198
- moai_adk/templates/.claude/skills/moai-docs-generation/examples.md +169 -323
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/README.md +39 -27
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/api-documentation.md +115 -125
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/code-documentation.md +150 -150
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/multi-format-output.md +182 -175
- moai_adk/templates/.claude/skills/moai-docs-generation/modules/user-guides.md +198 -138
- moai_adk/templates/.claude/skills/moai-docs-generation/reference.md +226 -320
- moai_adk/templates/.claude/skills/moai-domain-backend/SKILL.md +43 -222
- moai_adk/templates/.claude/skills/moai-domain-database/SKILL.md +75 -219
- moai_adk/templates/.claude/skills/moai-domain-frontend/SKILL.md +103 -463
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/component-architecture.md +723 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/nextjs16-patterns.md +713 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/performance-optimization.md +694 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/react19-patterns.md +591 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/state-management.md +680 -0
- moai_adk/templates/.claude/skills/moai-domain-frontend/modules/vue35-patterns.md +802 -0
- moai_adk/templates/.claude/skills/moai-domain-uiux/SKILL.md +118 -339
- moai_adk/templates/.claude/skills/moai-formats-data/SKILL.md +74 -377
- moai_adk/templates/.claude/skills/moai-formats-data/modules/README.md +299 -70
- moai_adk/templates/.claude/skills/moai-foundation-claude/SKILL.md +205 -182
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/advanced-agent-patterns.md +370 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-cli-reference-official.md +420 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-custom-slash-commands-official.md +32 -22
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-devcontainers-official.md +381 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-discover-plugins-official.md +379 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-headless-official.md +378 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-hooks-official.md +110 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugin-marketplaces-official.md +308 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-plugins-official.md +640 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sandboxing-official.md +282 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-skills-official.md +425 -71
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-statusline-official.md +293 -0
- moai_adk/templates/.claude/skills/moai-foundation-claude/reference/claude-code-sub-agents-official.md +325 -143
- moai_adk/templates/.claude/skills/moai-foundation-context/SKILL.md +96 -316
- moai_adk/templates/.claude/skills/moai-foundation-core/SKILL.md +116 -294
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-advanced.md +279 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-implementation.md +267 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/delegation-patterns.md +121 -650
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/patterns.md +22 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-ears-format.md +200 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-first-tdd.md +37 -730
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/spec-tdd-implementation.md +275 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-framework.md +77 -819
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-implementation.md +244 -0
- moai_adk/templates/.claude/skills/moai-foundation-core/modules/trust-5-validation.md +219 -0
- moai_adk/templates/.claude/skills/moai-foundation-philosopher/SKILL.md +14 -18
- moai_adk/templates/.claude/skills/moai-foundation-quality/SKILL.md +86 -270
- moai_adk/templates/.claude/skills/moai-framework-electron/SKILL.md +288 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/examples.md +2082 -0
- moai_adk/templates/.claude/skills/moai-framework-electron/reference.md +1649 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/SKILL.md +76 -582
- moai_adk/templates/.claude/skills/moai-lang-cpp/examples.md +1239 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/modules/advanced-patterns.md +401 -0
- moai_adk/templates/.claude/skills/moai-lang-cpp/reference.md +1136 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/SKILL.md +82 -436
- moai_adk/templates/.claude/skills/moai-lang-csharp/examples.md +585 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/aspnet-core.md +627 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/blazor-components.md +767 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/cqrs-validation.md +626 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/csharp12-features.md +580 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/modules/efcore-patterns.md +622 -0
- moai_adk/templates/.claude/skills/moai-lang-csharp/reference.md +403 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/SKILL.md +65 -542
- moai_adk/templates/.claude/skills/moai-lang-elixir/examples.md +1171 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/modules/advanced-patterns.md +531 -0
- moai_adk/templates/.claude/skills/moai-lang-elixir/reference.md +889 -0
- moai_adk/templates/.claude/skills/moai-lang-flutter/SKILL.md +32 -405
- moai_adk/templates/.claude/skills/moai-lang-go/SKILL.md +114 -293
- moai_adk/templates/.claude/skills/moai-lang-java/SKILL.md +83 -307
- moai_adk/templates/.claude/skills/moai-lang-javascript/SKILL.md +179 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/examples.md +973 -0
- moai_adk/templates/.claude/skills/moai-lang-javascript/reference.md +1543 -0
- moai_adk/templates/.claude/skills/moai-lang-kotlin/SKILL.md +42 -279
- moai_adk/templates/.claude/skills/moai-lang-php/SKILL.md +94 -556
- moai_adk/templates/.claude/skills/moai-lang-php/examples.md +1608 -0
- moai_adk/templates/.claude/skills/moai-lang-php/modules/advanced-patterns.md +538 -0
- moai_adk/templates/.claude/skills/moai-lang-php/reference.md +1323 -0
- moai_adk/templates/.claude/skills/moai-lang-python/SKILL.md +108 -358
- moai_adk/templates/.claude/skills/moai-lang-r/SKILL.md +84 -482
- moai_adk/templates/.claude/skills/moai-lang-r/examples.md +1154 -0
- moai_adk/templates/.claude/skills/moai-lang-r/modules/advanced-patterns.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-r/reference.md +1087 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/SKILL.md +106 -610
- moai_adk/templates/.claude/skills/moai-lang-ruby/examples.md +1106 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/advanced-patterns.md +309 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/modules/testing-patterns.md +306 -0
- moai_adk/templates/.claude/skills/moai-lang-ruby/reference.md +1024 -0
- moai_adk/templates/.claude/skills/moai-lang-rust/SKILL.md +51 -265
- moai_adk/templates/.claude/skills/moai-lang-scala/SKILL.md +106 -442
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/akka-actors.md +479 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/cats-effect.md +489 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/functional-programming.md +460 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/spark-data.md +498 -0
- moai_adk/templates/.claude/skills/moai-lang-scala/modules/zio-patterns.md +541 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/SKILL.md +88 -457
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/combine-reactive.md +256 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/concurrency.md +270 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swift6-features.md +265 -0
- moai_adk/templates/.claude/skills/moai-lang-swift/modules/swiftui-patterns.md +314 -0
- moai_adk/templates/.claude/skills/moai-lang-typescript/SKILL.md +75 -283
- moai_adk/templates/.claude/skills/moai-library-mermaid/SKILL.md +97 -252
- moai_adk/templates/.claude/skills/moai-library-nextra/SKILL.md +64 -240
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/advanced-patterns.md +331 -12
- moai_adk/templates/.claude/skills/moai-library-nextra/modules/configuration.md +330 -37
- moai_adk/templates/.claude/skills/moai-library-shadcn/SKILL.md +90 -287
- moai_adk/templates/.claude/skills/moai-platform-auth0/SKILL.md +200 -206
- moai_adk/templates/.claude/skills/moai-platform-auth0/examples.md +2446 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/adaptive-mfa.md +233 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/akamai-integration.md +214 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/application-credentials.md +280 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-log-events.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/attack-protection-overview.md +140 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/bot-detection.md +144 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/breached-password-detection.md +187 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/brute-force-protection.md +189 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/certifications.md +282 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/compliance-overview.md +263 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/continuous-session-protection.md +307 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/customize-mfa.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/dpop-implementation.md +283 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/fapi-implementation.md +259 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/gdpr-compliance.md +313 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/guardian-configuration.md +269 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/highly-regulated-identity.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/jwt-fundamentals.md +248 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mdl-verification.md +210 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-api-management.md +278 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-factors.md +226 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mfa-overview.md +174 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/mtls-sender-constraining.md +316 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/ropg-flow-mfa.md +216 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-center.md +325 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/security-guidance.md +277 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/state-parameters.md +177 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/step-up-authentication.md +251 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/suspicious-ip-throttling.md +240 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/tenant-access-control.md +179 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/modules/webauthn-fido.md +235 -0
- moai_adk/templates/.claude/skills/moai-platform-auth0/reference.md +224 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/SKILL.md +75 -330
- moai_adk/templates/.claude/skills/moai-platform-clerk/examples.md +1426 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/modules/advanced-patterns.md +417 -0
- moai_adk/templates/.claude/skills/moai-platform-clerk/reference.md +273 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/SKILL.md +100 -340
- moai_adk/templates/.claude/skills/moai-platform-convex/examples.md +506 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/auth-integration.md +421 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/file-storage.md +474 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/reactive-queries.md +302 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/modules/server-functions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-convex/reference.md +385 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/SKILL.md +113 -326
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/examples.md +514 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/custom-claims.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/phone-auth.md +372 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/modules/social-auth.md +339 -0
- moai_adk/templates/.claude/skills/moai-platform-firebase-auth/reference.md +382 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/SKILL.md +71 -302
- moai_adk/templates/.claude/skills/moai-platform-firestore/examples.md +445 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/offline-cache.md +392 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/realtime-listeners.md +441 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/security-rules.md +352 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/modules/transactions.md +452 -0
- moai_adk/templates/.claude/skills/moai-platform-firestore/reference.md +322 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/SKILL.md +101 -412
- moai_adk/templates/.claude/skills/moai-platform-neon/examples.md +470 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/auto-scaling.md +349 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/branching-workflows.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/connection-pooling.md +412 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/modules/pitr-backups.md +458 -0
- moai_adk/templates/.claude/skills/moai-platform-neon/reference.md +272 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/SKILL.md +96 -327
- moai_adk/templates/.claude/skills/moai-platform-railway/examples.md +539 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/docker-deployment.md +261 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/multi-service.md +291 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/networking-domains.md +338 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/modules/volumes-storage.md +353 -0
- moai_adk/templates/.claude/skills/moai-platform-railway/reference.md +374 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/SKILL.md +103 -428
- moai_adk/templates/.claude/skills/moai-platform-supabase/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/auth-integration.md +384 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/edge-functions.md +371 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/postgresql-pgvector.md +231 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/realtime-presence.md +354 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/row-level-security.md +286 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/storage-cdn.md +319 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/modules/typescript-patterns.md +453 -0
- moai_adk/templates/.claude/skills/moai-platform-supabase/reference.md +284 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/SKILL.md +96 -446
- moai_adk/templates/.claude/skills/moai-platform-vercel/examples.md +502 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/analytics-speed.md +348 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/deployment-config.md +344 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/edge-functions.md +222 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/isr-caching.md +306 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/modules/kv-storage.md +399 -0
- moai_adk/templates/.claude/skills/moai-platform-vercel/reference.md +360 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/SKILL.md +193 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/examples.md +1099 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/language-specific.md +307 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/pattern-syntax.md +237 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/refactoring-patterns.md +260 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/modules/security-rules.md +239 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/reference.md +288 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/go.yml +90 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/python.yml +101 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/languages/typescript.yml +83 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/complexity-check.yml +94 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/quality/deprecated-apis.yml +84 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/secrets-detection.yml +89 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/sql-injection.yml +45 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/security/xss-prevention.yml +50 -0
- moai_adk/templates/.claude/skills/moai-tool-ast-grep/rules/sgconfig.yml +54 -0
- moai_adk/templates/.claude/skills/moai-workflow-jit-docs/SKILL.md +225 -423
- moai_adk/templates/.claude/skills/moai-workflow-loop/SKILL.md +197 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/examples.md +1063 -0
- moai_adk/templates/.claude/skills/moai-workflow-loop/reference.md +1414 -0
- moai_adk/templates/.claude/skills/moai-workflow-project/SKILL.md +211 -314
- moai_adk/templates/.claude/skills/moai-workflow-project/schemas/tab_schema.json +15 -43
- moai_adk/templates/.claude/skills/moai-workflow-spec/SKILL.md +119 -316
- moai_adk/templates/.claude/skills/moai-workflow-spec/modules/advanced-patterns.md +237 -0
- moai_adk/templates/.claude/skills/moai-workflow-templates/SKILL.md +96 -203
- moai_adk/templates/.claude/skills/moai-workflow-testing/SKILL.md +201 -388
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/README.md +52 -3
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/ai-debugging.md +263 -806
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/context7-integration.md +286 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/review-workflows.md +500 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/relevance-analysis.md +154 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/safety-analysis.md +148 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/scoring-algorithms.md +196 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/timeliness-analysis.md +168 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/truthfulness-analysis.md +136 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework/usability-analysis.md +153 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review/trust5-framework.md +257 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/automated-code-review.md +191 -1344
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/analysis-patterns.md +340 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/core-classes.md +299 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/code-review/tool-integration.md +380 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/debugging-workflows.md +451 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/debugging/error-analysis.md +442 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/optimization-patterns.md +473 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance/profiling-techniques.md +481 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/ai-optimization.md +241 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/bottleneck-detection.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/optimization-plan.md +315 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/profiler-core.md +277 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization/real-time-monitoring.md +187 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/performance-optimization.md +287 -1194
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/quality-metrics.md +415 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/ai-workflows.md +620 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/refactoring/patterns.md +692 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/security-analysis.md +429 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/smart-refactoring.md +262 -1192
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/static-analysis.md +438 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd/core-classes.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/advanced-features.md +494 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/red-green-refactor.md +316 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-generation.md +471 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7/test-patterns.md +371 -0
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/tdd-context7.md +227 -1222
- moai_adk/templates/.claude/skills/moai-workflow-testing/modules/trust5-validation.md +428 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/SKILL.md +228 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/integration-patterns.md +149 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/moai-adk-integration.md +245 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-advanced.md +310 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-development.md +202 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/parallel-workflows.md +302 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/registry-architecture.md +271 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/resource-optimization.md +300 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/tools-integration.md +280 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/troubleshooting.md +397 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-commands.md +296 -0
- moai_adk/templates/.claude/skills/moai-workflow-worktree/modules/worktree-management.md +217 -0
- moai_adk/templates/.git-hooks/pre-push +162 -59
- moai_adk/templates/.github/workflows/ci-universal.yml +934 -133
- moai_adk/templates/.gitignore +65 -107
- moai_adk/templates/.lsp.json +152 -0
- moai_adk/templates/.mcp.json +2 -20
- moai_adk/templates/.moai/announcements/en.json +18 -0
- moai_adk/templates/.moai/announcements/ja.json +18 -0
- moai_adk/templates/.moai/announcements/ko.json +18 -0
- moai_adk/templates/.moai/announcements/zh.json +18 -0
- moai_adk/templates/.moai/config/config.yaml +8 -2
- moai_adk/templates/.moai/config/multilingual-triggers.yaml +213 -0
- moai_adk/templates/.moai/config/sections/language.yaml +2 -2
- moai_adk/templates/.moai/config/sections/llm.yaml +41 -0
- moai_adk/templates/.moai/config/sections/pricing.yaml +30 -0
- moai_adk/templates/.moai/config/sections/project.yaml +2 -2
- moai_adk/templates/.moai/config/sections/quality.yaml +43 -5
- moai_adk/templates/.moai/config/sections/ralph.yaml +55 -0
- moai_adk/templates/.moai/config/sections/system.yaml +46 -1
- moai_adk/templates/.moai/config/sections/user.yaml +1 -1
- moai_adk/templates/.moai/config/statusline-config.yaml +2 -2
- moai_adk/templates/.moai/llm-configs/glm.json +22 -0
- moai_adk/templates/CLAUDE.ja.md +343 -0
- moai_adk/templates/CLAUDE.ko.md +343 -0
- moai_adk/templates/CLAUDE.md +200 -499
- moai_adk/templates/CLAUDE.zh.md +343 -0
- moai_adk/utils/common.py +37 -0
- moai_adk/version.py +1 -1
- moai_adk-1.1.0.dist-info/METADATA +2443 -0
- moai_adk-1.1.0.dist-info/RECORD +701 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/entry_points.txt +2 -0
- moai_adk-1.1.0.dist-info/licenses/LICENSE +99 -0
- moai_adk/core/config/auto_spec_config.py +0 -340
- moai_adk/core/hooks/post_tool_auto_spec_completion.py +0 -901
- moai_adk/core/spec/confidence_scoring.py +0 -680
- moai_adk/core/spec/ears_template_engine.py +0 -1247
- moai_adk/core/spec/quality_validator.py +0 -687
- moai_adk/templates/.claude/agents/moai/ai-nano-banana.md +0 -670
- moai_adk/templates/.claude/agents/moai/expert-database.md +0 -777
- moai_adk/templates/.claude/agents/moai/expert-uiux.md +0 -1041
- moai_adk/templates/.claude/agents/moai/mcp-context7.md +0 -458
- moai_adk/templates/.claude/agents/moai/mcp-figma.md +0 -1607
- moai_adk/templates/.claude/agents/moai/mcp-notion.md +0 -789
- moai_adk/templates/.claude/agents/moai/mcp-playwright.md +0 -469
- moai_adk/templates/.claude/agents/moai/mcp-sequential-thinking.md +0 -1032
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/SKILL.md +0 -438
- moai_adk/templates/.claude/skills/moai-ai-nano-banana/examples.md +0 -431
- moai_adk/templates/.claude/skills/moai-domain-uiux/modules/design-system-tokens.md +0 -405
- moai_adk/templates/.claude/skills/moai-library-nextra/advanced-patterns.md +0 -336
- moai_adk/templates/.claude/skills/moai-mcp-figma/SKILL.md +0 -402
- moai_adk/templates/.claude/skills/moai-mcp-figma/advanced-patterns.md +0 -607
- moai_adk/templates/.claude/skills/moai-mcp-notion/SKILL.md +0 -300
- moai_adk/templates/.claude/skills/moai-mcp-notion/advanced-patterns.md +0 -537
- moai_adk/templates/.claude/skills/moai-workflow-project/__init__.py +0 -520
- moai_adk/templates/.claude/skills/moai-workflow-project/complete_workflow_demo_fixed.py +0 -574
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_project_setup.py +0 -317
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/complete_workflow_demo.py +0 -663
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/config-migration-example.json +0 -190
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/question-examples.json +0 -175
- moai_adk/templates/.claude/skills/moai-workflow-project/examples/quick_start.py +0 -196
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/__init__.py +0 -17
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/advanced-patterns.md +0 -158
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/ask_user_integration.py +0 -340
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/batch_questions.py +0 -713
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/config_manager.py +0 -538
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/documentation_manager.py +0 -1336
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/language_initializer.py +0 -730
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/migration_manager.py +0 -608
- moai_adk/templates/.claude/skills/moai-workflow-project/modules/template_optimizer.py +0 -1005
- moai_adk/templates/.claude/skills/moai-workflow-project/test_integration_simple.py +0 -436
- moai_adk/templates/.claude/skills/moai-worktree/SKILL.md +0 -411
- moai_adk/templates/.claude/skills/moai-worktree/modules/integration-patterns.md +0 -982
- moai_adk/templates/.claude/skills/moai-worktree/modules/parallel-development.md +0 -778
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-commands.md +0 -646
- moai_adk/templates/.claude/skills/moai-worktree/modules/worktree-management.md +0 -782
- moai_adk/templates/.moai/config/questions/_schema.yaml +0 -151
- moai_adk/templates/.moai/config/questions/tab0-init.yaml +0 -251
- moai_adk/templates/.moai/config/questions/tab1-user.yaml +0 -108
- moai_adk/templates/.moai/config/questions/tab2-project.yaml +0 -81
- moai_adk/templates/.moai/config/questions/tab3-git.yaml +0 -634
- moai_adk/templates/.moai/config/questions/tab4-quality.yaml +0 -170
- moai_adk/templates/.moai/config/questions/tab5-system.yaml +0 -87
- moai_adk/templates/.moai/scripts/setup-glm.py +0 -136
- moai_adk-0.34.0.dist-info/METADATA +0 -2999
- moai_adk-0.34.0.dist-info/RECORD +0 -463
- moai_adk-0.34.0.dist-info/licenses/LICENSE +0 -21
- /moai_adk/foundation/{git.py → git/__init__.py} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-mermaid/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-library-nextra/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-jit-docs/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{advanced-patterns.md → modules/advanced-patterns.md} +0 -0
- /moai_adk/templates/.claude/skills/moai-workflow-testing/{optimization.md → modules/optimization.md} +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/examples.md +0 -0
- /moai_adk/templates/.claude/skills/{moai-worktree → moai-workflow-worktree}/reference.md +0 -0
- {moai_adk-0.34.0.dist-info → moai_adk-1.1.0.dist-info}/WHEEL +0 -0
|
@@ -0,0 +1,1543 @@
|
|
|
1
|
+
# JavaScript Development Reference
|
|
2
|
+
|
|
3
|
+
## ES2024/ES2025 Complete Reference
|
|
4
|
+
|
|
5
|
+
### ES2024 Feature Matrix
|
|
6
|
+
|
|
7
|
+
| Feature | Description | Use Case |
|
|
8
|
+
|---------|-------------|----------|
|
|
9
|
+
| Set Methods | intersection, union, difference, etc. | Collection operations |
|
|
10
|
+
| Promise.withResolvers | External resolve/reject access | Deferred promises |
|
|
11
|
+
| Immutable Arrays | toSorted, toReversed, toSpliced, with | Functional programming |
|
|
12
|
+
| Object.groupBy | Group array items by key | Data categorization |
|
|
13
|
+
| Unicode String Methods | isWellFormed, toWellFormed | Unicode validation |
|
|
14
|
+
| ArrayBuffer Resizing | resize, transfer methods | Memory management |
|
|
15
|
+
|
|
16
|
+
### ES2025 Feature Matrix
|
|
17
|
+
|
|
18
|
+
| Feature | Description | Use Case |
|
|
19
|
+
|---------|-------------|----------|
|
|
20
|
+
| Import Attributes | with { type: 'json' } | JSON/CSS modules |
|
|
21
|
+
| RegExp.escape | Escape regex special chars | Safe regex patterns |
|
|
22
|
+
| Iterator Helpers | map, filter, take on iterators | Lazy iteration |
|
|
23
|
+
| Float16Array | 16-bit floating point arrays | ML/Graphics |
|
|
24
|
+
| Duplicate Named Capture Groups | Same name in regex alternation | Pattern matching |
|
|
25
|
+
|
|
26
|
+
### Complete Set Operations
|
|
27
|
+
|
|
28
|
+
```javascript
|
|
29
|
+
const setA = new Set([1, 2, 3, 4, 5]);
|
|
30
|
+
const setB = new Set([4, 5, 6, 7, 8]);
|
|
31
|
+
|
|
32
|
+
// Union - all elements from both sets
|
|
33
|
+
const union = setA.union(setB);
|
|
34
|
+
// Set {1, 2, 3, 4, 5, 6, 7, 8}
|
|
35
|
+
|
|
36
|
+
// Intersection - elements in both sets
|
|
37
|
+
const intersection = setA.intersection(setB);
|
|
38
|
+
// Set {4, 5}
|
|
39
|
+
|
|
40
|
+
// Difference - elements in A but not in B
|
|
41
|
+
const difference = setA.difference(setB);
|
|
42
|
+
// Set {1, 2, 3}
|
|
43
|
+
|
|
44
|
+
// Symmetric Difference - elements in either but not both
|
|
45
|
+
const symmetricDiff = setA.symmetricDifference(setB);
|
|
46
|
+
// Set {1, 2, 3, 6, 7, 8}
|
|
47
|
+
|
|
48
|
+
// Subset check - all elements of A are in B
|
|
49
|
+
setA.isSubsetOf(setB); // false
|
|
50
|
+
new Set([4, 5]).isSubsetOf(setB); // true
|
|
51
|
+
|
|
52
|
+
// Superset check - A contains all elements of B
|
|
53
|
+
setA.isSupersetOf(new Set([1, 2])); // true
|
|
54
|
+
|
|
55
|
+
// Disjoint check - no common elements
|
|
56
|
+
setA.isDisjointFrom(new Set([10, 11])); // true
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
### Iterator Helpers (ES2025)
|
|
60
|
+
|
|
61
|
+
```javascript
|
|
62
|
+
function* fibonacci() {
|
|
63
|
+
let a = 0, b = 1;
|
|
64
|
+
while (true) {
|
|
65
|
+
yield a;
|
|
66
|
+
[a, b] = [b, a + b];
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
// Take first 10 Fibonacci numbers
|
|
71
|
+
const first10 = fibonacci().take(10).toArray();
|
|
72
|
+
// [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
|
|
73
|
+
|
|
74
|
+
// Filter and map
|
|
75
|
+
const evenFib = fibonacci()
|
|
76
|
+
.filter(n => n % 2 === 0)
|
|
77
|
+
.map(n => n * 2)
|
|
78
|
+
.take(5)
|
|
79
|
+
.toArray();
|
|
80
|
+
// [0, 4, 16, 68, 288]
|
|
81
|
+
|
|
82
|
+
// Reduce with iterator
|
|
83
|
+
const sum = fibonacci()
|
|
84
|
+
.take(10)
|
|
85
|
+
.reduce((acc, n) => acc + n, 0);
|
|
86
|
+
// 88
|
|
87
|
+
|
|
88
|
+
// forEach on iterator
|
|
89
|
+
fibonacci()
|
|
90
|
+
.take(5)
|
|
91
|
+
.forEach(n => console.log(n));
|
|
92
|
+
|
|
93
|
+
// Find on iterator
|
|
94
|
+
const firstOver100 = fibonacci().find(n => n > 100);
|
|
95
|
+
// 144
|
|
96
|
+
|
|
97
|
+
// Some and every
|
|
98
|
+
fibonacci().take(10).some(n => n > 10); // true
|
|
99
|
+
fibonacci().take(5).every(n => n < 10); // true
|
|
100
|
+
```
|
|
101
|
+
|
|
102
|
+
---
|
|
103
|
+
|
|
104
|
+
## Node.js Runtime Reference
|
|
105
|
+
|
|
106
|
+
### Node.js Version Comparison
|
|
107
|
+
|
|
108
|
+
| Feature | Node.js 20 LTS | Node.js 22 LTS |
|
|
109
|
+
|---------|----------------|----------------|
|
|
110
|
+
| ES Modules | Full support | Full support |
|
|
111
|
+
| Fetch API | Stable | Stable |
|
|
112
|
+
| WebSocket | Experimental | Stable (default) |
|
|
113
|
+
| Watch Mode | Experimental | Stable |
|
|
114
|
+
| TypeScript | Via loaders | Native (strip types) |
|
|
115
|
+
| Permission Model | Experimental | Stable |
|
|
116
|
+
| Test Runner | Stable | Enhanced |
|
|
117
|
+
| Startup Time | Baseline | 30% faster |
|
|
118
|
+
|
|
119
|
+
### Node.js Built-in Test Runner
|
|
120
|
+
|
|
121
|
+
```javascript
|
|
122
|
+
// test/user.test.js
|
|
123
|
+
import { test, describe, before, after, mock } from 'node:test';
|
|
124
|
+
import assert from 'node:assert';
|
|
125
|
+
import { createUser, getUser } from '../src/user.js';
|
|
126
|
+
|
|
127
|
+
describe('User Service', () => {
|
|
128
|
+
let mockDb;
|
|
129
|
+
|
|
130
|
+
before(() => {
|
|
131
|
+
mockDb = mock.fn(() => ({ id: 1, name: 'Test' }));
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
after(() => {
|
|
135
|
+
mock.reset();
|
|
136
|
+
});
|
|
137
|
+
|
|
138
|
+
test('creates user successfully', async (t) => {
|
|
139
|
+
const user = await createUser({ name: 'John', email: 'john@test.com' });
|
|
140
|
+
assert.ok(user.id);
|
|
141
|
+
assert.strictEqual(user.name, 'John');
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
test('throws on duplicate email', async (t) => {
|
|
145
|
+
await assert.rejects(
|
|
146
|
+
async () => createUser({ name: 'Jane', email: 'existing@test.com' }),
|
|
147
|
+
{ code: 'DUPLICATE_EMAIL' }
|
|
148
|
+
);
|
|
149
|
+
});
|
|
150
|
+
|
|
151
|
+
test('skipped test', { skip: true }, () => {
|
|
152
|
+
// This test will be skipped
|
|
153
|
+
});
|
|
154
|
+
|
|
155
|
+
test('todo test', { todo: 'implement later' }, () => {
|
|
156
|
+
// This test is marked as todo
|
|
157
|
+
});
|
|
158
|
+
});
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
Run tests:
|
|
162
|
+
```bash
|
|
163
|
+
# Run all tests
|
|
164
|
+
node --test
|
|
165
|
+
|
|
166
|
+
# Run specific file
|
|
167
|
+
node --test test/user.test.js
|
|
168
|
+
|
|
169
|
+
# With coverage
|
|
170
|
+
node --test --experimental-test-coverage
|
|
171
|
+
|
|
172
|
+
# Watch mode
|
|
173
|
+
node --test --watch
|
|
174
|
+
|
|
175
|
+
# Parallel execution
|
|
176
|
+
node --test --test-concurrency=4
|
|
177
|
+
```
|
|
178
|
+
|
|
179
|
+
### Module System Deep Dive
|
|
180
|
+
|
|
181
|
+
Package.json Configuration:
|
|
182
|
+
```json
|
|
183
|
+
{
|
|
184
|
+
"name": "my-package",
|
|
185
|
+
"version": "1.0.0",
|
|
186
|
+
"type": "module",
|
|
187
|
+
"main": "./dist/index.cjs",
|
|
188
|
+
"module": "./dist/index.js",
|
|
189
|
+
"exports": {
|
|
190
|
+
".": {
|
|
191
|
+
"import": "./dist/index.js",
|
|
192
|
+
"require": "./dist/index.cjs",
|
|
193
|
+
"types": "./dist/index.d.ts"
|
|
194
|
+
},
|
|
195
|
+
"./utils": {
|
|
196
|
+
"import": "./dist/utils.js",
|
|
197
|
+
"require": "./dist/utils.cjs"
|
|
198
|
+
}
|
|
199
|
+
},
|
|
200
|
+
"engines": {
|
|
201
|
+
"node": ">=20.0.0"
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
```
|
|
205
|
+
|
|
206
|
+
ESM/CommonJS Interoperability:
|
|
207
|
+
```javascript
|
|
208
|
+
// ESM importing CommonJS
|
|
209
|
+
import cjsModule from 'commonjs-package';
|
|
210
|
+
import { createRequire } from 'node:module';
|
|
211
|
+
|
|
212
|
+
const require = createRequire(import.meta.url);
|
|
213
|
+
const cjsPackage = require('commonjs-only-package');
|
|
214
|
+
|
|
215
|
+
// Get __dirname and __filename in ESM
|
|
216
|
+
import { fileURLToPath } from 'node:url';
|
|
217
|
+
import { dirname } from 'node:path';
|
|
218
|
+
|
|
219
|
+
const __filename = fileURLToPath(import.meta.url);
|
|
220
|
+
const __dirname = dirname(__filename);
|
|
221
|
+
|
|
222
|
+
// Dynamic import (works in both)
|
|
223
|
+
const module = await import('./dynamic-module.js');
|
|
224
|
+
```
|
|
225
|
+
|
|
226
|
+
---
|
|
227
|
+
|
|
228
|
+
## Package Manager Comparison
|
|
229
|
+
|
|
230
|
+
| Feature | npm | yarn | pnpm | bun |
|
|
231
|
+
|---------|-----|------|------|-----|
|
|
232
|
+
| Speed | Baseline | Faster | Fastest Node | Fastest overall |
|
|
233
|
+
| Disk Usage | High | High | Low (symlinks) | Low |
|
|
234
|
+
| Workspaces | Yes | Yes | Yes | Yes |
|
|
235
|
+
| Lockfile | package-lock.json | yarn.lock | pnpm-lock.yaml | bun.lockb |
|
|
236
|
+
| Plug'n'Play | No | Yes | No | No |
|
|
237
|
+
| Node.js Only | Yes | Yes | Yes | No (own runtime) |
|
|
238
|
+
|
|
239
|
+
### pnpm Commands
|
|
240
|
+
|
|
241
|
+
```bash
|
|
242
|
+
# Initialize
|
|
243
|
+
pnpm init
|
|
244
|
+
|
|
245
|
+
# Install dependencies
|
|
246
|
+
pnpm install
|
|
247
|
+
pnpm add express
|
|
248
|
+
pnpm add -D vitest
|
|
249
|
+
|
|
250
|
+
# Workspaces
|
|
251
|
+
pnpm -r install # Install all workspaces
|
|
252
|
+
pnpm --filter=api test # Run in specific workspace
|
|
253
|
+
|
|
254
|
+
# Performance
|
|
255
|
+
pnpm store prune # Clean unused packages
|
|
256
|
+
pnpm dedupe # Deduplicate dependencies
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
### Bun Commands
|
|
260
|
+
|
|
261
|
+
```bash
|
|
262
|
+
# Initialize
|
|
263
|
+
bun init
|
|
264
|
+
|
|
265
|
+
# Install (30x faster than npm)
|
|
266
|
+
bun install
|
|
267
|
+
bun add express
|
|
268
|
+
bun add -d vitest
|
|
269
|
+
|
|
270
|
+
# Run scripts
|
|
271
|
+
bun run dev
|
|
272
|
+
bun run test
|
|
273
|
+
|
|
274
|
+
# Execute files directly (native TypeScript/JSX support)
|
|
275
|
+
bun run server.js
|
|
276
|
+
bun run app.ts
|
|
277
|
+
bun run app.tsx
|
|
278
|
+
|
|
279
|
+
# Built-in bundler
|
|
280
|
+
bun build ./src/index.ts --outdir=./dist
|
|
281
|
+
bun build ./index.html --outdir=./dist # HTML bundling
|
|
282
|
+
bun build --splitting # Code splitting
|
|
283
|
+
bun build --minify # Minification
|
|
284
|
+
|
|
285
|
+
# Compile to standalone executable
|
|
286
|
+
bun build --compile ./src/index.ts --outfile=myapp
|
|
287
|
+
|
|
288
|
+
# Run tests
|
|
289
|
+
bun test
|
|
290
|
+
bun test --watch
|
|
291
|
+
bun test --coverage
|
|
292
|
+
bun test --bail # Stop on first failure
|
|
293
|
+
|
|
294
|
+
# Hot reloading (state preserved)
|
|
295
|
+
bun --hot server.ts
|
|
296
|
+
```
|
|
297
|
+
|
|
298
|
+
---
|
|
299
|
+
|
|
300
|
+
## Bun Complete API Reference
|
|
301
|
+
|
|
302
|
+
### Bun.serve() - HTTP Server
|
|
303
|
+
|
|
304
|
+
Basic Server:
|
|
305
|
+
```typescript
|
|
306
|
+
const server = Bun.serve({
|
|
307
|
+
port: 3000,
|
|
308
|
+
hostname: "0.0.0.0",
|
|
309
|
+
fetch(req) {
|
|
310
|
+
const url = new URL(req.url);
|
|
311
|
+
if (url.pathname === "/") return new Response("Hello!");
|
|
312
|
+
if (url.pathname === "/json") {
|
|
313
|
+
return Response.json({ message: "Hello JSON" });
|
|
314
|
+
}
|
|
315
|
+
return new Response("Not Found", { status: 404 });
|
|
316
|
+
},
|
|
317
|
+
error(error) {
|
|
318
|
+
return new Response(`Error: ${error.message}`, { status: 500 });
|
|
319
|
+
},
|
|
320
|
+
});
|
|
321
|
+
console.log(`Server running at ${server.url}`);
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
Routes Configuration (Bun 1.2.3+):
|
|
325
|
+
```typescript
|
|
326
|
+
Bun.serve({
|
|
327
|
+
routes: {
|
|
328
|
+
// Static routes
|
|
329
|
+
"/api/status": new Response("OK"),
|
|
330
|
+
|
|
331
|
+
// Dynamic routes with parameters
|
|
332
|
+
"/users/:id": req => new Response(`User ${req.params.id}`),
|
|
333
|
+
|
|
334
|
+
// Per-method handlers
|
|
335
|
+
"/api/posts": {
|
|
336
|
+
GET: () => Response.json({ posts: [] }),
|
|
337
|
+
POST: async req => {
|
|
338
|
+
const body = await req.json();
|
|
339
|
+
return Response.json({ created: true, ...body }, { status: 201 });
|
|
340
|
+
},
|
|
341
|
+
},
|
|
342
|
+
|
|
343
|
+
// Wildcard routes
|
|
344
|
+
"/api/*": Response.json({ error: "Not found" }, { status: 404 }),
|
|
345
|
+
|
|
346
|
+
// Static file serving
|
|
347
|
+
"/favicon.ico": Bun.file("./favicon.ico"),
|
|
348
|
+
},
|
|
349
|
+
|
|
350
|
+
// Fallback handler
|
|
351
|
+
fetch(req) {
|
|
352
|
+
return new Response("Not Found", { status: 404 });
|
|
353
|
+
},
|
|
354
|
+
});
|
|
355
|
+
```
|
|
356
|
+
|
|
357
|
+
TLS/HTTPS Configuration:
|
|
358
|
+
```typescript
|
|
359
|
+
Bun.serve({
|
|
360
|
+
port: 443,
|
|
361
|
+
tls: {
|
|
362
|
+
cert: Bun.file("./cert.pem"),
|
|
363
|
+
key: Bun.file("./key.pem"),
|
|
364
|
+
ca: Bun.file("./ca.pem"), // Optional CA certificate
|
|
365
|
+
passphrase: "secret", // Optional key passphrase
|
|
366
|
+
},
|
|
367
|
+
fetch(req) {
|
|
368
|
+
return new Response("Secure!");
|
|
369
|
+
},
|
|
370
|
+
});
|
|
371
|
+
```
|
|
372
|
+
|
|
373
|
+
WebSocket Server with Full Options:
|
|
374
|
+
```typescript
|
|
375
|
+
Bun.serve({
|
|
376
|
+
port: 3001,
|
|
377
|
+
fetch(req, server) {
|
|
378
|
+
const success = server.upgrade(req, {
|
|
379
|
+
data: { userId: crypto.randomUUID() }, // Per-connection data
|
|
380
|
+
});
|
|
381
|
+
if (success) return undefined;
|
|
382
|
+
return new Response("Upgrade failed", { status: 400 });
|
|
383
|
+
},
|
|
384
|
+
websocket: {
|
|
385
|
+
open(ws) {
|
|
386
|
+
ws.subscribe("chat"); // Subscribe to topic
|
|
387
|
+
console.log("Connected:", ws.data.userId);
|
|
388
|
+
},
|
|
389
|
+
message(ws, message) {
|
|
390
|
+
ws.publish("chat", message); // Publish to all subscribers
|
|
391
|
+
ws.send(`Echo: ${message}`);
|
|
392
|
+
},
|
|
393
|
+
close(ws, code, reason) {
|
|
394
|
+
ws.unsubscribe("chat");
|
|
395
|
+
console.log("Disconnected:", code, reason);
|
|
396
|
+
},
|
|
397
|
+
// Advanced options
|
|
398
|
+
maxPayloadLength: 16 * 1024 * 1024, // 16MB max message size
|
|
399
|
+
backpressureLimit: 1024 * 1024, // 1MB backpressure limit
|
|
400
|
+
idleTimeout: 120, // 2 minutes idle timeout
|
|
401
|
+
perMessageDeflate: true, // Enable compression
|
|
402
|
+
sendPings: true, // Send ping frames
|
|
403
|
+
},
|
|
404
|
+
});
|
|
405
|
+
```
|
|
406
|
+
|
|
407
|
+
Server Metrics and Lifecycle:
|
|
408
|
+
```typescript
|
|
409
|
+
const server = Bun.serve({
|
|
410
|
+
fetch(req, server) {
|
|
411
|
+
// Get client IP
|
|
412
|
+
const ip = server.requestIP(req);
|
|
413
|
+
|
|
414
|
+
// Set custom timeout for this request
|
|
415
|
+
server.timeout(req, 60); // 60 seconds
|
|
416
|
+
|
|
417
|
+
return Response.json({
|
|
418
|
+
activeRequests: server.pendingRequests,
|
|
419
|
+
activeWebSockets: server.pendingWebSockets,
|
|
420
|
+
chatUsers: server.subscriberCount("chat"),
|
|
421
|
+
clientIP: ip?.address,
|
|
422
|
+
});
|
|
423
|
+
},
|
|
424
|
+
});
|
|
425
|
+
|
|
426
|
+
// Hot reload routes without restart
|
|
427
|
+
server.reload({
|
|
428
|
+
routes: {
|
|
429
|
+
"/api/version": () => Response.json({ version: "2.0.0" }),
|
|
430
|
+
},
|
|
431
|
+
});
|
|
432
|
+
|
|
433
|
+
// Graceful shutdown
|
|
434
|
+
await server.stop(); // Wait for in-flight requests
|
|
435
|
+
await server.stop(true); // Force close all connections
|
|
436
|
+
```
|
|
437
|
+
|
|
438
|
+
### Bun.file() - File Operations
|
|
439
|
+
|
|
440
|
+
Reading Files:
|
|
441
|
+
```typescript
|
|
442
|
+
const file = Bun.file("./data.txt");
|
|
443
|
+
|
|
444
|
+
// File metadata
|
|
445
|
+
file.size; // number of bytes
|
|
446
|
+
file.type; // MIME type
|
|
447
|
+
await file.exists(); // boolean
|
|
448
|
+
|
|
449
|
+
// Reading methods
|
|
450
|
+
const text = await file.text(); // string
|
|
451
|
+
const json = await file.json(); // parsed JSON
|
|
452
|
+
const bytes = await file.bytes(); // Uint8Array
|
|
453
|
+
const buffer = await file.arrayBuffer(); // ArrayBuffer
|
|
454
|
+
const stream = file.stream(); // ReadableStream
|
|
455
|
+
|
|
456
|
+
// Partial reads (HTTP Range header)
|
|
457
|
+
const first1KB = await file.slice(0, 1024).text();
|
|
458
|
+
const last500 = await file.slice(-500).text();
|
|
459
|
+
|
|
460
|
+
// File references
|
|
461
|
+
Bun.file(1234); // file descriptor
|
|
462
|
+
Bun.file(new URL(import.meta.url)); // file:// URL
|
|
463
|
+
Bun.file("data.json", { type: "application/json" }); // custom MIME
|
|
464
|
+
```
|
|
465
|
+
|
|
466
|
+
Writing Files:
|
|
467
|
+
```typescript
|
|
468
|
+
// Simple writes (returns bytes written)
|
|
469
|
+
await Bun.write("./output.txt", "Hello, Bun!");
|
|
470
|
+
await Bun.write("./data.json", JSON.stringify({ key: "value" }));
|
|
471
|
+
|
|
472
|
+
// Copy file
|
|
473
|
+
await Bun.write(Bun.file("output.txt"), Bun.file("input.txt"));
|
|
474
|
+
|
|
475
|
+
// Write from Response
|
|
476
|
+
const response = await fetch("https://example.com");
|
|
477
|
+
await Bun.write("index.html", response);
|
|
478
|
+
|
|
479
|
+
// Write to stdout
|
|
480
|
+
await Bun.write(Bun.stdout, "Hello stdout!\n");
|
|
481
|
+
|
|
482
|
+
// Delete file
|
|
483
|
+
await Bun.file("temp.txt").delete();
|
|
484
|
+
```
|
|
485
|
+
|
|
486
|
+
Incremental Writing (FileSink):
|
|
487
|
+
```typescript
|
|
488
|
+
const file = Bun.file("large-output.txt");
|
|
489
|
+
const writer = file.writer({ highWaterMark: 1024 * 1024 }); // 1MB buffer
|
|
490
|
+
|
|
491
|
+
writer.write("First chunk\n");
|
|
492
|
+
writer.write("Second chunk\n");
|
|
493
|
+
writer.flush(); // Flush buffer to disk
|
|
494
|
+
writer.end(); // Flush and close
|
|
495
|
+
|
|
496
|
+
// Control process lifecycle
|
|
497
|
+
writer.unref(); // Allow process to exit
|
|
498
|
+
writer.ref(); // Re-ref later
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
### Bun Shell
|
|
502
|
+
|
|
503
|
+
Basic Usage:
|
|
504
|
+
```typescript
|
|
505
|
+
import { $ } from "bun";
|
|
506
|
+
|
|
507
|
+
// Execute commands
|
|
508
|
+
await $`echo "Hello World!"`;
|
|
509
|
+
|
|
510
|
+
// Get output
|
|
511
|
+
const text = await $`ls -la`.text();
|
|
512
|
+
const json = await $`cat config.json`.json();
|
|
513
|
+
const blob = await $`cat image.png`.blob();
|
|
514
|
+
|
|
515
|
+
// Iterate lines
|
|
516
|
+
for await (const line of $`cat file.txt`.lines()) {
|
|
517
|
+
console.log(line);
|
|
518
|
+
}
|
|
519
|
+
```
|
|
520
|
+
|
|
521
|
+
Piping and Redirection:
|
|
522
|
+
```typescript
|
|
523
|
+
// Pipe commands
|
|
524
|
+
const wordCount = await $`echo "Hello World!" | wc -w`.text();
|
|
525
|
+
|
|
526
|
+
// Redirect to file
|
|
527
|
+
await $`echo "Hello" > greeting.txt`;
|
|
528
|
+
await $`echo "More" >> greeting.txt`; // Append
|
|
529
|
+
|
|
530
|
+
// Redirect stderr
|
|
531
|
+
await $`command 2> error.log`;
|
|
532
|
+
await $`command &> all.log`; // Both stdout and stderr
|
|
533
|
+
|
|
534
|
+
// JavaScript object as stdin
|
|
535
|
+
const response = new Response("input data");
|
|
536
|
+
await $`cat < ${response} | wc -c`;
|
|
537
|
+
```
|
|
538
|
+
|
|
539
|
+
Environment and Working Directory:
|
|
540
|
+
```typescript
|
|
541
|
+
// Inline environment
|
|
542
|
+
await $`FOO=bar bun -e 'console.log(process.env.FOO)'`;
|
|
543
|
+
|
|
544
|
+
// Per-command environment
|
|
545
|
+
await $`echo $API_KEY`.env({ ...process.env, API_KEY: "secret" });
|
|
546
|
+
|
|
547
|
+
// Global environment
|
|
548
|
+
$.env({ NODE_ENV: "production" });
|
|
549
|
+
|
|
550
|
+
// Working directory
|
|
551
|
+
await $`pwd`.cwd("/tmp");
|
|
552
|
+
$.cwd("/home/user");
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
Error Handling:
|
|
556
|
+
```typescript
|
|
557
|
+
// Default: throws on non-zero exit code
|
|
558
|
+
try {
|
|
559
|
+
await $`failing-command`.text();
|
|
560
|
+
} catch (err) {
|
|
561
|
+
console.log(`Exit code: ${err.exitCode}`);
|
|
562
|
+
console.log(err.stdout.toString());
|
|
563
|
+
console.log(err.stderr.toString());
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
// Disable throwing
|
|
567
|
+
const { stdout, stderr, exitCode } = await $`command`.nothrow().quiet();
|
|
568
|
+
|
|
569
|
+
// Global configuration
|
|
570
|
+
$.nothrow(); // Don't throw by default
|
|
571
|
+
$.throws(true); // Restore default
|
|
572
|
+
```
|
|
573
|
+
|
|
574
|
+
### Bun SQLite
|
|
575
|
+
|
|
576
|
+
Database Connection:
|
|
577
|
+
```typescript
|
|
578
|
+
import { Database } from "bun:sqlite";
|
|
579
|
+
|
|
580
|
+
// File-based
|
|
581
|
+
const db = new Database("mydb.sqlite");
|
|
582
|
+
|
|
583
|
+
// In-memory
|
|
584
|
+
const memoryDb = new Database(":memory:");
|
|
585
|
+
|
|
586
|
+
// Options
|
|
587
|
+
const db = new Database("mydb.sqlite", {
|
|
588
|
+
readonly: true, // Read-only mode
|
|
589
|
+
create: true, // Create if not exists
|
|
590
|
+
strict: true, // Enable strict mode
|
|
591
|
+
safeIntegers: true, // Return bigint for large integers
|
|
592
|
+
});
|
|
593
|
+
|
|
594
|
+
// Import via attribute
|
|
595
|
+
import db from "./mydb.sqlite" with { type: "sqlite" };
|
|
596
|
+
|
|
597
|
+
// WAL mode (recommended for performance)
|
|
598
|
+
db.run("PRAGMA journal_mode = WAL;");
|
|
599
|
+
```
|
|
600
|
+
|
|
601
|
+
Prepared Statements:
|
|
602
|
+
```typescript
|
|
603
|
+
// Create table
|
|
604
|
+
db.run(`
|
|
605
|
+
CREATE TABLE IF NOT EXISTS users (
|
|
606
|
+
id INTEGER PRIMARY KEY AUTOINCREMENT,
|
|
607
|
+
name TEXT NOT NULL,
|
|
608
|
+
email TEXT UNIQUE
|
|
609
|
+
)
|
|
610
|
+
`);
|
|
611
|
+
|
|
612
|
+
// Prepare and execute
|
|
613
|
+
const insertUser = db.prepare(
|
|
614
|
+
"INSERT INTO users (name, email) VALUES ($name, $email)"
|
|
615
|
+
);
|
|
616
|
+
insertUser.run({ $name: "John", $email: "john@example.com" });
|
|
617
|
+
|
|
618
|
+
// Query methods
|
|
619
|
+
const getUser = db.prepare("SELECT * FROM users WHERE id = ?");
|
|
620
|
+
const user = getUser.get(1); // Single row as object
|
|
621
|
+
const users = getUser.all(); // All rows as array
|
|
622
|
+
const values = getUser.values(); // All rows as arrays
|
|
623
|
+
const result = getUser.run(); // { lastInsertRowid, changes }
|
|
624
|
+
|
|
625
|
+
// Iterate lazily
|
|
626
|
+
for (const row of getUser.iterate()) {
|
|
627
|
+
console.log(row);
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
// Map to class
|
|
631
|
+
class User {
|
|
632
|
+
id: number;
|
|
633
|
+
name: string;
|
|
634
|
+
get displayName() { return `User: ${this.name}`; }
|
|
635
|
+
}
|
|
636
|
+
const users = db.query("SELECT * FROM users").as(User).all();
|
|
637
|
+
```
|
|
638
|
+
|
|
639
|
+
Transactions:
|
|
640
|
+
```typescript
|
|
641
|
+
const insertUser = db.prepare("INSERT INTO users (name) VALUES (?)");
|
|
642
|
+
|
|
643
|
+
// Transaction function
|
|
644
|
+
const insertMany = db.transaction((names: string[]) => {
|
|
645
|
+
for (const name of names) {
|
|
646
|
+
insertUser.run(name);
|
|
647
|
+
}
|
|
648
|
+
return names.length;
|
|
649
|
+
});
|
|
650
|
+
|
|
651
|
+
const count = insertMany(["Alice", "Bob", "Charlie"]);
|
|
652
|
+
|
|
653
|
+
// Transaction types
|
|
654
|
+
insertMany(data); // BEGIN
|
|
655
|
+
insertMany.deferred(data); // BEGIN DEFERRED
|
|
656
|
+
insertMany.immediate(data); // BEGIN IMMEDIATE
|
|
657
|
+
insertMany.exclusive(data); // BEGIN EXCLUSIVE
|
|
658
|
+
```
|
|
659
|
+
|
|
660
|
+
### Bun Test
|
|
661
|
+
|
|
662
|
+
Test Structure:
|
|
663
|
+
```typescript
|
|
664
|
+
import { describe, it, test, expect, beforeAll, beforeEach, afterEach, afterAll, mock } from "bun:test";
|
|
665
|
+
|
|
666
|
+
describe("User Service", () => {
|
|
667
|
+
beforeAll(() => { /* Setup once */ });
|
|
668
|
+
beforeEach(() => { /* Setup each */ });
|
|
669
|
+
afterEach(() => { /* Cleanup each */ });
|
|
670
|
+
afterAll(() => { /* Cleanup once */ });
|
|
671
|
+
|
|
672
|
+
it("should create a user", () => {
|
|
673
|
+
expect({ name: "John" }).toEqual({ name: "John" });
|
|
674
|
+
});
|
|
675
|
+
|
|
676
|
+
test("async operations", async () => {
|
|
677
|
+
const data = await fetchData();
|
|
678
|
+
expect(data).toBeDefined();
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
// Concurrent tests
|
|
682
|
+
test.concurrent("parallel test 1", async () => { /* ... */ });
|
|
683
|
+
test.concurrent("parallel test 2", async () => { /* ... */ });
|
|
684
|
+
|
|
685
|
+
// Skip and todo
|
|
686
|
+
test.skip("skipped test", () => { /* ... */ });
|
|
687
|
+
test.todo("implement later");
|
|
688
|
+
});
|
|
689
|
+
```
|
|
690
|
+
|
|
691
|
+
Mocking:
|
|
692
|
+
```typescript
|
|
693
|
+
import { mock, spyOn } from "bun:test";
|
|
694
|
+
|
|
695
|
+
// Mock function
|
|
696
|
+
const fn = mock(() => 42);
|
|
697
|
+
fn();
|
|
698
|
+
expect(fn).toHaveBeenCalled();
|
|
699
|
+
expect(fn).toHaveBeenCalledTimes(1);
|
|
700
|
+
|
|
701
|
+
// Spy on existing
|
|
702
|
+
const spy = spyOn(console, "log");
|
|
703
|
+
console.log("test");
|
|
704
|
+
expect(spy).toHaveBeenCalledWith("test");
|
|
705
|
+
```
|
|
706
|
+
|
|
707
|
+
Snapshots:
|
|
708
|
+
```typescript
|
|
709
|
+
test("snapshot", () => {
|
|
710
|
+
expect({ a: 1, b: 2 }).toMatchSnapshot();
|
|
711
|
+
});
|
|
712
|
+
|
|
713
|
+
// Update: bun test --update-snapshots
|
|
714
|
+
```
|
|
715
|
+
|
|
716
|
+
Test Commands:
|
|
717
|
+
```bash
|
|
718
|
+
bun test # Run all tests
|
|
719
|
+
bun test --watch # Watch mode
|
|
720
|
+
bun test --coverage # Code coverage
|
|
721
|
+
bun test --bail # Stop on first failure
|
|
722
|
+
bun test --timeout 10000 # 10s timeout
|
|
723
|
+
bun test -t "pattern" # Filter by name
|
|
724
|
+
bun test --concurrent # Parallel execution
|
|
725
|
+
bun test --reporter=junit # JUnit XML output
|
|
726
|
+
```
|
|
727
|
+
|
|
728
|
+
### Bun S3 Client
|
|
729
|
+
|
|
730
|
+
Basic Operations:
|
|
731
|
+
```typescript
|
|
732
|
+
import { s3, S3Client } from "bun";
|
|
733
|
+
|
|
734
|
+
// Read from S3
|
|
735
|
+
const file = s3.file("data/config.json");
|
|
736
|
+
const data = await file.json();
|
|
737
|
+
const text = await file.text();
|
|
738
|
+
const bytes = await file.bytes();
|
|
739
|
+
const stream = file.stream();
|
|
740
|
+
|
|
741
|
+
// Partial read
|
|
742
|
+
const first1KB = await file.slice(0, 1024).text();
|
|
743
|
+
|
|
744
|
+
// Write to S3
|
|
745
|
+
await file.write("Hello World!");
|
|
746
|
+
await file.write(JSON.stringify(data), { type: "application/json" });
|
|
747
|
+
|
|
748
|
+
// Delete
|
|
749
|
+
await file.delete();
|
|
750
|
+
|
|
751
|
+
// Check existence
|
|
752
|
+
const exists = await file.exists();
|
|
753
|
+
const size = await file.size();
|
|
754
|
+
```
|
|
755
|
+
|
|
756
|
+
Presigned URLs:
|
|
757
|
+
```typescript
|
|
758
|
+
// Download URL
|
|
759
|
+
const downloadUrl = s3.presign("my-file.txt", {
|
|
760
|
+
expiresIn: 3600, // 1 hour
|
|
761
|
+
});
|
|
762
|
+
|
|
763
|
+
// Upload URL
|
|
764
|
+
const uploadUrl = s3.presign("my-file.txt", {
|
|
765
|
+
method: "PUT",
|
|
766
|
+
expiresIn: 3600,
|
|
767
|
+
type: "application/json",
|
|
768
|
+
acl: "public-read",
|
|
769
|
+
});
|
|
770
|
+
```
|
|
771
|
+
|
|
772
|
+
S3 Client Configuration:
|
|
773
|
+
```typescript
|
|
774
|
+
const client = new S3Client({
|
|
775
|
+
accessKeyId: process.env.S3_ACCESS_KEY_ID,
|
|
776
|
+
secretAccessKey: process.env.S3_SECRET_ACCESS_KEY,
|
|
777
|
+
bucket: "my-bucket",
|
|
778
|
+
region: "us-east-1",
|
|
779
|
+
// Or use endpoint for S3-compatible services
|
|
780
|
+
endpoint: "https://s3.us-east-1.amazonaws.com",
|
|
781
|
+
});
|
|
782
|
+
|
|
783
|
+
// Works with: AWS S3, Cloudflare R2, DigitalOcean Spaces,
|
|
784
|
+
// MinIO, Google Cloud Storage, Supabase Storage
|
|
785
|
+
```
|
|
786
|
+
|
|
787
|
+
Large File Streaming:
|
|
788
|
+
```typescript
|
|
789
|
+
const writer = s3.file("large-file.bin").writer({
|
|
790
|
+
retry: 3,
|
|
791
|
+
queueSize: 10,
|
|
792
|
+
partSize: 5 * 1024 * 1024, // 5MB chunks
|
|
793
|
+
});
|
|
794
|
+
|
|
795
|
+
for (const chunk of largeData) {
|
|
796
|
+
writer.write(chunk);
|
|
797
|
+
await writer.flush();
|
|
798
|
+
}
|
|
799
|
+
await writer.end();
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
### Bun Glob
|
|
803
|
+
|
|
804
|
+
Pattern Matching:
|
|
805
|
+
```typescript
|
|
806
|
+
import { Glob } from "bun";
|
|
807
|
+
|
|
808
|
+
// Create glob instance
|
|
809
|
+
const glob = new Glob("**/*.ts");
|
|
810
|
+
|
|
811
|
+
// Async iteration
|
|
812
|
+
for await (const file of glob.scan(".")) {
|
|
813
|
+
console.log(file);
|
|
814
|
+
}
|
|
815
|
+
|
|
816
|
+
// Sync iteration
|
|
817
|
+
for (const file of glob.scanSync(".")) {
|
|
818
|
+
console.log(file);
|
|
819
|
+
}
|
|
820
|
+
|
|
821
|
+
// String matching
|
|
822
|
+
glob.match("src/index.ts"); // true
|
|
823
|
+
glob.match("src/index.js"); // false
|
|
824
|
+
```
|
|
825
|
+
|
|
826
|
+
Scan Options:
|
|
827
|
+
```typescript
|
|
828
|
+
const glob = new Glob("**/*.ts");
|
|
829
|
+
|
|
830
|
+
for await (const file of glob.scan({
|
|
831
|
+
cwd: "./src",
|
|
832
|
+
dot: true, // Include dotfiles
|
|
833
|
+
absolute: true, // Return absolute paths
|
|
834
|
+
followSymlinks: true, // Follow symlinks
|
|
835
|
+
onlyFiles: true, // Files only (default)
|
|
836
|
+
})) {
|
|
837
|
+
console.log(file);
|
|
838
|
+
}
|
|
839
|
+
```
|
|
840
|
+
|
|
841
|
+
Pattern Syntax:
|
|
842
|
+
```typescript
|
|
843
|
+
// Single character: ?
|
|
844
|
+
new Glob("???.ts").match("foo.ts"); // true
|
|
845
|
+
|
|
846
|
+
// Zero or more chars (no path sep): *
|
|
847
|
+
new Glob("*.ts").match("index.ts"); // true
|
|
848
|
+
new Glob("*.ts").match("src/index.ts"); // false
|
|
849
|
+
|
|
850
|
+
// Any chars including path sep: **
|
|
851
|
+
new Glob("**/*.ts").match("src/index.ts"); // true
|
|
852
|
+
|
|
853
|
+
// Character sets: [abc], [a-z], [^abc]
|
|
854
|
+
new Glob("ba[rz].ts").match("bar.ts"); // true
|
|
855
|
+
new Glob("ba[!a-z].ts").match("ba1.ts"); // true
|
|
856
|
+
|
|
857
|
+
// Alternation: {a,b,c}
|
|
858
|
+
new Glob("{src,lib}/**/*.ts").match("src/index.ts"); // true
|
|
859
|
+
|
|
860
|
+
// Negation: !
|
|
861
|
+
new Glob("!node_modules/**").match("src/index.ts"); // true
|
|
862
|
+
```
|
|
863
|
+
|
|
864
|
+
### Bun Semver
|
|
865
|
+
|
|
866
|
+
Version Comparison:
|
|
867
|
+
```typescript
|
|
868
|
+
import { semver } from "bun";
|
|
869
|
+
|
|
870
|
+
// Check if version satisfies range
|
|
871
|
+
semver.satisfies("1.0.0", "^1.0.0"); // true
|
|
872
|
+
semver.satisfies("2.0.0", "^1.0.0"); // false
|
|
873
|
+
semver.satisfies("1.0.0", "~1.0.0"); // true
|
|
874
|
+
semver.satisfies("1.0.0", "1.0.x"); // true
|
|
875
|
+
semver.satisfies("1.0.0", "1.0.0 - 2.0.0"); // true
|
|
876
|
+
|
|
877
|
+
// Compare versions
|
|
878
|
+
semver.order("1.0.0", "1.0.0"); // 0
|
|
879
|
+
semver.order("1.0.0", "1.0.1"); // -1
|
|
880
|
+
semver.order("1.0.1", "1.0.0"); // 1
|
|
881
|
+
|
|
882
|
+
// Sort versions
|
|
883
|
+
const versions = ["1.0.0", "1.0.1", "1.0.0-alpha", "1.0.0-beta"];
|
|
884
|
+
versions.sort(semver.order);
|
|
885
|
+
// ["1.0.0-alpha", "1.0.0-beta", "1.0.0", "1.0.1"]
|
|
886
|
+
```
|
|
887
|
+
|
|
888
|
+
### Bun DNS
|
|
889
|
+
|
|
890
|
+
DNS Resolution:
|
|
891
|
+
```typescript
|
|
892
|
+
import { dns } from "bun";
|
|
893
|
+
import * as nodeDns from "node:dns";
|
|
894
|
+
|
|
895
|
+
// Prefetch DNS (optimization)
|
|
896
|
+
dns.prefetch("api.example.com", 443);
|
|
897
|
+
|
|
898
|
+
// Get cache stats
|
|
899
|
+
const stats = dns.getCacheStats();
|
|
900
|
+
console.log(stats);
|
|
901
|
+
// { cacheHitsCompleted, cacheHitsInflight, cacheMisses, size, errors, totalCount }
|
|
902
|
+
|
|
903
|
+
// Node.js compatible API
|
|
904
|
+
const addrs = await nodeDns.promises.resolve4("bun.sh", { ttl: true });
|
|
905
|
+
// [{ address: "172.67.161.226", family: 4, ttl: 0 }, ...]
|
|
906
|
+
```
|
|
907
|
+
|
|
908
|
+
### Bun Bundler
|
|
909
|
+
|
|
910
|
+
Build API:
|
|
911
|
+
```typescript
|
|
912
|
+
const result = await Bun.build({
|
|
913
|
+
entrypoints: ["./src/index.ts"],
|
|
914
|
+
outdir: "./dist",
|
|
915
|
+
target: "browser", // browser, bun, node
|
|
916
|
+
format: "esm", // esm, cjs, iife
|
|
917
|
+
splitting: true, // Code splitting
|
|
918
|
+
minify: true, // Full minification
|
|
919
|
+
sourcemap: "linked", // none, linked, external, inline
|
|
920
|
+
|
|
921
|
+
// Environment variables
|
|
922
|
+
env: "PUBLIC_*", // Inline PUBLIC_* vars
|
|
923
|
+
|
|
924
|
+
// External modules
|
|
925
|
+
external: ["lodash"],
|
|
926
|
+
|
|
927
|
+
// Custom loaders
|
|
928
|
+
loader: {
|
|
929
|
+
".png": "dataurl",
|
|
930
|
+
".txt": "file",
|
|
931
|
+
},
|
|
932
|
+
|
|
933
|
+
// Naming patterns
|
|
934
|
+
naming: {
|
|
935
|
+
entry: "[dir]/[name].[ext]",
|
|
936
|
+
chunk: "[name]-[hash].[ext]",
|
|
937
|
+
asset: "[name]-[hash].[ext]",
|
|
938
|
+
},
|
|
939
|
+
|
|
940
|
+
// Public path for CDN
|
|
941
|
+
publicPath: "https://cdn.example.com/",
|
|
942
|
+
|
|
943
|
+
// Define replacements
|
|
944
|
+
define: {
|
|
945
|
+
"process.env.VERSION": JSON.stringify("1.0.0"),
|
|
946
|
+
},
|
|
947
|
+
|
|
948
|
+
// Drop function calls
|
|
949
|
+
drop: ["console", "debugger"],
|
|
950
|
+
|
|
951
|
+
// Plugins
|
|
952
|
+
plugins: [myPlugin],
|
|
953
|
+
});
|
|
954
|
+
|
|
955
|
+
if (!result.success) {
|
|
956
|
+
console.error(result.logs);
|
|
957
|
+
}
|
|
958
|
+
```
|
|
959
|
+
|
|
960
|
+
HTML Bundling:
|
|
961
|
+
```typescript
|
|
962
|
+
// Build static site
|
|
963
|
+
await Bun.build({
|
|
964
|
+
entrypoints: ["./index.html", "./about.html"],
|
|
965
|
+
outdir: "./dist",
|
|
966
|
+
minify: true,
|
|
967
|
+
});
|
|
968
|
+
|
|
969
|
+
// Or run dev server
|
|
970
|
+
// bun ./index.html
|
|
971
|
+
```
|
|
972
|
+
|
|
973
|
+
### Bun Plugins
|
|
974
|
+
|
|
975
|
+
Plugin Structure:
|
|
976
|
+
```typescript
|
|
977
|
+
import type { BunPlugin } from "bun";
|
|
978
|
+
|
|
979
|
+
const myPlugin: BunPlugin = {
|
|
980
|
+
name: "my-plugin",
|
|
981
|
+
setup(build) {
|
|
982
|
+
// Runs when bundle starts
|
|
983
|
+
build.onStart(() => {
|
|
984
|
+
console.log("Bundle started!");
|
|
985
|
+
});
|
|
986
|
+
|
|
987
|
+
// Custom module resolution
|
|
988
|
+
build.onResolve({ filter: /^virtual:/ }, args => {
|
|
989
|
+
return { path: args.path, namespace: "virtual" };
|
|
990
|
+
});
|
|
991
|
+
|
|
992
|
+
// Custom module loading
|
|
993
|
+
build.onLoad({ filter: /.*/, namespace: "virtual" }, args => {
|
|
994
|
+
return {
|
|
995
|
+
contents: `export default "Virtual module: ${args.path}"`,
|
|
996
|
+
loader: "js",
|
|
997
|
+
};
|
|
998
|
+
});
|
|
999
|
+
},
|
|
1000
|
+
};
|
|
1001
|
+
|
|
1002
|
+
await Bun.build({
|
|
1003
|
+
entrypoints: ["./index.ts"],
|
|
1004
|
+
plugins: [myPlugin],
|
|
1005
|
+
});
|
|
1006
|
+
```
|
|
1007
|
+
|
|
1008
|
+
### Bun Macros
|
|
1009
|
+
|
|
1010
|
+
Bundle-Time Execution:
|
|
1011
|
+
```typescript
|
|
1012
|
+
// getVersion.ts
|
|
1013
|
+
export function getVersion() {
|
|
1014
|
+
const { stdout } = Bun.spawnSync({
|
|
1015
|
+
cmd: ["git", "rev-parse", "HEAD"],
|
|
1016
|
+
stdout: "pipe",
|
|
1017
|
+
});
|
|
1018
|
+
return stdout.toString().trim();
|
|
1019
|
+
}
|
|
1020
|
+
|
|
1021
|
+
// app.ts
|
|
1022
|
+
import { getVersion } from "./getVersion.ts" with { type: "macro" };
|
|
1023
|
+
|
|
1024
|
+
// Executed at bundle-time, result inlined
|
|
1025
|
+
console.log(`Version: ${getVersion()}`);
|
|
1026
|
+
```
|
|
1027
|
+
|
|
1028
|
+
Fetch at Bundle-Time:
|
|
1029
|
+
```typescript
|
|
1030
|
+
// fetchData.ts
|
|
1031
|
+
export async function fetchConfig(url: string) {
|
|
1032
|
+
const response = await fetch(url);
|
|
1033
|
+
return response.json();
|
|
1034
|
+
}
|
|
1035
|
+
|
|
1036
|
+
// app.ts
|
|
1037
|
+
import { fetchConfig } from "./fetchData.ts" with { type: "macro" };
|
|
1038
|
+
|
|
1039
|
+
// Config fetched during build, not runtime
|
|
1040
|
+
const config = fetchConfig("https://api.example.com/config");
|
|
1041
|
+
```
|
|
1042
|
+
|
|
1043
|
+
### Bun Hot Reloading
|
|
1044
|
+
|
|
1045
|
+
State-Preserving Reload:
|
|
1046
|
+
```typescript
|
|
1047
|
+
// server.ts
|
|
1048
|
+
declare global {
|
|
1049
|
+
var count: number;
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
globalThis.count ??= 0;
|
|
1053
|
+
globalThis.count++;
|
|
1054
|
+
|
|
1055
|
+
Bun.serve({
|
|
1056
|
+
fetch(req) {
|
|
1057
|
+
return new Response(`Reloaded ${globalThis.count} times`);
|
|
1058
|
+
},
|
|
1059
|
+
port: 3000,
|
|
1060
|
+
});
|
|
1061
|
+
|
|
1062
|
+
// Run with: bun --hot server.ts
|
|
1063
|
+
// Changes reload without restarting process
|
|
1064
|
+
// Global state (globalThis) preserved
|
|
1065
|
+
```
|
|
1066
|
+
|
|
1067
|
+
### Bun Workers
|
|
1068
|
+
|
|
1069
|
+
Web Workers:
|
|
1070
|
+
```typescript
|
|
1071
|
+
// worker.ts
|
|
1072
|
+
declare var self: Worker;
|
|
1073
|
+
|
|
1074
|
+
self.onmessage = (event: MessageEvent) => {
|
|
1075
|
+
const result = heavyComputation(event.data);
|
|
1076
|
+
self.postMessage(result);
|
|
1077
|
+
};
|
|
1078
|
+
|
|
1079
|
+
function heavyComputation(input: number): number {
|
|
1080
|
+
return input * 2;
|
|
1081
|
+
}
|
|
1082
|
+
|
|
1083
|
+
// main.ts
|
|
1084
|
+
const worker = new Worker(new URL("./worker.ts", import.meta.url));
|
|
1085
|
+
|
|
1086
|
+
worker.onmessage = (event) => {
|
|
1087
|
+
console.log("Result:", event.data);
|
|
1088
|
+
};
|
|
1089
|
+
|
|
1090
|
+
worker.postMessage(42);
|
|
1091
|
+
```
|
|
1092
|
+
|
|
1093
|
+
### Bun Utilities
|
|
1094
|
+
|
|
1095
|
+
Password Hashing:
|
|
1096
|
+
```typescript
|
|
1097
|
+
const hash = await Bun.password.hash("mypassword", {
|
|
1098
|
+
algorithm: "argon2id", // argon2id, argon2i, argon2d, bcrypt
|
|
1099
|
+
memoryCost: 65536,
|
|
1100
|
+
timeCost: 3,
|
|
1101
|
+
});
|
|
1102
|
+
|
|
1103
|
+
const isValid = await Bun.password.verify("mypassword", hash);
|
|
1104
|
+
```
|
|
1105
|
+
|
|
1106
|
+
Other Utilities:
|
|
1107
|
+
```typescript
|
|
1108
|
+
// Sleep
|
|
1109
|
+
await Bun.sleep(1000); // 1 second
|
|
1110
|
+
|
|
1111
|
+
// UUID v7 (time-ordered)
|
|
1112
|
+
const uuid = Bun.randomUUIDv7();
|
|
1113
|
+
|
|
1114
|
+
// Environment variables (auto-loads .env)
|
|
1115
|
+
const apiKey = Bun.env.API_KEY;
|
|
1116
|
+
|
|
1117
|
+
// Peek at promises without awaiting
|
|
1118
|
+
const status = Bun.peek(promise); // pending, fulfilled, rejected
|
|
1119
|
+
|
|
1120
|
+
// Deep equals
|
|
1121
|
+
Bun.deepEquals({ a: 1 }, { a: 1 }); // true
|
|
1122
|
+
|
|
1123
|
+
// Escape HTML
|
|
1124
|
+
Bun.escapeHTML("<script>alert('xss')</script>");
|
|
1125
|
+
|
|
1126
|
+
// Resolve import path
|
|
1127
|
+
const path = Bun.resolveSync("./module", import.meta.dir);
|
|
1128
|
+
```
|
|
1129
|
+
|
|
1130
|
+
---
|
|
1131
|
+
|
|
1132
|
+
## Framework Reference
|
|
1133
|
+
|
|
1134
|
+
### Express Middleware Patterns
|
|
1135
|
+
|
|
1136
|
+
```javascript
|
|
1137
|
+
import express from 'express';
|
|
1138
|
+
import helmet from 'helmet';
|
|
1139
|
+
import compression from 'compression';
|
|
1140
|
+
import rateLimit from 'express-rate-limit';
|
|
1141
|
+
|
|
1142
|
+
const app = express();
|
|
1143
|
+
|
|
1144
|
+
// Security middleware
|
|
1145
|
+
app.use(helmet());
|
|
1146
|
+
app.use(compression());
|
|
1147
|
+
|
|
1148
|
+
// Rate limiting
|
|
1149
|
+
const limiter = rateLimit({
|
|
1150
|
+
windowMs: 15 * 60 * 1000, // 15 minutes
|
|
1151
|
+
max: 100, // limit each IP to 100 requests per windowMs
|
|
1152
|
+
standardHeaders: true,
|
|
1153
|
+
legacyHeaders: false,
|
|
1154
|
+
});
|
|
1155
|
+
app.use('/api/', limiter);
|
|
1156
|
+
|
|
1157
|
+
// Request logging
|
|
1158
|
+
app.use((req, res, next) => {
|
|
1159
|
+
const start = Date.now();
|
|
1160
|
+
res.on('finish', () => {
|
|
1161
|
+
console.log(`${req.method} ${req.url} ${res.statusCode} ${Date.now() - start}ms`);
|
|
1162
|
+
});
|
|
1163
|
+
next();
|
|
1164
|
+
});
|
|
1165
|
+
|
|
1166
|
+
// Error handling middleware
|
|
1167
|
+
app.use((err, req, res, next) => {
|
|
1168
|
+
console.error(err.stack);
|
|
1169
|
+
res.status(err.status || 500).json({
|
|
1170
|
+
error: {
|
|
1171
|
+
message: err.message,
|
|
1172
|
+
...(process.env.NODE_ENV === 'development' && { stack: err.stack }),
|
|
1173
|
+
},
|
|
1174
|
+
});
|
|
1175
|
+
});
|
|
1176
|
+
```
|
|
1177
|
+
|
|
1178
|
+
### Fastify Plugin Architecture
|
|
1179
|
+
|
|
1180
|
+
```javascript
|
|
1181
|
+
import Fastify from 'fastify';
|
|
1182
|
+
import fastifySwagger from '@fastify/swagger';
|
|
1183
|
+
import fastifySwaggerUi from '@fastify/swagger-ui';
|
|
1184
|
+
import fastifyCors from '@fastify/cors';
|
|
1185
|
+
|
|
1186
|
+
const fastify = Fastify({
|
|
1187
|
+
logger: {
|
|
1188
|
+
level: 'info',
|
|
1189
|
+
transport: {
|
|
1190
|
+
target: 'pino-pretty',
|
|
1191
|
+
},
|
|
1192
|
+
},
|
|
1193
|
+
});
|
|
1194
|
+
|
|
1195
|
+
// Register plugins
|
|
1196
|
+
await fastify.register(fastifyCors, { origin: true });
|
|
1197
|
+
|
|
1198
|
+
await fastify.register(fastifySwagger, {
|
|
1199
|
+
openapi: {
|
|
1200
|
+
info: {
|
|
1201
|
+
title: 'My API',
|
|
1202
|
+
version: '1.0.0',
|
|
1203
|
+
},
|
|
1204
|
+
},
|
|
1205
|
+
});
|
|
1206
|
+
|
|
1207
|
+
await fastify.register(fastifySwaggerUi, {
|
|
1208
|
+
routePrefix: '/docs',
|
|
1209
|
+
});
|
|
1210
|
+
|
|
1211
|
+
// Custom plugin
|
|
1212
|
+
const myPlugin = async (fastify, options) => {
|
|
1213
|
+
fastify.decorate('db', options.database);
|
|
1214
|
+
|
|
1215
|
+
fastify.addHook('onRequest', async (request) => {
|
|
1216
|
+
request.startTime = Date.now();
|
|
1217
|
+
});
|
|
1218
|
+
|
|
1219
|
+
fastify.addHook('onResponse', async (request, reply) => {
|
|
1220
|
+
const duration = Date.now() - request.startTime;
|
|
1221
|
+
fastify.log.info({ duration, url: request.url }, 'request completed');
|
|
1222
|
+
});
|
|
1223
|
+
};
|
|
1224
|
+
|
|
1225
|
+
fastify.register(myPlugin, { database: db });
|
|
1226
|
+
```
|
|
1227
|
+
|
|
1228
|
+
### Hono Adapters and Middleware
|
|
1229
|
+
|
|
1230
|
+
```javascript
|
|
1231
|
+
import { Hono } from 'hono';
|
|
1232
|
+
import { serve } from '@hono/node-server';
|
|
1233
|
+
import { cors } from 'hono/cors';
|
|
1234
|
+
import { logger } from 'hono/logger';
|
|
1235
|
+
import { secureHeaders } from 'hono/secure-headers';
|
|
1236
|
+
import { jwt } from 'hono/jwt';
|
|
1237
|
+
import { zValidator } from '@hono/zod-validator';
|
|
1238
|
+
import { z } from 'zod';
|
|
1239
|
+
|
|
1240
|
+
const app = new Hono();
|
|
1241
|
+
|
|
1242
|
+
// Middleware stack
|
|
1243
|
+
app.use('*', logger());
|
|
1244
|
+
app.use('*', secureHeaders());
|
|
1245
|
+
app.use('/api/*', cors());
|
|
1246
|
+
|
|
1247
|
+
// JWT authentication
|
|
1248
|
+
app.use('/api/protected/*', jwt({ secret: process.env.JWT_SECRET }));
|
|
1249
|
+
|
|
1250
|
+
// Zod validation
|
|
1251
|
+
const createUserSchema = z.object({
|
|
1252
|
+
name: z.string().min(2).max(100),
|
|
1253
|
+
email: z.string().email(),
|
|
1254
|
+
});
|
|
1255
|
+
|
|
1256
|
+
app.post('/api/users',
|
|
1257
|
+
zValidator('json', createUserSchema),
|
|
1258
|
+
async (c) => {
|
|
1259
|
+
const data = c.req.valid('json');
|
|
1260
|
+
const user = await db.users.create(data);
|
|
1261
|
+
return c.json(user, 201);
|
|
1262
|
+
}
|
|
1263
|
+
);
|
|
1264
|
+
|
|
1265
|
+
// Error handling
|
|
1266
|
+
app.onError((err, c) => {
|
|
1267
|
+
console.error(err);
|
|
1268
|
+
return c.json({ error: err.message }, 500);
|
|
1269
|
+
});
|
|
1270
|
+
|
|
1271
|
+
// Not found handler
|
|
1272
|
+
app.notFound((c) => c.json({ error: 'Not found' }, 404));
|
|
1273
|
+
|
|
1274
|
+
// Node.js adapter
|
|
1275
|
+
serve({ fetch: app.fetch, port: 3000 });
|
|
1276
|
+
|
|
1277
|
+
// Or export for Cloudflare Workers, Deno, Bun
|
|
1278
|
+
export default app;
|
|
1279
|
+
```
|
|
1280
|
+
|
|
1281
|
+
---
|
|
1282
|
+
|
|
1283
|
+
## Testing Reference
|
|
1284
|
+
|
|
1285
|
+
### Vitest vs Jest Comparison
|
|
1286
|
+
|
|
1287
|
+
| Feature | Vitest | Jest |
|
|
1288
|
+
|---------|--------|------|
|
|
1289
|
+
| Speed | 4x faster cold, instant HMR | Baseline |
|
|
1290
|
+
| ESM Support | Native | Requires config |
|
|
1291
|
+
| TypeScript | Native | Via ts-jest/babel |
|
|
1292
|
+
| Configuration | vite.config.js | jest.config.js |
|
|
1293
|
+
| Watch Mode | Instant rerun | Full rerun |
|
|
1294
|
+
| Snapshot Testing | Yes | Yes |
|
|
1295
|
+
| Coverage | v8/istanbul | istanbul |
|
|
1296
|
+
| Concurrent Tests | Per-file default | Optional |
|
|
1297
|
+
|
|
1298
|
+
### Vitest Mocking Patterns
|
|
1299
|
+
|
|
1300
|
+
```javascript
|
|
1301
|
+
import { vi, describe, it, expect, beforeEach, afterEach } from 'vitest';
|
|
1302
|
+
import { fetchUser, createUser } from './user.js';
|
|
1303
|
+
|
|
1304
|
+
// Mock module
|
|
1305
|
+
vi.mock('./database.js', () => ({
|
|
1306
|
+
db: {
|
|
1307
|
+
users: {
|
|
1308
|
+
findById: vi.fn(),
|
|
1309
|
+
create: vi.fn(),
|
|
1310
|
+
},
|
|
1311
|
+
},
|
|
1312
|
+
}));
|
|
1313
|
+
|
|
1314
|
+
import { db } from './database.js';
|
|
1315
|
+
|
|
1316
|
+
describe('User functions', () => {
|
|
1317
|
+
beforeEach(() => {
|
|
1318
|
+
vi.clearAllMocks();
|
|
1319
|
+
});
|
|
1320
|
+
|
|
1321
|
+
afterEach(() => {
|
|
1322
|
+
vi.restoreAllMocks();
|
|
1323
|
+
});
|
|
1324
|
+
|
|
1325
|
+
it('fetches user from database', async () => {
|
|
1326
|
+
const mockUser = { id: 1, name: 'John' };
|
|
1327
|
+
db.users.findById.mockResolvedValue(mockUser);
|
|
1328
|
+
|
|
1329
|
+
const user = await fetchUser(1);
|
|
1330
|
+
|
|
1331
|
+
expect(db.users.findById).toHaveBeenCalledWith(1);
|
|
1332
|
+
expect(user).toEqual(mockUser);
|
|
1333
|
+
});
|
|
1334
|
+
|
|
1335
|
+
it('handles fetch errors', async () => {
|
|
1336
|
+
db.users.findById.mockRejectedValue(new Error('DB Error'));
|
|
1337
|
+
|
|
1338
|
+
await expect(fetchUser(1)).rejects.toThrow('DB Error');
|
|
1339
|
+
});
|
|
1340
|
+
|
|
1341
|
+
// Spy on existing implementation
|
|
1342
|
+
it('spies on console.log', () => {
|
|
1343
|
+
const spy = vi.spyOn(console, 'log');
|
|
1344
|
+
console.log('test');
|
|
1345
|
+
expect(spy).toHaveBeenCalledWith('test');
|
|
1346
|
+
});
|
|
1347
|
+
|
|
1348
|
+
// Timer mocks
|
|
1349
|
+
it('handles timers', async () => {
|
|
1350
|
+
vi.useFakeTimers();
|
|
1351
|
+
|
|
1352
|
+
const callback = vi.fn();
|
|
1353
|
+
setTimeout(callback, 1000);
|
|
1354
|
+
|
|
1355
|
+
vi.advanceTimersByTime(1000);
|
|
1356
|
+
expect(callback).toHaveBeenCalled();
|
|
1357
|
+
|
|
1358
|
+
vi.useRealTimers();
|
|
1359
|
+
});
|
|
1360
|
+
});
|
|
1361
|
+
```
|
|
1362
|
+
|
|
1363
|
+
---
|
|
1364
|
+
|
|
1365
|
+
## Build Tools Reference
|
|
1366
|
+
|
|
1367
|
+
### Vite Configuration
|
|
1368
|
+
|
|
1369
|
+
```javascript
|
|
1370
|
+
// vite.config.js
|
|
1371
|
+
import { defineConfig } from 'vite';
|
|
1372
|
+
import { resolve } from 'path';
|
|
1373
|
+
|
|
1374
|
+
export default defineConfig({
|
|
1375
|
+
build: {
|
|
1376
|
+
target: 'es2022',
|
|
1377
|
+
outDir: 'dist',
|
|
1378
|
+
lib: {
|
|
1379
|
+
entry: resolve(__dirname, 'src/index.js'),
|
|
1380
|
+
name: 'MyLib',
|
|
1381
|
+
formats: ['es', 'cjs'],
|
|
1382
|
+
fileName: (format) => `index.${format === 'es' ? 'js' : 'cjs'}`,
|
|
1383
|
+
},
|
|
1384
|
+
rollupOptions: {
|
|
1385
|
+
external: ['express', 'fastify'],
|
|
1386
|
+
output: {
|
|
1387
|
+
manualChunks: {
|
|
1388
|
+
vendor: ['lodash-es'],
|
|
1389
|
+
},
|
|
1390
|
+
},
|
|
1391
|
+
},
|
|
1392
|
+
minify: 'esbuild',
|
|
1393
|
+
sourcemap: true,
|
|
1394
|
+
},
|
|
1395
|
+
esbuild: {
|
|
1396
|
+
target: 'es2022',
|
|
1397
|
+
keepNames: true,
|
|
1398
|
+
},
|
|
1399
|
+
server: {
|
|
1400
|
+
port: 3000,
|
|
1401
|
+
hmr: true,
|
|
1402
|
+
},
|
|
1403
|
+
});
|
|
1404
|
+
```
|
|
1405
|
+
|
|
1406
|
+
### esbuild Direct Usage
|
|
1407
|
+
|
|
1408
|
+
```javascript
|
|
1409
|
+
// build.js
|
|
1410
|
+
import * as esbuild from 'esbuild';
|
|
1411
|
+
|
|
1412
|
+
await esbuild.build({
|
|
1413
|
+
entryPoints: ['src/index.js'],
|
|
1414
|
+
bundle: true,
|
|
1415
|
+
minify: true,
|
|
1416
|
+
sourcemap: true,
|
|
1417
|
+
target: ['es2022'],
|
|
1418
|
+
platform: 'node',
|
|
1419
|
+
format: 'esm',
|
|
1420
|
+
outdir: 'dist',
|
|
1421
|
+
external: ['express', 'pg'],
|
|
1422
|
+
define: {
|
|
1423
|
+
'process.env.NODE_ENV': '"production"',
|
|
1424
|
+
},
|
|
1425
|
+
});
|
|
1426
|
+
|
|
1427
|
+
// Watch mode
|
|
1428
|
+
const ctx = await esbuild.context({
|
|
1429
|
+
entryPoints: ['src/index.js'],
|
|
1430
|
+
bundle: true,
|
|
1431
|
+
outdir: 'dist',
|
|
1432
|
+
});
|
|
1433
|
+
|
|
1434
|
+
await ctx.watch();
|
|
1435
|
+
console.log('watching...');
|
|
1436
|
+
```
|
|
1437
|
+
|
|
1438
|
+
---
|
|
1439
|
+
|
|
1440
|
+
## Context7 Library Mappings
|
|
1441
|
+
|
|
1442
|
+
### Primary Libraries
|
|
1443
|
+
|
|
1444
|
+
```
|
|
1445
|
+
/nodejs/node - Node.js runtime
|
|
1446
|
+
/expressjs/express - Express web framework
|
|
1447
|
+
/fastify/fastify - Fastify web framework
|
|
1448
|
+
/honojs/hono - Hono web framework
|
|
1449
|
+
/koajs/koa - Koa web framework
|
|
1450
|
+
```
|
|
1451
|
+
|
|
1452
|
+
### Testing
|
|
1453
|
+
|
|
1454
|
+
```
|
|
1455
|
+
/vitest-dev/vitest - Vitest testing framework
|
|
1456
|
+
/jestjs/jest - Jest testing framework
|
|
1457
|
+
/testing-library - Testing Library
|
|
1458
|
+
```
|
|
1459
|
+
|
|
1460
|
+
### Build Tools
|
|
1461
|
+
|
|
1462
|
+
```
|
|
1463
|
+
/vitejs/vite - Vite build tool
|
|
1464
|
+
/evanw/esbuild - esbuild bundler
|
|
1465
|
+
/rollup/rollup - Rollup bundler
|
|
1466
|
+
/biomejs/biome - Biome linter/formatter
|
|
1467
|
+
/eslint/eslint - ESLint linter
|
|
1468
|
+
```
|
|
1469
|
+
|
|
1470
|
+
### Utilities
|
|
1471
|
+
|
|
1472
|
+
```
|
|
1473
|
+
/lodash/lodash - Lodash utilities
|
|
1474
|
+
/date-fns/date-fns - Date utilities
|
|
1475
|
+
/axios/axios - HTTP client
|
|
1476
|
+
/prisma/prisma - Prisma ORM
|
|
1477
|
+
```
|
|
1478
|
+
|
|
1479
|
+
---
|
|
1480
|
+
|
|
1481
|
+
## Security Best Practices
|
|
1482
|
+
|
|
1483
|
+
### Input Validation
|
|
1484
|
+
|
|
1485
|
+
```javascript
|
|
1486
|
+
import { z } from 'zod';
|
|
1487
|
+
|
|
1488
|
+
const userSchema = z.object({
|
|
1489
|
+
name: z.string().min(1).max(100).trim(),
|
|
1490
|
+
email: z.string().email().toLowerCase(),
|
|
1491
|
+
age: z.number().int().min(0).max(150).optional(),
|
|
1492
|
+
});
|
|
1493
|
+
|
|
1494
|
+
function validateUser(input) {
|
|
1495
|
+
const result = userSchema.safeParse(input);
|
|
1496
|
+
if (!result.success) {
|
|
1497
|
+
throw new Error(result.error.issues[0].message);
|
|
1498
|
+
}
|
|
1499
|
+
return result.data;
|
|
1500
|
+
}
|
|
1501
|
+
```
|
|
1502
|
+
|
|
1503
|
+
### Environment Variable Validation
|
|
1504
|
+
|
|
1505
|
+
```javascript
|
|
1506
|
+
import { z } from 'zod';
|
|
1507
|
+
|
|
1508
|
+
const envSchema = z.object({
|
|
1509
|
+
NODE_ENV: z.enum(['development', 'production', 'test']),
|
|
1510
|
+
PORT: z.string().transform(Number).pipe(z.number().min(1).max(65535)),
|
|
1511
|
+
DATABASE_URL: z.string().url(),
|
|
1512
|
+
JWT_SECRET: z.string().min(32),
|
|
1513
|
+
});
|
|
1514
|
+
|
|
1515
|
+
const env = envSchema.parse(process.env);
|
|
1516
|
+
export default env;
|
|
1517
|
+
```
|
|
1518
|
+
|
|
1519
|
+
### Secure HTTP Headers
|
|
1520
|
+
|
|
1521
|
+
```javascript
|
|
1522
|
+
import helmet from 'helmet';
|
|
1523
|
+
|
|
1524
|
+
app.use(helmet({
|
|
1525
|
+
contentSecurityPolicy: {
|
|
1526
|
+
directives: {
|
|
1527
|
+
defaultSrc: ["'self'"],
|
|
1528
|
+
scriptSrc: ["'self'"],
|
|
1529
|
+
styleSrc: ["'self'", "'unsafe-inline'"],
|
|
1530
|
+
imgSrc: ["'self'", "data:", "https:"],
|
|
1531
|
+
},
|
|
1532
|
+
},
|
|
1533
|
+
crossOriginEmbedderPolicy: true,
|
|
1534
|
+
crossOriginOpenerPolicy: true,
|
|
1535
|
+
crossOriginResourcePolicy: { policy: "same-origin" },
|
|
1536
|
+
hsts: { maxAge: 31536000, includeSubDomains: true },
|
|
1537
|
+
}));
|
|
1538
|
+
```
|
|
1539
|
+
|
|
1540
|
+
---
|
|
1541
|
+
|
|
1542
|
+
Last Updated: 2026-01-05
|
|
1543
|
+
Version: 1.1.0
|