Files
nexe/src/fs/bundle.ts
T
bruce-one ca657b5b06 feat: use yarn fslib/zip for fs shimming (#1048)
* refactor: compile with esmoudle interop

* Rigidify code replacement by using Lodash templates.

* Generate zip file bundle.

* Use yarn's fslib to implement the fake filesystem.

Leverage the work done by yarn, rather than reimplementing from scratch.

This means the fake fs is now reading from a zip file in the binary.

A few methods need custom implementations as the fake fs is not
writable. These were copied and adjusted from the yarn ZipOpenFS.

* Add test suite using the built artefact.

Smoke tests the different fs methods.

Not perfect in any world, but better than nothing.

* Fix tsc on Windows - globbing doesn't work there.

There's probably a cleaner way to do this...

* Bump version.

* Dep bumps.

* fixup 9d57b32: make fs patch code clearer.

* fixup 3771c720: simplify test to just use require directly.

---------

Co-authored-by: calebboyd <caleb.boyd@gmail.com>
2023-08-20 14:43:06 -05:00

52 lines
1.2 KiB
TypeScript

import { relative } from 'path'
import { Readable } from 'stream'
import { File } from 'resolve-dependencies'
import archiver from 'archiver'
function makeRelativeToZip(cwd: string, path: string) {
return '/snapshot/' + relative(cwd, path)
}
export function toStream(content: Buffer | string) {
const readable = new Readable({
read() {
this.push(content)
this.push(null)
},
})
return readable
}
export class Bundle {
cwd: string
files = new Set<string>()
zip: any
constructor({ cwd }: { cwd: string } = { cwd: process.cwd() }) {
this.cwd = cwd
this.zip = archiver('zip')
}
get list() {
return Array.from(this.files)
}
public addResource(absoluteFileName: string, content?: File | Buffer | string) {
const destPath = makeRelativeToZip(this.cwd, absoluteFileName)
if (!this.files.has(destPath)) {
if (content == null) {
this.zip.file(absoluteFileName, { name: destPath })
} else {
this.zip.append(content, { name: destPath })
}
this.files.add(destPath)
}
}
public finalize() {
return this.zip.finalize()
}
public toStream(): Readable {
return this.zip
}
}