Skip to content
This repository has been archived by the owner on Oct 23, 2023. It is now read-only.

Commit

Permalink
docs: determine linked releases on build (#726)
Browse files Browse the repository at this point in the history
* docs: determine linked releases on build

* chore: fix circleci config

* chore: ensure cursor: pointer for release buttons
  • Loading branch information
marionebl authored and tilmx committed Jan 8, 2019
1 parent ae5e388 commit 7aeef0c
Show file tree
Hide file tree
Showing 9 changed files with 9,939 additions and 51 deletions.
23 changes: 22 additions & 1 deletion .circleci/config.yml
Original file line number Diff line number Diff line change
Expand Up @@ -268,6 +268,11 @@ jobs:
- setup:
key: linux

- run:
name: Fetch release data
command: alva-trigger --dry-run --project=packages/core --data=packages/site/src/release-data.ts


- run:
name: Compile site
command: lerna run compile --scope=@meetalva/site --stream
Expand All @@ -290,6 +295,10 @@ jobs:
- setup:
key: linux

- run:
name: Fetch release data
command: alva-trigger --dry-run --project=packages/core --data=packages/site/src/release-data.ts

- run:
name: Compile site
command: lerna run compile --scope=@meetalva/site --stream
Expand All @@ -312,8 +321,20 @@ workflows:
- lint
- bundle
- compile
- site
- site:
requires:
- macos
- linux
- windows
filters:
branches:
ignore:
- master
- site_master:
requires:
- macos
- linux
- windows
filters:
branches:
only:
Expand Down
2 changes: 1 addition & 1 deletion packages/site/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@
"url": "https://github.com/meetalva/alva/issues"
},
"dependencies": {
"@meetalva/designkit": "^1.2.0",
"@meetalva/designkit": "^1.2.1",
"@types/react": "16.4.11",
"@types/react-helmet": "5.0.6",
"emotion-server": "^10.0.6",
Expand Down
9,673 changes: 9,673 additions & 0 deletions packages/site/src/releases-data.ts

Large diffs are not rendered by default.

156 changes: 156 additions & 0 deletions packages/site/src/releases.tsx
Original file line number Diff line number Diff line change
@@ -0,0 +1,156 @@
import * as React from 'react';
import * as Path from 'path';
import * as D from '@meetalva/designkit';
import styled from '@emotion/styled';
import data from './releases-data';

enum Os {
macOS = 'macOS ',
Windows = 'Windows',
Linux = 'Linux ',
Unknown = ' '
}

enum Extension {
exe = 'exe',
dmg = 'dmg',
appimage = 'AppImage',
Unknown = 'Unknown'
}

const StyledLink =
styled.a <
{ white: boolean } >
`
cursor: pointer;
color: ${props => (props.white ? D.Color.White : 'inherit')};
`;

const Link: React.SFC<{ href: string; white: boolean }> = props => {
return (
<StyledLink href={props.href} target="_blank" rel="noopener" white={props.white}>
{props.children}
</StyledLink>
);
};

export class Releases extends React.Component {
public state = {
os: Os.Unknown
};

public componentDidMount() {
this.setState({ os: getOS() });
}

public render() {
const releases = (data.releases || []).filter(r => !r.draft);
const alphaReleases = (data.canary || [])
.map((id: any) => releases.find((r: any) => r.id === id))
.filter(Boolean);
const stableReleases = (data.stable || [])
.map((id: any) => releases.find((r: any) => r.id === id))
.filter(Boolean);

const alpha = alphaReleases[0];
const stable = stableReleases[0];

const stableLink = getReleaseLink(stable, this.state.os);
const alphaLink = getReleaseLink(alpha, this.state.os);

const stableLinks = [
getReleaseLink(stable, Os.macOS),
getReleaseLink(stable, Os.Windows),
getReleaseLink(stable, Os.Linux)
].filter(l => l.os !== stableLink.os);

return (
<div>
<div style={{ display: 'flex' }}>
<Link href={stableLink.link} white={false}>
<D.Button order={D.ButtonOrder.Primary}>
Get Alva {this.state.os !== Os.Unknown ? `for` : ' '} {this.state.os}
</D.Button>
</Link>
<D.Space size={D.SpaceSize.XS} />
<Link href={alphaLink.link} white={false}>
<D.Button order={D.ButtonOrder.Secondary}>Get Alva Canary</D.Button>
</Link>
</div>
<D.Space size={D.SpaceSize.S} />
<D.Copy color={D.Color.Grey70} size={D.CopySize.Small}>
Also available for{' '}
{stableLinks.map((link, i) => (
<React.Fragment key={link.os}>
<Link href={link.link} white>
{link.os}
</Link>
{getSeperator(stableLinks.length, i)}
</React.Fragment>
))}.
</D.Copy>
<D.Copy color={D.Color.Grey70} size={D.CopySize.Small}>
Check all{' '}
<Link href={stable ? stable.html_url : ''} white>
supported platforms
</Link>
.
</D.Copy>
</div>
);
}
}

function getSeperator(length: number, index: number): string {
if (index >= length - 1) {
return '';
}

return index === length - 2 ? ' and ' : ', ';
}

function getReleaseLink(release: any, os: Os): { os: Os; link: string } {
if (!release) {
return { os, link: `https://github.com/meetalva/alva/releases/` };
}

const asset = release.assets.find(
(a: any) => Path.extname(a.name).slice(1) === getFileExtension(os)
);

if (release && !asset) {
return { os, link: release.html_url };
}

return { os, link: asset ? asset.browser_download_url : release.html_url };
}

function getOS(): Os {
if (typeof window === 'undefined') {
return Os.Unknown;
}
switch (navigator.platform.split(' ')[0]) {
case 'MacIntel':
return Os.macOS;
case 'Win32':
case 'Win64':
return Os.Windows;
case 'Linux':
return Os.Linux;
default:
return Os.Unknown;
}
}

function getFileExtension(os: Os): Extension {
switch (os) {
case Os.macOS:
return Extension.dmg;
case Os.Windows:
return Extension.exe;
case Os.Linux:
return Extension.appimage;
case Os.Unknown:
return Extension.Unknown;
}
}
22 changes: 22 additions & 0 deletions packages/site/src/render.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { globalCss } from './global-css';
import { Helmet } from 'react-helmet';

export const render = (input: any) => {
// tslint:disable-next-line:no-submodule-imports
const ReactDOM = require('react-dom/server');

const html = ReactDOM.renderToString(input.default());
const helmet = Helmet.renderStatic();

return {
head: [
helmet.title.toString(),
helmet.meta.toString(),
helmet.link.toString(),
`<style>${globalCss}</style>`,
helmet.style.toString()
].join('\n'),
html,
after: ''
};
};
41 changes: 3 additions & 38 deletions packages/site/src/site.tsx
Original file line number Diff line number Diff line change
@@ -1,31 +1,9 @@
import * as React from 'react';
import { Helmet } from 'react-helmet';
import * as D from '@meetalva/designkit';
import { globalCss } from './global-css';
import { Releases } from './releases';

export const render = (input: any) => {
// tslint:disable-next-line:no-submodule-imports
const ReactDOM = require('react-dom/server');

const html = ReactDOM.renderToString(input.default());
const helmet = Helmet.renderStatic();

return {
head: [
helmet.title.toString(),
helmet.meta.toString(),
helmet.link.toString(),
`<style>${globalCss}</style>`,
helmet.style.toString()
].join('\n'),
html,
after: [helmet.script.toString()].join('\n')
};
};

const MACOS_RELEASE = 'https://github.com/meetalva/alva/releases/download/v0.8.0/Alva-0.8.0.dmg';
const WINDOW_RELEASE = 'https://github.com/meetalva/alva/releases/download/v0.8.0/Alva-0.8.0.exe';
const LINUX_RELEASE = 'https://github.com/meetalva/alva/releases/latest';
export * from './render';

const Page: React.StatelessComponent<void> = (): JSX.Element => {
return (
Expand Down Expand Up @@ -103,20 +81,7 @@ const Page: React.StatelessComponent<void> = (): JSX.Element => {
</D.Copy>
</D.Layout>
<D.Space size={D.SpaceSize.L} />
<a href={MACOS_RELEASE} target="_blank" rel="noopener">
<D.Button order={D.ButtonOrder.Primary}>Download Beta for macOS</D.Button>
</a>
<D.Space size={D.SpaceSize.S} />
<D.Copy color={D.Color.Grey70} size={D.CopySize.Small}>
Also available for{' '}
<a href={WINDOW_RELEASE} target="_blank" style={{ color: '#fff' }}>
Windows
</a>{' '}
and{' '}
<a href={LINUX_RELEASE} target="_blank" style={{ color: '#fff' }}>
Linux
</a>
</D.Copy>
<Releases />
<D.Space size={D.SpaceSize.XL} />
</D.Section>
<D.Feature
Expand Down
16 changes: 16 additions & 0 deletions packages/tools/alva-trigger.js
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,22 @@ async function main(cli) {

const latestRelease = sortedReleases[0];

if (cli.data) {
const releases = sortedReleases.map(release => ({
parsed: semverUtils.parse(release.tag_name),
release
}));

await writeFile(cli.data, `export default ${JSON.stringify({
releases: sortedReleases,
stable: releases.filter(r => !r.parsed.release).map(r => r.release.id),
canary: releases.filter(r => r.parsed.release && r.parsed.release.includes('alpha')).map(r => r.release.id),
beta: releases.filter(r => r.parsed.release && r.parsed.release.includes('beta')).map(r => r.release.id),
}, null, ' ')}`);

return;
}

if (latestRelease && semver.gt(manifest.version, latestRelease.tag_name)) {
console.log(`${prefix}trigger full draft release for ${manifest.name}@${manifest.version}`);
return;
Expand Down
4 changes: 2 additions & 2 deletions patternplate.config.js
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,8 @@ const favicon = `<svg width="50" height="50" viewBox="10 10 100 100" xmlns="http
module.exports = {
docs: ["*.md", "docs/**/*.md"],
entry: ["packages/core/build/components/**/demo.js"],
mount: "@patternplate/render-default/mount",
render: "@patternplate/render-default/render",
mount: "@patternplate/render-react/mount",
render: "@patternplate/render-react/render",
cover: "@meetalva/site",
ui: {
logo,
Expand Down
Loading

1 comment on commit 7aeef0c

@marionebl
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Please sign in to comment.