From c3d66b36c8b4bdf84b3e23cd0ab8318d3fd068f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Thea=20Sch=C3=B6bl?= Date: Thu, 20 Oct 2022 09:52:55 +0000 Subject: [PATCH] fix: convert schema glob path to posix path --- package.json | 2 +- src/util/posix-path.ts | 30 ++++++++++++++++++++++++++++++ src/validate.ts | 3 ++- test/posix-path.spec.ts | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 68 insertions(+), 2 deletions(-) create mode 100644 src/util/posix-path.ts create mode 100644 test/posix-path.spec.ts diff --git a/package.json b/package.json index b7e45bc2..52664888 100644 --- a/package.json +++ b/package.json @@ -25,7 +25,7 @@ "Jovan Krunić ", "Rainer Killinger ", "Michel Jonathan Schmitz", - "Wieland Schöbl" + "Thea Schöbl " ], "scripts": { "build": "npm run lint && npm run compile", diff --git a/src/util/posix-path.ts b/src/util/posix-path.ts new file mode 100644 index 00000000..0b032a3a --- /dev/null +++ b/src/util/posix-path.ts @@ -0,0 +1,30 @@ +/* + * Copyright (C) 2021 StApps + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +import path from 'path'; +import {PathLike} from 'fs'; + +/** + * Convert a path to a POSIX path + * + * Replaces the system separator with posix separators + * Replaces Windows drive letters with a root '/' + */ +export function toPosixPath(pathLike: PathLike, separator = path.sep): string { + return pathLike + .toString() + .split(separator) + .join(path.posix.sep) + .replace(/^[A-z]:\//, '/'); +} diff --git a/src/validate.ts b/src/validate.ts index bf8ed47c..5a9129c8 100644 --- a/src/validate.ts +++ b/src/validate.ts @@ -24,6 +24,7 @@ import {ExpectedValidationErrors, ValidationError, ValidationResult} from './typ import {isThingWithType} from './util/guards'; import path from 'path'; import re2 from './types/re2'; +import {toPosixPath} from './util/posix-path'; /** * StAppsCore validator @@ -58,7 +59,7 @@ export class Validator { * @param schemaDirectory Path to directory that contains schema files */ public async addSchemas(schemaDirectory: PathLike): Promise { - const schemaFiles = await globPromisified(path.join(schemaDirectory.toString(), '*.json')); + const schemaFiles = await globPromisified(path.posix.join(toPosixPath(schemaDirectory), '*.json')); if (schemaFiles.length === 0) { throw new Error(`No schema files in ${schemaDirectory.toString()}!`); diff --git a/test/posix-path.spec.ts b/test/posix-path.spec.ts new file mode 100644 index 00000000..6e7cf5b6 --- /dev/null +++ b/test/posix-path.spec.ts @@ -0,0 +1,35 @@ +/* + * Copyright (C) 2022 StApps + * This program is free software: you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the Free + * Software Foundation, version 3. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along with + * this program. If not, see . + */ +import {expect} from 'chai'; +import {toPosixPath} from '../src/util/posix-path'; +import path from 'path'; + +describe('posix-path', function () { + it('should convert Windows paths', function () { + expect(toPosixPath('a\\b\\c', path.win32.sep)).to.be.equal('a/b/c'); + }); + + it('should leave POSIX paths untouched', function () { + expect(toPosixPath('a/b/c', path.posix.sep)).to.be.equal('a/b/c'); + }); + + it('should replace Windows drive letters', function () { + expect(toPosixPath('C:\\a\\b\\c', path.win32.sep)).to.be.equal('/a/b/c'); + }); + + it('should leave POSIX root separator untouched', function () { + expect(toPosixPath('/a/b/c', path.posix.sep)).to.be.equal('/a/b/c'); + }); +});