Skip to content

Commit 0d545fe

Browse files
committed
Add the front end components for initial testing
1 parent f94cf1e commit 0d545fe

39 files changed

+7634
-0
lines changed

.gitignore

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# JS
2+
node_modules
3+
dist
4+
lerna-debug.log
5+
yarn-error.log
6+
mix-manifest.json
7+
8+
# Macos
9+
.DS_Store
10+
11+
# PHP
12+
vendor
13+
.php_cs.cache
14+
.phpunit.result.cache
15+
16+
.env

build/build-js.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#!/usr/bin/env node
2+
import { readFileSync, existsSync } from "fs";
3+
import chalk from "chalk";
4+
import path from 'path';
5+
import execa from 'execa'
6+
import { packages } from './utils'
7+
import gzipSize from 'gzip-size';
8+
// import brotliSize from 'brotli-size'; // todo
9+
import prettyBytes from 'pretty-bytes';
10+
import ora from 'ora'
11+
const { parse } = JSON
12+
13+
async function buildPackages(packages) {
14+
15+
for(let pkg of packages) {
16+
process.chdir(path.resolve(__dirname, '../', pkg))
17+
const { name, version, scripts, main:pkgMain, module:pkgModule } = parse(readFileSync('./package.json', 'utf-8'))
18+
console.log(chalk.yellow(''.padEnd(40, '-')))
19+
console.log('', chalk.yellow(name.padEnd(25, ' ')), chalk.yellow(version.padEnd(15, ' ')))
20+
const installSpinner = ora(chalk.green('installing...'.padEnd(15, ' ')), chalk.yellow(name.padEnd(25, ' ')), chalk.yellow(version.padEnd(15, ' '))).start()
21+
await execa('yarn', ['install'])
22+
installSpinner.stopAndPersist()
23+
24+
if (scripts.build) {
25+
const buildSpinner = ora(chalk.green('building...'.padEnd(15, ' ')), chalk.yellow(name.padEnd(25, ' '))).start()
26+
await execa('yarn', ['run', 'build'])
27+
buildSpinner.stopAndPersist()
28+
} else {
29+
console.log(chalk.red(' no build step...'))
30+
}
31+
32+
if (pkgMain && existsSync(pkgMain)) {
33+
const mainSize = gzipSize.fileSync(pkgMain)
34+
console.log(chalk.blue(' common (gzip)'.padEnd(25, ' ')), chalk.cyan(prettyBytes(mainSize).padEnd(25, ' ')))
35+
}
36+
37+
if (pkgModule && existsSync(pkgModule)) {
38+
const moduleSize = gzipSize.fileSync(pkgModule)
39+
console.log(chalk.blue(' esm (gzip)'.padEnd(25, ' ')), chalk.cyan(prettyBytes(moduleSize).padEnd(25, ' ')))
40+
}
41+
42+
console.log() // empty for new line
43+
}
44+
}
45+
46+
47+
buildPackages(packages)

build/github-api.js

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import fetch from 'node-fetch'
2+
import semver from 'semver'
3+
4+
let latestRelease = null;
5+
export async function getLatestRelease() {
6+
if (latestRelease) return latestRelease
7+
const releaseData = await fetch("https://api.github.com/repos/reed-jones/phase/releases/latest")
8+
return latestRelease = await releaseData.json()
9+
}
10+
11+
let releases = []
12+
export async function getReleases() {
13+
if (releases.length) return releases
14+
const releasesData = await fetch("https://api.github.com/repos/reed-jones/phase/releases")
15+
return releases = await releasesData.json();
16+
}
17+
18+
export async function createRelease(version, body) {
19+
const data = {
20+
tag_name: version,
21+
name: version,
22+
draft: false,
23+
prerelease: false,
24+
body
25+
}
26+
27+
const response = await fetch('https://api.github.com/repos/reed-jones/phase/releases', {
28+
method: 'post',
29+
body: JSON.stringify(data),
30+
headers: {
31+
'Content-Type': 'application/json',
32+
Accept: 'application/vnd.github.v3+json',
33+
Authorization: `token ${process.env.GITHUB_TOKEN}`
34+
}
35+
});
36+
return await response.json();
37+
}
38+
39+
let tags = []
40+
export async function getTags() {
41+
if (tags.length) return tags
42+
const tagsData = await fetch("https://api.github.com/repos/reed-jones/phase/tags")
43+
const rawTags = await tagsData.json()
44+
return tags = rawTags.sort((a,b) => semver.compare(b.name, a.name))
45+
}
46+
47+
export async function getLatestTag() {
48+
if (tags.length) return tags[0]
49+
await getTags()
50+
return tags[0]
51+
}

