mod-build 3.7.1 → 3.7.3

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/CHANGELOG.md CHANGED
@@ -1,5 +1,9 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.7.3
4
+
5
+ - Added `grab-section-deals-components` and `grab-mhsadmin-data` tasks for section deals pages.
6
+
3
7
  ## 3.7.1
4
8
 
5
9
  - updated clean task.
@@ -0,0 +1,417 @@
1
+ /* globals Promise */
2
+ /* eslint-disable space-before-function-paren */
3
+ const request = require('request');
4
+ const fs = require('fs');
5
+
6
+ module.exports = function(gulp, gulpPlugins, siteSettings, siteData) {
7
+ const lastModDateOptions = { year: 'numeric', month: '2-digit', day: '2-digit' };
8
+ const tradeLookUp = [];
9
+ const dateLocalString = 'en-US';
10
+ const showCostCalFor = ['windows', 'hvac'];
11
+ const perPageArticlesLimit = 100;
12
+ const articles = [];
13
+ let articleConfigsCount = 0, templatesCount = 0, cachedContractors = {};
14
+
15
+ const log = {
16
+ success: function(icon = '\u{23F3}', message = '') {
17
+ console.log(gulpPlugins.colors.bright, gulpPlugins.colors.fg.green, icon, ' ', message, gulpPlugins.colors.reset);
18
+ },
19
+ info: function(message = '') {
20
+ console.log(message);
21
+ },
22
+ error: function(message, throwError = true) {
23
+ console.log(gulpPlugins.colors.bg.red, gulpPlugins.colors.bright, message, gulpPlugins.colors.reset);
24
+ if (throwError) {
25
+ throw new Error(message);
26
+ }
27
+ }
28
+ };
29
+
30
+ function formatDate(date) {
31
+ const d = new Date(date);
32
+ const year = d.getFullYear();
33
+ const month = String(d.getMonth() + 1).padStart(2, '0');
34
+ const day = String(d.getDate()).padStart(2, '0');
35
+ return [year, month, day].join('-');
36
+ }
37
+
38
+ async function processAndSortContractorList(list, ratingPropertyName = 'reviewScore', minRating = null) {
39
+ list = list.sort(function(a, b) {
40
+ if (a[ratingPropertyName] === null && b[ratingPropertyName] === null) {
41
+ return a.displayName.localeCompare(b.displayName);
42
+ }
43
+ return b[ratingPropertyName] - a[ratingPropertyName];
44
+ });
45
+
46
+ if (minRating) {
47
+ list = await list.filter(data => !data[ratingPropertyName] || data[ratingPropertyName] >= minRating);
48
+ }
49
+
50
+ list = await list.map(function(data, i) {
51
+ if (data) {
52
+ data.index = i;
53
+ }
54
+ return data;
55
+ });
56
+
57
+ return list;
58
+ }
59
+
60
+ // helper function to create nested object dynamically
61
+ function assign(obj, keyPath, value) {
62
+ const lastKeyIndex = keyPath.length - 1;
63
+ for (var i = 0; i < lastKeyIndex; ++i) {
64
+ const key = keyPath[i];
65
+ if (!(key in obj)) {
66
+ obj[key] = {};
67
+ }
68
+ obj = obj[key];
69
+ }
70
+ obj[keyPath[lastKeyIndex]] = value;
71
+ }
72
+
73
+ const sortArticlesByDate = function(articlesList) {
74
+ if (articlesList.length) {
75
+ articlesList.sort(function(a, b) {
76
+ return new Date(b.data.published) - new Date(a.data.published);
77
+ });
78
+ }
79
+ };
80
+
81
+ // MARK: configureGlobalVariables
82
+ const configureGlobalVariables = function(siteData, siteSettings) {
83
+ return new Promise(resolve => {
84
+ const DOMAIN = `https://${siteSettings.nodeEnv === 'qa.modernize.com' ? 'qa' : ''}mhsadmin.wpenginepowered.com`;
85
+ const WP_ENDPOINT_BASE_URL = `${DOMAIN}/wp-json/wp/v2`;
86
+ siteSettings.endpoints = {};
87
+ siteSettings.endpoints.GET_DETAILED_ARTICLES = `${WP_ENDPOINT_BASE_URL}/article?_fields=data,meta,slug&per_page=${perPageArticlesLimit}&site=${siteData.siteName}`;
88
+ siteSettings.endpoints.GET_CONTRACTORS = `${WP_ENDPOINT_BASE_URL}/contractor`;
89
+ siteSettings.endpoints.GET_SITE_DETAILS = `${WP_ENDPOINT_BASE_URL}/site?_fields=data,slug,&site=${siteData.siteName}`;
90
+
91
+ siteData.sitemap = [];
92
+ siteData.page.articlesConfig = {
93
+ siteDetails: {},
94
+ articlesWithContractors: {},
95
+ tradeHubPagesArticlesList: {},
96
+ homePageArticlesList: {
97
+ featured: [],
98
+ top: [],
99
+ recent: []
100
+ }
101
+ };
102
+ resolve();
103
+ });
104
+ };
105
+
106
+ // MARK: getArticlesList
107
+ const getSiteDetails = async (siteData, siteSettings) => {
108
+ return await new Promise((resolve) => {
109
+ if (!siteData.page) {
110
+ log.error('page is not defined in siteData!');
111
+ }
112
+ const { page, sitemap } = siteData;
113
+ const { articlesConfig } = page;
114
+ const { siteDetails } = articlesConfig;
115
+ return request(siteSettings.endpoints.GET_SITE_DETAILS, async function(_xhr, response, body) {
116
+ if (response.statusCode === 200) {
117
+ let result = await JSON.parse(body);
118
+ if (result.length) {
119
+ result = result.filter((data) => data.slug === siteData.siteName);
120
+ }
121
+ await Object.assign(siteDetails, result[0]);
122
+ siteDetails.vertical = await siteDetails?.data?.homepage?.hero?.heading;
123
+ siteDetails.costCalculatorTheme = siteData.costCalculatorTheme ? siteData.costCalculatorTheme : siteDetails?.slug;
124
+ siteDetails.domain = await siteDetails?.data?.domain?.replace(/\/*?$/, '');
125
+ siteDetails.homepage = await siteDetails?.data?.homepage?.slug;
126
+ siteDetails.canonicalURL = await `${siteDetails?.domain}/${siteDetails?.homepage}/`;
127
+ if (siteDetails.data.favicon && Object.keys(siteDetails.data.favicon).length) {
128
+ page.headConfig.faviconPath = siteDetails.data.favicon.url ? siteDetails.data.favicon.url : page.headConfig.faviconPath;
129
+ }
130
+
131
+ sitemap.push(
132
+ {
133
+ link: `${siteDetails.domain}/${siteDetails.homepage}/`,
134
+ lastMod: formatDate(new Date().toLocaleDateString(dateLocalString, lastModDateOptions))
135
+ }
136
+ );
137
+ resolve();
138
+ } else {
139
+ log.error('GET_SITE_DETAILS - Something went wrong!');
140
+ }
141
+ });
142
+ });
143
+ };
144
+
145
+ // MARK: getDetailedArticles
146
+ const getDetailedArticles = async (siteSettings, page = 1) => {
147
+ return await new Promise((resolve) => {
148
+ log.info(`Fetching articles from page ${page?.toString()?.padStart(2, '0')}: ${siteSettings.endpoints.GET_DETAILED_ARTICLES}&page=${page}`);
149
+ return request(`${siteSettings.endpoints.GET_DETAILED_ARTICLES}&page=${page}`, async function(_xhr, response, body) {
150
+ if (response.statusCode === 200) {
151
+ const wpArticleTotalPages = await parseInt(response.headers['x-wp-totalpages']);
152
+ await articles.push(...JSON.parse(body));
153
+ if (page < wpArticleTotalPages) {
154
+ // recursive call to get the articles from next pages
155
+ await getDetailedArticles(siteSettings, page + 1);
156
+ } else {
157
+ log.success('\u{2705}', `Finished Fetching article(s) from ${wpArticleTotalPages} page(s)`);
158
+ }
159
+ } else {
160
+ log.error('GET_DETAILED_ARTICLES - Something went wrong!');
161
+ }
162
+ resolve();
163
+ });
164
+ });
165
+ };
166
+
167
+ // MARK: getContractors
168
+ const getContractors = async (trade, siteSettings) => {
169
+ if (!trade) {
170
+ return;
171
+ }
172
+ return await new Promise((resolve) => {
173
+ if (Object.keys(cachedContractors).length && cachedContractors[trade]) {
174
+ resolve(cachedContractors[trade]);
175
+ return;
176
+ } else {
177
+ return request(`${siteSettings.endpoints.GET_CONTRACTORS}?trade=${trade}`, async function(_xhr, response, body) {
178
+ if (response.statusCode === 200) {
179
+ const result = await JSON.parse(body);
180
+ cachedContractors = await { ...cachedContractors, [trade]: result };
181
+ resolve(result);
182
+ } else {
183
+ log.error('GET_CONTRACTORS - Something went wrong!', false);
184
+ resolve([]);
185
+ }
186
+ });
187
+ }
188
+ });
189
+ };
190
+
191
+ const getZipCardMarkup = async function(trade, gulpPlugins) {
192
+ let zipCard = null;
193
+
194
+ const _insertTrade = function(htmlString) {
195
+ const markup = gulpPlugins.htmlParser.parse(htmlString);
196
+ markup.querySelector('.btn--zip').setAttribute('data-service', trade.slug);
197
+ markup.querySelector('.trade').textContent = trade.displayName;
198
+ return markup;
199
+ };
200
+
201
+ return new Promise((resolve) => {
202
+ if (zipCard) {
203
+ zipCard = _insertTrade(zipCard);
204
+ return resolve(zipCard);
205
+ }
206
+ fs.readFile('./src/shared-components/section-deals/_partials/page-card-zip.html', 'utf-8', function(err, data) {
207
+ if (err) {
208
+ log.error('page-card-zip.html not found at "/src/shared-components/section-deals/_partials/page-card-zip.html" ');
209
+ }
210
+ zipCard = data;
211
+ zipCard = _insertTrade(zipCard);
212
+ resolve(zipCard);
213
+ });
214
+ });
215
+ };
216
+
217
+ // MARK: buildTemplates
218
+ async function buildTemplates(siteData, siteSettings, done) {
219
+ const { srcFolder, templatesSubfolder } = siteSettings;
220
+ const { page } = await siteData;
221
+ const { articlesConfig } = page;
222
+ const { articlesWithContractors, siteDetails } = articlesConfig;
223
+ const templatesPath = `${srcFolder}/${templatesSubfolder}/`;
224
+ return await new Promise(function(resolve) {
225
+ if (articlesWithContractors && Object.keys(articlesWithContractors).length) {
226
+ log.success('\u{23F3}', 'Building Article(s)...');
227
+ Object.entries(articlesWithContractors).forEach(async function([trade, articlesList]) {
228
+ Object.entries(articlesList).forEach(function([pageName, articleData]) {
229
+ let costCalculatorTrade = trade;
230
+ costCalculatorTrade = costCalculatorTrade.toLowerCase() === 'gutters' ? 'gutter' : costCalculatorTrade;
231
+ const tradeHubFileContent = `{{#page.articlesConfig.tradeHubPagesArticlesList.${trade}}}
232
+ {{fileInclude 'src/shared-components/section-deals/components/trade-hub-template.html'
233
+ tradeHubPageArticles = this
234
+ trade = '${articleData.data.trade.title}'
235
+ costCalculatorTrade = '${costCalculatorTrade}'
236
+ showCostCalculator = ${showCostCalFor.includes(trade)}
237
+ }}{{/page.articlesConfig.tradeHubPagesArticlesList.${trade}}}
238
+ <script>
239
+ window.siteData.trade='${trade}';
240
+ </script>`;
241
+
242
+ const fileName = articleData.slug;
243
+ const fileContent = `{{#page.articlesConfig.articlesWithContractors.${trade}.${pageName}}}
244
+ {{fileInclude 'src/shared-components/section-deals/components/article-template.html'
245
+ article = this
246
+ trade = '${trade}'
247
+ }}{{/page.articlesConfig.articlesWithContractors.${trade}.${pageName}}}`;
248
+ // make the directory by trade name
249
+ fs.mkdir(`${templatesPath}/${siteDetails.homepage}/${trade}/`, { recursive: true }, async function(error) {
250
+ if (error) {
251
+ throw error;
252
+ }
253
+ fs.writeFile(`${templatesPath}/${siteDetails.homepage}/${trade}/index.html`, tradeHubFileContent, function(err) {
254
+ if (err) {
255
+ throw err;
256
+ }
257
+ fs.writeFile(`${templatesPath}/${siteDetails.homepage}/${trade}/${fileName}.html`, fileContent, function($err) {
258
+ if ($err) {
259
+ throw $err;
260
+ }
261
+ templatesCount++;
262
+ log.info(`Article template ${templatesCount?.toString()?.padStart(2, '0')}: ${templatesPath}${trade}/${siteDetails.homepage}/${fileName}.html`);
263
+ if (articleConfigsCount === templatesCount) {
264
+ siteData.page.lastMod = formatDate(new Date().toLocaleDateString(dateLocalString, lastModDateOptions));
265
+ done();
266
+ log.success('\u{2705}', `Finished Building ${templatesCount} Article(s).`);
267
+ }
268
+ });
269
+ });
270
+ });
271
+ });
272
+ });
273
+ }
274
+ resolve();
275
+ });
276
+ }
277
+
278
+ // MARK: configureArticlesAndBuildTemplates
279
+ async function configureArticlesAndBuildTemplates(siteData, siteSettings, gulpPlugins) {
280
+ return await new Promise(function(done) {
281
+ if (!siteData.page) {
282
+ log.error('"page" is not defined in siteData!');
283
+ }
284
+
285
+ if (articles.length === 0) {
286
+ log.error('Articles not found!');
287
+ }
288
+
289
+ const { page } = siteData;
290
+ const { articlesConfig } = page;
291
+ const { homePageArticlesList, articlesWithContractors, tradeHubPagesArticlesList, siteDetails } = articlesConfig;
292
+
293
+ articles.forEach(async (article) => {
294
+ const templateData = article;
295
+ const articlesWithContractorsKey = article.slug.replaceAll(/[-|\s]/ig, '_');
296
+ const trade = article.data.trade.slug.toLowerCase().replaceAll(/[-|\s]/ig, '_');
297
+ const contractors = await getContractors(article.data.trade.slug, siteSettings);
298
+ const tradeDisplayName = article?.data?.trade?.title?.toLowerCase();
299
+ // Append contractors
300
+ if (contractors && contractors.length) {
301
+ templateData.contractors = await processAndSortContractorList(contractors, 'reviewScore');
302
+ }
303
+ const articleLink = await `${siteDetails?.homepage}/${article.data.trade.slug}/${article.slug}.html`;
304
+ const tradeHubLink = await `${siteDetails?.homepage}/${article.data.trade.slug}/`;
305
+ const categoryPageLink = await `${siteDetails?.homepage}/`;
306
+ templateData.data.redirectLink = await `/${articleLink}`;
307
+ templateData.data.tradeHubPageLink = await `/${tradeHubLink}`;
308
+ templateData.data.categoryPageLink = await `/${categoryPageLink}`;
309
+ templateData.meta.canonicalURL = await `${siteDetails?.domain}/${articleLink}`;
310
+ templateData.data.loc = await `${siteDetails?.domain}/${articleLink}`;
311
+ templateData.data.lastMod = await formatDate(new Date(article.data.published).toLocaleDateString(dateLocalString, lastModDateOptions));
312
+ templateData.data.vertical = siteDetails.vertical;
313
+ templateData.data.trade.displayName = tradeDisplayName === 'hvac' ? 'heating and cooling' : tradeDisplayName;
314
+
315
+ const lastMod = formatDate(new Date(templateData.data.published).toLocaleDateString(dateLocalString, lastModDateOptions));
316
+
317
+ if (!tradeLookUp.includes(article.data.trade.slug)) {
318
+ tradeLookUp.push(article.data.trade.slug);
319
+ siteData.sitemap.push(
320
+ {
321
+ link: `${siteDetails.domain}/${tradeHubLink}`,
322
+ lastMod
323
+ }
324
+ );
325
+ }
326
+
327
+ siteData.sitemap.push(
328
+ {
329
+ link: `${siteDetails.domain}/${articleLink}`,
330
+ lastMod
331
+ }
332
+ );
333
+
334
+ templateData.data.sponsoredContent = siteDetails.data.sponsoredContent.article;
335
+
336
+ const zipCard = await getZipCardMarkup(templateData.data.trade, gulpPlugins);
337
+ const htmlContent = gulpPlugins.htmlParser.parse(templateData.data.content);
338
+ const contentHeadings = htmlContent.querySelectorAll('h2[id]');
339
+ if (zipCard) {
340
+ // find the middle section index and add flag isMiddleSection
341
+ const middleSectionIndex = Math.floor((contentHeadings.length) / 2);
342
+ htmlContent.querySelectorAll('h2[id]')[middleSectionIndex].insertAdjacentHTML('beforebegin', zipCard);
343
+ }
344
+ templateData.data.content = htmlContent;
345
+
346
+ await assign(articlesWithContractors, [trade, articlesWithContractorsKey], templateData);
347
+
348
+ await articleConfigsCount++;
349
+
350
+ if (articleConfigsCount === articles.length) {
351
+ if (Object.keys(articlesWithContractors).length) {
352
+ Object.entries(articlesWithContractors).forEach(async function([tradeName, values]) {
353
+ await sortArticlesByDate(Object.values(values));
354
+ if (!tradeHubPagesArticlesList[tradeName]) {
355
+ tradeHubPagesArticlesList[tradeName] = {};
356
+ }
357
+
358
+ if (!tradeHubPagesArticlesList[tradeName].featured) {
359
+ tradeHubPagesArticlesList[tradeName].featured = [];
360
+ }
361
+
362
+ if (!tradeHubPagesArticlesList[tradeName].top) {
363
+ tradeHubPagesArticlesList[tradeName].top = [];
364
+ }
365
+
366
+ if (!tradeHubPagesArticlesList[tradeName].recent) {
367
+ tradeHubPagesArticlesList[tradeName].recent = [];
368
+ }
369
+
370
+ if (!tradeHubPagesArticlesList[tradeName].canonicalURL) {
371
+ tradeHubPagesArticlesList[tradeName].canonicalURL = `${siteDetails?.domain}/${tradeName}/`;
372
+ }
373
+
374
+ tradeHubPagesArticlesList[tradeName].page = await siteDetails?.data?.trades?.filter((data) => data.slug === tradeName)[0];
375
+
376
+ Object.entries(values).forEach(function([, data], i) {
377
+ if (i === 0) {
378
+ tradeHubPagesArticlesList[tradeName].featured.push(data.data);
379
+ }
380
+
381
+ if (showCostCalFor.includes(tradeName)) {
382
+ if (i >= 1) {
383
+ tradeHubPagesArticlesList[tradeName].recent.push(data.data);
384
+ tradeHubPagesArticlesList[tradeName].recentCount = tradeHubPagesArticlesList[tradeName].recent.length;
385
+ }
386
+ } else {
387
+ if (i > 0 && i < 3) {
388
+ tradeHubPagesArticlesList[tradeName].top.push(data.data);
389
+ tradeHubPagesArticlesList[tradeName].topCount = tradeHubPagesArticlesList[tradeName].top.length;
390
+ } else if (i >= 3) {
391
+ tradeHubPagesArticlesList[tradeName].recent.push(data.data);
392
+ tradeHubPagesArticlesList[tradeName].recentCount = tradeHubPagesArticlesList[tradeName].recent.length;
393
+ }
394
+ }
395
+
396
+ if (homePageArticlesList.featured.length === 0 && data.data.isFeatured) {
397
+ homePageArticlesList.featured.push(data.data);
398
+ } else if (homePageArticlesList.top.length < 2 && !data.data.isFeatured && data.data.isTopArticle) {
399
+ homePageArticlesList.top.push(data.data);
400
+ } else if (!data.data.isTopArticle && !data.data.isFeatured) {
401
+ homePageArticlesList.recent.push(data.data);
402
+ }
403
+ });
404
+ });
405
+ }
406
+ await buildTemplates(siteData, siteSettings, done);
407
+ }
408
+ });
409
+ });
410
+ }
411
+ return async function() {
412
+ await configureGlobalVariables(siteData, siteSettings);
413
+ await getSiteDetails(siteData, siteSettings);
414
+ await getDetailedArticles(siteSettings);
415
+ return await configureArticlesAndBuildTemplates(siteData, siteSettings, gulpPlugins);
416
+ };
417
+ };
@@ -0,0 +1,47 @@
1
+ /* globals Promise */
2
+ var request = require('request');
3
+ var source = require('vinyl-source-stream');
4
+
5
+ function streamSharedCompsToDestination(gulp, siteSettings, folder, fileName) {
6
+ return new Promise(resolve => {
7
+ request(`https://${siteSettings.nodeEnv}/quote/resources/mod-site/shared-components/${folder}/${fileName}`)
8
+ .on('response', resp => {
9
+ if (resp.statusCode !== 200) {
10
+ throw new Error(`${resp.statusCode} Error while fetching ${fileName}`);
11
+ }
12
+ })
13
+ .pipe(source(fileName))
14
+ .pipe(gulp.dest(`${siteSettings.srcFolder}/shared-components/${folder}/`))
15
+ .on('finish', resolve);
16
+ });
17
+ }
18
+
19
+ function getListOfSharedComponents(gulp, gulpPlugins, siteSettings, componentFolders) {
20
+ return componentFolders.map(folder => {
21
+ return new Promise(resolve => {
22
+ request(`https://${siteSettings.nodeEnv}/quote/resources/mod-site/shared-components/${folder}/all.json`, function(err, resp, body) {
23
+ if (resp.statusCode !== 200) {
24
+ throw new Error(`${resp.statusCode}: Error while fetching ${folder}/all.json`);
25
+ }
26
+ var listOfComponents = JSON.parse(body);
27
+ const componentPromises = listOfComponents.map(function(resource) {
28
+ return streamSharedCompsToDestination(gulp, siteSettings, folder, `${resource}`);
29
+ });
30
+ resolve(Promise.all(componentPromises));
31
+ });
32
+ });
33
+ });
34
+ }
35
+
36
+ module.exports = function(gulp, gulpPlugins, siteSettings) {
37
+ return function() {
38
+ const { nodeEnv } = siteSettings;
39
+ if (!nodeEnv) {
40
+ throw new Error('Missing environment variables. Did you start with gulp instead of npm run...?');
41
+ }
42
+
43
+ const componentFolders = ['section-deals'];
44
+
45
+ return getListOfSharedComponents(gulp, gulpPlugins, siteSettings, componentFolders);
46
+ };
47
+ };
@@ -40,7 +40,7 @@ module.exports = function() {
40
40
  return require(opts.gulpTasksFolderPath + '/grab-cdn')(opts.gulp, opts.gulpPlugins, opts.gulpSettings, opts.siteData);
41
41
  }
42
42
  }
43
- },
43
+ },
44
44
 
45
45
  // Grab form helpers files from CDN
46
46
  'grab-form-helpers': {
@@ -356,7 +356,7 @@ module.exports = function() {
356
356
 
357
357
  return require(opts.gulpTasksFolderPath + '/grab-images')(opts.gulp, opts.gulpSettings, opts.siteData);
358
358
  }
359
- },
359
+ },
360
360
 
361
361
  // Get global images
362
362
  'grab-global-images': {
@@ -430,7 +430,7 @@ module.exports = function() {
430
430
 
431
431
  return require(opts.gulpTasksFolderPath + '/grab-tooltips-json')(opts.gulp, opts.gulpPlugins, opts.gulpSettings, opts.siteData);
432
432
  }
433
- },
433
+ },
434
434
 
435
435
  // copy resources directory into dist
436
436
  'copy-resources-to-dist': {
@@ -488,6 +488,28 @@ module.exports = function() {
488
488
 
489
489
  return require('./copy-xml-files-to-dist')(opts.gulp, opts.gulpSettings);
490
490
  }
491
+ },
492
+
493
+ 'grab-section-deals-components': {
494
+ subtasks: [],
495
+ func: function(opts) {
496
+ if ('undefined' === typeof opts.gulpTasksFolderPath) {
497
+ opts.gulpTasksFolderPath = '.';
498
+ }
499
+
500
+ return require('./grab-section-deals-components')(opts.gulp, opts.gulpPlugins, opts.gulpSettings, opts.siteData);
501
+ }
502
+ },
503
+
504
+ 'grab-mhsadmin-data': {
505
+ subtasks: [],
506
+ func: function(opts) {
507
+ if ('undefined' === typeof opts.gulpTasksFolderPath) {
508
+ opts.gulpTasksFolderPath = '.';
509
+ }
510
+
511
+ return require('./grab-mhsadmin-data')(opts.gulp, opts.gulpPlugins, opts.gulpSettings, opts.siteData);
512
+ }
491
513
  }
492
514
  };
493
515
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mod-build",
3
- "version": "3.7.1",
3
+ "version": "3.7.3",
4
4
  "description": "Share components for S3 sites.",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",