UNPKG

2.56 kBJavaScriptView Raw
1var path = require('path');
2var util = require('util');
3
4var Item = require('./item').Item;
5
6var constants = process.binding('constants');
7
8
9
10/**
11 * A directory.
12 * @param {string} name Directory name.
13 * @constructor
14 */
15var Directory = exports.Directory = function Directory(name) {
16 Item.call(this, name);
17
18 /**
19 * Items in this directory.
20 * @type {Object.<string, Item>}
21 */
22 this._items = {};
23
24};
25util.inherits(Directory, Item);
26
27
28/**
29 * Add an item to the directory.
30 * @param {Item} item The item to add.
31 * @return {Item} The added item.
32 */
33Directory.prototype.addItem = function(item) {
34 var name = item.getName();
35 if (this._items.hasOwnProperty(name)) {
36 throw new Error('Item with the same name already exists: ' + name);
37 }
38 this._items[name] = item;
39
40 item.setParent(this);
41 return item;
42};
43
44
45/**
46 * Get a named item.
47 * @param {string} name Item name.
48 * @return {Item} The named item (or null if none).
49 */
50Directory.prototype.getItem = function(name) {
51 var item = null;
52 if (this._items.hasOwnProperty(name)) {
53 item = this._items[name];
54 }
55 return item;
56};
57
58
59/**
60 * Remove an item.
61 * @param {string} name Name of item to remove.
62 * @return {Item} The orphan item.
63 */
64Directory.prototype.removeItem = function(name) {
65 if (!this._items.hasOwnProperty(name)) {
66 throw new Error('Item does not exist in directory: ' + name);
67 }
68 var item = this._items[name];
69 delete this._items[name];
70 item.setParent(null);
71 return item;
72};
73
74
75/**
76 * Rename an item.
77 * @param {string} oldName Old name.
78 * @param {string} newName New name.
79 * @return {Item} The renamed item.
80 */
81Directory.prototype.renameItem = function(oldName, newName) {
82 if (!this._items.hasOwnProperty(oldName)) {
83 throw new Error('Item does not exist in directory: ' + oldName);
84 }
85 if (this._items.hasOwnProperty(newName)) {
86 throw new Error('Item with same name already exists: ' + newName);
87 }
88 var item = this._items[oldName];
89 delete this._items[oldName];
90 this._items[newName] = item;
91 item.setName(newName);
92 return item;
93};
94
95
96/**
97 * Get list of item names in this directory.
98 * @return {Array.<string>} Item names.
99 */
100Directory.prototype.list = function() {
101 return Object.keys(this._items).sort();
102};
103
104
105/**
106 * Get directory stats.
107 * @return {Object} Stats properties.
108 */
109Directory.prototype.getStats = function() {
110 return {
111 mode: this.getMode() | constants.S_IFDIR,
112 atime: this.getATime(),
113 mtime: this.getMTime(),
114 ctime: this.getCTime(),
115 uid: this.getUid(),
116 gid: this.getGid(),
117 size: 1
118 };
119};