300 lines
7.5 KiB
JavaScript
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,
|
|
}
|