WebAuthn not works in production but works locally

Hi Redwood community,

I implemented webauthn following Self-hosted Authentication (dbAuth) | RedwoodJS Docs and everything works great locally.

And after I deployed it on Netlify, there was an error when I request the serverless function
“auth?method=webAuthnAuthOptions”

{"error":"Cannot find module '@simplewebauthn/server'\nRequire stack:\n- /var/task/node_modules/@redwoodjs/auth-dbauth-api/dist/DbAuthHandler.js\n- /var/task/node_modules/@redwoodjs/auth-dbauth-api/dist/index.js\n- /var/task/api/dist/functions/auth.js\n- /var/task/auth.js\n- /var/runtime/index.mjs"}

I tried to remove the node_modules folder and run yarn install locally, and it seems to install “@simplewebauthn/server” correctly.

Example:

https://www.ahollowplace.com/.netlify/functions/auth?method=webAuthnAuthOptions

Stacks:
Redwoodjs 4.2.2
yarn 3.2.1

Post your deployment logs?

4:55:33 PM: Build ready to start
4:55:34 PM: build-image version: f14e228ec2dbb3d6f5ee2f499343e1468b859b97 (focal)
4:55:34 PM: buildbot version: f14e228ec2dbb3d6f5ee2f499343e1468b859b97
4:55:34 PM: Fetching cached dependencies
4:55:34 PM: Starting to download cache of 334.8MB
4:55:37 PM: Finished downloading cache in 3.039s
4:55:37 PM: Starting to extract cache
4:55:43 PM: Finished extracting cache in 5.553s
4:55:43 PM: Finished fetching cache in 8.665s
4:55:43 PM: Starting to prepare the repo for build
4:55:43 PM: Preparing Git Reference refs/heads/main
4:55:43 PM: Parsing package.json dependencies
4:55:44 PM: Different build command detected, going to use the one specified in the Netlify configuration file: 'yarn rw deploy netlify' versus 'yarn install && yarn rw prisma migrate deploy && yarn rw deploy netlify' in the Netlify UI
4:55:45 PM: Starting build script
4:55:45 PM: Installing dependencies
4:55:45 PM: Python version set to 2.7
4:55:45 PM: Started restoring cached Node.js version
4:55:46 PM: Finished restoring cached Node.js version
4:55:46 PM: Attempting Node.js version 'lts/*' from .nvmrc
4:55:46 PM: v18.15.0 is already installed.
4:55:46 PM: Now using node v18.15.0 (npm v9.5.0)
4:55:46 PM: Enabling Node.js Corepack
4:55:46 PM: Started restoring cached build plugins
4:55:46 PM: Finished restoring cached build plugins
4:55:46 PM: Attempting Ruby version 2.7.2, read from environment
4:55:47 PM: Using Ruby version 2.7.2
4:55:47 PM: Using PHP version 8.0
4:55:47 PM: Started restoring cached corepack dependencies
4:55:47 PM: Finished restoring cached corepack dependencies
4:55:47 PM: Started restoring cached yarn cache
4:55:47 PM: Finished restoring cached yarn cache
4:55:48 PM: Installing Yarn version 1.22.19
4:55:48 PM: Preparing yarn@1.22.19 for immediate activation...
4:55:48 PM: No yarn workspaces detected
4:55:48 PM: Started restoring cached node modules
4:55:48 PM: Finished restoring cached node modules
4:55:48 PM: Installing npm packages using Yarn version 3.2.1
4:55:49 PM: ➤ YN0050: The cache-folder option has been deprecated; use rc settings instead
4:55:49 PM: ➤ YN0000: ┌ Resolution step
4:55:49 PM: ➤ YN0002: │ @graphql-codegen/cli@npm:3.0.0 [f2644] doesn't provide @types/node (pe98a1), requested by cosmiconfig-typescript-loader➤ YN0002: │ @graphql-codegen/cli@npm:3.0.0 [f2644] doesn't provide @types/node (p084ae), requested by ts-node➤ YN0002: │ @graphql-codegen/cli@npm:3.0.0 [f2644] doesn't provide typescript (pfe119), requested by cosmiconfig-typescript-loader➤ YN0002: │ @graphql-codegen/cli@npm:3.0.0 [f2644] doesn't provide typescript (pe1451), requested by ts-node➤ YN0002: │ @graphql-tools/graphql-tag-pluck@npm:7.5.0 [51e9b] doesn't provide @babel/core (pc7d6a), requested by @babel/plugin-syntax-import-assertions➤ YN0002: │ @netlify/build@npm:29.5.1 doesn't provide @types/node (p96294), requested by ts-node➤ YN0002: │ @redwoodjs/api-server@npm:4.2.2 doesn't provide @babel/core (p3812c), requested by @babel/plugin-transform-runtime➤ YN0002: │ @redwoodjs/cli@npm:4.2.2 doesn't provide react (p4b949), requested by @redwoodjs/prerender➤ YN0002: │ @redwoodjs/cli@npm:4.2.2 doesn't provide react-dom (pb9268), requested by @redwoodjs/prerender➤ YN0002: │ @redwoodjs/core@npm:4.2.2 doesn't provide @babel/eslint-parser (pcc5a5), requested by @babel/eslint-plugin➤ YN0002: │ @redwoodjs/core@npm:4.2.2 doesn't provide eslint (p27e9a), requested by @babel/eslint-plugin➤ YN0002: │ @redwoodjs/eslint-config@npm:4.2.2 doesn't provide babel-plugin-module-resolver (p73d9b), requested by eslint-import-resolver-babel-module➤ YN0002: │ @redwoodjs/internal@npm:4.2.2 doesn't provide @babel/core (p358fc), requested by @babel/plugin-transform-typescript➤ YN0002: │ @redwoodjs/internal@npm:4.2.2 doesn't provide @babel/core (p2ab9e), requested by @babel/register➤ YN0002: │ @redwoodjs/internal@npm:4.2.2 doesn't provide @babel/core (pe999b), requested by babel-plugin-graphql-tag➤ YN0002: │ @redwoodjs/internal@npm:4.2.2 doesn't provide @babel/core (p4af24), requested by babel-plugin-polyfill-corejs3➤ YN0002: │ @redwoodjs/internal@npm:4.2.2 doesn't provide @types/node (pf84c0), requested by ts-node➤ YN0002: │ @redwoodjs/internal@npm:4.2.2 doesn't provide graphql-tag (p2b394), requested by @graphql-codegen/typescript-react-apollo➤ YN0002: │ @redwoodjs/internal@npm:4.2.2 doesn't provide graphql-tag (p9984d), requested by babel-plugin-graphql-tag➤ YN0002: │ @redwoodjs/prerender@npm:4.2.2 [05305] doesn't provide prop-types (p3d46e), requested by @redwoodjs/web➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide @babel/core (pa546c), requested by @storybook/addon-essentials➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide @babel/core (pdc03d), requested by babel-jest➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide @babel/core (p00dd6), requested by babel-plugin-inline-react-svg➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide @testing-library/dom (p7010e), requested by @testing-library/user-event➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide prop-types (pdfd47), requested by @redwoodjs/web➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react (p1d66e), requested by @redwoodjs/router➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react (pa432f), requested by @redwoodjs/web➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react (p4e358), requested by @storybook/builder-webpack5➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react (p6815f), requested by @storybook/manager-webpack5➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react (p7f048), requested by @storybook/react➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react (p7749c), requested by @testing-library/react-hooks➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react (peafa3), requested by @testing-library/react➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react-dom (p81210), requested by @redwoodjs/router➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react-dom (p55b2d), requested by @redwoodjs/web➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react-dom (pfa03c), requested by @storybook/builder-webpack5➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react-dom (pd5a56), requested by @storybook/manager-webpack5➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react-dom (p2bd0f), requested by @storybook/react➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide react-dom (pba7d8), requested by @testing-library/react➤ YN0002: │ @redwoodjs/testing@npm:4.2.2 doesn't provide require-from-string (p16201), requested by @storybook/react➤ YN0002: │ @storybook/addon-docs@npm:6.5.16 [53c10] doesn't provide @babel/core (pec364), requested by @babel/preset-env➤ YN0002: │ @storybook/addon-docs@npm:6.5.16 [53c10] doesn't provide @babel/core (pe570f), requested by @babel/plugin-transform-react-jsx➤ YN0002: │ @storybook/addon-docs@npm:6.5.16 [53c10] doesn't provide @babel/core (pa298d), requested by babel-loader➤ YN0002: │ @storybook/addon-docs@npm:6.5.16 [53c10] doesn't provide webpack (p59c43), requested by babel-loader➤ YN0002: │ @storybook/docs-tools@npm:6.5.16 doesn't provide react (p9b542), requested by @storybook/store➤ YN0002: │ @storybook/docs-tools@npm:6.5.16 doesn't provide react-dom (pc910b), requested by @storybook/store➤ YN0002: │ @storybook/mdx1-csf@npm:0.0.1 doesn't provide @babel/core (p44796), requested by @babel/preset-env➤ YN0002: │ @storybook/telemetry@npm:6.5.16 doesn't provide react (p48f29), requested by @storybook/core-common➤ YN0002: │ @storybook/telemetry@npm:6.5.16 doesn't provide react-dom (p479a1), requested by @storybook/core-common➤ YN0002: │ @whatwg-node/fetch@npm:0.6.9 doesn't provide @types/node (pc8b91), requested by @whatwg-node/node-fetch➤ YN0002: │ @whatwg-node/fetch@npm:0.8.1 doesn't provide @types/node (p4afb6), requested by @whatwg-node/node-fetch➤ YN0002: │ @whatwg-node/fetch@npm:0.8.2 doesn't provide @types/node (p0e03d), requested by @whatwg-node/node-fetch➤ YN0002: │ apollo-link-context@npm:1.0.20 doesn't provide graphql (pa199c), requested by apollo-link➤ YN0002: │ filestack-js@npm:3.25.0 doesn't provide typescript (pc3e03), requested by ts-node➤ YN0002: │ netlify-cms-backend-gitlab@npm:2.13.0 [42f33] doesn't provide graphql (p0e258), requested by apollo-cache-inmemory➤ YN0002: │ netlify-cms-backend-gitlab@npm:2.13.0 [42f33] doesn't provide graphql (p26d62), requested by apollo-client➤ YN0002: │ netlify-cms-backend-gitlab@npm:2.13.0 [42f33] doesn't provide graphql (pea2fa), requested by apollo-link-http➤ YN0060: │ netlify-cms-core@npm:2.55.2 [42f33] provides ajv (p8ee43) with version 8.1.0, which doesn't satisfy what ajv-keywords requests➤ YN0002: │ netlify-cms-ui-default@npm:2.15.5 [42f33] doesn't provide react-dom (p8b3a7), requested by react-transition-group➤ YN0002: │ netlify-cms-ui-default@npm:2.15.5 [4b09d] doesn't provide react-dom (p4014d), requested by react-transition-group➤ YN0002: │ netlify-cms-widget-code@npm:1.3.4 [42f33] doesn't provide react-dom (p6365b), requested by react-select➤ YN0002: │ netlify-cms-widget-datetime@npm:2.7.4 [42f33] doesn't provide moment (pe4674), requested by react-datetime➤ YN0002: │ netlify-cms-widget-file@npm:2.12.1 [42f33] doesn't provide react-dom (pc786b), requested by react-sortable-hoc➤ YN0002: │ netlify-cms-widget-image-dimensions@npm:1.0.0 [42b1e] doesn't provide @emotion/core (pa7a93), requested by netlify-cms-ui-default➤ YN0002: │ netlify-cms-widget-image-dimensions@npm:1.0.0 [42b1e] doesn't provide @emotion/styled (p11aff), requested by netlify-cms-ui-default➤ YN0002: │ netlify-cms-widget-image-dimensions@npm:1.0.0 [42b1e] doesn't provide immutable (pe8f29), requested by netlify-cms-lib-util➤ YN0002: │ netlify-cms-widget-image-dimensions@npm:1.0.0 [42b1e] doesn't provide lodash (p5e025), requested by netlify-cms-lib-util➤ YN0002: │ netlify-cms-widget-image-dimensions@npm:1.0.0 [42b1e] doesn't provide lodash (p30daa), requested by netlify-cms-ui-default➤ YN0002: │ netlify-cms-widget-list@npm:2.10.1 [42f33] doesn't provide react-dom (p4910d), requested by react-sortable-hoc➤ YN0002: │ netlify-cms-widget-relation@npm:2.11.1 [42f33] doesn't provide react-dom (p26867), requested by react-select➤ YN0002: │ netlify-cms-widget-relation@npm:2.11.1 [42f33] doesn't provide react-dom (p11e6e), requested by react-sortable-hoc➤ YN0002: │ netlify-cms-widget-relation@npm:2.11.1 [42f33] doesn't provide react-dom (p58451), requested by react-window➤ YN0002: │ netlify-cms-widget-select@npm:2.8.2 [42f33] doesn't provide react-dom (pa67ca), requested by react-select➤ YN0002: │ react-hot-toast@npm:2.4.0 [096c2] doesn't provide csstype (p53da4), requested by goober➤ YN0002: │ react-hot-toast@npm:2.4.0 [6a038] doesn't provide csstype (p838d1), requested by goober➤ YN0002: │ react-hot-toast@npm:2.4.0 [af9fa] doesn't provide csstype (pa2ddf), requested by goober➤ YN0002: │ redux-notifications@npm:4.0.1 [b13ac] doesn't provide redux (pb5358), requested by react-redux➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide postcss (p21283), requested by autoprefixer➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide postcss (pd65c0), requested by postcss-cli➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide react (p979de), requested by styled-components➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide react (p83602), requested by @react-three/fiber➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide react (p6f406), requested by framer-motion-3d➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide react (paf64c), requested by react-icons➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide react (pe4905), requested by react-loader-spinner➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide react (p43842), requested by sassy-datepicker➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide react-dom (p2bf4a), requested by styled-components➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide react-dom (p3b1bc), requested by framer-motion-3d➤ YN0002: │ root-workspace-0b6124@workspace:. doesn't provide react-dom (p899a7), requested by react-loader-spinner➤ YN0002: │ web@workspace:web doesn't provide @types/react (p5ba4b), requested by react-markdown➤ YN0002: │ web@workspace:web doesn't provide graphql (pcd9dd), requested by @redwoodjs/forms➤ YN0002: │ web@workspace:web doesn't provide moment (p5cb6f), requested by moment-range➤ YN0060: │ web@workspace:web provides react (p9b9f8) with version 17.0.2, which doesn't satisfy what filestack-react requests➤ YN0060: │ web@workspace:web provides react (p1849f) with version 17.0.2, which doesn't satisfy what netlify-cms-app and some of its descendants request➤ YN0060: │ web@workspace:web provides react (pbb717) with version 17.0.2, which doesn't satisfy what netlify-cms-widget-image-dimensions and some of its descendants request➤ YN0060: │ web@workspace:web provides react (p08281) with version 17.0.2, which doesn't satisfy what use-in-view requests➤ YN0060: │ web@workspace:web provides react-dom (p423cc) with version 17.0.2, which doesn't satisfy what filestack-react requests➤ YN0060: │ web@workspace:web provides react-dom (p25738) with version 17.0.2, which doesn't satisfy what netlify-cms-app and some of its descendants request➤ YN0002: │ web@workspace:web doesn't provide react-is (pc5bbb), requested by styled-components➤ YN0002: │ web@workspace:web doesn't provide webpack (pcfbfb), requested by postcss-loader➤ YN0002: │ web@workspace:web doesn't provide webpack (p52360), requested by raw-loader➤ YN0000: │ Some peer dependencies are incorrectly met; run yarn explain peer-requirements <hash> for details, where <hash> is the six-letter p-prefixed code
4:55:49 PM: ➤ YN0000: └ Completed in 0s 504ms
4:55:50 PM: ➤ YN0000: ┌ Fetch step
4:56:02 PM: ➤ YN0066: │ typescript@patch:typescript@npm%3A4.9.5#~builtin<compat/typescript>::version=4.9.5&hash=7ad353: Cannot apply hunk #6
4:56:02 PM: ➤ YN0013: │ 56 packages were already cached, 3295 had to be fetched
4:56:02 PM: ➤ YN0000: └ Completed in 12s 316ms
4:56:02 PM: ➤ YN0000: ┌ Link step
4:56:05 PM: ➤ YN0007: │ core-js@npm:3.28.0 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ netlify-cli@npm:12.7.2 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ styled-components@npm:5.3.6 [42b1e] must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ core-js@npm:3.29.0 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ esbuild@npm:0.17.10 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ core-js-pure@npm:3.26.0 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ @prisma/engines@npm:4.10.1 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ msw@npm:0.49.3 [53c10] must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ @netlify/esbuild@npm:0.14.39 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ @prisma/client@npm:4.10.1 [c94b1] must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ browser-tabs-lock@npm:1.2.15 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ unix-dgram@npm:2.0.6 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ es5-ext@npm:0.10.62 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ @apollo/protobufjs@npm:1.2.6 must be built because it never has been before or the last one failed
4:56:05 PM: ➤ YN0007: │ @apollo/protobufjs@npm:1.2.7 must be built because it never has been before or the last one failed
4:56:09 PM: ➤ YN0000: │ browser-tabs-lock@npm:1.2.15 STDOUT Thank you for using browser-tabs-lock ( https://github.com/supertokens/browser-tabs-lock ).
4:56:09 PM: ➤ YN0000: │ browser-tabs-lock@npm:1.2.15 STDOUT
4:56:09 PM: ➤ YN0000: │ browser-tabs-lock@npm:1.2.15 STDOUT This library was created as a part of a larger project, SuperTokens( https://supertokens.io ) - an open source auth solution.
4:56:09 PM: ➤ YN0000: │ browser-tabs-lock@npm:1.2.15 STDOUT You can also check out our other projects on https://github.com/supertokens
4:56:09 PM: ➤ YN0000: │ browser-tabs-lock@npm:1.2.15 STDOUT 
4:56:10 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info it worked if it ends with ok
4:56:10 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info using node-gyp@9.0.0
4:56:10 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info using node@18.15.0 | linux | x64
4:56:10 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info find Python using Python version 3.8.10 found at "/usr/bin/python3"
4:56:10 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp http GET https://nodejs.org/download/release/v18.15.0/node-v18.15.0-headers.tar.gz
4:56:10 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp http 200 https://nodejs.org/download/release/v18.15.0/node-v18.15.0-headers.tar.gz
4:56:10 PM: ➤ YN0000: │ @prisma/client@npm:4.10.1 [c94b1] STDERR prisma:warn The postinstall script automatically ran `prisma generate` and did not find your `prisma/schema.prisma`.
4:56:10 PM: ➤ YN0000: │ @prisma/client@npm:4.10.1 [c94b1] STDERR If you have a Prisma schema file in a custom path, you will need to run
4:56:10 PM: ➤ YN0000: │ @prisma/client@npm:4.10.1 [c94b1] STDERR `prisma generate --schema=./path/to/your/schema.prisma` to generate Prisma Client.
4:56:10 PM: ➤ YN0000: │ @prisma/client@npm:4.10.1 [c94b1] STDERR If you do not have a Prisma schema file yet, you can ignore this message.
4:56:10 PM: ➤ YN0000: │ @prisma/client@npm:4.10.1 [c94b1] STDOUT
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp http GET https://nodejs.org/download/release/v18.15.0/SHASUMS256.txt
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp http 200 https://nodejs.org/download/release/v18.15.0/SHASUMS256.txt
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn /usr/bin/python3
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args [
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '/opt/build/repo/node_modules/node-gyp/gyp/gyp_main.py',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   'binding.gyp',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-f',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   'make',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-I',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '/opt/build/repo/node_modules/unix-dgram/build/config.gypi',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-I',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '/opt/build/repo/node_modules/node-gyp/addon.gypi',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-I',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '/opt/buildhome/.cache/node-gyp/18.15.0/include/node/common.gypi',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-Dlibrary=shared_library',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-Dvisibility=default',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-Dnode_root_dir=/opt/buildhome/.cache/node-gyp/18.15.0',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-Dnode_gyp_dir=/opt/build/repo/node_modules/node-gyp',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-Dnode_lib_file=/opt/buildhome/.cache/node-gyp/18.15.0/<(target_arch)/node.lib',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-Dmodule_root_dir=/opt/build/repo/node_modules/unix-dgram',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-Dnode_engine=v8',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '--depth=.',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '--no-parallel',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '--generator-output',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   'build',
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args   '-Goutput_dir=.'
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args ]
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn make
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info spawn args [ 'BUILDTYPE=Release', '-C', 'build' ]
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDOUT make: Entering directory '/opt/build/repo/node_modules/unix-dgram/build'
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDOUT   CXX(target) Release/obj.target/unix_dgram/src/unix_dgram.o
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT Success! Netlify CLI has been installed!
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT Your device is now configured to use Netlify CLI to deploy and manage your Netlify sites.
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT Next steps:
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT   netlify init     Connect or create a Netlify site from current directory
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT   netlify deploy   Deploy the latest changes to your Netlify site
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT For more information on the CLI run netlify help
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT Or visit the docs at https://cli.netlify.com
4:56:12 PM: ➤ YN0000: │ netlify-cli@npm:12.7.2 STDOUT
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR In file included from ../../nan/nan.h:60,
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR                  from ../src/unix_dgram.cc:5:
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR /opt/buildhome/.cache/node-gyp/18.15.0/include/node/node.h:978:43: warning: cast between incompatible function types from ‘void (*)(v8::Local<v8::Object>)’ to ‘node::addon_register_func’ {aka ‘void (*)(v8::Local<v8::Object>, v8::Local<v8::Value>, void*)’} [-Wcast-function-type]
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR   978 |       (node::addon_register_func) (regfunc),                          \
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR       |                                           ^
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR /opt/buildhome/.cache/node-gyp/18.15.0/include/node/node.h:1012:3: note: in expansion of macro ‘NODE_MODULE_X’
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR  1012 |   NODE_MODULE_X(modname, regfunc, NULL, 0)  // NOLINT (readability/null_usage)
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR       |   ^~~~~~~~~~~~~
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR ../src/unix_dgram.cc:404:1: note: in expansion of macro ‘NODE_MODULE’
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR   404 | NODE_MODULE(unix_dgram, Initialize)
4:56:12 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR       | ^~~~~~~~~~~
4:56:13 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDOUT   SOLINK_MODULE(target) Release/obj.target/unix_dgram.node
4:56:13 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDOUT   COPY Release/unix_dgram.node
4:56:13 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDOUT make: Leaving directory '/opt/build/repo/node_modules/unix-dgram/build'
4:56:13 PM: ➤ YN0000: │ unix-dgram@npm:2.0.6 STDERR gyp info ok
4:56:13 PM: ➤ YN0007: │ prisma@npm:4.10.1 must be built because it never has been before or the last one failed
4:56:13 PM: ➤ YN0000: └ Completed in 11s 304ms
4:56:14 PM: ➤ YN0000: Done with warnings in 24s 759ms
4:56:14 PM: npm packages installed using Yarn
4:56:15 PM: Started restoring cached go cache
4:56:15 PM: Finished restoring cached go cache
4:56:15 PM: go version go1.19.7 linux/amd64
4:56:15 PM: Detected 1 framework(s)
4:56:15 PM: "redwoodjs" at version "4.2.2"
4:56:15 PM: Section completed: initializing
4:56:17 PM: ​
4:56:17 PM:   Netlify Build                                                 
4:56:17 PM: ────────────────────────────────────────────────────────────────
4:56:17 PM: ​
4:56:17 PM: ❯ Version
4:56:17 PM:   @netlify/build 29.6.4
4:56:17 PM: ​
4:56:17 PM: ❯ Flags
4:56:17 PM:   baseRelDir: true
4:56:17 PM:   buildId: 64092e84ffcc743f1debe31b
4:56:17 PM:   deployId: 64092e84ffcc743f1debe31d
4:56:17 PM: ​
4:56:17 PM: ❯ Current directory
4:56:17 PM:   /opt/build/repo
4:56:17 PM: ​
4:56:17 PM: ❯ Config file
4:56:17 PM:   /opt/build/repo/netlify.toml
4:56:17 PM: ​
4:56:17 PM: ❯ Context
4:56:17 PM:   production
4:56:17 PM: ​
4:56:17 PM:   1. build.command from netlify.toml                            
4:56:17 PM: ────────────────────────────────────────────────────────────────
4:56:17 PM: ​
4:56:17 PM: $ yarn rw deploy netlify
4:56:18 PM: 
4:56:18 PM: Running:
4:56:18 PM: yarn rw build --verbose && yarn rw prisma migrate deploy && yarn rw data-migrate up
4:56:21 PM: [STARTED] Generating Prisma Client...
4:56:22 PM: Prisma schema loaded from db/schema.prisma
4:56:22 PM: warn Preview feature "interactiveTransactions" is deprecated. The functionality can be used without specifying it as a preview feature.
4:56:22 PM: ✔ Generated Prisma Client (4.10.1 | library) to ./../node_modules/@prisma/client in 173ms
4:56:22 PM: You can now start using Prisma Client in your code. Reference: https://pris.ly/d/client
4:56:22 PM: ```import { PrismaClient } from '@prisma/client'const prisma = new PrismaClient()```
4:56:22 PM: [SUCCESS] Generating Prisma Client...
4:56:22 PM: [STARTED] Verifying graphql schema...
4:56:22 PM: [SUCCESS] Verifying graphql schema...
4:56:22 PM: [STARTED] Building API...
4:56:23 PM: [SUCCESS] Building API...
4:56:23 PM: [STARTED] Cleaning Web...
4:56:23 PM: [SUCCESS] Cleaning Web...
4:56:23 PM: [STARTED] Building Web...
4:57:18 PM: assets by path static/ 16 MiB 53 assets
4:57:18 PM: assets by path admin/ 8.04 KiB
4:57:18 PM:   assets by path admin/blog/*.json ...../node_modules/@redwoodjs/core/node_modules/css-loader/dist/cjs.js??ruleSet[1].rules[0].oneOf[3].use[1]!../node_modules/postcss-loader/dist/cjs.js??ruleSet[1].rules[0].oneOf[3].use[2]!./src/scaffold.css 5.65 KiB [built] [code generated]      + 2 modules  os (ignored) 15 bytes [built] [code generated]WARNING in asset size limit: The following asset(s) exceed the recommended size limit (244 KiB).This can impact web performance.Assets:   static/media/MVPBenefit.6d1b00e2.png (1.44 MiB)  static/media/food1.923957aa.jpeg (919 KiB)  static/media/reviewBG-min.2e9841a3.png (458 KiB)  static/media/reviewBG.91e0f613.png (5.32 MiB)  static/js/app.9cfbc046.js (1.46 MiB)  static/js/207.ad50369c.chunk.js (4.46 MiB)WARNING in entrypoint size limit: The following entrypoint(s) combined asset size exceeds the recommended limit (244 KiB). This can impact web performance.Entrypoints:  app (1.52 MiB)      static/js/runtime-app.2f38c53c.js      static/css/app.0db5e371.css      static/js/app.9cfbc046.jswebpack 5.75.0 compiled with 2 warnings in 51163 msCreating 200.html...
4:57:18 PM: [SUCCESS] Building Web...
4:57:18 PM: Starting prerendering...
4:57:18 PM: You have not marked any routes to "prerender" in your Routes.
4:57:21 PM: Skipping prerender...
4:57:21 PM: You have not marked any routes with a path as `prerender` in `Routes.{js,tsx}` 
4:57:21 PM: 
4:57:23 PM: Running Prisma CLI...
4:57:23 PM: $ yarn prisma migrate deploy --schema /opt/build/repo/api/db/schema.prisma
4:57:23 PM: Prisma schema loaded from api/db/schema.prisma
4:57:23 PM: Datasource "db": PostgreSQL database "railway", schema "public" at "containers-us-west-62.railway.app:6325"
4:57:24 PM: No migration found in prisma/migrations
4:57:25 PM: No pending migrations to apply.
4:57:27 PM: 
4:57:27 PM: No data migrations run, already up-to-date.
4:57:27 PM: 
4:57:28 PM: ​
4:57:28 PM: (build.command completed in 1m 10.7s)
4:57:28 PM: ​
4:57:28 PM:   2. Functions bundling                                         
4:57:28 PM: ────────────────────────────────────────────────────────────────
4:57:28 PM: ​
4:57:28 PM: Packaging Functions from api/dist/functions directory:
4:57:28 PM:  - auth.js
4:57:28 PM:  - graphql.js
4:57:28 PM:  - blogs/blogs.js
4:57:28 PM: ​
4:57:47 PM: ​
4:57:47 PM: (Functions bundling completed in 19.7s)
4:57:47 PM: ​
4:57:47 PM:   3. Deploy site                                                
4:57:47 PM: ────────────────────────────────────────────────────────────────
4:57:47 PM: ​
4:57:47 PM: Starting to deploy site from 'web/dist'
4:57:48 PM: Calculating files to upload
4:57:48 PM: 0 new files to upload
4:57:48 PM: 3 new functions to upload
4:57:49 PM: Section completed: deploying
4:57:49 PM: Site deploy was successfully initiated
4:57:49 PM: ​
4:57:49 PM: Starting post processing
4:57:49 PM: (Deploy site completed in 1.3s)
4:57:49 PM: ​
4:57:49 PM:   Netlify Build Complete                                        
4:57:49 PM: Post processing - HTML
4:57:49 PM: ────────────────────────────────────────────────────────────────
4:57:49 PM: ​
4:57:49 PM: (Netlify Build completed in 1m 31.8s)
4:57:49 PM: Post processing - header rules
4:57:49 PM: Caching artifacts
4:57:49 PM: Post processing - redirect rules
4:57:49 PM: Started saving node modules
4:57:49 PM: Finished saving node modules
4:57:49 PM: Started saving build plugins
4:57:49 PM: Finished saving build plugins
4:57:49 PM: Started saving corepack cache
4:57:49 PM: Post processing done
4:57:49 PM: Finished saving corepack cache
4:57:49 PM: Started saving yarn cache
4:57:49 PM: Finished saving yarn cache
4:57:49 PM: Section completed: postprocessing
4:57:49 PM: Started saving pip cache
4:57:49 PM: Finished saving pip cache
4:57:49 PM: Started saving emacs cask dependencies
4:57:49 PM: Finished saving emacs cask dependencies
4:57:49 PM: Started saving maven dependencies
4:57:49 PM: Finished saving maven dependencies
4:57:49 PM: Started saving boot dependencies
4:57:49 PM: Finished saving boot dependencies
4:57:49 PM: Started saving rust rustup cache
4:57:49 PM: Finished saving rust rustup cache
4:57:49 PM: Started saving go dependencies
4:57:49 PM: Finished saving go dependencies
4:57:49 PM: Build script success
4:57:50 PM: Site is live ✨
4:57:49 PM: Section completed: building
4:57:52 PM: Uploading Cache of size 334.7MB
4:57:54 PM: Section completed: cleanup
4:57:54 PM: Finished processing build request in 2m20.116s

It looks like yarn is installing the package…

Hi,
I’m having the same problem, did you manage to make it work?

No, I need to spend some time debugging remotely to see whether the package in this case “@simplewebauthn” was installed correctly.

I was able to resolve this by updating netlify.toml to add the following section:

[functions]
  node_bundler = "esbuild"
  external_node_modules = ["@simplewebauthn/server"]

For the reasoning, here’s what cursor.sh explained:

  1. Netlify Functions uses a bundler (esbuild) to package your functions and their dependencies into a single file for better performance and cold start times.
  2. During this bundling process, it tries to be smart about which dependencies to include to keep the bundle size small. It automatically excludes packages it thinks might not be needed.
  3. Sometimes the bundler can’t properly trace all dependencies, especially when they’re being imported dynamically or through other packages (in your case, through @redwoodjs/auth-dbauth-api).
  4. The external_node_modules setting explicitly tells Netlify “don’t try to bundle these packages, just include them as-is”. This is particularly important for packages that:
  • Have native dependencies
  • Are dynamically required
  • Are used through indirect imports
  • Need to maintain their original file structure

In your case, @simplewebauthn/server is being imported by @redwoodjs/auth-dbauth-api, and the bundler isn’t correctly detecting this dependency chain, so we need to explicitly tell Netlify to include it.


The above wasn’t obvious to me from RedwoodJS’s docs (File-based configuration | Netlify Docs) or even the Netlify docs about this exact config (File-based configuration | Netlify Docs), so I’m glad an AI explained it to me. :sweat_smile: