{"_id":"@c6fc/spellcraft-terraform","_rev":"9-b472ea3e34f540c05fc5fa55a9afcd28","name":"@c6fc/spellcraft-terraform","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@c6fc/spellcraft-terraform","version":"1.0.0","author":{"url":"brad@bradwoodward.io","name":"Brad Woodward"},"license":"MIT","_id":"@c6fc/spellcraft-terraform@1.0.0","maintainers":[{"name":"c6fc","email":"brad@bradwoodward.io"}],"homepage":"https://github.com/c6fc/spellcraft-terraform#readme","bugs":{"url":"https://github.com/c6fc/spellcraft-terraform/issues"},"bin":{"cli":"utils/cli-test.js"},"dist":{"shasum":"65e3e96b35bc78bd121a48f08a468efaf3c126a8","tarball":"https://registry.npmjs.org/@c6fc/spellcraft-terraform/-/spellcraft-terraform-1.0.0.tgz","fileCount":9,"integrity":"sha512-qy6VjN8KP7+USCQsjIkQuDfH6x1UL2NSCrfE+VZat0vADkE6iGj9NESdzSXwbkuNk1rRYqXK1CzUn3g7Pn/ZOA==","signatures":[{"sig":"MEQCIFq36nwtMgQC2rUAk9y+cdJPw7KmQlgk/VO2Hm+2xTI4AiBtg9XgR+6EnRejOXZuaG+UM0+F2iW3shg4D9YcO/fQHA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9657},"main":"module.js","config":{"spellcraft_module_default_name":"terraform"},"gitHead":"01b00dda065af08d4b722962fcc0a7775efc680e","scripts":{"doc":"jsdoc -c utils/jsdoc.json --verbose","test":"node utils/test.js"},"_npmUser":{"name":"c6fc","actor":{"name":"c6fc","type":"user","email":"brad@bradwoodward.io"},"email":"brad@bradwoodward.io"},"repository":{"url":"git+https://github.com/c6fc/spellcraft-terraform.git","type":"git"},"_npmVersion":"10.8.2","description":"A plugin to expose Hashicorp Terraform via @c6fc/spellcraft","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@c6fc/terraform":"^1.0.1","@c6fc/spellcraft":"^0.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^4.0.4","clean-jsdoc-theme":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/spellcraft-terraform_1.0.0_1750724384304_0.9642811396829718","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"@c6fc/spellcraft-terraform","version":"1.0.1","author":{"url":"brad@bradwoodward.io","name":"Brad Woodward"},"license":"MIT","_id":"@c6fc/spellcraft-terraform@1.0.1","maintainers":[{"name":"c6fc","email":"brad@bradwoodward.io"}],"homepage":"https://github.com/c6fc/spellcraft-terraform#readme","bugs":{"url":"https://github.com/c6fc/spellcraft-terraform/issues"},"dist":{"shasum":"8d9f80a1ccae7cd6fb2af6e4d7446e4a37d39439","tarball":"https://registry.npmjs.org/@c6fc/spellcraft-terraform/-/spellcraft-terraform-1.0.1.tgz","fileCount":9,"integrity":"sha512-ar7vKkJ4SRl7vdgU+Il9mBPnqTR09okZDWFTX7+xdzvYFFBhrxwFUmgknKAQrseIbDPDPk1pqfa5Wwj5wW7Z6Q==","signatures":[{"sig":"MEUCIBzD/lYx2QJ+8XZydJu96cQNCl7VlRAHLEUThvQBpu5ZAiEAuSQXlyo524v/q8epqHiVHt29/mvN6agKQWhF8re4HXA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9642},"main":"module.js","config":{"spellcraft_module_default_name":"terraform"},"gitHead":"19c412a6d7d905e6799f2f551793855f577816a2","scripts":{"cli":"utils/cli-test.js","doc":"jsdoc -c utils/jsdoc.json --verbose","test":"node utils/test.js"},"_npmUser":{"name":"c6fc","actor":{"name":"c6fc","type":"user","email":"brad@bradwoodward.io"},"email":"brad@bradwoodward.io"},"repository":{"url":"git+https://github.com/c6fc/spellcraft-terraform.git","type":"git"},"_npmVersion":"10.8.2","description":"A plugin to expose Hashicorp Terraform via @c6fc/spellcraft","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@c6fc/terraform":"^1.0.2","@c6fc/spellcraft":"^0.0.1"},"_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^4.0.4","clean-jsdoc-theme":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/spellcraft-terraform_1.0.1_1750895041239_0.25245045369871066","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"@c6fc/spellcraft-terraform","version":"1.0.2","author":{"url":"brad@bradwoodward.io","name":"Brad Woodward"},"license":"MIT","_id":"@c6fc/spellcraft-terraform@1.0.2","maintainers":[{"name":"c6fc","email":"brad@bradwoodward.io"}],"homepage":"https://github.com/c6fc/spellcraft-terraform#readme","bugs":{"url":"https://github.com/c6fc/spellcraft-terraform/issues"},"dist":{"shasum":"5e6d931453517c368b2984cf301f57872276cdd6","tarball":"https://registry.npmjs.org/@c6fc/spellcraft-terraform/-/spellcraft-terraform-1.0.2.tgz","fileCount":9,"integrity":"sha512-fT0aYbdL6SmIQQ2CBjZxc3h6fb6+s2S+ydAppimYgKJRcobMtvVYp2Rjl5uz0Gs3nIe+N/YrtPVWzei5U6sBig==","signatures":[{"sig":"MEQCIAt5/YArJFk7X4MFmkevBlh2AvNWdO/EE0YUEeMrXHHsAiB4lAuICJwtJYNmDGqbGfS5WxyyTTkFvchPDcyv8S68Nw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9619},"main":"module.js","config":{"spellcraft_module_default_name":"terraform"},"gitHead":"d0ef8cfd6d584756199de37fceaf9cf25932b732","scripts":{"cli":"utils/cli-test.js","doc":"jsdoc -c utils/jsdoc.json --verbose","test":"node utils/test.js"},"_npmUser":{"name":"c6fc","actor":{"name":"c6fc","type":"user","email":"brad@bradwoodward.io"},"email":"brad@bradwoodward.io"},"repository":{"url":"git+https://github.com/c6fc/spellcraft-terraform.git","type":"git"},"_npmVersion":"10.8.2","description":"A plugin to expose Hashicorp Terraform via @c6fc/spellcraft","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@c6fc/terraform":"^1.0.3","@c6fc/spellcraft":"^0.0.4"},"_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^4.0.4","clean-jsdoc-theme":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/spellcraft-terraform_1.0.2_1750996480797_0.734043703741744","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"@c6fc/spellcraft-terraform","version":"1.0.3","author":{"url":"brad@bradwoodward.io","name":"Brad Woodward"},"license":"MIT","_id":"@c6fc/spellcraft-terraform@1.0.3","maintainers":[{"name":"c6fc","email":"brad@bradwoodward.io"}],"homepage":"https://github.com/c6fc/spellcraft-terraform#readme","bugs":{"url":"https://github.com/c6fc/spellcraft-terraform/issues"},"dist":{"shasum":"86ed7b93f8554175a0a321a6b60af0a39e55efbb","tarball":"https://registry.npmjs.org/@c6fc/spellcraft-terraform/-/spellcraft-terraform-1.0.3.tgz","fileCount":9,"integrity":"sha512-KA+4fjLDyvQ4Kfhu5QSQfefLWra67sjizKgP+CcUTuxGfYTXyIR36l4fKvvpU0Z4VHy4nBPzI8mUifbCMzVniw==","signatures":[{"sig":"MEQCIDQ+NgqvQ1dfpp+C59NgGEY3ivl3MVBYkR9bbcjzBSlgAiBdeWgk8ooq2FlV8Q4chm9qrfTkNulNb7pmgSFUzJEj9A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9618},"main":"module.js","config":{"spellcraft_module_default_name":"terraform"},"gitHead":"8566ab385edb3d711f2a30af81116e62b5e5954a","scripts":{"cli":"utils/cli-test.js","doc":"jsdoc -c utils/jsdoc.json --verbose","test":"node utils/test.js"},"_npmUser":{"name":"c6fc","actor":{"name":"c6fc","type":"user","email":"brad@bradwoodward.io"},"email":"brad@bradwoodward.io"},"repository":{"url":"git+https://github.com/c6fc/spellcraft-terraform.git","type":"git"},"_npmVersion":"10.8.2","description":"A plugin to expose Hashicorp Terraform via @c6fc/spellcraft","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@c6fc/terraform":"^1.0.3","@c6fc/spellcraft":"^0.0.4"},"_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^4.0.4","clean-jsdoc-theme":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/spellcraft-terraform_1.0.3_1750996643087_0.052163876959524735","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"@c6fc/spellcraft-terraform","version":"1.0.4","author":{"url":"brad@bradwoodward.io","name":"Brad Woodward"},"license":"MIT","_id":"@c6fc/spellcraft-terraform@1.0.4","maintainers":[{"name":"c6fc","email":"brad@bradwoodward.io"}],"homepage":"https://github.com/c6fc/spellcraft-terraform#readme","bugs":{"url":"https://github.com/c6fc/spellcraft-terraform/issues"},"dist":{"shasum":"eea5ee8a03473bbbc40dffcceb03047bbbc549a0","tarball":"https://registry.npmjs.org/@c6fc/spellcraft-terraform/-/spellcraft-terraform-1.0.4.tgz","fileCount":9,"integrity":"sha512-mM67//0qJi1io1Pu5GxYZLL5lk+kYAd3GhTb8gLIXbvVA3JnLU5NMgoM7qOuENyq4XnLsQzvrU23yi2SIuNkrg==","signatures":[{"sig":"MEYCIQDK7kVjEM9BZuOEk9AUEBcX9Gkf4vEn4OS2kX8AXvOfegIhAMDljVxZFAujrz3uOHpO2TsQjQaUzhCwW3jsVLDSXaPk","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9794},"main":"module.js","config":{"spellcraft_module_default_name":"terraform"},"gitHead":"3861bb9795eaa05fcea1f21e65692fdbbeceb7da","scripts":{"cli":"utils/cli-test.js","doc":"jsdoc -c utils/jsdoc.json --verbose","test":"node utils/test.js"},"_npmUser":{"name":"c6fc","actor":{"name":"c6fc","type":"user","email":"brad@bradwoodward.io"},"email":"brad@bradwoodward.io"},"repository":{"url":"git+https://github.com/c6fc/spellcraft-terraform.git","type":"git"},"_npmVersion":"10.8.2","description":"A plugin to expose Hashicorp Terraform via @c6fc/spellcraft","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@c6fc/terraform":"^1.0.4","@c6fc/spellcraft":"^0.0.4"},"_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^4.0.4","clean-jsdoc-theme":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/spellcraft-terraform_1.0.4_1750998225869_0.4228265123511792","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"name":"@c6fc/spellcraft-terraform","version":"1.0.5","author":{"url":"brad@bradwoodward.io","name":"Brad Woodward"},"license":"MIT","_id":"@c6fc/spellcraft-terraform@1.0.5","maintainers":[{"name":"c6fc","email":"brad@bradwoodward.io"}],"homepage":"https://github.com/c6fc/spellcraft-terraform#readme","bugs":{"url":"https://github.com/c6fc/spellcraft-terraform/issues"},"dist":{"shasum":"479e6b45c6b767bd150c1a3741e2163a378278bd","tarball":"https://registry.npmjs.org/@c6fc/spellcraft-terraform/-/spellcraft-terraform-1.0.5.tgz","fileCount":9,"integrity":"sha512-yPehm7cb+A8VPLNHGRADDvjZAFe00poJYIAT294IiVejVjY35f/IqdcYgfFNDhosiFh7H5zZpubuo/ljgJqz/A==","signatures":[{"sig":"MEUCIB8TTc55eiNlNp9SId1onmzgp3Ffb8kLK04yGG3Aj4c7AiEAqfJ2Pfnlcu2kUhggxHwCmQRSD1YfoQ+C8kOzSDuLBnA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9792},"main":"module.js","config":{"spellcraft_module_default_name":"terraform"},"gitHead":"7fe920021c276b5234bbe13f2519a77f1998098c","scripts":{"cli":"utils/cli-test.js","doc":"jsdoc -c utils/jsdoc.json --verbose","test":"node utils/test.js"},"_npmUser":{"name":"c6fc","actor":{"name":"c6fc","type":"user","email":"brad@bradwoodward.io"},"email":"brad@bradwoodward.io"},"repository":{"url":"git+https://github.com/c6fc/spellcraft-terraform.git","type":"git"},"_npmVersion":"10.8.2","description":"A plugin to expose Hashicorp Terraform via @c6fc/spellcraft","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@c6fc/terraform":"1.0.4","@c6fc/spellcraft":"0.0.5"},"_hasShrinkwrap":false,"devDependencies":{"jsdoc":"^4.0.4","clean-jsdoc-theme":"^4.3.0"},"_npmOperationalInternal":{"tmp":"tmp/spellcraft-terraform_1.0.5_1751059049218_0.774984912354775","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@c6fc/spellcraft-terraform","version":"1.1.3","keywords":["spellcraft","terraform"],"author":{"url":"brad@bradwoodward.io","name":"Brad Woodward"},"license":"MIT","_id":"@c6fc/spellcraft-terraform@1.1.3","maintainers":[{"name":"c6fc","email":"brad@bradwoodward.io"}],"homepage":"https://github.com/c6fc/spellcraft-terraform#readme","bugs":{"url":"https://github.com/c6fc/spellcraft-terraform/issues"},"dist":{"shasum":"7dbc139cc26de2533d54fd2f6df55ba9ed8fdb64","tarball":"https://registry.npmjs.org/@c6fc/spellcraft-terraform/-/spellcraft-terraform-1.1.3.tgz","fileCount":8,"integrity":"sha512-JfccuGaFm1bo72wQd3nbw4rp+El2bwuYI/4bTK9xFX3RbZZcbat8md+omz6vZ1sFEgql29L1Wan50hpv6k130w==","signatures":[{"sig":"MEYCIQCYPp+KqnuWJoREL8La9U2F20pFoXsb7738bQ+GZrPFUgIhAMIgiuLxmkSWCmnC5gZjrEqMc6P6YNkKaWHdvZv/r7t0","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":8674},"main":"module.js","gitHead":"7fe920021c276b5234bbe13f2519a77f1998098c","scripts":{"cli":"utils/cli-test.js","test":"node utils/test.js"},"_npmUser":{"name":"c6fc","email":"brad@bradwoodward.io"},"repository":{"url":"git+https://github.com/c6fc/spellcraft-terraform.git","type":"git"},"spellcraft":true,"_npmVersion":"10.8.2","description":"A plugin to expose Hashicorp Terraform via @c6fc/spellcraft","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@c6fc/terraform":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","@c6fc/spellcraft":"~0.1.0"},"peerDependencies":{"@c6fc/spellcraft":"~0.1.0"},"_npmOperationalInternal":{"tmp":"tmp/spellcraft-terraform_1.1.3_1766189201205_0.07020457040894734","host":"s3://npm-registry-packages-npm-production"}},"1.2.0":{"name":"@c6fc/spellcraft-terraform","version":"1.2.0","keywords":["spellcraft","terraform"],"author":{"url":"brad@bradwoodward.io","name":"Brad Woodward"},"license":"MIT","_id":"@c6fc/spellcraft-terraform@1.2.0","maintainers":[{"name":"c6fc","email":"brad@bradwoodward.io"}],"homepage":"https://github.com/c6fc/spellcraft-terraform#readme","bugs":{"url":"https://github.com/c6fc/spellcraft-terraform/issues"},"dist":{"shasum":"cfd9a16ca2bb4c6b01736508e5bf734b7ab577cd","tarball":"https://registry.npmjs.org/@c6fc/spellcraft-terraform/-/spellcraft-terraform-1.2.0.tgz","fileCount":8,"integrity":"sha512-GXvqAhN/btvU+es5fmudecB0sRM8U5YyMMKazbUjeFdLfxjt1eqOE9+ttRvuPCBdqBD99MWLAFYF4iBhbDJV5A==","signatures":[{"sig":"MEQCIDOjUIRB3RUgfvegESa3/N9tAZBLcQovyWUTXNIzCj1eAiAxCI/etnpk0p1LEaZ/z3ffgw5JwBjZMlClyeRNp8xUfg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":9886},"main":"module.js","gitHead":"0b1c49d3e4b2680fe96ee14a7f7797c42a817c32","scripts":{"cli":"utils/cli-test.js","test":"node utils/test.js"},"_npmUser":{"name":"c6fc","email":"brad@bradwoodward.io"},"repository":{"url":"git+https://github.com/c6fc/spellcraft-terraform.git","type":"git"},"spellcraft":true,"_npmVersion":"10.8.2","description":"A plugin to expose Hashicorp Terraform via @c6fc/spellcraft","directories":{},"_nodeVersion":"20.19.0","dependencies":{"@c6fc/terraform":"^1.0.4"},"_hasShrinkwrap":false,"devDependencies":{"yargs":"^18.0.0","@c6fc/spellcraft":"~0.2.0"},"peerDependencies":{"@c6fc/spellcraft":"~0.2.0"},"_npmOperationalInternal":{"tmp":"tmp/spellcraft-terraform_1.2.0_1780343851773_0.7738212531371302","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@c6fc/spellcraft-terraform","version":"2.0.0","main":"module.js","scripts":{"cli":"utils/cli-test.js","test":"node utils/test.js","doc":"spellcraft doc"},"repository":{"type":"git","url":"git+https://github.com/c6fc/spellcraft-terraform.git"},"spellcraft":true,"keywords":["spellcraft","terraform"],"author":{"name":"Brad Woodward","url":"brad@bradwoodward.io"},"license":"MIT","bugs":{"url":"https://github.com/c6fc/spellcraft-terraform/issues"},"homepage":"https://github.com/c6fc/spellcraft-terraform#readme","description":"Provider-neutral Terraform lifecycle. Owns terraform-apply and emits the events other plugins hook to run work before it.","peerDependencies":{"@c6fc/spellcraft":"^1.0.0"},"devDependencies":{"@c6fc/spellcraft":"^1.0.0","yargs":"^18.0.0"},"dependencies":{"@c6fc/terraform":"^1.0.4"},"engines":{"node":">=18"},"_id":"@c6fc/spellcraft-terraform@2.0.0","gitHead":"e3c6b735571f8f1eb6d9c72f43fc5d745719ccdf","_nodeVersion":"20.19.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-uqX6OKl1AGj5imxROK8XRqINrgCJwYzgjed3wo/oB3ppOYrA6FlJG4rj4SswyULww/CQReMX7cVPW2fINEaKBQ==","shasum":"73eaa268136daacc2d4b8d0e06ba232626a00ad4","tarball":"https://registry.npmjs.org/@c6fc/spellcraft-terraform/-/spellcraft-terraform-2.0.0.tgz","fileCount":6,"unpackedSize":12876,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIFKqp5QKYl7nYnlA0x5V78LksMjaPo0mlh+GBh23a5u3AiEAx2BFVOScNttciYfwGpwjpWW5nSCGEXC6eWOswjyL+ik="}]},"_npmUser":{"name":"c6fc","email":"brad@bradwoodward.io"},"directories":{},"maintainers":[{"name":"c6fc","email":"brad@bradwoodward.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/spellcraft-terraform_2.0.0_1788728959527_0.21128808547505207"},"_hasShrinkwrap":false}},"time":{"created":"2025-06-24T00:19:44.239Z","modified":"2026-09-06T21:09:19.809Z","1.0.0":"2025-06-24T00:19:44.514Z","1.0.1":"2025-06-25T23:44:01.470Z","1.0.2":"2025-06-27T03:54:40.992Z","1.0.3":"2025-06-27T03:57:23.279Z","1.0.4":"2025-06-27T04:23:46.041Z","1.0.5":"2025-06-27T21:17:29.390Z","1.1.3":"2025-12-20T00:06:41.333Z","1.2.0":"2026-06-01T19:57:31.917Z","2.0.0":"2026-09-06T21:09:19.659Z"},"bugs":{"url":"https://github.com/c6fc/spellcraft-terraform/issues"},"author":{"name":"Brad Woodward","url":"brad@bradwoodward.io"},"license":"MIT","homepage":"https://github.com/c6fc/spellcraft-terraform#readme","keywords":["spellcraft","terraform"],"repository":{"type":"git","url":"git+https://github.com/c6fc/spellcraft-terraform.git"},"description":"Provider-neutral Terraform lifecycle. Owns terraform-apply and emits the events other plugins hook to run work before it.","maintainers":[{"name":"c6fc","email":"brad@bradwoodward.io"}],"readme":"# @c6fc/spellcraft-terraform\n\nProvider-neutral Terraform lifecycle for\n[SpellCraft](https://github.com/c6fc/spellcraft): renders a manifest, then runs\n`terraform apply` on the result.\n\n[![NPM version](https://img.shields.io/npm/v/@c6fc/spellcraft-terraform.svg?style=flat)](https://www.npmjs.com/package/@c6fc/spellcraft-terraform)\n[![License](https://img.shields.io/npm/l/@c6fc/spellcraft-terraform.svg?style=flat)](https://opensource.org/licenses/MIT)\n\n```bash\nnpm install --save @c6fc/spellcraft-terraform\n```\n\nThis plugin knows nothing about any particular cloud. It owns the Terraform\nbinary, the apply, and the lifecycle events that let provider plugins do their\nwork at the right moment — `@c6fc/spellcraft-aws-terraform` and\n`@c6fc/spellcraft-gcp-terraform` build on it.\n\n## Rendering and applying\n\nTerraform reads JSON, so a manifest emits `.tf.json` files and needs no special\nhandling:\n\n```jsonnet\n{\n\t\"main.tf.json\": {\n\t\tterraform: { required_version: \">= 1.2\" },\n\t\tresource: {\n\t\t\taws_s3_bucket: {\n\t\t\t\tartifacts: { bucket: \"my-artifacts\" },\n\t\t\t},\n\t\t},\n\t},\n}\n```\n\n```bash\nnpx spellcraft terraform-apply manifest.jsonnet\n```\n\nThat renders the manifest into `render/`, then runs `terraform init` and\n`terraform apply` in that directory. `render/` is the Terraform root module —\nthere is no separate working directory to keep in sync.\n\n| flag | effect |\n|---|---|\n| `-y`, `--auto-approve` | pass `-auto-approve` to `terraform apply` |\n| `-s`, `--skip-init` | skip `terraform init`, for when you manage it yourself |\n\n## Tearing down\n\n```bash\nnpx spellcraft terraform-destroy manifest.jsonnet\n```\n\nThis re-renders the manifest — `render/` is cleaned and rewritten on every run,\nso the module Terraform destroys is always the one that matches the manifest,\nnot a stale one left over from the last apply — then runs `terraform init` and\n`terraform destroy` in that directory. Same flags as `terraform-apply`:\n\n| flag | effect |\n|---|---|\n| `-y`, `--auto-approve` | pass `-auto-approve` to `terraform destroy` |\n| `-s`, `--skip-init` | skip `terraform init`, for when you manage it yourself |\n\n## Carrying existing HCL forward\n\nTerraform reads every `.tf` and `.tf.json` in a directory as one module, so\nhand-written HCL only has to land in `render/` beside the generated JSON. This\nplugin registers a handler for `.tf`, and Jsonnet's `importstr` reads a file\nverbatim at evaluation time:\n\n```jsonnet\n{\n\t\"networking.tf\": importstr \"./hcl/networking.tf\",\n\n\t\"main.tf.json\": {\n\t\toutput: {\n\t\t\tsummary: { value: \"${local.network_name} ${var.cidr}\" },\n\t\t},\n\t},\n}\n```\n\nThe two are one module to Terraform: the generated JSON above can reference a\n`local` or `variable` declared in the carried-forward HCL. Adoption can start\nwith a directory of existing HCL and move declarations into Jsonnet one at a\ntime.\n\nBecause the extension is registered, stale `.tf` files are also cleaned out of\n`render/` between runs, so a renamed file can't linger and get applied.\n\n## Choosing a Terraform version\n\nThe binary is downloaded on first use, checksum-verified against HashiCorp's\npublished `SHA256SUMS`, and cached under `node_modules/.cache`. It defaults to\n**1.2.5**; set `config.tf_version` in your project's `package.json` to pin\nanother:\n\n```json\n{\n\t\"config\": {\n\t\t\"tf_version\": \"1.9.8\"\n\t}\n}\n```\n\n## Lifecycle events\n\n`terraform-apply` and `terraform-destroy` each announce their phases so other\nplugins can act at the right moment, without this plugin knowing they exist:\n\n| event | when |\n|---|---|\n| `@c6fc/spellcraft-terraform:pre-apply` | after the manifest is rendered and written, before `terraform init` |\n| `@c6fc/spellcraft-terraform:post-apply` | after `terraform apply` returns |\n| `@c6fc/spellcraft-terraform:pre-destroy` | after the manifest is rendered and written, before `terraform init` |\n| `@c6fc/spellcraft-terraform:post-destroy` | after `terraform destroy` returns |\n\n`pre-apply` is the one that matters. It is what solves step zero — the work that\nhas to happen *before* Terraform can plan, which Terraform cannot do for itself.\n`@c6fc/spellcraft-gcp-terraform` listens on it to enable the GCP services the\nrendered configuration is about to need:\n\n```js\nexports._spellcraft_metadata = {\n\tinit: async (spellframe) => {\n\t\tspellframe.on('@c6fc/spellcraft-terraform:pre-apply', async () => {\n\t\t\tawait enablePendingServices();\n\t\t});\n\t},\n};\n```\n\nListeners are awaited in registration order, so a listener that throws stops the\napply before it starts.\n\n<!-- SPELLCRAFT_DOCS_CLI_START -->\n## CLI Commands\n\n- **`spellcraft terraform-apply <filename>`**\n  Generate files from a configuration and run 'terraform apply' on the output\n- **`spellcraft terraform-destroy <filename>`**\n  Generate files from a configuration and run 'terraform destroy' on the output\n\n<!-- SPELLCRAFT_DOCS_CLI_END -->\n\n## Development\n\n```bash\nnpm test        # renders test.jsonnet through a real SpellFrame\nnpm run cli     # exercises this plugin's CLI commands\nnpm run doc     # regenerates the section above from source\n```\n\nThe first run downloads the Terraform binary into `node_modules/.cache`.\n\n## License\n\nMIT © [Brad Woodward](https://github.com/c6fc)\n","readmeFilename":"README.md"}