From 05c50867deb90a579b1bcb5639fd03adaecaeb8a Mon Sep 17 00:00:00 2001 From: Audrey Roy Date: Thu, 2 Aug 2012 12:14:04 -0700 Subject: [PATCH 01/16] Added a link to the instructions for contributors --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 6d94e88b0f..db7258e60a 100644 --- a/README.md +++ b/README.md @@ -74,3 +74,4 @@ in several ways: * IRC: ```#meteor``` on ```irc.freenode.net``` * Ask a question: http://stackoverflow.com/questions/tagged/meteor * Email us: ```contact@meteor.com``` +* How to contribute to Meteor: https://github.com/meteor/meteor/wiki From 0f1816181c94eba8630bbff48c8fb45be8b31630 Mon Sep 17 00:00:00 2001 From: Alex Seville Date: Mon, 30 Jul 2012 15:15:37 -0300 Subject: [PATCH 02/16] Tag mismatch in docs.html h2/h1 tag mismatch in main-headline can be misinterpreted by browsers (i.e. Safari 5.0.4 will fail and display a blank page). --- docs/client/docs.html | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/client/docs.html b/docs/client/docs.html index 9c2e4f06ff..6d5a108050 100644 --- a/docs/client/docs.html +++ b/docs/client/docs.html @@ -11,7 +11,7 @@
-

Meteor 0.3.8

+

Meteor 0.3.8

