feat(create-medusa-app,medusa-cli): Allow clearing project (#4273)

- Added build step
- Added `--no-boilerplate` option to `create-medusa-app` to allow clearing onboarding files
- Clear project files by default in medusa-cli
This commit is contained in:
Shahed Nasser authored and GitHub committed 2023-06-15 17:31:30 +00:00
1 parent f8643361cd
commit f98ba5bde8
18 files changed
+581 -86

No files matched your search

+7
View File
@@ -0,0 +1,7 @@
---
"create-medusa-app": patch
"@medusajs/medusa-cli": patch
"@medusajs/utils": patch
---
feat(create-medusa-app,medusa-cli): Allow clearing project
+4
View File
@@ -13,12 +13,15 @@
"prepare": "cross-env NODE_ENV=production yarn run build" "prepare": "cross-env NODE_ENV=production yarn run build"
}, },
"dependencies": { "dependencies": {
"@medusajs/utils": "^1.9.0",
"boxen": "^7.1.0", "boxen": "^7.1.0",
"chalk": "^5.2.0", "chalk": "^5.2.0",
"commander": "^10.0.1", "commander": "^10.0.1",
"glob": "^10.2.7",
"inquirer": "^9.2.2", "inquirer": "^9.2.2",
"medusa-telemetry": "^0.0.16", "medusa-telemetry": "^0.0.16",
"nanoid": "^4.0.2", "nanoid": "^4.0.2",
"node-emoji": "^2.0.2",
"node-fetch": "^3.3.1", "node-fetch": "^3.3.1",
"open": "^9.1.0", "open": "^9.1.0",
"ora": "^6.3.0", "ora": "^6.3.0",
@@ -33,6 +36,7 @@
"@types/commander": "^2.12.2", "@types/commander": "^2.12.2",
"@types/configstore": "^6.0.0", "@types/configstore": "^6.0.0",
"@types/inquirer": "^9.0.3", "@types/inquirer": "^9.0.3",
"@types/node-emoji": "^1.8.2",
"@types/pg": "^8.6.6", "@types/pg": "^8.6.6",
"@types/uuid": "^9.0.1", "@types/uuid": "^9.0.1",
"@types/validator": "^13.7.17", "@types/validator": "^13.7.17",
@@ -15,13 +15,14 @@ import fs from "fs"
import { nanoid } from "nanoid" import { nanoid } from "nanoid"
import isEmailImported from "validator/lib/isEmail.js" import isEmailImported from "validator/lib/isEmail.js"
import logMessage from "../utils/log-message.js" import logMessage from "../utils/log-message.js"
import onProcessTerminated from "../utils/on-process-terminated.js"
import createAbortController, { import createAbortController, {
isAbortError, isAbortError,
} from "../utils/create-abort-controller.js" } from "../utils/create-abort-controller.js"
import { track } from "medusa-telemetry" import { track } from "medusa-telemetry"
import { createFactBox, resetFactBox } from "../utils/facts.js" import { createFactBox, resetFactBox } from "../utils/facts.js"
import boxen from "boxen" import boxen from "boxen"
import { emojify } from "node-emoji"
import ProcessManager from "../utils/process-manager.js"
const slugify = slugifyType.default const slugify = slugifyType.default
const isEmail = isEmailImported.default const isEmail = isEmailImported.default
@@ -29,9 +30,11 @@ const isEmail = isEmailImported.default
type CreateOptions = { type CreateOptions = {
repoUrl?: string repoUrl?: string
seed?: boolean seed?: boolean
// commander passed --no-boilerplate as boilerplate
boilerplate?: boolean
} }
export default async ({ repoUrl = "", seed }: CreateOptions) => { export default async ({ repoUrl = "", seed, boilerplate }: CreateOptions) => {
track("CREATE_CLI") track("CREATE_CLI")
if (repoUrl) { if (repoUrl) {
track("STARTER_SELECTED", { starter: repoUrl }) track("STARTER_SELECTED", { starter: repoUrl })
@@ -39,7 +42,8 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => {
if (seed) { if (seed) {
track("SEED_SELECTED", { seed }) track("SEED_SELECTED", { seed })
} }
const abortController = createAbortController() const processManager = new ProcessManager()
const abortController = createAbortController(processManager)
const { projectName } = await inquirer.prompt([ const { projectName } = await inquirer.prompt([
{ {
@@ -114,7 +118,7 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => {
type: "input", type: "input",
name: "adminEmail", name: "adminEmail",
message: "Enter an email for your admin dashboard user", message: "Enter an email for your admin dashboard user",
default: !seed ? "admin@medusa-test.com" : undefined, default: !seed && boilerplate ? "admin@medusa-test.com" : undefined,
validate: (input) => { validate: (input) => {
return typeof input === "string" && input.length > 0 && isEmail(input) return typeof input === "string" && input.length > 0 && isEmail(input)
? true ? true
@@ -123,13 +127,20 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => {
}, },
]) ])
logMessage({
message: `${emojify(
":rocket:"
)} Starting project setup, this may take a few minutes.`,
})
const spinner = ora().start() const spinner = ora().start()
onProcessTerminated(() => spinner.stop()) processManager.onTerminated(() => spinner.stop())
let interval: NodeJS.Timer | null = createFactBox( let interval: NodeJS.Timer | null = createFactBox(
spinner, spinner,
"Setting up project..." "Setting up project...",
processManager
) )
// clone repository // clone repository
@@ -155,6 +166,7 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => {
interval, interval,
spinner, spinner,
"Created project directory", "Created project directory",
processManager,
"Creating database..." "Creating database..."
) )
@@ -182,7 +194,12 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => {
db: dbName, db: dbName,
}) })
resetFactBox(interval, spinner, `Database ${dbName} created`) resetFactBox(
interval,
spinner,
`Database ${dbName} created`,
processManager
)
} }
// prepare project // prepare project
@@ -195,7 +212,9 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => {
email: adminEmail, email: adminEmail,
}, },
seed, seed,
boilerplate,
spinner, spinner,
processManager,
abortController, abortController,
}) })
} catch (e: any) { } catch (e: any) {
@@ -240,19 +259,13 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => {
// this ensures that the message isn't printed twice to the user // this ensures that the message isn't printed twice to the user
let printedMessage = false let printedMessage = false
onProcessTerminated(() => { processManager.onTerminated(() => {
if (!printedMessage) { if (!printedMessage) {
printedMessage = true printedMessage = true
console.log( console.log(
boxen( boxen(
chalk.green( chalk.green(
`Change to the \`${projectName}\` directory to explore your Medusa project. `Change to the \`${projectName}\` directory to explore your Medusa project.\n\nStart your Medusa app again with the following command:\n\nnpx @medusajs/medusa-cli develop\n\nCheck out the Medusa documentation to start your development:\n\nhttps://docs.medusajs.com/\n\nStar us on GitHub if you like what we're building:\n\nhttps://github.com/medusajs/medusa/stargazers`
Check out the Medusa documentation to start your development:
https://docs.medusajs.com/
Star us on GitHub if you like what we're building:
https://github.com/medusajs/medusa/stargazers`
), ),
{ {
titleAlignment: "center", titleAlignment: "center",
@@ -271,8 +284,8 @@ export default async ({ repoUrl = "", seed }: CreateOptions) => {
}).then(async () => }).then(async () =>
open( open(
inviteToken inviteToken
? `http://localhost:9000/app/invite?token=${inviteToken}&first_run=true` ? `http://localhost:7001/invite?token=${inviteToken}&first_run=true`
: "http://localhost:9000/app" : "http://localhost:7001"
) )
) )
} }
+4
View File
@@ -6,6 +6,10 @@ program
.description("Create a new Medusa project") .description("Create a new Medusa project")
.option("--repo-url <url>", "URL of repository to use to setup project.") .option("--repo-url <url>", "URL of repository to use to setup project.")
.option("--seed", "Seed the created database with demo data.") .option("--seed", "Seed the created database with demo data.")
.option(
"--no-boilerplate",
"Install a Medusa project without the boilerplate and demo files."
)
.parse() .parse()
void create(program.opts()) void create(program.opts())
@@ -6,7 +6,6 @@ type CloneRepoOptions = {
abortController?: AbortController abortController?: AbortController
} }
// TODO change default repo URL
const DEFAULT_REPO = "https://github.com/medusajs/medusa-starter-default" const DEFAULT_REPO = "https://github.com/medusajs/medusa-starter-default"
export default async ({ export default async ({
@@ -1,8 +1,8 @@
import onProcessTerminated from "./on-process-terminated.js" import ProcessManager from "./process-manager.js"
export default () => { export default (processManager: ProcessManager) => {
const abortController = new AbortController() const abortController = new AbortController()
onProcessTerminated(() => abortController.abort()) processManager.onTerminated(() => abortController.abort())
return abortController return abortController
} }
+11 -6
View File
@@ -1,7 +1,8 @@
import boxen from "boxen" import boxen from "boxen"
import chalk from "chalk" import chalk from "chalk"
import { Ora } from "ora" import { Ora } from "ora"
import onProcessTerminated from "./on-process-terminated.js" import { emojify } from "node-emoji"
import ProcessManager from "./process-manager.js"
const facts = [ const facts = [
"Plugins allow you to integrate third-party services for payment, fulfillment, notifications, and more.", "Plugins allow you to integrate third-party services for payment, fulfillment, notifications, and more.",
@@ -31,17 +32,20 @@ export const getFact = () => {
export const showFact = (spinner: Ora, title: string) => { export const showFact = (spinner: Ora, title: string) => {
const fact = getFact() const fact = getFact()
spinner.text = `${boxen(fact, { spinner.text = `${boxen(`${emojify(":bulb:")} Medusa Tips\n\n${fact}`, {
title: chalk.cyan(title), title: chalk.cyan(title),
titleAlignment: "center", titleAlignment: "center",
textAlignment: "center", textAlignment: "center",
padding: 1, padding: 1,
margin: 1, margin: 1,
float: "center",
})}` })}`
} }
export const createFactBox = (spinner: Ora, title: string): NodeJS.Timer => { export const createFactBox = (
spinner: Ora,
title: string,
processManager: ProcessManager
): NodeJS.Timer => {
spinner.spinner = { spinner.spinner = {
frames: [""], frames: [""],
} }
@@ -50,7 +54,7 @@ export const createFactBox = (spinner: Ora, title: string): NodeJS.Timer => {
showFact(spinner, title) showFact(spinner, title)
}, 10000) }, 10000)
onProcessTerminated(() => clearInterval(interval)) processManager.addInterval(interval)
return interval return interval
} }
@@ -59,6 +63,7 @@ export const resetFactBox = (
interval: NodeJS.Timer | null, interval: NodeJS.Timer | null,
spinner: Ora, spinner: Ora,
successMessage: string, successMessage: string,
processManager: ProcessManager,
newTitle?: string newTitle?: string
): NodeJS.Timer | null => { ): NodeJS.Timer | null => {
if (interval) { if (interval) {
@@ -69,7 +74,7 @@ export const resetFactBox = (
spinner.succeed(chalk.green(successMessage)).start() spinner.succeed(chalk.green(successMessage)).start()
let newInterval = null let newInterval = null
if (newTitle) { if (newTitle) {
newInterval = createFactBox(spinner, newTitle) newInterval = createFactBox(spinner, newTitle, processManager)
} }
return newInterval return newInterval
@@ -1,4 +0,0 @@
export default (fn: Function) => {
process.on("SIGTERM", () => fn())
process.on("SIGINT", () => fn())
}
@@ -4,8 +4,9 @@ import path from "path"
import { Ora } from "ora" import { Ora } from "ora"
import promiseExec from "./promise-exec.js" import promiseExec from "./promise-exec.js"
import { EOL } from "os" import { EOL } from "os"
import runProcess from "./run-process.js"
import { createFactBox, resetFactBox } from "./facts.js" import { createFactBox, resetFactBox } from "./facts.js"
import { clearProject } from "@medusajs/utils"
import ProcessManager from "./process-manager.js"
type PrepareOptions = { type PrepareOptions = {
directory: string directory: string
@@ -14,7 +15,9 @@ type PrepareOptions = {
email: string email: string
} }
seed?: boolean seed?: boolean
boilerplate?: boolean
spinner: Ora spinner: Ora
processManager: ProcessManager
abortController?: AbortController abortController?: AbortController
} }
@@ -23,7 +26,9 @@ export default async ({
dbConnectionString, dbConnectionString,
admin, admin,
seed, seed,
boilerplate,
spinner, spinner,
processManager,
abortController, abortController,
}: PrepareOptions) => { }: PrepareOptions) => {
// initialize execution options // initialize execution options
@@ -43,10 +48,11 @@ export default async ({
let interval: NodeJS.Timer | null = createFactBox( let interval: NodeJS.Timer | null = createFactBox(
spinner, spinner,
"Installing dependencies..." "Installing dependencies...",
processManager
) )
await runProcess({ await processManager.runProcess({
process: async () => { process: async () => {
try { try {
await promiseExec(`yarn`, execOptions) await promiseExec(`yarn`, execOptions)
@@ -63,26 +69,73 @@ export default async ({
interval, interval,
spinner, spinner,
"Installed Dependencies", "Installed Dependencies",
"Running Migrations...." processManager
) )
// run migrations if (!boilerplate) {
await runProcess({ interval = createFactBox(
spinner,
"Preparing Project Directory...",
processManager
)
// delete files and directories related to onboarding
clearProject(directory)
interval = resetFactBox(
interval,
spinner,
"Prepared Project Directory",
processManager
)
}
interval = createFactBox(spinner, "Building Project...", processManager)
await processManager.runProcess({
process: async () => { process: async () => {
await promiseExec( try {
await promiseExec(`yarn build`, execOptions)
} catch (e) {
// yarn isn't available
// use npm
await promiseExec(`npm run build`, execOptions)
}
},
ignoreERESOLVE: true,
})
interval = resetFactBox(interval, spinner, "Project Built", processManager)
interval = createFactBox(spinner, "Running Migrations...", processManager)
// run migrations
await processManager.runProcess({
process: async () => {
const proc = await promiseExec(
"npx -y @medusajs/medusa-cli@latest migrations run", "npx -y @medusajs/medusa-cli@latest migrations run",
execOptions execOptions
) )
// ensure that migrations actually ran in case of an uncaught error
if (!proc.stdout.includes("Migrations completed")) {
throw new Error(
`An error occurred while running migrations: ${
proc.stderr || proc.stdout
}`
)
}
}, },
}) })
interval = resetFactBox(interval, spinner, "Ran Migrations") interval = resetFactBox(interval, spinner, "Ran Migrations", processManager)
if (admin) { if (admin) {
// create admin user // create admin user
interval = createFactBox(spinner, "Creating an admin user...") interval = createFactBox(
spinner,
"Creating an admin user...",
processManager
)
await runProcess({ await processManager.runProcess({
process: async () => { process: async () => {
const proc = await promiseExec( const proc = await promiseExec(
`npx -y @medusajs/medusa-cli@latest user -e ${admin.email} --invite`, `npx -y @medusajs/medusa-cli@latest user -e ${admin.email} --invite`,
@@ -94,11 +147,16 @@ export default async ({
}, },
}) })
interval = resetFactBox(interval, spinner, "Created admin user") interval = resetFactBox(
interval,
spinner,
"Created admin user",
processManager
)
} }
if (seed) { if (seed || !boilerplate) {
interval = createFactBox(spinner, "Seeding database...") interval = createFactBox(spinner, "Seeding database...", processManager)
// check if a seed file exists in the project // check if a seed file exists in the project
if (!fs.existsSync(path.join(directory, "data", "seed.json"))) { if (!fs.existsSync(path.join(directory, "data", "seed.json"))) {
@@ -112,7 +170,7 @@ export default async ({
return inviteToken return inviteToken
} }
await runProcess({ await processManager.runProcess({
process: async () => { process: async () => {
await promiseExec( await promiseExec(
`npx -y @medusajs/medusa-cli@latest seed --seed-file=${path.join( `npx -y @medusajs/medusa-cli@latest seed --seed-file=${path.join(
@@ -123,14 +181,19 @@ export default async ({
) )
}, },
}) })
resetFactBox(interval, spinner, "Seeded database with demo data") resetFactBox(
interval,
spinner,
"Seeded database with demo data",
processManager
)
} else if ( } else if (
fs.existsSync(path.join(directory, "data", "seed-onboarding.json")) fs.existsSync(path.join(directory, "data", "seed-onboarding.json"))
) { ) {
// seed the database with onboarding seed // seed the database with onboarding seed
interval = createFactBox(spinner, "Finish preparation...") interval = createFactBox(spinner, "Finish preparation...", processManager)
await runProcess({ await processManager.runProcess({
process: async () => { process: async () => {
await promiseExec( await promiseExec(
`npx -y @medusajs/medusa-cli@latest seed --seed-file=${path.join( `npx -y @medusajs/medusa-cli@latest seed --seed-file=${path.join(
@@ -141,7 +204,7 @@ export default async ({
) )
}, },
}) })
resetFactBox(interval, spinner, "Finished Preparation") resetFactBox(interval, spinner, "Finished Preparation", processManager)
} }
return inviteToken return inviteToken
@@ -0,0 +1,60 @@
type ProcessOptions = {
process: Function
ignoreERESOLVE?: boolean
}
export default class ProcessManager {
intervals: NodeJS.Timer[] = []
static MAX_RETRIES = 3
constructor() {
this.onTerminated(() => {
this.intervals.forEach((interval) => {
clearInterval(interval)
})
})
}
onTerminated(fn: Function) {
process.on("SIGTERM", () => fn())
process.on("SIGINT", () => fn())
}
addInterval(interval: NodeJS.Timer) {
this.intervals.push(interval)
}
// when running commands with npx or npm sometimes they
// terminate with EAGAIN error unexpectedly
// this utility function allows retrying the process if
// EAGAIN occurs, or otherwise throw the error that occurs
async runProcess({ process, ignoreERESOLVE }: ProcessOptions) {
let processError = false
let retries = 0
do {
retries++
try {
await process()
} catch (error) {
if (
typeof error === "object" &&
error !== null &&
"code" in error &&
error?.code === "EAGAIN"
) {
processError = true
} else if (
ignoreERESOLVE &&
typeof error === "object" &&
error !== null &&
"code" in error &&
error?.code === "ERESOLVE"
) {
// ignore error
} else {
throw error
}
}
} while (processError && retries <= ProcessManager.MAX_RETRIES)
}
}
@@ -1,36 +0,0 @@
type ProcessOptions = {
process: Function
ignoreERESOLVE?: boolean
}
// when running commands with npx or npm sometimes they
// terminate with EAGAIN error unexpectedly
// this utility function allows retrying the process if
// EAGAIN occurs, or otherwise throw the error that occurs
export default async ({ process, ignoreERESOLVE }: ProcessOptions) => {
let processError = false
do {
try {
await process()
} catch (error) {
if (
typeof error === "object" &&
error !== null &&
"code" in error &&
error?.code === "EAGAIN"
) {
processError = true
} else if (
ignoreERESOLVE &&
typeof error === "object" &&
error !== null &&
"code" in error &&
error?.code === "ERESOLVE"
) {
// ignore error
} else {
throw error
}
}
} while (processError)
}
+1
View File
@@ -45,6 +45,7 @@
"execa": "^5.1.1", "execa": "^5.1.1",
"fs-exists-cached": "^1.0.0", "fs-exists-cached": "^1.0.0",
"fs-extra": "^10.0.0", "fs-extra": "^10.0.0",
"glob": "^10.2.7",
"hosted-git-info": "^4.0.2", "hosted-git-info": "^4.0.2",
"inquirer": "^8.0.0", "inquirer": "^8.0.0",
"is-valid-path": "^0.1.1", "is-valid-path": "^0.1.1",
+8
View File
@@ -15,9 +15,11 @@ import url from "url"
import { createDatabase } from "pg-god" import { createDatabase } from "pg-god"
import { track } from "medusa-telemetry" import { track } from "medusa-telemetry"
import inquirer from "inquirer" import inquirer from "inquirer"
import { globSync } from "glob"
import reporter from "../reporter" import reporter from "../reporter"
import { getPackageManager, setPackageManager } from "../util/package-manager" import { getPackageManager, setPackageManager } from "../util/package-manager"
import { clearProject } from "@medusajs/utils"
const removeUndefined = (obj) => { const removeUndefined = (obj) => {
return Object.fromEntries( return Object.fromEntries(
@@ -632,6 +634,12 @@ medusa new ${rootPath} [url-to-starter]
} }
} }
if (!selectedOtherStarter) {
reporter.info("Final project preparations...")
// remove demo files
clearProject(rootPath)
}
successMessage(rootPath) successMessage(rootPath)
track("CLI_NEW_SUCCEEDED") track("CLI_NEW_SUCCEEDED")
} }
+1
View File
@@ -27,6 +27,7 @@
}, },
"dependencies": { "dependencies": {
"awilix": "^8.0.1", "awilix": "^8.0.1",
"glob": "^10.2.7",
"ulid": "^2.3.0" "ulid": "^2.3.0"
}, },
"scripts": { "scripts": {
+20
View File
@@ -0,0 +1,20 @@
import fs from "fs"
import path from "path"
import { globSync } from "glob"
export function clearProject (directory: string) {
const files = globSync([
path.join(directory, `src`, `admin/**/*`),
path.join(directory, `src`, `**/onboarding/`),
path.join(directory, `src`, `types`),
path.join(directory, `src`, `**/*.{ts,tsx,js,jsx}`),
])
files.forEach((file) =>
fs.rmSync(file, {
recursive: true,
force: true,
})
)
// add empty typescript file to avoid build errors
fs.openSync(path.join(directory, "src", "index.ts"), "w")
}
+1
View File
@@ -0,0 +1 @@
export * from "./clear-project"
+1
View File
@@ -1,4 +1,5 @@
export * from "./bundles" export * from "./bundles"
export * from "./cli"
export * from "./common" export * from "./common"
export * from "./decorators" export * from "./decorators"
export * from "./event-bus" export * from "./event-bus"
+349 -1
View File
@@ -3246,6 +3246,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-arm64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/android-arm64@npm:0.17.19"
conditions: os=android & cpu=arm64
languageName: node
linkType: hard
"@esbuild/android-arm@npm:0.15.18": "@esbuild/android-arm@npm:0.15.18":
version: 0.15.18 version: 0.15.18
resolution: "@esbuild/android-arm@npm:0.15.18" resolution: "@esbuild/android-arm@npm:0.15.18"
@@ -3260,6 +3267,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-arm@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/android-arm@npm:0.17.19"
conditions: os=android & cpu=arm
languageName: node
linkType: hard
"@esbuild/android-x64@npm:0.16.17": "@esbuild/android-x64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/android-x64@npm:0.16.17" resolution: "@esbuild/android-x64@npm:0.16.17"
@@ -3267,6 +3281,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/android-x64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/android-x64@npm:0.17.19"
conditions: os=android & cpu=x64
languageName: node
linkType: hard
"@esbuild/darwin-arm64@npm:0.16.17": "@esbuild/darwin-arm64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/darwin-arm64@npm:0.16.17" resolution: "@esbuild/darwin-arm64@npm:0.16.17"
@@ -3274,6 +3295,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/darwin-arm64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/darwin-arm64@npm:0.17.19"
conditions: os=darwin & cpu=arm64
languageName: node
linkType: hard
"@esbuild/darwin-x64@npm:0.16.17": "@esbuild/darwin-x64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/darwin-x64@npm:0.16.17" resolution: "@esbuild/darwin-x64@npm:0.16.17"
@@ -3281,6 +3309,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/darwin-x64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/darwin-x64@npm:0.17.19"
conditions: os=darwin & cpu=x64
languageName: node
linkType: hard
"@esbuild/freebsd-arm64@npm:0.16.17": "@esbuild/freebsd-arm64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/freebsd-arm64@npm:0.16.17" resolution: "@esbuild/freebsd-arm64@npm:0.16.17"
@@ -3288,6 +3323,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/freebsd-arm64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/freebsd-arm64@npm:0.17.19"
conditions: os=freebsd & cpu=arm64
languageName: node
linkType: hard
"@esbuild/freebsd-x64@npm:0.16.17": "@esbuild/freebsd-x64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/freebsd-x64@npm:0.16.17" resolution: "@esbuild/freebsd-x64@npm:0.16.17"
@@ -3295,6 +3337,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/freebsd-x64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/freebsd-x64@npm:0.17.19"
conditions: os=freebsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/linux-arm64@npm:0.16.17": "@esbuild/linux-arm64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/linux-arm64@npm:0.16.17" resolution: "@esbuild/linux-arm64@npm:0.16.17"
@@ -3302,6 +3351,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-arm64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/linux-arm64@npm:0.17.19"
conditions: os=linux & cpu=arm64
languageName: node
linkType: hard
"@esbuild/linux-arm@npm:0.16.17": "@esbuild/linux-arm@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/linux-arm@npm:0.16.17" resolution: "@esbuild/linux-arm@npm:0.16.17"
@@ -3309,6 +3365,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-arm@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/linux-arm@npm:0.17.19"
conditions: os=linux & cpu=arm
languageName: node
linkType: hard
"@esbuild/linux-ia32@npm:0.16.17": "@esbuild/linux-ia32@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/linux-ia32@npm:0.16.17" resolution: "@esbuild/linux-ia32@npm:0.16.17"
@@ -3316,6 +3379,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-ia32@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/linux-ia32@npm:0.17.19"
conditions: os=linux & cpu=ia32
languageName: node
linkType: hard
"@esbuild/linux-loong64@npm:0.15.18": "@esbuild/linux-loong64@npm:0.15.18":
version: 0.15.18 version: 0.15.18
resolution: "@esbuild/linux-loong64@npm:0.15.18" resolution: "@esbuild/linux-loong64@npm:0.15.18"
@@ -3330,6 +3400,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-loong64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/linux-loong64@npm:0.17.19"
conditions: os=linux & cpu=loong64
languageName: node
linkType: hard
"@esbuild/linux-mips64el@npm:0.16.17": "@esbuild/linux-mips64el@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/linux-mips64el@npm:0.16.17" resolution: "@esbuild/linux-mips64el@npm:0.16.17"
@@ -3337,6 +3414,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-mips64el@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/linux-mips64el@npm:0.17.19"
conditions: os=linux & cpu=mips64el
languageName: node
linkType: hard
"@esbuild/linux-ppc64@npm:0.16.17": "@esbuild/linux-ppc64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/linux-ppc64@npm:0.16.17" resolution: "@esbuild/linux-ppc64@npm:0.16.17"
@@ -3344,6 +3428,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-ppc64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/linux-ppc64@npm:0.17.19"
conditions: os=linux & cpu=ppc64
languageName: node
linkType: hard
"@esbuild/linux-riscv64@npm:0.16.17": "@esbuild/linux-riscv64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/linux-riscv64@npm:0.16.17" resolution: "@esbuild/linux-riscv64@npm:0.16.17"
@@ -3351,6 +3442,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-riscv64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/linux-riscv64@npm:0.17.19"
conditions: os=linux & cpu=riscv64
languageName: node
linkType: hard
"@esbuild/linux-s390x@npm:0.16.17": "@esbuild/linux-s390x@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/linux-s390x@npm:0.16.17" resolution: "@esbuild/linux-s390x@npm:0.16.17"
@@ -3358,6 +3456,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-s390x@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/linux-s390x@npm:0.17.19"
conditions: os=linux & cpu=s390x
languageName: node
linkType: hard
"@esbuild/linux-x64@npm:0.16.17": "@esbuild/linux-x64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/linux-x64@npm:0.16.17" resolution: "@esbuild/linux-x64@npm:0.16.17"
@@ -3365,6 +3470,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/linux-x64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/linux-x64@npm:0.17.19"
conditions: os=linux & cpu=x64
languageName: node
linkType: hard
"@esbuild/netbsd-x64@npm:0.16.17": "@esbuild/netbsd-x64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/netbsd-x64@npm:0.16.17" resolution: "@esbuild/netbsd-x64@npm:0.16.17"
@@ -3372,6 +3484,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/netbsd-x64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/netbsd-x64@npm:0.17.19"
conditions: os=netbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/openbsd-x64@npm:0.16.17": "@esbuild/openbsd-x64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/openbsd-x64@npm:0.16.17" resolution: "@esbuild/openbsd-x64@npm:0.16.17"
@@ -3379,6 +3498,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/openbsd-x64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/openbsd-x64@npm:0.17.19"
conditions: os=openbsd & cpu=x64
languageName: node
linkType: hard
"@esbuild/sunos-x64@npm:0.16.17": "@esbuild/sunos-x64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/sunos-x64@npm:0.16.17" resolution: "@esbuild/sunos-x64@npm:0.16.17"
@@ -3386,6 +3512,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/sunos-x64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/sunos-x64@npm:0.17.19"
conditions: os=sunos & cpu=x64
languageName: node
linkType: hard
"@esbuild/win32-arm64@npm:0.16.17": "@esbuild/win32-arm64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/win32-arm64@npm:0.16.17" resolution: "@esbuild/win32-arm64@npm:0.16.17"
@@ -3393,6 +3526,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-arm64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/win32-arm64@npm:0.17.19"
conditions: os=win32 & cpu=arm64
languageName: node
linkType: hard
"@esbuild/win32-ia32@npm:0.16.17": "@esbuild/win32-ia32@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/win32-ia32@npm:0.16.17" resolution: "@esbuild/win32-ia32@npm:0.16.17"
@@ -3400,6 +3540,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-ia32@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/win32-ia32@npm:0.17.19"
conditions: os=win32 & cpu=ia32
languageName: node
linkType: hard
"@esbuild/win32-x64@npm:0.16.17": "@esbuild/win32-x64@npm:0.16.17":
version: 0.16.17 version: 0.16.17
resolution: "@esbuild/win32-x64@npm:0.16.17" resolution: "@esbuild/win32-x64@npm:0.16.17"
@@ -3407,6 +3554,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@esbuild/win32-x64@npm:0.17.19":
version: 0.17.19
resolution: "@esbuild/win32-x64@npm:0.17.19"
conditions: os=win32 & cpu=x64
languageName: node
linkType: hard
"@eslint-community/eslint-utils@npm:^4.2.0": "@eslint-community/eslint-utils@npm:^4.2.0":
version: 4.4.0 version: 4.4.0
resolution: "@eslint-community/eslint-utils@npm:4.4.0" resolution: "@eslint-community/eslint-utils@npm:4.4.0"
@@ -6113,6 +6267,7 @@ __metadata:
execa: ^5.1.1 execa: ^5.1.1
fs-exists-cached: ^1.0.0 fs-exists-cached: ^1.0.0
fs-extra: ^10.0.0 fs-extra: ^10.0.0
glob: ^10.2.7
hosted-git-info: ^4.0.2 hosted-git-info: ^4.0.2
inquirer: ^8.0.0 inquirer: ^8.0.0
is-valid-path: ^0.1.1 is-valid-path: ^0.1.1
@@ -6389,6 +6544,7 @@ __metadata:
awilix: ^8.0.1 awilix: ^8.0.1
cross-env: ^5.2.1 cross-env: ^5.2.1
express: ^4.18.2 express: ^4.18.2
glob: ^10.2.7
jest: ^25.5.4 jest: ^25.5.4
ts-jest: ^25.5.1 ts-jest: ^25.5.1
typescript: ^4.4.4 typescript: ^4.4.4
@@ -8703,6 +8859,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@sindresorhus/is@npm:^5.3.0":
version: 5.4.1
resolution: "@sindresorhus/is@npm:5.4.1"
checksum: 8f8e145c6b4c756e52bbfc9d88026aedd2b205caf3eff33d6f54fc436c75e0555e998826de942ff0a175dbefc12f71ceb2246ceedab73c9dd44f3ce258533a6a
languageName: node
linkType: hard
"@sindresorhus/slugify@npm:^1.1.2": "@sindresorhus/slugify@npm:^1.1.2":
version: 1.1.2 version: 1.1.2
resolution: "@sindresorhus/slugify@npm:1.1.2" resolution: "@sindresorhus/slugify@npm:1.1.2"
@@ -11962,6 +12125,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"@types/node-emoji@npm:^1.8.2":
version: 1.8.2
resolution: "@types/node-emoji@npm:1.8.2"
checksum: a8076eb48f004798ee6865e3133b8c4f421feedfa35d4756e9992114afe1212822a523f2737404a3aac9881aa8933695c037095dba4d509b6f3c1b0f22f5d9a1
languageName: node
linkType: hard
"@types/node-fetch@npm:2, @types/node-fetch@npm:2.6.2, @types/node-fetch@npm:^2.5.7": "@types/node-fetch@npm:2, @types/node-fetch@npm:2.6.2, @types/node-fetch@npm:^2.5.7":
version: 2.6.2 version: 2.6.2
resolution: "@types/node-fetch@npm:2.6.2" resolution: "@types/node-fetch@npm:2.6.2"
@@ -15961,6 +16131,17 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"bundle-require@npm:^4.0.0":
version: 4.0.1
resolution: "bundle-require@npm:4.0.1"
dependencies:
load-tsconfig: ^0.2.3
peerDependencies:
esbuild: ">=0.17"
checksum: 92a22b0618bfc4017a7873ac6f989b8fb8c4e2d483f3b05cc3e066a8410934e43f459436113c31fe19f247760bd7f9fd60c15a7a23269d749f8dda7b1b67a01b
languageName: node
linkType: hard
"bunyan@npm:1.8.15": "bunyan@npm:1.8.15":
version: 1.8.15 version: 1.8.15
resolution: "bunyan@npm:1.8.15" resolution: "bunyan@npm:1.8.15"
@@ -16494,6 +16675,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"char-regex@npm:^2.0.1":
version: 2.0.1
resolution: "char-regex@npm:2.0.1"
checksum: ec592229ac3ef18f2ea1f5676ae9a829c37150db55fd7f709edce1bcdc9f506de22ae19388d853704806e51af71fe9239bcb7e7be583296951bfbf2a9a9763a2
languageName: node
linkType: hard
"character-entities-legacy@npm:^1.0.0": "character-entities-legacy@npm:^1.0.0":
version: 1.1.4 version: 1.1.4
resolution: "character-entities-legacy@npm:1.1.4" resolution: "character-entities-legacy@npm:1.1.4"
@@ -17756,10 +17944,12 @@ __metadata:
version: 0.0.0-use.local version: 0.0.0-use.local
resolution: "create-medusa-app@workspace:packages/create-medusa-app" resolution: "create-medusa-app@workspace:packages/create-medusa-app"
dependencies: dependencies:
"@medusajs/utils": ^1.9.0
"@types/chalk": ^2.2.0 "@types/chalk": ^2.2.0
"@types/commander": ^2.12.2 "@types/commander": ^2.12.2
"@types/configstore": ^6.0.0 "@types/configstore": ^6.0.0
"@types/inquirer": ^9.0.3 "@types/inquirer": ^9.0.3
"@types/node-emoji": ^1.8.2
"@types/pg": ^8.6.6 "@types/pg": ^8.6.6
"@types/uuid": ^9.0.1 "@types/uuid": ^9.0.1
"@types/validator": ^13.7.17 "@types/validator": ^13.7.17
@@ -17774,9 +17964,11 @@ __metadata:
eslint-config-google: ^0.14.0 eslint-config-google: ^0.14.0
eslint-config-prettier: ^8.8.0 eslint-config-prettier: ^8.8.0
eslint-plugin-prettier: ^4.2.1 eslint-plugin-prettier: ^4.2.1
glob: ^10.2.7
inquirer: ^9.2.2 inquirer: ^9.2.2
medusa-telemetry: ^0.0.16 medusa-telemetry: ^0.0.16
nanoid: ^4.0.2 nanoid: ^4.0.2
node-emoji: ^2.0.2
node-fetch: ^3.3.1 node-fetch: ^3.3.1
open: ^9.1.0 open: ^9.1.0
ora: ^6.3.0 ora: ^6.3.0
@@ -19356,6 +19548,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"emojilib@npm:^2.4.0":
version: 2.4.0
resolution: "emojilib@npm:2.4.0"
checksum: 6e66ba8921175842193f974e18af448bb6adb0cf7aeea75e08b9d4ea8e9baba0e4a5347b46ed901491dcaba277485891c33a8d70b0560ca5cc9672a94c21ab8f
languageName: node
linkType: hard
"emojis-list@npm:^3.0.0": "emojis-list@npm:^3.0.0":
version: 3.0.0 version: 3.0.0
resolution: "emojis-list@npm:3.0.0" resolution: "emojis-list@npm:3.0.0"
@@ -20067,6 +20266,83 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"esbuild@npm:^0.17.6":
version: 0.17.19
resolution: "esbuild@npm:0.17.19"
dependencies:
"@esbuild/android-arm": 0.17.19
"@esbuild/android-arm64": 0.17.19
"@esbuild/android-x64": 0.17.19
"@esbuild/darwin-arm64": 0.17.19
"@esbuild/darwin-x64": 0.17.19
"@esbuild/freebsd-arm64": 0.17.19
"@esbuild/freebsd-x64": 0.17.19
"@esbuild/linux-arm": 0.17.19
"@esbuild/linux-arm64": 0.17.19
"@esbuild/linux-ia32": 0.17.19
"@esbuild/linux-loong64": 0.17.19
"@esbuild/linux-mips64el": 0.17.19
"@esbuild/linux-ppc64": 0.17.19
"@esbuild/linux-riscv64": 0.17.19
"@esbuild/linux-s390x": 0.17.19
"@esbuild/linux-x64": 0.17.19
"@esbuild/netbsd-x64": 0.17.19
"@esbuild/openbsd-x64": 0.17.19
"@esbuild/sunos-x64": 0.17.19
"@esbuild/win32-arm64": 0.17.19
"@esbuild/win32-ia32": 0.17.19
"@esbuild/win32-x64": 0.17.19
dependenciesMeta:
"@esbuild/android-arm":
optional: true
"@esbuild/android-arm64":
optional: true
"@esbuild/android-x64":
optional: true
"@esbuild/darwin-arm64":
optional: true
"@esbuild/darwin-x64":
optional: true
"@esbuild/freebsd-arm64":
optional: true
"@esbuild/freebsd-x64":
optional: true
"@esbuild/linux-arm":
optional: true
"@esbuild/linux-arm64":
optional: true
"@esbuild/linux-ia32":
optional: true
"@esbuild/linux-loong64":
optional: true
"@esbuild/linux-mips64el":
optional: true
"@esbuild/linux-ppc64":
optional: true
"@esbuild/linux-riscv64":
optional: true
"@esbuild/linux-s390x":
optional: true
"@esbuild/linux-x64":
optional: true
"@esbuild/netbsd-x64":
optional: true
"@esbuild/openbsd-x64":
optional: true
"@esbuild/sunos-x64":
optional: true
"@esbuild/win32-arm64":
optional: true
"@esbuild/win32-ia32":
optional: true
"@esbuild/win32-x64":
optional: true
bin:
esbuild: bin/esbuild
checksum: c7ac14bfaaebe4745d5d18347b4f6854fd1140acb9389e88dbfa5c20d4e2122451d9647d5498920470a880a605d6e5502b5c2102da6c282b01f129ddd49d2874
languageName: node
linkType: hard
"escalade@npm:^3.1.1": "escalade@npm:^3.1.1":
version: 3.1.1 version: 3.1.1
resolution: "escalade@npm:3.1.1" resolution: "escalade@npm:3.1.1"
@@ -23262,7 +23538,7 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"glob@npm:^10.2.5": "glob@npm:^10.2.5, glob@npm:^10.2.7":
version: 10.2.7 version: 10.2.7
resolution: "glob@npm:10.2.7" resolution: "glob@npm:10.2.7"
dependencies: dependencies:
@@ -29262,6 +29538,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"load-tsconfig@npm:^0.2.3":
version: 0.2.5
resolution: "load-tsconfig@npm:0.2.5"
checksum: bf2823dd26389d3497b6567f07435c5a7a58d9df82e879b0b3892f87d8db26900f84c85bc329ef41c0540c0d6a448d1c23ddc64a80f3ff6838b940f3915a3fcb
languageName: node
linkType: hard
"load-yaml-file@npm:^0.2.0": "load-yaml-file@npm:^0.2.0":
version: 0.2.0 version: 0.2.0
resolution: "load-yaml-file@npm:0.2.0" resolution: "load-yaml-file@npm:0.2.0"
@@ -32145,6 +32428,19 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"node-emoji@npm:^2.0.2":
version: 2.0.2
resolution: "node-emoji@npm:2.0.2"
dependencies:
"@sindresorhus/is": ^5.3.0
char-regex: ^2.0.1
emojilib: ^2.4.0
skin-tone: ^3.0.0
tsup: ^6.7.0
checksum: 3a6fde771e0ea94c798ba94789c7a834aeda938b6b2fb4bb5bc4426cdc02ca6f291df7517238c76b35dfe89f94363eeb843d17336e117c090eeb4c7524e9a792
languageName: node
linkType: hard
"node-environment-flags@npm:^1.0.5": "node-environment-flags@npm:^1.0.5":
version: 1.0.6 version: 1.0.6
resolution: "node-environment-flags@npm:1.0.6" resolution: "node-environment-flags@npm:1.0.6"
@@ -38371,6 +38667,15 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"skin-tone@npm:^3.0.0":
version: 3.0.0
resolution: "skin-tone@npm:3.0.0"
dependencies:
unicode-emoji-modifier-base: ^1.0.0
checksum: 11d08fd438611ab39382dde3ee27c2d4ece4fb5edca08ecf456304a666215b24dd17e7b0a15e84dcf99bdac236a648060b604a31d05cd64d9cba8c0d1a896d5c
languageName: node
linkType: hard
"slash@npm:^2.0.0": "slash@npm:^2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "slash@npm:2.0.0" resolution: "slash@npm:2.0.0"
@@ -40888,6 +41193,42 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"tsup@npm:^6.7.0":
version: 6.7.0
resolution: "tsup@npm:6.7.0"
dependencies:
bundle-require: ^4.0.0
cac: ^6.7.12
chokidar: ^3.5.1
debug: ^4.3.1
esbuild: ^0.17.6
execa: ^5.0.0
globby: ^11.0.3
joycon: ^3.0.1
postcss-load-config: ^3.0.1
resolve-from: ^5.0.0
rollup: ^3.2.5
source-map: 0.8.0-beta.0
sucrase: ^3.20.3
tree-kill: ^1.2.2
peerDependencies:
"@swc/core": ^1
postcss: ^8.4.12
typescript: ">=4.1.0"
peerDependenciesMeta:
"@swc/core":
optional: true
postcss:
optional: true
typescript:
optional: true
bin:
tsup: dist/cli-default.js
tsup-node: dist/cli-node.js
checksum: f6ab9a191b91c68d2bcac9a4df062d26343a9253d5577ee617fa3409e306cb6373ffa6cdb3f6a772e7222a5cf945e330bf6ad9455a7ae3c47aa9eb13f98ac812
languageName: node
linkType: hard
"tsutils@npm:^3.21.0": "tsutils@npm:^3.21.0":
version: 3.21.0 version: 3.21.0
resolution: "tsutils@npm:3.21.0" resolution: "tsutils@npm:3.21.0"
@@ -41476,6 +41817,13 @@ __metadata:
languageName: node languageName: node
linkType: hard linkType: hard
"unicode-emoji-modifier-base@npm:^1.0.0":
version: 1.0.0
resolution: "unicode-emoji-modifier-base@npm:1.0.0"
checksum: b37623fcf0162186debd20f116483e035a2d5b905b932a2c472459d9143d446ebcbefb2a494e2fe4fa7434355396e2a95ec3fc1f0c29a3bc8f2c827220e79c66
languageName: node
linkType: hard
"unicode-match-property-ecmascript@npm:^2.0.0": "unicode-match-property-ecmascript@npm:^2.0.0":
version: 2.0.0 version: 2.0.0
resolution: "unicode-match-property-ecmascript@npm:2.0.0" resolution: "unicode-match-property-ecmascript@npm:2.0.0"