@@ -229,7 +229,7 @@ describe('FacetDirectory.generateViteConfig remark plugins', () => {
229229describe ( 'FacetDirectory.generatePackageJson .npmrc' , ( ) => {
230230 it ( 'disables modules-purge confirmation so non-interactive pnpm runs do not abort' , async ( ) => {
231231 await writeFile ( join ( consumerRoot , 'package.json' ) , JSON . stringify ( { name : 'consumer' , version : '0.0.0' } ) ) ;
232- newFacetDir ( ) . generatePackageJson ( ) ;
232+ await newFacetDir ( ) . generatePackageJson ( ) ;
233233 const npmrc = await readFile ( join ( facetRoot , '.npmrc' ) , 'utf-8' ) ;
234234 expect ( npmrc ) . toContain ( 'confirm-modules-purge=false' ) ;
235235 } ) ;
@@ -260,7 +260,7 @@ describe('FACET_PACKAGE_PATH local directory override', () => {
260260 const localRoot = await writeLocalFacetPackage ( ) ;
261261 process . env . FACET_PACKAGE_PATH = localRoot ;
262262
263- newFacetDir ( ) . generatePackageJson ( ) ;
263+ await newFacetDir ( ) . generatePackageJson ( ) ;
264264
265265 const generated = JSON . parse ( await readFile ( join ( facetRoot , 'package.json' ) , 'utf-8' ) ) ;
266266 expect ( generated . dependencies [ '@flanksource/facet' ] ) . toBe ( `file:${ localRoot } ` ) ;
@@ -277,7 +277,7 @@ describe('FACET_PACKAGE_PATH local directory override', () => {
277277 await writeFile ( tarball , 'fake tarball' ) ;
278278 process . env . FACET_PACKAGE_PATH = tarball ;
279279
280- newFacetDir ( ) . generatePackageJson ( ) ;
280+ await newFacetDir ( ) . generatePackageJson ( ) ;
281281
282282 const generated = JSON . parse ( await readFile ( join ( facetRoot , 'package.json' ) , 'utf-8' ) ) ;
283283 expect ( generated . dependencies [ '@flanksource/facet' ] ) . toBe ( `file:${ tarball } ` ) ;
@@ -322,20 +322,43 @@ describe('FACET_PACKAGE_PATH local directory override', () => {
322322 expect ( needsLocalFacetCssBuild ( localRoot ) ) . toBe ( true ) ;
323323 } ) ;
324324
325+ it ( 'waits for a local build lock without blocking the event loop' , async ( ) => {
326+ const localRoot = await writeLocalFacetPackage ( ) ;
327+ process . env . FACET_PACKAGE_PATH = localRoot ;
328+ const future = new Date ( Date . now ( ) + 120_000 ) ;
329+ utimesSync ( join ( localRoot , 'src/components/index.tsx' ) , future , future ) ;
330+ const lockPath = join ( localRoot , '.facet-local-build.lock' ) ;
331+ await writeFile ( lockPath , 'other-process\n' ) ;
332+ let timerRan = false ;
333+ const timer = setTimeout ( ( ) => {
334+ timerRan = true ;
335+ void rm ( lockPath , { force : true } ) ;
336+ } , 25 ) ;
337+
338+ try {
339+ await newFacetDir ( ) . generatePackageJson ( ) ;
340+ } finally {
341+ clearTimeout ( timer ) ;
342+ }
343+
344+ expect ( timerRan ) . toBe ( true ) ;
345+ expect ( existsSync ( lockPath ) ) . toBe ( false ) ;
346+ } ) ;
347+
325348 it ( 'removes a stale installed local package copy when package.json is unchanged' , async ( ) => {
326349 const localRoot = await writeLocalFacetPackage ( ) ;
327350 process . env . FACET_PACKAGE_PATH = localRoot ;
328351 const facetDir = newFacetDir ( ) ;
329352
330- facetDir . generatePackageJson ( ) ;
353+ await facetDir . generatePackageJson ( ) ;
331354
332355 const installedRoot = join ( facetRoot , 'node_modules/@flanksource/facet' ) ;
333356 await mkdir ( join ( installedRoot , 'dist/components' ) , { recursive : true } ) ;
334357 await writeFile ( join ( installedRoot , 'package.json' ) , await readFile ( join ( localRoot , 'package.json' ) , 'utf-8' ) ) ;
335358 await writeFile ( join ( installedRoot , 'dist/components/index.js' ) , 'export const Marker = "stale";\n' ) ;
336359 await writeFile ( join ( facetRoot , 'pnpm-lock.yaml' ) , 'lockfileVersion: 9.0\n' ) ;
337360
338- facetDir . generatePackageJson ( ) ;
361+ await facetDir . generatePackageJson ( ) ;
339362
340363 expect ( existsSync ( installedRoot ) ) . toBe ( false ) ;
341364 expect ( existsSync ( join ( facetRoot , 'pnpm-lock.yaml' ) ) ) . toBe ( false ) ;
0 commit comments