ads-fe 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +99 -0
- package/dist/cli.js +545 -0
- package/dist/meta.js +93 -0
- package/package.json +43 -0
- package/skill.md +66 -0
- package/skills/core/SKILL.md +66 -0
- package/skills/core/references/app-development.md +45 -0
- package/skills/core/references/git.md +66 -0
- package/skills/core/references/monorepo.md +124 -0
- package/skills/element-plus-vue3/LICENSE.md +405 -0
- package/skills/element-plus-vue3/LICENSE.txt +202 -0
- package/skills/element-plus-vue3/SKILL.md +218 -0
- package/skills/element-plus-vue3/SYNC.md +5 -0
- package/skills/element-plus-vue3/api/component-api.md +94 -0
- package/skills/element-plus-vue3/api/global-config.md +89 -0
- package/skills/element-plus-vue3/api/props-and-events.md +101 -0
- package/skills/element-plus-vue3/examples/components/button.md +99 -0
- package/skills/element-plus-vue3/examples/components/date-picker.md +115 -0
- package/skills/element-plus-vue3/examples/components/dialog.md +106 -0
- package/skills/element-plus-vue3/examples/components/form.md +127 -0
- package/skills/element-plus-vue3/examples/components/input.md +123 -0
- package/skills/element-plus-vue3/examples/components/message.md +93 -0
- package/skills/element-plus-vue3/examples/components/overview.md +59 -0
- package/skills/element-plus-vue3/examples/components/select.md +133 -0
- package/skills/element-plus-vue3/examples/components/table.md +166 -0
- package/skills/element-plus-vue3/examples/guide/design.md +68 -0
- package/skills/element-plus-vue3/examples/guide/global-config.md +95 -0
- package/skills/element-plus-vue3/examples/guide/i18n.md +95 -0
- package/skills/element-plus-vue3/examples/guide/installation.md +110 -0
- package/skills/element-plus-vue3/examples/guide/quick-start.md +103 -0
- package/skills/element-plus-vue3/examples/guide/theme.md +78 -0
- package/skills/element-plus-vue3/templates/component-usage.md +92 -0
- package/skills/element-plus-vue3/templates/installation.md +82 -0
- package/skills/element-plus-vue3/templates/project-setup.md +83 -0
- package/skills/node/LICENSE.md +21 -0
- package/skills/node/SKILL.md +94 -0
- package/skills/node/SYNC.md +5 -0
- package/skills/node/rules/assets/graceful-server.test.ts +88 -0
- package/skills/node/rules/assets/graceful-server.ts +80 -0
- package/skills/node/rules/async-patterns.md +136 -0
- package/skills/node/rules/caching.md +198 -0
- package/skills/node/rules/environment.md +253 -0
- package/skills/node/rules/error-handling.md +164 -0
- package/skills/node/rules/flaky-tests.md +439 -0
- package/skills/node/rules/graceful-shutdown.md +204 -0
- package/skills/node/rules/logging.md +205 -0
- package/skills/node/rules/modules.md +105 -0
- package/skills/node/rules/node-modules-exploration.md +172 -0
- package/skills/node/rules/performance.md +130 -0
- package/skills/node/rules/profiling.md +183 -0
- package/skills/node/rules/streams.md +213 -0
- package/skills/node/rules/stuck-processes-and-tests.md +124 -0
- package/skills/node/rules/testing.md +218 -0
- package/skills/node/rules/typescript.md +262 -0
- package/skills/node/tile.json +11 -0
- package/skills/nuxt/GENERATION.md +5 -0
- package/skills/nuxt/LICENSE.md +21 -0
- package/skills/nuxt/SKILL.md +55 -0
- package/skills/nuxt/SYNC.md +5 -0
- package/skills/nuxt/references/advanced-hooks.md +289 -0
- package/skills/nuxt/references/advanced-layers.md +299 -0
- package/skills/nuxt/references/advanced-module-authoring.md +554 -0
- package/skills/nuxt/references/best-practices-data-fetching.md +357 -0
- package/skills/nuxt/references/best-practices-ssr.md +355 -0
- package/skills/nuxt/references/core-cli.md +263 -0
- package/skills/nuxt/references/core-config.md +162 -0
- package/skills/nuxt/references/core-data-fetching.md +236 -0
- package/skills/nuxt/references/core-deployment.md +224 -0
- package/skills/nuxt/references/core-directory-structure.md +269 -0
- package/skills/nuxt/references/core-modules.md +292 -0
- package/skills/nuxt/references/core-routing.md +226 -0
- package/skills/nuxt/references/features-components-autoimport.md +328 -0
- package/skills/nuxt/references/features-components.md +264 -0
- package/skills/nuxt/references/features-composables.md +276 -0
- package/skills/nuxt/references/features-server.md +265 -0
- package/skills/nuxt/references/features-state.md +194 -0
- package/skills/nuxt/references/rendering-modes.md +237 -0
- package/skills/pinia/GENERATION.md +5 -0
- package/skills/pinia/LICENSE.md +21 -0
- package/skills/pinia/SKILL.md +59 -0
- package/skills/pinia/SYNC.md +5 -0
- package/skills/pinia/references/advanced-hmr.md +61 -0
- package/skills/pinia/references/advanced-nuxt.md +119 -0
- package/skills/pinia/references/advanced-ssr.md +121 -0
- package/skills/pinia/references/best-practices-outside-component.md +115 -0
- package/skills/pinia/references/best-practices-testing.md +212 -0
- package/skills/pinia/references/core-stores.md +389 -0
- package/skills/pinia/references/features-composables.md +114 -0
- package/skills/pinia/references/features-composing-stores.md +134 -0
- package/skills/pinia/references/features-plugins.md +203 -0
- package/skills/pnpm/GENERATION.md +5 -0
- package/skills/pnpm/LICENSE.md +21 -0
- package/skills/pnpm/SKILL.md +42 -0
- package/skills/pnpm/SYNC.md +5 -0
- package/skills/pnpm/references/best-practices-ci.md +285 -0
- package/skills/pnpm/references/best-practices-migration.md +291 -0
- package/skills/pnpm/references/best-practices-performance.md +284 -0
- package/skills/pnpm/references/core-cli.md +229 -0
- package/skills/pnpm/references/core-config.md +188 -0
- package/skills/pnpm/references/core-store.md +179 -0
- package/skills/pnpm/references/core-workspaces.md +205 -0
- package/skills/pnpm/references/features-aliases.md +168 -0
- package/skills/pnpm/references/features-catalogs.md +159 -0
- package/skills/pnpm/references/features-hooks.md +233 -0
- package/skills/pnpm/references/features-overrides.md +184 -0
- package/skills/pnpm/references/features-patches.md +201 -0
- package/skills/pnpm/references/features-peer-deps.md +250 -0
- package/skills/slidev/LICENSE.md +21 -0
- package/skills/slidev/README.md +61 -0
- package/skills/slidev/SKILL.md +189 -0
- package/skills/slidev/SYNC.md +5 -0
- package/skills/slidev/references/animation-click-marker.md +37 -0
- package/skills/slidev/references/animation-drawing.md +68 -0
- package/skills/slidev/references/animation-rough-marker.md +53 -0
- package/skills/slidev/references/api-slide-hooks.md +37 -0
- package/skills/slidev/references/build-og-image.md +36 -0
- package/skills/slidev/references/build-pdf.md +40 -0
- package/skills/slidev/references/build-remote-assets.md +34 -0
- package/skills/slidev/references/build-seo-meta.md +43 -0
- package/skills/slidev/references/code-groups.md +64 -0
- package/skills/slidev/references/code-import-snippet.md +55 -0
- package/skills/slidev/references/code-line-highlighting.md +50 -0
- package/skills/slidev/references/code-line-numbers.md +46 -0
- package/skills/slidev/references/code-magic-move.md +57 -0
- package/skills/slidev/references/code-max-height.md +37 -0
- package/skills/slidev/references/code-twoslash.md +42 -0
- package/skills/slidev/references/core-animations.md +196 -0
- package/skills/slidev/references/core-cli.md +140 -0
- package/skills/slidev/references/core-components.md +197 -0
- package/skills/slidev/references/core-exporting.md +148 -0
- package/skills/slidev/references/core-frontmatter.md +195 -0
- package/skills/slidev/references/core-global-context.md +155 -0
- package/skills/slidev/references/core-headmatter.md +188 -0
- package/skills/slidev/references/core-hosting.md +152 -0
- package/skills/slidev/references/core-layouts.md +286 -0
- package/skills/slidev/references/core-syntax.md +155 -0
- package/skills/slidev/references/diagram-latex.md +55 -0
- package/skills/slidev/references/diagram-mermaid.md +44 -0
- package/skills/slidev/references/diagram-plantuml.md +45 -0
- package/skills/slidev/references/editor-monaco-run.md +44 -0
- package/skills/slidev/references/editor-monaco-write.md +24 -0
- package/skills/slidev/references/editor-monaco.md +50 -0
- package/skills/slidev/references/editor-prettier.md +40 -0
- package/skills/slidev/references/editor-side.md +23 -0
- package/skills/slidev/references/editor-vscode.md +55 -0
- package/skills/slidev/references/layout-canvas-size.md +25 -0
- package/skills/slidev/references/layout-draggable.md +57 -0
- package/skills/slidev/references/layout-global-layers.md +50 -0
- package/skills/slidev/references/layout-slots.md +75 -0
- package/skills/slidev/references/layout-transform.md +33 -0
- package/skills/slidev/references/layout-zoom.md +39 -0
- package/skills/slidev/references/presenter-notes-ruby.md +35 -0
- package/skills/slidev/references/presenter-recording.md +30 -0
- package/skills/slidev/references/presenter-remote.md +40 -0
- package/skills/slidev/references/presenter-timer.md +34 -0
- package/skills/slidev/references/style-direction.md +34 -0
- package/skills/slidev/references/style-icons.md +46 -0
- package/skills/slidev/references/style-scoped.md +50 -0
- package/skills/slidev/references/syntax-block-frontmatter.md +39 -0
- package/skills/slidev/references/syntax-comark.md +51 -0
- package/skills/slidev/references/syntax-frontmatter-merging.md +49 -0
- package/skills/slidev/references/syntax-importing-slides.md +60 -0
- package/skills/slidev/references/tool-eject-theme.md +27 -0
- package/skills/tsdown/LICENSE.md +22 -0
- package/skills/tsdown/README.md +77 -0
- package/skills/tsdown/SKILL.md +416 -0
- package/skills/tsdown/SYNC.md +5 -0
- package/skills/tsdown/references/README.md +139 -0
- package/skills/tsdown/references/advanced-benchmark.md +8 -0
- package/skills/tsdown/references/advanced-ci.md +89 -0
- package/skills/tsdown/references/advanced-hooks.md +363 -0
- package/skills/tsdown/references/advanced-plugins.md +381 -0
- package/skills/tsdown/references/advanced-programmatic.md +378 -0
- package/skills/tsdown/references/advanced-rolldown-options.md +117 -0
- package/skills/tsdown/references/guide-getting-started.md +183 -0
- package/skills/tsdown/references/guide-introduction.md +42 -0
- package/skills/tsdown/references/guide-migrate-from-tsup.md +199 -0
- package/skills/tsdown/references/option-cjs-default.md +98 -0
- package/skills/tsdown/references/option-cleaning.md +275 -0
- package/skills/tsdown/references/option-config-file.md +291 -0
- package/skills/tsdown/references/option-css.md +301 -0
- package/skills/tsdown/references/option-dependencies.md +385 -0
- package/skills/tsdown/references/option-dts.md +251 -0
- package/skills/tsdown/references/option-entry.md +211 -0
- package/skills/tsdown/references/option-exe.md +120 -0
- package/skills/tsdown/references/option-lint.md +127 -0
- package/skills/tsdown/references/option-log-level.md +91 -0
- package/skills/tsdown/references/option-minification.md +177 -0
- package/skills/tsdown/references/option-output-directory.md +272 -0
- package/skills/tsdown/references/option-output-format.md +183 -0
- package/skills/tsdown/references/option-package-exports.md +320 -0
- package/skills/tsdown/references/option-platform.md +256 -0
- package/skills/tsdown/references/option-root.md +88 -0
- package/skills/tsdown/references/option-shims.md +299 -0
- package/skills/tsdown/references/option-sourcemap.md +301 -0
- package/skills/tsdown/references/option-target.md +222 -0
- package/skills/tsdown/references/option-tree-shaking.md +335 -0
- package/skills/tsdown/references/option-unbundle.md +310 -0
- package/skills/tsdown/references/option-watch-mode.md +261 -0
- package/skills/tsdown/references/recipe-react.md +338 -0
- package/skills/tsdown/references/recipe-solid.md +42 -0
- package/skills/tsdown/references/recipe-svelte.md +54 -0
- package/skills/tsdown/references/recipe-vue.md +387 -0
- package/skills/tsdown/references/recipe-wasm.md +125 -0
- package/skills/tsdown/references/reference-cli.md +472 -0
- package/skills/turborepo/LICENSE.md +7 -0
- package/skills/turborepo/SKILL.md +951 -0
- package/skills/turborepo/SYNC.md +5 -0
- package/skills/turborepo/command/turborepo.md +70 -0
- package/skills/turborepo/references/best-practices/RULE.md +241 -0
- package/skills/turborepo/references/best-practices/dependencies.md +246 -0
- package/skills/turborepo/references/best-practices/packages.md +335 -0
- package/skills/turborepo/references/best-practices/structure.md +297 -0
- package/skills/turborepo/references/boundaries/RULE.md +126 -0
- package/skills/turborepo/references/caching/RULE.md +153 -0
- package/skills/turborepo/references/caching/gotchas.md +190 -0
- package/skills/turborepo/references/caching/remote-cache.md +127 -0
- package/skills/turborepo/references/ci/RULE.md +79 -0
- package/skills/turborepo/references/ci/github-actions.md +162 -0
- package/skills/turborepo/references/ci/patterns.md +145 -0
- package/skills/turborepo/references/ci/vercel.md +103 -0
- package/skills/turborepo/references/cli/RULE.md +100 -0
- package/skills/turborepo/references/cli/commands.md +297 -0
- package/skills/turborepo/references/configuration/RULE.md +235 -0
- package/skills/turborepo/references/configuration/global-options.md +239 -0
- package/skills/turborepo/references/configuration/gotchas.md +368 -0
- package/skills/turborepo/references/configuration/tasks.md +325 -0
- package/skills/turborepo/references/environment/RULE.md +123 -0
- package/skills/turborepo/references/environment/gotchas.md +175 -0
- package/skills/turborepo/references/environment/modes.md +101 -0
- package/skills/turborepo/references/filtering/RULE.md +148 -0
- package/skills/turborepo/references/filtering/patterns.md +152 -0
- package/skills/turborepo/references/watch/RULE.md +99 -0
- package/skills/vite/GENERATION.md +5 -0
- package/skills/vite/LICENSE.md +21 -0
- package/skills/vite/SKILL.md +72 -0
- package/skills/vite/SYNC.md +5 -0
- package/skills/vite/references/build-and-ssr.md +164 -0
- package/skills/vite/references/core-config.md +162 -0
- package/skills/vite/references/core-features.md +205 -0
- package/skills/vite/references/core-plugin-api.md +235 -0
- package/skills/vite/references/environment-api.md +108 -0
- package/skills/vite/references/rolldown-migration.md +157 -0
- package/skills/vitepress/GENERATION.md +5 -0
- package/skills/vitepress/LICENSE.md +21 -0
- package/skills/vitepress/SKILL.md +65 -0
- package/skills/vitepress/SYNC.md +5 -0
- package/skills/vitepress/references/advanced-i18n.md +299 -0
- package/skills/vitepress/references/advanced-ssr.md +228 -0
- package/skills/vitepress/references/core-cli.md +119 -0
- package/skills/vitepress/references/core-config.md +189 -0
- package/skills/vitepress/references/core-markdown.md +277 -0
- package/skills/vitepress/references/core-routing.md +169 -0
- package/skills/vitepress/references/features-code-blocks.md +243 -0
- package/skills/vitepress/references/features-data-loading.md +220 -0
- package/skills/vitepress/references/features-dynamic-routes.md +235 -0
- package/skills/vitepress/references/features-vue.md +224 -0
- package/skills/vitepress/references/recipes-deploy.md +240 -0
- package/skills/vitepress/references/theme-config.md +315 -0
- package/skills/vitepress/references/theme-custom.md +269 -0
- package/skills/vitepress/references/theme-customization.md +290 -0
- package/skills/vitest/GENERATION.md +5 -0
- package/skills/vitest/LICENSE.md +21 -0
- package/skills/vitest/SKILL.md +52 -0
- package/skills/vitest/SYNC.md +5 -0
- package/skills/vitest/references/advanced-environments.md +264 -0
- package/skills/vitest/references/advanced-projects.md +300 -0
- package/skills/vitest/references/advanced-type-testing.md +237 -0
- package/skills/vitest/references/advanced-vi.md +249 -0
- package/skills/vitest/references/core-cli.md +166 -0
- package/skills/vitest/references/core-config.md +174 -0
- package/skills/vitest/references/core-describe.md +193 -0
- package/skills/vitest/references/core-expect.md +219 -0
- package/skills/vitest/references/core-hooks.md +244 -0
- package/skills/vitest/references/core-test-api.md +233 -0
- package/skills/vitest/references/features-concurrency.md +250 -0
- package/skills/vitest/references/features-context.md +238 -0
- package/skills/vitest/references/features-coverage.md +207 -0
- package/skills/vitest/references/features-filtering.md +211 -0
- package/skills/vitest/references/features-mocking.md +265 -0
- package/skills/vitest/references/features-snapshots.md +207 -0
- package/skills/vue/GENERATION.md +5 -0
- package/skills/vue/LICENSE.md +21 -0
- package/skills/vue/SKILL.md +84 -0
- package/skills/vue/SYNC.md +5 -0
- package/skills/vue/references/advanced-patterns.md +314 -0
- package/skills/vue/references/core-new-apis.md +264 -0
- package/skills/vue/references/script-setup-macros.md +204 -0
- package/skills/vue-best-practices/LICENSE.md +21 -0
- package/skills/vue-best-practices/SKILL.md +154 -0
- package/skills/vue-best-practices/SYNC.md +5 -0
- package/skills/vue-best-practices/references/animation-class-based-technique.md +254 -0
- package/skills/vue-best-practices/references/animation-state-driven-technique.md +291 -0
- package/skills/vue-best-practices/references/component-async.md +97 -0
- package/skills/vue-best-practices/references/component-data-flow.md +307 -0
- package/skills/vue-best-practices/references/component-fallthrough-attrs.md +174 -0
- package/skills/vue-best-practices/references/component-keep-alive.md +137 -0
- package/skills/vue-best-practices/references/component-slots.md +216 -0
- package/skills/vue-best-practices/references/component-suspense.md +228 -0
- package/skills/vue-best-practices/references/component-teleport.md +108 -0
- package/skills/vue-best-practices/references/component-transition-group.md +128 -0
- package/skills/vue-best-practices/references/component-transition.md +125 -0
- package/skills/vue-best-practices/references/composables.md +290 -0
- package/skills/vue-best-practices/references/directives.md +162 -0
- package/skills/vue-best-practices/references/perf-avoid-component-abstraction-in-lists.md +159 -0
- package/skills/vue-best-practices/references/perf-v-once-v-memo-directives.md +182 -0
- package/skills/vue-best-practices/references/perf-virtualize-large-lists.md +187 -0
- package/skills/vue-best-practices/references/plugins.md +166 -0
- package/skills/vue-best-practices/references/reactivity.md +344 -0
- package/skills/vue-best-practices/references/render-functions.md +201 -0
- package/skills/vue-best-practices/references/sfc.md +310 -0
- package/skills/vue-best-practices/references/state-management.md +135 -0
- package/skills/vue-best-practices/references/updated-hook-performance.md +187 -0
- package/skills/vue-router-best-practices/LICENSE.md +21 -0
- package/skills/vue-router-best-practices/SKILL.md +23 -0
- package/skills/vue-router-best-practices/SYNC.md +5 -0
- package/skills/vue-router-best-practices/reference/router-beforeenter-no-param-trigger.md +167 -0
- package/skills/vue-router-best-practices/reference/router-beforerouteenter-no-this.md +176 -0
- package/skills/vue-router-best-practices/reference/router-guard-async-await-pattern.md +227 -0
- package/skills/vue-router-best-practices/reference/router-navigation-guard-infinite-loop.md +187 -0
- package/skills/vue-router-best-practices/reference/router-navigation-guard-next-deprecated.md +150 -0
- package/skills/vue-router-best-practices/reference/router-param-change-no-lifecycle.md +181 -0
- package/skills/vue-router-best-practices/reference/router-simple-routing-cleanup.md +209 -0
- package/skills/vue-router-best-practices/reference/router-use-vue-router-for-production.md +183 -0
- package/skills/vue-testing-best-practices/LICENSE.md +21 -0
- package/skills/vue-testing-best-practices/SKILL.md +29 -0
- package/skills/vue-testing-best-practices/SYNC.md +5 -0
- package/skills/vue-testing-best-practices/reference/async-component-testing.md +163 -0
- package/skills/vue-testing-best-practices/reference/teleport-testing-complexity.md +158 -0
- package/skills/vue-testing-best-practices/reference/testing-async-await-flushpromises.md +175 -0
- package/skills/vue-testing-best-practices/reference/testing-browser-vs-node-runners.md +208 -0
- package/skills/vue-testing-best-practices/reference/testing-component-blackbox-approach.md +144 -0
- package/skills/vue-testing-best-practices/reference/testing-composables-helper-wrapper.md +238 -0
- package/skills/vue-testing-best-practices/reference/testing-e2e-playwright-recommended.md +242 -0
- package/skills/vue-testing-best-practices/reference/testing-no-snapshot-only.md +197 -0
- package/skills/vue-testing-best-practices/reference/testing-pinia-store-setup.md +228 -0
- package/skills/vue-testing-best-practices/reference/testing-suspense-async-components.md +229 -0
- package/skills/vue-testing-best-practices/reference/testing-vitest-recommended-for-vue.md +204 -0
- package/skills/vueuse-functions/LICENSE.md +21 -0
- package/skills/vueuse-functions/SKILL.md +419 -0
- package/skills/vueuse-functions/SYNC.md +5 -0
- package/skills/vueuse-functions/references/computedAsync.md +195 -0
- package/skills/vueuse-functions/references/computedEager.md +62 -0
- package/skills/vueuse-functions/references/computedInject.md +137 -0
- package/skills/vueuse-functions/references/computedWithControl.md +98 -0
- package/skills/vueuse-functions/references/createEventHook.md +86 -0
- package/skills/vueuse-functions/references/createGenericProjection.md +25 -0
- package/skills/vueuse-functions/references/createGlobalState.md +95 -0
- package/skills/vueuse-functions/references/createInjectionState.md +226 -0
- package/skills/vueuse-functions/references/createProjection.md +31 -0
- package/skills/vueuse-functions/references/createRef.md +54 -0
- package/skills/vueuse-functions/references/createReusableTemplate.md +361 -0
- package/skills/vueuse-functions/references/createSharedComposable.md +42 -0
- package/skills/vueuse-functions/references/createTemplatePromise.md +306 -0
- package/skills/vueuse-functions/references/createUnrefFn.md +51 -0
- package/skills/vueuse-functions/references/extendRef.md +76 -0
- package/skills/vueuse-functions/references/from.md +80 -0
- package/skills/vueuse-functions/references/get.md +30 -0
- package/skills/vueuse-functions/references/injectLocal.md +35 -0
- package/skills/vueuse-functions/references/isDefined.md +31 -0
- package/skills/vueuse-functions/references/logicAnd.md +40 -0
- package/skills/vueuse-functions/references/logicNot.md +36 -0
- package/skills/vueuse-functions/references/logicOr.md +40 -0
- package/skills/vueuse-functions/references/makeDestructurable.md +41 -0
- package/skills/vueuse-functions/references/onClickOutside.md +228 -0
- package/skills/vueuse-functions/references/onElementRemoval.md +88 -0
- package/skills/vueuse-functions/references/onKeyStroke.md +212 -0
- package/skills/vueuse-functions/references/onLongPress.md +235 -0
- package/skills/vueuse-functions/references/onStartTyping.md +53 -0
- package/skills/vueuse-functions/references/provideLocal.md +37 -0
- package/skills/vueuse-functions/references/reactify.md +144 -0
- package/skills/vueuse-functions/references/reactifyObject.md +62 -0
- package/skills/vueuse-functions/references/reactiveComputed.md +34 -0
- package/skills/vueuse-functions/references/reactiveOmit.md +86 -0
- package/skills/vueuse-functions/references/reactivePick.md +106 -0
- package/skills/vueuse-functions/references/refAutoReset.md +46 -0
- package/skills/vueuse-functions/references/refDebounced.md +81 -0
- package/skills/vueuse-functions/references/refDefault.md +36 -0
- package/skills/vueuse-functions/references/refManualReset.md +48 -0
- package/skills/vueuse-functions/references/refThrottled.md +99 -0
- package/skills/vueuse-functions/references/refWithControl.md +146 -0
- package/skills/vueuse-functions/references/set.md +30 -0
- package/skills/vueuse-functions/references/syncRef.md +195 -0
- package/skills/vueuse-functions/references/syncRefs.md +128 -0
- package/skills/vueuse-functions/references/templateRef.md +86 -0
- package/skills/vueuse-functions/references/toObserver.md +38 -0
- package/skills/vueuse-functions/references/toReactive.md +41 -0
- package/skills/vueuse-functions/references/toRef.md +74 -0
- package/skills/vueuse-functions/references/toRefs.md +78 -0
- package/skills/vueuse-functions/references/tryOnBeforeMount.md +34 -0
- package/skills/vueuse-functions/references/tryOnBeforeUnmount.md +32 -0
- package/skills/vueuse-functions/references/tryOnMounted.md +34 -0
- package/skills/vueuse-functions/references/tryOnScopeDispose.md +31 -0
- package/skills/vueuse-functions/references/tryOnUnmounted.md +32 -0
- package/skills/vueuse-functions/references/unrefElement.md +54 -0
- package/skills/vueuse-functions/references/until.md +161 -0
- package/skills/vueuse-functions/references/useAbs.md +31 -0
- package/skills/vueuse-functions/references/useActiveElement.md +86 -0
- package/skills/vueuse-functions/references/useAnimate.md +180 -0
- package/skills/vueuse-functions/references/useArrayDifference.md +84 -0
- package/skills/vueuse-functions/references/useArrayEvery.md +59 -0
- package/skills/vueuse-functions/references/useArrayFilter.md +63 -0
- package/skills/vueuse-functions/references/useArrayFind.md +50 -0
- package/skills/vueuse-functions/references/useArrayFindIndex.md +59 -0
- package/skills/vueuse-functions/references/useArrayFindLast.md +52 -0
- package/skills/vueuse-functions/references/useArrayIncludes.md +63 -0
- package/skills/vueuse-functions/references/useArrayJoin.md +74 -0
- package/skills/vueuse-functions/references/useArrayMap.md +59 -0
- package/skills/vueuse-functions/references/useArrayReduce.md +81 -0
- package/skills/vueuse-functions/references/useArraySome.md +59 -0
- package/skills/vueuse-functions/references/useArrayUnique.md +76 -0
- package/skills/vueuse-functions/references/useAsyncQueue.md +136 -0
- package/skills/vueuse-functions/references/useAsyncState.md +185 -0
- package/skills/vueuse-functions/references/useAsyncValidator.md +70 -0
- package/skills/vueuse-functions/references/useAuth.md +123 -0
- package/skills/vueuse-functions/references/useAverage.md +36 -0
- package/skills/vueuse-functions/references/useAxios.md +325 -0
- package/skills/vueuse-functions/references/useBase64.md +136 -0
- package/skills/vueuse-functions/references/useBattery.md +80 -0
- package/skills/vueuse-functions/references/useBluetooth.md +174 -0
- package/skills/vueuse-functions/references/useBreakpoints.md +176 -0
- package/skills/vueuse-functions/references/useBroadcastChannel.md +73 -0
- package/skills/vueuse-functions/references/useBrowserLocation.md +56 -0
- package/skills/vueuse-functions/references/useCached.md +52 -0
- package/skills/vueuse-functions/references/useCeil.md +31 -0
- package/skills/vueuse-functions/references/useChangeCase.md +79 -0
- package/skills/vueuse-functions/references/useClamp.md +85 -0
- package/skills/vueuse-functions/references/useClipboard.md +122 -0
- package/skills/vueuse-functions/references/useClipboardItems.md +93 -0
- package/skills/vueuse-functions/references/useCloned.md +91 -0
- package/skills/vueuse-functions/references/useColorMode.md +172 -0
- package/skills/vueuse-functions/references/useConfirmDialog.md +159 -0
- package/skills/vueuse-functions/references/useCookies.md +162 -0
- package/skills/vueuse-functions/references/useCountdown.md +105 -0
- package/skills/vueuse-functions/references/useCounter.md +86 -0
- package/skills/vueuse-functions/references/useCssSupports.md +33 -0
- package/skills/vueuse-functions/references/useCssVar.md +50 -0
- package/skills/vueuse-functions/references/useCurrentElement.md +61 -0
- package/skills/vueuse-functions/references/useCycleList.md +75 -0
- package/skills/vueuse-functions/references/useDark.md +142 -0
- package/skills/vueuse-functions/references/useDateFormat.md +145 -0
- package/skills/vueuse-functions/references/useDebounceFn.md +100 -0
- package/skills/vueuse-functions/references/useDebouncedRefHistory.md +40 -0
- package/skills/vueuse-functions/references/useDeviceMotion.md +80 -0
- package/skills/vueuse-functions/references/useDeviceOrientation.md +64 -0
- package/skills/vueuse-functions/references/useDevicePixelRatio.md +47 -0
- package/skills/vueuse-functions/references/useDevicesList.md +89 -0
- package/skills/vueuse-functions/references/useDisplayMedia.md +67 -0
- package/skills/vueuse-functions/references/useDocumentVisibility.md +44 -0
- package/skills/vueuse-functions/references/useDraggable.md +289 -0
- package/skills/vueuse-functions/references/useDrauu.md +65 -0
- package/skills/vueuse-functions/references/useDropZone.md +83 -0
- package/skills/vueuse-functions/references/useElementBounding.md +131 -0
- package/skills/vueuse-functions/references/useElementByPoint.md +46 -0
- package/skills/vueuse-functions/references/useElementHover.md +79 -0
- package/skills/vueuse-functions/references/useElementSize.md +79 -0
- package/skills/vueuse-functions/references/useElementVisibility.md +163 -0
- package/skills/vueuse-functions/references/useEventBus.md +101 -0
- package/skills/vueuse-functions/references/useEventListener.md +226 -0
- package/skills/vueuse-functions/references/useEventSource.md +204 -0
- package/skills/vueuse-functions/references/useExtractedObservable.md +198 -0
- package/skills/vueuse-functions/references/useEyeDropper.md +72 -0
- package/skills/vueuse-functions/references/useFavicon.md +69 -0
- package/skills/vueuse-functions/references/useFetch.md +546 -0
- package/skills/vueuse-functions/references/useFileDialog.md +91 -0
- package/skills/vueuse-functions/references/useFileSystemAccess.md +161 -0
- package/skills/vueuse-functions/references/useFirestore.md +129 -0
- package/skills/vueuse-functions/references/useFloor.md +31 -0
- package/skills/vueuse-functions/references/useFocus.md +99 -0
- package/skills/vueuse-functions/references/useFocusTrap.md +245 -0
- package/skills/vueuse-functions/references/useFocusWithin.md +57 -0
- package/skills/vueuse-functions/references/useFps.md +28 -0
- package/skills/vueuse-functions/references/useFullscreen.md +74 -0
- package/skills/vueuse-functions/references/useFuse.md +75 -0
- package/skills/vueuse-functions/references/useGamepad.md +176 -0
- package/skills/vueuse-functions/references/useGeolocation.md +63 -0
- package/skills/vueuse-functions/references/useIDBKeyval.md +93 -0
- package/skills/vueuse-functions/references/useIdle.md +88 -0
- package/skills/vueuse-functions/references/useImage.md +90 -0
- package/skills/vueuse-functions/references/useInfiniteScroll.md +156 -0
- package/skills/vueuse-functions/references/useIntersectionObserver.md +117 -0
- package/skills/vueuse-functions/references/useInterval.md +112 -0
- package/skills/vueuse-functions/references/useIntervalFn.md +50 -0
- package/skills/vueuse-functions/references/useIpcRenderer.md +144 -0
- package/skills/vueuse-functions/references/useIpcRendererInvoke.md +58 -0
- package/skills/vueuse-functions/references/useIpcRendererOn.md +52 -0
- package/skills/vueuse-functions/references/useJwt.md +57 -0
- package/skills/vueuse-functions/references/useKeyModifier.md +87 -0
- package/skills/vueuse-functions/references/useLastChanged.md +63 -0
- package/skills/vueuse-functions/references/useLocalStorage.md +41 -0
- package/skills/vueuse-functions/references/useMagicKeys.md +245 -0
- package/skills/vueuse-functions/references/useManualRefHistory.md +204 -0
- package/skills/vueuse-functions/references/useMath.md +47 -0
- package/skills/vueuse-functions/references/useMax.md +36 -0
- package/skills/vueuse-functions/references/useMediaControls.md +201 -0
- package/skills/vueuse-functions/references/useMediaQuery.md +53 -0
- package/skills/vueuse-functions/references/useMemoize.md +175 -0
- package/skills/vueuse-functions/references/useMemory.md +70 -0
- package/skills/vueuse-functions/references/useMin.md +36 -0
- package/skills/vueuse-functions/references/useMounted.md +38 -0
- package/skills/vueuse-functions/references/useMouse.md +113 -0
- package/skills/vueuse-functions/references/useMouseInElement.md +132 -0
- package/skills/vueuse-functions/references/useMousePressed.md +116 -0
- package/skills/vueuse-functions/references/useMutationObserver.md +60 -0
- package/skills/vueuse-functions/references/useNProgress.md +78 -0
- package/skills/vueuse-functions/references/useNavigatorLanguage.md +57 -0
- package/skills/vueuse-functions/references/useNetwork.md +106 -0
- package/skills/vueuse-functions/references/useNow.md +83 -0
- package/skills/vueuse-functions/references/useObjectUrl.md +55 -0
- package/skills/vueuse-functions/references/useObservable.md +91 -0
- package/skills/vueuse-functions/references/useOffsetPagination.md +199 -0
- package/skills/vueuse-functions/references/useOnline.md +41 -0
- package/skills/vueuse-functions/references/usePageLeave.md +43 -0
- package/skills/vueuse-functions/references/useParallax.md +58 -0
- package/skills/vueuse-functions/references/useParentElement.md +54 -0
- package/skills/vueuse-functions/references/usePerformanceObserver.md +48 -0
- package/skills/vueuse-functions/references/usePermission.md +78 -0
- package/skills/vueuse-functions/references/usePointer.md +91 -0
- package/skills/vueuse-functions/references/usePointerLock.md +59 -0
- package/skills/vueuse-functions/references/usePointerSwipe.md +80 -0
- package/skills/vueuse-functions/references/usePrecision.md +49 -0
- package/skills/vueuse-functions/references/usePreferredColorScheme.md +42 -0
- package/skills/vueuse-functions/references/usePreferredContrast.md +42 -0
- package/skills/vueuse-functions/references/usePreferredDark.md +41 -0
- package/skills/vueuse-functions/references/usePreferredLanguages.md +41 -0
- package/skills/vueuse-functions/references/usePreferredReducedMotion.md +42 -0
- package/skills/vueuse-functions/references/usePreferredReducedTransparency.md +42 -0
- package/skills/vueuse-functions/references/usePrevious.md +40 -0
- package/skills/vueuse-functions/references/useProjection.md +38 -0
- package/skills/vueuse-functions/references/useQRCode.md +53 -0
- package/skills/vueuse-functions/references/useRTDB.md +83 -0
- package/skills/vueuse-functions/references/useRafFn.md +68 -0
- package/skills/vueuse-functions/references/useRefHistory.md +285 -0
- package/skills/vueuse-functions/references/useResizeObserver.md +108 -0
- package/skills/vueuse-functions/references/useRound.md +31 -0
- package/skills/vueuse-functions/references/useRouteHash.md +27 -0
- package/skills/vueuse-functions/references/useRouteParams.md +38 -0
- package/skills/vueuse-functions/references/useRouteQuery.md +79 -0
- package/skills/vueuse-functions/references/useSSRWidth.md +47 -0
- package/skills/vueuse-functions/references/useScreenOrientation.md +98 -0
- package/skills/vueuse-functions/references/useScreenSafeArea.md +60 -0
- package/skills/vueuse-functions/references/useScriptTag.md +116 -0
- package/skills/vueuse-functions/references/useScroll.md +238 -0
- package/skills/vueuse-functions/references/useScrollLock.md +66 -0
- package/skills/vueuse-functions/references/useSessionStorage.md +41 -0
- package/skills/vueuse-functions/references/useShare.md +67 -0
- package/skills/vueuse-functions/references/useSortable.md +276 -0
- package/skills/vueuse-functions/references/useSorted.md +90 -0
- package/skills/vueuse-functions/references/useSpeechRecognition.md +90 -0
- package/skills/vueuse-functions/references/useSpeechSynthesis.md +101 -0
- package/skills/vueuse-functions/references/useStepper.md +137 -0
- package/skills/vueuse-functions/references/useStorage.md +278 -0
- package/skills/vueuse-functions/references/useStorageAsync.md +136 -0
- package/skills/vueuse-functions/references/useStyleTag.md +131 -0
- package/skills/vueuse-functions/references/useSubject.md +77 -0
- package/skills/vueuse-functions/references/useSubscription.md +33 -0
- package/skills/vueuse-functions/references/useSum.md +36 -0
- package/skills/vueuse-functions/references/useSupported.md +29 -0
- package/skills/vueuse-functions/references/useSwipe.md +75 -0
- package/skills/vueuse-functions/references/useTemplateRefsList.md +37 -0
- package/skills/vueuse-functions/references/useTextDirection.md +75 -0
- package/skills/vueuse-functions/references/useTextSelection.md +43 -0
- package/skills/vueuse-functions/references/useTextareaAutosize.md +94 -0
- package/skills/vueuse-functions/references/useThrottleFn.md +57 -0
- package/skills/vueuse-functions/references/useThrottledRefHistory.md +47 -0
- package/skills/vueuse-functions/references/useTimeAgo.md +154 -0
- package/skills/vueuse-functions/references/useTimeAgoIntl.md +117 -0
- package/skills/vueuse-functions/references/useTimeout.md +113 -0
- package/skills/vueuse-functions/references/useTimeoutFn.md +51 -0
- package/skills/vueuse-functions/references/useTimeoutPoll.md +47 -0
- package/skills/vueuse-functions/references/useTimestamp.md +93 -0
- package/skills/vueuse-functions/references/useTitle.md +115 -0
- package/skills/vueuse-functions/references/useToNumber.md +54 -0
- package/skills/vueuse-functions/references/useToString.md +34 -0
- package/skills/vueuse-functions/references/useToggle.md +103 -0
- package/skills/vueuse-functions/references/useTransition.md +265 -0
- package/skills/vueuse-functions/references/useTrunc.md +33 -0
- package/skills/vueuse-functions/references/useUrlSearchParams.md +121 -0
- package/skills/vueuse-functions/references/useUserMedia.md +96 -0
- package/skills/vueuse-functions/references/useVModel.md +182 -0
- package/skills/vueuse-functions/references/useVModels.md +67 -0
- package/skills/vueuse-functions/references/useVibrate.md +86 -0
- package/skills/vueuse-functions/references/useVirtualList.md +182 -0
- package/skills/vueuse-functions/references/useWakeLock.md +51 -0
- package/skills/vueuse-functions/references/useWebNotification.md +175 -0
- package/skills/vueuse-functions/references/useWebSocket.md +299 -0
- package/skills/vueuse-functions/references/useWebWorker.md +60 -0
- package/skills/vueuse-functions/references/useWebWorkerFn.md +102 -0
- package/skills/vueuse-functions/references/useWindowFocus.md +46 -0
- package/skills/vueuse-functions/references/useWindowScroll.md +46 -0
- package/skills/vueuse-functions/references/useWindowSize.md +78 -0
- package/skills/vueuse-functions/references/useZoomFactor.md +53 -0
- package/skills/vueuse-functions/references/useZoomLevel.md +53 -0
- package/skills/vueuse-functions/references/watchArray.md +53 -0
- package/skills/vueuse-functions/references/watchAtMost.md +63 -0
- package/skills/vueuse-functions/references/watchDebounced.md +101 -0
- package/skills/vueuse-functions/references/watchDeep.md +54 -0
- package/skills/vueuse-functions/references/watchExtractedObservable.md +192 -0
- package/skills/vueuse-functions/references/watchIgnorable.md +120 -0
- package/skills/vueuse-functions/references/watchImmediate.md +44 -0
- package/skills/vueuse-functions/references/watchOnce.md +41 -0
- package/skills/vueuse-functions/references/watchPausable.md +86 -0
- package/skills/vueuse-functions/references/watchThrottled.md +108 -0
- package/skills/vueuse-functions/references/watchTriggerable.md +98 -0
- package/skills/vueuse-functions/references/watchWithFilter.md +54 -0
- package/skills/vueuse-functions/references/whenever.md +108 -0
- package/skills/web-design-guidelines/SKILL.md +39 -0
- package/skills/web-design-guidelines/SYNC.md +5 -0
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: graceful-shutdown
|
|
3
|
+
description: Graceful shutdown and signal handling
|
|
4
|
+
metadata:
|
|
5
|
+
tags: shutdown, signals, cleanup, health-checks, close-with-grace
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Graceful Shutdown in Node.js
|
|
9
|
+
|
|
10
|
+
## Use close-with-grace
|
|
11
|
+
|
|
12
|
+
Always use [close-with-grace](https://github.com/fastify/close-with-grace) for handling graceful shutdowns:
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import closeWithGrace from 'close-with-grace';
|
|
16
|
+
|
|
17
|
+
closeWithGrace({ delay: 10000 }, async ({ signal, err }) => {
|
|
18
|
+
if (err) {
|
|
19
|
+
console.error('Error triggered shutdown:', err);
|
|
20
|
+
}
|
|
21
|
+
console.log(`Received ${signal}, shutting down...`);
|
|
22
|
+
|
|
23
|
+
await server.close();
|
|
24
|
+
await db.end();
|
|
25
|
+
});
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## HTTP Server Shutdown
|
|
29
|
+
|
|
30
|
+
Close HTTP servers gracefully with close-with-grace:
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { createServer } from 'node:http';
|
|
34
|
+
import closeWithGrace from 'close-with-grace';
|
|
35
|
+
|
|
36
|
+
const server = createServer((req, res) => {
|
|
37
|
+
res.writeHead(200, { 'Content-Type': 'application/json' });
|
|
38
|
+
res.end(JSON.stringify({ status: 'ok' }));
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
server.listen(3000, () => {
|
|
42
|
+
console.log('Server listening on port 3000');
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
closeWithGrace({ delay: 10000 }, async ({ signal, err }) => {
|
|
46
|
+
if (err) {
|
|
47
|
+
console.error('Shutdown error:', err);
|
|
48
|
+
}
|
|
49
|
+
console.log(`${signal} received, closing server...`);
|
|
50
|
+
|
|
51
|
+
await new Promise<void>((resolve, reject) => {
|
|
52
|
+
server.close((err) => (err ? reject(err) : resolve()));
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
console.log('Server closed');
|
|
56
|
+
});
|
|
57
|
+
```
|
|
58
|
+
|
|
59
|
+
## Fastify Integration
|
|
60
|
+
|
|
61
|
+
Fastify has built-in close-with-grace support:
|
|
62
|
+
|
|
63
|
+
```typescript
|
|
64
|
+
import Fastify from 'fastify';
|
|
65
|
+
|
|
66
|
+
const app = Fastify({
|
|
67
|
+
logger: true,
|
|
68
|
+
});
|
|
69
|
+
|
|
70
|
+
// Fastify automatically handles graceful shutdown
|
|
71
|
+
// Just register your cleanup in onClose hooks
|
|
72
|
+
|
|
73
|
+
app.addHook('onClose', async () => {
|
|
74
|
+
await db.end();
|
|
75
|
+
await cache.quit();
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
await app.listen({ port: 3000 });
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
## Multiple Resources Cleanup
|
|
82
|
+
|
|
83
|
+
Clean up multiple resources in order:
|
|
84
|
+
|
|
85
|
+
```typescript
|
|
86
|
+
import closeWithGrace from 'close-with-grace';
|
|
87
|
+
import { createServer } from 'node:http';
|
|
88
|
+
|
|
89
|
+
const server = createServer(handler);
|
|
90
|
+
const db = await connectDatabase();
|
|
91
|
+
const redis = await connectRedis();
|
|
92
|
+
|
|
93
|
+
server.listen(3000);
|
|
94
|
+
|
|
95
|
+
closeWithGrace({ delay: 15000 }, async ({ signal, err }) => {
|
|
96
|
+
if (err) {
|
|
97
|
+
console.error('Error:', err);
|
|
98
|
+
}
|
|
99
|
+
console.log(`${signal} received`);
|
|
100
|
+
|
|
101
|
+
// Close in reverse order of initialization
|
|
102
|
+
await new Promise<void>((resolve) => server.close(() => resolve()));
|
|
103
|
+
console.log('HTTP server closed');
|
|
104
|
+
|
|
105
|
+
await redis.quit();
|
|
106
|
+
console.log('Redis connection closed');
|
|
107
|
+
|
|
108
|
+
await db.end();
|
|
109
|
+
console.log('Database connection closed');
|
|
110
|
+
});
|
|
111
|
+
```
|
|
112
|
+
|
|
113
|
+
## Health Checks
|
|
114
|
+
|
|
115
|
+
Implement health checks that respect shutdown state:
|
|
116
|
+
|
|
117
|
+
```typescript
|
|
118
|
+
import closeWithGrace from 'close-with-grace';
|
|
119
|
+
|
|
120
|
+
let isShuttingDown = false;
|
|
121
|
+
|
|
122
|
+
function healthHandler(req: Request, res: Response) {
|
|
123
|
+
if (isShuttingDown) {
|
|
124
|
+
return res.status(503).json({ status: 'shutting_down' });
|
|
125
|
+
}
|
|
126
|
+
return res.json({ status: 'healthy' });
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function readinessHandler(req: Request, res: Response) {
|
|
130
|
+
if (isShuttingDown) {
|
|
131
|
+
return res.status(503).json({ ready: false });
|
|
132
|
+
}
|
|
133
|
+
return res.json({ ready: true });
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
closeWithGrace({ delay: 10000 }, async ({ signal }) => {
|
|
137
|
+
isShuttingDown = true;
|
|
138
|
+
console.log(`${signal} received, marked as shutting down`);
|
|
139
|
+
|
|
140
|
+
// Wait for load balancer to stop sending traffic
|
|
141
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
142
|
+
|
|
143
|
+
await cleanup();
|
|
144
|
+
});
|
|
145
|
+
```
|
|
146
|
+
|
|
147
|
+
## Custom Delay for Kubernetes
|
|
148
|
+
|
|
149
|
+
Use appropriate delays for container orchestration:
|
|
150
|
+
|
|
151
|
+
```typescript
|
|
152
|
+
import closeWithGrace from 'close-with-grace';
|
|
153
|
+
|
|
154
|
+
// Kubernetes sends SIGTERM, then waits terminationGracePeriodSeconds (default 30s)
|
|
155
|
+
// Set delay slightly lower to ensure clean exit
|
|
156
|
+
closeWithGrace({ delay: 25000 }, async ({ signal }) => {
|
|
157
|
+
console.log(`${signal} received`);
|
|
158
|
+
|
|
159
|
+
// Mark as not ready immediately
|
|
160
|
+
isShuttingDown = true;
|
|
161
|
+
|
|
162
|
+
// Wait for in-flight requests (k8s stops sending new traffic after SIGTERM)
|
|
163
|
+
await new Promise((r) => setTimeout(r, 5000));
|
|
164
|
+
|
|
165
|
+
// Close resources
|
|
166
|
+
await server.close();
|
|
167
|
+
await db.end();
|
|
168
|
+
});
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
## Manual Signal Handling (when close-with-grace is not available)
|
|
172
|
+
|
|
173
|
+
If you cannot use close-with-grace, handle signals manually:
|
|
174
|
+
|
|
175
|
+
```typescript
|
|
176
|
+
const signals: NodeJS.Signals[] = ['SIGTERM', 'SIGINT'];
|
|
177
|
+
let isShuttingDown = false;
|
|
178
|
+
|
|
179
|
+
async function shutdown(signal: string): Promise<void> {
|
|
180
|
+
if (isShuttingDown) return;
|
|
181
|
+
isShuttingDown = true;
|
|
182
|
+
|
|
183
|
+
console.log(`${signal} received, shutting down...`);
|
|
184
|
+
|
|
185
|
+
const timeout = setTimeout(() => {
|
|
186
|
+
console.error('Shutdown timeout, forcing exit');
|
|
187
|
+
process.exit(1);
|
|
188
|
+
}, 10000);
|
|
189
|
+
|
|
190
|
+
try {
|
|
191
|
+
await cleanup();
|
|
192
|
+
clearTimeout(timeout);
|
|
193
|
+
process.exit(0);
|
|
194
|
+
} catch (error) {
|
|
195
|
+
console.error('Shutdown error:', error);
|
|
196
|
+
clearTimeout(timeout);
|
|
197
|
+
process.exit(1);
|
|
198
|
+
}
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
for (const signal of signals) {
|
|
202
|
+
process.on(signal, () => shutdown(signal));
|
|
203
|
+
}
|
|
204
|
+
```
|
|
@@ -0,0 +1,205 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: logging
|
|
3
|
+
description: Logging and debugging patterns
|
|
4
|
+
metadata:
|
|
5
|
+
tags: logging, debugging, observability, pino
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Logging in Node.js
|
|
9
|
+
|
|
10
|
+
## Use Pino
|
|
11
|
+
|
|
12
|
+
Use [pino](https://github.com/pinojs/pino) for fast, structured JSON logging:
|
|
13
|
+
|
|
14
|
+
```typescript
|
|
15
|
+
import pino from 'pino';
|
|
16
|
+
|
|
17
|
+
const logger = pino({
|
|
18
|
+
level: process.env.LOG_LEVEL || 'info',
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
logger.info({ userId: user.id }, 'User created');
|
|
22
|
+
logger.error({ err, orderId: order.id }, 'Failed to process payment');
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
## Log Levels
|
|
26
|
+
|
|
27
|
+
Use appropriate log levels:
|
|
28
|
+
|
|
29
|
+
```typescript
|
|
30
|
+
// DEBUG - detailed information for debugging
|
|
31
|
+
logger.debug({ itemId: item.id, step: 'validation' }, 'Processing item');
|
|
32
|
+
|
|
33
|
+
// INFO - general operational information
|
|
34
|
+
logger.info({ userId: user.id }, 'User created');
|
|
35
|
+
|
|
36
|
+
// WARN - unexpected but handled situations
|
|
37
|
+
logger.warn({ currentRate: 95, limit: 100 }, 'Rate limit approaching');
|
|
38
|
+
|
|
39
|
+
// ERROR - errors that need attention
|
|
40
|
+
logger.error({ err, orderId: order.id }, 'Failed to process payment');
|
|
41
|
+
```
|
|
42
|
+
|
|
43
|
+
## Transports
|
|
44
|
+
|
|
45
|
+
Pino uses transports to process logs outside the main thread. Transports handle formatting, filtering, and sending logs to external services.
|
|
46
|
+
|
|
47
|
+
### Pretty Printing for Development
|
|
48
|
+
|
|
49
|
+
Use [pino-pretty](https://github.com/pinojs/pino-pretty) for human-readable output during development:
|
|
50
|
+
|
|
51
|
+
```bash
|
|
52
|
+
node app.ts | pino-pretty
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Or configure programmatically:
|
|
56
|
+
|
|
57
|
+
```typescript
|
|
58
|
+
import pino from 'pino';
|
|
59
|
+
|
|
60
|
+
const logger = pino({
|
|
61
|
+
transport: {
|
|
62
|
+
target: 'pino-pretty',
|
|
63
|
+
options: {
|
|
64
|
+
colorize: true,
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
});
|
|
68
|
+
```
|
|
69
|
+
|
|
70
|
+
### Multiple Transports
|
|
71
|
+
|
|
72
|
+
Send logs to multiple destinations:
|
|
73
|
+
|
|
74
|
+
```typescript
|
|
75
|
+
import pino from 'pino';
|
|
76
|
+
|
|
77
|
+
const logger = pino({
|
|
78
|
+
transport: {
|
|
79
|
+
targets: [
|
|
80
|
+
{
|
|
81
|
+
target: 'pino-pretty',
|
|
82
|
+
options: { colorize: true },
|
|
83
|
+
level: 'info',
|
|
84
|
+
},
|
|
85
|
+
{
|
|
86
|
+
target: 'pino/file',
|
|
87
|
+
options: { destination: '/var/log/app.log' },
|
|
88
|
+
level: 'error',
|
|
89
|
+
},
|
|
90
|
+
],
|
|
91
|
+
},
|
|
92
|
+
});
|
|
93
|
+
```
|
|
94
|
+
|
|
95
|
+
### Available Transports
|
|
96
|
+
|
|
97
|
+
- [pino-pretty](https://github.com/pinojs/pino-pretty) - Human-readable formatting
|
|
98
|
+
- [pino-elasticsearch](https://github.com/pinojs/pino-elasticsearch) - Send to Elasticsearch
|
|
99
|
+
- [pino-loki](https://github.com/Julien-R44/pino-loki) - Send to Grafana Loki
|
|
100
|
+
- [pino-datadog](https://github.com/ovhemert/pino-datadog) - Send to Datadog
|
|
101
|
+
|
|
102
|
+
## Child Loggers
|
|
103
|
+
|
|
104
|
+
Create child loggers with bound context:
|
|
105
|
+
|
|
106
|
+
```typescript
|
|
107
|
+
const requestLogger = logger.child({
|
|
108
|
+
requestId: req.id,
|
|
109
|
+
userId: req.user?.id,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
requestLogger.info('Processing request');
|
|
113
|
+
requestLogger.info({ itemId }, 'Item processed');
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
## Fastify Integration
|
|
117
|
+
|
|
118
|
+
Fastify has built-in pino integration:
|
|
119
|
+
|
|
120
|
+
```typescript
|
|
121
|
+
import Fastify from 'fastify';
|
|
122
|
+
|
|
123
|
+
const app = Fastify({
|
|
124
|
+
logger: {
|
|
125
|
+
level: 'info',
|
|
126
|
+
transport: {
|
|
127
|
+
target: 'pino-pretty',
|
|
128
|
+
},
|
|
129
|
+
},
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
app.get('/', async (request) => {
|
|
133
|
+
request.log.info('Handling request');
|
|
134
|
+
return { status: 'ok' };
|
|
135
|
+
});
|
|
136
|
+
```
|
|
137
|
+
|
|
138
|
+
## Redaction
|
|
139
|
+
|
|
140
|
+
Use pino's built-in redaction for sensitive fields:
|
|
141
|
+
|
|
142
|
+
```typescript
|
|
143
|
+
const logger = pino({
|
|
144
|
+
redact: ['password', 'token', 'apiKey', 'req.headers.authorization'],
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
// Sensitive values are replaced with [Redacted]
|
|
148
|
+
logger.info({ password: 'secret123' }, 'User login');
|
|
149
|
+
// Output: {"password":"[Redacted]","msg":"User login"...}
|
|
150
|
+
```
|
|
151
|
+
|
|
152
|
+
## Debug Module
|
|
153
|
+
|
|
154
|
+
The [debug](https://github.com/debug-js/debug) module is useful for library and module authors to emit tracing information. It is not meant for application logging:
|
|
155
|
+
|
|
156
|
+
```typescript
|
|
157
|
+
import createDebug from 'debug';
|
|
158
|
+
|
|
159
|
+
const debug = createDebug('mymodule:connection');
|
|
160
|
+
|
|
161
|
+
debug('Connecting to %s:%d', host, port);
|
|
162
|
+
debug('Query executed in %dms', duration);
|
|
163
|
+
```
|
|
164
|
+
|
|
165
|
+
Enable debug output with the `DEBUG` environment variable:
|
|
166
|
+
|
|
167
|
+
```bash
|
|
168
|
+
DEBUG=mymodule:* node app.ts
|
|
169
|
+
```
|
|
170
|
+
|
|
171
|
+
Use debug for internal module diagnostics; use pino for application logs.
|
|
172
|
+
|
|
173
|
+
## Node.js Built-in Debugging
|
|
174
|
+
|
|
175
|
+
Use `util.debuglog` for module tracing without external dependencies:
|
|
176
|
+
|
|
177
|
+
```typescript
|
|
178
|
+
import { debuglog } from 'node:util';
|
|
179
|
+
|
|
180
|
+
const debug = debuglog('mymodule');
|
|
181
|
+
|
|
182
|
+
debug('Starting operation %s', operationId);
|
|
183
|
+
debug('Connection established to %s', host);
|
|
184
|
+
```
|
|
185
|
+
|
|
186
|
+
Enable with the `NODE_DEBUG` environment variable:
|
|
187
|
+
|
|
188
|
+
```bash
|
|
189
|
+
NODE_DEBUG=mymodule node app.ts
|
|
190
|
+
NODE_DEBUG=mymodule,http,net node app.ts
|
|
191
|
+
```
|
|
192
|
+
|
|
193
|
+
This also works with Node.js internals (`NODE_DEBUG=http,net,tls`) for debugging core module behavior.
|
|
194
|
+
|
|
195
|
+
## Avoid Logging Sensitive Data
|
|
196
|
+
|
|
197
|
+
Never log credentials, tokens, or personal data:
|
|
198
|
+
|
|
199
|
+
```typescript
|
|
200
|
+
// BAD - logging sensitive data
|
|
201
|
+
logger.info({ email, password }, 'User login');
|
|
202
|
+
|
|
203
|
+
// GOOD - log only safe identifiers
|
|
204
|
+
logger.info({ email }, 'User login');
|
|
205
|
+
```
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: modules
|
|
3
|
+
description: ES Modules and CommonJS patterns
|
|
4
|
+
metadata:
|
|
5
|
+
tags: modules, esm, commonjs, imports, exports
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Node.js Modules
|
|
9
|
+
|
|
10
|
+
## Prefer ES Modules
|
|
11
|
+
|
|
12
|
+
Use ES Modules (ESM) for new projects:
|
|
13
|
+
|
|
14
|
+
```json
|
|
15
|
+
// package.json
|
|
16
|
+
{
|
|
17
|
+
"type": "module"
|
|
18
|
+
}
|
|
19
|
+
```
|
|
20
|
+
|
|
21
|
+
```typescript
|
|
22
|
+
// Named exports (preferred)
|
|
23
|
+
export function processData(data: Data): Result {
|
|
24
|
+
// ...
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export const CONFIG = {
|
|
28
|
+
timeout: 5000,
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Named imports
|
|
32
|
+
import { processData, CONFIG } from './utils.js';
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
## File Extensions in ESM
|
|
36
|
+
|
|
37
|
+
Always include file extensions in ESM imports:
|
|
38
|
+
|
|
39
|
+
```typescript
|
|
40
|
+
// GOOD - explicit extension
|
|
41
|
+
import { helper } from './helper.js';
|
|
42
|
+
import config from './config.json' with { type: 'json' };
|
|
43
|
+
|
|
44
|
+
// BAD - missing extension (works in bundlers but not native ESM)
|
|
45
|
+
import { helper } from './helper';
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
## Barrel Exports
|
|
49
|
+
|
|
50
|
+
Use index files to simplify imports:
|
|
51
|
+
|
|
52
|
+
```typescript
|
|
53
|
+
// src/utils/index.ts
|
|
54
|
+
export { formatDate, parseDate } from './date.js';
|
|
55
|
+
export { formatCurrency } from './currency.js';
|
|
56
|
+
export { validateEmail } from './validation.js';
|
|
57
|
+
|
|
58
|
+
// Consumer
|
|
59
|
+
import { formatDate, formatCurrency } from './utils/index.js';
|
|
60
|
+
```
|
|
61
|
+
|
|
62
|
+
## Default vs Named Exports
|
|
63
|
+
|
|
64
|
+
Prefer named exports for better refactoring and tree-shaking:
|
|
65
|
+
|
|
66
|
+
```typescript
|
|
67
|
+
// GOOD - named exports
|
|
68
|
+
export function createServer(config: Config): Server {
|
|
69
|
+
// ...
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
export function createClient(config: Config): Client {
|
|
73
|
+
// ...
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
// AVOID - default exports
|
|
77
|
+
export default function createServer(config: Config): Server {
|
|
78
|
+
// ...
|
|
79
|
+
}
|
|
80
|
+
```
|
|
81
|
+
|
|
82
|
+
## Dynamic Imports
|
|
83
|
+
|
|
84
|
+
Use dynamic imports for code splitting and conditional loading:
|
|
85
|
+
|
|
86
|
+
```typescript
|
|
87
|
+
async function loadPlugin(name: string): Promise<Plugin> {
|
|
88
|
+
const module = await import(`./plugins/${name}.js`);
|
|
89
|
+
return module.default;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Conditional loading
|
|
93
|
+
const { default: heavy } = await import('./heavy-module.js');
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
## __dirname and __filename in ESM
|
|
97
|
+
|
|
98
|
+
Use `import.meta.dirname` and `import.meta.filename` (Node.js 20.11+):
|
|
99
|
+
|
|
100
|
+
```typescript
|
|
101
|
+
import { join } from 'node:path';
|
|
102
|
+
|
|
103
|
+
const configPath = join(import.meta.dirname, 'config.json');
|
|
104
|
+
const currentFile = import.meta.filename;
|
|
105
|
+
```
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: node-modules-exploration
|
|
3
|
+
description: Navigating and analyzing node_modules directories
|
|
4
|
+
metadata:
|
|
5
|
+
tags: node, nodejs, npm, yarn, pnpm, dependencies, packages
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
# Exploring node_modules
|
|
9
|
+
|
|
10
|
+
## When to Explore node_modules
|
|
11
|
+
|
|
12
|
+
Explore node_modules when you need to:
|
|
13
|
+
- Find specific packages and their versions
|
|
14
|
+
- Analyze dependencies and dependency trees
|
|
15
|
+
- Examine package contents
|
|
16
|
+
- Investigate dependency conflicts
|
|
17
|
+
- Understand how a package works internally
|
|
18
|
+
|
|
19
|
+
## Core Techniques
|
|
20
|
+
|
|
21
|
+
### Finding Package Versions
|
|
22
|
+
|
|
23
|
+
```bash
|
|
24
|
+
# Check actual installed version
|
|
25
|
+
cat node_modules/fastify/package.json | grep '"version"'
|
|
26
|
+
|
|
27
|
+
# For scoped packages
|
|
28
|
+
cat node_modules/@fastify/cors/package.json | grep '"version"'
|
|
29
|
+
|
|
30
|
+
# List all versions with npm
|
|
31
|
+
npm ls fastify
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
### Navigating Directory Structure
|
|
35
|
+
|
|
36
|
+
```bash
|
|
37
|
+
# List package contents
|
|
38
|
+
ls node_modules/fastify/
|
|
39
|
+
|
|
40
|
+
# Find TypeScript definitions
|
|
41
|
+
ls node_modules/fastify/*.d.ts
|
|
42
|
+
ls node_modules/@types/node/
|
|
43
|
+
|
|
44
|
+
# Check main entry point
|
|
45
|
+
cat node_modules/fastify/package.json | grep '"main"\|"exports"'
|
|
46
|
+
```
|
|
47
|
+
|
|
48
|
+
### Understanding Package Manager Differences
|
|
49
|
+
|
|
50
|
+
**npm/yarn (node_modules hoisting):**
|
|
51
|
+
```
|
|
52
|
+
node_modules/
|
|
53
|
+
fastify/
|
|
54
|
+
pino/ # hoisted from fastify's dependencies
|
|
55
|
+
@fastify/cors/
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
**pnpm (content-addressable storage):**
|
|
59
|
+
```
|
|
60
|
+
node_modules/
|
|
61
|
+
.pnpm/
|
|
62
|
+
fastify@4.0.0/
|
|
63
|
+
node_modules/
|
|
64
|
+
fastify/
|
|
65
|
+
pino/ # symlinked, not hoisted
|
|
66
|
+
fastify -> .pnpm/fastify@4.0.0/node_modules/fastify
|
|
67
|
+
```
|
|
68
|
+
|
|
69
|
+
## Finding Package READMEs
|
|
70
|
+
|
|
71
|
+
**CRITICAL: Never use `find`, `grep`, or `rg` for locating READMEs. Follow this sequence:**
|
|
72
|
+
|
|
73
|
+
1. **Direct Read attempts (try in order):**
|
|
74
|
+
```
|
|
75
|
+
node_modules/[package-name]/README.md
|
|
76
|
+
node_modules/[package-name]/readme.md
|
|
77
|
+
node_modules/[package-name]/README
|
|
78
|
+
```
|
|
79
|
+
For scoped packages: `node_modules/@scope/package-name/README.md`
|
|
80
|
+
|
|
81
|
+
2. **If not found, list directory contents:**
|
|
82
|
+
```bash
|
|
83
|
+
ls node_modules/[package-name]/
|
|
84
|
+
```
|
|
85
|
+
Look for README files in output, then read the exact filename.
|
|
86
|
+
|
|
87
|
+
3. **Alternative locations:**
|
|
88
|
+
```
|
|
89
|
+
node_modules/[package-name]/docs/README.md
|
|
90
|
+
```
|
|
91
|
+
Or check `readme` field in `package.json`.
|
|
92
|
+
|
|
93
|
+
## Analyzing Dependency Trees
|
|
94
|
+
|
|
95
|
+
```bash
|
|
96
|
+
# See why a package is installed
|
|
97
|
+
npm why lodash
|
|
98
|
+
|
|
99
|
+
# Full dependency tree
|
|
100
|
+
npm ls --all
|
|
101
|
+
|
|
102
|
+
# Only production dependencies
|
|
103
|
+
npm ls --prod
|
|
104
|
+
|
|
105
|
+
# Find duplicates
|
|
106
|
+
npm ls --all 2>&1 | grep -E "^\s+.*@[0-9]" | sort | uniq -d
|
|
107
|
+
```
|
|
108
|
+
|
|
109
|
+
## Investigating Conflicts
|
|
110
|
+
|
|
111
|
+
### Peer Dependency Issues
|
|
112
|
+
|
|
113
|
+
```bash
|
|
114
|
+
# Check peer dependencies
|
|
115
|
+
cat node_modules/some-plugin/package.json | grep -A 10 '"peerDependencies"'
|
|
116
|
+
|
|
117
|
+
# See what's actually installed vs. what's expected
|
|
118
|
+
npm ls react
|
|
119
|
+
```
|
|
120
|
+
|
|
121
|
+
### Duplicate Packages
|
|
122
|
+
|
|
123
|
+
When the same package appears multiple times:
|
|
124
|
+
|
|
125
|
+
```bash
|
|
126
|
+
# Find all instances of a package
|
|
127
|
+
find node_modules -name "package.json" -path "*/lodash/*" 2>/dev/null
|
|
128
|
+
|
|
129
|
+
# Check for version mismatches
|
|
130
|
+
npm ls lodash
|
|
131
|
+
```
|
|
132
|
+
|
|
133
|
+
## Examining Package Internals
|
|
134
|
+
|
|
135
|
+
### Entry Points
|
|
136
|
+
|
|
137
|
+
```bash
|
|
138
|
+
# Check exports field (modern)
|
|
139
|
+
node -e "console.log(JSON.stringify(require('./node_modules/fastify/package.json').exports, null, 2))"
|
|
140
|
+
|
|
141
|
+
# Check main field (legacy)
|
|
142
|
+
cat node_modules/fastify/package.json | grep '"main"'
|
|
143
|
+
```
|
|
144
|
+
|
|
145
|
+
### TypeScript Definitions
|
|
146
|
+
|
|
147
|
+
```bash
|
|
148
|
+
# Find type definitions
|
|
149
|
+
ls node_modules/fastify/*.d.ts
|
|
150
|
+
cat node_modules/fastify/package.json | grep '"types"\|"typings"'
|
|
151
|
+
|
|
152
|
+
# For DefinitelyTyped packages
|
|
153
|
+
ls node_modules/@types/
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
### Source Files
|
|
157
|
+
|
|
158
|
+
```bash
|
|
159
|
+
# Examine source structure
|
|
160
|
+
ls node_modules/fastify/lib/
|
|
161
|
+
head -50 node_modules/fastify/lib/server.js
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
## Debugging Module Resolution
|
|
165
|
+
|
|
166
|
+
```bash
|
|
167
|
+
# See how Node.js resolves a module
|
|
168
|
+
node -e "console.log(require.resolve('fastify'))"
|
|
169
|
+
|
|
170
|
+
# With full resolution paths
|
|
171
|
+
node --print "require.resolve.paths('fastify')"
|
|
172
|
+
```
|