webpack-run-chrome-extension
Version:
Run your extension on Google Chrome with auto-reload support
15 lines (11 loc) • 16.6 kB
JavaScript
;var $e=Object.create;var x=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Re=Object.getOwnPropertyNames;var je=Object.getPrototypeOf,Me=Object.prototype.hasOwnProperty;var De=(r,e)=>{for(var t in e)x(r,t,{get:e[t],enumerable:!0})},H=(r,e,t,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let o of Re(e))!Me.call(r,o)&&o!==t&&x(r,o,{get:()=>e[o],enumerable:!(s=Pe(e,o))||s.enumerable});return r};var c=(r,e,t)=>(t=r!=null?$e(je(r)):{},H(e||!r||!r.__esModule?x(t,"default",{value:r,enumerable:!0}):t,r)),Ie=r=>H(x({},"__esModule",{value:!0}),r);var Ge={};De(Ge,{default:()=>C});module.exports=Ie(Ge);var g=c(require("path"));var K=c(require("path")),Z=c(require("ws")),k=c(require("browser-extension-manifest-fields"));function w(r,e){r.clients.forEach(t=>{t.readyState===Z.default.OPEN&&t.send(JSON.stringify(e))})}function R(r,e,t){if(!t||!e.manifestPath)return;let s=(0,k.default)(e.manifestPath).locales,o=(0,k.default)(e.manifestPath).scripts,i=(0,k.default)(e.manifestPath).json;K.default.basename(t)==="manifest.json"&&w(r,{changedFile:"manifest.json"}),s?.forEach(a=>{a.includes(t)&&w(r,{changedFile:"_locales"})}),Object.entries(o).forEach(([a,f])=>{let h=Array.isArray(f)?f:[f];Object.values(h).flatMap($=>$).includes(t)&&a==="background/service_worker"&&w(r,{changedFile:"service_worker"})}),Object.entries(i).forEach(([a,f])=>{f?.includes(t)&&a==="declarative_net_request"&&w(r,{changedFile:"declarative_net_request"})})}var se=c(require("ws"));var ee=c(require("path")),l=require("console"),n=require("@colors/colors/safe");var j=c(require("fs")),Q=c(require("path"));function Y(r){let e=0,t=j.default.readdirSync(r);for(let s of t){let o=Q.default.join(r,s),i=j.default.statSync(o);i.isFile()?e+=i.size:i.isDirectory()&&(e+=Y(o))}return e}function M(r){let e=Y(r),t=["Bytes","KB","MB","GB","TB"],s=Math.floor(Math.log(e)/Math.log(1024));return`${(e/Math.pow(1024,s)).toFixed(1)} ${t[s]}`}function Fe(r,e){let t=`Check the ${(0,n.bold)(r)} field in your manifest.json file and try again.`;return`[manifest.json] File path ${(0,n.underline)(e)} not found. ${t}`}function Be(){(0,l.log)(`
${(0,n.bold)("Error! Can't find the project's manifest file.")}
Check your extension ${(0,n.yellow)("manifest.json")} file and ensure its path points to
one of the options above, and try again.
`)}function Ne(r,e,t){e.data||((0,l.error)(`[\u26D4\uFE0F] ${(0,n.bgWhite)((0,n.bold)(" chrome-browser "))} ${(0,n.red)("\u2716\uFE0E\u2716\uFE0E\u2716\uFE0E")} No data received from client.
Ensure your extension is enabled and that no hanging Chrome instance is open then try again.`),process.exit(1));let s=r.options,{id:o,management:i}=e.data;i||process.env.EXTENSION_ENV==="development"&&(0,l.error)(`[\u26D4\uFE0F] ${(0,n.bgWhite)((0,n.bold)(" chrome-browser "))} ${(0,n.green)("\u25BA\u25BA\u25BA")} No management API info received from client. Investigate.`);let{name:a,description:f,version:h,hostPermissions:d,permissions:$}=i,ke=ee.default.join(s.context||"","manifest.json"),X=require(ke),ve=X.permissions||[],Ee=($||[]).map(P=>ve.includes(P)?P:`${P} (dev only)`),Se=X.id===o,Ce=d&&d.length;(0,l.log)(""),(0,l.log)(`${(0,n.bold)("\u2022 Name:")} ${a}`),f&&(0,l.log)(`${(0,n.bold)("\u2022 Description:")} ${f}`),(0,l.log)(`${(0,n.bold)("\u2022 Version:")} ${h}`),(0,l.log)(`${(0,n.bold)("\u2022 Size:")} ${M(s.output.path||"dist")}`),(0,l.log)(`${(0,n.bold)("\u2022 ID:")} ${o} (${Se?"permantent":"temporary"})`),Ce&&(0,l.log)(`${(0,n.bold)("\u2022 Host Permissions")}: ${d.sort().join(", ")}`),(0,l.log)(`${(0,n.bold)("\u2022 Permissions:")} ${Ee.sort().join(", ")}`||"Browser defaults"),(0,l.log)(`${(0,n.bold)("\u2022 Settings URL")}: ${(0,n.underline)((0,n.blue)(`chrome://extensions/?id=${o}`))}
`)}function Ae(r,e){let t=r.options,s=e.data?.management,o=(0,n.bgWhite)((0,n.black)((0,n.bold)(" chrome-browser "))),i=t.mode==="production"?n.magenta:n.cyan;(0,l.log)(`${o} ${(0,n.green)("\u25BA\u25BA\u25BA")} Running Chrome in ${(0,n.bold)(i(t.mode||"unknown"))} mode. Browser ${s?.type} ${(0,n.bold)(s?.enabled?"enabled":"disabled")}.`)}function We(){(0,l.log)(""),(0,l.log)(`This is your first run using ${(0,n.bold)("Extension.js")}. Welcome! \u{1F389}`),(0,l.log)(`
\u{1F9E9} Learn more at ${(0,n.blue)((0,n.underline)("https://extension.js.org"))}`)}function Oe(r,e){let t=e.toString();(0,l.log)(`[\u{1F613}] ${(0,n.bgWhite)((0,n.bold)(" chrome-browser "))} ${(0,n.red)("\u2716\uFE0E\u2716\uFE0E\u2716\uFE0E")} Watch mode closed (code ${r}). ${t&&`
Reason `+t+`
`}Exiting...
`)}function Te(r){(0,l.error)(`${(0,n.bgWhite)((0,n.bold)(" chrome-browser "))} ${(0,n.red)("\u2716\uFE0E\u2716\uFE0E\u2716\uFE0E")} Chrome not found at ${r}`)}function ze(r){r(`[\u26D4\uFE0F] ${(0,n.bgWhite)((0,n.bold)(" chrome-browser "))} ${(0,n.red)("\u2716\uFE0E\u2716\uFE0E\u2716\uFE0E")} WebSocket error`,r)}function Ue(r,e){r(`[\u26D4\uFE0F] ${(0,n.bgWhite)((0,n.bold)(" chrome-browser "))} ${(0,n.red)("\u2716\uFE0E\u2716\uFE0E\u2716\uFE0E")} Error parsing file: ${e}. Reason: ${r.message}`)}var p={manifestFieldError:Fe,manifestNotFound:Be,extensionData:Ne,stdoutData:Ae,isFirstRun:We,watchModeClosed:Oe,browserNotFound:Te,webSocketError:ze,parseFileError:Ue};var te=c(require("path")),re=c(require("fs"));function D(){return!re.default.existsSync(te.default.resolve(__dirname,"run-chrome-data-dir"))}function ne(r,e,t){let s=new se.default.Server({host:"localhost",port:t}),o=D();return s.on("connection",i=>{i.send(JSON.stringify({status:"serverReady"})),i.on("error",a=>{p.webSocketError(a),s.close()}),i.on("close",()=>{s.close()}),i.on("message",a=>{let f=JSON.parse(a.toString());f.status==="clientReady"&&(e===!0&&p.extensionData(r,f,o),p.stdoutData(r,f),e===!0&&o&&setTimeout(()=>{p.isFirstRun()},2500))})}),s}var oe=c(require("path")),I=c(require("fs"));function F(r){let e=oe.default.resolve(__dirname,"./extensions/reload-extension/reloadService.js");I.default.readFile(e,"utf8",(t,s)=>{if(t){console.error(`Error reading file: ${t.message}`);return}let o=s.replace(/__RELOAD_PORT__/g,r.toString());I.default.writeFile(e,o,"utf8",i=>{i&&console.error(`Error writing to file: ${i.message}`)})})}var b=class{options;constructor(e){this.options=e}apply(e){if(!this.options.manifestPath)return;F(this.options.port||8e3);let t=this.options.stats,s=ne(e,t,this.options.port);e.hooks.watchRun.tapAsync("RunChromeExtensionPlugin (CreateWebSocketServer)",(o,i)=>{let f=(o.modifiedFiles||new Set).values().next().value;if(!f){i();return}let h=g.default.relative(g.default.dirname(this.options.manifestPath||""),f),d=g.default.relative(process.cwd(),g.default.dirname(f));process.env.EXTENSION_ENV==="development"&&console.info(`\u25BA\u25BA Updated file \`${h}\` (relative to ${d})`),this.options.manifestPath&&R(s,this.options,f),i()})}};var v=require("webpack");var B=c(require("content-security-policy-parser"));function ie(r){let e=r.content_security_policy;if(!e)return"script-src 'self' 'unsafe-eval' blob: filesystem:; object-src 'self' blob: filesystem:; ";let t=(0,B.default)(e);e="",t.get("script-src")||t.set("script-src",["'self' 'unsafe-eval' blob: filesystem:"]),t.get("script-src")?.includes("'unsafe-eval'")||t.set("script-src",["unsafe-eval"]);for(let s in t)e+=`${s} ${t.get(s)?.join(" ")};`;return e}function ae(r){let e=r.content_security_policy;if(!e)return{extension_pages:"script-src 'self'; object-src 'self'; "};let t=(0,B.default)(e.extension_pages),s="";for(let o in t)s+=`${o} ${t.get(o)?.join(" ")}; `;return{extension_pages:s.trim()}}function ce(r){let e=["/*.json","/*.js","/*.css"],t=r.web_accessible_resources;if(!t||t.length===0)return e;let s=new Set(t);for(let o of e)s.add(o);return Array.from(s)}function fe(r){let e=["/*.json","/*.js","/*.css"],t=r.web_accessible_resources;return!t||t.length===0?[{resources:e,matches:["<all_urls>"]}]:t.map(o=>{let i=new Set(o.resources);return e.forEach(a=>{o&&o.resources&&(o.resources.includes(a)||i.add(a))}),{...o,resources:Array.from(i)}})}function N(r){return r.background?{background:{...r.background}}:r.manifest_version===2?{background:{...r.background,scripts:["background/script.js"]}}:{background:{...r.background,service_worker:"background/service_worker.js"}}}function A(r){return r.externally_connectable&&!r.externally_connectable.ids?{externally_connectable:{...r.externally_connectable,ids:[...new Set(r.externally_connectable.ids||[]),"*"]}}:r.externally_connectable&&!r.externally_connectable.ids?{externally_connectable:{...r.externally_connectable,ids:["*"]}}:{}}function le(r,e){if(r.getAsset("manifest.json")||r.assets["manifest.json"]){let t=r.assets["manifest.json"].source().toString();return JSON.parse(t||"{}")}return require(e)}var W=class{manifestPath;constructor(e){this.manifestPath=e.manifestPath}generateManifestPatches(e){let t=le(e,this.manifestPath),s={...t,content_security_policy:t.manifest_version===3?ae(t):ie(t),...t.manifest_version===3?t.permissions?{permissions:[...new Set(["scripting",...t.permissions])]}:{permissions:["scripting"]}:{},...N(t),...A(t),web_accessible_resources:t.manifest_version===3?fe(t):ce(t)},o=JSON.stringify(s,null,2),i=new v.sources.RawSource(o);e.getAsset("manifest.json")&&e.updateAsset("manifest.json",i)}apply(e){e.hooks.thisCompilation.tap("RunChromeExtension (ApplyManifestDevDefaults)",t=>{let s=e.webpack.WebpackError;t.hooks.processAssets.tap({name:"RunChromeExtension (ApplyManifestDevDefaults)",stage:v.Compilation.PROCESS_ASSETS_STAGE_SUMMARIZE},o=>{if(!this.manifestPath){let i="No manifest.json found in your extension bundle. Unable to patch manifest.json.";t&&s&&t.errors.push(new s(`[RunChromeExtension (ApplyManifestDevDefaults)]: ${i}`));return}this.generateManifestPatches(t)})})}},me=W;var O=c(require("fs")),_=c(require("path")),pe=c(require("webpack-target-webextension")),E=require("@colors/colors/safe");var T=class{manifestPath;constructor(e){this.manifestPath=e.manifestPath}handleBackground(e,t){let s=_.default.resolve(__dirname,"minimum-background-file.mjs"),o=_.default.dirname(this.manifestPath),i=t.background;if(t.manifest_version===3){let a=i&&i.service_worker;if(a){let f=_.default.join(o,a);this.ensureFileExists(f,"background.service_worker")}else this.addDefaultEntry(e,"background/service_worker",s)}else if(t.manifest_version===2){let a=i&&i.scripts;if(a&&a.length>0){let f=_.default.join(o,a[0]);this.ensureFileExists(f,"background.scripts")}else this.addDefaultEntry(e,"background/script",s)}}ensureFileExists(e,t){if(!O.default.existsSync(e)){let s=p.manifestFieldError(t,e);throw console.error((0,E.red)((0,E.bold)(s))),new Error(s)}}addDefaultEntry(e,t,s){e.options.entry={...e.options.entry,[t]:{import:[s]}}}getEntryName(e){if(e.background){if(e.manifest_version===3)return{serviceWorkerEntry:"background/service_worker"};if(e.manifest_version===2)return{pageEntry:"background/script"}}return{pageEntry:"background"}}apply(e){if(!this.manifestPath||!O.default.lstatSync(this.manifestPath).isFile())return;let t=require(this.manifestPath);this.handleBackground(e,t),new pe.default({background:this.getEntryName(t),weakRuntimeCheck:!0}).apply(e)}},ue=T;var de=c(require("path"));function z(r,e){r.options.module.rules.push({test:/\.(t|j)sx?$/,use:[{loader:de.default.resolve(__dirname,"./loaders/InjectBackgroundRuntimeLoader"),options:{manifestPath:e}}]})}var U=class{manifestPath;constructor(e){this.manifestPath=e.manifestPath}apply(e){z(e,this.manifestPath),new me({manifestPath:this.manifestPath}).apply(e),new ue({manifestPath:this.manifestPath}).apply(e)}},he=U;var G=c(require("fs")),ye=c(require("path")),xe=require("child_process"),m=require("@colors/colors/safe"),we=c(require("chrome-location"));var J=c(require("path"));var u=c(require("path")),S=c(require("fs")),_e=require("@colors/colors/safe");var ge=c(require("progress"));function V(r,e){let s=new ge.default(`${r} [:bar] :percent :etas`,{complete:"=",incomplete:" ",width:50,total:131072}),o=setInterval(()=>{let i=Math.random()*10*1024;s.tick(i),s.complete&&(clearInterval(o),e())},50)}var Le={alternate_error_pages:{enabled:!1},autofill:{enabled:!1},browser:{check_default_browser:!1,default_browser_setting_enabled:!1},default_apps:"install",distribution:{alternate_shortcut_text:!1,auto_launch_chrome:!1,import_bookmarks:!1,import_history:!1,import_home_page:!1,import_search_engine:!1,suppress_first_run_bubble:!0,do_not_register_for_update_launch:!0,make_chrome_default:!1,make_chrome_default_for_user:!1,require_eula:!1,suppress_first_run_default_browser_prompt:!0},dns_prefetching:{enabled:!1},download:{default_directory:"/tmp/",directory_upgrade:!0,open_pdf_in_adobe_reader:!1,prompt_for_download:!0},enable_do_not_track:!0,extensions:{theme:{use_system:!1},toolbarsize:-1,ui:{developer_mode:!0}},plugins:{plugins_list:[{enabled:!1,name:"Java(TM)"}],show_details:!0},profile:{password_manager_enabled:!1},safebrowsing:{enabled:!1,safebrowsingextended_reporting_enabled:!1},savefile:{default_directory:"/tmp",type:0},search:{suggest_enabled:!1},session:{restore_on_startup:1},sync:{suppress_start:!0},sync_promo:{show_on_first_run_allowed:!1,show_ntp_bubble:!1},translate:{enabled:!1}},be=Le;function L(r,e){if(r||S.default.existsSync(u.default.resolve(__dirname,"run-chrome-data-dir")))return r||u.default.resolve(__dirname,"run-chrome-data-dir");let t=JSON.stringify(be);return e||V(`\u{1F464} Creating ${(0,_e.bold)("Chrome")} user data directory...`,()=>{let s=u.default.resolve(__dirname,"run-chrome-data-dir"),o=u.default.join(s,"Default");S.default.mkdirSync(o,{recursive:!0});let i=u.default.join(o,"Preferences");S.default.writeFileSync(i,t,"utf8")}),u.default.resolve(__dirname,"run-chrome-data-dir")}var Je=J.default.resolve(__dirname,"extensions","manager-extension"),qe=J.default.resolve(__dirname,"extensions","reload-extension");function q(r,e){let s=[e.extensionPath?.replace("manifest.json","")];return r.options.mode==="development"&&e.autoReload&&s.push(qe),r.options.mode==="development"&&s.push(Je),[`--load-extension=${s.join()}`,`--user-data-dir=${L(e.userDataDir)}`,"--no-first-run","--disable-client-side-phishing-detection","--disable-component-extensions-with-background-pages","--disable-default-apps","--disable-features=InterestFeedContentSuggestions","--disable-features=Translate","--hide-scrollbars","--mute-audio","--no-default-browser-check","--no-first-run","--ash-no-nudges","--disable-search-engine-choice-screen","--propagate-iph-for-testing","--disable-features=MediaRoute","--use-mock-keychain","--disable-background-networking","--disable-breakpad","--disable-component-update","--disable-domain-reliability","--disable-features=AutofillServerCommunicatio","--disable-features=CertificateTransparencyComponentUpdate","--disable-sync","--enable-crash-reporter-for-testing","--metrics-recording-only","--disable-features=OptimizationHints","--disable-features=DialMediaRouteProvider","--no-pings","--enable-features=SidePanelUpdates",...e.browserFlags||[]]}process.on("SIGINT",()=>{process.exit()});process.on("SIGTERM",()=>{process.exit()});var y=class{options;constructor(e){this.options=e}launchChrome(e){let t=we.default;G.default.existsSync(ye.default.resolve(t))||(console.error(`${(0,m.bgWhite)((0,m.black)((0,m.bold)(" chrome-browser ")))} ${(0,m.red)("\u2716\uFE0E\u2716\uFE0E\u2716\uFE0E")} Chrome not found at ${t}`),process.exit()),G.default.existsSync(t)||(console.error(`${(0,m.bgWhite)((0,m.black)((0,m.bold)(" chrome-browser ")))} ${(0,m.red)("\u2716\uFE0E\u2716\uFE0E\u2716\uFE0E")} Chrome browser ${typeof t>"u"?"is not installed.":`is not found at ${t}`}. Either install Chrome or choose a different browser via ${(0,m.blue)("--browser")}.`),process.exit());let s=q(e,this.options),o=this.options.startingUrl?[this.options.startingUrl,...s]:[...s],i=process.env.EXTENSION_ENV==="development"?"inherit":"ignore",a=(0,xe.spawn)(t,o,{stdio:i});process.env.EXTENSION_ENV==="development"&&(a.stdout?.pipe(process.stdout),a.stderr?.pipe(process.stderr))}apply(e){let t=!1;e.hooks.afterEmit.tapAsync("RunChromeExtensionPlugin (ChromeExtensionLauncher)",(s,o)=>{if(s.errors.length>0){o();return}if(t){o();return}this.launchChrome(e),t=!0,o()})}};var C=class{options;constructor(e){this.options={manifestPath:e.manifestPath,extensionPath:e.extensionPath,port:e.port||8e3,browserFlags:e.browserFlags||[],userDataDir:e.userDataDir,startingUrl:e.startingUrl,autoReload:e.autoReload!=null?e.autoReload:!0,stats:e.stats!=null?e.stats:!0}}apply(e){e.options.mode==="development"&&new b(this.options).apply(e),e.options.mode==="development"&&new he(this.options).apply(e),new y(this.options).apply(e)}};