I am having trouble getting my slack bolt app with typescript to run locally, I get this error:

Error: Cannot find module '../../../utils/constants'
Require stack:
- /Users/brandondickson/workspace/slack-bot-desk-genie/dist/modals/addAdmin.js
- /Users/brandondickson/workspace/slack-bot-desk-genie/dist/modals/index.js
- /Users/brandondickson/workspace/slack-bot-desk-genie/dist/index.js
    at Module._resolveFilename (node:internal/modules/cjs/loader:939:15)
    at Module._load (node:internal/modules/cjs/loader:780:27)
    at Module.require (node:internal/modules/cjs/loader:1005:19)
    at require (node:internal/modules/cjs/helpers:102:18)
    at Object.<anonymous> (/Users/brandondickson/workspace/slack-bot-desk-genie/dist/modals/addAdmin.js:7:18)
    at Module._compile (node:internal/modules/cjs/loader:1105:14)
    at Module._extensions..js (node:internal/modules/cjs/loader:1159:10)
    at Module.load (node:internal/modules/cjs/loader:981:32)
    at Module._load (node:internal/modules/cjs/loader:827:12)
    at Module.require (node:internal/modules/cjs/loader:1005:19) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [
    '/Users/brandondickson/workspace/slack-bot-desk-genie/dist/modals/addAdmin.js',
    '/Users/brandondickson/workspace/slack-bot-desk-genie/dist/modals/index.js',
    '/Users/brandondickson/workspace/slack-bot-desk-genie/dist/index.js'
  ]
}

This is my tsconfig:

{
  "compilerOptions": {
    "target": "es2018",
    "module": "commonjs",
    "moduleResolution": "node",
    "esModuleInterop": true,
    "resolveJsonModule": true,
    "allowSyntheticDefaultImports": true,
    "strict": true,
    "allowJs": true,
    "sourceMap": true,
    "outDir": "dist",
    "baseUrl": "./src",
    "paths": {
      "@/*": ["*"]
    }
  },
  "include": ["src/**/*", "prisma/**/*"]
}

This is my package.json:

{
  "name": "slack-bot-desk-genie",
  "version": "1.0.0",
  "description": "xDesign desk booking slack bot",
  "homepage": "https://bitbucket.org/xdesign365/slack-bot-desk-genie",
  "main": "app.js",
  "prisma": {
    "seed": "ts-node prisma/seed.ts"
  },
  "scripts": {
    "start:app": "node ./dist/index.js",
    "start:dev": "ts-node ./src/app.ts",
    "start:db": "docker compose up",
    "start:ngrok": "./ngrok http 3000",
    "start:studio": "npx prisma studio",
    "db:seed": "npx prisma db seed",
    "lint:verify": "eslint . --ext .ts && echo All files pass linting.",
    "lint:fix": "eslint --fix . --ext .ts && echo All files pass linting.",
    "prettier:verify": "prettier --config --check ./.prettierrc.js \"**/*{.ts,.json,.js}\"",
    "prettier:fix": "prettier --config --write ./.prettierrc.js \"**/*{.ts,.json,.js}\"",
    "prepare": "husky install",
    "build": "tsc"
  },
  "license": "ISC",
  "dependencies": {
    "@prisma/client": "4.14.0",
    "@slack/bolt": "3.13.1",
    "aws-lambda": "1.0.7",
    "date-fns": "2.30.0",
    "dotenv": "16.0.3",
    "slack-block-builder": "2.7.2"
  },
  "devDependencies": {
    "@types/aws-lambda": "8.10.115",
    "@types/node": "20.1.2",
    "@typescript-eslint/eslint-plugin": "5.59.5",
    "@typescript-eslint/parser": "5.59.5",
    "eslint": "8.40.0",
    "eslint-config-prettier": "8.8.0",
    "husky": "8.0.3",
    "prettier": "2.8.8",
    "prettier-plugin-organize-imports": "3.2.2",
    "prettier-plugin-prisma": "4.13.0",
    "prisma": "4.14.0",
    "serverless": "3.30.1",
    "serverless-dotenv-plugin": "6.0.0",
    "serverless-functions-base-path": "1.0.33",
    "serverless-offline": "12.0.4",
    "serverless-offline-scheduler": "0.5.0",
    "serverless-plugin-typescript": "2.1.4",
    "serverless-tscpaths": "0.0.8",
    "ts-node": "10.9.1",
    "typescript": "5.0.4"
  }
}

This is my app.ts

