Sfoglia il codice sorgente

added build & dev scripts + mikro orm deps

Shahed Nasser 1 anno fa
parent
commit
5157f6ae8c
4 ha cambiato i file con 557 aggiunte e 20 eliminazioni
  1. 108 0
      build.mjs
  2. 243 0
      develop.mjs
  3. 10 4
      package.json
  4. 196 16
      yarn.lock

+ 108 - 0
build.mjs

@@ -0,0 +1,108 @@
+import swc from "@swc/core";
+import fs from "node:fs/promises";
+import path from "path";
+
+const inputDir = "./src";
+const outputDir = "./dist";
+const compileExtensions = [".ts", ".tsx", ".js", ".jsx"];
+const ignoreExtensions = [".md"];
+const dryRun = false;
+
+const started = Date.now();
+
+const inputDirName = path.basename(inputDir);
+const outputDirName = path.basename(outputDir);
+
+// Recursively find all files to compile
+const findFiles = async (dir, { allowNonExistent } = {}) => {
+  try {
+    let files = await fs.readdir(dir, { withFileTypes: true });
+    let paths = await Promise.all(
+      files.map(async (file) => {
+        const res = path.join(dir, file.name);
+        return file.isDirectory() ? findFiles(res) : res;
+      }),
+    );
+    return paths.flat();
+  } catch (e) {
+    if (allowNonExistent && e.code === "ENOENT") {
+      return [];
+    }
+    throw e;
+  }
+};
+
+const files = await findFiles(inputDir);
+
+// Clear out dir
+await fs.rm(outputDir, { recursive: true }).catch(() => {});
+
+const getOutputPath = (file, config) => {
+  const { inputDir, outputDir, targetExtension } = config;
+
+  const relativePath = file.replace(inputDirName, outputDirName);
+  let outputPath = relativePath;
+
+  if (targetExtension) {
+    const currentExtension = path.extname(outputPath);
+    outputPath = outputPath.replace(currentExtension, targetExtension);
+  }
+
+  return outputPath;
+};
+
+const writeToOut = async (file, content, config) => {
+  const outputPath = getOutputPath(file, config);
+  if (dryRun) {
+    console.log(`Writing ${file} to ${outputPath}`);
+    return;
+  }
+  await fs.mkdir(outputPath.replace(/\/[^/]+$/, ""), { recursive: true });
+  await fs.writeFile(outputPath, content);
+};
+
+const copyToOut = async (file, config) => {
+  const outputPath = getOutputPath(file, config);
+
+  if (dryRun) {
+    console.log(`Copying ${file} to ${outputPath}`);
+    return;
+  }
+  await fs.mkdir(outputPath.replace(/\/[^/]+$/, ""), { recursive: true });
+  await fs.copyFile(file, outputPath);
+};
+
+const medusaTransform = async (file) => {
+  if (compileExtensions.some((ext) => file.endsWith(ext))) {
+    const outputPath = getOutputPath(file, { inputDir, outputDir });
+    const output = await swc.transformFile(file, {
+      sourceFileName: path.relative(path.dirname(outputPath), file),
+      sourceMaps: "inline",
+      module: {
+        type: "commonjs",
+      },
+      jsc: {
+        parser: {
+          syntax: "typescript",
+          decorators: true,
+        },
+        transform: {
+          decoratorMetadata: true,
+        },
+      },
+    });
+    await writeToOut(file, output.code, {
+      inputDir,
+      outputDir,
+      targetExtension: ".js",
+    });
+  } else if (!ignoreExtensions.some((ext) => file.endsWith(ext))) {
+    // Copy non-ts files
+    await copyToOut(file, { inputDir, outputDir });
+  }
+};
+
+// Compile all files
+await Promise.all(files.map(async (file) => medusaTransform(file)));
+
+console.log(`Compiled all files in ${Date.now() - started}ms`);

+ 243 - 0
develop.mjs

