@azure-tools/uri
Version:
Common URI handling code.
140 lines • 5.01 kB
JavaScript
;
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