UNPKG

@azure-tools/uri

Version:
140 lines 5.01 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.GetExtension = exports.FileUriToPath = exports.ClearFolder = exports.WriteBinary = exports.WriteString = exports.EnumerateFiles = exports.getExtension = exports.fileUriToPath = exports.clearFolder = exports.writeBinary = exports.writeString = exports.enumerateFiles = void 0; /* eslint-disable node/no-deprecated-api */ /*--------------------------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. * Licensed under the MIT License. See License.txt in the project root for license information. *--------------------------------------------------------------------------------------------*/ const async_io_1 = require("@azure-tools/async-io"); const path_1 = require("path"); const fs_1 = require("fs"); const uri_manipulation_1 = require("./uri-manipulation"); const url_1 = require("url"); const data_acquisition_1 = require("./data-acquisition"); /*********************** * OS abstraction (writing files, enumerating files) ***********************/ function isAccessibleFile(localPath) { try { return fs_1.lstatSync(localPath).isFile(); } catch (e) { return false; } } function fileUriToLocalPath(fileUri) { if (!fileUri.startsWith("file:///")) { throw new Error(`Cannot write data to '${fileUri}'. ` + (!fileUri.startsWith("file://") ? `File protocol '${fileUri}' not supported for writing.` : "UNC paths not supported for writing.") + " Make sure to specify a local, absolute path as target file/folder."); } return decodeURI(url_1.fileURLToPath(fileUri)); } async function enumerateFiles(folderUri, probeFiles = []) { const results = new Array(); folderUri = uri_manipulation_1.ensureIsFolderUri(folderUri); if (folderUri.startsWith("file:")) { let files = []; try { files = await async_io_1.readdir(fileUriToLocalPath(folderUri)); } catch (e) { // noop } results.push(...files.map((f) => uri_manipulation_1.resolveUri(folderUri, f)).filter((f) => isAccessibleFile(fileUriToLocalPath(f)))); } else { for (const candid of probeFiles.map((f) => uri_manipulation_1.resolveUri(folderUri, f))) { if (await data_acquisition_1.ExistsUri(candid)) { results.push(candid); } } } return results; } exports.enumerateFiles = enumerateFiles; async function createDirectoryFor(filePath) { const dir = path_1.dirname(filePath); if (!(await async_io_1.exists(dir))) { await createDirectoryFor(dir); try { await async_io_1.mkdir(dir); } catch (e) { // mkdir throws if directory already exists - which happens occasionally due to race conditions } } } async function writeDataInternal(fileName, data) { await createDirectoryFor(fileName); await async_io_1.writeFile(fileName, data); } /** * Writes string to local file system. * @param fileUri Target file uri. * @param data String to write (encoding: UTF8). */ function writeString(fileUri, data) { return writeDataInternal(fileUriToLocalPath(fileUri), data); } exports.writeString = writeString; /** * Writes binary to local file system. * @param fileUri Target file uri. * @param data String to write (encoding - base64 encoded UTF8). */ function writeBinary(fileUri, data) { return writeDataInternal(fileUriToLocalPath(fileUri), Buffer.from(data, "base64")); } exports.writeBinary = writeBinary; /** * Clears a folder on the local file system. * @param folderUri Folder uri. */ async function clearFolder(folderUri, exceptions) { return await async_io_1.rmdir(fileUriToLocalPath(folderUri), new Set((exceptions || []).map((each) => fileUriToLocalPath(each).toLowerCase()))); } exports.clearFolder = clearFolder; function fileUriToPath(fileUri) { return url_1.fileURLToPath(fileUri); } exports.fileUriToPath = fileUriToPath; function getExtension(name) { const ext = path_1.extname(name); if (ext) { return ext.substr(1).toLowerCase(); } return ext; } exports.getExtension = getExtension; //------------------------------------------ // Legacy names, will be removed in next major version //------------------------------------------ /** * @deprecated use enumerateFiles instead. */ exports.EnumerateFiles = enumerateFiles; /** * @deprecated use writeString instead. */ exports.WriteString = writeString; /** * @deprecated use writeBinary instead. */ exports.WriteBinary = writeBinary; /** * @deprecated use clearFolder instead. */ exports.ClearFolder = clearFolder; /** * @deprecated use fileUriToPath instead. */ exports.FileUriToPath = fileUriToPath; /** * @deprecated use getExtension instead. */ exports.GetExtension = getExtension; //# sourceMappingURL=os-abstractions.js.map