build/release-js.js

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { packages } from './utils'
2+
import execa from 'execa'
3+
import chalk from "chalk";
4+
5+
async function releasePackages(packages) {
6+
packages.forEach(pkg => {
7+
process.chdir(path.resolve(__dirname, '../', pkg))
8+
console.log('Publishing...', chalk.yellow(process.cwd()))
9+
execa.sync('npm publish --access public')
10+
})
11+
}
12+
13+
releasePackages(packages)

build/release-notes.js

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import { getLatestRelease, getLatestTag, createRelease } from "./github-api";
2+
import {
3+
git,
4+
parseChangelogLine,
5+
acceptableLines,
6+
formatLine,
7+
formatDiff,
8+
} from "./utils";
9+
10+
async function generateChangelog() {
11+
12+
const { tag_name } = await getLatestRelease();
13+
const tag = await getLatestTag();
14+
15+
const log =
16+
git(`log --pretty=format:"[%h] %s (%an <%ae>)" ${tag_name}...HEAD`)
17+
.map(parseChangelogLine)
18+
.filter(acceptableLines)
19+
.map(formatLine)
20+
.join("\n") || "No notable commits tracked";
21+
22+
const pkgs = [
23+
...new Set(
24+
git(
25+
[
26+
`diff --name-only ${tag_name}...HEAD packages`,
27+
`':(exclude)*/package.json'`,
28+
`':(exclude)*/composer.json'`,
29+
`':(exclude)*/__tests__/*'`,
30+
].join(" ")
31+
)
32+
.map(formatDiff(tag))
33+
.filter(Boolean)
34+
),
35+
].join("\n");
36+
37+
const date = new Date
38+
const formattedDate = `${date.getFullYear()}-${`${date.getMonth() + 1}`.padStart(2, '0')}-${`${date.getDate()}`.padStart(2, '0')}`;
39+
40+
const body = [
41+
`## [${tag.name}](https://github.com/reed-jones/phase/compare/${tag_name}...${tag.name}) - ${formattedDate}`,
42+
'\n',
43+
`## Notable commits since the last release (${tag_name}...${tag.name}):`,
44+
`\n${log}`,
45+
`\n`,
46+
"## Packages updated in this release",
47+
`\n${pkgs}\n`,
48+
].join("\n");
49+
50+
return createRelease(tag.name, body)
51+
}
52+
53+
generateChangelog()
54+
.then(console.log)
55+
.catch(console.error);

build/release-php.sh

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
5+
VERSION=$1
6+
VERSION_REGEX="^v[0-9]+\.[0-9]+\.[0-9]+$"
7+
8+
if [[ ! $VERSION =~ $VERSION_REGEX ]]
9+
then
10+
echo "Version must match the format vX.X.X"
11+
12+
exit 1
13+
fi
14+
15+
git tag $VERSION
16+
git push origin --tags
17+
18+
for REMOTE in routing state phase
19+
do
20+
echo ""
21+
echo ""
22+
echo "Releasing $REMOTE";
23+
24+
TMP_DIR="/tmp/phased-php"
25+
REMOTE_URL="[email protected]:reed-jones/phase-$REMOTE-php.git"
26+
27+
rm -rf $TMP_DIR;
28+
mkdir $TMP_DIR;
29+
30+
(
31+
cd $TMP_DIR;
32+
33+
git clone $REMOTE_URL .
34+
git checkout master
35+
git tag $VERSION
36+
git push origin --tags
37+
)
38+
done

