browser-extension-manager 1.0.14 → 1.1.1
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 +235 -261
- 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 +24 -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} +2 -1
- 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 +71 -78
- package/dist/gulp/tasks/html.js +150 -0
- package/dist/gulp/tasks/icons.js +3 -2
- package/dist/gulp/tasks/package.js +194 -13
- 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 +341 -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 +350 -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
|
@@ -10,6 +10,7 @@ const JSON5 = require('json5');
|
|
|
10
10
|
// Load package
|
|
11
11
|
const package = Manager.getPackage('main');
|
|
12
12
|
const project = Manager.getPackage('project');
|
|
13
|
+
const config = Manager.getConfig('project');
|
|
13
14
|
const rootPathPackage = Manager.getRootPath('main');
|
|
14
15
|
const rootPathProject = Manager.getRootPath('project');
|
|
15
16
|
|
|
@@ -24,6 +25,133 @@ const input = [
|
|
|
24
25
|
const output = 'dist';
|
|
25
26
|
const delay = 250;
|
|
26
27
|
|
|
28
|
+
// Set index
|
|
29
|
+
let index = -1;
|
|
30
|
+
|
|
31
|
+
// JSONP Template for build.js
|
|
32
|
+
const JSONP_TEMPLATE = `
|
|
33
|
+
(function() {
|
|
34
|
+
// Create a global variable for the config
|
|
35
|
+
const config = { config };
|
|
36
|
+
|
|
37
|
+
// Assign to various global scopes for compatibility
|
|
38
|
+
if (typeof self !== 'undefined') self.BEM_BUILD_JSON = config;
|
|
39
|
+
if (typeof window !== 'undefined') window.BEM_BUILD_JSON = config;
|
|
40
|
+
if (typeof globalThis !== 'undefined') globalThis.BEM_BUILD_JSON = config;
|
|
41
|
+
})();
|
|
42
|
+
`.trim();
|
|
43
|
+
|
|
44
|
+
// Generate build.js file
|
|
45
|
+
async function generateBuildJs(outputDir) {
|
|
46
|
+
try {
|
|
47
|
+
// Get git info
|
|
48
|
+
const gitInfo = getGitInfo();
|
|
49
|
+
|
|
50
|
+
// Get manifest
|
|
51
|
+
const manifestPath = path.join('dist', 'manifest.json');
|
|
52
|
+
const manifest = JSON5.parse(jetpack.read(manifestPath));
|
|
53
|
+
|
|
54
|
+
// Build config object matching web-manager's expected structure
|
|
55
|
+
const buildConfig = {
|
|
56
|
+
timestamp: new Date().toISOString(),
|
|
57
|
+
repo: gitInfo,
|
|
58
|
+
environment: Manager.getEnvironment(),
|
|
59
|
+
packages: {
|
|
60
|
+
'browser-extension-manager': package.version,
|
|
61
|
+
'web-manager': getPackageVersion('web-manager'),
|
|
62
|
+
},
|
|
63
|
+
config: {
|
|
64
|
+
// Core metadata
|
|
65
|
+
version: manifest.version,
|
|
66
|
+
environment: Manager.getEnvironment(),
|
|
67
|
+
buildTime: Date.now(),
|
|
68
|
+
|
|
69
|
+
// Brand configuration (from browser-extension-manager.json or manifest)
|
|
70
|
+
brand: config.brand || {},
|
|
71
|
+
|
|
72
|
+
// BEM-specific config
|
|
73
|
+
bem: {
|
|
74
|
+
environment: Manager.getEnvironment(),
|
|
75
|
+
cache_breaker: Math.round(new Date().getTime() / 1000),
|
|
76
|
+
liveReloadPort: config.liveReloadPort || 35729,
|
|
77
|
+
},
|
|
78
|
+
|
|
79
|
+
// Web-manager features (matching expected structure)
|
|
80
|
+
auth: { enabled: true, config: {} },
|
|
81
|
+
|
|
82
|
+
firebase: {
|
|
83
|
+
app: {
|
|
84
|
+
enabled: !!(config.firebaseConfig?.apiKey),
|
|
85
|
+
config: config.firebaseConfig || {},
|
|
86
|
+
},
|
|
87
|
+
appCheck: { enabled: false, config: {} },
|
|
88
|
+
},
|
|
89
|
+
|
|
90
|
+
cookieConsent: { enabled: true, config: {} },
|
|
91
|
+
chatsy: { enabled: true, config: {} },
|
|
92
|
+
sentry: {
|
|
93
|
+
enabled: !!(config.sentry?.dsn),
|
|
94
|
+
config: config.sentry || {}
|
|
95
|
+
},
|
|
96
|
+
exitPopup: { enabled: false, config: {} },
|
|
97
|
+
lazyLoading: { enabled: true, config: {} },
|
|
98
|
+
socialSharing: { enabled: false, config: {} },
|
|
99
|
+
pushNotifications: { enabled: false, config: {} },
|
|
100
|
+
validRedirectHosts: ['itwcreativeworks.com'],
|
|
101
|
+
refreshNewVersion: { enabled: true, config: {} },
|
|
102
|
+
serviceWorker: { enabled: false, config: {} },
|
|
103
|
+
|
|
104
|
+
// Analytics
|
|
105
|
+
google_analytics: config.google_analytics || {},
|
|
106
|
+
|
|
107
|
+
// Theme config
|
|
108
|
+
theme: config.theme || {},
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
|
|
112
|
+
// Write JSON version
|
|
113
|
+
const jsonPath = path.join(outputDir, 'build.json');
|
|
114
|
+
jetpack.write(jsonPath, JSON.stringify(buildConfig, null, 2));
|
|
115
|
+
|
|
116
|
+
// Write JSONP version for service worker
|
|
117
|
+
const jsonpContent = JSONP_TEMPLATE.replace('{ config }', JSON.stringify(buildConfig, null, 2));
|
|
118
|
+
const jsonpPath = path.join(outputDir, 'build.js');
|
|
119
|
+
jetpack.write(jsonpPath, jsonpContent);
|
|
120
|
+
|
|
121
|
+
logger.log(`Generated build.js and build.json`);
|
|
122
|
+
} catch (e) {
|
|
123
|
+
logger.error(`Error generating build.js`, e);
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
// Get git info
|
|
128
|
+
function getGitInfo() {
|
|
129
|
+
try {
|
|
130
|
+
const { execSync } = require('child_process');
|
|
131
|
+
const user = execSync('git config user.name', { encoding: 'utf8' }).trim();
|
|
132
|
+
const repo = execSync('git config --get remote.origin.url', { encoding: 'utf8' })
|
|
133
|
+
.trim()
|
|
134
|
+
.replace(/.*[\/:]([\w-]+)\/([\w-]+)(\.git)?$/, '$2');
|
|
135
|
+
|
|
136
|
+
return { user, name: repo };
|
|
137
|
+
} catch (e) {
|
|
138
|
+
return { user: 'unknown', name: 'unknown' };
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Get package version
|
|
143
|
+
function getPackageVersion(packageName) {
|
|
144
|
+
try {
|
|
145
|
+
const pkgPath = require.resolve(`${packageName}/package.json`, {
|
|
146
|
+
paths: [process.cwd()]
|
|
147
|
+
});
|
|
148
|
+
const pkg = require(pkgPath);
|
|
149
|
+
return pkg.version;
|
|
150
|
+
} catch (e) {
|
|
151
|
+
return 'unknown';
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
27
155
|
// Special Compilation Task for manifest.json with default settings
|
|
28
156
|
async function compileManifest(outputDir) {
|
|
29
157
|
try {
|
|
@@ -124,12 +252,18 @@ async function packageRaw() {
|
|
|
124
252
|
const value = redactions[key];
|
|
125
253
|
const regex = new RegExp(key, 'g'); // Create a global regex for the key
|
|
126
254
|
content = content.replace(regex, value);
|
|
255
|
+
|
|
256
|
+
// Log replacement
|
|
257
|
+
logger.log(`Redacted ${key} in ${filePath}`);
|
|
127
258
|
});
|
|
128
259
|
|
|
129
260
|
// Write the new content to the file
|
|
130
261
|
jetpack.write(filePath, content);
|
|
131
262
|
});
|
|
132
263
|
|
|
264
|
+
// Generate build.js and build.json
|
|
265
|
+
await generateBuildJs(outputDir);
|
|
266
|
+
|
|
133
267
|
// Compile manifest and locales
|
|
134
268
|
await compileManifest(outputDir);
|
|
135
269
|
await compileLocales(outputDir);
|
|
@@ -194,23 +328,37 @@ function liveReload() {
|
|
|
194
328
|
|
|
195
329
|
// Package Task
|
|
196
330
|
async function packageFn(complete) {
|
|
197
|
-
|
|
198
|
-
|
|
331
|
+
try {
|
|
332
|
+
// Log
|
|
333
|
+
logger.log('Starting...');
|
|
199
334
|
|
|
200
|
-
|
|
201
|
-
|
|
335
|
+
// Increment index
|
|
336
|
+
index++;
|
|
202
337
|
|
|
203
|
-
|
|
204
|
-
|
|
338
|
+
// Run build:pre hook
|
|
339
|
+
await hook('build:pre', index);
|
|
205
340
|
|
|
206
|
-
|
|
207
|
-
|
|
341
|
+
// Run packageRaw
|
|
342
|
+
await packageRaw();
|
|
208
343
|
|
|
209
|
-
|
|
210
|
-
|
|
344
|
+
// Run packageZip
|
|
345
|
+
await packageZip();
|
|
211
346
|
|
|
212
|
-
|
|
213
|
-
|
|
347
|
+
// Run build:post hook
|
|
348
|
+
await hook('build:post', index);
|
|
349
|
+
|
|
350
|
+
// Run liveReload
|
|
351
|
+
liveReload();
|
|
352
|
+
|
|
353
|
+
// Log
|
|
354
|
+
logger.log('Finished!');
|
|
355
|
+
|
|
356
|
+
// Complete
|
|
357
|
+
return complete();
|
|
358
|
+
} catch (error) {
|
|
359
|
+
// Handle any errors that occur during package build
|
|
360
|
+
return Manager.reportBuildError(Object.assign(error, { plugin: 'Package' }), complete);
|
|
361
|
+
}
|
|
214
362
|
}
|
|
215
363
|
|
|
216
364
|
// Watcher Task
|
|
@@ -225,7 +373,7 @@ function packageFnWatcher(complete) {
|
|
|
225
373
|
logger.log('[watcher] Watching for changes...');
|
|
226
374
|
|
|
227
375
|
// Watch for changes in the dist folder
|
|
228
|
-
watch(input, { delay: delay }, packageFn)
|
|
376
|
+
watch(input, { delay: delay, dot: true }, packageFn)
|
|
229
377
|
.on('change', function (path) {
|
|
230
378
|
logger.log(`[watcher] File ${path} was changed`);
|
|
231
379
|
});
|
|
@@ -237,6 +385,39 @@ function packageFnWatcher(complete) {
|
|
|
237
385
|
// Export tasks
|
|
238
386
|
module.exports = series(packageFn, packageFnWatcher);
|
|
239
387
|
|
|
388
|
+
// Run hooks
|
|
389
|
+
async function hook(file, index) {
|
|
390
|
+
// Full path
|
|
391
|
+
const fullPath = path.join(process.cwd(), 'hooks', `${file}.js`);
|
|
392
|
+
|
|
393
|
+
// Log
|
|
394
|
+
// logger.log(`Loading hook: ${fullPath}`);
|
|
395
|
+
|
|
396
|
+
// Check if it exists
|
|
397
|
+
if (!jetpack.exists(fullPath)) {
|
|
398
|
+
return console.warn(`Hook not found: ${fullPath}`);
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
// Log
|
|
402
|
+
logger.log(`Running hook: ${fullPath}`);
|
|
403
|
+
|
|
404
|
+
// Load hook
|
|
405
|
+
let hook;
|
|
406
|
+
try {
|
|
407
|
+
// Load the hook
|
|
408
|
+
hook = require(fullPath);
|
|
409
|
+
} catch (e) {
|
|
410
|
+
throw new Error(`Error loading hook: ${fullPath} ${e.stack}`);
|
|
411
|
+
}
|
|
412
|
+
|
|
413
|
+
// Execute hook
|
|
414
|
+
try {
|
|
415
|
+
return await hook(index);
|
|
416
|
+
} catch (e) {
|
|
417
|
+
throw new Error(`Error running hook: ${fullPath} ${e.stack}`);
|
|
418
|
+
}
|
|
419
|
+
}
|
|
420
|
+
|
|
240
421
|
// Get redactions
|
|
241
422
|
function getRedactions() {
|
|
242
423
|
const REDACTED = './REDACTED_REMOTE_CODE';
|
package/dist/gulp/tasks/sass.js
CHANGED
|
@@ -2,74 +2,180 @@
|
|
|
2
2
|
const Manager = new (require('../../build.js'));
|
|
3
3
|
const logger = Manager.logger('sass');
|
|
4
4
|
const { src, dest, watch, series } = require('gulp');
|
|
5
|
+
const glob = require('glob').globSync;
|
|
5
6
|
const path = require('path');
|
|
7
|
+
const jetpack = require('fs-jetpack');
|
|
6
8
|
const compiler = require('gulp-sass')(require('sass'));
|
|
7
9
|
const cleanCSS = require('gulp-clean-css');
|
|
8
10
|
const rename = require('gulp-rename');
|
|
11
|
+
const filter = require('gulp-filter').default;
|
|
9
12
|
|
|
10
13
|
// Load package
|
|
11
14
|
const package = Manager.getPackage('main');
|
|
12
15
|
const project = Manager.getPackage('project');
|
|
16
|
+
const config = Manager.getConfig('project');
|
|
13
17
|
const rootPathPackage = Manager.getRootPath('main');
|
|
14
18
|
const rootPathProject = Manager.getRootPath('project');
|
|
15
19
|
|
|
20
|
+
// Define bundle files separately for easier tracking
|
|
21
|
+
const bundleFiles = [
|
|
22
|
+
// Main bundles (if any exist in bundles/ directory)
|
|
23
|
+
`${rootPathPackage}/dist/assets/css/bundles/*.scss`,
|
|
24
|
+
|
|
25
|
+
// Project bundles
|
|
26
|
+
'src/assets/css/bundles/*.scss',
|
|
27
|
+
];
|
|
28
|
+
|
|
16
29
|
// Glob
|
|
17
30
|
const input = [
|
|
18
|
-
//
|
|
19
|
-
|
|
31
|
+
// Bundle files (if any exist)
|
|
32
|
+
...bundleFiles,
|
|
20
33
|
|
|
21
|
-
//
|
|
22
|
-
|
|
34
|
+
// Project entry point (main.scss)
|
|
35
|
+
'src/assets/css/main.scss',
|
|
23
36
|
|
|
24
|
-
//
|
|
25
|
-
|
|
37
|
+
// Component-specific CSS
|
|
38
|
+
`${rootPathPackage}/dist/assets/css/components/**/*.scss`,
|
|
39
|
+
'src/assets/css/components/**/*.scss',
|
|
26
40
|
];
|
|
41
|
+
|
|
42
|
+
// Additional files to watch (but not compile as entry points)
|
|
43
|
+
const watchInput = [
|
|
44
|
+
// Watch the paths we're compiling
|
|
45
|
+
...input,
|
|
46
|
+
|
|
47
|
+
// Core CSS - watch for changes but don't compile as entry points
|
|
48
|
+
`${rootPathPackage}/dist/assets/css/**/*.scss`,
|
|
49
|
+
|
|
50
|
+
// Theme CSS - watch for changes but don't compile as entry points
|
|
51
|
+
`${rootPathPackage}/dist/assets/themes/**/*.scss`,
|
|
52
|
+
'src/assets/themes/**/*.scss',
|
|
53
|
+
];
|
|
54
|
+
|
|
27
55
|
const output = 'dist/assets/css';
|
|
28
56
|
const delay = 250;
|
|
57
|
+
const compiled = {};
|
|
58
|
+
|
|
59
|
+
// Configuration
|
|
60
|
+
const MAIN_BUNDLE_COMPONENT_PARTIALS = false; // Set to true to merge components into _component-specific.scss, false to compile separately
|
|
29
61
|
|
|
30
62
|
// SASS Compilation Task
|
|
31
63
|
function sass(complete) {
|
|
32
64
|
// Log
|
|
33
65
|
logger.log('Starting...');
|
|
66
|
+
Manager.logMemory(logger, 'Start');
|
|
67
|
+
|
|
68
|
+
// Generate component-specific scss
|
|
69
|
+
generateComponentScss();
|
|
34
70
|
|
|
35
71
|
// Compile
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
//
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
72
|
+
let stream = src(input, { sourcemaps: true })
|
|
73
|
+
// Skip files based on configuration
|
|
74
|
+
.pipe(filter(file => !shouldSkip(file.path), { restore: true }))
|
|
75
|
+
// Compile SASS
|
|
76
|
+
.pipe(compiler({
|
|
77
|
+
loadPaths: [
|
|
78
|
+
// So we can use "@use 'browser-extension-manager' as *;"
|
|
79
|
+
path.resolve(rootPathPackage, 'dist/assets/css'),
|
|
80
|
+
|
|
81
|
+
// So we can use "@use 'theme' as *;" which resolves to the active theme
|
|
82
|
+
path.resolve(rootPathPackage, 'dist/assets/themes', config.theme?.id || 'classy'),
|
|
83
|
+
|
|
84
|
+
// So we can load _component-specific.scss from the project's dist
|
|
85
|
+
path.resolve(rootPathProject, 'dist/assets/css'),
|
|
86
|
+
|
|
87
|
+
// Allow importing from node_modules (e.g., @import '@fortawesome/fontawesome-free/css/all.min.css')
|
|
88
|
+
path.resolve(rootPathProject, 'node_modules'),
|
|
89
|
+
],
|
|
90
|
+
// Suppress deprecation warnings
|
|
91
|
+
quietDeps: true,
|
|
92
|
+
// Only show warnings once
|
|
93
|
+
verbose: false
|
|
94
|
+
})
|
|
95
|
+
.on('error', (error) => Manager.reportBuildError(Object.assign(error, { plugin: 'SASS' }), complete)));
|
|
96
|
+
|
|
97
|
+
// Process
|
|
98
|
+
return stream
|
|
99
|
+
.pipe(cleanCSS({
|
|
100
|
+
format: Manager.actLikeProduction() ? 'compressed' : 'beautify',
|
|
101
|
+
}))
|
|
102
|
+
.pipe(rename((file) => {
|
|
103
|
+
// Get list of expected bundle names from the bundle files glob
|
|
104
|
+
// These are files that should be in the root CSS directory
|
|
105
|
+
let bundleFilesFound = [];
|
|
106
|
+
try {
|
|
107
|
+
bundleFilesFound = glob(bundleFiles);
|
|
108
|
+
} catch (e) {
|
|
109
|
+
// Directory doesn't exist, that's ok
|
|
110
|
+
}
|
|
111
|
+
const bundleNames = bundleFilesFound.map(f => path.basename(f, '.scss'));
|
|
112
|
+
bundleNames.push('main'); // main.scss is always a root bundle
|
|
113
|
+
|
|
114
|
+
// Check if this is a root-level bundle
|
|
115
|
+
const baseName = file.basename;
|
|
116
|
+
const isBundle = bundleNames.includes(baseName);
|
|
117
|
+
|
|
118
|
+
// Check
|
|
119
|
+
if (isBundle) {
|
|
120
|
+
// Root-level bundles (main, or any future bundle in bundles/ directory)
|
|
121
|
+
// Keep in root directory
|
|
122
|
+
file.dirname = '.';
|
|
123
|
+
} else {
|
|
124
|
+
// Component files: special handling for pages vs other components
|
|
125
|
+
//
|
|
126
|
+
// ⚠️ CRITICAL: The 'pages' directory is treated differently!
|
|
127
|
+
//
|
|
128
|
+
// Pages directory can have MULTIPLE files (index, pricing, login, etc.)
|
|
129
|
+
// - pages/index.scss → components/pages/index.bundle.css ✓
|
|
130
|
+
// - pages/pricing.scss → components/pages/pricing.bundle.css ✓
|
|
131
|
+
// - pages/login.scss → components/pages/login.bundle.css ✓
|
|
132
|
+
//
|
|
133
|
+
// Other components only have ONE file (index.html), so we strip /index:
|
|
134
|
+
// - popup/index.scss → components/popup.bundle.css ✓
|
|
135
|
+
// - options/index.scss → components/options.bundle.css ✓
|
|
136
|
+
// - sidepanel/index.scss → components/sidepanel.bundle.css ✓
|
|
137
|
+
//
|
|
138
|
+
// ❌ DO NOT GENERATE: components/pages.bundle.css
|
|
139
|
+
// ✓ DO GENERATE: components/pages/index.bundle.css, components/pages/pricing.bundle.css, etc.
|
|
140
|
+
|
|
141
|
+
const isInPages = file.dirname.includes(path.sep + 'pages' + path.sep)
|
|
142
|
+
|| file.dirname.endsWith(path.sep + 'pages')
|
|
143
|
+
|| file.dirname === 'pages';
|
|
144
|
+
|
|
145
|
+
if (file.basename === 'index' && !isInPages) {
|
|
146
|
+
// For non-pages components: strip /index
|
|
147
|
+
// components/popup/index.scss -> components/popup.bundle.css
|
|
148
|
+
const parts = file.dirname.split(path.sep);
|
|
149
|
+
const parentDir = parts[parts.length - 1];
|
|
150
|
+
file.basename = parentDir;
|
|
151
|
+
parts.pop();
|
|
152
|
+
file.dirname = parts.join(path.sep);
|
|
153
|
+
}
|
|
154
|
+
// For pages or non-index files: keep full path
|
|
155
|
+
// components/pages/index.scss -> components/pages/index.bundle.css
|
|
156
|
+
// components/pages/pricing.scss -> components/pages/pricing.bundle.css
|
|
157
|
+
|
|
158
|
+
// Add components/ prefix if not already there
|
|
159
|
+
if (!file.dirname.startsWith('components/') && !file.dirname.startsWith('components\\')) {
|
|
160
|
+
file.dirname = `components/${file.dirname}`;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Add bundle to the name
|
|
165
|
+
file.basename += '.bundle';
|
|
166
|
+
|
|
167
|
+
// Track the full output path
|
|
168
|
+
const fullPath = path.resolve(output, file.dirname, `${file.basename}${file.extname}`);
|
|
169
|
+
compiled[fullPath] = true;
|
|
67
170
|
}))
|
|
68
|
-
.pipe(dest(output))
|
|
69
|
-
.on('
|
|
171
|
+
.pipe(dest(output, { sourcemaps: '.' }))
|
|
172
|
+
.on('finish', () => {
|
|
70
173
|
// Log
|
|
71
174
|
logger.log('Finished!');
|
|
72
175
|
|
|
176
|
+
// Trigger rebuild
|
|
177
|
+
Manager.triggerRebuild(compiled);
|
|
178
|
+
|
|
73
179
|
// Complete
|
|
74
180
|
return complete();
|
|
75
181
|
});
|
|
@@ -87,14 +193,53 @@ function sassWatcher(complete) {
|
|
|
87
193
|
logger.log('[watcher] Watching for changes...');
|
|
88
194
|
|
|
89
195
|
// Watch for changes
|
|
90
|
-
watch(
|
|
91
|
-
.on('change',
|
|
92
|
-
logger.log(`[watcher] File ${path}
|
|
196
|
+
watch(watchInput, { delay: delay, dot: true }, sass)
|
|
197
|
+
.on('change', (path) => {
|
|
198
|
+
logger.log(`[watcher] File changed (${path})`);
|
|
93
199
|
});
|
|
94
200
|
|
|
95
201
|
// Complete
|
|
96
202
|
return complete();
|
|
97
203
|
}
|
|
98
204
|
|
|
205
|
+
function generateComponentScss() {
|
|
206
|
+
// Only generate _component-specific.scss if we're skipping component partials
|
|
207
|
+
if (!MAIN_BUNDLE_COMPONENT_PARTIALS) {
|
|
208
|
+
// When compiling components separately, create an empty file with a comment
|
|
209
|
+
const outputPath = path.resolve(rootPathProject, 'dist/assets/css/_component-specific.scss');
|
|
210
|
+
const content = `/*
|
|
211
|
+
AUTO-GENERATED COMPONENT-SPECIFIC SCSS
|
|
212
|
+
Components are now compiled separately when MAIN_BUNDLE_COMPONENT_PARTIALS = false
|
|
213
|
+
Find compiled component CSS in dist/assets/css/components/
|
|
214
|
+
*/
|
|
215
|
+
|
|
216
|
+
`;
|
|
217
|
+
|
|
218
|
+
jetpack.write(outputPath, content);
|
|
219
|
+
Manager.triggerRebuild(outputPath);
|
|
220
|
+
return;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
// TODO: Implement merged component partials if needed in the future
|
|
224
|
+
// This would be similar to UJ's page-specific merging
|
|
225
|
+
logger.log('Merged component partials not yet implemented');
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
function isComponentPartial(file) {
|
|
229
|
+
return file.includes('/assets/css/components/') && file.endsWith('index.scss');
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
function shouldSkip(file) {
|
|
233
|
+
// Skip component partials only if MAIN_BUNDLE_COMPONENT_PARTIALS is true
|
|
234
|
+
if (MAIN_BUNDLE_COMPONENT_PARTIALS && isComponentPartial(file)) {
|
|
235
|
+
return true;
|
|
236
|
+
}
|
|
237
|
+
return false;
|
|
238
|
+
}
|
|
239
|
+
|
|
99
240
|
// Default Task
|
|
100
|
-
|
|
241
|
+
// Export
|
|
242
|
+
module.exports = series(
|
|
243
|
+
sass,
|
|
244
|
+
sassWatcher
|
|
245
|
+
);
|
package/dist/gulp/tasks/serve.js
CHANGED
|
@@ -7,6 +7,7 @@ const WebSocket = require('ws');
|
|
|
7
7
|
// Load package
|
|
8
8
|
const package = Manager.getPackage('main');
|
|
9
9
|
const project = Manager.getPackage('project');
|
|
10
|
+
const config = Manager.getConfig('project');
|
|
10
11
|
const rootPathPackage = Manager.getRootPath('main');
|
|
11
12
|
const rootPathProject = Manager.getRootPath('project');
|
|
12
13
|
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
// Libraries
|
|
2
|
+
const through2 = require('through2');
|
|
3
|
+
const { template } = require('node-powertools');
|
|
4
|
+
const path = require('path');
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Creates a through2 transform stream that processes template variables in files
|
|
8
|
+
**/
|
|
9
|
+
function createTemplateTransform(data) {
|
|
10
|
+
const extensions = ['html', 'md', 'liquid', 'json']
|
|
11
|
+
|
|
12
|
+
return through2.obj(function(file, encoding, callback) {
|
|
13
|
+
// Skip directories
|
|
14
|
+
if (file.isDirectory()) {
|
|
15
|
+
return callback(null, file);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
// Check if file extension matches
|
|
19
|
+
const ext = path.extname(file.path).toLowerCase().slice(1);
|
|
20
|
+
if (!extensions.includes(ext)) {
|
|
21
|
+
return callback(null, file);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
// Log
|
|
25
|
+
// console.log(`Processing file: ${file.path}`);
|
|
26
|
+
|
|
27
|
+
// Process the file contents
|
|
28
|
+
try {
|
|
29
|
+
const contents = file.contents.toString();
|
|
30
|
+
|
|
31
|
+
// Process templates
|
|
32
|
+
const templated = template(contents, data, {
|
|
33
|
+
brackets: ['[', ']'],
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
// Update file contents if changed
|
|
37
|
+
if (contents !== templated) {
|
|
38
|
+
file.contents = Buffer.from(templated);
|
|
39
|
+
const relativePath = file.relative || file.path;
|
|
40
|
+
}
|
|
41
|
+
} catch (error) {
|
|
42
|
+
console.error(`Error processing templates in ${file.path}:`, error);
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Pass the file through
|
|
46
|
+
callback(null, file);
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
module.exports = createTemplateTransform;
|