1 | 'use strict';
|
2 |
|
3 | var path = require('path');
|
4 |
|
5 | var when = require('when');
|
6 | var nodefn = require('when/node');
|
7 | var levelup = require('levelup');
|
8 | var memdown = require('memdown');
|
9 | var immutable = require('immutable');
|
10 |
|
11 | var db = levelup('temp-files', {
|
12 | db: memdown,
|
13 | valueEncoding: 'json'
|
14 | });
|
15 |
|
16 | var root = process.browser ? '/' : './';
|
17 |
|
18 | function tempGet(key, opts, cb){
|
19 | if(typeof opts === 'function'){
|
20 | cb = opts;
|
21 | opts = null;
|
22 | }
|
23 |
|
24 | var promise = when.promise(function(resolve, reject){
|
25 | db.get(key, opts, function(err, result){
|
26 | if(err){
|
27 | return reject(err);
|
28 | }
|
29 |
|
30 | resolve(result);
|
31 | });
|
32 | });
|
33 |
|
34 | return nodefn.bindCallback(promise, cb);
|
35 | }
|
36 |
|
37 | function tempPut(key, value, opts, cb){
|
38 | if(typeof opts === 'function'){
|
39 | cb = opts;
|
40 | opts = null;
|
41 | }
|
42 |
|
43 | var promise = when.promise(function(resolve, reject){
|
44 | db.put(key, value, opts, function(err, result){
|
45 | if(err){
|
46 | return reject(err);
|
47 | }
|
48 |
|
49 | resolve(result);
|
50 | });
|
51 | });
|
52 |
|
53 | return nodefn.bindCallback(promise, cb);
|
54 | }
|
55 |
|
56 | function tempDel(key, opts, cb){
|
57 | if(typeof opts === 'function'){
|
58 | cb = opts;
|
59 | opts = null;
|
60 | }
|
61 |
|
62 | var promise = when.promise(function(resolve, reject){
|
63 | db.del(key, opts, function(err, result){
|
64 | if(err){
|
65 | return reject(err);
|
66 | }
|
67 |
|
68 | resolve(result);
|
69 | });
|
70 | });
|
71 |
|
72 | return nodefn.bindCallback(promise, cb);
|
73 | }
|
74 |
|
75 | function tempNotFound(err){
|
76 | return err.notFound;
|
77 | }
|
78 |
|
79 | function containsFile(directory, filename){
|
80 | if(typeof filename.deref === 'function'){
|
81 | filename = filename.deref();
|
82 | }
|
83 |
|
84 | filename = path.basename(filename);
|
85 |
|
86 | var contains = directory
|
87 | .map(function(file){
|
88 | return file.get('name');
|
89 | })
|
90 | .contains(filename);
|
91 |
|
92 | return contains;
|
93 | }
|
94 |
|
95 | function normalizePath(dirpath, filepath){
|
96 | return path.resolve(dirpath, filepath);
|
97 | }
|
98 |
|
99 | function createFile(filename){
|
100 | return immutable.fromJS({ name: path.basename(filename) });
|
101 | }
|
102 |
|
103 | function createFileWithTemp(filename){
|
104 | var file = createFile(filename);
|
105 |
|
106 | return tempGet(filename)
|
107 | .then(function(){
|
108 | return file.set('temp', true);
|
109 | })
|
110 | .catch(tempNotFound, function(){
|
111 | return file.set('temp', false);
|
112 | });
|
113 | }
|
114 |
|
115 | function createFiles(filenames, opts, cb){
|
116 | if(typeof opts === 'function'){
|
117 | cb = opts;
|
118 | opts = {};
|
119 | }
|
120 |
|
121 | opts.cwd = opts.cwd || root;
|
122 | opts.checkTemp = opts.checkTemp || false;
|
123 |
|
124 | filenames = filenames.map(function(filename){
|
125 | return normalizePath(opts.cwd, filename);
|
126 | });
|
127 |
|
128 | var promise;
|
129 | if(opts.checkTemp){
|
130 | promise = when.map(filenames, createFileWithTemp);
|
131 | } else {
|
132 | promise = when.map(filenames, createFile);
|
133 | }
|
134 |
|
135 | return nodefn.bindCallback(promise, cb);
|
136 | }
|
137 |
|
138 | module.exports = {
|
139 | root: root,
|
140 | normalizePath: normalizePath,
|
141 | containsFile: containsFile,
|
142 | createFiles: createFiles,
|
143 | temp: {
|
144 | get: tempGet,
|
145 | put: tempPut,
|
146 | del: tempDel,
|
147 | notFound: tempNotFound
|
148 | }
|
149 | };
|