ghost 4.15.0 → 4.17.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.eslintrc.js +7 -1
- package/content/themes/casper/assets/built/screen.css +1 -1
- package/content/themes/casper/assets/built/screen.css.map +1 -1
- package/content/themes/casper/assets/css/screen.css +1 -1
- package/content/themes/casper/default.hbs +2 -2
- package/content/themes/casper/package.json +1 -1
- package/content/themes/casper/page.hbs +28 -26
- package/content/themes/casper/partials/post-card.hbs +2 -2
- package/content/themes/casper/post.hbs +67 -65
- package/content/themes/casper/tag.hbs +2 -2
- package/core/boot.js +7 -7
- package/core/bridge.js +4 -3
- package/core/built/assets/{chunk.3.4b1d9e20e57164ac9c29.js → chunk.3.b80d3e1e6b8556aaff3c.js} +72 -71
- package/core/built/assets/ghost-dark-f7bf2dd8d8c702716f75bfa4ccd92df2.css +1 -0
- package/core/built/assets/{ghost.min-e35cfee26d942c364166f57f3dcc9e75.js → ghost.min-52a5420ffcea6bf17761b5c59cf020e2.js} +979 -908
- package/core/built/assets/ghost.min-741246f42f000c073999a5363434ea2c.css +1 -0
- package/core/built/assets/icons/discount-bubble.svg +1 -0
- package/core/built/assets/{vendor.min-ca33abc718f21a51327841d58f8875d0.js → vendor.min-1bfc9d56d27508db88ef417deb55f16f.js} +454 -434
- package/core/frontend/apps/amp/lib/helpers/amp_analytics.js +2 -2
- package/core/frontend/apps/amp/lib/helpers/amp_components.js +2 -1
- package/core/frontend/apps/amp/lib/helpers/amp_content.js +5 -1
- package/core/frontend/apps/amp/lib/helpers/amp_style.js +1 -1
- package/core/frontend/apps/amp/lib/router.js +8 -4
- package/core/frontend/apps/private-blogging/index.js +13 -5
- package/core/frontend/apps/private-blogging/lib/helpers/input_password.js +1 -1
- package/core/frontend/apps/private-blogging/lib/middleware.js +8 -3
- package/core/frontend/helpers/asset.js +10 -2
- package/core/frontend/helpers/author.js +5 -3
- package/core/frontend/helpers/authors.js +4 -3
- package/core/frontend/helpers/body_class.js +1 -1
- package/core/frontend/helpers/cancel_link.js +9 -2
- package/core/frontend/helpers/concat.js +1 -1
- package/core/frontend/helpers/content.js +1 -1
- package/core/frontend/helpers/date.js +1 -1
- package/core/frontend/helpers/encode.js +1 -1
- package/core/frontend/helpers/excerpt.js +2 -1
- package/core/frontend/helpers/facebook_url.js +2 -1
- package/core/frontend/helpers/foreach.js +11 -2
- package/core/frontend/helpers/get.js +14 -3
- package/core/frontend/helpers/ghost_foot.js +2 -1
- package/core/frontend/helpers/ghost_head.js +10 -1
- package/core/frontend/helpers/has.js +8 -3
- package/core/frontend/helpers/img_url.js +9 -3
- package/core/frontend/helpers/is.js +7 -2
- package/core/frontend/helpers/lang.js +1 -1
- package/core/frontend/helpers/link.js +11 -2
- package/core/frontend/helpers/link_class.js +11 -2
- package/core/frontend/helpers/match.js +12 -3
- package/core/frontend/helpers/navigation.js +13 -4
- package/core/frontend/helpers/pagination.js +15 -5
- package/core/frontend/helpers/plural.js +8 -2
- package/core/frontend/helpers/post_class.js +1 -1
- package/core/frontend/helpers/prev_post.js +9 -2
- package/core/frontend/helpers/price.js +11 -6
- package/core/frontend/helpers/products.js +2 -1
- package/core/frontend/helpers/reading_time.js +4 -2
- package/core/frontend/helpers/t.js +1 -1
- package/core/frontend/helpers/tags.js +3 -1
- package/core/frontend/helpers/title.js +1 -1
- package/core/frontend/helpers/twitter_url.js +2 -1
- package/core/frontend/helpers/url.js +3 -1
- package/core/frontend/services/proxy.js +34 -57
- package/core/frontend/services/rendering.js +24 -0
- package/core/frontend/services/routing/controllers/channel.js +6 -2
- package/core/frontend/services/routing/controllers/collection.js +6 -2
- package/core/frontend/services/routing/middlewares/page-param.js +6 -2
- package/core/frontend/services/theme-engine/middleware.js +23 -6
- package/core/frontend/services/theme-engine/preview.js +31 -8
- package/core/server/adapters/scheduling/post-scheduling/scheduler-intergation.js +6 -4
- package/core/server/adapters/storage/LocalFileStorage.js +10 -4
- package/core/server/api/canary/custom-theme-settings.js +22 -0
- package/core/server/api/canary/index.js +4 -0
- package/core/server/api/canary/members.js +1 -1
- package/core/server/api/canary/redirects.js +5 -5
- package/core/server/api/canary/settings.js +16 -148
- package/core/server/api/canary/utils/serializers/output/custom-theme-settings.js +13 -0
- package/core/server/api/canary/utils/serializers/output/index.js +4 -0
- package/core/server/api/canary/utils/validators/input/settings.js +23 -1
- package/core/server/api/v2/redirects.js +3 -3
- package/core/server/api/v2/settings.js +3 -4
- package/core/server/api/v3/redirects.js +5 -5
- package/core/server/api/v3/settings.js +16 -136
- package/core/server/api/v3/utils/validators/input/settings.js +23 -1
- package/core/server/data/db/state-manager.js +1 -1
- package/core/server/data/exporter/table-lists.js +3 -1
- package/core/server/data/importer/import-manager.js +398 -0
- package/core/server/data/importer/importers/data/data-importer.js +162 -0
- package/core/server/data/importer/importers/data/index.js +1 -162
- package/core/server/data/importer/index.js +1 -379
- package/core/server/data/migrations/versions/4.16/01-add-custom-theme-settings-table.js +9 -0
- package/core/server/data/migrations/versions/4.17/01-add-custom-theme-settings-permissions.js +21 -0
- package/core/server/data/migrations/versions/4.17/02-add-offers-table.js +19 -0
- package/core/server/data/migrations/versions/4.17/03-add-offers-permissions.js +35 -0
- package/core/server/data/schema/fixtures/fixtures.json +32 -0
- package/core/server/data/schema/schema.js +33 -0
- package/core/server/models/custom-theme-setting.js +9 -0
- package/core/server/models/index.js +2 -0
- package/core/server/services/custom-theme-settings.js +8 -0
- package/core/server/services/members/api.js +4 -1
- package/core/server/services/redirects/index.js +15 -0
- package/core/{frontend → server}/services/redirects/settings.js +13 -6
- package/core/server/services/redirects/validation.js +44 -0
- package/core/{frontend/services/settings → server/services/route-settings}/default-routes.yaml +0 -0
- package/core/server/services/route-settings/default-settings-manager.js +62 -0
- package/core/server/services/route-settings/index.js +32 -1
- package/core/server/services/route-settings/route-settings.js +38 -12
- package/core/server/services/route-settings/settings-loader.js +102 -0
- package/core/{frontend/services/settings → server/services/route-settings}/validate.js +38 -28
- package/core/server/services/route-settings/yaml-parser.js +53 -0
- package/core/server/services/settings/index.js +13 -16
- package/core/server/services/settings/settings-bread-service.js +188 -0
- package/core/server/services/settings/settings-utils.js +32 -0
- package/core/server/services/themes/ThemeStorage.js +5 -4
- package/core/server/services/themes/activation-bridge.js +14 -0
- package/core/server/services/themes/validate.js +5 -2
- package/core/server/web/admin/views/default-prod.html +4 -4
- package/core/server/web/admin/views/default.html +4 -4
- package/core/server/web/api/canary/admin/routes.js +5 -1
- package/core/server/web/members/app.js +3 -0
- package/core/server/web/oauth/app.js +7 -8
- package/core/server/web/shared/middlewares/custom-redirects.js +82 -59
- package/core/server/web/site/routes.js +2 -2
- package/core/shared/config/defaults.json +2 -2
- package/core/shared/config/overrides.json +1 -1
- package/core/shared/custom-theme-settings-cache.js +3 -0
- package/core/shared/i18n/translations/en.json +2 -13
- package/core/shared/labs.js +2 -2
- package/package.json +42 -41
- package/yarn.lock +916 -901
- package/core/built/assets/ghost-dark-faf931d90e92535e6c03ca16793cbe7b.css +0 -1
- package/core/built/assets/ghost.min-7aa074ad556a8455155ac88ceaca03ab.css +0 -1
- package/core/frontend/services/redirects/index.js +0 -9
- package/core/frontend/services/redirects/validation.js +0 -28
- package/core/frontend/services/settings/ensure-settings.js +0 -47
- package/core/frontend/services/settings/index.js +0 -104
- package/core/frontend/services/settings/loader.js +0 -89
- package/core/frontend/services/settings/yaml-parser.js +0 -31
|
@@ -0,0 +1,162 @@
|
|
|
1
|
+
const _ = require('lodash');
|
|
2
|
+
const Promise = require('bluebird');
|
|
3
|
+
const semver = require('semver');
|
|
4
|
+
const {IncorrectUsageError} = require('@tryghost/errors');
|
|
5
|
+
const debug = require('@tryghost/debug')('importer:data');
|
|
6
|
+
const {sequence} = require('@tryghost/promise');
|
|
7
|
+
const models = require('../../../../models');
|
|
8
|
+
const PostsImporter = require('./posts');
|
|
9
|
+
const TagsImporter = require('./tags');
|
|
10
|
+
const SettingsImporter = require('./settings');
|
|
11
|
+
const UsersImporter = require('./users');
|
|
12
|
+
const RolesImporter = require('./roles');
|
|
13
|
+
let importers = {};
|
|
14
|
+
let DataImporter;
|
|
15
|
+
|
|
16
|
+
DataImporter = {
|
|
17
|
+
type: 'data',
|
|
18
|
+
|
|
19
|
+
preProcess: function preProcess(importData) {
|
|
20
|
+
importData.preProcessedByData = true;
|
|
21
|
+
return importData;
|
|
22
|
+
},
|
|
23
|
+
|
|
24
|
+
init: function init(importData) {
|
|
25
|
+
importers.users = new UsersImporter(importData.data);
|
|
26
|
+
importers.roles = new RolesImporter(importData.data);
|
|
27
|
+
importers.tags = new TagsImporter(importData.data);
|
|
28
|
+
importers.posts = new PostsImporter(importData.data);
|
|
29
|
+
importers.settings = new SettingsImporter(importData.data);
|
|
30
|
+
|
|
31
|
+
return importData;
|
|
32
|
+
},
|
|
33
|
+
|
|
34
|
+
// Allow importing with an options object that is passed through the importer
|
|
35
|
+
doImport: function doImport(importData, importOptions) {
|
|
36
|
+
importOptions = importOptions || {};
|
|
37
|
+
|
|
38
|
+
const ops = [];
|
|
39
|
+
let errors = [];
|
|
40
|
+
let results = [];
|
|
41
|
+
|
|
42
|
+
const modelOptions = {
|
|
43
|
+
importing: true,
|
|
44
|
+
context: {
|
|
45
|
+
internal: true
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
|
|
49
|
+
if (!Object.prototype.hasOwnProperty.call(importOptions, 'returnImportedData')) {
|
|
50
|
+
importOptions.returnImportedData = false;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
if (importOptions.importPersistUser) {
|
|
54
|
+
modelOptions.importPersistUser = importOptions.importPersistUser;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
if (!importData.meta) {
|
|
58
|
+
return Promise.reject(new IncorrectUsageError({
|
|
59
|
+
message: 'Wrong importer structure. `meta` is missing.',
|
|
60
|
+
help: 'https://ghost.org/docs/migration/custom/'
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
if (!importData.meta.version) {
|
|
65
|
+
return Promise.reject(new IncorrectUsageError({
|
|
66
|
+
message: 'Wrong importer structure. `meta.version` is missing.',
|
|
67
|
+
help: 'https://ghost.org/docs/migration/custom/'
|
|
68
|
+
}));
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
// CASE: We deny LTS imports, because these are major version jumps. Only imports from v1 until the latest are supported.
|
|
72
|
+
// We can detect a wrong structure by checking the meta version field. Ghost v0 doesn't use semver compliant versions.
|
|
73
|
+
if (!semver.valid(importData.meta.version)) {
|
|
74
|
+
return Promise.reject(new IncorrectUsageError({
|
|
75
|
+
message: 'Detected unsupported file structure.',
|
|
76
|
+
help: 'Please install Ghost 1.0, import the file and then update your blog to the latest Ghost version.\nVisit https://ghost.org/docs/update/ or ask for help in our https://forum.ghost.org.'
|
|
77
|
+
}));
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
this.init(importData);
|
|
81
|
+
|
|
82
|
+
return models.Base.transaction(function (transacting) {
|
|
83
|
+
modelOptions.transacting = transacting;
|
|
84
|
+
|
|
85
|
+
_.each(importers, function (importer) {
|
|
86
|
+
ops.push(function doModelImport() {
|
|
87
|
+
return importer.fetchExisting(modelOptions, importOptions)
|
|
88
|
+
.then(function () {
|
|
89
|
+
return importer.beforeImport(modelOptions, importOptions);
|
|
90
|
+
})
|
|
91
|
+
.then(function () {
|
|
92
|
+
if (importer.options.requiredImportedData.length) {
|
|
93
|
+
_.each(importer.options.requiredImportedData, (key) => {
|
|
94
|
+
importer.requiredImportedData[key] = importers[key].importedData;
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
if (importer.options.requiredExistingData.length) {
|
|
99
|
+
_.each(importer.options.requiredExistingData, (key) => {
|
|
100
|
+
importer.requiredExistingData[key] = importers[key].existingData;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
return importer.replaceIdentifiers(modelOptions, importOptions);
|
|
105
|
+
})
|
|
106
|
+
.then(function () {
|
|
107
|
+
return importer.doImport(modelOptions, importOptions)
|
|
108
|
+
.then(function (_results) {
|
|
109
|
+
results = results.concat(_results);
|
|
110
|
+
});
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
|
|
115
|
+
sequence(ops)
|
|
116
|
+
.then(function () {
|
|
117
|
+
results.forEach(function (promise) {
|
|
118
|
+
if (!promise.isFulfilled()) {
|
|
119
|
+
errors = errors.concat(promise.reason());
|
|
120
|
+
}
|
|
121
|
+
});
|
|
122
|
+
|
|
123
|
+
if (errors.length === 0) {
|
|
124
|
+
transacting.commit();
|
|
125
|
+
} else {
|
|
126
|
+
transacting.rollback(errors);
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
}).then(function () {
|
|
130
|
+
/**
|
|
131
|
+
* data: imported data
|
|
132
|
+
* originalData: data from the json file
|
|
133
|
+
* problems: warnings
|
|
134
|
+
*/
|
|
135
|
+
const toReturn = {
|
|
136
|
+
data: {},
|
|
137
|
+
originalData: importData.data,
|
|
138
|
+
problems: []
|
|
139
|
+
};
|
|
140
|
+
|
|
141
|
+
_.each(importers, function (importer) {
|
|
142
|
+
toReturn.problems = toReturn.problems.concat(importer.problems);
|
|
143
|
+
|
|
144
|
+
if (importOptions.returnImportedData) {
|
|
145
|
+
toReturn.data[importer.dataKeyToImport] = importer.importedDataToReturn;
|
|
146
|
+
}
|
|
147
|
+
});
|
|
148
|
+
|
|
149
|
+
return toReturn;
|
|
150
|
+
}).catch(function (err) {
|
|
151
|
+
debug(err);
|
|
152
|
+
return Promise.reject(err);
|
|
153
|
+
}).finally(() => {
|
|
154
|
+
// release memory
|
|
155
|
+
importers = {};
|
|
156
|
+
results = null;
|
|
157
|
+
importData = null;
|
|
158
|
+
});
|
|
159
|
+
}
|
|
160
|
+
};
|
|
161
|
+
|
|
162
|
+
module.exports = DataImporter;
|
|
@@ -1,162 +1 @@
|
|
|
1
|
-
|
|
2
|
-
const Promise = require('bluebird');
|
|
3
|
-
const semver = require('semver');
|
|
4
|
-
const {IncorrectUsageError} = require('@tryghost/errors');
|
|
5
|
-
const debug = require('@tryghost/debug')('importer:data');
|
|
6
|
-
const {sequence} = require('@tryghost/promise');
|
|
7
|
-
const models = require('../../../../models');
|
|
8
|
-
const PostsImporter = require('./posts');
|
|
9
|
-
const TagsImporter = require('./tags');
|
|
10
|
-
const SettingsImporter = require('./settings');
|
|
11
|
-
const UsersImporter = require('./users');
|
|
12
|
-
const RolesImporter = require('./roles');
|
|
13
|
-
let importers = {};
|
|
14
|
-
let DataImporter;
|
|
15
|
-
|
|
16
|
-
DataImporter = {
|
|
17
|
-
type: 'data',
|
|
18
|
-
|
|
19
|
-
preProcess: function preProcess(importData) {
|
|
20
|
-
importData.preProcessedByData = true;
|
|
21
|
-
return importData;
|
|
22
|
-
},
|
|
23
|
-
|
|
24
|
-
init: function init(importData) {
|
|
25
|
-
importers.users = new UsersImporter(importData.data);
|
|
26
|
-
importers.roles = new RolesImporter(importData.data);
|
|
27
|
-
importers.tags = new TagsImporter(importData.data);
|
|
28
|
-
importers.posts = new PostsImporter(importData.data);
|
|
29
|
-
importers.settings = new SettingsImporter(importData.data);
|
|
30
|
-
|
|
31
|
-
return importData;
|
|
32
|
-
},
|
|
33
|
-
|
|
34
|
-
// Allow importing with an options object that is passed through the importer
|
|
35
|
-
doImport: function doImport(importData, importOptions) {
|
|
36
|
-
importOptions = importOptions || {};
|
|
37
|
-
|
|
38
|
-
const ops = [];
|
|
39
|
-
let errors = [];
|
|
40
|
-
let results = [];
|
|
41
|
-
|
|
42
|
-
const modelOptions = {
|
|
43
|
-
importing: true,
|
|
44
|
-
context: {
|
|
45
|
-
internal: true
|
|
46
|
-
}
|
|
47
|
-
};
|
|
48
|
-
|
|
49
|
-
if (!Object.prototype.hasOwnProperty.call(importOptions, 'returnImportedData')) {
|
|
50
|
-
importOptions.returnImportedData = false;
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
if (importOptions.importPersistUser) {
|
|
54
|
-
modelOptions.importPersistUser = importOptions.importPersistUser;
|
|
55
|
-
}
|
|
56
|
-
|
|
57
|
-
if (!importData.meta) {
|
|
58
|
-
return Promise.reject(new IncorrectUsageError({
|
|
59
|
-
message: 'Wrong importer structure. `meta` is missing.',
|
|
60
|
-
help: 'https://ghost.org/docs/migration/custom/'
|
|
61
|
-
}));
|
|
62
|
-
}
|
|
63
|
-
|
|
64
|
-
if (!importData.meta.version) {
|
|
65
|
-
return Promise.reject(new IncorrectUsageError({
|
|
66
|
-
message: 'Wrong importer structure. `meta.version` is missing.',
|
|
67
|
-
help: 'https://ghost.org/docs/migration/custom/'
|
|
68
|
-
}));
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
// CASE: We deny LTS imports, because these are major version jumps. Only imports from v1 until the latest are supported.
|
|
72
|
-
// We can detect a wrong structure by checking the meta version field. Ghost v0 doesn't use semver compliant versions.
|
|
73
|
-
if (!semver.valid(importData.meta.version)) {
|
|
74
|
-
return Promise.reject(new IncorrectUsageError({
|
|
75
|
-
message: 'Detected unsupported file structure.',
|
|
76
|
-
help: 'Please install Ghost 1.0, import the file and then update your blog to the latest Ghost version.\nVisit https://ghost.org/docs/update/ or ask for help in our https://forum.ghost.org.'
|
|
77
|
-
}));
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
this.init(importData);
|
|
81
|
-
|
|
82
|
-
return models.Base.transaction(function (transacting) {
|
|
83
|
-
modelOptions.transacting = transacting;
|
|
84
|
-
|
|
85
|
-
_.each(importers, function (importer) {
|
|
86
|
-
ops.push(function doModelImport() {
|
|
87
|
-
return importer.fetchExisting(modelOptions, importOptions)
|
|
88
|
-
.then(function () {
|
|
89
|
-
return importer.beforeImport(modelOptions, importOptions);
|
|
90
|
-
})
|
|
91
|
-
.then(function () {
|
|
92
|
-
if (importer.options.requiredImportedData.length) {
|
|
93
|
-
_.each(importer.options.requiredImportedData, (key) => {
|
|
94
|
-
importer.requiredImportedData[key] = importers[key].importedData;
|
|
95
|
-
});
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
if (importer.options.requiredExistingData.length) {
|
|
99
|
-
_.each(importer.options.requiredExistingData, (key) => {
|
|
100
|
-
importer.requiredExistingData[key] = importers[key].existingData;
|
|
101
|
-
});
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
return importer.replaceIdentifiers(modelOptions, importOptions);
|
|
105
|
-
})
|
|
106
|
-
.then(function () {
|
|
107
|
-
return importer.doImport(modelOptions, importOptions)
|
|
108
|
-
.then(function (_results) {
|
|
109
|
-
results = results.concat(_results);
|
|
110
|
-
});
|
|
111
|
-
});
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
|
|
115
|
-
sequence(ops)
|
|
116
|
-
.then(function () {
|
|
117
|
-
results.forEach(function (promise) {
|
|
118
|
-
if (!promise.isFulfilled()) {
|
|
119
|
-
errors = errors.concat(promise.reason());
|
|
120
|
-
}
|
|
121
|
-
});
|
|
122
|
-
|
|
123
|
-
if (errors.length === 0) {
|
|
124
|
-
transacting.commit();
|
|
125
|
-
} else {
|
|
126
|
-
transacting.rollback(errors);
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
}).then(function () {
|
|
130
|
-
/**
|
|
131
|
-
* data: imported data
|
|
132
|
-
* originalData: data from the json file
|
|
133
|
-
* problems: warnings
|
|
134
|
-
*/
|
|
135
|
-
const toReturn = {
|
|
136
|
-
data: {},
|
|
137
|
-
originalData: importData.data,
|
|
138
|
-
problems: []
|
|
139
|
-
};
|
|
140
|
-
|
|
141
|
-
_.each(importers, function (importer) {
|
|
142
|
-
toReturn.problems = toReturn.problems.concat(importer.problems);
|
|
143
|
-
|
|
144
|
-
if (importOptions.returnImportedData) {
|
|
145
|
-
toReturn.data[importer.dataKeyToImport] = importer.importedDataToReturn;
|
|
146
|
-
}
|
|
147
|
-
});
|
|
148
|
-
|
|
149
|
-
return toReturn;
|
|
150
|
-
}).catch(function (err) {
|
|
151
|
-
debug(err);
|
|
152
|
-
return Promise.reject(err);
|
|
153
|
-
}).finally(() => {
|
|
154
|
-
// release memory
|
|
155
|
-
importers = {};
|
|
156
|
-
results = null;
|
|
157
|
-
importData = null;
|
|
158
|
-
});
|
|
159
|
-
}
|
|
160
|
-
};
|
|
161
|
-
|
|
162
|
-
module.exports = DataImporter;
|
|
1
|
+
module.exports = require('./data-importer');
|