FROM node:18-alpine AS base
RUN apk add --no-cache tini
ARG PNPM_VERSION=8.4.0
RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store \
    npm i --global --no-update-notifier --no-fund pnpm@${PNPM_VERSION}
USER node
WORKDIR /home/node/monorepo

FROM base AS dev
ARG PACKAGE_PATH
ENV CI=true
COPY --chown=node:node ./meta .
RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store \
    pnpm install --workspace-root --filter "{${PACKAGE_PATH}}..."
# Build dependencies separately, because they often change less often than the package itself
COPY --chown=node:node ./deps .
RUN pnpm --if-present --filter "{${PACKAGE_PATH}}^..." build
# Test and build package
COPY --chown=node:node ./pkg .
RUN pnpm --if-present --filter "{${PACKAGE_PATH}}" test
RUN NODE_ENV=production pnpm --filter "{${PACKAGE_PATH}}" build

FROM dev AS assets
RUN rm -rf node_modules && pnpm recursive exec -- rm -rf ./src ./node_modules

FROM base AS prod
ARG PACKAGE_PATH
ENV CI=true
COPY --chown=node:node ./meta .
RUN --mount=type=cache,id=pnpm-store,target=/root/.pnpm-store \
    pnpm install --prod --filter "{${PACKAGE_PATH}}..."
COPY --from=assets /home/node/monorepo .

WORKDIR /home/node/monorepo/${PACKAGE_PATH}
EXPOSE 3000
ENV NODE_ENV=production
ENV NODE_OPTIONS=--max-old-space-size=100
ENTRYPOINT ["/sbin/tini", "--"]
CMD ["node", "./dist/index.mjs"]
