This module validates project configuration objects or JSON strings and turns
valid partial configuration objects into full configurations with sensible
defaults. The file schema is specified in warhol.schema.json
. An example:
{
"patternLibUrl": "https://foo.com/components",
"patternLibHeaders": {
"DNT": "1"
},
"patternLibCookies": [{
"name": "Hello",
"value": "42",
"expires": 9000,
"domain": "foo.com",
"sameSite": "Lax"
}],
"breakpoints": [
1280, 1024, 800, 400, 280
],
"theme": {
"colors": {
"colorsUrl": "https://foo.com/components/theme/colors",
"sources": ".swatch",
"properties": [ "background-color", "color" ]
},
"typography": {
"typographyUrl": "https://foo.com/components/theme/typography",
"sources": ".typo",
"properties": [ "font-family", "font-size", "font-weight", "font-style" ]
},
"icons": {
"iconsUrl": "https://foo.com/components/theme/icons",
"sources": ".icon",
"type": "font"
}
},
"utils": {
"iconsUrl": "https://foo.com/components/theme/utils",
"sources": [
{ "type": "rule", "selector": ".align-left" },
{ "type": "rule", "selector": ".align-right" },
{ "type": "element", "selector": ".shadow", "components": [ ".foo", ".notEqualToSource" ] }
]
},
"components": [
{ "source": ".foo" },
{ "source": ".bar", "target": ".notEqualToSource" },
{ "source": ".baz", "url": "https://foo.com/components/baz" }
]
}
- v9.0.0: new fields
patternLibHeaders
andpatternLibHeaders
- v8.0.0:
name
on components and utils no longer defaults tonull
but rather tosource
andselector
respectively, fixing #10
URL for the pattern library's main page ("kitchen sink"), if any. Can be overruled for each component and theme configuration with their own URLs. If the pattern library URL is not specified, components and themes (or sub-sections of themes) must provide their own URLs.
Header to set when accessing the pattern library.
Cookies to set when accessing the pattern library. Cookie object type:
type Cookie = {
name: string;
value: string;
path?: string;
url?: string;
domain?: string;
expires?: number;
httpOnly?: boolean;
secure?: boolean;
sameSite?: "Lax" | "Strict";
};
Note that the JSON schema requires the number in expires
to be an integer and
that it also requires either url
or domain
to be defined, even though both
are optional properties on the resulting output type.
Breakpoints for the pattern library (and the production page that implements the pattern lib), controls the screen widths at which snapshots for the components are taken.
List of component definitions. A component definition is an object with the following fields:
source
(string
, required, non-empty): source selectortarget
(string
, optional, non-empty): target selector, defaults to the source selectorname
(string
, optional, non-empty): component name, defaults to to the source selectorcomponentUrl
(string
ornull
, optional or required depending on the pattern lib URL): this component's own URL, defaults to the pattern lib URL. If no pattern lib URL was specified, this field is required for each component.
Theme configuration for colors, typography and such.
Theme URL, can be overruled by the URLs specified in the theme's sub-properties.
Configuration for theme colors with the following fields:
sources
(string
, required, non-empty): selector for color source elementsproperties
(enum of css color properties, optional, defaults to[ "background-color" ]
): configures the css properties to use as a color source. CSS shorthand properties likebackground
are not allowed.colorsUrl
(string
ornull
, optional or required depending on the theme and pattern lib URLs, defaults to the theme or pattern lib URL): the url for the color sources
The colorsUrl
field is required if neither a pattern lib URL nor a theme url have been specified.
Configuration for theme typography with the following fields:
sources
(string
, required, non-empty): selector for elements that contain typography examplesproperties
(list of css properties, optional, defaults to[ "font-family", "font-size", "font-weight", "font-style" ]
): configures the css properties that define a typography example. CSS shorthand properties likefont
are not allowed.typographyUrl
(string
ornull
, optional or required depending on the theme and pattern lib URLs, defaults to the theme or pattern lib URL): the url for the typography examples
The typographyUrl
field is required if neither a pattern lib URL nor a theme url have been specified.
Configuration for theme icons with the following fields:
sources
(string
, required, non-empty): selector for elements that contain iconsiconsUrl
(string
ornull
, optional or required depending on the theme and pattern lib URLs, defaults to the theme or pattern lib URL): the url for the icon examplestype
("font"
, required): defines if icons are created using an icon font or in some other way (no other way is supported at this moment)
The iconsUrl
field is required if neither a pattern lib URL nor a theme url have been specified.
Definitions for style utilities (classes for alignment, layout, shadows and the like).
Utils URL, is only required if there is no top-level patternLibUrl
.
Sources for utilities. Each utility is described by an object:
type
(either"rule"
or"element"
): whether to read the utility styles from an element or from a css ruleselector
(string
, required, non-empty): the selector for the the style utilityname
(string
, optional, non-empty, defaults toselector
): utility name name, defaults toselector
List of components (specified by their target selector) that this utility can apply to. Each selector must match a component's target selector (or its source selector if the component in question has no target selector).
Validates a configuration object against the schema described above and fills in
the default values. Throws a InvalidConfigError
if the object does not conform
to the schema. The error's message
property contains a JSON-encoded
representation of the validation error thanks to better-ajv-errors.
An example:
[
{
"start": {
"line": 1,
"column": 82,
"offset": 81
},
"end": {
"line": 1,
"column": 86,
"offset": 85
},
"error": "/components/1/source: type should be string",
"path": "/components/1/source"
}
]
Parses a JSON string into an object, validates the object against the schema
described above and fills in the default values. Throws a
MalformedConfigError
if the input is not valid JSON. Throws a
InvalidConfigError
like fromObject()
if the object does not conform to the
schema.
Configuration
ComponentConfiguration
ThemeConfiguration
ThemeColorsConfiguration
ThemeTypographyConfiguration
ThemeIconsConfiguration
CookieConfiguration
MalformedConfigError
: Invalid JSON inputInvalidConfigError
: Input JSON or object does not conform to the schema. The error message is the JS output provided by the package better-ajv-errorsNonsensicalConfigError
: A utility definition refers to a component that has not been defined