@savvy-web/tsdown-plugins 0.6.0 → 0.7.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.
@@ -0,0 +1,42 @@
1
+ import getReleasePlan from "@changesets/get-release-plan";
2
+ import { getPackages } from "@manypkg/get-packages";
3
+
4
+ //#region src/changesets/next-versions.ts
5
+ /**
6
+ * Resolve the next release version of every workspace package from pending changesets.
7
+ *
8
+ * Walks up from `cwd` to the monorepo root via `@manypkg/get-packages`, seeds the map with
9
+ * each package's CURRENT version, then overlays `newVersion` for changeset-affected packages
10
+ * via `@changesets/get-release-plan`. Never rejects: any failure (not a workspace, missing
11
+ * `.changeset/config.json`, parse error) degrades to current versions (or an empty map).
12
+ */
13
+ async function resolveNextVersions(cwd) {
14
+ try {
15
+ const packages = await getPackages(cwd);
16
+ if (packages.tool === "root") return {
17
+ root: packages.root.dir,
18
+ versions: /* @__PURE__ */ new Map()
19
+ };
20
+ const versions = /* @__PURE__ */ new Map();
21
+ for (const p of packages.packages) {
22
+ const { name, version } = p.packageJson;
23
+ if (name && version) versions.set(name, version);
24
+ }
25
+ try {
26
+ const plan = await getReleasePlan(packages.root.dir);
27
+ for (const r of plan.releases) versions.set(r.name, r.newVersion);
28
+ } catch {}
29
+ return {
30
+ root: packages.root.dir,
31
+ versions
32
+ };
33
+ } catch {
34
+ return {
35
+ root: cwd,
36
+ versions: /* @__PURE__ */ new Map()
37
+ };
38
+ }
39
+ }
40
+
41
+ //#endregion
42
+ export { resolveNextVersions };
package/index.d.ts CHANGED
@@ -564,6 +564,24 @@ declare function syncPublicDir(sourceDir: string, targetDir: string): void;
564
564
  */
565
565
  declare function resolveManifest(pkg: ManifestLike$1): Promise<ManifestLike$1>;
566
566
  //#endregion
567
+ //#region src/changesets/next-versions.d.ts
568
+ /** Result of resolving next release versions for a workspace. */
569
+ interface NextVersions {
570
+ /** Monorepo root containing `.changeset/` (or `cwd` when no workspace was found). */
571
+ readonly root: string;
572
+ /** Canonical package name -> next release version (current version when unbumped). */
573
+ readonly versions: ReadonlyMap<string, string>;
574
+ }
575
+ /**
576
+ * Resolve the next release version of every workspace package from pending changesets.
577
+ *
578
+ * Walks up from `cwd` to the monorepo root via `@manypkg/get-packages`, seeds the map with
579
+ * each package's CURRENT version, then overlays `newVersion` for changeset-affected packages
580
+ * via `@changesets/get-release-plan`. Never rejects: any failure (not a workspace, missing
581
+ * `.changeset/config.json`, parse error) degrades to current versions (or an empty map).
582
+ */
583
+ declare function resolveNextVersions(cwd: string): Promise<NextVersions>;
584
+ //#endregion
567
585
  //#region src/errors.d.ts
