Skip to content

Commit

Permalink
fix: Flaky behavior of Yalc (#11084)
Browse files Browse the repository at this point in the history
  • Loading branch information
thetutlage authored Jan 22, 2025
1 parent 2d0e506 commit e53b8b0
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 8 deletions.
6 changes: 6 additions & 0 deletions .changeset/seven-cooks-drop.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
---
"@medusajs/medusa": patch
"@medusajs/framework": patch
---

fix: Flaky behavior of Yalc
13 changes: 12 additions & 1 deletion packages/core/framework/src/build-tools/compiler.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import path from "path"
import { getConfigFile } from "@medusajs/utils"
import type { AdminOptions, ConfigModule, Logger } from "@medusajs/types"
import { rm, access, constants, copyFile, writeFile } from "fs/promises"
import { rm, access, constants, copyFile, writeFile, mkdir } from "fs/promises"
import type tsStatic from "typescript"

/**
Expand Down Expand Up @@ -140,6 +140,16 @@ export class Compiler {
await rm(path, { recursive: true }).catch(() => {})
}

/**
* Ensures a directory exists
*/
async #ensureDir(path: string, clean?: boolean) {
if (clean) {
await this.#clean(path)
}
await mkdir(path, { recursive: true })
}

/**
* Loads the medusa config file and prints the error to
* the console (in case of any errors). Otherwise, the
Expand Down Expand Up @@ -463,6 +473,7 @@ export class Compiler {
* a file has changed.
*/
async developPluginBackend(onFileChange?: () => void) {
await this.#ensureDir(this.#pluginsDistFolder, true)
await this.#createPluginOptionsFile()
const ts = await this.#loadTSCompiler()

Expand Down
45 changes: 38 additions & 7 deletions packages/medusa/src/commands/plugin/develop.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import * as yalc from "yalc"
import path from "path"
import { execFile } from "child_process"
import { logger } from "@medusajs/framework/logger"
import { Compiler } from "@medusajs/framework/build-tools"

Expand All @@ -7,13 +8,43 @@ export default async function developPlugin({
}: {
directory: string
}) {
let isBusy = false
const compiler = new Compiler(directory, logger)
const yalcBin = path.join(path.dirname(require.resolve("yalc")), "yalc.js")

await compiler.developPluginBackend(async () => {
await yalc.publishPackage({
push: true,
workingDir: directory,
changed: true,
replace: true,
})
/**
* Here we avoid multiple publish calls when the filesystem is
* changed too quickly. This might result in stale content in
* some edge cases. However, not preventing multiple publishes
* at the same time will result in race conditions and the old
* output might appear in the published package.
*/
if (isBusy) {
return
}
isBusy = true

/**
* Yalc is meant to be used a binary and not as a long-lived
* module import. Therefore we will have to execute it like
* a command to get desired outcome. Otherwise, yalc behaves
* flaky.
*/
execFile(
yalcBin,
["publish", "--push", "--no-scripts"],
{
cwd: directory,
},
(error, stdout, stderr) => {
isBusy = false
if (error) {
console.log(error)
}
console.log(stdout)
console.error(stderr)
}
)
})
}

0 comments on commit e53b8b0

Please sign in to comment.