ArnaudBuchholz/gpf-js

View on GitHub
src/fs/wscript.js

Summary

Maintainability
A
0 mins
Test Coverage
/**
 * @file WScript specific File System implementation
 * @since 0.1.9
 */
/*#ifndef(UMD)*/
"use strict";
/*global _GPF_FS_OPENFOR*/ // File system stream opening mode
/*global _GPF_FS_TYPES*/ // File system types constants
/*global _GPF_FS_WSCRIPT_READING*/ // WScript OpenTextFile for reading value
/*global _GPF_HOST*/ // Host types
/*global _GpfWscriptBaseStream*/ // gpf.wscript.BaseStream
/*global _GpfWscriptReadableStream*/ // gpf.wscript.ReadableStream
/*global _GpfWscriptWritableStream*/ // gpf.wscript.WritableStream
/*global _gpfDefine*/ // Shortcut for gpf.define
/*global _gpfErrorDeclare*/ // Declare new gpf.Error names
/*global _gpfFsCloseBuild*/ // Build close method that assess the stream type
/*global _gpfFsExploreEnumerator*/ // IFileStorage.explore helper
/*global _gpfFsSetFileStorageIf*/ // Set the file storage implementation if the host matches
/*global _gpfMsFSO*/ // Scripting.FileSystemObject activeX
/*global _gpfPathDecompose*/ // Normalize path and returns an array of parts
/*global _gpfPathNormalize*/ // Normalize path
/*#endif*/

/*jshint wsh:true*/
/*eslint-env wsh*/
/*eslint-disable new-cap*/ // FileSystem object APIs are uppercased
/*global Enumerator*/ // Enumerator helper

_gpfErrorDeclare("fs/wscript", {

    /**
     * ### Summary
     *
     * Path not explorable
     *
     * ### Description
     *
     * This error is used when explore is used with a path that does not point to a folder.
     * @since 0.2.1
     */
    pathNotExplorable: "Path not explorable"

});

/**
 * Translate WScript file object into a {@link gpf.typedef.fileStorageInfo}
 *
 * @param {Object} obj WScript file object
 * @param {gpf.fs.types} type Object type
 * @return {gpf.typedef.fileStorageInfo} Information about the object
 * @since 0.1.9
 */
function _gpfFsWScriptObjToFileStorageInfo (obj, type) {
    return {
        type: type,
        fileName: obj.Name.toLowerCase(),
        filePath: _gpfPathNormalize(obj.Path),
        size: obj.Size,
        createdDateTime: new Date(obj.DateCreated),
        modifiedDateTime: new Date(obj.DateLastModified)
    };
}

function _gpfFsWscriptFSOCallWithArg (name, path) {
    return new Promise(function (resolve) {
        _gpfMsFSO[name](_gpfPathDecompose(path).join("\\"));
        resolve();
    });
}

function _gpfFsWscriptFSOCallWithArgAndTrue (name, path) {
    return new Promise(function (resolve) {
        _gpfMsFSO[name](_gpfPathDecompose(path).join("\\"), true);
        resolve();
    });
}

function _gpfFsWscriptGetFileInfo (path) {
    if (_gpfMsFSO.FileExists(path)) {
        return _gpfFsWScriptObjToFileStorageInfo(_gpfMsFSO.GetFile(path), _GPF_FS_TYPES.FILE);
    }
    return {
        type: _GPF_FS_TYPES.NOT_FOUND
    };
}

function _gpfFsWscriptGetInfo (path) {
    if (_gpfMsFSO.FolderExists(path)) {
        return _gpfFsWScriptObjToFileStorageInfo(_gpfMsFSO.GetFolder(path), _GPF_FS_TYPES.DIRECTORY);
    }
    return _gpfFsWscriptGetFileInfo(path);
}

function _gpfFsWScriptExploreList (collection) {
    var fsoEnum = new Enumerator(collection),
        results = [];
    for (; !fsoEnum.atEnd(); fsoEnum.moveNext()) {
        results.push(fsoEnum.item().Path);
    }
    return results;
}

function _gpfFsWScriptExplore (path) {
    var folder;
    if (_gpfMsFSO.FolderExists(path)) {
        folder = _gpfMsFSO.GetFolder(path);
        return _gpfFsWScriptExploreList(folder.SubFolders)
            .concat(_gpfFsWScriptExploreList(folder.Files));
    }
    gpf.Error.pathNotExplorable();
}

var _GPF_FS_WSCRIPT_APPENDING = 8;

/**
 * WScript specific IFileStorage implementation
 *
 * @class gpf.wscript.FileStorage
 * @implements {gpf.interfaces.IFileStorage}
 * @private
 * @since 0.1.9
 */
var _GpfWScriptFileStorage = _gpfDefine({
    $class: "gpf.wscript.FileStorage",

    //region gpf.interfaces.IFileStorage

    /**
     * @gpf:sameas gpf.interfaces.IFileStorage#getInfo
     * @since 0.1.9
     */
    getInfo: function (path) {
        return Promise.resolve(_gpfFsWscriptGetInfo(_gpfPathDecompose(path).join("\\")));
    },

    /**
     * @gpf:sameas gpf.interfaces.IFileStorage#openTextStream
     * @since 0.1.9
     */
    openTextStream: function (unnormalizedPath, mode) {
        var path = _gpfPathDecompose(unnormalizedPath).join("\\");
        return new Promise(function (resolve) {
            var stream;
            if (_GPF_FS_OPENFOR.READING === mode) {
                stream = new _GpfWscriptReadableStream(_gpfMsFSO.OpenTextFile(path, _GPF_FS_WSCRIPT_READING, false));
            } else {
                stream = new _GpfWscriptWritableStream(_gpfMsFSO.OpenTextFile(path, _GPF_FS_WSCRIPT_APPENDING, true));
            }
            resolve(stream);
        });
    },

    /**
     * @gpf:sameas gpf.interfaces.IFileStorage#close
     * @since 0.1.9
     */
    close: _gpfFsCloseBuild(_GpfWscriptBaseStream),

    /**
     * @gpf:sameas gpf.interfaces.IFileStorage#explore
     * @since 0.1.9
     */
    explore: function (path) {
        var me = this;
        return new Promise(function (resolve) {
            resolve(_gpfFsExploreEnumerator(me, _gpfFsWScriptExplore(_gpfPathDecompose(path).join("\\"))));
        });
    },

    /**
     * @gpf:sameas gpf.interfaces.IFileStorage#createDirectory
     * @since 0.1.9
     */
    createDirectory: _gpfFsWscriptFSOCallWithArg.bind(null, "CreateFolder"),

    /**
     * @gpf:sameas gpf.interfaces.IFileStorage#deleteFile
     * @since 0.1.9
     */
    deleteFile: _gpfFsWscriptFSOCallWithArgAndTrue.bind(null, "DeleteFile"),

    /**
     * @gpf:sameas gpf.interfaces.IFileStorage#deleteDirectory
     * @since 0.1.9
     */
    deleteDirectory: _gpfFsWscriptFSOCallWithArgAndTrue.bind(null, "DeleteFolder")

    //endregion

});

_gpfFsSetFileStorageIf(_GPF_HOST.WSCRIPT, _GpfWScriptFileStorage);