@etohq/framework 1.5.1-alpha.3 → 1.5.1-alpha.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/config/loader.d.ts +1 -1
- package/dist/config/loader.d.ts.map +1 -1
- package/dist/config/loader.js +3 -2
- package/dist/config/loader.js.map +1 -1
- package/dist/deps/awilix.d.ts +2 -0
- package/dist/deps/awilix.d.ts.map +1 -0
- package/dist/deps/awilix.js +18 -0
- package/dist/deps/awilix.js.map +1 -0
- package/dist/deps/mikro-orm-cli.d.ts +2 -0
- package/dist/deps/mikro-orm-cli.d.ts.map +1 -0
- package/dist/deps/mikro-orm-cli.js +18 -0
- package/dist/deps/mikro-orm-cli.js.map +1 -0
- package/dist/deps/mikro-orm-core.d.ts +2 -0
- package/dist/deps/mikro-orm-core.d.ts.map +1 -0
- package/dist/deps/mikro-orm-core.js +18 -0
- package/dist/deps/mikro-orm-core.js.map +1 -0
- package/dist/deps/mikro-orm-knex.d.ts +2 -0
- package/dist/deps/mikro-orm-knex.d.ts.map +1 -0
- package/dist/deps/mikro-orm-knex.js +18 -0
- package/dist/deps/mikro-orm-knex.js.map +1 -0
- package/dist/deps/mikro-orm-migrations.d.ts +2 -0
- package/dist/deps/mikro-orm-migrations.d.ts.map +1 -0
- package/dist/deps/mikro-orm-migrations.js +18 -0
- package/dist/deps/mikro-orm-migrations.js.map +1 -0
- package/dist/deps/mikro-orm-postgresql.d.ts +2 -0
- package/dist/deps/mikro-orm-postgresql.d.ts.map +1 -0
- package/dist/deps/mikro-orm-postgresql.js +18 -0
- package/dist/deps/mikro-orm-postgresql.js.map +1 -0
- package/dist/deps/opentelemetry-api.d.ts +2 -0
- package/dist/deps/opentelemetry-api.d.ts.map +1 -0
- package/dist/deps/opentelemetry-api.js +18 -0
- package/dist/deps/opentelemetry-api.js.map +1 -0
- package/dist/deps/opentelemetry-instrumentation-pg.d.ts +2 -0
- package/dist/deps/opentelemetry-instrumentation-pg.d.ts.map +1 -0
- package/dist/deps/opentelemetry-instrumentation-pg.js +18 -0
- package/dist/deps/opentelemetry-instrumentation-pg.js.map +1 -0
- package/dist/deps/opentelemetry-resources.d.ts +2 -0
- package/dist/deps/opentelemetry-resources.d.ts.map +1 -0
- package/dist/deps/opentelemetry-resources.js +18 -0
- package/dist/deps/opentelemetry-resources.js.map +1 -0
- package/dist/deps/opentelemetry-sdk-node.d.ts +2 -0
- package/dist/deps/opentelemetry-sdk-node.d.ts.map +1 -0
- package/dist/deps/opentelemetry-sdk-node.js +18 -0
- package/dist/deps/opentelemetry-sdk-node.js.map +1 -0
- package/dist/deps/opentelemetry-sdk-trace-node.d.ts +2 -0
- package/dist/deps/opentelemetry-sdk-trace-node.d.ts.map +1 -0
- package/dist/deps/opentelemetry-sdk-trace-node.js +18 -0
- package/dist/deps/opentelemetry-sdk-trace-node.js.map +1 -0
- package/dist/deps/pg.d.ts +2 -0
- package/dist/deps/pg.d.ts.map +1 -0
- package/dist/deps/pg.js +18 -0
- package/dist/deps/pg.js.map +1 -0
- package/dist/deps/zod.d.ts +2 -0
- package/dist/deps/zod.d.ts.map +1 -0
- package/dist/deps/zod.js +18 -0
- package/dist/deps/zod.js.map +1 -0
- package/dist/eto-app-loader.d.ts.map +1 -1
- package/dist/eto-app-loader.js +4 -2
- package/dist/eto-app-loader.js.map +1 -1
- package/dist/eto.d.ts +11 -2
- package/dist/eto.d.ts.map +1 -1
- package/dist/eto.js +29 -18
- package/dist/eto.js.map +1 -1
- package/dist/http/express-loader.d.ts +10 -0
- package/dist/http/express-loader.d.ts.map +1 -0
- package/dist/http/express-loader.js +130 -0
- package/dist/http/express-loader.js.map +1 -0
- package/dist/http/middleware-file-loader.d.ts +33 -0
- package/dist/http/middleware-file-loader.d.ts.map +1 -0
- package/dist/http/middleware-file-loader.js +186 -0
- package/dist/http/middleware-file-loader.js.map +1 -0
- package/dist/http/middlewares/apply-locale.d.ts +12 -0
- package/dist/http/middlewares/apply-locale.d.ts.map +1 -0
- package/dist/http/middlewares/apply-locale.js +31 -0
- package/dist/http/middlewares/apply-locale.js.map +1 -0
- package/dist/http/middlewares/check-permissions.d.ts +15 -0
- package/dist/http/middlewares/check-permissions.d.ts.map +1 -0
- package/dist/http/middlewares/check-permissions.js +54 -0
- package/dist/http/middlewares/check-permissions.js.map +1 -0
- package/dist/http/router.d.ts +36 -0
- package/dist/http/router.d.ts.map +1 -0
- package/dist/http/router.js +317 -0
- package/dist/http/router.js.map +1 -0
- package/dist/http/routes-finder.d.ts +22 -0
- package/dist/http/routes-finder.d.ts.map +1 -0
- package/dist/http/routes-finder.js +68 -0
- package/dist/http/routes-finder.js.map +1 -0
- package/dist/http/routes-loader.d.ts +39 -0
- package/dist/http/routes-loader.d.ts.map +1 -0
- package/dist/http/routes-loader.js +232 -0
- package/dist/http/routes-loader.js.map +1 -0
- package/dist/http/routes-sorter.d.ts +105 -0
- package/dist/http/routes-sorter.d.ts.map +1 -0
- package/dist/http/routes-sorter.js +146 -0
- package/dist/http/routes-sorter.js.map +1 -0
- package/dist/http/utils/define-middlewares.d.ts +22 -0
- package/dist/http/utils/define-middlewares.d.ts.map +1 -0
- package/dist/http/utils/define-middlewares.js +27 -0
- package/dist/http/utils/define-middlewares.js.map +1 -0
- package/dist/http/utils/field-filtering/field-parser.d.ts +32 -0
- package/dist/http/utils/field-filtering/field-parser.d.ts.map +1 -0
- package/dist/http/utils/field-filtering/field-parser.js +87 -0
- package/dist/http/utils/field-filtering/field-parser.js.map +1 -0
- package/dist/http/utils/field-filtering/field-validator.d.ts +24 -0
- package/dist/http/utils/field-filtering/field-validator.d.ts.map +1 -0
- package/dist/http/utils/field-filtering/field-validator.js +67 -0
- package/dist/http/utils/field-filtering/field-validator.js.map +1 -0
- package/dist/http/utils/field-filtering/index.d.ts +33 -0
- package/dist/http/utils/field-filtering/index.d.ts.map +1 -0
- package/dist/http/utils/field-filtering/index.js +9 -0
- package/dist/http/utils/field-filtering/index.js.map +1 -0
- package/dist/http/utils/policies/rbac-field-filter.d.ts +19 -0
- package/dist/http/utils/policies/rbac-field-filter.d.ts.map +1 -0
- package/dist/http/utils/policies/rbac-field-filter.js +348 -0
- package/dist/http/utils/policies/rbac-field-filter.js.map +1 -0
- package/dist/links/link-loader.d.ts +2 -1
- package/dist/links/link-loader.d.ts.map +1 -1
- package/dist/links/link-loader.js +9 -7
- package/dist/links/link-loader.js.map +1 -1
- package/dist/policies/has-permission.d.ts +33 -0
- package/dist/policies/has-permission.d.ts.map +1 -0
- package/dist/policies/has-permission.js +110 -0
- package/dist/policies/has-permission.js.map +1 -0
- package/dist/policies/index.d.ts +3 -0
- package/dist/policies/index.d.ts.map +1 -0
- package/dist/policies/index.js +19 -0
- package/dist/policies/index.js.map +1 -0
- package/dist/policies/policy-loader.d.ts +6 -0
- package/dist/policies/policy-loader.d.ts.map +1 -0
- package/dist/policies/policy-loader.js +17 -0
- package/dist/policies/policy-loader.js.map +1 -0
- package/dist/telemetry/index.d.ts +50 -0
- package/dist/telemetry/index.d.ts.map +1 -0
- package/dist/telemetry/index.js +81 -0
- package/dist/telemetry/index.js.map +1 -0
- package/dist/types/container.d.ts +5 -1
- package/dist/types/container.d.ts.map +1 -1
- package/dist/utils/resource-loader.d.ts +3 -1
- package/dist/utils/resource-loader.d.ts.map +1 -1
- package/dist/utils/resource-loader.js +18 -7
- package/dist/utils/resource-loader.js.map +1 -1
- package/dist/zod/index.d.ts +1 -0
- package/dist/zod/index.d.ts.map +1 -1
- package/dist/zod/index.js +1 -0
- package/dist/zod/index.js.map +1 -1
- package/package.json +21 -9
package/dist/eto.js
CHANGED
|
@@ -3,20 +3,24 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.
|
|
6
|
+
exports.EtoRuntime = void 0;
|
|
7
7
|
const path_1 = __importDefault(require("path"));
|
|
8
8
|
const utils_1 = require("@etohq/utils");
|
|
9
9
|
const modules_sdk_1 = require("@etohq/modules-sdk");
|
|
10
10
|
const lodash_1 = require("lodash");
|
|
11
11
|
const logger_1 = require("./logger");
|
|
12
|
-
class
|
|
12
|
+
class EtoRuntime {
|
|
13
13
|
constructor(options) {
|
|
14
14
|
this._etoActivity = logger_1.logger.activity("Eto -");
|
|
15
15
|
this._generateTypes = options.generateTypes ?? false;
|
|
16
16
|
this._loaders = options.loader;
|
|
17
17
|
this._env = options.env;
|
|
18
|
+
this._lifecycle = {
|
|
19
|
+
handleProcessSignals: false,
|
|
20
|
+
...(options.lifecycle ?? {}),
|
|
21
|
+
};
|
|
18
22
|
}
|
|
19
|
-
defineConfig(config = {}) {
|
|
23
|
+
defineConfig(config = {}, buildOptions = {}) {
|
|
20
24
|
const { http, redisOptions, ...restOfProjectConfig } = config.projectConfig || {};
|
|
21
25
|
/**
|
|
22
26
|
* The defaults to use for the project config. They are shallow merged
|
|
@@ -57,6 +61,10 @@ class EtoBuilder {
|
|
|
57
61
|
},
|
|
58
62
|
...redisOptions,
|
|
59
63
|
},
|
|
64
|
+
workerMode: buildOptions.mode ??
|
|
65
|
+
config.projectConfig?.workerMode ??
|
|
66
|
+
process.env.ETO_WORKER_MODE ??
|
|
67
|
+
"shared",
|
|
60
68
|
...restOfProjectConfig,
|
|
61
69
|
};
|
|
62
70
|
/**
|
|
@@ -83,23 +91,23 @@ class EtoBuilder {
|
|
|
83
91
|
inputModules: config.modules,
|
|
84
92
|
};
|
|
85
93
|
}
|
|
86
|
-
async
|
|
94
|
+
async create(inlineConfig = {}, options = {}) {
|
|
87
95
|
const setupEto = async (loader, shouldGenerateTypes, inputConfig) => {
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
await this.generateTypeDefinitions(loaded, loaded.directory);
|
|
92
|
-
}
|
|
93
|
-
logger_1.logger.success(this._etoActivity, "Eto is ready");
|
|
94
|
-
this.registerShutdownHandlers(loaded.shutdown);
|
|
95
|
-
return loaded;
|
|
96
|
-
}
|
|
97
|
-
catch (err) {
|
|
98
|
-
this.handleInitializationError(err);
|
|
99
|
-
process.exit(1);
|
|
96
|
+
const loaded = await loader(inputConfig);
|
|
97
|
+
if (shouldGenerateTypes) {
|
|
98
|
+
await this.generateTypeDefinitions(loaded, loaded.directory);
|
|
100
99
|
}
|
|
100
|
+
logger_1.logger.success(this._etoActivity, "Eto is ready");
|
|
101
|
+
this.registerShutdownHandlers(loaded.shutdown);
|
|
102
|
+
return loaded;
|
|
101
103
|
};
|
|
102
|
-
|
|
104
|
+
try {
|
|
105
|
+
return await setupEto(this._loaders, this._generateTypes, this.defineConfig(inlineConfig, options));
|
|
106
|
+
}
|
|
107
|
+
catch (err) {
|
|
108
|
+
this.handleInitializationError(err);
|
|
109
|
+
throw err;
|
|
110
|
+
}
|
|
103
111
|
}
|
|
104
112
|
async generateTypeDefinitions(eto, baseDir) {
|
|
105
113
|
const typesDirectory = path_1.default.join(baseDir, ".eto/types");
|
|
@@ -119,6 +127,9 @@ class EtoBuilder {
|
|
|
119
127
|
}
|
|
120
128
|
}
|
|
121
129
|
registerShutdownHandlers(shutdownFn) {
|
|
130
|
+
if (!this._lifecycle.handleProcessSignals) {
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
122
133
|
const gracefulShutdown = async () => {
|
|
123
134
|
logger_1.logger.info("Gracefully tearing down Eto Eto");
|
|
124
135
|
await shutdownFn();
|
|
@@ -135,5 +146,5 @@ class EtoBuilder {
|
|
|
135
146
|
}
|
|
136
147
|
}
|
|
137
148
|
}
|
|
138
|
-
exports.
|
|
149
|
+
exports.EtoRuntime = EtoRuntime;
|
|
139
150
|
//# sourceMappingURL=eto.js.map
|
package/dist/eto.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eto.js","sourceRoot":"","sources":["../src/eto.ts"],"names":[],"mappings":";;;;;;AAAA,gDAAuB;AAQvB,wCAKqB;AAGrB,oDAA8C;AAC9C,mCAAgC;AAChC,qCAAiC;
|
|
1
|
+
{"version":3,"file":"eto.js","sourceRoot":"","sources":["../src/eto.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { EtoContainer } from "@etohq/framework/types";
|
|
2
|
+
import { Express } from "express";
|
|
3
|
+
export declare function expressLoader({ app, container, }: {
|
|
4
|
+
app: Express;
|
|
5
|
+
container: EtoContainer;
|
|
6
|
+
}): Promise<{
|
|
7
|
+
app: Express;
|
|
8
|
+
shutdown: () => Promise<void>;
|
|
9
|
+
}>;
|
|
10
|
+
//# sourceMappingURL=express-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-loader.d.ts","sourceRoot":"","sources":["../../src/http/express-loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAA;AAKrD,OAAgB,EAAE,OAAO,EAAkB,MAAM,SAAS,CAAA;AAY1D,wBAAsB,aAAa,CAAC,EAClC,GAAG,EACH,SAAS,GACV,EAAE;IACD,GAAG,EAAE,OAAO,CAAA;IACZ,SAAS,EAAE,YAAY,CAAA;CACxB,GAAG,OAAO,CAAC;IACV,GAAG,EAAE,OAAO,CAAA;IACZ,QAAQ,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAC9B,CAAC,CAyID"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.expressLoader = expressLoader;
|
|
7
|
+
const utils_1 = require("@etohq/framework/utils");
|
|
8
|
+
const utils_2 = require("@etohq/utils");
|
|
9
|
+
const connect_redis_1 = __importDefault(require("connect-redis"));
|
|
10
|
+
const cookie_parser_1 = __importDefault(require("cookie-parser"));
|
|
11
|
+
const express_1 = __importDefault(require("express"));
|
|
12
|
+
const express_session_1 = __importDefault(require("express-session"));
|
|
13
|
+
const ioredis_1 = __importDefault(require("ioredis"));
|
|
14
|
+
const morgan_1 = __importDefault(require("morgan"));
|
|
15
|
+
const path_1 = __importDefault(require("path"));
|
|
16
|
+
const config_1 = require("../config");
|
|
17
|
+
const NOISY_ENDPOINTS_CHUNKS = ["@fs", "@id", "@vite", "@react", "node_modules"];
|
|
18
|
+
const isHealthCheck = (req) => req.path === "/health";
|
|
19
|
+
async function expressLoader({ app, container, }) {
|
|
20
|
+
const baseDir = config_1.configManager.baseDir;
|
|
21
|
+
const configModule = config_1.configManager.config;
|
|
22
|
+
const isProduction = config_1.configManager.isProduction;
|
|
23
|
+
const NODE_ENV = process.env.NODE_ENV || "development";
|
|
24
|
+
const IS_DEV = NODE_ENV.startsWith("dev");
|
|
25
|
+
const isStaging = NODE_ENV === "staging";
|
|
26
|
+
const isTest = NODE_ENV === "test";
|
|
27
|
+
const logger = container.resolve(utils_1.ContainerRegistrationKeys.LOGGER);
|
|
28
|
+
let sameSite = false;
|
|
29
|
+
let secure = false;
|
|
30
|
+
if (isProduction || isStaging) {
|
|
31
|
+
secure = true;
|
|
32
|
+
sameSite = "none";
|
|
33
|
+
}
|
|
34
|
+
const { http, sessionOptions, cookieOptions } = configModule.projectConfig;
|
|
35
|
+
const sessionOpts = {
|
|
36
|
+
name: sessionOptions?.name ?? "connect.sid",
|
|
37
|
+
resave: sessionOptions?.resave ?? true,
|
|
38
|
+
rolling: sessionOptions?.rolling ?? false,
|
|
39
|
+
saveUninitialized: sessionOptions?.saveUninitialized ?? false,
|
|
40
|
+
proxy: true,
|
|
41
|
+
secret: sessionOptions?.secret ?? http?.cookieSecret,
|
|
42
|
+
cookie: {
|
|
43
|
+
sameSite,
|
|
44
|
+
secure,
|
|
45
|
+
maxAge: sessionOptions?.ttl ?? 10 * 60 * 60 * 1000,
|
|
46
|
+
...cookieOptions,
|
|
47
|
+
},
|
|
48
|
+
store: null,
|
|
49
|
+
};
|
|
50
|
+
let redisClient;
|
|
51
|
+
if (configModule?.projectConfig.sessionOptions?.dynamodbOptions) {
|
|
52
|
+
const storeFactory = await (0, utils_2.dynamicImport)("connect-dynamodb");
|
|
53
|
+
const client = await (0, utils_2.dynamicImport)("@aws-sdk/client-dynamodb");
|
|
54
|
+
const DynamoDBStore = storeFactory({ session: express_session_1.default });
|
|
55
|
+
sessionOpts.store = new DynamoDBStore({
|
|
56
|
+
...configModule.projectConfig.sessionOptions.dynamodbOptions,
|
|
57
|
+
client: new client.DynamoDBClient(configModule.projectConfig.sessionOptions.dynamodbOptions.clientOptions),
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
else if (configModule?.projectConfig?.redisUrl) {
|
|
61
|
+
const RedisStore = (0, connect_redis_1.default)(express_session_1.default);
|
|
62
|
+
redisClient = new ioredis_1.default(configModule.projectConfig.redisUrl, configModule.projectConfig.redisOptions ?? {});
|
|
63
|
+
sessionOpts.store = new RedisStore({
|
|
64
|
+
client: redisClient,
|
|
65
|
+
prefix: `${configModule?.projectConfig?.redisPrefix ?? ""}sess:`,
|
|
66
|
+
});
|
|
67
|
+
}
|
|
68
|
+
app.set("trust proxy", 1);
|
|
69
|
+
/**
|
|
70
|
+
* Method to skip logging HTTP requests. We skip in test environment
|
|
71
|
+
* and also exclude files served by vite during development
|
|
72
|
+
*/
|
|
73
|
+
function shouldSkipHttpLog(req, res) {
|
|
74
|
+
return (isTest ||
|
|
75
|
+
isHealthCheck(req) ||
|
|
76
|
+
NOISY_ENDPOINTS_CHUNKS.some((chunk) => req.url.includes(chunk)) ||
|
|
77
|
+
!logger.shouldLog("http"));
|
|
78
|
+
}
|
|
79
|
+
let loggingMiddleware;
|
|
80
|
+
/**
|
|
81
|
+
* The middleware to use for logging. We write the log messages
|
|
82
|
+
* using winston, but rely on morgan to hook into HTTP requests
|
|
83
|
+
*/
|
|
84
|
+
if (!IS_DEV) {
|
|
85
|
+
const jsonFormat = (tokens, req, res) => {
|
|
86
|
+
const result = {
|
|
87
|
+
level: "http",
|
|
88
|
+
// client ip
|
|
89
|
+
client_ip: req.ip || "-",
|
|
90
|
+
// Request ID can be correlated with other logs (like error reports)
|
|
91
|
+
request_id: req.requestId || "-",
|
|
92
|
+
// Standard HTTP request properties
|
|
93
|
+
http_version: tokens["http-version"](req, res),
|
|
94
|
+
method: tokens.method(req, res),
|
|
95
|
+
path: tokens.url(req, res),
|
|
96
|
+
// Response details
|
|
97
|
+
status: Number(tokens.status(req, res)),
|
|
98
|
+
response_size: tokens.res(req, res, "content-length") || 0,
|
|
99
|
+
request_size: tokens.req(req, res, "content-length") || 0,
|
|
100
|
+
duration: Number(tokens["response-time"](req, res)),
|
|
101
|
+
// Useful headers that might help in debugging or tracing
|
|
102
|
+
referrer: tokens.referrer(req, res) || "-",
|
|
103
|
+
user_agent: tokens["user-agent"](req, res),
|
|
104
|
+
timestamp: new Date().toISOString(),
|
|
105
|
+
};
|
|
106
|
+
return JSON.stringify(result);
|
|
107
|
+
};
|
|
108
|
+
loggingMiddleware = (0, morgan_1.default)(jsonFormat, {
|
|
109
|
+
skip: shouldSkipHttpLog,
|
|
110
|
+
});
|
|
111
|
+
}
|
|
112
|
+
else {
|
|
113
|
+
loggingMiddleware = (0, morgan_1.default)(":method :url ← :referrer (:status) - :response-time ms", {
|
|
114
|
+
skip: shouldSkipHttpLog,
|
|
115
|
+
stream: {
|
|
116
|
+
write: (message) => logger.http(message.trim()),
|
|
117
|
+
},
|
|
118
|
+
});
|
|
119
|
+
}
|
|
120
|
+
app.use(loggingMiddleware);
|
|
121
|
+
app.use((0, cookie_parser_1.default)());
|
|
122
|
+
app.use((0, express_session_1.default)(sessionOpts));
|
|
123
|
+
// Currently we don't allow configuration of static files, but this can be revisited as needed.
|
|
124
|
+
app.use("/static", express_1.default.static(path_1.default.join(baseDir, "static")));
|
|
125
|
+
const shutdown = async () => {
|
|
126
|
+
redisClient?.disconnect();
|
|
127
|
+
};
|
|
128
|
+
return { app, shutdown };
|
|
129
|
+
}
|
|
130
|
+
//# sourceMappingURL=express-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"express-loader.js","sourceRoot":"","sources":["../../src/http/express-loader.ts"],"names":[],"mappings":";;;;;AAiBA,sCAkJC;AAlKD,kDAAkE;AAClE,wCAA4C;AAC5C,kEAAuC;AACvC,kEAAwC;AACxC,sDAA0D;AAC1D,sEAAqC;AACrC,sDAA2B;AAC3B,oDAA2B;AAC3B,gDAAuB;AACvB,sCAAyC;AAGzC,MAAM,sBAAsB,GAAG,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,QAAQ,EAAE,cAAc,CAAC,CAAA;AAEhF,MAAM,aAAa,GAAG,CAAC,GAAkB,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,SAAS,CAAA;AAE7D,KAAK,UAAU,aAAa,CAAC,EAClC,GAAG,EACH,SAAS,GAIV;IAIC,MAAM,OAAO,GAAG,sBAAa,CAAC,OAAO,CAAA;IACrC,MAAM,YAAY,GAAG,sBAAa,CAAC,MAAM,CAAA;IACzC,MAAM,YAAY,GAAG,sBAAa,CAAC,YAAY,CAAA;IAC/C,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa,CAAA;IACtD,MAAM,MAAM,GAAG,QAAQ,CAAC,UAAU,CAAC,KAAK,CAAC,CAAA;IACzC,MAAM,SAAS,GAAG,QAAQ,KAAK,SAAS,CAAA;IACxC,MAAM,MAAM,GAAG,QAAQ,KAAK,MAAM,CAAA;IAClC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,iCAAyB,CAAC,MAAM,CAAC,CAAA;IAElE,IAAI,QAAQ,GAAqB,KAAK,CAAA;IACtC,IAAI,MAAM,GAAG,KAAK,CAAA;IAClB,IAAI,YAAY,IAAI,SAAS,EAAE,CAAC;QAC9B,MAAM,GAAG,IAAI,CAAA;QACb,QAAQ,GAAG,MAAM,CAAA;IACnB,CAAC;IAED,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,aAAa,EAAE,GAAG,YAAY,CAAC,aAAa,CAAA;IAC1E,MAAM,WAAW,GAAG;QAClB,IAAI,EAAE,cAAc,EAAE,IAAI,IAAI,aAAa;QAC3C,MAAM,EAAE,cAAc,EAAE,MAAM,IAAI,IAAI;QACtC,OAAO,EAAE,cAAc,EAAE,OAAO,IAAI,KAAK;QACzC,iBAAiB,EAAE,cAAc,EAAE,iBAAiB,IAAI,KAAK;QAC7D,KAAK,EAAE,IAAI;QACX,MAAM,EAAE,cAAc,EAAE,MAAM,IAAI,IAAI,EAAE,YAAY;QACpD,MAAM,EAAE;YACN,QAAQ;YACR,MAAM;YACN,MAAM,EAAE,cAAc,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,IAAI;YAClD,GAAG,aAAa;SACjB;QACD,KAAK,EAAE,IAAI;KACZ,CAAA;IAED,IAAI,WAAkB,CAAA;IAEtB,IAAI,YAAY,EAAE,aAAa,CAAC,cAAc,EAAE,eAAe,EAAE,CAAC;QAChE,MAAM,YAAY,GAAG,MAAM,IAAA,qBAAa,EAAC,kBAAkB,CAAC,CAAA;QAC5D,MAAM,MAAM,GAAG,MAAM,IAAA,qBAAa,EAAC,0BAA0B,CAAC,CAAA;QAC9D,MAAM,aAAa,GAAG,YAAY,CAAC,EAAE,OAAO,EAAP,yBAAO,EAAE,CAAC,CAAA;QAC/C,WAAW,CAAC,KAAK,GAAG,IAAI,aAAa,CAAC;YACpC,GAAG,YAAY,CAAC,aAAa,CAAC,cAAc,CAAC,eAAe;YAC5D,MAAM,EAAE,IAAI,MAAM,CAAC,cAAc,CAC/B,YAAY,CAAC,aAAa,CAAC,cAAc,CAAC,eAAe,CAAC,aAAa,CACxE;SACF,CAAC,CAAA;IACJ,CAAC;SAAM,IAAI,YAAY,EAAE,aAAa,EAAE,QAAQ,EAAE,CAAC;QACjD,MAAM,UAAU,GAAG,IAAA,uBAAW,EAAC,yBAAO,CAAC,CAAA;QACvC,WAAW,GAAG,IAAI,iBAAK,CACrB,YAAY,CAAC,aAAa,CAAC,QAAQ,EACnC,YAAY,CAAC,aAAa,CAAC,YAAY,IAAI,EAAE,CAC9C,CAAA;QACD,WAAW,CAAC,KAAK,GAAG,IAAI,UAAU,CAAC;YACjC,MAAM,EAAE,WAAW;YACnB,MAAM,EAAE,GAAG,YAAY,EAAE,aAAa,EAAE,WAAW,IAAI,EAAE,OAAO;SACjE,CAAC,CAAA;IACJ,CAAC;IAED,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,CAAC,CAAC,CAAA;IAEzB;;;OAGG;IACH,SAAS,iBAAiB,CAAC,GAAkB,EAAE,GAAmB;QAChE,OAAO,CACL,MAAM;YACN,aAAa,CAAC,GAAG,CAAC;YAClB,sBAAsB,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;YAC/D,CAAC,MAAM,CAAC,SAAS,CAAC,MAAM,CAAC,CAC1B,CAAA;IACH,CAAC;IAED,IAAI,iBAAiC,CAAA;IAErC;;;OAGG;IACH,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,MAAM,UAAU,GAAG,CAAC,MAAM,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE;YACtC,MAAM,MAAM,GAAG;gBACb,KAAK,EAAE,MAAM;gBACb,YAAY;gBACZ,SAAS,EAAE,GAAG,CAAC,EAAE,IAAI,GAAG;gBAExB,oEAAoE;gBACpE,UAAU,EAAE,GAAG,CAAC,SAAS,IAAI,GAAG;gBAEhC,mCAAmC;gBACnC,YAAY,EAAE,MAAM,CAAC,cAAc,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;gBAC9C,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC;gBAC/B,IAAI,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,CAAC;gBAE1B,mBAAmB;gBACnB,MAAM,EAAE,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBACvC,aAAa,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,IAAI,CAAC;gBAC1D,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,gBAAgB,CAAC,IAAI,CAAC;gBACzD,QAAQ,EAAE,MAAM,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;gBAEnD,yDAAyD;gBACzD,QAAQ,EAAE,MAAM,CAAC,QAAQ,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,GAAG;gBAC1C,UAAU,EAAE,MAAM,CAAC,YAAY,CAAC,CAAC,GAAG,EAAE,GAAG,CAAC;gBAE1C,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;aACpC,CAAA;YAED,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QAC/B,CAAC,CAAA;QAED,iBAAiB,GAAG,IAAA,gBAAM,EAAC,UAAU,EAAE;YACrC,IAAI,EAAE,iBAAiB;SACxB,CAAC,CAAA;IACJ,CAAC;SAAM,CAAC;QACN,iBAAiB,GAAG,IAAA,gBAAM,EACxB,wDAAwD,EACxD;YACE,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE;gBACN,KAAK,EAAE,CAAC,OAAe,EAAE,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC;aACxD;SACF,CACF,CAAA;IACH,CAAC;IAED,GAAG,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAA;IAC1B,GAAG,CAAC,GAAG,CAAC,IAAA,uBAAY,GAAE,CAAC,CAAA;IACvB,GAAG,CAAC,GAAG,CAAC,IAAA,yBAAO,EAAC,WAAW,CAAC,CAAC,CAAA;IAE7B,+FAA+F;IAC/F,GAAG,CAAC,GAAG,CAAC,SAAS,EAAE,iBAAO,CAAC,MAAM,CAAC,cAAI,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAA;IAEhE,MAAM,QAAQ,GAAG,KAAK,IAAI,EAAE;QAC1B,WAAW,EAAE,UAAU,EAAE,CAAA;IAC3B,CAAC,CAAA;IAED,OAAO,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAA;AAC1B,CAAC"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { type AdditionalDataValidatorRoute, type BodyParserConfigRoute, type MedusaErrorHandlerFunction, type MiddlewareDescriptor } from "./types";
|
|
2
|
+
/**
|
|
3
|
+
* Exposes the API to scan a directory and load the `middleware.ts` file. This file contains
|
|
4
|
+
* the configuration for certain global middlewares and core routes validators. Also, it may
|
|
5
|
+
* contain custom middlewares.
|
|
6
|
+
*/
|
|
7
|
+
export declare class MiddlewareFileLoader {
|
|
8
|
+
#private;
|
|
9
|
+
/**
|
|
10
|
+
* Scans a given directory for the "middleware.ts" or "middleware.js" files and
|
|
11
|
+
* imports them for reading the registered middleware and configuration for
|
|
12
|
+
* existing routes/middleware.
|
|
13
|
+
*/
|
|
14
|
+
scanDir(sourceDir: string): Promise<void>;
|
|
15
|
+
/**
|
|
16
|
+
* Returns the globally registered error handler (if any)
|
|
17
|
+
*/
|
|
18
|
+
getErrorHandler(): MedusaErrorHandlerFunction | undefined;
|
|
19
|
+
/**
|
|
20
|
+
* Returns a collection of registered middleware
|
|
21
|
+
*/
|
|
22
|
+
getMiddlewares(): MiddlewareDescriptor[];
|
|
23
|
+
/**
|
|
24
|
+
* Returns routes that have bodyparser config on them
|
|
25
|
+
*/
|
|
26
|
+
getBodyParserConfigRoutes(): BodyParserConfigRoute[];
|
|
27
|
+
/**
|
|
28
|
+
* Returns routes that have additional validator configured
|
|
29
|
+
* on them
|
|
30
|
+
*/
|
|
31
|
+
getAdditionalDataValidatorRoutes(): AdditionalDataValidatorRoute[];
|
|
32
|
+
}
|
|
33
|
+
//# sourceMappingURL=middleware-file-loader.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware-file-loader.d.ts","sourceRoot":"","sources":["../../src/http/middleware-file-loader.ts"],"names":[],"mappings":"AAKA,OAAO,EACL,KAAK,4BAA4B,EACjC,KAAK,qBAAqB,EAE1B,KAAK,0BAA0B,EAC/B,KAAK,oBAAoB,EAE1B,MAAM,SAAS,CAAA;AAOhB;;;;GAIG;AACH,qBAAa,oBAAoB;;IAgJ/B;;;;OAIG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM;IAa/B;;OAEG;IACH,eAAe;IAIf;;OAEG;IACH,cAAc;IAId;;OAEG;IACH,yBAAyB;IAIzB;;;OAGG;IACH,gCAAgC;CAGjC"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) {
|
|
3
|
+
if (kind === "m") throw new TypeError("Private method is not writable");
|
|
4
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter");
|
|
5
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot write private member to an object whose class did not declare it");
|
|
6
|
+
return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;
|
|
7
|
+
};
|
|
8
|
+
var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) {
|
|
9
|
+
if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter");
|
|
10
|
+
if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it");
|
|
11
|
+
return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver);
|
|
12
|
+
};
|
|
13
|
+
var _MiddlewareFileLoader_instances, _MiddlewareFileLoader_errorHandler, _MiddlewareFileLoader_middleware, _MiddlewareFileLoader_additionalDataValidatorRoutes, _MiddlewareFileLoader_bodyParserConfigRoutes, _MiddlewareFileLoader_processMiddlewareFile;
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.MiddlewareFileLoader = void 0;
|
|
16
|
+
const zod_1 = require("../zod");
|
|
17
|
+
const utils_1 = require("@etohq/utils");
|
|
18
|
+
const path_1 = require("path");
|
|
19
|
+
const logger_1 = require("../logger");
|
|
20
|
+
const types_1 = require("./types");
|
|
21
|
+
/**
|
|
22
|
+
* File name that is used to indicate that the file is a middleware file
|
|
23
|
+
*/
|
|
24
|
+
const MIDDLEWARE_FILE_NAME = "middlewares";
|
|
25
|
+
/**
|
|
26
|
+
* Exposes the API to scan a directory and load the `middleware.ts` file. This file contains
|
|
27
|
+
* the configuration for certain global middlewares and core routes validators. Also, it may
|
|
28
|
+
* contain custom middlewares.
|
|
29
|
+
*/
|
|
30
|
+
class MiddlewareFileLoader {
|
|
31
|
+
constructor() {
|
|
32
|
+
_MiddlewareFileLoader_instances.add(this);
|
|
33
|
+
/**
|
|
34
|
+
* Global error handler exported from the middleware file loader
|
|
35
|
+
*/
|
|
36
|
+
_MiddlewareFileLoader_errorHandler.set(this, void 0);
|
|
37
|
+
/**
|
|
38
|
+
* Middleware collected manually or by scanning directories
|
|
39
|
+
*/
|
|
40
|
+
_MiddlewareFileLoader_middleware.set(this, []
|
|
41
|
+
/**
|
|
42
|
+
* Route matchers on which a custom additional data validator is
|
|
43
|
+
* defined
|
|
44
|
+
*/
|
|
45
|
+
);
|
|
46
|
+
/**
|
|
47
|
+
* Route matchers on which a custom additional data validator is
|
|
48
|
+
* defined
|
|
49
|
+
*/
|
|
50
|
+
_MiddlewareFileLoader_additionalDataValidatorRoutes.set(this, []
|
|
51
|
+
/**
|
|
52
|
+
* Route matchers on which a custom body parser config is used
|
|
53
|
+
*/
|
|
54
|
+
);
|
|
55
|
+
/**
|
|
56
|
+
* Route matchers on which a custom body parser config is used
|
|
57
|
+
*/
|
|
58
|
+
_MiddlewareFileLoader_bodyParserConfigRoutes.set(this, []
|
|
59
|
+
/**
|
|
60
|
+
* Processes the middleware file and returns the middleware and the
|
|
61
|
+
* routes config exported by it.
|
|
62
|
+
*/
|
|
63
|
+
);
|
|
64
|
+
}
|
|
65
|
+
/**
|
|
66
|
+
* Scans a given directory for the "middleware.ts" or "middleware.js" files and
|
|
67
|
+
* imports them for reading the registered middleware and configuration for
|
|
68
|
+
* existing routes/middleware.
|
|
69
|
+
*/
|
|
70
|
+
async scanDir(sourceDir) {
|
|
71
|
+
const fs = new utils_1.FileSystem(sourceDir);
|
|
72
|
+
if (await fs.exists(`${MIDDLEWARE_FILE_NAME}.ts`)) {
|
|
73
|
+
await __classPrivateFieldGet(this, _MiddlewareFileLoader_instances, "m", _MiddlewareFileLoader_processMiddlewareFile).call(this, (0, path_1.join)(sourceDir, `${MIDDLEWARE_FILE_NAME}.ts`));
|
|
74
|
+
}
|
|
75
|
+
else if (await fs.exists(`${MIDDLEWARE_FILE_NAME}.js`)) {
|
|
76
|
+
await __classPrivateFieldGet(this, _MiddlewareFileLoader_instances, "m", _MiddlewareFileLoader_processMiddlewareFile).call(this, (0, path_1.join)(sourceDir, `${MIDDLEWARE_FILE_NAME}.js`));
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Returns the globally registered error handler (if any)
|
|
81
|
+
*/
|
|
82
|
+
getErrorHandler() {
|
|
83
|
+
return __classPrivateFieldGet(this, _MiddlewareFileLoader_errorHandler, "f");
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Returns a collection of registered middleware
|
|
87
|
+
*/
|
|
88
|
+
getMiddlewares() {
|
|
89
|
+
return __classPrivateFieldGet(this, _MiddlewareFileLoader_middleware, "f");
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Returns routes that have bodyparser config on them
|
|
93
|
+
*/
|
|
94
|
+
getBodyParserConfigRoutes() {
|
|
95
|
+
return __classPrivateFieldGet(this, _MiddlewareFileLoader_bodyParserConfigRoutes, "f");
|
|
96
|
+
}
|
|
97
|
+
/**
|
|
98
|
+
* Returns routes that have additional validator configured
|
|
99
|
+
* on them
|
|
100
|
+
*/
|
|
101
|
+
getAdditionalDataValidatorRoutes() {
|
|
102
|
+
return __classPrivateFieldGet(this, _MiddlewareFileLoader_additionalDataValidatorRoutes, "f");
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
exports.MiddlewareFileLoader = MiddlewareFileLoader;
|
|
106
|
+
_MiddlewareFileLoader_errorHandler = new WeakMap(), _MiddlewareFileLoader_middleware = new WeakMap(), _MiddlewareFileLoader_additionalDataValidatorRoutes = new WeakMap(), _MiddlewareFileLoader_bodyParserConfigRoutes = new WeakMap(), _MiddlewareFileLoader_instances = new WeakSet(), _MiddlewareFileLoader_processMiddlewareFile =
|
|
107
|
+
/**
|
|
108
|
+
* Processes the middleware file and returns the middleware and the
|
|
109
|
+
* routes config exported by it.
|
|
110
|
+
*/
|
|
111
|
+
async function _MiddlewareFileLoader_processMiddlewareFile(absolutePath) {
|
|
112
|
+
const middlewareExports = await (0, utils_1.dynamicImport)(absolutePath);
|
|
113
|
+
if ((0, utils_1.isFileSkipped)(middlewareExports)) {
|
|
114
|
+
return;
|
|
115
|
+
}
|
|
116
|
+
const middlewareConfig = middlewareExports.default;
|
|
117
|
+
if (!middlewareConfig) {
|
|
118
|
+
logger_1.logger.warn(`No middleware configuration found in ${absolutePath}. Skipping middleware configuration.`);
|
|
119
|
+
return;
|
|
120
|
+
}
|
|
121
|
+
const routes = middlewareConfig.routes;
|
|
122
|
+
if (!routes || !Array.isArray(routes)) {
|
|
123
|
+
logger_1.logger.warn(`Invalid default export found in ${absolutePath}. Make sure to use "defineMiddlewares" function and export its output.`);
|
|
124
|
+
return;
|
|
125
|
+
}
|
|
126
|
+
const result = routes.reduce((result, route) => {
|
|
127
|
+
if (!route.matcher) {
|
|
128
|
+
throw new Error(`Middleware is missing a \`matcher\` field. The 'matcher' field is required when applying middleware. ${JSON.stringify(route, null, 2)}`);
|
|
129
|
+
}
|
|
130
|
+
const matcher = String(route.matcher);
|
|
131
|
+
if (route.bodyParser !== undefined) {
|
|
132
|
+
let methods = route.methods || [...types_1.HTTP_METHODS];
|
|
133
|
+
if (methods.includes("ALL")) {
|
|
134
|
+
methods = [...types_1.HTTP_METHODS];
|
|
135
|
+
}
|
|
136
|
+
logger_1.logger.debug(`using custom bodyparser config on matcher ${methods}:${route.matcher}`);
|
|
137
|
+
result.bodyParserConfigRoutes.push({
|
|
138
|
+
matcher: matcher,
|
|
139
|
+
methods,
|
|
140
|
+
config: route.bodyParser,
|
|
141
|
+
});
|
|
142
|
+
}
|
|
143
|
+
if (route.additionalDataValidator !== undefined) {
|
|
144
|
+
let methods = route.methods || [...types_1.HTTP_METHODS];
|
|
145
|
+
if (methods.includes("ALL")) {
|
|
146
|
+
methods = [...types_1.HTTP_METHODS];
|
|
147
|
+
}
|
|
148
|
+
logger_1.logger.debug(`assigning additionalData validator on matcher ${methods}:${route.matcher}`);
|
|
149
|
+
result.additionalDataValidatorRoutes.push({
|
|
150
|
+
matcher: matcher,
|
|
151
|
+
methods,
|
|
152
|
+
schema: route.additionalDataValidator,
|
|
153
|
+
validator: zod_1.z.object(route.additionalDataValidator).nullish(),
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
if (route.middlewares || route.policies) {
|
|
157
|
+
const middlewares = route.middlewares ?? [];
|
|
158
|
+
if (route.policies && !route.middlewares?.length) {
|
|
159
|
+
middlewares.push((_, __, next) => {
|
|
160
|
+
next();
|
|
161
|
+
});
|
|
162
|
+
}
|
|
163
|
+
middlewares.forEach((middleware) => {
|
|
164
|
+
result.middleware.push({
|
|
165
|
+
handler: middleware,
|
|
166
|
+
matcher: matcher,
|
|
167
|
+
methods: route.methods,
|
|
168
|
+
policies: route.policies,
|
|
169
|
+
});
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
return result;
|
|
173
|
+
}, {
|
|
174
|
+
bodyParserConfigRoutes: [],
|
|
175
|
+
additionalDataValidatorRoutes: [],
|
|
176
|
+
middleware: [],
|
|
177
|
+
});
|
|
178
|
+
const errorHandler = middlewareConfig.errorHandler;
|
|
179
|
+
if (errorHandler) {
|
|
180
|
+
__classPrivateFieldSet(this, _MiddlewareFileLoader_errorHandler, errorHandler, "f");
|
|
181
|
+
}
|
|
182
|
+
__classPrivateFieldSet(this, _MiddlewareFileLoader_middleware, __classPrivateFieldGet(this, _MiddlewareFileLoader_middleware, "f").concat(result.middleware), "f");
|
|
183
|
+
__classPrivateFieldSet(this, _MiddlewareFileLoader_bodyParserConfigRoutes, __classPrivateFieldGet(this, _MiddlewareFileLoader_bodyParserConfigRoutes, "f").concat(result.bodyParserConfigRoutes), "f");
|
|
184
|
+
__classPrivateFieldSet(this, _MiddlewareFileLoader_additionalDataValidatorRoutes, __classPrivateFieldGet(this, _MiddlewareFileLoader_additionalDataValidatorRoutes, "f").concat(result.additionalDataValidatorRoutes), "f");
|
|
185
|
+
};
|
|
186
|
+
//# sourceMappingURL=middleware-file-loader.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"middleware-file-loader.js","sourceRoot":"","sources":["../../src/http/middleware-file-loader.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { MedusaNextFunction, MedusaRequest, MedusaResponse } from "../types";
|
|
2
|
+
/**
|
|
3
|
+
* Middleware that resolves the locale for the current request.
|
|
4
|
+
*
|
|
5
|
+
* Resolution order:
|
|
6
|
+
* 1. Query parameter `?locale=en-US`
|
|
7
|
+
* 2. x-medusa-locale header
|
|
8
|
+
*
|
|
9
|
+
* The resolved locale is set on `req.locale`.
|
|
10
|
+
*/
|
|
11
|
+
export declare function applyLocale(req: MedusaRequest, _: MedusaResponse, next: MedusaNextFunction): Promise<void>;
|
|
12
|
+
//# sourceMappingURL=apply-locale.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-locale.d.ts","sourceRoot":"","sources":["../../../src/http/middlewares/apply-locale.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,kBAAkB,EAClB,aAAa,EACb,cAAc,EACf,MAAM,UAAU,CAAA;AAIjB;;;;;;;;GAQG;AACH,wBAAsB,WAAW,CAC/B,GAAG,EAAE,aAAa,EAClB,CAAC,EAAE,cAAc,EACjB,IAAI,EAAE,kBAAkB,iBAkBzB"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.applyLocale = applyLocale;
|
|
4
|
+
const utils_1 = require("@etohq/utils");
|
|
5
|
+
const CONTENT_LANGUAGE_HEADER = "x-medusa-locale";
|
|
6
|
+
/**
|
|
7
|
+
* Middleware that resolves the locale for the current request.
|
|
8
|
+
*
|
|
9
|
+
* Resolution order:
|
|
10
|
+
* 1. Query parameter `?locale=en-US`
|
|
11
|
+
* 2. x-medusa-locale header
|
|
12
|
+
*
|
|
13
|
+
* The resolved locale is set on `req.locale`.
|
|
14
|
+
*/
|
|
15
|
+
async function applyLocale(req, _, next) {
|
|
16
|
+
// 1. Check query parameter
|
|
17
|
+
const queryLocale = req.query.locale;
|
|
18
|
+
if (queryLocale) {
|
|
19
|
+
req.locale = (0, utils_1.normalizeLocale)(queryLocale);
|
|
20
|
+
delete req.query.locale;
|
|
21
|
+
return next();
|
|
22
|
+
}
|
|
23
|
+
// 2. Check x-medusa-locale header
|
|
24
|
+
const headerLocale = req.get(CONTENT_LANGUAGE_HEADER);
|
|
25
|
+
if (headerLocale) {
|
|
26
|
+
req.locale = (0, utils_1.normalizeLocale)(headerLocale);
|
|
27
|
+
return next();
|
|
28
|
+
}
|
|
29
|
+
return next();
|
|
30
|
+
}
|
|
31
|
+
//# sourceMappingURL=apply-locale.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply-locale.js","sourceRoot":"","sources":["../../../src/http/middlewares/apply-locale.ts"],"names":[],"mappings":";;AAkBA,kCAqBC;AAvCD,wCAA8C;AAO9C,MAAM,uBAAuB,GAAG,iBAAiB,CAAA;AAEjD;;;;;;;;GAQG;AACI,KAAK,UAAU,WAAW,CAC/B,GAAkB,EAClB,CAAiB,EACjB,IAAwB;IAExB,2BAA2B;IAC3B,MAAM,WAAW,GAAG,GAAG,CAAC,KAAK,CAAC,MAA4B,CAAA;IAC1D,IAAI,WAAW,EAAE,CAAC;QAChB,GAAG,CAAC,MAAM,GAAG,IAAA,uBAAe,EAAC,WAAW,CAAC,CAAA;QACzC,OAAO,GAAG,CAAC,KAAK,CAAC,MAAM,CAAA;QACvB,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;IAED,kCAAkC;IAClC,MAAM,YAAY,GAAG,GAAG,CAAC,GAAG,CAAC,uBAAuB,CAAC,CAAA;IACrD,IAAI,YAAY,EAAE,CAAC;QACjB,GAAG,CAAC,MAAM,GAAG,IAAA,uBAAe,EAAC,YAAY,CAAC,CAAA;QAC1C,OAAO,IAAI,EAAE,CAAA;IACf,CAAC;IAED,OAAO,IAAI,EAAE,CAAA;AACf,CAAC"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import type { MiddlewareFunction } from "../types";
|
|
2
|
+
export type PolicyAction = {
|
|
3
|
+
resource: string;
|
|
4
|
+
operation: string | string[];
|
|
5
|
+
};
|
|
6
|
+
/**
|
|
7
|
+
* Wraps a middleware or route handler with RBAC permission checking.
|
|
8
|
+
* Checks if the authenticated user has the required policies before executing the handler.
|
|
9
|
+
*
|
|
10
|
+
* @param handler - The original middleware or route handler to wrap
|
|
11
|
+
* @param policies - Single policy or array of policies to check
|
|
12
|
+
* @returns Wrapped middleware or route function that checks permissions first
|
|
13
|
+
*/
|
|
14
|
+
export declare function wrapWithPoliciesCheck(handler: MiddlewareFunction, policies: PolicyAction | PolicyAction[]): MiddlewareFunction;
|
|
15
|
+
//# sourceMappingURL=check-permissions.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-permissions.d.ts","sourceRoot":"","sources":["../../../src/http/middlewares/check-permissions.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAIV,kBAAkB,EACnB,MAAM,UAAU,CAAA;AAEjB,MAAM,MAAM,YAAY,GAAG;IACzB,QAAQ,EAAE,MAAM,CAAA;IAChB,SAAS,EAAE,MAAM,GAAG,MAAM,EAAE,CAAA;CAC7B,CAAA;AA0CD;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,EAAE,kBAAkB,EAC3B,QAAQ,EAAE,YAAY,GAAG,YAAY,EAAE,GACtC,kBAAkB,CAgBpB"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.wrapWithPoliciesCheck = wrapWithPoliciesCheck;
|
|
4
|
+
const utils_1 = require("@etohq/utils");
|
|
5
|
+
const has_permission_1 = require("../../policies/has-permission");
|
|
6
|
+
/**
|
|
7
|
+
* Core permission checking logic for middleware and routes
|
|
8
|
+
*/
|
|
9
|
+
async function checkPermissions(policies, req) {
|
|
10
|
+
// Normalize policies to array
|
|
11
|
+
const policyList = Array.isArray(policies) ? policies : [policies];
|
|
12
|
+
if (!policyList.length) {
|
|
13
|
+
return;
|
|
14
|
+
}
|
|
15
|
+
const authContext = req.auth_context;
|
|
16
|
+
// Get roles from JWT token's app_metadata
|
|
17
|
+
const roleIds = authContext?.app_metadata?.roles || [];
|
|
18
|
+
if (!roleIds.length) {
|
|
19
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.FORBIDDEN, "Forbidden");
|
|
20
|
+
}
|
|
21
|
+
const hasAccess = await (0, has_permission_1.hasPermission)({
|
|
22
|
+
roles: roleIds,
|
|
23
|
+
actions: policyList,
|
|
24
|
+
container: req.scope,
|
|
25
|
+
});
|
|
26
|
+
if (!hasAccess) {
|
|
27
|
+
const policyKeys = policyList
|
|
28
|
+
.map((p) => `${p.resource}:${p.operation}`)
|
|
29
|
+
.join(", ");
|
|
30
|
+
throw new utils_1.MedusaError(utils_1.MedusaError.Types.FORBIDDEN, `Insufficient permissions. Required policies: ${policyKeys}`);
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Wraps a middleware or route handler with RBAC permission checking.
|
|
35
|
+
* Checks if the authenticated user has the required policies before executing the handler.
|
|
36
|
+
*
|
|
37
|
+
* @param handler - The original middleware or route handler to wrap
|
|
38
|
+
* @param policies - Single policy or array of policies to check
|
|
39
|
+
* @returns Wrapped middleware or route function that checks permissions first
|
|
40
|
+
*/
|
|
41
|
+
function wrapWithPoliciesCheck(handler, policies) {
|
|
42
|
+
return async (req, res, next) => {
|
|
43
|
+
try {
|
|
44
|
+
req.policies ??= [];
|
|
45
|
+
req.policies.push(...(Array.isArray(policies) ? policies : [policies]));
|
|
46
|
+
await checkPermissions(policies, req);
|
|
47
|
+
return handler(req, res, next);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
return next(error);
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=check-permissions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"check-permissions.js","sourceRoot":"","sources":["../../../src/http/middlewares/check-permissions.ts"],"names":[],"mappings":";;AA8DA,sDAmBC;AAjFD,wCAA0C;AAC1C,kEAA6D;AAa7D;;GAEG;AACH,KAAK,UAAU,gBAAgB,CAC7B,QAAuC,EACvC,GAA+B;IAE/B,8BAA8B;IAC9B,MAAM,UAAU,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAA;IAElE,IAAI,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC;QACvB,OAAM;IACR,CAAC;IAED,MAAM,WAAW,GAAG,GAAG,CAAC,YAAY,CAAA;IACpC,0CAA0C;IAC1C,MAAM,OAAO,GAAI,WAAW,EAAE,YAAY,EAAE,KAAkB,IAAI,EAAE,CAAA;IAEpE,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,IAAI,mBAAW,CAAC,mBAAW,CAAC,KAAK,CAAC,SAAS,EAAE,WAAW,CAAC,CAAA;IACjE,CAAC;IAED,MAAM,SAAS,GAAG,MAAM,IAAA,8BAAa,EAAC;QACpC,KAAK,EAAE,OAAO;QACd,OAAO,EAAE,UAAU;QACnB,SAAS,EAAE,GAAG,CAAC,KAAK;KACrB,CAAC,CAAA;IAEF,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,MAAM,UAAU,GAAG,UAAU;aAC1B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,QAAQ,IAAI,CAAC,CAAC,SAAS,EAAE,CAAC;aAC1C,IAAI,CAAC,IAAI,CAAC,CAAA;QAEb,MAAM,IAAI,mBAAW,CACnB,mBAAW,CAAC,KAAK,CAAC,SAAS,EAC3B,gDAAgD,UAAU,EAAE,CAC7D,CAAA;IACH,CAAC;AACH,CAAC;AAED;;;;;;;GAOG;AACH,SAAgB,qBAAqB,CACnC,OAA2B,EAC3B,QAAuC;IAEvC,OAAO,KAAK,EACV,GAA+B,EAC/B,GAAmB,EACnB,IAAwB,EACxB,EAAE;QACF,IAAI,CAAC;YACH,GAAG,CAAC,QAAQ,KAAK,EAAE,CAAA;YACnB,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;YAEvE,MAAM,gBAAgB,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAA;YACrC,OAAO,OAAO,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,CAAC,CAAA;QAChC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,OAAO,IAAI,CAAC,KAAK,CAAC,CAAA;QACpB,CAAC;IACH,CAAC,CAAA;AACH,CAAC"}
|