54 lines
1.7 KiB
TypeScript
54 lines
1.7 KiB
TypeScript
/**
|
|
* @license
|
|
* Copyright Google Inc. All Rights Reserved.
|
|
*
|
|
* Use of this source code is governed by an MIT-style license that can be
|
|
* found in the LICENSE file at https://angular.io/license
|
|
*/
|
|
|
|
import {Filesystem} from '@angular/service-worker/config';
|
|
|
|
import {sha1Binary} from './sha1';
|
|
|
|
const fs = require('fs');
|
|
const path = require('path');
|
|
|
|
export class NodeFilesystem implements Filesystem {
|
|
constructor(private base: string) {}
|
|
|
|
async list(_path: string): Promise<string[]> {
|
|
const dir = this.canonical(_path);
|
|
const entries = fs.readdirSync(dir).map(
|
|
(entry: string) => ({entry, stats: fs.statSync(path.join(dir, entry))}));
|
|
const files = entries.filter((entry: any) => !entry.stats.isDirectory())
|
|
.map((entry: any) => path.posix.join(_path, entry.entry));
|
|
|
|
return entries.filter((entry: any) => entry.stats.isDirectory())
|
|
.map((entry: any) => path.posix.join(_path, entry.entry))
|
|
.reduce(
|
|
async (list: Promise<string[]>, subdir: string) =>
|
|
(await list).concat(await this.list(subdir)),
|
|
Promise.resolve(files));
|
|
}
|
|
|
|
async read(_path: string): Promise<string> {
|
|
const file = this.canonical(_path);
|
|
return fs.readFileSync(file).toString();
|
|
}
|
|
|
|
async hash(_path: string): Promise<string> {
|
|
const file = this.canonical(_path);
|
|
const contents: Buffer = fs.readFileSync(file);
|
|
return sha1Binary(contents as any as ArrayBuffer);
|
|
}
|
|
|
|
async write(_path: string, contents: string): Promise<void> {
|
|
const file = this.canonical(_path);
|
|
fs.writeFileSync(file, contents);
|
|
}
|
|
|
|
private canonical(_path: string): string {
|
|
return path.posix.join(this.base, _path);
|
|
}
|
|
}
|