DodoApp: Add Deno 2.2.0 support

Change-Id: I3e683cda2dd18e9a3dce87b8eb1f65ea11dd5f14
diff --git a/apps/app-runner/Dockerfile.deno.2.2.0 b/apps/app-runner/Dockerfile.deno.2.2.0
new file mode 100644
index 0000000..bc2014e
--- /dev/null
+++ b/apps/app-runner/Dockerfile.deno.2.2.0
@@ -0,0 +1,5 @@
+FROM denoland/deno:alpine-2.2.0
+
+ARG TARGETARCH
+
+COPY app-runner_${TARGETARCH} /usr/bin/app-runner
diff --git a/apps/app-runner/Makefile b/apps/app-runner/Makefile
index 72fcb79..356ce28 100644
--- a/apps/app-runner/Makefile
+++ b/apps/app-runner/Makefile
@@ -8,6 +8,7 @@
 manifest_dest_hugo_latest=docker://docker.io/$(repo_name)/app-runner:hugo-latest
 manifest_dest_php_8_2_apache=docker://docker.io/$(repo_name)/app-runner:php-8.2-apache
 manifest_dest_nextjs_deno_2_0_0=docker://docker.io/$(repo_name)/app-runner:nextjs-deno-2.0.0
+manifest_dest_deno_2_2_0=docker://docker.io/$(repo_name)/app-runner:deno-2.2.0
 manifest_dest_nodejs_23_1_0=docker://docker.io/$(repo_name)/app-runner:nodejs-23.1.0
 endif
 
@@ -132,5 +133,21 @@
 	$(podman) manifest create $(repo_name)/app-runner:nodejs-23.1.0 $(repo_name)/app-runner:nodejs-23.1.0-arm64 $(repo_name)/app-runner:nodejs-23.1.0-amd64
 	$(podman) manifest push --purge $(repo_name)/app-runner:nodejs-23.1.0 $(manifest_dest_nodejs_23_1_0)
 
+# Deno
+
+push_deno_2_2_0_arm64: clean build_arm64
+	$(podman) build --platform linux/arm64 --tag=$(repo_name)/app-runner_deno-2.2.0-arm64 -f Dockerfile.deno.2.2.0 $(docker_flags) .
+	$(podman) push $(repo_name)/app-runner_deno-2.2.0-arm64
+
+push_deno_2_2_0_amd64: clean build_amd64
+	$(podman) build --platform linux/amd64 --tag=$(repo_name)/app-runner_deno-2.2.0-amd64 -f Dockerfile.deno.2.2.0 $(docker_flags) .
+	$(podman) push $(repo_name)/app-runner_deno-2.2.0-amd64
+
+push_deno_2_2_0: push_deno_2_2_0_arm64 push_deno_2_2_0_amd64
+	$(podman) manifest create $(repo_name)/app-runner_deno-2.2.0 $(repo_name)/app-runner_deno-2.2.0-arm64 $(repo_name)/app-runner_deno-2.2.0-amd64
+	$(podman) manifest push $(repo_name)/app-runner_deno-2.2.0 $(manifest_dest_deno_2_2_0)
+	$(podman) manifest rm $(repo_name)/app-runner_deno-2.2.0
+
+
 # all
-push: push_golang_1_22_0 push_golang_1_20_0 push_hugo push_php_8_2_apache push_nextjs_deno_2_0_0 push_nodejs_23_1_0
+push: push_golang_1_22_0 push_golang_1_20_0 push_hugo push_php_8_2_apache push_nextjs_deno_2_0_0 push_nodejs_23_1_0 push_deno_2_0_0
diff --git a/core/installer/app_configs/dodo_app.cue b/core/installer/app_configs/dodo_app.cue
index 28eedd1..5b538a8 100644
--- a/core/installer/app_configs/dodo_app.cue
+++ b/core/installer/app_configs/dodo_app.cue
@@ -326,6 +326,54 @@
 
 #NextjsApp: #NextjsDeno2AppTmpl
 
+// Deno
+
+#Deno_2_2_0_AppTmpl: #AppTmpl & {
+	type:    "deno:2.2.0"
+	apiPort: 2000
+	ports: [...#Port] | *[{
+		name:  "web"
+		value: 3000
+	}]
+	rootDir: _appDir
+	preBuildCommands: [...#Command] | *[]
+
+	lastCmdEnv: [...string]
+
+	runConfiguration: [{
+		bin: "/usr/bin/deno"
+		args: ["install"]
+	},
+		for c in preBuildCommands {
+			{
+				bin:  c.bin
+				args: c.args
+				env: list.Concat([lastCmdEnv, c.env])
+			}
+		},
+		{
+			bin: "/usr/bin/deno"
+			args: ["task", "build"]
+			env: lastCmdEnv
+		}, {
+			bin: "/usr/bin/deno"
+			args: ["task", "start"]
+			env: lastCmdEnv
+		}]
+
+	vm: {
+		env: [
+			"export PATH=$PATH:/usr/local/deno/bin",
+		]
+		cloudInit: runCmd: [
+			["sh", "-c", "apt-get install -y npm unzip"],
+			["sh", "-c", "curl -fsSL https://deno.land/install.sh | DENO_INSTALL=/usr/local/deno sh -s -- -y --no-modify-path"],
+		]
+	}
+}
+
+#DenoApp: #Deno_2_2_0_AppTmpl
+
 // NodeJS
 
 #NodeJSAppTmpl: #AppTmpl & {
@@ -378,7 +426,7 @@
 
 #NodeJSApp: #NodeJS2310
 
-#App: #GoApp | #HugoApp | #PHPApp | #NextjsApp | #NodeJSApp
+#App: #GoApp | #HugoApp | #PHPApp | #NextjsApp | #NodeJSApp | #DenoApp
 
 service: [...#App]