From 05d19b8b423c26df1db01f42a7ee196902b9b34d Mon Sep 17 00:00:00 2001 From: Oliver Eyton-Williams Date: Tue, 12 Sep 2023 22:45:25 +0200 Subject: [PATCH] feat: create docker images for new api (#51538) --- .../workflows/temporary-container-checks.yml | 17 +++ api/.gitignore | 2 +- api/package.json | 6 +- api/prisma/schema.prisma | 1 + api/tsconfig.build.json | 2 +- docker/new-api/Dockerfile | 59 ++++++++ pnpm-lock.yaml | 142 +++++++++++++----- sample.env | 3 +- 8 files changed, 187 insertions(+), 45 deletions(-) create mode 100644 docker/new-api/Dockerfile diff --git a/.github/workflows/temporary-container-checks.yml b/.github/workflows/temporary-container-checks.yml index ebcc4f4acc4..bdda98cb33b 100644 --- a/.github/workflows/temporary-container-checks.yml +++ b/.github/workflows/temporary-container-checks.yml @@ -88,6 +88,23 @@ jobs: # name: webpack-stats # path: client/public/stats.json + build-new-api: + name: Build New Api (Container) + runs-on: ubuntu-20.04 + strategy: + matrix: + node-version: [18.x] + + steps: + - name: Checkout Source Files + uses: actions/checkout@f43a0e5ff2bd294095638e18286ca9a3d1956744 # v3 + + - name: Create Image + run: | + docker build \ + -t fcc-new-api \ + -f docker/new-api/Dockerfile . + cypress-run: name: Test runs-on: ubuntu-20.04 diff --git a/api/.gitignore b/api/.gitignore index f7ece9f3e9a..849ddff3b7e 100644 --- a/api/.gitignore +++ b/api/.gitignore @@ -1 +1 @@ -dist/**/*.js +dist/ diff --git a/api/package.json b/api/package.json index 1f519bf5086..4ea93e0eb95 100644 --- a/api/package.json +++ b/api/package.json @@ -11,26 +11,29 @@ "@fastify/session": "^10.1.1", "@fastify/swagger": "^8.3.1", "@fastify/swagger-ui": "^1.5.0", + "@fastify/type-provider-typebox": "3.5.0", "@immobiliarelabs/fastify-sentry": "^6.0.0", "@prisma/client": "5.2.0", "ajv": "8.12.0", "ajv-formats": "^2.1.1", "connect-mongo": "4.6.0", + "dotenv": "16.3.1", "fast-uri": "2.2.0", "fastify": "4.21.0", "fastify-auth0-verify": "^1.0.0", "fastify-plugin": "^4.3.0", "jsonwebtoken": "9.0.2", + "lodash": "4.17.21", "mongodb": "^4.16.0", "nanoid": "3", "no-profanity": "^1.4.2", "nodemailer": "^6.9.3", "nodemon": "2.0.22", + "pino-pretty": "10.2.0", "query-string": "^7.1.3" }, "description": "The freeCodeCamp.org open-source codebase and curriculum", "devDependencies": { - "@fastify/type-provider-typebox": "3.5.0", "@total-typescript/ts-reset": "^0.4.0", "@types/express-session": "1.17.7", "@types/jsonwebtoken": "^9.0.2", @@ -38,7 +41,6 @@ "@types/supertest": "2.0.12", "dotenv-cli": "7.3.0", "jest": "29.6.4", - "pino-pretty": "10.2.0", "prisma": "5.2.0", "supertest": "6.3.3", "ts-jest": "29.1.1" diff --git a/api/prisma/schema.prisma b/api/prisma/schema.prisma index 572b79c80ce..f5648a06ce9 100644 --- a/api/prisma/schema.prisma +++ b/api/prisma/schema.prisma @@ -1,5 +1,6 @@ generator client { provider = "prisma-client-js" + binaryTargets = ["native", "linux-musl-openssl-3.0.x"] } datasource db { diff --git a/api/tsconfig.build.json b/api/tsconfig.build.json index e01a1e8491d..ecc9950b78c 100644 --- a/api/tsconfig.build.json +++ b/api/tsconfig.build.json @@ -2,7 +2,7 @@ "extends": "./tsconfig", "compilerOptions": { "outDir": "dist", - "rootDir": "src", + "rootDir": "../", "noEmit": false }, "include": ["src"], diff --git a/docker/new-api/Dockerfile b/docker/new-api/Dockerfile new file mode 100644 index 00000000000..b6c8950c7e7 --- /dev/null +++ b/docker/new-api/Dockerfile @@ -0,0 +1,59 @@ +# bookworm was only released on 10-6-2023, so is a little too new. +FROM node:18-bullseye AS builder +# global installs need root permissions, so have to happen before we switch to +# the node user +RUN npm i -g pnpm@8 +# node images create a non-root user that we can use +USER node +WORKDIR /home/node/build + +COPY --chown=node:node package.json . +COPY --chown=node:node pnpm*.yaml . +COPY --chown=node:node tsconfig*.json . +COPY --chown=node:node api/ api/ +COPY --chown=node:node shared/ shared/ +COPY --chown=node:node tools/ tools/ +COPY --chown=node:node curriculum/ curriculum/ +# TODO: AFAIK it's just the intro translations. Those should be folded into the +# curriculum and then we can remove this. +COPY --chown=node:node client/ client/ + +RUN pnpm config set dedupe-peer-dependents false +RUN pnpm install -F=api -F=curriculum -F tools/scripts/build -F challenge-parser \ + --frozen-lockfile + +# The api needs to source curriculum.json and build:curriculum relies on the +# following env vars. +ARG SHOW_UPCOMING_CHANGES=false +ENV SHOW_UPCOMING_CHANGES=$SHOW_UPCOMING_CHANGES +ARG SHOW_NEW_CURRICULUM=true +ENV SHOW_NEW_CURRICULUM=$SHOW_NEW_CURRICULUM + +RUN pnpm build:curriculum +RUN pnpm -F=api build + +FROM node:18-bullseye AS deps + +WORKDIR /home/node/build +COPY --chown=node:node pnpm*.yaml . +COPY --chown=node:node api/ api/ +COPY --chown=node:node shared/ shared/ +RUN npm i -g pnpm@8 +RUN pnpm install --prod --ignore-scripts -F=shared -F=api +# While we want to ignore scripts generally, we do need to generate the prisma +# client. Note: npx is the simplest way to generate the client without us having +# to have prisma as a prod dependency. +RUN cd api && npx prisma generate + +FROM node:18-alpine +RUN npm i -g pm2@4 +USER node +WORKDIR /home/node/fcc +COPY --from=builder --chown=node:node /home/node/build/api/dist/ ./ +COPY --from=builder --chown=node:node /home/node/build/api/package.json api/ + +COPY --from=deps --chown=node:node /home/node/build/node_modules/ node_modules/ +COPY --from=deps --chown=node:node /home/node/build/shared/node_modules/ shared/node_modules/ +COPY --from=deps --chown=node:node /home/node/build/api/node_modules/ api/node_modules/ + +CMD ["pm2-runtime", "start", "-i", "0","api/src/server.js"] diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index c1f3ca75218..ca7d435826c 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -192,6 +192,9 @@ importers: '@fastify/swagger-ui': specifier: ^1.5.0 version: 1.5.0 + '@fastify/type-provider-typebox': + specifier: 3.5.0 + version: 3.5.0(@sinclair/typebox@0.31.5) '@immobiliarelabs/fastify-sentry': specifier: ^6.0.0 version: 6.0.1 @@ -207,6 +210,9 @@ importers: connect-mongo: specifier: 4.6.0 version: 4.6.0(express-session@1.17.3)(mongodb@4.16.0) + dotenv: + specifier: 16.3.1 + version: 16.3.1 fast-uri: specifier: 2.2.0 version: 2.2.0 @@ -222,6 +228,9 @@ importers: jsonwebtoken: specifier: 9.0.2 version: 9.0.2 + lodash: + specifier: 4.17.21 + version: 4.17.21 mongodb: specifier: ^4.16.0 version: 4.16.0 @@ -237,13 +246,13 @@ importers: nodemon: specifier: 2.0.22 version: 2.0.22 + pino-pretty: + specifier: 10.2.0 + version: 10.2.0 query-string: specifier: ^7.1.3 version: 7.1.3 devDependencies: - '@fastify/type-provider-typebox': - specifier: 3.5.0 - version: 3.5.0(@sinclair/typebox@0.31.5) '@total-typescript/ts-reset': specifier: ^0.4.0 version: 0.4.0 @@ -265,9 +274,6 @@ importers: jest: specifier: 29.6.4 version: 29.6.4(@types/node@18.17.15)(ts-node@10.9.1) - pino-pretty: - specifier: 10.2.0 - version: 10.2.0 prisma: specifier: 5.2.0 version: 5.2.0 @@ -2980,7 +2986,7 @@ packages: '@babel/traverse': 7.22.11 '@babel/types': 7.22.11 convert-source-map: 1.9.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 gensync: 1.0.0-beta.2 json5: 2.2.3 semver: 6.3.1 @@ -3202,7 +3208,7 @@ packages: '@babel/core': 7.22.11 '@babel/helper-compilation-targets': 7.22.10 '@babel/helper-plugin-utils': 7.22.5 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 lodash.debounce: 4.0.8 resolve: 1.22.4 transitivePeerDependencies: @@ -6380,7 +6386,7 @@ packages: '@babel/helper-split-export-declaration': 7.22.6 '@babel/parser': 7.22.11 '@babel/types': 7.22.11 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globals: 11.12.0 transitivePeerDependencies: - supports-color @@ -6715,7 +6721,7 @@ packages: engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} dependencies: ajv: 6.12.6 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 espree: 9.6.1 globals: 13.21.0 ignore: 5.2.4 @@ -6852,7 +6858,7 @@ packages: '@sinclair/typebox': '>=0.26 <=0.31' dependencies: '@sinclair/typebox': 0.31.5 - dev: true + dev: false /@fortawesome/fontawesome-common-types@6.4.2: resolution: {integrity: sha512-1DgP7f+XQIJbLFCTX1V2QnxVmpLdKdzzo2k8EmvDOePfchaIGQ9eCHj2up3/jNEbZuBqel5OxiaOJf37TWauRA==} @@ -7205,7 +7211,7 @@ packages: engines: {node: '>=10.10.0'} dependencies: '@humanwhocodes/object-schema': 1.2.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 minimatch: 3.1.2 transitivePeerDependencies: - supports-color @@ -8481,7 +8487,7 @@ packages: /@sinclair/typebox@0.31.5: resolution: {integrity: sha512-4fbqH1ONle98ULTQakJFVNwGwSx+rv90HEnjZGt1GoApMKooUw1WXw3ub+Ew7rInmyDcwsjIxiHt39bkWzeCBA==} - dev: true + dev: false /@sindresorhus/is@0.14.0: resolution: {integrity: sha512-9NET910DNaIPngYnLLPeg+Ogzqsi9uM4mSboU5y6p8S5DzMTVEsJZrawi+BoDNUVBa2DhJqQYUFvMDfgU062LQ==} @@ -11448,7 +11454,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/type-utils': 5.62.0(eslint@8.49.0)(typescript@4.9.5) '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.49.0 graphemer: 1.4.0 ignore: 5.2.4 @@ -11537,7 +11543,7 @@ packages: '@typescript-eslint/scope-manager': 5.62.0 '@typescript-eslint/types': 5.62.0 '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.49.0 typescript: 4.9.5 transitivePeerDependencies: @@ -11569,7 +11575,7 @@ packages: dependencies: '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) '@typescript-eslint/utils': 5.62.0(eslint@8.49.0)(typescript@4.9.5) - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 eslint: 8.49.0 tsutils: 3.21.0(typescript@4.9.5) typescript: 4.9.5 @@ -11640,7 +11646,7 @@ packages: dependencies: '@typescript-eslint/types': 5.62.0 '@typescript-eslint/visitor-keys': 5.62.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 globby: 11.1.0 is-glob: 4.0.3 semver: 7.5.4 @@ -12085,7 +12091,7 @@ packages: resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} engines: {node: '>= 6.0.0'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -12673,6 +12679,7 @@ packages: /atomic-sleep@1.0.0: resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} engines: {node: '>=8.0.0'} + dev: false /automation-events@6.0.9: resolution: {integrity: sha512-JEJzZRfRb26FMWR8zE2D/H/n5n+NNFZh1BtmDcpZVJOhLYKLGFCImBuxChRBhpZaOyIxqobPtM839amAeu2H9g==} @@ -12718,7 +12725,7 @@ packages: resolution: {integrity: sha512-TAlMYvOuwGyLK3PfBb5WKBXZmXz2fVCgv23d6zZFdle/q3gPjmxBaeuC0pY0Dzs5PWMSgfqqEZkrye19GlDTgw==} dependencies: archy: 1.0.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 fastq: 1.15.0 transitivePeerDependencies: - supports-color @@ -15347,7 +15354,7 @@ packages: express-session: ^1.17.1 mongodb: ^4.1.0 dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 express-session: 1.17.3 kruptein: 3.0.6 mongodb: 4.16.0 @@ -16176,7 +16183,7 @@ packages: /dateformat@4.6.3: resolution: {integrity: sha512-2P0p0pFGzHS5EMnhdxQi7aJN+iMheud0UhG4dlE1DLAlvL8JHjJJTX/CSm4JXwV0Ka5nGk3zC5mcb5bUQUxxMA==} - dev: true + dev: false /dayjs@1.11.9: resolution: {integrity: sha512-QvzAURSbQ0pKdIye2txOzNaHmxtUBXerpY0FJsFXUMKbIZeFm5ht1LS/jFsrncjnmtv8HsG0W2g6c0zUjZWmpA==} @@ -16213,6 +16220,16 @@ packages: ms: 2.0.0 dev: false + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + /debug@3.2.7(supports-color@5.5.0): resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} peerDependencies: @@ -16247,6 +16264,17 @@ packages: ms: 2.1.2 dev: true + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + /debug@4.3.4(supports-color@8.1.1): resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} engines: {node: '>=6.0'} @@ -16705,7 +16733,7 @@ packages: /docsify-server-renderer@4.13.1: resolution: {integrity: sha512-XNJeCK3zp+mVO7JZFn0bH4hNBAMMC1MbuCU7CBsjLHYn4NHrjIgCBGmylzEan3/4Qm6kbSzQx8XzUK5T7GQxHw==} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 docsify: 4.13.1 node-fetch: 2.7.0 resolve-pathname: 3.0.0 @@ -17470,7 +17498,7 @@ packages: /eslint-import-resolver-node@0.3.9: resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} dependencies: - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 is-core-module: 2.13.0 resolve: 1.22.4 transitivePeerDependencies: @@ -17483,10 +17511,10 @@ packages: eslint: '*' eslint-plugin-import: '*' dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 enhanced-resolve: 5.15.0 eslint: 8.49.0 - eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.5.5)(eslint@8.49.0) + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.49.0) eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.49.0) get-tsconfig: 4.7.0 globby: 13.2.2 @@ -17550,13 +17578,41 @@ packages: optional: true dependencies: '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@4.9.5) - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 eslint: 8.49.0 eslint-import-resolver-node: 0.3.9 eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.49.0) transitivePeerDependencies: - supports-color + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-typescript@3.5.5)(eslint@8.49.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.49.0)(typescript@4.9.5) + debug: 3.2.7 + eslint: 8.49.0 + eslint-import-resolver-typescript: 3.5.5(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.49.0) + transitivePeerDependencies: + - supports-color + /eslint-plugin-filenames-simple@0.8.0(eslint@8.49.0): resolution: {integrity: sha512-8+uBzNBE5gSUMQv7bmMBiOD26eKzD4/5flPtD5Vl3dzZLXotSwXK3W7ZZqKQfU0Qyoborh+LqbN76EfmbBcU8A==} engines: {node: ^14.17.0 || ^16.0.0 || ^18.0.0} @@ -17659,7 +17715,7 @@ packages: array.prototype.findlastindex: 1.2.2 array.prototype.flat: 1.3.1 array.prototype.flatmap: 1.3.1 - debug: 3.2.7(supports-color@8.1.1) + debug: 3.2.7 doctrine: 2.1.0 eslint: 8.49.0 eslint-import-resolver-node: 0.3.9 @@ -17721,7 +17777,7 @@ packages: '@es-joy/jsdoccomment': 0.39.4 are-docs-informative: 0.0.2 comment-parser: 1.3.1 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 escape-string-regexp: 4.0.0 eslint: 8.49.0 esquery: 1.5.0 @@ -18016,7 +18072,7 @@ packages: ajv: 6.12.6 chalk: 4.1.2 cross-spawn: 7.0.3 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 doctrine: 3.0.0 escape-string-regexp: 4.0.0 eslint-scope: 7.2.2 @@ -18491,7 +18547,7 @@ packages: /fast-copy@3.0.1: resolution: {integrity: sha512-Knr7NOtK3HWRYGtHoJrjkaWepqT8thIVGAwt0p0aUs1zqkAzXZV4vo9fFNwyb5fcqK1GKYFYxldQdIDVKhUAfA==} - dev: true + dev: false /fast-decode-uri-component@1.0.1: resolution: {integrity: sha512-WKgKWg5eUxvRZGwW8FvfbaH7AXSh2cL+3j5fMGzUMCxWBJ3dV3a7Wz8y2f/uQ0e3B6WmodD3oS54jTQ9HVTIIg==} @@ -18945,7 +19001,7 @@ packages: debug: optional: true dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 /for-each@0.3.3: resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} @@ -20656,7 +20712,7 @@ packages: dependencies: glob: 8.1.0 readable-stream: 3.6.2 - dev: true + dev: false /hexoid@1.0.0: resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} @@ -21044,7 +21100,7 @@ packages: engines: {node: '>= 6'} dependencies: agent-base: 6.0.2 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 transitivePeerDependencies: - supports-color @@ -21987,7 +22043,7 @@ packages: resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 istanbul-lib-coverage: 3.2.0 source-map: 0.6.1 transitivePeerDependencies: @@ -23199,7 +23255,7 @@ packages: /joycon@3.1.1: resolution: {integrity: sha512-34wB/Y7MW7bzjKRjUKTa46I2Z7eV62Rkhva+KkopW7Qvv/OSWBqvkSY7vusOPrNuZcUG3tApvdVgNB8POj3SPw==} engines: {node: '>=10'} - dev: true + dev: false /jquery@3.7.1: resolution: {integrity: sha512-m4avr8yL8kmFN8psrbFFFmB/If14iN5o9nw/NgnnM+kybDJpRsAynV2BsfpTYrTRysYUdADVD7CkUUizgkpLfg==} @@ -23371,7 +23427,7 @@ packages: resolution: {integrity: sha512-pJ4XLQP4Q9HTxl6RVDLJ8Cyh1uitSs0CzDBAz1uoJ4sRD/Bk7cFSXL1FUXDW3zJ7YnfliJx6eu8Jn283bpZ4Yg==} engines: {node: '>=10'} dependencies: - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 rfdc: 1.3.0 uri-js: 4.4.1 transitivePeerDependencies: @@ -23668,7 +23724,7 @@ packages: cli-truncate: 3.1.0 colorette: 2.0.20 commander: 9.5.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 execa: 6.1.0 lilconfig: 2.0.6 listr2: 5.0.8 @@ -26313,6 +26369,7 @@ packages: /on-exit-leak-free@2.1.0: resolution: {integrity: sha512-VuCaZZAjReZ3vUwgOB8LxAosIurDiAW0s13rI1YwmaP++jvcxP77AWoQvenZebpCA2m8WC1/EosPYPMjnRAp/w==} + dev: false /on-finished@2.3.0: resolution: {integrity: sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==} @@ -27053,6 +27110,7 @@ packages: dependencies: readable-stream: 4.4.2 split2: 4.2.0 + dev: false /pino-pretty@10.2.0: resolution: {integrity: sha512-tRvpyEmGtc2D+Lr3FulIZ+R1baggQ4S3xD2Ar93KixFEDx6SEAUP3W5aYuEw1C73d6ROrNcB2IXLteW8itlwhA==} @@ -27072,7 +27130,7 @@ packages: secure-json-parse: 2.7.0 sonic-boom: 3.3.0 strip-json-comments: 3.1.1 - dev: true + dev: false /pino-std-serializers@6.2.2: resolution: {integrity: sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==} @@ -29329,6 +29387,7 @@ packages: events: 3.3.0 process: 0.11.10 string_decoder: 1.3.0 + dev: false /readable-web-to-node-stream@3.0.2: resolution: {integrity: sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==} @@ -30369,6 +30428,7 @@ packages: /secure-json-parse@2.7.0: resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + dev: false /select-hose@2.0.0: resolution: {integrity: sha512-mEugaLK+YfkijB4fx0e6kImuJdCIt2LxCRcbEYPqRGCs4F2ogyfZU5IAZRdjCP8JPq2AtdNoC/Dux63d9Kiryg==} @@ -30863,6 +30923,7 @@ packages: resolution: {integrity: sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==} dependencies: atomic-sleep: 1.0.0 + dev: false /source-list-map@2.0.1: resolution: {integrity: sha512-qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==} @@ -31014,6 +31075,7 @@ packages: /split2@4.2.0: resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} engines: {node: '>= 10.x'} + dev: false /split@0.3.3: resolution: {integrity: sha512-wD2AeVmxXRBoX44wAycgjVpMhvbwdI2aZjCkvfNcH1YqHQvJVa1duWc73OyVGJUc05fhFaTZeQ/PYsrmyH0JVA==} @@ -31114,7 +31176,7 @@ packages: arg: 5.0.2 bluebird: 3.7.2 check-more-types: 2.24.0 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 execa: 5.1.1 lazy-ass: 1.6.0 ps-tree: 1.2.0 @@ -31721,7 +31783,7 @@ packages: dependencies: component-emitter: 1.3.0 cookiejar: 2.1.4 - debug: 4.3.4(supports-color@8.1.1) + debug: 4.3.4 fast-safe-stringify: 2.1.1 form-data: 4.0.0 formidable: 2.1.2 diff --git a/sample.env b/sample.env index cbe6213935b..5d796977c7f 100644 --- a/sample.env +++ b/sample.env @@ -79,7 +79,8 @@ FCC_ENABLE_SWAGGER_UI=true FCC_ENABLE_DEV_LOGIN_MODE=true # Email -EMAIL_PROVIDER=nodemailer # use ses in production +# use ses in production +EMAIL_PROVIDER=nodemailer # SES_ID needs to be empty for now, since the api-server will use SES in testing # if it is set. SES_ID=