{"_id":"@bojanrajkovic/containerfile-ts","_rev":"3-3035d0c9ecd61d0b45e3913b6a3c9741","name":"@bojanrajkovic/containerfile-ts","dist-tags":{"latest":"2.0.0"},"versions":{"0.0.1":{"name":"@bojanrajkovic/containerfile-ts","version":"0.0.1","keywords":["oidc","trusted-publishing","setup"],"_id":"@bojanrajkovic/containerfile-ts@0.0.1","maintainers":[{"name":"bojanrajkovic","email":"npm@coderinserepeat.com"}],"dist":{"shasum":"374559e6f65ce9da25cef163f0bef2f55507b198","tarball":"https://registry.npmjs.org/@bojanrajkovic/containerfile-ts/-/containerfile-ts-0.0.1.tgz","fileCount":2,"integrity":"sha512-d6PSOOK65mn0hbFYJw4Wuei88UdJx7jMRPUarcUsr4RdCuXl+iNg819s6hkm8Magcm3Mmh2EitP305sKfZyL7w==","signatures":[{"sig":"MEQCIBr+896X+1DzwBEJ4XOXSnBxugUlzx9D84BZdPjKeeTqAiAuMTRSRT6COXFMVLAPgN9XjXx7BPzDc4FgRYFgPZ0VrQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":2087},"_npmUser":{"name":"bojanrajkovic","email":"npm@coderinserepeat.com"},"_npmVersion":"11.6.2","description":"OIDC trusted publishing setup package for @bojanrajkovic/containerfile-ts","directories":{},"_nodeVersion":"24.11.1","_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/containerfile-ts_0.0.1_1768006118864_0.7829633779347263","host":"s3://npm-registry-packages-npm-production"}},"1.0.0":{"name":"@bojanrajkovic/containerfile-ts","version":"1.0.0","keywords":["dockerfile","containerfile","docker","container","typescript","type-safe"],"author":{"name":"Bojan Rajkovic"},"license":"MIT","_id":"@bojanrajkovic/containerfile-ts@1.0.0","maintainers":[{"name":"bojanrajkovic","email":"npm@coderinserepeat.com"}],"homepage":"https://github.com/bojanrajkovic/containerfile-ts#readme","bugs":{"url":"https://github.com/bojanrajkovic/containerfile-ts/issues"},"dist":{"shasum":"c7baeaccabaf1456fd29e93599d8186a50b19c7c","tarball":"https://registry.npmjs.org/@bojanrajkovic/containerfile-ts/-/containerfile-ts-1.0.0.tgz","fileCount":22,"integrity":"sha512-0Om3JsRivQvzEYc5yuvOcAL7wDUqovbR4UjDef5iIJ76+llOH8AA6SnjKagv2+nkkF52F2BV45RIB5AKCnj1OQ==","signatures":[{"sig":"MEYCIQDVSZsOjms6T3u0JrPKUObLZbAYcC1ZqBMeHe7iSyAbRAIhAOc777hvJkbSjmkHpte7VwyNuTZgkQ+W1h/pyS8pcaCb","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bojanrajkovic%2fcontainerfile-ts@1.0.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":35267},"main":"./dist/index.js","type":"module","types":"./dist/index.d.ts","engines":{"node":">=20"},"exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"gitHead":"f2f404a45c7b7af49ed1389e1a3d1db5fee83a2a","scripts":{"lint":"oxlint","test":"vitest run","build":"tsc","prepare":"husky","lint:fix":"oxlint --fix","typecheck":"tsc --noEmit","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:d621c26d-bbdc-48a2-b242-230006594f6f"}},"repository":{"url":"git+https://github.com/bojanrajkovic/containerfile-ts.git","type":"git"},"_npmVersion":"11.6.2","description":"Type-safe Dockerfile/Containerfile generation with declarative TypeScript","directories":{},"lint-staged":{"*.ts":["oxlint --fix"]},"_nodeVersion":"24.12.0","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"husky":"^9.1.0","oxlint":"^0.15.0","vitest":"^4.0.16","typescript":"^5.7.0","lint-staged":"^15.2.0","@commitlint/cli":"^20.1.0","semantic-release":"^25.0.0","@semantic-release/git":"^10.0.0","@semantic-release/npm":"^11.0.0","@semantic-release/github":"^9.0.0","@semantic-release/changelog":"^6.0.0","@commitlint/config-conventional":"^20.1.0","@semantic-release/commit-analyzer":"^11.0.0","@semantic-release/release-notes-generator":"^12.0.0","conventional-changelog-conventionalcommits":"^8.0.0"},"_npmOperationalInternal":{"tmp":"tmp/containerfile-ts_1.0.0_1768007138177_0.35823243964810114","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@bojanrajkovic/containerfile-ts","version":"2.0.0","description":"Type-safe Dockerfile/Containerfile generation with declarative TypeScript","keywords":["container","containerfile","docker","dockerfile","type-safe","typescript"],"license":"MIT","author":{"name":"Bojan Rajkovic"},"repository":{"type":"git","url":"git+https://github.com/bojanrajkovic/containerfile-ts.git"},"type":"module","main":"./dist/index.js","types":"./dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js"}},"publishConfig":{"access":"public"},"dependencies":{"@sinclair/typebox":"^0.34.47","neverthrow":"^8.2.0"},"devDependencies":{"@changesets/cli":"^2.29.8","@commitlint/cli":"^20.1.0","@commitlint/config-conventional":"^20.1.0","conventional-commits-parser":"^6.2.1","fast-check":"^4.5.3","husky":"^9.1.0","lint-staged":"^16.0.0","oxfmt":"^0.24.0","oxlint":"^1.39.0","tsx":"^4.21.0","typescript":"^5.7.0","vitest":"^4.0.16"},"lint-staged":{"*.ts":["oxlint --fix"],"*.md":["oxfmt --write"]},"engines":{"node":">=20"},"scripts":{"build":"tsc","typecheck":"tsc --noEmit","test":"vitest run","test:watch":"vitest","lint":"oxlint","lint:fix":"oxlint --fix","format":"oxfmt --write .","format:check":"oxfmt --check .","changeset":"changeset","changeset-version":"changeset version","release":"pnpm build && pnpm publish --access public --no-git-checks"},"_id":"@bojanrajkovic/containerfile-ts@2.0.0","bugs":{"url":"https://github.com/bojanrajkovic/containerfile-ts/issues"},"homepage":"https://github.com/bojanrajkovic/containerfile-ts#readme","_integrity":"sha512-vhwnEX27C78uJHbUI49oH8ksPb/y7zxW9buypU5AGwhnqx820hfPBFXY8lOcKmVI8mYZV21F4DvMY6rrpv+G9w==","_resolved":"/private/var/folders/z9/9pbspyxs6n95s8dnb4sk5cdh0000gn/T/9fb8fe1bfe57ada105a0e8337817edc6/bojanrajkovic-containerfile-ts-2.0.0.tgz","_from":"file:bojanrajkovic-containerfile-ts-2.0.0.tgz","_nodeVersion":"24.11.1","_npmVersion":"11.6.2","dist":{"integrity":"sha512-vhwnEX27C78uJHbUI49oH8ksPb/y7zxW9buypU5AGwhnqx820hfPBFXY8lOcKmVI8mYZV21F4DvMY6rrpv+G9w==","shasum":"d74805e16f76bb82b70a3503e4fd411bf764f330","tarball":"https://registry.npmjs.org/@bojanrajkovic/containerfile-ts/-/containerfile-ts-2.0.0.tgz","fileCount":34,"unpackedSize":81500,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIEYvgidevilfEXGnnWa0Mwi3jCCrTOof6szU47XXoC2yAiALEjDObfthP1dV/xibNJhTwdOpkCvOwx2r9M+UWqesaw=="}]},"_npmUser":{"name":"bojanrajkovic","email":"npm@coderinserepeat.com"},"directories":{},"maintainers":[{"name":"bojanrajkovic","email":"npm@coderinserepeat.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/containerfile-ts_2.0.0_1768747155482_0.6488979935193191"},"_hasShrinkwrap":false}},"time":{"created":"2026-01-10T00:48:38.791Z","modified":"2026-01-18T14:39:15.758Z","0.0.1":"2026-01-10T00:48:39.013Z","1.0.0":"2026-01-10T01:05:38.334Z","2.0.0":"2026-01-18T14:39:15.622Z"},"bugs":{"url":"https://github.com/bojanrajkovic/containerfile-ts/issues"},"author":{"name":"Bojan Rajkovic"},"license":"MIT","homepage":"https://github.com/bojanrajkovic/containerfile-ts#readme","keywords":["container","containerfile","docker","dockerfile","type-safe","typescript"],"repository":{"type":"git","url":"git+https://github.com/bojanrajkovic/containerfile-ts.git"},"description":"Type-safe Dockerfile/Containerfile generation with declarative TypeScript","maintainers":[{"name":"bojanrajkovic","email":"npm@coderinserepeat.com"}],"readme":"# containerfile-ts\n\n[![CI](https://github.com/bojanrajkovic/containerfile-ts/actions/workflows/ci.yml/badge.svg)](https://github.com/bojanrajkovic/containerfile-ts/actions/workflows/ci.yml)\n[![npm version](https://badge.fury.io/js/%40bojanrajkovic%2Fcontainerfile-ts.svg)](https://www.npmjs.com/package/@bojanrajkovic/containerfile-ts)\n\nType-safe Dockerfile/Containerfile generation with declarative TypeScript, inspired by [gha-ts](https://github.com/JLarky/gha-ts).\n\n> **Note:** This is a vibe-coded library, built quickly with AI assistance as an experiment in declarative container definitions. It works, but take it in that spirit. PRs welcome if you find rough edges!\n\n## Installation\n\n**Stable release (npm):**\n\n```bash\nnpm install @bojanrajkovic/containerfile-ts\n# or\npnpm add @bojanrajkovic/containerfile-ts\n# or\nyarn add @bojanrajkovic/containerfile-ts\n```\n\n**Alpha releases (GitHub Packages):**\n\nTo install pre-release versions from feature branches:\n\n```bash\n# Configure npm to use GitHub Package Registry for @bojanrajkovic scope\necho \"@bojanrajkovic:registry=https://npm.pkg.github.com\" >> .npmrc\n\n# Install specific alpha version\npnpm add @bojanrajkovic/containerfile-ts@1.0.0-branch-name.1\n```\n\n**Note:** GitHub Package Registry requires authentication. See [GitHub Packages documentation](https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-npm-registry#authenticating-to-github-packages) for setup.\n\n## Usage\n\n### Simple Dockerfile\n\n```typescript\nimport {\n  containerfile,\n  from,\n  workdir,\n  copy,\n  run,\n  expose,\n  cmd,\n  render,\n} from \"@bojanrajkovic/containerfile-ts\";\n\nconst dockerfile = containerfile({\n  instructions: [\n    from(\"node:20-alpine\"),\n    workdir(\"/app\"),\n    copy(\"package*.json\", \".\"),\n    run(\"npm ci\"),\n    copy(\".\", \".\"),\n    expose(3000),\n    cmd([\"node\", \"dist/index.js\"]),\n  ],\n});\n\nconsole.log(render(dockerfile));\n```\n\nOutput:\n\n```dockerfile\nFROM node:20-alpine\nWORKDIR /app\nCOPY package*.json .\nRUN npm ci\nCOPY . .\nEXPOSE 3000\nCMD [\"node\", \"dist/index.js\"]\n```\n\n### Multi-Stage Build\n\n```typescript\nimport {\n  containerfile,\n  stage,\n  from,\n  workdir,\n  copy,\n  run,\n  cmd,\n  render,\n} from \"@bojanrajkovic/containerfile-ts\";\n\nconst dockerfile = containerfile({\n  stages: [\n    stage(\"builder\", [\n      from(\"node:20\", { as: \"builder\" }),\n      workdir(\"/app\"),\n      copy(\"package*.json\", \".\"),\n      run(\"npm ci\"),\n      copy(\".\", \".\"),\n      run(\"npm run build\"),\n    ]),\n    stage(\"runtime\", [\n      from(\"node:20-alpine\", { as: \"runtime\" }),\n      workdir(\"/app\"),\n      copy(\"/app/dist\", \"./dist\", { from: \"builder\" }),\n      cmd([\"node\", \"dist/index.js\"]),\n    ]),\n  ],\n});\n\nconsole.log(render(dockerfile));\n```\n\n## API Reference\n\n### Factory Functions\n\n| Function                    | Description                           |\n| --------------------------- | ------------------------------------- |\n| `from(image, options?)`     | FROM instruction                      |\n| `run(command)`              | RUN instruction (string or exec form) |\n| `copy(src, dest, options?)` | COPY instruction                      |\n| `add(src, dest, options?)`  | ADD instruction                       |\n| `workdir(path)`             | WORKDIR instruction                   |\n| `env(key, value)`           | ENV instruction                       |\n| `expose(port, options?)`    | EXPOSE instruction                    |\n| `cmd(command)`              | CMD instruction (exec form)           |\n| `entrypoint(command)`       | ENTRYPOINT instruction (exec form)    |\n| `arg(name, options?)`       | ARG instruction                       |\n| `label(key, value)`         | LABEL instruction                     |\n| `stage(name, instructions)` | Named stage for multi-stage builds    |\n| `containerfile(def)`        | Create containerfile definition       |\n\n### Rendering\n\n| Function                | Description                 |\n| ----------------------- | --------------------------- |\n| `render(containerfile)` | Render to Dockerfile string |\n\n## Options\n\n### FromOptions\n\n- `as?: string` - Stage name (AS clause)\n- `platform?: string` - Target platform\n\n### CopyOptions\n\n- `from?: string` - Source stage name\n- `chown?: string` - Change ownership\n- `chmod?: string` - Change permissions\n\n### AddOptions\n\n- `chown?: string` - Change ownership\n- `chmod?: string` - Change permissions\n\n### ExposeOptions\n\n- `protocol?: 'tcp' | 'udp' | 'sctp'` - Port protocol (default: tcp)\n\n### ArgOptions\n\n- `defaultValue?: string` - Default value for build arg\n\n## Changelog\n\nSee [CHANGELOG.md](./CHANGELOG.md) for release history and changes.\n\n**Note:** The changelog is automatically generated from conventional commit messages.\n\n## License\n\nMIT\n","readmeFilename":"README.md"}