1{
2 lib,
3 stdenv,
4 buildGoModule,
5 faketty,
6 fetchFromGitHub,
7 fetchYarnDeps,
8 fixup-yarn-lock,
9 go,
10 makeWrapper,
11 nodejs,
12 nix-update-script,
13 patchelf,
14 removeReferencesTo,
15 testers,
16 yarn,
17}:
18
19stdenv.mkDerivation (finalAttrs: {
20 pname = "cdktf-cli";
21 version = "0.21.0";
22
23 src = fetchFromGitHub {
24 owner = "hashicorp";
25 repo = "terraform-cdk";
26 tag = "v${finalAttrs.version}";
27 hash = "sha256-iqy8j1bqwjSRBOj8kjFtAq9dLiv6dDbJsiFGQUhGW7k=";
28 };
29
30 offlineCache = fetchYarnDeps {
31 yarnLock = "${finalAttrs.src}/yarn.lock";
32 hash = "sha256-qGjzy/+u8Ui9aHK0sX3MfYbkj5Cqab4RlhOgrwbEmGs=";
33 };
34
35 hcl2json-go-modules =
36 (buildGoModule {
37 pname = "cdktf-hcl2json-go-modules";
38 inherit (finalAttrs) version src;
39 modRoot = "packages/@cdktf/hcl2json";
40 vendorHash = "sha256-OiKPq0CHkOxJaFzgsaNJ02tasvHtHWylmaPRPayJob4=";
41 proxyVendor = true;
42 doCheck = false;
43 env.GOWORK = "off";
44 }).goModules;
45
46 hcltools-go-modules =
47 (buildGoModule {
48 pname = "cdktf-hcltools-go-modules";
49 inherit (finalAttrs) version src;
50 modRoot = "packages/@cdktf/hcl-tools";
51 vendorHash = "sha256-orGxkYEQVtTKvXb7/FD/CLwqSINgBQFTF5arbR0xAvE=";
52 proxyVendor = true;
53 doCheck = false;
54 env.GOWORK = "off";
55 }).goModules;
56
57 strictDeps = true;
58 disallowedReferences = [ go ];
59
60 nativeBuildInputs = [
61 faketty
62 fixup-yarn-lock
63 go
64 makeWrapper
65 nodejs
66 patchelf
67 removeReferencesTo
68 yarn
69 ];
70
71 postPatch = ''
72 # wasm_exec has moved to lib in newer versions of Go
73 substituteInPlace packages/@cdktf/hcl-tools/prebuild.sh \
74 --replace-fail "misc/wasm/wasm_exec.js" "lib/wasm/wasm_exec.js"
75 substituteInPlace packages/@cdktf/hcl2json/prebuild.sh \
76 --replace-fail "misc/wasm/wasm_exec.js" "lib/wasm/wasm_exec.js"
77 '';
78
79 preConfigure = ''
80 export GOCACHE=$TMPDIR/go-cache
81 export GOPATH=$TMPDIR/go
82 export GOPROXY=file://${finalAttrs.hcltools-go-modules},file://${finalAttrs.hcl2json-go-modules}
83 export GOSUMDB=off
84
85 # Stop the build from trying to write checkpoints to /var/empty/
86 export CHECKPOINT_DISABLE=1
87 '';
88
89 configurePhase = ''
90 runHook preConfigure
91
92 export HOME=$(mktemp -d)
93 yarn config --offline set yarn-offline-mirror $offlineCache
94 fixup-yarn-lock yarn.lock
95 yarn --offline --frozen-lockfile --ignore-platform --ignore-scripts --no-progress --non-interactive install
96 patchShebangs node_modules packages
97
98 runHook postConfigure
99 '';
100
101 buildPhase = ''
102 runHook preBuild
103
104 faketty yarn --offline build
105
106 runHook postBuild
107 '';
108
109 doCheck = true;
110 checkPhase = ''
111 runHook preCheck
112
113 # Skip tests that require terraform (unfree)
114 yarn --offline workspace cdktf-cli test -- \
115 --testPathIgnorePatterns \
116 "src/test/cmds/(convert|init).test.ts"
117
118 runHook postCheck
119 '';
120
121 installPhase = ''
122 runHook preInstall
123
124 yarn --offline --production install
125
126 mkdir -p "$out/lib/node_modules/cdktf-cli"
127 cp -rL node_modules packages/cdktf-cli/bundle packages/cdktf-cli/package.json "$out/lib/node_modules/cdktf-cli/"
128
129 makeWrapper "${lib.getExe nodejs}" "$out/bin/cdktf" \
130 --add-flags "$out/lib/node_modules/cdktf-cli/bundle/bin/cdktf.js"
131
132 runHook postInstall
133 '';
134
135 postInstall = ''
136 # Go isn't needed at runtime, so remove these to decrease the closure size
137 remove-references-to -t ${go} \
138 "$out/lib/node_modules/cdktf-cli/node_modules/@cdktf/hcl-tools/main.wasm" \
139 "$out/lib/node_modules/cdktf-cli/node_modules/@cdktf/hcl2json/main.wasm"
140 '';
141
142 passthru = {
143 tests.version = testers.testVersion {
144 package = finalAttrs.finalPackage;
145 };
146 updateScript = nix-update-script { };
147 };
148
149 meta = {
150 description = "CDK for Terraform CLI";
151 homepage = "https://github.com/hashicorp/terraform-cdk";
152 changelog = "https://github.com/hashicorp/terraform-cdk/releases/tag/${finalAttrs.src.tag}";
153 license = lib.licenses.mpl20;
154 mainProgram = "cdktf";
155 maintainers = with lib.maintainers; [ deejayem ];
156 platforms = lib.platforms.unix;
157 };
158})