UNPKG

@medusajs/framework

Version:
191 lines • 11.2 kB
"use strict"; var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); 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"); return (kind === "a" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value; }; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); 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"); return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); }; var _MedusaAppLoader_container, _MedusaAppLoader_customLinksModules; Object.defineProperty(exports, "__esModule", { value: true }); exports.MedusaAppLoader = void 0; const modules_sdk_1 = require("@medusajs/modules-sdk"); const utils_1 = require("@medusajs/utils"); const awilix_1 = require("awilix"); const config_1 = require("./config"); const container_1 = require("./container"); class MedusaAppLoader { // TODO: Adjust all loaders to accept an optional container such that in test env it is possible if needed to provide a specific container otherwise use the main container // Maybe also adjust the different places to resolve the config from the container instead of the configManager for the same reason // To be discussed constructor({ container, customLinksModules, } = {}) { /** * Container from where to resolve resources * @private */ _MedusaAppLoader_container.set(this, void 0); /** * Extra links modules config which should be added manually to the links to be loaded * @private */ _MedusaAppLoader_customLinksModules.set(this, void 0); __classPrivateFieldSet(this, _MedusaAppLoader_container, container ?? container_1.container, "f"); __classPrivateFieldSet(this, _MedusaAppLoader_customLinksModules, customLinksModules ?? [], "f"); } mergeDefaultModules(modulesConfig) { const defaultModules = Object.values(modules_sdk_1.ModulesDefinition).filter((definition) => { return !!definition.defaultPackage; }); const configModules = { ...modulesConfig }; for (const defaultModule of defaultModules) { configModules[defaultModule.key] ??= defaultModule.defaultModuleDeclaration; } for (const [key, value] of Object.entries(configModules)) { const def = {}; def.key ??= key; def.label ??= modules_sdk_1.ModulesDefinition[key]?.label ?? (0, utils_1.upperCaseFirst)(key); def.dependencies ??= modules_sdk_1.ModulesDefinition[key]?.dependencies; def.isQueryable = modules_sdk_1.ModulesDefinition[key]?.isQueryable ?? true; const orignalDef = value?.definition ?? modules_sdk_1.ModulesDefinition[key]; if (!(0, utils_1.isBoolean)(value) && ((0, utils_1.isObject)(orignalDef) || !(0, utils_1.isPresent)(value.definition))) { value.definition = { ...def, ...orignalDef, }; } } return configModules; } prepareSharedResourcesAndDeps() { const injectedDependencies = { [utils_1.ContainerRegistrationKeys.PG_CONNECTION]: __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").resolve(utils_1.ContainerRegistrationKeys.PG_CONNECTION), [utils_1.ContainerRegistrationKeys.LOGGER]: __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").resolve(utils_1.ContainerRegistrationKeys.LOGGER), }; const driverOptions = { ...(config_1.configManager.config.projectConfig.databaseDriverOptions ?? {}), }; const pool = driverOptions.pool ?? {}; delete driverOptions.pool; const sharedResourcesConfig = { database: { clientUrl: injectedDependencies[utils_1.ContainerRegistrationKeys.PG_CONNECTION]?.client ?.config?.connection?.connectionString ?? config_1.configManager.config.projectConfig.databaseUrl, driverOptions: config_1.configManager.config.projectConfig.databaseDriverOptions, pool: pool, debug: config_1.configManager.config.projectConfig.databaseLogging ?? false, schema: config_1.configManager.config.projectConfig.databaseSchema, database: config_1.configManager.config.projectConfig.databaseName, }, }; return { sharedResourcesConfig, injectedDependencies }; } /** * Run, Revert or Generate the migrations for the medusa app. * * @param moduleNames * @param linkModules * @param action */ async runModulesMigrations({ moduleNames, action = "run", } = { action: "run", }) { const configModules = this.mergeDefaultModules(config_1.configManager.config.modules); const { sharedResourcesConfig, injectedDependencies } = this.prepareSharedResourcesAndDeps(); const migrationOptions = { modulesConfig: configModules, sharedContainer: __classPrivateFieldGet(this, _MedusaAppLoader_container, "f"), linkModules: __classPrivateFieldGet(this, _MedusaAppLoader_customLinksModules, "f"), sharedResourcesConfig, injectedDependencies, }; if (action === "revert") { await (0, modules_sdk_1.MedusaAppMigrateDown)(moduleNames, migrationOptions); } else if (action === "run") { await (0, modules_sdk_1.MedusaAppMigrateUp)(migrationOptions); } else { await (0, modules_sdk_1.MedusaAppMigrateGenerate)(moduleNames, migrationOptions); } } /** * Return an instance of the link module migration planner. */ async getLinksExecutionPlanner() { const configModules = this.mergeDefaultModules(config_1.configManager.config.modules); const { sharedResourcesConfig, injectedDependencies } = this.prepareSharedResourcesAndDeps(); const migrationOptions = { modulesConfig: configModules, sharedContainer: __classPrivateFieldGet(this, _MedusaAppLoader_container, "f"), linkModules: __classPrivateFieldGet(this, _MedusaAppLoader_customLinksModules, "f"), sharedResourcesConfig, injectedDependencies, }; return await (0, modules_sdk_1.MedusaAppGetLinksExecutionPlanner)(migrationOptions); } /** * Run the modules loader without taking care of anything else. This is useful for running the loader as a separate action or to re run all modules loaders. */ async runModulesLoader() { const { sharedResourcesConfig, injectedDependencies } = this.prepareSharedResourcesAndDeps(); const configModules = this.mergeDefaultModules(config_1.configManager.config.modules); await (0, modules_sdk_1.MedusaApp)({ modulesConfig: configModules, sharedContainer: __classPrivateFieldGet(this, _MedusaAppLoader_container, "f"), linkModules: __classPrivateFieldGet(this, _MedusaAppLoader_customLinksModules, "f"), sharedResourcesConfig, injectedDependencies, loaderOnly: true, }); } /** * Load all modules and bootstrap all the modules and links to be ready to be consumed * @param config */ async load(config = { registerInContainer: true }) { const configModule = __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").resolve(utils_1.ContainerRegistrationKeys.CONFIG_MODULE); const { sharedResourcesConfig, injectedDependencies } = this.prepareSharedResourcesAndDeps(); __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").register(utils_1.ContainerRegistrationKeys.REMOTE_QUERY, (0, awilix_1.asValue)(undefined)); __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").register(utils_1.ContainerRegistrationKeys.QUERY, (0, awilix_1.asValue)(undefined)); __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").register(utils_1.ContainerRegistrationKeys.LINK, (0, awilix_1.asValue)(undefined)); __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").register(utils_1.ContainerRegistrationKeys.REMOTE_LINK, (0, awilix_1.aliasTo)(utils_1.ContainerRegistrationKeys.LINK)); const configModules = this.mergeDefaultModules(configModule.modules); const medusaApp = await (0, modules_sdk_1.MedusaApp)({ workerMode: configModule.projectConfig.workerMode, modulesConfig: configModules, sharedContainer: __classPrivateFieldGet(this, _MedusaAppLoader_container, "f"), linkModules: __classPrivateFieldGet(this, _MedusaAppLoader_customLinksModules, "f"), sharedResourcesConfig, injectedDependencies, }); if (!config.registerInContainer) { return medusaApp; } __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").register(utils_1.ContainerRegistrationKeys.LINK, (0, awilix_1.asValue)(medusaApp.link)); __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").register(utils_1.ContainerRegistrationKeys.REMOTE_LINK, (0, awilix_1.aliasTo)(utils_1.ContainerRegistrationKeys.LINK)); __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").register(utils_1.ContainerRegistrationKeys.REMOTE_QUERY, (0, awilix_1.asValue)(medusaApp.query)); __classPrivateFieldGet(this, _MedusaAppLoader_container, "f").register(utils_1.ContainerRegistrationKeys.QUERY, (0, awilix_1.asValue)(medusaApp.query)); for (const moduleService of Object.values(medusaApp.modules)) { const loadedModule = moduleService; container_1.container.register(loadedModule.__definition.key, (0, awilix_1.asValue)(moduleService)); } // Register all unresolved modules as undefined to be present in the container with undefined value by default // but still resolvable for (const moduleDefinition of Object.values(modules_sdk_1.ModulesDefinition)) { if (!container_1.container.hasRegistration(moduleDefinition.key)) { container_1.container.register(moduleDefinition.key, (0, awilix_1.asValue)(undefined)); } } return medusaApp; } } exports.MedusaAppLoader = MedusaAppLoader; _MedusaAppLoader_container = new WeakMap(), _MedusaAppLoader_customLinksModules = new WeakMap(); //# sourceMappingURL=medusa-app-loader.js.map