diff --git a/command/data/embedder/flambe.js b/command/data/embedder/flambe.js index f4f3036f..cfe78d9f 100644 --- a/command/data/embedder/flambe.js +++ b/command/data/embedder/flambe.js @@ -7,9 +7,6 @@ */ var flambe = {}; -/** @define {string} */ -flambe.FLASH_VERSION = "11"; - /** * Embed a Flambe game into the page. * @@ -45,8 +42,12 @@ flambe.embed = function (urls, elementId) { switch (ext) { case "swf": + var flashVersion = "11.2"; + if ((pref == null || pref == "flash") - && swfobject.hasFlashPlayerVersion(flambe.FLASH_VERSION)) { + && swfobject.hasFlashPlayerVersion(flashVersion) + // Android Flash is old and busted + && !/\bAndroid\b/.exec(navigator.userAgent)) { // SWFObject replaces the element it's given, so create a temporary inner element // for parity with JS @@ -64,10 +65,9 @@ flambe.embed = function (urls, elementId) { }; } - swfobject.embedSWF(url, swf.id, "100%", "100%", flambe.FLASH_VERSION, null, {}, { + swfobject.embedSWF(url, swf.id, "100%", "100%", flashVersion, null, {}, { allowScriptAccess: "always", allowFullScreen: "true", - fullscreenOnSelection: "true", wmode: "direct" }, {id: swf.id, name: swf.id}); return true; diff --git a/command/data/firefox/index.html b/command/data/firefox/index.html new file mode 100644 index 00000000..245106c0 --- /dev/null +++ b/command/data/firefox/index.html @@ -0,0 +1,20 @@ + + + + + + + + +
+ +
+ + diff --git a/command/data/scaffold/Project.hxproj b/command/data/scaffold/Project.hxproj index 46b136c5..ff4d16e3 100644 --- a/command/data/scaffold/Project.hxproj +++ b/command/data/scaffold/Project.hxproj @@ -46,14 +46,14 @@ - cmd /c flambe build --$(BuildConfig) + cmd /c flambe build $(TargetBuild) --$(BuildConfig) diff --git a/command/data/scaffold/flambe.yaml b/command/data/scaffold/flambe.yaml index b8196903..5817d5da 100644 --- a/command/data/scaffold/flambe.yaml +++ b/command/data/scaffold/flambe.yaml @@ -1,37 +1,49 @@ -# The name, version and identifier, for mobile app packaging +# Basic information about the game. name: Your Game +description: A short one-line description. + +# Information about the game developer. +developer: + name: Your Company Name + url: http://yourwebsite.com + +# The game's unique identifier. +id: com.yourdomain.yourgame + +# The game's version string. version: 1.0.0 -id: com.urdomain.urgame -# The main class name +# The main class name. main: urgame.Main -# The platform to use when invoking `run` or `build` with no arguments +# The platform to use when invoking `run` or `build` with no arguments. default_platform: flash -# Additional flags to pass to the Haxe compiler +# The initial orientation and fullscreen state on mobile devices. +orientation: portrait +fullscreen: true + +# Additional flags to pass to the Haxe compiler. # haxe_flags: -lib nape -D foobar -# Additional paths to include in the build +# Additional paths to include in the build. # extra_paths: # assets: dir1 dir2 # libs: dir1 dir2 # src: ../dir1 ../dir2 # web: ["dir1 with spaces", "dir2"] -# The initial orientation and fullscreen state -orientation: portrait -fullscreen: true - -# Android-specific configuration +# Android-specific configuration. android: # https://developer.android.com/guide/topics/manifest/manifest-intro.html AndroidManifest.xml: | + # The signing password for certs/android.p12 + password: password -# iOS-specific configuration +# iOS-specific configuration. ios: # http://developer.apple.com/library/ios/#documentation/general/Reference/InfoPlistKeyReference Info.plist: | @@ -42,3 +54,15 @@ ios: UIPrerenderedIcon + # The signing password for certs/ios-development.p12 + password: password + +# Firefox App-specific configuration. +firefox: + # https://developer.mozilla.org/en-US/docs/Web/Apps/Manifest + manifest.webapp: + { + default_locale: "en", + # type: "privileged", + # permissions: [...] + } diff --git a/command/data/scaffold/icons/128x128.png b/command/data/scaffold/icons/128x128.png new file mode 100644 index 00000000..a7183f7b Binary files /dev/null and b/command/data/scaffold/icons/128x128.png differ diff --git a/command/data/scaffold/src/urgame/Main.hx b/command/data/scaffold/src/urgame/Main.hx index 5820ee7b..270fb237 100644 --- a/command/data/scaffold/src/urgame/Main.hx +++ b/command/data/scaffold/src/urgame/Main.hx @@ -15,7 +15,7 @@ class Main System.init(); // Load up the compiled pack in the assets directory named "bootstrap" - var manifest = Manifest.build("bootstrap"); + var manifest = Manifest.fromAssets("bootstrap"); var loader = System.loadAssetPack(manifest); loader.get(onSuccess); } diff --git a/command/data/scaffold/web/index.html b/command/data/scaffold/web/index.html index 6328d308..f74e06f4 100644 --- a/command/data/scaffold/web/index.html +++ b/command/data/scaffold/web/index.html @@ -4,7 +4,7 @@ Your Game - + diff --git a/command/flambe.js b/command/flambe.js index 264a21d5..fa034ad6 100755 --- a/command/flambe.js +++ b/command/flambe.js @@ -60,6 +60,7 @@ cmd.setDefaults({action: function (args) { var addCommonArguments = function (parser) { parser.addArgument(["--debug"], {action: "storeTrue", help: "Build in debug mode."}); parser.addArgument(["--fdb-host"], {help: "The address AIR apps should connect to for debugging."}); + parser.addArgument(["--haxe-server"], {help: "Connect to a Haxe compiler server at this address/port."}); // For FlashDevelop, does absolutely nothing parser.addArgument(["--release"], {action: "storeTrue", help: argparse.Const.SUPPRESS}); @@ -76,7 +77,13 @@ cmd.setDefaults({action: function (args) { catchErrors( flambe.loadConfig(args.config) .then(function (config) { - return flambe.run(config, args.platform, {debug: args.debug, noBuild: args.no_build, fdbHost: args.fdb_host, noFdb: args.no_fdb}); + return flambe.run(config, args.platform, { + debug: args.debug, + fdbHost: args.fdb_host, + haxeServer: args.haxe_server, + noBuild: args.no_build, + noFdb: args.no_fdb, + }); })); }}); @@ -89,7 +96,11 @@ cmd.setDefaults({action: function (args) { catchErrors( flambe.loadConfig(args.config) .then(function (config) { - return flambe.build(config, args.platforms, {debug: args.debug, fdbHost: args.fdb_host}); + return flambe.build(config, args.platforms, { + debug: args.debug, + fdbHost: args.fdb_host, + haxeServer: args.haxe_server, + }); })); }}); @@ -115,6 +126,19 @@ cmd.setDefaults({action: function () { })); }}); +var cmd = commands.addParser("haxe-flags", {help: "Show Haxe compiler completion flags.", + description: "For IDE implementors, prints flags that can be passed to the Haxe compiler for code completion." +}); +cmd.addArgument(["platform"], {metavar: "platform", nargs: "?", + help: "A platform to target. Choose from " + flambe.PLATFORMS.join(", ") + ". If omitted, 'default_platform' from flambe.yaml will be used."}); +cmd.setDefaults({action: function () { + catchErrors( + flambe.loadConfig(args.config) + .then(function (config) { + console.log(flambe.getHaxeFlags(config, args.platform).join("\n")); + })); +}}); + var cmd = commands.addParser("update", {help: "Update to the latest Flambe version.", description: "Upgrade to the latest version of Flambe, or downgrade to an earlier version. This command should be run as root/Administrator.", aliases: ["upgrade"]}); diff --git a/command/index.js b/command/index.js index b54b3cdf..d29887e0 100644 --- a/command/index.js +++ b/command/index.js @@ -18,7 +18,10 @@ var HAXE_COMPILER_PORT = 6000; var HTTP_PORT = 7000; var SOCKET_PORT = HTTP_PORT+1; -exports.PLATFORMS = ["html", "flash", "android", "ios"]; +// The minimum SWF version for browser Flash. For AIR, we always use the latest +var SWF_VERSION = "11.2"; + +exports.PLATFORMS = ["html", "flash", "android", "ios", "firefox"]; exports.VERSION = JSON.parse(fs.readFileSync(__dirname + "/package.json")).version; @@ -30,7 +33,12 @@ exports.loadConfig = function (file) { }) .then(function (text) { var yaml = require("js-yaml"); - return yaml.safeLoad(text.toString()); + // yaml barfs on tab indentation, replace with spaces. This can lead to problems with + // mixed tabs/spaces on multiline values though... + var converted = text.toString().replace(/^\t+/gm, function (tabs) { + return tabs.replace(/\t/g, " "); + }); + return yaml.safeLoad(converted); }); return promise; }; @@ -99,6 +107,10 @@ exports.run = function (config, platform, opts) { return p; }) break; + + case "firefox": + console.log("Open "+path.resolve("build/firefox")+" from about:app-manager in Firefox."); + return Q.resolve(); } }; @@ -176,39 +188,56 @@ exports.build = function (config, platforms, opts) { return flags; }; + var buildJS = function (opts) { + var target = opts.target; + var outputDir = opts.outputDir; + var assetFlags = opts.assetFlags; + + var assetDir = outputDir + "/assets"; + var unminified = CACHE_DIR + target + ".unminified.js"; + var js = outputDir + "/targets/main-" + target + ".js"; + + wrench.mkdirSyncRecursive(outputDir); + + var jsFlags = ["-D", target, "-D", "js-es5", "-D", "js-flatten"]; + var flags = commonFlags.concat(jsFlags).concat(assetFlags); + if (debug) { + return haxe(flags.concat(["-D", "source-map-content", "-js", js])); + } else { + // Minify release builds + return haxe(flags.concat(["-js", unminified])) + .then(function () { + return minify([unminified], js, {strict: true}); + }) + .then(function () { + // Delete the source map file produced by debug builds + return Q.nfcall(fs.unlink, js+".map") + .catch(function () { + // Ignore errors + }); + }); + } + }; + var buildHtml = function () { - var htmlFlags = ["-D", "html", "-D", "js-flatten"]; - var unminified = CACHE_DIR+"main-html.unminified.js"; - var js = "build/web/targets/main-html.js"; + var outputDir = "build/web"; - return prepareWeb() - .then(function () { return prepareAssets("build/web/assets") }) + return prepareWeb(outputDir) + .then(function () { return prepareAssets(outputDir+"/assets") }) .then(function (assetFlags) { - console.log("Building: " + js); - var flags = commonFlags.concat(assetFlags).concat(htmlFlags); - if (debug) { - return haxe(flags.concat(["-js", js])); - } else { - // Minify release builds - return haxe(flags.concat(["-js", unminified])) - .then(function () { - return minify([unminified], js, {strict: true}); - }) - .then(function () { - // Delete the source map file produced by debug builds - return Q.nfcall(fs.unlink, js+".map") - .catch(function () { - // Ignore errors - }); - }); - } + console.log("Building: " + outputDir); + return buildJS({ + target: "html", + outputDir: outputDir, + assetFlags: assetFlags, + }); }); }; var buildFlash = function () { var swf = "build/web/targets/main-flash.swf"; var flashFlags = swfFlags(false).concat([ - "-swf-version", "11", "-swf", swf]); + "-swf-version", SWF_VERSION, "-swf", swf]); return prepareWeb() .then(function () { return prepareAssets("build/web/assets") }) @@ -231,7 +260,7 @@ exports.build = function (config, platforms, opts) { var generateAirXml = function (swf, output) { var xmldom = require("xmldom"); var xml = - "\n" + + "\n" + " "+get(config, "id")+"\n" + " "+get(config, "version")+"\n" + " "+get(config, "name")+"\n" + @@ -254,6 +283,7 @@ exports.build = function (config, platforms, opts) { " \n" + + " high\n" + " \n" + ""; var doc = new xmldom.DOMParser().parseFromString(xml); @@ -316,15 +346,20 @@ exports.build = function (config, platforms, opts) { console.log("Building: " + apk); var swf = "main-android.swf"; - var cert = CACHE_DIR+"air/certificate-android.p12"; var xml = CACHE_DIR+"air/config-android.xml"; + var cert = "certs/android.p12"; + var password = get(config, "android password", "password"); + return buildAir(["-D", "android", "-swf", CACHE_DIR+"air/"+swf]) .then(function () { - // Generate a dummy certificate if it doesn't exist if (!fs.existsSync(cert)) { - return adt(["-certificate", "-cn", "SelfSign", "-validityPeriod", "25", "2048-RSA", - cert, "password"]); + // Generate a dummy certificate if it doesn't exist + cert = CACHE_DIR+"air/certificate-android.p12"; + if (!fs.existsSync(cert)) { + return adt(["-certificate", "-cn", "SelfSign", "-validityPeriod", "25", + "2048-RSA", cert, password]); + } } }) .then(function () { @@ -337,10 +372,13 @@ exports.build = function (config, platforms, opts) { } else { androidFlags.push("-target", "apk-captive-runtime"); } - androidFlags.push("-storetype", "pkcs12", "-keystore", cert, "-storepass", "password", - apk, xml); + androidFlags.push("-storetype", "pkcs12", "-keystore", cert, + "-storepass", password, apk, xml); androidFlags = androidFlags.concat(pathOptions); androidFlags.push("-C", CACHE_DIR+"air", swf, "assets"); + if (fs.existsSync("android")) { + androidFlags.push("-C", "android", "."); + } return adt(androidFlags); }); }; @@ -365,26 +403,75 @@ exports.build = function (config, platforms, opts) { } else { iosFlags.push("-target", "ipa-ad-hoc"); } - // TODO(bruno): Make these cert options configurable - iosFlags.push("-storetype", "pkcs12", "-keystore", cert, "-storepass", "password", - "-provisioning-profile", mobileProvision, ipa, xml); + iosFlags.push("-storetype", "pkcs12", "-keystore", cert, + "-storepass", get(config, "ios password", "password"), + "-provisioning-profile", mobileProvision, + "-useLegacyAOT", "yes", // https://github.com/ncannasse/hxsl/issues/32 + ipa, xml); iosFlags = iosFlags.concat(pathOptions); iosFlags.push("-C", CACHE_DIR+"air", swf, "assets"); + if (fs.existsSync("ios")) { + iosFlags.push("-C", "ios", "."); + } return adt(iosFlags); }); }; + var buildFirefox = function () { + var outputDir = "build/firefox"; + wrench.mkdirSyncRecursive(outputDir+"/targets"); + + return prepareAssets(outputDir+"/assets") + .then(function (assetFlags) { + console.log("Building: " + outputDir); + return buildJS({ + target: "firefox", + outputDir: outputDir, + assetFlags: assetFlags, + }); + }) + .then(function () { + return copyDirs(DATA_DIR+"firefox", outputDir); + }) + .then(function () { + if (fs.existsSync("icons")) { + return copyDirs("icons", outputDir+"/icons"); + } + }) + .then(function () { + var manifest = { + name: get(config, "name"), + description: get(config, "description"), + developer: { + name: get(config, "developer name"), + url: get(config, "developer url"), + }, + version: get(config, "version"), + launch_path: "/index.html", + orientation: get(config, "orientation", "portrait").toLowerCase() == "portrait" ? + ["portrait", "portrait-secondary"] : ["landscape", "landscape-secondary"], + fullscreen: ""+get(config, "fullscreen", true), + icons: {}, + }; + findIcons("icons").forEach(function (icon) { + manifest.icons[icon.size] = "/"+icon.image; + }); + + // Copy any additional fields into manifest from 2DKit.yaml + clone(get(config, "firefox manifest.webapp", {}), manifest); + + fs.writeFileSync(outputDir+"/manifest.webapp", JSON.stringify(manifest)); + }); + }; + wrench.mkdirSyncRecursive(CACHE_DIR); - var connectFlags = ["--connect", HAXE_COMPILER_PORT]; + var connectFlags = ["--connect", opts.haxeServer || HAXE_COMPILER_PORT]; return haxe(connectFlags, {check: false, verbose: false, output: false}) .then(function (code) { - // Hide the compilation server behind an environment variable for now until stable - if ("FLAMBE_HAXE_SERVER" in process.env) { - // Use a Haxe compilation server if available - if (code == 0) { - commonFlags = commonFlags.concat(connectFlags); - } + // Use a Haxe compilation server if available + if (code == 0) { + commonFlags = commonFlags.concat(connectFlags); } commonFlags.push("-main", get(config, "main")); @@ -406,6 +493,7 @@ exports.build = function (config, platforms, opts) { flash: buildFlash, android: buildAndroid, ios: buildIos, + firefox: buildFirefox, }; var promise = Q(); platforms.forEach(function (platform, idx) { @@ -544,6 +632,48 @@ var fdb = function (commands) { }; exports.fdb = fdb; +var getHaxeFlags = function (config, platform) { + if (platform == null) { + platform = get(config, "default_platform", "flash"); + } + checkPlatforms([platform]); + + var flags = [ + "-main", get(config, "main"), + "-lib", "flambe", + "-swf-version", SWF_VERSION, + "-D", "flash-strict", + "--no-output", + ]; + + switch (platform) { + case "android": case "ios": + flags.push("-D", "air"); + // Fall through + case "flash": + flags.push("-swf", "no-output.swf"); + break; + default: + flags.push("-js", "no-output.js"); + break; + } + if (platform != "flash") { + flags.push("-D", platform); + } + + flags = flags.concat(toArray(get(config, "haxe_flags", []))); + getAllPaths(config, "src").forEach(function (srcPath) { + flags.push("-cp", srcPath); + }); + getAllPaths(config, "libs").forEach(function (libPath) { + forEachFileIn(libPath, function (file) { + flags.push("-swf-lib-extern", libPath+"/"+file); + }); + }); + return flags; +} +exports.getHaxeFlags = getHaxeFlags; + var Server = function () { }; exports.Server = Server; @@ -551,15 +681,17 @@ exports.Server = Server; Server.prototype.start = function () { var self = this; var connect = require("connect"); + var bodyParser = require("body-parser"); + var logger = require("morgan"); + var compression = require("compression"); + var serveStatic = require("serve-static"); + var http = require("http"); var url = require("url"); var websocket = require("websocket"); - // Hide the compilation server behind an environment variable for now until stable - if ("FLAMBE_HAXE_SERVER" in process.env) { - // Fire up a Haxe compiler server, ignoring all output. It's fine if this command fails, the - // build will fallback to not using a compiler server - spawn("haxe", ["--wait", HAXE_COMPILER_PORT], {stdio: "ignore"}); - } + // Fire up a Haxe compiler server, ignoring all output. It's fine if this command fails, the + // build will fallback to not using a compiler server + spawn("haxe", ["--wait", HAXE_COMPILER_PORT], {stdio: "ignore"}); // Start a static HTTP server var host = "0.0.0.0"; @@ -589,9 +721,9 @@ Server.prototype.start = function () { next(); } }) - .use(connect.logger("tiny")) - .use(connect.compress()) - .use(connect.static("build/web")) + .use(logger("tiny")) + .use(compression()) + .use(serveStatic("build/web")) .listen(HTTP_PORT, host); console.log("Serving on http://localhost:%s", HTTP_PORT); @@ -784,3 +916,27 @@ var getIP = function () { } return ip; }; + +var clone = function (from, into) { + into = into || {}; + for (var key in from) { + into[key] = from[key]; + } + return into; +}; + +var findIcons = function (dir) { + var icons = []; + fs.readdirSync(dir).forEach(function (file) { + // Only include properly named square icons + var match = file.match(/^(\d+)x\1\.png$/); + if (match) { + icons.push({ + size: match[1], + image: dir+"/"+file, + }); + } + // TODO(bruno): Warn if not matched? + }); + return icons; +}; diff --git a/command/package-lock.json b/command/package-lock.json new file mode 100644 index 00000000..7ad36c54 --- /dev/null +++ b/command/package-lock.json @@ -0,0 +1,585 @@ +{ + "name": "flambe", + "version": "4.1.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "adm-zip": { + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/adm-zip/-/adm-zip-0.5.4.tgz", + "integrity": "sha512-GMQg1a1cAegh+/EgWbz+XHZrwB467iB/IgtToldvxs7Xa5Br8mPmvCeRfY/Un2fLzrlIPt6Yu7Cej+8Ut9TGPg==" + }, + "argparse": { + "version": "0.1.16", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz", + "integrity": "sha1-z9AeD7uj1srtBJ+9dY1A9lGW9Xw=", + "requires": { + "underscore": "~1.7.0", + "underscore.string": "~2.4.0" + } + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "requires": { + "safe-buffer": "5.1.2" + } + }, + "body-parser": { + "version": "1.19.0", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", + "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", + "requires": { + "bytes": "3.1.0", + "content-type": "~1.0.4", + "debug": "2.6.9", + "depd": "~1.1.2", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "on-finished": "~2.3.0", + "qs": "6.7.0", + "raw-body": "2.4.0", + "type-is": "~1.6.17" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + } + } + }, + "bufferutil": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-4.0.3.tgz", + "integrity": "sha512-yEYTwGndELGvfXsImMBLop58eaGW+YdONi1fNjTINSY98tmMmFijBG6WXgdkfuLNt4imzQNtIE+eBp1PVpMCSw==", + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "bytes": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", + "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "requires": { + "mime-db": ">= 1.43.0 < 2" + } + }, + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "requires": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "dependencies": { + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha1-0ygVQE1olpn4Wk6k+odV3ROpYEg=" + } + } + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + } + }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, + "d": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/d/-/d-1.0.1.tgz", + "integrity": "sha512-m62ShEObQ39CfralilEQRjH6oAMtNCV1xJyEx5LpRYUVN+EviphDgUc/F3hnYbADmkiNs67Y+3ylmlG7Lnu+FA==", + "requires": { + "es5-ext": "^0.10.50", + "type": "^1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" + }, + "es5-ext": { + "version": "0.10.53", + "resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.53.tgz", + "integrity": "sha512-Xs2Stw6NiNHWypzRTY1MtaG/uJlwCk8kH81920ma8mvN8Xq1gsfhZvpkImLQArw8AHnv8MT2I45J3c0R8slE+Q==", + "requires": { + "es6-iterator": "~2.0.3", + "es6-symbol": "~3.1.3", + "next-tick": "~1.0.0" + } + }, + "es6-iterator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/es6-iterator/-/es6-iterator-2.0.3.tgz", + "integrity": "sha1-p96IkUGgWpSwhUQDstCg+/qY87c=", + "requires": { + "d": "1", + "es5-ext": "^0.10.35", + "es6-symbol": "^3.1.1" + } + }, + "es6-symbol": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/es6-symbol/-/es6-symbol-3.1.3.tgz", + "integrity": "sha512-NJ6Yn3FuDinBaBRWl/q5X/s4koRHBrgKAu+yGI6JCBeiu3qrcbJhwT2GeR/EXVfylRk8dpQVJoLEFhK+Mu31NA==", + "requires": { + "d": "^1.0.1", + "ext": "^1.1.2" + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", + "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" + }, + "ext": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ext/-/ext-1.4.0.tgz", + "integrity": "sha512-Key5NIsUxdqKg3vIsdw9dSuXpPCQ297y6wBjL30edxwPgt2E44WcWBZey/ZvUc6sERLTxKdyCu4gZFmUbk1Q7A==", + "requires": { + "type": "^2.0.0" + }, + "dependencies": { + "type": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/type/-/type-2.5.0.tgz", + "integrity": "sha512-180WMDQaIMm3+7hGXWf12GtdniDEy7nYcyFMKJn/eZz/6tSLXrUN9V0wKSbMjej0I1WHWbpREDEKHtqPQa9NNw==" + } + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" + }, + "http-errors": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", + "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.1", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + } + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=" + }, + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=" + }, + "js-yaml": { + "version": "3.13.1", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz", + "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "requires": { + "sprintf-js": "~1.0.2" + } + } + } + }, + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "mime-db": { + "version": "1.46.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.46.0.tgz", + "integrity": "sha512-svXaP8UQRZ5K7or+ZmfNhg2xX3yKDMUzqadsSqi4NCH/KomcH75MAMYAGVlvXn4+b/xOPhS3I2uHKRUzvjY7BQ==" + }, + "mime-types": { + "version": "2.1.29", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.29.tgz", + "integrity": "sha512-Y/jMt/S5sR9OaqteJtslsFZKWOIIqMACsJSiHghlCAyhf7jfVYjKBmLiX8OgpWeW+fjJ2b+Az69aPFPkUOY6xQ==", + "requires": { + "mime-db": "1.46.0" + } + }, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "requires": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "ncp": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz", + "integrity": "sha1-q8xsvT7C7Spyn/bnwfqPAXhKhXQ=" + }, + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "next-tick": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/next-tick/-/next-tick-1.0.0.tgz", + "integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw=" + }, + "node-gyp-build": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.2.3.tgz", + "integrity": "sha512-MN6ZpzmfNCRM+3t57PTJHgHyw/h4OWnZ6mR8P5j/uZtqQr46RRuDE/P+g3n0YR/AiYXeWixZZzaip77gdICfRg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "open": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/open/-/open-6.0.0.tgz", + "integrity": "sha512-/yb5mVZBz7mHLySMiSj2DcLtMBbFPJk5JBKEkHVZFxZAPzeg3L026O0T+lbdz1B2nyDnkClRSwRQJdeVUIF7zw==", + "requires": { + "is-wsl": "^1.1.0" + } + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "q": { + "version": "0.9.7", + "resolved": "https://registry.npmjs.org/q/-/q-0.9.7.tgz", + "integrity": "sha1-TeLmyzspCIyeTLwDv51C+5bOL3U=" + }, + "qs": { + "version": "6.7.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", + "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", + "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", + "requires": { + "bytes": "3.1.0", + "http-errors": "1.7.2", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "send": { + "version": "0.17.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", + "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.7.2", + "mime": "1.6.0", + "ms": "2.1.1", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", + "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" + }, + "ms": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", + "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" + } + } + }, + "serve-static": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", + "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.1" + } + }, + "setprototypeof": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", + "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" + }, + "toidentifier": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", + "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" + }, + "type": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/type/-/type-1.2.0.tgz", + "integrity": "sha512-+5nt5AAniqsCnu2cEQQdpzCAh33kVx8n0VoFidKpB1dVVLAN/F+bgVOqOJqOnEnrhp222clB5p3vUlD+1QAnfg==" + }, + "type-is": { + "version": "1.6.18", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", + "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.24" + } + }, + "typedarray-to-buffer": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/typedarray-to-buffer/-/typedarray-to-buffer-3.1.5.tgz", + "integrity": "sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==", + "requires": { + "is-typedarray": "^1.0.0" + } + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + }, + "underscore.string": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz", + "integrity": "sha1-jN2PusTi0uoefi6Al8QvRCKA+Fs=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + }, + "utf-8-validate": { + "version": "5.0.4", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-5.0.4.tgz", + "integrity": "sha512-MEF05cPSq3AwJ2C7B7sHAA6i53vONoZbMGX8My5auEVm6W+dJ2Jd/TZPyGJ5CH42V2XtbI5FD28HeHeqlPzZ3Q==", + "requires": { + "node-gyp-build": "^4.2.0" + } + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", + "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" + }, + "watch": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/watch/-/watch-0.8.0.tgz", + "integrity": "sha1-G7DupT3v5uYh6cjGPANYAH7L28w=" + }, + "websocket": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/websocket/-/websocket-1.0.33.tgz", + "integrity": "sha512-XwNqM2rN5eh3G2CUQE3OHZj+0xfdH42+OFK6LdC2yqiC0YU8e5UK0nYre220T0IyyN031V/XOvtHvXozvJYFWA==", + "requires": { + "bufferutil": "^4.0.1", + "debug": "^2.2.0", + "es5-ext": "^0.10.50", + "typedarray-to-buffer": "^3.1.5", + "utf-8-validate": "^5.0.2", + "yaeti": "^0.0.6" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + } + } + }, + "wrench": { + "version": "1.5.9", + "resolved": "https://registry.npmjs.org/wrench/-/wrench-1.5.9.tgz", + "integrity": "sha1-QRaRxjqbJTGxcAJnJ5veyiOyFCo=" + }, + "xmldom": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/xmldom/-/xmldom-0.5.0.tgz", + "integrity": "sha512-Foaj5FXVzgn7xFzsKeNIde9g6aFBxTPi37iwsno8QvApmtg7KYrr+OPyRHcJF7dud2a5nGRBXK3n0dL62Gf7PA==" + }, + "yaeti": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/yaeti/-/yaeti-0.0.6.tgz", + "integrity": "sha1-8m9ITXJoTPQr7ft2lwqhYI+/lXc=" + } + } +} diff --git a/command/package.json b/command/package.json index 93a2b85e..d7085f78 100644 --- a/command/package.json +++ b/command/package.json @@ -1,27 +1,58 @@ { + "_from": "flambe", + "_id": "flambe@4.1.0", + "_inBundle": false, + "_integrity": "sha1-L44sQRTj+2iMQqRMmE4cU4mLew4=", + "_location": "/flambe", + "_phantomChildren": {}, + "_requested": { + "type": "tag", + "registry": true, + "raw": "flambe", + "name": "flambe", + "escapedName": "flambe", + "rawSpec": "", + "saveSpec": null, + "fetchSpec": "latest" + }, + "_requiredBy": [ + "#USER" + ], + "_resolved": "https://registry.npmjs.org/flambe/-/flambe-4.1.0.tgz", + "_shasum": "2f8e2c4114e3fb688c42a44c984e1c53898b7b0e", + "_spec": "flambe", + "_where": "H:\\Work\\Nick\\Arcade", "author": { - "email": "b@aduros.com", "name": "Bruno Garcia", + "email": "b@aduros.com", "url": "https://twitter.com/b_garcia" }, - "bin": "flambe.js", + "bin": { + "flambe": "flambe.js" + }, "bugs": { - "email": "flambe@googlegroups.com", - "url": "https://github.com/aduros/flambe/issues" + "url": "https://github.com/aduros/flambe/issues", + "email": "flambe@googlegroups.com" }, + "bundleDependencies": false, "dependencies": { - "adm-zip": "~0.4.3", + "adm-zip": "~0.5.2", "argparse": "~0.1.15", - "connect": "~2.8.3", - "js-yaml": "~2.1.0", + "body-parser": "^1.19.0", + "compression": "^1.7.4", + "connect": "^3.7.0", + "js-yaml": "~3.13.1", + "morgan": "^1.10.0", "ncp": "~0.4.2", - "open": "~0.0.3", + "open": "~6.0.0", "q": "~0.9.6", + "serve-static": "^1.14.1", "watch": "~0.8.0", - "websocket": "~1.0.8", + "websocket": "^1.0.33", "wrench": "~1.5.1", - "xmldom": "~0.1.16" + "xmldom": "~0.5.0" }, + "deprecated": false, "description": "Rapidly cook up games for HTML5 and Flash.", "engines": { "node": ">=0.8.0" @@ -31,6 +62,9 @@ "main": "index.js", "name": "flambe", "preferGlobal": true, - "repository": "https://github.com/aduros/flambe", - "version": "3.1.1" -} \ No newline at end of file + "repository": { + "type": "git", + "url": "git+https://github.com/aduros/flambe.git" + }, + "version": "4.1.0" +} diff --git a/src/flambe/platform/html/HtmlPlatform.hx b/src/flambe/platform/html/HtmlPlatform.hx index 3470c1ef..11f237da 100644 --- a/src/flambe/platform/html/HtmlPlatform.hx +++ b/src/flambe/platform/html/HtmlPlatform.hx @@ -135,7 +135,9 @@ class HtmlPlatform switch (event.type) { case "touchstart", "MSPointerDown": - event.preventDefault(); + #if !flambe_allow_touch_default + event.preventDefault(); + #end if (HtmlUtil.SHOULD_HIDE_MOBILE_BROWSER) { HtmlUtil.hideMobileBrowser(); } @@ -147,7 +149,9 @@ class HtmlPlatform } case "touchmove", "MSPointerMove": - event.preventDefault(); + #if !flambe_allow_touch_default + event.preventDefault(); + #end for (touch in changedTouches) { var x = getX(touch, bounds); var y = getY(touch, bounds); @@ -156,6 +160,9 @@ class HtmlPlatform } case "touchend", "touchcancel", "MSPointerUp": + #if !flambe_allow_touch_default + event.preventDefault(); + #end for (touch in changedTouches) { var x = getX(touch, bounds); var y = getY(touch, bounds);