Claude Agent Skill · by Vuejs Ai

Create Adaptable Composable

The create-adaptable-composable skill guides developers in building reusable Vue composables that accept both reactive and non-reactive inputs (values, refs, or

Install
Terminal · npx
$npx skills add https://github.com/vuejs-ai/skills --skill create-adaptable-composable
Works with Paperclip

How Create Adaptable Composable fits into a Paperclip company.

Create Adaptable Composable drops into any Paperclip agent that handles this kind of work. Assign it to a specialist inside a pre-configured PaperclipOrg company and the skill becomes available on every heartbeat — no prompt engineering, no tool wiring.

S
SaaS FactoryPaired

Pre-configured AI company — 18 agents, 18 skills, one-time purchase.

$27$59
Explore pack
Source file
SKILL.md76 lines
Expand
---name: create-adaptable-composabledescription: Create a library-grade Vue composable that accepts maybe-reactive inputs (MaybeRef / MaybeRefOrGetter) so callers can pass a plain value, ref, or getter. Normalize inputs with toValue()/toRef() inside reactive effects (watch/watchEffect) to keep behavior predictable and reactive. Use this skill when user asks for creating adaptable or reusable composables.license: MITmetadata:  author: github.com/vuejs-ai  version: "17.0.0"compatibility: Requires Vue 3 (or above) or Nuxt 3 (or above) project--- # Create Adaptable Composable Adaptable composables are reusable functions that can accept both reactive and non-reactive inputs. This allows developers to use the composable in a variety of contexts without worrying about the reactivity of the inputs. Steps to design an adaptable composable in Vue.js:1. Confirm the composable's purpose and API design and expected inputs/outputs.2. Identify inputs params that should be reactive (MaybeRef / MaybeRefOrGetter).3. Use `toValue()` or `toRef()` to normalize inputs inside reactive effects.4. Implement the core logic of the composable using Vue's reactivity APIs. ## Core Type Concepts ### Type Utilities ```ts/** * value or writable ref (value/ref/shallowRef/writable computed) */export type MaybeRef<T = any> = T | Ref<T> | ShallowRef<T> | WritableComputedRef<T>; /** * MaybeRef<T> + ComputedRef<T> + () => T */export type MaybeRefOrGetter<T = any> = MaybeRef<T> | ComputedRef<T> | (() => T);``` ### Policy and Rules - Read-only, computed-friendly input: use `MaybeRefOrGetter`- Needs to be writable / two-way input: use `MaybeRef`- Parameter might be a function value (callback/predicate/comparator): do not use `MaybeRefOrGetter`, or you may accidentally invoke it as a getter.- DOM/Element targets: if you want computed/derived targets, use `MaybeRefOrGetter`. When `MaybeRefOrGetter` or `MaybeRef` is used: - resolve reactive value using `toRef()` (e.g. watcher source)- resolve non-reactive value using `toValue()` ### Examples Adaptable `useDocumentTitle` Composable: read-only title parameter ```tsimport { watch, toRef } from 'vue'import type { MaybeRefOrGetter } from 'vue' export function useDocumentTitle(title: MaybeRefOrGetter<string>) {  watch(toRef(title), (t) => {    document.title = t  }, { immediate: true })}``` Adaptable `useCounter` Composable: two-way writable count parameter ```tsimport { watch, toRef } from 'vue'import type { MaybeRef } from 'vue' function useCounter(count: MaybeRef<number>) {  const countRef = toRef(count)  function add() {    countRef.value++  }  return { add }}```