{"_id":"@ar4mirez/hapi-handlers","name":"@ar4mirez/hapi-handlers","dist-tags":{"latest":"4.0.1"},"versions":{"4.0.1":{"name":"@ar4mirez/hapi-handlers","description":"Autoload Handlers for HapiJS.","version":"4.0.1","author":{"name":"Angel Ramirez","email":"angel@cuemby.com"},"bugs":{"url":"https://github.com/ar4mirez/hapi-handlers/issues"},"dependencies":{"glob":"^10.4.5"},"devDependencies":{"@hapi/code":"^9.0.3","@hapi/hapi":"^21.4.4","@hapi/lab":"^26.0.0"},"engines":{"node":">=18.0.0"},"homepage":"https://github.com/ar4mirez/hapi-handlers#readme","keywords":["handlers","hapi","plugin","autoload"],"license":"MIT","main":"lib/index.js","repository":{"type":"git","url":"git+https://github.com/ar4mirez/hapi-handlers.git"},"scripts":{"test":"lab -c -v -L -t 80","test:coverage":"lab -c -r html -o ./test/artifacts/coverage.html && open ./test/artifacts/coverage.html"},"_id":"@ar4mirez/hapi-handlers@4.0.1","gitHead":"7170caa10c993110f8d5e785c502889c507d222e","_nodeVersion":"20.19.6","_npmVersion":"10.8.2","dist":{"integrity":"sha512-zzOZfOtlMCwYJYHtU+Vavi8H65HHakkoVOQr/TWnIsUS+g37Icm/woFrlPWAoTcpjJLxck4CRhFYl6eqg3zbUw==","shasum":"de9ec6264be6e4dc3a12ea1dd731a959fd17db98","tarball":"https://registry.npmjs.org/@ar4mirez/hapi-handlers/-/hapi-handlers-4.0.1.tgz","fileCount":13,"unpackedSize":19181,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@ar4mirez%2fhapi-handlers@4.0.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC0FOwMjA0Znsyf+GqNZLG7hjmmBltxTMdf3aZTQMmtagIhAMHkPNu3frYI/Z/9E+s2fQqbIa2iP12A7HgK1HjfyMAa"}]},"_npmUser":{"name":"ar4mirez","email":"angel@cuemby.com"},"directories":{},"maintainers":[{"name":"ar4mirez","email":"angel@cuemby.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/hapi-handlers_4.0.1_1768563205137_0.28288873813831694"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-16T11:33:25.037Z","4.0.1":"2026-01-16T11:33:25.274Z","modified":"2026-01-16T11:33:25.635Z"},"maintainers":[{"name":"ar4mirez","email":"angel@cuemby.com"}],"description":"Autoload Handlers for HapiJS.","homepage":"https://github.com/ar4mirez/hapi-handlers#readme","keywords":["handlers","hapi","plugin","autoload"],"repository":{"type":"git","url":"git+https://github.com/ar4mirez/hapi-handlers.git"},"author":{"name":"Angel Ramirez","email":"angel@cuemby.com"},"bugs":{"url":"https://github.com/ar4mirez/hapi-handlers/issues"},"license":"MIT","readme":"# @ar4mirez/hapi-handlers\n\n[![npm version](https://img.shields.io/npm/v/@ar4mirez/hapi-handlers.svg)](https://www.npmjs.com/package/@ar4mirez/hapi-handlers)\n[![CI](https://github.com/ar4mirez/hapi-handlers/actions/workflows/ci.yml/badge.svg)](https://github.com/ar4mirez/hapi-handlers/actions/workflows/ci.yml)\n[![Node.js](https://img.shields.io/node/v/@ar4mirez/hapi-handlers.svg)](https://nodejs.org)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\nPlugin to autoload handlers for [hapi.js](https://hapi.dev/) based on glob patterns.\n\n> **Note:** This package was previously published as `hapi-handlers`. The scoped package `@ar4mirez/hapi-handlers` is the actively maintained version.\n\n## Requirements\n\n- **Node.js** >= 18.0.0\n- **@hapi/hapi** >= 21.0.0\n\n## Installation\n\n```bash\nnpm install @ar4mirez/hapi-handlers\n```\n\n## Usage\n\n### Basic Registration\n\n```javascript\nconst Hapi = require('@hapi/hapi');\n\nconst init = async () => {\n    const server = Hapi.server({ port: 3000 });\n\n    await server.register({\n        plugin: require('@ar4mirez/hapi-handlers'),\n        options: {\n            includes: 'path/to/**/*Handler.js'\n        }\n    });\n\n    // Your handlers are now available\n    server.route({\n        method: 'GET',\n        path: '/hello',\n        handler: {\n            helloHandler: {\n                message: 'Hello World!'\n            }\n        }\n    });\n\n    await server.start();\n    console.log('Server running on %s', server.info.uri);\n};\n\ninit();\n```\n\n### Multiple Patterns\n\n```javascript\nawait server.register({\n    plugin: require('@ar4mirez/hapi-handlers'),\n    options: {\n        includes: [\n            'handlers/**/*.js',\n            'api/**/handler.js'\n        ],\n        ignores: ['**/*.test.js']\n    }\n});\n```\n\n### With Glue/Confidence Manifest\n\n```javascript\nconst manifest = {\n    server: {\n        port: 3000\n    },\n    register: {\n        plugins: [\n            {\n                plugin: '@ar4mirez/hapi-handlers',\n                options: {\n                    includes: 'handlers/**/*.js',\n                    relativeTo: __dirname\n                }\n            }\n        ]\n    }\n};\n```\n\n## Options\n\n### `includes` (required)\n\n- **Type:** `string` | `string[]`\n- **Description:** The [glob](https://github.com/isaacs/node-glob) pattern(s) to match handler files.\n\n```javascript\n// Single pattern\nincludes: 'handlers/**/*.js'\n\n// Multiple patterns\nincludes: ['handlers/**/*.js', 'api/**/handler.js']\n```\n\n### `ignores`\n\n- **Type:** `string` | `string[]`\n- **Description:** Pattern(s) to exclude from matching.\n\n```javascript\nignores: ['**/*.test.js', '**/*.spec.js']\n```\n\n### `relativeTo`\n\n- **Type:** `string`\n- **Default:** `process.cwd()`\n- **Description:** The base directory for resolving patterns.\n\n```javascript\nrelativeTo: __dirname\n```\n\n## Handler Signature\n\nHandler files should export a function that returns a hapi handler function:\n\n```javascript\n// handlers/userHandler.js\n'use strict';\n\nmodule.exports = (route, options) => {\n    // route: the hapi route configuration\n    // options: options passed from route handler config\n\n    return (request, h) => {\n        return {\n            message: options.message || 'Default message',\n            user: request.params.id\n        };\n    };\n};\n```\n\n### Using the Handler\n\n```javascript\nserver.route({\n    method: 'GET',\n    path: '/user/{id}',\n    handler: {\n        userHandler: {\n            message: 'User details'\n        }\n    }\n});\n```\n\n### Async Handlers\n\n```javascript\nmodule.exports = (route, options) => {\n    return async (request, h) => {\n        const user = await fetchUser(request.params.id);\n        return user;\n    };\n};\n```\n\n## Migration from v2/v3\n\nVersion 4.0.0 has breaking changes to support hapi v21+:\n\n### Plugin Registration\n\n```javascript\n// v2/v3 (hapi v13-v16)\nserver.register({\n    register: require('@ar4mirez/hapi-handlers'),\n    options: { ... }\n}, callback);\n\n// v4 (hapi v21+)\nawait server.register({\n    plugin: require('@ar4mirez/hapi-handlers'),\n    options: { ... }\n});\n```\n\n### Handler Signature\n\n```javascript\n// v2/v3\nmodule.exports = (route, options) => {\n    return (request, reply) => {\n        return reply({ message: 'Hello' });\n    };\n};\n\n// v4\nmodule.exports = (route, options) => {\n    return (request, h) => {\n        return { message: 'Hello' };\n        // or: return h.response({ message: 'Hello' });\n    };\n};\n```\n\n### Server Connection\n\n```javascript\n// v2/v3\nconst server = new Hapi.Server();\nserver.connection({ port: 3000 });\n\n// v4\nconst server = Hapi.server({ port: 3000 });\n```\n\n## Contributing\n\nSee [CONTRIBUTING.md](CONTRIBUTING.md) for guidelines.\n\n## License\n\nMIT - see [LICENSE](LICENSE) for details.\n","readmeFilename":"README.md","_rev":"1-e1edd96f97aea613e32ab282bda473fb"}