@sanity/pkg-utils 6.4.1 → 6.5.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/dist/index.js CHANGED
@@ -10,6 +10,7 @@ import fs, { writeFile, readFile, readdir, lstat } from "node:fs/promises";
10
10
  import browserslist from "browserslist";
11
11
  import config from "@sanity/browserslist-config";
12
12
  import ts from "typescript";
13
+ import { errorMap } from "zod-validation-error";
13
14
  import { Observable, switchMap } from "rxjs";
14
15
  import { ExtractorConfig, Extractor } from "@microsoft/api-extractor";
15
16
  import { mkdirp } from "mkdirp";
@@ -269,7 +270,9 @@ function validateExports(_exports, options2) {
269
270
  return errors;
270
271
  }
271
272
  function parseExports(options2) {
272
- const { pkg, strict, legacyExports } = options2, type = pkg.type || "commonjs", errors = [];
273
+ const { pkg, strict, strictOptions: strictOptions2, legacyExports, logger } = options2, type = pkg.type || "commonjs", errors = [], report = (kind, message) => {
274
+ kind === "warn" ? logger.warn(message) : errors.push(message);
275
+ };
273
276
  if (pkg.source) {
274
277
  if (strict && pkg.exports?.["."] && typeof pkg.exports["."] == "object" && "source" in pkg.exports["."] && pkg.exports["."].source === pkg.source)
275
278
  errors.push(
@@ -345,7 +348,7 @@ function parseExports(options2) {
345
348
  - `)
346
349
  );
347
350
  const _exports = [];
348
- strict && "typings" in pkg && errors.push("package.json: `typings` should be `types`"), strict && !pkg.types && pkg.source?.endsWith(".ts") && errors.push(
351
+ strict && strictOptions2.noPackageJsonTypings !== "off" && "typings" in pkg && report(strictOptions2.noPackageJsonTypings, "package.json: `typings` should be `types`"), strict && !pkg.types && pkg.source?.endsWith(".ts") && errors.push(
349
352
  "package.json: `types` must be declared for the npm listing to show as a TypeScript module."
350
353
  ), strict && !pkg.exports["./package.json"] && errors.push('package.json: `exports["./package.json"] must be declared.');
351
354
  for (const [exportPath, exportEntry] of Object.entries(pkg.exports))
@@ -520,6 +523,16 @@ function resolveNodeTarget(versions) {
520
523
  if (target.length !== 0)
521
524
  return target;
522
525
  }
526
+ const toggle = z.union([z.literal("error"), z.literal("warn"), z.literal("off")]), strictOptions = z.object({
527
+ noPackageJsonTypings: toggle.default("error"),
528
+ noImplicitSideEffects: toggle.default("warn"),
529
+ noImplicitBrowsersList: toggle.default("warn")
530
+ }).strict(), validationSchema = z.object({
531
+ strictOptions: strictOptions.default({})
532
+ });
533
+ function parseStrictOptions(input) {
534
+ return validationSchema.parse({ strictOptions: input }, { errorMap }).strictOptions;
535
+ }
523
536
  async function resolveBuildContext(options2) {
524
537
  const {
525
538
  config: config2,
@@ -529,15 +542,27 @@ async function resolveBuildContext(options2) {
529
542
  pkg,
530
543
  strict,
531
544
  tsconfig: tsconfigPath
532
- } = options2, tsconfig = await loadTSConfig({ cwd, tsconfigPath });
545
+ } = options2, tsconfig = await loadTSConfig({ cwd, tsconfigPath }), strictOptions2 = parseStrictOptions(config2?.strictOptions ?? {});
533
546
  let browserslist2 = pkg.browserslist;
534
- browserslist2 || (strict && logger.warn(
535
- 'Could not detect a `browserslist` property in `package.json`, using default configuration. Add `"browserslist": "extends @sanity/browserslist-config"` to silence this warning.'
536
- ), browserslist2 = DEFAULT_BROWSERSLIST_QUERY);
547
+ if (!browserslist2) {
548
+ if (strict && strictOptions2.noImplicitBrowsersList !== "off") {
549
+ if (strictOptions2.noImplicitBrowsersList === "error")
550
+ throw new Error(
551
+ '\n- package.json: "browserslist" is missing, set it to `"browserslist": "extends @sanity/browserslist-config"`'
552
+ );
553
+ logger.warn(
554
+ 'Could not detect a `browserslist` property in `package.json`, using default configuration. Add `"browserslist": "extends @sanity/browserslist-config"` to silence this warning.'
555
+ );
556
+ }
557
+ browserslist2 = DEFAULT_BROWSERSLIST_QUERY;
558
+ }
537
559
  const targetVersions = browserslistToEsbuild(browserslist2);
538
- strict && typeof pkg.sideEffects > "u" && logger.error(
539
- 'No `sideEffects` field in `package.json`, assuming all files are side-effectful. Add `"sideEffects": true` to silence this warning. See https://webpack.js.org/guides/tree-shaking/#clarifying-tree-shaking-and-sideeffects for how to define `sideEffects`.'
540
- );
560
+ if (strict && strictOptions2.noImplicitSideEffects !== "off" && typeof pkg.sideEffects > "u") {
561
+ const msg = "package.json: `sideEffects` is missing, see https://webpack.js.org/guides/tree-shaking/#clarifying-tree-shaking-and-sideeffects for how to define `sideEffects`";
562
+ if (strictOptions2.noImplicitSideEffects === "error")
563
+ throw new Error(msg);
564
+ logger.warn(msg);
565
+ }
541
566
  const nodeTarget = resolveNodeTarget(targetVersions), webTarget = resolveBrowserTarget(targetVersions);
542
567
  if (!nodeTarget)
543
568
  throw new Error("no matching `node` target");
@@ -550,7 +575,9 @@ async function resolveBuildContext(options2) {
550
575
  }, parsedExports = parseExports({
551
576
  pkg,
552
577
  strict,
553
- legacyExports: config2?.legacyExports ?? !1
578
+ legacyExports: config2?.legacyExports ?? !1,
579
+ strictOptions: strictOptions2,
580
+ logger
554
581
  }).reduce((acc, x) => {
555
582
  const { _path: exportPath, ...exportEntry } = x;
556
583
  return { ...acc, [exportPath]: exportEntry };
@@ -21585,6 +21612,8 @@ export {
21585
21612
  rollupLegacyTask,
21586
21613
  rollupTask,
21587
21614
  rollupWatchTask,
21615
+ strictOptions,
21616
+ toggle,
21588
21617
  watch,
21589
21618
  watchTaskHandlers
21590
21619
  };