11import fs from 'node:fs/promises'
22import os from 'node:os'
33import path from 'node:path'
4+ import { fileURLToPath } from 'node:url'
45import { execa } from 'execa'
56import { afterEach , describe , expect , it } from 'vitest'
67import { getPackedWorkspacePackages } from './helpers/packed-workspace-packages.js'
7- import { withWorkspaceIntegrationLock } from './helpers/workspace-build-lock.js'
88
99const packagedArrowLibraries = [
1010 '@arrow-js/core' ,
@@ -13,6 +13,7 @@ const packagedArrowLibraries = [
1313 '@arrow-js/hydrate' ,
1414 '@arrow-js/highlight' ,
1515] as const
16+ const repoRoot = path . resolve ( path . dirname ( fileURLToPath ( import . meta. url ) ) , '..' )
1617const tempDirs : string [ ] = [ ]
1718
1819afterEach ( async ( ) => {
@@ -30,117 +31,112 @@ describe('packaged Arrow exports', () => {
3031 const workspace = await createTempDir ( )
3132 const packDir = path . resolve ( workspace , 'packs' )
3233 const consumerDir = path . resolve ( workspace , 'consumer' )
34+ const nodeModulesDir = path . resolve ( consumerDir , 'node_modules' )
3335
34- await withWorkspaceIntegrationLock ( async ( ) => {
35- await fs . mkdir ( packDir , { recursive : true } )
36- await fs . mkdir ( consumerDir , { recursive : true } )
37- const tarballs = await getPackedWorkspacePackages (
38- packagedArrowLibraries ,
39- packDir
40- )
36+ await fs . mkdir ( packDir , { recursive : true } )
37+ await fs . mkdir ( nodeModulesDir , { recursive : true } )
38+ const tarballs = await getPackedWorkspacePackages (
39+ packagedArrowLibraries ,
40+ packDir
41+ )
4142
42- await fs . writeFile (
43- path . resolve ( consumerDir , 'package.json' ) ,
44- `${ JSON . stringify ( {
45- name : 'arrow-package-smoke' ,
46- private : true ,
47- type : 'module' ,
48- dependencies : Object . fromEntries (
49- packagedArrowLibraries . map ( ( packageName ) => [
50- packageName ,
51- `file:${ normalizePath ( tarballs [ packageName ] ) } ` ,
52- ] )
53- ) ,
54- pnpm : {
55- overrides : Object . fromEntries (
56- packagedArrowLibraries . map ( ( packageName ) => [
57- packageName ,
58- `file:${ normalizePath ( tarballs [ packageName ] ) } ` ,
59- ] )
60- ) ,
61- } ,
62- } , null , 2 ) } \n`
43+ for ( const packageName of packagedArrowLibraries ) {
44+ await unpackWorkspaceTarball (
45+ tarballs [ packageName ] ,
46+ path . resolve ( nodeModulesDir , ...packageName . split ( '/' ) )
6347 )
48+ }
6449
65- await execa ( 'pnpm' , [ 'install' , '--prefer-offline' ] , {
66- cwd : consumerDir ,
67- } )
50+ await linkDependency (
51+ path . resolve ( repoRoot , 'node_modules' , 'jsdom' ) ,
52+ path . resolve ( nodeModulesDir , 'jsdom' )
53+ )
6854
69- const verifyScriptPath = path . resolve ( consumerDir , 'verify.mjs' )
70- await fs . writeFile (
71- verifyScriptPath ,
72- [
73- "const [{ component, html }] = await Promise.all([" ,
74- " import('@arrow-js/core')," ,
75- " import('@arrow-js/core/internal')," ,
76- " import('@arrow-js/framework')," ,
77- " import('@arrow-js/framework/internal')," ,
78- " import('@arrow-js/framework/ssr')," ,
79- " import('@arrow-js/ssr')," ,
80- " import('@arrow-js/hydrate')," ,
81- " import('@arrow-js/highlight')," ,
82- '])' ,
83- 'component(async () => html`<p>ok</p>`)' ,
84- "console.log('imports ok')" ,
85- '' ,
86- ] . join ( '\n' )
87- )
55+ const verifyScriptPath = path . resolve ( consumerDir , 'verify.mjs' )
56+ await fs . writeFile (
57+ verifyScriptPath ,
58+ [
59+ "const [{ component, html }] = await Promise.all([" ,
60+ " import('@arrow-js/core')," ,
61+ " import('@arrow-js/core/internal')," ,
62+ " import('@arrow-js/framework')," ,
63+ " import('@arrow-js/framework/internal')," ,
64+ " import('@arrow-js/framework/ssr')," ,
65+ " import('@arrow-js/ssr')," ,
66+ " import('@arrow-js/hydrate')," ,
67+ " import('@arrow-js/highlight')," ,
68+ '])' ,
69+ 'component(async () => html`<p>ok</p>`)' ,
70+ "console.log('imports ok')" ,
71+ '' ,
72+ ] . join ( '\n' )
73+ )
8874
89- const { stdout } = await execa ( 'node' , [ verifyScriptPath ] , {
90- cwd : consumerDir ,
91- } )
75+ const { stdout } = await execa ( 'node' , [ verifyScriptPath ] , {
76+ cwd : consumerDir ,
77+ } )
9278
93- const frameworkPackage = JSON . parse (
94- await fs . readFile (
95- path . resolve ( consumerDir , 'node_modules/@arrow-js/framework/package.json' ) ,
96- 'utf8'
97- )
79+ const frameworkPackage = JSON . parse (
80+ await fs . readFile (
81+ path . resolve ( consumerDir , 'node_modules/@arrow-js/framework/package.json' ) ,
82+ 'utf8'
9883 )
99- const corePackage = JSON . parse (
100- await fs . readFile (
101- path . resolve ( consumerDir , 'node_modules/@arrow-js/core/package.json' ) ,
102- 'utf8'
103- )
84+ )
85+ const corePackage = JSON . parse (
86+ await fs . readFile (
87+ path . resolve ( consumerDir , 'node_modules/@arrow-js/core/package.json' ) ,
88+ 'utf8'
10489 )
105- const ssrPackage = JSON . parse (
106- await fs . readFile (
107- path . resolve ( consumerDir , 'node_modules/@arrow-js/ssr/package.json' ) ,
108- 'utf8'
109- )
90+ )
91+ const ssrPackage = JSON . parse (
92+ await fs . readFile (
93+ path . resolve ( consumerDir , 'node_modules/@arrow-js/ssr/package.json' ) ,
94+ 'utf8'
11095 )
111- const hydratePackage = JSON . parse (
112- await fs . readFile (
113- path . resolve ( consumerDir , 'node_modules/@arrow-js/hydrate/package.json' ) ,
114- 'utf8'
115- )
96+ )
97+ const hydratePackage = JSON . parse (
98+ await fs . readFile (
99+ path . resolve ( consumerDir , 'node_modules/@arrow-js/hydrate/package.json' ) ,
100+ 'utf8'
116101 )
117- const highlightPackage = JSON . parse (
118- await fs . readFile (
119- path . resolve ( consumerDir , 'node_modules/@arrow-js/highlight/package.json' ) ,
120- 'utf8'
121- )
102+ )
103+ const highlightPackage = JSON . parse (
104+ await fs . readFile (
105+ path . resolve ( consumerDir , 'node_modules/@arrow-js/highlight/package.json' ) ,
106+ 'utf8'
122107 )
108+ )
123109
124- expect ( stdout ) . toContain ( 'imports ok' )
125- expect ( corePackage . exports [ './internal' ] . import ) . toBe ( './dist/internal.mjs' )
126- expect ( frameworkPackage . exports [ '.' ] . import ) . toBe ( './dist/index.mjs' )
127- expect ( frameworkPackage . exports [ './internal' ] . import ) . toBe ( './dist/internal.mjs' )
128- expect ( frameworkPackage . exports [ './ssr' ] . import ) . toBe ( './dist/ssr.mjs' )
129- expect ( ssrPackage . exports [ '.' ] . import ) . toBe ( './dist/index.mjs' )
130- expect ( hydratePackage . exports [ '.' ] . import ) . toBe ( './dist/index.mjs' )
131- expect ( highlightPackage . exports [ '.' ] . import ) . toBe ( './dist/index.mjs' )
132- } )
110+ expect ( stdout ) . toContain ( 'imports ok' )
111+ expect ( corePackage . exports [ './internal' ] . import ) . toBe ( './dist/internal.mjs' )
112+ expect ( frameworkPackage . exports [ '.' ] . import ) . toBe ( './dist/index.mjs' )
113+ expect ( frameworkPackage . exports [ './internal' ] . import ) . toBe ( './dist/internal.mjs' )
114+ expect ( frameworkPackage . exports [ './ssr' ] . import ) . toBe ( './dist/ssr.mjs' )
115+ expect ( ssrPackage . exports [ '.' ] . import ) . toBe ( './dist/index.mjs' )
116+ expect ( hydratePackage . exports [ '.' ] . import ) . toBe ( './dist/index.mjs' )
117+ expect ( highlightPackage . exports [ '.' ] . import ) . toBe ( './dist/index.mjs' )
133118 } ,
134- 150_000
119+ 90_000
135120 )
136121} )
137122
123+ async function unpackWorkspaceTarball ( tarballPath : string , destinationPath : string ) {
124+ const extractDir = await createTempDir ( )
125+
126+ await execa ( 'tar' , [ '-xzf' , tarballPath , '-C' , extractDir ] )
127+ await fs . mkdir ( path . dirname ( destinationPath ) , { recursive : true } )
128+ await fs . cp ( path . resolve ( extractDir , 'package' ) , destinationPath , {
129+ recursive : true ,
130+ } )
131+ }
132+
133+ async function linkDependency ( sourcePath : string , destinationPath : string ) {
134+ await fs . mkdir ( path . dirname ( destinationPath ) , { recursive : true } )
135+ await fs . symlink ( sourcePath , destinationPath , 'dir' )
136+ }
137+
138138async function createTempDir ( ) {
139139 const directory = await fs . mkdtemp ( path . resolve ( os . tmpdir ( ) , 'arrow-package-' ) )
140140 tempDirs . push ( directory )
141141 return directory
142142}
143-
144- function normalizePath ( value : string ) {
145- return value . replace ( / \\ / g, '/' )
146- }
0 commit comments