Fixes: FRMW-2742
In this PR, we fix the build output of the backend source code, which eliminates a lot of magic between the development and production environments.
Right now, we only compile the source files from the `src` directory and write them within the `dist` directory.
**Here's how the `src` directory with a custom module looks like**
```
src
├── modules
│ └── hello
│ ├── index.ts
```
**Here's the build output**
```
dist
├── modules
│ └── hello
│ ├── index.js
```
Let's imagine a file at the root of your project (maybe the `medusa-config.js` file) that wants to import the `modules/hello/index` file. How can we ensure that the import will work in both the development and production environments?
If we write the import targeting the `src` directory, it will break in production because it should target the `dist` directory.
## Solution
The solution is to compile everything within the project and mimic the file structure in the build output, not just the `src` directory.
**Here's how the fixed output should look like**
```
dist
├── src
│ ├── modules
│ │ └── hello
│ │ ├── index.js
├── medusa-config.js
├── yarn.lock
├── package.json
```
If you notice carefully, we also have `medusa-config.js`, `yarn.lock`, and `package.json` within the `dist` directory. We do so to create a standalone built application, something you can copy/paste to your server and run without relying on the original source code.
- This results in small containers since you are not copying unnecessary files.
- Clear distinction between the development and the production code. If you want to run the production server, then `cd` into the `dist` directory and run it from there.
## Changes in the PR
- Breaking: Remove the `dist` and `build` folders. Instead, write them production artefacts within the `.medusa` directory as `.medusa/admin` and `.medusa/server`.
- Breaking: Change the output of the `.medusa/server` folder to mimic the root project structure.
- Refactor: Remove `Symbol.for("ts-node.register.instance")]` check to find from where to load the source code.
- Refactor: Use `tsc` for creating the production build. This ensures we respect `tsconfig` settings when creating the build and also perform type-checking.
Co-authored-by: Adrien de Peretti <25098370+adrien2p@users.noreply.github.com>
121 lines
2.9 KiB
JavaScript
121 lines
2.9 KiB
JavaScript
const { Modules } = require("@medusajs/utils")
|
|
|
|
const DB_HOST = process.env.DB_HOST
|
|
const DB_USERNAME = process.env.DB_USERNAME
|
|
const DB_PASSWORD = process.env.DB_PASSWORD
|
|
const DB_NAME = process.env.DB_TEMP_NAME
|
|
const DB_URL = `postgres://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}/${DB_NAME}`
|
|
process.env.POSTGRES_URL = DB_URL
|
|
process.env.LOG_LEVEL = "error"
|
|
|
|
const enableMedusaV2 = process.env.MEDUSA_FF_MEDUSA_V2 == "true"
|
|
|
|
const customPaymentProvider = {
|
|
resolve: {
|
|
services: [require("@medusajs/payment/dist/providers/system").default],
|
|
},
|
|
id: "default_2",
|
|
}
|
|
|
|
const customFulfillmentProvider = {
|
|
resolve: "@medusajs/fulfillment-manual",
|
|
id: "test-provider",
|
|
}
|
|
|
|
module.exports = {
|
|
admin: {
|
|
disable: true,
|
|
},
|
|
plugins: [],
|
|
projectConfig: {
|
|
databaseUrl: DB_URL,
|
|
databaseType: "postgres",
|
|
http: {
|
|
jwtSecret: "test",
|
|
cookieSecret: "test",
|
|
},
|
|
},
|
|
featureFlags: {
|
|
medusa_v2: enableMedusaV2,
|
|
},
|
|
modules: {
|
|
[Modules.AUTH]: {
|
|
resolve: "@medusajs/auth",
|
|
options: {
|
|
providers: [
|
|
{
|
|
id: "emailpass",
|
|
resolve: "@medusajs/auth-emailpass",
|
|
},
|
|
],
|
|
},
|
|
},
|
|
[Modules.USER]: {
|
|
scope: "internal",
|
|
resources: "shared",
|
|
resolve: "@medusajs/user",
|
|
options: {
|
|
jwt_secret: "test",
|
|
},
|
|
},
|
|
[Modules.CACHE]: {
|
|
resolve: "@medusajs/cache-inmemory",
|
|
options: { ttl: 0 }, // Cache disabled
|
|
},
|
|
[Modules.STOCK_LOCATION]: {
|
|
resolve: "@medusajs/stock-location-next",
|
|
options: {},
|
|
},
|
|
[Modules.INVENTORY]: {
|
|
resolve: "@medusajs/inventory-next",
|
|
options: {},
|
|
},
|
|
[Modules.PRODUCT]: true,
|
|
[Modules.PRICING]: true,
|
|
[Modules.PROMOTION]: true,
|
|
[Modules.REGION]: true,
|
|
[Modules.CUSTOMER]: true,
|
|
[Modules.SALES_CHANNEL]: true,
|
|
[Modules.CART]: true,
|
|
[Modules.WORKFLOW_ENGINE]: true,
|
|
[Modules.API_KEY]: true,
|
|
[Modules.STORE]: true,
|
|
[Modules.TAX]: true,
|
|
[Modules.CURRENCY]: true,
|
|
[Modules.ORDER]: true,
|
|
[Modules.PAYMENT]: {
|
|
resolve: "@medusajs/payment",
|
|
/** @type {import('@medusajs/payment').PaymentModuleOptions}*/
|
|
options: {
|
|
providers: [customPaymentProvider],
|
|
},
|
|
},
|
|
[Modules.FULFILLMENT]: {
|
|
/** @type {import('@medusajs/fulfillment').FulfillmentModuleOptions} */
|
|
options: {
|
|
providers: [customFulfillmentProvider],
|
|
},
|
|
},
|
|
[Modules.NOTIFICATION]: {
|
|
/** @type {import('@medusajs/types').LocalNotificationServiceOptions} */
|
|
options: {
|
|
providers: [
|
|
{
|
|
resolve: "@medusajs/notification-local",
|
|
id: "local-notification-provider",
|
|
options: {
|
|
name: "Local Notification Provider",
|
|
channels: ["log", "email"],
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
[Modules.INDEX]: process.env.ENABLE_INDEX_MODULE
|
|
? {
|
|
resolve: "@medusajs/index",
|
|
}
|
|
: false,
|
|
},
|
|
}
|