mod-build 3.7.12 → 3.7.14

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.
Files changed (32) hide show
  1. package/CHANGELOG.md +8 -0
  2. package/gulp-tasks/build.js +4 -4
  3. package/gulp-tasks/get-default-trade-questions.js +155 -0
  4. package/gulp-tasks/serve.js +5 -5
  5. package/gulp-tasks/tasks.js +11 -0
  6. package/gulp-tasks/templates.js +6 -6
  7. package/package.json +1 -1
  8. package/src/trade-questions/alerts_medical.js +111 -0
  9. package/src/trade-questions/bathroom_refacing.js +96 -0
  10. package/src/trade-questions/cabinet_refacing.js +251 -0
  11. package/src/trade-questions/cabinets.js +35 -0
  12. package/src/trade-questions/concrete_foundation.js +57 -0
  13. package/src/trade-questions/door.js +143 -0
  14. package/src/trade-questions/flooring.js +185 -0
  15. package/src/trade-questions/garage_door.js +89 -0
  16. package/src/trade-questions/gutters.js +45 -0
  17. package/src/trade-questions/home_security.js +130 -0
  18. package/src/trade-questions/home_warranty.js +57 -0
  19. package/src/trade-questions/hot_tubs.js +92 -0
  20. package/src/trade-questions/hvac.js +179 -0
  21. package/src/trade-questions/index.js +26 -0
  22. package/src/trade-questions/insulation.js +118 -0
  23. package/src/trade-questions/plumbing.js +260 -0
  24. package/src/trade-questions/roofing.js +118 -0
  25. package/src/trade-questions/siding.js +147 -0
  26. package/src/trade-questions/solar.js +69 -0
  27. package/src/trade-questions/stair_lifts.js +47 -0
  28. package/src/trade-questions/tree_services.js +161 -0
  29. package/src/trade-questions/walk_in_tubs.js +47 -0
  30. package/src/trade-questions/water_treatment.js +46 -0
  31. package/src/trade-questions/windows.js +132 -0
  32. package/src/trade-questions-config.js +139 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # Changelog
2
2
 
3
+ ## 3.7.14
4
+
5
+ - Added trade steps configs.
6
+
7
+ ## 3.7.13
8
+
9
+ - An enhancement has been added to the `getConsentCaptureLanguage()` function to replace the subdirectory path throughout the response object.
10
+
3
11
  ## 3.7.12
4
12
 
5
13
  - Added the E-Sign Consent modal to be grabbed as part of the `grab-cdn` task.
@@ -5,15 +5,15 @@ module.exports = function(gulp, gulpPlugins, siteSettings, siteData) {
5
5
  var sequenceOpts;
6
6
 
7
7
  if (siteData.useTypescript) {
8
- sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'grab-form-helpers', 'templates', 'styles', 'compile-prod', 'js-lint', 'html-min', 'css-min', 'js-min', 'img-min', 'extras', 'cache-bust', 'add-path-subdirectories', 'copy-resources-to-dist', 'build-stat'];
8
+ sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'get-default-trade-questions', 'grab-form-helpers', 'templates', 'styles', 'compile-prod', 'js-lint', 'html-min', 'css-min', 'js-min', 'img-min', 'extras', 'cache-bust', 'add-path-subdirectories', 'copy-resources-to-dist', 'build-stat'];
9
9
  } else if (siteData.isWhiteLabel) {
10
10
  if (siteData.isQSPage) {
11
- sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'grab-form-helpers', 'templates', 'styles', 'copy-videos', 'grab-theme-json', 'combine-files', 'grab-images', 'copy-json', 'js-lint', 'html-min', 'css-min', 'js-min', 'img-min', 'extras', 'copy-files-to-build-path', 'cache-bust', 'add-path-subdirectories', 'grab-tooltips-json', 'copy-resources-to-dist', 'build-stat'];
11
+ sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'get-default-trade-questions', 'grab-form-helpers', 'templates', 'styles', 'copy-videos', 'grab-theme-json', 'combine-files', 'grab-images', 'copy-json', 'js-lint', 'html-min', 'css-min', 'js-min', 'img-min', 'extras', 'copy-files-to-build-path', 'cache-bust', 'add-path-subdirectories', 'grab-tooltips-json', 'copy-resources-to-dist', 'build-stat'];
12
12
  } else {
13
- sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'grab-form-helpers', 'templates', 'styles', 'copy-videos', 'combine-files', 'grab-images', 'js-lint', 'html-min','grab-global-images', 'css-min', 'js-min', 'img-min', 'extras', 'cache-bust', 'add-path-subdirectories', 'grab-tooltips-json', 'copy-resources-to-dist', 'build-stat'];
13
+ sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'get-default-trade-questions', 'grab-form-helpers', 'templates', 'styles', 'copy-videos', 'combine-files', 'grab-images', 'js-lint', 'html-min', 'grab-global-images', 'css-min', 'js-min', 'img-min', 'extras', 'cache-bust', 'add-path-subdirectories', 'grab-tooltips-json', 'copy-resources-to-dist', 'build-stat'];
14
14
  }
