diff --git a/Cargo.lock b/Cargo.lock index 9a1d825..0e46fa7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -26,6 +26,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" +[[package]] +name = "modify-next-config" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "spinners", + "thiserror", + "walkdir", +] + [[package]] name = "modify-saleor-app" version = "0.1.0" diff --git a/Cargo.toml b/Cargo.toml index 63bc97b..80afeeb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,3 +1,3 @@ [workspace] -members = ["modify-saleor-app", "modify-turbo-json"] +members = ["modify-saleor-app", "modify-turbo-json", "modify-next-config"] resolver = "2" diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index a50ce11..0000000 --- a/Dockerfile +++ /dev/null @@ -1,27 +0,0 @@ -FROM node:18-alpine as base -RUN apk add --no-cache g++ make py3-pip libc6-compat -WORKDIR /app -COPY package*.json ./ - -FROM base as builder -WORKDIR /app -COPY . . -RUN npm i -g pnpm &&\ - pnpm i &&\ - pnpm run build - - -FROM base as production -WORKDIR /app - -ENV NODE_ENV=production -RUN addgroup -g 1001 -S nodejs &&\ - adduser -S nextjs -u 1001 -USER nextjs - -COPY --from=builder --chown=nextjs:nodejs /app/.next ./.next -# COPY --from=builder /app/node_modules ./node_modules -COPY --from=builder /app/package.json ./package.json -COPY --from=builder /app/public ./public - -CMD npm start diff --git a/apps.Dockerfile b/apps.Dockerfile new file mode 100644 index 0000000..8c28539 --- /dev/null +++ b/apps.Dockerfile @@ -0,0 +1,60 @@ +FROM node:18-alpine AS base + +FROM base AS builder +RUN apk add --no-cache libc6-compat +RUN apk update +# Set working directory +WORKDIR /app +RUN npm i -g turbo pnpm +COPY . . + +ARG TARGET_APP +# Generate a partial monorepo with a pruned lockfile for a target workspace. +RUN turbo prune "app-$TARGET_APP" --docker +# Assuming "TARGET_APP" is the name entered in the project's package.json: { name: "TARGET_APP" } + +# Add lockfile and package.json's of isolated subworkspace +FROM base AS installer + +ARG TARGET_APP +RUN apk add --no-cache libc6-compat +RUN apk update +WORKDIR /app + +# First install the dependencies (as they change less often) +COPY .gitignore .gitignore +COPY --from=builder /app/out/json/ . +RUN npm i -g turbo pnpm +RUN pnpm i + +# Build the project +COPY --from=builder /app/out/full/ . +RUN turbo run build --filter="app-$TARGET_APP"... + + +FROM base AS runner + +ARG TARGET_APP +WORKDIR /app + +# Don't run production as root +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs +USER nextjs + +COPY --from=installer /app/apps/$TARGET_APP/next.config.js . +COPY --from=installer /app/apps/$TARGET_APP/package.json . + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=installer --chown=nextjs:nodejs /app/apps/$TARGET_APP/.next/standalone ./ +COPY --from=installer --chown=nextjs:nodejs /app/apps/$TARGET_APP/.next/static ./apps/$TARGET_APP/.next/static +COPY --from=installer --chown=nextjs:nodejs /app/apps/$TARGET_APP/public ./apps/$TARGET_APP/public +COPY --from=installer --chown=nextjs:nodejs /app/node_modules ./node_modules +# COPY --from=installer --chown=nextjs:nodejs /app/node_modules/next/dist/server/future/route-modules ./node_modules/next/dist/server/future/route-modules +# COPY --from=installer --chown=nextjs:nodejs /app/node_modules/next/dist/compiled/next-server ./node_modules/next/dist/compiled/next-server +# COPY --from=installer --chown=nextjs:nodejs /app/node_modules/next/dist/compiled/next-server ./node_modules/next/dist/compiled/next-server +# COPY --from=installer --chown=nextjs:nodejs /app/node_modules/react/jsx-runtime ./node_modules/react/jsx-runtime + +WORKDIR /app/apps/$TARGET_APP +CMD node server.js diff --git a/changes.sh b/changes.sh index d7cf0e4..67c4994 100755 --- a/changes.sh +++ b/changes.sh @@ -41,6 +41,9 @@ redis_apl_target_paths=( "saleor-app-payment-klarna/src" "saleor-app-payment-stripe/src" ) +echo "copying Dockerfiles..." +cp -f ./apps.Dockerfile ./all_apps/apps/ +cp -f ./abandoned-cart.Dockerfile ./all_apps/apps/ echo "copying redis_apls..." for i in ${redis_apl_target_paths[*]}; do @@ -51,6 +54,9 @@ done find ./all_apps/apps -name "saleor-app.ts" -exec cargo run --package modify-saleor-app -- {} \; echo "pached all_apps/apps/**/saleor-app.ts" +find ./all_apps/apps -name "next.config.js" -exec cargo run --package modify-saleor-app -- {} \; +echo "pached all_apps/apps/**/saleor-app.ts" + find ./all_apps/saleor-app-abandoned-checkouts -name "saleor-app.ts" -exec cargo run --package modify-saleor-app -- {} \; echo "pached all_apps/saleor-app-abandoned-checkouts/**/saleor-app.ts" diff --git a/changes/snippets/apps-next.config.js b/changes/snippets/apps-next.config.js new file mode 100644 index 0000000..fb0ee1f --- /dev/null +++ b/changes/snippets/apps-next.config.js @@ -0,0 +1,4 @@ + output: "standalone", + experimental: { + outputFileTracingRoot: path.join(process.cwd(), "../../"), + }, diff --git a/changes/snippets/import-path-app-next.config.js b/changes/snippets/import-path-app-next.config.js new file mode 100644 index 0000000..71674eb --- /dev/null +++ b/changes/snippets/import-path-app-next.config.js @@ -0,0 +1 @@ +const path = require("path"); diff --git a/modify-next-config/Cargo.lock b/modify-next-config/Cargo.lock new file mode 100644 index 0000000..9837ec7 --- /dev/null +++ b/modify-next-config/Cargo.lock @@ -0,0 +1,230 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "maplit" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" + +[[package]] +name = "proc-macro2" +version = "1.0.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56dea16b0a29e94408b9aa5e2940a4eedbd128a1ba20e8f7ae60fd3d465af0e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rustversion" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80af6f9131f277a45a3fba6ce8e2258037bb0477a67e610d3c1fe046ab31de47" + +[[package]] +name = "ryu" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" + +[[package]] +name = "saleor-dockerize-all-apps" +version = "0.1.0" +dependencies = [ + "serde", + "serde_json", + "spinners", + "thiserror", + "walkdir", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "serde" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9846a40c979031340571da2545a4e5b7c4163bdae79b301d5f86d03979451fcc" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.198" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e88edab869b01783ba905e7d0153f9fc1a6505a96e4ad3018011eedb838566d9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.59", +] + +[[package]] +name = "serde_json" +version = "1.0.116" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "spinners" +version = "4.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0ef947f358b9c238923f764c72a4a9d42f2d637c46e059dbd319d6e7cfb4f82" +dependencies = [ + "lazy_static", + "maplit", + "strum", +] + +[[package]] +name = "strum" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063e6045c0e62079840579a7e47a355ae92f60eb74daaf156fb1e84ba164e63f" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.24.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e385be0d24f186b4ce2f9982191e7101bb737312ad61c1f2f984f34bcf85d59" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 1.0.109", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.59" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a6531ffc7b071655e4ce2e04bd464c4830bb585a61cabb96cf808f05172615a" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "thiserror" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.59", +] + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/modify-next-config/Cargo.toml b/modify-next-config/Cargo.toml new file mode 100644 index 0000000..e452733 --- /dev/null +++ b/modify-next-config/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "modify-next-config" +version = "0.1.0" +edition = "2021" + +[dependencies] +# owo-colors = "4.0.0" +serde = { version = "1.0.198", features = ["derive"] } +serde_json = "1.0.116" +spinners = "4.1.1" +thiserror = "1.0.58" +walkdir = "2.5.0" diff --git a/modify-next-config/src/main.rs b/modify-next-config/src/main.rs new file mode 100644 index 0000000..23b457f --- /dev/null +++ b/modify-next-config/src/main.rs @@ -0,0 +1,30 @@ +use std::{ + fs::{self, read_to_string}, + io, +}; + +fn main() -> Result<(), io::Error> { + let args: Vec<_> = std::env::args().collect(); + if args.len() < 2 { + std::process::exit(1) + } + + let mut file = read_to_string(&args[1])?; + + let mut output = fs::read_to_string("../../changes/snippets/import-path-app-next.config.js")?; + let mut is_done = false; + for line in file.as_mut().lines() { + output.push_str(&(line.to_owned() + "\n")); + if is_done { + continue; + }; + if line.contains("const nextConfig") { + let case = fs::read_to_string("./changes/snippets/apps-next.config.js")?; + output.push_str(&case); + is_done = true; + } + } + fs::write(&args[1], output)?; + + Ok(()) +} diff --git a/other.Dockerfile b/other.Dockerfile new file mode 100644 index 0000000..22a04a4 --- /dev/null +++ b/other.Dockerfile @@ -0,0 +1,67 @@ +FROM node:18-alpine AS base + +# Install dependencies only when needed +FROM base AS deps +# Check https://github.com/nodejs/docker-node/tree/b4117f9333da4138b03a546ec926ef50a31506c3#nodealpine to understand why libc6-compat might be needed. +RUN apk add --no-cache libc6-compat +WORKDIR /app + +# Install dependencies based on the preferred package manager +COPY package.json yarn.lock* package-lock.json* pnpm-lock.yaml* ./ +RUN \ + if [ -f yarn.lock ]; then yarn --frozen-lockfile; \ + elif [ -f package-lock.json ]; then npm ci; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm i --frozen-lockfile; \ + else echo "Lockfile not found." && exit 1; \ + fi + + +# Rebuild the source code only when needed +FROM base AS builder +WORKDIR /app +COPY --from=deps /app/node_modules ./node_modules +COPY . . + +# Next.js collects completely anonymous telemetry data about general usage. +# Learn more here: https://nextjs.org/telemetry +# Uncomment the following line in case you want to disable telemetry during the build. +# ENV NEXT_TELEMETRY_DISABLED 1 + +RUN \ + if [ -f yarn.lock ]; then yarn run build; \ + elif [ -f package-lock.json ]; then npm run build; \ + elif [ -f pnpm-lock.yaml ]; then corepack enable pnpm && pnpm run build; \ + else echo "Lockfile not found." && exit 1; \ + fi + +# Production image, copy all the files and run next +FROM base AS runner +WORKDIR /app + +ENV NODE_ENV production +# Uncomment the following line in case you want to disable telemetry during runtime. +ENV NEXT_TELEMETRY_DISABLED 1 + +RUN addgroup --system --gid 1001 nodejs +RUN adduser --system --uid 1001 nextjs + +COPY --from=builder /app/public ./public + +# Set the correct permission for prerender cache +RUN mkdir .next +RUN chown nextjs:nodejs .next + +# Automatically leverage output traces to reduce image size +# https://nextjs.org/docs/advanced-features/output-file-tracing +COPY --from=builder --chown=nextjs:nodejs /app/.next/standalone ./ +COPY --from=builder --chown=nextjs:nodejs /app/.next/static ./.next/static + +USER nextjs + +EXPOSE 3000 + +ENV PORT 3000 + +# server.js is created by next build from the standalone output +# https://nextjs.org/docs/pages/api-reference/next-config-js/output +CMD HOSTNAME="0.0.0.0" node server.js