mod-build 3.6.21--beta.2 → 3.6.21--a11y.beta.5

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.
@@ -10,7 +10,7 @@ module.exports = function(gulp, gulpPlugins, siteSettings, siteData) {
10
10
  if (siteData.isQSPage) {
11
11
  sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'templates', 'styles', 'grab-theme-json', 'combine-files', 'grab-images', 'copy-json', 'js-lint', 'html-min', 'css-min', 'js-min', 'img-min', 'extras', 'brand', 'copy-files-to-build-path', 'cache-bust', 'grab-tooltips-json', 'build-stat'];
12
12
  } else {
13
- sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'templates', 'styles', 'combine-files', 'grab-images', 'js-lint', 'html-min', 'css-min', 'js-min', 'img-min', 'extras', 'brand', 'cache-bust', 'grab-tooltips-json', 'build-stat'];
13
+ sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'templates', 'styles', 'combine-files', 'grab-images', 'js-lint', 'html-min','grab-global-images', 'css-min', 'js-min', 'img-min', 'extras', 'brand', 'cache-bust', 'grab-tooltips-json', 'build-stat'];
14
14
  }
15
15
  } else {
16
16
  sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'templates', 'styles', 'js-lint', 'html-min', 'css-min', 'js-min', 'img-min', 'extras', 'brand', 'cache-bust', 'build-stat'];
