// Copyright (c) HashiCorp, Inc // SPDX-License-Identifier: MPL-2.0 import * as z from "zod"; const tfObject = (config: T) => z.array(z.object(config).partial()); const outputConfig = tfObject({ value: z.any(), description: z.string().optional(), sensitive: z.boolean().optional(), depends_on: z.string().optional(), }); export type Output = z.infer; const validationConfig = z.object({ error_message: z.string(), condition: z.any(), }); const variableConfig = tfObject({ type: z.string(), default: z.any(), description: z.string(), sensitive: z.boolean(), nullable: z.boolean().optional(), validation: z.array(validationConfig).optional(), }); export type Variable = z.infer; const providerConfig = z.array(z.record(z.string(), z.any())); export type Provider = z.infer; const moduleConfig = z.array(z.object({ source: z.string() }).loose()); export type Module = z.infer; const resourceConfig = z.array(z.record(z.string(), z.any())); export type Resource = z.infer; export type Data = Resource; const importConfig = z.object({ to: z.string(), id: z.string(), provider: z.any().optional(), }); export type Import = z.infer; const providerSpecification = z.union([ z.object({ source: z.string(), version: z.string() }).partial(), z.string(), ]); const terraformConfig = z .object({ required_version: z.string(), required_providers: z.array(z.record(z.string(), providerSpecification)), backend: z.record(z.string(), z.array(z.record(z.string(), z.any()))), }) .partial(); export type TerraformConfig = z.infer; export const schema = z .object({ data: z.record(z.string(), z.record(z.string(), resourceConfig)), import: z.array(importConfig), locals: z.array(z.record(z.string(), z.any())), module: z.record(z.string(), moduleConfig), output: z.record(z.string(), outputConfig), provider: z.record(z.string(), providerConfig), resource: z.record(z.string(), z.record(z.string(), resourceConfig)), terraform: z.array(terraformConfig), variable: z.record(z.string(), variableConfig), }) .partial();