2022-06-21 09:23:39 +00:00
import fs from 'fs' ;
2023-09-18 11:32:49 +00:00
import { URL as URL$1 , fileURLToPath , pathToFileURL } from 'url' ;
2022-06-21 09:23:39 +00:00
import path from 'path' ;
import moduleExports , { Module } from 'module' ;
2022-10-19 08:25:01 +00:00
import { createHash } from 'crypto' ;
import { EOL } from 'os' ;
import assert from 'assert' ;
2022-06-21 09:23:39 +00:00
2022-10-19 08:25:01 +00:00
const SAFE _TIME = 456789e3 ;
const PortablePath = {
root : ` / ` ,
2023-05-05 08:34:23 +00:00
dot : ` . ` ,
parent : ` .. `
2022-10-19 08:25:01 +00:00
} ;
2022-06-21 09:23:39 +00:00
const npath = Object . create ( path ) ;
const ppath = Object . create ( path . posix ) ;
npath . cwd = ( ) => process . cwd ( ) ;
ppath . cwd = ( ) => toPortablePath ( process . cwd ( ) ) ;
ppath . resolve = ( ... segments ) => {
if ( segments . length > 0 && ppath . isAbsolute ( segments [ 0 ] ) ) {
return path . posix . resolve ( ... segments ) ;
} else {
return path . posix . resolve ( ppath . cwd ( ) , ... segments ) ;
}
} ;
const contains = function ( pathUtils , from , to ) {
from = pathUtils . normalize ( from ) ;
to = pathUtils . normalize ( to ) ;
if ( from === to )
return ` . ` ;
if ( ! from . endsWith ( pathUtils . sep ) )
from = from + pathUtils . sep ;
if ( to . startsWith ( from ) ) {
return to . slice ( from . length ) ;
} else {
return null ;
}
} ;
npath . fromPortablePath = fromPortablePath ;
npath . toPortablePath = toPortablePath ;
npath . contains = ( from , to ) => contains ( npath , from , to ) ;
ppath . contains = ( from , to ) => contains ( ppath , from , to ) ;
const WINDOWS _PATH _REGEXP = /^([a-zA-Z]:.*)$/ ;
const UNC _WINDOWS _PATH _REGEXP = /^\/\/(\.\/)?(.*)$/ ;
const PORTABLE _PATH _REGEXP = /^\/([a-zA-Z]:.*)$/ ;
const UNC _PORTABLE _PATH _REGEXP = /^\/unc\/(\.dot\/)?(.*)$/ ;
function fromPortablePath ( p ) {
if ( process . platform !== ` win32 ` )
return p ;
let portablePathMatch , uncPortablePathMatch ;
if ( portablePathMatch = p . match ( PORTABLE _PATH _REGEXP ) )
p = portablePathMatch [ 1 ] ;
else if ( uncPortablePathMatch = p . match ( UNC _PORTABLE _PATH _REGEXP ) )
p = ` \\ \\ ${ uncPortablePathMatch [ 1 ] ? ` . \\ ` : ` ` } ${ uncPortablePathMatch [ 2 ] } ` ;
else
return p ;
return p . replace ( /\//g , ` \\ ` ) ;
}
function toPortablePath ( p ) {
if ( process . platform !== ` win32 ` )
return p ;
p = p . replace ( /\\/g , ` / ` ) ;
let windowsPathMatch , uncWindowsPathMatch ;
if ( windowsPathMatch = p . match ( WINDOWS _PATH _REGEXP ) )
p = ` / ${ windowsPathMatch [ 1 ] } ` ;
else if ( uncWindowsPathMatch = p . match ( UNC _WINDOWS _PATH _REGEXP ) )
p = ` /unc/ ${ uncWindowsPathMatch [ 1 ] ? ` .dot/ ` : ` ` } ${ uncWindowsPathMatch [ 2 ] } ` ;
return p ;
}
2022-10-19 08:25:01 +00:00
function convertPath ( targetPathUtils , sourcePath ) {
return targetPathUtils === npath ? fromPortablePath ( sourcePath ) : toPortablePath ( sourcePath ) ;
}
const defaultTime = new Date ( SAFE _TIME * 1e3 ) ;
const defaultTimeMs = defaultTime . getTime ( ) ;
async function copyPromise ( destinationFs , destination , sourceFs , source , opts ) {
const normalizedDestination = destinationFs . pathUtils . normalize ( destination ) ;
const normalizedSource = sourceFs . pathUtils . normalize ( source ) ;
const prelayout = [ ] ;
const postlayout = [ ] ;
const { atime , mtime } = opts . stableTime ? { atime : defaultTime , mtime : defaultTime } : await sourceFs . lstatPromise ( normalizedSource ) ;
await destinationFs . mkdirpPromise ( destinationFs . pathUtils . dirname ( destination ) , { utimes : [ atime , mtime ] } ) ;
await copyImpl ( prelayout , postlayout , destinationFs , normalizedDestination , sourceFs , normalizedSource , { ... opts , didParentExist : true } ) ;
for ( const operation of prelayout )
await operation ( ) ;
await Promise . all ( postlayout . map ( ( operation ) => {
return operation ( ) ;
} ) ) ;
}
async function copyImpl ( prelayout , postlayout , destinationFs , destination , sourceFs , source , opts ) {
const destinationStat = opts . didParentExist ? await maybeLStat ( destinationFs , destination ) : null ;
const sourceStat = await sourceFs . lstatPromise ( source ) ;
const { atime , mtime } = opts . stableTime ? { atime : defaultTime , mtime : defaultTime } : sourceStat ;
let updated ;
switch ( true ) {
case sourceStat . isDirectory ( ) :
{
updated = await copyFolder ( prelayout , postlayout , destinationFs , destination , destinationStat , sourceFs , source , sourceStat , opts ) ;
}
break ;
case sourceStat . isFile ( ) :
{
updated = await copyFile ( prelayout , postlayout , destinationFs , destination , destinationStat , sourceFs , source , sourceStat , opts ) ;
}
break ;
case sourceStat . isSymbolicLink ( ) :
{
updated = await copySymlink ( prelayout , postlayout , destinationFs , destination , destinationStat , sourceFs , source , sourceStat , opts ) ;
}
break ;
default :
{
throw new Error ( ` Unsupported file type ( ${ sourceStat . mode } ) ` ) ;
}
}
2023-09-18 11:32:49 +00:00
if ( opts . linkStrategy ? . type !== ` HardlinkFromIndex ` || ! sourceStat . isFile ( ) ) {
if ( updated || destinationStat ? . mtime ? . getTime ( ) !== mtime . getTime ( ) || destinationStat ? . atime ? . getTime ( ) !== atime . getTime ( ) ) {
2022-10-19 08:25:01 +00:00
postlayout . push ( ( ) => destinationFs . lutimesPromise ( destination , atime , mtime ) ) ;
updated = true ;
}
if ( destinationStat === null || ( destinationStat . mode & 511 ) !== ( sourceStat . mode & 511 ) ) {
postlayout . push ( ( ) => destinationFs . chmodPromise ( destination , sourceStat . mode & 511 ) ) ;
updated = true ;
}
}
return updated ;
}
async function maybeLStat ( baseFs , p ) {
try {
return await baseFs . lstatPromise ( p ) ;
} catch ( e ) {
return null ;
}
}
async function copyFolder ( prelayout , postlayout , destinationFs , destination , destinationStat , sourceFs , source , sourceStat , opts ) {
if ( destinationStat !== null && ! destinationStat . isDirectory ( ) ) {
if ( opts . overwrite ) {
prelayout . push ( async ( ) => destinationFs . removePromise ( destination ) ) ;
destinationStat = null ;
} else {
return false ;
}
}
let updated = false ;
if ( destinationStat === null ) {
prelayout . push ( async ( ) => {
try {
await destinationFs . mkdirPromise ( destination , { mode : sourceStat . mode } ) ;
} catch ( err ) {
if ( err . code !== ` EEXIST ` ) {
throw err ;
}
}
} ) ;
updated = true ;
}
const entries = await sourceFs . readdirPromise ( source ) ;
const nextOpts = opts . didParentExist && ! destinationStat ? { ... opts , didParentExist : false } : opts ;
if ( opts . stableSort ) {
for ( const entry of entries . sort ( ) ) {
if ( await copyImpl ( prelayout , postlayout , destinationFs , destinationFs . pathUtils . join ( destination , entry ) , sourceFs , sourceFs . pathUtils . join ( source , entry ) , nextOpts ) ) {
updated = true ;
}
}
} else {
const entriesUpdateStatus = await Promise . all ( entries . map ( async ( entry ) => {
await copyImpl ( prelayout , postlayout , destinationFs , destinationFs . pathUtils . join ( destination , entry ) , sourceFs , sourceFs . pathUtils . join ( source , entry ) , nextOpts ) ;
} ) ) ;
if ( entriesUpdateStatus . some ( ( status ) => status ) ) {
updated = true ;
}
}
return updated ;
}
async function copyFileViaIndex ( prelayout , postlayout , destinationFs , destination , destinationStat , sourceFs , source , sourceStat , opts , linkStrategy ) {
const sourceHash = await sourceFs . checksumFilePromise ( source , { algorithm : ` sha1 ` } ) ;
const indexPath = destinationFs . pathUtils . join ( linkStrategy . indexPath , sourceHash . slice ( 0 , 2 ) , ` ${ sourceHash } .dat ` ) ;
let AtomicBehavior ;
( ( AtomicBehavior2 ) => {
AtomicBehavior2 [ AtomicBehavior2 [ "Lock" ] = 0 ] = "Lock" ;
AtomicBehavior2 [ AtomicBehavior2 [ "Rename" ] = 1 ] = "Rename" ;
} ) ( AtomicBehavior || ( AtomicBehavior = { } ) ) ;
let atomicBehavior = 1 /* Rename */ ;
let indexStat = await maybeLStat ( destinationFs , indexPath ) ;
if ( destinationStat ) {
const isDestinationHardlinkedFromIndex = indexStat && destinationStat . dev === indexStat . dev && destinationStat . ino === indexStat . ino ;
2023-09-18 11:32:49 +00:00
const isIndexModified = indexStat ? . mtimeMs !== defaultTimeMs ;
2022-10-19 08:25:01 +00:00
if ( isDestinationHardlinkedFromIndex ) {
if ( isIndexModified && linkStrategy . autoRepair ) {
atomicBehavior = 0 /* Lock */ ;
indexStat = null ;
}
}
if ( ! isDestinationHardlinkedFromIndex ) {
if ( opts . overwrite ) {
prelayout . push ( async ( ) => destinationFs . removePromise ( destination ) ) ;
destinationStat = null ;
} else {
return false ;
}
}
}
const tempPath = ! indexStat && atomicBehavior === 1 /* Rename */ ? ` ${ indexPath } . ${ Math . floor ( Math . random ( ) * 4294967296 ) . toString ( 16 ) . padStart ( 8 , ` 0 ` ) } ` : null ;
let tempPathCleaned = false ;
prelayout . push ( async ( ) => {
if ( ! indexStat ) {
if ( atomicBehavior === 0 /* Lock */ ) {
await destinationFs . lockPromise ( indexPath , async ( ) => {
const content = await sourceFs . readFilePromise ( source ) ;
await destinationFs . writeFilePromise ( indexPath , content ) ;
} ) ;
}
if ( atomicBehavior === 1 /* Rename */ && tempPath ) {
const content = await sourceFs . readFilePromise ( source ) ;
await destinationFs . writeFilePromise ( tempPath , content ) ;
try {
await destinationFs . linkPromise ( tempPath , indexPath ) ;
} catch ( err ) {
if ( err . code === ` EEXIST ` ) {
tempPathCleaned = true ;
await destinationFs . unlinkPromise ( tempPath ) ;
} else {
throw err ;
}
}
}
}
if ( ! destinationStat ) {
await destinationFs . linkPromise ( indexPath , destination ) ;
}
} ) ;
postlayout . push ( async ( ) => {
if ( ! indexStat )
await destinationFs . lutimesPromise ( indexPath , defaultTime , defaultTime ) ;
if ( tempPath && ! tempPathCleaned ) {
await destinationFs . unlinkPromise ( tempPath ) ;
}
} ) ;
return false ;
}
async function copyFileDirect ( prelayout , postlayout , destinationFs , destination , destinationStat , sourceFs , source , sourceStat , opts ) {
if ( destinationStat !== null ) {
if ( opts . overwrite ) {
prelayout . push ( async ( ) => destinationFs . removePromise ( destination ) ) ;
destinationStat = null ;
} else {
return false ;
}
}
prelayout . push ( async ( ) => {
const content = await sourceFs . readFilePromise ( source ) ;
await destinationFs . writeFilePromise ( destination , content ) ;
} ) ;
return true ;
}
async function copyFile ( prelayout , postlayout , destinationFs , destination , destinationStat , sourceFs , source , sourceStat , opts ) {
2023-09-18 11:32:49 +00:00
if ( opts . linkStrategy ? . type === ` HardlinkFromIndex ` ) {
2022-10-19 08:25:01 +00:00
return copyFileViaIndex ( prelayout , postlayout , destinationFs , destination , destinationStat , sourceFs , source , sourceStat , opts , opts . linkStrategy ) ;
} else {
return copyFileDirect ( prelayout , postlayout , destinationFs , destination , destinationStat , sourceFs , source , sourceStat , opts ) ;
}
}
async function copySymlink ( prelayout , postlayout , destinationFs , destination , destinationStat , sourceFs , source , sourceStat , opts ) {
if ( destinationStat !== null ) {
if ( opts . overwrite ) {
prelayout . push ( async ( ) => destinationFs . removePromise ( destination ) ) ;
destinationStat = null ;
} else {
return false ;
}
}
prelayout . push ( async ( ) => {
await destinationFs . symlinkPromise ( convertPath ( destinationFs . pathUtils , await sourceFs . readlinkPromise ( source ) ) , destination ) ;
} ) ;
return true ;
}
class FakeFS {
constructor ( pathUtils ) {
this . pathUtils = pathUtils ;
}
async * genTraversePromise ( init , { stableSort = false } = { } ) {
const stack = [ init ] ;
while ( stack . length > 0 ) {
const p = stack . shift ( ) ;
const entry = await this . lstatPromise ( p ) ;
if ( entry . isDirectory ( ) ) {
const entries = await this . readdirPromise ( p ) ;
if ( stableSort ) {
for ( const entry2 of entries . sort ( ) ) {
stack . push ( this . pathUtils . join ( p , entry2 ) ) ;
}
} else {
throw new Error ( ` Not supported ` ) ;
}
} else {
yield p ;
}
}
}
async checksumFilePromise ( path , { algorithm = ` sha512 ` } = { } ) {
const fd = await this . openPromise ( path , ` r ` ) ;
try {
const CHUNK _SIZE = 65536 ;
const chunk = Buffer . allocUnsafeSlow ( CHUNK _SIZE ) ;
const hash = createHash ( algorithm ) ;
let bytesRead = 0 ;
while ( ( bytesRead = await this . readPromise ( fd , chunk , 0 , CHUNK _SIZE ) ) !== 0 )
hash . update ( bytesRead === CHUNK _SIZE ? chunk : chunk . slice ( 0 , bytesRead ) ) ;
return hash . digest ( ` hex ` ) ;
} finally {
await this . closePromise ( fd ) ;
}
}
async removePromise ( p , { recursive = true , maxRetries = 5 } = { } ) {
let stat ;
try {
stat = await this . lstatPromise ( p ) ;
} catch ( error ) {
if ( error . code === ` ENOENT ` ) {
return ;
} else {
throw error ;
}
}
if ( stat . isDirectory ( ) ) {
if ( recursive ) {
const entries = await this . readdirPromise ( p ) ;
await Promise . all ( entries . map ( ( entry ) => {
return this . removePromise ( this . pathUtils . resolve ( p , entry ) ) ;
} ) ) ;
}
for ( let t = 0 ; t <= maxRetries ; t ++ ) {
try {
await this . rmdirPromise ( p ) ;
break ;
} catch ( error ) {
if ( error . code !== ` EBUSY ` && error . code !== ` ENOTEMPTY ` ) {
throw error ;
} else if ( t < maxRetries ) {
await new Promise ( ( resolve ) => setTimeout ( resolve , t * 100 ) ) ;
}
}
}
} else {
await this . unlinkPromise ( p ) ;
}
}
removeSync ( p , { recursive = true } = { } ) {
let stat ;
try {
stat = this . lstatSync ( p ) ;
} catch ( error ) {
if ( error . code === ` ENOENT ` ) {
return ;
} else {
throw error ;
}
}
if ( stat . isDirectory ( ) ) {
if ( recursive )
for ( const entry of this . readdirSync ( p ) )
this . removeSync ( this . pathUtils . resolve ( p , entry ) ) ;
this . rmdirSync ( p ) ;
} else {
this . unlinkSync ( p ) ;
}
}
async mkdirpPromise ( p , { chmod , utimes } = { } ) {
p = this . resolve ( p ) ;
if ( p === this . pathUtils . dirname ( p ) )
return void 0 ;
const parts = p . split ( this . pathUtils . sep ) ;
let createdDirectory ;
for ( let u = 2 ; u <= parts . length ; ++ u ) {
const subPath = parts . slice ( 0 , u ) . join ( this . pathUtils . sep ) ;
if ( ! this . existsSync ( subPath ) ) {
try {
await this . mkdirPromise ( subPath ) ;
} catch ( error ) {
if ( error . code === ` EEXIST ` ) {
continue ;
} else {
throw error ;
}
}
2023-09-18 11:32:49 +00:00
createdDirectory ? ? = subPath ;
2022-10-19 08:25:01 +00:00
if ( chmod != null )
await this . chmodPromise ( subPath , chmod ) ;
if ( utimes != null ) {
await this . utimesPromise ( subPath , utimes [ 0 ] , utimes [ 1 ] ) ;
} else {
const parentStat = await this . statPromise ( this . pathUtils . dirname ( subPath ) ) ;
await this . utimesPromise ( subPath , parentStat . atime , parentStat . mtime ) ;
}
}
}
return createdDirectory ;
}
mkdirpSync ( p , { chmod , utimes } = { } ) {
p = this . resolve ( p ) ;
if ( p === this . pathUtils . dirname ( p ) )
return void 0 ;
const parts = p . split ( this . pathUtils . sep ) ;
let createdDirectory ;
for ( let u = 2 ; u <= parts . length ; ++ u ) {
const subPath = parts . slice ( 0 , u ) . join ( this . pathUtils . sep ) ;
if ( ! this . existsSync ( subPath ) ) {
try {
this . mkdirSync ( subPath ) ;
} catch ( error ) {
if ( error . code === ` EEXIST ` ) {
continue ;
} else {
throw error ;
}
}
2023-09-18 11:32:49 +00:00
createdDirectory ? ? = subPath ;
2022-10-19 08:25:01 +00:00
if ( chmod != null )
this . chmodSync ( subPath , chmod ) ;
if ( utimes != null ) {
this . utimesSync ( subPath , utimes [ 0 ] , utimes [ 1 ] ) ;
} else {
const parentStat = this . statSync ( this . pathUtils . dirname ( subPath ) ) ;
this . utimesSync ( subPath , parentStat . atime , parentStat . mtime ) ;
}
}
}
return createdDirectory ;
}
async copyPromise ( destination , source , { baseFs = this , overwrite = true , stableSort = false , stableTime = false , linkStrategy = null } = { } ) {
return await copyPromise ( this , destination , baseFs , source , { overwrite , stableSort , stableTime , linkStrategy } ) ;
}
copySync ( destination , source , { baseFs = this , overwrite = true } = { } ) {
const stat = baseFs . lstatSync ( source ) ;
const exists = this . existsSync ( destination ) ;
if ( stat . isDirectory ( ) ) {
this . mkdirpSync ( destination ) ;
const directoryListing = baseFs . readdirSync ( source ) ;
for ( const entry of directoryListing ) {
this . copySync ( this . pathUtils . join ( destination , entry ) , baseFs . pathUtils . join ( source , entry ) , { baseFs , overwrite } ) ;
}
} else if ( stat . isFile ( ) ) {
if ( ! exists || overwrite ) {
if ( exists )
this . removeSync ( destination ) ;
const content = baseFs . readFileSync ( source ) ;
this . writeFileSync ( destination , content ) ;
}
} else if ( stat . isSymbolicLink ( ) ) {
if ( ! exists || overwrite ) {
if ( exists )
this . removeSync ( destination ) ;
const target = baseFs . readlinkSync ( source ) ;
this . symlinkSync ( convertPath ( this . pathUtils , target ) , destination ) ;
}
} else {
throw new Error ( ` Unsupported file type (file: ${ source } , mode: 0o ${ stat . mode . toString ( 8 ) . padStart ( 6 , ` 0 ` ) } ) ` ) ;
}
const mode = stat . mode & 511 ;
this . chmodSync ( destination , mode ) ;
}
async changeFilePromise ( p , content , opts = { } ) {
if ( Buffer . isBuffer ( content ) ) {
return this . changeFileBufferPromise ( p , content , opts ) ;
} else {
return this . changeFileTextPromise ( p , content , opts ) ;
}
}
async changeFileBufferPromise ( p , content , { mode } = { } ) {
let current = Buffer . alloc ( 0 ) ;
try {
current = await this . readFilePromise ( p ) ;
} catch ( error ) {
}
if ( Buffer . compare ( current , content ) === 0 )
return ;
await this . writeFilePromise ( p , content , { mode } ) ;
}
async changeFileTextPromise ( p , content , { automaticNewlines , mode } = { } ) {
let current = ` ` ;
try {
current = await this . readFilePromise ( p , ` utf8 ` ) ;
} catch ( error ) {
}
const normalizedContent = automaticNewlines ? normalizeLineEndings ( current , content ) : content ;
if ( current === normalizedContent )
return ;
await this . writeFilePromise ( p , normalizedContent , { mode } ) ;
}
changeFileSync ( p , content , opts = { } ) {
if ( Buffer . isBuffer ( content ) ) {
return this . changeFileBufferSync ( p , content , opts ) ;
} else {
return this . changeFileTextSync ( p , content , opts ) ;
}
}
changeFileBufferSync ( p , content , { mode } = { } ) {
let current = Buffer . alloc ( 0 ) ;
try {
current = this . readFileSync ( p ) ;
} catch ( error ) {
}
if ( Buffer . compare ( current , content ) === 0 )
return ;
this . writeFileSync ( p , content , { mode } ) ;
}
changeFileTextSync ( p , content , { automaticNewlines = false , mode } = { } ) {
let current = ` ` ;
try {
current = this . readFileSync ( p , ` utf8 ` ) ;
} catch ( error ) {
}
const normalizedContent = automaticNewlines ? normalizeLineEndings ( current , content ) : content ;
if ( current === normalizedContent )
return ;
this . writeFileSync ( p , normalizedContent , { mode } ) ;
}
async movePromise ( fromP , toP ) {
try {
await this . renamePromise ( fromP , toP ) ;
} catch ( error ) {
if ( error . code === ` EXDEV ` ) {
await this . copyPromise ( toP , fromP ) ;
await this . removePromise ( fromP ) ;
} else {
throw error ;
}
}
}
moveSync ( fromP , toP ) {
try {
this . renameSync ( fromP , toP ) ;
} catch ( error ) {
if ( error . code === ` EXDEV ` ) {
this . copySync ( toP , fromP ) ;
this . removeSync ( fromP ) ;
} else {
throw error ;
}
}
}
async lockPromise ( affectedPath , callback ) {
const lockPath = ` ${ affectedPath } .flock ` ;
const interval = 1e3 / 60 ;
const startTime = Date . now ( ) ;
let fd = null ;
const isAlive = async ( ) => {
let pid ;
try {
[ pid ] = await this . readJsonPromise ( lockPath ) ;
} catch ( error ) {
return Date . now ( ) - startTime < 500 ;
}
try {
process . kill ( pid , 0 ) ;
return true ;
} catch ( error ) {
return false ;
}
} ;
while ( fd === null ) {
try {
fd = await this . openPromise ( lockPath , ` wx ` ) ;
} catch ( error ) {
if ( error . code === ` EEXIST ` ) {
if ( ! await isAlive ( ) ) {
try {
await this . unlinkPromise ( lockPath ) ;
continue ;
} catch ( error2 ) {
}
}
if ( Date . now ( ) - startTime < 60 * 1e3 ) {
await new Promise ( ( resolve ) => setTimeout ( resolve , interval ) ) ;
} else {
throw new Error ( ` Couldn't acquire a lock in a reasonable time (via ${ lockPath } ) ` ) ;
}
} else {
throw error ;
}
}
}
await this . writePromise ( fd , JSON . stringify ( [ process . pid ] ) ) ;
try {
return await callback ( ) ;
} finally {
try {
await this . closePromise ( fd ) ;
await this . unlinkPromise ( lockPath ) ;
} catch ( error ) {
}
}
}
async readJsonPromise ( p ) {
const content = await this . readFilePromise ( p , ` utf8 ` ) ;
try {
return JSON . parse ( content ) ;
} catch ( error ) {
error . message += ` (in ${ p } ) ` ;
throw error ;
}
}
readJsonSync ( p ) {
const content = this . readFileSync ( p , ` utf8 ` ) ;
try {
return JSON . parse ( content ) ;
} catch ( error ) {
error . message += ` (in ${ p } ) ` ;
throw error ;
}
}
2023-09-18 11:32:49 +00:00
async writeJsonPromise ( p , data , { compact = false } = { } ) {
const space = compact ? 0 : 2 ;
return await this . writeFilePromise ( p , ` ${ JSON . stringify ( data , null , space ) }
2022-10-19 08:25:01 +00:00
` );
}
2023-09-18 11:32:49 +00:00
writeJsonSync ( p , data , { compact = false } = { } ) {
const space = compact ? 0 : 2 ;
return this . writeFileSync ( p , ` ${ JSON . stringify ( data , null , space ) }
2022-10-19 08:25:01 +00:00
` );
}
async preserveTimePromise ( p , cb ) {
const stat = await this . lstatPromise ( p ) ;
const result = await cb ( ) ;
if ( typeof result !== ` undefined ` )
p = result ;
await this . lutimesPromise ( p , stat . atime , stat . mtime ) ;
}
async preserveTimeSync ( p , cb ) {
const stat = this . lstatSync ( p ) ;
const result = cb ( ) ;
if ( typeof result !== ` undefined ` )
p = result ;
this . lutimesSync ( p , stat . atime , stat . mtime ) ;
}
}
class BasePortableFakeFS extends FakeFS {
constructor ( ) {
super ( ppath ) ;
}
}
function getEndOfLine ( content ) {
const matches = content . match ( /\r?\n/g ) ;
if ( matches === null )
return EOL ;
const crlf = matches . filter ( ( nl ) => nl === ` \r
` ).length;
const lf = matches . length - crlf ;
return crlf > lf ? ` \r
` : `
` ;
}
function normalizeLineEndings ( originalContent , newContent ) {
return newContent . replace ( /\r?\n/g , getEndOfLine ( originalContent ) ) ;
}
class ProxiedFS extends FakeFS {
getExtractHint ( hints ) {
return this . baseFs . getExtractHint ( hints ) ;
}
resolve ( path ) {
return this . mapFromBase ( this . baseFs . resolve ( this . mapToBase ( path ) ) ) ;
}
getRealPath ( ) {
return this . mapFromBase ( this . baseFs . getRealPath ( ) ) ;
}
async openPromise ( p , flags , mode ) {
return this . baseFs . openPromise ( this . mapToBase ( p ) , flags , mode ) ;
}
openSync ( p , flags , mode ) {
return this . baseFs . openSync ( this . mapToBase ( p ) , flags , mode ) ;
}
async opendirPromise ( p , opts ) {
return Object . assign ( await this . baseFs . opendirPromise ( this . mapToBase ( p ) , opts ) , { path : p } ) ;
}
opendirSync ( p , opts ) {
return Object . assign ( this . baseFs . opendirSync ( this . mapToBase ( p ) , opts ) , { path : p } ) ;
}
async readPromise ( fd , buffer , offset , length , position ) {
return await this . baseFs . readPromise ( fd , buffer , offset , length , position ) ;
}
readSync ( fd , buffer , offset , length , position ) {
return this . baseFs . readSync ( fd , buffer , offset , length , position ) ;
}
async writePromise ( fd , buffer , offset , length , position ) {
if ( typeof buffer === ` string ` ) {
return await this . baseFs . writePromise ( fd , buffer , offset ) ;
} else {
return await this . baseFs . writePromise ( fd , buffer , offset , length , position ) ;
}
}
writeSync ( fd , buffer , offset , length , position ) {
if ( typeof buffer === ` string ` ) {
return this . baseFs . writeSync ( fd , buffer , offset ) ;
} else {
return this . baseFs . writeSync ( fd , buffer , offset , length , position ) ;
}
}
async closePromise ( fd ) {
return this . baseFs . closePromise ( fd ) ;
}
closeSync ( fd ) {
this . baseFs . closeSync ( fd ) ;
}
createReadStream ( p , opts ) {
return this . baseFs . createReadStream ( p !== null ? this . mapToBase ( p ) : p , opts ) ;
}
createWriteStream ( p , opts ) {
return this . baseFs . createWriteStream ( p !== null ? this . mapToBase ( p ) : p , opts ) ;
}
async realpathPromise ( p ) {
return this . mapFromBase ( await this . baseFs . realpathPromise ( this . mapToBase ( p ) ) ) ;
}
realpathSync ( p ) {
return this . mapFromBase ( this . baseFs . realpathSync ( this . mapToBase ( p ) ) ) ;
}
async existsPromise ( p ) {
return this . baseFs . existsPromise ( this . mapToBase ( p ) ) ;
}
existsSync ( p ) {
return this . baseFs . existsSync ( this . mapToBase ( p ) ) ;
}
accessSync ( p , mode ) {
return this . baseFs . accessSync ( this . mapToBase ( p ) , mode ) ;
}
async accessPromise ( p , mode ) {
return this . baseFs . accessPromise ( this . mapToBase ( p ) , mode ) ;
}
async statPromise ( p , opts ) {
return this . baseFs . statPromise ( this . mapToBase ( p ) , opts ) ;
}
statSync ( p , opts ) {
return this . baseFs . statSync ( this . mapToBase ( p ) , opts ) ;
}
async fstatPromise ( fd , opts ) {
return this . baseFs . fstatPromise ( fd , opts ) ;
}
fstatSync ( fd , opts ) {
return this . baseFs . fstatSync ( fd , opts ) ;
}
lstatPromise ( p , opts ) {
return this . baseFs . lstatPromise ( this . mapToBase ( p ) , opts ) ;
}
lstatSync ( p , opts ) {
return this . baseFs . lstatSync ( this . mapToBase ( p ) , opts ) ;
}
async fchmodPromise ( fd , mask ) {
return this . baseFs . fchmodPromise ( fd , mask ) ;
}
fchmodSync ( fd , mask ) {
return this . baseFs . fchmodSync ( fd , mask ) ;
}
async chmodPromise ( p , mask ) {
return this . baseFs . chmodPromise ( this . mapToBase ( p ) , mask ) ;
}
chmodSync ( p , mask ) {
return this . baseFs . chmodSync ( this . mapToBase ( p ) , mask ) ;
}
async fchownPromise ( fd , uid , gid ) {
return this . baseFs . fchownPromise ( fd , uid , gid ) ;
}
fchownSync ( fd , uid , gid ) {
return this . baseFs . fchownSync ( fd , uid , gid ) ;
}
async chownPromise ( p , uid , gid ) {
return this . baseFs . chownPromise ( this . mapToBase ( p ) , uid , gid ) ;
}
chownSync ( p , uid , gid ) {
return this . baseFs . chownSync ( this . mapToBase ( p ) , uid , gid ) ;
}
async renamePromise ( oldP , newP ) {
return this . baseFs . renamePromise ( this . mapToBase ( oldP ) , this . mapToBase ( newP ) ) ;
}
renameSync ( oldP , newP ) {
return this . baseFs . renameSync ( this . mapToBase ( oldP ) , this . mapToBase ( newP ) ) ;
}
async copyFilePromise ( sourceP , destP , flags = 0 ) {
return this . baseFs . copyFilePromise ( this . mapToBase ( sourceP ) , this . mapToBase ( destP ) , flags ) ;
}
copyFileSync ( sourceP , destP , flags = 0 ) {
return this . baseFs . copyFileSync ( this . mapToBase ( sourceP ) , this . mapToBase ( destP ) , flags ) ;
}
async appendFilePromise ( p , content , opts ) {
return this . baseFs . appendFilePromise ( this . fsMapToBase ( p ) , content , opts ) ;
}
appendFileSync ( p , content , opts ) {
return this . baseFs . appendFileSync ( this . fsMapToBase ( p ) , content , opts ) ;
}
async writeFilePromise ( p , content , opts ) {
return this . baseFs . writeFilePromise ( this . fsMapToBase ( p ) , content , opts ) ;
}
writeFileSync ( p , content , opts ) {
return this . baseFs . writeFileSync ( this . fsMapToBase ( p ) , content , opts ) ;
}
async unlinkPromise ( p ) {
return this . baseFs . unlinkPromise ( this . mapToBase ( p ) ) ;
}
unlinkSync ( p ) {
return this . baseFs . unlinkSync ( this . mapToBase ( p ) ) ;
}
async utimesPromise ( p , atime , mtime ) {
return this . baseFs . utimesPromise ( this . mapToBase ( p ) , atime , mtime ) ;
}
utimesSync ( p , atime , mtime ) {
return this . baseFs . utimesSync ( this . mapToBase ( p ) , atime , mtime ) ;
}
async lutimesPromise ( p , atime , mtime ) {
return this . baseFs . lutimesPromise ( this . mapToBase ( p ) , atime , mtime ) ;
}
lutimesSync ( p , atime , mtime ) {
return this . baseFs . lutimesSync ( this . mapToBase ( p ) , atime , mtime ) ;
}
async mkdirPromise ( p , opts ) {
return this . baseFs . mkdirPromise ( this . mapToBase ( p ) , opts ) ;
}
mkdirSync ( p , opts ) {
return this . baseFs . mkdirSync ( this . mapToBase ( p ) , opts ) ;
}
async rmdirPromise ( p , opts ) {
return this . baseFs . rmdirPromise ( this . mapToBase ( p ) , opts ) ;
}
rmdirSync ( p , opts ) {
return this . baseFs . rmdirSync ( this . mapToBase ( p ) , opts ) ;
}
async linkPromise ( existingP , newP ) {
return this . baseFs . linkPromise ( this . mapToBase ( existingP ) , this . mapToBase ( newP ) ) ;
}
linkSync ( existingP , newP ) {
return this . baseFs . linkSync ( this . mapToBase ( existingP ) , this . mapToBase ( newP ) ) ;
}
async symlinkPromise ( target , p , type ) {
const mappedP = this . mapToBase ( p ) ;
if ( this . pathUtils . isAbsolute ( target ) )
return this . baseFs . symlinkPromise ( this . mapToBase ( target ) , mappedP , type ) ;
const mappedAbsoluteTarget = this . mapToBase ( this . pathUtils . join ( this . pathUtils . dirname ( p ) , target ) ) ;
const mappedTarget = this . baseFs . pathUtils . relative ( this . baseFs . pathUtils . dirname ( mappedP ) , mappedAbsoluteTarget ) ;
return this . baseFs . symlinkPromise ( mappedTarget , mappedP , type ) ;
}
symlinkSync ( target , p , type ) {
const mappedP = this . mapToBase ( p ) ;
if ( this . pathUtils . isAbsolute ( target ) )
return this . baseFs . symlinkSync ( this . mapToBase ( target ) , mappedP , type ) ;
const mappedAbsoluteTarget = this . mapToBase ( this . pathUtils . join ( this . pathUtils . dirname ( p ) , target ) ) ;
const mappedTarget = this . baseFs . pathUtils . relative ( this . baseFs . pathUtils . dirname ( mappedP ) , mappedAbsoluteTarget ) ;
return this . baseFs . symlinkSync ( mappedTarget , mappedP , type ) ;
}
async readFilePromise ( p , encoding ) {
return this . baseFs . readFilePromise ( this . fsMapToBase ( p ) , encoding ) ;
}
readFileSync ( p , encoding ) {
return this . baseFs . readFileSync ( this . fsMapToBase ( p ) , encoding ) ;
}
2023-09-18 11:32:49 +00:00
readdirPromise ( p , opts ) {
2022-10-19 08:25:01 +00:00
return this . baseFs . readdirPromise ( this . mapToBase ( p ) , opts ) ;
}
readdirSync ( p , opts ) {
return this . baseFs . readdirSync ( this . mapToBase ( p ) , opts ) ;
}
async readlinkPromise ( p ) {
return this . mapFromBase ( await this . baseFs . readlinkPromise ( this . mapToBase ( p ) ) ) ;
}
readlinkSync ( p ) {
return this . mapFromBase ( this . baseFs . readlinkSync ( this . mapToBase ( p ) ) ) ;
}
async truncatePromise ( p , len ) {
return this . baseFs . truncatePromise ( this . mapToBase ( p ) , len ) ;
}
truncateSync ( p , len ) {
return this . baseFs . truncateSync ( this . mapToBase ( p ) , len ) ;
}
async ftruncatePromise ( fd , len ) {
return this . baseFs . ftruncatePromise ( fd , len ) ;
}
ftruncateSync ( fd , len ) {
return this . baseFs . ftruncateSync ( fd , len ) ;
}
watch ( p , a , b ) {
return this . baseFs . watch (
this . mapToBase ( p ) ,
a ,
b
) ;
}
watchFile ( p , a , b ) {
return this . baseFs . watchFile (
this . mapToBase ( p ) ,
a ,
b
) ;
}
unwatchFile ( p , cb ) {
return this . baseFs . unwatchFile ( this . mapToBase ( p ) , cb ) ;
}
fsMapToBase ( p ) {
if ( typeof p === ` number ` ) {
return p ;
} else {
return this . mapToBase ( p ) ;
}
}
}
class NodeFS extends BasePortableFakeFS {
constructor ( realFs = fs ) {
super ( ) ;
this . realFs = realFs ;
}
getExtractHint ( ) {
return false ;
}
getRealPath ( ) {
return PortablePath . root ;
}
resolve ( p ) {
return ppath . resolve ( p ) ;
}
async openPromise ( p , flags , mode ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . open ( npath . fromPortablePath ( p ) , flags , mode , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
openSync ( p , flags , mode ) {
return this . realFs . openSync ( npath . fromPortablePath ( p ) , flags , mode ) ;
}
async opendirPromise ( p , opts ) {
return await new Promise ( ( resolve , reject ) => {
if ( typeof opts !== ` undefined ` ) {
this . realFs . opendir ( npath . fromPortablePath ( p ) , opts , this . makeCallback ( resolve , reject ) ) ;
} else {
this . realFs . opendir ( npath . fromPortablePath ( p ) , this . makeCallback ( resolve , reject ) ) ;
}
} ) . then ( ( dir ) => {
2023-09-18 11:32:49 +00:00
const dirWithFixedPath = dir ;
Object . defineProperty ( dirWithFixedPath , ` path ` , {
value : p ,
configurable : true ,
writable : true
} ) ;
return dirWithFixedPath ;
2022-10-19 08:25:01 +00:00
} ) ;
}
opendirSync ( p , opts ) {
const dir = typeof opts !== ` undefined ` ? this . realFs . opendirSync ( npath . fromPortablePath ( p ) , opts ) : this . realFs . opendirSync ( npath . fromPortablePath ( p ) ) ;
2023-09-18 11:32:49 +00:00
const dirWithFixedPath = dir ;
Object . defineProperty ( dirWithFixedPath , ` path ` , {
value : p ,
configurable : true ,
writable : true
} ) ;
return dirWithFixedPath ;
2022-10-19 08:25:01 +00:00
}
async readPromise ( fd , buffer , offset = 0 , length = 0 , position = - 1 ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . read ( fd , buffer , offset , length , position , ( error , bytesRead ) => {
if ( error ) {
reject ( error ) ;
} else {
resolve ( bytesRead ) ;
}
} ) ;
} ) ;
}
readSync ( fd , buffer , offset , length , position ) {
return this . realFs . readSync ( fd , buffer , offset , length , position ) ;
}
async writePromise ( fd , buffer , offset , length , position ) {
return await new Promise ( ( resolve , reject ) => {
if ( typeof buffer === ` string ` ) {
return this . realFs . write ( fd , buffer , offset , this . makeCallback ( resolve , reject ) ) ;
} else {
return this . realFs . write ( fd , buffer , offset , length , position , this . makeCallback ( resolve , reject ) ) ;
}
} ) ;
}
writeSync ( fd , buffer , offset , length , position ) {
if ( typeof buffer === ` string ` ) {
return this . realFs . writeSync ( fd , buffer , offset ) ;
} else {
return this . realFs . writeSync ( fd , buffer , offset , length , position ) ;
}
}
async closePromise ( fd ) {
await new Promise ( ( resolve , reject ) => {
this . realFs . close ( fd , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
closeSync ( fd ) {
this . realFs . closeSync ( fd ) ;
}
createReadStream ( p , opts ) {
const realPath = p !== null ? npath . fromPortablePath ( p ) : p ;
return this . realFs . createReadStream ( realPath , opts ) ;
}
createWriteStream ( p , opts ) {
const realPath = p !== null ? npath . fromPortablePath ( p ) : p ;
return this . realFs . createWriteStream ( realPath , opts ) ;
}
async realpathPromise ( p ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . realpath ( npath . fromPortablePath ( p ) , { } , this . makeCallback ( resolve , reject ) ) ;
} ) . then ( ( path ) => {
return npath . toPortablePath ( path ) ;
} ) ;
}
realpathSync ( p ) {
return npath . toPortablePath ( this . realFs . realpathSync ( npath . fromPortablePath ( p ) , { } ) ) ;
}
async existsPromise ( p ) {
return await new Promise ( ( resolve ) => {
this . realFs . exists ( npath . fromPortablePath ( p ) , resolve ) ;
} ) ;
}
accessSync ( p , mode ) {
return this . realFs . accessSync ( npath . fromPortablePath ( p ) , mode ) ;
}
async accessPromise ( p , mode ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . access ( npath . fromPortablePath ( p ) , mode , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
existsSync ( p ) {
return this . realFs . existsSync ( npath . fromPortablePath ( p ) ) ;
}
async statPromise ( p , opts ) {
return await new Promise ( ( resolve , reject ) => {
if ( opts ) {
this . realFs . stat ( npath . fromPortablePath ( p ) , opts , this . makeCallback ( resolve , reject ) ) ;
} else {
this . realFs . stat ( npath . fromPortablePath ( p ) , this . makeCallback ( resolve , reject ) ) ;
}
} ) ;
}
statSync ( p , opts ) {
if ( opts ) {
return this . realFs . statSync ( npath . fromPortablePath ( p ) , opts ) ;
} else {
return this . realFs . statSync ( npath . fromPortablePath ( p ) ) ;
}
}
async fstatPromise ( fd , opts ) {
return await new Promise ( ( resolve , reject ) => {
if ( opts ) {
this . realFs . fstat ( fd , opts , this . makeCallback ( resolve , reject ) ) ;
} else {
this . realFs . fstat ( fd , this . makeCallback ( resolve , reject ) ) ;
}
} ) ;
}
fstatSync ( fd , opts ) {
if ( opts ) {
return this . realFs . fstatSync ( fd , opts ) ;
} else {
return this . realFs . fstatSync ( fd ) ;
}
}
async lstatPromise ( p , opts ) {
return await new Promise ( ( resolve , reject ) => {
if ( opts ) {
this . realFs . lstat ( npath . fromPortablePath ( p ) , opts , this . makeCallback ( resolve , reject ) ) ;
} else {
this . realFs . lstat ( npath . fromPortablePath ( p ) , this . makeCallback ( resolve , reject ) ) ;
}
} ) ;
}
lstatSync ( p , opts ) {
if ( opts ) {
return this . realFs . lstatSync ( npath . fromPortablePath ( p ) , opts ) ;
} else {
return this . realFs . lstatSync ( npath . fromPortablePath ( p ) ) ;
}
}
async fchmodPromise ( fd , mask ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . fchmod ( fd , mask , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
fchmodSync ( fd , mask ) {
return this . realFs . fchmodSync ( fd , mask ) ;
}
async chmodPromise ( p , mask ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . chmod ( npath . fromPortablePath ( p ) , mask , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
chmodSync ( p , mask ) {
return this . realFs . chmodSync ( npath . fromPortablePath ( p ) , mask ) ;
}
async fchownPromise ( fd , uid , gid ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . fchown ( fd , uid , gid , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
fchownSync ( fd , uid , gid ) {
return this . realFs . fchownSync ( fd , uid , gid ) ;
}
async chownPromise ( p , uid , gid ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . chown ( npath . fromPortablePath ( p ) , uid , gid , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
chownSync ( p , uid , gid ) {
return this . realFs . chownSync ( npath . fromPortablePath ( p ) , uid , gid ) ;
}
async renamePromise ( oldP , newP ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . rename ( npath . fromPortablePath ( oldP ) , npath . fromPortablePath ( newP ) , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
renameSync ( oldP , newP ) {
return this . realFs . renameSync ( npath . fromPortablePath ( oldP ) , npath . fromPortablePath ( newP ) ) ;
}
async copyFilePromise ( sourceP , destP , flags = 0 ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . copyFile ( npath . fromPortablePath ( sourceP ) , npath . fromPortablePath ( destP ) , flags , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
copyFileSync ( sourceP , destP , flags = 0 ) {
return this . realFs . copyFileSync ( npath . fromPortablePath ( sourceP ) , npath . fromPortablePath ( destP ) , flags ) ;
}
async appendFilePromise ( p , content , opts ) {
return await new Promise ( ( resolve , reject ) => {
const fsNativePath = typeof p === ` string ` ? npath . fromPortablePath ( p ) : p ;
if ( opts ) {
this . realFs . appendFile ( fsNativePath , content , opts , this . makeCallback ( resolve , reject ) ) ;
} else {
this . realFs . appendFile ( fsNativePath , content , this . makeCallback ( resolve , reject ) ) ;
}
} ) ;
}
appendFileSync ( p , content , opts ) {
const fsNativePath = typeof p === ` string ` ? npath . fromPortablePath ( p ) : p ;
if ( opts ) {
this . realFs . appendFileSync ( fsNativePath , content , opts ) ;
} else {
this . realFs . appendFileSync ( fsNativePath , content ) ;
}
}
async writeFilePromise ( p , content , opts ) {
return await new Promise ( ( resolve , reject ) => {
const fsNativePath = typeof p === ` string ` ? npath . fromPortablePath ( p ) : p ;
if ( opts ) {
this . realFs . writeFile ( fsNativePath , content , opts , this . makeCallback ( resolve , reject ) ) ;
} else {
this . realFs . writeFile ( fsNativePath , content , this . makeCallback ( resolve , reject ) ) ;
}
} ) ;
}
writeFileSync ( p , content , opts ) {
const fsNativePath = typeof p === ` string ` ? npath . fromPortablePath ( p ) : p ;
if ( opts ) {
this . realFs . writeFileSync ( fsNativePath , content , opts ) ;
} else {
this . realFs . writeFileSync ( fsNativePath , content ) ;
}
}
async unlinkPromise ( p ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . unlink ( npath . fromPortablePath ( p ) , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
unlinkSync ( p ) {
return this . realFs . unlinkSync ( npath . fromPortablePath ( p ) ) ;
}
async utimesPromise ( p , atime , mtime ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . utimes ( npath . fromPortablePath ( p ) , atime , mtime , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
utimesSync ( p , atime , mtime ) {
this . realFs . utimesSync ( npath . fromPortablePath ( p ) , atime , mtime ) ;
}
async lutimesPromise ( p , atime , mtime ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . lutimes ( npath . fromPortablePath ( p ) , atime , mtime , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
lutimesSync ( p , atime , mtime ) {
this . realFs . lutimesSync ( npath . fromPortablePath ( p ) , atime , mtime ) ;
}
async mkdirPromise ( p , opts ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . mkdir ( npath . fromPortablePath ( p ) , opts , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
mkdirSync ( p , opts ) {
return this . realFs . mkdirSync ( npath . fromPortablePath ( p ) , opts ) ;
}
async rmdirPromise ( p , opts ) {
return await new Promise ( ( resolve , reject ) => {
if ( opts ) {
this . realFs . rmdir ( npath . fromPortablePath ( p ) , opts , this . makeCallback ( resolve , reject ) ) ;
} else {
this . realFs . rmdir ( npath . fromPortablePath ( p ) , this . makeCallback ( resolve , reject ) ) ;
}
} ) ;
}
rmdirSync ( p , opts ) {
return this . realFs . rmdirSync ( npath . fromPortablePath ( p ) , opts ) ;
}
async linkPromise ( existingP , newP ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . link ( npath . fromPortablePath ( existingP ) , npath . fromPortablePath ( newP ) , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
linkSync ( existingP , newP ) {
return this . realFs . linkSync ( npath . fromPortablePath ( existingP ) , npath . fromPortablePath ( newP ) ) ;
}
async symlinkPromise ( target , p , type ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . symlink ( npath . fromPortablePath ( target . replace ( /\/+$/ , ` ` ) ) , npath . fromPortablePath ( p ) , type , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
symlinkSync ( target , p , type ) {
return this . realFs . symlinkSync ( npath . fromPortablePath ( target . replace ( /\/+$/ , ` ` ) ) , npath . fromPortablePath ( p ) , type ) ;
}
async readFilePromise ( p , encoding ) {
return await new Promise ( ( resolve , reject ) => {
const fsNativePath = typeof p === ` string ` ? npath . fromPortablePath ( p ) : p ;
this . realFs . readFile ( fsNativePath , encoding , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
readFileSync ( p , encoding ) {
const fsNativePath = typeof p === ` string ` ? npath . fromPortablePath ( p ) : p ;
return this . realFs . readFileSync ( fsNativePath , encoding ) ;
}
async readdirPromise ( p , opts ) {
return await new Promise ( ( resolve , reject ) => {
2023-09-18 11:32:49 +00:00
if ( opts ) {
this . realFs . readdir ( npath . fromPortablePath ( p ) , opts , this . makeCallback ( resolve , reject ) ) ;
2022-10-19 08:25:01 +00:00
} else {
this . realFs . readdir ( npath . fromPortablePath ( p ) , this . makeCallback ( ( value ) => resolve ( value ) , reject ) ) ;
}
} ) ;
}
readdirSync ( p , opts ) {
2023-09-18 11:32:49 +00:00
if ( opts ) {
return this . realFs . readdirSync ( npath . fromPortablePath ( p ) , opts ) ;
2022-10-19 08:25:01 +00:00
} else {
return this . realFs . readdirSync ( npath . fromPortablePath ( p ) ) ;
}
}
async readlinkPromise ( p ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . readlink ( npath . fromPortablePath ( p ) , this . makeCallback ( resolve , reject ) ) ;
} ) . then ( ( path ) => {
return npath . toPortablePath ( path ) ;
} ) ;
}
readlinkSync ( p ) {
return npath . toPortablePath ( this . realFs . readlinkSync ( npath . fromPortablePath ( p ) ) ) ;
}
async truncatePromise ( p , len ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . truncate ( npath . fromPortablePath ( p ) , len , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
truncateSync ( p , len ) {
return this . realFs . truncateSync ( npath . fromPortablePath ( p ) , len ) ;
}
async ftruncatePromise ( fd , len ) {
return await new Promise ( ( resolve , reject ) => {
this . realFs . ftruncate ( fd , len , this . makeCallback ( resolve , reject ) ) ;
} ) ;
}
ftruncateSync ( fd , len ) {
return this . realFs . ftruncateSync ( fd , len ) ;
}
watch ( p , a , b ) {
return this . realFs . watch (
npath . fromPortablePath ( p ) ,
a ,
b
) ;
}
watchFile ( p , a , b ) {
return this . realFs . watchFile (
npath . fromPortablePath ( p ) ,
a ,
b
) ;
}
unwatchFile ( p , cb ) {
return this . realFs . unwatchFile ( npath . fromPortablePath ( p ) , cb ) ;
}
makeCallback ( resolve , reject ) {
return ( err , result ) => {
if ( err ) {
reject ( err ) ;
} else {
resolve ( result ) ;
}
} ;
}
}
const NUMBER _REGEXP = /^[0-9]+$/ ;
const VIRTUAL _REGEXP = /^(\/(?:[^/]+\/)*?(?:\$\$virtual|__virtual__))((?:\/((?:[^/]+-)?[a-f0-9]+)(?:\/([^/]+))?)?((?:\/.*)?))$/ ;
const VALID _COMPONENT = /^([^/]+-)?[a-f0-9]+$/ ;
class VirtualFS extends ProxiedFS {
constructor ( { baseFs = new NodeFS ( ) } = { } ) {
super ( ppath ) ;
this . baseFs = baseFs ;
}
static makeVirtualPath ( base , component , to ) {
if ( ppath . basename ( base ) !== ` __virtual__ ` )
throw new Error ( ` Assertion failed: Virtual folders must be named "__virtual__" ` ) ;
if ( ! ppath . basename ( component ) . match ( VALID _COMPONENT ) )
throw new Error ( ` Assertion failed: Virtual components must be ended by an hexadecimal hash ` ) ;
const target = ppath . relative ( ppath . dirname ( base ) , to ) ;
const segments = target . split ( ` / ` ) ;
let depth = 0 ;
while ( depth < segments . length && segments [ depth ] === ` .. ` )
depth += 1 ;
const finalSegments = segments . slice ( depth ) ;
const fullVirtualPath = ppath . join ( base , component , String ( depth ) , ... finalSegments ) ;
return fullVirtualPath ;
}
static resolveVirtual ( p ) {
const match = p . match ( VIRTUAL _REGEXP ) ;
if ( ! match || ! match [ 3 ] && match [ 5 ] )
return p ;
const target = ppath . dirname ( match [ 1 ] ) ;
if ( ! match [ 3 ] || ! match [ 4 ] )
return target ;
const isnum = NUMBER _REGEXP . test ( match [ 4 ] ) ;
if ( ! isnum )
return p ;
const depth = Number ( match [ 4 ] ) ;
const backstep = ` ../ ` . repeat ( depth ) ;
const subpath = match [ 5 ] || ` . ` ;
return VirtualFS . resolveVirtual ( ppath . join ( target , backstep , subpath ) ) ;
}
getExtractHint ( hints ) {
return this . baseFs . getExtractHint ( hints ) ;
}
getRealPath ( ) {
return this . baseFs . getRealPath ( ) ;
}
realpathSync ( p ) {
const match = p . match ( VIRTUAL _REGEXP ) ;
if ( ! match )
return this . baseFs . realpathSync ( p ) ;
if ( ! match [ 5 ] )
return p ;
const realpath = this . baseFs . realpathSync ( this . mapToBase ( p ) ) ;
return VirtualFS . makeVirtualPath ( match [ 1 ] , match [ 3 ] , realpath ) ;
}
async realpathPromise ( p ) {
const match = p . match ( VIRTUAL _REGEXP ) ;
if ( ! match )
return await this . baseFs . realpathPromise ( p ) ;
if ( ! match [ 5 ] )
return p ;
const realpath = await this . baseFs . realpathPromise ( this . mapToBase ( p ) ) ;
return VirtualFS . makeVirtualPath ( match [ 1 ] , match [ 3 ] , realpath ) ;
}
mapToBase ( p ) {
if ( p === ` ` )
return p ;
if ( this . pathUtils . isAbsolute ( p ) )
return VirtualFS . resolveVirtual ( p ) ;
const resolvedRoot = VirtualFS . resolveVirtual ( this . baseFs . resolve ( PortablePath . dot ) ) ;
const resolvedP = VirtualFS . resolveVirtual ( this . baseFs . resolve ( p ) ) ;
return ppath . relative ( resolvedRoot , resolvedP ) || PortablePath . dot ;
}
mapFromBase ( p ) {
return p ;
}
}
2022-06-21 09:23:39 +00:00
2023-05-05 08:34:23 +00:00
const [ major , minor ] = process . versions . node . split ( ` . ` ) . map ( ( value ) => parseInt ( value , 10 ) ) ;
const WATCH _MODE _MESSAGE _USES _ARRAYS = major > 19 || major === 19 && minor >= 2 || major === 18 && minor >= 13 ;
const HAS _LAZY _LOADED _TRANSLATORS = major > 19 || major === 19 && minor >= 3 ;
2022-06-21 09:23:39 +00:00
const builtinModules = new Set ( Module . builtinModules || Object . keys ( process . binding ( ` natives ` ) ) ) ;
const isBuiltinModule = ( request ) => request . startsWith ( ` node: ` ) || builtinModules . has ( request ) ;
function readPackageScope ( checkPath ) {
const rootSeparatorIndex = checkPath . indexOf ( npath . sep ) ;
let separatorIndex ;
do {
separatorIndex = checkPath . lastIndexOf ( npath . sep ) ;
checkPath = checkPath . slice ( 0 , separatorIndex ) ;
if ( checkPath . endsWith ( ` ${ npath . sep } node_modules ` ) )
return false ;
const pjson = readPackage ( checkPath + npath . sep ) ;
if ( pjson ) {
return {
data : pjson ,
path : checkPath
} ;
}
} while ( separatorIndex > rootSeparatorIndex ) ;
return false ;
}
function readPackage ( requestPath ) {
const jsonPath = npath . resolve ( requestPath , ` package.json ` ) ;
if ( ! fs . existsSync ( jsonPath ) )
return null ;
return JSON . parse ( fs . readFileSync ( jsonPath , ` utf8 ` ) ) ;
}
2022-10-19 08:25:01 +00:00
async function tryReadFile$1 ( path2 ) {
2022-06-21 09:23:39 +00:00
try {
return await fs . promises . readFile ( path2 , ` utf8 ` ) ;
} catch ( error ) {
if ( error . code === ` ENOENT ` )
return null ;
throw error ;
}
}
function tryParseURL ( str , base ) {
try {
2022-10-19 08:25:01 +00:00
return new URL$1 ( str , base ) ;
2022-06-21 09:23:39 +00:00
} catch {
return null ;
}
}
let entrypointPath = null ;
function setEntrypointPath ( file ) {
entrypointPath = file ;
}
function getFileFormat ( filepath ) {
const ext = path . extname ( filepath ) ;
switch ( ext ) {
case ` .mjs ` : {
return ` module ` ;
}
case ` .cjs ` : {
return ` commonjs ` ;
}
case ` .wasm ` : {
2022-10-19 08:25:01 +00:00
throw new Error (
` Unknown file extension ".wasm" for ${ filepath } `
) ;
2022-06-21 09:23:39 +00:00
}
case ` .json ` : {
2023-09-18 11:32:49 +00:00
return ` json ` ;
2022-06-21 09:23:39 +00:00
}
case ` .js ` : {
const pkg = readPackageScope ( filepath ) ;
if ( ! pkg )
return ` commonjs ` ;
2022-10-19 08:25:01 +00:00
return pkg . data . type ? ? ` commonjs ` ;
2022-06-21 09:23:39 +00:00
}
default : {
if ( entrypointPath !== filepath )
return null ;
const pkg = readPackageScope ( filepath ) ;
if ( ! pkg )
return ` commonjs ` ;
if ( pkg . data . type === ` module ` )
return null ;
2022-10-19 08:25:01 +00:00
return pkg . data . type ? ? ` commonjs ` ;
2022-06-21 09:23:39 +00:00
}
}
}
2022-10-19 08:25:01 +00:00
async function load$1 ( urlString , context , nextLoad ) {
2022-06-21 09:23:39 +00:00
const url = tryParseURL ( urlString ) ;
2023-09-18 11:32:49 +00:00
if ( url ? . protocol !== ` file: ` )
2022-10-19 08:25:01 +00:00
return nextLoad ( urlString , context , nextLoad ) ;
2022-06-21 09:23:39 +00:00
const filePath = fileURLToPath ( url ) ;
const format = getFileFormat ( filePath ) ;
if ( ! format )
2022-10-19 08:25:01 +00:00
return nextLoad ( urlString , context , nextLoad ) ;
2023-09-18 11:32:49 +00:00
if ( format === ` json ` && context . importAssertions ? . type !== ` json ` ) {
2022-10-19 08:25:01 +00:00
const err = new TypeError ( ` [ERR_IMPORT_ASSERTION_TYPE_MISSING]: Module " ${ urlString } " needs an import assertion of type "json" ` ) ;
err . code = ` ERR_IMPORT_ASSERTION_TYPE_MISSING ` ;
throw err ;
}
if ( process . env . WATCH _REPORT _DEPENDENCIES && process . send ) {
2023-05-05 08:34:23 +00:00
const pathToSend = pathToFileURL (
npath . fromPortablePath (
VirtualFS . resolveVirtual ( npath . toPortablePath ( filePath ) )
)
) . href ;
2022-10-19 08:25:01 +00:00
process . send ( {
2023-05-05 08:34:23 +00:00
"watch:import" : WATCH _MODE _MESSAGE _USES _ARRAYS ? [ pathToSend ] : pathToSend
2022-10-19 08:25:01 +00:00
} ) ;
}
2022-06-21 09:23:39 +00:00
return {
format ,
2023-09-18 11:32:49 +00:00
source : format === ` commonjs ` ? void 0 : await fs . promises . readFile ( filePath , ` utf8 ` ) ,
2022-10-19 08:25:01 +00:00
shortCircuit : true
} ;
}
const ArrayIsArray = Array . isArray ;
const JSONStringify = JSON . stringify ;
const ObjectGetOwnPropertyNames = Object . getOwnPropertyNames ;
const ObjectPrototypeHasOwnProperty = ( obj , prop ) => Object . prototype . hasOwnProperty . call ( obj , prop ) ;
const RegExpPrototypeExec = ( obj , string ) => RegExp . prototype . exec . call ( obj , string ) ;
const RegExpPrototypeSymbolReplace = ( obj , ... rest ) => RegExp . prototype [ Symbol . replace ] . apply ( obj , rest ) ;
const StringPrototypeEndsWith = ( str , ... rest ) => String . prototype . endsWith . apply ( str , rest ) ;
const StringPrototypeIncludes = ( str , ... rest ) => String . prototype . includes . apply ( str , rest ) ;
const StringPrototypeLastIndexOf = ( str , ... rest ) => String . prototype . lastIndexOf . apply ( str , rest ) ;
const StringPrototypeIndexOf = ( str , ... rest ) => String . prototype . indexOf . apply ( str , rest ) ;
const StringPrototypeReplace = ( str , ... rest ) => String . prototype . replace . apply ( str , rest ) ;
const StringPrototypeSlice = ( str , ... rest ) => String . prototype . slice . apply ( str , rest ) ;
const StringPrototypeStartsWith = ( str , ... rest ) => String . prototype . startsWith . apply ( str , rest ) ;
const SafeMap = Map ;
const JSONParse = JSON . parse ;
function createErrorType ( code , messageCreator , errorType ) {
return class extends errorType {
constructor ( ... args ) {
super ( messageCreator ( ... args ) ) ;
this . code = code ;
this . name = ` ${ errorType . name } [ ${ code } ] ` ;
}
} ;
}
const ERR _PACKAGE _IMPORT _NOT _DEFINED = createErrorType (
` ERR_PACKAGE_IMPORT_NOT_DEFINED ` ,
( specifier , packagePath , base ) => {
return ` Package import specifier " ${ specifier } " is not defined ${ packagePath ? ` in package ${ packagePath } package.json ` : ` ` } imported from ${ base } ` ;
} ,
TypeError
) ;
const ERR _INVALID _MODULE _SPECIFIER = createErrorType (
` ERR_INVALID_MODULE_SPECIFIER ` ,
( request , reason , base = void 0 ) => {
return ` Invalid module " ${ request } " ${ reason } ${ base ? ` imported from ${ base } ` : ` ` } ` ;
} ,
TypeError
) ;
const ERR _INVALID _PACKAGE _TARGET = createErrorType (
` ERR_INVALID_PACKAGE_TARGET ` ,
( pkgPath , key , target , isImport = false , base = void 0 ) => {
const relError = typeof target === ` string ` && ! isImport && target . length && ! StringPrototypeStartsWith ( target , ` ./ ` ) ;
if ( key === ` . ` ) {
assert ( isImport === false ) ;
return ` Invalid "exports" main target ${ JSONStringify ( target ) } defined in the package config ${ pkgPath } package.json ${ base ? ` imported from ${ base } ` : ` ` } ${ relError ? ` ; targets must start with "./" ` : ` ` } ` ;
}
return ` Invalid " ${ isImport ? ` imports ` : ` exports ` } " target ${ JSONStringify (
target
) } defined for '${key}' in the package config $ { pkgPath } package . json$ { base ? ` imported from ${ base } ` : ` ` } $ { relError ? ` ; targets must start with "./" ` : ` ` } ` ;
} ,
Error
) ;
const ERR _INVALID _PACKAGE _CONFIG = createErrorType (
` ERR_INVALID_PACKAGE_CONFIG ` ,
( path , base , message ) => {
return ` Invalid package config ${ path } ${ base ? ` while importing ${ base } ` : ` ` } ${ message ? ` . ${ message } ` : ` ` } ` ;
} ,
Error
) ;
function filterOwnProperties ( source , keys ) {
const filtered = /* @__PURE__ */ Object . create ( null ) ;
for ( let i = 0 ; i < keys . length ; i ++ ) {
const key = keys [ i ] ;
if ( ObjectPrototypeHasOwnProperty ( source , key ) ) {
filtered [ key ] = source [ key ] ;
}
}
return filtered ;
}
const packageJSONCache = new SafeMap ( ) ;
function getPackageConfig ( path , specifier , base , readFileSyncFn ) {
const existing = packageJSONCache . get ( path ) ;
if ( existing !== void 0 ) {
return existing ;
}
const source = readFileSyncFn ( path ) ;
if ( source === void 0 ) {
const packageConfig2 = {
pjsonPath : path ,
exists : false ,
main : void 0 ,
name : void 0 ,
type : "none" ,
exports : void 0 ,
imports : void 0
} ;
packageJSONCache . set ( path , packageConfig2 ) ;
return packageConfig2 ;
}
let packageJSON ;
try {
packageJSON = JSONParse ( source ) ;
} catch ( error ) {
throw new ERR _INVALID _PACKAGE _CONFIG (
path ,
( base ? ` " ${ specifier } " from ` : "" ) + fileURLToPath ( base || specifier ) ,
error . message
) ;
}
let { imports , main , name , type } = filterOwnProperties ( packageJSON , [
"imports" ,
"main" ,
"name" ,
"type"
] ) ;
const exports = ObjectPrototypeHasOwnProperty ( packageJSON , "exports" ) ? packageJSON . exports : void 0 ;
if ( typeof imports !== "object" || imports === null ) {
imports = void 0 ;
}
if ( typeof main !== "string" ) {
main = void 0 ;
}
if ( typeof name !== "string" ) {
name = void 0 ;
}
if ( type !== "module" && type !== "commonjs" ) {
type = "none" ;
}
const packageConfig = {
pjsonPath : path ,
exists : true ,
main ,
name ,
type ,
exports ,
imports
} ;
packageJSONCache . set ( path , packageConfig ) ;
return packageConfig ;
}
function getPackageScopeConfig ( resolved , readFileSyncFn ) {
let packageJSONUrl = new URL ( "./package.json" , resolved ) ;
while ( true ) {
const packageJSONPath2 = packageJSONUrl . pathname ;
if ( StringPrototypeEndsWith ( packageJSONPath2 , "node_modules/package.json" ) ) {
break ;
}
const packageConfig2 = getPackageConfig (
fileURLToPath ( packageJSONUrl ) ,
resolved ,
void 0 ,
readFileSyncFn
) ;
if ( packageConfig2 . exists ) {
return packageConfig2 ;
}
const lastPackageJSONUrl = packageJSONUrl ;
packageJSONUrl = new URL ( "../package.json" , packageJSONUrl ) ;
if ( packageJSONUrl . pathname === lastPackageJSONUrl . pathname ) {
break ;
}
}
const packageJSONPath = fileURLToPath ( packageJSONUrl ) ;
const packageConfig = {
pjsonPath : packageJSONPath ,
exists : false ,
main : void 0 ,
name : void 0 ,
type : "none" ,
exports : void 0 ,
imports : void 0
2022-06-21 09:23:39 +00:00
} ;
2022-10-19 08:25:01 +00:00
packageJSONCache . set ( packageJSONPath , packageConfig ) ;
return packageConfig ;
}
/ * *
@ license
Copyright Node . js contributors . All rights reserved .
Permission is hereby granted , free of charge , to any person obtaining a copy
of this software and associated documentation files ( the "Software" ) , to
deal in the Software without restriction , including without limitation the
rights to use , copy , modify , merge , publish , distribute , sublicense , and / or
sell copies of the Software , and to permit persons to whom the Software is
furnished to do so , subject to the following conditions :
The above copyright notice and this permission notice shall be included in
all copies or substantial portions of the Software .
THE SOFTWARE IS PROVIDED "AS IS" , WITHOUT WARRANTY OF ANY KIND , EXPRESS OR
IMPLIED , INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY ,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT . IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM , DAMAGES OR OTHER
LIABILITY , WHETHER IN AN ACTION OF CONTRACT , TORT OR OTHERWISE , ARISING
FROM , OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
IN THE SOFTWARE .
* /
function throwImportNotDefined ( specifier , packageJSONUrl , base ) {
throw new ERR _PACKAGE _IMPORT _NOT _DEFINED (
specifier ,
packageJSONUrl && fileURLToPath ( new URL ( "." , packageJSONUrl ) ) ,
fileURLToPath ( base )
) ;
}
function throwInvalidSubpath ( subpath , packageJSONUrl , internal , base ) {
const reason = ` request is not a valid subpath for the " ${ internal ? "imports" : "exports" } " resolution of ${ fileURLToPath ( packageJSONUrl ) } ` ;
throw new ERR _INVALID _MODULE _SPECIFIER (
subpath ,
reason ,
base && fileURLToPath ( base )
) ;
}
function throwInvalidPackageTarget ( subpath , target , packageJSONUrl , internal , base ) {
if ( typeof target === "object" && target !== null ) {
target = JSONStringify ( target , null , "" ) ;
} else {
target = ` ${ target } ` ;
}
throw new ERR _INVALID _PACKAGE _TARGET (
fileURLToPath ( new URL ( "." , packageJSONUrl ) ) ,
subpath ,
target ,
internal ,
base && fileURLToPath ( base )
) ;
}
const invalidSegmentRegEx = /(^|\\|\/)((\.|%2e)(\.|%2e)?|(n|%6e|%4e)(o|%6f|%4f)(d|%64|%44)(e|%65|%45)(_|%5f)(m|%6d|%4d)(o|%6f|%4f)(d|%64|%44)(u|%75|%55)(l|%6c|%4c)(e|%65|%45)(s|%73|%53))(\\|\/|$)/i ;
const patternRegEx = /\*/g ;
function resolvePackageTargetString ( target , subpath , match , packageJSONUrl , base , pattern , internal , conditions ) {
if ( subpath !== "" && ! pattern && target [ target . length - 1 ] !== "/" )
throwInvalidPackageTarget ( match , target , packageJSONUrl , internal , base ) ;
if ( ! StringPrototypeStartsWith ( target , "./" ) ) {
if ( internal && ! StringPrototypeStartsWith ( target , "../" ) && ! StringPrototypeStartsWith ( target , "/" ) ) {
let isURL = false ;
try {
new URL ( target ) ;
isURL = true ;
} catch {
}
if ( ! isURL ) {
const exportTarget = pattern ? RegExpPrototypeSymbolReplace ( patternRegEx , target , ( ) => subpath ) : target + subpath ;
return exportTarget ;
}
}
throwInvalidPackageTarget ( match , target , packageJSONUrl , internal , base ) ;
}
if ( RegExpPrototypeExec (
invalidSegmentRegEx ,
StringPrototypeSlice ( target , 2 )
) !== null )
throwInvalidPackageTarget ( match , target , packageJSONUrl , internal , base ) ;
const resolved = new URL ( target , packageJSONUrl ) ;
const resolvedPath = resolved . pathname ;
const packagePath = new URL ( "." , packageJSONUrl ) . pathname ;
if ( ! StringPrototypeStartsWith ( resolvedPath , packagePath ) )
throwInvalidPackageTarget ( match , target , packageJSONUrl , internal , base ) ;
if ( subpath === "" )
return resolved ;
if ( RegExpPrototypeExec ( invalidSegmentRegEx , subpath ) !== null ) {
const request = pattern ? StringPrototypeReplace ( match , "*" , ( ) => subpath ) : match + subpath ;
throwInvalidSubpath ( request , packageJSONUrl , internal , base ) ;
}
if ( pattern ) {
return new URL (
RegExpPrototypeSymbolReplace ( patternRegEx , resolved . href , ( ) => subpath )
) ;
}
return new URL ( subpath , resolved ) ;
}
function isArrayIndex ( key ) {
const keyNum = + key ;
if ( ` ${ keyNum } ` !== key )
return false ;
return keyNum >= 0 && keyNum < 4294967295 ;
}
function resolvePackageTarget ( packageJSONUrl , target , subpath , packageSubpath , base , pattern , internal , conditions ) {
if ( typeof target === "string" ) {
return resolvePackageTargetString (
target ,
subpath ,
packageSubpath ,
packageJSONUrl ,
base ,
pattern ,
internal ) ;
} else if ( ArrayIsArray ( target ) ) {
if ( target . length === 0 ) {
return null ;
}
let lastException ;
for ( let i = 0 ; i < target . length ; i ++ ) {
const targetItem = target [ i ] ;
let resolveResult ;
try {
resolveResult = resolvePackageTarget (
packageJSONUrl ,
targetItem ,
subpath ,
packageSubpath ,
base ,
pattern ,
internal ,
conditions
) ;
} catch ( e ) {
lastException = e ;
if ( e . code === "ERR_INVALID_PACKAGE_TARGET" ) {
continue ;
}
throw e ;
}
if ( resolveResult === void 0 ) {
continue ;
}
if ( resolveResult === null ) {
lastException = null ;
continue ;
}
return resolveResult ;
}
if ( lastException === void 0 || lastException === null )
return lastException ;
throw lastException ;
} else if ( typeof target === "object" && target !== null ) {
const keys = ObjectGetOwnPropertyNames ( target ) ;
for ( let i = 0 ; i < keys . length ; i ++ ) {
const key = keys [ i ] ;
if ( isArrayIndex ( key ) ) {
throw new ERR _INVALID _PACKAGE _CONFIG (
fileURLToPath ( packageJSONUrl ) ,
base ,
'"exports" cannot contain numeric property keys.'
) ;
}
}
for ( let i = 0 ; i < keys . length ; i ++ ) {
const key = keys [ i ] ;
if ( key === "default" || conditions . has ( key ) ) {
const conditionalTarget = target [ key ] ;
const resolveResult = resolvePackageTarget (
packageJSONUrl ,
conditionalTarget ,
subpath ,
packageSubpath ,
base ,
pattern ,
internal ,
conditions
) ;
if ( resolveResult === void 0 )
continue ;
return resolveResult ;
}
}
return void 0 ;
} else if ( target === null ) {
return null ;
}
throwInvalidPackageTarget (
packageSubpath ,
target ,
packageJSONUrl ,
internal ,
base
) ;
}
function patternKeyCompare ( a , b ) {
const aPatternIndex = StringPrototypeIndexOf ( a , "*" ) ;
const bPatternIndex = StringPrototypeIndexOf ( b , "*" ) ;
const baseLenA = aPatternIndex === - 1 ? a . length : aPatternIndex + 1 ;
const baseLenB = bPatternIndex === - 1 ? b . length : bPatternIndex + 1 ;
if ( baseLenA > baseLenB )
return - 1 ;
if ( baseLenB > baseLenA )
return 1 ;
if ( aPatternIndex === - 1 )
return 1 ;
if ( bPatternIndex === - 1 )
return - 1 ;
if ( a . length > b . length )
return - 1 ;
if ( b . length > a . length )
return 1 ;
return 0 ;
}
2023-05-05 08:34:23 +00:00
function packageImportsResolve ( { name , base , conditions , readFileSyncFn } ) {
2022-10-19 08:25:01 +00:00
if ( name === "#" || StringPrototypeStartsWith ( name , "#/" ) || StringPrototypeEndsWith ( name , "/" ) ) {
const reason = "is not a valid internal imports specifier name" ;
throw new ERR _INVALID _MODULE _SPECIFIER ( name , reason , fileURLToPath ( base ) ) ;
}
let packageJSONUrl ;
const packageConfig = getPackageScopeConfig ( base , readFileSyncFn ) ;
if ( packageConfig . exists ) {
packageJSONUrl = pathToFileURL ( packageConfig . pjsonPath ) ;
const imports = packageConfig . imports ;
if ( imports ) {
if ( ObjectPrototypeHasOwnProperty ( imports , name ) && ! StringPrototypeIncludes ( name , "*" ) ) {
const resolveResult = resolvePackageTarget (
packageJSONUrl ,
imports [ name ] ,
"" ,
name ,
base ,
false ,
true ,
conditions
) ;
if ( resolveResult != null ) {
return resolveResult ;
}
} else {
let bestMatch = "" ;
let bestMatchSubpath ;
const keys = ObjectGetOwnPropertyNames ( imports ) ;
for ( let i = 0 ; i < keys . length ; i ++ ) {
const key = keys [ i ] ;
const patternIndex = StringPrototypeIndexOf ( key , "*" ) ;
if ( patternIndex !== - 1 && StringPrototypeStartsWith (
name ,
StringPrototypeSlice ( key , 0 , patternIndex )
) ) {
const patternTrailer = StringPrototypeSlice ( key , patternIndex + 1 ) ;
if ( name . length >= key . length && StringPrototypeEndsWith ( name , patternTrailer ) && patternKeyCompare ( bestMatch , key ) === 1 && StringPrototypeLastIndexOf ( key , "*" ) === patternIndex ) {
bestMatch = key ;
bestMatchSubpath = StringPrototypeSlice (
name ,
patternIndex ,
name . length - patternTrailer . length
) ;
}
}
}
if ( bestMatch ) {
const target = imports [ bestMatch ] ;
const resolveResult = resolvePackageTarget (
packageJSONUrl ,
target ,
bestMatchSubpath ,
bestMatch ,
base ,
true ,
true ,
conditions
) ;
if ( resolveResult != null ) {
return resolveResult ;
}
}
}
}
}
throwImportNotDefined ( name , packageJSONUrl , base ) ;
2022-06-21 09:23:39 +00:00
}
const pathRegExp = /^(?![a-zA-Z]:[\\/]|\\\\|\.{0,2}(?:\/|$))((?:node:)?(?:@[^/]+\/)?[^/]+)\/*(.*|)$/ ;
const isRelativeRegexp = /^\.{0,2}\// ;
2022-10-19 08:25:01 +00:00
function tryReadFile ( filePath ) {
try {
return fs . readFileSync ( filePath , ` utf8 ` ) ;
} catch ( err ) {
if ( err . code === ` ENOENT ` )
return void 0 ;
throw err ;
}
}
async function resolvePrivateRequest ( specifier , issuer , context , nextResolve ) {
const resolved = packageImportsResolve ( {
name : specifier ,
base : pathToFileURL ( issuer ) ,
conditions : new Set ( context . conditions ) ,
readFileSyncFn : tryReadFile
} ) ;
if ( resolved instanceof URL ) {
return { url : resolved . href , shortCircuit : true } ;
} else {
if ( resolved . startsWith ( ` # ` ) )
throw new Error ( ` Mapping from one private import to another isn't allowed ` ) ;
return resolve$1 ( resolved , context , nextResolve ) ;
}
}
async function resolve$1 ( originalSpecifier , context , nextResolve ) {
const { findPnpApi } = moduleExports ;
2022-06-21 09:23:39 +00:00
if ( ! findPnpApi || isBuiltinModule ( originalSpecifier ) )
2022-10-19 08:25:01 +00:00
return nextResolve ( originalSpecifier , context , nextResolve ) ;
2022-06-21 09:23:39 +00:00
let specifier = originalSpecifier ;
const url = tryParseURL ( specifier , isRelativeRegexp . test ( specifier ) ? context . parentURL : void 0 ) ;
if ( url ) {
if ( url . protocol !== ` file: ` )
2022-10-19 08:25:01 +00:00
return nextResolve ( originalSpecifier , context , nextResolve ) ;
2022-06-21 09:23:39 +00:00
specifier = fileURLToPath ( url ) ;
}
2022-10-19 08:25:01 +00:00
const { parentURL , conditions = [ ] } = context ;
2023-09-18 11:32:49 +00:00
const issuer = parentURL && tryParseURL ( parentURL ) ? . protocol === ` file: ` ? fileURLToPath ( parentURL ) : process . cwd ( ) ;
2022-10-19 08:25:01 +00:00
const pnpapi = findPnpApi ( issuer ) ? ? ( url ? findPnpApi ( specifier ) : null ) ;
2022-06-21 09:23:39 +00:00
if ( ! pnpapi )
2022-10-19 08:25:01 +00:00
return nextResolve ( originalSpecifier , context , nextResolve ) ;
if ( specifier . startsWith ( ` # ` ) )
return resolvePrivateRequest ( specifier , issuer , context , nextResolve ) ;
2022-06-21 09:23:39 +00:00
const dependencyNameMatch = specifier . match ( pathRegExp ) ;
let allowLegacyResolve = false ;
if ( dependencyNameMatch ) {
const [ , dependencyName , subPath ] = dependencyNameMatch ;
2023-05-05 08:34:23 +00:00
if ( subPath === ` ` && dependencyName !== ` pnpapi ` ) {
2022-06-21 09:23:39 +00:00
const resolved = pnpapi . resolveToUnqualified ( ` ${ dependencyName } /package.json ` , issuer ) ;
if ( resolved ) {
2022-10-19 08:25:01 +00:00
const content = await tryReadFile$1 ( resolved ) ;
2022-06-21 09:23:39 +00:00
if ( content ) {
const pkg = JSON . parse ( content ) ;
allowLegacyResolve = pkg . exports == null ;
}
}
}
}
2023-05-05 08:34:23 +00:00
let result ;
try {
result = pnpapi . resolveRequest ( specifier , issuer , {
conditions : new Set ( conditions ) ,
extensions : allowLegacyResolve ? void 0 : [ ]
} ) ;
} catch ( err ) {
if ( err instanceof Error && ` code ` in err && err . code === ` MODULE_NOT_FOUND ` )
err . code = ` ERR_MODULE_NOT_FOUND ` ;
throw err ;
}
2022-06-21 09:23:39 +00:00
if ( ! result )
throw new Error ( ` Resolving ' ${ specifier } ' from ' ${ issuer } ' failed ` ) ;
const resultURL = pathToFileURL ( result ) ;
if ( url ) {
resultURL . search = url . search ;
resultURL . hash = url . hash ;
}
if ( ! parentURL )
setEntrypointPath ( fileURLToPath ( resultURL ) ) ;
return {
2022-10-19 08:25:01 +00:00
url : resultURL . href ,
shortCircuit : true
2022-06-21 09:23:39 +00:00
} ;
}
2023-05-05 08:34:23 +00:00
if ( ! HAS _LAZY _LOADED _TRANSLATORS ) {
const binding = process . binding ( ` fs ` ) ;
const originalfstat = binding . fstat ;
const ZIP _MASK = 4278190080 ;
const ZIP _MAGIC = 704643072 ;
binding . fstat = function ( ... args ) {
const [ fd , useBigint , req ] = args ;
if ( ( fd & ZIP _MASK ) === ZIP _MAGIC && useBigint === false && req === void 0 ) {
try {
const stats = fs . fstatSync ( fd ) ;
return new Float64Array ( [
stats . dev ,
stats . mode ,
stats . nlink ,
stats . uid ,
stats . gid ,
stats . rdev ,
stats . blksize ,
stats . ino ,
stats . size ,
stats . blocks
] ) ;
} catch {
}
}
return originalfstat . apply ( this , args ) ;
} ;
}
2022-06-21 09:23:39 +00:00
const resolve = resolve$1 ;
2023-09-18 11:32:49 +00:00
const load = load$1 ;
2022-06-21 09:23:39 +00:00
2023-09-18 11:32:49 +00:00
export { load , resolve } ;