@savvy-web/silk 1.3.11 → 2.1.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/README.md +7 -5
- package/changesets-changelog.cjs +39298 -96760
- package/changesets-changelog.d.cts +24 -14
- package/changesets-changelog.d.ts +24 -14
- package/changesets-changelog.js +54057 -1
- package/changesets-markdownlint.cjs +39295 -96757
- package/changesets-markdownlint.d.cts +24 -14
- package/changesets-markdownlint.d.ts +24 -14
- package/changesets-markdownlint.js +54057 -1
- package/package.json +6 -5
- package/tsconfig/node/dist/tsconfig.tsbuildinfo +1 -1
- package/_virtual/_rolldown/runtime.cjs +0 -45
- package/_virtual/_rolldown/runtime.js +0 -45
- package/packages/silk-effects/dist/dev/pkg/_virtual/_rolldown/runtime.cjs +0 -15
- package/packages/silk-effects/dist/dev/pkg/_virtual/_rolldown/runtime.js +0 -14
- package/packages/silk-effects/dist/dev/pkg/changesets/api/categories.cjs +0 -247
- package/packages/silk-effects/dist/dev/pkg/changesets/api/categories.js +0 -247
- package/packages/silk-effects/dist/dev/pkg/changesets/api/changelog.cjs +0 -134
- package/packages/silk-effects/dist/dev/pkg/changesets/api/changelog.js +0 -134
- package/packages/silk-effects/dist/dev/pkg/changesets/api/dependency-table.cjs +0 -163
- package/packages/silk-effects/dist/dev/pkg/changesets/api/dependency-table.js +0 -163
- package/packages/silk-effects/dist/dev/pkg/changesets/api/linter.cjs +0 -170
- package/packages/silk-effects/dist/dev/pkg/changesets/api/linter.js +0 -170
- package/packages/silk-effects/dist/dev/pkg/changesets/api/transformer.cjs +0 -134
- package/packages/silk-effects/dist/dev/pkg/changesets/api/transformer.js +0 -134
- package/packages/silk-effects/dist/dev/pkg/changesets/categories/index.cjs +0 -317
- package/packages/silk-effects/dist/dev/pkg/changesets/categories/index.js +0 -299
- package/packages/silk-effects/dist/dev/pkg/changesets/categories/types.cjs +0 -65
- package/packages/silk-effects/dist/dev/pkg/changesets/categories/types.js +0 -65
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/formatting.cjs +0 -114
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/formatting.js +0 -113
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getDependencyReleaseLine.cjs +0 -118
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getDependencyReleaseLine.js +0 -118
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getReleaseLine.cjs +0 -122
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/getReleaseLine.js +0 -122
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/index.cjs +0 -97
- package/packages/silk-effects/dist/dev/pkg/changesets/changelog/index.js +0 -97
- package/packages/silk-effects/dist/dev/pkg/changesets/constants.cjs +0 -43
- package/packages/silk-effects/dist/dev/pkg/changesets/constants.js +0 -42
- package/packages/silk-effects/dist/dev/pkg/changesets/errors.cjs +0 -386
- package/packages/silk-effects/dist/dev/pkg/changesets/errors.js +0 -371
- package/packages/silk-effects/dist/dev/pkg/changesets/index.cjs +0 -300
- package/packages/silk-effects/dist/dev/pkg/changesets/index.js +0 -179
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/index.cjs +0 -34
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/index.js +0 -29
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/content-structure.cjs +0 -98
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/content-structure.js +0 -98
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/dependency-table-format.cjs +0 -170
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/dependency-table-format.js +0 -170
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/heading-hierarchy.cjs +0 -61
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/heading-hierarchy.js +0 -61
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/required-sections.cjs +0 -54
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/required-sections.js +0 -54
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/uncategorized-content.cjs +0 -54
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/uncategorized-content.js +0 -54
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/utils.cjs +0 -31
- package/packages/silk-effects/dist/dev/pkg/changesets/markdownlint/rules/utils.js +0 -30
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/aggregate-dependency-tables.cjs +0 -47
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/aggregate-dependency-tables.js +0 -47
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/contributor-footnotes.cjs +0 -123
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/contributor-footnotes.js +0 -123
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/deduplicate-items.cjs +0 -32
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/deduplicate-items.js +0 -32
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/issue-link-refs.cjs +0 -59
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/issue-link-refs.js +0 -59
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/maintenance-note.cjs +0 -61
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/maintenance-note.js +0 -61
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/merge-sections.cjs +0 -43
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/merge-sections.js +0 -43
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/normalize-format.cjs +0 -47
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/normalize-format.js +0 -47
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/reorder-sections.cjs +0 -34
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/plugins/reorder-sections.js +0 -34
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/presets.cjs +0 -120
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/presets.js +0 -119
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/content-structure.cjs +0 -22
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/content-structure.js +0 -22
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/dependency-table-format.cjs +0 -40
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/dependency-table-format.js +0 -40
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/heading-hierarchy.cjs +0 -19
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/heading-hierarchy.js +0 -19
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/required-sections.cjs +0 -17
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/required-sections.js +0 -17
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/uncategorized-content.cjs +0 -31
- package/packages/silk-effects/dist/dev/pkg/changesets/remark/rules/uncategorized-content.js +0 -31
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/changeset.cjs +0 -148
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/changeset.js +0 -145
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/dependency-table.cjs +0 -203
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/dependency-table.js +0 -198
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/git.cjs +0 -69
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/git.js +0 -68
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/github.cjs +0 -177
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/github.js +0 -174
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/options.cjs +0 -183
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/options.js +0 -181
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/package-scope.cjs +0 -129
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/package-scope.js +0 -127
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/primitives.cjs +0 -72
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/primitives.js +0 -71
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/release-plan.cjs +0 -62
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/release-plan.js +0 -56
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/version-files.cjs +0 -154
- package/packages/silk-effects/dist/dev/pkg/changesets/schemas/version-files.js +0 -150
- package/packages/silk-effects/dist/dev/pkg/changesets/services/branch-analyzer.cjs +0 -300
- package/packages/silk-effects/dist/dev/pkg/changesets/services/branch-analyzer.js +0 -294
- package/packages/silk-effects/dist/dev/pkg/changesets/services/changelog.cjs +0 -50
- package/packages/silk-effects/dist/dev/pkg/changesets/services/changelog.js +0 -49
- package/packages/silk-effects/dist/dev/pkg/changesets/services/config-inspector.cjs +0 -489
- package/packages/silk-effects/dist/dev/pkg/changesets/services/config-inspector.js +0 -481
- package/packages/silk-effects/dist/dev/pkg/changesets/services/deps-regen.cjs +0 -375
- package/packages/silk-effects/dist/dev/pkg/changesets/services/deps-regen.js +0 -371
- package/packages/silk-effects/dist/dev/pkg/changesets/services/github.cjs +0 -160
- package/packages/silk-effects/dist/dev/pkg/changesets/services/github.js +0 -157
- package/packages/silk-effects/dist/dev/pkg/changesets/services/maintenance-reason.cjs +0 -68
- package/packages/silk-effects/dist/dev/pkg/changesets/services/maintenance-reason.js +0 -66
- package/packages/silk-effects/dist/dev/pkg/changesets/services/markdown.cjs +0 -87
- package/packages/silk-effects/dist/dev/pkg/changesets/services/markdown.js +0 -85
- package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.cjs +0 -338
- package/packages/silk-effects/dist/dev/pkg/changesets/services/release-planner.js +0 -334
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/commit-parser.cjs +0 -81
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/commit-parser.js +0 -80
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/dep-diff.cjs +0 -111
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/dep-diff.js +0 -111
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/dependency-table.cjs +0 -351
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/dependency-table.js +0 -347
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/git.cjs +0 -51
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/git.js +0 -51
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/issue-refs.cjs +0 -102
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/issue-refs.js +0 -101
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/jsonpath.cjs +0 -178
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/jsonpath.js +0 -175
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/logger.cjs +0 -51
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/logger.js +0 -50
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/markdown-link.cjs +0 -59
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/markdown-link.js +0 -57
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/publishability.cjs +0 -50
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/publishability.js +0 -50
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/remark-pipeline.cjs +0 -81
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/remark-pipeline.js +0 -79
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/section-parser.cjs +0 -94
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/section-parser.js +0 -94
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/strip-frontmatter.cjs +0 -47
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/strip-frontmatter.js +0 -46
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-blocks.cjs +0 -110
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-blocks.js +0 -108
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-files.cjs +0 -336
- package/packages/silk-effects/dist/dev/pkg/changesets/utils/version-files.js +0 -336
- package/packages/silk-effects/dist/dev/pkg/changesets/vendor/github-info.cjs +0 -55
- package/packages/silk-effects/dist/dev/pkg/changesets/vendor/github-info.js +0 -55
- package/packages/silk-effects/dist/dev/pkg/errors/ChangesetConfigError.cjs +0 -21
- package/packages/silk-effects/dist/dev/pkg/errors/ChangesetConfigError.js +0 -21
- package/packages/silk-effects/dist/dev/pkg/schemas/VersioningSchemas.cjs +0 -101
- package/packages/silk-effects/dist/dev/pkg/schemas/VersioningSchemas.js +0 -99
- package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfig.cjs +0 -81
- package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfig.js +0 -80
- package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfigReader.cjs +0 -109
- package/packages/silk-effects/dist/dev/pkg/services/ChangesetConfigReader.js +0 -108
- package/packages/silk-effects/dist/dev/pkg/services/SilkPublishability.cjs +0 -238
- package/packages/silk-effects/dist/dev/pkg/services/SilkPublishability.js +0 -236
|
@@ -1,371 +0,0 @@
|
|
|
1
|
-
import { ChangesetConfigReaderLive } from "../../services/ChangesetConfigReader.js";
|
|
2
|
-
import { ChangesetConfig, ChangesetConfigLive } from "../../services/ChangesetConfig.js";
|
|
3
|
-
import { WorkspaceDiscovery } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/services/WorkspaceDiscovery.js";
|
|
4
|
-
import { PointInTimeWorkspace } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/services/PointInTimeWorkspace.js";
|
|
5
|
-
import { PointInTimeWorkspaceLive } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/layers/PointInTimeWorkspaceLive.js";
|
|
6
|
-
import { PublishabilityDetector } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/services/PublishabilityDetector.js";
|
|
7
|
-
import { WorkspaceDiscoveryLive } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/layers/WorkspaceDiscoveryLive.js";
|
|
8
|
-
import { WorkspaceRootLive } from "../../../../../../../node_modules/.pnpm/workspaces-effect@2.0.1_@effect_platform@0.96.2_effect@3.21.4__effect@3.21.4/node_modules/workspaces-effect/layers/WorkspaceRootLive.js";
|
|
9
|
-
import { PublishabilityDetectorAdaptiveLive } from "../../services/SilkPublishability.js";
|
|
10
|
-
import { ChangesetIOError } from "../errors.js";
|
|
11
|
-
import { serializeDependencyTableToMarkdown, sortDependencyRows } from "../utils/dependency-table.js";
|
|
12
|
-
import { ConfigInspector, ConfigInspectorLive } from "./config-inspector.js";
|
|
13
|
-
import { computeWorkspaceDependencyDiffs } from "../utils/dep-diff.js";
|
|
14
|
-
import { gitMergeBase } from "../utils/git.js";
|
|
15
|
-
import { listPublishablePackageNames } from "../utils/publishability.js";
|
|
16
|
-
import { Context, Effect, Layer, Option } from "effect";
|
|
17
|
-
import { FileSystem } from "@effect/platform";
|
|
18
|
-
import { join, resolve } from "node:path";
|
|
19
|
-
|
|
20
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/services/deps-regen.js
|
|
21
|
-
/**
|
|
22
|
-
* `Changesets.DepsRegen` service — lift the `deps regen` / `deps detect`
|
|
23
|
-
* orchestration out of the CLI into a `Context.Tag` service with a
|
|
24
|
-
* `plan()` / `execute()` split.
|
|
25
|
-
*
|
|
26
|
-
* @remarks
|
|
27
|
-
* `plan()` computes the cumulative dependency diff (merge-base → working
|
|
28
|
-
* tree by default, or between two explicit refs) by snapshotting both
|
|
29
|
-
* sides through `PointInTimeWorkspace`, which resolves `catalog:` /
|
|
30
|
-
* `workspace:` specifiers against each ref's own catalogs and package
|
|
31
|
-
* versions before diffing. It drops `devDependency` rows (unless
|
|
32
|
-
* `includeDevDeps`), and returns a complete {@link RegenPlan}
|
|
33
|
-
* (target filenames + stale-changeset deletes) WITHOUT touching the
|
|
34
|
-
* filesystem. `execute()` applies a plan — writing the fresh changesets
|
|
35
|
-
* first, then deleting the stale pure-dependency ones (so an interrupted
|
|
36
|
-
* run loses nothing and is safely re-runnable).
|
|
37
|
-
*
|
|
38
|
-
* This is the single source of truth for regen/detect: the CLI commands
|
|
39
|
-
* and MCP tools are thin adapters over this service.
|
|
40
|
-
*
|
|
41
|
-
* @see {@link DepsRegen} for the service tag
|
|
42
|
-
* @see {@link DepsRegenLive} for the production layer
|
|
43
|
-
*
|
|
44
|
-
*/
|
|
45
|
-
const ADJECTIVES = [
|
|
46
|
-
"brave",
|
|
47
|
-
"clever",
|
|
48
|
-
"swift",
|
|
49
|
-
"silver",
|
|
50
|
-
"lucky",
|
|
51
|
-
"happy",
|
|
52
|
-
"calm",
|
|
53
|
-
"bright",
|
|
54
|
-
"quiet",
|
|
55
|
-
"wild"
|
|
56
|
-
];
|
|
57
|
-
const NOUNS = [
|
|
58
|
-
"dogs",
|
|
59
|
-
"cats",
|
|
60
|
-
"wolves",
|
|
61
|
-
"foxes",
|
|
62
|
-
"cups",
|
|
63
|
-
"ships",
|
|
64
|
-
"trees",
|
|
65
|
-
"owls",
|
|
66
|
-
"cranes",
|
|
67
|
-
"hills"
|
|
68
|
-
];
|
|
69
|
-
const VERBS = [
|
|
70
|
-
"laugh",
|
|
71
|
-
"dream",
|
|
72
|
-
"fly",
|
|
73
|
-
"sing",
|
|
74
|
-
"dance",
|
|
75
|
-
"wander",
|
|
76
|
-
"soar",
|
|
77
|
-
"rest",
|
|
78
|
-
"leap",
|
|
79
|
-
"ponder"
|
|
80
|
-
];
|
|
81
|
-
function pickRandomTriplet() {
|
|
82
|
-
return `${ADJECTIVES[Math.floor(Math.random() * ADJECTIVES.length)]}-${NOUNS[Math.floor(Math.random() * NOUNS.length)]}-${VERBS[Math.floor(Math.random() * VERBS.length)]}`;
|
|
83
|
-
}
|
|
84
|
-
/**
|
|
85
|
-
* Pick a `<adjective>-<noun>-<verb>` filename slug that does not collide
|
|
86
|
-
* with an existing `.changeset/*.md` OR with a slug already claimed
|
|
87
|
-
* earlier in the same {@link RegenPlan.toWrite} computation. `plan()`
|
|
88
|
-
* never writes to disk, so an on-disk existence check alone cannot see
|
|
89
|
-
* slugs chosen moments earlier in the same call — the `chosen` set closes
|
|
90
|
-
* that gap. The triplet space is 1,000 combinations, so a busy repo can
|
|
91
|
-
* plausibly exhaust it across runs; fall back to a timestamp suffix after
|
|
92
|
-
* 20 unlucky picks.
|
|
93
|
-
*
|
|
94
|
-
* @param fileExists - Effectful on-disk existence check (never fails; a
|
|
95
|
-
* filesystem error is treated as "does not exist" so filename selection
|
|
96
|
-
* degrades gracefully rather than blocking the plan).
|
|
97
|
-
* @param changesetDir - Directory checked for on-disk collisions.
|
|
98
|
-
* @param chosen - Basenames (without extension) already picked within this plan;
|
|
99
|
-
* the picked candidate is added to this set before returning.
|
|
100
|
-
* @internal
|
|
101
|
-
*/
|
|
102
|
-
function randomFilename(fileExists, changesetDir, chosen) {
|
|
103
|
-
return Effect.gen(function* () {
|
|
104
|
-
for (let i = 0; i < 20; i++) {
|
|
105
|
-
const candidate = pickRandomTriplet();
|
|
106
|
-
if (!chosen.has(candidate) && !(yield* fileExists(join(changesetDir, `${candidate}.md`)))) {
|
|
107
|
-
chosen.add(candidate);
|
|
108
|
-
return candidate;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
let attempt = 0;
|
|
112
|
-
let fallback = `${pickRandomTriplet()}-${Date.now()}`;
|
|
113
|
-
while (chosen.has(fallback) || (yield* fileExists(join(changesetDir, `${fallback}.md`)))) fallback = `${pickRandomTriplet()}-${Date.now()}-${++attempt}`;
|
|
114
|
-
chosen.add(fallback);
|
|
115
|
-
return fallback;
|
|
116
|
-
});
|
|
117
|
-
}
|
|
118
|
-
/**
|
|
119
|
-
* Strict detection of "pure dependency changesets" per the documented
|
|
120
|
-
* rules: single-package frontmatter, single `## Dependencies` heading,
|
|
121
|
-
* no other body content beyond that section.
|
|
122
|
-
*
|
|
123
|
-
* @param content - Raw `.changeset/*.md` file contents.
|
|
124
|
-
* @returns `{ isPure, package }` — `isPure` is `true` only for a
|
|
125
|
-
* single-package, Dependencies-only changeset; `package` is the sole
|
|
126
|
-
* frontmatter package name (or `null` when not pure).
|
|
127
|
-
*
|
|
128
|
-
* @public
|
|
129
|
-
*/
|
|
130
|
-
function isPureDependencyChangeset(content) {
|
|
131
|
-
const fmMatch = content.match(/^---\n([\s\S]*?)\n---\n?([\s\S]*)$/);
|
|
132
|
-
if (!fmMatch) return {
|
|
133
|
-
isPure: false,
|
|
134
|
-
package: null
|
|
135
|
-
};
|
|
136
|
-
const frontmatter = fmMatch[1];
|
|
137
|
-
const body = (fmMatch[2] ?? "").trim();
|
|
138
|
-
const fmLines = frontmatter.split(/\r?\n/).filter((l) => l.trim().length > 0 && !/^\s*#/.test(l));
|
|
139
|
-
if (fmLines.length !== 1) return {
|
|
140
|
-
isPure: false,
|
|
141
|
-
package: null
|
|
142
|
-
};
|
|
143
|
-
const pkgMatch = fmLines[0].match(/^\s*["']?([^"':\s]+)["']?\s*:\s*([a-z]+)\s*$/);
|
|
144
|
-
if (!pkgMatch) return {
|
|
145
|
-
isPure: false,
|
|
146
|
-
package: null
|
|
147
|
-
};
|
|
148
|
-
const pkg = pkgMatch[1];
|
|
149
|
-
const bodyTrimmed = body.replace(/^\s+/, "");
|
|
150
|
-
if (!/^## Dependencies\b/.test(bodyTrimmed)) return {
|
|
151
|
-
isPure: false,
|
|
152
|
-
package: null
|
|
153
|
-
};
|
|
154
|
-
if ((bodyTrimmed.match(/^## /gm) ?? []).length !== 1) return {
|
|
155
|
-
isPure: false,
|
|
156
|
-
package: null
|
|
157
|
-
};
|
|
158
|
-
if (/^# /m.test(bodyTrimmed)) return {
|
|
159
|
-
isPure: false,
|
|
160
|
-
package: null
|
|
161
|
-
};
|
|
162
|
-
return {
|
|
163
|
-
isPure: true,
|
|
164
|
-
package: pkg
|
|
165
|
-
};
|
|
166
|
-
}
|
|
167
|
-
/**
|
|
168
|
-
* List `.changeset/*.md` files (excluding `README.md`) in `changesetDir`.
|
|
169
|
-
* A missing directory is today's behavior for "no changesets yet" and
|
|
170
|
-
* resolves to an empty list; any OTHER failure (e.g. a directory that
|
|
171
|
-
* exists but cannot be read) is a loud {@link ChangesetIOError} — an
|
|
172
|
-
* unreadable `.changeset` dir must not silently masquerade as "no
|
|
173
|
-
* changesets".
|
|
174
|
-
*/
|
|
175
|
-
const listChangesetFiles = (fs, changesetDir) => fs.readDirectory(changesetDir).pipe(Effect.map((names) => names.filter((f) => f.endsWith(".md") && f !== "README.md").map((f) => join(changesetDir, f))), Effect.catchAll((e) => e._tag === "SystemError" && e.reason === "NotFound" ? Effect.succeed([]) : Effect.fail(new ChangesetIOError({
|
|
176
|
-
path: changesetDir,
|
|
177
|
-
operation: "list",
|
|
178
|
-
reason: String(e)
|
|
179
|
-
}))));
|
|
180
|
-
/**
|
|
181
|
-
* Pure-dependency changesets found in `changesetDir`. An individual file
|
|
182
|
-
* that cannot be read (e.g. removed mid-scan, permission race) is skipped —
|
|
183
|
-
* today's semantics — while a failure to list the directory itself
|
|
184
|
-
* propagates as a loud {@link ChangesetIOError}.
|
|
185
|
-
*/
|
|
186
|
-
const findPureDependencyChangesets = (fs, changesetDir) => Effect.gen(function* () {
|
|
187
|
-
const files = yield* listChangesetFiles(fs, changesetDir);
|
|
188
|
-
const result = [];
|
|
189
|
-
for (const file of files) {
|
|
190
|
-
const content = yield* fs.readFileString(file).pipe(Effect.option);
|
|
191
|
-
if (Option.isNone(content)) continue;
|
|
192
|
-
const detection = isPureDependencyChangeset(content.value);
|
|
193
|
-
if (detection.isPure && detection.package) result.push({
|
|
194
|
-
file,
|
|
195
|
-
package: detection.package
|
|
196
|
-
});
|
|
197
|
-
}
|
|
198
|
-
return result;
|
|
199
|
-
});
|
|
200
|
-
/**
|
|
201
|
-
* Mixed dependency changesets (have a `## Dependencies` heading but fail
|
|
202
|
-
* the strict pure-changeset test) found in `changesetDir`. Same
|
|
203
|
-
* skip-unreadable-file / loud-list-failure semantics as
|
|
204
|
-
* {@link findPureDependencyChangesets}.
|
|
205
|
-
*/
|
|
206
|
-
const findMixedDependencyChangesets = (fs, changesetDir) => Effect.gen(function* () {
|
|
207
|
-
const files = yield* listChangesetFiles(fs, changesetDir);
|
|
208
|
-
const result = [];
|
|
209
|
-
for (const file of files) {
|
|
210
|
-
const content = yield* fs.readFileString(file).pipe(Effect.option);
|
|
211
|
-
if (Option.isNone(content)) continue;
|
|
212
|
-
if (/^## Dependencies\b/m.test(content.value) && !isPureDependencyChangeset(content.value).isPure) result.push(file);
|
|
213
|
-
}
|
|
214
|
-
return result;
|
|
215
|
-
});
|
|
216
|
-
/**
|
|
217
|
-
* Render a single-package, patch-bump changeset for a diff whose rows are
|
|
218
|
-
* already resolved (per-side, inside {@link computeWorkspaceDependencyDiffs})
|
|
219
|
-
* and devDep-filtered.
|
|
220
|
-
*/
|
|
221
|
-
function renderChangesetContent(diff) {
|
|
222
|
-
return `${`---\n"${diff.package}": patch\n---`}\n\n## Dependencies\n\n${serializeDependencyTableToMarkdown([...diff.rows])}\n`;
|
|
223
|
-
}
|
|
224
|
-
/**
|
|
225
|
-
* @internal
|
|
226
|
-
*/
|
|
227
|
-
const DepsRegenBase = Context.Tag("Changesets/DepsRegen")();
|
|
228
|
-
/**
|
|
229
|
-
* Effect service tag for {@link DepsRegenShape}.
|
|
230
|
-
*
|
|
231
|
-
* @example
|
|
232
|
-
* ```typescript
|
|
233
|
-
* import { Effect } from "effect";
|
|
234
|
-
* import { Changesets } from "@savvy-web/silk-effects";
|
|
235
|
-
*
|
|
236
|
-
* const program = Effect.gen(function* () {
|
|
237
|
-
* const svc = yield* Changesets.DepsRegen;
|
|
238
|
-
* const plan = yield* svc.plan({ cwd: process.cwd() });
|
|
239
|
-
* return yield* svc.execute(plan);
|
|
240
|
-
* });
|
|
241
|
-
* ```
|
|
242
|
-
*
|
|
243
|
-
* @public
|
|
244
|
-
*/
|
|
245
|
-
var DepsRegen = class extends DepsRegenBase {};
|
|
246
|
-
/**
|
|
247
|
-
* Build a {@link DepsRegenShape} that closes over already-resolved service
|
|
248
|
-
* implementations, keeping the public `plan`/`execute` signatures
|
|
249
|
-
* requirement-free (`R = never`).
|
|
250
|
-
*/
|
|
251
|
-
function makeShape(pit, inspector, discovery, detector, config, fs) {
|
|
252
|
-
const provideDetector = Layer.succeed(PublishabilityDetector, detector);
|
|
253
|
-
const fileExists = (p) => fs.exists(p).pipe(Effect.orElseSucceed(() => false));
|
|
254
|
-
const plan = (options) => Effect.gen(function* () {
|
|
255
|
-
const resolvedCwd = resolve(options.cwd);
|
|
256
|
-
const changesetDir = join(resolvedCwd, ".changeset");
|
|
257
|
-
let fromRef = options.from;
|
|
258
|
-
if (!fromRef) {
|
|
259
|
-
let baseBranch = options.base;
|
|
260
|
-
if (!baseBranch) baseBranch = (yield* inspector.inspect(resolvedCwd).pipe(Effect.catchTag("ConfigurationError", () => Effect.succeed({ baseBranch: "main" })))).baseBranch;
|
|
261
|
-
fromRef = yield* gitMergeBase(resolvedCwd, baseBranch);
|
|
262
|
-
}
|
|
263
|
-
const rawDiffs = computeWorkspaceDependencyDiffs(yield* pit.at(fromRef, { cwd: resolvedCwd }), options.to ? yield* pit.at(options.to, { cwd: resolvedCwd }) : yield* pit.worktree({ cwd: resolvedCwd }));
|
|
264
|
-
const targetPkg = options.package;
|
|
265
|
-
const livePackages = yield* discovery.listPackages(resolvedCwd);
|
|
266
|
-
const publishable = yield* listPublishablePackageNames(livePackages, resolvedCwd).pipe(Effect.provide(provideDetector));
|
|
267
|
-
const versionPrivate = yield* config.versionPrivate(resolvedCwd);
|
|
268
|
-
const inScope = /* @__PURE__ */ new Set();
|
|
269
|
-
for (const pkg of livePackages) {
|
|
270
|
-
if (yield* config.isIgnored(pkg.name, resolvedCwd)) continue;
|
|
271
|
-
if (publishable.has(pkg.name) || versionPrivate) inScope.add(pkg.name);
|
|
272
|
-
}
|
|
273
|
-
const targetIgnored = targetPkg ? yield* config.isIgnored(targetPkg, resolvedCwd) : false;
|
|
274
|
-
const keepDevDeps = options.includeDevDeps === true;
|
|
275
|
-
const scoped = targetPkg ? targetIgnored ? [] : rawDiffs.filter((d) => d.package === targetPkg) : rawDiffs.filter((d) => inScope.has(d.package));
|
|
276
|
-
const resolved = [];
|
|
277
|
-
for (const diff of scoped) {
|
|
278
|
-
const rows = keepDevDeps ? [...diff.rows] : diff.rows.filter((r) => r.type !== "devDependency");
|
|
279
|
-
if (rows.length > 0) resolved.push({
|
|
280
|
-
...diff,
|
|
281
|
-
rows: sortDependencyRows(rows)
|
|
282
|
-
});
|
|
283
|
-
}
|
|
284
|
-
const existingPure = yield* findPureDependencyChangesets(fs, changesetDir);
|
|
285
|
-
const skippedMixed = yield* findMixedDependencyChangesets(fs, changesetDir);
|
|
286
|
-
const toDelete = targetPkg ? targetIgnored ? [] : existingPure.filter((p) => p.package === targetPkg) : existingPure.filter((p) => inScope.has(p.package));
|
|
287
|
-
const chosenFilenames = /* @__PURE__ */ new Set();
|
|
288
|
-
const toWrite = [];
|
|
289
|
-
for (const diff of resolved) {
|
|
290
|
-
const filename = yield* randomFilename(fileExists, changesetDir, chosenFilenames);
|
|
291
|
-
toWrite.push({
|
|
292
|
-
file: join(changesetDir, `${filename}.md`),
|
|
293
|
-
package: diff.package,
|
|
294
|
-
diff
|
|
295
|
-
});
|
|
296
|
-
}
|
|
297
|
-
return {
|
|
298
|
-
toDelete,
|
|
299
|
-
toWrite,
|
|
300
|
-
skippedMixed
|
|
301
|
-
};
|
|
302
|
-
});
|
|
303
|
-
const execute = (plan) => Effect.gen(function* () {
|
|
304
|
-
const deleted = [];
|
|
305
|
-
const written = [];
|
|
306
|
-
for (const entry of plan.toWrite) {
|
|
307
|
-
yield* fs.writeFileString(entry.file, renderChangesetContent(entry.diff)).pipe(Effect.mapError((e) => new ChangesetIOError({
|
|
308
|
-
path: entry.file,
|
|
309
|
-
operation: "write",
|
|
310
|
-
reason: String(e)
|
|
311
|
-
})));
|
|
312
|
-
written.push(entry.file);
|
|
313
|
-
}
|
|
314
|
-
for (const entry of plan.toDelete) if (yield* Effect.isSuccess(fs.remove(entry.file))) deleted.push(entry.file);
|
|
315
|
-
return {
|
|
316
|
-
deleted,
|
|
317
|
-
written,
|
|
318
|
-
skippedMixed: plan.skippedMixed
|
|
319
|
-
};
|
|
320
|
-
});
|
|
321
|
-
return {
|
|
322
|
-
plan,
|
|
323
|
-
execute
|
|
324
|
-
};
|
|
325
|
-
}
|
|
326
|
-
/**
|
|
327
|
-
* Live layer for {@link DepsRegen}.
|
|
328
|
-
*
|
|
329
|
-
* Requires `PointInTimeWorkspace`, `WorkspaceDiscovery`,
|
|
330
|
-
* `PublishabilityDetector` (all from `workspaces-effect`),
|
|
331
|
-
* {@link ConfigInspector}, {@link ChangesetConfig}, and
|
|
332
|
-
* `FileSystem.FileSystem` (resolved once at construction and closed over by
|
|
333
|
-
* the shape, keeping `plan`/`execute` themselves requirement-free).
|
|
334
|
-
*
|
|
335
|
-
* @public
|
|
336
|
-
*/
|
|
337
|
-
const DepsRegenLive = Layer.effect(DepsRegen, Effect.gen(function* () {
|
|
338
|
-
return makeShape(yield* PointInTimeWorkspace, yield* ConfigInspector, yield* WorkspaceDiscovery, yield* PublishabilityDetector, yield* ChangesetConfig, yield* FileSystem.FileSystem);
|
|
339
|
-
}));
|
|
340
|
-
const WorkspaceGraph = Layer.mergeAll(WorkspaceRootLive, WorkspaceDiscoveryLive.pipe(Layer.provide(WorkspaceRootLive)));
|
|
341
|
-
const ConfigGraph = ChangesetConfigLive.pipe(Layer.provide(ChangesetConfigReaderLive));
|
|
342
|
-
/**
|
|
343
|
-
* Batteries-included {@link DepsRegen} layer: silk's opinionated default
|
|
344
|
-
* composition of the full dependency graph. Only the platform services
|
|
345
|
-
* remain — note that {@link PointInTimeWorkspace} reads git history, so
|
|
346
|
-
* this layer genuinely requires `CommandExecutor` in addition to
|
|
347
|
-
* `FileSystem`/`Path`: provide a git-capable platform layer
|
|
348
|
-
* (`NodeContext.layer`), not a bare filesystem-only layer.
|
|
349
|
-
*
|
|
350
|
-
* Gating uses silk's adaptive publishability detector
|
|
351
|
-
* ({@link PublishabilityDetectorAdaptiveLive}), so the default semantics
|
|
352
|
-
* are "versionable minus ignored" — identical to the savvy CLI and MCP
|
|
353
|
-
* runtimes. Consumers who need to swap any dependency (test detectors,
|
|
354
|
-
* alternate config sources) should keep composing {@link DepsRegenLive}
|
|
355
|
-
* directly; this layer is purely additive.
|
|
356
|
-
*
|
|
357
|
-
* @example
|
|
358
|
-
* ```typescript
|
|
359
|
-
* import { NodeContext } from "@effect/platform-node";
|
|
360
|
-
* import { Layer } from "effect";
|
|
361
|
-
* import { Changesets } from "@savvy-web/silk-effects";
|
|
362
|
-
*
|
|
363
|
-
* const depsRegen = Changesets.DepsRegenDefault.pipe(Layer.provide(NodeContext.layer));
|
|
364
|
-
* ```
|
|
365
|
-
*
|
|
366
|
-
* @public
|
|
367
|
-
*/
|
|
368
|
-
const DepsRegenDefault = DepsRegenLive.pipe(Layer.provide(PointInTimeWorkspaceLive.pipe(Layer.provide(WorkspaceGraph))), Layer.provide(ConfigInspectorLive.pipe(Layer.provide(Layer.mergeAll(ChangesetConfigReaderLive, WorkspaceGraph)))), Layer.provide(PublishabilityDetectorAdaptiveLive.pipe(Layer.provide(ConfigGraph))), Layer.provide(ConfigGraph), Layer.provide(WorkspaceGraph));
|
|
369
|
-
|
|
370
|
-
//#endregion
|
|
371
|
-
export { DepsRegen, DepsRegenBase, DepsRegenDefault, DepsRegenLive, isPureDependencyChangeset };
|
|
@@ -1,160 +0,0 @@
|
|
|
1
|
-
const require_errors = require('../errors.cjs');
|
|
2
|
-
const require_github_info = require('../vendor/github-info.cjs');
|
|
3
|
-
let effect = require("effect");
|
|
4
|
-
|
|
5
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/services/github.js
|
|
6
|
-
/**
|
|
7
|
-
* Base class for GitHubService.
|
|
8
|
-
*
|
|
9
|
-
* @privateRemarks
|
|
10
|
-
* This export is required for api-extractor documentation generation.
|
|
11
|
-
* Effect's Context.Tag creates an anonymous base class that must be
|
|
12
|
-
* explicitly exported to avoid "forgotten export" warnings. Do not delete.
|
|
13
|
-
*
|
|
14
|
-
* @internal
|
|
15
|
-
*/
|
|
16
|
-
const GitHubServiceBase = effect.Context.Tag("GitHubService")();
|
|
17
|
-
/**
|
|
18
|
-
* Effect service tag for GitHub API operations.
|
|
19
|
-
*
|
|
20
|
-
* Provides dependency-injected access to GitHub commit metadata lookups.
|
|
21
|
-
* Use `yield* GitHubService` inside an `Effect.gen` block to obtain the
|
|
22
|
-
* service instance.
|
|
23
|
-
*
|
|
24
|
-
* @remarks
|
|
25
|
-
* This tag follows the standard Effect `Context.Tag` pattern. Two layers
|
|
26
|
-
* are provided out of the box:
|
|
27
|
-
*
|
|
28
|
-
* - {@link GitHubLive} — production layer backed by the GitHub REST API
|
|
29
|
-
* - {@link makeGitHubTest} — factory for deterministic test layers
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* ```typescript
|
|
33
|
-
* import { Effect, Layer } from "effect";
|
|
34
|
-
* import { GitHubService, GitHubLive } from "\@savvy-web/changesets";
|
|
35
|
-
*
|
|
36
|
-
* const program = Effect.gen(function* () {
|
|
37
|
-
* const github = yield* GitHubService;
|
|
38
|
-
* const info = yield* github.getInfo({
|
|
39
|
-
* commit: "abc1234567890",
|
|
40
|
-
* repo: "savvy-web/changesets",
|
|
41
|
-
* });
|
|
42
|
-
* console.log(info.user, info.pull, info.links);
|
|
43
|
-
* });
|
|
44
|
-
*
|
|
45
|
-
* // Provide the live layer and run
|
|
46
|
-
* Effect.runPromise(program.pipe(Effect.provide(GitHubLive)));
|
|
47
|
-
* ```
|
|
48
|
-
*
|
|
49
|
-
* @example Creating a test layer with canned responses
|
|
50
|
-
* ```typescript
|
|
51
|
-
* import { Effect } from "effect";
|
|
52
|
-
* import type { GitHubCommitInfo } from "\@savvy-web/changesets";
|
|
53
|
-
* import { GitHubService, makeGitHubTest } from "\@savvy-web/changesets";
|
|
54
|
-
*
|
|
55
|
-
* const testResponses = new Map<string, GitHubCommitInfo>([
|
|
56
|
-
* ["abc1234", { user: "octocat", pull: 42, links: { pull: "#42", user: "\@octocat" } }],
|
|
57
|
-
* ]);
|
|
58
|
-
*
|
|
59
|
-
* const TestLayer = makeGitHubTest(testResponses);
|
|
60
|
-
*
|
|
61
|
-
* const program = Effect.gen(function* () {
|
|
62
|
-
* const github = yield* GitHubService;
|
|
63
|
-
* return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
|
|
64
|
-
* });
|
|
65
|
-
*
|
|
66
|
-
* Effect.runPromise(program.pipe(Effect.provide(TestLayer)));
|
|
67
|
-
* ```
|
|
68
|
-
*
|
|
69
|
-
* @see {@link GitHubServiceShape} for the service interface
|
|
70
|
-
* @see {@link GitHubLive} for the production layer
|
|
71
|
-
* @see {@link makeGitHubTest} for creating test layers
|
|
72
|
-
* @see {@link GitHubServiceBase} for the api-extractor base class
|
|
73
|
-
*
|
|
74
|
-
* @public
|
|
75
|
-
*/
|
|
76
|
-
var GitHubService = class extends GitHubServiceBase {};
|
|
77
|
-
/**
|
|
78
|
-
* Production layer for {@link GitHubService}.
|
|
79
|
-
*
|
|
80
|
-
* Delegates to `\@changesets/get-github-info` to fetch commit metadata
|
|
81
|
-
* from the GitHub REST API. Requires a `GITHUB_TOKEN` environment variable
|
|
82
|
-
* to be set for authenticated requests.
|
|
83
|
-
*
|
|
84
|
-
* @remarks
|
|
85
|
-
* This layer is used by the `\@savvy-web/changesets/changelog` entry point
|
|
86
|
-
* to resolve commit hashes into PR numbers and author attribution. It is
|
|
87
|
-
* composed with {@link MarkdownLive} in the changelog formatter's
|
|
88
|
-
* `MainLayer`.
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```typescript
|
|
92
|
-
* import { Effect } from "effect";
|
|
93
|
-
* import { GitHubService, GitHubLive } from "\@savvy-web/changesets";
|
|
94
|
-
*
|
|
95
|
-
* const program = Effect.gen(function* () {
|
|
96
|
-
* const github = yield* GitHubService;
|
|
97
|
-
* return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
|
|
98
|
-
* });
|
|
99
|
-
*
|
|
100
|
-
* Effect.runPromise(program.pipe(Effect.provide(GitHubLive)));
|
|
101
|
-
* ```
|
|
102
|
-
*
|
|
103
|
-
* @public
|
|
104
|
-
*/
|
|
105
|
-
const GitHubLive = effect.Layer.succeed(GitHubService, { getInfo: require_github_info.getGitHubInfo });
|
|
106
|
-
/**
|
|
107
|
-
* Create a test layer for {@link GitHubService} with pre-configured responses.
|
|
108
|
-
*
|
|
109
|
-
* Returns a `Layer` that resolves commit hashes from the provided `Map`.
|
|
110
|
-
* Lookups for commits not present in the map fail with a
|
|
111
|
-
* {@link GitHubApiError}.
|
|
112
|
-
*
|
|
113
|
-
* @remarks
|
|
114
|
-
* This helper is the recommended way to test code that depends on
|
|
115
|
-
* `GitHubService` without making real API calls. Provide the layer
|
|
116
|
-
* via `Effect.provide` in your test setup.
|
|
117
|
-
*
|
|
118
|
-
* @param responses - A `Map` of full commit hash to {@link GitHubCommitInfo} objects
|
|
119
|
-
* @returns A `Layer` providing the {@link GitHubService} with deterministic responses
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* ```typescript
|
|
123
|
-
* import { Effect } from "effect";
|
|
124
|
-
* import type { GitHubCommitInfo } from "\@savvy-web/changesets";
|
|
125
|
-
* import { GitHubService, makeGitHubTest } from "\@savvy-web/changesets";
|
|
126
|
-
*
|
|
127
|
-
* const responses = new Map<string, GitHubCommitInfo>([
|
|
128
|
-
* ["abc1234", { user: "octocat", pull: 42, links: { pull: "#42", user: "\@octocat" } }],
|
|
129
|
-
* ]);
|
|
130
|
-
*
|
|
131
|
-
* const TestGitHub = makeGitHubTest(responses);
|
|
132
|
-
*
|
|
133
|
-
* const program = Effect.gen(function* () {
|
|
134
|
-
* const github = yield* GitHubService;
|
|
135
|
-
* return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
|
|
136
|
-
* });
|
|
137
|
-
*
|
|
138
|
-
* // In a Vitest test:
|
|
139
|
-
* const result = await Effect.runPromise(program.pipe(Effect.provide(TestGitHub)));
|
|
140
|
-
* // result.user === "octocat"
|
|
141
|
-
* ```
|
|
142
|
-
*
|
|
143
|
-
* @public
|
|
144
|
-
*/
|
|
145
|
-
function makeGitHubTest(responses) {
|
|
146
|
-
return effect.Layer.succeed(GitHubService, { getInfo: (params) => {
|
|
147
|
-
const info = responses.get(params.commit);
|
|
148
|
-
if (info) return effect.Effect.succeed(info);
|
|
149
|
-
return effect.Effect.fail(new require_errors.GitHubApiError({
|
|
150
|
-
operation: "getInfo",
|
|
151
|
-
reason: `No mock response for commit ${params.commit}`
|
|
152
|
-
}));
|
|
153
|
-
} });
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
//#endregion
|
|
157
|
-
exports.GitHubLive = GitHubLive;
|
|
158
|
-
exports.GitHubService = GitHubService;
|
|
159
|
-
exports.GitHubServiceBase = GitHubServiceBase;
|
|
160
|
-
exports.makeGitHubTest = makeGitHubTest;
|
|
@@ -1,157 +0,0 @@
|
|
|
1
|
-
import { GitHubApiError } from "../errors.js";
|
|
2
|
-
import { getGitHubInfo } from "../vendor/github-info.js";
|
|
3
|
-
import { Context, Effect, Layer } from "effect";
|
|
4
|
-
|
|
5
|
-
//#region ../silk-effects/dist/dev/pkg/changesets/services/github.js
|
|
6
|
-
/**
|
|
7
|
-
* Base class for GitHubService.
|
|
8
|
-
*
|
|
9
|
-
* @privateRemarks
|
|
10
|
-
* This export is required for api-extractor documentation generation.
|
|
11
|
-
* Effect's Context.Tag creates an anonymous base class that must be
|
|
12
|
-
* explicitly exported to avoid "forgotten export" warnings. Do not delete.
|
|
13
|
-
*
|
|
14
|
-
* @internal
|
|
15
|
-
*/
|
|
16
|
-
const GitHubServiceBase = Context.Tag("GitHubService")();
|
|
17
|
-
/**
|
|
18
|
-
* Effect service tag for GitHub API operations.
|
|
19
|
-
*
|
|
20
|
-
* Provides dependency-injected access to GitHub commit metadata lookups.
|
|
21
|
-
* Use `yield* GitHubService` inside an `Effect.gen` block to obtain the
|
|
22
|
-
* service instance.
|
|
23
|
-
*
|
|
24
|
-
* @remarks
|
|
25
|
-
* This tag follows the standard Effect `Context.Tag` pattern. Two layers
|
|
26
|
-
* are provided out of the box:
|
|
27
|
-
*
|
|
28
|
-
* - {@link GitHubLive} — production layer backed by the GitHub REST API
|
|
29
|
-
* - {@link makeGitHubTest} — factory for deterministic test layers
|
|
30
|
-
*
|
|
31
|
-
* @example
|
|
32
|
-
* ```typescript
|
|
33
|
-
* import { Effect, Layer } from "effect";
|
|
34
|
-
* import { GitHubService, GitHubLive } from "\@savvy-web/changesets";
|
|
35
|
-
*
|
|
36
|
-
* const program = Effect.gen(function* () {
|
|
37
|
-
* const github = yield* GitHubService;
|
|
38
|
-
* const info = yield* github.getInfo({
|
|
39
|
-
* commit: "abc1234567890",
|
|
40
|
-
* repo: "savvy-web/changesets",
|
|
41
|
-
* });
|
|
42
|
-
* console.log(info.user, info.pull, info.links);
|
|
43
|
-
* });
|
|
44
|
-
*
|
|
45
|
-
* // Provide the live layer and run
|
|
46
|
-
* Effect.runPromise(program.pipe(Effect.provide(GitHubLive)));
|
|
47
|
-
* ```
|
|
48
|
-
*
|
|
49
|
-
* @example Creating a test layer with canned responses
|
|
50
|
-
* ```typescript
|
|
51
|
-
* import { Effect } from "effect";
|
|
52
|
-
* import type { GitHubCommitInfo } from "\@savvy-web/changesets";
|
|
53
|
-
* import { GitHubService, makeGitHubTest } from "\@savvy-web/changesets";
|
|
54
|
-
*
|
|
55
|
-
* const testResponses = new Map<string, GitHubCommitInfo>([
|
|
56
|
-
* ["abc1234", { user: "octocat", pull: 42, links: { pull: "#42", user: "\@octocat" } }],
|
|
57
|
-
* ]);
|
|
58
|
-
*
|
|
59
|
-
* const TestLayer = makeGitHubTest(testResponses);
|
|
60
|
-
*
|
|
61
|
-
* const program = Effect.gen(function* () {
|
|
62
|
-
* const github = yield* GitHubService;
|
|
63
|
-
* return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
|
|
64
|
-
* });
|
|
65
|
-
*
|
|
66
|
-
* Effect.runPromise(program.pipe(Effect.provide(TestLayer)));
|
|
67
|
-
* ```
|
|
68
|
-
*
|
|
69
|
-
* @see {@link GitHubServiceShape} for the service interface
|
|
70
|
-
* @see {@link GitHubLive} for the production layer
|
|
71
|
-
* @see {@link makeGitHubTest} for creating test layers
|
|
72
|
-
* @see {@link GitHubServiceBase} for the api-extractor base class
|
|
73
|
-
*
|
|
74
|
-
* @public
|
|
75
|
-
*/
|
|
76
|
-
var GitHubService = class extends GitHubServiceBase {};
|
|
77
|
-
/**
|
|
78
|
-
* Production layer for {@link GitHubService}.
|
|
79
|
-
*
|
|
80
|
-
* Delegates to `\@changesets/get-github-info` to fetch commit metadata
|
|
81
|
-
* from the GitHub REST API. Requires a `GITHUB_TOKEN` environment variable
|
|
82
|
-
* to be set for authenticated requests.
|
|
83
|
-
*
|
|
84
|
-
* @remarks
|
|
85
|
-
* This layer is used by the `\@savvy-web/changesets/changelog` entry point
|
|
86
|
-
* to resolve commit hashes into PR numbers and author attribution. It is
|
|
87
|
-
* composed with {@link MarkdownLive} in the changelog formatter's
|
|
88
|
-
* `MainLayer`.
|
|
89
|
-
*
|
|
90
|
-
* @example
|
|
91
|
-
* ```typescript
|
|
92
|
-
* import { Effect } from "effect";
|
|
93
|
-
* import { GitHubService, GitHubLive } from "\@savvy-web/changesets";
|
|
94
|
-
*
|
|
95
|
-
* const program = Effect.gen(function* () {
|
|
96
|
-
* const github = yield* GitHubService;
|
|
97
|
-
* return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
|
|
98
|
-
* });
|
|
99
|
-
*
|
|
100
|
-
* Effect.runPromise(program.pipe(Effect.provide(GitHubLive)));
|
|
101
|
-
* ```
|
|
102
|
-
*
|
|
103
|
-
* @public
|
|
104
|
-
*/
|
|
105
|
-
const GitHubLive = Layer.succeed(GitHubService, { getInfo: getGitHubInfo });
|
|
106
|
-
/**
|
|
107
|
-
* Create a test layer for {@link GitHubService} with pre-configured responses.
|
|
108
|
-
*
|
|
109
|
-
* Returns a `Layer` that resolves commit hashes from the provided `Map`.
|
|
110
|
-
* Lookups for commits not present in the map fail with a
|
|
111
|
-
* {@link GitHubApiError}.
|
|
112
|
-
*
|
|
113
|
-
* @remarks
|
|
114
|
-
* This helper is the recommended way to test code that depends on
|
|
115
|
-
* `GitHubService` without making real API calls. Provide the layer
|
|
116
|
-
* via `Effect.provide` in your test setup.
|
|
117
|
-
*
|
|
118
|
-
* @param responses - A `Map` of full commit hash to {@link GitHubCommitInfo} objects
|
|
119
|
-
* @returns A `Layer` providing the {@link GitHubService} with deterministic responses
|
|
120
|
-
*
|
|
121
|
-
* @example
|
|
122
|
-
* ```typescript
|
|
123
|
-
* import { Effect } from "effect";
|
|
124
|
-
* import type { GitHubCommitInfo } from "\@savvy-web/changesets";
|
|
125
|
-
* import { GitHubService, makeGitHubTest } from "\@savvy-web/changesets";
|
|
126
|
-
*
|
|
127
|
-
* const responses = new Map<string, GitHubCommitInfo>([
|
|
128
|
-
* ["abc1234", { user: "octocat", pull: 42, links: { pull: "#42", user: "\@octocat" } }],
|
|
129
|
-
* ]);
|
|
130
|
-
*
|
|
131
|
-
* const TestGitHub = makeGitHubTest(responses);
|
|
132
|
-
*
|
|
133
|
-
* const program = Effect.gen(function* () {
|
|
134
|
-
* const github = yield* GitHubService;
|
|
135
|
-
* return yield* github.getInfo({ commit: "abc1234", repo: "owner/repo" });
|
|
136
|
-
* });
|
|
137
|
-
*
|
|
138
|
-
* // In a Vitest test:
|
|
139
|
-
* const result = await Effect.runPromise(program.pipe(Effect.provide(TestGitHub)));
|
|
140
|
-
* // result.user === "octocat"
|
|
141
|
-
* ```
|
|
142
|
-
*
|
|
143
|
-
* @public
|
|
144
|
-
*/
|
|
145
|
-
function makeGitHubTest(responses) {
|
|
146
|
-
return Layer.succeed(GitHubService, { getInfo: (params) => {
|
|
147
|
-
const info = responses.get(params.commit);
|
|
148
|
-
if (info) return Effect.succeed(info);
|
|
149
|
-
return Effect.fail(new GitHubApiError({
|
|
150
|
-
operation: "getInfo",
|
|
151
|
-
reason: `No mock response for commit ${params.commit}`
|
|
152
|
-
}));
|
|
153
|
-
} });
|
|
154
|
-
}
|
|
155
|
-
|
|
156
|
-
//#endregion
|
|
157
|
-
export { GitHubLive, GitHubService, GitHubServiceBase, makeGitHubTest };
|