feat(main): seed random generator with project name
This commit is contained in:
parent
54c6f4a6fc
commit
50cf48fdcf
|
@ -27,6 +27,7 @@
|
||||||
"@types/mocha": "8.0.1",
|
"@types/mocha": "8.0.1",
|
||||||
"@types/react": "^16.9.45",
|
"@types/react": "^16.9.45",
|
||||||
"@types/react-dom": "^16.9.8",
|
"@types/react-dom": "^16.9.8",
|
||||||
|
"@types/seedrandom": "^2.4.28",
|
||||||
"@types/sinon-chai": "3.2.4",
|
"@types/sinon-chai": "3.2.4",
|
||||||
"@types/source-map-support": "0.5.2",
|
"@types/source-map-support": "0.5.2",
|
||||||
"@types/yargs": "^15.0.5",
|
"@types/yargs": "^15.0.5",
|
||||||
|
@ -73,6 +74,7 @@
|
||||||
"rollup-plugin-uglify": "^6.0.4",
|
"rollup-plugin-uglify": "^6.0.4",
|
||||||
"rollup-plugin-visualizer": "^4.0.4",
|
"rollup-plugin-visualizer": "^4.0.4",
|
||||||
"rollup-plugin-yaml": "2.0.0",
|
"rollup-plugin-yaml": "2.0.0",
|
||||||
|
"seedrandom": "^3.0.5",
|
||||||
"sinon": "9.0.2",
|
"sinon": "9.0.2",
|
||||||
"sinon-chai": "3.5.0",
|
"sinon-chai": "3.5.0",
|
||||||
"source-map-support": "0.5.19",
|
"source-map-support": "0.5.19",
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { doesExist, InvalidArgumentError } from '@apextoaster/js-utils';
|
import { doesExist } from '@apextoaster/js-utils';
|
||||||
|
import { prng } from 'seedrandom';
|
||||||
|
|
||||||
import { randomItem } from './utils';
|
import { randomItem } from './utils';
|
||||||
|
|
||||||
|
@ -123,26 +124,16 @@ export function prioritySort<TLabel extends BaseLabel>(labels: Array<TLabel>): A
|
||||||
*
|
*
|
||||||
* TODO: this is a terrible overload
|
* TODO: this is a terrible overload
|
||||||
*/
|
*/
|
||||||
export function getLabelColor(flag: FlagLabel, colors: Array<string>): string;
|
export function getLabelColor(colors: Array<string>, random: prng, flag: FlagLabel): string;
|
||||||
export function getLabelColor(state: StateLabel, value: StateValue, colors: Array<string>): string;
|
export function getLabelColor(colors: Array<string>, random: prng, state: StateLabel, value: StateValue): string;
|
||||||
export function getLabelColor(label: BaseLabel, colorsOrValue: Array<string> | StateValue, maybeColors?: Array<string>): string {
|
export function getLabelColor(colors: Array<string>, random: prng, label: BaseLabel, value?: StateValue): string {
|
||||||
if (Array.isArray(colorsOrValue)) {
|
if (doesExist(value) && doesExist(value.color)) {
|
||||||
const { color } = label;
|
return value.color;
|
||||||
if (doesExist(color)) {
|
|
||||||
return color;
|
|
||||||
} else {
|
|
||||||
return randomItem(colorsOrValue);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!Array.isArray(maybeColors)) {
|
|
||||||
throw new InvalidArgumentError();
|
|
||||||
}
|
|
||||||
|
|
||||||
const { color = colorsOrValue.color } = label;
|
|
||||||
if (doesExist(color)) {
|
|
||||||
return color;
|
|
||||||
} else {
|
|
||||||
return randomItem(maybeColors);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (doesExist(label.color)) {
|
||||||
|
return label.color;
|
||||||
|
}
|
||||||
|
|
||||||
|
return randomItem(colors, random);
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { createSchema } from '@apextoaster/js-yaml-schema';
|
||||||
import { existsSync, readFileSync, realpathSync } from 'fs';
|
import { existsSync, readFileSync, realpathSync } from 'fs';
|
||||||
import { DEFAULT_SAFE_SCHEMA, safeLoad } from 'js-yaml';
|
import { DEFAULT_SAFE_SCHEMA, safeLoad } from 'js-yaml';
|
||||||
import { join } from 'path';
|
import { join } from 'path';
|
||||||
|
import { alea } from 'seedrandom';
|
||||||
|
|
||||||
import { ConfigData } from './config';
|
import { ConfigData } from './config';
|
||||||
import { Commands, createParser } from './config/args';
|
import { Commands, createParser } from './config/args';
|
||||||
|
@ -64,9 +65,10 @@ export async function main(argv: Array<string>): Promise<number> {
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const random = alea(name);
|
||||||
const remote = new GithubRemote({
|
const remote = new GithubRemote({
|
||||||
data: project.remote.data,
|
data: project.remote.data,
|
||||||
dryrun: args.dryrun || project.remote.dryrun,
|
dryrun: args.dryrun || project.remote.dryrun || false,
|
||||||
logger,
|
logger,
|
||||||
type: project.remote.type,
|
type: project.remote.type,
|
||||||
});
|
});
|
||||||
|
@ -78,6 +80,7 @@ export async function main(argv: Array<string>): Promise<number> {
|
||||||
flags,
|
flags,
|
||||||
logger,
|
logger,
|
||||||
project: name,
|
project: name,
|
||||||
|
random,
|
||||||
remote,
|
remote,
|
||||||
states,
|
states,
|
||||||
};
|
};
|
||||||
|
|
10
src/sync.ts
10
src/sync.ts
|
@ -1,5 +1,6 @@
|
||||||
import { doesExist, mustExist } from '@apextoaster/js-utils';
|
import { doesExist, mustExist } from '@apextoaster/js-utils';
|
||||||
import { Logger } from 'noicejs';
|
import { Logger } from 'noicejs';
|
||||||
|
import { prng } from 'seedrandom';
|
||||||
|
|
||||||
import { FlagLabel, getLabelColor, getLabelNames, getValueName, StateLabel } from './labels';
|
import { FlagLabel, getLabelColor, getLabelNames, getValueName, StateLabel } from './labels';
|
||||||
import { LabelUpdate, Remote } from './remote';
|
import { LabelUpdate, Remote } from './remote';
|
||||||
|
@ -17,6 +18,7 @@ export interface SyncOptions {
|
||||||
|
|
||||||
logger: Logger;
|
logger: Logger;
|
||||||
project: string;
|
project: string;
|
||||||
|
random: prng;
|
||||||
remote: Remote;
|
remote: Remote;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -103,7 +105,7 @@ export async function createLabel(options: SyncOptions, name: string) {
|
||||||
const flag = options.flags.find((it) => name === it.name);
|
const flag = options.flags.find((it) => name === it.name);
|
||||||
if (doesExist(flag)) {
|
if (doesExist(flag)) {
|
||||||
await options.remote.createLabel({
|
await options.remote.createLabel({
|
||||||
color: getLabelColor(flag, options.colors),
|
color: getLabelColor(options.colors, options.random, flag),
|
||||||
desc: mustExist(flag.desc),
|
desc: mustExist(flag.desc),
|
||||||
name,
|
name,
|
||||||
project: options.project,
|
project: options.project,
|
||||||
|
@ -117,7 +119,7 @@ export async function createLabel(options: SyncOptions, name: string) {
|
||||||
const value = state.values.find((it) => getValueName(state, it) === name);
|
const value = state.values.find((it) => getValueName(state, it) === name);
|
||||||
if (doesExist(value)) {
|
if (doesExist(value)) {
|
||||||
await options.remote.createLabel({
|
await options.remote.createLabel({
|
||||||
color: getLabelColor(state, value, options.colors),
|
color: getLabelColor(options.colors, options.random, state, value),
|
||||||
desc: defaultUntil(value.desc, state.desc, ''),
|
desc: defaultUntil(value.desc, state.desc, ''),
|
||||||
name: getValueName(state, value),
|
name: getValueName(state, value),
|
||||||
project: options.project,
|
project: options.project,
|
||||||
|
@ -153,7 +155,7 @@ export async function syncSingleLabel(options: SyncOptions, label: LabelUpdate):
|
||||||
const flag = options.flags.find((it) => label.name === it.name);
|
const flag = options.flags.find((it) => label.name === it.name);
|
||||||
if (doesExist(flag)) {
|
if (doesExist(flag)) {
|
||||||
await syncLabelDiff(options, label, {
|
await syncLabelDiff(options, label, {
|
||||||
color: getLabelColor(flag, options.colors),
|
color: getLabelColor(options.colors, options.random, flag),
|
||||||
desc: defaultTo(flag.desc, label.desc),
|
desc: defaultTo(flag.desc, label.desc),
|
||||||
name: flag.name,
|
name: flag.name,
|
||||||
project: options.project,
|
project: options.project,
|
||||||
|
@ -167,7 +169,7 @@ export async function syncSingleLabel(options: SyncOptions, label: LabelUpdate):
|
||||||
const value = state.values.find((it) => getValueName(state, it) === label.name);
|
const value = state.values.find((it) => getValueName(state, it) === label.name);
|
||||||
if (doesExist(value)) {
|
if (doesExist(value)) {
|
||||||
await syncLabelDiff(options, label, {
|
await syncLabelDiff(options, label, {
|
||||||
color: getLabelColor(state, value, options.colors),
|
color: getLabelColor(options.colors, options.random, state, value),
|
||||||
desc: defaultTo(value.desc, label.desc),
|
desc: defaultTo(value.desc, label.desc),
|
||||||
name: getValueName(state, value),
|
name: getValueName(state, value),
|
||||||
project: options.project,
|
project: options.project,
|
||||||
|
|
|
@ -1,4 +1,5 @@
|
||||||
import { doesExist, Optional, mustExist } from '@apextoaster/js-utils';
|
import { doesExist, mustExist, Optional } from '@apextoaster/js-utils';
|
||||||
|
import { prng } from 'seedrandom';
|
||||||
|
|
||||||
export function defaultTo<T>(a: Optional<T>, b: T): T {
|
export function defaultTo<T>(a: Optional<T>, b: T): T {
|
||||||
if (doesExist(a)) {
|
if (doesExist(a)) {
|
||||||
|
@ -13,7 +14,7 @@ export function defaultUntil<T>(...items: Array<Optional<T>>): T {
|
||||||
return mustExist(result);
|
return mustExist(result);
|
||||||
}
|
}
|
||||||
|
|
||||||
export function randomItem<T>(items: Array<T>, source = Math.random): T {
|
export function randomItem<T>(items: Array<T>, source: prng): T {
|
||||||
const idx = Math.floor(source() * items.length);
|
const idx = Math.floor(source() * items.length);
|
||||||
return items[idx];
|
return items[idx];
|
||||||
}
|
}
|
||||||
|
|
10
yarn.lock
10
yarn.lock
|
@ -592,6 +592,11 @@
|
||||||
dependencies:
|
dependencies:
|
||||||
"@types/node" "*"
|
"@types/node" "*"
|
||||||
|
|
||||||
|
"@types/seedrandom@^2.4.28":
|
||||||
|
version "2.4.28"
|
||||||
|
resolved "https://artifacts.apextoaster.com/repository/group-npm/@types/seedrandom/-/seedrandom-2.4.28.tgz#9ce8fa048c1e8c85cb71d7fe4d704e000226036f"
|
||||||
|
integrity sha512-SMA+fUwULwK7sd/ZJicUztiPs8F1yCPwF3O23Z9uQ32ME5Ha0NmDK9+QTsYE4O2tHXChzXomSWWeIhCnoN1LqA==
|
||||||
|
|
||||||
"@types/sinon-chai@3.2.4":
|
"@types/sinon-chai@3.2.4":
|
||||||
version "3.2.4"
|
version "3.2.4"
|
||||||
resolved "https://artifacts.apextoaster.com/repository/group-npm/@types/sinon-chai/-/sinon-chai-3.2.4.tgz#c425625681f4f8d3a43a7551a77f590ce1c49b21"
|
resolved "https://artifacts.apextoaster.com/repository/group-npm/@types/sinon-chai/-/sinon-chai-3.2.4.tgz#c425625681f4f8d3a43a7551a77f590ce1c49b21"
|
||||||
|
@ -4556,6 +4561,11 @@ scheduler@^0.19.1:
|
||||||
loose-envify "^1.1.0"
|
loose-envify "^1.1.0"
|
||||||
object-assign "^4.1.1"
|
object-assign "^4.1.1"
|
||||||
|
|
||||||
|
seedrandom@^3.0.5:
|
||||||
|
version "3.0.5"
|
||||||
|
resolved "https://artifacts.apextoaster.com/repository/group-npm/seedrandom/-/seedrandom-3.0.5.tgz#54edc85c95222525b0c7a6f6b3543d8e0b3aa0a7"
|
||||||
|
integrity sha512-8OwmbklUNzwezjGInmZ+2clQmExQPvomqjL7LFqOYqtmuxRgQYqOD3mHaU+MvZn5FLUeVxVfQjwLZW/n/JFuqg==
|
||||||
|
|
||||||
semver-compare@^1.0.0:
|
semver-compare@^1.0.0:
|
||||||
version "1.0.0"
|
version "1.0.0"
|
||||||
resolved "https://artifacts.apextoaster.com/repository/group-npm/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
|
resolved "https://artifacts.apextoaster.com/repository/group-npm/semver-compare/-/semver-compare-1.0.0.tgz#0dee216a1c941ab37e9efb1788f6afc5ff5537fc"
|
||||||
|
|
Loading…
Reference in New Issue