fix(schema): support array type (#4312)

* test: add test

* fix(schema): support array type

* fix: convince CI

* refactor: another way to convince CI
master
Ika 2018-04-15 00:06:43 +08:00 committed by GitHub
parent 7c0dee617b
commit 5d7b14856b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 321 additions and 13 deletions

View File

@ -2,14 +2,17 @@
"use strict";
const prettier = require("..");
console.log(
prettier.format(
JSON.stringify(generateSchema(prettier.getSupportInfo().options)),
{ parser: "json" }
)
);
if (require.main !== module) {
module.exports = generateSchema;
} else {
const prettier = require("..");
console.log(
prettier.format(
JSON.stringify(generateSchema(prettier.getSupportInfo().options)),
{ parser: "json" }
)
);
}
function generateSchema(options) {
return {
@ -75,25 +78,36 @@ function optionToSchema(option) {
description: option.description,
default: option.default
},
option.type === "choice"
? { oneOf: option.choices.map(choiceToSchema) }
: { type: optionTypeToSchemaType(option.type) }
(option.array ? wrapWithArraySchema : identity)(
option.type === "choice"
? { oneOf: option.choices.map(choiceToSchema) }
: { type: optionTypeToSchemaType(option.type) }
)
);
}
function identity(x) {
return x;
}
function wrapWithArraySchema(items) {
return { type: "array", items };
}
function optionTypeToSchemaType(optionType) {
switch (optionType) {
case "int":
return "integer";
case "array":
case "boolean":
return optionType;
case "choice":
throw new Error(
"Please use `oneOf` instead of `enum` for better description support."
);
default:
case "path":
return "string";
default:
throw new Error(`Unexpected optionType '${optionType}'`);
}
}

View File

@ -0,0 +1,286 @@
// Jest Snapshot v1, https://goo.gl/fbAQLP
exports[`schema 1`] = `
Object {
"$schema": "http://json-schema.org/draft-04/schema#",
"allOf": Array [
Object {
"$ref": "#/definitions/optionsDefinition",
},
Object {
"$ref": "#/definitions/overridesDefinition",
},
],
"definitions": Object {
"optionsDefinition": Object {
"properties": Object {
"arrowParens": Object {
"default": "avoid",
"description": "Include parentheses around a sole arrow function parameter.",
"oneOf": Array [
Object {
"description": "Omit parens when possible. Example: \`x => x\`",
"enum": Array [
"avoid",
],
},
Object {
"description": "Always include parens. Example: \`(x) => x\`",
"enum": Array [
"always",
],
},
],
},
"bracketSpacing": Object {
"default": true,
"description": "Print spaces between brackets.",
"type": "boolean",
},
"cursorOffset": Object {
"default": -1,
"description": "Print (to stderr) where a cursor at the given position would move to after formatting.
This option cannot be used with --range-start and --range-end.",
"type": "integer",
},
"filepath": Object {
"default": undefined,
"description": "Specify the input filepath. This will be used to do parser inference.",
"type": "string",
},
"insertPragma": Object {
"default": false,
"description": "Insert @format pragma into file's first docblock comment.",
"type": "boolean",
},
"jsxBracketSameLine": Object {
"default": false,
"description": "Put > on the last line instead of at a new line.",
"type": "boolean",
},
"parser": Object {
"default": "babylon",
"description": "Which parser to use.",
"oneOf": Array [
Object {
"description": "Flow",
"enum": Array [
"flow",
],
},
Object {
"description": "JavaScript",
"enum": Array [
"babylon",
],
},
Object {
"description": "TypeScript",
"enum": Array [
"typescript",
],
},
Object {
"description": "CSS",
"enum": Array [
"css",
],
},
Object {
"description": "Less",
"enum": Array [
"less",
],
},
Object {
"description": "SCSS",
"enum": Array [
"scss",
],
},
Object {
"description": "JSON",
"enum": Array [
"json",
],
},
Object {
"description": "GraphQL",
"enum": Array [
"graphql",
],
},
Object {
"description": "Markdown",
"enum": Array [
"markdown",
],
},
Object {
"description": "Vue",
"enum": Array [
"vue",
],
},
],
},
"plugins": Object {
"default": Array [],
"description": "Add a plugin. Multiple plugins can be passed as separate \`--plugin\`s.",
"items": Object {
"type": "string",
},
"type": "array",
},
"printWidth": Object {
"default": 80,
"description": "The line length where Prettier will try wrap.",
"type": "integer",
},
"proseWrap": Object {
"default": "preserve",
"description": "How to wrap prose. (markdown)",
"oneOf": Array [
Object {
"description": "Wrap prose if it exceeds the print width.",
"enum": Array [
"always",
],
},
Object {
"description": "Do not wrap prose.",
"enum": Array [
"never",
],
},
Object {
"description": "Wrap prose as-is.",
"enum": Array [
"preserve",
],
},
],
},
"rangeEnd": Object {
"default": Infinity,
"description": "Format code ending at a given character offset (exclusive).
The range will extend forwards to the end of the selected statement.
This option cannot be used with --cursor-offset.",
"type": "integer",
},
"rangeStart": Object {
"default": 0,
"description": "Format code starting at a given character offset.
The range will extend backwards to the start of the first line containing the selected statement.
This option cannot be used with --cursor-offset.",
"type": "integer",
},
"requirePragma": Object {
"default": false,
"description": "Require either '@prettier' or '@format' to be present in the file's first docblock comment
in order for it to be formatted.",
"type": "boolean",
},
"semi": Object {
"default": true,
"description": "Print semicolons.",
"type": "boolean",
},
"singleQuote": Object {
"default": false,
"description": "Use single quotes instead of double quotes.",
"type": "boolean",
},
"tabWidth": Object {
"default": 2,
"description": "Number of spaces per indentation level.",
"type": "integer",
},
"trailingComma": Object {
"default": "none",
"description": "Print trailing commas wherever possible when multi-line.",
"oneOf": Array [
Object {
"description": "No trailing commas.",
"enum": Array [
"none",
],
},
Object {
"description": "Trailing commas where valid in ES5 (objects, arrays, etc.)",
"enum": Array [
"es5",
],
},
Object {
"description": "Trailing commas wherever possible (including function arguments).",
"enum": Array [
"all",
],
},
],
},
"useTabs": Object {
"default": false,
"description": "Indent with tabs instead of spaces.",
"type": "boolean",
},
},
"type": "object",
},
"overridesDefinition": Object {
"properties": Object {
"overrides": Object {
"description": "Provide a list of patterns to override prettier configuration.",
"items": Object {
"additionalProperties": false,
"properties": Object {
"excludeFiles": Object {
"description": "Exclude these files from this override.",
"oneOf": Array [
Object {
"type": "string",
},
Object {
"items": Object {
"type": "string",
},
"type": "array",
},
],
},
"files": Object {
"description": "Include these files in this override.",
"oneOf": Array [
Object {
"type": "string",
},
Object {
"items": Object {
"type": "string",
},
"type": "array",
},
],
},
"options": Object {
"$ref": "#/definitions/optionsDefinition",
"description": "The options to apply for this override.",
"type": "object",
},
},
"required": Array [
"files",
],
"type": "object",
},
"type": "array",
},
},
"type": "object",
},
},
"title": "Schema for .prettierrc",
"type": "object",
}
`;

View File

@ -0,0 +1,8 @@
"use strict";
const prettier = require("../..");
const generateSchema = require("../../scripts/generate-schema");
test("schema", () => {
expect(generateSchema(prettier.getSupportInfo().options)).toMatchSnapshot();
});