ca657b5b06
* 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>
52 lines
1.2 KiB
TypeScript
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
|
|
}
|
|
}
|