All files / src/lib/schema feature-schema.ts

100% Statements 14/14
100% Branches 0/0
100% Functions 2/2
100% Lines 14/14

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 12968x 68x 68x   68x         68x                         68x             68x                                             68x       71x   68x                                   68x                                                 9x           68x                           68x              
import joi from 'joi';
import { ALL_OPERATORS } from '../util/constants';
import { nameType } from '../routes/util';
 
export const nameSchema = joi
    .object()
    .keys({ name: nameType })
    .options({ stripUnknown: true, allowUnknown: false, abortEarly: false });
 
export const constraintSchema = joi.object().keys({
    contextName: joi.string().required(),
    operator: joi
        .string()
        .valid(...ALL_OPERATORS)
        .required(),
    // Constraints must have a values array to support legacy SDKs.
    values: joi.array().items(joi.string().min(1).max(100)).default([]),
    value: joi.optional(),
    caseInsensitive: joi.boolean().optional(),
    inverted: joi.boolean().optional(),
});
 
export const strategiesSchema = joi.object().keys({
    id: joi.string().optional(),
    name: nameType,
    constraints: joi.array().allow(null).items(constraintSchema),
    parameters: joi.object(),
});
 
export const variantsSchema = joi.object().keys({
    name: nameType,
    weight: joi.number().min(0).max(1000).required(),
    weightType: joi.string().valid('variable', 'fix').default('variable'),
    payload: joi
        .object()
        .keys({
            type: joi.string().required(),
            value: joi.string().required(),
        })
        .optional(),
    stickiness: joi.string().default('default'),
    overrides: joi.array().items(
        joi
            .object()
            .keys({
                contextName: joi.string().required(),
                values: joi.array().items(joi.string()),
            })
            .optional(),
    ),
});
 
export const variantsArraySchema = joi
    .array()
    .min(0)
    .items(variantsSchema)
    .unique((a, b) => a.name === b.name);
 
export const featureMetadataSchema = joi
    .object()
    .keys({
        name: nameType,
        stale: joi.boolean().default(false),
        archived: joi.boolean().default(false),
        type: joi.string().default('release'),
        description: joi.string().allow('').allow(null).optional(),
        impressionData: joi
            .boolean()
            .allow(true)
            .allow(false)
            .default(false)
            .optional(),
        createdAt: joi.date().optional().allow(null),
    })
    .options({ allowUnknown: false, stripUnknown: true, abortEarly: false });
 
export const featureSchema = joi
    .object()
    .keys({
        name: nameType,
        enabled: joi.boolean().default(false),
        stale: joi.boolean().default(false),
        archived: joi.boolean().default(false),
        type: joi.string().default('release'),
        project: joi.string().default('default'),
        description: joi.string().allow('').allow(null).optional(),
        impressionData: joi
            .boolean()
            .allow(true)
            .allow(false)
            .default(false)
            .optional(),
        strategies: joi
            .array()
            .min(0)
            .allow(null)
            .optional()
            .items(strategiesSchema),
        variants: joi
            .array()
            .allow(null)
            .unique((a, b) => a.name === b.name)
            .optional()
            .items(variantsSchema),
    })
    .options({ allowUnknown: false, stripUnknown: true, abortEarly: false });
 
export const querySchema = joi
    .object()
    .keys({
        tag: joi
            .array()
            .allow(null)
            .items(joi.string().pattern(/\w+:.+/, { name: 'tag' }))
            .optional(),
        project: joi.array().allow(null).items(nameType).optional(),
        namePrefix: joi.string().allow(null).optional(),
        environment: joi.string().allow(null).optional(),
    })
    .options({ allowUnknown: false, stripUnknown: true, abortEarly: false });
 
export const featureTagSchema = joi.object().keys({
    featureName: nameType,
    tagType: nameType.optional(),
    tagValue: joi.string(),
    type: nameType.optional(),
    value: joi.string().optional(),
});