568
586
  declare const MetaGenerationError_base: new <A extends Record<string, any> = {}>(args: import("effect/Types").VoidIfEmpty<{ readonly [P in keyof A as P extends "_tag" ? never : P]: A[P] }>) => import("effect/Cause").YieldableError & {
569
587
  readonly _tag: "MetaGenerationError";
@@ -662,20 +680,30 @@ interface TsdocOptions {
662
680
  }
663
681
  /** The `meta` field on defineBuild. Absent means no api-model generation. */
664
682
  interface MetaOptions {
665
- /** Directories to copy the api-model into on `savvy build --target meta`. */
683
+ /** Directories to copy the canonical group's api-model into after `savvy build --target prod`. */
666
684
  readonly localPaths?: ReadonlyArray<string> | undefined;
685
+ /**
686
+ * Forward-look the meta bundle's own `version` and workspace-sibling dep versions to their
687
+ * NEXT release version from pending changesets. `"auto"` (default) is `false` under CI
688
+ * (`CI`/`GITHUB_ACTIONS` set) and `true` locally, so a local bundle matches the CI release build.
689
+ */
690
+ readonly optimistic?: "auto" | boolean | undefined;
667
691
  readonly tsdoc?: TsdocOptions | undefined;
668
692
  }
669
693
  /** Fully-resolved meta options (no optionals). */
670
694
  interface NormalizedMeta {
671
695
  readonly localPaths: ReadonlyArray<string>;
696
+ readonly optimistic: boolean;
672
697
  readonly tsdoc: {
673
698
  readonly suppressWarnings: ReadonlyArray<WarningSuppressionRule>;
674
699
  readonly tagDefinitions: ReadonlyArray<TsdocTagDefinition>;
675
700
  };
676
701
  }
677
702
  /** Fill defaults so downstream code never branches on undefined. */
678
- declare function normalizeMetaOptions(meta: MetaOptions): NormalizedMeta;
703
+ declare function normalizeMetaOptions(meta: MetaOptions, env?: {
704
+ CI?: string | undefined;
705
+ GITHUB_ACTIONS?: string | undefined;
706
+ }): NormalizedMeta;
679
707
  //#endregion
680
708
  //#region src/targets/config.d.ts
681
709
  /** A single object-form publish target. Uses `from` XOR `name` (never both). */
@@ -846,6 +874,12 @@ interface GenerateMetaOptions {
846
874
  /** Directories (relative to cwd) to copy the meta bundle into. */
847
875
  readonly localPaths: ReadonlyArray<string>;
848
876
  readonly tsdoc: NormalizedMeta["tsdoc"];
877
+ /**
878
+ * Optional transform applied to the bundle `package.json` (read from `dtsDir`) before it is
879
+ * written to `outMetaDir` and copied into `localPaths`. Used for the optimistic next-version
880
+ * rewrite. When omitted, the package.json is copied verbatim.
881
+ */
882
+ readonly manifestTransform?: ((pkg: Record<string, unknown>) => Record<string, unknown>) | undefined;
849
883
  }
850
884
  interface MetaResult {
851
885
  readonly apiJsonPath: string;
@@ -860,6 +894,15 @@ interface MetaResult {
860
894
  */
861
895
  declare function generateMeta(options: GenerateMetaOptions): Promise<MetaResult>;
862
896
  //#endregion
897
+ //#region src/meta/optimistic.d.ts
898
+ /**
899
+ * Rewrite a meta `package.json` so the package's own `version` and any workspace-sibling
900
+ * dependency version reflect their NEXT release version from `versions`. Pure: returns a new
901
+ * object, never mutates the input. External/catalog-resolved deps (names absent from `versions`)
902
+ * are left as-is.
903
+ */
904
+ declare function rewriteMetaVersions(pkg: Record<string, unknown>, versions: ReadonlyMap<string, string>, selfName: string): Record<string, unknown>;
905
+ //#endregion
863
906
  //#region src/meta/tsconfig-resolver.d.ts
864
907
  /**
865
908
  * Compiler options with enum values converted to their string equivalents.
@@ -1579,5 +1622,5 @@ declare function resolveTargets(options: {
1579
1622
  baseName: string;
1580
1623
  }): TargetResolution;
1581
1624
  //#endregion
1582
- export { type BuildEmittedManifestOptions, type BuildFormat, type BuildGroupSpec, type BuildPlatform, type BuildReport, BuildReport as BuildReportSchema, type BuildTargetGroupsOptions, CatalogAssemblyError, CatalogResolutionError, CiAnnotationsFormatter, ConfigValidationError, ConfigValidator, ConfigValidatorLive, type CssOptions, DEFAULT_EXE_NODE_VERSION, type DeriveOptions, type DerivedTsdownOptions, type DualExports, type EmitManifestOptions, type EntryOverride, type Environment, EnvironmentDetector, EnvironmentDetectorLive, type ExeBuild, type ExeConfig, type ExeRewrite, type ExeSeaConfig, type ExeTarget, type ExeTargetInput, type Executor, ExecutorResolver, ExecutorResolverLive, type ExtractOptions, type ExtractResult, FormatSelector, FormatSelectorLive, type Formatter, type FormatterContext, type GenerateMetaOptions, type Json, JsonFormatter, type JsxConfig, type LooseFileSpec, type LooseFiles, type ManifestLike, MarkdownFormatter, MetaGenerationError, type MetaOptions, type MetaResult, type NormalizedExe, type NormalizedLooseFile, type NormalizedMeta, type OutputFormat, OutputRenderer, OutputRendererLive, type PackageJsonEntriesOptions, type PackageJsonLike, type PkgOsCpu, type PortableTsconfig, type PublishTargetObject, type PublishTargetValue, type PublishTargets, type RenderReportOptions, type RenderedOutput, ReportPipelineLive, ReportTimings, type ResolvedCompilerOptions, type ResolvedGroup, type ResolvedTarget, type ResolvedTsconfig, type ResolvedTsconfigOptions, type RunExeBuildOptions, SilentFormatter, type TargetGroupId, type TargetGroupRef, type TargetGroupReport, TargetGroupReport as TargetGroupReportSchema, type TargetResolution, TerminalFormatter, type Timer, type TransformManifestOptions, type TsconfigJsx, TsconfigResolver, type TsdocOptions, type TsdocTagDefinition, type TsdownBuild, type ValidationInput, type WarningSuppressionRule, buildEmittedManifest, buildResolvedTsconfig, buildTargetGroups, cjsDefaultInterop, computeExeFileName, createEntryName, createTimer, defaultManifestTransform, deriveTargetGroupOptions, emitManifest, extractEntries, formatTime, generateBuildReportSchema, generateMeta, isTargetObject, nodeBuiltinDefaultInterop, normalizeBinPaths, normalizeExeOptions, normalizeLooseFiles, normalizeMetaOptions, packageJsonEntries, readTsconfigJsx, removeDeclarationMaps, renderReport, resolveJsxConfig, resolveManifest, resolvePortableTsconfig, resolveTargets, runExeBuild, syncPublicDir, transformBin, transformExports, transformManifest, writeResolvedTsconfig, writeTargetsBinding };
1625
+ export { type BuildEmittedManifestOptions, type BuildFormat, type BuildGroupSpec, type BuildPlatform, type BuildReport, BuildReport as BuildReportSchema, type BuildTargetGroupsOptions, CatalogAssemblyError, CatalogResolutionError, CiAnnotationsFormatter, ConfigValidationError, ConfigValidator, ConfigValidatorLive, type CssOptions, DEFAULT_EXE_NODE_VERSION, type DeriveOptions, type DerivedTsdownOptions, type DualExports, type EmitManifestOptions, type EntryOverride, type Environment, EnvironmentDetector, EnvironmentDetectorLive, type ExeBuild, type ExeConfig, type ExeRewrite, type ExeSeaConfig, type ExeTarget, type ExeTargetInput, type Executor, ExecutorResolver, ExecutorResolverLive, type ExtractOptions, type ExtractResult, FormatSelector, FormatSelectorLive, type Formatter, type FormatterContext, type GenerateMetaOptions, type Json, JsonFormatter, type JsxConfig, type LooseFileSpec, type LooseFiles, type ManifestLike, MarkdownFormatter, MetaGenerationError, type MetaOptions, type MetaResult, type NextVersions, type NormalizedExe, type NormalizedLooseFile, type NormalizedMeta, type OutputFormat, OutputRenderer, OutputRendererLive, type PackageJsonEntriesOptions, type PackageJsonLike, type PkgOsCpu, type PortableTsconfig, type PublishTargetObject, type PublishTargetValue, type PublishTargets, type RenderReportOptions, type RenderedOutput, ReportPipelineLive, ReportTimings, type ResolvedCompilerOptions, type ResolvedGroup, type ResolvedTarget, type ResolvedTsconfig, type ResolvedTsconfigOptions, type RunExeBuildOptions, SilentFormatter, type TargetGroupId, type TargetGroupRef, type TargetGroupReport, TargetGroupReport as TargetGroupReportSchema, type TargetResolution, TerminalFormatter, type Timer, type TransformManifestOptions, type TsconfigJsx, TsconfigResolver, type TsdocOptions, type TsdocTagDefinition, type TsdownBuild, type ValidationInput, type WarningSuppressionRule, buildEmittedManifest, buildResolvedTsconfig, buildTargetGroups, cjsDefaultInterop, computeExeFileName, createEntryName, createTimer, defaultManifestTransform, deriveTargetGroupOptions, emitManifest, extractEntries, formatTime, generateBuildReportSchema, generateMeta, isTargetObject, nodeBuiltinDefaultInterop, normalizeBinPaths, normalizeExeOptions, normalizeLooseFiles, normalizeMetaOptions, packageJsonEntries, readTsconfigJsx, removeDeclarationMaps, renderReport, resolveJsxConfig, resolveManifest, resolveNextVersions, resolvePortableTsconfig, resolveTargets, rewriteMetaVersions, runExeBuild, syncPublicDir, transformBin, transformExports, transformManifest, writeResolvedTsconfig, writeTargetsBinding };
1583
1626
  //# sourceMappingURL=index.d.ts.map
package/index.js CHANGED
@@ -10,6 +10,7 @@ import { buildTargetGroups } from "./build/build-target-groups.js";
10
10
  import { ConfigValidationError, MetaGenerationError } from "./errors.js";
11
11
  import { normalizeLooseFiles } from "./build/loose-files.js";
12
12
  import { removeDeclarationMaps } from "./build/strip-maps.js";
13
+ import { resolveNextVersions } from "./changesets/next-versions.js";
13
14
  import { ConfigValidator } from "./config-validation/ConfigValidator.js";
14
15
  import { DEFAULT_EXE_NODE_VERSION, normalizeExeOptions } from "./exe/config.js";
15
16
  import { isTargetObject } from "./targets/config.js";
@@ -23,6 +24,7 @@ import { readTsconfigJsx, resolveJsxConfig } from "./jsx/config.js";
23
24
  import { normalizeMetaOptions } from "./meta/config.js";
24
25
  import { TsconfigResolver, resolvePortableTsconfig } from "./meta/tsconfig-resolver.js";
25
26
  import { generateMeta } from "./meta/generate.js";
27
+ import { rewriteMetaVersions } from "./meta/optimistic.js";
26
28
  import { CiAnnotationsFormatter } from "./report/formatters/ci-annotations.js";
27
29
  import { JsonFormatter } from "./report/formatters/json.js";
28
30
  import { MarkdownFormatter } from "./report/formatters/markdown.js";
@@ -43,4 +45,4 @@ import { generateBuildReportSchema } from "./report/schema-export.js";
43
45
  import { writeTargetsBinding } from "./targets/binding.js";
44
46
  import { CatalogAssemblyError, CatalogResolutionError } from "workspaces-effect";
45
47
 
46
- export { BuildReport as BuildReportSchema, CatalogAssemblyError, CatalogResolutionError, CiAnnotationsFormatter, ConfigValidationError, ConfigValidator, ConfigValidatorLive, DEFAULT_EXE_NODE_VERSION, EnvironmentDetector, EnvironmentDetectorLive, ExecutorResolver, ExecutorResolverLive, FormatSelector, FormatSelectorLive, JsonFormatter, MarkdownFormatter, MetaGenerationError, OutputRenderer, OutputRendererLive, ReportPipelineLive, ReportTimings, SilentFormatter, TargetGroupReport as TargetGroupReportSchema, TerminalFormatter, TsconfigResolver, buildEmittedManifest, buildResolvedTsconfig, buildTargetGroups, cjsDefaultInterop, computeExeFileName, createEntryName, createTimer, defaultManifestTransform, deriveTargetGroupOptions, emitManifest, extractEntries, formatTime, generateBuildReportSchema, generateMeta, isTargetObject, nodeBuiltinDefaultInterop, normalizeBinPaths, normalizeExeOptions, normalizeLooseFiles, normalizeMetaOptions, packageJsonEntries, readTsconfigJsx, removeDeclarationMaps, renderReport, resolveJsxConfig, resolveManifest, resolvePortableTsconfig, resolveTargets, runExeBuild, syncPublicDir, transformBin, transformExports, transformManifest, writeResolvedTsconfig, writeTargetsBinding };
48
+ export { BuildReport as BuildReportSchema, CatalogAssemblyError, CatalogResolutionError, CiAnnotationsFormatter, ConfigValidationError, ConfigValidator, ConfigValidatorLive, DEFAULT_EXE_NODE_VERSION, EnvironmentDetector, EnvironmentDetectorLive, ExecutorResolver, ExecutorResolverLive, FormatSelector, FormatSelectorLive, JsonFormatter, MarkdownFormatter, MetaGenerationError, OutputRenderer, OutputRendererLive, ReportPipelineLive, ReportTimings, SilentFormatter, TargetGroupReport as TargetGroupReportSchema, TerminalFormatter, TsconfigResolver, buildEmittedManifest, buildResolvedTsconfig, buildTargetGroups, cjsDefaultInterop, computeExeFileName, createEntryName, createTimer, defaultManifestTransform, deriveTargetGroupOptions, emitManifest, extractEntries, formatTime, generateBuildReportSchema, generateMeta, isTargetObject, nodeBuiltinDefaultInterop, normalizeBinPaths, normalizeExeOptions, normalizeLooseFiles, normalizeMetaOptions, packageJsonEntries, readTsconfigJsx, removeDeclarationMaps, renderReport, resolveJsxConfig, resolveManifest, resolveNextVersions, resolvePortableTsconfig, resolveTargets, rewriteMetaVersions, runExeBuild, syncPublicDir, transformBin, transformExports, transformManifest, writeResolvedTsconfig, writeTargetsBinding };
package/meta/config.js CHANGED
@@ -1,8 +1,14 @@
1
1
  //#region src/meta/config.ts
2
+ /** Resolve `"auto"` against the environment; explicit booleans pass through. */
3
+ function resolveOptimistic(value, env) {
4
+ if (value === true || value === false) return value;
5
+ return !(env.CI || env.GITHUB_ACTIONS);
6
+ }
2
7
  /** Fill defaults so downstream code never branches on undefined. */
3
- function normalizeMetaOptions(meta) {
8
+ function normalizeMetaOptions(meta, env = process.env) {
4
9
  return {
5
10
  localPaths: meta.localPaths ?? [],
11
+ optimistic: resolveOptimistic(meta.optimistic, env),
6
12
  tsdoc: {
7
13
  suppressWarnings: meta.tsdoc?.suppressWarnings ?? [],
8
14
  tagDefinitions: meta.tsdoc?.tagDefinitions ?? []
package/meta/generate.js CHANGED
@@ -18,7 +18,7 @@ function unscopedName(name) {
18
18
  * published-package artifact and is written into `dtsDir` (the built pkg/), not the meta bundle.
19
19
  */
20
20
  async function generateMeta(options) {
21
- const { cwd, packageName, tsconfigPath, dtsDir, entries, exportPaths, outMetaDir, localPaths, tsdoc } = options;
21
+ const { cwd, packageName, tsconfigPath, dtsDir, entries, exportPaths, outMetaDir, localPaths, tsdoc, manifestTransform } = options;
22
22
  const tsdocConfigPath = writeTsdocConfig(cwd, tsdoc);
23
23
  const packageJsonPath = join(cwd, "package.json");
24
24
  mkdirSync(outMetaDir, { recursive: true });
@@ -55,7 +55,9 @@ async function generateMeta(options) {
55
55
  writeFileSync(apiJsonPath, `${JSON.stringify(finalModel, null, 2)}\n`, "utf-8");
56
56
  for (const intermediate of intermediateApiJsons) rmSync(intermediate, { force: true });
57
57
  const bundlePackageJson = join(outMetaDir, "package.json");
58
- copyFileSync(join(dtsDir, "package.json"), bundlePackageJson);
58
+ const builtPkg = JSON.parse(readFileSync(join(dtsDir, "package.json"), "utf-8"));
59
+ const finalPkg = manifestTransform ? manifestTransform(builtPkg) : builtPkg;
60
+ writeFileSync(bundlePackageJson, `${JSON.stringify(finalPkg, null, 2)}\n`, "utf-8");
59
61
  const bundleTsconfig = join(outMetaDir, "tsconfig.json");
60
62
  const portableTsconfig = resolvePortableTsconfig(cwd, tsconfigPath);
61
63
  writeFileSync(bundleTsconfig, `${JSON.stringify(portableTsconfig, null, 2)}\n`, "utf-8");
@@ -0,0 +1,32 @@
1
+ //#region src/meta/optimistic.ts
2
+ /** Dependency map fields whose workspace-sibling versions get the optimistic bump. */
3
+ const DEP_FIELDS = [
4
+ "dependencies",
5
+ "peerDependencies",
6
+ "optionalDependencies"
7
+ ];
8
+ /**
9
+ * Rewrite a meta `package.json` so the package's own `version` and any workspace-sibling
10
+ * dependency version reflect their NEXT release version from `versions`. Pure: returns a new
11
+ * object, never mutates the input. External/catalog-resolved deps (names absent from `versions`)
12
+ * are left as-is.
13
+ */
14
+ function rewriteMetaVersions(pkg, versions, selfName) {
15
+ const out = { ...pkg };
16
+ const selfNext = versions.get(selfName);
17
+ if (selfNext !== void 0) out.version = selfNext;
18
+ for (const field of DEP_FIELDS) {
19
+ const deps = pkg[field];
20
+ if (deps === null || typeof deps !== "object") continue;
21
+ const next = { ...deps };
22
+ for (const depName of Object.keys(next)) {
23
+ const v = versions.get(depName);
24
+ if (v !== void 0) next[depName] = v;
25
+ }
26
+ out[field] = next;
27
+ }
28
+ return out;
29
+ }
30
+
31
+ //#endregion
32
+ export { rewriteMetaVersions };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@savvy-web/tsdown-plugins",
3
- "version": "0.6.0",
3
+ "version": "0.7.0",
4
4
  "private": false,
5
5
  "description": "Interface-only tsdown/rolldown plugin pack powering @savvy-web/bundler",
6
6
  "homepage": "https://github.com/savvy-web/systems/tree/main/packages/tsdown-plugins",
@@ -28,7 +28,9 @@
28
28
  "./package.json": "./package.json"
29
29
  },
30
30
  "dependencies": {
31
+ "@changesets/get-release-plan": "^4.0.16",
31
32
  "@effect/platform-node": "^0.107.0",
33
+ "@manypkg/get-packages": "^1.1.3",
32
34
  "@microsoft/api-extractor": "^7.58.9",
33
35
  "@microsoft/tsdoc": "^0.16.0",
34
36
  "@microsoft/tsdoc-config": "^0.18.1",