-- Terraform snippets local ls = require("luasnip") local s = ls.snippet local t = ls.text_node local i = ls.insert_node local f = ls.function_node local c = ls.choice_node local d = ls.dynamic_node local sn = ls.snippet_node local fmt = require("luasnip.extras.fmt").fmt local rep = require("luasnip.extras").rep -- Return a table of snippets for Terraform -- stylua: ignore start return { -- Terraform block s("terraform", fmt([[ terraform {{ required_version = ">= {}" required_providers {{ {} }} {} }} ]], { i(1, "1.0.0"), i(2, 'aws = {\n source = "hashicorp/aws"\n version = "~> 4.0"\n }'), i(3, ""), })), -- Provider block s("provider", fmt([[ provider "{}" {{ {} }} ]], { i(1, "aws"), i(2, 'region = "us-west-2"'), })), -- AWS Provider with profile s("aws", fmt([[ provider "aws" {{ region = "{}" profile = "{}" }} ]], { i(1, "us-west-2"), i(2, "default"), })), -- Resource block s("resource", fmt([[ resource "{}" "{}" {{ {} }} ]], { i(1, "aws_s3_bucket"), i(2, "example"), i(3, ""), })), -- Data source block s("data", fmt([[ data "{}" "{}" {{ {} }} ]], { i(1, "aws_ami"), i(2, "example"), i(3, 'owners = ["amazon"]'), })), -- Variable block s("variable", fmt([[ variable "{}" {{ description = "{}" type = {} default = {} {} }} ]], { i(1, "example"), i(2, "Example variable"), c(3, { t("string"), t("number"), t("bool"), t("list(string)"), t("map(string)"), t("object({})"), sn(nil, {t("list(object({"), i(1, "name = string, value = string"), t("}))")}), }), c(4, { t('null'), sn(nil, {t('"'), i(1, "default_value"), t('"')}), sn(nil, {t('true')}), sn(nil, {t('false')}), sn(nil, {t('123')}), sn(nil, {t('['), i(1, '"item1", "item2"'), t(']')}), sn(nil, {t('{'), i(1, 'key = "value"'), t('}')}), }), i(5, ""), })), -- Output block s("output", fmt([[ output "{}" {{ description = "{}" value = {} {} }} ]], { i(1, "example"), i(2, "Example output"), i(3, "aws_instance.example.id"), c(4, { t(""), t("sensitive = true"), }), })), -- Local block s("locals", fmt([[ locals {{ {} = {} }} ]], { i(1, "example"), i(2, '"value"'), })), -- Module block s("module", fmt([[ module "{}" {{ source = "{}" {} }} ]], { i(1, "example"), i(2, "./modules/example"), i(3, "# Module inputs"), })), -- Backend block s("backend", fmt([[ backend "{}" {{ {} }} ]], { i(1, "s3"), i(2, 'bucket = "terraform-state"\nkey = "path/to/state.tfstate"\nregion = "us-west-2"'), })), -- Conditional expression s("condition", fmt([[ {} ? {} : {} ]], { i(1, "var.environment == \"prod\""), i(2, "\"production\""), i(3, "\"development\""), })), -- For expression s("for", fmt([[ [for {} in {} : {}] ]], { i(1, "item"), i(2, "var.list"), i(3, "item.name"), })), -- For expression with index s("fori", fmt([[ [for {}, {} in {} : {}] ]], { i(1, "index"), i(2, "item"), i(3, "var.list"), i(4, "\"${index}-${item.name}\""), })), -- For expression with map s("formap", fmt([[ {{for {} in {} : {} => {}}} ]], { i(1, "item"), i(2, "var.list"), i(3, "item.key"), i(4, "item.value"), })), -- Count parameter s("count", fmt([[ count = {} {}[count.index] ]], { i(1, "var.create_resource ? 1 : 0"), i(2, "# Reference this resource elsewhere using aws_instance.example"), })), -- For each parameter s("foreach", fmt([[ for_each = {} {} ]], { c(1, { sn(nil, {t("toset(["), i(1, "\"item1\", \"item2\""), t("])")}), sn(nil, {t("{"), i(1, "key1 = \"value1\", key2 = \"value2\""), t("}")}), sn(nil, {t("var."), i(1, "map_variable")}), }), i(2, "# Reference this resource elsewhere using aws_instance.example[each.key]"), })), -- Dynamic block s("dynamic", fmt([[ dynamic "{}" {{ for_each = {} content {{ {} }} }} ]], { i(1, "ingress"), i(2, "var.ingress_rules"), i(3, "from_port = ingress.value.from_port\n to_port = ingress.value.to_port\n protocol = ingress.value.protocol\n cidr_blocks = ingress.value.cidr_blocks"), })), -- Lifecycle block s("lifecycle", fmt([[ lifecycle {{ {} }} ]], { c(1, { t("create_before_destroy = true"), t("prevent_destroy = true"), t("ignore_changes = [tags]"), sn(nil, {t("ignore_changes = ["), i(1, "attribute"), t("]")}), t("create_before_destroy = true\n prevent_destroy = true\n ignore_changes = [tags]"), }), })), -- Terraform workspace s("workspace", fmt([[ terraform.workspace ]], {})), -- Depends on s("depends", fmt([[ depends_on = [ {}, ] ]], { i(1, "aws_iam_role_policy.example"), })), -- Provisioner s("provisioner", fmt([[ provisioner "{}" {{ {} }} ]], { c(1, { t("local-exec"), t("remote-exec"), t("file"), }), c(2, { sn(nil, {t('command = "'), i(1, "echo hello"), t('"')}), sn(nil, {t('inline = [\n "'), i(1, "echo hello"), t('",\n ]')}), sn(nil, {t('source = "'), i(1, "scripts/setup.sh"), t('"\n destination = "'), i(2, "/tmp/setup.sh"), t('"')}), }), })), -- Null resource s("null", fmt([[ resource "null_resource" "{}" {{ triggers = {{ {} = {} }} {} }} ]], { i(1, "example"), i(2, "trigger"), i(3, "uuid()"), i(4, "# Provisioners or depends_on go here"), })), } -- stylua: ignore end