Files

300 lines
7.5 KiB
JavaScript

import {
buildFallbackSortJsonSchema,
buildRegexJsonSchema,
buildTypeJsonSchema,
orderJsonSchema,
} from './common-json-schemas.js'
/**
* JSON schema for the newlines between option. Validates configuration for
* adding newlines between different groups.
*/
var newlinesBetweenJsonSchema = {
oneOf: [
{
description: 'Specifies how to handle newlines between groups.',
enum: ['ignore'],
type: 'string',
},
{
type: 'number',
minimum: 0,
},
],
}
/**
* JSON schema for the newlines inside option.
*/
var newlinesInsideJsonSchema = {
oneOf: [
{
description: 'Specifies how to handle newlines between groups elements',
enum: ['ignore'],
type: 'string',
},
{
type: 'number',
minimum: 0,
},
],
}
function buildGroupsJsonSchema({
allowedAdditionalTypeValues,
additionalSortProperties,
}) {
return {
items: {
oneOf: [
{ type: 'string' },
{
items: { type: 'string' },
type: 'array',
minItems: 1,
},
{
properties: { newlinesBetween: newlinesBetweenJsonSchema },
required: ['newlinesBetween'],
additionalProperties: false,
type: 'object',
},
{
properties: {
group: {
oneOf: [
{ type: 'string' },
{
items: { type: 'string' },
type: 'array',
minItems: 1,
},
],
},
fallbackSort: buildFallbackSortJsonSchema({
additionalProperties: additionalSortProperties,
allowedAdditionalTypeValues,
}),
commentAbove: {
description: 'Specifies a comment to enforce above the group.',
type: 'string',
},
type: buildTypeJsonSchema({
allowedAdditionalValues: allowedAdditionalTypeValues,
}),
newlinesInside: newlinesInsideJsonSchema,
order: orderJsonSchema,
...additionalSortProperties,
},
additionalProperties: false,
required: ['group'],
minProperties: 2,
type: 'object',
},
],
},
description: 'Specifies a list of groups for sorting.',
type: 'array',
}
}
/**
* Builds JSON schema for custom groups array configuration.
*
* Creates a schema that validates an array of custom group definitions.
* Supports both single custom groups and "anyOf" groups containing multiple
* subgroups. Each group must have a groupName and can include various matching
* criteria.
*
* @example
*
* ```ts
* // Valid configuration:
* ;[
* {
* groupName: 'react',
* anyOf: [{ elementNamePattern: 'use*' }, { selector: 'hook' }],
* },
* {
* groupName: 'utils',
* elementNamePattern: '*Utils',
* },
* ]
* ```
*
* @param options - Configuration options.
* @param options.additionalSortProperties - Extra properties for sorting.
* @param options.additionalCustomGroupMatchProperties - Extra properties for
* matching custom groups.
* @returns JSON schema for custom groups array validation.
*/
function buildCustomGroupsArrayJsonSchema({
additionalCustomGroupMatchProperties,
allowedAdditionalTypeValues,
additionalSortProperties,
}) {
let commonCustomGroupJsonSchemas = buildCommonCustomGroupJsonSchemas({
allowedAdditionalTypeValues,
additionalSortProperties,
})
let populatedCustomGroupMatchOptionsJsonSchema =
buildPopulatedCustomGroupMatchPropertiesJsonSchema(
additionalCustomGroupMatchProperties,
)
return {
items: {
oneOf: [
{
properties: {
...commonCustomGroupJsonSchemas,
anyOf: {
items: {
properties: populatedCustomGroupMatchOptionsJsonSchema,
description: 'Custom group.',
additionalProperties: false,
type: 'object',
},
type: 'array',
minItems: 1,
},
},
description: 'Custom group block.',
required: ['groupName', 'anyOf'],
additionalProperties: false,
type: 'object',
},
{
properties: {
...commonCustomGroupJsonSchemas,
...populatedCustomGroupMatchOptionsJsonSchema,
},
description: 'Custom group.',
additionalProperties: false,
required: ['groupName'],
minProperties: 2,
type: 'object',
},
],
},
description: 'Defines custom groups to match specific members.',
type: 'array',
}
}
function buildCommonGroupsJsonSchemas({
additionalCustomGroupMatchProperties,
allowedAdditionalTypeValues,
additionalSortProperties,
} = {}) {
return {
customGroups: buildCustomGroupsArrayJsonSchema({
additionalCustomGroupMatchProperties,
allowedAdditionalTypeValues,
additionalSortProperties,
}),
newlinesInside: {
oneOf: [
newlinesInsideJsonSchema,
{
enum: ['newlinesBetween'],
type: 'string',
},
],
},
groups: buildGroupsJsonSchema({
allowedAdditionalTypeValues,
additionalSortProperties,
}),
newlinesBetween: newlinesBetweenJsonSchema,
}
}
/**
* Builds JSON schema for custom group modifiers configuration.
*
* Creates a schema that validates an array of modifiers that must be present on
* an element for it to match a custom group.
*
* @example
*
* ```ts
* // For TypeScript class members:
* buildCustomGroupModifiersJsonSchema([
* 'static',
* 'private',
* 'readonly',
* 'async',
* ])
* ```
*
* @param modifiers - Array of valid modifier names.
* @returns JSON schema for modifiers array validation.
*/
function buildCustomGroupModifiersJsonSchema(modifiers) {
return {
items: {
enum: [...modifiers],
type: 'string',
},
description: 'Modifier filters.',
type: 'array',
}
}
/**
* Builds JSON schema for custom group selector configuration.
*
* Creates a schema that validates a selector string used to match specific
* types of elements in a custom group.
*
* @example
*
* ```ts
* // For class members:
* buildCustomGroupSelectorJsonSchema([
* 'property',
* 'method',
* 'constructor',
* 'accessor',
* ])
* ```
*
* @param selectors - Array of valid selector names.
* @returns JSON schema for selector validation.
*/
function buildCustomGroupSelectorJsonSchema(selectors) {
return {
description: 'Selector filter.',
enum: [...selectors],
type: 'string',
}
}
function buildCommonCustomGroupJsonSchemas({
allowedAdditionalTypeValues,
additionalSortProperties,
}) {
return {
fallbackSort: buildFallbackSortJsonSchema({
additionalProperties: additionalSortProperties,
allowedAdditionalTypeValues,
}),
type: buildTypeJsonSchema({
allowedAdditionalValues: allowedAdditionalTypeValues,
}),
groupName: {
description: 'Custom group name.',
type: 'string',
},
newlinesInside: newlinesInsideJsonSchema,
order: orderJsonSchema,
...additionalSortProperties,
}
}
function buildPopulatedCustomGroupMatchPropertiesJsonSchema(
customGroupMatchOptionsJsonSchema,
) {
return {
elementNamePattern: buildRegexJsonSchema(),
...customGroupMatchOptionsJsonSchema,
}
}
export {
buildCommonGroupsJsonSchemas,
buildCustomGroupModifiersJsonSchema,
buildCustomGroupSelectorJsonSchema,
newlinesBetweenJsonSchema,
}