@lodashventure/medusa-login-provider 0.0.6

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.
@@ -0,0 +1,11 @@
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
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const service_1 = __importDefault(require("./service"));
8
+ exports.default = (0, utils_1.ModuleProvider)(utils_1.Modules.AUTH, {
9
+ services: [service_1.default],
10
+ });
11
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi8uLi8uLi9zcmMvcHJvdmlkZXJzL2xpbmUvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7QUFBQSxxREFBb0U7QUFDcEUsd0RBQTRDO0FBRTVDLGtCQUFlLElBQUEsc0JBQWMsRUFBQyxlQUFPLENBQUMsSUFBSSxFQUFFO0lBQzFDLFFBQVEsRUFBRSxDQUFDLGlCQUFtQixDQUFDO0NBQ2hDLENBQUMsQ0FBQyJ9
@@ -0,0 +1,140 @@
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
+ const utils_1 = require("@medusajs/framework/utils");
7
+ const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
8
+ const crypto_1 = __importDefault(require("crypto"));
9
+ class LineProviderService extends utils_1.AbstractAuthModuleProvider {
10
+ constructor({ logger }, options) {
11
+ super();
12
+ this.logger_ = logger;
13
+ this.options_ = options;
14
+ }
15
+ static validateOptions(options) {
16
+ if (!options.lineChannelId) {
17
+ throw new Error("line channel id is required");
18
+ }
19
+ if (!options.lineChannelSecret) {
20
+ throw new Error("line channel secret is required");
21
+ }
22
+ if (!options.lineChannelId) {
23
+ throw new Error("redirect url is required");
24
+ }
25
+ }
26
+ async register(data, authIdentityService) {
27
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.NOT_ALLOWED, "Line does not support registration. Use method `authenticate` instead.");
28
+ }
29
+ async authenticate(data, authIdentityService) {
30
+ const query = data.query ?? {};
31
+ const body = data.body ?? {};
32
+ if (query.error) {
33
+ return {
34
+ success: false,
35
+ error: `${query.error_description}, read more at: ${query.error_uri}`,
36
+ };
37
+ }
38
+ const stateKey = crypto_1.default.randomBytes(32).toString("hex");
39
+ const state = {
40
+ callback_url: body?.callback_url ?? this.options_.lineRedirectUrl,
41
+ };
42
+ await authIdentityService.setState(stateKey, state);
43
+ return this.getRedirect(this.options_.lineChannelId, state.callback_url, stateKey);
44
+ }
45
+ async validateCallback(req, authIdentityService) {
46
+ const query = req.query ?? {};
47
+ const body = req.body ?? {};
48
+ if (query.error) {
49
+ return {
50
+ success: false,
51
+ error: `${query.error_description}, read more at: ${query.error_uri}`,
52
+ };
53
+ }
54
+ const code = query?.code ?? body?.code;
55
+ if (!code) {
56
+ return { success: false, error: "No code provided" };
57
+ }
58
+ const state = await authIdentityService.getState(query?.state);
59
+ if (!state) {
60
+ return { success: false, error: "No state provided, or session expired" };
61
+ }
62
+ try {
63
+ const response = await fetch("https://api.line.me/oauth2/v2.1/token", {
64
+ method: "POST",
65
+ headers: {
66
+ "Content-Type": "application/x-www-form-urlencoded",
67
+ },
68
+ body: new URLSearchParams({
69
+ grant_type: "authorization_code",
70
+ code: code,
71
+ client_id: this.options_.lineChannelId,
72
+ client_secret: this.options_.lineChannelSecret,
73
+ redirect_uri: state.callback_url,
74
+ }),
75
+ }).then((r) => {
76
+ if (!r.ok) {
77
+ throw new utils_1.MedusaError(utils_1.MedusaError.Types.INVALID_DATA, `Could not exchange token, ${r.status}, ${r.statusText}`);
78
+ }
79
+ return r.json();
80
+ });
81
+ const { authIdentity, success } = await this.verify_(response.id_token, authIdentityService);
82
+ return {
83
+ success,
84
+ authIdentity,
85
+ };
86
+ }
87
+ catch (error) {
88
+ return { success: false, error: error.message };
89
+ }
90
+ }
91
+ async verify_(idToken, authIdentityService) {
92
+ if (!idToken) {
93
+ return { success: false, error: "No ID found" };
94
+ }
95
+ const jwtData = jsonwebtoken_1.default.decode(idToken, {
96
+ complete: true,
97
+ });
98
+ const payload = jwtData.payload;
99
+ const entity_id = payload.sub;
100
+ const userMetadata = {
101
+ name: payload.name,
102
+ picture: payload.picture,
103
+ };
104
+ let authIdentity;
105
+ try {
106
+ authIdentity = await authIdentityService.retrieve({
107
+ entity_id,
108
+ });
109
+ }
110
+ catch (error) {
111
+ if (error.type === utils_1.MedusaError.Types.NOT_FOUND) {
112
+ const createdAuthIdentity = await authIdentityService.create({
113
+ entity_id,
114
+ user_metadata: userMetadata,
115
+ });
116
+ authIdentity = createdAuthIdentity;
117
+ }
118
+ else {
119
+ return { success: false, error: error.message };
120
+ }
121
+ }
122
+ return {
123
+ success: true,
124
+ authIdentity,
125
+ };
126
+ }
127
+ getRedirect(clientId, callbackUrl, stateKey) {
128
+ const authUrl = new URL(`https://access.line.me/oauth2/v2.1/authorize`);
129
+ authUrl.searchParams.set("response_type", "code");
130
+ authUrl.searchParams.set("scope", "profile openid");
131
+ authUrl.searchParams.set("client_id", clientId);
132
+ authUrl.searchParams.set("redirect_uri", callbackUrl);
133
+ authUrl.searchParams.set("state", stateKey);
134
+ return { success: true, location: authUrl.toString() };
135
+ }
136
+ }
137
+ LineProviderService.identifier = "line";
138
+ LineProviderService.DISPLAY_NAME = "LINE";
139
+ exports.default = LineProviderService;
140
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VydmljZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uL3NyYy9wcm92aWRlcnMvbGluZS9zZXJ2aWNlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBQUEscURBR21DO0FBT25DLGdFQUErQztBQUMvQyxvREFBNEI7QUFZNUIsTUFBTSxtQkFBb0IsU0FBUSxrQ0FBMEI7SUFNMUQsWUFBWSxFQUFFLE1BQU0sRUFBd0IsRUFBRSxPQUFnQjtRQUM1RCxLQUFLLEVBQUUsQ0FBQztRQUVSLElBQUksQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO1FBQ3RCLElBQUksQ0FBQyxRQUFRLEdBQUcsT0FBTyxDQUFDO0lBQzFCLENBQUM7SUFFRCxNQUFNLENBQUMsZUFBZSxDQUFDLE9BQXlCO1FBQzlDLElBQUksQ0FBQyxPQUFPLENBQUMsYUFBYSxFQUFFLENBQUM7WUFDM0IsTUFBTSxJQUFJLEtBQUssQ0FBQyw2QkFBNkIsQ0FBQyxDQUFDO1FBQ2pELENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLGlCQUFpQixFQUFFLENBQUM7WUFDL0IsTUFBTSxJQUFJLEtBQUssQ0FBQyxpQ0FBaUMsQ0FBQyxDQUFDO1FBQ3JELENBQUM7UUFDRCxJQUFJLENBQUMsT0FBTyxDQUFDLGFBQWEsRUFBRSxDQUFDO1lBQzNCLE1BQU0sSUFBSSxLQUFLLENBQUMsMEJBQTBCLENBQUMsQ0FBQztRQUM5QyxDQUFDO0lBQ0gsQ0FBQztJQUVELEtBQUssQ0FBQyxRQUFRLENBQ1osSUFBeUIsRUFDekIsbUJBQWdEO1FBRWhELE1BQU0sSUFBSSxtQkFBVyxDQUNuQixtQkFBVyxDQUFDLEtBQUssQ0FBQyxXQUFXLEVBQzdCLHdFQUF3RSxDQUN6RSxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxZQUFZLENBQ2hCLElBQXlCLEVBQ3pCLG1CQUFnRDtRQUVoRCxNQUFNLEtBQUssR0FBMkIsSUFBSSxDQUFDLEtBQUssSUFBSSxFQUFFLENBQUM7UUFDdkQsTUFBTSxJQUFJLEdBQTJCLElBQUksQ0FBQyxJQUFJLElBQUksRUFBRSxDQUFDO1FBRXJELElBQUksS0FBSyxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ2hCLE9BQU87Z0JBQ0wsT0FBTyxFQUFFLEtBQUs7Z0JBQ2QsS0FBSyxFQUFFLEdBQUcsS0FBSyxDQUFDLGlCQUFpQixtQkFBbUIsS0FBSyxDQUFDLFNBQVMsRUFBRTthQUN0RSxDQUFDO1FBQ0osQ0FBQztRQUVELE1BQU0sUUFBUSxHQUFHLGdCQUFNLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsQ0FBQztRQUN4RCxNQUFNLEtBQUssR0FBRztZQUNaLFlBQVksRUFBRSxJQUFJLEVBQUUsWUFBWSxJQUFJLElBQUksQ0FBQyxRQUFRLENBQUMsZUFBZTtTQUNsRSxDQUFDO1FBRUYsTUFBTSxtQkFBbUIsQ0FBQyxRQUFRLENBQUMsUUFBUSxFQUFFLEtBQUssQ0FBQyxDQUFDO1FBQ3BELE9BQU8sSUFBSSxDQUFDLFdBQVcsQ0FDckIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhLEVBQzNCLEtBQUssQ0FBQyxZQUFZLEVBQ2xCLFFBQVEsQ0FDVCxDQUFDO0lBQ0osQ0FBQztJQUVELEtBQUssQ0FBQyxnQkFBZ0IsQ0FDcEIsR0FBd0IsRUFDeEIsbUJBQWdEO1FBRWhELE1BQU0sS0FBSyxHQUEyQixHQUFHLENBQUMsS0FBSyxJQUFJLEVBQUUsQ0FBQztRQUN0RCxNQUFNLElBQUksR0FBMkIsR0FBRyxDQUFDLElBQUksSUFBSSxFQUFFLENBQUM7UUFFcEQsSUFBSSxLQUFLLENBQUMsS0FBSyxFQUFFLENBQUM7WUFDaEIsT0FBTztnQkFDTCxPQUFPLEVBQUUsS0FBSztnQkFDZCxLQUFLLEVBQUUsR0FBRyxLQUFLLENBQUMsaUJBQWlCLG1CQUFtQixLQUFLLENBQUMsU0FBUyxFQUFFO2FBQ3RFLENBQUM7UUFDSixDQUFDO1FBRUQsTUFBTSxJQUFJLEdBQUcsS0FBSyxFQUFFLElBQUksSUFBSSxJQUFJLEVBQUUsSUFBSSxDQUFDO1FBQ3ZDLElBQUksQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNWLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxrQkFBa0IsRUFBRSxDQUFDO1FBQ3ZELENBQUM7UUFFRCxNQUFNLEtBQUssR0FBRyxNQUFNLG1CQUFtQixDQUFDLFFBQVEsQ0FBQyxLQUFLLEVBQUUsS0FBZSxDQUFDLENBQUM7UUFDekUsSUFBSSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxFQUFFLE9BQU8sRUFBRSxLQUFLLEVBQUUsS0FBSyxFQUFFLHVDQUF1QyxFQUFFLENBQUM7UUFDNUUsQ0FBQztRQUVELElBQUksQ0FBQztZQUNILE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSyxDQUFDLHVDQUF1QyxFQUFFO2dCQUNwRSxNQUFNLEVBQUUsTUFBTTtnQkFDZCxPQUFPLEVBQUU7b0JBQ1AsY0FBYyxFQUFFLG1DQUFtQztpQkFDcEQ7Z0JBQ0QsSUFBSSxFQUFFLElBQUksZUFBZSxDQUFDO29CQUN4QixVQUFVLEVBQUUsb0JBQW9CO29CQUNoQyxJQUFJLEVBQUUsSUFBSTtvQkFDVixTQUFTLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxhQUFhO29CQUN0QyxhQUFhLEVBQUUsSUFBSSxDQUFDLFFBQVEsQ0FBQyxpQkFBaUI7b0JBQzlDLFlBQVksRUFBRSxLQUFLLENBQUMsWUFBc0I7aUJBQzNDLENBQUM7YUFDSCxDQUFDLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUU7Z0JBQ1osSUFBSSxDQUFDLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQztvQkFDVixNQUFNLElBQUksbUJBQVcsQ0FDbkIsbUJBQVcsQ0FBQyxLQUFLLENBQUMsWUFBWSxFQUM5Qiw2QkFBNkIsQ0FBQyxDQUFDLE1BQU0sS0FBSyxDQUFDLENBQUMsVUFBVSxFQUFFLENBQ3pELENBQUM7Z0JBQ0osQ0FBQztnQkFFRCxPQUFPLENBQUMsQ0FBQyxJQUFJLEVBQUUsQ0FBQztZQUNsQixDQUFDLENBQUMsQ0FBQztZQUVILE1BQU0sRUFBRSxZQUFZLEVBQUUsT0FBTyxFQUFFLEdBQUcsTUFBTSxJQUFJLENBQUMsT0FBTyxDQUNsRCxRQUFRLENBQUMsUUFBa0IsRUFDM0IsbUJBQW1CLENBQ3BCLENBQUM7WUFFRixPQUFPO2dCQUNMLE9BQU87Z0JBQ1AsWUFBWTthQUNiLENBQUM7UUFDSixDQUFDO1FBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztZQUNmLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7UUFDbEQsQ0FBQztJQUNILENBQUM7SUFFRCxLQUFLLENBQUMsT0FBTyxDQUNYLE9BQTJCLEVBQzNCLG1CQUFnRDtRQUVoRCxJQUFJLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDYixPQUFPLEVBQUUsT0FBTyxFQUFFLEtBQUssRUFBRSxLQUFLLEVBQUUsYUFBYSxFQUFFLENBQUM7UUFDbEQsQ0FBQztRQUVELE1BQU0sT0FBTyxHQUFHLHNCQUFHLENBQUMsTUFBTSxDQUFDLE9BQU8sRUFBRTtZQUNsQyxRQUFRLEVBQUUsSUFBSTtTQUNmLENBQWUsQ0FBQztRQUNqQixNQUFNLE9BQU8sR0FBRyxPQUFPLENBQUMsT0FBTyxDQUFDO1FBRWhDLE1BQU0sU0FBUyxHQUFHLE9BQU8sQ0FBQyxHQUFHLENBQUM7UUFDOUIsTUFBTSxZQUFZLEdBQUc7WUFDbkIsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJO1lBQ2xCLE9BQU8sRUFBRSxPQUFPLENBQUMsT0FBTztTQUN6QixDQUFDO1FBRUYsSUFBSSxZQUFZLENBQUM7UUFFakIsSUFBSSxDQUFDO1lBQ0gsWUFBWSxHQUFHLE1BQU0sbUJBQW1CLENBQUMsUUFBUSxDQUFDO2dCQUNoRCxTQUFTO2FBQ1YsQ0FBQyxDQUFDO1FBQ0wsQ0FBQztRQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7WUFDZixJQUFJLEtBQUssQ0FBQyxJQUFJLEtBQUssbUJBQVcsQ0FBQyxLQUFLLENBQUMsU0FBUyxFQUFFLENBQUM7Z0JBQy9DLE1BQU0sbUJBQW1CLEdBQUcsTUFBTSxtQkFBbUIsQ0FBQyxNQUFNLENBQUM7b0JBQzNELFNBQVM7b0JBQ1QsYUFBYSxFQUFFLFlBQVk7aUJBQzVCLENBQUMsQ0FBQztnQkFDSCxZQUFZLEdBQUcsbUJBQW1CLENBQUM7WUFDckMsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE9BQU8sRUFBRSxPQUFPLEVBQUUsS0FBSyxFQUFFLEtBQUssRUFBRSxLQUFLLENBQUMsT0FBTyxFQUFFLENBQUM7WUFDbEQsQ0FBQztRQUNILENBQUM7UUFFRCxPQUFPO1lBQ0wsT0FBTyxFQUFFLElBQUk7WUFDYixZQUFZO1NBQ2IsQ0FBQztJQUNKLENBQUM7SUFFTyxXQUFXLENBQUMsUUFBZ0IsRUFBRSxXQUFtQixFQUFFLFFBQWdCO1FBQ3pFLE1BQU0sT0FBTyxHQUFHLElBQUksR0FBRyxDQUFDLDhDQUE4QyxDQUFDLENBQUM7UUFDeEUsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsZUFBZSxFQUFFLE1BQU0sQ0FBQyxDQUFDO1FBQ2xELE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLE9BQU8sRUFBRSxnQkFBZ0IsQ0FBQyxDQUFDO1FBQ3BELE9BQU8sQ0FBQyxZQUFZLENBQUMsR0FBRyxDQUFDLFdBQVcsRUFBRSxRQUFRLENBQUMsQ0FBQztRQUNoRCxPQUFPLENBQUMsWUFBWSxDQUFDLEdBQUcsQ0FBQyxjQUFjLEVBQUUsV0FBVyxDQUFDLENBQUM7UUFDdEQsT0FBTyxDQUFDLFlBQVksQ0FBQyxHQUFHLENBQUMsT0FBTyxFQUFFLFFBQVEsQ0FBQyxDQUFDO1FBRTVDLE9BQU8sRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFFBQVEsRUFBRSxPQUFPLENBQUMsUUFBUSxFQUFFLEVBQUUsQ0FBQztJQUN6RCxDQUFDOztBQS9LTSw4QkFBVSxHQUFHLE1BQU0sQ0FBQztBQUNwQixnQ0FBWSxHQUFHLE1BQU0sQ0FBQztBQWlML0Isa0JBQWUsbUJBQW1CLENBQUMifQ==
package/README.md ADDED
@@ -0,0 +1,58 @@
1
+ # Medusa Plugin Login-Provider
2
+
3
+ ## How to install
4
+ 1. yarn add medusa-login-provider
5
+
6
+ 2. configure your medusa backend `medusa-config.ts`
7
+ ```ts
8
+ module.exports = defineConfig({
9
+ // ... rest of the config
10
+ modules: [
11
+ {
12
+ resolve: "@medusajs/medusa/auth",
13
+ options: {
14
+ providers: [
15
+ // default provider (don't remove this if you want to use email+pass)
16
+ {
17
+ resolve: "@medusajs/medusa/auth-emailpass",
18
+ dependencies: [Modules.CACHE, ContainerRegistrationKeys.LOGGER],
19
+ id: "emailpass",
20
+ },
21
+ // line provider
22
+ {
23
+ resolve: "medusa-login-provider/providers/line",
24
+ id: "line",
25
+ dependencies: [Modules.CACHE, ContainerRegistrationKeys.LOGGER],
26
+ options: {
27
+ lineChannelId: process.env.LINE_CHANNEL_ID,
28
+ lineChannelSecret: process.env.LINE_CHANNEL_SECRET,
29
+ lineRedirectUrl: process.env.LINE_REDIRECT_URL,
30
+ },
31
+ },
32
+ ],
33
+ },
34
+ },
35
+ ],
36
+ });
37
+
38
+ ```
39
+
40
+ 3. add callback url to your line channel
41
+ ```
42
+ https://your.medusa.core.domain/auth/customer/line/callback/
43
+ ```
44
+
45
+ 4. add variables to .env
46
+ ```
47
+ LINE_CHANNEL_ID=<line-channel-id>
48
+ LINE_CHANNEL_SECRET=<line-channel-secret>
49
+ LINE_REDIRECT_URL=<line-redirect-url>
50
+ ```
51
+
52
+ all done now just start your medusa backend
53
+ `yarn dev` `yarn start` or whatever you use to start your backend
54
+
55
+
56
+ ## login with line
57
+ 1. create login button or just make a call to `GET https://your.medusa.core.domain/auth/user/line`
58
+ 2. you'll get response with `token`
package/package.json ADDED
@@ -0,0 +1,80 @@
1
+ {
2
+ "name": "@lodashventure/medusa-login-provider",
3
+ "version": "0.0.6",
4
+ "description": "A starter for Medusa plugins.",
5
+ "author": "Medusa (https://medusajs.com)",
6
+ "license": "MIT",
7
+ "files": [
8
+ ".medusa/server"
9
+ ],
10
+ "exports": {
11
+ "./package.json": "./package.json",
12
+ "./workflows": "./.medusa/server/src/workflows/index.js",
13
+ "./.medusa/server/src/modules/*": "./.medusa/server/src/modules/*/index.js",
14
+ "./modules/*": "./.medusa/server/src/modules/*/index.js",
15
+ "./providers/*": "./.medusa/server/src/providers/*/index.js",
16
+ "./*": "./.medusa/server/src/*.js"
17
+ },
18
+ "keywords": [
19
+ "medusa",
20
+ "plugin",
21
+ "medusa-plugin-other",
22
+ "medusa-plugin",
23
+ "medusa-v2"
24
+ ],
25
+ "scripts": {
26
+ "build": "medusa plugin:build",
27
+ "dev": "medusa plugin:develop",
28
+ "prepublishOnly": "medusa plugin:build"
29
+ },
30
+ "devDependencies": {
31
+ "@medusajs/admin-sdk": "2.4.0",
32
+ "@medusajs/cli": "2.4.0",
33
+ "@medusajs/framework": "2.4.0",
34
+ "@medusajs/icons": "2.4.0",
35
+ "@medusajs/medusa": "2.4.0",
36
+ "@medusajs/test-utils": "2.4.0",
37
+ "@medusajs/ui": "4.0.4",
38
+ "@mikro-orm/cli": "6.4.3",
39
+ "@mikro-orm/core": "6.4.3",
40
+ "@mikro-orm/knex": "6.4.3",
41
+ "@mikro-orm/migrations": "6.4.3",
42
+ "@mikro-orm/postgresql": "6.4.3",
43
+ "@swc/core": "1.5.7",
44
+ "@types/jsonwebtoken": "^9",
45
+ "@types/node": "^20.0.0",
46
+ "@types/react": "^18.3.2",
47
+ "@types/react-dom": "^18.2.25",
48
+ "awilix": "^8.0.1",
49
+ "pg": "^8.13.0",
50
+ "prop-types": "^15.8.1",
51
+ "react": "^18.2.0",
52
+ "react-dom": "^18.2.0",
53
+ "ts-node": "^10.9.2",
54
+ "typescript": "^5.6.2",
55
+ "vite": "^5.2.11",
56
+ "yalc": "^1.0.0-pre.53"
57
+ },
58
+ "peerDependencies": {
59
+ "@medusajs/admin-sdk": "2.4.0",
60
+ "@medusajs/cli": "2.4.0",
61
+ "@medusajs/framework": "2.4.0",
62
+ "@medusajs/icons": "2.4.0",
63
+ "@medusajs/medusa": "2.4.0",
64
+ "@medusajs/test-utils": "2.4.0",
65
+ "@medusajs/ui": "4.0.3",
66
+ "@mikro-orm/cli": "6.4.3",
67
+ "@mikro-orm/core": "6.4.3",
68
+ "@mikro-orm/knex": "6.4.3",
69
+ "@mikro-orm/migrations": "6.4.3",
70
+ "@mikro-orm/postgresql": "6.4.3",
71
+ "awilix": "^8.0.1",
72
+ "pg": "^8.13.0"
73
+ },
74
+ "engines": {
75
+ "node": ">=20"
76
+ },
77
+ "dependencies": {
78
+ "jsonwebtoken": "^9.0.2"
79
+ }
80
+ }