@highstate/common 0.14.2 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/{chunk-WFWXDYUX.js → chunk-X5BK6JSN.js} +877 -194
- package/dist/chunk-X5BK6JSN.js.map +1 -0
- package/dist/highstate.manifest.json +12 -2
- package/dist/index.js +1 -1
- package/dist/units/databases/etcd-patch/index.js +20 -0
- package/dist/units/databases/etcd-patch/index.js.map +1 -0
- package/dist/units/databases/existing-etcd/index.js +14 -0
- package/dist/units/databases/existing-etcd/index.js.map +1 -0
- package/dist/units/databases/existing-mariadb/index.js +2 -2
- package/dist/units/databases/existing-mariadb/index.js.map +1 -1
- package/dist/units/databases/existing-mongodb/index.js +2 -2
- package/dist/units/databases/existing-mongodb/index.js.map +1 -1
- package/dist/units/databases/existing-postgresql/index.js +2 -2
- package/dist/units/databases/existing-postgresql/index.js.map +1 -1
- package/dist/units/databases/existing-redis/index.js +2 -2
- package/dist/units/databases/existing-redis/index.js.map +1 -1
- package/dist/units/databases/existing-s3/index.js +18 -0
- package/dist/units/databases/existing-s3/index.js.map +1 -0
- package/dist/units/databases/mariadb-patch/index.js +24 -0
- package/dist/units/databases/mariadb-patch/index.js.map +1 -0
- package/dist/units/databases/mongodb-patch/index.js +24 -0
- package/dist/units/databases/mongodb-patch/index.js.map +1 -0
- package/dist/units/databases/postgresql-patch/index.js +24 -0
- package/dist/units/databases/postgresql-patch/index.js.map +1 -0
- package/dist/units/databases/redis-patch/index.js +27 -0
- package/dist/units/databases/redis-patch/index.js.map +1 -0
- package/dist/units/databases/s3-patch/index.js +25 -0
- package/dist/units/databases/s3-patch/index.js.map +1 -0
- package/dist/units/dns/record-set/index.js +14 -20
- package/dist/units/dns/record-set/index.js.map +1 -1
- package/dist/units/existing-server/index.js +3 -4
- package/dist/units/existing-server/index.js.map +1 -1
- package/dist/units/network/address-space/index.js +20 -0
- package/dist/units/network/address-space/index.js.map +1 -0
- package/dist/units/network/endpoint-filter/index.js +15 -0
- package/dist/units/network/endpoint-filter/index.js.map +1 -0
- package/dist/units/network/l3-endpoint/index.js +2 -2
- package/dist/units/network/l3-endpoint/index.js.map +1 -1
- package/dist/units/network/l4-endpoint/index.js +2 -2
- package/dist/units/network/l4-endpoint/index.js.map +1 -1
- package/dist/units/network/l7-endpoint/index.js +12 -0
- package/dist/units/network/l7-endpoint/index.js.map +1 -0
- package/dist/units/script/index.js +1 -1
- package/dist/units/server-patch/index.js +9 -12
- package/dist/units/server-patch/index.js.map +1 -1
- package/dist/units/ssh/key-pair/index.js +1 -1
- package/package.json +64 -10
- package/src/shared/command.ts +1 -1
- package/src/shared/dns.ts +11 -93
- package/src/shared/files.ts +3 -3
- package/src/shared/impl-ref.ts +4 -0
- package/src/shared/index.ts +2 -0
- package/src/shared/network/address-space.spec.ts +114 -0
- package/src/shared/network/address-space.ts +364 -0
- package/src/shared/network/address.spec.ts +109 -0
- package/src/shared/network/address.ts +119 -0
- package/src/shared/network/endpoints.spec.ts +249 -0
- package/src/shared/network/endpoints.ts +608 -0
- package/src/shared/network/index.ts +4 -0
- package/src/shared/network/ip.ts +236 -0
- package/src/shared/network/subnet.spec.ts +62 -0
- package/src/shared/network/subnet.ts +137 -0
- package/src/shared/ssh.ts +1 -1
- package/src/shared/tls.ts +21 -5
- package/src/shared/utils.ts +93 -0
- package/src/units/databases/etcd-patch/index.ts +23 -0
- package/src/units/databases/existing-etcd/index.ts +11 -0
- package/src/units/databases/existing-mariadb/index.ts +1 -1
- package/src/units/databases/existing-mongodb/index.ts +1 -1
- package/src/units/databases/existing-postgresql/index.ts +1 -1
- package/src/units/databases/existing-redis/index.ts +1 -1
- package/src/units/databases/existing-s3/index.ts +1 -1
- package/src/units/databases/mariadb-patch/index.ts +27 -0
- package/src/units/databases/mongodb-patch/index.ts +27 -0
- package/src/units/databases/postgresql-patch/index.ts +27 -0
- package/src/units/databases/redis-patch/index.ts +32 -0
- package/src/units/databases/s3-patch/index.ts +28 -0
- package/src/units/dns/record-set/index.ts +15 -20
- package/src/units/existing-server/index.ts +3 -4
- package/src/units/network/address-space/index.ts +20 -0
- package/src/units/network/endpoint-filter/index.ts +5 -5
- package/src/units/network/l3-endpoint/index.ts +2 -2
- package/src/units/network/l4-endpoint/index.ts +2 -2
- package/src/units/network/l7-endpoint/index.ts +2 -2
- package/src/units/remote-file/index.ts +12 -5
- package/src/units/server-patch/index.ts +10 -13
- package/dist/chunk-WFWXDYUX.js.map +0 -1
- package/dist/units/server-dns/index.js +0 -26
- package/dist/units/server-dns/index.js.map +0 -1
- package/src/shared/network.ts +0 -413
- package/src/units/server-dns/index.ts +0 -26
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/shared/network/ip.ts","../src/shared/network/address.ts","../src/shared/network/subnet.ts","../src/shared/network/endpoints.ts","../src/shared/command.ts","../src/shared/impl-ref.ts","../src/shared/dns.ts","../src/shared/gateway.ts","../src/shared/tls.ts","../src/shared/access-point.ts","../src/shared/files.ts","../src/shared/network/address-space.ts","../src/shared/passwords.ts","../assets/images.json","../src/shared/ssh.ts","../src/shared/utils.ts"],"names":["parts","check","network","result","validated","host","portString","withDynamic","toPromise","pipe","filter","isNonNullish","map","uniqueBy","ssh","command","environment","env","triggers","importMetaResolve","output","ComponentResource","resolvedType","interpolate","name","matchedProviders","flat","z","Resource","issuers","getOrCreate","terminal-ssh","server","randomBytes","privateKeyString","remote"],"mappings":"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","file":"chunk-X5BK6JSN.js","sourcesContent":["import type { network } from \"@highstate/library\"\n\nexport type AddressType = network.AddressType\n\nexport type ParsedIp = {\n type: AddressType\n value: bigint\n}\n\nexport type ParsedCidr = {\n type: AddressType\n ip: bigint\n prefixLength: number\n}\n\nexport function parseIp(value: string): ParsedIp {\n if (value.includes(\":\")) {\n return { type: \"ipv6\", value: parseIpv6(value) }\n }\n\n return { type: \"ipv4\", value: parseIpv4(value) }\n}\n\nexport function parseCidr(value: string): ParsedCidr {\n const [ipPart, prefixPart, ...rest] = value.split(\"/\")\n if (!ipPart || !prefixPart || rest.length > 0) {\n throw new Error(`Invalid CIDR: \"${value}\"`)\n }\n\n const parsedIp = parseIp(ipPart.trim())\n const prefix = parseInt(prefixPart.trim(), 10)\n if (!Number.isFinite(prefix)) {\n throw new Error(`Invalid CIDR prefix: \"${value}\"`)\n }\n\n const bits = parsedIp.type === \"ipv4\" ? 32 : 128\n if (prefix < 0 || prefix > bits) {\n throw new Error(`Invalid CIDR prefix length: \"${value}\"`)\n }\n\n return { type: parsedIp.type, ip: parsedIp.value, prefixLength: prefix }\n}\n\nexport function subnetBaseFromCidr(parsed: ParsedCidr): bigint {\n const bits = parsed.type === \"ipv4\" ? 32 : 128\n\n if (parsed.prefixLength === 0) {\n return 0n\n }\n\n const mask = ((1n << BigInt(parsed.prefixLength)) - 1n) << BigInt(bits - parsed.prefixLength)\n return parsed.ip & mask\n}\n\nexport function cidrBlockSize(type: AddressType, prefixLength: number): bigint {\n const bits = type === \"ipv4\" ? 32 : 128\n return 1n << BigInt(bits - prefixLength)\n}\n\nexport function ipToString(type: AddressType, value: bigint): string {\n return type === \"ipv4\" ? ipv4ToString(value) : ipv6ToString(value)\n}\n\nfunction parseIpv4(value: string): bigint {\n const parts = value.trim().split(\".\")\n if (parts.length !== 4) {\n throw new Error(`Invalid IPv4 address: \"${value}\"`)\n }\n\n let result = 0n\n for (const part of parts) {\n if (!part) {\n throw new Error(`Invalid IPv4 address: \"${value}\"`)\n }\n\n const octet = parseInt(part, 10)\n if (!Number.isInteger(octet) || octet < 0 || octet > 255) {\n throw new Error(`Invalid IPv4 address: \"${value}\"`)\n }\n\n result = (result << 8n) + BigInt(octet)\n }\n\n return result\n}\n\nfunction parseIpv6(value: string): bigint {\n const input = value.trim().toLowerCase()\n if (!input) {\n throw new Error(`Invalid IPv6 address: \"${value}\"`)\n }\n\n let leftParts: string[] = []\n let rightParts: string[] = []\n\n const doubleColonIndex = input.indexOf(\"::\")\n if (doubleColonIndex >= 0) {\n const [left, right] = input.split(\"::\")\n leftParts = left ? left.split(\":\") : []\n rightParts = right ? right.split(\":\") : []\n } else {\n leftParts = input.split(\":\")\n rightParts = []\n }\n\n const expandIpv4Tail = (parts: string[]): string[] => {\n if (parts.length === 0) return parts\n const last = parts.at(-1)!\n if (!last.includes(\".\")) {\n return parts\n }\n\n const ipv4Value = parseIpv4(last)\n const high = Number((ipv4Value >> 16n) & 0xffffn)\n const low = Number(ipv4Value & 0xffffn)\n\n return [...parts.slice(0, -1), high.toString(16), low.toString(16)]\n }\n\n leftParts = leftParts.filter(p => p.length > 0)\n rightParts = rightParts.filter(p => p.length > 0)\n\n leftParts = expandIpv4Tail(leftParts)\n rightParts = expandIpv4Tail(rightParts)\n\n const totalParts = leftParts.length + rightParts.length\n if (doubleColonIndex < 0 && totalParts !== 8) {\n throw new Error(`Invalid IPv6 address: \"${value}\"`)\n }\n if (totalParts > 8) {\n throw new Error(`Invalid IPv6 address: \"${value}\"`)\n }\n\n const missing = 8 - totalParts\n const parts =\n doubleColonIndex >= 0\n ? [...leftParts, ...Array.from({ length: missing }, () => \"0\"), ...rightParts]\n : leftParts\n\n if (parts.length !== 8) {\n throw new Error(`Invalid IPv6 address: \"${value}\"`)\n }\n\n let result = 0n\n for (const part of parts) {\n if (!part) {\n throw new Error(`Invalid IPv6 address: \"${value}\"`)\n }\n\n const hextet = parseInt(part, 16)\n if (!Number.isInteger(hextet) || hextet < 0 || hextet > 0xffff) {\n throw new Error(`Invalid IPv6 address: \"${value}\"`)\n }\n\n result = (result << 16n) + BigInt(hextet)\n }\n\n return result\n}\n\nfunction ipv4ToString(value: bigint): string {\n const parts = [\n Number((value >> 24n) & 0xffn),\n Number((value >> 16n) & 0xffn),\n Number((value >> 8n) & 0xffn),\n Number(value & 0xffn),\n ]\n\n return parts.join(\".\")\n}\n\nfunction ipv6ToString(value: bigint): string {\n const hextets: number[] = []\n for (let i = 0; i < 8; i++) {\n const shift = BigInt((7 - i) * 16)\n hextets.push(Number((value >> shift) & 0xffffn))\n }\n\n // Find the longest run of zeros to compress.\n let bestStart = -1\n let bestLength = 0\n let currentStart = -1\n let currentLength = 0\n\n for (let i = 0; i < hextets.length; i++) {\n if (hextets[i] === 0) {\n if (currentStart === -1) {\n currentStart = i\n currentLength = 1\n } else {\n currentLength++\n }\n\n if (currentLength > bestLength) {\n bestStart = currentStart\n bestLength = currentLength\n }\n } else {\n currentStart = -1\n currentLength = 0\n }\n }\n\n // RFC 5952: only compress runs of 2+ hextets.\n if (bestLength < 2) {\n bestStart = -1\n bestLength = 0\n }\n\n const parts: string[] = []\n for (let i = 0; i < hextets.length; i++) {\n if (bestStart >= 0 && i >= bestStart && i < bestStart + bestLength) {\n if (i === bestStart) {\n parts.push(\"\")\n }\n continue\n }\n\n parts.push(hextets[i]!.toString(16))\n }\n\n let result = parts.join(\":\")\n if (bestStart === 0) {\n result = `:${result}`\n }\n if (bestStart >= 0 && bestStart + bestLength === 8) {\n result = `${result}:`\n }\n\n if (result === \"\") {\n return \"::\"\n }\n\n // Normalize possible \":::\" artifacts into \"::\".\n return result.replace(/:{3,}/g, \"::\")\n}\n","import { check } from \"@highstate/contract\"\nimport { network } from \"@highstate/library\"\nimport { ipToString, parseCidr, parseIp, subnetBaseFromCidr } from \"./ip\"\n\nexport type InputAddress = network.Address | string\n\n/**\n * Parses and normalizes the given address string.\n * If Address entity is given, it is returned as-is.\n *\n * @param address The address to parse.\n * @returns The normalized Address entity.\n */\nexport function parseAddress(address: InputAddress): network.Address {\n if (check(network.addressEntity.schema, address)) {\n return address\n }\n\n const input = address.trim()\n if (!input) {\n throw new Error(\"Empty address string\")\n }\n\n const parsed = input.includes(\"/\") ? parseCidr(input) : parseCidrFromIp(input)\n const canonicalAddress = ipToString(parsed.type, parsed.ip)\n\n const subnetBase = subnetBaseFromCidr(parsed)\n const subnetBaseAddress = ipToString(parsed.type, subnetBase)\n\n const result: network.Address = {\n type: parsed.type,\n value: canonicalAddress,\n subnet: {\n type: parsed.type,\n baseAddress: subnetBaseAddress,\n prefixLength: parsed.prefixLength,\n },\n }\n\n const validated = network.addressEntity.schema.safeParse(result)\n if (!validated.success) {\n throw new Error(`Invalid address \"${input}\": ${validated.error.message}`)\n }\n\n return validated.data\n}\n\n/**\n * Converts an address entity to its full CIDR string representation.\n *\n * The result format is `<address>/<prefix-length>`.\n *\n * @param address The address entity.\n * @returns The CIDR string representation.\n */\nexport function addressToCidr(address: network.Address): string {\n return `${address.value}/${address.subnet.prefixLength}`\n}\n\n/**\n * Checks whether the given address belongs to the specified subnet.\n *\n * @param address The address to check.\n * @param subnet The subnet to check against.\n * @returns True if the address belongs to the subnet, false otherwise.\n */\nexport function doesAddressBelongToSubnet(\n address: network.Address,\n subnet: network.Subnet,\n): boolean {\n if (address.type !== subnet.type) {\n return false\n }\n\n const addressIp = parseIp(address.value)\n const subnetBaseIp = parseIp(subnet.baseAddress)\n\n if (addressIp.type !== subnet.type || subnetBaseIp.type !== subnet.type) {\n return false\n }\n\n const bits = subnet.type === \"ipv4\" ? 32 : 128\n if (subnet.prefixLength === 0) {\n return true\n }\n\n const mask = ((1n << BigInt(subnet.prefixLength)) - 1n) << BigInt(bits - subnet.prefixLength)\n\n return (addressIp.value & mask) === (subnetBaseIp.value & mask)\n}\n\n/**\n * Merges duplicate addresses by their canonical CIDR key.\n *\n * If multiple addresses share the same `cidr`, the last one wins.\n *\n * @param addresses The list of addresses to merge.\n * @returns The merged list of addresses with duplicates removed.\n */\nexport function mergeAddresses(addresses: network.Address[]): network.Address[] {\n const mergedMap = new Map<string, network.Address>()\n\n for (const address of addresses) {\n mergedMap.set(addressToCidr(address), address)\n }\n\n return Array.from(mergedMap.values())\n}\n\nfunction parseCidrFromIp(value: string) {\n const parsed = parseIp(value)\n const prefixLength = parsed.type === \"ipv4\" ? 32 : 128\n\n return {\n type: parsed.type,\n ip: parsed.value,\n prefixLength,\n }\n}\n","import { check } from \"@highstate/contract\"\nimport { network } from \"@highstate/library\"\nimport { type InputArray, toPromise } from \"@highstate/pulumi\"\nimport { filter, isNonNullish, map, pipe, uniqueBy } from \"remeda\"\nimport { doesAddressBelongToSubnet } from \"./address\"\nimport { ipToString, type ParsedCidr, parseCidr, parseIp, subnetBaseFromCidr } from \"./ip\"\n\nexport type InputSubnet = network.Subnet | network.Address | string\n\n/**\n * Parses and normalizes the given subnet string.\n *\n * If a Subnet entity is given, it is returned as-is.\n *\n * @param subnet The subnet to parse.\n * @returns The normalized Subnet entity.\n */\nexport function parseSubnet(subnet: InputSubnet): network.Subnet {\n if (check(network.subnetEntity.schema, subnet)) {\n return subnet\n }\n\n if (check(network.addressEntity.schema, subnet)) {\n const prefixLength = subnet.type === \"ipv4\" ? 32 : 128\n\n const result: network.Subnet = {\n type: subnet.type,\n baseAddress: subnet.value,\n prefixLength,\n }\n\n const validated = network.subnetEntity.schema.safeParse(result)\n if (!validated.success) {\n throw new Error(\n `Invalid subnet \"${subnet.value}/${prefixLength}\": ${validated.error.message}`,\n )\n }\n\n return validated.data\n }\n\n const input = subnet.trim()\n if (!input) {\n throw new Error(\"Empty subnet string\")\n }\n\n let parsed: ParsedCidr\n if (input.includes(\"/\")) {\n parsed = parseCidr(input)\n } else {\n const ip = parseIp(input)\n const prefixLength = ip.type === \"ipv4\" ? 32 : 128\n parsed = { type: ip.type, ip: ip.value, prefixLength }\n }\n\n const subnetBase = subnetBaseFromCidr(parsed)\n const baseAddress = ipToString(parsed.type, subnetBase)\n\n const result: network.Subnet = {\n type: parsed.type,\n baseAddress,\n prefixLength: parsed.prefixLength,\n }\n\n const validated = network.subnetEntity.schema.safeParse(result)\n if (!validated.success) {\n throw new Error(`Invalid subnet \"${input}\": ${validated.error.message}`)\n }\n\n return validated.data\n}\n\nexport const privateIpV4Subnets = [\n parseSubnet(\"10.0.0.0/8\"),\n parseSubnet(\"127.0.0.0/8\"),\n parseSubnet(\"172.16.0.0/12\"),\n parseSubnet(\"192.168.0.0/16\"),\n]\n\nexport const privateIpV6Subnets = [\n parseSubnet(\"fc00::/7\"),\n\n // IPv4-mapped private ranges.\n parseSubnet(\"::ffff:10.0.0.0/104\"),\n parseSubnet(\"::ffff:127.0.0.0/104\"),\n parseSubnet(\"::ffff:172.16.0.0/108\"),\n parseSubnet(\"::ffff:192.168.0.0/112\"),\n]\n\nexport const privateSubnets = [...privateIpV4Subnets, ...privateIpV6Subnets]\n\n/**\n * Checks whether the given address is a private address.\n *\n * @param address The address to check.\n * @returns True if the address is private, false otherwise.\n */\nexport function isPrivateAddress(address: network.Address): boolean {\n for (const subnet of privateSubnets) {\n if (doesAddressBelongToSubnet(address, subnet)) {\n return true\n }\n }\n\n return false\n}\n\n/**\n * Parses multiple subnets from strings and input objects.\n *\n * @param subnets The subnet strings to parse.\n * @param inputSubnets The input subnet objects to use.\n * @returns The parsed list of subnets objects with duplicates removed.\n */\nexport async function parseSubnets(\n subnets: (string | undefined | null)[] | null | undefined,\n inputSubnets: InputArray<network.Subnet | undefined | null> | null | undefined,\n): Promise<network.Subnet[]> {\n const resolvedInputSubnets = await toPromise(inputSubnets ?? [])\n\n return pipe(\n [...(subnets ?? []), ...resolvedInputSubnets],\n filter(isNonNullish),\n map(subnet => parseSubnet(subnet)),\n uniqueBy(subnet => subnetToString(subnet)),\n )\n}\n\n/**\n * Converts a subnet to its canonical string representation (CIDR).\n *\n * @param subnet The subnet to convert.\n * @returns The string representation of the subnet.\n */\nexport function subnetToString(subnet: network.Subnet): string {\n return `${subnet.baseAddress}/${subnet.prefixLength}`\n}\n","import { check } from \"@highstate/contract\"\nimport { type Metadata, metadataSchema, network } from \"@highstate/library\"\nimport { type InputArray, toPromise } from \"@highstate/pulumi\"\nimport { filter, isNonNullish, map, omit, pipe, uniqueBy } from \"remeda\"\nimport { doesAddressBelongToSubnet, parseAddress } from \"./address\"\nimport { privateSubnets } from \"./subnet\"\n\n/**\n * The input L3, L4, or L7 endpoint for some service.\n *\n * Can be provided as a string or an object.\n */\nexport type InputEndpoint = network.L3Endpoint | network.Address | string\n\n/**\n * The input L4 or L7 endpoint for some service.\n *\n * Can be provided as a string or an object.\n */\nexport type InputL4Endpoint = network.L4Endpoint | string\n\n/**\n * The input L7 endpoint for some service.\n *\n * Can be provided as a string or an object.\n */\nexport type InputL7Endpoint = network.L7Endpoint | string\n\n/**\n * Stringifies a L3 endpoint object into a string.\n *\n * The result format is simply the address or hostname.\n * The format does not depend on runtime level and will produce the same output for L3, L4, and L7 endpoints.\n *\n * @param l3Endpoint The L3 endpoint object to stringify.\n * @returns The string representation of the L3 endpoint.\n */\nexport function l3EndpointToString(l3Endpoint: network.L3Endpoint): string {\n switch (l3Endpoint.type) {\n case \"ipv4\":\n return l3Endpoint.address.value\n case \"ipv6\":\n return l3Endpoint.address.value\n case \"hostname\":\n return l3Endpoint.hostname\n }\n}\n\n/**\n * Stringifies a L4 endpoint object into a string.\n *\n * The result format is `endpoint:port` for IPv4 and hostname, and `[endpoint]:port` for IPv6.\n *\n * @param l4Endpoint The L4 endpoint object to stringify.\n * @returns The string representation of the L4 endpoint.\n */\nexport function l4EndpointToString(l4Endpoint: network.L3Endpoint & { port: number }): string {\n const host = l3EndpointToString(l4Endpoint)\n const wrappedHost = l4Endpoint.type === \"ipv6\" ? `[${host}]` : host\n\n return `${wrappedHost}:${l4Endpoint.port}`\n}\n\n/**\n * Stringifies a L4 endpoint object into a string with protocol.\n *\n * The result format is:\n * - `protocol://[endpoint]:port` for IPv6;\n * - `protocol://endpoint:port` for IPv4 and hostname.\n *\n * The format does not depend on runtime level and will produce the same output for L4 and L7 endpoints.\n *\n * @param l4Endpoint The L4 endpoint object to stringify.\n * @returns The string representation of the L4 endpoint with protocol.\n */\nexport function l4EndpointToFullString(l4Endpoint: network.L4Endpoint): string {\n const protocol = `${l4Endpoint.protocol}://`\n\n return `${protocol}${l4EndpointToString(l4Endpoint)}`\n}\n\n/**\n * Stringifies a L7 endpoint object into a string.\n *\n * The result format is:\n * - `appProtocol://[endpoint]:port[/path]` for IPv6;\n * - `appProtocol://endpoint:port[/path]` for IPv4 and hostname.\n *\n * @param l7Endpoint The L7 endpoint object to stringify.\n * @returns The string representation of the L7 endpoint.\n */\nexport function l7EndpointToString(\n l7Endpoint: network.L3Endpoint & {\n level: 7\n appProtocol: string\n port: number\n path?: string | undefined\n },\n): string {\n const protocol = `${l7Endpoint.appProtocol}://`\n\n let endpoint = l4EndpointToString(l7Endpoint)\n\n if (l7Endpoint.path) {\n endpoint += `/${l7Endpoint.path}`\n }\n\n return `${protocol}${endpoint}`\n}\n\n/**\n * Stringifies any L3, L4, or L7 endpoint object into a string.\n * The result format depends on the endpoint level at runtime.\n *\n * @param endpoint The endpoint object to stringify.\n * @returns The string representation of the endpoint.\n */\nexport function endpointToString(endpoint: network.L3Endpoint): string {\n switch (endpoint.level) {\n case 3:\n return l3EndpointToString(endpoint)\n case 4:\n return l4EndpointToString(endpoint)\n case 7:\n return l7EndpointToString(endpoint)\n }\n}\n\n/**\n * Checks if the given endpoint meets the minimum level requirement.\n *\n * @param endpoint The endpoint to check.\n * @param minLevel The minimum level of the endpoint to check.\n * @returns True if the endpoint meets the minimum level requirement, false otherwise.\n */\nexport function checkEndpointLevel<TMinLevel extends network.EndpointLevel>(\n endpoint: network.L3Endpoint,\n minLevel: TMinLevel,\n): endpoint is network.EndpointByMinLevel<TMinLevel> {\n return endpoint.level >= minLevel\n}\n\n/**\n * Asserts that the given endpoint meets the minimum level requirement.\n *\n * @param endpoint The endpoint to check.\n * @param minLevel The minimum level of the endpoint to check.\n * @throws If the endpoint does not meet the minimum level requirement.\n */\nexport function assertEndpointLevel<TMinLevel extends network.EndpointLevel>(\n endpoint: network.L3Endpoint,\n minLevel: TMinLevel,\n): asserts endpoint is network.EndpointByMinLevel<TMinLevel> {\n if (!checkEndpointLevel(endpoint, minLevel)) {\n throw new Error(\n `The endpoint \"${endpointToString(endpoint)}\" is L${endpoint.level}, but L${minLevel} is required`,\n )\n }\n}\n\n/**\n * Parses an endpoint from a string.\n * If endpoint object is provided, it is returned as is.\n *\n * Supports L3, L4, and L7 endpoints.\n *\n * - L3 format: `endpoint`\n * - L4 format: `[protocol://]endpoint[:port]`\n * - L7 format: `appProtocol://endpoint[:port][/path]`\n *\n * @param endpoint The endpoint string or object to parse.\n * @param minLevel The minimum level of the endpoint to parse. If provided, ensures the returned endpoint is at least this level.\n * @returns The parsed endpoint object.\n */\nexport function parseEndpoint<TMinLevel extends network.EndpointLevel = 3>(\n endpoint: InputEndpoint,\n minLevel: TMinLevel = 3 as TMinLevel,\n): network.EndpointByMinLevel<TMinLevel> {\n type L3EndpointBase =\n | {\n type: \"hostname\"\n level: 3\n hostname: string\n metadata: network.L3Endpoint[\"metadata\"]\n }\n | {\n type: \"ipv4\" | \"ipv6\"\n level: 3\n metadata: network.L3Endpoint[\"metadata\"]\n address: network.Address\n subnet: network.Subnet\n }\n\n function validateEndpoint<TEndpoint extends network.L3Endpoint>(value: TEndpoint): TEndpoint {\n const schema =\n value.level === 7\n ? network.l7EndpointEntity.schema\n : value.level === 4\n ? network.l4EndpointEntity.schema\n : network.l3EndpointEntity.schema\n\n const result = schema.safeParse(value)\n if (!result.success) {\n throw new Error(`Invalid endpoint \"${endpointToString(value)}\": ${result.error.message}`)\n }\n\n // Important: Zod strips unknown keys by default.\n // We validate here, but return the original value to preserve fields\n // that are not part of the schema (e.g., dynamic.endpoint mirroring).\n return value\n }\n\n function parseHostToL3(host: string): L3EndpointBase {\n const trimmed = host.trim()\n if (!trimmed) {\n throw new Error(\"Empty endpoint host\")\n }\n\n try {\n const address = parseAddress(trimmed)\n\n return {\n type: address.type,\n level: 3,\n metadata: extractMetadata(address),\n address,\n subnet: address.subnet,\n }\n } catch {\n return {\n type: \"hostname\",\n level: 3,\n hostname: trimmed,\n metadata: {},\n }\n }\n }\n\n function splitHostPort(input: string): { host: string; port?: number } {\n const trimmed = input.trim()\n\n if (!trimmed) {\n throw new Error(\"Empty endpoint\")\n }\n\n if (trimmed.startsWith(\"[\")) {\n const closingIndex = trimmed.indexOf(\"]\")\n if (closingIndex === -1) {\n throw new Error(`Invalid endpoint: \"${input}\"`)\n }\n\n const host = trimmed.slice(1, closingIndex)\n const remainder = trimmed.slice(closingIndex + 1)\n\n if (!remainder) {\n return { host }\n }\n\n if (!remainder.startsWith(\":\")) {\n throw new Error(`Invalid endpoint: \"${input}\"`)\n }\n\n const portString = remainder.slice(1)\n if (!/^\\d{1,5}$/.test(portString)) {\n throw new Error(`Invalid endpoint port: \"${portString}\"`)\n }\n\n return { host, port: parseInt(portString, 10) }\n }\n\n const lastColonIndex = trimmed.lastIndexOf(\":\")\n if (lastColonIndex === -1) {\n return { host: trimmed }\n }\n\n // If it looks like an IPv6 address without brackets, treat it as host-only.\n if (trimmed.includes(\":\")) {\n const firstColonIndex = trimmed.indexOf(\":\")\n if (firstColonIndex !== lastColonIndex) {\n return { host: trimmed }\n }\n }\n\n const host = trimmed.slice(0, lastColonIndex)\n const portString = trimmed.slice(lastColonIndex + 1)\n if (!/^\\d{1,5}$/.test(portString)) {\n return { host: trimmed }\n }\n\n return { host, port: parseInt(portString, 10) }\n }\n\n if (check(network.l3EndpointEntity.schema, endpoint)) {\n assertEndpointLevel(endpoint, minLevel)\n\n return endpoint as network.EndpointByMinLevel<TMinLevel>\n }\n\n if (check(network.addressEntity.schema, endpoint)) {\n const address = endpoint\n const built: network.L3Endpoint = {\n type: address.type,\n level: 3,\n metadata: extractMetadata(address),\n address,\n subnet: address.subnet,\n }\n\n const withDynamic = syncDynamic(built)\n const validated = validateEndpoint(withDynamic)\n\n assertEndpointLevel(validated, minLevel)\n return validated as network.EndpointByMinLevel<TMinLevel>\n }\n\n if (typeof endpoint !== \"string\") {\n throw new Error(\"Invalid endpoint\")\n }\n\n const endpointString = endpoint\n\n let builtEndpoint: network.L3Endpoint\n\n const schemeMatch = /^([a-z]+):\\/\\/(.*)$/.exec(endpointString)\n if (schemeMatch) {\n const appProtocol = schemeMatch[1]\n const rest = schemeMatch[2]\n\n const pathIndex = rest.indexOf(\"/\")\n const hostPortPart = pathIndex === -1 ? rest : rest.slice(0, pathIndex)\n const path = pathIndex === -1 ? undefined : rest.slice(pathIndex + 1)\n\n const udpAppProtocols = [\"dns\", \"dhcp\"]\n const { host, port } = splitHostPort(hostPortPart)\n const l3Base = parseHostToL3(host)\n\n const portNumber = port ?? 443\n const protocol: network.L4Protocol = udpAppProtocols.includes(appProtocol) ? \"udp\" : \"tcp\"\n\n builtEndpoint =\n l3Base.type === \"hostname\"\n ? {\n ...l3Base,\n level: 7,\n port: portNumber,\n protocol,\n appProtocol,\n path: path || undefined,\n }\n : {\n ...l3Base,\n level: 7,\n port: portNumber,\n protocol,\n appProtocol,\n path: path || undefined,\n }\n } else {\n const { host, port } = splitHostPort(endpointString)\n const l3Base = parseHostToL3(host)\n\n if (port !== undefined) {\n builtEndpoint =\n l3Base.type === \"hostname\"\n ? {\n ...l3Base,\n level: 4,\n port,\n protocol: \"tcp\",\n }\n : {\n ...l3Base,\n level: 4,\n port,\n protocol: \"tcp\",\n }\n } else {\n builtEndpoint = l3Base\n }\n }\n\n const withDynamic = syncDynamic(builtEndpoint)\n const validated = validateEndpoint(withDynamic)\n\n assertEndpointLevel(validated, minLevel)\n return validated as network.EndpointByMinLevel<TMinLevel>\n}\n\n/**\n * Parses L4 protocol from string.\n *\n * @param input The input string to parse.\n * @returns The parsed L4 protocol.\n */\nexport function parseL4Protocol(input: string): network.L4Protocol {\n input = input.trim().toLowerCase()\n\n if (input === \"tcp\" || input === \"udp\") {\n return input\n }\n\n throw new Error(`Invalid L4 protocol: \"${input}\"`)\n}\n\n/**\n * Converts L3 endpoint to L4 endpoint by adding a port and protocol.\n *\n * @param l3Endpoint The L3 endpoint to convert.\n * @param port The port to add to the L3 endpoint.\n * @param protocol The protocol to add to the L3 endpoint. Defaults to \"tcp\".\n * @returns The L4 endpoint with the port and protocol added.\n */\nexport function l3EndpointToL4(\n l3Endpoint: InputEndpoint,\n port: number,\n protocol: network.L4Protocol = \"tcp\",\n): network.L4Endpoint {\n const parsed = parseEndpoint(l3Endpoint)\n\n return {\n ...parsed,\n level: 4,\n port,\n protocol,\n } as network.L4Endpoint\n}\n\n/**\n * Converts L4 endpoint to L7 endpoint by adding application protocol and path.\n *\n * @param l4Endpoint The L4 endpoint to convert.\n * @param appProtocol The application protocol to add to the L4 endpoint.\n * @param path The path to add to the L4 endpoint. Defaults to an empty string.\n * @returns The L7 endpoint with the application protocol and path added.\n */\nexport function l4EndpointToL7(\n l4Endpoint: InputEndpoint,\n appProtocol: string,\n path: string = \"\",\n): network.L7Endpoint {\n const parsed = parseEndpoint(l4Endpoint, 4)\n\n return {\n ...parsed,\n level: 7,\n appProtocol,\n path,\n }\n}\n\n/**\n * Converts a L3 endpoint to CIDR notation.\n *\n * If the endpoint is a hostname, an error is thrown.\n *\n * @param endpoint The L3 endpoint to convert.\n * @returns The CIDR notation of the L3 endpoint.\n */\nexport function l3EndpointToCidr(endpoint: network.L3Endpoint): string {\n switch (endpoint.type) {\n case \"ipv4\":\n return `${endpoint.address.value}/32`\n case \"ipv6\":\n return `${endpoint.address.value}/128`\n case \"hostname\":\n throw new Error(\"Cannot convert hostname to CIDR\")\n }\n}\n\nfunction extractMetadata(address?: network.Address): network.L3Endpoint[\"metadata\"] {\n if (!address) {\n return {}\n }\n\n const metadata: network.L3Endpoint[\"metadata\"] = {}\n\n if (privateSubnets.some(subnet => doesAddressBelongToSubnet(address, subnet))) {\n metadata[\"iana.scope\"] = \"private\"\n } else {\n metadata[\"iana.scope\"] = \"global\"\n }\n\n return metadata\n}\n\n/**\n * Parses multiple endpoints from strings and input objects.\n *\n * @param endpoints The endpoint strings to parse.\n * @param inputEndpoints The input endpoint objects to use.\n * @returns The parsed list of endpoint objects with duplicates removed.\n */\nexport async function parseEndpoints<TMinLevel extends network.EndpointLevel = 3>(\n endpoints: (string | undefined | null)[] | null | undefined,\n inputEndpoints: InputArray<network.L3Endpoint | undefined | null> | null | undefined,\n minLevel: TMinLevel = 3 as TMinLevel,\n): Promise<network.EndpointByMinLevel<TMinLevel>[]> {\n const resolvedInputEndpoints = await toPromise(inputEndpoints ?? [])\n\n return pipe(\n [...(endpoints ?? []), ...resolvedInputEndpoints],\n filter(isNonNullish),\n map(endpoint => parseEndpoint(endpoint, minLevel)),\n uniqueBy(endpointToString),\n )\n}\n\n/**\n * Adds the given metadata to the endpoint.\n *\n * @param endpoint The endpoint to add metadataa to.\n * @param newMetadata The metadata to add to the endpoint.\n * @returns The endpoint with the added metadata.\n */\nexport function addEndpointMetadata<\n TEndpoint extends network.L3Endpoint,\n TMetadata extends Metadata,\n>(endpoint: TEndpoint, newMetadata: TMetadata): TEndpoint & { metadata: TMetadata } {\n const parsedMetadata = metadataSchema.safeParse(newMetadata)\n if (!parsedMetadata.success) {\n throw new Error(\n `Invalid new metadata for endpoint \"${endpointToString(endpoint)}\": ${parsedMetadata.error.message}`,\n )\n }\n\n return syncDynamic({\n ...endpoint,\n metadata: {\n ...endpoint.metadata,\n ...newMetadata,\n },\n })\n}\n\n/**\n * Merges duplicate endpoints by combining their metadata.\n *\n * @param endpoints The list of endpoints to merge.\n * @returns The merged list of endpoints with duplicates removed and metadata combined.\n */\nexport function mergeEndpoints<TEndpoint extends network.L3Endpoint>(\n endpoints: TEndpoint[],\n): TEndpoint[] {\n const mergedMap = new Map<string, TEndpoint>()\n\n for (const endpoint of endpoints) {\n const key = endpointToString(endpoint)\n const existing = mergedMap.get(key)\n\n if (existing) {\n mergedMap.set(key, addEndpointMetadata(existing, endpoint.metadata ?? {}))\n } else {\n mergedMap.set(key, endpoint)\n }\n }\n\n return Array.from(mergedMap.values())\n}\n\nfunction syncDynamic<TEndpoint extends network.L3Endpoint>(endpoint: TEndpoint): TEndpoint {\n return {\n ...endpoint,\n dynamic: {\n type: \"static\",\n endpoint: omit(endpoint, [\"dynamic\"]),\n },\n }\n}\n\n/**\n * Replaces the base (host) of an endpoint with another endpoint's base.\n *\n * This function can be used to \"re-host\" an endpoint while keeping its other properties.\n * For example, you can take an existing L7 endpoint and replace its host with a DNS record name.\n *\n * If the base is a hostname, the result becomes a hostname endpoint.\n * If the base is an IP address, the result becomes an IP endpoint of the base's version.\n *\n * The base properties are:\n * - For hostname endpoints: `type: \"hostname\"` and `hostname`\n * - For IP address endpoints: `type`, `address`, `subnet`, and `metadata`\n *\n * Note: This intentionally may change the endpoint kind (hostname ↔ ip) and IP version (ipv4 ↔ ipv6).\n *\n * @param endpoint The endpoint to replace the base properties of.\n * @param base The endpoint to take the base properties from.\n * @returns The endpoint with the replaced base properties.\n */\nexport function replaceEndpointBase<TEndpoint extends network.L3Endpoint>(\n endpoint: TEndpoint,\n base: network.L3Endpoint,\n): TEndpoint {\n if (base.type === \"hostname\") {\n return syncDynamic({\n ...omit(endpoint, [\"type\", \"address\", \"subnet\"]),\n type: \"hostname\",\n hostname: base.hostname,\n } as TEndpoint)\n }\n\n return syncDynamic({\n ...omit(endpoint, [\"type\", \"hostname\", \"metadata\"]),\n type: base.type,\n address: base.address,\n subnet: base.subnet,\n metadata: base.metadata ?? extractMetadata(base.address),\n } as TEndpoint)\n}\n","import type { common, ssh } from \"@highstate/library\"\nimport { homedir } from \"node:os\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type InputOrArray,\n interpolate,\n type Output,\n output,\n toPromise,\n} from \"@highstate/pulumi\"\nimport { sha256 } from \"@noble/hashes/sha2\"\nimport { local, remote, type types } from \"@pulumi/command\"\nimport { flat } from \"remeda\"\nimport { l3EndpointToString } from \"./network/endpoints\"\n\n/**\n * Creates a connection object for the given SSH credentials.\n *\n * @param ssh The SSH credentials.\n * @returns An output connection object for Pulumi remote commands.\n */\nexport function getServerConnection(\n ssh: Input<ssh.Connection>,\n): Output<types.input.remote.ConnectionArgs> {\n return output(ssh).apply(ssh => ({\n host: l3EndpointToString(ssh.endpoints[0]),\n port: ssh.endpoints[0].port,\n user: ssh.user,\n password: ssh.password,\n privateKey: ssh.keyPair?.privateKey,\n dialErrorLimit: 3,\n hostKey: ssh.hostKey,\n }))\n}\n\nexport type CommandHost = \"local\" | Input<common.Server>\nexport type CommandRunMode = \"auto\" | \"prefer-host\"\n\nexport type CommandArgs = {\n /**\n * The host to run the command on.\n *\n * Can be \"local\" for local execution or a server object for remote execution.\n */\n host: CommandHost\n\n /**\n * The command to run when the resource is created.\n *\n * If an array is provided, it will be joined with spaces.\n */\n create: InputOrArray<string>\n\n /**\n * The command to run when the resource is updated or one of the triggers changes.\n *\n * If not set, the `create` command will be used.\n */\n update?: InputOrArray<string>\n\n /**\n * The command to run when the resource is deleted.\n */\n delete?: InputOrArray<string>\n\n /**\n * The stdin content to pass to the command.\n */\n stdin?: Input<string>\n\n /**\n * The logging level for the command.\n */\n logging?: Input<local.Logging>\n\n /**\n * The triggers for the command.\n *\n * They will be captured in the command's state and will trigger the command to run again\n * if they change.\n */\n triggers?: InputOrArray<unknown>\n\n /**\n * The update triggers for the command.\n *\n * Unlike `triggers`, which replace the entire resource on change, these will only trigger the `update` command.\n *\n * Under the hood, it is implemented using a hash of the provided values and passing it as environment variable.\n * It is recommended to pass only primitive values (strings, numbers, booleans) or small objects/arrays for proper serialization.\n */\n updateTriggers?: InputOrArray<unknown>\n\n /**\n * The working directory for the command.\n *\n * If not set, the command will run in the user's home directory (for both local and remote hosts).\n */\n cwd?: Input<string>\n\n /**\n * The environment variables to set for the command.\n */\n environment?: Input<Record<string, Input<string>>>\n\n /**\n * The run mode for the command.\n *\n * - `auto` (default): if the `image` is set, it will always run in a container, never on the host;\n * otherwise, it will run on the host.\n *\n * - `prefer-host`: it will try to run on the host if the executable is available;\n * otherwise, it will run in a container or throw an error if the `image` is not set.\n */\n runMode?: CommandRunMode\n\n /**\n * The container image to use to run the command.\n */\n image?: Input<string>\n\n /**\n * The paths to mount if the command runs in a container.\n *\n * They will be mounted to the same paths in the container.\n */\n mounts?: InputOrArray<string>\n}\n\nexport type TextFileArgs = {\n /**\n * The host to run the command on.\n */\n host: CommandHost\n\n /**\n * The absolute path to the file on the host.\n */\n path: Input<string>\n\n /**\n * The content to write to the file.\n */\n content: Input<string>\n}\n\nexport type WaitForArgs = CommandArgs & {\n /**\n * The timeout in seconds to wait for the command to complete.\n *\n * Defaults to 5 minutes (300 seconds).\n */\n timeout?: Input<number>\n\n /**\n * The interval in seconds to wait between checks.\n *\n * Defaults to 5 seconds.\n */\n interval?: Input<number>\n}\n\nfunction createCommand(command: string | string[]): string {\n if (Array.isArray(command)) {\n return command.join(\" \")\n }\n\n return command\n}\n\nfunction wrapWithWorkDir(dir?: Input<string>) {\n if (!dir) {\n return (command: string) => output(command)\n }\n\n return (command: string) => interpolate`cd \"${dir}\" && ${command}`\n}\n\nfunction wrapWithEnvironment(environment?: Input<Record<string, Input<string>>>) {\n if (!environment) {\n return (command: string) => output(command)\n }\n\n return (command: string) =>\n output({ command, environment }).apply(({ command, environment }) => {\n if (!environment || Object.keys(environment).length === 0) {\n return command\n }\n\n const envExport = Object.entries(environment)\n .map(([key, value]) => `export ${key}=\"${value}\"`)\n .join(\" && \")\n\n return `${envExport} && ${command}`\n })\n}\n\nfunction wrapWithWaitFor(timeout: Input<number> = 300, interval: Input<number> = 5) {\n return (command: string | string[]) =>\n // TOD: escape the command\n interpolate`timeout ${timeout} bash -c 'while ! ${createCommand(command)}; do sleep ${interval}; done'`\n}\n\nfunction applyUpdateTriggers(\n env: Input<Record<string, Input<string>>> | undefined,\n triggers: InputOrArray<unknown> | undefined,\n) {\n return output({ env, triggers }).apply(({ env, triggers }) => {\n if (!triggers) {\n return env\n }\n\n const hash = sha256(JSON.stringify(triggers))\n const hashHex = Buffer.from(hash).toString(\"hex\")\n\n return {\n ...env,\n HIGHSTATE_UPDATE_TRIGGER_HASH: hashHex,\n }\n })\n}\n\nexport class Command extends ComponentResource {\n public readonly stdout: Output<string>\n public readonly stderr: Output<string>\n\n constructor(name: string, args: CommandArgs, opts?: ComponentResourceOptions) {\n super(\"highstate:common:Command\", name, args, opts)\n\n const environment = applyUpdateTriggers(\n args.environment,\n args.updateTriggers,\n ) as local.CommandArgs[\"environment\"]\n\n const command =\n args.host === \"local\"\n ? new local.Command(\n name,\n {\n create: output(args.create).apply(createCommand),\n update: args.update ? output(args.update).apply(createCommand) : undefined,\n delete: args.delete ? output(args.delete).apply(createCommand) : undefined,\n logging: args.logging,\n triggers: args.triggers ? output(args.triggers).apply(flat) : undefined,\n dir: args.cwd ?? homedir(),\n environment,\n stdin: args.stdin,\n addPreviousOutputInEnv: false,\n },\n { ...opts, parent: this },\n )\n : new remote.Command(\n name,\n {\n connection: output(args.host).apply(server => {\n if (!server.ssh) {\n throw new Error(`The server \"${server.hostname}\" has no SSH credentials`)\n }\n\n return getServerConnection(server.ssh)\n }),\n\n create: output(args.create)\n .apply(createCommand)\n .apply(wrapWithWorkDir(args.cwd))\n .apply(wrapWithEnvironment(environment)),\n\n update: args.update\n ? output(args.update)\n .apply(createCommand)\n .apply(wrapWithWorkDir(args.cwd))\n .apply(wrapWithEnvironment(environment))\n : undefined,\n\n delete: args.delete\n ? output(args.delete)\n .apply(createCommand)\n .apply(wrapWithWorkDir(args.cwd))\n .apply(wrapWithEnvironment(environment))\n : undefined,\n\n logging: args.logging,\n triggers: args.triggers ? output(args.triggers).apply(flat) : undefined,\n stdin: args.stdin,\n\n addPreviousOutputInEnv: false,\n\n // TODO: does not work if server do not define AcceptEnv\n // environment,\n },\n { ...opts, parent: this },\n )\n\n this.stdout = command.stdout\n this.stderr = command.stderr\n\n this.registerOutputs({\n stdout: this.stdout,\n stderr: this.stderr,\n })\n }\n\n /**\n * Waits for the command to complete and returns its output.\n * The standard output will be returned.\n */\n async wait(): Promise<string> {\n return await toPromise(this.stdout)\n }\n\n /**\n * Creates a command that writes the given content to a file on the host.\n * The file will be created if it does not exist, and overwritten if it does.\n *\n * Use for small text files like configuration files.\n */\n static createTextFile(\n name: string,\n options: TextFileArgs,\n opts?: ComponentResourceOptions,\n ): Command {\n return new Command(\n name,\n {\n host: options.host,\n create: interpolate`mkdir -p $(dirname \"${options.path}\") && cat > ${options.path}`,\n delete: interpolate`rm -rf ${options.path}`,\n stdin: options.content,\n },\n opts,\n )\n }\n\n /**\n * Creates a command that waits for a file to be created and then reads its content.\n * This is useful for waiting for a file to be generated by another process.\n *\n * Use for small text files like configuration files.\n */\n static receiveTextFile(\n name: string,\n options: Omit<TextFileArgs, \"content\">,\n opts?: ComponentResourceOptions,\n ): Command {\n return new Command(\n name,\n {\n host: options.host,\n create: interpolate`while ! test -f \"${options.path}\"; do sleep 1; done; cat \"${options.path}\"`,\n logging: \"stderr\",\n },\n opts,\n )\n }\n\n /**\n * Creates a command that waits for a condition to be met.\n * The command will run until the condition is met or the timeout is reached.\n *\n * The condition is considered met if the command returns a zero exit code.\n *\n * @param name The name of the command resource.\n * @param args The arguments for the command, including the condition to check.\n * @param opts Optional resource options.\n */\n static waitFor(name: string, args: WaitForArgs, opts?: ComponentResourceOptions): Command {\n return new Command(\n name,\n {\n ...args,\n create: output(args.create).apply(wrapWithWaitFor(args.timeout, args.interval)),\n update: args.update\n ? output(args.update).apply(wrapWithWaitFor(args.timeout, args.interval))\n : undefined,\n delete: args.delete\n ? output(args.delete).apply(wrapWithWaitFor(args.timeout, args.interval))\n : undefined,\n },\n opts,\n )\n }\n}\n","import type { z } from \"@highstate/contract\"\nimport type { ImplementationReference } from \"@highstate/library\"\nimport {\n getImportBaseUrl,\n type Input,\n type Output,\n output,\n toPromise,\n type Unwrap,\n} from \"@highstate/pulumi\"\nimport { resolve as importMetaResolve } from \"import-meta-resolve\"\n\n/**\n * The ImplementationMediator is used as a contract between the calling code and the implementation.\n *\n * From the calling code perspective, it provides a way to define the input and output schemas for the implementation\n * and call the implementation with the provided input.\n *\n * From the implementation perspective, it provides a way to get zod function with automatic type inference and validation.\n */\nexport class ImplementationMediator<\n TInputSchema extends z.ZodType,\n TOutputSchema extends z.ZodType,\n> {\n constructor(\n readonly path: string,\n private readonly inputSchema: TInputSchema,\n private readonly outputSchema: TOutputSchema,\n ) {}\n\n implement<TDataSchema extends z.ZodType>(\n dataSchema: TDataSchema,\n func: (\n input: z.infer<TInputSchema>,\n data: z.infer<TDataSchema>,\n ) => z.infer<TOutputSchema> | Promise<z.infer<TOutputSchema>>,\n ) {\n return async (\n input: z.infer<TInputSchema>,\n data: z.infer<TDataSchema>,\n ): Promise<z.infer<TOutputSchema>> => {\n const parsedInput = this.inputSchema.safeParse(input)\n if (!parsedInput.success) {\n throw new Error(\n `Invalid input for implementation \"${this.path}\": ${parsedInput.error.message}`,\n )\n }\n\n const parsedData = dataSchema.safeParse(data)\n if (!parsedData.success) {\n throw new Error(\n `Invalid data for implementation \"${this.path}\": ${parsedData.error.message}`,\n )\n }\n\n const result = await func(parsedInput.data, parsedData.data)\n const parsedResult = this.outputSchema.safeParse(result)\n\n if (!parsedResult.success) {\n throw new Error(\n `Invalid output from implementation \"${this.path}\": ${parsedResult.error.message}`,\n )\n }\n\n return parsedResult.data\n }\n }\n\n async call(\n implRef: Input<ImplementationReference>,\n input: Input<z.infer<TInputSchema>>,\n ): Promise<z.infer<TOutputSchema>> {\n const resolvedImplRef = await toPromise(implRef)\n const resolvedInput = await toPromise(input)\n\n const importPath = `${resolvedImplRef.package}/impl/${this.path}`\n\n let impl: Record<string, unknown>\n try {\n const fullUrl = importMetaResolve(importPath, getImportBaseUrl().toString())\n impl = await import(fullUrl)\n } catch (error) {\n console.error(`Failed to import module \"${importPath}\":`, String(error))\n\n throw new Error(\"Failed to import module required by implementation.\")\n }\n\n const funcs = Object.entries(impl).filter(value => typeof value[1] === \"function\") as [\n string,\n (...args: unknown[]) => unknown,\n ][]\n\n if (funcs.length === 0) {\n throw new Error(`No implementation functions found in module \"${importPath}\".`)\n }\n\n if (funcs.length > 1) {\n throw new Error(\n `Multiple implementation functions found in module \"${importPath}\": ${funcs.map(func => func[0]).join(\", \")}. ` +\n \"Ensure only one function is exported.\",\n )\n }\n\n const [funcName, implFunc] = funcs[0]\n\n let result: unknown\n try {\n result = await implFunc(resolvedInput, resolvedImplRef.data)\n } catch (error) {\n console.error(`Error in implementation function \"${funcName}\":`, error)\n throw new Error(`Implementation function \"${funcName}\" failed`)\n }\n\n const parsedResult = this.outputSchema.safeParse(result)\n if (!parsedResult.success) {\n throw new Error(\n `Implementation function \"${funcName}\" returned invalid result: ${parsedResult.error.message}`,\n )\n }\n\n return parsedResult.data\n }\n\n callOutput(\n implRef: Input<ImplementationReference>,\n input: Input<z.infer<TInputSchema>>,\n ): Output<Unwrap<z.infer<TOutputSchema>>> {\n return output(this.call(implRef, input))\n }\n}\n\nexport function areImplRefsEqual(a: ImplementationReference, b: ImplementationReference): boolean {\n return a.package === b.package && JSON.stringify(a.data) === JSON.stringify(b.data)\n}\n","import type { dns, network } from \"@highstate/library\"\nimport { getOrCreate, z } from \"@highstate/contract\"\nimport {\n ComponentResource,\n type Input,\n type InputArray,\n type InputOrArray,\n interpolate,\n normalizeInputsAndMap,\n type Output,\n output,\n type ResourceOptions,\n type Unwrap,\n} from \"@highstate/pulumi\"\nimport { flat } from \"remeda\"\nimport { Command, type CommandHost } from \"./command\"\nimport { ImplementationMediator } from \"./impl-ref\"\nimport { type InputEndpoint, l3EndpointToString, parseEndpoint } from \"./network/endpoints\"\n\nexport const dnsRecordMediator = new ImplementationMediator(\n \"dns-record\",\n z.object({ name: z.string(), args: z.custom<ResolvedDnsRecordArgs>() }),\n z.instanceof(ComponentResource),\n)\n\nexport type DnsRecordArgs = {\n /**\n * The DNS provider to use.\n */\n provider: Input<dns.Provider>\n\n /**\n * The name of the DNS record.\n * If not provided, the name of the resource will be used.\n */\n name?: Input<string>\n\n /**\n * The type of the DNS record.\n *\n * If not provided, will be automatically detected based on the value.\n */\n type?: Input<string>\n\n /**\n * The value of the DNS record.\n */\n value: Input<InputEndpoint>\n\n /**\n * Whether the DNS record is proxied (e.g. to provide DDoS protection).\n *\n * Available only for public IPs and some DNS providers like Cloudflare.\n * If not supported, the DNS provider will ignore this value.\n */\n proxied?: Input<boolean>\n\n /**\n * The TTL of the DNS record.\n *\n * If not provided, the DNS provider will use its default value.\n */\n ttl?: Input<number>\n\n /**\n * The priority of the DNS record.\n *\n * Only used for some DNS record types (e.g. MX).\n */\n priority?: Input<number>\n\n /**\n * Wait for the DNS record to be created/updated at the specified environment(s) before continuing.\n */\n waitAt?: InputOrArray<CommandHost>\n}\n\nexport type ResolvedDnsRecordArgs = Pick<DnsRecordArgs, \"name\" | \"priority\" | \"ttl\" | \"proxied\"> & {\n /**\n * The value of the DNS record.\n */\n value: Input<string>\n\n /**\n * The type of the DNS record.\n */\n type: Input<string>\n}\n\nexport type DnsRecordSetArgs = Omit<DnsRecordArgs, \"provider\" | \"value\"> & {\n /**\n * The DNS providers to use to create the DNS records.\n *\n * If multiple providers matched the specified domain, records will be created for each of them.\n */\n providers: Input<dns.Provider[]>\n\n /**\n * The value of the DNS record.\n */\n value?: Input<InputEndpoint>\n\n /**\n * The values of the DNS records.\n */\n values?: InputArray<InputEndpoint>\n}\n\nfunction getTypeByEndpoint(endpoint: network.L3Endpoint): string {\n switch (endpoint.type) {\n case \"ipv4\":\n return \"A\"\n case \"ipv6\":\n return \"AAAA\"\n case \"hostname\":\n return \"CNAME\"\n }\n}\n\n/**\n * Creates a DNS record for the specified value and waits for it to be resolved.\n *\n * Uses the specified DNS provider to create the record.\n */\nexport class DnsRecord extends ComponentResource {\n /**\n * The underlying dns record resource.\n */\n readonly dnsRecord: Output<ComponentResource>\n\n /**\n * The commands to be executed after the DNS record is created/updated.\n *\n * These commands will wait for the DNS record to be resolved to the specified value.\n */\n readonly waitCommands: Output<Command[]>\n\n constructor(name: string, args: DnsRecordArgs, opts?: ResourceOptions) {\n super(\"highstate:common:DnsRecord\", name, args, opts)\n\n const l3Endpoint = output(args.value).apply(value => parseEndpoint(value))\n const resolvedValue = l3Endpoint.apply(l3EndpointToString)\n const resolvedType = args.type ? output(args.type) : l3Endpoint.apply(getTypeByEndpoint)\n\n this.dnsRecord = output(args.provider).apply(provider => {\n return dnsRecordMediator.call(provider.implRef, {\n name,\n args: {\n name: args.name,\n priority: args.priority,\n ttl: args.ttl,\n value: resolvedValue,\n type: resolvedType,\n },\n })\n })\n\n this.waitCommands = output({\n waitAt: args.waitAt,\n resolvedType,\n proxied: args.proxied,\n }).apply(({ waitAt, resolvedType, proxied }) => {\n if (resolvedType === \"CNAME\") {\n // TODO: handle CNAME records\n return []\n }\n\n const resolvedHosts = waitAt ? [waitAt].flat() : []\n\n if (proxied) {\n // for proxied records do not verify the value since we do not know the actual IP addressa\n\n return (resolvedHosts as Unwrap<CommandHost>[]).map(host => {\n const hostname = host === \"local\" ? \"local\" : host.hostname\n\n return new Command(\n `${name}.wait-for-dns.${hostname}`,\n {\n host,\n create: [\n interpolate`while ! getent hosts \"${args.name}\";`,\n interpolate`do echo \"Waiting for DNS record \\\"${args.name}\\\" to be available...\";`,\n `sleep 5;`,\n `done`,\n ],\n },\n { parent: this },\n )\n })\n }\n\n return (resolvedHosts as Unwrap<CommandHost>[]).map(host => {\n const hostname = host === \"local\" ? \"local\" : host.hostname\n\n return new Command(\n `${name}.wait-for-dns.${hostname}`,\n {\n host,\n create: [\n interpolate`while ! getent hosts \"${args.name}\" | grep \"${resolvedValue}\";`,\n interpolate`do echo \"Waiting for DNS record \\\"${args.name}\" to resolve to \"${resolvedValue}\"...\";`,\n `sleep 5;`,\n `done`,\n ],\n },\n { parent: this },\n )\n })\n })\n }\n}\n\n/**\n * Creates a set of DNS records for the specified values and waits for them to be resolved.\n */\nexport class DnsRecordSet extends ComponentResource {\n /**\n * The underlying dns record resources.\n */\n readonly dnsRecords: Output<DnsRecord[]>\n\n /**\n * The flat list of all wait commands for the DNS records.\n */\n readonly waitCommands: Output<Command[]>\n\n constructor(name: string, args: DnsRecordSetArgs, opts?: ResourceOptions) {\n super(\"highstate:common:DnsRecordSet\", name, args, opts)\n\n const matchedProviders = output({\n providers: args.providers,\n name: args.name ?? name,\n }).apply(({ providers, name }) => {\n const matchedProviders = providers.filter(provider =>\n provider.zones.some(zone => name.endsWith(zone)),\n )\n\n if (matchedProviders.length === 0) {\n throw new Error(`No DNS provider matched the domain \"${name}\"`)\n }\n\n return matchedProviders\n })\n\n this.dnsRecords = normalizeInputsAndMap(args.value, args.values, value => {\n return output({\n name: args.name ?? name,\n providers: matchedProviders,\n }).apply(({ name, providers }) => {\n return providers.flatMap(provider => {\n const l3Endpoint = parseEndpoint(value)\n\n return new DnsRecord(\n `${name}.${provider.id}.${l3EndpointToString(l3Endpoint)}`,\n {\n name,\n provider,\n value: l3Endpoint,\n type: args.type ?? getTypeByEndpoint(l3Endpoint),\n proxied: args.proxied,\n ttl: args.ttl,\n priority: args.priority,\n waitAt: args.waitAt,\n },\n { parent: this },\n )\n })\n })\n }).apply(flat)\n\n this.waitCommands = this.dnsRecords\n .apply(records => records.flatMap(record => record.waitCommands))\n .apply(flat)\n }\n\n private static readonly dnsRecordSetCache = new Map<string, DnsRecordSet>()\n\n /**\n * Creates a DNS record set for the specified endpoints and waits for it to be resolved.\n *\n * If a DNS record set with the same name already exists, it will be reused.\n *\n * @param name The name of the DNS record set.\n * @param args The arguments for the DNS record set.\n * @param opts The options for the resource.\n */\n static createOnce(name: string, args: DnsRecordSetArgs, opts?: ResourceOptions): DnsRecordSet {\n return getOrCreate(\n DnsRecordSet.dnsRecordSetCache,\n name,\n () => new DnsRecordSet(name, args, opts),\n )\n }\n}\n","import type { TlsCertificate } from \"./tls\"\nimport { z } from \"@highstate/contract\"\nimport { type common, network } from \"@highstate/library\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type Output,\n output,\n Resource,\n} from \"@highstate/pulumi\"\nimport { ImplementationMediator } from \"./impl-ref\"\n\nexport const gatewayRouteMediator = new ImplementationMediator(\n \"gateway-route\",\n z.object({\n name: z.string(),\n spec: z.custom<GatewayRouteSpec>(),\n opts: z.custom<ComponentResourceOptions>().optional(),\n }),\n z.object({\n resource: z.instanceof(Resource),\n endpoints: network.l3EndpointEntity.schema.array(),\n }),\n)\n\nexport type GatewayRouteSpec = {\n /**\n * The FQDN to expose the workload on.\n */\n fqdn?: Input<string>\n\n /**\n * The endpoints of the backend workload to route traffic to.\n */\n endpoints: Input<network.L4Endpoint[]>\n\n /**\n * The native data to pass to the implementation.\n *\n * This is used for data which implementation may natively understand,\n * such as Kubernetes `Service` resources.\n *\n * Implementations may use this data to create more efficient routes\n * using native resources.\n */\n nativeData?: Input<unknown>\n\n /**\n * The TLS certificate to use for the route.\n */\n tlsCertificate?: Input<TlsCertificate | undefined>\n} & (\n | {\n type: \"http\"\n\n /**\n * Whether to expose the workload over plain HTTP.\n *\n * By default, the workload will be exposed over HTTPS.\n */\n insecure?: Input<boolean>\n\n /**\n * The relative path to expose the workload on.\n *\n * By default, the workload will be exposed on the root path (`/`).\n */\n path?: Input<string>\n }\n | {\n type: \"tcp\" | \"udp\"\n\n /**\n * The name or port of the target port on the backend endpoints to route traffic to.\n *\n * If not specified, the first port of the matching protocol will be used.\n */\n targetPort?: Input<string | number>\n\n /**\n * The port to expose the route on.\n *\n * If not specified, the same port as the target port will be used.\n */\n port?: Input<number>\n }\n)\n\nexport type GatewayRouteArgs = GatewayRouteSpec & {\n /**\n * The gateway to attach the route to.\n */\n gateway: Input<common.Gateway>\n}\n\nexport class GatewayRoute extends ComponentResource {\n /**\n * The underlying resource created by the implementation.\n */\n readonly resource: Output<Resource>\n\n /**\n * The endpoints of the gateway which serve this route.\n *\n * In most cases, this will be a single endpoint of the gateway shared for all routes.\n */\n readonly endpoints: Output<network.L3Endpoint[]>\n\n constructor(name: string, args: GatewayRouteArgs, opts?: ComponentResourceOptions) {\n super(\"highstate:common:GatewayRoute\", name, args, opts)\n\n const { resource, endpoints } = gatewayRouteMediator.callOutput(output(args.gateway).implRef, {\n name,\n spec: args,\n opts: { ...opts, parent: this },\n })\n\n this.resource = resource\n this.endpoints = endpoints\n }\n}\n","import type { common } from \"@highstate/library\"\nimport { getOrCreate, z } from \"@highstate/contract\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type InputArray,\n normalizeInputs,\n type Output,\n output,\n Resource,\n} from \"@highstate/pulumi\"\nimport { ImplementationMediator } from \"./impl-ref\"\n\nexport const tlsCertificateMediator = new ImplementationMediator(\n \"tls-certificate\",\n z.object({\n name: z.string(),\n spec: z.custom<TlsCertificateSpec>(),\n opts: z.custom<ComponentResourceOptions>().optional(),\n }),\n z.instanceof(Resource),\n)\n\nexport type TlsCertificateSpec = {\n /**\n * The common name for the certificate.\n */\n commonName?: Input<string>\n\n /**\n * The alternative DNS names for the certificate.\n */\n dnsNames?: InputArray<string>\n\n /**\n * The native data to pass to the implementation.\n *\n * This is used for data which implementation may natively understand\n * and may use this data to create certificates using native resources.\n */\n nativeData?: unknown\n}\n\nexport type TlsCertificateArgs = TlsCertificateSpec & {\n /**\n * The issuer to use for the certificate.\n */\n issuer?: Input<common.TlsIssuer>\n\n /**\n * The issuers to use for the certificate.\n *\n * If multiple issuers are provided, the certificate will be created using the first issuer that supports the requested common name.\n */\n issuers?: InputArray<common.TlsIssuer>\n}\n\nexport class TlsCertificate extends ComponentResource {\n /**\n * The underlying resource created by the implementation.\n */\n readonly resource: Output<Resource>\n\n constructor(name: string, args: TlsCertificateArgs, opts?: ComponentResourceOptions) {\n super(\"highstate:common:TlsCertificate\", name, args, opts)\n\n const issuers = normalizeInputs(args.issuer, args.issuers)\n\n this.resource = output({\n issuers,\n commonName: args.commonName,\n dnsNames: args.dnsNames,\n }).apply(async ({ issuers, commonName, dnsNames }) => {\n // for now, we require single issuer to match all requested names\n const matchedIssuer = issuers.find(issuer => {\n if (commonName && !issuer.zones.some(zone => commonName.endsWith(zone))) {\n return false\n }\n\n if (dnsNames && !dnsNames.every(name => issuer.zones.some(zone => name.endsWith(zone)))) {\n return false\n }\n\n return true\n })\n\n if (!matchedIssuer) {\n if (commonName && dnsNames && dnsNames.length > 0) {\n const dnsNameList = dnsNames.join(\", \")\n\n throw new Error(\n `No TLS issuer matched the common name \"${commonName}\" and DNS names \"${dnsNameList}\"`,\n )\n }\n\n if (commonName) {\n throw new Error(`No TLS issuer matched the common name \"${commonName}\"`)\n }\n\n if (dnsNames && dnsNames.length > 0) {\n const dnsNameList = dnsNames.join(\", \")\n\n throw new Error(`No TLS issuer matched the DNS names \"${dnsNameList}\"`)\n }\n\n throw new Error(\"No TLS issuer provided\")\n }\n\n return await tlsCertificateMediator.call(matchedIssuer.implRef, {\n name,\n spec: args,\n })\n })\n }\n\n private static readonly tlsCertificateCache = new Map<string, TlsCertificate>()\n\n /**\n * Creates a TLS certificate for the specified common name and DNS names.\n *\n * If a TLS certificate with the same name already exists, it will be reused.\n *\n * @param name The name of the TLS certificate.\n * @param args The arguments for the TLS certificate.\n * @param opts The options for the resource.\n */\n static createOnce(\n name: string,\n args: TlsCertificateArgs,\n opts?: ComponentResourceOptions,\n ): TlsCertificate {\n return getOrCreate(\n TlsCertificate.tlsCertificateCache,\n name,\n () => new TlsCertificate(name, args, opts),\n )\n }\n}\n","import type { common } from \"@highstate/library\"\nimport type { Except } from \"type-fest\"\nimport {\n ComponentResource,\n type ComponentResourceOptions,\n type Input,\n type Output,\n output,\n toPromise,\n} from \"@highstate/pulumi\"\nimport { DnsRecordSet } from \"./dns\"\nimport { GatewayRoute, type GatewayRouteSpec } from \"./gateway\"\nimport { TlsCertificate } from \"./tls\"\n\nexport type AccessPointRouteArgs = Except<GatewayRouteSpec, \"nativeData\"> & {\n /**\n * The access point to use to expose the route.\n */\n accessPoint: Input<common.AccessPoint>\n\n /**\n * The native data to pass to the gateway route implementation.\n */\n gatewayNativeData?: unknown\n\n /**\n * The native data to pass to the tls ceertificate implementation.\n */\n tlsCertificateNativeData?: unknown\n}\n\nexport class AccessPointRoute extends ComponentResource {\n /**\n * The created gateway route.\n */\n readonly route: GatewayRoute\n\n /**\n * The DNS record set created for the route.\n *\n * May be shared between multiple routes with the same FQDN.\n */\n readonly dnsRecordSet?: Output<DnsRecordSet | undefined>\n\n /**\n * The TLS certificate created for the route.\n *\n * May be shared between multiple routes with the same FQDN.\n */\n readonly tlsCertificate?: Output<TlsCertificate | undefined>\n\n constructor(name: string, args: AccessPointRouteArgs, opts?: ComponentResourceOptions) {\n super(\"highstate:common:AccessPointRoute\", name, args, opts)\n\n // 1. create TLS certificate if the route is HTTPS and the access point has TLS issuers\n if (args.fqdn && args.type === \"http\" && !args.insecure) {\n this.tlsCertificate = output(args.accessPoint).apply(accessPoint => {\n if (accessPoint.tlsIssuers.length === 0) {\n return undefined\n }\n\n return TlsCertificate.createOnce(\n name,\n {\n issuers: accessPoint.tlsIssuers,\n dnsNames: args.fqdn ? [args.fqdn] : [],\n nativeData: args.tlsCertificateNativeData,\n },\n { ...opts, parent: this },\n )\n })\n }\n\n // 2. create the route and resolve the gateway endpoints\n this.route = new GatewayRoute(\n name,\n {\n ...args,\n gateway: output(args.accessPoint).gateway,\n tlsCertificate: this.tlsCertificate,\n nativeData: args.gatewayNativeData,\n },\n { ...opts, parent: this },\n )\n\n // 3. register DNS records if FQDN is provided and the access point has DNS providers\n if (args.fqdn) {\n this.dnsRecordSet = output(args.accessPoint).apply(async accessPoint => {\n if (accessPoint.dnsProviders.length === 0) {\n return undefined\n }\n\n const fqdn = await toPromise(args.fqdn)\n if (!fqdn) {\n return undefined\n }\n\n return DnsRecordSet.createOnce(\n fqdn,\n {\n providers: output(args.accessPoint).dnsProviders,\n values:\n accessPoint.gateway.endpoints.length > 0\n ? accessPoint.gateway.endpoints\n : this.route.endpoints,\n waitAt: \"local\",\n proxied: accessPoint.proxied,\n },\n { ...opts, parent: this },\n )\n })\n }\n }\n}\n","import type { common, network } from \"@highstate/library\"\nimport { createHash } from \"node:crypto\"\nimport { createReadStream } from \"node:fs\"\nimport { cp, mkdir, mkdtemp, rename, rm, stat, writeFile } from \"node:fs/promises\"\nimport { tmpdir } from \"node:os\"\nimport { basename, dirname, extname, join } from \"node:path\"\nimport { Readable } from \"node:stream\"\nimport { pipeline } from \"node:stream/promises\"\nimport { type CommonObjectMeta, HighstateSignature } from \"@highstate/contract\"\nimport { asset, type Input, toPromise } from \"@highstate/pulumi\"\nimport { minimatch } from \"minimatch\"\nimport * as tar from \"tar\"\nimport unzipper from \"unzipper\"\nimport { type InputL7Endpoint, l7EndpointToString, parseEndpoint } from \"./network/endpoints\"\n\nexport type FolderPackOptions = {\n /**\n * The patterns to include in the packed archive.\n * If not provided, all files and folders will be included.\n */\n include?: string[]\n\n /**\n * The patterns to exclude from the packed archive.\n * Applied after include patterns.\n * If not provided, no files or folders will be excluded.\n */\n exclude?: string[]\n}\n\n/**\n * Creates Pulumi asset from Highstate file.\n *\n * @param file The file entity to create the asset from.\n * @returns The created asset.\n */\nexport function assetFromFile(file: common.File): asset.Asset {\n if (file.content.type === \"remote\") {\n return new asset.RemoteAsset(l7EndpointToString(file.content.endpoint))\n }\n\n if (file.content.type === \"local\") {\n return new asset.FileAsset(file.content.path)\n }\n\n if (file.content.type === \"artifact\") {\n throw new Error(\n \"Artifact-based files cannot be converted to Pulumi assets directly. Use MaterializedFile instead.\",\n )\n }\n\n if (file.content.isBinary) {\n throw new Error(\n \"Cannot create asset from inline binary file content. Please open an issue if you need this feature.\",\n )\n }\n\n return new asset.StringAsset(file.content.value)\n}\n\n/**\n * Creates Pulumi archive from Highstate folder.\n *\n * @param folder The folder entity to create the asset archive from.\n * @returns The created asset archive.\n */\nexport function archiveFromFolder(folder: common.Folder): asset.Archive {\n if (folder.content.type === \"remote\") {\n return new asset.RemoteArchive(l7EndpointToString(folder.content.endpoint))\n }\n\n if (folder.content.type === \"local\") {\n return new asset.FileArchive(folder.content.path)\n }\n\n if (folder.content.type === \"artifact\") {\n throw new Error(\n \"Artifact-based folders cannot be converted to Pulumi assets directly. Use MaterializedFolder instead.\",\n )\n }\n\n const files: Record<string, asset.Asset> = {}\n\n for (const file of folder.content.files) {\n files[file.meta.name] = assetFromFile(file)\n }\n\n for (const subfolder of folder.content.folders) {\n files[subfolder.meta.name] = archiveFromFolder(subfolder)\n }\n\n return new asset.AssetArchive(files)\n}\n\n/**\n * Extracts a tar or zip archive from a stream to a destination directory.\n *\n * @param stream The stream containing the archive data\n * @param destinationPath The path where to extract the archive\n * @param archiveType The type of archive ('tar' or 'zip')\n */\nasync function unarchiveFromStream(\n stream: Readable,\n destinationPath: string,\n archiveType: \"tar\" | \"zip\",\n): Promise<void> {\n await mkdir(destinationPath, { recursive: true })\n\n switch (archiveType) {\n case \"tar\": {\n const extractStream = tar.extract({\n cwd: destinationPath,\n strict: true,\n })\n\n await pipeline(stream, extractStream)\n return\n }\n case \"zip\": {\n // Extract directly from stream using unzipper\n await pipeline(stream, unzipper.Extract({ path: destinationPath }))\n return\n }\n }\n}\n\n/**\n * Determines the archive type based on file extension or content type.\n *\n * @param fileName The name of the file\n * @param contentType Optional content type from HTTP headers\n * @returns The detected archive type or null if not an archive\n */\nfunction detectArchiveType(fileName: string, contentType?: string): \"tar\" | \"zip\" | null {\n const ext = extname(fileName).toLowerCase()\n\n if (ext === \".tar\" || ext === \".tgz\" || ext === \".tar.gz\") {\n return \"tar\"\n }\n\n if (ext === \".zip\") {\n return \"zip\"\n }\n\n // Fallback to content type\n if (contentType) {\n if (contentType.includes(\"tar\") || contentType.includes(\"gzip\")) {\n return \"tar\"\n }\n if (contentType.includes(\"zip\")) {\n return \"zip\"\n }\n }\n\n return null\n}\n\n/**\n * The `MaterializedFile` class represents a file entity that has been materialized\n * to a local filesystem path.\n *\n * It handles creating a temporary directory, writing the file content to that directory,\n * and cleaning up the temporary files when disposed.\n *\n * For improved cleanup reliability, the class will use HIGHSTATE_TEMP_PATH as the base\n * directory for temporary files if available, allowing for centralized cleanup by the runner.\n */\nexport class MaterializedFile implements AsyncDisposable {\n private _tmpPath?: string\n private _path!: string\n private _disposed = false\n\n readonly artifactMeta: CommonObjectMeta\n\n constructor(\n readonly entity: common.File,\n readonly parent?: MaterializedFolder,\n ) {\n this.artifactMeta = {\n title: `Materialized file \"${entity.meta.name}\"`,\n }\n }\n\n get path(): string {\n return this._path\n }\n\n private async _open(): Promise<void> {\n if (this.parent) {\n // if the parent folder is provided, the file path is relative to the parent folder\n this._path = join(this.parent.path, this.entity.meta.name)\n } else {\n // otherwise, the file path is in a temporary directory\n // use HIGHSTATE_TEMP_PATH as base if available for better cleanup reliability\n const tempBase = process.env.HIGHSTATE_TEMP_PATH || tmpdir()\n this._tmpPath = await mkdtemp(join(tempBase, \"highstate-file-\"))\n this._path = join(this._tmpPath, this.entity.meta.name)\n }\n\n switch (this.entity.content.type) {\n case \"embedded\": {\n const content = this.entity.content.isBinary\n ? Buffer.from(this.entity.content.value, \"base64\")\n : this.entity.content.value\n\n await writeFile(this._path, content, { mode: this.entity.meta.mode })\n break\n }\n case \"local\": {\n await cp(this.entity.content.path, this._path, { mode: this.entity.meta.mode })\n break\n }\n case \"remote\": {\n const response = await fetch(l7EndpointToString(this.entity.content.endpoint))\n if (!response.ok) throw new Error(`Failed to fetch: ${response.statusText}`)\n\n const arrayBuffer = await response.arrayBuffer()\n await writeFile(this._path, Buffer.from(arrayBuffer), { mode: this.entity.meta.mode })\n\n break\n }\n case \"artifact\": {\n const artifactPath = process.env.HIGHSTATE_ARTIFACT_READ_PATH\n if (!artifactPath) {\n throw new Error(\n \"HIGHSTATE_ARTIFACT_READ_PATH environment variable is not set but required for artifact content\",\n )\n }\n\n const tgzPath = join(artifactPath, `${this.entity.content.hash}.tgz`)\n\n // extract the tgz file directly to the target path\n const readStream = createReadStream(tgzPath)\n await unarchiveFromStream(readStream, dirname(this._path), \"tar\")\n break\n }\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n if (this._disposed) return\n this._disposed = true\n\n try {\n if (this._tmpPath) {\n // clear the whole temporary directory if it was created\n await rm(this._tmpPath, { recursive: true, force: true })\n } else {\n // otherwise, just remove the file\n await rm(this._path, { force: true })\n }\n } catch (error) {\n // ignore errors during cleanup, as the file might have been already removed\n // or the temporary directory might not exist\n // TODO: centralized logging for unit code\n console.warn(\"failed to clean up materialized file:\", error)\n }\n }\n\n /**\n * Packs the materialized file into an artifact and returns the file entity with artifact content.\n *\n * Creates a tgz archive of the file and stores it in HIGHSTATE_ARTIFACT_WRITE_PATH where it will be collected by Highstate.\n */\n async pack(): Promise<common.ArtifactFile> {\n const writeDir = process.env.HIGHSTATE_ARTIFACT_WRITE_PATH\n if (!writeDir) {\n throw new Error(\"HIGHSTATE_ARTIFACT_WRITE_PATH environment variable is not set\")\n }\n\n // read actual file stats from filesystem\n const fileStats = await stat(this._path)\n\n // create tgz archive of the file\n const tempBase = process.env.HIGHSTATE_TEMP_PATH || tmpdir()\n const tempArchivePath = join(tempBase, `highstate-pack-${Date.now()}.tgz`)\n\n try {\n await tar.create(\n {\n gzip: true,\n file: tempArchivePath,\n cwd: dirname(this._path),\n noMtime: true, // to reproduce the same archive every time\n },\n [basename(this._path)],\n )\n\n // calculate hash of the archive\n const fileContent = createReadStream(tempArchivePath)\n const hash = createHash(\"sha256\")\n\n for await (const chunk of fileContent) {\n hash.update(chunk as Buffer)\n }\n\n const hashValue = hash.digest(\"hex\")\n\n // move archive to write directory with hash name\n const finalArchivePath = join(writeDir, `${hashValue}.tgz`)\n await rename(tempArchivePath, finalArchivePath)\n\n const newMeta = {\n name: this.entity.meta.name,\n mode: fileStats.mode & 0o777, // extract only permission bits\n size: fileStats.size,\n }\n\n // return file entity with artifact content using actual filesystem stats\n return {\n meta: newMeta,\n content: {\n type: \"artifact\",\n [HighstateSignature.Artifact]: true,\n hash: hashValue,\n meta: await toPromise(this.artifactMeta),\n },\n }\n } finally {\n // clean up temporary archive\n try {\n await rm(tempArchivePath, { force: true })\n } catch {\n // ignore cleanup errors\n }\n }\n }\n\n /**\n * Creates an empty materialized file with the given name.\n *\n * @param name The name of the file to create\n * @param content Optional initial content of the file (default is empty string)\n * @param mode Optional file mode (permissions)\n * @returns A new MaterializedFile instance representing an empty file\n */\n static async create(name: string, content = \"\", mode?: number): Promise<MaterializedFile> {\n const entity: common.File = {\n meta: {\n name,\n mode,\n size: 0,\n },\n content: {\n type: \"embedded\",\n value: content,\n },\n }\n\n const materializedFile = new MaterializedFile(entity)\n\n try {\n await materializedFile._open()\n } catch (error) {\n await materializedFile[Symbol.asyncDispose]()\n throw error\n }\n\n return materializedFile\n }\n\n static async open(\n file: Input<common.File>,\n parent?: MaterializedFolder,\n ): Promise<MaterializedFile> {\n const resolvedFile = await toPromise(file)\n const materializedFile = new MaterializedFile(resolvedFile, parent)\n\n try {\n await materializedFile._open()\n } catch (error) {\n await materializedFile[Symbol.asyncDispose]()\n throw error\n }\n\n return materializedFile\n }\n}\n\n/**\n * The `MaterializedFolder` class represents a folder entity that has been materialized\n * to a local filesystem path.\n *\n * It handles creating a temporary directory, copying the folder content to that directory,\n * and cleaning up the temporary files when disposed.\n *\n * For improved cleanup reliability, the class will use HIGHSTATE_TEMP_PATH as the base\n * directory for temporary files if available, allowing for centralized cleanup by the runner.\n */\nexport class MaterializedFolder implements AsyncDisposable {\n private _tmpPath?: string\n private _path!: string\n private _disposed = false\n\n private readonly _disposables: AsyncDisposable[] = []\n\n readonly artifactMeta: CommonObjectMeta\n\n constructor(\n readonly entity: common.Folder,\n readonly parent?: MaterializedFolder,\n ) {\n this.artifactMeta = {\n title: `Materialized folder \"${entity.meta.name}\"`,\n }\n }\n\n get path(): string {\n return this._path\n }\n\n private async _open(): Promise<void> {\n if (this.parent) {\n // if the parent folder is provided, the folder path is relative to the parent folder\n this._path = join(this.parent.path, this.entity.meta.name)\n } else {\n // otherwise, the folder path is in a temporary directory\n // use HIGHSTATE_TEMP_PATH as base if available for better cleanup reliability\n const tempBase = process.env.HIGHSTATE_TEMP_PATH || tmpdir()\n this._tmpPath = await mkdtemp(join(tempBase, \"highstate-folder-\"))\n this._path = join(this._tmpPath, this.entity.meta.name)\n }\n\n switch (this.entity.content.type) {\n case \"embedded\": {\n // create the folder itself\n await mkdir(this._path, { mode: this.entity.meta.mode })\n\n for (const file of this.entity.content.files) {\n const materializedFile = await MaterializedFile.open(file, this)\n this._disposables.push(materializedFile)\n }\n\n for (const subfolder of this.entity.content.folders) {\n const materializedFolder = await MaterializedFolder.open(subfolder, this)\n this._disposables.push(materializedFolder)\n }\n\n break\n }\n case \"local\": {\n // Check if the local path is an archive file that needs extraction\n const archiveType = detectArchiveType(this.entity.content.path)\n\n if (archiveType) {\n // Extract archive to the destination path\n const readStream = createReadStream(this.entity.content.path)\n await unarchiveFromStream(readStream, this._path, archiveType)\n } else {\n // Regular directory copy\n await cp(this.entity.content.path, this._path, {\n recursive: true,\n mode: this.entity.meta.mode,\n })\n }\n\n break\n }\n case \"remote\": {\n const response = await fetch(l7EndpointToString(this.entity.content.endpoint))\n if (!response.ok) throw new Error(`Failed to fetch: ${response.statusText}`)\n if (!response.body) throw new Error(\"Response body is empty\")\n\n // Try to detect archive type from URL or content type\n const url = new URL(l7EndpointToString(this.entity.content.endpoint))\n const archiveType = detectArchiveType(\n url.pathname,\n response.headers.get(\"content-type\") || undefined,\n )\n\n if (!archiveType) {\n throw new Error(\"Remote folder content must be an archive (tar, tar.gz, tgz, or zip)\")\n }\n\n if (!response.body) {\n throw new Error(\"Response body is empty\")\n }\n\n const reader = response.body.getReader()\n const stream = new Readable({\n async read() {\n try {\n const { done, value } = await reader.read()\n if (done) {\n this.push(null)\n } else {\n this.push(Buffer.from(value))\n }\n } catch (error) {\n this.destroy(error instanceof Error ? error : new Error(String(error)))\n }\n },\n })\n\n await unarchiveFromStream(stream, this._path, archiveType)\n\n break\n }\n case \"artifact\": {\n const artifactPath = process.env.HIGHSTATE_ARTIFACT_READ_PATH\n\n if (!artifactPath) {\n throw new Error(\n \"HIGHSTATE_ARTIFACT_READ_PATH environment variable is not set but required for artifact content\",\n )\n }\n\n const tgzPath = join(artifactPath, `${this.entity.content.hash}.tgz`)\n\n // extract the tgz file directly to the target path\n const readStream = createReadStream(tgzPath)\n await unarchiveFromStream(readStream, dirname(this._path), \"tar\")\n\n break\n }\n }\n }\n\n async [Symbol.asyncDispose](): Promise<void> {\n if (this._disposed) return\n this._disposed = true\n\n try {\n if (this._tmpPath) {\n // clear the whole temporary directory if it was created\n await rm(this._tmpPath, { recursive: true, force: true })\n } else {\n // otherwise, just remove the folder\n await rm(this._path, { recursive: true, force: true })\n }\n } catch (error) {\n // ignore errors during cleanup, as the folder might have been already removed\n // or the temporary directory might not exist\n // TODO: centralized logging for unit code\n console.warn(\"failed to clean up materialized folder:\", error)\n }\n\n // dispose all materialized children\n for (const disposable of this._disposables) {\n await disposable[Symbol.asyncDispose]()\n }\n }\n\n /**\n * Packs the materialized folder into an artifact and returns the folder entity with artifact content.\n *\n * Creates a tgz archive of the entire folder and stores it in HIGHSTATE_ARTIFACT_WRITE_PATH where it will be collected by Highstate.\n */\n async pack({ include, exclude }: FolderPackOptions = {}): Promise<common.ArtifactFolder> {\n const writeDir = process.env.HIGHSTATE_ARTIFACT_WRITE_PATH\n if (!writeDir) {\n throw new Error(\"HIGHSTATE_ARTIFACT_WRITE_PATH environment variable is not set\")\n }\n\n // read actual folder stats from filesystem\n const folderStats = await stat(this._path)\n\n // create tgz archive of the folder\n const tempBase = process.env.HIGHSTATE_TEMP_PATH || tmpdir()\n const tempArchivePath = join(tempBase, `highstate-pack-${Date.now()}.tgz`)\n\n const entity = this.entity\n\n try {\n await tar.create(\n {\n gzip: true,\n file: tempArchivePath,\n cwd: dirname(this._path),\n\n filter(path) {\n // match without the folder name prefix\n path = path.slice(entity.meta.name.length + 1)\n\n // handle explicit excludes\n for (const pattern of exclude ?? []) {\n if (minimatch(path, pattern)) {\n return false\n }\n }\n\n // try to match include patterns\n for (const pattern of include ?? []) {\n if (minimatch(path, pattern)) {\n return true\n }\n }\n\n // include all files if no include patterns are specified\n return !include || include.length === 0\n },\n\n // to reproduce the same archive every time\n portable: true,\n noMtime: true,\n },\n [basename(this._path)],\n )\n\n // calculate hash of the archive\n const fileContent = createReadStream(tempArchivePath)\n const hash = createHash(\"sha256\")\n\n for await (const chunk of fileContent) {\n hash.update(chunk as Buffer)\n }\n\n const hashValue = hash.digest(\"hex\")\n\n // move archive to write directory with hash name\n const finalArchivePath = join(writeDir, `${hashValue}.tgz`)\n await rename(tempArchivePath, finalArchivePath)\n\n const newMeta = {\n name: this.entity.meta.name,\n mode: folderStats.mode & 0o777, // extract only permission bits\n }\n\n // return folder entity with artifact content using actual filesystem stats\n return {\n meta: newMeta,\n content: {\n [HighstateSignature.Artifact]: true,\n type: \"artifact\",\n hash: hashValue,\n meta: await toPromise(this.artifactMeta),\n },\n }\n } finally {\n // clean up temporary archive\n try {\n await rm(tempArchivePath, { force: true })\n } catch {\n // ignore cleanup errors\n }\n }\n }\n\n /**\n * Creates an empty materialized folder with the given name.\n *\n * @param name The name of the folder to create\n * @param mode Optional folder mode (permissions)\n * @param parent Optional parent folder to create the folder in\n * @returns A new MaterializedFolder instance representing an empty folder\n */\n static async create(\n name: string,\n mode?: number,\n parent?: MaterializedFolder,\n ): Promise<MaterializedFolder> {\n const entity: common.Folder = {\n meta: {\n name,\n mode,\n },\n content: {\n type: \"embedded\",\n files: [],\n folders: [],\n },\n }\n\n const materializedFolder = new MaterializedFolder(entity, parent)\n\n try {\n await materializedFolder._open()\n } catch (error) {\n await materializedFolder[Symbol.asyncDispose]()\n throw error\n }\n\n return materializedFolder\n }\n\n static async open(\n folder: common.Folder,\n parent?: MaterializedFolder,\n ): Promise<MaterializedFolder> {\n const materializedFolder = new MaterializedFolder(folder, parent)\n\n try {\n await materializedFolder._open()\n } catch (error) {\n await materializedFolder[Symbol.asyncDispose]()\n throw error\n }\n\n return materializedFolder\n }\n}\n\n/**\n * Fetches the size of a file from a given L7 endpoint.\n *\n * @param endpoint The L7 endpoint to fetch the file size from.\n * @returns The size of the file in bytes.\n * @throws If the protocol is not HTTP/HTTPS or if the request fails.\n */\nexport async function fetchFileSize(endpoint: network.L7Endpoint): Promise<number> {\n if (endpoint.appProtocol !== \"http\" && endpoint.appProtocol !== \"https\") {\n throw new Error(\n `Unsupported protocol: ${endpoint.appProtocol}. Only HTTP and HTTPS are supported.`,\n )\n }\n\n const url = l7EndpointToString(endpoint)\n const response = await fetch(url, { method: \"HEAD\" })\n\n if (!response.ok) {\n throw new Error(`Failed to fetch file size: ${response.statusText}`)\n }\n\n const contentLength = response.headers.get(\"content-length\")\n if (!contentLength) {\n throw new Error(\"Content-Length header is missing in the response\")\n }\n\n const size = parseInt(contentLength, 10)\n if (Number.isNaN(size)) {\n throw new Error(`Invalid Content-Length value: ${contentLength}`)\n }\n\n return size\n}\n\n/**\n * Extracts the name from an L7 endpoint URL without its file extension.\n */\nexport function getNameByEndpoint(endpoint: InputL7Endpoint): string {\n const parsedEndpoint = parseEndpoint(endpoint, 7)\n\n return parsedEndpoint.path ? basename(parsedEndpoint.path) : \"\"\n}\n","import { check } from \"@highstate/contract\"\nimport { network } from \"@highstate/library\"\nimport { addressToCidr } from \"./address\"\nimport { cidrBlockSize, ipToString, parseCidr, parseIp, subnetBaseFromCidr } from \"./ip\"\nimport { subnetToString } from \"./subnet\"\n\nexport type AddressSpaceArgs = {\n /**\n * The list of addresses to include in the address space.\n *\n * Supports:\n * - Other address space entities;\n * - Address entities;\n * - Subnet entities;\n * - L3 endpoint entities;\n * - String representations of addresses, subnets, or ranges.\n *\n * The supported formats for strings are:\n * - Single IP address (e.g., `192.168.1.1`);\n * - CIDR notation (e.g., `192.168.1.1/24`);\n * - Dash notation (e.g., `192.168.1.1-192.168.1.254`).\n *\n * The addresses can be a mix of IPv4 and IPv6.\n */\n included: InputAddressSpace[]\n\n /**\n * The list of addresses to exclude from the `addresses` list.\n *\n * The supported formats are the same as in `addresses`.\n */\n excluded?: InputAddressSpace[]\n}\n\nexport type InputAddressSpace =\n | network.AddressSpace\n | network.Address\n | network.Subnet\n | network.L3Endpoint\n | string\n\ntype IpFamily = network.AddressType\n\ntype IpRange = {\n family: IpFamily\n start: bigint\n endExclusive: bigint\n}\n\n/**\n * Creates an address space from a list of addresses/subnets/ranges.\n *\n * @param included The list of addresses to include in the address space.\n * @param excluded The list of addresses to exclude from the `included` list.\n * @returns The created address space entity.\n */\nexport function createAddressSpace({\n included,\n excluded = [],\n}: AddressSpaceArgs): network.AddressSpace {\n const includedRanges = included.flatMap(resolveInputToRanges)\n const excludedRanges = excluded.flatMap(resolveInputToRanges)\n\n const normalized = normalizeRanges(includedRanges, excludedRanges)\n const subnets = rangesToCanonicalSubnets(normalized)\n\n return { subnets }\n}\n\nfunction resolveInputToRanges(input: InputAddressSpace): IpRange[] {\n if (typeof input === \"string\") {\n return [rangeFromString(input)]\n }\n\n if (check(network.addressSpaceEntity.schema, input)) {\n return input.subnets.flatMap(subnet => [rangeFromCidr(subnetToString(subnet))])\n }\n\n if (check(network.subnetEntity.schema, input)) {\n return [rangeFromCidr(subnetToString(input))]\n }\n\n if (check(network.addressEntity.schema, input)) {\n return [rangeFromCidr(addressToCidr(input))]\n }\n\n if (check(network.l3EndpointEntity.schema, input)) {\n if (input.type === \"hostname\") {\n return []\n }\n\n const cidr = (input as unknown as { cidr?: unknown }).cidr\n if (typeof cidr === \"string\") {\n return [rangeFromCidr(cidr)]\n }\n\n const address = (input as unknown as { address?: unknown }).address\n if (typeof address === \"string\") {\n const parsed = parseIp(address)\n const prefixLength = parsed.type === \"ipv4\" ? 32 : 128\n return [\n rangeFromParsedCidr({ family: parsed.type, base: parsed.value, prefix: prefixLength }),\n ]\n }\n\n if (check(network.addressEntity.schema, address)) {\n return [rangeFromCidr(addressToCidr(address))]\n }\n\n throw new Error(\"Invalid L3 endpoint: missing address information\")\n }\n\n throw new Error(\"Unsupported address space input\")\n}\n\nfunction rangeFromString(value: string): IpRange {\n const trimmed = value.trim()\n if (!trimmed) {\n throw new Error(\"Empty address string\")\n }\n\n if (trimmed.includes(\"-\")) {\n const [left, right, ...rest] = trimmed.split(\"-\")\n if (!left || !right || rest.length > 0) {\n throw new Error(`Invalid range: \"${value}\"`)\n }\n\n const start = parseIp(left.trim())\n const end = parseIp(right.trim())\n\n if (start.type !== end.type) {\n throw new Error(`Range must not mix IPv4 and IPv6: \"${value}\"`)\n }\n\n const min = start.value <= end.value ? start.value : end.value\n const max = start.value <= end.value ? end.value : start.value\n\n return {\n family: start.type,\n start: min,\n endExclusive: max + 1n,\n }\n }\n\n if (trimmed.includes(\"/\")) {\n return rangeFromCidr(trimmed)\n }\n\n const parsed = parseIp(trimmed)\n return {\n family: parsed.type,\n start: parsed.value,\n endExclusive: parsed.value + 1n,\n }\n}\n\nfunction rangeFromCidr(cidr: string): IpRange {\n const parsed = parseCidr(cidr)\n return rangeFromParsedCidr({\n family: parsed.type,\n base: subnetBaseFromCidr(parsed),\n prefix: parsed.prefixLength,\n })\n}\n\nfunction rangeFromParsedCidr(parsed: { family: IpFamily; base: bigint; prefix: number }): IpRange {\n const size = cidrBlockSize(parsed.family, parsed.prefix)\n\n return {\n family: parsed.family,\n start: parsed.base,\n endExclusive: parsed.base + size,\n }\n}\n\nfunction normalizeRanges(included: IpRange[], excluded: IpRange[]): IpRange[] {\n const includedByFamily = splitByFamily(included)\n const excludedByFamily = splitByFamily(excluded)\n\n const normalizedV4 = subtractMergedRanges(\n mergeRanges(includedByFamily.v4),\n mergeRanges(excludedByFamily.v4),\n )\n const normalizedV6 = subtractMergedRanges(\n mergeRanges(includedByFamily.v6),\n mergeRanges(excludedByFamily.v6),\n )\n\n return [...normalizedV4, ...normalizedV6]\n}\n\nfunction splitByFamily(ranges: IpRange[]): { v4: IpRange[]; v6: IpRange[] } {\n const v4: IpRange[] = []\n const v6: IpRange[] = []\n\n for (const range of ranges) {\n if (range.start >= range.endExclusive) continue\n\n if (range.family === \"ipv4\") {\n v4.push(range)\n } else {\n v6.push(range)\n }\n }\n\n return { v4, v6 }\n}\n\nfunction mergeRanges(ranges: IpRange[]): IpRange[] {\n const sorted = [...ranges].sort((a, b) => {\n if (a.start === b.start) {\n return a.endExclusive < b.endExclusive ? -1 : a.endExclusive > b.endExclusive ? 1 : 0\n }\n return a.start < b.start ? -1 : 1\n })\n\n const merged: IpRange[] = []\n\n for (const current of sorted) {\n const last = merged.at(-1)\n if (!last) {\n merged.push({ ...current })\n continue\n }\n\n if (current.start <= last.endExclusive) {\n if (current.endExclusive > last.endExclusive) {\n last.endExclusive = current.endExclusive\n }\n continue\n }\n\n merged.push({ ...current })\n }\n\n return merged\n}\n\nfunction subtractMergedRanges(included: IpRange[], excluded: IpRange[]): IpRange[] {\n if (included.length === 0) return []\n if (excluded.length === 0) return included\n\n const result: IpRange[] = []\n let j = 0\n\n for (const incOriginal of included) {\n const inc: IpRange = { ...incOriginal }\n\n while (j < excluded.length && excluded[j]!.endExclusive <= inc.start) {\n j++\n }\n\n while (j < excluded.length) {\n const exc = excluded[j]!\n\n if (exc.start >= inc.endExclusive) {\n break\n }\n\n if (exc.start <= inc.start) {\n inc.start = inc.start < exc.endExclusive ? exc.endExclusive : inc.start\n if (inc.start >= inc.endExclusive) {\n break\n }\n\n if (exc.endExclusive <= inc.start) {\n j++\n }\n continue\n }\n\n result.push({\n family: inc.family,\n start: inc.start,\n endExclusive: exc.start,\n })\n\n inc.start = exc.endExclusive\n if (inc.start >= inc.endExclusive) {\n break\n }\n }\n\n if (inc.start < inc.endExclusive) {\n result.push(inc)\n }\n }\n\n return result\n}\n\nfunction rangesToCanonicalSubnets(ranges: IpRange[]): network.Subnet[] {\n const subnets: network.Subnet[] = []\n\n for (const range of ranges) {\n for (const cidr of rangeToCidrs(range)) {\n const baseAddress = ipToString(cidr.family, cidr.base)\n\n subnets.push({\n type: cidr.family,\n baseAddress,\n prefixLength: cidr.prefix,\n })\n }\n }\n\n return sortSubnetsCanonical(subnets)\n}\n\nfunction sortSubnetsCanonical(subnets: network.Subnet[]): network.Subnet[] {\n return [...subnets].sort((a, b) => {\n const aFamily = a.type\n const bFamily = b.type\n if (aFamily !== bFamily) {\n return aFamily === \"ipv4\" ? -1 : 1\n }\n\n const aBase = parseIp(a.baseAddress).value\n const bBase = parseIp(b.baseAddress).value\n\n if (aBase !== bBase) {\n return aBase < bBase ? -1 : 1\n }\n\n return a.prefixLength - b.prefixLength\n })\n}\n\nfunction rangeToCidrs(range: IpRange): Array<{ family: IpFamily; base: bigint; prefix: number }> {\n const bits = range.family === \"ipv4\" ? 32 : 128\n const result: Array<{ family: IpFamily; base: bigint; prefix: number }> = []\n\n let current = range.start\n while (current < range.endExclusive) {\n const remaining = range.endExclusive - current\n const maxAligned = current === 0n ? 1n << BigInt(bits) : current & -current\n const maxByRemaining = highestPowerOfTwoAtMost(remaining)\n\n const blockSize = maxAligned < maxByRemaining ? maxAligned : maxByRemaining\n const prefix = bits - bitLength(blockSize) + 1\n\n result.push({\n family: range.family,\n base: current,\n prefix,\n })\n\n current += blockSize\n }\n\n return result\n}\n\nfunction highestPowerOfTwoAtMost(value: bigint): bigint {\n if (value <= 0n) {\n throw new Error(\"Value must be positive\")\n }\n\n return 1n << BigInt(bitLength(value) - 1)\n}\n\nfunction bitLength(value: bigint): number {\n return value.toString(2).length\n}\n","import { bytesToHex, randomBytes } from \"@noble/hashes/utils.js\"\nimport { secureMask } from \"micro-key-producer/password.js\"\n\n/**\n * Generates a secure random password strong enough for online use.\n *\n * It uses \"Safari Keychain Secure Password\" format.\n *\n * The approximate entropy is [71 bits](https://support.apple.com/guide/security/automatic-strong-passwords-secc84c811c4/web).\n */\nexport function generatePassword(): string {\n return secureMask.apply(randomBytes(32)).password\n}\n\ntype KeyFormatMap = {\n raw: Uint8Array\n hex: string\n base64: string\n}\n\n/**\n * Generates a secure random key strong enough for offline use such as encryption.\n *\n * The strong entropy is 256 bits.\n *\n * @param format The format of the generated key. By default, it is \"hex\".\n */\nexport function generateKey<TFormat extends keyof KeyFormatMap = \"hex\">(\n format: TFormat = \"hex\" as TFormat,\n): KeyFormatMap[TFormat] {\n const bytes = randomBytes(32)\n\n if (format === \"raw\") {\n return bytes as KeyFormatMap[TFormat]\n }\n\n if (format === \"base64\") {\n return Buffer.from(bytes).toString(\"base64\") as KeyFormatMap[TFormat]\n }\n\n return bytesToHex(bytes) as KeyFormatMap[TFormat]\n}\n","{\n \"terminal-ssh\": {\n \"name\": \"ghcr.io/highstate-io/highstate/terminal.ssh\",\n \"tag\": \"latest\",\n \"image\": \"ghcr.io/highstate-io/highstate/terminal.ssh:latest@sha256:7b15f9cda7bc153a4e3566e46bc4f89d3983148606f300ed097f682dc2bc03ea\"\n }\n}\n","import type { common, network, ssh } from \"@highstate/library\"\nimport { stripNullish, type UnitTerminal } from \"@highstate/contract\"\nimport {\n fileFromString,\n type Input,\n type Output,\n output,\n secret,\n toPromise,\n} from \"@highstate/pulumi\"\nimport { remote } from \"@pulumi/command\"\nimport getKeys, { PrivateExport } from \"micro-key-producer/ssh.js\"\nimport { randomBytes } from \"micro-key-producer/utils.js\"\nimport * as images from \"../../assets/images.json\"\nimport { Command } from \"./command\"\nimport { l3EndpointToL4, l3EndpointToString } from \"./network/endpoints\"\n\nexport async function createSshTerminal(\n credentials: Input<ssh.Connection>,\n): Promise<Output<UnitTerminal>> {\n const resolvedCredentials = await toPromise(credentials)\n\n const command = [\"ssh\", \"-tt\", \"-o\", \"UserKnownHostsFile=/known_hosts\"]\n\n // TODO: select best endpoint based on the environment\n const endpoint = resolvedCredentials.endpoints[0]\n\n command.push(\"-p\", endpoint.port.toString())\n\n if (resolvedCredentials.keyPair) {\n command.push(\"-i\", \"/private_key\")\n }\n\n command.push(`${resolvedCredentials.user}@${l3EndpointToString(endpoint)}`)\n\n if (resolvedCredentials.password) {\n command.unshift(\"sshpass\", \"-f\", \"/password\")\n }\n\n return output({\n name: \"ssh\",\n\n meta: {\n title: \"Shell\",\n description: \"Connect to the server via SSH.\",\n icon: \"gg:remote\",\n },\n\n spec: {\n image: images[\"terminal-ssh\"].image,\n command,\n\n files: stripNullish({\n \"/password\": resolvedCredentials.password\n ? fileFromString(\"password\", resolvedCredentials.password, { isSecret: true })\n : undefined,\n\n \"/private_key\": resolvedCredentials.keyPair?.privateKey\n ? fileFromString(\"private_key\", resolvedCredentials.keyPair.privateKey, {\n isSecret: true,\n mode: 0o600,\n })\n : undefined,\n\n \"/known_hosts\": fileFromString(\n \"known_hosts\",\n `${l3EndpointToString(endpoint)} ${resolvedCredentials.hostKey}`,\n { mode: 0o644 },\n ),\n }),\n },\n })\n}\n\n/**\n * Creates a file containing the SSH host key(s) of all endpoints of the given server.\n *\n * @param server The server entity to create the host key file for.\n * @returns An Output of the created file entity.\n */\nexport function createSshHostKeyFile(server: Input<common.Server>): Output<common.File> {\n return output(server).apply(server => {\n if (!server.ssh) {\n throw new Error(\"Server must have an SSH endpoint defined to create a host key file\")\n }\n\n return fileFromString(\n `${server.hostname}-ssh-host-key`,\n server.ssh.endpoints.map(ep => `${l3EndpointToString(ep)} ${server.ssh!.hostKey}`).join(\"\\n\"),\n { mode: 0o644 },\n )\n })\n}\n\n/**\n * Generates a secure random SSH private key.\n * The key is generated using the Ed25519 algorithm.\n *\n * @returns The generated SSH private key in PEM format.\n */\nexport function generateSshPrivateKey(): Output<string> {\n const seed = randomBytes(32)\n\n return secret(getKeys(seed).privateKey)\n}\n\n/**\n * Converts a private SSH key string to a KeyPair object.\n *\n * @param privateKeyString The private key string to convert.\n * @returns An Output of the KeyPair object.\n */\nexport function sshPrivateKeyToKeyPair(privateKeyString: Input<string>): Output<ssh.KeyPair> {\n return output(privateKeyString).apply(privateKeyString => {\n const privateKeyStruct = PrivateExport.decode(privateKeyString)\n\n // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access\n const privKey = privateKeyStruct.keys[0].privKey.privKey as Uint8Array\n\n const { fingerprint, publicKey } = getKeys(privKey.slice(0, 32))\n\n return output({\n type: \"ed25519\" as const,\n fingerprint,\n publicKey,\n privateKey: secret(privateKeyString),\n })\n })\n}\n\nexport type ServerOptions = {\n /**\n * The local name of the server to namespace resources.\n */\n name: string\n\n /**\n * The fallback hostname to use if the server cannot be determined.\n *\n * If not provided, the `name` will be used as the fallback hostname.\n */\n fallbackHostname?: string\n\n /**\n * The L3 endpoints of the server.\n */\n endpoints: network.L3Endpoint[]\n\n /**\n * The arguments for the SSH connection.\n */\n sshArgs?: Partial<ssh.Args>\n\n /**\n * The password for the SSH connection.\n */\n sshPassword?: Input<string>\n\n /**\n * The private key for the SSH connection.\n */\n sshPrivateKey?: Input<string>\n\n /**\n * The SSH key pair for the server.\n * If provided, it will take precedence over the `sshPrivateKey` argument.\n */\n sshKeyPair?: Input<ssh.KeyPair>\n\n /**\n * Whether to wait for the server to respond to a ping command before returning.\n *\n * If true, the command will wait for a successful ping response before proceeding.\n *\n * By default, this is equal to `!waitForSsh`, so when `waitForSsh` is true, no extra ping is performed.\n */\n waitForPing?: boolean\n\n /**\n * The interval in seconds to wait between ping attempts.\n *\n * Only used if `waitForPing` is true.\n * By default, it will wait 5 seconds between attempts.\n */\n pingInterval?: number\n\n /**\n * The timeout in seconds to wait for the server to respond to a ping command.\n *\n * Only used if `waitForPing` is true.\n * By default, it will wait 5 minutes (300 seconds) before timing out.\n */\n pingTimeout?: number\n\n /**\n * Whether to wait for the SSH service to be available before returning.\n *\n * If true, the command will wait for the SSH service to respond before proceeding.\n *\n * By default, this is true if `sshArgs.enabled` is true, otherwise false.\n */\n waitForSsh?: boolean\n\n /**\n * The interval in seconds to wait between SSH connection attempts.\n *\n * Only used if `waitForSsh` is true.\n * By default, it will wait 5 seconds between attempts.\n */\n sshCheckInterval?: number\n\n /**\n * The timeout in seconds to wait for the SSH service to respond.\n *\n * Only used if `waitForSsh` is true.\n * By default, it will wait 5 minutes (300 seconds) before timing out.\n */\n sshCheckTimeout?: number\n}\n\nexport type ServerBundle = {\n /**\n * The server entity created with the provided options.\n */\n server: Output<common.Server>\n\n /**\n * The SSH terminal created for the server.\n */\n terminal?: Output<UnitTerminal>\n}\n\n/**\n * Creates a server entity with the provided options and returns a bundle containing the server entity and terminal.\n *\n * Basically, it just a convenience function that calls `createServerEntity` and `createSshTerminal`.\n *\n * @param options The options for creating the server entity.\n * @returns A promise that resolves to a ServerBundle containing the server entity and terminal.\n */\nexport async function createServerBundle(options: ServerOptions): Promise<ServerBundle> {\n const server = await createServerEntity(options)\n const ssh = await toPromise(server.ssh)\n\n return {\n server,\n terminal: ssh ? await createSshTerminal(ssh) : undefined,\n }\n}\n\n/**\n * Creates a server entity with the provided options.\n * It will create a command to check the SSH service and return the server entity.\n *\n * @param options The options for creating the server entity.\n * @returns A promise that resolves to the created server entity.\n */\nexport async function createServerEntity({\n name,\n fallbackHostname,\n endpoints,\n sshArgs = { enabled: true, port: 22, user: \"root\" },\n sshPassword,\n sshPrivateKey,\n sshKeyPair,\n pingInterval,\n pingTimeout,\n waitForPing,\n waitForSsh,\n sshCheckInterval,\n sshCheckTimeout,\n}: ServerOptions): Promise<Output<common.Server>> {\n if (endpoints.length === 0) {\n throw new Error(\"At least one L3 endpoint is required to create a server entity\")\n }\n\n fallbackHostname ??= name\n waitForSsh ??= sshArgs.enabled\n waitForPing ??= !waitForSsh\n\n if (waitForPing) {\n await Command.waitFor(`${name}.ping`, {\n host: \"local\",\n create: `ping -c 1 ${l3EndpointToString(endpoints[0])}`,\n timeout: pingTimeout ?? 300,\n interval: pingInterval ?? 5,\n triggers: [Date.now()],\n }).wait()\n }\n\n if (!sshArgs.enabled) {\n return output({\n hostname: name,\n endpoints,\n })\n }\n\n const sshHost = sshArgs?.host ?? l3EndpointToString(endpoints[0])\n\n if (waitForSsh) {\n await Command.waitFor(`${name}.ssh`, {\n host: \"local\",\n create: `nc -zv ${sshHost} ${sshArgs.port}`,\n timeout: sshCheckTimeout ?? 300,\n interval: sshCheckInterval ?? 5,\n triggers: [Date.now()],\n }).wait()\n }\n\n const connection = output({\n host: sshHost,\n port: sshArgs.port,\n user: sshArgs.user,\n password: sshPassword,\n privateKey: sshKeyPair ? output(sshKeyPair).privateKey : sshPrivateKey,\n dialErrorLimit: 3,\n })\n\n const hostnameResult = new remote.Command(\"hostname\", {\n connection,\n create: \"hostname\",\n triggers: [Date.now()],\n })\n\n const hostKeyResult = new remote.Command(\"host-key\", {\n connection,\n create: \"cat /etc/ssh/ssh_host_ed25519_key.pub\",\n triggers: [Date.now()],\n })\n\n return output({\n endpoints,\n hostname: hostnameResult.stdout.apply(x => x.trim()),\n ssh: {\n endpoints: [l3EndpointToL4(sshHost, sshArgs.port ?? 22)],\n user: sshArgs.user ?? \"root\",\n hostKey: hostKeyResult.stdout.apply(x => x.trim()),\n password: connection.password,\n keyPair: sshKeyPair\n ? sshKeyPair\n : sshPrivateKey\n ? sshPrivateKeyToKeyPair(sshPrivateKey)\n : undefined,\n },\n })\n}\n","import type { Metadata, MetadataContainer } from \"@highstate/library\"\nimport { compile } from \"filter-expression\"\n\n/**\n * Filter a list of items using a filter expression.\n *\n * See [filter-expression](https://github.com/tronghieu/filter-expression?tab=readme-ov-file#language) for more details on the expression syntax.\n *\n * @param items The items to filter.\n * @param expression The filter expression.\n * @param getContext The function to get the context for each item. Defaults to the item itself.\n * @returns The filtered items.\n */\nexport function filterByExpression<T>(\n items: T[],\n expression: string,\n getContext = (item: T) => item as Record<string, unknown>,\n): T[] {\n const { evaluate } = compile(expression)\n\n return items.filter(item => evaluate(getContext(item)))\n}\n\n/**\n * Filter a list of items with metadata using a filter expression.\n *\n * See `filterByExpression` for more details.\n *\n * @param items The items to filter.\n * @param expression The filter expression.\n * @param getContext The function to get the context for each item. Defaults to the item itself.\n * @returns The filtered items.\n */\nexport function filterWithMetadataByExpression<T extends MetadataContainer>(\n items: T[],\n expression: string,\n getContext = (item: T) => item as Record<string, unknown>,\n): T[] {\n return filterByExpression(items, expression, item =>\n getContext({ ...item, metadata: item.metadata ? flattenMetadata(item.metadata) : undefined }),\n )\n}\n\n/**\n * Transforms each dot-separated key in the metadata into a nested object structure.\n *\n * Should be used to create valid context for `filterByExpression`.\n *\n * Example:\n *\n * ```ts\n * const metadata = {\n * \"k8s.service\": {}\n * }\n * ```\n *\n * becomes\n *\n * ```ts\n * const flattened = {\n * k8s: {\n * service: {}\n * }\n * }\n * ```\n *\n * @param metadata The metadata to flatten.\n * @returns The flattened metadata.\n */\nexport function flattenMetadata(metadata: Metadata): Record<string, unknown> {\n const result = {}\n\n for (const [key, value] of Object.entries(metadata)) {\n const path = key.split(\".\")\n // biome-ignore lint/suspicious/noExplicitAny: to simplify implementation\n let current: any = result\n\n for (let i = 0; i < path.length; i++) {\n const segment = path[i]\n\n if (i === path.length - 1) {\n current[segment] = value\n } else {\n if (!(segment in current)) {\n current[segment] = {}\n }\n current = current[segment] as Record<string, unknown>\n }\n }\n }\n\n return result\n}\n"]}
|
|
@@ -3,16 +3,26 @@
|
|
|
3
3
|
"./dist/index.js": 2212294583,
|
|
4
4
|
"./dist/units/access-point/index.js": 2212294583,
|
|
5
5
|
"./dist/units/dns/record-set/index.js": 2212294583,
|
|
6
|
+
"./dist/units/network/address-space/index.js": 2212294583,
|
|
7
|
+
"./dist/units/network/endpoint-filter/index.js": 2212294583,
|
|
6
8
|
"./dist/units/network/l3-endpoint/index.js": 2212294583,
|
|
7
9
|
"./dist/units/network/l4-endpoint/index.js": 2212294583,
|
|
10
|
+
"./dist/units/network/l7-endpoint/index.js": 2212294583,
|
|
8
11
|
"./dist/units/existing-server/index.js": 2212294583,
|
|
9
12
|
"./dist/units/ssh/key-pair/index.js": 2212294583,
|
|
10
13
|
"./dist/units/script/index.js": 2212294583,
|
|
11
|
-
"./dist/units/server-dns/index.js": 2212294583,
|
|
12
14
|
"./dist/units/server-patch/index.js": 2212294583,
|
|
15
|
+
"./dist/units/databases/existing-etcd/index.js": 2212294583,
|
|
13
16
|
"./dist/units/databases/existing-mariadb/index.js": 2212294583,
|
|
14
17
|
"./dist/units/databases/existing-postgresql/index.js": 2212294583,
|
|
15
18
|
"./dist/units/databases/existing-mongodb/index.js": 2212294583,
|
|
16
|
-
"./dist/units/databases/existing-redis/index.js": 2212294583
|
|
19
|
+
"./dist/units/databases/existing-redis/index.js": 2212294583,
|
|
20
|
+
"./dist/units/databases/existing-s3/index.js": 2212294583,
|
|
21
|
+
"./dist/units/databases/etcd-patch/index.js": 2212294583,
|
|
22
|
+
"./dist/units/databases/mariadb-patch/index.js": 2212294583,
|
|
23
|
+
"./dist/units/databases/postgresql-patch/index.js": 2212294583,
|
|
24
|
+
"./dist/units/databases/mongodb-patch/index.js": 2212294583,
|
|
25
|
+
"./dist/units/databases/redis-patch/index.js": 2212294583,
|
|
26
|
+
"./dist/units/databases/s3-patch/index.js": 2212294583
|
|
17
27
|
}
|
|
18
28
|
}
|
package/dist/index.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
export { AccessPointRoute, Command, DnsRecord, DnsRecordSet, GatewayRoute, ImplementationMediator, MaterializedFile, MaterializedFolder, TlsCertificate, archiveFromFolder, assetFromFile, createServerBundle, createServerEntity, createSshHostKeyFile, createSshTerminal, dnsRecordMediator, fetchFileSize,
|
|
1
|
+
export { AccessPointRoute, Command, DnsRecord, DnsRecordSet, GatewayRoute, ImplementationMediator, MaterializedFile, MaterializedFolder, TlsCertificate, addEndpointMetadata, addressToCidr, archiveFromFolder, areImplRefsEqual, assertEndpointLevel, assetFromFile, checkEndpointLevel, createAddressSpace, createServerBundle, createServerEntity, createSshHostKeyFile, createSshTerminal, dnsRecordMediator, doesAddressBelongToSubnet, endpointToString, fetchFileSize, filterByExpression, filterWithMetadataByExpression, flattenMetadata, gatewayRouteMediator, generateKey, generatePassword, generateSshPrivateKey, getNameByEndpoint, getServerConnection, isPrivateAddress, l3EndpointToCidr, l3EndpointToL4, l3EndpointToString, l4EndpointToFullString, l4EndpointToL7, l4EndpointToString, l7EndpointToString, mergeAddresses, mergeEndpoints, parseAddress, parseEndpoint, parseEndpoints, parseL4Protocol, parseSubnet, parseSubnets, privateIpV4Subnets, privateIpV6Subnets, privateSubnets, replaceEndpointBase, sshPrivateKeyToKeyPair, subnetToString, tlsCertificateMediator } from './chunk-X5BK6JSN.js';
|
|
2
2
|
//# sourceMappingURL=index.js.map
|
|
3
3
|
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { parseEndpoints, l4EndpointToString } from '../../../chunk-X5BK6JSN.js';
|
|
2
|
+
import { databases } from '@highstate/library';
|
|
3
|
+
import { forUnit, toPromise } from '@highstate/pulumi';
|
|
4
|
+
|
|
5
|
+
var { args, inputs, outputs } = forUnit(databases.etcdPatch);
|
|
6
|
+
var resolvedInputEndpoints = await toPromise(inputs.endpoints ?? []);
|
|
7
|
+
var shouldOverrideEndpoints = args.endpoints.length > 0 || resolvedInputEndpoints.some((endpoint) => endpoint != null);
|
|
8
|
+
var endpoints = shouldOverrideEndpoints ? await parseEndpoints(args.endpoints, inputs.endpoints, 4) : await parseEndpoints([], inputs.endpoints, 4);
|
|
9
|
+
var etcd_patch_default = outputs({
|
|
10
|
+
etcd: {
|
|
11
|
+
endpoints
|
|
12
|
+
},
|
|
13
|
+
$statusFields: {
|
|
14
|
+
endpoints: endpoints.map(l4EndpointToString)
|
|
15
|
+
}
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
export { etcd_patch_default as default };
|
|
19
|
+
//# sourceMappingURL=index.js.map
|
|
20
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/units/databases/etcd-patch/index.ts"],"names":[],"mappings":";;;;AAIA,IAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,UAAU,SAAS,CAAA;AAE7D,IAAM,yBAAyB,MAAM,SAAA,CAAU,MAAA,CAAO,SAAA,IAAa,EAAE,CAAA;AAErE,IAAM,uBAAA,GACJ,KAAK,SAAA,CAAU,MAAA,GAAS,KAAK,sBAAA,CAAuB,IAAA,CAAK,CAAA,QAAA,KAAY,QAAA,IAAY,IAAI,CAAA;AACvF,IAAM,YAAY,uBAAA,GACd,MAAM,cAAA,CAAe,IAAA,CAAK,WAAW,MAAA,CAAO,SAAA,EAAW,CAAC,CAAA,GACxD,MAAM,cAAA,CAAe,EAAC,EAAG,MAAA,CAAO,WAAW,CAAC,CAAA;AAEhD,IAAO,qBAAQ,OAAA,CAAQ;AAAA,EACrB,IAAA,EAAM;AAAA,IACJ;AAAA,GACF;AAAA,EAEA,aAAA,EAAe;AAAA,IACb,SAAA,EAAW,SAAA,CAAU,GAAA,CAAI,kBAAkB;AAAA;AAE/C,CAAC","file":"index.js","sourcesContent":["import { databases } from \"@highstate/library\"\nimport { forUnit, toPromise } from \"@highstate/pulumi\"\nimport { l4EndpointToString, parseEndpoints } from \"../../../shared\"\n\nconst { args, inputs, outputs } = forUnit(databases.etcdPatch)\n\nconst resolvedInputEndpoints = await toPromise(inputs.endpoints ?? [])\n\nconst shouldOverrideEndpoints =\n args.endpoints.length > 0 || resolvedInputEndpoints.some(endpoint => endpoint != null)\nconst endpoints = shouldOverrideEndpoints\n ? await parseEndpoints(args.endpoints, inputs.endpoints, 4)\n : await parseEndpoints([], inputs.endpoints, 4)\n\nexport default outputs({\n etcd: {\n endpoints,\n },\n\n $statusFields: {\n endpoints: endpoints.map(l4EndpointToString),\n },\n})\n"]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { parseEndpoints } from '../../../chunk-X5BK6JSN.js';
|
|
2
|
+
import { databases } from '@highstate/library';
|
|
3
|
+
import { forUnit } from '@highstate/pulumi';
|
|
4
|
+
|
|
5
|
+
var { args, inputs, outputs } = forUnit(databases.existingEtcd);
|
|
6
|
+
var existing_etcd_default = outputs({
|
|
7
|
+
etcd: {
|
|
8
|
+
endpoints: parseEndpoints(args.endpoints, inputs.endpoints, 4)
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
|
|
12
|
+
export { existing_etcd_default as default };
|
|
13
|
+
//# sourceMappingURL=index.js.map
|
|
14
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../src/units/databases/existing-etcd/index.ts"],"names":[],"mappings":";;;;AAIA,IAAM,EAAE,IAAA,EAAM,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,UAAU,YAAY,CAAA;AAEhE,IAAO,wBAAQ,OAAA,CAAQ;AAAA,EACrB,IAAA,EAAM;AAAA,IACJ,WAAW,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,WAAW,CAAC;AAAA;AAEjE,CAAC","file":"index.js","sourcesContent":["import { databases } from \"@highstate/library\"\nimport { forUnit } from \"@highstate/pulumi\"\nimport { parseEndpoints } from \"../../../shared\"\n\nconst { args, inputs, outputs } = forUnit(databases.existingEtcd)\n\nexport default outputs({\n etcd: {\n endpoints: parseEndpoints(args.endpoints, inputs.endpoints, 4),\n },\n})\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { parseEndpoints } from '../../../chunk-
|
|
1
|
+
import { parseEndpoints } from '../../../chunk-X5BK6JSN.js';
|
|
2
2
|
import { databases } from '@highstate/library';
|
|
3
3
|
import { forUnit } from '@highstate/pulumi';
|
|
4
4
|
|
|
5
5
|
var { args, secrets, inputs, outputs } = forUnit(databases.existingMariadb);
|
|
6
6
|
var existing_mariadb_default = outputs({
|
|
7
7
|
mariadb: {
|
|
8
|
-
endpoints: parseEndpoints(args.endpoints, inputs.endpoints),
|
|
8
|
+
endpoints: parseEndpoints(args.endpoints, inputs.endpoints, 4),
|
|
9
9
|
username: args.username,
|
|
10
10
|
password: secrets.password,
|
|
11
11
|
database: args.database
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/units/databases/existing-mariadb/index.ts"],"names":[],"mappings":";;;;AAIA,IAAM,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,UAAU,eAAe,CAAA;AAE5E,IAAO,2BAAQ,OAAA,CAAQ;AAAA,EACrB,OAAA,EAAS;AAAA,IACP,
|
|
1
|
+
{"version":3,"sources":["../../../../src/units/databases/existing-mariadb/index.ts"],"names":[],"mappings":";;;;AAIA,IAAM,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,UAAU,eAAe,CAAA;AAE5E,IAAO,2BAAQ,OAAA,CAAQ;AAAA,EACrB,OAAA,EAAS;AAAA,IACP,WAAW,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,WAAW,CAAC,CAAA;AAAA,IAC7D,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,UAAU,IAAA,CAAK;AAAA;AAEnB,CAAC","file":"index.js","sourcesContent":["import { databases } from \"@highstate/library\"\nimport { forUnit } from \"@highstate/pulumi\"\nimport { parseEndpoints } from \"../../../shared\"\n\nconst { args, secrets, inputs, outputs } = forUnit(databases.existingMariadb)\n\nexport default outputs({\n mariadb: {\n endpoints: parseEndpoints(args.endpoints, inputs.endpoints, 4),\n username: args.username,\n password: secrets.password,\n database: args.database,\n },\n})\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { parseEndpoints } from '../../../chunk-
|
|
1
|
+
import { parseEndpoints } from '../../../chunk-X5BK6JSN.js';
|
|
2
2
|
import { databases } from '@highstate/library';
|
|
3
3
|
import { forUnit } from '@highstate/pulumi';
|
|
4
4
|
|
|
5
5
|
var { args, secrets, inputs, outputs } = forUnit(databases.existingMongodb);
|
|
6
6
|
var existing_mongodb_default = outputs({
|
|
7
7
|
mongodb: {
|
|
8
|
-
endpoints: parseEndpoints(args.endpoints, inputs.endpoints),
|
|
8
|
+
endpoints: parseEndpoints(args.endpoints, inputs.endpoints, 4),
|
|
9
9
|
username: args.username,
|
|
10
10
|
password: secrets.password,
|
|
11
11
|
database: args.database
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/units/databases/existing-mongodb/index.ts"],"names":[],"mappings":";;;;AAIA,IAAM,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,UAAU,eAAe,CAAA;AAE5E,IAAO,2BAAQ,OAAA,CAAQ;AAAA,EACrB,OAAA,EAAS;AAAA,IACP,
|
|
1
|
+
{"version":3,"sources":["../../../../src/units/databases/existing-mongodb/index.ts"],"names":[],"mappings":";;;;AAIA,IAAM,EAAE,MAAM,OAAA,EAAS,MAAA,EAAQ,SAAQ,GAAI,OAAA,CAAQ,UAAU,eAAe,CAAA;AAE5E,IAAO,2BAAQ,OAAA,CAAQ;AAAA,EACrB,OAAA,EAAS;AAAA,IACP,WAAW,cAAA,CAAe,IAAA,CAAK,SAAA,EAAW,MAAA,CAAO,WAAW,CAAC,CAAA;AAAA,IAC7D,UAAU,IAAA,CAAK,QAAA;AAAA,IACf,UAAU,OAAA,CAAQ,QAAA;AAAA,IAClB,UAAU,IAAA,CAAK;AAAA;AAEnB,CAAC","file":"index.js","sourcesContent":["import { databases } from \"@highstate/library\"\nimport { forUnit } from \"@highstate/pulumi\"\nimport { parseEndpoints } from \"../../../shared\"\n\nconst { args, secrets, inputs, outputs } = forUnit(databases.existingMongodb)\n\nexport default outputs({\n mongodb: {\n endpoints: parseEndpoints(args.endpoints, inputs.endpoints, 4),\n username: args.username,\n password: secrets.password,\n database: args.database,\n },\n})\n"]}
|
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
import { parseEndpoints } from '../../../chunk-
|
|
1
|
+
import { parseEndpoints } from '../../../chunk-X5BK6JSN.js';
|
|
2
2
|
import { databases } from '@highstate/library';
|
|
3
3
|
import { forUnit } from '@highstate/pulumi';
|
|
4
4
|
|
|
5
5
|
var { args, secrets, inputs, outputs } = forUnit(databases.existingPostgresql);
|
|
6
6
|
var existing_postgresql_default = outputs({
|
|
7
7
|
postgresql: {
|
|
8
|
-
endpoints: parseEndpoints(args.endpoints, inputs.endpoints),
|
|
8
|
+
endpoints: parseEndpoints(args.endpoints, inputs.endpoints, 4),
|
|
9
9
|
username: args.username,
|
|
10
10
|
password: secrets.password,
|
|
11
11
|
database: args.database
|