Skip to content

Commit

Permalink
fix(resolve): moves labels rule check to broader scope
Browse files Browse the repository at this point in the history
  • Loading branch information
bzlibby committed Aug 15, 2020
1 parent 6a55a75 commit 65b0de5
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 29 deletions.
7 changes: 6 additions & 1 deletion docs/api/cautious-journey.md

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

6 changes: 2 additions & 4 deletions src/labels.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ export interface ChangeSet {
/**
* Common fields for all labels.
*/
export interface BaseLabel {
export interface BaseLabel extends ChangeSet {
/**
* Label name.
*/
Expand All @@ -46,9 +46,7 @@ export interface BaseLabel {
/**
* Individual labels: the equivalent of a checkbox.
*/
export interface FlagLabel extends BaseLabel, ChangeSet {
requires: Array<LabelRef>;
}
export type FlagLabel = BaseLabel;

/**
* The transition between two state values.
Expand Down
55 changes: 31 additions & 24 deletions src/resolve.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { FlagLabel, getValueName, prioritySort, StateLabel } from './labels';
import { FlagLabel, getValueName, prioritySort, StateLabel, BaseLabel } from './labels';

/**
* How a label changed.
Expand Down Expand Up @@ -63,43 +63,50 @@ export function resolveLabels(options: ResolveInput): ResolveResult {
const changes: Array<ChangeRecord> = [];
const errors: Array<ErrorRecord> = [];

const sortedFlags = prioritySort(options.flags);
for (const flag of sortedFlags) {
const { name } = flag;

if (activeLabels.has(name)) {
let removed = false;
for (const requiredLabel of flag.requires) {
function checkLabelRules(label: BaseLabel) {
let isRemoved = false;
if (activeLabels.has(label.name)) {
for (const requiredLabel of label.requires) {
if (!activeLabels.has(requiredLabel.name)) {
activeLabels.delete(name);
removed = true;
activeLabels.delete(label.name);
isRemoved = true;
}
}
}
if (isRemoved) {
return;
}

if (removed) {
break;
}

for (const addedLabel of flag.adds) {
activeLabels.add(addedLabel.name);
}
for (const addedLabel of label.adds) {
activeLabels.add(addedLabel.name);
}

for (const removedLabel of flag.removes) {
activeLabels.delete(removedLabel.name);
}
for (const removedLabel of label.removes) {
activeLabels.delete(removedLabel.name);
}
}

const sortedFlags = prioritySort(options.flags);
for (const flag of sortedFlags) {
checkLabelRules(flag);
}

const sortedStates = prioritySort(options.states);
for (const state of sortedStates) {
let firstActive = true;
const sortedValues = prioritySort(state.values);
for (const value of sortedValues) {
const name = getValueName(state, value);
if (activeLabels.has(name)) {
// TODO: check higher-priority values
// TODO: check removes
// TODO: check requires
// TODO: check becomes
if (firstActive) {
// TODO: check requires
// TODO: check adds
// TODO: check removes
// TODO: check becomes
firstActive = false;
} else {
// removes all other values for this state and breaks?
}
}
}
}
Expand Down

0 comments on commit 65b0de5

Please sign in to comment.