@@ -0,0 +1,243 @@
+import { execSync, fork } from "child_process";
+import swc from "@swc/core";
+import fs from "node:fs/promises";
+import chokidar from "chokidar";
+import path from "path";
+
+const inputDir = "./src";
+const outputDir = "./dist";
+const compileExtensions = [".ts", ".tsx", ".js", ".jsx"];
+const ignoreExtensions = [".md"];
+const dryRun = false;
+
+const started = Date.now();
+
+const inputDirName = path.basename(inputDir);
+const outputDirName = path.basename(outputDir);
+
+// Recursively find all files to compile
+const findFiles = async (dir, { allowNonExistent } = {}) => {
+  try {
+    let files = await fs.readdir(dir, { withFileTypes: true });
+    let paths = await Promise.all(
+      files.map(async (file) => {
+        const res = path.join(dir, file.name);
+        return file.isDirectory() ? findFiles(res) : res;
+      })
+    );
+    return paths.flat();
+  } catch (e) {
+    if (allowNonExistent && e.code === "ENOENT") {
+      return [];
+    }
+    throw e;
+  }
+};
+
+const files = await findFiles(inputDir);
+const outFiles = await findFiles(outputDir, { allowNonExistent: true });
+
+const srcFileSet = new Set(files);
+
+// Delete all unexpected outFiles
+await Promise.all(
+  outFiles.map(async (file) => {
+    // Calculate expected src path
+    const relativePath = file.replace(outputDirName, inputDirName);
+
+    // try each compile extension
+    const found =
+      srcFileSet.has(relativePath) ||
+      compileExtensions.some((ext) => {
+        const srcPath = relativePath.replace(path.extname(relativePath), ext);
+        return srcFileSet.has(srcPath);
+      });
+
+    if (!found) {
+      if (dryRun) {
+        console.log(`Deleting ${file}`);
+        return;
+      }
+      await fs.unlink(file);
+
+      // Recursively check if directory is empty and delete
+      const cleanup = async (dir) => {
+        const files = await fs.readdir(dir);
+        if (files.length === 0) {
+          await fs.rmdir(dir).catch(() => {});
+          await cleanup(path.dirname(dir));
+        }
+      };
+
+      await cleanup(path.dirname(file));
+    }
+  })
+);
+
+const getOutputPath = (file, config) => {
+  const { inputDir, outputDir, targetExtension } = config;
+
+  const relativePath = file.replace(inputDirName, outputDirName);
+  let outputPath = relativePath;
+
+  if (targetExtension) {
+    const currentExtension = path.extname(outputPath);
+    outputPath = outputPath.replace(currentExtension, targetExtension);
+  }
+
+  return outputPath;
+};
+
+const writeToOut = async (file, content, config) => {
+  const outputPath = getOutputPath(file, config);
+  if (dryRun) {
+    console.log(`Writing to ${outputPath}`);
+    return;
+  }
+  await fs.mkdir(outputPath.replace(/\/[^/]+$/, ""), { recursive: true });
+  await fs.writeFile(outputPath, content);
+};
+
+const copyToOut = async (file, config) => {
+  const outputPath = getOutputPath(file, config);
+
+  if (dryRun) {
+    console.log(`Copying ${file} to ${outputPath}`);
+    return;
+  }
+  await fs.mkdir(outputPath.replace(/\/[^/]+$/, ""), { recursive: true });
+  await fs.copyFile(file, outputPath);
+};
+
+const medusaTransform = async (file) => {
+  if (file.includes("__tests__")) {
+    return;
+  }
+
+  if (compileExtensions.some((ext) => file.endsWith(ext))) {
+    const output = await swc.transformFile(file, {
+      sourceMaps: "inline",
+      module: {
+        type: "commonjs",
+      },
+      jsc: {
+        parser: {
+          syntax: "typescript",
+          decorators: true,
+        },
+        transform: {
+          decoratorMetadata: true,
+        },
+      },
+    });
+    await writeToOut(file, output.code, {
+      inputDir,
+      outputDir,
+      targetExtension: ".js",
+    });
+  } else if (!ignoreExtensions.some((ext) => file.endsWith(ext))) {
+    // Copy non-ts files
+    await copyToOut(file, { inputDir, outputDir });
+  }
+};
+
+const deleteOut = async (file) => {
+  const config = { inputDir, outputDir };
+  if (compileExtensions.some((ext) => file.endsWith(ext))) {
+    config.targetExtension = ".js";
+  }
+  const outputPath = getOutputPath(file, config);
+  await fs.unlink(outputPath);
+};
+
+const deleteDirInOut = async (path) => {
+  const config = { inputDir, outputDir };
+  const outputPath = getOutputPath(path, config);
+  await fs.rmdir(outputPath, { recursive: true });
+};
+
+// Compile all files
+await Promise.all(files.map(async (file) => medusaTransform(file)));
+
+console.log(`Compiled all files in ${Date.now() - started}ms`);
+
+const inputPath = path.resolve(inputDir);
+
+const startMedusa = () => {
+  const cliPath = path.resolve("node_modules", ".bin", "medusa");
+
+  const child = fork(cliPath, [`start`], {
+    cwd: process.cwd(),
+    env: { ...process.env },
+  });
+
+  child.on("error", function (err) {
+    console.log("Error ", err);
+    process.exit(1);
+  });
+
+  return child;
+};
+
+const killMedusa = (child) => {
+  if (process.platform === "win32") {
+    execSync(`taskkill /PID ${child.pid} /F /T`);
+  }
+  child.kill("SIGINT");
+};
+
+let medusaChild = startMedusa();
+
+const killAndStartMedusa = () => {
+  if (medusaChild) {
+    killMedusa(medusaChild);
+  }
+  medusaChild = startMedusa();
+};
+
+// Debounce function
+const debounce = (func, wait) => {
+  let timeout;
+  return (...args) => {
+    const later = () => {
+      clearTimeout(timeout);
+      func(...args);
+    };
+    clearTimeout(timeout);
+    timeout = setTimeout(later, wait);
+  };
+};
+
+// Wrap your restart function with debounce, adjust the 1000ms delay as needed
+const restartMedusa = debounce(killAndStartMedusa, 100);
+
+// Watch for changes
+const watcher = chokidar.watch(inputPath, {
+  ignoreInitial: true,
+});
+
+watcher.on("all", (e, path) => {
+  console.log(e, path);
+  restartMedusa();
+});
+
+watcher.on("change", async (path) => {
+  const now = Date.now();
+  await medusaTransform(path);
+  console.log(`Compiled ${path} in ${Date.now() - now}ms`);
+});
+
+watcher.on("add", async (path) => {
+  const now = Date.now();
+  await medusaTransform(path);
+});
+
+watcher.on("unlink", async (path) => {
+  const now = Date.now();
+  await deleteOut(path);
+});
+
+watcher.on("unlinkDir", async (path) => {
+  const now = Date.now();
+  await deleteDirInOut(path);
+});

