diff --git a/layouts/about-release-schedule.hbs b/layouts/about-release-schedule.hbs new file mode 100644 index 0000000000000..f4a1e657aaf77 --- /dev/null +++ b/layouts/about-release-schedule.hbs @@ -0,0 +1,35 @@ + + +{{> html-head }} + + + {{> header }} + +
+
+ + {{> navigation key='about'}} + +
+

{{ title }}

+ +

+ {{ title }} +

+ + {{{ release-schedule }}} + +

+ {{ schedule-footer }} +

+ + + {{{ contents }}} +
+ +
+
+ + {{> footer }} + + diff --git a/layouts/css/page-modules/_release-schedule.styl b/layouts/css/page-modules/_release-schedule.styl new file mode 100644 index 0000000000000..07f4239cd6892 --- /dev/null +++ b/layouts/css/page-modules/_release-schedule.styl @@ -0,0 +1,20 @@ +table.release-schedule + width 100% + font-size 1rem + border 1px solid $light-gray2 + + td + padding 5px + + > thead + font-weight 600 + text-align left + + > tbody + border-top 1px solid $light-gray2 + + tr:nth-child(odd) + background-color $light-gray3 + + tr:nth-child(even) + background-color $white diff --git a/layouts/css/styles.styl b/layouts/css/styles.styl index 4152bf149b577..022e989f411f7 100644 --- a/layouts/css/styles.styl +++ b/layouts/css/styles.styl @@ -17,6 +17,7 @@ @import 'page-modules/_scrollToTop' @import 'page-modules/_anchorLinks' @import 'page-modules/_prev-next-navigation' +@import 'page-modules/_release-schedule' .intro margin-top 140px diff --git a/locale/en/about/release-schedule.md b/locale/en/about/release-schedule.md new file mode 100644 index 0000000000000..c08383879bc13 --- /dev/null +++ b/locale/en/about/release-schedule.md @@ -0,0 +1,18 @@ +--- +layout: about-release-schedule.hbs +title: Release Schedule +statuses: + maintenance: 'Maintenance LTS' + active: 'Active LTS' + current: 'Current' + pending: 'Pending' +columns: + - 'Release' + - 'Status' + - 'Codename' + - 'Initial Release' + - 'Active LTS Start' + - 'Maintenance LTS Start' + - 'End-of-life' +schedule-footer: Dates are subject to change. +--- diff --git a/locale/en/site.json b/locale/en/site.json index c46ee8a75b196..1eb905a26db10 100644 --- a/locale/en/site.json +++ b/locale/en/site.json @@ -49,6 +49,10 @@ "link": "about/releases", "text": "Releases" }, + "release-schedule": { + "link": "about/release-schedule", + "text": "Release Schedule" + }, "resources": { "link": "about/resources", "text": "Resources" diff --git a/package.json b/package.json index 501fc3f67101b..d18f3049c3f34 100644 --- a/package.json +++ b/package.json @@ -8,8 +8,9 @@ "serve": "node server.js", "external:survey": "rsync -avz --exclude 'node_modules*' --exclude 'package*' external/survey-2018/ build/en/user-survey-report", "gzip": "find build -type f \\( -name '*.html' -o -name '*.css' -o -name '*.js' -o -name '*.xml' -o -name '*.json' \\) -exec gzip -kf9 {} \\;", - "deploy": "npm run build && npm run external:survey && npm run gzip", + "deploy": "npm run load-schedule && npm run build && npm run external:survey && npm run gzip", "load-versions": "node scripts/load-versions.js", + "load-schedule": "curl -sS https://raw.githubusercontent.com/nodejs/Release/master/schedule.json -o source/schedule.json", "start": "npm run serve", "test": "npm run test:lint && npm run test:unit && npm run test:smoke", "test:lint": "standard && htmllint **/*.hbs && stylint layouts/css", diff --git a/scripts/helpers/release-schedule.js b/scripts/helpers/release-schedule.js new file mode 100644 index 0000000000000..6e1f021bca2a9 --- /dev/null +++ b/scripts/helpers/release-schedule.js @@ -0,0 +1,62 @@ +'use strict' + +const schedule = require('../../source/schedule.json') + +const today = new Date() +const datify = (release, key) => new Date(schedule[release][key]) + +module.exports = context => { + const statuses = context.data.root.statuses + + const header = context.data.root.columns + .map(column => `${column}\n`) + .join('') + + let content = '' + + Object.keys(schedule) + .filter(release => datify(release, 'end') > today) + .forEach(release => { + const codename = schedule[release].codename + const codenameLink = codename + ? `${codename}` + : '' + + const releaseLink = datify(release, 'start') < today + ? `${release}` + : release + + let status + + if (datify(release, 'start') > today) { + status = statuses.pending + } else if (!schedule[release].lts || datify(release, 'lts') > today) { + status = statuses.current + } else if (datify(release, 'maintenance') < today) { + status = statuses.maintenance + } else if (datify(release, 'lts') < today) { + status = statuses.active + } + + content += ` + ${releaseLink} + ${status} + ${codenameLink} + ${schedule[release].start || ''} + ${schedule[release].lts || ''} + ${schedule[release].maintenance || ''} + ${schedule[release].end || ''} + ` + }) + + return ` + + + ${header} + + + ${content} + +
+ ` +} diff --git a/source/schedule.json b/source/schedule.json new file mode 100644 index 0000000000000..3eda10b8889eb --- /dev/null +++ b/source/schedule.json @@ -0,0 +1,65 @@ +{ + "v0.10": { + "start": "2013-03-11", + "end": "2016-10-31" + }, + "v0.12": { + "start": "2015-02-06", + "end": "2016-12-31" + }, + "v4": { + "start": "2015-09-08", + "lts": "2015-10-12", + "maintenance": "2017-04-01", + "end": "2018-04-30", + "codename": "Argon" + }, + "v5": { + "start": "2015-10-29", + "maintenance": "2016-04-30", + "end": "2016-06-30" + }, + "v6": { + "start": "2016-04-26", + "lts": "2016-10-18", + "maintenance": "2018-04-30", + "end": "2019-04-01", + "codename": "Boron" + }, + "v7": { + "start": "2016-10-25", + "maintenance": "2017-04-30", + "end": "2017-06-30" + }, + "v8": { + "start": "2017-05-30", + "lts": "2017-10-31", + "maintenance": "2019-04-01", + "end": "2019-12-31", + "codename": "Carbon" + }, + "v9": { + "start": "2017-10-01", + "maintenance": "2018-04-01", + "end": "2018-06-30" + }, + "v10": { + "start": "2018-04-24", + "lts": "2018-10-30", + "maintenance": "2020-04-01", + "end": "2021-04-01", + "codename": "Dubnium" + }, + "v11": { + "start": "2018-10-23", + "maintenance": "2019-04-01", + "end": "2019-06-30" + }, + "v12": { + "start": "2019-04-23", + "lts": "2019-10-22", + "maintenance": "2021-04-01", + "end": "2022-04-01", + "codename": "" + } +}