airyhooks 0.2.0 → 0.3.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 CHANGED
@@ -23,7 +23,7 @@ pnpm dlx airyhooks init
23
23
  This creates `airyhooks.json` in your project root and prompts you for the hooks directory path (default: `./hooks`).
24
24
 
25
25
  > [!NOTE]
26
- > You can use `airyhooks` without initialization. It will use the [default configuration](/#configuration).
26
+ > You can use `airyhooks` without initialization. It will use the [default configuration](#-configuration).
27
27
 
28
28
  ### 2. Start Adding Hooks
29
29
 
@@ -76,6 +76,7 @@ export function SearchComponent() {
76
76
  | `useCopyToClipboard` | Copy text to clipboard with status feedback |
77
77
  | `useCounter` | Manage numeric state with increment/decrement/reset/set |
78
78
  | `useDebounce` | Debounce a value with a specified delay |
79
+ | `useDebouncedCallback` | Debounce a callback function with cancel support |
79
80
  | `useDocumentTitle` | Dynamically update the document title |
80
81
  | `useEventListener` | Attach event listeners with automatic cleanup |
81
82
  | `useFetch` | Fetch data with loading, error, and refetch support |
@@ -93,6 +94,7 @@ export function SearchComponent() {
93
94
  | `useScroll` | Track scroll position of element or window |
94
95
  | `useSessionStorage` | Sync state with sessionStorage |
95
96
  | `useThrottle` | Throttle a value to update at most once per interval |
97
+ | `useThrottledCallback` | Throttle a callback with leading/trailing options |
96
98
  | `useTimeout` | Call a callback after a timeout |
97
99
  | `useToggle` | Toggle a boolean value with convenient handlers |
98
100
  | `useUnmount` | Call a callback on component unmount |
@@ -180,17 +182,21 @@ The `airyhooks.json` file stores your configuration:
180
182
  {
181
183
  "casing": "camelCase",
182
184
  "hooksPath": "src/hooks",
183
- "importExtension": "none"
185
+ "importExtension": "none",
186
+ "includeTests": false,
187
+ "structure": "nested"
184
188
  }
185
189
  ```
186
190
 
187
191
  ### Options
188
192
 
189
- | Option | Type | Default | Description |
190
- | ----------------- | ------------------------------- | ------------- | ------------------------------------------------ |
191
- | `hooksPath` | `string` | `"src/hooks"` | Directory path where hooks are added |
192
- | `casing` | `"camelCase"` \| `"kebab-case"` | `"camelCase"` | Naming convention for hook directories and files |
193
- | `importExtension` | `"none"` \| `"js"` \| `"ts"` | `"none"` | File extension used in barrel export imports |
193
+ | Option | Type | Default | Description |
194
+ | ----------------- | ------------------------------- | ------------- | ----------------------------------------------------------------- |
195
+ | `hooksPath` | `string` | `"src/hooks"` | Directory path where hooks are added |
196
+ | `casing` | `"camelCase"` \| `"kebab-case"` | `"camelCase"` | Naming convention for hook directories and files |
197
+ | `structure` | `"flat"` \| `"nested"` | `"flat"` | Directory structure for hooks |
198
+ | `importExtension` | `"none"` \| `"js"` \| `"ts"` | `"none"` | File extension used in barrel export imports |
199
+ | `includeTests` | `boolean` | `false` | Include test files next to hook implementations when adding hooks |
194
200
 
195
201
  #### `hooksPath`
196
202
 
@@ -222,9 +228,34 @@ hooks/use-debounce/
222
228
  > [!TIP]
223
229
  > You can override casing per-command with the `--kebab` flag: `airyhooks add useDebounce --kebab`
224
230
 
231
+ #### `structure`
232
+
233
+ Controls the directory structure for added hooks:
234
+
235
+ - `"flat"` — All hooks are added directly under the `hooksPath` directory.
236
+ - `"nested"` — Each hook gets its own subdirectory under `hooksPath`.
237
+
238
+ ```
239
+ # flat (default)
240
+ hooks/
241
+ ├── useDebounce.ts
242
+ └── useToggle.ts
243
+
244
+ # nested
245
+ hooks/
246
+ ├── useDebounce/
247
+ │ ├── useDebounce.ts
248
+ │ └── index.ts
249
+ └── useToggle/
250
+ ├── useToggle.ts
251
+ └── index.ts
252
+ ```
253
+
225
254
  #### `importExtension`
226
255
 
227
- Controls the file extension in the generated `index.ts` barrel export. Choose based on your TypeScript configuration:
256
+ Controls the file extension in the generated `index.ts` barrel export. Only relevant when using the `structure: nested`.
257
+
258
+ Choose based on your TypeScript configuration:
228
259
 
229
260
  | Value | Output | When to use |
230
261
  | -------- | ------------------------------------------------ | --------------------------------------------------- |
@@ -232,6 +263,21 @@ Controls the file extension in the generated `index.ts` barrel export. Choose ba
232
263
  | `"js"` | `export { useDebounce } from "./useDebounce.js"` | `moduleResolution: "nodenext"` or `"node16"` |
233
264
  | `"ts"` | `export { useDebounce } from "./useDebounce.ts"` | `allowImportingTsExtensions: true` in tsconfig |
234
265
 
266
+ #### `includeTests`
267
+
268
+ When `true`, airyhooks will also copy the test file for the hook next to the generated hook implementation. The behavior follows the configured `structure`:
269
+
270
+ - With `"nested"`, the test file is written inside the hook's subdirectory (e.g. `useDebounce/useDebounce.test.ts`).
271
+ - With `"flat"`, the test file is written directly under the `hooksPath` next to the hook file (e.g. `useDebounce.test.ts`).
272
+
273
+ You can enable this by setting it in `airyhooks.json`:
274
+
275
+ ```json
276
+ { "includeTests": true }
277
+ ```
278
+
279
+ You can also override this per-command with the CLI flag: `airyhooks add <hook-name> --include-tests`.
280
+
235
281
  ## 📦 Package Managers
236
282
 
237
283
  airyhooks works with all major package managers:
@@ -4,7 +4,7 @@ import pc from "picocolors";
4
4
  import { getConfig } from "../utils/config.js";
5
5
  import { getFileExtension } from "../utils/get-file-extension.js";
6
6
  import { getHookFileBaseName } from "../utils/get-hook-filename.js";
7
- import { getHookTemplate } from "../utils/get-hook-template.js";
7
+ import { getHookTemplate, getHookTestTemplate, } from "../utils/get-hook-template.js";
8
8
  import { registry } from "../utils/registry.js";
9
9
  export async function add(hookName, options = {}) {
10
10
  const { force, kebab, raw } = options;
@@ -16,30 +16,45 @@ export async function add(hookName, options = {}) {
16
16
  }
17
17
  const config = await getConfig({
18
18
  ...(kebab ? { casing: "kebab-case" } : {}),
19
+ ...(options.includeTests ? { includeTests: true } : {}),
19
20
  });
20
21
  const hooksDir = path.join(process.cwd(), config.hooksPath);
21
22
  const casedHookName = getHookFileBaseName(hook.name, config.casing);
22
- const hookTargetDir = path.join(hooksDir, casedHookName);
23
+ const hookTargetDir = path.join(hooksDir, config.structure === "nested" ? casedHookName : "");
23
24
  const template = getHookTemplate(hook.name);
24
- const barrelContent = `export { ${hook.name} } from "./${casedHookName}${getFileExtension(config.importExtension)}";\n`;
25
+ const testTemplate = getHookTestTemplate(hook.name);
25
26
  if (!raw) {
26
27
  // Ensure hook subdirectory exists
27
28
  await fs.ensureDir(hookTargetDir);
28
29
  const hookFilePath = path.join(hookTargetDir, `${casedHookName}.ts`);
30
+ const hookTestFilePath = path.join(hookTargetDir, `${casedHookName}.test.ts`);
29
31
  // Check if hook already exists
30
32
  if (!force && (await fs.pathExists(hookFilePath))) {
31
33
  console.log(pc.yellow(`⚠ ${casedHookName} already exists. Skipping.`));
34
+ console.log(pc.dim("Use --force to overwrite existing hooks."));
32
35
  return;
33
36
  }
34
37
  const barrelFilePath = path.join(hookTargetDir, "index.ts");
38
+ const hookImportExtension = getFileExtension(config.importExtension);
35
39
  // Write hook implementation
36
40
  await fs.writeFile(hookFilePath, template);
37
- // Write barrel export
38
- await fs.writeFile(barrelFilePath, barrelContent);
39
- console.log(pc.green(`✓ Added ${hook.name}`));
40
- console.log(pc.dim(` → ${path.relative(process.cwd(), hookTargetDir)}/`));
41
- console.log(pc.dim(` ├── ${casedHookName}.ts`));
42
- console.log(pc.dim(` └── index.ts`));
41
+ // Write hook test
42
+ if (config.includeTests) {
43
+ const hookImplementationImportPath = `./${hookName}.js`;
44
+ const modifiedTestTemplate = testTemplate.replace(hookImplementationImportPath, `./${hook.name}${hookImportExtension}`);
45
+ await fs.writeFile(hookTestFilePath, modifiedTestTemplate);
46
+ }
47
+ if (config.structure === "nested") {
48
+ // Write barrel file for nested structure
49
+ const barrelContent = `export { ${hook.name} } from "./${casedHookName}${hookImportExtension}";\n`;
50
+ await fs.writeFile(barrelFilePath, barrelContent);
51
+ }
52
+ logOutput({
53
+ casedHookName,
54
+ hookFunctionName: hook.name,
55
+ hookTargetDir,
56
+ ...config,
57
+ });
43
58
  }
44
59
  else {
45
60
  console.log(pc.cyan(template));
@@ -51,4 +66,26 @@ export async function add(hookName, options = {}) {
51
66
  });
52
67
  }
53
68
  }
69
+ /**
70
+ * Log output to the console after adding a hook.
71
+ */
72
+ function logOutput({ casedHookName, hookFunctionName, hookTargetDir, includeTests, structure, }) {
73
+ const relativeHookDir = path.relative(process.cwd(), hookTargetDir);
74
+ console.log(pc.green(`✓ Added ${hookFunctionName}`));
75
+ if (structure === "nested") {
76
+ console.log(pc.dim(` → ${relativeHookDir}/`));
77
+ if (includeTests) {
78
+ console.log(pc.dim(` ├── ${casedHookName}.test.ts`));
79
+ }
80
+ console.log(pc.dim(` ├── ${casedHookName}.ts`));
81
+ console.log(pc.dim(` └── index.ts`));
82
+ }
83
+ else {
84
+ console.log(pc.dim(` → ${relativeHookDir}/`));
85
+ if (includeTests) {
86
+ console.log(pc.dim(` ├── ${casedHookName}.test.ts`));
87
+ }
88
+ console.log(pc.dim(` └── ${casedHookName}.ts`));
89
+ }
90
+ }
54
91
  //# sourceMappingURL=add.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"add.js","sourceRoot":"","sources":["../../src/commands/add.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -23,6 +23,7 @@ program
23
23
  .option("-r --raw", "Output only the raw hook template to console", false)
24
24
  .option("-f --force", "Force overwrite if the hook file already exists", false)
25
25
  .option("-k --kebab", "Use kebab-case for the hook file and directory names. Overrides the default casing in config.", false)
26
+ .option("--include-tests", "Include test files when adding hooks. Overrides the default setting in config.", false)
26
27
  .action(add);
27
28
  program.command("list").description("List all available hooks").action(list);
28
29
  program.parse();
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,KAAK,CAAC;KACb,KAAK,CAAC,QAAQ,CAAC;KACf,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAEjD,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,IAAI,CAAC,CAAC;AAEhB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,4BAA4B,CAAC;KACzC,QAAQ,CAAC,QAAQ,EAAE,6CAA6C,CAAC;KACjE,MAAM,CAAC,UAAU,EAAE,8CAA8C,EAAE,KAAK,CAAC;KACzE,MAAM,CACL,YAAY,EACZ,iDAAiD,EACjD,KAAK,CACN;KACA,MAAM,CACL,YAAY,EACZ,+FAA+F,EAC/F,KAAK,CACN;KACA,MAAM,CAAC,GAAG,CAAC,CAAC;AAEf,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAE7E,OAAO,CAAC,KAAK,EAAE,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC,OAAO,WAAW,MAAM,iBAAiB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAChE,OAAO,EAAE,GAAG,EAAE,MAAM,mBAAmB,CAAC;AACxC,OAAO,EAAE,KAAK,EAAE,MAAM,qBAAqB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAC1C,OAAO,EAAE,IAAI,EAAE,MAAM,oBAAoB,CAAC;AAE1C,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,WAAW,CAAC;KACjB,WAAW,CAAC,iCAAiC,CAAC;KAC9C,MAAM,CAAC,KAAK,CAAC;KACb,KAAK,CAAC,QAAQ,CAAC;KACf,OAAO,CAAC,WAAW,CAAC,OAAO,EAAE,eAAe,CAAC,CAAC;AAEjD,OAAO;KACJ,OAAO,CAAC,MAAM,CAAC;KACf,WAAW,CAAC,oCAAoC,CAAC;KACjD,MAAM,CAAC,IAAI,CAAC,CAAC;AAEhB,OAAO;KACJ,OAAO,CAAC,KAAK,CAAC;KACd,WAAW,CAAC,4BAA4B,CAAC;KACzC,QAAQ,CAAC,QAAQ,EAAE,6CAA6C,CAAC;KACjE,MAAM,CAAC,UAAU,EAAE,8CAA8C,EAAE,KAAK,CAAC;KACzE,MAAM,CACL,YAAY,EACZ,iDAAiD,EACjD,KAAK,CACN;KACA,MAAM,CACL,YAAY,EACZ,+FAA+F,EAC/F,KAAK,CACN;KACA,MAAM,CACL,iBAAiB,EACjB,gFAAgF,EAChF,KAAK,CACN;KACA,MAAM,CAAC,GAAG,CAAC,CAAC;AAEf,OAAO,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,WAAW,CAAC,0BAA0B,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;AAE7E,OAAO,CAAC,KAAK,EAAE,CAAC"}
@@ -4,6 +4,8 @@ export const DEFAULT_CONFIG = {
4
4
  casing: "camelCase",
5
5
  hooksPath: "src/hooks",
6
6
  importExtension: "none",
7
+ includeTests: false,
8
+ structure: "nested",
7
9
  };
8
10
  export async function getConfig(overrides) {
9
11
  const configPath = path.join(process.cwd(), "airyhooks.json");
@@ -1 +1 @@
1
- {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAkB7B,MAAM,CAAC,MAAM,cAAc,GAA8B;IACvD,MAAM,EAAE,WAAW;IACnB,SAAS,EAAE,WAAW;IACtB,eAAe,EAAE,MAAM;CACxB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAoC;IAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAE9D,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CACnC,UAAU,CACX,CAA6B,CAAC;QAE/B,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;IAC5D,CAAC;IAED,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,SAAS,EAAE,CAAC;AAC7C,CAAC"}
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../src/utils/config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,UAAU,CAAC;AAC1B,OAAO,IAAI,MAAM,WAAW,CAAC;AAuB7B,MAAM,CAAC,MAAM,cAAc,GAA8B;IACvD,MAAM,EAAE,WAAW;IACnB,SAAS,EAAE,WAAW;IACtB,eAAe,EAAE,MAAM;IACvB,YAAY,EAAE,KAAK;IACnB,SAAS,EAAE,QAAQ;CACpB,CAAC;AAEF,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,SAAoC;IAEpC,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,gBAAgB,CAAC,CAAC;IAE9D,IAAI,MAAM,EAAE,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QACpC,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,CAAC,QAAQ,CACnC,UAAU,CACX,CAA6B,CAAC;QAE/B,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,UAAU,EAAE,GAAG,SAAS,EAAE,CAAC;IAC5D,CAAC;IAED,OAAO,EAAE,GAAG,cAAc,EAAE,GAAG,SAAS,EAAE,CAAC;AAC7C,CAAC"}
@@ -1,3 +1,6 @@
1
+ /**
2
+ * Get the file extension including the dot based on the provided type.
3
+ */
1
4
  export function getFileExtension(ext) {
2
5
  if (ext === "none") {
3
6
  return "";
@@ -1 +1 @@
1
- {"version":3,"file":"get-file-extension.js","sourceRoot":"","sources":["../../src/utils/get-file-extension.ts"],"names":[],"mappings":"AAAA,MAAM,UAAU,gBAAgB,CAC9B,GAAyC;IAEzC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"get-file-extension.js","sourceRoot":"","sources":["../../src/utils/get-file-extension.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,GAAyC;IAEzC,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,OAAO,EAAE,CAAC;IACZ,CAAC;SAAM,CAAC;QACN,OAAO,IAAI,GAAG,EAAE,CAAC;IACnB,CAAC;AACH,CAAC"}