+ 10 - 4
package.json

@@ -15,14 +15,15 @@
   "scripts": {
     "clean": "cross-env ./node_modules/.bin/rimraf dist",
     "build": "cross-env npm run clean && npm run build:server && npm run build:admin",
-    "build:server": "cross-env npm run clean && tsc -p tsconfig.server.json",
+    "build:server": "node ./build.mjs",
     "build:admin": "cross-env medusa-admin build",
     "watch": "cross-env tsc --watch",
     "test": "cross-env jest",
     "seed": "cross-env medusa seed -f ./data/seed.json",
     "start": "cross-env npm run build && medusa start",
     "start:custom": "cross-env npm run build && node --preserve-symlinks --trace-warnings index.js",
-    "dev": "cross-env npm run build:server && medusa develop"
+    "dev": "node ./develop.mjs",
+    "dev:inspect": "node --inspect ./develop.mjs"
   },
   "dependencies": {
     "@medusajs/admin": "7.1.12",
@@ -50,6 +51,10 @@
     "@medusajs/store": "0.1.1",
     "@medusajs/tax": "0.1.1",
     "@medusajs/user": "0.0.3",
+    "@mikro-orm/cli": "5.9",
+    "@mikro-orm/core": "5.9",
+    "@mikro-orm/migrations": "5.9",
+    "@mikro-orm/postgresql": "5.9",
     "@tanstack/react-query": "4.22.0",
     "body-parser": "^1.19.0",
     "cors": "^2.8.5",
@@ -60,6 +65,7 @@
     "medusa-payment-manual": "latest",
     "medusa-payment-stripe": "latest",
     "prism-react-renderer": "^2.0.4",
+    "ts-node": "^10.9.2",
     "typeorm": "^0.3.16"
   },
   "devDependencies": {
@@ -70,6 +76,7 @@
     "@stdlib/number-float64-base-normalize": "0.0.8",
     "@types/express": "^4.17.13",
     "@types/jest": "^27.4.0",
+    "@types/mime": "1.3.5",
     "@types/node": "^17.0.8",
     "babel-preset-medusa-package": "^1.1.19",
     "cross-env": "^7.0.3",
@@ -78,8 +85,7 @@
     "rimraf": "^3.0.2",
     "ts-jest": "^27.0.7",
     "ts-loader": "^9.2.6",
-    "typescript": "^4.5.2",
-    "@types/mime": "1.3.5"
+    "typescript": "^4.5.2"
   },
   "jest": {
     "globals": {

+ 196 - 16
yarn.lock

@@ -1346,6 +1346,13 @@
   resolved "https://registry.yarnpkg.com/@colors/colors/-/colors-1.6.0.tgz#ec6cd237440700bc23ca23087f513c75508958b0"
   integrity sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==
 
+"@cspotcode/source-map-support@^0.8.0":
+  version "0.8.1"
+  resolved "https://registry.yarnpkg.com/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz#00629c35a688e05a88b1cda684fb9d5e73f000a1"
+  integrity sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==
+  dependencies:
+    "@jridgewell/trace-mapping" "0.3.9"
+
 "@csstools/cascade-layer-name-parser@^1.0.2", "@csstools/cascade-layer-name-parser@^1.0.9":
   version "1.0.9"
   resolved "https://registry.yarnpkg.com/@csstools/cascade-layer-name-parser/-/cascade-layer-name-parser-1.0.9.tgz#7093f9c26fd92dee87d853a97de0647c5a8c4262"
@@ -2024,6 +2031,15 @@
   resolved "https://registry.yarnpkg.com/@istanbuljs/schema/-/schema-0.1.3.tgz#e45e384e4b8ec16bce2fd903af78450f6bf7ec98"
   integrity sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==
 
+"@jercle/yargonaut@1.1.5":
+  version "1.1.5"
+  resolved "https://registry.yarnpkg.com/@jercle/yargonaut/-/yargonaut-1.1.5.tgz#b640a73a2e82d6f9b636e93f310c9bb4947f5754"
+  integrity sha512-zBp2myVvBHp1UaJsNTyS6q4UDKT7eRiqTS4oNTS6VQMd6mpxYOdbeK4pY279cDCdakGy6hG0J3ejoXZVsPwHqw==
+  dependencies:
+    chalk "^4.1.2"
+    figlet "^1.5.2"
+    parent-require "^1.0.0"
+
 "@jest/console@^27.5.1":
   version "27.5.1"
   resolved "https://registry.yarnpkg.com/@jest/console/-/console-27.5.1.tgz#260fe7239602fe5130a94f1aa386eff54b014bba"
@@ -2202,7 +2218,7 @@
     "@jridgewell/sourcemap-codec" "^1.4.10"
     "@jridgewell/trace-mapping" "^0.3.24"
 
-"@jridgewell/resolve-uri@^3.1.0":
+"@jridgewell/resolve-uri@^3.0.3", "@jridgewell/resolve-uri@^3.1.0":
   version "3.1.2"
   resolved "https://registry.yarnpkg.com/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz#7a0ee601f60f99a20c7c7c5ff0c80388c1189bd6"
   integrity sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==
@@ -2225,6 +2241,14 @@
   resolved "https://registry.yarnpkg.com/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz#d7c6e6755c78567a951e04ab52ef0fd26de59f32"
   integrity sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==
 
+"@jridgewell/trace-mapping@0.3.9":
+  version "0.3.9"
+  resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz#6534fd5933a53ba7cbf3a17615e273a0d1273ff9"
+  integrity sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==
+  dependencies:
+    "@jridgewell/resolve-uri" "^3.0.3"
+    "@jridgewell/sourcemap-codec" "^1.4.10"
+
 "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.24", "@jridgewell/trace-mapping@^0.3.25":
   version "0.3.25"
   resolved "https://registry.yarnpkg.com/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz#15f190e98895f3fc23276ee14bc76b675c2e50f0"
@@ -2922,6 +2946,31 @@
     awilix "^8.0.1"
     ulid "^2.3.0"
 
+"@mikro-orm/cli@5.9":
+  version "5.9.8"
+  resolved "https://registry.yarnpkg.com/@mikro-orm/cli/-/cli-5.9.8.tgz#53dc169cc6f27f84db49ebbcce91b2ec5ddd8c26"
+  integrity sha512-v3KHddyrovHiPz31mfa44GjnOYH2CuEZLiyWo8G/Wy0WP87EuDv5eEGuHJ9GAfd9jvOD4Cy8l56tu/bg/0YGGA==
+  dependencies:
+    "@jercle/yargonaut" "1.1.5"
+    "@mikro-orm/core" "5.9.8"
+    "@mikro-orm/knex" "5.9.8"
+    fs-extra "11.1.1"
+    tsconfig-paths "4.2.0"
+    yargs "17.7.2"
+
+"@mikro-orm/core@5.9", "@mikro-orm/core@5.9.8":
+  version "5.9.8"
+  resolved "https://registry.yarnpkg.com/@mikro-orm/core/-/core-5.9.8.tgz#0b9732525f04df11fbe6dffc864e28f2ef6cefcc"
+  integrity sha512-bfTYInwc+EtPgLOxa5iBG5vKT1qq5swDcsc2F7Iu6sesBLKNputURA7qPmY6TCWQtSL/hvB3QjsCzY48LllD+w==
+  dependencies:
+    acorn-loose "8.3.0"
+    acorn-walk "8.2.0"
+    dotenv "16.3.1"
+    fs-extra "11.1.1"
+    globby "11.1.0"
+    mikro-orm "5.9.8"
+    reflect-metadata "0.1.13"
+
 "@mikro-orm/core@5.9.7":
   version "5.9.7"
   resolved "https://registry.yarnpkg.com/@mikro-orm/core/-/core-5.9.7.tgz#fe35c8790c49684833fc77b3328384781a08e701"
@@ -2944,6 +2993,25 @@
     knex "2.5.1"
     sqlstring "2.3.3"
 
+"@mikro-orm/knex@5.9.8":
+  version "5.9.8"
+  resolved "https://registry.yarnpkg.com/@mikro-orm/knex/-/knex-5.9.8.tgz#9e60a8e423d7b19a056ef2f2d13f8cfc72541aff"
+  integrity sha512-Kitz11QY7Id37huNUfsxSkgnET8X/fuL861yUK9rJ8xrRiEakdm1r/lM1pLYcB/oikAphYLTgW+M/t3LoJb8aw==
+  dependencies:
+    fs-extra "11.1.1"
+    knex "2.5.1"
+    sqlstring "2.3.3"
+
+"@mikro-orm/migrations@5.9":
+  version "5.9.8"
+  resolved "https://registry.yarnpkg.com/@mikro-orm/migrations/-/migrations-5.9.8.tgz#3213057f50eb65f998e1cc859e433a131e296864"
+  integrity sha512-D4s2Hd8TFLimddftC/El4Vtiq6AcGG/lc7+LUHieVzkAfdvcddxnxYQ3q1qH7IxqdDWNcZr0dYPxqLvgFhYqqg==
+  dependencies:
+    "@mikro-orm/knex" "5.9.8"
+    fs-extra "11.1.1"
+    knex "2.5.1"
+    umzug "3.3.1"
+
 "@mikro-orm/migrations@5.9.7":
   version "5.9.7"
   resolved "https://registry.yarnpkg.com/@mikro-orm/migrations/-/migrations-5.9.7.tgz#d0ca7d7c2a8b14438991933a0feaadc54dbf4f99"
@@ -2954,6 +3022,15 @@
     knex "2.5.1"
     umzug "3.3.1"
 
+"@mikro-orm/postgresql@5.9":
+  version "5.9.8"
+  resolved "https://registry.yarnpkg.com/@mikro-orm/postgresql/-/postgresql-5.9.8.tgz#a8defac2f82725d94156ca7480a1ffa1a92ea370"
+  integrity sha512-ALXHS9fb3B93RozuF8n3+gYZz/I+d8Swo/5hmcMbaQN4Zs8hhHOhmjfwIj83IWb1QBPYcBeIc2M8TCmhxXX//g==
+  dependencies:
+    "@mikro-orm/knex" "5.9.8"
+    pg "8.11.3"
+    postgres-date "2.1.0"
+
 "@mikro-orm/postgresql@5.9.7":
   version "5.9.7"
   resolved "https://registry.yarnpkg.com/@mikro-orm/postgresql/-/postgresql-5.9.7.tgz#875f99f33e911460b727cbe81c9f62ca29ccc027"
@@ -5193,6 +5270,26 @@
   resolved "https://registry.yarnpkg.com/@trysound/sax/-/sax-0.2.0.tgz#cccaab758af56761eb7bf37af6f03f326dd798ad"
   integrity sha512-L7z9BgrNEcYyUYtF+HaEfiS5ebkh9jXqbszz7pC0hRBPaatV0XjSD3+eHrpqFemQfgwiFF0QPIarnIihIDn7OA==
 
+"@tsconfig/node10@^1.0.7":
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node10/-/node10-1.0.11.tgz#6ee46400685f130e278128c7b38b7e031ff5b2f2"
+  integrity sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==
+
+"@tsconfig/node12@^1.0.7":
+  version "1.0.11"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node12/-/node12-1.0.11.tgz#ee3def1f27d9ed66dac6e46a295cffb0152e058d"
+  integrity sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==
+
+"@tsconfig/node14@^1.0.0":
+  version "1.0.3"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node14/-/node14-1.0.3.tgz#e4386316284f00b98435bf40f72f75a09dabf6c1"
+  integrity sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==
+
+"@tsconfig/node16@^1.0.2":
+  version "1.0.4"
+  resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
+  integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
+
 "@types/argparse@1.0.38":
   version "1.0.38"
   resolved "https://registry.yarnpkg.com/@types/argparse/-/argparse-1.0.38.tgz#a81fd8606d481f873a3800c6ebae4f1d768a56a9"
@@ -5712,12 +5809,17 @@ acorn-walk@^7.0.0, acorn-walk@^7.1.1:
   resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.2.0.tgz#0de889a601203909b0fbe07b8938dc21d2e967bc"
   integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==
 
+acorn-walk@^8.1.1:
+  version "8.3.2"
+  resolved "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa"
+  integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A==
+
 acorn@^7.0.0, acorn@^7.1.1:
   version "7.4.1"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.4.1.tgz#feaed255973d2e77555b83dbc08851a6c63520fa"
   integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==
 
-acorn@^8.2.4, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.2:
+acorn@^8.2.4, acorn@^8.4.1, acorn@^8.5.0, acorn@^8.7.1, acorn@^8.8.2:
   version "8.11.3"
   resolved "https://registry.yarnpkg.com/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a"
   integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==
@@ -5859,6 +5961,11 @@ append-field@^1.0.0:
   resolved "https://registry.yarnpkg.com/append-field/-/append-field-1.0.0.tgz#1e3440e915f0b1203d23748e78edd7b9b5b43e56"
   integrity sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==
 
+arg@^4.1.0:
+  version "4.1.3"
+  resolved "https://registry.yarnpkg.com/arg/-/arg-4.1.3.tgz#269fc7ad5b8e42cb63c896d5666017261c144089"
+  integrity sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==
+
 arg@^5.0.2:
   version "5.0.2"
   resolved "https://registry.yarnpkg.com/arg/-/arg-5.0.2.tgz#c81433cc427c92c4dcf4865142dbca6f15acd59c"
@@ -6926,6 +7033,11 @@ create-react-class@^15.6.0:
     loose-envify "^1.3.1"
     object-assign "^4.1.1"
 
+create-require@^1.1.0:
+  version "1.1.1"
+  resolved "https://registry.yarnpkg.com/create-require/-/create-require-1.1.1.tgz#c1d7e8f1e5f6cfc9ff65f9cd352d37348756c333"
+  integrity sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==
+
 cron-parser@^4.2.0, cron-parser@^4.6.0:
   version "4.9.0"
   resolved "https://registry.yarnpkg.com/cron-parser/-/cron-parser-4.9.0.tgz#0340694af3e46a0894978c6f52a6dbb5c0f11ad5"
@@ -7280,6 +7392,11 @@ diff-sequences@^27.5.1:
   resolved "https://registry.yarnpkg.com/diff-sequences/-/diff-sequences-27.5.1.tgz#eaecc0d327fd68c8d9672a1e64ab8dccb2ef5327"
   integrity sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==
 
+diff@^4.0.1:
+  version "4.0.2"
+  resolved "https://registry.yarnpkg.com/diff/-/diff-4.0.2.tgz#60f3aecb89d5fae520c11aa19efc2bb982aade7d"
+  integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==
+
 dir-glob@^3.0.1:
   version "3.0.1"
   resolved "https://registry.yarnpkg.com/dir-glob/-/dir-glob-3.0.1.tgz#56dbf73d992a4a93ba1584f4534063fd2e41717f"
@@ -8005,6 +8122,11 @@ fengari@^0.1.4:
     sprintf-js "^1.1.1"
     tmp "^0.0.33"
 
+figlet@^1.5.2:
+  version "1.7.0"
+  resolved "https://registry.yarnpkg.com/figlet/-/figlet-1.7.0.tgz#46903a04603fd19c3e380358418bb2703587a72e"
+  integrity sha512-gO8l3wvqo0V7wEFLXPbkX83b7MVjRrk1oRLfYlZXol8nEpb/ON9pcKLI4qpBv5YtOTfrINtqb7b40iYY2FTWFg==
+
 figures@^3.0.0:
   version "3.2.0"
   resolved "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz#625c18bd293c604dc4a8ddb2febf0c88341746af"
@@ -9635,7 +9757,7 @@ json-stable-stringify-without-jsonify@^1.0.1:
   resolved "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz#9db7b59496ad3f3cfef30a75142d2d930ad72651"
   integrity sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==
 
-json5@2.x, json5@^2.1.2, json5@^2.2.3:
+json5@2.x, json5@^2.1.2, json5@^2.2.2, json5@^2.2.3:
   version "2.2.3"
   resolved "https://registry.yarnpkg.com/json5/-/json5-2.2.3.tgz#78cd6f1a19bdc12b73db5ad0c61efd66c1e29283"
   integrity sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==
@@ -9993,7 +10115,7 @@ make-dir@^4.0.0:
   dependencies:
     semver "^7.5.3"
 
-make-error@1.x:
+make-error@1.x, make-error@^1.1.1:
   version "1.3.6"
   resolved "https://registry.yarnpkg.com/make-error/-/make-error-1.3.6.tgz#2eb2e37ea9b67c4891f684a1394799af484cf7a2"
   integrity sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==
@@ -10160,6 +10282,11 @@ mikro-orm@5.9.7:
   resolved "https://registry.yarnpkg.com/mikro-orm/-/mikro-orm-5.9.7.tgz#8fa930c819b03c6811b5c9813d4601a5ea6953be"
   integrity sha512-0AxNDxQWk45n5N5g5q/K2tVj1/Narf4h5+1fhFc0uYAp/tOGAGvjmVK43Xy4TisEm/1VpBNOtS7FYKvh14WVOQ==
 
+mikro-orm@5.9.8:
+  version "5.9.8"
+  resolved "https://registry.yarnpkg.com/mikro-orm/-/mikro-orm-5.9.8.tgz#8fe379bdb7e14cfdc5eb320f3dfa366d40791e35"
+  integrity sha512-iBku1gU9xkA2FCw2wy0K4x3EQzsRE52dYGkGUVQEthRmc/vIMBwXyiTAj+oARzXrkWqslFtlZA/2upeqZhMQlw==
+
 mime-db@1.52.0, "mime-db@>= 1.43.0 < 2":
   version "1.52.0"
   resolved "https://registry.yarnpkg.com/mime-db/-/mime-db-1.52.0.tgz#bbabcdc02859f4987301c856e3387ce5ec43bf70"
@@ -10644,6 +10771,11 @@ parent-module@^1.0.0:
   dependencies:
     callsites "^3.0.0"
 
+parent-require@^1.0.0:
+  version "1.0.0"
+  resolved "https://registry.yarnpkg.com/parent-require/-/parent-require-1.0.0.tgz#746a167638083a860b0eef6732cb27ed46c32977"
+  integrity sha512-2MXDNZC4aXdkkap+rBBMv0lUsfJqvX5/2FiYYnfCnorZt3Pk06/IOR5KeaoghgS2w07MLWgjbsnyaq6PdHn2LQ==
+
 parse-json@^5.0.0, parse-json@^5.2.0:
   version "5.2.0"
   resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd"
@@ -11264,6 +11396,11 @@ postgres-bytea@~1.0.0:
   resolved "https://registry.yarnpkg.com/postgres-bytea/-/postgres-bytea-1.0.0.tgz#027b533c0aa890e26d172d47cf9ccecc521acd35"
   integrity sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==
 
+postgres-date@2.1.0:
+  version "2.1.0"
+  resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-2.1.0.tgz#b85d3c1fb6fb3c6c8db1e9942a13a3bf625189d0"
+  integrity sha512-K7Juri8gtgXVcDfZttFKVmhglp7epKb1K4pgrkLxehjqkrgPhfG6OO8LHLkfaqkbpjNRnra018XwAr1yQFWGcA==
+
 postgres-date@~1.0.4:
   version "1.0.7"
   resolved "https://registry.yarnpkg.com/postgres-date/-/postgres-date-1.0.7.tgz#51bc086006005e5061c591cee727f2531bf641a8"
@@ -12608,6 +12745,11 @@ strip-ansi@^7.0.1:
   dependencies:
     ansi-regex "^6.0.1"
 
+strip-bom@^3.0.0:
+  version "3.0.0"
+  resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-3.0.0.tgz#2334c18e9c759f7bdd56fdef7e9ae3d588e68ed3"
+  integrity sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==
+
 strip-bom@^4.0.0:
   version "4.0.0"
   resolved "https://registry.yarnpkg.com/strip-bom/-/strip-bom-4.0.0.tgz#9c3505c1db45bcedca3d9cf7a16f5c5aa3901878"
@@ -12959,6 +13101,34 @@ ts-loader@^9.2.6:
     semver "^7.3.4"
     source-map "^0.7.4"
 
+ts-node@^10.9.2:
+  version "10.9.2"
+  resolved "https://registry.yarnpkg.com/ts-node/-/ts-node-10.9.2.tgz#70f021c9e185bccdca820e26dc413805c101c71f"
+  integrity sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==
+  dependencies:
+    "@cspotcode/source-map-support" "^0.8.0"
+    "@tsconfig/node10" "^1.0.7"
+    "@tsconfig/node12" "^1.0.7"
+    "@tsconfig/node14" "^1.0.0"
+    "@tsconfig/node16" "^1.0.2"
+    acorn "^8.4.1"
+    acorn-walk "^8.1.1"
+    arg "^4.1.0"
+    create-require "^1.1.0"
+    diff "^4.0.1"
+    make-error "^1.1.1"
+    v8-compile-cache-lib "^3.0.1"
+    yn "3.1.1"
+
+tsconfig-paths@4.2.0:
+  version "4.2.0"
+  resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz#ef78e19039133446d244beac0fd6a1632e2d107c"
+  integrity sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==
+  dependencies:
+    json5 "^2.2.2"
+    minimist "^1.2.6"
+    strip-bom "^3.0.0"
+
 tslib@^1, tslib@^1.9.0:
   version "1.14.1"
   resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.14.1.tgz#cf2d38bdc34a134bcaf1091c41f6619e2f672d00"
@@ -13213,6 +13383,11 @@ uuid@^9.0.0:
   resolved "https://registry.yarnpkg.com/uuid/-/uuid-9.0.1.tgz#e188d4c8853cc722220392c424cd637f32293f30"
   integrity sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==
 
+v8-compile-cache-lib@^3.0.1:
+  version "3.0.1"
+  resolved "https://registry.yarnpkg.com/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz#6336e8d71965cb3d35a1bbb7868445a7c05264bf"
+  integrity sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==
+
 v8-compile-cache@^2.0.3:
   version "2.4.0"
   resolved "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.4.0.tgz#cdada8bec61e15865f05d097c5f4fd30e94dc128"
@@ -13631,6 +13806,19 @@ yargs-parser@^21.1.1:
   resolved "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35"
   integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==
 
+yargs@17.7.2, yargs@^17.6.2:
+  version "17.7.2"
+  resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
+  integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
+  dependencies:
+    cliui "^8.0.1"
+    escalade "^3.1.1"
+    get-caller-file "^2.0.5"
+    require-directory "^2.1.1"
+    string-width "^4.2.3"
+    y18n "^5.0.5"
+    yargs-parser "^21.1.1"
+
 yargs@^15.3.1:
   version "15.4.1"
   resolved "https://registry.yarnpkg.com/yargs/-/yargs-15.4.1.tgz#0d87a16de01aee9d8bec2bfbf74f67851730f4f8"
@@ -13661,18 +13849,10 @@ yargs@^16.0.0, yargs@^16.2.0:
     y18n "^5.0.5"
     yargs-parser "^20.2.2"
 
-yargs@^17.6.2:
-  version "17.7.2"
-  resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269"
-  integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==
-  dependencies:
-    cliui "^8.0.1"
-    escalade "^3.1.1"
-    get-caller-file "^2.0.5"
-    require-directory "^2.1.1"
-    string-width "^4.2.3"
-    y18n "^5.0.5"
-    yargs-parser "^21.1.1"
+yn@3.1.1:
+  version "3.1.1"
+  resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"
+  integrity sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==
 
 yocto-queue@^0.1.0:
   version "0.1.0"