diff --git a/Makefile b/Makefile
new file mode 100644
index 0000000..94a5f36
--- /dev/null
+++ b/Makefile
@@ -0,0 +1,7 @@
+include mk/common.mk
+include mk/resolver-go.mk
+include mk/closure-api.mk
+
+build: build-resolver build-closure
+
+.PHONY: build
diff --git a/closure-compilerd/Dockerfile b/closure-api/Dockerfile
similarity index 57%
rename from closure-compilerd/Dockerfile
rename to closure-api/Dockerfile
index c3d1e9a..146aff4 100644
--- a/closure-compilerd/Dockerfile
+++ b/closure-api/Dockerfile
@@ -2,29 +2,31 @@ FROM maven:3.9-eclipse-temurin-21 AS build
WORKDIR /src
+ARG JAVA_SRC_DIR
+ARG CLOSURE_NAME
+
# Copy pom first so Docker can cache dependencies.
-COPY pom.xml .
+COPY $JAVA_SRC_DIR/pom.xml .
RUN --mount=type=cache,target=/root/.m2 \
mvn -B -DskipTests dependency:go-offline
-COPY src ./src
+COPY $JAVA_SRC_DIR/src ./src
RUN --mount=type=cache,target=/root/.m2 \
mvn -B -DskipTests package
-
FROM eclipse-temurin:21-jre
WORKDIR /app
+ARG JAVA_SRC_DIR
+ARG CLOSURE_NAME
+
RUN useradd -r -u 10001 closure
-COPY --from=build /src/target/closure-compilerd-0.1.0.jar /app/closure-compilerd.jar
-
-# Optional: put your JS source tree/configs here if you want the container
-# to compile files from inside the image.
-COPY example ./example
+COPY --from=build /src/target/${CLOSURE_NAME}-0.1.0.jar /app/runtime.jar
+COPY $JAVA_SRC_DIR/example ./example
USER closure
@@ -34,4 +36,4 @@ ENV CLOSURED_WORKERS=2
EXPOSE 8080
-ENTRYPOINT ["java", "-Xms256m", "-Xmx2g", "-jar", "/app/closure-compilerd.jar"]
+ENTRYPOINT ["java", "-Xms256m", "-Xmx2g", "-jar", "/app/runtime.jar"]
diff --git a/closure-compilerd/README.md b/closure-api/README.md
similarity index 83%
rename from closure-compilerd/README.md
rename to closure-api/README.md
index 9609912..bc2a38b 100644
--- a/closure-compilerd/README.md
+++ b/closure-api/README.md
@@ -1,4 +1,4 @@
-# closure-compilerd-min
+# closure-api-min
Tiny Closure Compiler HTTP daemon using Java's built-in HTTP server.
@@ -14,7 +14,7 @@ mvn -DskipTests package
CLOSURED_ROOT=$PWD \
CLOSURED_PORT=8080 \
CLOSURED_WORKERS=2 \
-java -Xms256m -Xmx2g -jar target/closure-compilerd-0.1.0.jar
+java -Xms256m -Xmx2g -jar target/closure-api-0.1.0.jar
```
## Test
diff --git a/closure-compilerd/example/externs/browser.js b/closure-api/example/externs/browser.js
similarity index 100%
rename from closure-compilerd/example/externs/browser.js
rename to closure-api/example/externs/browser.js
diff --git a/closure-compilerd/example/js/hello.js b/closure-api/example/js/hello.js
similarity index 100%
rename from closure-compilerd/example/js/hello.js
rename to closure-api/example/js/hello.js
diff --git a/closure-compilerd/pom.xml b/closure-api/pom.xml
similarity index 97%
rename from closure-compilerd/pom.xml
rename to closure-api/pom.xml
index 5273d4f..f3c94da 100644
--- a/closure-compilerd/pom.xml
+++ b/closure-api/pom.xml
@@ -4,7 +4,7 @@
4.0.0
dev.tgckpg
- closure-compilerd
+ closure-api
0.1.0
diff --git a/closure-compilerd/src/main/java/dev/tgckpg/closured/Main.java b/closure-api/src/main/java/dev/tgckpg/closured/Main.java
similarity index 98%
rename from closure-compilerd/src/main/java/dev/tgckpg/closured/Main.java
rename to closure-api/src/main/java/dev/tgckpg/closured/Main.java
index 9be87ce..ab20fb7 100644
--- a/closure-compilerd/src/main/java/dev/tgckpg/closured/Main.java
+++ b/closure-api/src/main/java/dev/tgckpg/closured/Main.java
@@ -41,7 +41,7 @@ public final class Main {
server.createContext("/compile", Main::compile);
server.start();
- System.err.printf("closure-compilerd listening on http://0.0.0.0:%d root=%s workers=%d%n", PORT, ROOT, WORKERS);
+ System.err.printf("closure-api listening on http://0.0.0.0:%d root=%s workers=%d%n", PORT, ROOT, WORKERS);
}
private static void health(HttpExchange ex) throws IOException {
diff --git a/internal/generated/buildinfo_gen.go b/internal/generated/buildinfo_gen.go
index a798cc7..86c1428 100644
--- a/internal/generated/buildinfo_gen.go
+++ b/internal/generated/buildinfo_gen.go
@@ -2,5 +2,5 @@ package generated
const (
IMAGE_TAG = "dev"
- Timestamp = "20260610.220306"
+ Timestamp = "20260611.005458"
)
diff --git a/mk/botanres-go.mk b/mk/botanres-go.mk
deleted file mode 100644
index f8cde4f..0000000
--- a/mk/botanres-go.mk
+++ /dev/null
@@ -1,54 +0,0 @@
-IMAGE_NAME ?= botanjs
-IMAGE_TAG ?= dev
-
-JS_SRC_DIR ?= ./botanjs/src
-GO_SRC_DIR ?= ./botanres-go
-BUILDX_BUILDER ?= container-builder
-BUILDINFO_FILE := internal/generated/buildinfo_gen.go
-
-ensure-buildx:
- @if ! docker buildx inspect $(BUILDX_BUILDER) >/dev/null 2>&1; then \
- echo "Creating buildx builder $(BUILDX_BUILDER)..."; \
- docker buildx create \
- --name $(BUILDX_BUILDER) \
- --driver docker-container \
- --driver-opt network=host \
- --bootstrap --use; \
- else \
- echo "Using existing buildx builder $(BUILDX_BUILDER)"; \
- docker buildx use $(BUILDX_BUILDER); \
- fi
-
-.buildinfo:
- @mkdir -p $(dir $(BUILDINFO_FILE))
- @printf '%s\n' \
- 'package generated' \
- '' \
- 'const (' \
- ' IMAGE_TAG = "$(IMAGE_TAG)"' \
- ' Timestamp = "'$$(TZ=UTC date +%Y%m%d.%H%M%S)'"' \
- ')' \
- > $(BUILDINFO_FILE)
-
-gen:
- docker build \
- -f $(GO_SRC_DIR)/dockerfiles/gen.Dockerfile \
- --output type=local,dest=$(GO_SRC_DIR)/internal/generated .
-
-build: .buildinfo ensure-buildx gen
- docker build \
- -f $(GO_SRC_DIR)/dockerfiles/api.Dockerfile \
- --load \
- -t $(IMAGE_NAME):$(IMAGE_TAG) .
-
-push: .buildinfo ensure-buildx gen
- docker buildx build \
- --platform linux/amd64,linux/arm64 \
- -f $(GO_SRC_DIR)/dockerfiles/api.Dockerfile \
- -t $(IMAGE_NAME):$(IMAGE_TAG) \
- --push .
-
-inspect:
- docker buildx imagetools inspect $(IMAGE_NAME):$(IMAGE_TAG)
-
-.PHONY: push build .buildinfo gen
diff --git a/mk/closure-api.mk b/mk/closure-api.mk
new file mode 100644
index 0000000..85a6643
--- /dev/null
+++ b/mk/closure-api.mk
@@ -0,0 +1,27 @@
+CLOSURE_IMAGE_NAME ?= closure-api
+CLOSURE_IMAGE_TAG ?= dev
+
+CLOSURE_SRC_DIR = ./closure-api
+CLOSURE_NAME = closure-api
+
+build-closure:
+ docker build \
+ -f $(CLOSURE_SRC_DIR)/Dockerfile \
+ --build-arg JAVA_SRC_DIR=$(CLOSURE_SRC_DIR) \
+ --build-arg CLOSURE_NAME=$(CLOSURE_NAME) \
+ --load \
+ -t $(CLOSURE_IMAGE_NAME):$(CLOSURE_IMAGE_TAG) .
+
+push-closure: ensure-buildx
+ docker buildx build \
+ --platform linux/amd64,linux/arm64 \
+ -f $(CLOSURE_SRC_DIR)/Dockerfile \
+ --build-arg JAVA_SRC_DIR=$(CLOSURE_SRC_DIR) \
+ --build-arg CLOSURE_NAME=$(CLOSURE_NAME) \
+ -t $(CLOSURE_IMAGE_NAME):$(CLOSURE_IMAGE_TAG) \
+ --push .
+
+inspect-closure:
+ docker buildx imagetools inspect $(CLOSURE_IMAGE_NAME):$(CLOSURE_IMAGE_TAG)
+
+.PHONY: build-closure push-closure inspect-closure
diff --git a/mk/common.mk b/mk/common.mk
new file mode 100644
index 0000000..e6fa0ae
--- /dev/null
+++ b/mk/common.mk
@@ -0,0 +1,18 @@
+JS_SRC_DIR ?= ./botanjs/src
+
+BUILDX_BUILDER ?= container-builder
+
+ensure-buildx:
+ @if ! docker buildx inspect $(BUILDX_BUILDER) >/dev/null 2>&1; then \
+ echo "Creating buildx builder $(BUILDX_BUILDER)..."; \
+ docker buildx create \
+ --name $(BUILDX_BUILDER) \
+ --driver docker-container \
+ --driver-opt network=host \
+ --bootstrap --use; \
+ else \
+ echo "Using existing buildx builder $(BUILDX_BUILDER)"; \
+ docker buildx use $(BUILDX_BUILDER); \
+ fi
+
+.PHONY: ensure-buildx
diff --git a/mk/resolver-go.mk b/mk/resolver-go.mk
new file mode 100644
index 0000000..2886d5e
--- /dev/null
+++ b/mk/resolver-go.mk
@@ -0,0 +1,40 @@
+RESOLVER_IMAGE_NAME ?= botanjs
+RESOLVER_IMAGE_TAG ?= dev
+
+GO_SRC_DIR ?= ./resolver-go
+
+BUILDINFO_FILE := internal/generated/buildinfo_gen.go
+
+.buildinfo:
+ @mkdir -p $(dir $(BUILDINFO_FILE))
+ @printf '%s\n' \
+ 'package generated' \
+ '' \
+ 'const (' \
+ ' IMAGE_TAG = "$(RESOLVER_IMAGE_TAG)"' \
+ ' Timestamp = "'$$(TZ=UTC date +%Y%m%d.%H%M%S)'"' \
+ ')' \
+ > $(BUILDINFO_FILE)
+
+resolver-gen:
+ docker build \
+ -f $(GO_SRC_DIR)/dockerfiles/gen.Dockerfile \
+ --output type=local,dest=$(GO_SRC_DIR)/internal/generated .
+
+build-resolver: .buildinfo ensure-buildx resolver-gen
+ docker build \
+ -f $(GO_SRC_DIR)/dockerfiles/api.Dockerfile \
+ --load \
+ -t $(RESOLVER_IMAGE_NAME):$(RESOLVER_IMAGE_TAG) .
+
+push-resolver: .buildinfo ensure-buildx resolver-gen
+ docker buildx build \
+ --platform linux/amd64,linux/arm64 \
+ -f $(GO_SRC_DIR)/dockerfiles/api.Dockerfile \
+ -t $(RESOLVER_IMAGE_NAME):$(RESOLVER_IMAGE_TAG) \
+ --push .
+
+inspect-resolver:
+ docker buildx imagetools inspect $(RESOLVER_IMAGE_NAME):$(RESOLVER_IMAGE_TAG)
+
+.PHONY: push-resolver build-resolver .buildinfo resolver-gen
diff --git a/botanres-go/README.md b/resolver-go/README.md
similarity index 100%
rename from botanres-go/README.md
rename to resolver-go/README.md
diff --git a/botanres-go/cmd/botan-api/main.go b/resolver-go/cmd/botan-api/main.go
similarity index 98%
rename from botanres-go/cmd/botan-api/main.go
rename to resolver-go/cmd/botan-api/main.go
index 2679453..28068cd 100644
--- a/botanres-go/cmd/botan-api/main.go
+++ b/resolver-go/cmd/botan-api/main.go
@@ -61,6 +61,8 @@ func (h handler) index(w http.ResponseWriter, req *http.Request) {
return
}
+ log.Println(res.JSFiles)
+
// Compatibility flags:
// rjs/rcss/ojs/ocss => content
// hjs/hcss => hash filename only
diff --git a/botanres-go/cmd/botan-gen/main.go b/resolver-go/cmd/botan-gen/main.go
similarity index 100%
rename from botanres-go/cmd/botan-gen/main.go
rename to resolver-go/cmd/botan-gen/main.go
diff --git a/botanres-go/dockerfiles/api.Dockerfile b/resolver-go/dockerfiles/api.Dockerfile
similarity index 83%
rename from botanres-go/dockerfiles/api.Dockerfile
rename to resolver-go/dockerfiles/api.Dockerfile
index 88e730a..23ebd7e 100644
--- a/botanres-go/dockerfiles/api.Dockerfile
+++ b/resolver-go/dockerfiles/api.Dockerfile
@@ -5,14 +5,14 @@ WORKDIR /workspace
ARG TARGETOS
ARG TARGETARCH
-COPY botanres-go/go.mod botanres-go/go.sum ./
+COPY resolver-go/go.mod resolver-go/go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod \
go mod download
COPY "botanjs/src" "./src"
-COPY "botanres-go/cmd" "./cmd"
-COPY "botanres-go/internal" "./internal"
+COPY "resolver-go/cmd" "./cmd"
+COPY "resolver-go/internal" "./internal"
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
diff --git a/botanres-go/dockerfiles/gen.Dockerfile b/resolver-go/dockerfiles/gen.Dockerfile
similarity index 76%
rename from botanres-go/dockerfiles/gen.Dockerfile
rename to resolver-go/dockerfiles/gen.Dockerfile
index 2f1ddd2..ddfcd3e 100644
--- a/botanres-go/dockerfiles/gen.Dockerfile
+++ b/resolver-go/dockerfiles/gen.Dockerfile
@@ -5,14 +5,14 @@ WORKDIR /workspace
ARG TARGETOS
ARG TARGETARCH
-COPY botanres-go/go.mod botanres-go/go.sum ./
+COPY resolver-go/go.mod resolver-go/go.sum ./
RUN --mount=type=cache,target=/go/pkg/mod \
go mod download
COPY "botanjs/src" "./src"
-COPY "botanres-go/cmd" "./cmd"
-COPY "botanres-go/internal" "./internal"
+COPY "resolver-go/cmd" "./cmd"
+COPY "resolver-go/internal" "./internal"
RUN go run ./cmd/botan-gen \
-src ./src \
diff --git a/botanres-go/go.mod b/resolver-go/go.mod
similarity index 100%
rename from botanres-go/go.mod
rename to resolver-go/go.mod
diff --git a/botanres-go/go.sum b/resolver-go/go.sum
similarity index 100%
rename from botanres-go/go.sum
rename to resolver-go/go.sum
diff --git a/botanres-go/internal/classmap/scan.go b/resolver-go/internal/classmap/scan.go
similarity index 100%
rename from botanres-go/internal/classmap/scan.go
rename to resolver-go/internal/classmap/scan.go
diff --git a/botanres-go/internal/classmap/types.go b/resolver-go/internal/classmap/types.go
similarity index 100%
rename from botanres-go/internal/classmap/types.go
rename to resolver-go/internal/classmap/types.go
diff --git a/botanres-go/internal/generated/buildinfo_gen.go b/resolver-go/internal/generated/buildinfo_gen.go
similarity index 100%
rename from botanres-go/internal/generated/buildinfo_gen.go
rename to resolver-go/internal/generated/buildinfo_gen.go
diff --git a/botanres-go/internal/generated/classmap_gen.go b/resolver-go/internal/generated/classmap_gen.go
similarity index 100%
rename from botanres-go/internal/generated/classmap_gen.go
rename to resolver-go/internal/generated/classmap_gen.go
diff --git a/botanres-go/internal/resolver/resolver.go b/resolver-go/internal/resolver/resolver.go
similarity index 100%
rename from botanres-go/internal/resolver/resolver.go
rename to resolver-go/internal/resolver/resolver.go