@sanity/pkg-utils 6.5.0 → 6.6.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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sanity/pkg-utils",
3
- "version": "6.5.0",
3
+ "version": "6.6.0",
4
4
  "description": "Simple utilities for modern npm packages.",
5
5
  "keywords": [
6
6
  "sanity-io",
@@ -136,7 +136,7 @@
136
136
  "typescript": "5.4.5",
137
137
  "vitest": "^1.5.0",
138
138
  "vitest-github-actions-reporter": "^0.11.1",
139
- "@sanity/pkg-utils": "6.5.0"
139
+ "@sanity/pkg-utils": "6.6.0"
140
140
  },
141
141
  "peerDependencies": {
142
142
  "typescript": "5.4.x"
@@ -2,6 +2,9 @@
2
2
 
3
3
  exports[`{'noPackageJsonTypings': 'error'}} 1`] = `
4
4
  {
5
+ "alwaysPackageJsonFiles": "error",
6
+ "alwaysPackageJsonMain": "error",
7
+ "alwaysPackageJsonTypes": "error",
5
8
  "noImplicitBrowsersList": "warn",
6
9
  "noImplicitSideEffects": "warn",
7
10
  "noPackageJsonTypings": "error",
@@ -10,6 +13,9 @@ exports[`{'noPackageJsonTypings': 'error'}} 1`] = `
10
13
 
11
14
  exports[`{'noPackageJsonTypings': 'off'}} 1`] = `
12
15
  {
16
+ "alwaysPackageJsonFiles": "error",
17
+ "alwaysPackageJsonMain": "error",
18
+ "alwaysPackageJsonTypes": "error",
13
19
  "noImplicitBrowsersList": "warn",
14
20
  "noImplicitSideEffects": "warn",
15
21
  "noPackageJsonTypings": "off",
@@ -18,6 +24,9 @@ exports[`{'noPackageJsonTypings': 'off'}} 1`] = `
18
24
 
19
25
  exports[`{'noPackageJsonTypings': 'warn'}} 1`] = `
20
26
  {
27
+ "alwaysPackageJsonFiles": "error",
28
+ "alwaysPackageJsonMain": "error",
29
+ "alwaysPackageJsonTypes": "error",
21
30
  "noImplicitBrowsersList": "warn",
22
31
  "noImplicitSideEffects": "warn",
23
32
  "noPackageJsonTypings": "warn",
@@ -27,6 +27,17 @@ export function parseExports(options: {
27
27
  }
28
28
  }
29
29
 
30
+ if (!pkg.main && strict && strictOptions.alwaysPackageJsonMain !== 'off') {
31
+ report(strictOptions.alwaysPackageJsonMain, 'package.json: `main` must be declared')
32
+ }
33
+
34
+ if (!Array.isArray(pkg.files) && strict && strictOptions.alwaysPackageJsonFiles !== 'off') {
35
+ report(
36
+ strictOptions.alwaysPackageJsonFiles,
37
+ 'package.json: `files` should be used over `.npmignore`',
38
+ )
39
+ }
40
+
30
41
  if (pkg.source) {
31
42
  if (
32
43
  strict &&
@@ -125,34 +136,6 @@ export function parseExports(options: {
125
136
  )
126
137
  }
127
138
 
128
- /*
129
- const rootExports: PkgExport & {_path: string} = {
130
- _exported: true,
131
- _path: '.',
132
- source: pkg.source || '',
133
- browser: pkg.browser && {
134
- source: pkg.source || '',
135
- require: pkg.main && pkg.browser[pkg.main],
136
- import: pkg.module && pkg.browser[pkg.module],
137
- },
138
- require: legacyExports
139
- ? pkg.main
140
- : typeof pkg.exports?.['.'] === 'object' && 'require' in pkg.exports['.']
141
- ? pkg.exports['.'].require
142
- : '',
143
- import: legacyExports
144
- ? pkg.module
145
- : typeof pkg.exports?.['.'] === 'object' && 'import' in pkg.exports['.']
146
- ? pkg.exports['.'].import
147
- : '',
148
- default: legacyExports
149
- ? pkg.module || pkg.main || ''
150
- : typeof pkg.exports?.['.'] === 'object' && 'default' in pkg.exports['.']
151
- ? pkg.exports['.'].default || ''
152
- : pkg.module || pkg.main || '',
153
- }
154
- // */
155
-
156
139
  const _exports: (PkgExport & {_path: string})[] = []
157
140
 
158
141
  // @TODO validate typesVersions when legacyExports is true
@@ -161,8 +144,16 @@ export function parseExports(options: {
161
144
  report(strictOptions.noPackageJsonTypings, 'package.json: `typings` should be `types`')
162
145
  }
163
146
 
164
- if (strict && !pkg.types && pkg.source?.endsWith('.ts')) {
165
- errors.push(
147
+ if (
148
+ strict &&
149
+ strictOptions.alwaysPackageJsonTypes !== 'off' &&
150
+ !pkg.types &&
151
+ typeof pkg.exports?.['.'] === 'object' &&
152
+ 'source' in pkg.exports['.'] &&
153
+ pkg.exports['.'].source?.endsWith('.ts')
154
+ ) {
155
+ report(
156
+ strictOptions.alwaysPackageJsonTypes,
166
157
  'package.json: `types` must be declared for the npm listing to show as a TypeScript module.',
167
158
  )
168
159
  }
@@ -19,6 +19,9 @@ export const strictOptions = z
19
19
  noPackageJsonTypings: toggle.default('error'),
20
20
  noImplicitSideEffects: toggle.default('warn'),
21
21
  noImplicitBrowsersList: toggle.default('warn'),
22
+ alwaysPackageJsonTypes: toggle.default('error'),
23
+ alwaysPackageJsonMain: toggle.default('error'),
24
+ alwaysPackageJsonFiles: toggle.default('error'),
22
25
  })
23
26
  .strict()
24
27
 
@@ -58,6 +61,21 @@ export interface StrictOptions {
58
61
  * @defaultValue 'warn'
59
62
  */
60
63
  noImplicitBrowsersList?: ToggleType
64
+ /**
65
+ * If typescript is used then `types` in `package.json` should be specified for npm listings to show the TS icon.
66
+ * @defaultValue 'error'
67
+ */
68
+ alwaysPackageJsonTypes?: ToggleType
69
+ /**
70
+ * A lot of analysis tooling requiers the `main` field to work (like bundlephobia) and so it's best practice to always include it
71
+ * @defaultValue 'error'
72
+ */
73
+ alwaysPackageJsonMain?: ToggleType
74
+ /**
75
+ * Using `.npmignore` is error prone, it's best practice to always declare `files` instead
76
+ * @defaultValue 'error'
77
+ */
78
+ alwaysPackageJsonFiles?: ToggleType
61
79
  }
62
80
 
63
81
  /** @internal */