From 73994992f1d94128b498a11fb2df9dcbef9fe868 Mon Sep 17 00:00:00 2001 From: Rodney Folz Date: Sun, 17 Jun 2012 12:32:47 +1000 Subject: [PATCH] Initial commit of reaction-packs extension. --- .babelrc | 4 + .gitignore | 42 ++++ CHANGELOG.md | 5 + LICENSE | 3 + MPL-2.0 | 362 ++++++++++++++++++++++++++++ Makefile | 21 ++ README.md | 29 +++ assets/icon128.png | Bin 0 -> 20893 bytes assets/icon16.png | Bin 0 -> 734 bytes assets/icon32.png | Bin 0 -> 2325 bytes assets/icon48.png | Bin 0 -> 4189 bytes browsers/chrome.js | 19 ++ browsers/chrome/manifest.json | 31 +++ browsers/firefox.js | 22 ++ browsers/firefox/index.js | 17 ++ browsers/firefox/package.json | 15 ++ browsers/firefox/test/test-index.js | 19 ++ package.json | 37 +++ src/reactionpacks.css | 13 + src/reactionpacks.js | 5 + webpack.config.js | 44 ++++ 21 files changed, 688 insertions(+) create mode 100644 .babelrc create mode 100644 .gitignore create mode 100644 CHANGELOG.md create mode 100644 LICENSE create mode 100644 MPL-2.0 create mode 100644 Makefile create mode 100644 README.md create mode 100644 assets/icon128.png create mode 100644 assets/icon16.png create mode 100644 assets/icon32.png create mode 100644 assets/icon48.png create mode 100644 browsers/chrome.js create mode 100644 browsers/chrome/manifest.json create mode 100644 browsers/firefox.js create mode 100644 browsers/firefox/index.js create mode 100644 browsers/firefox/package.json create mode 100644 browsers/firefox/test/test-index.js create mode 100644 package.json create mode 100644 src/reactionpacks.css create mode 100644 src/reactionpacks.js create mode 100644 webpack.config.js diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..c8f25a9 --- /dev/null +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["es2015", "stage-0", "react"] +} + diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..5b077c9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,42 @@ +# Logs +logs +*.log +npm-debug.log* + +# Runtime data +pids +*.pid +*.seed + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage + +# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (http://nodejs.org/api/addons.html) +build/Release +build +dist + +# Dependency directories +node_modules +jspm_packages + +# Optional npm cache directory +.npm + +# Optional REPL history +.node_repl_history + +# IDE/swap files +.DS_Store +.*.swp +*.zip +.idea diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..8989073 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,5 @@ +# Changelog + +## v1.0.0 + +* Initial commit of Reaction Packs \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..6e77a3c --- /dev/null +++ b/LICENSE @@ -0,0 +1,3 @@ +This Source Code Form is subject to the terms of the Mozilla Public License, v. +2.0. If a copy of the MPL was not distributed with this file, You can obtain +one at http://mozilla.org/MPL/2.0/. \ No newline at end of file diff --git a/MPL-2.0 b/MPL-2.0 new file mode 100644 index 0000000..be2cc4d --- /dev/null +++ b/MPL-2.0 @@ -0,0 +1,362 @@ +Mozilla Public License, version 2.0 + +1. Definitions + +1.1. "Contributor" + + means each individual or legal entity that creates, contributes to the + creation of, or owns Covered Software. + +1.2. "Contributor Version" + + means the combination of the Contributions of others (if any) used by a + Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + + means Source Code Form to which the initial Contributor has attached the + notice in Exhibit A, the Executable Form of such Source Code Form, and + Modifications of such Source Code Form, in each case including portions + thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + a. that the initial Contributor has attached the notice described in + Exhibit B to the Covered Software; or + + b. that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the terms of + a Secondary License. + +1.6. "Executable Form" + + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + + means a work that combines Covered Software with other material, in a + separate file or files, that is not Covered Software. + +1.8. "License" + + means this document. + +1.9. "Licensable" + + means having the right to grant, to the maximum extent possible, whether + at the time of the initial grant or subsequently, any and all of the + rights conveyed by this License. + +1.10. "Modifications" + + means any of the following: + + a. any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered Software; or + + b. any new file in Source Code Form that contains any Covered Software. + +1.11. "Patent Claims" of a Contributor + + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the License, + by the making, using, selling, offering for sale, having made, import, + or transfer of either its Contributions or its Contributor Version. + +1.12. "Secondary License" + + means either the GNU General Public License, Version 2.0, the GNU Lesser + General Public License, Version 2.1, the GNU Affero General Public + License, Version 3.0, or any later versions of those licenses. + +1.13. "Source Code Form" + + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that controls, is + controlled by, or is under common control with You. For purposes of this + definition, "control" means (a) the power, direct or indirect, to cause + the direction or management of such entity, whether by contract or + otherwise, or (b) ownership of more than fifty percent (50%) of the + outstanding shares or beneficial ownership of such entity. + + +2. License Grants and Conditions + +2.1. Grants + + Each Contributor hereby grants You a world-wide, royalty-free, + non-exclusive license: + + a. under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + + b. under Patent Claims of such Contributor to make, use, sell, offer for + sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + + The licenses granted in Section 2.1 with respect to any Contribution + become effective for each Contribution on the date the Contributor first + distributes such Contribution. + +2.3. Limitations on Grant Scope + + The licenses granted in this Section 2 are the only rights granted under + this License. No additional rights or licenses will be implied from the + distribution or licensing of Covered Software under this License. + Notwithstanding Section 2.1(b) above, no patent license is granted by a + Contributor: + + a. for any code that a Contributor has removed from Covered Software; or + + b. for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + + c. under Patent Claims infringed by Covered Software in the absence of + its Contributions. + + This License does not grant any rights in the trademarks, service marks, + or logos of any Contributor (except as may be necessary to comply with + the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + + No Contributor makes additional grants as a result of Your choice to + distribute the Covered Software under a subsequent version of this + License (see Section 10.2) or under the terms of a Secondary License (if + permitted under the terms of Section 3.3). + +2.5. Representation + + Each Contributor represents that the Contributor believes its + Contributions are its original creation(s) or it has sufficient rights to + grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + + This License is not intended to limit any rights You have under + applicable copyright doctrines of fair use, fair dealing, or other + equivalents. + +2.7. Conditions + + Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted in + Section 2.1. + + +3. Responsibilities + +3.1. Distribution of Source Form + + All distribution of Covered Software in Source Code Form, including any + Modifications that You create or to which You contribute, must be under + the terms of this License. You must inform recipients that the Source + Code Form of the Covered Software is governed by the terms of this + License, and how they can obtain a copy of this License. You may not + attempt to alter or restrict the recipients' rights in the Source Code + Form. + +3.2. Distribution of Executable Form + + If You distribute Covered Software in Executable Form then: + + a. such Covered Software must also be made available in Source Code Form, + as described in Section 3.1, and You must inform recipients of the + Executable Form how they can obtain a copy of such Source Code Form by + reasonable means in a timely manner, at a charge no more than the cost + of distribution to the recipient; and + + b. You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter the + recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + + You may create and distribute a Larger Work under terms of Your choice, + provided that You also comply with the requirements of this License for + the Covered Software. If the Larger Work is a combination of Covered + Software with a work governed by one or more Secondary Licenses, and the + Covered Software is not Incompatible With Secondary Licenses, this + License permits You to additionally distribute such Covered Software + under the terms of such Secondary License(s), so that the recipient of + the Larger Work may, at their option, further distribute the Covered + Software under the terms of either this License or such Secondary + License(s). + +3.4. Notices + + You may not remove or alter the substance of any license notices + (including copyright notices, patent notices, disclaimers of warranty, or + limitations of liability) contained within the Source Code Form of the + Covered Software, except that You may alter any license notices to the + extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + + You may choose to offer, and to charge a fee for, warranty, support, + indemnity or liability obligations to one or more recipients of Covered + Software. However, You may do so only on Your own behalf, and not on + behalf of any Contributor. You must make it absolutely clear that any + such warranty, support, indemnity, or liability obligation is offered by + You alone, and You hereby agree to indemnify every Contributor for any + liability incurred by such Contributor as a result of warranty, support, + indemnity or liability terms You offer. You may include additional + disclaimers of warranty and limitations of liability specific to any + jurisdiction. + +4. Inability to Comply Due to Statute or Regulation + + If it is impossible for You to comply with any of the terms of this License + with respect to some or all of the Covered Software due to statute, + judicial order, or regulation then You must: (a) comply with the terms of + this License to the maximum extent possible; and (b) describe the + limitations and the code they affect. Such description must be placed in a + text file included with all distributions of the Covered Software under + this License. Except to the extent prohibited by statute or regulation, + such description must be sufficiently detailed for a recipient of ordinary + skill to be able to understand it. + +5. Termination + +5.1. The rights granted under this License will terminate automatically if You + fail to comply with any of its terms. However, if You become compliant, + then the rights granted under this License from a particular Contributor + are reinstated (a) provisionally, unless and until such Contributor + explicitly and finally terminates Your grants, and (b) on an ongoing + basis, if such Contributor fails to notify You of the non-compliance by + some reasonable means prior to 60 days after You have come back into + compliance. Moreover, Your grants from a particular Contributor are + reinstated on an ongoing basis if such Contributor notifies You of the + non-compliance by some reasonable means, this is the first time You have + received notice of non-compliance with this License from such + Contributor, and You become compliant prior to 30 days after Your receipt + of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent + infringement claim (excluding declaratory judgment actions, + counter-claims, and cross-claims) alleging that a Contributor Version + directly or indirectly infringes any patent, then the rights granted to + You by any and all Contributors for the Covered Software under Section + 2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all end user + license agreements (excluding distributors and resellers) which have been + validly granted by You or Your distributors under this License prior to + termination shall survive termination. + +6. Disclaimer of Warranty + + Covered Software is provided under this License on an "as is" basis, + without warranty of any kind, either expressed, implied, or statutory, + including, without limitation, warranties that the Covered Software is free + of defects, merchantable, fit for a particular purpose or non-infringing. + The entire risk as to the quality and performance of the Covered Software + is with You. Should any Covered Software prove defective in any respect, + You (not any Contributor) assume the cost of any necessary servicing, + repair, or correction. This disclaimer of warranty constitutes an essential + part of this License. No use of any Covered Software is authorized under + this License except under this disclaimer. + +7. Limitation of Liability + + Under no circumstances and under no legal theory, whether tort (including + negligence), contract, or otherwise, shall any Contributor, or anyone who + distributes Covered Software as permitted above, be liable to You for any + direct, indirect, special, incidental, or consequential damages of any + character including, without limitation, damages for lost profits, loss of + goodwill, work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses, even if such party shall have been + informed of the possibility of such damages. This limitation of liability + shall not apply to liability for death or personal injury resulting from + such party's negligence to the extent applicable law prohibits such + limitation. Some jurisdictions do not allow the exclusion or limitation of + incidental or consequential damages, so this exclusion and limitation may + not apply to You. + +8. Litigation + + Any litigation relating to this License may be brought only in the courts + of a jurisdiction where the defendant maintains its principal place of + business and such litigation shall be governed by laws of that + jurisdiction, without reference to its conflict-of-law provisions. Nothing + in this Section shall prevent a party's ability to bring cross-claims or + counter-claims. + +9. Miscellaneous + + This License represents the complete agreement concerning the subject + matter hereof. If any provision of this License is held to be + unenforceable, such provision shall be reformed only to the extent + necessary to make it enforceable. Any law or regulation which provides that + the language of a contract shall be construed against the drafter shall not + be used to construe this License against a Contributor. + + +10. Versions of the License + +10.1. New Versions + + Mozilla Foundation is the license steward. Except as provided in Section + 10.3, no one other than the license steward has the right to modify or + publish new versions of this License. Each version will be given a + distinguishing version number. + +10.2. Effect of New Versions + + You may distribute the Covered Software under the terms of the version + of the License under which You originally received the Covered Software, + or under the terms of any subsequent version published by the license + steward. + +10.3. Modified Versions + + If you create software not governed by this License, and you want to + create a new license for such software, you may create and use a + modified version of this License if you rename the license and remove + any references to the name of the license steward (except to note that + such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary + Licenses If You choose to distribute Source Code Form that is + Incompatible With Secondary Licenses under the terms of this version of + the License, the notice described in Exhibit B of this License must be + attached. + +Exhibit A - Source Code Form License Notice + + This Source Code Form is subject to the + terms of the Mozilla Public License, v. + 2.0. If a copy of the MPL was not + distributed with this file, You can + obtain one at + http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular file, +then You may include the notice in a location (such as a LICENSE file in a +relevant directory) where a recipient would be likely to look for such a +notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice + + This Source Code Form is "Incompatible + With Secondary Licenses", as defined by + the Mozilla Public License, v. 2.0. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..1e80f4c --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +.PHONY: all firefox chrome run-firefox clean + +# The current git tag is used as the version number +GITTAG=$(shell git describe --always --tag) + +all: firefox chrome + +firefox: + BROWSER=firefox webpack + mkdir -p dist/firefox + (cd build/firefox && jpm xpi) + mv build/firefox/*.xpi dist/firefox/ + +run-firefox: + BROWSER=firefox webpack + (cd build/firefox && jpm run) + +chrome: + BROWSER=chrome webpack + mkdir -p dist/chrome + (cd build/chrome && zip -r ../../dist/chrome/ReactionPacks_$(GITTAG).zip .) diff --git a/README.md b/README.md new file mode 100644 index 0000000..fe8d038 --- /dev/null +++ b/README.md @@ -0,0 +1,29 @@ +# Reaction Packs + +Custom Reaction Packs for Facebook. + +## Installation + +TODO: Add links to extension pages. + +## Contributing + +To get started, clone the repository and then run: + +```bash +npm install +npm run build: +``` + +replacing with "chrome" or "firefox" as appropriate. + +## Project folder structure: + + # Source code: + assets # Images + browsers # Browser specific code + src # Common code across all browsers + + # Build output: + build # The raw extension contents for each browser + dist # Distributable extension package for browsers diff --git a/assets/icon128.png b/assets/icon128.png new file mode 100644 index 0000000000000000000000000000000000000000..a3f310ca08eb2a1167b7fc868a1796aaca249290 GIT binary patch literal 20893 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 literal 0 HcmV?d00001 diff --git a/assets/icon16.png b/assets/icon16.png new file mode 100644 index 0000000000000000000000000000000000000000..eecc07fff61927f39dfceea9620f184e0b35ebee GIT binary patch literal 734 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 literal 0 HcmV?d00001 diff --git a/browsers/chrome.js b/browsers/chrome.js new file mode 100644 index 0000000..e172df3 --- /dev/null +++ b/browsers/chrome.js @@ -0,0 +1,19 @@ +// Include main chrome manifest +require('file?name=manifest.json!./chrome/manifest.json'); + +// Chrome requires extension icons +require('file?name=icon16.png!../assets/icon16.png'); +require('file?name=icon48.png!../assets/icon48.png'); +require('file?name=icon128.png!../assets/icon128.png'); + +module.exports = { + loadSettings: function (callback) { + chrome.storage.sync.get(null, (data) => { + callback(data); + }); + }, + + saveSettings: function (data) { + chrome.storage.sync.set(data); + } +}; diff --git a/browsers/chrome/manifest.json b/browsers/chrome/manifest.json new file mode 100644 index 0000000..1b5609b --- /dev/null +++ b/browsers/chrome/manifest.json @@ -0,0 +1,31 @@ +{ + "name": "Reaction Packs for Facebook", + "version": "1.0.0", + "description": "Change your reaction pictures on Facebook, and share with your friends!", + "manifest_version": 2, + "permissions": [ + "storage", + "http://www.facebook.com/*", + "https://www.facebook.com/*" + ], + "icons": { + "16": "icon16.png", + "48": "icon48.png", + "128": "icon128.png" + }, + "content_scripts": [ + { + "matches": [ + "http://www.facebook.com/*", + "https://www.facebook.com/*" + ], + "js": [ + "reactionpacks.js" + ], + "css": [ + "reactionpacks.css" + ], + "run_at": "document_idle" + } + ] +} diff --git a/browsers/firefox.js b/browsers/firefox.js new file mode 100644 index 0000000..bbbb686 --- /dev/null +++ b/browsers/firefox.js @@ -0,0 +1,22 @@ +// Include package.json +require('file?name=package.json!./firefox/package.json'); + +require('file?name=index.js!./firefox/index.js'); + +require('file?name=icon48.png!../assets/icon48.png'); + + +module.exports = { + loadSettings(cb) { + self.port.on('settings-loaded', (message) => { + cb(message); + }); + self.port.emit('load-settings'); + }, + saveSettings(data, cb) { + self.port.on('settings-saved', () => { + cb() + }); + self.port.emit('save-settings', data); + } +}; diff --git a/browsers/firefox/index.js b/browsers/firefox/index.js new file mode 100644 index 0000000..52d6ac8 --- /dev/null +++ b/browsers/firefox/index.js @@ -0,0 +1,17 @@ +var pageMod = require("sdk/page-mod"); + +var self = require("sdk/self"); + +var pageModder = pageMod.PageMod({ + include: "*.facebook.com", + contentStyleFile: self.data.url("reactionpacks.css"), + contentScriptFile: self.data.url("reactionpacks.js"), + onAttach: startListening +}); + +function startListening(worker) { + worker.port.on('requestUrl', function (url) { + console.log("Received request"); + worker.port.emit(url, self.data.load(url)); + }); +} diff --git a/browsers/firefox/package.json b/browsers/firefox/package.json new file mode 100644 index 0000000..b235142 --- /dev/null +++ b/browsers/firefox/package.json @@ -0,0 +1,15 @@ +{ + "title": "Reaction Packs for Facebook", + "name": "reaction-packs", + "version": "1.0.0", + "description": "Change your reaction pictures on Facebook.", + "homepage": "http://reactionpacks.com", + "main": "index.js", + "author": "Rodney Folz ", + "engines": { + "firefox": ">=38.0a1", + "fennec": ">=38.0a1" + }, + "icon": "./icon48.png", + "license": "MPL-2.0" +} diff --git a/browsers/firefox/test/test-index.js b/browsers/firefox/test/test-index.js new file mode 100644 index 0000000..b3ad6e8 --- /dev/null +++ b/browsers/firefox/test/test-index.js @@ -0,0 +1,19 @@ +var main = require("../"); + +exports["test main"] = function(assert) { + assert.pass("Unit test running!"); +}; + +exports["test main async"] = function(assert, done) { + assert.pass("async Unit test running!"); + done(); +}; + +exports["test dummy"] = function(assert, done) { + main.dummy("foo", function(text) { + assert.ok((text === "foo"), "Is the text actually 'foo'"); + done(); + }); +}; + +require("sdk/test").run(exports); diff --git a/package.json b/package.json new file mode 100644 index 0000000..d17def4 --- /dev/null +++ b/package.json @@ -0,0 +1,37 @@ +{ + "name": "reaction-packs", + "version": "0.1.0", + "description": "Reaction Packs for Facebook. A new way to monetize your emotions!", + "homepage": "http://reactionpacks.com/", + "license": "MPL-2.0", + "author": "Rodney Folz ", + "main": "", + "repository": "https://github.com/folz/reaction-packs", + "scripts": { + "build": "npm run build:firefox & npm run build:chrome & wait", + "build:firefox": "BROWSER=firefox webpack", + "build:chrome": "BROWSER=chrome webpack", + "test": "echo \"Error: no test specified\" && exit 1" + }, + "dependencies": { + "events": "^1.0.2", + "immutable": "^3.7.4", + "jquery": "^2.1.4", + "lodash": "^4.5.1", + "react": "^0.14.7", + "react-dom": "^0.14.7" + }, + "devDependencies": { + "babel-core": "^6.5.2", + "babel-loader": "^6.2.3", + "babel-preset-es2015": "^6.5.0", + "babel-preset-react": "^6.5.0", + "babel-preset-stage-0": "^6.5.0", + "css-loader": "^0.23.1", + "extract-text-webpack-plugin": "^1.0.1", + "file-loader": "^0.8.4", + "html-loader": "^0.4.3", + "style-loader": "^0.13.0", + "webpack": "^1.12.14" + } +} diff --git a/src/reactionpacks.css b/src/reactionpacks.css new file mode 100644 index 0000000..e112df3 --- /dev/null +++ b/src/reactionpacks.css @@ -0,0 +1,13 @@ +/** +Reaction CSS classes: + +reactions: {like => .like, love => .love, haha => .haha, wow => .wow, sad => .sorry, angry => .anger} + +sizes: {16px => ._2p7a.@reaction, 48px => ._iuz.@reaction, 96px@2x => .x2 ._iuz.@reaction} + +properties { + background-image: image sprite + background-size: sprite.width/2 sprite.height/2 + background-position: offset for individual image +} +*/ diff --git a/src/reactionpacks.js b/src/reactionpacks.js new file mode 100644 index 0000000..e1340ae --- /dev/null +++ b/src/reactionpacks.js @@ -0,0 +1,5 @@ +// Include browser-specific code and assets. (See webpack.config.js.) +require('--browser'); + +// Include styles. +require('./reactionpacks.css'); diff --git a/webpack.config.js b/webpack.config.js new file mode 100644 index 0000000..54ed01a --- /dev/null +++ b/webpack.config.js @@ -0,0 +1,44 @@ +var ExtractTextPlugin = require("extract-text-webpack-plugin"); + +browser = process.env.BROWSER || + console.log('Use `npm run build` instead.') || process.exit(1); +console.log('Building', browser, 'extension'); + +var script_entry = 'reactionpacks.js'; +var style_entry = 'reactionpacks.css'; + +// Firefox expects included scripts to be under the 'data' directory +if (browser === 'firefox') { + script_entry = 'data/' + script_entry; + style_entry = 'data/' + style_entry; +} + +module.exports = { + context: __dirname + '/src', + entry: './reactionpacks.js', + resolve: { + alias: { + '--browser': __dirname + '/browsers/' + browser + '.js' + } + }, + output: { + path: __dirname + '/build/' + browser, + filename: script_entry + }, + module: { + loaders: [ + { + test: /\.css$/, + loader: ExtractTextPlugin.extract("style-loader", "css-loader") + }, + { + test: /\.jsx?$/, + exclude: /node_modules/, + loader: 'babel' + } + ] + }, + plugins: [ + new ExtractTextPlugin(style_entry) + ] +};