UNPKG

2.51 kBJavaScriptView Raw
1/* @flow */
2'use strict';
3
4const _ = require('lodash');
5const augmentConfig = require('./augmentConfig');
6const createStylelintResult = require('./createStylelintResult');
7const getConfigForFile = require('./getConfigForFile');
8const getPostcssResult = require('./getPostcssResult');
9const isPathIgnored = require('./isPathIgnored');
10const lintSource = require('./lintSource');
11const path = require('path');
12const { cosmiconfig } = require('cosmiconfig');
13
14const IS_TEST = process.env.NODE_ENV === 'test';
15const STOP_DIR = IS_TEST ? path.resolve(__dirname, '..') : undefined;
16
17/** @typedef {import('stylelint').StylelintInternalApi} StylelintInternalApi */
18
19/**
20 * The stylelint "internal API" is passed among functions
21 * so that methods on a stylelint instance can invoke
22 * each other while sharing options and caches
23 * @param {import('stylelint').StylelintStandaloneOptions} options
24 * @returns {StylelintInternalApi}
25 */
26module.exports = function(options /*: stylelint$options*/) /*: stylelint$internalApi*/ {
27 options = options || {};
28 /** @type {Partial<StylelintInternalApi>} */
29 const stylelint /*: Object*/ = { _options: options };
30
31 // Two separate explorers so they can each have their own transform
32 // function whose results are cached by cosmiconfig
33 // @ts-ignore TODO TYPES found out which cosmiconfig types are valid
34 stylelint._fullExplorer = cosmiconfig('stylelint', {
35 transform: _.partial(
36 augmentConfig.augmentConfigFull,
37 /** @type{StylelintInternalApi} */ (stylelint),
38 ),
39 stopDir: STOP_DIR,
40 });
41 // @ts-ignore TODO TYPES found out which cosmiconfig types are valid
42 stylelint._extendExplorer = cosmiconfig(null, {
43 transform: _.partial(
44 augmentConfig.augmentConfigExtended,
45 /** @type{StylelintInternalApi} */ (stylelint),
46 ),
47 stopDir: STOP_DIR,
48 });
49
50 stylelint._specifiedConfigCache = new Map();
51 stylelint._postcssResultCache = new Map();
52 stylelint._createStylelintResult = _.partial(
53 createStylelintResult,
54 /** @type{StylelintInternalApi} */ (stylelint),
55 );
56 stylelint._getPostcssResult = _.partial(
57 getPostcssResult,
58 /** @type{StylelintInternalApi} */ (stylelint),
59 );
60 stylelint._lintSource = _.partial(lintSource, /** @type{StylelintInternalApi} */ (stylelint));
61
62 stylelint.getConfigForFile = _.partial(
63 getConfigForFile,
64 /** @type{StylelintInternalApi} */ (stylelint),
65 );
66 stylelint.isPathIgnored = _.partial(
67 isPathIgnored,
68 /** @type{StylelintInternalApi} */ (stylelint),
69 );
70
71 return /** @type{StylelintInternalApi} */ (stylelint);
72};