blob: cd278fe0ba4d3fcb8d0ef12bc9923a92101b7944 [file] [log] [blame]
Leo Repp58b9f112021-11-22 11:57:47 +01001'use strict';
2
3var once = require('once');
4
5var helpers = require('./helpers');
6
7function map(values, iterator, extensions, done) {
8 // Allow for extensions to not be specified
9 if (typeof extensions === 'function') {
10 done = extensions;
11 extensions = {};
12 }
13
14 // Handle no callback case
15 if (typeof done !== 'function') {
16 done = helpers.noop;
17 }
18
19 done = once(done);
20
21 // Will throw if non-object
22 var keys = Object.keys(values);
23 var length = keys.length;
24 var count = length;
25 var idx = 0;
26 // Return the same type as passed in
27 var results = helpers.initializeResults(values);
28
29 var exts = helpers.defaultExtensions(extensions);
30
31 if (length === 0) {
32 return done(null, results);
33 }
34
35 for (idx = 0; idx < length; idx++) {
36 var key = keys[idx];
37 next(key);
38 }
39
40 function next(key) {
41 var value = values[key];
42
43 var storage = exts.create(value, key) || {};
44
45 exts.before(storage);
46 iterator(value, key, once(handler));
47
48 function handler(err, result) {
49 if (err) {
50 exts.error(err, storage);
51 return done(err, results);
52 }
53
54 exts.after(result, storage);
55 results[key] = result;
56 if (--count === 0) {
57 done(err, results);
58 }
59 }
60 }
61}
62
63module.exports = map;