Skip to content

Commit

Permalink
fix(prettier-plugin-pkg): better types support, add type-coverage guard
Browse files Browse the repository at this point in the history
  • Loading branch information
JounQin committed Sep 24, 2019
1 parent 86dd854 commit b1e72fd
Show file tree
Hide file tree
Showing 11 changed files with 111 additions and 66 deletions.
12 changes: 6 additions & 6 deletions codechecks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,9 +2,9 @@ checks:
- name: build-size-watcher
options:
files:
- path: 'lib/esm.js'
# - name: type-coverage-watcher
# options:
# detail: true
# ignoreCatch: true
# strict: true
- path: 'packages/*lib/esm.js'
- name: type-coverage-watcher
options:
detail: true
ignoreCatch: true
strict: true
8 changes: 5 additions & 3 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -17,15 +17,16 @@
"lint:es": "eslint . --ext js,md,ts -f friendly",
"lint:ts": "tslint -p . -t stylish",
"lint:tsc": "tsc",
"test": "jest"
"test": "jest",
"type-coverage": "type-coverage --cache --detail --ignore-files *.d.ts --strict"
},
"devDependencies": {
"@1stg/babel-preset": "^0.7.0",
"@1stg/commitlint-config": "^0.1.0",
"@1stg/eslint-config": "^0.12.12",
"@1stg/husky-config": "^0.3.0",
"@1stg/lint-staged": "^0.8.0",
"@1stg/prettier-config": "^0.3.0",
"@1stg/prettier-config": "^0.3.1",
"@1stg/remark-config": "^0.2.1",
"@1stg/rollup-config": "^0.10.4",
"@1stg/tsconfig": "^0.6.0",
Expand All @@ -49,6 +50,7 @@
"rollup": "^1.21.4",
"ts-jest": "^24.1.0",
"tslint": "^5.20.0",
"type-coverage": "^2.3.0",
"typescript": "^3.6.3"
},
"resolutions": {
Expand All @@ -62,7 +64,7 @@
"eslintIgnore": [
"CHANGELOG.md",
"lib",
"!/.*.js"
"!.*.js"
],
"jest": {
"preset": "ts-jest",
Expand Down
13 changes: 7 additions & 6 deletions packages/pkg/src/index.ts
Original file line number Diff line number Diff line change
@@ -1,17 +1,19 @@
import { ObjectProperty } from '@babel/types'
import { Plugin } from 'prettier'
import { parsers } from 'prettier/parser-babylon'

import { engines } from './rules/engines'
import { files } from './rules/files'
import { scripts } from './rules/scripts'
import { sort } from './rules/sort'
import { StringMapperProperty, StringMapperPropertyValue } from './types'

const PKG_REG = /[\\/]?package\.json$/

const {
json: { parse },
} = parsers

const format = (properties: ObjectProperty[]) => {
const format = (properties: StringMapperProperty[]) => {
let props = sort(properties)
props = engines(props)
props = files(props)
Expand All @@ -27,11 +29,10 @@ export default {
parse(...args) {
const [, , options] = args
const { filepath } = options
const ast = parse(...args)
const ast: StringMapperPropertyValue = parse(...args)

if (filepath.endsWith('package.json')) {
const { properties } = ast
ast.properties = format(properties)
if (PKG_REG.test(filepath)) {
ast.properties = format(ast.properties)
}

return ast
Expand Down
8 changes: 4 additions & 4 deletions packages/pkg/src/rules/engines.ts
Original file line number Diff line number Diff line change
@@ -1,12 +1,12 @@
import { ObjectExpression, ObjectProperty } from '@babel/types'
import { StringMapperProperty } from '../types'

const process = (props: ObjectProperty[]) => {
const process = (props: StringMapperProperty[]) => {
const enginesIndex = props.findIndex(prop => prop.key.value === 'engines')

if (enginesIndex >= 0) {
const [engines] = props.splice(enginesIndex, 1)
const value = engines.value as ObjectExpression
const properties = value.properties as ObjectProperty[]
const { value } = engines
const { properties } = value

properties.sort((a, b) =>
a.key.value > b.key.value ? 1 : a.key.value < b.key.value ? -1 : 0,
Expand Down
12 changes: 7 additions & 5 deletions packages/pkg/src/rules/files.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,17 @@
import { ArrayExpression, ObjectProperty, StringLiteral } from '@babel/types'
import { StringLiteral } from '@babel/types'

const process = (props: ObjectProperty[]) => {
import { StringArrayProperty, StringMapperProperty } from '../types'

const process = (props: StringMapperProperty[]) => {
const filesIndex = props.findIndex(prop => prop.key.value === 'files')

if (filesIndex >= 0) {
const [filesNode] = props.splice(filesIndex, 1)

let readme: StringLiteral
let license: StringLiteral
let elements = (filesNode.value as ArrayExpression)
.elements as StringLiteral[]
// FIXME: should not use unknown casting
let { elements } = (filesNode.value as unknown) as StringArrayProperty

elements = elements
.filter(node => {
Expand Down Expand Up @@ -38,7 +40,7 @@ const process = (props: ObjectProperty[]) => {
elements.push(license)
}

;(filesNode.value as ArrayExpression).elements = elements
;((filesNode.value as unknown) as StringArrayProperty).elements = elements

props.splice(filesIndex, 0, filesNode)
}
Expand Down
9 changes: 4 additions & 5 deletions packages/pkg/src/rules/scripts.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,12 @@
import { ObjectExpression, ObjectProperty } from '@babel/types'
import { StringMapperProperty } from '../types'

const process = (props: ObjectProperty[]) => {
const process = (props: StringMapperProperty[]) => {
const scriptsIndex = props.findIndex(prop => prop.key.value === 'scripts')

if (scriptsIndex >= 0) {
const scripts = props[scriptsIndex]
;((scripts.value as ObjectExpression).properties as ObjectProperty[]).sort(
(a, b) =>
a.key.value > b.key.value ? 1 : a.key.value < b.key.value ? -1 : 0,
scripts.value.properties.sort((a, b) =>
a.key.value > b.key.value ? 1 : a.key.value < b.key.value ? -1 : 0,
)
// eslint-disable-next-line no-param-reassign
props[scriptsIndex] = scripts
Expand Down
6 changes: 3 additions & 3 deletions packages/pkg/src/rules/sort.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { ObjectProperty } from '@babel/types'
import { StringMapperProperty } from '../types'

// reference: https://docs.npmjs.com/files/package.json#people-fields-author-contributors
const primary = [
Expand Down Expand Up @@ -55,8 +55,8 @@ const primary = [
'sideEffects',
]

export const sort = (props: ObjectProperty[]) => {
const others: ObjectProperty[] = []
export const sort = (props: StringMapperProperty[]) => {
const others: StringMapperProperty[] = []
const known = props.filter(prop => {
if (primary.includes(prop.key.value)) {
return true
Expand Down
19 changes: 19 additions & 0 deletions packages/pkg/src/types.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { ObjectExpression, ObjectProperty, StringLiteral } from '@babel/types'

export interface StringMapperProperty extends ObjectProperty {
key: {
value: string
}
value: StringMapperPropertyValue
}

export interface StringMapperPropertyValue extends ObjectExpression {
properties: StringMapperProperty[]
}

export interface StringArrayProperty extends ObjectProperty {
key: {
value: string
}
elements: StringLiteral[]
}
6 changes: 1 addition & 5 deletions tsconfig.base.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,3 @@
{
"extends": "@1stg/tsconfig/tsconfig",
"compilerOptions": {
"strictFunctionTypes": false,
"strictNullChecks": false
}
"extends": "@1stg/tsconfig/loose"
}
2 changes: 1 addition & 1 deletion tsconfig.json
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
{
"extends": "./tsconfig.base",
"extends": "./tsconfig.base.json",
"compilerOptions": {
"baseUrl": ".",
"incremental": false,
Expand Down
82 changes: 54 additions & 28 deletions yarn.lock
Original file line number Diff line number Diff line change
Expand Up @@ -67,13 +67,13 @@
"@prettier/plugin-pug" "^1.0.3"
prettier-plugin-toml "^0.3.1"

"@1stg/prettier-config@^0.3.0":
version "0.3.0"
resolved "https://registry.yarnpkg.com/@1stg/prettier-config/-/prettier-config-0.3.0.tgz#f8107d6883b3f5db8f2d711c50b708b11cedd18a"
integrity sha512-x7ZW/VSt5RZsETFekDmVP6tj09VA0AsmvbXR7wmhZUgiVPvnGCtM/B51l/9ZKM479K6hfEpi/XhPTRcQEwjXNA==
"@1stg/prettier-config@^0.3.1":
version "0.3.1"
resolved "https://registry.yarnpkg.com/@1stg/prettier-config/-/prettier-config-0.3.1.tgz#60b64c5de03f6e051d9f90de0a6b4ccadf460590"
integrity sha512-1xqTarH9CEoPBVzicjarkO0p1+xm8uUWeGs1EQ7AGLpR811PZdDH4tzAdgtV35fqcvPyBzqkQGNrnwCW/laGwA==
dependencies:
"@prettier/plugin-pug" "^1.0.3"
prettier-plugin-pkg "^0.3.0"
prettier-plugin-pkg "^0.4.0"
prettier-plugin-toml "^0.3.1"

"@1stg/remark-config@^0.2.1":
Expand Down Expand Up @@ -2310,9 +2310,9 @@
integrity sha512-jB389/eTiVH22BebEsKbnXSMtX3pVrI3Jsunh1le/ienb63//ffWsNIbj6awKJQejswL9+1iNcYsqdu6DCgqnA==

"@pkgr/umd-globals@^0.2.0":
version "0.2.0"
resolved "https://registry.yarnpkg.com/@pkgr/umd-globals/-/umd-globals-0.2.0.tgz#f32cadf8a37409b8636cff7a3928a86f365c2dd8"
integrity sha512-VWsQ3coqooOwl2vzzqKD3nVAkZ7aTlNNiTrjaKjQTKkcpox1s7YLzT9+bcFUvZTpv8tL0ulJwBxjA7lzcdWlJw==
version "0.2.1"
resolved "https://registry.yarnpkg.com/@pkgr/umd-globals/-/umd-globals-0.2.1.tgz#e7fd5f7279312c42236713b6b96d1e3859a2615f"
integrity sha512-NjJ8lk5WDJiJbwGYVmWlB8X34E7PWjdUDcSLlbBVrTTBQeOz6fUXRBamMLZrIUd8QiRoraW/jrud0mUDciYr3w==

"@prettier/plugin-pug@^1.0.3":
version "1.0.3"
Expand Down Expand Up @@ -2786,9 +2786,9 @@ acorn@^6.0.1, acorn@^6.0.2:
integrity sha512-/czfa8BwS88b9gWQVhc8eknunSA2DoJpJyTQkhheIf5E48u1N0R4q/YxxsAeqRrmK9TQ/uYfgLDfZo91UlANIA==

acorn@^7.0.0:
version "7.0.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.0.0.tgz#26b8d1cd9a9b700350b71c0905546f64d1284e7a"
integrity sha512-PaF/MduxijYYt7unVGRuds1vBC9bFxbNf+VWqhOClfdgy7RlVkQqt610ig1/yxTgsDIfW1cWDel5EBbOy3jdtQ==
version "7.1.0"
resolved "https://registry.yarnpkg.com/acorn/-/acorn-7.1.0.tgz#949d36f2c292535da602283586c2477c57eb2d6c"
integrity sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==

acorn@~4.0.2:
version "4.0.13"
Expand Down Expand Up @@ -5294,7 +5294,7 @@ glob-to-regexp@^0.3.0:
resolved "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz#8c5a1494d2066c570cc3bfe4496175acc4d502ab"
integrity sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=

glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
glob@7, glob@^7.0.3, glob@^7.1.1, glob@^7.1.2, glob@^7.1.3, glob@^7.1.4:
version "7.1.4"
resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.4.tgz#aa608a2f6c577ad357e1ae5a5c26d9a8d1969255"
integrity sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==
Expand Down Expand Up @@ -5367,9 +5367,9 @@ growly@^1.3.0:
integrity sha1-8QdIy+dq+WS3yWyTxrzCivEgwIE=

handlebars@^4.1.2:
version "4.2.1"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.2.1.tgz#dc69c0e61604224f0c23b38b5b6741db210b57da"
integrity sha512-bqPIlDk06UWbVEIFoYj+LVo42WhK96J+b25l7hbFDpxrOXMphFM3fNIm+cluwg4Pk2jiLjWU5nHQY7igGE75NQ==
version "4.3.0"
resolved "https://registry.yarnpkg.com/handlebars/-/handlebars-4.3.0.tgz#427391b584626c9c9c6ffb7d1fb90aa9789221cc"
integrity sha512-7XlnO8yBXOdi7AzowjZssQr47Ctidqm7GbgARapOaqSN9HQhlClnOkR9HieGauIT3A8MBC6u9wPCXs97PCYpWg==
dependencies:
neo-async "^2.6.0"
optimist "^0.6.1"
Expand Down Expand Up @@ -7218,7 +7218,7 @@ mimic-fn@^2.0.0, mimic-fn@^2.1.0:
resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz#7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b"
integrity sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==

minimatch@^3.0.4:
minimatch@3, minimatch@^3.0.4:
version "3.0.4"
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
Expand All @@ -7238,7 +7238,7 @@ minimist@0.0.8:
resolved "https://registry.yarnpkg.com/minimist/-/minimist-0.0.8.tgz#857fcabfc3397d2625b8228262e86aa7a011b05d"
integrity sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=

minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
minimist@1.2.0, minimist@^1.1.1, minimist@^1.1.3, minimist@^1.2.0:
version "1.2.0"
resolved "https://registry.yarnpkg.com/minimist/-/minimist-1.2.0.tgz#a35008b20f41383eec1fb914f4cd5df79a264284"
integrity sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=
Expand All @@ -7249,9 +7249,9 @@ minimist@~0.0.1:
integrity sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=

minipass@^2.2.1, minipass@^2.3.5, minipass@^2.6.0, minipass@^2.6.4:
version "2.8.4"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.8.4.tgz#490fe62adeb620c4a3373f62ee1c31cf2ef36385"
integrity sha512-i97pKD0f0eZLlhcTTSa6b6QlxCD7cvh8t/5MyR/pqchD5GPAeDaUrXQCoYA+W/VmmCgWvS/ADbfW3FUc+iT51Q==
version "2.8.5"
resolved "https://registry.yarnpkg.com/minipass/-/minipass-2.8.5.tgz#072f3c67b1f05fe4703f58a3c38e186c03a17692"
integrity sha512-D5+szmZBoOAfbLjOXY4Ve5bWylyTdrUOmbJPgYmgTF5ovCnCFFTY+I16Ccm/UjSNNAekXtIEDvoCDioFzRz18Q==
dependencies:
safe-buffer "^5.1.2"
yallist "^3.0.0"
Expand Down Expand Up @@ -10496,6 +10496,14 @@ ts-jest@^24.1.0:
semver "^5.5"
yargs-parser "10.x"

ts-lib-utils@^2.2.0:
version "2.2.0"
resolved "https://registry.yarnpkg.com/ts-lib-utils/-/ts-lib-utils-2.2.0.tgz#dbf198ba67e2fee027f36bd2f9c0cbd638ed1731"
integrity sha512-yfZWuQs5bfQA2RLJdHUOSL2+Iw4NcZ8eKglVVW25aXi3sdLEoJxHB3tC2CN+x4MY4X39tcFCGlE5V7IF8O3m8w==
dependencies:
glob "7"
tslib "1"

tsconfig-paths@^3.9.0:
version "3.9.0"
resolved "https://registry.yarnpkg.com/tsconfig-paths/-/tsconfig-paths-3.9.0.tgz#098547a6c4448807e8fcb8eae081064ee9a3c90b"
Expand All @@ -10506,7 +10514,7 @@ tsconfig-paths@^3.9.0:
minimist "^1.2.0"
strip-bom "^3.0.0"

tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
tslib@1, tslib@^1.10.0, tslib@^1.7.1, tslib@^1.8.0, tslib@^1.8.1, tslib@^1.9.0:
version "1.10.0"
resolved "https://registry.yarnpkg.com/tslib/-/tslib-1.10.0.tgz#c3c19f95973fb0a62973fb09d90d961ee43e5c8a"
integrity sha512-qOebF53frne81cf0S9B41ByenJ3/IuH8yJKngAX35CmiZySA0khhkovshKK+jGCaMnVomla7gVlIcc3EvKPbTQ==
Expand Down Expand Up @@ -10556,20 +10564,20 @@ tslint@^5.20.0, tslint@^5.9.1:
tslib "^1.8.0"
tsutils "^2.29.0"

tsutils@3, tsutils@^3.17.1, tsutils@^3.9.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
dependencies:
tslib "^1.8.1"

tsutils@^2.25.0, tsutils@^2.29.0:
version "2.29.0"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-2.29.0.tgz#32b488501467acbedd4b85498673a0812aca0b99"
integrity sha512-g5JVHCIJwzfISaXpXE1qvNalca5Jwob6FjI4AoPlqMusJ6ftFE7IkkFoMhVLRgK+4Kx3gkzb8UZK5t5yTTvEmA==
dependencies:
tslib "^1.8.1"

tsutils@^3.17.1, tsutils@^3.9.1:
version "3.17.1"
resolved "https://registry.yarnpkg.com/tsutils/-/tsutils-3.17.1.tgz#ed719917f11ca0dee586272b2ac49e015a2dd759"
integrity sha512-kzeQ5B8H3w60nFY2g8cJIuH7JDpsALXySGtwGJ0p2LSjLgay3NdIpqq5SoOBe46bKDW2iq25irHCr8wjomUS2g==
dependencies:
tslib "^1.8.1"

tunnel-agent@^0.6.0:
version "0.6.0"
resolved "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz#27a5dea06b36b04a0a9966774b290868f0fc40fd"
Expand All @@ -10589,6 +10597,24 @@ type-check@~0.3.2:
dependencies:
prelude-ls "~1.1.2"

type-coverage-core@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/type-coverage-core/-/type-coverage-core-2.3.0.tgz#be6a2eef8611be441c3bbd3ab8e554aa30fb9d6f"
integrity sha512-aB/+6Vp3PJXjJfuTxY6gVSbWpbJyndYvs9/2n9658DmnZVAOPnKarQcJivaEFfGHf6ZVyM+Njj5Xpy8BGAFa4Q==
dependencies:
minimatch "3"
ts-lib-utils "^2.2.0"
tslib "1"
tsutils "3"

type-coverage@^2.3.0:
version "2.3.0"
resolved "https://registry.yarnpkg.com/type-coverage/-/type-coverage-2.3.0.tgz#f87d8a1ccbde7a34285ae491067abd8dd41de235"
integrity sha512-YIN+xkcN2O3d7xW64v5HfOCGb0Sa3vmBohj4NQPzunGYwq211fl/SuuQutmwH8BNv6TR33YT9GR8O9QNAMLAmA==
dependencies:
minimist "1.2.0"
type-coverage-core "^2.3.0"

type-fest@^0.3.0:
version "0.3.1"
resolved "https://registry.yarnpkg.com/type-fest/-/type-fest-0.3.1.tgz#63d00d204e059474fe5e1b7c011112bbd1dc29e1"
Expand Down

0 comments on commit b1e72fd

Please sign in to comment.