Skip to content

Commit

Permalink
fix(prettier-plugin-jsdoc): get the supported languages from Prettier
Browse files Browse the repository at this point in the history
  • Loading branch information
homer0 committed Nov 5, 2020
1 parent 5c9d0db commit 88e8ab0
Show file tree
Hide file tree
Showing 6 changed files with 43 additions and 152 deletions.
1 change: 0 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
"license": "MIT",
"dependencies": {
"comment-parser": "0.7.6",
"linguist-languages": "^7.11.1",
"prettier": "^2.1.2",
"ramda": "0.27.1"
},
Expand Down
7 changes: 7 additions & 0 deletions src/fns/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -63,8 +63,15 @@ const getTagsWithDescriptionAsName = () => [
* @returns {string[]}
*/
const getTagsWithNameAsDescription = () => ['see', 'borrows', 'yields', 'returns'];
/**
* Gets the list of languages the plugin supports.
*
* @returns {string[]}
*/
const getSupportedLanguages = () => ['JavaScript', 'Flow', 'JSX', 'TSX', 'TypeScript'];

module.exports.getTagsSynonyms = getTagsSynonyms;
module.exports.getTagsWithDescriptionAsName = getTagsWithDescriptionAsName;
module.exports.getTagsWithNameAsDescription = getTagsWithNameAsDescription;
module.exports.getSupportedLanguages = getSupportedLanguages;
module.exports.provider = provider('constants');
108 changes: 10 additions & 98 deletions src/fns/getLanguages.js
Original file line number Diff line number Diff line change
@@ -1,110 +1,22 @@
const jsLang = require('linguist-languages/data/JavaScript.json');
const jsxLang = require('linguist-languages/data/JSX.json');
const tsLang = require('linguist-languages/data/TypeScript.json');
const tsxLang = require('linguist-languages/data/TSX.json');
const R = require('ramda');
const prettier = require('prettier');
const { getSupportedLanguages } = require('./constants');
const { get, provider } = require('./app');

/**
* @typedef {LinguistLanguageProperties & LanguageSharedProperties} LinguistLanguage
* @typedef {import('../types').PrettierSupportLanguage} PrettierSupportLanguage
*/

/**
* @typedef {LanguagePrivateProperties &
* LanguageSharedProperties &
* LanguageProperties} Language
*/

/**
* @typedef {Object} LinguistLanguageProperties
* @property {number} languageId A unique identifier for the language.
*/

/**
* @typedef {Object} LanguageSharedProperties
* @property {string[]} extensions The extensions of files that related to the language.
* @property {string[]} [aliases] A list of known aliases for the language.
* @property {string[]} [filenames] An Array of filenames commonly associated with the
* language.
* @see https://github.com/github/linguist/blob/master/lib/linguist/languages.yml
*/

/**
* @typedef {Object} LanguagePrivateProperties
* @property {number} linguistLanguageId The unique ID for the language on Linguist.
*/

/**
* @typedef {Object} LanguageProperties
* @property {string} since Since which version of Prettier it can be used.
* @property {string[]} parsers The list of parsers that can parse the
* language.
* @property {string[]} vscodeLanguageIds The ID for the language on VSCode.
*/

/**
* @typedef {LanguageProperties & Partial<LanguageSharedProperties>} LanguageOverrides
*/

/**
* Creates the language definition for Prettier.
*
* @param {LinguistLanguage} linguistLanguage The base data for the language that will
* be used.
* @param {LanguageOverrides} overrides The information of the language for
* Prettier, and possible overrides for the
* Linguist data.
* @returns {Language}
*/
const createLanguage = (linguistLanguage, overrides) => {
const { languageId, ...rest } = linguistLanguage;
return {
linguistLanguageId: languageId,
...rest,
...overrides,
};
};

/**
* Generates the list of languages the plugin supports.
*
* @returns {Language[]}
* @returns {PrettierSupportLanguage[]}
*/
const getLanguages = () => {
const useCreateLanguage = get(createLanguage);
return [
useCreateLanguage(jsLang, {
since: '0.0.0',
parsers: ['babel', 'babel-flow', 'babel-ts', 'flow', 'typescript'],
vscodeLanguageIds: ['javascript', 'mongo'],
extensions: [...jsLang.extensions, '.wxs'],
}),
useCreateLanguage(jsLang, {
name: 'Flow',
since: '0.0.0',
parsers: ['flow', 'babel-flow'],
vscodeLanguageIds: ['javascript'],
aliases: [],
filenames: [],
extensions: ['.js.flow'],
}),
useCreateLanguage(jsxLang, {
since: '0.0.0',
parsers: ['babel', 'babel-flow', 'babel-ts', 'flow', 'typescript'],
vscodeLanguageIds: ['javascriptreact'],
}),
useCreateLanguage(tsLang, {
since: '1.4.0',
parsers: ['typescript', 'babel-ts'],
vscodeLanguageIds: ['typescript'],
}),
useCreateLanguage(tsxLang, {
since: '1.4.0',
parsers: ['typescript', 'babel-ts'],
vscodeLanguageIds: ['typescriptreact'],
}),
];
};
const getLanguages = () =>
R.filter(
R.propSatisfies(R.includes(R.__, get(getSupportedLanguages)()), 'name'),
prettier.getSupportInfo().languages,
);

module.exports.getLanguages = getLanguages;
module.exports.createLanguage = createLanguage;
module.exports.provider = provider('getLanguages', module.exports);
4 changes: 2 additions & 2 deletions src/fns/getPlugin.js
Original file line number Diff line number Diff line change
Expand Up @@ -7,12 +7,12 @@ const { get, provider } = require('./app');
* @typedef {import('../types').PrettierSupportOption} PrettierSupportOption
* @typedef {import('../types').PJPOptions} PJPOptions
* @typedef {import('../types').PrettierParser} PrettierParser
* @typedef {import('./getLanguages').Language} Language
* @typedef {import('../types').PrettierSupportLanguage} PrettierSupportLanguage
*/

/**
* @typedef {Object} Plugin
* @property {Language[]} languages
* @property {PrettierSupportLanguage[]} languages
* The list of supported languages.
* @property {Object.<string, PrettierSupportOption>} options
* The options schema for the plugin.
Expand Down
1 change: 1 addition & 0 deletions src/types.js
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
* @typedef {import('prettier').Options} PrettierBaseOptions
* @typedef {import('prettier').AST} AST
* @typedef {import('prettier').Parser} PrettierParser
* @typedef {import('prettier').SupportLanguage} PrettierSupportLanguage
*/

// =========================================
Expand Down
74 changes: 23 additions & 51 deletions test/unit/fns/getLanguages.test.js
Original file line number Diff line number Diff line change
@@ -1,59 +1,31 @@
jest.mock('linguist-languages/data/JavaScript.json', () => ({
languageId: 'js-lang',
extensions: [],
}));
jest.mock('linguist-languages/data/JSX.json', () => ({
languageId: 'jsx-lang',
}));
jest.mock('linguist-languages/data/TypeScript.json', () => ({
languageId: 'ts-lang',
}));
jest.mock('linguist-languages/data/TSX.json', () => ({
languageId: 'tsx-lang',
}));
jest.mock('prettier');
jest.unmock('../../../src/fns/getLanguages');

const prettier = require('prettier');
const { getLanguages } = require('../../../src/fns/getLanguages');

describe('getLanguages', () => {
beforeEach(() => {
prettier.getSupportInfo.mockClear();
});

it('should generate the list of supported languages', () => {
// Given/When/Then
expect(getLanguages()).toEqual([
{
linguistLanguageId: 'js-lang',
vscodeLanguageIds: ['javascript', 'mongo'],
since: expect.any(String),
parsers: expect.any(Array),
extensions: expect.any(Array),
},
{
name: 'Flow',
linguistLanguageId: 'js-lang',
vscodeLanguageIds: ['javascript'],
since: expect.any(String),
parsers: expect.any(Array),
extensions: expect.any(Array),
aliases: [],
filenames: [],
},
{
linguistLanguageId: 'jsx-lang',
vscodeLanguageIds: ['javascriptreact'],
since: expect.any(String),
parsers: expect.any(Array),
},
{
linguistLanguageId: 'ts-lang',
vscodeLanguageIds: ['typescript'],
since: expect.any(String),
parsers: expect.any(Array),
},
{
linguistLanguageId: 'tsx-lang',
vscodeLanguageIds: ['typescriptreact'],
since: expect.any(String),
parsers: expect.any(Array),
},
]);
// Given
const supportedLanguage = {
name: 'JavaScript',
linguistLanguageId: 183,
};
const unsupportedLanguage = {
name: 'NativeScript',
linguistLanguageId: 101,
};
prettier.getSupportInfo.mockImplementationOnce(() => ({
languages: [supportedLanguage, unsupportedLanguage],
}));
let result = null;
// When
result = getLanguages();
// Then
expect(result).toEqual([supportedLanguage]);
});
});

0 comments on commit 88e8ab0

Please sign in to comment.