15
15
  } else {
16
- sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'grab-form-helpers', 'templates', 'styles', 'copy-videos', 'js-lint', 'html-min', 'css-min', 'js-min', 'img-min', 'extras', 'cache-bust', 'add-path-subdirectories', 'copy-resources-to-dist', 'build-stat'];
16
+ sequenceOpts = ['clean', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'get-default-trade-questions', 'grab-form-helpers', 'templates', 'styles', 'copy-videos', 'js-lint', 'html-min', 'css-min', 'js-min', 'img-min', 'extras', 'cache-bust', 'add-path-subdirectories', 'copy-resources-to-dist', 'build-stat'];
17
17
  }
18
18
 
19
19
  if (siteData.copyLocalFontFile) {
@@ -0,0 +1,155 @@
1
+ /* globals Promise */
2
+ var merge = require('lodash.merge');
3
+ var tradeQuestionsConfig = require('../src/trade-questions-config.js');
4
+
5
+ module.exports = function(gulp, gulpPlugins, siteSettings, siteData) {
6
+ console.log(siteData);
7
+ if (siteData.useStepsConfig) {
8
+ return async function() {
9
+ return await new Promise((resolve) => {
10
+ const trade = siteData.primary_trade.toLowerCase();
11
+ const steps = tradeQuestionsConfig.tradeQuestions[trade];
12
+
13
+ steps.OwnHome = tradeQuestionsConfig.OwnHome;
14
+ steps.BuyTimeframe = tradeQuestionsConfig.BuyTimeframe;
15
+
16
+ siteData.steps.items.forEach((item) => {
17
+ const stepName = item.attributes.data['step-name'];
18
+ if (steps[stepName]) {
19
+ if (!item.stepContent) {
20
+ item.stepContent = {};
21
+ }
22
+
23
+ if (!item.stepContent.fields) {
24
+ item.stepContent.fields = [];
25
+ }
26
+ const defaultStepFields = steps[stepName].fields;
27
+ let defaultStepOptions = [];
28
+ let defaultQuestionLegend = {};
29
+ defaultStepFields.forEach((defaultField) => {
30
+ defaultStepOptions = defaultField.options;
31
+ defaultQuestionLegend = defaultField.legend;
32
+ });
33
+
34
+ item.stepContent.fields.forEach((field) => {
35
+ if (field.legend) {
36
+ field.legend = merge(defaultQuestionLegend, field.legend);
37
+ } else {
38
+ field.legend = defaultQuestionLegend;
39
+ }
40
+
41
+ if (field && field.remove) {
42
+ if (field.remove.includes('all')) {
43
+ defaultStepOptions = [];
44
+ } else {
45
+ defaultStepOptions = defaultStepOptions.filter((_, i) => !field.remove.includes(i));
46
+ }
47
+ }
48
+
49
+ if (field.fieldType === 'radio') {
50
+ if (!field.errorMessage) {
51
+ field.errorMessage = 'Please select one option';
52
+ }
53
+
54
+ if (field.options && Array.isArray(field.options) && field.options.length) {
55
+ field.options.forEach((option) => {
56
+ if (typeof option.update === 'number') {
57
+ merge(defaultStepOptions[option.update], option);
58
+ } else {
59
+ if (typeof option.insertAt === 'number') {
60
+ defaultStepOptions.splice(option.insertAt, 0, option);
61
+ } else {
62
+ defaultStepOptions.push(option);
63
+ }
64
+ }
65
+ });
66
+ }
67
+ field.options = defaultStepOptions;
68
+ } else {
69
+ if (field && Array.isArray(field) && field.length) {
70
+ if (typeof field.update === 'number') {
71
+ merge(defaultStepFields[field.update], field);
72
+ } else {
73
+ if (typeof field.insertAt === 'number') {
74
+ defaultStepFields.splice(field.insertAt, 0, field);
75
+ } else {
76
+ defaultStepFields.push(field);
77
+ }
78
+ }
79
+ }
80
+
81
+ field = defaultStepFields;
82
+ }
83
+ });
84
+
85
+ // extra question block
86
+ if (item.stepContent.extraQuestionBlock) {
87
+ if (!item.stepContent.extraQuestionBlock.fields) {
88
+ item.stepContent.extraQuestionBlock.fields = [];
89
+ }
90
+
91
+ const defaultExtraQuestionFields = steps[stepName].extraQuestionBlock.fields;
92
+ let defaultExtraQuestionOptions = [];
93
+ let defaultExtraQuestionLegend = {};
94
+ defaultExtraQuestionFields.forEach((defaultExtraQuestionField) => {
95
+ defaultExtraQuestionOptions = defaultExtraQuestionField.options;
96
+ defaultExtraQuestionLegend = defaultExtraQuestionField.legend;
97
+ });
98
+ item.stepContent.extraQuestionBlock.fields.forEach((field) => {
99
+
100
+ if (field.legend) {
101
+ field.legend = merge(defaultExtraQuestionLegend, field.legend);
102
+ } else {
103
+ field.legend = defaultExtraQuestionLegend;
104
+ }
105
+
106
+ if (field && field.remove) {
107
+ if (field.remove.includes('all')) {
108
+ defaultExtraQuestionOptions = [];
109
+ } else {
110
+ defaultExtraQuestionOptions = defaultExtraQuestionOptions.filter((_, i) => !field.remove.includes(i));
111
+ }
112
+ }
113
+
114
+ if (field.fieldType === 'radio') {
115
+ if (!field.errorMessage) {
116
+ field.errorMessage = 'Please select one option';
117
+ }
118
+
119
+ if (field.options && Array.isArray(field.options) && field.options.length) {
120
+ field.options.forEach((option) => {
121
+ if (typeof option.update === 'number') {
122
+ merge(defaultExtraQuestionOptions[option.update], option);
123
+ } else {
124
+ if (typeof option.insertAt === 'number') {
125
+ defaultExtraQuestionOptions.splice(option.insertAt, 0, option);
126
+ } else {
127
+ defaultExtraQuestionOptions.push(option);
128
+ }
129
+ }
130
+ });
131
+ }
132
+ field.options = defaultExtraQuestionOptions;
133
+ } else {
134
+ if (field && Array.isArray(field) && field.length) {
135
+ if (typeof field.update === 'number') {
136
+ merge(defaultExtraQuestionFields[field.update], field);
137
+ } else {
138
+ if (typeof field.insertAt === 'number') {
139
+ defaultExtraQuestionFields.splice(field.insertAt, 0, field);
140
+ } else {
141
+ defaultExtraQuestionFields.push(field);
142
+ }
143
+ }
144
+ }
145
+ field = defaultExtraQuestionFields;
146
+ }
147
+ });
148
+ }
149
+ }
150
+ });
151
+ resolve();
152
+ });
153
+ };
154
+ }
155
+ };
@@ -4,11 +4,11 @@ module.exports.src = function(gulp, gulpPlugins, siteSettings, siteData) {
4
4
  var runSequence = require('run-sequence');
5
5
  var sequenceOpts;
6
6
  if (siteData.useTypescript) {
7
- sequenceOpts = ['clean', 'add-editorconfig', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'grab-form-helpers', 'templates', 'styles', 'compile', 'grab-tooltips-json', 'combine-files', 'grab-images', 'js-lint'];
7
+ sequenceOpts = ['clean', 'add-editorconfig', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'get-default-trade-questions', 'grab-form-helpers', 'templates', 'styles', 'compile', 'grab-tooltips-json', 'combine-files', 'grab-images', 'js-lint'];
8
8
  } else if (siteData.isQSPage) {
9
- sequenceOpts = ['clean', 'add-editorconfig', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'grab-form-helpers', 'templates', 'styles', 'grab-theme-json', 'grab-tooltips-json', 'combine-files', 'grab-images', 'js-lint'];
9
+ sequenceOpts = ['clean', 'add-editorconfig', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'get-default-trade-questions', 'grab-form-helpers', 'templates', 'styles', 'grab-theme-json', 'grab-tooltips-json', 'combine-files', 'grab-images', 'js-lint'];
10
10
  } else {
11
- sequenceOpts = ['clean', 'add-editorconfig', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'grab-form-helpers', 'templates', 'styles', 'grab-tooltips-json', 'combine-files', 'grab-images','grab-global-images', 'js-lint'];
11
+ sequenceOpts = ['clean', 'add-editorconfig', 'grab-cdn', 'grab-shared-components', 'grab-shared-scripts', 'get-default-trade-questions', 'grab-form-helpers', '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
@@ -38,10 +38,10 @@ module.exports.src = function(gulp, gulpPlugins, siteSettings, siteData) {
38
38
  // If templates changed, rerun templates task
39
39
  if (!siteData.useTypescript && !siteData.isQSPage) {
40
40
  gulp.watch(siteSettings.srcFolder + '/' + siteSettings.templatesSubfolder + '/**/*.html', function() {
41
- runSequence('templates','grab-global-images')
41
+ runSequence('templates', 'grab-global-images');
42
42
  });
43
43
  } else {
44
- gulp.watch(siteSettings.srcFolder + '/' + siteSettings.templatesSubfolder + '/**/*.html', ['templates'])
44
+ gulp.watch(siteSettings.srcFolder + '/' + siteSettings.templatesSubfolder + '/**/*.html', ['templates']);
45
45
  }
46
46
 
47
47
  // If styles changed, rerun styles task
@@ -510,6 +510,17 @@ module.exports = function() {
510
510
 
511
511
  return require('./grab-mhsadmin-data')(opts.gulp, opts.gulpPlugins, opts.gulpSettings, opts.siteData);
512
512
  }
513
+ },
514
+
515
+ 'get-default-trade-questions': {
516
+ subtasks: [],
517
+ func: function(opts) {
518
+ if ('undefined' === typeof opts.gulpTasksFolderPath) {
519
+ opts.gulpTasksFolderPath = '.';
520
+ }
521
+
522
+ return require('./get-default-trade-questions')(opts.gulp, opts.gulpPlugins, opts.gulpSettings, opts.siteData);
523
+ }
513
524
  }
514
525
  };
515
526
 
@@ -8,7 +8,7 @@ module.exports = function(gulp, gulpPlugins, siteSettings, siteData) {
8
8
  const { isLocal, nodeEnv, buildPath } = siteSettings;
9
9
  const { isWhiteLabel } = siteData;
10
10
  const isPathSubdirectory = siteData.siteData && siteData.siteData.pathSubdirectory || siteData && siteData.pathSubdirectory;
11
- pathSubdirectory = !isLocal && isPathSubdirectory ? isPathSubdirectory : '';
11
+ const pathSubdirectory = !isLocal && isPathSubdirectory ? isPathSubdirectory : '';
12
12
 
13
13
  var commonData = require('../src/data/common.js');
14
14
 
@@ -85,7 +85,7 @@ module.exports = function(gulp, gulpPlugins, siteSettings, siteData) {
85
85
  console.warn(
86
86
  '• Expression: {{x \'' + expression + '\'}}\n'
87
87
  + '• JS-Error: ', e, '\n'
88
- + '• Context: ',
88
+ + '• Context: ',
89
89
  context
90
90
  );
91
91
  }
@@ -294,7 +294,7 @@ module.exports = function(gulp, gulpPlugins, siteSettings, siteData) {
294
294
  encoding: 'latin1'
295
295
  };
296
296
  console.time('Finished fetch-tcpa-from-sitegenie after');
297
- console.log('Starting fetch-tcpa-from-sitegenie: ',url);
297
+ console.log('Starting fetch-tcpa-from-sitegenie: ', url);
298
298
  await new Promise(function(resolve) {
299
299
  request(reqConfig, async function(_err, xhr, response) {
300
300
  if (xhr.statusCode !== 200) {
@@ -342,10 +342,10 @@ module.exports = function(gulp, gulpPlugins, siteSettings, siteData) {
342
342
 
343
343
  let brandedDisplayName = '';
344
344
  const responseJson = JSON.parse(tcpaResponse),
345
- service = templatesData.service ? templatesData.service.toLowerCase().replace('_', ' ') : templatesData.primary_trade.toLowerCase().replace('_', ' '),
346
- consentCaptureObject = responseJson;
345
+ service = templatesData.service ? templatesData.service.toLowerCase().replace('_', ' ') : templatesData.primary_trade.toLowerCase().replace('_', ' ');
346
+ let consentCaptureObject = responseJson;
347
347
 
348
- consentCaptureObject.consentCapturePrivacyAndTerms = consentCaptureObject.consentCapturePrivacyAndTerms.replace(/\/resources/g, `${pathSubdirectory ? pathSubdirectory : '/'}resources`);
348
+ consentCaptureObject = JSON.parse(JSON.stringify(consentCaptureObject).replace(/\/resources/g, `${pathSubdirectory ? pathSubdirectory : '/'}resources`));
349
349
 
350
350
  const brandedSiteIdentifiers = `https://${siteSettings.nodeEnv}/quote/resources/mod-site/data/branded-site-identifiers.json`;
351
351
  const { xhr: brandedXhr, response: brandedResponse } = await requestPromise(brandedSiteIdentifiers);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mod-build",
3
- "version": "3.7.12",
3
+ "version": "3.7.14",
4
4
  "description": "Share components for S3 sites.",
5
5
  "scripts": {
6
6
  "test": "echo \"Error: no test specified\" && exit 1",
@@ -0,0 +1,111 @@
1
+ /* eslint-disable */
2
+ const alerts_medical = {
3
+ WhoseMedicalAlert: {
4
+ fields: [
5
+ {
6
+ legend: {
7
+ text: 'Who is the medical alert for?'
8
+ },
9
+ options: [
10
+ {
11
+ text: 'Myself',
12
+ attributes: {
13
+ name: 'WhoseMedicalAlert',
14
+ value: 'Myself',
15
+ checked: '',
16
+ data: {
17
+ required: 'nonempty'
18
+ }
19
+ }
20
+ },
21
+ {
22
+ text: 'Somebody Else',
23
+ attributes: {
24
+ name: 'WhoseMedicalAlert',
25
+ value: 'SomebodyElse',
26
+ data: {
27
+ required: 'nonempty'
28
+ }
29
+ }
30
+ }
31
+ ]
32
+ }
33
+ ]
34
+ },
35
+ MedicalAlertProtectionAt: {
36
+ fields: [
37
+ {
38
+ legend: {
39
+ text: 'Are you looking for protection at home or on the go?'
40
+ },
41
+ options: [
42
+ {
43
+ text: 'At Home',
44
+ attributes: {
45
+ name: 'MedicalAlertProtectionAt',
46
+ value: 'Home',
47
+ checked: '',
48
+ data: {
49
+ required: 'nonempty'
50
+ }
51
+ }
52
+ },
53
+ {
54
+ text: 'On the Go',
55
+ attributes: {
56
+ name: 'MedicalAlertProtectionAt',
57
+ value: 'OnTheGo',
58
+ data: {
59
+ required: 'nonempty'
60
+ }
61
+ }
62
+ },
63
+ {
64
+ text: 'Both',
65
+ attributes: {
66
+ name: 'MedicalAlertProtectionAt',
67
+ value: 'Both',
68
+ data: {
69
+ required: 'nonempty'
70
+ }
71
+ }
72
+ }
73
+ ]
74
+ }
75
+ ]
76
+ },
77
+ HasLandlineAtHome: {
78
+ fields: [
79
+ {
80
+ legend: {
81
+ text: 'Do you have a landline telephone at home?',
82
+ },
83
+ options: [
84
+ {
85
+ text: 'Yes',
86
+ attributes: {
87
+ name: 'HasLandlineAtHome',
88
+ value: 'Yes',
89
+ checked: '',
90
+ data: {
91
+ required: 'nonempty'
92
+ }
93
+ }
94
+ },
95
+ {
96
+ text: 'No',
97
+ attributes: {
98
+ name: 'HasLandlineAtHome',
99
+ value: 'No',
100
+ data: {
101
+ required: 'nonempty'
102
+ }
103
+ }
104
+ }
105
+ ]
106
+ }
107
+ ]
108
+ }
109
+ };
110
+
111
+ module.exports = alerts_medical;
@@ -0,0 +1,96 @@
1
+ /* eslint-disable */
2
+ const bathroom_refacing = {
3
+ BathProjectScope: {
4
+ fields: [
5
+ {
6
+ legend: {
7
+ text: 'Which of these best describe your needs?'
8
+ },
9
+ options: [
10
+ {
11
+ attributes: {
12
+ name: 'BathProjectScope',
13
+ value: 'Shower Conversion',
14
+ data: {
15
+ required: 'nonempty'
16
+ }
17
+ },
18
+ text: 'Bathtub to Shower Conversion'
19
+ },
20
+ {
21
+ attributes: {
22
+ name: 'BathProjectScope',
23
+ value: 'Bathtub / Shower Updates',
24
+ data: {
25
+ required: 'nonempty'
26
+ }
27
+ },
28
+ text: 'Bathtub/Shower Updates'
29
+ },
30
+ {
31
+ attributes: {
32
+ name: 'BathProjectScope',
33
+ value: 'Bathtub Liner / Shower Enclosure',
34
+ data: {
35
+ required: 'nonempty'
36
+ }
37
+ },
38
+ text: 'Bathtub Liner/Shower Enclosure'
39
+ },
40
+ {
41
+ attributes: {
42
+ name: 'BathProjectScope',
43
+ value: 'Walk-in Shower',
44
+ data: {
45
+ required: 'nonempty'
46
+ }
47
+ },
48
+ text: 'Walk-in Shower'
49
+ },
50
+ {
51
+ attributes: {
52
+ name: 'BathProjectScope',
53
+ value: 'Bathroom Remodel',
54
+ data: {
55
+ required: 'nonempty'
56
+ }
57
+ },
58
+ text: 'Complete Bathroom Remodel'
59
+ }
60
+ ]
61
+ }
62
+ ]
63
+ },
64
+ OptIn1: {
65
+ fields: [
66
+ {
67
+ legend: {
68
+ text: 'Will you need to add or remove walls?'
69
+ },
70
+ options: [
71
+ {
72
+ attributes: {
73
+ name: 'OptIn1',
74
+ value: 'Yes',
75
+ data: {
76
+ required: 'nonempty'
77
+ }
78
+ },
79
+ text: 'Yes'
80
+ },
81
+ {
82
+ attributes: {
83
+ name: 'OptIn1',
84
+ value: 'No',
85
+ data: {
86
+ required: 'nonempty'
87
+ }
88
+ },
89
+ text: 'No'
90
+ }
91
+ ]
92
+ }
93
+ ]
94
+ }
95
+ };
96
+ module.exports = bathroom_refacing;