@kitschpatrol/remark-config 2.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/bin/cli.js +17 -0
- package/init/.remarkrc.js +10 -0
- package/main.js +116 -0
- package/package.json +98 -0
- package/readme.md +45 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2023 Eric Mika
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/bin/cli.js
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
import F from"chalk";import{execa as O}from"execa";import x from"meow";import d from"node:path";import{Transform as $}from"node:stream";import{fileURLToPath as S}from"node:url";import{packageUp as k}from"package-up";function A(t,r){return new $({transform(n,e,i){let m=n.toString().split(/\r?\n/).filter(l=>l.trim().length>0).map(l=>`${t?F[r]("["+t+"] "):""}${l}`).join(`
|
|
3
|
+
`)+`
|
|
4
|
+
`;this.push(m),i()}})}function N(t,r){let n=`
|
|
5
|
+
Usage
|
|
6
|
+
$ ${t} [<file|glob> ...]
|
|
7
|
+
`;if(Object.keys(r).length>0){n+=`
|
|
8
|
+
Options`;for(let e of Object.keys(r))switch(e){case"init":{n+=`
|
|
9
|
+
--init, -i Initialize by copying starter config files to your project root.`;break}case"check":{n+=`
|
|
10
|
+
--check, -c Check for and report issues. Same as ${t}.`;break}case"fix":{n+=`
|
|
11
|
+
--fix, -f Fix all auto-fixable issues, and report the un-fixable.`;break}case"printConfig":{n+=`
|
|
12
|
+
--print-config <file> Print the effective configuration for a file`;break}default:console.error(`Unknown command name: ${e}`)}}return n}function T(t){return Object.keys(t).reduce((r,n)=>{let e={};switch(n){case"init":{e={shortFlag:"i",type:"boolean"};break}case"check":{e={aliases:["lint",""],shortFlag:"l",type:"boolean"};break}case"fix":{e={shortFlag:"f",type:"boolean"};break}case"printConfig":{e={type:"boolean"};break}default:console.error(`Unknown command name: ${n}`)}return r[n]=e,r},{})}async function y(t,r,n=[]){if(r.command!==void 0&&typeof r.command=="string"){let e;try{let i=O(r.command,[...r.options??[],...n],{env:{FORCE_COLOR:"true"},stdin:"inherit"});i.stdout?.pipe(t,{end:!1}),i.stderr?.pipe(t,{end:!1}),await i,e=i.exitCode??1}catch(i){e=typeof i.exitCode=="number"?i.exitCode:1}return e}return t.write(`Error: Invalid optionCommand: ${JSON.stringify(r,void 0,2)}`),1}function h(t,r,n){t.length===0&&!r.defaultArguments&&(n.write(`Error: This command must be used with a file argument
|
|
13
|
+
`),process.exit(1))}async function C(t,r,n,e){let i=x(N(t,e),{allowUnknownFlags:!1,booleanDefault:void 0,flags:T(e),importMeta:import.meta}),{flags:u,input:m}=i,l=Object.keys(e).reduce((c,o)=>(u[o]&&(c[o]=e[o]),c),{});Object.keys(l).length===0&&(l.check=e.check);let s=A(r,n);s.pipe(process.stdout);let a=0;for(let[c,o]of Object.entries(l))if(typeof o.command=="function"){h(m,o,s);let f=m.length===0?o.defaultArguments??[]:m,g=o.options??[];a+=await o.command(s,f,g)}else if(typeof o.command=="string")h(m,o,s),a+=await y(s,o,m.length===0?o.defaultArguments:m);else switch(c){case"init":{let f=await k();if(f===void 0){s.write("Error: The `--init` flag must be used in a directory with a package.json file\n"),a+=1;break}let g=await k({cwd:S(import.meta.url)});if(g===void 0){s.write(`Error: The script being called was not in a package, weird.
|
|
14
|
+
`),a+=1;break}let p=d.join(d.dirname(g),"init/"),b=d.dirname(f);s.write(`Copying initial configuration files from:
|
|
15
|
+
"${p}" \u2192 "${b}"
|
|
16
|
+
`);let w={command:"cp",options:["-Ri",`${p}`,`${b}`]};a+=await y(s,w);break}case"check":{console.error("No default implementation for check"),a+=1;break}case"fix":{console.error("No default implementation for fix"),a+=1;break}case"printConfig":{console.error("No default implementation for print-config"),a+=1;break}default:{console.error(`Unknown command name: ${c}`),a+=1;break}}process.exit(a>0?1:0)}await C("remark-config","remarklint","blue",{init:{},printConfig:{async command(t){return t.write(`TODO
|
|
17
|
+
`),0}}});
|
package/main.js
ADDED
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
import remarkCapitalizeHeadings from 'remark-capitalize-headings';
|
|
2
|
+
import remarkLint from 'remark-lint';
|
|
3
|
+
import remarkLintCheckboxCharacterStyle from 'remark-lint-checkbox-character-style';
|
|
4
|
+
import remarkLintCheckboxContentIndent from 'remark-lint-checkbox-content-indent';
|
|
5
|
+
import remarkLintCodeBlockStyle from 'remark-lint-code-block-style';
|
|
6
|
+
import remarkLintEmphasisMarker from 'remark-lint-emphasis-marker';
|
|
7
|
+
import remarkLintFencedCodeFlag from 'remark-lint-fenced-code-flag';
|
|
8
|
+
import remarkLintFencedCodeMarker from 'remark-lint-fenced-code-marker';
|
|
9
|
+
import remarkLintFileExtension from 'remark-lint-file-extension';
|
|
10
|
+
import remarkLintFinalDefinition from 'remark-lint-final-definition';
|
|
11
|
+
import remarkLintFirstHeadingLevel from 'remark-lint-first-heading-level';
|
|
12
|
+
import remarkLintHeadingIncrement from 'remark-lint-heading-increment';
|
|
13
|
+
import remarkLintLinebreakStyle from 'remark-lint-linebreak-style';
|
|
14
|
+
import remarkLintMaximumHeadingLength from 'remark-lint-maximum-heading-length';
|
|
15
|
+
import remarkLintNoDuplicateDefinedUrls from 'remark-lint-no-duplicate-defined-urls';
|
|
16
|
+
import remarkLintNoDuplicateDefinitions from 'remark-lint-no-duplicate-definitions';
|
|
17
|
+
import remarkLintNoDuplicateHeadings from 'remark-lint-no-duplicate-headings';
|
|
18
|
+
import remarkLintNoDuplicateHeadingsInSection from 'remark-lint-no-duplicate-headings-in-section';
|
|
19
|
+
import remarkLintNoEmphasisAsHeading from 'remark-lint-no-emphasis-as-heading';
|
|
20
|
+
import remarkLintNoEmptyUrl from 'remark-lint-no-empty-url';
|
|
21
|
+
import remarkLintNoFileNameArticles from 'remark-lint-no-file-name-articles';
|
|
22
|
+
import remarkLintNoFileNameConsecutiveDashes from 'remark-lint-no-file-name-consecutive-dashes';
|
|
23
|
+
import remarkLintNoFileNameIrregularCharacters from 'remark-lint-no-file-name-irregular-characters';
|
|
24
|
+
import remarkLintNoFileNameMixedCase from 'remark-lint-no-file-name-mixed-case';
|
|
25
|
+
import remarkLintNoFileNameOuterDashes from 'remark-lint-no-file-name-outer-dashes';
|
|
26
|
+
import remarkLintNoHeadingIndent from 'remark-lint-no-heading-indent';
|
|
27
|
+
import remarkLintNoHeadingLikeParagraph from 'remark-lint-no-heading-like-paragraph';
|
|
28
|
+
import remarkLintNoHtml from 'remark-lint-no-html';
|
|
29
|
+
import remarkLintNoLiteralUrls from 'remark-lint-no-literal-urls';
|
|
30
|
+
import remarkLintNoMissingBlankLines from 'remark-lint-no-missing-blank-lines';
|
|
31
|
+
import remarkLintNoMultipleToplevelHeadings from 'remark-lint-no-multiple-toplevel-headings';
|
|
32
|
+
import remarkLintNoParagraphContentIndent from 'remark-lint-no-paragraph-content-indent';
|
|
33
|
+
import remarkLintNoReferenceLikeUrl from 'remark-lint-no-reference-like-url';
|
|
34
|
+
import remarkLintNoShellDollars from 'remark-lint-no-shell-dollars';
|
|
35
|
+
import remarkLintNoShortcutReferenceImage from 'remark-lint-no-shortcut-reference-image';
|
|
36
|
+
import remarkLintNoShortcutReferenceLink from 'remark-lint-no-shortcut-reference-link';
|
|
37
|
+
import remarkLintNoTabs from 'remark-lint-no-tabs';
|
|
38
|
+
import remarkLintNoUndefinedReferences from 'remark-lint-no-undefined-references';
|
|
39
|
+
import remarkLintNoUnneededFullReferenceImage from 'remark-lint-no-unneeded-full-reference-image';
|
|
40
|
+
import remarkLintNoUnneededFullReferenceLink from 'remark-lint-no-unneeded-full-reference-link';
|
|
41
|
+
import remarkLintNoUnusedDefinitions from 'remark-lint-no-unused-definitions';
|
|
42
|
+
import remarkLintOrderedListMarkerStyle from 'remark-lint-ordered-list-marker-style';
|
|
43
|
+
import remarkLintRuleStyle from 'remark-lint-rule-style';
|
|
44
|
+
import remarkLintStrikethroughMarker from 'remark-lint-strikethrough-marker';
|
|
45
|
+
import remarkLintStrongMarker from 'remark-lint-strong-marker';
|
|
46
|
+
import remarkLintTableCellPadding from 'remark-lint-table-cell-padding';
|
|
47
|
+
import remarkLintUnorderedListMarkerStyle from 'remark-lint-unordered-list-marker-style';
|
|
48
|
+
import remarkPresetPrettier from 'remark-preset-prettier';
|
|
49
|
+
import remarkValidateLinks from 'remark-validate-links';
|
|
50
|
+
|
|
51
|
+
export default {
|
|
52
|
+
plugins: [
|
|
53
|
+
remarkLint,
|
|
54
|
+
[remarkLintCheckboxCharacterStyle, 'x'],
|
|
55
|
+
remarkLintCheckboxContentIndent,
|
|
56
|
+
[remarkLintCodeBlockStyle, 'fenced'],
|
|
57
|
+
[remarkLintEmphasisMarker, '*'],
|
|
58
|
+
[remarkLintFencedCodeFlag, { allowEmpty: false }],
|
|
59
|
+
[remarkLintFencedCodeMarker, '`'],
|
|
60
|
+
[remarkLintFileExtension, 'md'],
|
|
61
|
+
remarkLintFinalDefinition,
|
|
62
|
+
remarkLintFirstHeadingLevel,
|
|
63
|
+
remarkLintHeadingIncrement,
|
|
64
|
+
// [remarkLintHeadingStyle, 'atx'], Prettier
|
|
65
|
+
remarkLintLinebreakStyle,
|
|
66
|
+
remarkLintMaximumHeadingLength,
|
|
67
|
+
// RemarkLintNoAutoLinkWithoutProtocol, // Deprecated
|
|
68
|
+
remarkLintNoDuplicateDefinedUrls,
|
|
69
|
+
remarkLintNoDuplicateDefinitions,
|
|
70
|
+
remarkLintNoDuplicateHeadings,
|
|
71
|
+
remarkLintNoDuplicateHeadingsInSection,
|
|
72
|
+
remarkLintNoEmphasisAsHeading,
|
|
73
|
+
remarkLintNoEmptyUrl,
|
|
74
|
+
remarkLintNoFileNameArticles,
|
|
75
|
+
remarkLintNoFileNameConsecutiveDashes,
|
|
76
|
+
remarkLintNoFileNameIrregularCharacters,
|
|
77
|
+
remarkLintNoFileNameMixedCase,
|
|
78
|
+
remarkLintNoFileNameOuterDashes,
|
|
79
|
+
remarkLintNoHeadingIndent,
|
|
80
|
+
remarkLintNoHeadingLikeParagraph,
|
|
81
|
+
remarkLintNoHtml,
|
|
82
|
+
remarkLintNoLiteralUrls,
|
|
83
|
+
remarkLintNoMissingBlankLines,
|
|
84
|
+
remarkLintNoMultipleToplevelHeadings,
|
|
85
|
+
remarkLintNoParagraphContentIndent,
|
|
86
|
+
remarkLintNoReferenceLikeUrl,
|
|
87
|
+
remarkLintNoShellDollars,
|
|
88
|
+
remarkLintNoShortcutReferenceImage,
|
|
89
|
+
remarkLintNoShortcutReferenceLink,
|
|
90
|
+
remarkLintNoTabs,
|
|
91
|
+
remarkLintNoUndefinedReferences,
|
|
92
|
+
remarkLintNoUnneededFullReferenceImage,
|
|
93
|
+
remarkLintNoUnneededFullReferenceLink,
|
|
94
|
+
remarkLintNoUnusedDefinitions,
|
|
95
|
+
remarkLintNoUnusedDefinitions,
|
|
96
|
+
[remarkLintOrderedListMarkerStyle, '.'],
|
|
97
|
+
[remarkLintRuleStyle, '---'],
|
|
98
|
+
remarkLintStrikethroughMarker,
|
|
99
|
+
[remarkLintStrongMarker, '*'],
|
|
100
|
+
[remarkLintTableCellPadding, 'padded'],
|
|
101
|
+
[remarkLintUnorderedListMarkerStyle, '-'],
|
|
102
|
+
remarkCapitalizeHeadings,
|
|
103
|
+
remarkValidateLinks,
|
|
104
|
+
remarkPresetPrettier,
|
|
105
|
+
],
|
|
106
|
+
settings: {
|
|
107
|
+
bullet: '-',
|
|
108
|
+
// 1stg settings
|
|
109
|
+
// emphasis: '_',
|
|
110
|
+
// listItemIndent: 'one',
|
|
111
|
+
// quote: "'",
|
|
112
|
+
// rule: '-',
|
|
113
|
+
// strong: '*',
|
|
114
|
+
// tightDefinitions: true,
|
|
115
|
+
},
|
|
116
|
+
};
|
package/package.json
ADDED
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@kitschpatrol/remark-config",
|
|
3
|
+
"version": "2.2.0",
|
|
4
|
+
"type": "module",
|
|
5
|
+
"description": "Linting and formatting for web projects.",
|
|
6
|
+
"repository": {
|
|
7
|
+
"type": "git",
|
|
8
|
+
"url": "git@github.com:kitschpatrol/shared-config.git",
|
|
9
|
+
"directory": "packages/remark-config"
|
|
10
|
+
},
|
|
11
|
+
"bugs": {
|
|
12
|
+
"url": "https://github.com/kitschpatrol/shared-config/issues",
|
|
13
|
+
"email": "eric@ericmika.com"
|
|
14
|
+
},
|
|
15
|
+
"author": {
|
|
16
|
+
"name": "Eric Mika",
|
|
17
|
+
"email": "eric@ericmika.com",
|
|
18
|
+
"url": "https://ericmika.com"
|
|
19
|
+
},
|
|
20
|
+
"license": "MIT",
|
|
21
|
+
"engines": {
|
|
22
|
+
"node": ">=18.0.0",
|
|
23
|
+
"pnpm": ">=8.0.0"
|
|
24
|
+
},
|
|
25
|
+
"bin": {
|
|
26
|
+
"remark-config": "bin/cli.js"
|
|
27
|
+
},
|
|
28
|
+
"main": "main.js",
|
|
29
|
+
"files": [
|
|
30
|
+
"bin",
|
|
31
|
+
"init"
|
|
32
|
+
],
|
|
33
|
+
"dependencies": {
|
|
34
|
+
"chalk": "^5.3.0",
|
|
35
|
+
"execa": "^8.0.1",
|
|
36
|
+
"meow": "^12.1.1",
|
|
37
|
+
"package-up": "^5.0.0",
|
|
38
|
+
"remark-capitalize-headings": "^2.0.1",
|
|
39
|
+
"remark-cli": "^12.0.0",
|
|
40
|
+
"remark-lint": "^9.1.2",
|
|
41
|
+
"remark-lint-checkbox-character-style": "^4.1.2",
|
|
42
|
+
"remark-lint-checkbox-content-indent": "^4.1.2",
|
|
43
|
+
"remark-lint-code-block-style": "^3.1.2",
|
|
44
|
+
"remark-lint-emphasis-marker": "^3.1.2",
|
|
45
|
+
"remark-lint-fenced-code-flag": "^3.1.2",
|
|
46
|
+
"remark-lint-fenced-code-marker": "^3.1.2",
|
|
47
|
+
"remark-lint-file-extension": "^2.1.2",
|
|
48
|
+
"remark-lint-final-definition": "^3.1.2",
|
|
49
|
+
"remark-lint-first-heading-level": "^3.1.2",
|
|
50
|
+
"remark-lint-heading-increment": "^3.1.2",
|
|
51
|
+
"remark-lint-linebreak-style": "^3.1.2",
|
|
52
|
+
"remark-lint-maximum-heading-length": "^3.1.2",
|
|
53
|
+
"remark-lint-no-duplicate-defined-urls": "^2.1.2",
|
|
54
|
+
"remark-lint-no-duplicate-definitions": "^3.1.2",
|
|
55
|
+
"remark-lint-no-duplicate-headings": "^3.1.2",
|
|
56
|
+
"remark-lint-no-duplicate-headings-in-section": "^3.1.2",
|
|
57
|
+
"remark-lint-no-emphasis-as-heading": "^3.1.2",
|
|
58
|
+
"remark-lint-no-empty-url": "^3.1.2",
|
|
59
|
+
"remark-lint-no-file-name-articles": "^2.1.2",
|
|
60
|
+
"remark-lint-no-file-name-consecutive-dashes": "^2.1.2",
|
|
61
|
+
"remark-lint-no-file-name-irregular-characters": "^2.1.2",
|
|
62
|
+
"remark-lint-no-file-name-mixed-case": "^2.1.2",
|
|
63
|
+
"remark-lint-no-file-name-outer-dashes": "^2.1.2",
|
|
64
|
+
"remark-lint-no-heading-indent": "^4.1.2",
|
|
65
|
+
"remark-lint-no-heading-like-paragraph": "^3.1.2",
|
|
66
|
+
"remark-lint-no-heading-punctuation": "^3.1.2",
|
|
67
|
+
"remark-lint-no-html": "^3.1.2",
|
|
68
|
+
"remark-lint-no-literal-urls": "^3.1.2",
|
|
69
|
+
"remark-lint-no-missing-blank-lines": "^3.1.2",
|
|
70
|
+
"remark-lint-no-multiple-toplevel-headings": "^3.1.2",
|
|
71
|
+
"remark-lint-no-paragraph-content-indent": "^4.1.2",
|
|
72
|
+
"remark-lint-no-reference-like-url": "^3.1.2",
|
|
73
|
+
"remark-lint-no-shell-dollars": "^3.1.2",
|
|
74
|
+
"remark-lint-no-shortcut-reference-image": "^3.1.2",
|
|
75
|
+
"remark-lint-no-shortcut-reference-link": "^3.1.2",
|
|
76
|
+
"remark-lint-no-tabs": "^3.1.2",
|
|
77
|
+
"remark-lint-no-undefined-references": "^4.2.1",
|
|
78
|
+
"remark-lint-no-unneeded-full-reference-image": "^3.1.2",
|
|
79
|
+
"remark-lint-no-unneeded-full-reference-link": "^3.1.2",
|
|
80
|
+
"remark-lint-no-unused-definitions": "^3.1.2",
|
|
81
|
+
"remark-lint-ordered-list-marker-style": "^3.1.2",
|
|
82
|
+
"remark-lint-rule-style": "^3.1.2",
|
|
83
|
+
"remark-lint-strikethrough-marker": "^2.1.2",
|
|
84
|
+
"remark-lint-strong-marker": "^3.1.2",
|
|
85
|
+
"remark-lint-table-cell-padding": "^4.1.3",
|
|
86
|
+
"remark-lint-unordered-list-marker-style": "^3.1.2",
|
|
87
|
+
"remark-preset-prettier": "^2.0.1",
|
|
88
|
+
"remark-validate-links": "^13.0.0",
|
|
89
|
+
"up": "^1.0.2"
|
|
90
|
+
},
|
|
91
|
+
"publishConfig": {
|
|
92
|
+
"access": "public"
|
|
93
|
+
},
|
|
94
|
+
"scripts": {
|
|
95
|
+
"build": "../../scripts/build.ts",
|
|
96
|
+
"cli": "node ./bin/cli.js"
|
|
97
|
+
}
|
|
98
|
+
}
|
package/readme.md
ADDED
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
# @kitschpatrol/remark-config
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
It's a shared [Remark](https://github.com/remarkjs/remark/blob/main/packages/remark-cli/readme.md#example-config-files-json-yaml-js) config for linting.
|
|
6
|
+
|
|
7
|
+
**See [`@kitschpatrol/shared-config`](https://www.npmjs.com/package/@kitschpatrol/shared-config) for the recommended single-package approach.**
|
|
8
|
+
|
|
9
|
+
## Setup
|
|
10
|
+
|
|
11
|
+
To use just this Remark config in isolation:
|
|
12
|
+
|
|
13
|
+
1. Install the `.npmrc` in your project root. This is required for correct PNPM behavior:
|
|
14
|
+
|
|
15
|
+
```sh
|
|
16
|
+
pnpm dlx @kitschpatrol/npm-config
|
|
17
|
+
```
|
|
18
|
+
|
|
19
|
+
2. Add the package:
|
|
20
|
+
|
|
21
|
+
```sh
|
|
22
|
+
pnpm add -D @kitschpatrol/remark-config
|
|
23
|
+
```
|
|
24
|
+
|
|
25
|
+
3. Add the starter `.remarkrc.js` and files to your project root, and add any customizations you'd like:
|
|
26
|
+
|
|
27
|
+
```sh
|
|
28
|
+
pnpm exec remark-config --init
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
## Usage
|
|
32
|
+
|
|
33
|
+
The Remark binary should be picked up automatically by VSCode plugins.
|
|
34
|
+
|
|
35
|
+
You can call it directly, but it's recommended to use the script bundled with the shared config to invoke the remark lint rules through `eslint`.
|
|
36
|
+
|
|
37
|
+
Integrate with your `package.json` scripts as you see fit, for example:
|
|
38
|
+
|
|
39
|
+
```json
|
|
40
|
+
...
|
|
41
|
+
"scripts": {
|
|
42
|
+
"lint": "p remark . --quiet --frail"
|
|
43
|
+
}
|
|
44
|
+
...
|
|
45
|
+
```
|