import {
  addAdminCallback,
  clearFilterCallback,
  createOfficeAreaCallback,
  createOfficeCallback,
  createOfficeChatCallback,
  deleteOfficeAreaCallback,
  filterUserCallback,
  joinDayCallback,
  joinDayViewMoreCallback,
  joinOfficeChatCallback,
  leaveDayCallback,
  officeOptionsCallback,
  removeAdminCallback,
  selectDefaultOfficeCallback,
  viewAdminCallback,
  viewCreateUserCallback,
  viewDateRangeCallback,
  viewHomeCallback,
  viewMoreCallback,
  viewOfficesCallback,
  viewSettingsCallback,
  viewSwitchOfficeCallback
} from '@/listeners/actions';
import { appHomeOpenedCallback } from '@/listeners/events';
import {
  submitCreateBookingCallback,
  submitCreateOfficeCallback,
  submitCreateUserCallback,
  submitNewAdminCallback,
  submitUpdateOfficeCallback
} from '@/listeners/views';
import { CONSTANTS } from '@/utils/constants';
import { getFutureDates } from '@/utils/dates';
import { App, AwsLambdaReceiver } from '@slack/bolt';
import { Callback, Context } from 'aws-lambda';
import dotenv from 'dotenv';

dotenv.config();

const awsLambdaReceiver = new AwsLambdaReceiver({
  signingSecret: process.env.SLACK_SIGNING_SECRET || ''
});

const { today, twoFridaysFromToday } = getFutureDates();

// Initializes your app with your bot token and app token
const app = new App({
  token: process.env.SLACK_BOT_TOKEN,
  signingSecret: process.env.SLACK_SIGNING_SECRET,
  socketMode: true,
  appToken: process.env.SLACK_APP_TOKEN,
  port: 3000
});

(async () => {
  await app.start(Number(process.env.PORT) || 3000);
  console.log('⚡️ Bolt app is running!');
})();

// events
app.event('app_home_opened', appHomeOpenedCallback);

// actions
app.action(CONSTANTS.actionsIds.viewMore, viewMoreCallback);
app.action(CONSTANTS.actionsIds.viewSettings, viewSettingsCallback);
app.action(CONSTANTS.actionsIds.viewOffices, viewOfficesCallback);
app.action(
  CONSTANTS.actionsIds.viewHome,
  viewHomeCallback(today, twoFridaysFromToday)
);
app.action(CONSTANTS.actionsIds.chooseDateRange, viewDateRangeCallback);
app.action(CONSTANTS.actionsIds.joinDay, joinDayCallback);
app.action(CONSTANTS.actionsIds.viewOffices, viewOfficesCallback);
app.action(CONSTANTS.actionsIds.createOffice, createOfficeCallback);
app.action(CONSTANTS.actionsIds.createOfficeArea, createOfficeAreaCallback);
app.action(CONSTANTS.actionsIds.deleteOfficeArea, deleteOfficeAreaCallback);
app.action(CONSTANTS.actionsIds.officeOptions, officeOptionsCallback);
app.action(CONSTANTS.actionsIds.viewAdmin, viewAdminCallback);
app.action(CONSTANTS.actionsIds.removeAdmin, removeAdminCallback);
app.action(CONSTANTS.actionsIds.addAdmin, addAdminCallback);
app.action(CONSTANTS.actionsIds.createOfficeChat, createOfficeChatCallback);
app.action(CONSTANTS.actionsIds.joinOfficeChat, joinOfficeChatCallback);
app.action(CONSTANTS.actionsIds.viewCreateUser, viewCreateUserCallback);
app.action(
  CONSTANTS.actionsIds.selectDefaultOffice,
  selectDefaultOfficeCallback
);
app.action(CONSTANTS.actionsIds.viewSwitchOffice, viewSwitchOfficeCallback);
app.action(CONSTANTS.actionsIds.filterUser, filterUserCallback);
app.action(CONSTANTS.actionsIds.clearFilter, clearFilterCallback);
app.action(CONSTANTS.actionsIds.joinDayViewMore, joinDayViewMoreCallback);
app.action(CONSTANTS.actionsIds.leaveDay, leaveDayCallback);

// views
app.view(CONSTANTS.actionsIds.submitCreateBooking, submitCreateBookingCallback);
app.view(CONSTANTS.actionsIds.submitNewAdmin, submitNewAdminCallback);
app.view(CONSTANTS.actionsIds.submitCreateOffice, submitCreateOfficeCallback);
app.view(CONSTANTS.actionsIds.submitUpdateOffice, submitUpdateOfficeCallback);
app.view(CONSTANTS.actionsIds.submitCreateUser, submitCreateUserCallback);

export const handler = async (
  event: any,
  context: Context,
  callback: Callback
) => {
  const handler = await awsLambdaReceiver.start();
  return handler(event, context, callback);
};

And an example of another file inside the listeners/actions folder:

import { addAdminModal } from '@/ui';
import {
  BlockAction,
  Middleware,
  SlackActionMiddlewareArgs
} from '@slack/bolt';

export const addAdminCallback: Middleware<
  SlackActionMiddlewareArgs<BlockAction>
> = async ({ body, ack, client }) => {
  try {
    await ack();
    await client.views.open({
      trigger_id: body.trigger_id,
      view: addAdminModal()
    });
  } catch (error) {
    console.error(error);
  }
};