@@ -0,0 +1,102 @@
1
+ var fs = require('fs');
2
+ var request = require('request');
3
+ var source = require('vinyl-source-stream');
4
+ var replace = require('gulp-replace');
5
+
6
+ var images = [];
7
+
8
+ function streamToDestination(gulp, siteSettings, url, fileName) {
9
+ var finalDestination;
10
+
11
+ if (!fs.existsSync(siteSettings.distFolder)) {
12
+ finalDestination = siteSettings.srcFolder;
13
+ } else {
14
+ finalDestination = siteSettings.distFolder;
15
+ }
16
+
17
+ return new Promise(resolve => { // eslint-disable-line no-undef
18
+ request(url)
19
+ .on('response', resp => {
20
+ if (resp.statusCode !== 200 && resp.statusCode !== 206) {
21
+ throw new Error(`${resp.statusCode} Error while fetching ${fileName}`);
22
+ } else {
23
+ images.push(fileName);
24
+ }
25
+ })
26
+ .pipe(source(fileName))
27
+ .pipe(gulp.dest(`${finalDestination}/resources/images/`))
28
+ .on('finish', resolve);
29
+ });
30
+ }
31
+
32
+ function replaceImagePath(gulp, siteSettings) {
33
+ var finalDestination;
34
+
35
+ if (!fs.existsSync(siteSettings.distFolder)) {
36
+ finalDestination = siteSettings.tmpFolder;
37
+ } else {
38
+ finalDestination = siteSettings.distFolder;
39
+ }
40
+
41
+ var stream = gulp.src(`${finalDestination}/index.html`);
42
+
43
+ if (images.length) {
44
+ images.forEach(function(image) {
45
+ stream = stream.pipe(replace(new RegExp(`"(?:(?!"|")[\\s\\S])+(${image})"`, 'gm'), '"/resources/images/' + image + '"'))
46
+ });
47
+ }
48
+ return stream.pipe(gulp.dest(finalDestination))
49
+ }
50
+
51
+ const getTags = (string) => {
52
+ const regExs = [/<img.*?src="(.*?)"[^\>]+>/g, /<use.*?href="(.*?)".*?>/g, /<source.*?srcset="(.*?)".*?>/g, /url\('#{\$path}.*?'\)/g];
53
+ let tags = [];
54
+
55
+ regExs.forEach((regEx) => {
56
+ const match = string.match(regEx);
57
+
58
+ if (match) {
59
+ tags = [...tags, ...match];
60
+ }
61
+ });
62
+
63
+ return tags;
64
+ };
65
+
66
+ const getUrls = (tags) => {
67
+ const urls = [];
68
+
69
+ tags.forEach((tag) => {
70
+ if (tag) {
71
+ let url = tag;
72
+ url = url.match(/(https?:\/\/[^\s]+)/gim);
73
+ if (url) {
74
+ url = url[0];
75
+ url = url.replace(/"/g, "")
76
+ urls.push(url)
77
+ }
78
+ }
79
+ });
80
+
81
+ return [...new Set(urls)]; // eslint-disable-line no-undef
82
+ };
83
+
84
+ const parseImageSources = (gulp, siteSettings) => {
85
+ const text = fs.readFileSync(`${siteSettings.tmpFolder}/index.html`, 'utf8');
86
+ const textMatches = getTags(text);
87
+ return getUrls(textMatches);
88
+ };
89
+
90
+ module.exports = function(gulp, siteSettings, siteData) {
91
+ return async function() {
92
+ const urls = parseImageSources(gulp, siteSettings);
93
+ const urlsPromises = urls.map(async(url) => {
94
+ const fileName = await url.slice(url.lastIndexOf('/') + 1);
95
+ return await streamToDestination(gulp, siteSettings, url, fileName);
96
+ });
97
+
98
+ return await Promise.all(urlsPromises).then(function() { // eslint-disable-line no-undef
99
+ replaceImagePath(gulp, siteSettings)
100
+ })
101
+ };
102
+ };
@@ -28,13 +28,24 @@ function replaceFootAssetScripts(gulp, gulpPlugins, siteSettings, siteData) {
28
28
  .pipe(replace(/"(?:(?!"|js")[\s\S])+(modutils|mod-utils.*?)js"/, resourcePath + '/mod-utils/' + fileNames.modUtilsFileName))
29
29
  .pipe(replace(/"(?:(?!"|")[\s\S])+(footer\/footer-component.*?)js"/, resourcePath + '/footer/' + fileNames.footerComponentJsFileName))
30
30
  .pipe(replace(/"(?:(?!"|")[\s\S])+(mod-form\/mod-form.*?)js"/, resourcePath + '/mod-form/' + fileNames.modFormFileName))
31
+ .pipe(replace(/"(?:(?!"|")[\s\S])+(mod-form\/form\/mod-form.*?)js"/, resourcePath + '/mod-form/form/' + fileNames.newModFormFileName))
31
32
  .pipe(replace(/"(?:(?!"|")[\s\S])+(qs-form.*?)js"/, resourcePath + '/mod-form/' + fileNames.qsFormFileName))
32
33
  .pipe(gulp.dest(siteSettings.srcFolder + '/shared-components/foot-assets'));
33
34
  }
34
- function replaceAbandonmentJsSrc(gulp, gulpPlugins, siteSettings, siteData) {
35
- const resourcePath = isQuotePageOrUseRelativePath ? 'resources/scripts/abandonment/' : '/resources/scripts/abandonment/';
35
+ function replaceAccessibleFootAssets(gulp, gulpPlugins, siteSettings, siteData) {
36
+ const resourcePath = isQuotePageOrUseRelativePath ? '{{#if this.nodeModulesPath}}{{this.nodeModulesPath}}{{/if}}"resources/scripts' : '"/resources/scripts';
37
+ return gulp.src(siteSettings.srcFolder + '/templates/components/v1/foot-assets.html')
38
+ .pipe(replace(/"(?:(?!"|js")[\s\S])+(modutils|mod-utils.*?)js"/, resourcePath + '/mod-utils/' + fileNames.modUtilsFileName + '"'))
39
+ .pipe(replace(/"(?:(?!"|")[\s\S])+(mod-form\/mod-form.*?)js"/, resourcePath + '/mod-form/accessible/' + fileNames.modFormAccessibleFileName + '"'))
40
+ .pipe(replace(/"(?:(?!"|")[\s\S])+(qs-form.*?)js"/, resourcePath + '/mod-form/accessible/' + fileNames.qsFormAccessibleFileName + '"'))
41
+ .pipe(gulp.dest(siteSettings.srcFolder + '/templates/components/v1'));
42
+ }
43
+ function replaceAbandonmentJsCssSrc(gulp, gulpPlugins, siteSettings, siteData) {
44
+ const jsResourcePath = isQuotePageOrUseRelativePath ? 'resources/scripts/abandonment/' : '/resources/scripts/abandonment/';
45
+ const cssResourcePath = isQuotePageOrUseRelativePath ? 'resources/styles/components/abandonment/' : '/resources/styles/components/abandonment/';
36
46
  return gulp.src(siteSettings.srcFolder + '/templates/abandonment/*.html')
37
- .pipe(replace(/"(?:(?!"|")[\s\S])+(abandonment\/abandonment.*?)js"/, resourcePath + fileNames.abandonmentJsFileName))
47
+ .pipe(replace(/"(?:(?!"|")[\s\S])+(abandonment\/abandonment.*?)js"/, jsResourcePath + fileNames.abandonmentJsFileName))
48
+ .pipe(replace(/"(?:(?!"|")[\s\S])+(components\/abandonment\/abandonment.*?)css"/, cssResourcePath + fileNames.abandonmentStylesFileName))
38
49
  .pipe(gulp.dest(siteSettings.srcFolder + '/templates/abandonment'));
39
50
  }
40
51
  function replaceFooterStylesReference(gulp, gulpPlugins, siteSettings, siteData) {
@@ -50,6 +61,12 @@ function replaceFooterStylesReference(gulp, gulpPlugins, siteSettings, siteData)
50
61
  .pipe(gulp.dest(siteSettings.srcFolder + '/resources/scripts/footer'))
51
62
  }
52
63
  }
64
+ function replaceAccessibleFooterStylesReference(gulp, gulpPlugins, siteSettings, siteData) {
65
+ return gulp.src(siteSettings.srcFolder + '/scripts/components/v1/footer-component.js')
66
+ .pipe(replace(/`(?:(?!`|`)[\s\S])+(components\/footer\/mod.*?)`/, '`/resources/styles/components/footer/' + fileNames.modFooterStylesFileName + '`'))
67
+ .pipe(replace(/`(?:(?!`|`)[\s\S])+(components\/footer\/qs.*?)`/, '`/resources/styles/components/footer/' + fileNames.qsFooterStylesFileName + '`'))
68
+ .pipe(gulp.dest(siteSettings.srcFolder + '/scripts/components/v1'))
69
+ }
53
70
  function replaceFooterStylesReferenceInMap(gulp, gulpPlugins, siteSettings, siteData) {
54
71
  if (siteData.siteData && siteData.siteData.useRelativePathForResources === true) {
55
72
  return gulp.src(siteSettings.srcFolder + '/resources/scripts/footer/footer-component.min.js.map')
@@ -73,18 +90,21 @@ function getResource(url, config = {}, fn, fnArray) {
73
90
 
74
91
  return new Promise(resolve => {
75
92
  const file = getFileFromURL(url);
76
- request(`${resourceURL}/${url}`)
93
+ const doNotAddHash = ['mod-form-beta.min.js']
94
+ let stream = request(`${resourceURL}/${url}`)
77
95
  .on('response', resp => {
78
96
  if (resp.statusCode !== 200) {
79
97
  throw new Error(`${resp.statusCode} Error while fetching ${file}`);
80
98
  }
81
99
  })
82
100
  .pipe(source(`${file}`))
83
- .pipe(hash({
84
- hashLength: 20,
85
- template: file.replace(/^([^.]*)\.(.*)$/, '$1-<%= hash %>.$2')
86
- }))
87
- .pipe(tap(function(file, t) {
101
+ if (!doNotAddHash.includes(file)) {
102
+ stream = stream.pipe(hash({
103
+ hashLength: 20,
104
+ template: file.replace(/^([^.]*)\.(.*)$/, '$1-<%= hash %>.$2')
105
+ }))
106
+ }
107
+ stream.pipe(tap(function(file, t) {
88
108
  fileNames[config.fileName] = path.basename(file.path);
89
109
  }))
90
110
  .pipe(config.gulp.dest(`${config.siteSettings.srcFolder}/resources/${config.dest}`))
@@ -140,6 +160,16 @@ const TASKS = {
140
160
  srcReplaceFn: null,
141
161
  additionalSrcReplaceFns: []
142
162
  },
163
+ copyAbandonmentComponentStyles: {
164
+ url: `shared-resources/styles/components/abandonment/abandonment.min.css`,
165
+ config: {
166
+ fileName: 'abandonmentStylesFileName',
167
+ dest: 'styles/components/abandonment',
168
+ mapUrl: null,
169
+ },
170
+ srcReplaceFn: null,
171
+ additionalSrcReplaceFns: []
172
+ },
143
173
  copyAbandonmentJs: {
144
174
  url: `shared-resources/scripts/abandonment/abandonment.min.js`,
145
175
  config: {
@@ -147,7 +177,7 @@ const TASKS = {
147
177
  dest: 'scripts/abandonment',
148
178
  mapUrl: `shared-resources/scripts/abandonment/abandonment.min.js.map`,
149
179
  },
150
- srcReplaceFn: replaceAbandonmentJsSrc,
180
+ srcReplaceFn: replaceAbandonmentJsCssSrc,
151
181
  additionalSrcReplaceFns: []
152
182
  },
153
183
  copyFooterComponentJs: {
@@ -170,6 +200,16 @@ const TASKS = {
170
200
  srcReplaceFn: null,
171
201
  additionalSrcReplaceFns: []
172
202
  },
203
+ copyNewModForm: {
204
+ url: `mod-form/form/mod-form-beta.min.js`,
205
+ mapUrl: `mod-form/form/mod-form-beta.min.js.map`,
206
+ config: {
207
+ fileName: 'newModFormFileName',
208
+ dest: 'scripts/mod-form/form'
209
+ },
210
+ srcReplaceFn: null,
211
+ additionalSrcReplaceFns: []
212
+ },
173
213
  copyQsForm: {
174
214
  url: `mod-form/qs-form.min.js`,
175
215
  config: {
@@ -180,6 +220,26 @@ const TASKS = {
180
220
  srcReplaceFn: replaceFootAssetScripts,
181
221
  additionalSrcReplaceFns: []
182
222
  },
223
+ copyAccessibleModForm: {
224
+ url: `mod-form/accessible/mod-form.min.js`,
225
+ config: {
226
+ fileName: 'modFormAccessibleFileName',
227
+ dest: 'scripts/mod-form/accessible',
228
+ mapUrl: `mod-form/accessible/mod-form.min.js.map`,
229
+ },
230
+ srcReplaceFn: null,
231
+ additionalSrcReplaceFns: []
232
+ },
233
+ copyAccessibleQsForm: {
234
+ url: `mod-form/accessible/qs-form.min.js`,
235
+ config: {
236
+ fileName: 'qsFormAccessibleFileName',
237
+ dest: 'scripts/mod-form/accessible',
238
+ mapUrl: `mod-form/accessible/qs-form.min.js.map`,
239
+ },
240
+ srcReplaceFn: replaceAccessibleFootAssets,
241
+ additionalSrcReplaceFns: []
242
+ },
183
243
  copyModFooterComponentStyles: {
184
244
  url: `shared-resources/styles/components/footer/mod-footer.min.css`,
185
245
  config: {
@@ -198,7 +258,7 @@ const TASKS = {
198
258
  mapUrl: null,
199
259
  },
200
260
  srcReplaceFn: null,
201
- additionalSrcReplaceFns: [replaceFooterStylesReference, replaceFooterStylesReferenceInMap]
261
+ additionalSrcReplaceFns: [replaceAccessibleFooterStylesReference, replaceFooterStylesReference, replaceFooterStylesReferenceInMap]
202
262
  }
203
263
  };
204
264
  module.exports = function(gulp, gulpPlugins, siteSettings, siteData) {
@@ -8,7 +8,7 @@ module.exports.src = function(gulp, gulpPlugins, siteSettings, siteData) {
8
8
  } else if (siteData.isQSPage) {
9
9
  sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'templates', 'styles', 'grab-theme-json', 'grab-tooltips-json', 'combine-files', 'grab-images', 'js-lint'];
10
10
  } else {
11
- sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'templates', 'styles', 'grab-tooltips-json', 'combine-files', 'grab-images', 'js-lint'];
11
+ sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'templates', 'styles', 'grab-tooltips-json', 'combine-files', 'grab-images','grab-global-images', 'js-lint'];
12
12
  }
13
13
  runSequence(...sequenceOpts, () => {
14
14
  // Run a BrowserSync server
@@ -36,7 +36,13 @@ module.exports.src = function(gulp, gulpPlugins, siteSettings, siteData) {
36
36
  ]).on('change', gulpPlugins.browserSync.reload);
37
37
 
38
38
  // If templates changed, rerun templates task
39
- gulp.watch(siteSettings.srcFolder + '/' + siteSettings.templatesSubfolder + '/**/*.html', ['templates']);
39
+ if (!siteData.useTypescript && !siteData.isQSPage) {
40
+ gulp.watch(siteSettings.srcFolder + '/' + siteSettings.templatesSubfolder + '/**/*.html', function() {
41
+ runSequence('templates','grab-global-images')
42
+ });
43
+ } else {
44
+ gulp.watch(siteSettings.srcFolder + '/' + siteSettings.templatesSubfolder + '/**/*.html', ['templates'])
45
+ }
40
46
 
41
47
  // If styles changed, rerun styles task
42
48
  gulp.watch(siteSettings.srcFolder + '/' + siteSettings.stylesSubfolder + '/**/*.scss', ['styles']);
@@ -346,6 +346,18 @@ module.exports = function() {
346
346
 
347
347
  return require(opts.gulpTasksFolderPath + '/grab-images')(opts.gulp, opts.gulpSettings, opts.siteData);
348
348
  }
349
+ },
350
+
351
+ // Get global images
352
+ 'grab-global-images': {
353
+ subtasks: [],
354
+ func: function(opts) {
355
+ if ('undefined' === typeof opts.gulpTasksFolderPath) {
356
+ opts.gulpTasksFolderPath = '.';
357
+ }
358
+
359
+ return require(opts.gulpTasksFolderPath + '/grab-global-images')(opts.gulp, opts.gulpSettings, opts.siteData);
360
+ }
349
361
  },
350
362
 
351
363
  // Copy json files to dist
@@ -137,18 +137,6 @@ module.exports = function(gulp, gulpPlugins, siteSettings, siteData) {
137
137
  index++;
138
138
  return index;
139
139
  }
140
- },
141
- // Ignore certain keys when using {{#each}} to loop through key:value pairs
142
- {
143
- name: 'ignoreKeys',
144
- fn: function(keysToIgnore, key, options) {
145
- var ignoreKeys = keysToIgnore.split(',');
146
- if (ignoreKeys.indexOf(key) === -1) {
147
- return options.fn(this);
148
- } else {
149
- return options.inverse(this);
150
- }
151
- }
152
140
  }
153
141
  ];
154
142
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mod-build",
3
- "version": "3.6.21--beta.2",
3
+ "version": "3.6.21--a11y.beta.5",
4
4
  "description": "Share components for S3 sites.",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1"