FROM node:20-alpine as builder

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories

RUN apk add --no-cache python3 make g++

RUN npm install -g turbo pnpm
RUN pnpm config set registry https://registry.npmjs.org

FROM builder as prebuilder
ARG PACKAGE_NAME
ARG PROJECT_NAME

WORKDIR /usr/app

COPY ./${PROJECT_NAME} .

RUN turbo prune --scope="${PACKAGE_NAME}" --docker

# Add lockfile and package.json's of isolated subworkspace
FROM builder AS resbuilder
ARG PACKAGE_NAME

WORKDIR /usr/app

COPY --from=prebuilder /usr/app/out/json/ .
COPY --from=prebuilder /usr/app/out/pnpm-lock.yaml ./pnpm-lock.yaml

RUN pnpm install

# Build the packages
COPY --from=prebuilder /usr/app/out/full/ .
COPY --from=prebuilder /usr/app/tsconfig.json ./tsconfig.json

RUN turbo run build --filter ${PACKAGE_NAME}


RUN pnpm prune --prod
RUN pnpm --filter ${PACKAGE_NAME} --prod deploy webapp

FROM node:20-alpine AS runner

ENV NODE_ENV=production

WORKDIR /usr/app

COPY --from=resbuilder /usr/app/webapp/package.json /usr/app/package.json
COPY --from=resbuilder /usr/app/webapp/dist/ /usr/app/dist/
COPY --from=resbuilder /usr/app/webapp/node_modules/ /usr/app/node_modules/
COPY .npmrc .env /usr/app/dist/

EXPOSE 8000

ENTRYPOINT ["node", "/usr/app/dist/node/index.js"]
