├── .gitignore
├── .travis.yml
├── LICENSE
├── README.md
├── app
├── index.html
└── main.js
├── index.js
├── package.json
├── src
└── package.js
├── template
├── application.ini
├── chrome.manifest
├── chrome
│ ├── chrome.manifest
│ └── content
│ │ ├── app.js
│ │ └── main.xul
└── defaults
│ └── preferences
│ └── prefs.js
└── test.js
/.gitignore:
--------------------------------------------------------------------------------
1 | # Logs
2 | logs
3 | *.log
4 |
5 | # Runtime data
6 | pids
7 | *.pid
8 | *.seed
9 |
10 | # Directory for instrumented libs generated by jscoverage/JSCover
11 | lib-cov
12 |
13 | # Coverage directory used by tools like istanbul
14 | coverage
15 |
16 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
17 | .grunt
18 |
19 | # Compiled binary addons (http://nodejs.org/api/addons.html)
20 | build/Release
21 |
22 | # Dependency directory
23 | # Commenting this out is preferred by some people, see
24 | # https://www.npmjs.org/doc/misc/npm-faq.html#should-i-check-my-node_modules-folder-into-git-
25 | node_modules
26 |
27 | # Users Environment Variables
28 | .lock-wscript
29 |
30 | # Downloaded runtimes
31 | runtimes
32 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: node_js
2 | node_js:
3 | - "0.6"
4 | - "0.8"
5 | - "0.10"
6 | - "0.12"
7 | - "4.0"
8 | - "4.1"
9 | - "4.2"
10 | - "iojs"
11 | matrix:
12 | fast_finish: true
13 | allow_failures:
14 | - node_js: "0.6"
15 | - node_js: "0.8"
16 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2015 Adrián Arroyo Calle
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # node-xulrunner
2 | 
3 | Like NW.js and node-webkit but with Gecko using XUL Runner.
4 |
5 | Use node.js for your local app and use the magic Node.js powers here.
6 |
7 | ## Usage
8 |
9 | ### Cloning
10 |
11 | This package provides an API and templates. The easyest way to use it is running
12 | ```sh
13 |
14 | git clone http://github.com/AdrianArroyoCalle/node-xulrunner
15 |
16 | ```
17 |
18 | Then you can put your app in the app/ folder, modify the test.js file and run
19 |
20 | ```sh
21 |
22 | node test.js
23 |
24 | ```
25 |
26 | ### NPM API
27 |
28 | We also provide an API for future tools like grunt-xulrunner or gulp-xulrunner
29 |
30 | ```sh
31 |
32 | npm install node-xulrunner --save
33 |
34 | ```
35 |
36 |
37 | ```js
38 |
39 | var xul=require("node-xulrunner");
40 |
41 | var options={
42 | os: "linux-i686",
43 | version: "35.0.1",
44 | name: "Testing",
45 | vendor: "Adrián Arroyo",
46 | appVersion: "0.1.0",
47 | buildId: "00000001",
48 | id: "test@node-xulrunner",
49 | copyright: "2015 Adrián Arroyo Calle",
50 | width: 800,
51 | height: 600
52 | };
53 |
54 | xul.packageApp(options);
55 |
56 | ```
57 |
58 | But you must provide your own template folder.
59 |
60 | # app/ structure
61 |
62 | app/ is where your app lives. node-xulrunner loads the main.js file and then you have the control. Use Express if you like to serve the HTML pages.
63 |
64 |
--------------------------------------------------------------------------------
/app/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 | No se verá
5 |
6 |
7 |
8 | Testing node-xulrunner
9 |
12 |
13 |
14 |
--------------------------------------------------------------------------------
/app/main.js:
--------------------------------------------------------------------------------
1 | var http = require('http');
2 | http.createServer(function (req, res) {
3 | res.writeHead(200, {'Content-Type': 'text/plain'});
4 | res.end('Hello World\n');
5 | }).listen(4200, '127.0.0.1');
6 | console.log('Server running at http://127.0.0.1:4200/');
7 |
--------------------------------------------------------------------------------
/index.js:
--------------------------------------------------------------------------------
1 | var package=require("./src/package.js");
2 |
3 | var api={
4 | packageApp: function(options){
5 | package(options);
6 | }
7 | };
8 |
9 | module.exports=api;
10 |
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "node-xulrunner",
3 | "version": "0.1.0",
4 | "description": "Run HTML5 and Node.js applications with Gecko",
5 | "main": "index.js",
6 | "scripts": {
7 | "test": "node test.js && node test.js"
8 | },
9 | "repository": {
10 | "type": "git",
11 | "url": "https://github.com/AdrianArroyoCalle/node-xulrunner"
12 | },
13 | "keywords": [
14 | "xul",
15 | "xulrunner",
16 | "html5",
17 | "app"
18 | ],
19 | "author": "Adrián Arroyo Calle",
20 | "license": "MIT",
21 | "bugs": {
22 | "url": "https://github.com/AdrianArroyoCalle/node-xulrunner/issues"
23 | },
24 | "dependencies": {
25 | "bluebird": "^3.0.6",
26 | "decompress": "~2.1.1",
27 | "follow-redirects": "0.2.0",
28 | "fs.extra": "^1.3.2",
29 | "liquid-node": "^2.4.0",
30 | "mkdirp": "~0.5.0",
31 | "mozilla-download": "~1.1.1",
32 | "q": "~1.1.2",
33 | "rimraf": "~2.5.1",
34 | "status-bar": "~2.0.2",
35 | "winston": "~2.2.0"
36 | }
37 | }
38 |
--------------------------------------------------------------------------------
/src/package.js:
--------------------------------------------------------------------------------
1 | var mozdownload=require("mozilla-download");
2 | var Q=require("q");
3 | var http=require("follow-redirects").http;
4 | var fs=require("fs.extra");
5 | var mkdirp=require("mkdirp");
6 | var statusBar=require("status-bar");
7 | var path = require ("path");
8 | var Decompress=require("decompress");
9 | var rimraf=require("rimraf");
10 | var winston=require("winston");
11 | var Liquid=require("liquid-node");
12 | var engine=new Liquid.Engine();
13 |
14 |
15 | function download(url,dest,callback){
16 | var file=fs.createWriteStream(dest);
17 | var bar;
18 | var request=http.get(url,function(response){
19 | bar = statusBar.create ({ total: response.headers["content-length"] }).on ("render", function (stats){
20 | process.stdout.write (
21 | path.basename (url) + " " +
22 | this.format.storage (stats.currentSize) + " " +
23 | this.format.speed (stats.speed) + " " +
24 | this.format.time (stats.elapsedTime) + " " +
25 | this.format.time (stats.remainingTime) + " [" +
26 | this.format.progressBar (stats.percentage) + "] " +
27 | this.format.percentage (stats.percentage));
28 | process.stdout.cursorTo (0);
29 | });
30 | response.pipe(file);
31 | response.pipe(bar);
32 | response.on("end",callback);
33 | });
34 | }
35 |
36 | function downloadRuntime(options) {
37 | var url="http://releases.mozilla.org/pub/mozilla.org/xulrunner/releases/"+options.version+"/runtimes/xulrunner-"+options.version+".en-US."+options.os;
38 | if(options.os=="win32")
39 | {
40 | url+=".zip";
41 | var file=fs.createWriteStream("./runtimes/xul-runner.zip");
42 | }
43 | else{
44 | url+=".tar.bz2";
45 | var file=fs.createWriteStream("./runtimes/xul-runner.tar.bz2");
46 | }
47 | var defer=Q.defer();
48 | var bar;
49 |
50 | var request=http.get(url,function(response){
51 | bar = statusBar.create ({ total: response.headers["content-length"] }).on ("render", function (stats){
52 | process.stdout.write (
53 | path.basename (url) + " " +
54 | this.format.storage (stats.currentSize) + " " +
55 | this.format.speed (stats.speed) + " " +
56 | this.format.time (stats.elapsedTime) + " " +
57 | this.format.time (stats.remainingTime) + " [" +
58 | this.format.progressBar (stats.percentage) + "] " +
59 | this.format.percentage (stats.percentage));
60 | process.stdout.cursorTo (0);
61 | });
62 | response.pipe(file);
63 | response.pipe(bar);
64 | response.on("end",function(){
65 | defer.resolve();
66 | });
67 | });
68 |
69 | return defer.promise;
70 | }
71 |
72 | function extractRuntime(options)
73 | {
74 | winston.info("Extracting XUL Runner");
75 | var deferred=Q.defer();
76 | if(options.os=="win32")
77 | {
78 | var file="./runtimes/xul-runner.zip";
79 | var decompress=new Decompress()
80 | .src(file)
81 | .dest("./runtimes/xul-runner")
82 | .use(Decompress.zip({strip: 1}));
83 | decompress.run(function(err,files){
84 | winston.info("Extracted XUL Runner");
85 | deferred.resolve();
86 | });
87 | }
88 | else
89 | {
90 | var file="./runtimes/xul-runner.tar.bz2";
91 | var decompress=new Decompress({mode: "777"})
92 | .src(file)
93 | .dest("./runtimes/xul-runner")
94 | .use(Decompress.tarbz2({strip: 1}));
95 | decompress.run(function(err,files){
96 | winston.info("Extracted XUL Runner");
97 | deferred.resolve();
98 | });
99 | }
100 |
101 | return deferred.promise;
102 | }
103 |
104 | function downloadNode(options)
105 | {
106 | var defer=Q.defer();
107 |
108 | switch(options.os){
109 | case "linux-i686": var url="http://nodejs.org/dist/v0.12.0/node-v0.12.0-linux-x86.tar.gz";break;
110 | case "linux-x86_64": var url="http://nodejs.org/dist/v0.12.0/node-v0.12.0-linux-x64.tar.gz";break;
111 | case "mac": var url="http://nodejs.org/dist/v0.12.0/node-v0.12.0-darwin-x64.tar.gz"; break;
112 | case "win32": var url="http://nodejs.org/dist/v0.12.0/node.exe";break;
113 | }
114 | var bar;
115 |
116 | if(options.os=="win32"){
117 | var file=fs.createWriteStream("./runtimes/node.exe");
118 | }else{
119 | var file=fs.createWriteStream("./runtimes/node.tar.gz");
120 | }
121 | var request=http.get(url,function(response){
122 | bar = statusBar.create ({ total: response.headers["content-length"] }).on ("render", function (stats){
123 | process.stdout.write (
124 | path.basename (url) + " " +
125 | this.format.storage (stats.currentSize) + " " +
126 | this.format.speed (stats.speed) + " " +
127 | this.format.time (stats.elapsedTime) + " " +
128 | this.format.time (stats.remainingTime) + " [" +
129 | this.format.progressBar (stats.percentage) + "] " +
130 | this.format.percentage (stats.percentage));
131 | process.stdout.cursorTo (0);
132 | });
133 | response.pipe(file);
134 | response.pipe(bar);
135 | response.on("end",function(){
136 | defer.resolve();
137 | });
138 | });
139 |
140 | return defer.promise;
141 | }
142 | function extractNode(options)
143 | {
144 | var deferred=Q.defer();
145 | winston.info("Extracting Node.js");
146 | if(options.os=="win32")
147 | {
148 | deferred.resolve();
149 | }else{
150 | var file="./runtimes/node.tar.gz";
151 | var decompress=new Decompress({mode: "777"})
152 | .src(file)
153 | .dest("./runtimes/node-tmp")
154 | .use(Decompress.targz({strip: 1}));
155 | decompress.run(function(err,files){
156 | winston.info("Extracted Node.js");
157 | fs.createReadStream("./runtimes/node-tmp/bin/node").pipe(fs.createWriteStream("./runtimes/node",{mode: 0777}));
158 | rimraf.sync("./runtimes/node-tmp");
159 | deferred.resolve();
160 | });
161 | }
162 | return deferred.promise;
163 | }
164 |
165 | function useTemplate(options) {
166 | winston.info("Using template");
167 | mkdirp.sync("build");
168 | var templateOptions={
169 | name: options.name,
170 | vendor: options.vendor,
171 | version: options.appVersion,
172 | buildid: options.buildId,
173 | id: options.id,
174 | copyright: options.copyright,
175 | width: options.width,
176 | height: options.height
177 | };
178 | var appIniTemplate=fs.readFileSync("template/application.ini");
179 | var appIni=fs.createWriteStream("build/application.ini");
180 | engine.parseAndRender(appIniTemplate,templateOptions)
181 | .then(function(result){
182 | appIni.on("open",function(){
183 | appIni.write(result);
184 | appIni.end();
185 | });
186 | });
187 | fs.copy("template/chrome.manifest","build/chrome.manifest");
188 | fs.copy("template/chrome/chrome.manifest","build/chrome/chrome.manifest");
189 | mkdirp.sync("build/defaults/preferences");
190 | fs.copy("template/defaults/preferences/prefs.js","build/defaults/preferences/prefs.js");
191 | mkdirp.sync("build/chrome/content");
192 | fs.copy("template/chrome/content/app.js","build/chrome/content/app.js");
193 | mkdirp.sync("build/chrome/content/runtimes");
194 | if(options.os!="win32")
195 | fs.copy("runtimes/node","build/chrome/content/runtimes/node",function(){
196 | fs.chmodSync("build/chrome/content/runtimes/node","777");
197 | });
198 | else
199 | fs.copy("runtimes/node.exe","build/chrome/content/runtimes/node.exe");
200 | fs.copyRecursive("runtimes/xul-runner","build/xulrunner",function(){});
201 | if(options.os!="win32")
202 | fs.copy("runtimes/xul-runner/xulrunner-stub","build/app",function(){
203 | fs.chmodSync("build/app","777");
204 | });
205 | else
206 | fs.copy("runtimes/xul-runner/xulrunner-stub.exe","build/app.exe");
207 | fs.copyRecursive("app","build/chrome/content/app",function(){});
208 | //MAIN.XUL is TEMPLATE
209 | var mainXulTemplate=fs.readFileSync("template/chrome/content/main.xul");
210 | var mainXul=fs.createWriteStream("build/chrome/content/main.xul");
211 | engine.parseAndRender(mainXulTemplate,templateOptions)
212 | .then(function(result){
213 | mainXul.on("open",function(){
214 | mainXul.write(result);
215 | mainXul.end();
216 | });
217 | });
218 | }
219 |
220 | function packageApp(options)
221 | {
222 | winston.info("Node XULRunner 0.1");
223 |
224 | fs.exists("./runtimes/ok",function(exist){
225 | if(exist){
226 | winston.info("Setup OK");
227 | useTemplate(options);
228 | }else{
229 | winston.warn("Creating setup");
230 | mkdirp.sync("runtimes");
231 |
232 | Q.fcall(function(){
233 | return downloadRuntime(options);
234 | }).then(function(){
235 | return extractRuntime(options);
236 | }).done();
237 |
238 | Q.fcall(function(){
239 | return downloadNode(options);
240 | }).then(function(){
241 | return extractNode(options);
242 | }).done();
243 |
244 | var ok=fs.createWriteStream("./runtimes/ok");
245 | ok.on("open",function(fd){
246 | ok.write("Setup OK\r\n");
247 | ok.end();
248 | });
249 |
250 | }
251 | });
252 | }
253 |
254 | module.exports=packageApp;
255 |
--------------------------------------------------------------------------------
/template/application.ini:
--------------------------------------------------------------------------------
1 | [App]
2 | Vendor={{ vendor }}
3 | Name={{ name }}
4 | Version={{ version }}
5 | BuildID={{ buildid }}
6 | ID={{ id }}
7 | Copyright={{ copyright }}
8 |
9 | [Gecko]
10 | MinVersion=31.*
11 | MaxVersion=900.*
12 |
13 | [XRE]
14 | EnableExtensionManager=0
15 | EnableProfileMigrator=0
16 |
17 | [CrashReporter]
18 | Enabled=False
19 | ServerURL=http://crash-stats.mozilla.com/api/submit
20 |
--------------------------------------------------------------------------------
/template/chrome.manifest:
--------------------------------------------------------------------------------
1 | manifest chrome/chrome.manifest
2 |
--------------------------------------------------------------------------------
/template/chrome/chrome.manifest:
--------------------------------------------------------------------------------
1 | content node-xulrunner content/
2 | content branding branding/
3 | locale branding en-US locale/branding/
4 | locale node-xulrunner locale/en-US/
5 |
--------------------------------------------------------------------------------
/template/chrome/content/app.js:
--------------------------------------------------------------------------------
1 | /**
2 | app.js - bridge between node and xul
3 | */
4 | /**
5 | * TODO:
6 | * - Build script with liquid
7 | * - Copy folders
8 | * - Test app
9 | * - Sync Node and XUL
10 | * */
11 |
12 | function startNode(){
13 | var FileUtils = Components.utils.import("resource://gre/modules/FileUtils.jsm").FileUtils;
14 | Components.utils.import("resource://gre/modules/Services.jsm");
15 | //var nsifile = new FileUtils.File("chrome://node-xulrunner/content/app/main.js");
16 | var file = Services.dirsvc.get("AChrom", Components.interfaces.nsIFile);
17 | file.append("content");
18 | file.append("runtimes");
19 | file.append("node");
20 | var nsifile = Services.dirsvc.get("AChrom", Components.interfaces.nsIFile);
21 | nsifile.append("content");
22 | nsifile.append("app");
23 | nsifile.append("main.js");
24 | var exe = Components.classes['@mozilla.org/file/local;1'].createInstance(Components.interfaces.nsILocalFile);
25 | exe.initWithPath(file.path);
26 | var run = Components.classes['@mozilla.org/process/util;1'].createInstance(Components.interfaces.nsIProcess);
27 | run.init(exe);
28 | var parameters=[nsifile.path];
29 | run.runAsync(parameters,parameters.length);
30 |
31 | function QuitObserver()
32 | {
33 | this.register();
34 | }
35 | QuitObserver.prototype = {
36 | observe: function(subject, topic, data) {
37 | console.log("QUIT");
38 | run.kill();
39 | },
40 | register: function() {
41 | var observerService = Components.classes["@mozilla.org/observer-service;1"]
42 | .getService(Components.interfaces.nsIObserverService);
43 | observerService.addObserver(this, "quit-application", false);
44 | },
45 | unregister: function() {
46 | var observerService = Components.classes["@mozilla.org/observer-service;1"]
47 | .getService(Components.interfaces.nsIObserverService);
48 | observerService.removeObserver(this, "quit-application");
49 | }
50 | }
51 | var observer=new QuitObserver();
52 | }
53 |
54 | function openNodeSite() {
55 | var navigator=document.getElementById("navigator");
56 | setTimeout(function(){
57 | navigator.loadURI("http://localhost:4200");
58 | },5000);
59 | }
60 |
--------------------------------------------------------------------------------
/template/chrome/content/main.xul:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
10 |
11 |
--------------------------------------------------------------------------------
/template/defaults/preferences/prefs.js:
--------------------------------------------------------------------------------
1 | pref("toolkit.defaultChromeURI","chrome://node-xulrunner/content/main.xul");
2 | pref("toolkit.singletonWindowType","xulrunner:app");
3 |
4 | pref("browser.dom.window.dump.enabled", true);
5 | pref("javascript.options.showInConsole", true);
6 | pref("javascript.options.strict", true);
7 | pref("nglayout.debug.disable_xul_cache", true);
8 | pref("nglayout.debug.disable_xul_fastload", true);
9 | pref("xpinstall.dialog.confirm", "chrome://mozapps/content/xpinstall/xpinstallConfirm.xul");
10 | pref("xpinstall.dialog.progress.skin", "chrome://mozapps/content/extensions/extensions.xul?type=themes");
11 | pref("xpinstall.dialog.progress.chrome", "chrome://mozapps/content/extensions/extensions.xul?type=extensions");
12 | pref("xpinstall.dialog.progress.type.skin", "Extension:Manager-themes");
13 | pref("xpinstall.dialog.progress.type.chrome", "Extension:Manager-extensions");
14 | pref("extensions.update.enabled", true);
15 | pref("extensions.update.interval", 86400);
16 | pref("extensions.dss.enabled", false);
17 | pref("extensions.dss.switchPending", false);
18 | pref("extensions.ignoreMTimeChanges", false);
19 | pref("extensions.logging.enabled", false);
20 | pref("general.skins.selectedSkin", "classic/1.0"); //WikiTheme/0.1 for WikiTheme
21 | pref("extensions.update.url", "chrome://mozapps/locale/extensions/extensions.properties");
22 | pref("extensions.getMoreExtensionsURL", "chrome://mozapps/locale/extensions/extensions.properties");
23 | pref("extensions.getMoreThemesURL", "chrome://mozapps/locale/extensions/extensions.properties");
24 | pref("extensions.getAddons.search.url","http://github.com/AdrianArroyoCalle/divwiki/raw/master/extensions/search.xml");
25 | pref("wiki.extension-manager.uri","chrome://mozapps/content/extensions/extensions.xul");
26 | pref("wiki.js-console.uri","chrome://global/content/console.xul");
27 | pref("wiki.config.uri","chrome://global/content/config.xul");
28 | pref("browser.download.useDownloadDir", true);
29 | pref("browser.download.folderList", 0);
30 | pref("browser.download.manager.showAlertOnComplete", true);
31 | pref("browser.download.manager.showAlertInterval", 2000);
32 | pref("browser.download.manager.retention", 2);
33 | pref("browser.download.manager.showWhenStarting", true);
34 | pref("browser.download.manager.useWindow", true);
35 | pref("browser.download.manager.closeWhenDone", true);
36 | pref("browser.download.manager.openDelay", 0);
37 | pref("browser.download.manager.focusWhenStarting", false);
38 | pref("browser.download.manager.flashCount", 2);
39 | pref("alerts.slideIncrement", 1);
40 | pref("alerts.slideIncrementTime", 10);
41 | pref("alerts.totalOpenTime", 4000);
42 | pref("alerts.height", 50);
43 | pref("signon.rememberSignons", true);
44 | pref("signon.expireMasterPassword", false);
45 | pref("signon.SignonFileName", "signons.txt");
46 | pref("app.update.enabled", true);
47 | pref("app.update.auto", true);
48 | pref("app.update.mode", 2);
49 | pref("app.update.silent", false);
50 | pref("app.update.url", "https://github.com/AdrianArroyoCalle/divwiki/raw/master/updates.xml");
51 | pref("app.update.url.manual", "http://github.com/AdrianArroyoCalle/divwiki/releases");
52 | pref("app.update.url.details", "http://github.com/AdrianArroyoCalle/divwiki");
53 | pref("app.update.interval", 86400);
54 | pref("app.update.nagTimer.download", 86400);
55 | pref("app.update.nagTimer.restart", 1800);
56 | pref("app.update.timer", 600000);
57 | pref("app.update.showInstalledUI", false);
58 | pref("app.update.incompatible.mode", 0);
59 | pref("browser.preferences.instantApply",false);
60 | pref("browser.preferences.animateFadeIn",false);
61 |
--------------------------------------------------------------------------------
/test.js:
--------------------------------------------------------------------------------
1 | var xul=require("./index.js");
2 |
3 | var options={
4 | os: "win32",
5 | version: "35.0.1",
6 | name: "Testing",
7 | vendor: "Adrián Arroyo",
8 | appVersion: "0.1.0",
9 | buildId: "00000001",
10 | id: "test@node-xulrunner",
11 | copyright: "2015 Adrián Arroyo Calle",
12 | width: 800,
13 | height: 600
14 | };
15 |
16 | xul.packageApp(options);
17 |
--------------------------------------------------------------------------------