parent
59b683aa7b
commit
03fafd239b
@ -0,0 +1,130 @@ |
||||
'use strict' |
||||
|
||||
var EventManager = require('remix-lib').EventManager |
||||
|
||||
function FilesTree (name, storage) { |
||||
var self = this |
||||
var event = new EventManager() |
||||
this.event = event |
||||
this.type = name |
||||
this.structFile = '.' + name + '.tree' |
||||
this.tree = {} |
||||
|
||||
this.exists = function (path, cb) { |
||||
cb(null, this._exists(path)) |
||||
} |
||||
|
||||
function updateRefs (path, type) { |
||||
var split = path.split('/') // this should be unprefixed path
|
||||
var crawlpath = self.tree |
||||
split.forEach((pathPart, index) => { |
||||
if (!crawlpath[pathPart]) crawlpath[pathPart] = {} |
||||
if (index < split.length - 1) { |
||||
crawlpath = crawlpath[pathPart] |
||||
} else if (type === 'add') { |
||||
crawlpath[pathPart] = path |
||||
} else if (type === 'remove' && crawlpath[pathPart]) { |
||||
delete crawlpath[pathPart] |
||||
} |
||||
}) |
||||
storage.set(self.structFile, JSON.stringify(self.tree)) |
||||
} |
||||
|
||||
this._exists = function (path) { |
||||
var unprefixedpath = this.removePrefix(path) |
||||
return storage.exists(unprefixedpath) |
||||
} |
||||
|
||||
this.init = function (cb) { |
||||
var tree = storage.get(this.structFile) |
||||
this.tree = tree ? JSON.parse(tree) : {} |
||||
if (cb) cb() |
||||
} |
||||
|
||||
this.get = function (path, cb) { |
||||
var unprefixedpath = this.removePrefix(path) |
||||
var content = storage.get(unprefixedpath) |
||||
if (cb) { |
||||
cb(null, content) |
||||
} |
||||
return content |
||||
} |
||||
|
||||
this.set = function (path, content) { |
||||
var unprefixedpath = this.removePrefix(path) |
||||
updateRefs(unprefixedpath, 'add') |
||||
var exists = storage.exists(unprefixedpath) |
||||
if (!storage.set(unprefixedpath, content)) { |
||||
return false |
||||
} |
||||
if (!exists) { |
||||
event.trigger('fileAdded', [this.type + '/' + unprefixedpath, false]) |
||||
} else { |
||||
event.trigger('fileChanged', [this.type + '/' + unprefixedpath]) |
||||
} |
||||
return true |
||||
} |
||||
|
||||
this.addReadOnly = function (path, content) { |
||||
return this.set(path, content) |
||||
} |
||||
|
||||
this.isReadOnly = function (path) { |
||||
return false |
||||
} |
||||
|
||||
this.remove = function (path) { |
||||
var unprefixedpath = this.removePrefix(path) |
||||
updateRefs(unprefixedpath, 'remove') |
||||
if (!this._exists(unprefixedpath)) { |
||||
return false |
||||
} |
||||
if (!storage.remove(unprefixedpath)) { |
||||
return false |
||||
} |
||||
event.trigger('fileRemoved', [this.type + '/' + unprefixedpath]) |
||||
return true |
||||
} |
||||
|
||||
this.rename = function (oldPath, newPath, isFolder) { |
||||
var unprefixedoldPath = this.removePrefix(oldPath) |
||||
var unprefixednewPath = this.removePrefix(newPath) |
||||
updateRefs(unprefixedoldPath, 'remove') |
||||
updateRefs(unprefixednewPath, 'add') |
||||
if (storage.exists(unprefixedoldPath)) { |
||||
if (!storage.rename(unprefixedoldPath, unprefixednewPath)) { |
||||
return false |
||||
} |
||||
event.trigger('fileRenamed', [this.type + '/' + unprefixedoldPath, this.type + '/' + unprefixednewPath, isFolder]) |
||||
return true |
||||
} |
||||
return false |
||||
} |
||||
|
||||
this.resolveDirectory = function (path, callback) { |
||||
var self = this |
||||
if (path[0] === '/') path = path.substring(1) |
||||
if (!path) return callback(null, { [self.type]: { } }) |
||||
var tree = {} |
||||
path = self.removePrefix(path) |
||||
|
||||
var split = path.split('/') // this should be unprefixed path
|
||||
var crawlpath = self.tree |
||||
split.forEach((pathPart, index) => { |
||||
if (crawlpath[pathPart]) crawlpath = crawlpath[pathPart] |
||||
}) |
||||
|
||||
for (var item in crawlpath) { |
||||
tree[item] = { isDirectory: typeof crawlpath[item] !== 'string' } |
||||
} |
||||
callback(null, tree) |
||||
} |
||||
|
||||
this.removePrefix = function (path) { |
||||
path = path.indexOf(this.type) === 0 ? path.replace(this.type, '') : path |
||||
if (path[0] === '/') return path.substring(1) |
||||
return path |
||||
} |
||||
} |
||||
|
||||
module.exports = FilesTree |
Loading…
Reference in new issue