build/rollup.js

Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
import sucrase from "@rollup/plugin-sucrase";
2+
import commonjs from '@rollup/plugin-commonjs'
3+
import resolve from "@rollup/plugin-node-resolve";
4+
import { terser } from "rollup-plugin-terser";
5+
import alias from "@rollup/plugin-alias";
6+
7+
export const { ROLLUP_WATCH = false, NODE_ENV = 'development' } = process.env;
8+
export const production = !ROLLUP_WATCH && NODE_ENV === "production";
9+
10+
export const outputs = {
11+
cjs: pkg => ({ file: pkg.main, format: "cjs" }),
12+
esm: pkg => ({ file: pkg.module, format: "es" })
13+
}
14+
15+
export const externals = {
16+
node: [
17+
"path",
18+
"fs",
19+
"child_process",
20+
"os",
21+
"assert",
22+
"events",
23+
"util",
24+
"module",
25+
"stream",
26+
"constants"
27+
]
28+
}
29+
30+
export const plugins = {
31+
alias: alias({
32+
entries: [
33+
{
34+
find: "@",
35+
replacement: "./lib"
36+
}
37+
],
38+
customResolver: resolve({
39+
extensions: ["ts"]
40+
})
41+
}),
42+
43+
resolve: resolve({
44+
extensions: [".ts"]
45+
}),
46+
47+
sucrase: sucrase({
48+
exclude: ["node_modules/**", "types/**", "__tests__"],
49+
transforms: ["typescript"]
50+
}),
51+
52+
commonjs: commonjs({
53+
//
54+
}),
55+
56+
terser: production && terser({
57+
//
58+
})
59+
}

build/split-php.sh

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env bash
2+
3+
set -e
4+
set -x
5+
6+
function split()
7+
{
8+
# https://github.com/splitsh/lite
9+
SHA1=`./build/splitsh-lite --prefix=$1 `
10+
git push $2 "$SHA1:refs/heads/master" -f
11+
}
12+
13+
function remote()
14+
{
15+
git remote add $1 $2 || true
16+
}
17+
18+
git pull origin master
19+
20+
# remote preset [email protected]:reed-jones/phase-preset-php.git
21+
remote routing [email protected]:reed-jones/phase-routing-php.git
22+
remote state [email protected]:reed-jones/phase-state-php.git
23+
remote phase [email protected]:reed-jones/phase-phase-php.git
24+
25+
# split 'src/Phased/Preset' preset
26+
split 'packages/Phased/Routing' routing
27+
split 'packages/Phased/State' state
28+
split 'packages/Phased/Phase' phase

build/splitsh-lite

3.22 MB
Binary file not shown.

build/utils.js

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,65 @@
1+
import { execSync } from "child_process";
2+
import { existsSync } from "fs";
3+
import { join } from 'path'
4+
5+
export const packages = [
6+
"packages/@vuexhydrate/types",
7+
"packages/@vuexhydrate/state",
8+
"packages/@vuexhydrate/routing",
9+
"packages/@vuexhydrate/webpack-plugin",
10+
"packages/@vuexhydrate/laravel-mix",
11+
"packages/@vuexhydrate/phase",
12+
];
13+
14+
export function git(cmd) {
15+
return execSync(`git ${cmd}`).toString().trim().split("\n");
16+
}
17+
18+
// release/changelog parseing
19+
export function parseChangelogLine(line) {
20+
const regex = /^\[(?<hash>.{7,7})\] (?<type>[\w\s\d]*)(\((?<scope>.*)\))?: (?<change>.*) \((?<author>.*)\)$/gm;
21+
let m;
22+
23+
while ((m = regex.exec(line)) !== null) {
24+
// This is necessary to avoid infinite loops with zero-width matches
25+
if (m.index === regex.lastIndex) {
26+
regex.lastIndex++;
27+
}
28+
return m.groups;
29+
}
30+
}
31+
32+
export function acceptableLines(line) {
33+
if (!line) return false;
34+
if (line.change.startsWith("wip")) return false;
35+
if (line.scope && line.scope.includes("release")) return false;
36+
return true;
37+
}
38+
39+
export function formatLine(line) {
40+
return `- [${line.hash}]: **${line.type}${
41+
line.scope ? `(**_${line.scope}_**)` : ""
42+
}**: ${line.change} - (${line.author})`;
43+
}
44+
45+
export function formatDiff(tag) {
46+
return function(line) {
47+
const [_, _base, _package] = line.split("/")
48+
const file = `./packages/${_base}/${_package}/package.json`
49+
const isForNpm = existsSync(file)
50+
const version = isForNpm
51+
? require(join("..", file)).version
52+
: tag.name.replace(/^v/, "")
53+
54+
const pkg = {
55+
base: _base,
56+
package: _package,
57+
version,
58+
manager: isForNpm ? "npm" : "composer",
59+
}
60+
61+
return `- _[${`${pkg.manager}`.padEnd(8, " ")}]_ **${pkg.base}/${
62+
pkg.package
63+
}**@_${pkg.version}_`.toLowerCase();
64+
}
65+
}

0 commit comments

Comments
 (0)