Skip to content

Allow to exclude pattern #352

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Closed
gajus opened this issue Nov 17, 2023 · 6 comments
Closed

Allow to exclude pattern #352

gajus opened this issue Nov 17, 2023 · 6 comments
Labels
feature request Feature request

Comments

@gajus
Copy link

gajus commented Nov 17, 2023

Suppose this config:

{
  "$schema": "https://unpkg.com/knip@2/schema.json",
  "entry": [
    "./turbowatch.ts",
    "./src/index.ts!"
  ],
  "ignore": [
    ".eslintrc.cjs"
  ],
  "ignoreDependencies": [
    "@contra/eslint-config"
  ],
  "project": [
    "src/**/*!"
  ]
}

The problems is that I also have .test.ts files under src, e.g. src/routines/jobPostings/potentialMatches/findContractorIndexMatchesForJobPosting.test.ts

I am not entirely sure what's the proper way to mark src/**/*! as project files, but exclude .test.ts from it.

I suppose negation could be achieved with a syntax such as:

"project": [
  "src/**/*!",
  "!src/**/*.test.ts!"
]

! at the beginning and end looks a bit odd though.

@gajus gajus added the feature request Feature request label Nov 17, 2023
@gajus
Copy link
Author

gajus commented Nov 17, 2023

Or actually, this could work too:

"project": [
  "src/**/*!",
  "src/**/*.test.ts"
]

The implication being that the latest pattern overrides the production flag.

@webpro
Copy link
Member

webpro commented Nov 20, 2023

Negated patterns should work (also the odd !pattern! syntax).

But I think the underlying issue here is that the test files should be covered by a plugin, but something goes off here. Or Knip does not yet have a plugin for the test runner you're using. What repo is this?

@gajus
Copy link
Author

gajus commented Nov 27, 2023

What repo is this?

It is private, so cannot help much with that.

Negated patterns should work (also the odd !pattern! syntax).

Does not appear to be the case.

Here is the configuration I am using at the moment:

{
  "$schema": "https://unpkg.com/knip@2/schema.json",
  "entry": [
    "src/utilities/*.ts!",
    "!src/utilities/*.test.ts!",
    "src/utilities/*.test.ts",
    "src/index.ts!"
  ],
  "project": [
    "src/**/*!",
    "!src/**/*.test.ts!",
    "src/**/*.test.ts"
  ]
}

and here is the error:

at 14:18:45 ❯ knip
Unused devDependencies (1)
chance  package.json
gaia/packages/utilities on main [$✘»!+] on ☁️  gajus@contra.com
at 14:18:49 ❯ rg chance
package.json
17:    "chance": "^1.1.11",

src/utilities/buildUsernameFromName.test.ts
3:import chance from 'chance';
7:  const firstName = chance().first();
8:  const lastName = chance().last();
17:  const firstName = chance().first();
18:  const lastName = chance().last();

at 14:18:51 ❯ ll src/utilities/*.test.ts
-rw-r--r--  1 gajus  staff   722 Nov 27 14:07 src/utilities/buildUsernameFromName.test.ts
-rw-r--r--  1 gajus  staff  1196 Nov 27 14:07 src/utilities/fromGlobalId.test.ts
-rw-r--r--  1 gajus  staff   605 Nov 27 14:07 src/utilities/isTruthy.test.ts
-rw-r--r--  1 gajus  staff   212 Nov 27 14:07 src/utilities/toGlobalId.test.ts

It says chance is unused despite src/utilities/buildUsernameFromName.test.ts being covered by the src/utilities/*.test.ts pattern.

Here is an output with debug enabled:

[*] Unresolved configuration (from CLI arguments)
{
  cwd: '/Users/gajus/Developer/contra/gaia/packages/utilities',
  tsConfigFile: undefined,
  gitignore: true,
  isProduction: false,
  isStrict: false,
  isIgnoreInternal: false,
  isShowProgress: true,
  isIncludeEntryExports: false
}
Reading workspace configuration(s)...
[*] Included workspaces
[ '@contra/utilities' ]
[*] Included workspace configs
[
  {
    pkgName: '@contra/utilities',
    name: '.',
    config: {
      entry: [
        'src/utilities/*.ts!',
        '!src/utilities/*.test.ts!',
        'src/utilities/*.test.ts',
        'src/index.ts!'
      ],
      project: [ 'src/**/*!', '!src/**/*.test.ts!', 'src/**/*.test.ts' ],
      paths: {},
      ignore: [],
      ignoreBinaries: [],
      ignoreDependencies: [ 'eslint-import-resolver-typescript' ]
    },
    ancestors: []
  }
