package react
import (
"strings"
"dagger.io/dagger"
"dagger.io/alpine"
"dagger.io/os"
)
// A ReactJS application
// FIXME: move this to a 'yarn' package for clarity
#App: {
// Application source code
source: dagger.#Artifact
// Environment variables
env: [string]: string
// Write the contents of `environment` to this file,
// in the "envfile" format.
writeEnvFile: string | *""
// Yarn-specific settings
yarn: {
// Read build output from this directory
// (path must be relative to working directory).
buildDir: string | *"build"
// Run this yarn script
script: string | *"build"
}
build: os.#Dir & {
from: ctr
path: "/build"
ctr: os.#Container & {
image: alpine.#Image & {
package: {
bash: "=~5.1"
yarn: "=~1.22"
shell: path: "/bin/bash"
command: """
[ -n "$ENVFILE_NAME" ] && echo "$ENVFILE" > "$ENVFILE_NAME"
yarn install --production false
yarn run "$YARN_BUILD_SCRIPT"
mv "$YARN_BUILD_DIRECTORY" /build
"""
"env": env & {
YARN_BUILD_SCRIPT: yarn.script
YARN_CACHE_FOLDER: "/cache/yarn"
YARN_BUILD_DIRECTORY: yarn.buildDir
if writeEnvFile != "" {
ENVFILE_NAME: writeEnvFile
ENVFILE: strings.Join([ for k, v in env {"\(k)=\(v)"}], "\n")
dir: "/src"
mount: "/src": from: source
cache: "/cache/yarn": true