11/// <reference path="../../../__typings__/index.d.ts"/>
2+ import fs from 'node:fs'
3+ import os from 'node:os'
24import path from 'node:path'
35
46import { expect , test } from '@jest/globals'
@@ -119,15 +121,17 @@ test('skipManifestObfuscation does not mutate the original manifest', async () =
119121 } ,
120122 }
121123
122- expect ( await createExportableManifest ( process . cwd ( ) , manifest , {
123- ...defaultOpts ,
124- skipManifestObfuscation : true ,
125- readmeFile : 'readme content' ,
126- } ) ) . toStrictEqual ( {
127- name : 'foo' ,
128- version : '1.0.0' ,
129- main : './dist/index.js' ,
130- readme : 'readme content' ,
124+ await withTempProjectReadme ( 'readme content' , async ( projectDir ) => {
125+ expect ( await createExportableManifest ( projectDir , manifest , {
126+ ...defaultOpts ,
127+ skipManifestObfuscation : true ,
128+ embedReadme : true ,
129+ } ) ) . toStrictEqual ( {
130+ name : 'foo' ,
131+ version : '1.0.0' ,
132+ main : './dist/index.js' ,
133+ readme : 'readme content' ,
134+ } )
131135 } )
132136
133137 expect ( manifest ) . toStrictEqual ( {
@@ -140,16 +144,55 @@ test('skipManifestObfuscation does not mutate the original manifest', async () =
140144} )
141145
142146test ( 'readme added to published manifest' , async ( ) => {
143- expect ( await createExportableManifest ( process . cwd ( ) , {
144- name : 'foo' ,
145- version : '1.0.0' ,
146- } , { ...defaultOpts , readmeFile : 'readme content' } ) ) . toStrictEqual ( {
147- name : 'foo' ,
148- version : '1.0.0' ,
149- readme : 'readme content' ,
147+ await withTempProjectReadme ( 'readme content' , async ( projectDir ) => {
148+ expect ( await createExportableManifest ( projectDir , {
149+ name : 'foo' ,
150+ version : '1.0.0' ,
151+ } , {
152+ ...defaultOpts ,
153+ embedReadme : true ,
154+ } ) ) . toStrictEqual ( {
155+ name : 'foo' ,
156+ version : '1.0.0' ,
157+ readme : 'readme content' ,
158+ } )
150159 } )
151160} )
152161
162+ ; ( process . platform === 'win32' ? test . skip : test ) ( 'readme is not embedded when README.md is a symlink pointing outside the project' , async ( ) => {
163+ const tmpDir = await fs . promises . mkdtemp ( path . join ( os . tmpdir ( ) , 'pnpm-readme-' ) )
164+ try {
165+ const secretFile = path . join ( tmpDir , 'secret.txt' )
166+ await fs . promises . writeFile ( secretFile , 'secret content' , 'utf8' )
167+ const projectDir = path . join ( tmpDir , 'project' )
168+ await fs . promises . mkdir ( projectDir )
169+ await fs . promises . symlink ( secretFile , path . join ( projectDir , 'README.md' ) )
170+
171+ expect ( await createExportableManifest ( projectDir , {
172+ name : 'foo' ,
173+ version : '1.0.0' ,
174+ } , {
175+ ...defaultOpts ,
176+ embedReadme : true ,
177+ } ) ) . toStrictEqual ( {
178+ name : 'foo' ,
179+ version : '1.0.0' ,
180+ } )
181+ } finally {
182+ await fs . promises . rm ( tmpDir , { recursive : true , force : true } )
183+ }
184+ } )
185+
186+ async function withTempProjectReadme < T > ( readmeContent : string , fn : ( projectDir : string ) => Promise < T > ) : Promise < T > {
187+ const projectDir = await fs . promises . mkdtemp ( path . join ( os . tmpdir ( ) , 'pnpm-readme-' ) )
188+ try {
189+ await fs . promises . writeFile ( path . join ( projectDir , 'README.md' ) , readmeContent , 'utf8' )
190+ return await fn ( projectDir )
191+ } finally {
192+ await fs . promises . rm ( projectDir , { recursive : true , force : true } )
193+ }
194+ }
195+
153196test ( 'workspace deps are replaced' , async ( ) => {
154197 const manifest : ProjectManifest = {
155198 name : 'workspace-protocol-package' ,
0 commit comments