@xonovex/skills 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude-plugin/plugin.json +21 -0
- package/commands/code-align.md +108 -0
- package/commands/code-harden.md +74 -0
- package/commands/code-simplify.md +145 -0
- package/commands/git-commit.md +146 -0
- package/commands/insights-extract.md +109 -0
- package/commands/insights-integrate.md +100 -0
- package/commands/plan-continue.md +167 -0
- package/commands/plan-create.md +107 -0
- package/commands/plan-research.md +113 -0
- package/commands/plan-subplans-create.md +111 -0
- package/commands/plan-tdd-create.md +128 -0
- package/commands/plan-update.md +99 -0
- package/commands/plan-validate.md +100 -0
- package/commands/plan-worktree-abandon.md +104 -0
- package/commands/plan-worktree-create.md +92 -0
- package/commands/plan-worktree-merge.md +132 -0
- package/package.json +44 -0
- package/skills/astro-guidelines/SKILL.md +23 -0
- package/skills/astro-guidelines/reference/accessibility.md +31 -0
- package/skills/astro-guidelines/reference/components.md +42 -0
- package/skills/astro-guidelines/reference/content-collections.md +32 -0
- package/skills/astro-guidelines/reference/islands-architecture.md +26 -0
- package/skills/astro-guidelines/reference/project-structure.md +32 -0
- package/skills/c99-game-opinionated-guidelines/SKILL.md +43 -0
- package/skills/c99-game-opinionated-guidelines/reference/builder-pattern.md +29 -0
- package/skills/c99-game-opinionated-guidelines/reference/coordinate-system.md +27 -0
- package/skills/c99-game-opinionated-guidelines/reference/geometry-pipeline.md +29 -0
- package/skills/c99-game-opinionated-guidelines/reference/math-types.md +31 -0
- package/skills/c99-game-opinionated-guidelines/reference/mesh-types.md +32 -0
- package/skills/c99-game-opinionated-guidelines/reference/physics-patterns.md +28 -0
- package/skills/c99-game-opinionated-guidelines/reference/spatial-structures.md +26 -0
- package/skills/c99-game-opinionated-guidelines/reference/tagged-unions.md +40 -0
- package/skills/c99-game-opinionated-guidelines/reference/vertex-packing.md +38 -0
- package/skills/c99-guidelines/SKILL.md +29 -0
- package/skills/c99-guidelines/reference/compound-literals.md +33 -0
- package/skills/c99-guidelines/reference/const-correctness.md +32 -0
- package/skills/c99-guidelines/reference/designated-initializers.md +32 -0
- package/skills/c99-guidelines/reference/error-handling.md +49 -0
- package/skills/c99-guidelines/reference/inline-functions.md +37 -0
- package/skills/c99-guidelines/reference/memory-management.md +35 -0
- package/skills/c99-opinionated-guidelines/SKILL.md +44 -0
- package/skills/c99-opinionated-guidelines/reference/alignment.md +50 -0
- package/skills/c99-opinionated-guidelines/reference/caller-owns-memory.md +38 -0
- package/skills/c99-opinionated-guidelines/reference/compound-literals.md +33 -0
- package/skills/c99-opinionated-guidelines/reference/const-correctness.md +32 -0
- package/skills/c99-opinionated-guidelines/reference/data-oriented-design.md +42 -0
- package/skills/c99-opinionated-guidelines/reference/designated-initializers.md +32 -0
- package/skills/c99-opinionated-guidelines/reference/error-handling.md +49 -0
- package/skills/c99-opinionated-guidelines/reference/file-naming.md +33 -0
- package/skills/c99-opinionated-guidelines/reference/implementation-variants.md +35 -0
- package/skills/c99-opinionated-guidelines/reference/inline-functions.md +37 -0
- package/skills/c99-opinionated-guidelines/reference/memory-management.md +35 -0
- package/skills/c99-opinionated-guidelines/reference/safety-validations.md +32 -0
- package/skills/c99-opinionated-guidelines/reference/testing-patterns.md +39 -0
- package/skills/cmake-guidelines/SKILL.md +31 -0
- package/skills/cmake-guidelines/reference/compile-options.md +34 -0
- package/skills/cmake-guidelines/reference/fetchcontent.md +32 -0
- package/skills/cmake-guidelines/reference/find-package.md +29 -0
- package/skills/cmake-guidelines/reference/generator-expressions.md +34 -0
- package/skills/cmake-guidelines/reference/installation.md +38 -0
- package/skills/cmake-guidelines/reference/project-structure.md +40 -0
- package/skills/cmake-guidelines/reference/target-types.md +37 -0
- package/skills/cmake-guidelines/reference/testing.md +30 -0
- package/skills/cmake-guidelines/reference/visibility-specifiers.md +32 -0
- package/skills/content-guidelines/SKILL.md +36 -0
- package/skills/content-guidelines/reference/humanize.md +30 -0
- package/skills/content-guidelines/reference/news.md +28 -0
- package/skills/content-guidelines/reference/travelguide.md +31 -0
- package/skills/docker-guidelines/SKILL.md +23 -0
- package/skills/docker-guidelines/reference/docker-compose.md +40 -0
- package/skills/docker-guidelines/reference/layer-caching.md +25 -0
- package/skills/docker-guidelines/reference/multi-stage-builds.md +37 -0
- package/skills/docker-guidelines/reference/production-config.md +32 -0
- package/skills/docker-guidelines/reference/security.md +27 -0
- package/skills/express.js-guidelines/SKILL.md +32 -0
- package/skills/express.js-guidelines/reference/app-setup.md +39 -0
- package/skills/express.js-guidelines/reference/authentication.md +39 -0
- package/skills/express.js-guidelines/reference/controllers.md +49 -0
- package/skills/express.js-guidelines/reference/error-handling.md +54 -0
- package/skills/express.js-guidelines/reference/project-structure.md +29 -0
- package/skills/express.js-guidelines/reference/responses.md +30 -0
- package/skills/express.js-guidelines/reference/routes.md +29 -0
- package/skills/express.js-guidelines/reference/testing.md +39 -0
- package/skills/express.js-guidelines/reference/validation.md +41 -0
- package/skills/general-fp-guidelines/SKILL.md +28 -0
- package/skills/general-oop-guidelines/SKILL.md +28 -0
- package/skills/git-guidelines/SKILL.md +46 -0
- package/skills/git-guidelines/reference/commit.md +32 -0
- package/skills/git-guidelines/reference/merge-resolve.md +38 -0
- package/skills/git-guidelines/reference/worktree-abandon.md +48 -0
- package/skills/git-guidelines/reference/worktree-cleanup.md +40 -0
- package/skills/git-guidelines/reference/worktree-commit.md +46 -0
- package/skills/git-guidelines/reference/worktree-create.md +42 -0
- package/skills/git-guidelines/reference/worktree-merge.md +45 -0
- package/skills/git-guidelines/reference/worktree-validate.md +44 -0
- package/skills/hono-guidelines/SKILL.md +49 -0
- package/skills/hono-guidelines/reference/application-structure.md +53 -0
- package/skills/hono-guidelines/reference/context-storage.md +46 -0
- package/skills/hono-guidelines/reference/cookie-handling.md +63 -0
- package/skills/hono-guidelines/reference/error-handling.md +69 -0
- package/skills/hono-guidelines/reference/middleware-combine.md +47 -0
- package/skills/hono-guidelines/reference/middleware-patterns.md +58 -0
- package/skills/hono-guidelines/reference/platform-runtime.md +41 -0
- package/skills/hono-guidelines/reference/security-middleware.md +60 -0
- package/skills/hono-guidelines/reference/validation-type-safety.md +43 -0
- package/skills/hono-guidelines/reference/websocket-support.md +59 -0
- package/skills/hono-opinionated-guidelines/SKILL.md +49 -0
- package/skills/hono-opinionated-guidelines/reference/application-structure.md +53 -0
- package/skills/hono-opinionated-guidelines/reference/body-limit.md +57 -0
- package/skills/hono-opinionated-guidelines/reference/context-storage.md +46 -0
- package/skills/hono-opinionated-guidelines/reference/controllers.md +38 -0
- package/skills/hono-opinionated-guidelines/reference/cookie-handling.md +63 -0
- package/skills/hono-opinionated-guidelines/reference/error-handling.md +69 -0
- package/skills/hono-opinionated-guidelines/reference/middleware-combine.md +47 -0
- package/skills/hono-opinionated-guidelines/reference/middleware-patterns.md +58 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-explicit-status-codes.md +61 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-inline-handlers.md +56 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-router-hierarchy.md +64 -0
- package/skills/hono-opinionated-guidelines/reference/openapi-spec-generation.md +57 -0
- package/skills/hono-opinionated-guidelines/reference/platform-runtime.md +41 -0
- package/skills/hono-opinionated-guidelines/reference/router-selection.md +34 -0
- package/skills/hono-opinionated-guidelines/reference/security-middleware.md +60 -0
- package/skills/hono-opinionated-guidelines/reference/validation-type-safety.md +43 -0
- package/skills/hono-opinionated-guidelines/reference/websocket-support.md +59 -0
- package/skills/insights-guidelines/SKILL.md +28 -0
- package/skills/insights-guidelines/reference/insights-extract.md +31 -0
- package/skills/insights-guidelines/reference/insights-integrate.md +35 -0
- package/skills/instruction-guidelines/SKILL.md +26 -0
- package/skills/instruction-guidelines/reference/assimilate.md +38 -0
- package/skills/instruction-guidelines/reference/simplify.md +46 -0
- package/skills/instruction-guidelines/reference/sync.md +41 -0
- package/skills/kubernetes-guidelines/SKILL.md +28 -0
- package/skills/kubernetes-guidelines/reference/configmaps-secrets.md +34 -0
- package/skills/kubernetes-guidelines/reference/deployments.md +55 -0
- package/skills/kubernetes-guidelines/reference/kustomize.md +41 -0
- package/skills/kubernetes-guidelines/reference/network-policies.md +53 -0
- package/skills/kubernetes-guidelines/reference/services.md +36 -0
- package/skills/kubernetes-guidelines/reference/validation.md +32 -0
- package/skills/lua-guidelines/SKILL.md +29 -0
- package/skills/lua-guidelines/reference/coroutines.md +66 -0
- package/skills/lua-guidelines/reference/error-handling.md +41 -0
- package/skills/lua-guidelines/reference/idiomatic-patterns.md +40 -0
- package/skills/lua-guidelines/reference/input-validation.md +42 -0
- package/skills/lua-guidelines/reference/local-variables.md +33 -0
- package/skills/lua-guidelines/reference/metatables.md +52 -0
- package/skills/lua-guidelines/reference/module-pattern.md +37 -0
- package/skills/lua-guidelines/reference/string-concatenation.md +31 -0
- package/skills/lua-opinionated-guidelines/SKILL.md +32 -0
- package/skills/lua-opinionated-guidelines/reference/cache-lookups.md +43 -0
- package/skills/lua-opinionated-guidelines/reference/coroutines.md +66 -0
- package/skills/lua-opinionated-guidelines/reference/error-handling.md +41 -0
- package/skills/lua-opinionated-guidelines/reference/idiomatic-patterns.md +40 -0
- package/skills/lua-opinionated-guidelines/reference/input-validation.md +42 -0
- package/skills/lua-opinionated-guidelines/reference/jit-friendly-tables.md +57 -0
- package/skills/lua-opinionated-guidelines/reference/local-variables.md +33 -0
- package/skills/lua-opinionated-guidelines/reference/metatables.md +52 -0
- package/skills/lua-opinionated-guidelines/reference/module-pattern.md +37 -0
- package/skills/lua-opinionated-guidelines/reference/string-concatenation.md +31 -0
- package/skills/moon-guidelines/SKILL.md +30 -0
- package/skills/moon-guidelines/reference/docker-multistage.md +42 -0
- package/skills/moon-guidelines/reference/project-constraints.md +25 -0
- package/skills/moon-guidelines/reference/query-language.md +27 -0
- package/skills/moon-guidelines/reference/tag-based-filtering.md +28 -0
- package/skills/moon-guidelines/reference/task-configuration.md +38 -0
- package/skills/moon-guidelines/reference/task-inheritance.md +30 -0
- package/skills/motion-react-guidelines/SKILL.md +66 -0
- package/skills/motion-react-guidelines/reference/3d-effects.md +35 -0
- package/skills/motion-react-guidelines/reference/entrance.md +36 -0
- package/skills/motion-react-guidelines/reference/exit.md +35 -0
- package/skills/motion-react-guidelines/reference/gestures.md +23 -0
- package/skills/motion-react-guidelines/reference/layout.md +39 -0
- package/skills/motion-react-guidelines/reference/motion-values.md +33 -0
- package/skills/motion-react-guidelines/reference/performance.md +32 -0
- package/skills/motion-react-guidelines/reference/scroll.md +38 -0
- package/skills/motion-react-guidelines/reference/spring-physics.md +40 -0
- package/skills/motion-react-guidelines/reference/stagger.md +34 -0
- package/skills/motion-react-guidelines/reference/svg-path.md +33 -0
- package/skills/motion-react-guidelines/reference/text-effects.md +39 -0
- package/skills/plan-guidelines/SKILL.md +56 -0
- package/skills/plan-guidelines/reference/code-align.md +23 -0
- package/skills/plan-guidelines/reference/code-barrels-remove.md +24 -0
- package/skills/plan-guidelines/reference/code-comments-remove.md +28 -0
- package/skills/plan-guidelines/reference/code-harden.md +30 -0
- package/skills/plan-guidelines/reference/code-shared-extract.md +25 -0
- package/skills/plan-guidelines/reference/code-simplify.md +33 -0
- package/skills/plan-guidelines/reference/code-template-extract.md +34 -0
- package/skills/plan-guidelines/reference/code-template-scaffold.md +36 -0
- package/skills/plan-guidelines/reference/general-research.md +35 -0
- package/skills/plan-guidelines/reference/plan-create.md +37 -0
- package/skills/plan-guidelines/reference/plan-tdd-create.md +44 -0
- package/skills/plan-guidelines/reference/todos.md +39 -0
- package/skills/presentation-guidelines/SKILL.md +25 -0
- package/skills/presentation-guidelines/reference/presentation-create.md +41 -0
- package/skills/presentation-guidelines/reference/presentation-motion-scaffold.md +38 -0
- package/skills/python-guidelines/SKILL.md +32 -0
- package/skills/python-guidelines/reference/async-await-patterns.md +62 -0
- package/skills/python-guidelines/reference/caching-functions.md +47 -0
- package/skills/python-guidelines/reference/dataclasses-type-hints.md +63 -0
- package/skills/python-guidelines/reference/exception-handling.md +72 -0
- package/skills/python-guidelines/reference/generators-comprehensions.md +54 -0
- package/skills/python-guidelines/reference/pathlib-file-ops.md +60 -0
- package/skills/python-guidelines/reference/resource-management.md +58 -0
- package/skills/python-guidelines/reference/string-formatting.md +41 -0
- package/skills/python-guidelines/reference/type-checking.md +47 -0
- package/skills/react-guidelines/SKILL.md +105 -0
- package/skills/react-guidelines/reference/accessibility.md +31 -0
- package/skills/react-guidelines/reference/activity-effect-event.md +42 -0
- package/skills/react-guidelines/reference/component-design.md +57 -0
- package/skills/react-guidelines/reference/hooks.md +39 -0
- package/skills/react-guidelines/reference/migration-anti-patterns.md +33 -0
- package/skills/react-guidelines/reference/migration-deprecations.md +109 -0
- package/skills/react-guidelines/reference/migration-paradigm-shifts.md +33 -0
- package/skills/react-guidelines/reference/migration-typescript.md +95 -0
- package/skills/react-guidelines/reference/new-hooks.md +94 -0
- package/skills/react-guidelines/reference/performance-optimization.md +41 -0
- package/skills/react-guidelines/reference/react-compiler.md +34 -0
- package/skills/react-guidelines/reference/server-components.md +99 -0
- package/skills/react-guidelines/reference/state-management.md +72 -0
- package/skills/react-guidelines/reference/suspense-streaming.md +36 -0
- package/skills/remotion-guidelines/SKILL.md +67 -0
- package/skills/remotion-guidelines/reference/animations.md +121 -0
- package/skills/remotion-guidelines/reference/assets.md +21 -0
- package/skills/remotion-guidelines/reference/captions.md +33 -0
- package/skills/remotion-guidelines/reference/charts.md +35 -0
- package/skills/remotion-guidelines/reference/compositions.md +40 -0
- package/skills/remotion-guidelines/reference/dom-measurement.md +82 -0
- package/skills/remotion-guidelines/reference/gifs.md +33 -0
- package/skills/remotion-guidelines/reference/lottie.md +41 -0
- package/skills/remotion-guidelines/reference/maps.md +26 -0
- package/skills/remotion-guidelines/reference/media.md +39 -0
- package/skills/remotion-guidelines/reference/mediabunny.md +28 -0
- package/skills/remotion-guidelines/reference/sequencing.md +44 -0
- package/skills/remotion-guidelines/reference/text.md +24 -0
- package/skills/remotion-guidelines/reference/three-d.md +33 -0
- package/skills/remotion-guidelines/reference/timing.md +22 -0
- package/skills/remotion-guidelines/reference/transitions.md +52 -0
- package/skills/shell-scripting-guidelines/SKILL.md +31 -0
- package/skills/shell-scripting-guidelines/reference/argument-parsing.md +67 -0
- package/skills/shell-scripting-guidelines/reference/common-patterns.md +46 -0
- package/skills/shell-scripting-guidelines/reference/error-handling.md +62 -0
- package/skills/shell-scripting-guidelines/reference/functions.md +66 -0
- package/skills/shell-scripting-guidelines/reference/idempotency.md +57 -0
- package/skills/shell-scripting-guidelines/reference/parameter-expansion.md +38 -0
- package/skills/shell-scripting-guidelines/reference/posix-compatibility.md +53 -0
- package/skills/shell-scripting-guidelines/reference/quoting.md +42 -0
- package/skills/shell-scripting-guidelines/reference/script-template.md +70 -0
- package/skills/shell-scripting-guidelines/reference/strict-mode.md +41 -0
- package/skills/shell-scripting-guidelines/reference/validation.md +30 -0
- package/skills/skill-guidelines/SKILL.md +33 -0
- package/skills/skill-guidelines/reference/assimilate.md +51 -0
- package/skills/skill-guidelines/reference/create.md +48 -0
- package/skills/skill-guidelines/reference/extract.md +48 -0
- package/skills/skill-guidelines/reference/simplify.md +56 -0
- package/skills/sql-postgresql-guidelines/SKILL.md +31 -0
- package/skills/sql-postgresql-guidelines/reference/constraints.md +47 -0
- package/skills/sql-postgresql-guidelines/reference/cte-patterns.md +42 -0
- package/skills/sql-postgresql-guidelines/reference/data-types.md +46 -0
- package/skills/sql-postgresql-guidelines/reference/indexing.md +45 -0
- package/skills/sql-postgresql-guidelines/reference/jsonb.md +54 -0
- package/skills/sql-postgresql-guidelines/reference/performance.md +46 -0
- package/skills/sql-postgresql-guidelines/reference/role-based-access.md +47 -0
- package/skills/sql-postgresql-guidelines/reference/row-level-security.md +66 -0
- package/skills/strudel-guidelines/SKILL.md +52 -0
- package/skills/strudel-guidelines/reference/arrangement.md +24 -0
- package/skills/strudel-guidelines/reference/conditionals.md +22 -0
- package/skills/strudel-guidelines/reference/effects.md +22 -0
- package/skills/strudel-guidelines/reference/genre-ambient.md +26 -0
- package/skills/strudel-guidelines/reference/genre-harsh.md +21 -0
- package/skills/strudel-guidelines/reference/genre-trance.md +23 -0
- package/skills/strudel-guidelines/reference/layering.md +22 -0
- package/skills/strudel-guidelines/reference/mini-notation.md +74 -0
- package/skills/strudel-guidelines/reference/modulation.md +22 -0
- package/skills/strudel-guidelines/reference/scales-harmony.md +20 -0
- package/skills/strudel-guidelines/reference/sounds.md +89 -0
- package/skills/strudel-guidelines/reference/tempo-timing.md +23 -0
- package/skills/terraform-guidelines/SKILL.md +28 -0
- package/skills/terraform-guidelines/reference/advanced-patterns.md +88 -0
- package/skills/terraform-guidelines/reference/locals.md +53 -0
- package/skills/terraform-guidelines/reference/module-definition.md +81 -0
- package/skills/terraform-guidelines/reference/module-structure.md +51 -0
- package/skills/terraform-guidelines/reference/remote-state.md +38 -0
- package/skills/terraform-guidelines/reference/root-module.md +71 -0
- package/skills/terraform-guidelines/reference/typed-variables.md +90 -0
- package/skills/threejs-guidelines/SKILL.md +38 -0
- package/skills/threejs-guidelines/reference/animation.md +26 -0
- package/skills/threejs-guidelines/reference/cameras-controls.md +26 -0
- package/skills/threejs-guidelines/reference/geometry.md +22 -0
- package/skills/threejs-guidelines/reference/interaction.md +25 -0
- package/skills/threejs-guidelines/reference/lighting-shadows.md +31 -0
- package/skills/threejs-guidelines/reference/loaders.md +29 -0
- package/skills/threejs-guidelines/reference/materials.md +25 -0
- package/skills/threejs-guidelines/reference/math.md +27 -0
- package/skills/threejs-guidelines/reference/node-materials.md +32 -0
- package/skills/threejs-guidelines/reference/patterns.md +29 -0
- package/skills/threejs-guidelines/reference/performance.md +24 -0
- package/skills/threejs-guidelines/reference/physics-vr.md +36 -0
- package/skills/threejs-guidelines/reference/postprocessing.md +26 -0
- package/skills/threejs-guidelines/reference/scene-fundamentals.md +26 -0
- package/skills/threejs-guidelines/reference/shaders.md +28 -0
- package/skills/threejs-guidelines/reference/textures.md +21 -0
- package/skills/threejs-guidelines/reference/webgpu.md +34 -0
- package/skills/typescript-guidelines/SKILL.md +37 -0
- package/skills/typescript-guidelines/reference/async-without-await.md +32 -0
- package/skills/typescript-guidelines/reference/avoid-barrel-exports.md +25 -0
- package/skills/typescript-guidelines/reference/avoid-eslint-disable.md +28 -0
- package/skills/typescript-guidelines/reference/avoid-reexports.md +26 -0
- package/skills/typescript-guidelines/reference/env-access-bracket-notation.md +29 -0
- package/skills/typescript-guidelines/reference/numeric-separator-enforcement.md +30 -0
- package/skills/typescript-guidelines/reference/template-literals-require-string-conversion.md +26 -0
- package/skills/typescript-guidelines/reference/unbound-method-references.md +32 -0
- package/skills/typescript-guidelines/reference/unnecessary-async-keywords.md +37 -0
- package/skills/typescript-to-lua-guidelines/SKILL.md +33 -0
- package/skills/typescript-to-lua-guidelines/reference/avoiding-heavy-features.md +41 -0
- package/skills/typescript-to-lua-guidelines/reference/coroutine-patterns.md +49 -0
- package/skills/typescript-to-lua-guidelines/reference/function-patterns.md +59 -0
- package/skills/typescript-to-lua-guidelines/reference/lua-interop.md +49 -0
- package/skills/typescript-to-lua-guidelines/reference/module-organization.md +42 -0
- package/skills/typescript-to-lua-guidelines/reference/multi-return-functions.md +47 -0
- package/skills/typescript-to-lua-guidelines/reference/namespaces-vs-classes.md +52 -0
- package/skills/typescript-to-lua-guidelines/reference/performance-tips.md +68 -0
- package/skills/typescript-to-lua-guidelines/reference/stable-tables.md +60 -0
- package/skills/typescript-to-lua-guidelines/reference/tsconfig.md +46 -0
- package/skills/typescript-to-lua-guidelines/reference/tstl-decorators.md +61 -0
- package/skills/typescript-to-lua-guidelines/reference/type-safety.md +79 -0
- package/skills/vitest-guidelines/SKILL.md +32 -0
- package/skills/vitest-guidelines/reference/cors-preflight-status-code.md +34 -0
- package/skills/vitest-guidelines/reference/http-testing.md +57 -0
- package/skills/vitest-guidelines/reference/json-response-type-safety.md +40 -0
- package/skills/vitest-guidelines/reference/mock-patterns.md +53 -0
- package/skills/vitest-guidelines/reference/project-references-path-resolution.md +36 -0
- package/skills/vitest-guidelines/reference/test-organization.md +25 -0
- package/skills/vitest-guidelines/reference/timestamp-testing.md +55 -0
- package/skills/vitest-guidelines/reference/type-safety.md +55 -0
- package/skills/vitest-guidelines/reference/typescript-config.md +43 -0
- package/skills/zod-guidelines/SKILL.md +33 -0
- package/skills/zod-guidelines/reference/default-values-output-type.md +63 -0
- package/skills/zod-guidelines/reference/migration-string-validators.md +38 -0
- package/skills/zod-guidelines/reference/migration-v4.md +46 -0
- package/skills/zod-guidelines/reference/schema-organization.md +73 -0
- package/skills/zod-guidelines/reference/validation-patterns.md +37 -0
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
# function-patterns: Function and Module Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use pure functions, module-level constants, and type-safe enums for efficient Lua.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Pure functions compile to simple Lua without closures. Constants generate efficient tables. Patterns align with Lua's procedural nature.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
// Pure functions in namespace
|
|
10
|
+
namespace Math {
|
|
11
|
+
export function add(a: number, b: number): number { return a + b }
|
|
12
|
+
export function multiply(a: number, b: number): number { return a * b }
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// Module-level constants
|
|
16
|
+
namespace Colors {
|
|
17
|
+
export const RED = 0xFF0000
|
|
18
|
+
export const GREEN = 0x00FF00
|
|
19
|
+
export const BLUE = 0x0000FF
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
// Numeric enums (efficient)
|
|
23
|
+
enum Direction {
|
|
24
|
+
Up = 0,
|
|
25
|
+
Down = 1,
|
|
26
|
+
Left = 2,
|
|
27
|
+
Right = 3
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// Enum utilities
|
|
31
|
+
namespace DirectionUtils {
|
|
32
|
+
export function opposite(dir: Direction): Direction {
|
|
33
|
+
if (dir === Direction.Up) return Direction.Down
|
|
34
|
+
if (dir === Direction.Down) return Direction.Up
|
|
35
|
+
if (dir === Direction.Left) return Direction.Right
|
|
36
|
+
return Direction.Left
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Generic functions
|
|
41
|
+
namespace Array {
|
|
42
|
+
export function map<T, U>(arr: T[], fn: (t: T) => U): U[] {
|
|
43
|
+
const result: U[] = []
|
|
44
|
+
for (let i = 0; i < arr.length; i++) {
|
|
45
|
+
result[i] = fn(arr[i])
|
|
46
|
+
}
|
|
47
|
+
return result
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
```
|
|
51
|
+
|
|
52
|
+
**Techniques:**
|
|
53
|
+
- Export pure functions in namespaces to organize code without closures
|
|
54
|
+
- Define module-level constants in dedicated namespaces for reusability
|
|
55
|
+
- Use numeric enums for efficient representation that compiles to simple numbers
|
|
56
|
+
- Create utility namespaces with static functions for enum operations
|
|
57
|
+
- Keep functions stateless to enable inline compilation
|
|
58
|
+
- Use type parameters for generic functions to maintain type safety
|
|
59
|
+
- Group related utilities in single namespaces to generate efficient tables
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
# lua-interop: Integration with Lua APIs
|
|
2
|
+
|
|
3
|
+
**Guideline:** Declare Lua globals with TypeScript types for type-safe integration.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Lua environments provide global APIs (LÖVE, Corona, custom engines). TypeScript declarations enable autocomplete, type checking, and full interop.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
// LÖVE 2D game engine declarations
|
|
10
|
+
declare const love: {
|
|
11
|
+
graphics: {
|
|
12
|
+
draw: (drawable: Drawable, x: number, y: number) => void
|
|
13
|
+
print: (text: string, x: number, y: number) => void
|
|
14
|
+
setColor: (r: number, g: number, b: number, a?: number) => void
|
|
15
|
+
}
|
|
16
|
+
window: {
|
|
17
|
+
setWidth: (width: number) => void
|
|
18
|
+
setHeight: (height: number) => void
|
|
19
|
+
getWidth: () => number
|
|
20
|
+
getHeight: () => number
|
|
21
|
+
}
|
|
22
|
+
timer: {
|
|
23
|
+
getDelta: () => number
|
|
24
|
+
getTime: () => number
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// Custom engine example
|
|
29
|
+
declare const engine: {
|
|
30
|
+
render: (meshId: number, transform: Matrix4) => void
|
|
31
|
+
physics: {
|
|
32
|
+
raycast: (origin: Vector3, direction: Vector3) => HitResult | null
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Type-safe usage
|
|
37
|
+
love.graphics.setColor(1, 0, 0) // Red
|
|
38
|
+
love.graphics.print('Hello', 100, 50)
|
|
39
|
+
const width = love.window.getWidth()
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
**Techniques:**
|
|
43
|
+
- Use `declare const` to declare Lua global variables and libraries
|
|
44
|
+
- Define complete type signatures for all global APIs and functions
|
|
45
|
+
- Use string literal types for enum-like parameters (e.g., `"fill" | "line"`)
|
|
46
|
+
- Group related functions in nested object types matching Lua structure
|
|
47
|
+
- Document expected parameters and return types for each API call
|
|
48
|
+
- Use union types for optional or variable-length parameters
|
|
49
|
+
- Create type definitions that match exact Lua API signatures
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
# module-organization: Module Organization
|
|
2
|
+
|
|
3
|
+
**Guideline:** Organize code in flat namespace hierarchies that map cleanly to Lua tables.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Nested namespaces compile to nested Lua tables, creating efficient module systems aligned with Lua patterns.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
// Good: 2-level hierarchy, organized by feature
|
|
10
|
+
namespace Physics {
|
|
11
|
+
namespace Collision {
|
|
12
|
+
export interface Circle { x: number; y: number; radius: number }
|
|
13
|
+
export function intersect(a: Circle, b: Circle): boolean {
|
|
14
|
+
const dx = a.x - b.x
|
|
15
|
+
const dy = a.y - b.y
|
|
16
|
+
const dist = Math.sqrt(dx * dx + dy * dy)
|
|
17
|
+
return dist < a.radius + b.radius
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
export function update(body: Body, dt: number) { /* ... */ }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
namespace Rendering {
|
|
24
|
+
namespace Color {
|
|
25
|
+
export const RED = { r: 1, g: 0, b: 0 }
|
|
26
|
+
export const BLUE = { r: 0, g: 0, b: 1 }
|
|
27
|
+
}
|
|
28
|
+
export function draw(mesh: Mesh) { /* ... */ }
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
// Avoid: Too deep (translates to verbose Lua)
|
|
32
|
+
namespace Game.Entities.Physics.Collision.Detection {}
|
|
33
|
+
```
|
|
34
|
+
|
|
35
|
+
**Techniques:**
|
|
36
|
+
- Use nested namespaces for logical grouping that maps to Lua table structure
|
|
37
|
+
- Export functions directly within namespaces (not as properties)
|
|
38
|
+
- Keep hierarchy shallow: maximum 2-3 levels deep for clarity
|
|
39
|
+
- Group related functionality together in single namespace
|
|
40
|
+
- Organize by feature (Physics, Rendering, Input) rather than by file
|
|
41
|
+
- Use consistent naming conventions across namespace hierarchy
|
|
42
|
+
- Minimize cross-namespace dependencies for cleaner module structure
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
# multi-return-functions: Lua Multi-Return Functions
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use `LuaMultiReturn` and `$multi()` for idiomatic Lua multiple-value returns.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Lua natively supports multiple returns, more efficient than arrays/objects. TSTL provides `LuaMultiReturn` for type-safe multi-returns.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
import { LuaMultiReturn } from 'typescript-to-lua'
|
|
10
|
+
|
|
11
|
+
// Simple multi-return
|
|
12
|
+
function divmod(a: number, b: number): LuaMultiReturn<[number, number]> {
|
|
13
|
+
return $multi(Math.floor(a / b), a % b)
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
// Usage
|
|
17
|
+
const [quotient, remainder] = divmod(17, 5)
|
|
18
|
+
// quotient = 3, remainder = 2
|
|
19
|
+
|
|
20
|
+
// Error handling with optional
|
|
21
|
+
function parseJSON(json: string): LuaMultiReturn<[object | null, string | null]> {
|
|
22
|
+
try {
|
|
23
|
+
return $multi(JSON.parse(json), null)
|
|
24
|
+
} catch (e) {
|
|
25
|
+
return $multi(null, (e as Error).message)
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
// Usage
|
|
30
|
+
const [data, err] = parseJSON('{"key": "value"}')
|
|
31
|
+
if (err) console.error('Parse error:', err)
|
|
32
|
+
else console.log('Data:', data)
|
|
33
|
+
|
|
34
|
+
// Variadic returns
|
|
35
|
+
function unpack<T extends any[]>(arr: T): LuaMultiReturn<T> {
|
|
36
|
+
return $multi(...arr)
|
|
37
|
+
}
|
|
38
|
+
```
|
|
39
|
+
|
|
40
|
+
**Techniques:**
|
|
41
|
+
- Import `LuaMultiReturn` from "typescript-to-lua" package
|
|
42
|
+
- Declare return type as `LuaMultiReturn<[type1, type2, ...]>` for multiple values
|
|
43
|
+
- Return using `$multi(value1, value2, ...)` function call syntax
|
|
44
|
+
- Destructure multi-returns with `const [a, b] = func()` for clarity
|
|
45
|
+
- Use for idiomatic Lua patterns like divmod that return quotient and remainder
|
|
46
|
+
- Implement error handling by returning optional value with error message
|
|
47
|
+
- Support variadic returns with spread operator inside $multi
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
# namespaces-vs-classes: Namespace vs Class Design
|
|
2
|
+
|
|
3
|
+
**Guideline:** Prefer namespaces over classes for cleaner, more efficient Lua output.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Classes generate metatables and inheritance chains. Namespaces compile to simple Lua tables with functions, resulting in efficient output.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
// AVOID: Class generates complex Lua with metatables
|
|
10
|
+
class Vector {
|
|
11
|
+
constructor(public x: number, public y: number) {}
|
|
12
|
+
magnitude(): number {
|
|
13
|
+
return Math.sqrt(this.x * this.x + this.y * this.y)
|
|
14
|
+
}
|
|
15
|
+
normalize(): Vector {
|
|
16
|
+
const m = this.magnitude()
|
|
17
|
+
return new Vector(this.x / m, this.y / m)
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
// PREFER: Namespace generates simple Lua tables
|
|
22
|
+
namespace Vector {
|
|
23
|
+
export interface Vec { x: number; y: number }
|
|
24
|
+
|
|
25
|
+
export function magnitude(v: Vec): number {
|
|
26
|
+
return Math.sqrt(v.x * v.x + v.y * v.y)
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
export function normalize(v: Vec): Vec {
|
|
30
|
+
const m = magnitude(v)
|
|
31
|
+
return { x: v.x / m, y: v.y / m }
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function add(a: Vec, b: Vec): Vec {
|
|
35
|
+
return { x: a.x + b.x, y: a.y + b.y }
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
// Usage
|
|
40
|
+
const v: Vector.Vec = { x: 3, y: 4 }
|
|
41
|
+
const mag = Vector.magnitude(v) // 5
|
|
42
|
+
const norm = Vector.normalize(v) // { x: 0.6, y: 0.8 }
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
**Techniques:**
|
|
46
|
+
- Use `export namespace` for grouping related functions instead of classes
|
|
47
|
+
- Export functions directly within namespaces (not static methods)
|
|
48
|
+
- Avoid classes for purely functional code, use namespaces for cleaner output
|
|
49
|
+
- Keep functions pure and stateless within namespaces
|
|
50
|
+
- Use composition patterns to share behavior across namespaces
|
|
51
|
+
- Consider inheritance only when truly needed (rare in Lua)
|
|
52
|
+
- Prefer namespace-based organization for utilities and helper functions
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# performance-tips: Performance Optimization Tips
|
|
2
|
+
|
|
3
|
+
**Guideline:** Cache lookups, use numeric for-loops, and pre-allocate data structures for optimal performance.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Lua has different performance characteristics than JavaScript. Lookups, iterators, and dynamic allocation have costs. Pre-allocation aligns with LuaJIT optimization.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
// SLOW: Repeated lookups, for-of loop
|
|
10
|
+
for (const item of items) {
|
|
11
|
+
console.log(item)
|
|
12
|
+
Math.sqrt(item.value) // Lookup Math each iteration
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
// FAST: Cache lookups, numeric loop
|
|
16
|
+
const sqrt = Math.sqrt
|
|
17
|
+
const itemsLen = items.length
|
|
18
|
+
for (let i = 0; i < itemsLen; i++) {
|
|
19
|
+
const item = items[i]
|
|
20
|
+
console.log(item)
|
|
21
|
+
sqrt(item.value) // Cached reference
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// SLOW: Dynamic array growth
|
|
25
|
+
const results: number[] = []
|
|
26
|
+
for (const item of items) {
|
|
27
|
+
results.push(item * 2) // Reallocates as it grows
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// FAST: Pre-allocate
|
|
31
|
+
const results = new Array<number>(items.length)
|
|
32
|
+
for (let i = 0; i < items.length; i++) {
|
|
33
|
+
results[i] = items[i] * 2 // No reallocation
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// SLOW: Table allocation in hot path
|
|
37
|
+
function updatePositions(bodies: Body[]) {
|
|
38
|
+
for (const body of bodies) {
|
|
39
|
+
const delta = { x: 0, y: 0 } // Allocates each call
|
|
40
|
+
delta.x = body.vx * dt
|
|
41
|
+
delta.y = body.vy * dt
|
|
42
|
+
body.x += delta.x
|
|
43
|
+
body.y += delta.y
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// FAST: Reuse allocation
|
|
48
|
+
const delta = { x: 0, y: 0 }
|
|
49
|
+
function updatePositions(bodies: Body[]) {
|
|
50
|
+
for (let i = 0; i < bodies.length; i++) {
|
|
51
|
+
const body = bodies[i]
|
|
52
|
+
delta.x = body.vx * dt
|
|
53
|
+
delta.y = body.vy * dt
|
|
54
|
+
body.x += delta.x
|
|
55
|
+
body.y += delta.y
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
```
|
|
59
|
+
|
|
60
|
+
**Techniques:**
|
|
61
|
+
- Cache frequently-used global functions in local variables for fast lookup
|
|
62
|
+
- Use numeric for-loops (`for (let i = 0; i < arr.length; i++)`) instead of for-of
|
|
63
|
+
- Avoid for-of and for-in iterators that generate overhead in Lua
|
|
64
|
+
- Pre-allocate arrays when final size is known to avoid dynamic growth
|
|
65
|
+
- Minimize table allocations in hot paths (frequently-called functions)
|
|
66
|
+
- Store module-level constants in locals within functions that use them
|
|
67
|
+
- Profile hot paths and focus optimization on frequently-executed code
|
|
68
|
+
- Use LuaJIT-friendly patterns: early allocation, numeric indices, minimal lookups
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
# stable-tables: Stable Table Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Define all table fields upfront to enable LuaJIT optimizations.
|
|
4
|
+
|
|
5
|
+
**Rationale:** LuaJIT performs best with constant table shapes. Adding fields dynamically causes deoptimization. Pre-allocating fields enables optimal JIT compilation.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
// SLOW: Dynamic property addition (deoptimizes JIT)
|
|
10
|
+
const entity = { x: 0, y: 0 }
|
|
11
|
+
entity.vx = 1 // Added after creation - bad for JIT
|
|
12
|
+
entity.vy = 1 // Another dynamic addition
|
|
13
|
+
entity.id = 123 // Yet another - very slow
|
|
14
|
+
|
|
15
|
+
// FAST: All fields defined upfront
|
|
16
|
+
interface Entity {
|
|
17
|
+
readonly x: number
|
|
18
|
+
readonly y: number
|
|
19
|
+
readonly vx: number
|
|
20
|
+
readonly vy: number
|
|
21
|
+
readonly id: number
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function createEntity(x: number, y: number, id: number): Entity {
|
|
25
|
+
return {
|
|
26
|
+
x: x,
|
|
27
|
+
y: y,
|
|
28
|
+
vx: 0, // All fields initialized
|
|
29
|
+
vy: 0,
|
|
30
|
+
id: id
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// SLOW: Variable-sized arrays
|
|
35
|
+
const buffers: number[][] = []
|
|
36
|
+
function addData(id: number, data: number[]) {
|
|
37
|
+
buffers[id] = data // Variable size - bad for JIT
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// FAST: Pre-allocated arrays
|
|
41
|
+
const maxEntities = 1000
|
|
42
|
+
const posX = new Array<number>(maxEntities) // Fixed size
|
|
43
|
+
const posY = new Array<number>(maxEntities)
|
|
44
|
+
const velocities: number[][] = new Array(maxEntities)
|
|
45
|
+
|
|
46
|
+
for (let i = 0; i < maxEntities; i++) {
|
|
47
|
+
posX[i] = 0
|
|
48
|
+
posY[i] = 0
|
|
49
|
+
velocities[i] = [0, 0] // Stable sub-arrays
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Techniques:**
|
|
54
|
+
- Define complete interfaces with all properties and types upfront
|
|
55
|
+
- Initialize all fields in factory functions to establish table shape
|
|
56
|
+
- Pre-allocate arrays with known sizes to avoid dynamic growth
|
|
57
|
+
- Avoid dynamically adding properties after creation (hurts JIT)
|
|
58
|
+
- Use `readonly` modifiers to signal immutability and stability
|
|
59
|
+
- Create factory functions that set all fields in one operation
|
|
60
|
+
- Keep table structure consistent across all instances of a type
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
# tsconfig: TypeScript Configuration for TSTL
|
|
2
|
+
|
|
3
|
+
**Guideline:** Configure TypeScript with strict mode and TSTL settings for optimal Lua generation.
|
|
4
|
+
|
|
5
|
+
**Rationale:** Strict options catch errors early and generate predictable Lua. TSTL settings control targeting, libraries, and debugging.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```json
|
|
9
|
+
{
|
|
10
|
+
"compilerOptions": {
|
|
11
|
+
"strict": true,
|
|
12
|
+
"noImplicitAny": true,
|
|
13
|
+
"strictNullChecks": true,
|
|
14
|
+
"strictFunctionTypes": true,
|
|
15
|
+
"noUnusedLocals": true,
|
|
16
|
+
"noUnusedParameters": true,
|
|
17
|
+
"noImplicitReturns": true,
|
|
18
|
+
"noFallthroughCasesInSwitch": true,
|
|
19
|
+
"target": "ES2020",
|
|
20
|
+
"module": "esnext",
|
|
21
|
+
"declaration": true,
|
|
22
|
+
"declarationMap": true,
|
|
23
|
+
"sourceMap": true,
|
|
24
|
+
"outDir": "./dist",
|
|
25
|
+
"rootDir": "./src",
|
|
26
|
+
"skipLibCheck": true,
|
|
27
|
+
"forceConsistentCasingInFileNames": true
|
|
28
|
+
},
|
|
29
|
+
"tstl": {
|
|
30
|
+
"luaTarget": "JIT",
|
|
31
|
+
"luaLibImport": "require",
|
|
32
|
+
"sourceMapTraceback": true,
|
|
33
|
+
"noHeader": false
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
**Techniques:**
|
|
39
|
+
- Enable `strict: true` for comprehensive type checking
|
|
40
|
+
- Enable individual strict options: `noImplicitAny`, `strictNullChecks`, `strictFunctionTypes`
|
|
41
|
+
- Enable `noUnusedLocals` and `noUnusedParameters` to catch dead code
|
|
42
|
+
- Enable `noImplicitReturns` to ensure all code paths return
|
|
43
|
+
- Enable `noFallthroughCasesInSwitch` for safer switch statements
|
|
44
|
+
- Set `luaTarget` to appropriate runtime: "JIT" for LuaJIT, "5.3" for Lua 5.3, etc.
|
|
45
|
+
- Set `luaLibImport` to "require" or "inline" for library loading strategy
|
|
46
|
+
- Enable `sourceMapTraceback` for debugging information and stack traces
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
# tstl-decorators: TSTL Decorators and Annotations
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use TSTL-specific decorators and JSDoc annotations to control Lua code generation.
|
|
4
|
+
|
|
5
|
+
**Rationale:** TSTL decorators like `@luaTable` and `@luaIterator` fine-tune generated Lua. Custom decorators bridge TypeScript and Lua idioms.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
/** @luaTable */
|
|
10
|
+
interface Config {
|
|
11
|
+
host: string
|
|
12
|
+
port: number
|
|
13
|
+
debug: boolean
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/** @luaIterator */
|
|
17
|
+
function* enumerate<T>(arr: T[]): Generator<[number, T]> {
|
|
18
|
+
for (let i = 0; i < arr.length; i++) {
|
|
19
|
+
yield [i, arr[i]]
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
class Vector {
|
|
24
|
+
constructor(public x: number, public y: number) {}
|
|
25
|
+
|
|
26
|
+
// @noSelf means this function doesn't receive 'self' parameter
|
|
27
|
+
/** @noSelf */
|
|
28
|
+
static distance(a: Vector, b: Vector): number {
|
|
29
|
+
const dx = a.x - b.x
|
|
30
|
+
const dy = a.y - b.y
|
|
31
|
+
return Math.sqrt(dx * dx + dy * dy)
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Regular method gets self: parameter
|
|
35
|
+
magnitude(): number {
|
|
36
|
+
return Math.sqrt(this.x * this.x + this.y * this.y)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
// Custom memoization decorator
|
|
41
|
+
function memoize(fn: Function) {
|
|
42
|
+
const cache = new Map()
|
|
43
|
+
return (...args: any[]) => {
|
|
44
|
+
const key = JSON.stringify(args)
|
|
45
|
+
if (cache.has(key)) return cache.get(key)
|
|
46
|
+
const result = fn(...args)
|
|
47
|
+
cache.set(key, result)
|
|
48
|
+
return result
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
**Techniques:**
|
|
54
|
+
- Use `/** @luaTable */` JSDoc annotation for raw Lua table interfaces
|
|
55
|
+
- Use `/** @luaIterator */` for generator-based iterators
|
|
56
|
+
- Use `/** @noSelf */` for functions that don't use 'self' context
|
|
57
|
+
- Use `/** @pureVirtual */` to mark abstract methods
|
|
58
|
+
- Implement custom decorators for cross-cutting concerns
|
|
59
|
+
- Apply decorators for performance optimizations: memoization, caching
|
|
60
|
+
- Use decorators for logging, debugging, and tracing functionality
|
|
61
|
+
- Apply decorators at method level for fine-grained code generation control
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
# type-safety: Type Safety Patterns
|
|
2
|
+
|
|
3
|
+
**Guideline:** Use strict typing with readonly properties, discriminated unions, and complete annotations.
|
|
4
|
+
|
|
5
|
+
**Rationale:** TypeScript's type system catches errors at compile time and guides TSTL. Patterns like discriminated unions provide type-safe error handling.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
```typescript
|
|
9
|
+
// Discriminated union for type-safe results
|
|
10
|
+
type Result<T, E> =
|
|
11
|
+
| { kind: 'ok'; value: T }
|
|
12
|
+
| { kind: 'err'; error: E }
|
|
13
|
+
|
|
14
|
+
namespace Result {
|
|
15
|
+
export function ok<T, E>(value: T): Result<T, E> {
|
|
16
|
+
return { kind: 'ok', value }
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
export function err<T, E>(error: E): Result<T, E> {
|
|
20
|
+
return { kind: 'err', error }
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export function map<T, U, E>(
|
|
24
|
+
result: Result<T, E>,
|
|
25
|
+
fn: (t: T) => U
|
|
26
|
+
): Result<U, E> {
|
|
27
|
+
if (result.kind === 'ok') {
|
|
28
|
+
return ok(fn(result.value))
|
|
29
|
+
}
|
|
30
|
+
return result
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
// Readonly properties signal immutability
|
|
35
|
+
interface Position {
|
|
36
|
+
readonly x: number
|
|
37
|
+
readonly y: number
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
interface Entity {
|
|
41
|
+
readonly id: number
|
|
42
|
+
readonly position: Position
|
|
43
|
+
readonly velocity: readonly [number, number] // Readonly tuple
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
// Complete generic types
|
|
47
|
+
type Option<T> = { kind: 'some'; value: T } | { kind: 'none' }
|
|
48
|
+
|
|
49
|
+
namespace Option {
|
|
50
|
+
export function some<T>(value: T): Option<T> {
|
|
51
|
+
return { kind: 'some', value }
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
export function none<T>(): Option<T> {
|
|
55
|
+
return { kind: 'none' }
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export function getOrElse<T>(opt: Option<T>, def: T): T {
|
|
59
|
+
if (opt.kind === 'some') return opt.value
|
|
60
|
+
return def
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
// Type-safe usage
|
|
65
|
+
const result: Result<number, string> = Result.ok(42)
|
|
66
|
+
if (result.kind === 'ok') {
|
|
67
|
+
console.log(result.value) // Type is number
|
|
68
|
+
}
|
|
69
|
+
```
|
|
70
|
+
|
|
71
|
+
**Techniques:**
|
|
72
|
+
- Use `readonly` modifiers for immutable properties to signal intent
|
|
73
|
+
- Define complete interfaces with all properties typed explicitly
|
|
74
|
+
- Implement discriminated unions for type-safe variant handling
|
|
75
|
+
- Create namespaces paired with interfaces for factories and utilities
|
|
76
|
+
- Use union types for optional or alternative values
|
|
77
|
+
- Implement generic types for reusable patterns (Result<T, E>, Option<T>)
|
|
78
|
+
- Use factory functions to enforce proper initialization
|
|
79
|
+
- Provide utility functions as namespace members for convenience
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: vitest-guidelines
|
|
3
|
+
description: >-
|
|
4
|
+
Trigger on `.test.ts`, `.spec.ts` files, test blocks. Use when writing Vitest 3+ tests with TypeScript. Apply for type safety in tests, HTTP testing, mocking patterns, test organization. Keywords: Vitest, test, spec, HTTP assertions, mock patterns, type safety, CORS preflight, timestamps, response casting.
|
|
5
|
+
---
|
|
6
|
+
|
|
7
|
+
# Vitest Testing Guidelines
|
|
8
|
+
|
|
9
|
+
## Requirements
|
|
10
|
+
|
|
11
|
+
- Vitest ≥ 3, TypeScript ≥ 5.8
|
|
12
|
+
|
|
13
|
+
## Essentials
|
|
14
|
+
|
|
15
|
+
- **Type safety** - Define response interfaces, cast JSON results, see [reference/type-safety.md](reference/type-safety.md), [reference/json-response-type-safety.md](reference/json-response-type-safety.md)
|
|
16
|
+
- **HTTP testing** - Use HTTP 204 for OPTIONS, assert correct status codes, see [reference/http-testing.md](reference/http-testing.md), [reference/cors-preflight-status-code.md](reference/cors-preflight-status-code.md)
|
|
17
|
+
- **Timestamp testing** - Avoid flaky comparisons, verify existence or add delays, see [reference/timestamp-testing.md](reference/timestamp-testing.md)
|
|
18
|
+
- **Mock patterns** - Use simple type casting instead of complex generics, see [reference/mock-patterns.md](reference/mock-patterns.md)
|
|
19
|
+
- **TypeScript config** - Verify project reference paths match structure, see [reference/typescript-config.md](reference/typescript-config.md), [reference/project-references-path-resolution.md](reference/project-references-path-resolution.md)
|
|
20
|
+
- **Test organization** - Organize by endpoint/feature with nested describe blocks, see [reference/test-organization.md](reference/test-organization.md)
|
|
21
|
+
|
|
22
|
+
## Progressive disclosure
|
|
23
|
+
|
|
24
|
+
- Read [reference/type-safety.md](reference/type-safety.md) - When test variables lose type information
|
|
25
|
+
- Read [reference/json-response-type-safety.md](reference/json-response-type-safety.md) - When calling res.json() without type assertions
|
|
26
|
+
- Read [reference/http-testing.md](reference/http-testing.md) - When asserting HTTP status codes in API tests
|
|
27
|
+
- Read [reference/cors-preflight-status-code.md](reference/cors-preflight-status-code.md) - When testing CORS OPTIONS requests
|
|
28
|
+
- Read [reference/timestamp-testing.md](reference/timestamp-testing.md) - When tests fail intermittently due to timing
|
|
29
|
+
- Read [reference/mock-patterns.md](reference/mock-patterns.md) - When creating mocks or stubs for tests
|
|
30
|
+
- Read [reference/typescript-config.md](reference/typescript-config.md) - When test files aren't recognized by TypeScript
|
|
31
|
+
- Read [reference/project-references-path-resolution.md](reference/project-references-path-resolution.md) - When imports fail in test files
|
|
32
|
+
- Read [reference/test-organization.md](reference/test-organization.md) - When structuring test suites for large APIs
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
# cors-preflight-status-code: CORS Preflight Status Code Expectations
|
|
2
|
+
|
|
3
|
+
**Guideline:** OPTIONS preflight requests should return HTTP 204 (No Content), not 200 (OK).
|
|
4
|
+
|
|
5
|
+
**Rationale:** HTTP 204 is the correct status code for OPTIONS requests with no response body.
|
|
6
|
+
|
|
7
|
+
**Example:**
|
|
8
|
+
|
|
9
|
+
```typescript
|
|
10
|
+
it("should handle CORS preflight", async () => {
|
|
11
|
+
const res = await app.request("/api/users", {
|
|
12
|
+
method: "OPTIONS",
|
|
13
|
+
headers: {
|
|
14
|
+
Origin: "https://example.com",
|
|
15
|
+
"Access-Control-Request-Method": "POST",
|
|
16
|
+
"Access-Control-Request-Headers": "Content-Type",
|
|
17
|
+
},
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
expect(res.status).toBe(204); // ✅ Correct
|
|
21
|
+
expect(res.headers.get("Access-Control-Allow-Origin")).toBe("*");
|
|
22
|
+
expect(res.headers.get("Access-Control-Allow-Methods")).toContain("POST");
|
|
23
|
+
expect(res.headers.get("Access-Control-Allow-Headers")).toContain(
|
|
24
|
+
"Content-Type",
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
**Techniques:**
|
|
30
|
+
- Always expect 204 status for OPTIONS requests in tests
|
|
31
|
+
- Verify CORS headers are present (Access-Control-Allow-Origin, etc.)
|
|
32
|
+
- Don't expect a response body from OPTIONS
|
|
33
|
+
- Use the same pattern for all preflight request tests
|
|
34
|
+
- Test both missing and present CORS headers
|