{"_id":"@arylo/caddyfile-sdk","name":"@arylo/caddyfile-sdk","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@arylo/caddyfile-sdk","version":"1.0.0","description":"SDK for Caddyfile","keywords":["caddy","caddyfile","sdk"],"homepage":"https://github.com/Arylo/scripts/tree/master/apps/caddyfile-sdk","bugs":{"url":"https://github.com/Arylo/scripts/issues"},"license":"MIT","author":{"name":"Arylo Yeung","email":"arylo.open@gmail.com"},"repository":{"type":"git","url":"git+https://github.com/Arylo/scripts.git","directory":"apps/caddyfile-sdk"},"main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","require":"./dist/index.js","default":"./dist/index.js"}},"publishConfig":{"access":"public"},"scripts":{"build":"tsc -p tsconfig.json","clean":"rimraf dist","prepublishOnly":"npm run build","lint":"concurrently npm:lint:*","lint:type-check":"tsc -p tsconfig.json --noEmit","lint:formatter":"oxfmt --check","lint:oxlint":"oxlint","test":"vitest run src","fix:formatter":"oxfmt"},"devDependencies":{"concurrently":"^8.2.2","oxfmt":"^0.35.0","oxlint":"^1.24.0","rimraf":"^6.0.1","typescript":"^5.4.5","vitest":"^4.1.0"},"gitHead":"379b318e506763c94338391418dfb82ad5743d60","_id":"@arylo/caddyfile-sdk@1.0.0","_nodeVersion":"24.12.0","_npmVersion":"11.6.2","dist":{"integrity":"sha512-EPDsW7Eqs0pv/KkFKnwryGDEYtvxebvquJAnCjVfHPYH0WC++SVV+PsPouRYhMJOstpPMAqCg3amjqDaRox+1Q==","shasum":"3b634c237d03e66a371d3b7550f84cb2d028c5dd","tarball":"https://registry.npmjs.org/@arylo/caddyfile-sdk/-/caddyfile-sdk-1.0.0.tgz","fileCount":93,"unpackedSize":98825,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIG6chCQ5CSAuHMgjBaghuzVvsiPFszguauUDwqcE9ZMWAiEAmdhgCI03KKBLAyOTnoAN0lLfMYeU+PbPpip9C2fyZxE="}]},"_npmUser":{"name":"arylo","email":"arylo.open+npm@gmail.com"},"directories":{},"maintainers":[{"name":"arylo","email":"arylo.open+npm@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/caddyfile-sdk_1.0.0_1773391050955_0.9578681610060558"},"_hasShrinkwrap":false}},"time":{"created":"2026-03-13T08:37:30.895Z","1.0.0":"2026-03-13T08:37:31.138Z","modified":"2026-03-13T08:37:31.325Z"},"maintainers":[{"name":"arylo","email":"arylo.open+npm@gmail.com"}],"description":"SDK for Caddyfile","homepage":"https://github.com/Arylo/scripts/tree/master/apps/caddyfile-sdk","keywords":["caddy","caddyfile","sdk"],"repository":{"type":"git","url":"git+https://github.com/Arylo/scripts.git","directory":"apps/caddyfile-sdk"},"author":{"name":"Arylo Yeung","email":"arylo.open@gmail.com"},"bugs":{"url":"https://github.com/Arylo/scripts/issues"},"license":"MIT","readme":"# @arylo/caddyfile-sdk\n\nSDK for parsing, manipulating, and generating Caddyfile content.\n\n## Features\n\n- Create Caddyfile structures with a typed API\n- Parse existing Caddyfile text into editable objects\n- Generate Caddyfile text with `toString()`\n- Support global, snippet, site, matcher, directive, and comment blocks\n- Enforce common uniqueness rules, such as a single root global block\n\n## Install\n\n```bash\nnpm install @arylo/caddyfile-sdk\n```\n\n## Usage\n\n### Create a Caddyfile\n\n```ts\nimport { createCaddyfile } from '@arylo/caddyfile-sdk'\n\nconst caddyfile = createCaddyfile()\n\nconst globalBlock = caddyfile.addGlobalBlock()\nglobalBlock.addDirectiveBlock('email', 'you@yours.com')\nglobalBlock\n  .addDirectiveBlock('servers')\n  .addDirectiveBlock('trusted_proxies', 'static', 'private_ranges')\n\nconst snippetBlock = caddyfile.addSnippetBlock('snippet')\nsnippetBlock.addCommentBlock('this is a reusable snippet')\nsnippetBlock.addDirectiveBlock('log').addDirectiveBlock('output', 'file', '/var/log/access.log')\n\nconst siteBlock = caddyfile.addSiteBlock('example.com')\nsiteBlock.addMatcherBlock('post').addDirectiveBlock('method', 'POST')\nsiteBlock\n  .addDirectiveBlock('reverse_proxy', '@post', 'localhost:9001', 'localhost:9002')\n  .addDirectiveBlock('lb_policy', 'first')\nsiteBlock.addDirectiveBlock('file_server', '/static')\nsiteBlock.addDirectiveBlock('import', 'snippet')\n\nconsole.log(caddyfile.toString())\n```\n\nOutput:\n\n```caddyfile\n{\n  email you@yours.com\n  servers {\n    trusted_proxies static private_ranges\n  }\n}\n(snippet) {\n  # this is a reusable snippet\n  log {\n    output file /var/log/access.log\n  }\n}\nexample.com {\n  @post {\n    method POST\n  }\n  reverse_proxy @post localhost:9001 localhost:9002 {\n    lb_policy first\n  }\n  file_server /static\n  import snippet\n}\n```\n\n### Parse a Caddyfile\n\n```ts\nimport { parseCaddyfile } from '@arylo/caddyfile-sdk'\n\nconst caddyfile = parseCaddyfile(`\nexample.com {\n  respond \"hello\"\n}\n`)\n\nconst siteBlock = caddyfile.listSiteBlock()[0]\nsiteBlock.addDirectiveBlock('encode', 'gzip')\n\nconsole.log(caddyfile.toString())\n```\n\n## API\n\n### `createCaddyfile()`\n\nCreates a new empty Caddyfile object.\n\n### `parseCaddyfile(text)`\n\nParses Caddyfile text and returns an editable Caddyfile object.\n\n### Root block helpers\n\nThe returned Caddyfile object supports:\n\n- `addGlobalBlock()`\n- `removeGlobalBlock()`\n- `hasGlobalBlock()`\n- `getGlobalBlock()`\n- `addSnippetBlock(name)`\n- `removeSnippetBlockById(id)`\n- `getSnippetBlockByName(name)`\n- `listSnippetBlock()`\n- `addSiteBlock(name | names)`\n- `removeSiteBlockById(id)`\n- `getSiteBlockById(id)`\n- `listSiteBlock()`\n- `addCommentBlock(comment)`\n- `removeCommentBlockById(id)`\n- `getCommentBlockById(id)`\n- `toString()`\n\nNested blocks expose helpers such as:\n\n- `addDirectiveBlock(name, ...args)`\n- `addMatcherBlock(name)`\n- `addCommentBlock(comment)`\n\n## Constraints\n\n- Only one global block is allowed at the root level\n- Root snippet names must be unique\n- Matcher names must be unique within the same parent block\n- Directive names must be unique within the same parent block\n- Site blocks must have at least one site name\n\n## Development\n\nFrom the package directory:\n\n- `npm run lint`\n- `npm run test`\n- `npm run build`\n\n## License\n\nMIT\n","readmeFilename":"README.md","_rev":"1-823c2abf598e6f9b99e30a135be8aa28"}