-
Notifications
You must be signed in to change notification settings - Fork 79
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
* Create page and section variant Signed-off-by: Marcos Candeia <marrcooos@gmail.com> * Rename variants to page name Signed-off-by: Marcos Candeia <marrcooos@gmail.com> * Move to multivariate flag Signed-off-by: Marcos Candeia <marrcooos@gmail.com> * Add multivariate flag for sections Signed-off-by: Marcos Candeia <marrcooos@gmail.com> * Remove multivariate comment Signed-off-by: Marcos Candeia <marrcooos@gmail.com> * Update deco ver Signed-off-by: Marcos Candeia <marrcooos@gmail.com> --------- Signed-off-by: Marcos Candeia <marrcooos@gmail.com>
- Loading branch information
Showing
7 changed files
with
105 additions
and
68 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,59 +1 @@ | ||
import { MultivariateFlag, Variant } from "deco/blocks/flag.ts"; | ||
import { Section } from "deco/blocks/section.ts"; | ||
import { asResolved } from "deco/engine/core/resolver.ts"; | ||
|
||
/** | ||
* @title Multivariate | ||
*/ | ||
export type MultivariateProps<T = Section[]> = MultivariateFlag<T>; | ||
|
||
/** | ||
* @title Variant | ||
* @label hidden | ||
*/ | ||
export default function MultivariateFlag( | ||
props: MultivariateProps<Section[]>, | ||
): MultivariateFlag<Section[]> { | ||
return props; | ||
} | ||
|
||
const isMultivariateProps = ( | ||
props: unknown | MultivariateProps<unknown>, | ||
): props is MultivariateProps<unknown> => { | ||
return (props as MultivariateProps<unknown>)?.variants !== undefined && | ||
Array.isArray((props as MultivariateProps<unknown>)?.variants); | ||
}; | ||
|
||
const isVariant = ( | ||
variant: unknown | Variant<unknown>, | ||
): variant is Variant<unknown> => { | ||
return (variant as Variant<unknown>).value !== undefined && | ||
typeof variant === "object"; | ||
}; | ||
|
||
/** | ||
* This is used to avoid resolving flag values before matcher is actually evaluated | ||
*/ | ||
export const onBeforeResolveProps = (props: unknown) => { | ||
if (isMultivariateProps(props)) { | ||
const newVariants = []; | ||
for (const variant of props.variants) { | ||
if (isVariant(variant)) { | ||
newVariants.push({ | ||
...variant, | ||
value: asResolved(variant.value, true), | ||
}); | ||
} else { | ||
newVariants.push(variant); | ||
} | ||
} | ||
if (newVariants.length > 0) { // avoid shallow copy | ||
return { | ||
...props, | ||
variants: newVariants, | ||
}; | ||
} | ||
return props; | ||
} | ||
return props; | ||
}; | ||
export { default, onBeforeResolveProps } from "./multivariate/page.ts"; |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
export { onBeforeResolveProps } from "../../utils/multivariate.ts"; | ||
import { MultivariateFlag } from "deco/blocks/flag.ts"; | ||
import { Section } from "deco/blocks/section.ts"; | ||
import multivariate, { MultivariateProps } from "../../utils/multivariate.ts"; | ||
|
||
/** | ||
* @title Page Variants | ||
*/ | ||
export default function PageVariants( | ||
props: MultivariateProps<Section[]>, | ||
): MultivariateFlag<Section[]> { | ||
return multivariate(props); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
export { onBeforeResolveProps } from "../../utils/multivariate.ts"; | ||
import { MultivariateFlag } from "deco/blocks/flag.ts"; | ||
import { Section } from "deco/blocks/section.ts"; | ||
import multivariate, { MultivariateProps } from "../../utils/multivariate.ts"; | ||
|
||
/** | ||
* @title Section Variants | ||
*/ | ||
export default function SectionVariants( | ||
props: MultivariateProps<Section>, | ||
): MultivariateFlag<Section> { | ||
return multivariate(props); | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,64 @@ | ||
import { MultivariateFlag, Variant } from "deco/blocks/flag.ts"; | ||
import { asResolved } from "deco/engine/core/resolver.ts"; | ||
|
||
/** | ||
* @title Multivariate | ||
*/ | ||
export interface MultivariateProps<T> { | ||
/** | ||
* @minItems 1 | ||
* @addBehavior 1 | ||
*/ | ||
variants: Variant<T>[]; | ||
} | ||
|
||
/** | ||
* @title Variant | ||
* @label hidden | ||
*/ | ||
export default function MultivariateFlag<T>( | ||
props: MultivariateProps<T>, | ||
): MultivariateFlag<T> { | ||
return props; | ||
} | ||
|
||
const isMultivariateProps = ( | ||
props: unknown | MultivariateProps<unknown>, | ||
): props is MultivariateProps<unknown> => { | ||
return (props as MultivariateProps<unknown>)?.variants !== undefined && | ||
Array.isArray((props as MultivariateProps<unknown>)?.variants); | ||
}; | ||
|
||
const isVariant = ( | ||
variant: unknown | Variant<unknown>, | ||
): variant is Variant<unknown> => { | ||
return (variant as Variant<unknown>).value !== undefined && | ||
typeof variant === "object"; | ||
}; | ||
|
||
/** | ||
* This is used to avoid resolving flag values before matcher is actually evaluated | ||
*/ | ||
export const onBeforeResolveProps = (props: unknown) => { | ||
if (isMultivariateProps(props)) { | ||
const newVariants = []; | ||
for (const variant of props.variants) { | ||
if (isVariant(variant)) { | ||
newVariants.push({ | ||
...variant, | ||
value: asResolved(variant.value, true), | ||
}); | ||
} else { | ||
newVariants.push(variant); | ||
} | ||
} | ||
if (newVariants.length > 0) { // avoid shallow copy | ||
return { | ||
...props, | ||
variants: newVariants, | ||
}; | ||
} | ||
return props; | ||
} | ||
return props; | ||
}; |