diff --git a/scripts/src/files/file-reader.ts b/scripts/src/files/file-reader.ts deleted file mode 100644 index bf0251d3..00000000 --- a/scripts/src/files/file-reader.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface FileReader { - readonly filepath: string - - read(): Promise -} diff --git a/scripts/src/files/file-type.ts b/scripts/src/files/file-type.ts deleted file mode 100644 index 4e81327d..00000000 --- a/scripts/src/files/file-type.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { FileReader } from './file-reader' -import { FileWriter } from './file-writer' -import { basename } from 'path' - -export class FileType { - constructor( - readonly extension: string, - readonly reader: new (filepath: string) => FileReader, - readonly writer: new (filepath: string) => FileWriter, - ) { - if (!extension.startsWith('.')) { - throw new Error('Extension must start with a dot') - } - } - - appendExtension(basename: string): string { - return `${basename}${this.extension}` - } - - removeExtension(filename: string): string { - return basename(filename, this.extension) - } -} diff --git a/scripts/src/files/file-writer.ts b/scripts/src/files/file-writer.ts deleted file mode 100644 index 9ae9c2c7..00000000 --- a/scripts/src/files/file-writer.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface FileWriter { - readonly filepath: string - - write(data: unknown): Promise -} diff --git a/scripts/src/files/json-file-type.ts b/scripts/src/files/json-file-type.ts deleted file mode 100644 index 4b37913f..00000000 --- a/scripts/src/files/json-file-type.ts +++ /dev/null @@ -1,4 +0,0 @@ -import { FileType } from './file-type' -import { JsonFile } from './json-file' - -export const JSON_FILE_TYPE = new FileType('.json', JsonFile, JsonFile) diff --git a/scripts/src/files/json-file.ts b/scripts/src/files/json-file.ts deleted file mode 100644 index 3252c73c..00000000 --- a/scripts/src/files/json-file.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { Log } from '../utils/log' -import { FileWriter } from './file-writer' -import { FileReader } from './file-reader' -import { readFileSync, writeFileSync } from 'fs' - -export class JsonFile implements FileReader, FileWriter { - constructor(readonly filepath: string) {} - - async read(): Promise { - try { - return JSON.parse(readFileSync(this.filepath, 'utf-8')) - } catch { - Log.warn('Unable to read file %s', this.filepath) - return - } - } - - async write(json: unknown): Promise { - return writeFileSync(this.filepath, JSON.stringify(json, null, 2)) - } -} diff --git a/scripts/src/resources/file.ts b/scripts/src/resources/file.ts new file mode 100644 index 00000000..f91b0614 --- /dev/null +++ b/scripts/src/resources/file.ts @@ -0,0 +1,43 @@ +import { basename } from 'path' +import { writeFile } from 'fs/promises' +import { Log } from '../utils/log' +import { readFile } from 'node:fs/promises' + +export abstract class FileType { + protected constructor(readonly extension: string) { + if (!extension.startsWith('.')) { + throw new Error('Extension must start with a dot') + } + } + + abstract read(path: string): Promise + + abstract write(path: string, data: unknown): Promise + + appendExtension(basename: string): string { + return `${basename}${this.extension}` + } + + removeExtension(filename: string): string { + return basename(filename, this.extension) + } +} + +export class JsonFileType extends FileType { + constructor() { + super('.json') + } + + async read(path: string): Promise { + try { + return JSON.parse(await readFile(path, 'utf-8')) + } catch { + Log.warn('Unable to read file %s', path) + return + } + } + + async write(path: string, json: unknown): Promise { + return writeFile(path, JSON.stringify(json, null, 2)) + } +} diff --git a/scripts/src/resources/resource-collection-list-generator.ts b/scripts/src/resources/resource-collection-list-generator.ts index 07ddd6d7..a6c97aa2 100644 --- a/scripts/src/resources/resource-collection-list-generator.ts +++ b/scripts/src/resources/resource-collection-list-generator.ts @@ -29,8 +29,7 @@ export class ResourceCollectionListGenerator { resourcesData.push(await this._generateResourceData(resource)) } Log.info('Writing list as %s', this.filename) - const writer = new this.resourceCollection.fileType.writer(this.filepath) - await writer.write(resourcesData) + await this.resourceCollection.fileType.write(this.filepath, resourcesData) Log.ok('Done') Log.groupEnd() } diff --git a/scripts/src/resources/resource-collection.ts b/scripts/src/resources/resource-collection.ts index 39ef48f4..12b6190a 100644 --- a/scripts/src/resources/resource-collection.ts +++ b/scripts/src/resources/resource-collection.ts @@ -1,15 +1,14 @@ import { Resource } from './resource' import { basename, join } from 'path' -import { FileType } from '../files/file-type' -import { JSON_FILE_TYPE } from '../files/json-file-type' -import { mkdirSync, readdirSync } from 'fs' +import { FileType, JsonFileType } from './file' +import { mkdir, readdir } from 'fs/promises' export class ResourceCollection { private _resources?: readonly Resource[] constructor( readonly path: string, - readonly fileType: FileType = JSON_FILE_TYPE, + readonly fileType: FileType = new JsonFileType(), ) {} get name(): string { @@ -18,7 +17,7 @@ export class ResourceCollection { async getResources(): Promise { if (!this._resources) { - const directoryFiles = readdirSync(this.path, { + const directoryFiles = await readdir(this.path, { withFileTypes: true, }) const resourceFiles = directoryFiles.filter( @@ -40,17 +39,17 @@ export class ResourceCollection { async createResource(name: string, data: unknown): Promise { await this._createDirectoryIfDoesNotExist() const filename = this.fileType.appendExtension(name) - await new this.fileType.writer(join(this.path, filename)).write(data) + await this.fileType.write(join(this.path, filename), data) return new Resource(this, filename) } async upsertResource(name: string, data: unknown): Promise { const filename = this.fileType.appendExtension(name) - await new this.fileType.writer(join(this.path, filename)).write(data) + await this.fileType.write(join(this.path, filename), data) return new Resource(this, filename) } private async _createDirectoryIfDoesNotExist(): Promise { - mkdirSync(this.path, { recursive: true }) + await mkdir(this.path, { recursive: true }) } } diff --git a/scripts/src/resources/resource.ts b/scripts/src/resources/resource.ts index efd317e6..95283ed3 100644 --- a/scripts/src/resources/resource.ts +++ b/scripts/src/resources/resource.ts @@ -20,7 +20,7 @@ export class Resource { } async getData(): Promise { - return new this.collection.fileType.reader(this.path).read() + return this.collection.fileType.read(this.path) } get childCollection(): ResourceCollection {