Analyzing workspace ....
[.] Enabled plugins (.)
[ 'ESLint', 'Sentry', 'TypeScript', 'Vitest' ]
[.] Definition paths (0)
[]
[.] Glob options
{
  cwd: '/Users/gajus/Developer/contra/gaia/packages/utilities',
  globPatterns: [
    'dist/utilities/*.d.ts',
    'dist/utilities/*.js',
    'dist/index.d.ts',
    'dist/index.js'
  ],
  ignorePatterns: [ '**/node_modules/**', '.yarn' ],
  gitignore: true
}
[.] Entry paths in package.json (0)
[]
[.] ESLint config file paths (1)
[
  '/Users/gajus/Developer/contra/gaia/packages/utilities/.eslintrc.cjs'
]
[.] ESLint dependencies (2)
[ '@contra/eslint-config', 'eslint-import-resolver-typescript' ]
[.] Sentry config file paths (0)
[]
[.] Sentry dependencies (1)
[ 'entry:sentry.{client,server,edge}.config.{js,ts}' ]
[.] TypeScript config file paths (2)
[
  '/Users/gajus/Developer/contra/gaia/packages/utilities/tsconfig.build.json',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/tsconfig.json'
]
[.] TypeScript dependencies (1)
[ '@contra/tsconfig/node.json' ]
[.] Vitest config file paths (0)
[]
[.] Vitest dependencies (0)
[]
???
[.] Glob options
{
  cwd: '/Users/gajus/Developer/contra/gaia/packages/utilities',
  globPatterns: [
    'src/index.ts',
    'src/utilities/*.test.ts',
    'src/utilities/*.ts',
    '!src/utilities/*.test.ts'
  ],
  ignorePatterns: [ '**/node_modules/**', '.yarn' ],
  gitignore: true
}
[.] Entry paths (27)
[
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/index.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/buildUserToolingSlackMarkdownBlock.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/buildUsernameFromName.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/createProxyAgent.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/decodeBase64.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/deserializeError.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/encodeBase64.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/formatBaseUserDisplayUsername.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/formatSlug.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/formatTagSlug.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/fromGlobalId.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/generateSimpleRandomString.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/getSocialMediaSiteNid.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/hasOwnPropertyAlt.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isBrowser.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isPlainObject.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isTestAccountEmailAddress.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isTruthy.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/nanoid.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/normalizeEmailAddress.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/retry.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/safeNonBlockingCall.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/safeStringify.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/serializeError.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/stringifyObjectPath.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/toGlobalId.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/uuid.ts'
]
[.] Glob options
{
  cwd: '/Users/gajus/Developer/contra/gaia/packages/utilities',
  globPatterns: [
    'src/**/*.test.ts',
    'src/**/*',
    '!src/**/*.test.ts',
    '!eslint.config.js',
    '!.eslintrc',
    '!.eslintrc.{js,json,cjs}',
    '!.eslintrc.{yml,yaml}',
    '!package.json',
    '!tsconfig.json',
    '!tsconfig.*.json',
    '!vitest.config.{js,mjs,ts,cjs,mts,cts}',
    '!vitest.{workspace,projects}.{ts,js,json}'
  ],
  ignorePatterns: [ '**/node_modules/**', '.yarn' ],
  gitignore: true
}
[.] Project paths (27)
[
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/index.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/buildUserToolingSlackMarkdownBlock.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/buildUsernameFromName.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/createProxyAgent.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/decodeBase64.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/deserializeError.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/encodeBase64.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/formatBaseUserDisplayUsername.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/formatSlug.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/formatTagSlug.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/fromGlobalId.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/generateSimpleRandomString.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/getSocialMediaSiteNid.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/hasOwnPropertyAlt.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isBrowser.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isPlainObject.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isTestAccountEmailAddress.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isTruthy.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/nanoid.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/normalizeEmailAddress.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/retry.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/safeNonBlockingCall.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/safeStringify.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/serializeError.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/stringifyObjectPath.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/toGlobalId.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/uuid.ts'
]
[.] Glob options
{
  cwd: '/Users/gajus/Developer/contra/gaia/packages/utilities',
  globPatterns: [ 'sentry.{client,server,edge}.config.{js,ts}' ],
  ignorePatterns: [ '**/node_modules/**', '.yarn' ],
  gitignore: true
}
[.] Plugin entry paths (0)
[]
[.] Plugin project paths (0)
[]
[.] Glob options
{
  cwd: '/Users/gajus/Developer/contra/gaia/packages/utilities',
  globPatterns: [
    'vitest.{workspace,projects}.{ts,js,json}',
    'vitest.config.{js,mjs,ts,cjs,mts,cts}',
    'tsconfig.*.json',
    'tsconfig.json',
    'package.json',
    '.eslintrc.{yml,yaml}',
    '.eslintrc.{js,json,cjs}',
    '.eslintrc',
    'eslint.config.js'
  ],
  ignorePatterns: [ '**/node_modules/**', '.yarn' ],
  gitignore: true
}
[.] Plugin configuration paths (4)
[
  '/Users/gajus/Developer/contra/gaia/packages/utilities/.eslintrc.cjs',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/package.json',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/tsconfig.build.json',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/tsconfig.json'
]
Connecting the dots...
[*] Analyzing used resolved files [P1/1] (28)
[
  '/Users/gajus/Developer/contra/gaia/packages/utilities/.eslintrc.cjs',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/index.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/buildUserToolingSlackMarkdownBlock.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/buildUsernameFromName.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/createProxyAgent.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/decodeBase64.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/deserializeError.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/encodeBase64.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/formatBaseUserDisplayUsername.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/formatSlug.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/formatTagSlug.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/fromGlobalId.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/generateSimpleRandomString.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/getSocialMediaSiteNid.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/hasOwnPropertyAlt.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isBrowser.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isPlainObject.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isTestAccountEmailAddress.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/isTruthy.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/nanoid.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/normalizeEmailAddress.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/retry.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/safeNonBlockingCall.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/safeStringify.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/serializeError.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/stringifyObjectPath.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/toGlobalId.ts',
  '/Users/gajus/Developer/contra/gaia/packages/utilities/src/utilities/uuid.ts'
Unused devDependencies (1)
chance  package.json

@gajus
Copy link
Author

gajus commented Nov 27, 2023

It looks like the issue is here:

{
  cwd: '/Users/gajus/Developer/contra/gaia/packages/utilities',
  globPatterns: [
    'src/index.ts',
    'src/utilities/*.test.ts',
    'src/utilities/*.ts',
    '!src/utilities/*.test.ts'
  ],
  ignorePatterns: [ '**/node_modules/**', '.yarn' ],
  gitignore: true
}

It added !src/utilities/*.test.ts to ignore list, despite that it should be only ignored in production mode.

@webpro webpro closed this as completed in fca87f8 Nov 28, 2023
@webpro
Copy link
Member

webpro commented Nov 28, 2023

🚀 This issue has been resolved in v3.1.0. See Release 3.1.0 for release notes.

@webpro
Copy link
Member

webpro commented Nov 28, 2023

Negated production patterns should no longer be included in default mode.

Still, I think the real issue here is why you need to add the *.test patterns in the first place? Is there some plugin missing or not working properly?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
feature request Feature request
Projects
None yet
Development

No branches or pull requests

2 participants