browser-extension-manager 1.0.13 → 1.1.0
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 +43 -0
- package/CLAUDE.md +672 -0
- package/TODO.md +3 -0
- package/dist/assets/css/browser-extension-manager.scss +18 -0
- package/dist/assets/css/components/content/index.scss +5 -0
- package/dist/assets/css/components/options/index.scss +5 -0
- package/dist/assets/css/components/pages/index.scss +5 -0
- package/dist/assets/css/components/popup/index.scss +5 -0
- package/dist/assets/css/core/_animations.scss +64 -0
- package/dist/assets/css/core/_initialize.scss +23 -0
- package/dist/assets/css/core/_utilities.scss +80 -0
- package/dist/assets/themes/_template/_theme.js +5 -0
- package/dist/assets/themes/_template/_theme.scss +5 -0
- package/dist/assets/themes/bootstrap/_theme.js +16 -0
- package/dist/assets/themes/bootstrap/_theme.scss +232 -0
- package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
- package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
- package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
- package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
- package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
- package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
- package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
- package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
- package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
- package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
- package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
- package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
- package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
- package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
- package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
- package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
- package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
- package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
- package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
- package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
- package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
- package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
- package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
- package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
- package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
- package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
- package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
- package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
- package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
- package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
- package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
- package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
- package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
- package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
- package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
- package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
- package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
- package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
- package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
- package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
- package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
- package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
- package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
- package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
- package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
- package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
- package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
- package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
- package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
- package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
- package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
- package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
- package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
- package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
- package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
- package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
- package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
- package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
- package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
- package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
- package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
- package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
- package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
- package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
- package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
- package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
- package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
- package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
- package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
- package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
- package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
- package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
- package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
- package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
- package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
- package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
- package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
- package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
- package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
- package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
- package/dist/assets/themes/classy/README.md +75 -0
- package/dist/assets/themes/classy/_config.scss +185 -0
- package/dist/assets/themes/classy/_theme.js +29 -0
- package/dist/assets/themes/classy/_theme.scss +34 -0
- package/dist/assets/themes/classy/css/base/_animations.scss +27 -0
- package/dist/assets/themes/classy/css/base/_backgrounds.scss +191 -0
- package/dist/assets/themes/classy/css/base/_borders.scss +65 -0
- package/dist/assets/themes/classy/css/base/_root.scss +58 -0
- package/dist/assets/themes/classy/css/base/_soft-colors.scss +92 -0
- package/dist/assets/themes/classy/css/base/_spacing.scss +64 -0
- package/dist/assets/themes/classy/css/base/_typography.scss +179 -0
- package/dist/assets/themes/classy/css/base/_utilities.scss +77 -0
- package/dist/assets/themes/classy/css/components/_accordion.scss +33 -0
- package/dist/assets/themes/classy/css/components/_avatars.scss +32 -0
- package/dist/assets/themes/classy/css/components/_badges.scss +25 -0
- package/dist/assets/themes/classy/css/components/_buttons.scss +397 -0
- package/dist/assets/themes/classy/css/components/_cards.scss +33 -0
- package/dist/assets/themes/classy/css/components/_carousel.scss +41 -0
- package/dist/assets/themes/classy/css/components/_forms.scss +115 -0
- package/dist/assets/themes/classy/css/components/_links.scss +19 -0
- package/dist/assets/themes/classy/css/components/_logo-scroll.scss +57 -0
- package/dist/assets/themes/classy/css/components/_spinners.scss +19 -0
- package/dist/assets/themes/classy/css/components/_text.scss +41 -0
- package/dist/assets/themes/classy/css/layout/_blog.scss +42 -0
- package/dist/assets/themes/classy/css/layout/_general.scss +139 -0
- package/dist/assets/themes/classy/css/layout/_navigation.scss +576 -0
- package/dist/assets/themes/classy/css/layout/_team.scss +18 -0
- package/dist/assets/themes/classy/js/logo-scroll.js +83 -0
- package/dist/assets/themes/classy/js/navbar-scroll.js +65 -0
- package/dist/background.js +236 -260
- package/dist/build.js +93 -4
- package/dist/commands/setup.js +0 -268
- package/dist/config/manifest.json +11 -3
- package/dist/config/page-template.html +21 -0
- package/dist/defaults/.nvmrc +1 -1
- package/dist/defaults/CLAUDE.md +8 -0
- package/dist/defaults/config/browser-extension-manager.json +37 -0
- package/dist/defaults/src/assets/css/components/content/index.scss +11 -0
- package/dist/defaults/src/assets/css/components/options/index.scss +14 -0
- package/dist/defaults/src/assets/css/components/pages/index.scss +10 -0
- package/dist/defaults/src/assets/css/components/popup/index.scss +10 -0
- package/dist/defaults/src/assets/css/components/sidepanel/index.scss +6 -0
- package/dist/defaults/src/assets/css/main.scss +32 -0
- package/dist/defaults/src/assets/js/components/background/index.js +22 -0
- package/dist/defaults/src/assets/js/components/content/index.js +22 -0
- package/dist/defaults/src/assets/js/components/options/index.js +22 -0
- package/dist/defaults/src/assets/js/components/pages/index.js +22 -0
- package/dist/defaults/src/assets/js/components/popup/index.js +22 -0
- package/dist/defaults/src/assets/js/components/sidepanel/index.js +20 -0
- package/dist/defaults/src/assets/vendor/.gitkeep +0 -0
- package/dist/defaults/src/manifest.json +11 -6
- package/dist/defaults/src/views/options/index.html +8 -0
- package/dist/defaults/src/views/pages/index.html +10 -0
- package/dist/defaults/src/views/popup/index.html +4 -0
- package/dist/defaults/src/views/sidepanel/index.html +4 -0
- package/dist/gulp/main.js +11 -5
- package/dist/gulp/plugins/webpack/strip-dev-blocks.js +53 -0
- package/dist/gulp/tasks/{_package.js → BU/_package.js} +1 -1
- package/dist/gulp/tasks/{developmentRebuild.js → BU/developmentRebuild.js} +1 -1
- package/dist/gulp/tasks/{themes.js → BU/themes.js} +3 -2
- package/dist/gulp/tasks/{test.js → _.js} +3 -3
- package/dist/gulp/tasks/audit.js +154 -0
- package/dist/gulp/tasks/defaults.js +308 -0
- package/dist/gulp/tasks/distribute.js +87 -92
- package/dist/gulp/tasks/html.js +150 -0
- package/dist/gulp/tasks/icons.js +3 -2
- package/dist/gulp/tasks/package.js +216 -27
- package/dist/gulp/tasks/sass.js +188 -43
- package/dist/gulp/tasks/serve.js +1 -0
- package/dist/gulp/tasks/utils/template-transform.js +50 -0
- package/dist/gulp/tasks/webpack.js +338 -134
- package/dist/index.js +34 -34
- package/dist/options.js +40 -0
- package/dist/page.js +40 -0
- package/dist/popup.js +40 -0
- package/dist/sidepanel.js +40 -0
- package/firebase-debug.log +322 -0
- package/package.json +25 -18
- package/dist/assets/css/main.scss +0 -3
- package/dist/assets/themes/bootstrap/5.3.3/css/bootstrap.css +0 -12057
- package/dist/assets/themes/bootstrap/5.3.3/css/bootstrap.css.map +0 -1
- package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.bundle.js +0 -6314
- package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.bundle.js.map +0 -1
- package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.js +0 -4494
- package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.js.map +0 -1
- package/dist/defaults/src/assets/css/content.scss +0 -2
- package/dist/defaults/src/assets/css/options.scss +0 -11
- package/dist/defaults/src/assets/css/popup.scss +0 -14
- package/dist/defaults/src/assets/js/background.js +0 -18
- package/dist/defaults/src/assets/js/content.js +0 -15
- package/dist/defaults/src/assets/js/options.js +0 -17
- package/dist/defaults/src/assets/js/popup.js +0 -17
- package/dist/defaults/src/pages/options.html +0 -26
- package/dist/defaults/src/pages/popup.html +0 -26
- /package/dist/{defaults/src/assets/images/_ → assets/css/bundles/.gitkeep} +0 -0
- /package/dist/assets/css/{fontawesome.scss → core/_fontawesome.scss} +0 -0
- /package/dist/defaults/src/assets/{vendor/_ → images/.gitkeep} +0 -0
- /package/dist/gulp/tasks/{_importer.js → BU/_importer.js} +0 -0
- /package/dist/gulp/tasks/{_vendor.js → BU/_vendor.js} +0 -0
|
@@ -0,0 +1,308 @@
|
|
|
1
|
+
// Libraries
|
|
2
|
+
const Manager = new (require('../../build.js'));
|
|
3
|
+
const logger = Manager.logger('defaults');
|
|
4
|
+
const { src, dest, watch, series } = require('gulp');
|
|
5
|
+
const through2 = require('through2');
|
|
6
|
+
const jetpack = require('fs-jetpack');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { minimatch } = require('minimatch');
|
|
9
|
+
const { template } = require('node-powertools');
|
|
10
|
+
const createTemplateTransform = require('./utils/template-transform');
|
|
11
|
+
const argv = require('yargs').argv;
|
|
12
|
+
const JSON5 = require('json5');
|
|
13
|
+
|
|
14
|
+
// Load package
|
|
15
|
+
const package = Manager.getPackage('main');
|
|
16
|
+
const project = Manager.getPackage('project');
|
|
17
|
+
const config = Manager.getConfig('project');
|
|
18
|
+
const rootPathPackage = Manager.getRootPath('main');
|
|
19
|
+
const rootPathProject = Manager.getRootPath('project');
|
|
20
|
+
|
|
21
|
+
// Get clean versions
|
|
22
|
+
// const cleanVersions = { versions: Manager.getCleanVersions()};
|
|
23
|
+
const cleanVersions = { versions: package.engines };
|
|
24
|
+
|
|
25
|
+
// File MAP
|
|
26
|
+
const FILE_MAP = {
|
|
27
|
+
// Files to skip overwrite
|
|
28
|
+
'**/*.md': {
|
|
29
|
+
overwrite: false,
|
|
30
|
+
},
|
|
31
|
+
'hooks/**/*': {
|
|
32
|
+
overwrite: false,
|
|
33
|
+
},
|
|
34
|
+
'src/**/*': {
|
|
35
|
+
overwrite: false,
|
|
36
|
+
},
|
|
37
|
+
'src/**/*.{html,md}': {
|
|
38
|
+
skip: (file) => {
|
|
39
|
+
// Get the name
|
|
40
|
+
const name = path.basename(file.name, path.extname(file.name));
|
|
41
|
+
const htmlFilePath = path.join(file.destination, `${name}.html`);
|
|
42
|
+
const mdFilePath = path.join(file.destination, `${name}.md`);
|
|
43
|
+
const htmlFileExists = jetpack.exists(htmlFilePath);
|
|
44
|
+
const mdFileExists = jetpack.exists(mdFilePath);
|
|
45
|
+
const eitherExists = htmlFileExists || mdFileExists;
|
|
46
|
+
|
|
47
|
+
// Skip if both files exist
|
|
48
|
+
return eitherExists;
|
|
49
|
+
},
|
|
50
|
+
},
|
|
51
|
+
|
|
52
|
+
// Files to rewrite path
|
|
53
|
+
// Removed because getting too confusing
|
|
54
|
+
// 'dist/pages/**/*': {
|
|
55
|
+
// path: (file) => file.source.replace('dist/pages', 'dist'),
|
|
56
|
+
// },
|
|
57
|
+
'_.gitignore': {
|
|
58
|
+
name: (file) => file.name.replace('_.gitignore', '.gitignore'),
|
|
59
|
+
},
|
|
60
|
+
|
|
61
|
+
// Config file with smart merging
|
|
62
|
+
'config/browser-extension-manager.json': {
|
|
63
|
+
overwrite: true,
|
|
64
|
+
merge: true,
|
|
65
|
+
},
|
|
66
|
+
|
|
67
|
+
// Files to run templating on
|
|
68
|
+
'.nvmrc': {
|
|
69
|
+
template: cleanVersions,
|
|
70
|
+
},
|
|
71
|
+
|
|
72
|
+
// Files to skip
|
|
73
|
+
'**/.DS_Store': {
|
|
74
|
+
skip: true,
|
|
75
|
+
},
|
|
76
|
+
'**/__temp/**/*': {
|
|
77
|
+
skip: true,
|
|
78
|
+
},
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
// Glob
|
|
82
|
+
const input = [
|
|
83
|
+
// Files to include
|
|
84
|
+
`${rootPathPackage}/dist/defaults/**/*`,
|
|
85
|
+
];
|
|
86
|
+
const output = './';
|
|
87
|
+
const delay = 250;
|
|
88
|
+
|
|
89
|
+
// Index
|
|
90
|
+
let index = -1;
|
|
91
|
+
|
|
92
|
+
// Helper function to merge configs intelligently
|
|
93
|
+
function mergeConfigs(existingConfig, newConfig) {
|
|
94
|
+
const merged = { ...newConfig };
|
|
95
|
+
|
|
96
|
+
// Recursively merge nested objects
|
|
97
|
+
function mergeNested(target, source, newDefaults) {
|
|
98
|
+
for (const key in newDefaults) {
|
|
99
|
+
if (Object.prototype.hasOwnProperty.call(newDefaults, key)) {
|
|
100
|
+
const newValue = newDefaults[key];
|
|
101
|
+
const existingValue = source[key];
|
|
102
|
+
|
|
103
|
+
if (typeof newValue === 'object' && newValue !== null && !Array.isArray(newValue)) {
|
|
104
|
+
// Handle nested objects
|
|
105
|
+
target[key] = target[key] || {};
|
|
106
|
+
mergeNested(target[key], existingValue || {}, newValue);
|
|
107
|
+
} else if (Object.prototype.hasOwnProperty.call(source, key) && existingValue !== 'default') {
|
|
108
|
+
// User has a custom value, keep it
|
|
109
|
+
target[key] = existingValue;
|
|
110
|
+
} else {
|
|
111
|
+
// User doesn't have this option or has 'default', use new default
|
|
112
|
+
target[key] = newValue;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
mergeNested(merged, existingConfig, newConfig);
|
|
119
|
+
|
|
120
|
+
return merged;
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Main task
|
|
124
|
+
function defaults(complete, changedFile) {
|
|
125
|
+
// Increment index
|
|
126
|
+
index++;
|
|
127
|
+
|
|
128
|
+
// Log
|
|
129
|
+
logger.log('Starting...');
|
|
130
|
+
|
|
131
|
+
// Use changedFile if provided, otherwise use all inputs
|
|
132
|
+
const filesToProcess = changedFile ? [changedFile] : input;
|
|
133
|
+
logger.log('input', filesToProcess)
|
|
134
|
+
|
|
135
|
+
// Log files being used
|
|
136
|
+
logger.log('Files being used:');
|
|
137
|
+
|
|
138
|
+
// Complete
|
|
139
|
+
// return src(input, { base: 'src' })
|
|
140
|
+
return src(filesToProcess, { base: `${rootPathPackage}/dist/defaults`, dot: true, encoding: false }) // Add base to preserve directory structure
|
|
141
|
+
.pipe(customTransform())
|
|
142
|
+
.pipe(createTemplateTransform({site: config}))
|
|
143
|
+
.pipe(dest(output, { encoding: false }))
|
|
144
|
+
.on('finish', () => {
|
|
145
|
+
// Log
|
|
146
|
+
logger.log('Finished!');
|
|
147
|
+
|
|
148
|
+
// Complete
|
|
149
|
+
return complete();
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
function customTransform() {
|
|
154
|
+
return through2.obj(function (file, _, callback) {
|
|
155
|
+
// Skip if it's a directory
|
|
156
|
+
if (file.isDirectory()) {
|
|
157
|
+
return callback(null, file);
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
// If the file is named .gitkeep, create the directory but don't copy the file
|
|
161
|
+
if (path.basename(file.path) === '.gitkeep') {
|
|
162
|
+
jetpack.dir(path.dirname(path.join(output, path.relative(file.base, file.path))));
|
|
163
|
+
return callback();
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
// Get relative path
|
|
167
|
+
const relativePath = path.relative(file.base, file.path).replace(/\\/g, '/');
|
|
168
|
+
|
|
169
|
+
// Check if this is a binary file BEFORE any processing
|
|
170
|
+
const isBinaryFile = /\.(jpg|jpeg|png|gif|webp|svg|ico|woff|woff2|ttf|otf|eot|pdf|zip|tar|gz|mp3|mp4|avi|mov)$/i.test(file.path);
|
|
171
|
+
|
|
172
|
+
// Build item
|
|
173
|
+
const item = {
|
|
174
|
+
source: path.dirname(file.path),
|
|
175
|
+
name: path.basename(file.path),
|
|
176
|
+
destination: path.dirname(relativePath),
|
|
177
|
+
};
|
|
178
|
+
|
|
179
|
+
const options = getFileOptions(relativePath);
|
|
180
|
+
const ogName = item.name;
|
|
181
|
+
|
|
182
|
+
// Handle dynamic rename
|
|
183
|
+
if (typeof options.name === 'function') {
|
|
184
|
+
item.name = options.name(item);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Handle dynamic path
|
|
188
|
+
if (typeof options.path === 'function') {
|
|
189
|
+
item.destination = options.path(item);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
// Handle overwrite/skip as functions
|
|
193
|
+
if (typeof options.overwrite === 'function') {
|
|
194
|
+
options.overwrite = options.overwrite(item);
|
|
195
|
+
}
|
|
196
|
+
if (typeof options.skip === 'function') {
|
|
197
|
+
options.skip = options.skip(item);
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
// Final relative path
|
|
201
|
+
const finalRelativePath = path.join(item.destination, item.name);
|
|
202
|
+
const fullOutputPath = path.join(output, finalRelativePath);
|
|
203
|
+
|
|
204
|
+
// Check existence
|
|
205
|
+
const exists = jetpack.exists(fullOutputPath);
|
|
206
|
+
|
|
207
|
+
// Handle config merging
|
|
208
|
+
if (options.merge && exists && !isBinaryFile) {
|
|
209
|
+
try {
|
|
210
|
+
const existingContent = jetpack.read(fullOutputPath);
|
|
211
|
+
const newContent = file.contents.toString();
|
|
212
|
+
|
|
213
|
+
const existingConfig = JSON5.parse(existingContent);
|
|
214
|
+
const newConfig = JSON5.parse(newContent);
|
|
215
|
+
|
|
216
|
+
// Merge configs, preserving user's non-default values
|
|
217
|
+
const mergedConfig = mergeConfigs(existingConfig, newConfig);
|
|
218
|
+
|
|
219
|
+
// Update file contents with merged config
|
|
220
|
+
file.contents = Buffer.from(JSON5.stringify(mergedConfig, null, 2));
|
|
221
|
+
|
|
222
|
+
logger.log(`Merged config file: ${relativePath}`);
|
|
223
|
+
} catch (error) {
|
|
224
|
+
logger.error(`Error merging config file ${relativePath}:`, error);
|
|
225
|
+
// Fall through to normal processing if merge fails
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
// Skip if instructed
|
|
230
|
+
if (options.skip || (!options.overwrite && exists && !options.merge)) {
|
|
231
|
+
logger.log(`Skipping file: ${relativePath}`);
|
|
232
|
+
return callback();
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
// Log
|
|
236
|
+
// logger.log(`Processing file: ${relativePath}`);
|
|
237
|
+
// logger.log(` _ORIG: ${file.path}`);
|
|
238
|
+
// logger.log(` name: ${item.name}`);
|
|
239
|
+
// logger.log(` destination: ${item.destination}`);
|
|
240
|
+
// logger.log(` overwrite: ${options.overwrite}`);
|
|
241
|
+
// logger.log(` skip: ${options.skip}`);
|
|
242
|
+
// logger.log(` _FINAL: ${fullOutputPath}`);
|
|
243
|
+
|
|
244
|
+
// Run template if required
|
|
245
|
+
if (options.template && !isBinaryFile) {
|
|
246
|
+
const contents = file.contents.toString();
|
|
247
|
+
const templated = template(contents, options.template);
|
|
248
|
+
|
|
249
|
+
// Update file contents
|
|
250
|
+
file.contents = Buffer.from(templated);
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
// Update path
|
|
254
|
+
file.path = path.join(file.base, finalRelativePath);
|
|
255
|
+
|
|
256
|
+
// Push transformed file
|
|
257
|
+
this.push(file);
|
|
258
|
+
|
|
259
|
+
// Complete
|
|
260
|
+
return callback();
|
|
261
|
+
});
|
|
262
|
+
}
|
|
263
|
+
function defaultsWatcher(complete) {
|
|
264
|
+
// Quit if in build mode
|
|
265
|
+
if (Manager.isBuildMode()) {
|
|
266
|
+
logger.log('[watcher] Skipping watcher in build mode');
|
|
267
|
+
return complete();
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// Log
|
|
271
|
+
logger.log('[watcher] Watching for changes...');
|
|
272
|
+
|
|
273
|
+
// Watch for changes
|
|
274
|
+
watch(input, { delay: delay, dot: true })
|
|
275
|
+
.on('change', (changedPath) => {
|
|
276
|
+
logger.log(`[watcher] File changed (${changedPath})`);
|
|
277
|
+
// Call defaults with just the changed file
|
|
278
|
+
defaults(() => {}, changedPath);
|
|
279
|
+
});
|
|
280
|
+
|
|
281
|
+
// Complete
|
|
282
|
+
return complete();
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Default Task
|
|
286
|
+
module.exports = series(defaults, defaultsWatcher);
|
|
287
|
+
|
|
288
|
+
function getFileOptions(filePath) {
|
|
289
|
+
const defaults = {
|
|
290
|
+
overwrite: true,
|
|
291
|
+
name: null,
|
|
292
|
+
path: null,
|
|
293
|
+
template: null,
|
|
294
|
+
skip: false,
|
|
295
|
+
rule: null,
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
let options = { ...defaults };
|
|
299
|
+
|
|
300
|
+
for (const pattern in FILE_MAP) {
|
|
301
|
+
if (minimatch(filePath, pattern)) {
|
|
302
|
+
options = { ...options, ...FILE_MAP[pattern] };
|
|
303
|
+
options.rule = pattern;
|
|
304
|
+
}
|
|
305
|
+
}
|
|
306
|
+
|
|
307
|
+
return options;
|
|
308
|
+
}
|
|
@@ -3,14 +3,15 @@ const Manager = new (require('../../build.js'));
|
|
|
3
3
|
const logger = Manager.logger('distribute');
|
|
4
4
|
const { src, dest, watch, series } = require('gulp');
|
|
5
5
|
const through2 = require('through2');
|
|
6
|
-
const jetpack = require('fs-jetpack');
|
|
7
6
|
const path = require('path');
|
|
8
|
-
const
|
|
7
|
+
const jetpack = require('fs-jetpack');
|
|
8
|
+
const createTemplateTransform = require('./utils/template-transform');
|
|
9
9
|
|
|
10
10
|
// Load package
|
|
11
11
|
const package = Manager.getPackage('main');
|
|
12
12
|
const project = Manager.getPackage('project');
|
|
13
13
|
const manifest = Manager.getManifest();
|
|
14
|
+
const config = Manager.getConfig('project');
|
|
14
15
|
const rootPathPackage = Manager.getRootPath('main');
|
|
15
16
|
const rootPathProject = Manager.getRootPath('project');
|
|
16
17
|
|
|
@@ -20,7 +21,17 @@ const input = [
|
|
|
20
21
|
'src/**/*',
|
|
21
22
|
|
|
22
23
|
// Files to exclude
|
|
23
|
-
//
|
|
24
|
+
// Images handled by imagemin
|
|
25
|
+
'!src/**/*.{jpg,jpeg,png,gif,svg,webp}',
|
|
26
|
+
// JS files handled by webpack
|
|
27
|
+
'!src/**/*.js',
|
|
28
|
+
// CSS/SCSS files handled by sass task
|
|
29
|
+
'!src/**/*.{css,scss,sass}',
|
|
30
|
+
// HTML files in views handled by html task
|
|
31
|
+
'!src/views/**/*.html',
|
|
32
|
+
// Exlcude .DS_Store files
|
|
33
|
+
'!**/.DS_Store',
|
|
34
|
+
// Exclude any temp files
|
|
24
35
|
];
|
|
25
36
|
const output = 'dist';
|
|
26
37
|
const delay = 250;
|
|
@@ -28,60 +39,95 @@ const delay = 250;
|
|
|
28
39
|
// Index
|
|
29
40
|
let index = -1;
|
|
30
41
|
|
|
31
|
-
//
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
42
|
+
// Copy FontAwesome webfonts from node_modules if installed
|
|
43
|
+
function copyFontAwesomeWebfonts() {
|
|
44
|
+
const fontAwesomeWebfontsSource = path.resolve(rootPathProject, 'node_modules/@fortawesome/fontawesome-free/webfonts');
|
|
45
|
+
const fontAwesomeWebfontsDest = path.resolve(rootPathProject, 'dist/assets/webfonts');
|
|
35
46
|
|
|
36
|
-
//
|
|
37
|
-
|
|
47
|
+
// Check if FontAwesome is installed
|
|
48
|
+
if (!jetpack.exists(fontAwesomeWebfontsSource)) {
|
|
49
|
+
logger.log('[FontAwesome] Not installed, skipping webfonts copy');
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
38
52
|
|
|
39
|
-
// Create
|
|
40
|
-
|
|
53
|
+
// Create destination directory
|
|
54
|
+
jetpack.dir(fontAwesomeWebfontsDest);
|
|
41
55
|
|
|
42
|
-
//
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
56
|
+
// Copy .woff2 files
|
|
57
|
+
const webfontFiles = jetpack.find(fontAwesomeWebfontsSource, { matching: '*.woff2' });
|
|
58
|
+
|
|
59
|
+
webfontFiles.forEach(file => {
|
|
60
|
+
const fileName = path.basename(file);
|
|
61
|
+
const destPath = path.join(fontAwesomeWebfontsDest, fileName);
|
|
62
|
+
jetpack.copy(file, destPath, { overwrite: true });
|
|
63
|
+
logger.log(`[FontAwesome] Copied ${fileName}`);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
logger.log(`[FontAwesome] Copied ${webfontFiles.length} webfont file(s)`);
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
// Main task
|
|
70
|
+
function distribute() {
|
|
71
|
+
return new Promise(async function(resolve, reject) {
|
|
72
|
+
// Increment index
|
|
73
|
+
index++;
|
|
74
|
+
|
|
75
|
+
// Log
|
|
76
|
+
logger.log('Starting...');
|
|
77
|
+
|
|
78
|
+
// Copy FontAwesome webfonts first
|
|
79
|
+
copyFontAwesomeWebfonts();
|
|
80
|
+
|
|
81
|
+
// Complete
|
|
82
|
+
return src(input, {
|
|
83
|
+
base: 'src',
|
|
84
|
+
dot: true,
|
|
85
|
+
encoding: false
|
|
86
|
+
})
|
|
87
|
+
.pipe(customTransform())
|
|
88
|
+
.pipe(createTemplateTransform({site: config}))
|
|
89
|
+
.pipe(dest(output, { encoding: false }))
|
|
90
|
+
.on('finish', () => {
|
|
91
|
+
// Log
|
|
92
|
+
logger.log('Finished!');
|
|
93
|
+
|
|
94
|
+
// Complete
|
|
95
|
+
return resolve();
|
|
96
|
+
});
|
|
97
|
+
});
|
|
53
98
|
}
|
|
54
99
|
|
|
55
|
-
function
|
|
100
|
+
function customTransform() {
|
|
56
101
|
return through2.obj(function (file, _, callback) {
|
|
57
102
|
// Skip if it's a directory
|
|
58
103
|
if (file.isDirectory()) {
|
|
59
104
|
return callback(null, file);
|
|
60
105
|
}
|
|
61
106
|
|
|
62
|
-
// Get relative path
|
|
63
|
-
const relativePath = path.relative(file.base, file.path);
|
|
107
|
+
// Get relative path from src base
|
|
108
|
+
const relativePath = path.relative(file.base, file.path).replace(/\\/g, '/');
|
|
64
109
|
|
|
65
110
|
// Log
|
|
66
|
-
|
|
111
|
+
logger.log(`Processing file: ${relativePath}`);
|
|
67
112
|
|
|
68
113
|
// Change path if it starts with 'pages/'
|
|
69
|
-
if (relativePath.startsWith('pages/')) {
|
|
70
|
-
|
|
71
|
-
|
|
114
|
+
// if (relativePath.startsWith('pages/')) {
|
|
115
|
+
// // Remove 'pages/' prefix
|
|
116
|
+
// const newRelativePath = relativePath.replace(/^pages\//, '');
|
|
72
117
|
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
118
|
+
// // Update file path to remove pages directory
|
|
119
|
+
// // This will make src/pages/index.html -> dist/index.html
|
|
120
|
+
// file.path = path.join(file.base, newRelativePath);
|
|
76
121
|
|
|
77
|
-
// Log
|
|
78
|
-
//
|
|
122
|
+
// // Log
|
|
123
|
+
// logger.log(` -> Moving from pages/ to root: ${newRelativePath}`);
|
|
124
|
+
// }
|
|
79
125
|
|
|
80
126
|
// Push the file
|
|
81
127
|
this.push(file);
|
|
82
128
|
|
|
83
129
|
// Continue
|
|
84
|
-
callback(
|
|
130
|
+
callback();
|
|
85
131
|
});
|
|
86
132
|
}
|
|
87
133
|
|
|
@@ -97,7 +143,7 @@ function distributeWatcher(complete) {
|
|
|
97
143
|
logger.log('[watcher] Watching for changes...');
|
|
98
144
|
|
|
99
145
|
// Watch for changes
|
|
100
|
-
watch(input, { delay: delay }, distribute)
|
|
146
|
+
watch(input, { delay: delay, dot: true }, distribute)
|
|
101
147
|
.on('change', function(path) {
|
|
102
148
|
logger.log(`[watcher] File ${path} was changed`);
|
|
103
149
|
});
|
|
@@ -107,59 +153,8 @@ function distributeWatcher(complete) {
|
|
|
107
153
|
}
|
|
108
154
|
|
|
109
155
|
// Default Task
|
|
110
|
-
module.exports = series(
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
return await execute('git remote -v')
|
|
116
|
-
.then((r) => {
|
|
117
|
-
// Split on whitespace
|
|
118
|
-
const split = r.split(/\s+/);
|
|
119
|
-
const url = split[1];
|
|
120
|
-
|
|
121
|
-
// Get user and repo
|
|
122
|
-
const user = url.split('/')[3];
|
|
123
|
-
const name = url.split('/')[4].replace('.git', '');
|
|
124
|
-
|
|
125
|
-
// Return
|
|
126
|
-
return {user, name};
|
|
127
|
-
})
|
|
128
|
-
}
|
|
129
|
-
|
|
130
|
-
// Create build.json
|
|
131
|
-
async function createBuildJSON() {
|
|
132
|
-
// Create build log JSON
|
|
133
|
-
try {
|
|
134
|
-
// Get info first
|
|
135
|
-
const git = await getGitInfo();
|
|
136
|
-
|
|
137
|
-
// Create JSON
|
|
138
|
-
const json = {
|
|
139
|
-
timestamp: new Date().toISOString(),
|
|
140
|
-
repo: {
|
|
141
|
-
user: git.user,
|
|
142
|
-
name: git.name,
|
|
143
|
-
},
|
|
144
|
-
environment: Manager.getEnvironment(),
|
|
145
|
-
packages: {
|
|
146
|
-
'web-manager': require('web-manager/package.json').version,
|
|
147
|
-
[package.name]: package.version,
|
|
148
|
-
},
|
|
149
|
-
manifest: manifest,
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Log object
|
|
153
|
-
// logger.log('Build JSON:', json);
|
|
154
|
-
|
|
155
|
-
// Write to file
|
|
156
|
-
jetpack.write('dist/build.json', JSON.stringify(json, null, 2));
|
|
157
|
-
|
|
158
|
-
// Log
|
|
159
|
-
logger.log('Created build.json');
|
|
160
|
-
} catch (e) {
|
|
161
|
-
console.error('Error updating build.json', e);
|
|
162
|
-
}
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
|
|
156
|
+
module.exports = series(
|
|
157
|
+
// Manager.wrapTask('distribute', distribute),
|
|
158
|
+
distribute,
|
|
159
|
+
distributeWatcher
|
|
160
|
+
);
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
// Libraries
|
|
2
|
+
const Manager = new (require('../../build.js'));
|
|
3
|
+
const logger = Manager.logger('html');
|
|
4
|
+
const { src, dest, watch, series } = require('gulp');
|
|
5
|
+
const through2 = require('through2');
|
|
6
|
+
const jetpack = require('fs-jetpack');
|
|
7
|
+
const path = require('path');
|
|
8
|
+
const { template } = require('node-powertools');
|
|
9
|
+
|
|
10
|
+
// Load package
|
|
11
|
+
const package = Manager.getPackage('main');
|
|
12
|
+
const project = Manager.getPackage('project');
|
|
13
|
+
const config = Manager.getConfig('project');
|
|
14
|
+
const rootPathPackage = Manager.getRootPath('main');
|
|
15
|
+
const rootPathProject = Manager.getRootPath('project');
|
|
16
|
+
|
|
17
|
+
// Glob
|
|
18
|
+
const input = [
|
|
19
|
+
// Files to include
|
|
20
|
+
'src/views/**/*.html',
|
|
21
|
+
|
|
22
|
+
// Files to exclude
|
|
23
|
+
'!src/views/**/_*.html',
|
|
24
|
+
];
|
|
25
|
+
const output = 'dist/views';
|
|
26
|
+
const delay = 250;
|
|
27
|
+
|
|
28
|
+
// Main task
|
|
29
|
+
function html(complete) {
|
|
30
|
+
// Log
|
|
31
|
+
logger.log('Starting...');
|
|
32
|
+
|
|
33
|
+
// Load the template
|
|
34
|
+
const templatePath = path.join(rootPathPackage, 'dist', 'config', 'page-template.html');
|
|
35
|
+
const templateContent = jetpack.read(templatePath);
|
|
36
|
+
|
|
37
|
+
if (!templateContent) {
|
|
38
|
+
logger.error('Template not found at:', templatePath);
|
|
39
|
+
return complete();
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Process HTML files
|
|
43
|
+
return src(input)
|
|
44
|
+
.pipe(processHtml(templateContent))
|
|
45
|
+
.pipe(dest(output))
|
|
46
|
+
.on('finish', () => {
|
|
47
|
+
logger.log('Finished!');
|
|
48
|
+
return complete();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Process HTML transform
|
|
53
|
+
function processHtml(templateContent) {
|
|
54
|
+
return through2.obj(function (file, _, callback) {
|
|
55
|
+
// Skip if it's a directory
|
|
56
|
+
if (file.isDirectory()) {
|
|
57
|
+
return callback(null, file);
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
try {
|
|
61
|
+
// Get the view name from the file path
|
|
62
|
+
const viewName = path.basename(file.path, '.html');
|
|
63
|
+
const relativePath = path.relative(path.join(rootPathProject, 'src/views'), file.dirname);
|
|
64
|
+
const viewNameWithPath = relativePath ? `${relativePath}/${viewName}` : viewName;
|
|
65
|
+
|
|
66
|
+
// Read the content (body HTML)
|
|
67
|
+
const bodyContent = file.contents.toString();
|
|
68
|
+
|
|
69
|
+
// Determine the component name for CSS/JS loading
|
|
70
|
+
// Template already includes /components/ prefix, so just provide the component path
|
|
71
|
+
// Pages can have multiple files (index, pricing, login, etc.)
|
|
72
|
+
// Other components (popup, options, etc.) only have index.html
|
|
73
|
+
let componentName;
|
|
74
|
+
if (relativePath.startsWith('pages/') || relativePath === 'pages') {
|
|
75
|
+
// Pages directory: include full path with filename
|
|
76
|
+
// pages/index.html -> pages/index
|
|
77
|
+
// pages/pricing.html -> pages/pricing
|
|
78
|
+
componentName = viewNameWithPath;
|
|
79
|
+
} else if (relativePath && viewName === 'index') {
|
|
80
|
+
// Other components with index.html: use just the directory name
|
|
81
|
+
// popup/index.html -> popup
|
|
82
|
+
// options/index.html -> options
|
|
83
|
+
componentName = relativePath;
|
|
84
|
+
} else if (relativePath) {
|
|
85
|
+
// Non-index files in other directories: use full path
|
|
86
|
+
componentName = viewNameWithPath;
|
|
87
|
+
} else {
|
|
88
|
+
// No path: use viewName
|
|
89
|
+
componentName = viewName;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
// Prepare template data
|
|
93
|
+
const data = {
|
|
94
|
+
content: bodyContent,
|
|
95
|
+
page: {
|
|
96
|
+
name: componentName,
|
|
97
|
+
path: viewNameWithPath,
|
|
98
|
+
title: config.brand?.name || 'Extension',
|
|
99
|
+
},
|
|
100
|
+
theme: {
|
|
101
|
+
appearance: config.theme?.appearance || 'dark',
|
|
102
|
+
},
|
|
103
|
+
brand: config.brand || {},
|
|
104
|
+
cacheBust: Date.now(),
|
|
105
|
+
};
|
|
106
|
+
|
|
107
|
+
// Apply template with custom brackets
|
|
108
|
+
const rendered = template(templateContent, data, {
|
|
109
|
+
brackets: ['{{', '}}'],
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
// Update file contents
|
|
113
|
+
file.contents = Buffer.from(rendered);
|
|
114
|
+
|
|
115
|
+
// Log
|
|
116
|
+
logger.log(`Processed: ${viewNameWithPath}.html`);
|
|
117
|
+
|
|
118
|
+
// Push the file
|
|
119
|
+
this.push(file);
|
|
120
|
+
return callback();
|
|
121
|
+
} catch (error) {
|
|
122
|
+
logger.error('Error processing HTML:', error);
|
|
123
|
+
return callback(error);
|
|
124
|
+
}
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// Watcher task
|
|
129
|
+
function htmlWatcher(complete) {
|
|
130
|
+
// Quit if in build mode
|
|
131
|
+
if (Manager.isBuildMode()) {
|
|
132
|
+
logger.log('[watcher] Skipping watcher in build mode');
|
|
133
|
+
return complete();
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// Log
|
|
137
|
+
logger.log('[watcher] Watching for changes...');
|
|
138
|
+
|
|
139
|
+
// Watch for changes
|
|
140
|
+
watch(input, { delay: delay, dot: true }, html)
|
|
141
|
+
.on('change', function (path) {
|
|
142
|
+
logger.log(`[watcher] File ${path} was changed`);
|
|
143
|
+
});
|
|
144
|
+
|
|
145
|
+
// Complete
|
|
146
|
+
return complete();
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
// Export task
|
|
150
|
+
module.exports = series(html, htmlWatcher);
|