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.
Files changed (242) hide show
  1. package/CHANGELOG.md +43 -0
  2. package/CLAUDE.md +672 -0
  3. package/TODO.md +3 -0
  4. package/dist/assets/css/browser-extension-manager.scss +18 -0
  5. package/dist/assets/css/components/content/index.scss +5 -0
  6. package/dist/assets/css/components/options/index.scss +5 -0
  7. package/dist/assets/css/components/pages/index.scss +5 -0
  8. package/dist/assets/css/components/popup/index.scss +5 -0
  9. package/dist/assets/css/core/_animations.scss +64 -0
  10. package/dist/assets/css/core/_initialize.scss +23 -0
  11. package/dist/assets/css/core/_utilities.scss +80 -0
  12. package/dist/assets/themes/_template/_theme.js +5 -0
  13. package/dist/assets/themes/_template/_theme.scss +5 -0
  14. package/dist/assets/themes/bootstrap/_theme.js +16 -0
  15. package/dist/assets/themes/bootstrap/_theme.scss +232 -0
  16. package/dist/assets/themes/bootstrap/js/index.esm.js +19 -0
  17. package/dist/assets/themes/bootstrap/js/index.umd.js +34 -0
  18. package/dist/assets/themes/bootstrap/js/src/alert.js +87 -0
  19. package/dist/assets/themes/bootstrap/js/src/base-component.js +86 -0
  20. package/dist/assets/themes/bootstrap/js/src/button.js +72 -0
  21. package/dist/assets/themes/bootstrap/js/src/carousel.js +474 -0
  22. package/dist/assets/themes/bootstrap/js/src/collapse.js +297 -0
  23. package/dist/assets/themes/bootstrap/js/src/dom/data.js +55 -0
  24. package/dist/assets/themes/bootstrap/js/src/dom/event-handler.js +317 -0
  25. package/dist/assets/themes/bootstrap/js/src/dom/manipulator.js +71 -0
  26. package/dist/assets/themes/bootstrap/js/src/dom/selector-engine.js +126 -0
  27. package/dist/assets/themes/bootstrap/js/src/dropdown.js +458 -0
  28. package/dist/assets/themes/bootstrap/js/src/modal.js +378 -0
  29. package/dist/assets/themes/bootstrap/js/src/offcanvas.js +282 -0
  30. package/dist/assets/themes/bootstrap/js/src/popover.js +97 -0
  31. package/dist/assets/themes/bootstrap/js/src/scrollspy.js +296 -0
  32. package/dist/assets/themes/bootstrap/js/src/tab.js +315 -0
  33. package/dist/assets/themes/bootstrap/js/src/toast.js +224 -0
  34. package/dist/assets/themes/bootstrap/js/src/tooltip.js +632 -0
  35. package/dist/assets/themes/bootstrap/js/src/util/backdrop.js +151 -0
  36. package/dist/assets/themes/bootstrap/js/src/util/component-functions.js +35 -0
  37. package/dist/assets/themes/bootstrap/js/src/util/config.js +65 -0
  38. package/dist/assets/themes/bootstrap/js/src/util/focustrap.js +115 -0
  39. package/dist/assets/themes/bootstrap/js/src/util/index.js +306 -0
  40. package/dist/assets/themes/bootstrap/js/src/util/sanitizer.js +117 -0
  41. package/dist/assets/themes/bootstrap/js/src/util/scrollbar.js +114 -0
  42. package/dist/assets/themes/bootstrap/js/src/util/swipe.js +146 -0
  43. package/dist/assets/themes/bootstrap/js/src/util/template-factory.js +160 -0
  44. package/dist/assets/themes/bootstrap/scss/_accordion.scss +153 -0
  45. package/dist/assets/themes/bootstrap/scss/_alert.scss +68 -0
  46. package/dist/assets/themes/bootstrap/scss/_badge.scss +38 -0
  47. package/dist/assets/themes/bootstrap/scss/_breadcrumb.scss +40 -0
  48. package/dist/assets/themes/bootstrap/scss/_button-group.scss +147 -0
  49. package/dist/assets/themes/bootstrap/scss/_buttons.scss +216 -0
  50. package/dist/assets/themes/bootstrap/scss/_card.scss +238 -0
  51. package/dist/assets/themes/bootstrap/scss/_carousel.scss +226 -0
  52. package/dist/assets/themes/bootstrap/scss/_close.scss +66 -0
  53. package/dist/assets/themes/bootstrap/scss/_containers.scss +41 -0
  54. package/dist/assets/themes/bootstrap/scss/_dropdown.scss +250 -0
  55. package/dist/assets/themes/bootstrap/scss/_forms.scss +9 -0
  56. package/dist/assets/themes/bootstrap/scss/_functions.scss +302 -0
  57. package/dist/assets/themes/bootstrap/scss/_grid.scss +39 -0
  58. package/dist/assets/themes/bootstrap/scss/_helpers.scss +12 -0
  59. package/dist/assets/themes/bootstrap/scss/_images.scss +42 -0
  60. package/dist/assets/themes/bootstrap/scss/_list-group.scss +199 -0
  61. package/dist/assets/themes/bootstrap/scss/_maps.scss +174 -0
  62. package/dist/assets/themes/bootstrap/scss/_mixins.scss +42 -0
  63. package/dist/assets/themes/bootstrap/scss/_modal.scss +240 -0
  64. package/dist/assets/themes/bootstrap/scss/_nav.scss +197 -0
  65. package/dist/assets/themes/bootstrap/scss/_navbar.scss +289 -0
  66. package/dist/assets/themes/bootstrap/scss/_offcanvas.scss +147 -0
  67. package/dist/assets/themes/bootstrap/scss/_pagination.scss +109 -0
  68. package/dist/assets/themes/bootstrap/scss/_placeholders.scss +51 -0
  69. package/dist/assets/themes/bootstrap/scss/_popover.scss +196 -0
  70. package/dist/assets/themes/bootstrap/scss/_progress.scss +68 -0
  71. package/dist/assets/themes/bootstrap/scss/_reboot.scss +611 -0
  72. package/dist/assets/themes/bootstrap/scss/_root.scss +187 -0
  73. package/dist/assets/themes/bootstrap/scss/_spinners.scss +85 -0
  74. package/dist/assets/themes/bootstrap/scss/_tables.scss +171 -0
  75. package/dist/assets/themes/bootstrap/scss/_toasts.scss +73 -0
  76. package/dist/assets/themes/bootstrap/scss/_tooltip.scss +119 -0
  77. package/dist/assets/themes/bootstrap/scss/_transitions.scss +27 -0
  78. package/dist/assets/themes/bootstrap/scss/_type.scss +106 -0
  79. package/dist/assets/themes/bootstrap/scss/_utilities.scss +806 -0
  80. package/dist/assets/themes/bootstrap/scss/_variables-dark.scss +102 -0
  81. package/dist/assets/themes/bootstrap/scss/_variables.scss +1753 -0
  82. package/dist/assets/themes/bootstrap/scss/bootstrap-grid.scss +62 -0
  83. package/dist/assets/themes/bootstrap/scss/bootstrap-reboot.scss +10 -0
  84. package/dist/assets/themes/bootstrap/scss/bootstrap-utilities.scss +19 -0
  85. package/dist/assets/themes/bootstrap/scss/bootstrap.scss +52 -0
  86. package/dist/assets/themes/bootstrap/scss/forms/_floating-labels.scss +97 -0
  87. package/dist/assets/themes/bootstrap/scss/forms/_form-check.scss +189 -0
  88. package/dist/assets/themes/bootstrap/scss/forms/_form-control.scss +214 -0
  89. package/dist/assets/themes/bootstrap/scss/forms/_form-range.scss +91 -0
  90. package/dist/assets/themes/bootstrap/scss/forms/_form-select.scss +80 -0
  91. package/dist/assets/themes/bootstrap/scss/forms/_form-text.scss +11 -0
  92. package/dist/assets/themes/bootstrap/scss/forms/_input-group.scss +132 -0
  93. package/dist/assets/themes/bootstrap/scss/forms/_labels.scss +36 -0
  94. package/dist/assets/themes/bootstrap/scss/forms/_validation.scss +12 -0
  95. package/dist/assets/themes/bootstrap/scss/helpers/_clearfix.scss +3 -0
  96. package/dist/assets/themes/bootstrap/scss/helpers/_color-bg.scss +7 -0
  97. package/dist/assets/themes/bootstrap/scss/helpers/_colored-links.scss +30 -0
  98. package/dist/assets/themes/bootstrap/scss/helpers/_focus-ring.scss +5 -0
  99. package/dist/assets/themes/bootstrap/scss/helpers/_icon-link.scss +25 -0
  100. package/dist/assets/themes/bootstrap/scss/helpers/_position.scss +36 -0
  101. package/dist/assets/themes/bootstrap/scss/helpers/_ratio.scss +26 -0
  102. package/dist/assets/themes/bootstrap/scss/helpers/_stacks.scss +15 -0
  103. package/dist/assets/themes/bootstrap/scss/helpers/_stretched-link.scss +15 -0
  104. package/dist/assets/themes/bootstrap/scss/helpers/_text-truncation.scss +7 -0
  105. package/dist/assets/themes/bootstrap/scss/helpers/_visually-hidden.scss +8 -0
  106. package/dist/assets/themes/bootstrap/scss/helpers/_vr.scss +8 -0
  107. package/dist/assets/themes/bootstrap/scss/mixins/_alert.scss +18 -0
  108. package/dist/assets/themes/bootstrap/scss/mixins/_backdrop.scss +14 -0
  109. package/dist/assets/themes/bootstrap/scss/mixins/_banner.scss +7 -0
  110. package/dist/assets/themes/bootstrap/scss/mixins/_border-radius.scss +78 -0
  111. package/dist/assets/themes/bootstrap/scss/mixins/_box-shadow.scss +18 -0
  112. package/dist/assets/themes/bootstrap/scss/mixins/_breakpoints.scss +127 -0
  113. package/dist/assets/themes/bootstrap/scss/mixins/_buttons.scss +70 -0
  114. package/dist/assets/themes/bootstrap/scss/mixins/_caret.scss +69 -0
  115. package/dist/assets/themes/bootstrap/scss/mixins/_clearfix.scss +9 -0
  116. package/dist/assets/themes/bootstrap/scss/mixins/_color-mode.scss +21 -0
  117. package/dist/assets/themes/bootstrap/scss/mixins/_color-scheme.scss +7 -0
  118. package/dist/assets/themes/bootstrap/scss/mixins/_container.scss +11 -0
  119. package/dist/assets/themes/bootstrap/scss/mixins/_deprecate.scss +10 -0
  120. package/dist/assets/themes/bootstrap/scss/mixins/_forms.scss +163 -0
  121. package/dist/assets/themes/bootstrap/scss/mixins/_gradients.scss +47 -0
  122. package/dist/assets/themes/bootstrap/scss/mixins/_grid.scss +151 -0
  123. package/dist/assets/themes/bootstrap/scss/mixins/_image.scss +16 -0
  124. package/dist/assets/themes/bootstrap/scss/mixins/_list-group.scss +26 -0
  125. package/dist/assets/themes/bootstrap/scss/mixins/_lists.scss +7 -0
  126. package/dist/assets/themes/bootstrap/scss/mixins/_pagination.scss +10 -0
  127. package/dist/assets/themes/bootstrap/scss/mixins/_reset-text.scss +17 -0
  128. package/dist/assets/themes/bootstrap/scss/mixins/_resize.scss +6 -0
  129. package/dist/assets/themes/bootstrap/scss/mixins/_table-variants.scss +24 -0
  130. package/dist/assets/themes/bootstrap/scss/mixins/_text-truncate.scss +8 -0
  131. package/dist/assets/themes/bootstrap/scss/mixins/_transition.scss +26 -0
  132. package/dist/assets/themes/bootstrap/scss/mixins/_utilities.scss +97 -0
  133. package/dist/assets/themes/bootstrap/scss/mixins/_visually-hidden.scss +38 -0
  134. package/dist/assets/themes/bootstrap/scss/tests/jasmine.js +16 -0
  135. package/dist/assets/themes/bootstrap/scss/tests/mixins/_auto-import-of-variables-dark.test.scss +7 -0
  136. package/dist/assets/themes/bootstrap/scss/tests/mixins/_color-modes.test.scss +69 -0
  137. package/dist/assets/themes/bootstrap/scss/tests/mixins/_media-query-color-mode-full.test.scss +8 -0
  138. package/dist/assets/themes/bootstrap/scss/tests/mixins/_utilities.test.scss +393 -0
  139. package/dist/assets/themes/bootstrap/scss/tests/sass-true/register.js +14 -0
  140. package/dist/assets/themes/bootstrap/scss/tests/sass-true/runner.js +17 -0
  141. package/dist/assets/themes/bootstrap/scss/tests/utilities/_api.test.scss +75 -0
  142. package/dist/assets/themes/bootstrap/scss/utilities/_api.scss +47 -0
  143. package/dist/assets/themes/bootstrap/scss/vendor/_rfs.scss +348 -0
  144. package/dist/assets/themes/classy/README.md +75 -0
  145. package/dist/assets/themes/classy/_config.scss +185 -0
  146. package/dist/assets/themes/classy/_theme.js +29 -0
  147. package/dist/assets/themes/classy/_theme.scss +34 -0
  148. package/dist/assets/themes/classy/css/base/_animations.scss +27 -0
  149. package/dist/assets/themes/classy/css/base/_backgrounds.scss +191 -0
  150. package/dist/assets/themes/classy/css/base/_borders.scss +65 -0
  151. package/dist/assets/themes/classy/css/base/_root.scss +58 -0
  152. package/dist/assets/themes/classy/css/base/_soft-colors.scss +92 -0
  153. package/dist/assets/themes/classy/css/base/_spacing.scss +64 -0
  154. package/dist/assets/themes/classy/css/base/_typography.scss +179 -0
  155. package/dist/assets/themes/classy/css/base/_utilities.scss +77 -0
  156. package/dist/assets/themes/classy/css/components/_accordion.scss +33 -0
  157. package/dist/assets/themes/classy/css/components/_avatars.scss +32 -0
  158. package/dist/assets/themes/classy/css/components/_badges.scss +25 -0
  159. package/dist/assets/themes/classy/css/components/_buttons.scss +397 -0
  160. package/dist/assets/themes/classy/css/components/_cards.scss +33 -0
  161. package/dist/assets/themes/classy/css/components/_carousel.scss +41 -0
  162. package/dist/assets/themes/classy/css/components/_forms.scss +115 -0
  163. package/dist/assets/themes/classy/css/components/_links.scss +19 -0
  164. package/dist/assets/themes/classy/css/components/_logo-scroll.scss +57 -0
  165. package/dist/assets/themes/classy/css/components/_spinners.scss +19 -0
  166. package/dist/assets/themes/classy/css/components/_text.scss +41 -0
  167. package/dist/assets/themes/classy/css/layout/_blog.scss +42 -0
  168. package/dist/assets/themes/classy/css/layout/_general.scss +139 -0
  169. package/dist/assets/themes/classy/css/layout/_navigation.scss +576 -0
  170. package/dist/assets/themes/classy/css/layout/_team.scss +18 -0
  171. package/dist/assets/themes/classy/js/logo-scroll.js +83 -0
  172. package/dist/assets/themes/classy/js/navbar-scroll.js +65 -0
  173. package/dist/background.js +236 -260
  174. package/dist/build.js +93 -4
  175. package/dist/commands/setup.js +0 -268
  176. package/dist/config/manifest.json +11 -3
  177. package/dist/config/page-template.html +21 -0
  178. package/dist/defaults/.nvmrc +1 -1
  179. package/dist/defaults/CLAUDE.md +8 -0
  180. package/dist/defaults/config/browser-extension-manager.json +37 -0
  181. package/dist/defaults/src/assets/css/components/content/index.scss +11 -0
  182. package/dist/defaults/src/assets/css/components/options/index.scss +14 -0
  183. package/dist/defaults/src/assets/css/components/pages/index.scss +10 -0
  184. package/dist/defaults/src/assets/css/components/popup/index.scss +10 -0
  185. package/dist/defaults/src/assets/css/components/sidepanel/index.scss +6 -0
  186. package/dist/defaults/src/assets/css/main.scss +32 -0
  187. package/dist/defaults/src/assets/js/components/background/index.js +22 -0
  188. package/dist/defaults/src/assets/js/components/content/index.js +22 -0
  189. package/dist/defaults/src/assets/js/components/options/index.js +22 -0
  190. package/dist/defaults/src/assets/js/components/pages/index.js +22 -0
  191. package/dist/defaults/src/assets/js/components/popup/index.js +22 -0
  192. package/dist/defaults/src/assets/js/components/sidepanel/index.js +20 -0
  193. package/dist/defaults/src/assets/vendor/.gitkeep +0 -0
  194. package/dist/defaults/src/manifest.json +11 -6
  195. package/dist/defaults/src/views/options/index.html +8 -0
  196. package/dist/defaults/src/views/pages/index.html +10 -0
  197. package/dist/defaults/src/views/popup/index.html +4 -0
  198. package/dist/defaults/src/views/sidepanel/index.html +4 -0
  199. package/dist/gulp/main.js +11 -5
  200. package/dist/gulp/plugins/webpack/strip-dev-blocks.js +53 -0
  201. package/dist/gulp/tasks/{_package.js → BU/_package.js} +1 -1
  202. package/dist/gulp/tasks/{developmentRebuild.js → BU/developmentRebuild.js} +1 -1
  203. package/dist/gulp/tasks/{themes.js → BU/themes.js} +3 -2
  204. package/dist/gulp/tasks/{test.js → _.js} +3 -3
  205. package/dist/gulp/tasks/audit.js +154 -0
  206. package/dist/gulp/tasks/defaults.js +308 -0
  207. package/dist/gulp/tasks/distribute.js +87 -92
  208. package/dist/gulp/tasks/html.js +150 -0
  209. package/dist/gulp/tasks/icons.js +3 -2
  210. package/dist/gulp/tasks/package.js +216 -27
  211. package/dist/gulp/tasks/sass.js +188 -43
  212. package/dist/gulp/tasks/serve.js +1 -0
  213. package/dist/gulp/tasks/utils/template-transform.js +50 -0
  214. package/dist/gulp/tasks/webpack.js +338 -134
  215. package/dist/index.js +34 -34
  216. package/dist/options.js +40 -0
  217. package/dist/page.js +40 -0
  218. package/dist/popup.js +40 -0
  219. package/dist/sidepanel.js +40 -0
  220. package/firebase-debug.log +322 -0
  221. package/package.json +25 -18
  222. package/dist/assets/css/main.scss +0 -3
  223. package/dist/assets/themes/bootstrap/5.3.3/css/bootstrap.css +0 -12057
  224. package/dist/assets/themes/bootstrap/5.3.3/css/bootstrap.css.map +0 -1
  225. package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.bundle.js +0 -6314
  226. package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.bundle.js.map +0 -1
  227. package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.js +0 -4494
  228. package/dist/assets/themes/bootstrap/5.3.3/js/bootstrap.js.map +0 -1
  229. package/dist/defaults/src/assets/css/content.scss +0 -2
  230. package/dist/defaults/src/assets/css/options.scss +0 -11
  231. package/dist/defaults/src/assets/css/popup.scss +0 -14
  232. package/dist/defaults/src/assets/js/background.js +0 -18
  233. package/dist/defaults/src/assets/js/content.js +0 -15
  234. package/dist/defaults/src/assets/js/options.js +0 -17
  235. package/dist/defaults/src/assets/js/popup.js +0 -17
  236. package/dist/defaults/src/pages/options.html +0 -26
  237. package/dist/defaults/src/pages/popup.html +0 -26
  238. /package/dist/{defaults/src/assets/images/_ → assets/css/bundles/.gitkeep} +0 -0
  239. /package/dist/assets/css/{fontawesome.scss → core/_fontawesome.scss} +0 -0
  240. /package/dist/defaults/src/assets/{vendor/_ → images/.gitkeep} +0 -0
  241. /package/dist/gulp/tasks/{_importer.js → BU/_importer.js} +0 -0
  242. /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 { execute } = require('node-powertools');
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
- // '!dist/**',
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
- // Main task
32
- async function distribute(complete) {
33
- // Increment index
34
- index++;
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
- // Log
37
- logger.log('Starting...');
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 build JSON
40
- await createBuildJSON();
53
+ // Create destination directory
54
+ jetpack.dir(fontAwesomeWebfontsDest);
41
55
 
42
- // Complete
43
- return src(input, { base: 'src' })
44
- // .pipe(customPathTransform())
45
- .pipe(dest(output))
46
- .on('end', () => {
47
- // Log
48
- logger.log('Finished!');
49
-
50
- // Complete
51
- return complete();
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 customPathTransform() {
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
- // logger.log(`Processing file 111: ${relativePath}`);
111
+ logger.log(`Processing file: ${relativePath}`);
67
112
 
68
113
  // Change path if it starts with 'pages/'
69
- if (relativePath.startsWith('pages/')) {
70
- const newRelativePath = relativePath.replace(/^pages\//, '');
71
- file.path = path.join(file.base, newRelativePath);
114
+ // if (relativePath.startsWith('pages/')) {
115
+ // // Remove 'pages/' prefix
116
+ // const newRelativePath = relativePath.replace(/^pages\//, '');
72
117
 
73
- // Log
74
- // logger.log(`Changed path to 222: ${file.path}`);
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
- // logger.log(`Processing file 333: ${file.path}`);
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(null, file);
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(distribute, distributeWatcher);
111
-
112
-
113
- // Get git info
114
- async function getGitInfo() {
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);