{{> introduction }} {{> concepts }} {{> api }} From dc34cff99086218aed5809e792a1ec1fe063c3e2 Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Tue, 24 Jul 2012 19:34:14 -0700 Subject: [PATCH 03/16] add spiderable package --- packages/spiderable/package.js | 10 ++++ packages/spiderable/spiderable.html | 1 + packages/spiderable/spiderable.js | 71 +++++++++++++++++++++++++++++ 3 files changed, 82 insertions(+) create mode 100644 packages/spiderable/package.js create mode 100644 packages/spiderable/spiderable.html create mode 100644 packages/spiderable/spiderable.js diff --git a/packages/spiderable/package.js b/packages/spiderable/package.js new file mode 100644 index 0000000000..6951f41fc0 --- /dev/null +++ b/packages/spiderable/package.js @@ -0,0 +1,10 @@ +Package.describe({ + summary: "Makes the application crawlable to web spiders." +}); + +Package.on_use(function (api) { + api.use(['templating'], 'client'); + + api.add_files('spiderable.html', 'client'); + api.add_files('spiderable.js', 'server'); +}); diff --git a/packages/spiderable/spiderable.html b/packages/spiderable/spiderable.html new file mode 100644 index 0000000000..7cbdf71b89 --- /dev/null +++ b/packages/spiderable/spiderable.html @@ -0,0 +1 @@ + diff --git a/packages/spiderable/spiderable.js b/packages/spiderable/spiderable.js new file mode 100644 index 0000000000..fb162ad348 --- /dev/null +++ b/packages/spiderable/spiderable.js @@ -0,0 +1,71 @@ +(function () { + var fs = __meteor_bootstrap__.require('fs'); + var spawn = __meteor_bootstrap__.require('child_process').spawn; + var querystring = __meteor_bootstrap__.require('querystring'); + var app = __meteor_bootstrap__.app; + + app.use(function (req, res, next) { + if (/\?.*_escaped_fragment_=/.test(req.url)) { + // get escaped fragment out of the url. Gross! + var preQuery = req.url.split("?")[0]; + var queryStr = req.url.split("?")[1]; + var parsed = querystring.parse(queryStr); + delete parsed['_escaped_fragment_']; + var newQuery = querystring.stringify(parsed); + var newPath = preQuery + (newQuery ? "?" + newQuery : ""); + var url = "http://" + req.headers.host + newPath; + console.log("GB", url); + + // run phantomjs + var tmpfile = "/tmp/" + + (((1+Math.random())*0x1000000)|0).toString(16) + ".js"; + fs.writeFile( + tmpfile, + "var url = '" + url + "';" + +"var page = require('webpage').create();" + + +"page.open(url);" + + +"var lastContent;" + +"var settledCount = 0;" + +"var count = 0;" + + +"setInterval(function() {" + +" var connected = page.evaluate(function () {" + +" return typeof Meteor !== 'undefined' && Meteor.status().connected;" + +" });" + +" if (!connected || page.content !== lastContent) {" + +" settledCount = 0;" + +" lastContent = page.content;" + +" } else {" + +" settledCount += 1;" + +" }" + + +" if (settledCount >= 3 || count >= 100) {" + +" var out = page.content;" + +" out = out.replace(/]+>(.|\\n|\\r)*?<\\/script\\s*>/ig, '');" + +" out = out.replace('', '');" + + +" console.log(out);" + +" phantom.exit();" + +" }" + +"}, 100);", + function (err) { + if (err) { // can't write file? + next(); + return; + } + // XXX make sure phantomjs in the path! + var cp = spawn('phantomjs', ['--load-images=no', tmpfile]); + cp.on('exit', function (code) { + // XXX look at code + res.end(); + fs.unlink(tmpfile); + }); + cp.stdout.pipe(res); + }); + } else { + next(); + } + }); +})(); From 78c47533b5e86e5c36e739c2f9d44c3f5b77e50d Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Thu, 2 Aug 2012 22:20:46 -0700 Subject: [PATCH 04/16] Initial documentation. --- docs/client/docs.js | 1 + docs/client/packages.html | 1 + docs/client/packages/spiderable.html | 33 ++++++++++++++++++++++++++++ 3 files changed, 35 insertions(+) create mode 100644 docs/client/packages/spiderable.html diff --git a/docs/client/docs.js b/docs/client/docs.js index 3018e1cd40..9afd559a41 100644 --- a/docs/client/docs.js +++ b/docs/client/docs.js @@ -194,6 +194,7 @@ var toc = [ "jquery", "less", "sass", + "spiderable", "stylus", "showdown", "underscore" diff --git a/docs/client/packages.html b/docs/client/packages.html index 65cbde7bd1..1c12157077 100644 --- a/docs/client/packages.html +++ b/docs/client/packages.html @@ -24,6 +24,7 @@ and removed with: {{> pkg_jquery}} {{> pkg_less}} {{> pkg_sass}} +{{> pkg_spiderable}} {{> pkg_stylus}} {{> pkg_showdown}} {{> pkg_underscore}} diff --git a/docs/client/packages/spiderable.html b/docs/client/packages/spiderable.html new file mode 100644 index 0000000000..3682ad45c8 --- /dev/null +++ b/docs/client/packages/spiderable.html @@ -0,0 +1,33 @@ + From 0d27fa40f223dac1a552562f3ba6c7f780bb1ba4 Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Thu, 2 Aug 2012 22:39:28 -0700 Subject: [PATCH 05/16] Fix encoding. --- packages/spiderable/spiderable.js | 3 +++ 1 file changed, 3 insertions(+) diff --git a/packages/spiderable/spiderable.js b/packages/spiderable/spiderable.js index fb162ad348..17ff0c2b3a 100644 --- a/packages/spiderable/spiderable.js +++ b/packages/spiderable/spiderable.js @@ -62,6 +62,9 @@ res.end(); fs.unlink(tmpfile); }); + // phantomjs prints in utf8. + res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'}); + cp.stdout.pipe(res); }); } else { From 7632dc03866a5887d4a6d9a7c1f90fc4058682ef Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Thu, 2 Aug 2012 23:06:41 -0700 Subject: [PATCH 06/16] Avoid writing a tempfile by using '/dev/stdin'. Hacky, but functional. --- packages/spiderable/spiderable.js | 40 +++++++++++++++---------------- 1 file changed, 19 insertions(+), 21 deletions(-) diff --git a/packages/spiderable/spiderable.js b/packages/spiderable/spiderable.js index 17ff0c2b3a..ee4d3e26bb 100644 --- a/packages/spiderable/spiderable.js +++ b/packages/spiderable/spiderable.js @@ -17,10 +17,22 @@ console.log("GB", url); // run phantomjs - var tmpfile = "/tmp/" + - (((1+Math.random())*0x1000000)|0).toString(16) + ".js"; - fs.writeFile( - tmpfile, + // XXX make sure phantomjs in the path! + // + // Use '/dev/stdin' to avoid writing to a temporary file. Can't + // just omit the file, as PhantomJS takes that to mean 'use a + // REPL' and exits as soon as stdin closes. + var cp = spawn('phantomjs', ['--load-images=no', '/dev/stdin']); + cp.on('exit', function (code) { + // XXX look at code + res.end(); + }); + // phantomjs prints in utf8. + res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'}); + + cp.stdout.pipe(res); + + cp.stdin.write( "var url = '" + url + "';" + "var page = require('webpage').create();" + @@ -49,24 +61,10 @@ " console.log(out);" + " phantom.exit();" + " }" + -"}, 100);", - function (err) { - if (err) { // can't write file? - next(); - return; - } - // XXX make sure phantomjs in the path! - var cp = spawn('phantomjs', ['--load-images=no', tmpfile]); - cp.on('exit', function (code) { - // XXX look at code - res.end(); - fs.unlink(tmpfile); - }); - // phantomjs prints in utf8. - res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'}); +"}, 100);"); + cp.stdin.end(); + - cp.stdout.pipe(res); - }); } else { next(); } From 81cb0239f062e9be76fac925d915821b9cc856ad Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Fri, 3 Aug 2012 18:11:25 -0700 Subject: [PATCH 07/16] Check for errors from phantomjs. --- packages/spiderable/spiderable.js | 34 ++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/packages/spiderable/spiderable.js b/packages/spiderable/spiderable.js index ee4d3e26bb..2a0bb8d5fd 100644 --- a/packages/spiderable/spiderable.js +++ b/packages/spiderable/spiderable.js @@ -14,23 +14,38 @@ var newQuery = querystring.stringify(parsed); var newPath = preQuery + (newQuery ? "?" + newQuery : ""); var url = "http://" + req.headers.host + newPath; - console.log("GB", url); // run phantomjs - // XXX make sure phantomjs in the path! // // Use '/dev/stdin' to avoid writing to a temporary file. Can't // just omit the file, as PhantomJS takes that to mean 'use a // REPL' and exits as soon as stdin closes. var cp = spawn('phantomjs', ['--load-images=no', '/dev/stdin']); - cp.on('exit', function (code) { - // XXX look at code - res.end(); - }); - // phantomjs prints in utf8. - res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'}); - cp.stdout.pipe(res); + var data = ''; + cp.stdout.setEncoding('utf8'); + cp.stdout.on('data', function (chunk) { + data += chunk; + }); + + cp.on('exit', function (code) { + if (0 === code && //i.test(data)) { + res.writeHead(200, {'Content-Type': 'text/html; charset=UTF-8'}); + res.end(data); + } else { + // phantomjs failed. Don't send the error, instead send the + // normal page. + if (code === 127) + Meteor._debug("spiderable: phantomjs not installed. Download and install from http://phantomjs.org/"); + else + Meteor._debug("spiderable: phantomjs failed:", code, data); + + next(); + } + }); + + // don't crash w/ EPIPE if phantomjs isn't installed. + cp.stdin.on('error', function () {}); cp.stdin.write( "var url = '" + url + "';" + @@ -64,7 +79,6 @@ "}, 100);"); cp.stdin.end(); - } else { next(); } From ee7fc09c164b30f52eab238a533ad2f026c76c59 Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Fri, 3 Aug 2012 18:12:59 -0700 Subject: [PATCH 08/16] Handle ? in query string better. --- packages/spiderable/spiderable.js | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/packages/spiderable/spiderable.js b/packages/spiderable/spiderable.js index 2a0bb8d5fd..3cd0baad0a 100644 --- a/packages/spiderable/spiderable.js +++ b/packages/spiderable/spiderable.js @@ -6,9 +6,10 @@ app.use(function (req, res, next) { if (/\?.*_escaped_fragment_=/.test(req.url)) { - // get escaped fragment out of the url. Gross! - var preQuery = req.url.split("?")[0]; - var queryStr = req.url.split("?")[1]; + // get escaped fragment out of the url. + var idx = req.url.indexOf('?'); + var preQuery = req.url.substr(0, idx); + var queryStr = req.url.substr(idx + 1); var parsed = querystring.parse(queryStr); delete parsed['_escaped_fragment_']; var newQuery = querystring.stringify(parsed); From 24c2fe9d7f0b63170ff48d5a7ce0b50053fac78c Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Fri, 3 Aug 2012 19:06:14 -0700 Subject: [PATCH 09/16] Add timeout so requests can't take forever. --- packages/spiderable/spiderable.js | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/packages/spiderable/spiderable.js b/packages/spiderable/spiderable.js index 3cd0baad0a..6dc13d9f37 100644 --- a/packages/spiderable/spiderable.js +++ b/packages/spiderable/spiderable.js @@ -4,6 +4,9 @@ var querystring = __meteor_bootstrap__.require('querystring'); var app = __meteor_bootstrap__.app; + // how long to let phantomjs run before we kill it + var REQUEST_TIMEOUT = 15*1000; + app.use(function (req, res, next) { if (/\?.*_escaped_fragment_=/.test(req.url)) { // get escaped fragment out of the url. @@ -80,6 +83,13 @@ "}, 100);"); cp.stdin.end(); + // Just kill it if it takes too long. + setTimeout(function () { + if (cp && cp.pid) { + cp.kill(); + } + }, REQUEST_TIMEOUT); + } else { next(); } From 33d53847c0bc8111294c0291070e1b964df3428a Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Fri, 3 Aug 2012 19:49:05 -0700 Subject: [PATCH 10/16] Make todos spiderable. --- examples/todos/.meteor/packages | 1 + examples/todos/client/todos.css | 2 ++ examples/todos/client/todos.html | 4 ++-- examples/todos/client/todos.js | 4 ++++ 4 files changed, 9 insertions(+), 2 deletions(-) diff --git a/examples/todos/.meteor/packages b/examples/todos/.meteor/packages index f96ebb32b8..cf1782e3c3 100644 --- a/examples/todos/.meteor/packages +++ b/examples/todos/.meteor/packages @@ -5,3 +5,4 @@ underscore backbone +spiderable diff --git a/examples/todos/client/todos.css b/examples/todos/client/todos.css index 6657d21e6a..c21e7c8436 100644 --- a/examples/todos/client/todos.css +++ b/examples/todos/client/todos.css @@ -131,6 +131,8 @@ h3 { #lists .list-name { cursor: pointer; + color: black; + text-decoration: none; } #createList { diff --git a/examples/todos/client/todos.html b/examples/todos/client/todos.html index f390e82c19..5cf0c45b8c 100644 --- a/examples/todos/client/todos.html +++ b/examples/todos/client/todos.html @@ -27,9 +27,9 @@
{{else}} {{/if}} diff --git a/examples/todos/client/todos.js b/examples/todos/client/todos.js index 1dfb23a220..f703b89fcb 100644 --- a/examples/todos/client/todos.js +++ b/examples/todos/client/todos.js @@ -88,6 +88,10 @@ Template.lists.events = { 'mousedown .list': function (evt) { // select list Router.setList(this._id); }, + 'click .list': function (evt) { + // prevent clicks on from refreshing the page. + evt.preventDefault(); + }, 'dblclick .list': function (evt) { // start editing list name Session.set('editing_listname', this._id); Meteor.flush(); // force DOM redraw, so we can focus the edit field From 07c703270cfec335747168af9151e0f90f5574c5 Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Fri, 3 Aug 2012 20:59:38 -0700 Subject: [PATCH 11/16] Use subscription readiness instead of timeout. This only looks at default_connection, though, which isn't good. May need to patch livedata. --- packages/spiderable/spiderable.js | 29 +++++++++++++++-------------- 1 file changed, 15 insertions(+), 14 deletions(-) diff --git a/packages/spiderable/spiderable.js b/packages/spiderable/spiderable.js index 6dc13d9f37..bc39c757cf 100644 --- a/packages/spiderable/spiderable.js +++ b/packages/spiderable/spiderable.js @@ -54,25 +54,26 @@ cp.stdin.write( "var url = '" + url + "';" + "var page = require('webpage').create();" + - "page.open(url);" + -"var lastContent;" + -"var settledCount = 0;" + -"var count = 0;" + - "setInterval(function() {" + -" var connected = page.evaluate(function () {" + -" return typeof Meteor !== 'undefined' && Meteor.status().connected;" + +" var ready = page.evaluate(function () {" + +// The page is ready when after a flush() there are no unready +// subscriptions. +// +// XXX this only takes into account the default connection, not any +// other connections we've made with Meteor.connect. +" if (typeof Meteor !== 'undefined' && Meteor.status().connected) {" + +" Meteor.flush();" + + // abstraction violation! need a clean way to check this. +" for (var k in Meteor.default_connection.sub_ready_callbacks)" + +" return false;" + +" return true;" + +" } " + +" return false;" + " });" + -" if (!connected || page.content !== lastContent) {" + -" settledCount = 0;" + -" lastContent = page.content;" + -" } else {" + -" settledCount += 1;" + -" }" + -" if (settledCount >= 3 || count >= 100) {" + +" if (ready) {" + " var out = page.content;" + " out = out.replace(/]+>(.|\\n|\\r)*?<\\/script\\s*>/ig, '');" + " out = out.replace('', '');" + From 0397945fd8f8379c65e7d79405a22e5c9c45f110 Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Fri, 3 Aug 2012 22:00:25 -0700 Subject: [PATCH 12/16] Add hack in livedata_connection to support knowing when all data is received on all connections. --- packages/livedata/livedata_connection.js | 15 ++++++++++++++- packages/spiderable/spiderable.js | 12 ++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/packages/livedata/livedata_connection.js b/packages/livedata/livedata_connection.js index aa213fad59..dad5f48223 100644 --- a/packages/livedata/livedata_connection.js +++ b/packages/livedata/livedata_connection.js @@ -575,7 +575,9 @@ _.extend(Meteor, { // "http://subdomain.meteor.com/sockjs" (deprecated), // "/sockjs" (deprecated) connect: function (url, _restartOnUpdate) { - return new Meteor._LivedataConnection(url, _restartOnUpdate); + var ret = new Meteor._LivedataConnection(url, _restartOnUpdate); + Meteor._LivedataConnection._allConnections.push(ret); // hack. see below. + return ret; }, autosubscribe: function (sub_func) { @@ -604,3 +606,14 @@ _.extend(Meteor, { } }); + +// Hack for `spiderable` package: a way to see if the page is done +// loading all the data it needs. +Meteor._LivedataConnection._allConnections = []; +Meteor._LivedataConnection._allSubscriptionsReady = function () { + return _.all(Meteor._LivedataConnection._allConnections, function (conn) { + for (var k in conn.sub_ready_callbacks) + return false; + return true; + }); +}; diff --git a/packages/spiderable/spiderable.js b/packages/spiderable/spiderable.js index bc39c757cf..153baa4f0e 100644 --- a/packages/spiderable/spiderable.js +++ b/packages/spiderable/spiderable.js @@ -58,18 +58,10 @@ "setInterval(function() {" + " var ready = page.evaluate(function () {" + -// The page is ready when after a flush() there are no unready -// subscriptions. -// -// XXX this only takes into account the default connection, not any -// other connections we've made with Meteor.connect. " if (typeof Meteor !== 'undefined' && Meteor.status().connected) {" + " Meteor.flush();" + - // abstraction violation! need a clean way to check this. -" for (var k in Meteor.default_connection.sub_ready_callbacks)" + -" return false;" + -" return true;" + -" } " + +" return Meteor._LivedataConnection._allSubscriptionsReady();" + +" }" + " return false;" + " });" + From f55a824f2c2d0b3c3d6a8b42d63aeb03a6e25fce Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Mon, 6 Aug 2012 16:33:14 -0700 Subject: [PATCH 13/16] Tweak docs. --- docs/.meteor/packages | 1 + docs/client/packages/spiderable.html | 36 +++++++++++++++++----------- 2 files changed, 23 insertions(+), 14 deletions(-) diff --git a/docs/.meteor/packages b/docs/.meteor/packages index 78d056fca5..36eb4b5aea 100644 --- a/docs/.meteor/packages +++ b/docs/.meteor/packages @@ -9,3 +9,4 @@ showdown code-prettify jquery-waypoints less +spiderable diff --git a/docs/client/packages/spiderable.html b/docs/client/packages/spiderable.html index 3682ad45c8..2255f02978 100644 --- a/docs/client/packages/spiderable.html +++ b/docs/client/packages/spiderable.html @@ -2,30 +2,38 @@ {{#better_markdown}} ## `spiderable` -The `spiderable` package makes an application crawlable by web -spiders. It uses the AJAX Crawling specification published by Google -to serve pre-rendered HTML to web spiders that follow the protocol -(Google, Bing, Yandex, and more). + +The `spiderable` package is a temporary solution to allow web search +engines to index a Meteor application. It uses the AJAX +Crawling specification published by Google to serve HTML to +compatible spiders (Google, Bing, Yandex, and more). + +When a spider requests an HTML snapshot of a page the Meteor server runs +the client half of the application inside phantomjs, a headless browser, and +returns the full HTML generated by the client code. + +{{#warning}} +This is a temporary approach to allow Meteor applications to be +searchable. Expect significant changes to this package. +{{/warning}} In order to have links between multiple pages on a site visible to spiders, apps must use real links (eg ``) rather than simply re-rendering portions of the page when an element is clicked. Apps should render their content based on the URL of the page and can use HTML5 push-state to alter the URL on the client without -triggering a page reload. See the Todos -example for a demonstration. +triggering a page reload. See the Todos example for a +demonstration. -{{#warning}} -The current implementation of the spiderable package is -inefficient and is meant as an temporary solution. Expect significant -changes to this package. -{{/warning}} {{#warning}} If you deploy your application with `meteor bundle`, you must install -`phantomjs` (http://phantomjs.org) -somewhere in your `$PATH`. If you use `meteor deploy` this is already -taken care of. +`phantomjs` (http://phantomjs.org) somewhere in your +`$PATH`. If you use `meteor deploy` this is already taken care of. {{/warning}} From f5415248cb65498b913cde9e5e47e925924d1e7c Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Mon, 6 Aug 2012 16:54:13 -0700 Subject: [PATCH 14/16] Deploy over SSL. Missed this in the ssl pass last release. --- app/meteor/deploy.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/meteor/deploy.js b/app/meteor/deploy.js index 264a18a562..bcc8be6de1 100644 --- a/app/meteor/deploy.js +++ b/app/meteor/deploy.js @@ -23,7 +23,7 @@ var DEPLOY_HOSTNAME = 'deploy.meteor.com'; // interactively prompt for here. var meteor_rpc = function (rpc_name, method, site, query_params, callback) { - var url = "http://" + DEPLOY_HOSTNAME + '/' + rpc_name + '/' + site; + var url = "https://" + DEPLOY_HOSTNAME + '/' + rpc_name + '/' + site; if (!_.isEmpty(query_params)) url += '?' + qs.stringify(query_params); @@ -309,7 +309,7 @@ var read_password = function (callback) { // called exactly once. Calls callback with the entered password, or // undefined if no password is required. var with_password = function (site, callback) { - var check_url = "http://" + DEPLOY_HOSTNAME + "/has_password/" + site; + var check_url = "https://" + DEPLOY_HOSTNAME + "/has_password/" + site; request(check_url, function (error, response, body) { if (error || response.statusCode !== 200) { From 961e985801b1984d3e5a22b2c72878b19ed4ca77 Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Tue, 7 Aug 2012 21:41:39 -0700 Subject: [PATCH 15/16] Update history. --- History.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/History.md b/History.md index 24f763d382..75d6a6f4da 100644 --- a/History.md +++ b/History.md @@ -1,6 +1,10 @@ ## vNEXT +* Add `spiderable` package to allow web crawlers to index Meteor apps. + +* `meteor deploy` uses SSL to protect application deployment. + * Fix `stopImmediatePropagation()`. #205 ## v0.3.8 From 92b848fe1aff55658ae38d4e1b1aeb081370ca12 Mon Sep 17 00:00:00 2001 From: Nick Martin Date: Tue, 7 Aug 2012 23:02:12 -0700 Subject: [PATCH 16/16] Update version for release 0.3.9. --- History.md | 3 +++ admin/debian/changelog | 2 +- admin/install-s3.sh | 2 +- admin/manifest.json | 6 +++--- admin/meteor.spec | 2 +- app/lib/updater.js | 2 +- app/meteor/post-upgrade.js | 2 +- docs/client/docs.html | 2 +- docs/client/docs.js | 2 +- 9 files changed, 13 insertions(+), 10 deletions(-) diff --git a/History.md b/History.md index 75d6a6f4da..364ca06904 100644 --- a/History.md +++ b/History.md @@ -1,12 +1,15 @@ ## vNEXT +## v0.3.9 + * Add `spiderable` package to allow web crawlers to index Meteor apps. * `meteor deploy` uses SSL to protect application deployment. * Fix `stopImmediatePropagation()`. #205 + ## v0.3.8 * HTTPS support diff --git a/admin/debian/changelog b/admin/debian/changelog index 1eec8a34ea..e7af1136c1 100644 --- a/admin/debian/changelog +++ b/admin/debian/changelog @@ -1,4 +1,4 @@ -meteor (0.3.8-1) unstable; urgency=low +meteor (0.3.9-1) unstable; urgency=low * Automated debian build. diff --git a/admin/install-s3.sh b/admin/install-s3.sh index 46f122a00c..a98a5a6f93 100755 --- a/admin/install-s3.sh +++ b/admin/install-s3.sh @@ -5,7 +5,7 @@ ## example. URLBASE="https://d3sqy0vbqsdhku.cloudfront.net" -VERSION="0.3.8" +VERSION="0.3.9" PKGVERSION="${VERSION}-1" UNAME=`uname` diff --git a/admin/manifest.json b/admin/manifest.json index 07f0e7ce07..6909f075f4 100644 --- a/admin/manifest.json +++ b/admin/manifest.json @@ -1,6 +1,6 @@ { - "version": "0.3.8", - "deb_version": "0.3.8-1", - "rpm_version": "0.3.8-1", + "version": "0.3.9", + "deb_version": "0.3.9-1", + "rpm_version": "0.3.9-1", "urlbase": "https://d3sqy0vbqsdhku.cloudfront.net" } diff --git a/admin/meteor.spec b/admin/meteor.spec index 3d8fcc5660..b158cf9dfd 100644 --- a/admin/meteor.spec +++ b/admin/meteor.spec @@ -5,7 +5,7 @@ Summary: Meteor platform and JavaScript application server Vendor: Meteor Name: meteor -Version: 0.3.8 +Version: 0.3.9 Release: 1 License: MIT Group: Networking/WWW diff --git a/app/lib/updater.js b/app/lib/updater.js index 24762d830b..d4fda9083c 100644 --- a/app/lib/updater.js +++ b/app/lib/updater.js @@ -1,4 +1,4 @@ -exports.CURRENT_VERSION = "0.3.8"; +exports.CURRENT_VERSION = "0.3.9"; var fs = require("fs"); var http = require("http"); diff --git a/app/meteor/post-upgrade.js b/app/meteor/post-upgrade.js index dbb3a2d33b..d1755703ce 100644 --- a/app/meteor/post-upgrade.js +++ b/app/meteor/post-upgrade.js @@ -2,7 +2,7 @@ try { // XXX can't get this from updater.js because in 0.3.7 and before the // updater didn't have the right NODE_PATH set. At some point we can // remove this and just use updater.CURRENT_VERSION. - var VERSION = "0.3.8"; + var VERSION = "0.3.9"; var fs = require('fs'); var path = require('path'); diff --git a/docs/client/docs.html b/docs/client/docs.html index 6d5a108050..7ac14a97f5 100644 --- a/docs/client/docs.html +++ b/docs/client/docs.html @@ -11,7 +11,7 @@
-

Meteor 0.3.8

+

Meteor 0.3.9

{{> introduction }} {{> concepts }} {{> api }} diff --git a/docs/client/docs.js b/docs/client/docs.js index 9afd559a41..c79d83b199 100644 --- a/docs/client/docs.js +++ b/docs/client/docs.js @@ -1,4 +1,4 @@ -METEOR_VERSION = "0.3.8"; +METEOR_VERSION = "0.3.9"; Meteor.startup(function () { // XXX this is broken by the new multi-page layout. Also, it was