From 0f4e54a5ce6fddcdffe536433d44ee217c5b1b36 Mon Sep 17 00:00:00 2001 From: Jason Dent Date: Mon, 1 Aug 2022 16:01:16 +0200 Subject: [PATCH 1/3] feat: Use CSpellIO as the default file read layer. --- packages/cspell-io/src/CSpellIONode.ts | 12 +++++++ packages/cspell-io/src/file/file.ts | 33 +++++++++++++++++++ packages/cspell-io/src/file/index.ts | 3 +- .../cspell-io/src/node/file/fileReader.ts | 1 + 4 files changed, 47 insertions(+), 2 deletions(-) create mode 100644 packages/cspell-io/src/file/file.ts diff --git a/packages/cspell-io/src/CSpellIONode.ts b/packages/cspell-io/src/CSpellIONode.ts index 149cdae0e67..8f2530d4e4e 100644 --- a/packages/cspell-io/src/CSpellIONode.ts +++ b/packages/cspell-io/src/CSpellIONode.ts @@ -14,6 +14,8 @@ import { RequestFsWriteFile, } from './requests'; +let defaultCSpellIONode: CSpellIO | undefined = undefined; + export class CSpellIONode implements CSpellIO { constructor(readonly serviceBus = new ServiceBus()) { registerHandlers(serviceBus); @@ -67,3 +69,13 @@ export class CSpellIONode implements CSpellIO { function genError(err: Error | undefined, alt: string): Error { return err || new ErrorNotImplemented(alt); } + +export function getDefaultCSpellIO(): CSpellIO { + if (defaultCSpellIONode) return defaultCSpellIONode; + + const cspellIO = new CSpellIONode(); + + defaultCSpellIONode = cspellIO; + + return cspellIO; +} diff --git a/packages/cspell-io/src/file/file.ts b/packages/cspell-io/src/file/file.ts new file mode 100644 index 00000000000..718985669e2 --- /dev/null +++ b/packages/cspell-io/src/file/file.ts @@ -0,0 +1,33 @@ +import { getDefaultCSpellIO } from '../CSpellIONode'; +import { Stats } from '../models'; +import type { BufferEncoding } from '../models/BufferEncoding'; +import type { + getStat as GetStatFn, + getStatSync as GetStatSyncFn, + readFile as ReadFileFn, + readFileSync as ReadFileSyncFn, +} from '../node/file'; + +export const readFile: typeof ReadFileFn = function ( + filename: string | URL, + encoding?: BufferEncoding +): Promise { + return getDefaultCSpellIO() + .readFile(filename, encoding) + .then((fr) => fr.content); +}; + +export const readFileSync: typeof ReadFileSyncFn = function ( + filename: string | URL, + encoding?: BufferEncoding +): string { + return getDefaultCSpellIO().readFileSync(filename, encoding).content; +}; + +export const getStat: typeof GetStatFn = function (filenameOrUri: string): Promise { + return getDefaultCSpellIO().getStat(filenameOrUri); +}; + +export const getStatSync: typeof GetStatSyncFn = function (filenameOrUri: string): Stats { + return getDefaultCSpellIO().getStatSync(filenameOrUri); +}; diff --git a/packages/cspell-io/src/file/index.ts b/packages/cspell-io/src/file/index.ts index bc4b376c500..28dca06581b 100644 --- a/packages/cspell-io/src/file/index.ts +++ b/packages/cspell-io/src/file/index.ts @@ -1,3 +1,2 @@ -export { readFile, readFileSync } from './../node/file'; export { writeToFile, writeToFileIterable, writeToFileIterableP } from './../node/file'; -export { getStat, getStatSync } from './../node/file'; +export { getStat, getStatSync, readFile, readFileSync } from './file'; diff --git a/packages/cspell-io/src/node/file/fileReader.ts b/packages/cspell-io/src/node/file/fileReader.ts index 94524e96538..1aca04351ec 100644 --- a/packages/cspell-io/src/node/file/fileReader.ts +++ b/packages/cspell-io/src/node/file/fileReader.ts @@ -6,6 +6,7 @@ import { fetch } from './fetch'; import { FetchUrlError } from './FetchError'; import { toURL, isSupportedURL, isFileURL, isZipped } from './util'; import { fileURLToPath } from 'url'; +import type { BufferEncoding } from '../../models/BufferEncoding'; const defaultEncoding: BufferEncoding = 'utf8'; From 56ab05fd1c78478a69a8937b886d2edb54dbb941 Mon Sep 17 00:00:00 2001 From: Jason Dent Date: Mon, 1 Aug 2022 16:32:27 +0200 Subject: [PATCH 2/3] Update BufferEncoding.ts --- packages/cspell-io/src/models/BufferEncoding.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/cspell-io/src/models/BufferEncoding.ts b/packages/cspell-io/src/models/BufferEncoding.ts index eaa9b44df22..2bdb78a5041 100644 --- a/packages/cspell-io/src/models/BufferEncoding.ts +++ b/packages/cspell-io/src/models/BufferEncoding.ts @@ -7,5 +7,6 @@ export type BufferEncoding = | 'ucs-2' | 'base64' | 'base64url' + | 'binary' | 'latin1' | 'hex'; From 66adcefd3fde37f9ba1852cb09e7957f37e690be Mon Sep 17 00:00:00 2001 From: Jason Dent Date: Mon, 1 Aug 2022 17:19:48 +0200 Subject: [PATCH 3/3] fix: use `fileURLToPath` to workaround yarn bug --- packages/cspell-io/src/file/file.ts | 15 +++++++++++---- packages/cspell-io/src/handlers/node/file.ts | 14 ++++++++++---- 2 files changed, 21 insertions(+), 8 deletions(-) diff --git a/packages/cspell-io/src/file/file.ts b/packages/cspell-io/src/file/file.ts index 718985669e2..6ae56e152a6 100644 --- a/packages/cspell-io/src/file/file.ts +++ b/packages/cspell-io/src/file/file.ts @@ -1,4 +1,5 @@ import { getDefaultCSpellIO } from '../CSpellIONode'; +import { toError } from '../errors'; import { Stats } from '../models'; import type { BufferEncoding } from '../models/BufferEncoding'; import type { @@ -24,10 +25,16 @@ export const readFileSync: typeof ReadFileSyncFn = function ( return getDefaultCSpellIO().readFileSync(filename, encoding).content; }; -export const getStat: typeof GetStatFn = function (filenameOrUri: string): Promise { - return getDefaultCSpellIO().getStat(filenameOrUri); +export const getStat: typeof GetStatFn = function (filenameOrUri: string): Promise { + return getDefaultCSpellIO() + .getStat(filenameOrUri) + .catch((e) => toError(e)); }; -export const getStatSync: typeof GetStatSyncFn = function (filenameOrUri: string): Stats { - return getDefaultCSpellIO().getStatSync(filenameOrUri); +export const getStatSync: typeof GetStatSyncFn = function (filenameOrUri: string): Stats | Error { + try { + return getDefaultCSpellIO().getStatSync(filenameOrUri); + } catch (e) { + return toError(e); + } }; diff --git a/packages/cspell-io/src/handlers/node/file.ts b/packages/cspell-io/src/handlers/node/file.ts index 40ee80951a6..6fea4294cfc 100644 --- a/packages/cspell-io/src/handlers/node/file.ts +++ b/packages/cspell-io/src/handlers/node/file.ts @@ -22,6 +22,7 @@ import { RequestFsWriteFile, RequestZlibInflate, } from '../../requests'; +import { URL, fileURLToPath } from 'url'; const isGzFileRegExp = /\.gz($|[?#])/; @@ -29,11 +30,16 @@ function isGzFile(url: URL): boolean { return isGzFileRegExp.test(url.pathname); } +/* + * NOTE: fileURLToPath is used because of yarn bug https://github.com/yarnpkg/berry/issues/899 + */ + /** * Handle Binary File Reads */ const handleRequestFsReadBinaryFile = RequestFsReadBinaryFile.createRequestHandler( - ({ params }) => createResponse(fs.readFile(params.url).then((content) => ({ url: params.url, content }))), + ({ params }) => + createResponse(fs.readFile(fileURLToPath(params.url)).then((content) => ({ url: params.url, content }))), undefined, 'Node: Read Binary File.' ); @@ -42,7 +48,7 @@ const handleRequestFsReadBinaryFile = RequestFsReadBinaryFile.createRequestHandl * Handle Binary File Sync Reads */ const handleRequestFsReadBinaryFileSync = RequestFsReadBinaryFileSync.createRequestHandler( - ({ params }) => createResponse({ url: params.url, content: readFileSync(params.url) }), + ({ params }) => createResponse({ url: params.url, content: readFileSync(fileURLToPath(params.url)) }), undefined, 'Node: Sync Read Binary File.' ); @@ -151,7 +157,7 @@ function bufferToText(buf: Buffer, encoding: BufferEncoding): string { * Handle fs:stat */ const handleRequestFsStat = RequestFsStat.createRequestHandler( - ({ params }) => createResponse(fs.stat(params.url)), + ({ params }) => createResponse(fs.stat(fileURLToPath(params.url))), undefined, 'Node: fs.stat.' ); @@ -163,7 +169,7 @@ const handleRequestFsStatSync = RequestFsStatSync.createRequestHandler( (req) => { const { params } = req; try { - return createResponse(statSync(params.url)); + return createResponse(statSync(fileURLToPath(params.url))); } catch (e) { return createResponseFail(req, toError(e)); }