@savvy-web/silk-effects 1.3.1 → 1.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/changesets/categories/types.js +0 -1
- package/changesets/changelog/index.js +0 -2
- package/changesets/constants.js +0 -1
- package/changesets/errors.js +25 -2
- package/changesets/index.js +17 -2
- package/changesets/markdownlint/rules/dependency-table-format.js +2 -2
- package/changesets/remark/rules/uncategorized-content.js +1 -1
- package/changesets/schemas/changeset.js +0 -1
- package/changesets/schemas/dependency-table.js +0 -1
- package/changesets/schemas/git.js +0 -1
- package/changesets/schemas/github.js +0 -1
- package/changesets/schemas/options.js +0 -1
- package/changesets/schemas/package-scope.js +0 -1
- package/changesets/schemas/primitives.js +0 -1
- package/changesets/schemas/release-plan.js +56 -0
- package/changesets/schemas/version-files.js +0 -1
- package/changesets/services/branch-analyzer.js +0 -1
- package/changesets/services/config-inspector.js +1 -2
- package/changesets/services/release-planner.js +251 -0
- package/changesets/services/workspace-snapshot.js +0 -1
- package/changesets/utils/publishability.js +2 -3
- package/changesets/utils/worktree-snapshot.js +1 -1
- package/commitlint/config/factory.js +1 -1
- package/commitlint/hook/diagnostics/package-manager.js +1 -1
- package/commitlint/index.js +0 -1
- package/errors/BiomeSyncError.js +2 -1
- package/errors/ChangesetConfigError.js +2 -1
- package/errors/ConfigNotFoundError.js +2 -1
- package/errors/SectionParseError.js +1 -0
- package/errors/SectionValidationError.js +1 -0
- package/errors/SectionWriteError.js +1 -0
- package/errors/TagFormatError.js +2 -1
- package/errors/ToolNotFoundError.js +1 -0
- package/errors/ToolResolutionError.js +1 -0
- package/errors/ToolVersionMismatchError.js +1 -0
- package/errors/VersioningDetectionError.js +2 -1
- package/errors/WorkspaceAnalysisError.js +2 -1
- package/index.d.ts +420 -85
- package/lint/handlers/PnpmWorkspace.js +1 -1
- package/package.json +5 -1
- package/schemas/CommentStyle.js +1 -0
- package/schemas/ResolvedTool.js +2 -1
- package/schemas/SavvySections.js +6 -1
- package/schemas/SectionBlock.js +3 -2
- package/schemas/SectionDefinition.js +4 -2
- package/schemas/SectionResults.js +12 -3
- package/schemas/TagStrategySchemas.js +2 -1
- package/schemas/ToolDefinition.js +2 -1
- package/schemas/ToolResults.js +18 -4
- package/schemas/VersioningSchemas.js +7 -3
- package/schemas/WorkspaceAnalysisSchemas.js +3 -0
- package/services/BiomeSchemaSync.js +4 -0
- package/services/ChangesetConfig.js +2 -0
- package/services/ChangesetConfigReader.js +4 -2
- package/services/ConfigDiscovery.js +2 -0
- package/services/ManagedSection.js +2 -0
- package/services/SilkPublishability.js +16 -12
- package/services/SilkWorkspaceAnalyzer.js +4 -2
- package/services/TagStrategy.js +3 -1
- package/services/ToolDiscovery.js +2 -0
- package/services/VersioningStrategy.js +2 -0
- package/utils/ToolCommand.js +2 -1
|
@@ -58,7 +58,7 @@ var PnpmWorkspace = class PnpmWorkspace {
|
|
|
58
58
|
/**
|
|
59
59
|
* Keys whose array values should be sorted alphabetically.
|
|
60
60
|
*/
|
|
61
|
-
static SORTABLE_ARRAY_KEYS = new Set([
|
|
61
|
+
static SORTABLE_ARRAY_KEYS = /* @__PURE__ */ new Set([
|
|
62
62
|
"packages",
|
|
63
63
|
"onlyBuiltDependencies",
|
|
64
64
|
"publicHoistPattern"
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@savvy-web/silk-effects",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.5.0",
|
|
4
4
|
"private": false,
|
|
5
5
|
"description": "Shared Effect library for Silk Suite conventions",
|
|
6
6
|
"homepage": "https://github.com/savvy-web/systems/tree/main/packages/silk-effects",
|
|
@@ -28,7 +28,11 @@
|
|
|
28
28
|
"./package.json": "./package.json"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
+
"@changesets/apply-release-plan": "^7.1.1",
|
|
32
|
+
"@changesets/config": "^3.1.4",
|
|
31
33
|
"@changesets/get-github-info": "^0.8.0",
|
|
34
|
+
"@changesets/get-release-plan": "^4.0.16",
|
|
35
|
+
"@manypkg/get-packages": "^1.1.3",
|
|
32
36
|
"jsonc-effect": "^0.2.1",
|
|
33
37
|
"mdast-util-heading-range": "^4.0.0",
|
|
34
38
|
"mdast-util-to-string": "^4.0.0",
|
package/schemas/CommentStyle.js
CHANGED
package/schemas/ResolvedTool.js
CHANGED
|
@@ -8,9 +8,10 @@ const PackageManager = Schema.Literal("npm", "pnpm", "yarn", "bun");
|
|
|
8
8
|
/**
|
|
9
9
|
* Result of resolving a {@link ToolDefinition}.
|
|
10
10
|
*
|
|
11
|
-
* Provides
|
|
11
|
+
* Provides `exec` and `dlx` to build commands for the resolved tool.
|
|
12
12
|
*
|
|
13
13
|
* @since 0.2.0
|
|
14
|
+
* @public
|
|
14
15
|
*/
|
|
15
16
|
var ResolvedTool = class ResolvedTool extends Schema.TaggedClass()("ResolvedTool", {
|
|
16
17
|
name: Schema.String,
|
package/schemas/SavvySections.js
CHANGED
|
@@ -12,6 +12,7 @@ import { ShellSectionDefinition } from "./SectionDefinition.js";
|
|
|
12
12
|
* ```
|
|
13
13
|
*
|
|
14
14
|
* @since 0.5.0
|
|
15
|
+
* @public
|
|
15
16
|
*/
|
|
16
17
|
const SavvyBaseSection = ShellSectionDefinition.make({ toolName: "savvy-base" });
|
|
17
18
|
/**
|
|
@@ -20,6 +21,7 @@ const SavvyBaseSection = ShellSectionDefinition.make({ toolName: "savvy-base" })
|
|
|
20
21
|
* `toolName` is `"savvy-hooks"`; pair with {@link savvyHooksHygiene}.
|
|
21
22
|
*
|
|
22
23
|
* @since 0.5.0
|
|
24
|
+
* @public
|
|
23
25
|
*/
|
|
24
26
|
const SavvyHooksSection = ShellSectionDefinition.make({ toolName: "savvy-hooks" });
|
|
25
27
|
/**
|
|
@@ -34,6 +36,7 @@ const SavvyHooksSection = ShellSectionDefinition.make({ toolName: "savvy-hooks"
|
|
|
34
36
|
* @returns The preamble shell, with no surrounding markers or trailing newline.
|
|
35
37
|
*
|
|
36
38
|
* @since 0.5.0
|
|
39
|
+
* @public
|
|
37
40
|
*/
|
|
38
41
|
function savvyBasePreamble() {
|
|
39
42
|
return `ROOT=$(git rev-parse --show-toplevel)
|
|
@@ -71,6 +74,7 @@ pm_exec() {
|
|
|
71
74
|
* @returns The hygiene shell, with no surrounding markers or trailing newline.
|
|
72
75
|
*
|
|
73
76
|
* @since 0.5.0
|
|
77
|
+
* @public
|
|
74
78
|
*/
|
|
75
79
|
function savvyHooksHygiene() {
|
|
76
80
|
return `if ! { [ -n "$CI" ] || [ -n "$GITHUB_ACTIONS" ]; }; then
|
|
@@ -89,7 +93,7 @@ fi`;
|
|
|
89
93
|
*
|
|
90
94
|
* **Precondition:** a {@link SavvyBaseSection} block must precede this section in the same
|
|
91
95
|
* hook file so `in_ci` and `pm_exec` are defined. Consumers guarantee this by passing both
|
|
92
|
-
* to
|
|
96
|
+
* to `ManagedSection.syncMany` in order:
|
|
93
97
|
*
|
|
94
98
|
* @example
|
|
95
99
|
* ```ts
|
|
@@ -104,6 +108,7 @@ fi`;
|
|
|
104
108
|
* @returns A shell {@link SectionBlock} (`commentStyle: "#"`) for `toolName`.
|
|
105
109
|
*
|
|
106
110
|
* @since 0.5.0
|
|
111
|
+
* @public
|
|
107
112
|
*/
|
|
108
113
|
function savvyToolSection(toolName, command) {
|
|
109
114
|
return ShellSectionDefinition.make({ toolName }).block(`in_ci || pm_exec ${command}`);
|
package/schemas/SectionBlock.js
CHANGED
|
@@ -6,10 +6,11 @@ import { Equal, Function, Hash, Schema } from "effect";
|
|
|
6
6
|
/**
|
|
7
7
|
* The content between managed section markers.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
* Use
|
|
9
|
+
* `Equal` compares normalized content only (trimmed, whitespace-collapsed).
|
|
10
|
+
* Use `diff` to compute line-level differences.
|
|
11
11
|
*
|
|
12
12
|
* @since 0.2.0
|
|
13
|
+
* @public
|
|
13
14
|
*/
|
|
14
15
|
var SectionBlock = class SectionBlock extends Schema.TaggedClass()("SectionBlock", {
|
|
15
16
|
toolName: Schema.String,
|
|
@@ -8,11 +8,12 @@ import { Effect, Equal, Function, Hash, Schema } from "effect";
|
|
|
8
8
|
/**
|
|
9
9
|
* Identity envelope for a managed section type.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
11
|
+
* `Equal` compares on `toolName` + `commentStyle`.
|
|
12
12
|
* Use {@link SectionDefinition.block | block()} to create a {@link SectionBlock},
|
|
13
|
-
* or
|
|
13
|
+
* or `generate()` for a typed factory.
|
|
14
14
|
*
|
|
15
15
|
* @since 0.2.0
|
|
16
|
+
* @public
|
|
16
17
|
*/
|
|
17
18
|
var SectionDefinition = class SectionDefinition extends Schema.TaggedClass()("SectionDefinition", {
|
|
18
19
|
toolName: Schema.String,
|
|
@@ -91,6 +92,7 @@ var SectionDefinition = class SectionDefinition extends Schema.TaggedClass()("Se
|
|
|
91
92
|
* `commentStyle` is always `"#"` — only `toolName` is required.
|
|
92
93
|
*
|
|
93
94
|
* @since 0.2.0
|
|
95
|
+
* @public
|
|
94
96
|
*/
|
|
95
97
|
var ShellSectionDefinition = class extends Schema.TaggedClass()("ShellSectionDefinition", { toolName: Schema.String }) {
|
|
96
98
|
get commentStyle() {
|
|
@@ -1,11 +1,20 @@
|
|
|
1
1
|
import { Data } from "effect";
|
|
2
2
|
|
|
3
3
|
//#region src/schemas/SectionResults.ts
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* @since 0.2.0
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
5
8
|
const SectionDiff = Data.taggedEnum();
|
|
6
|
-
/**
|
|
9
|
+
/**
|
|
10
|
+
* @since 0.2.0
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
7
13
|
const SyncResult = Data.taggedEnum();
|
|
8
|
-
/**
|
|
14
|
+
/**
|
|
15
|
+
* @since 0.2.0
|
|
16
|
+
* @public
|
|
17
|
+
*/
|
|
9
18
|
const CheckResult = Data.taggedEnum();
|
|
10
19
|
|
|
11
20
|
//#endregion
|
|
@@ -8,9 +8,10 @@ import { Schema } from "effect";
|
|
|
8
8
|
* - `"single"` — one shared tag for the entire release (e.g. `1.2.3`).
|
|
9
9
|
* - `"scoped"` — a per-package tag that includes the package name (e.g. `@my-org/pkg@1.2.3`).
|
|
10
10
|
*
|
|
11
|
-
* Determined by
|
|
11
|
+
* Determined by `TagStrategy.determine` based on the {@link (VersioningStrategyResult:type)}.
|
|
12
12
|
*
|
|
13
13
|
* @since 0.1.0
|
|
14
|
+
* @public
|
|
14
15
|
*/
|
|
15
16
|
const TagStrategyType = Schema.Literal("single", "scoped");
|
|
16
17
|
|
|
@@ -6,9 +6,10 @@ const NameSchema = Schema.Struct({ name: Schema.String });
|
|
|
6
6
|
/**
|
|
7
7
|
* Declares a CLI tool's identity and resolution constraints.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
9
|
+
* `Equal` compares on `name` only (identity).
|
|
10
10
|
*
|
|
11
11
|
* @since 0.2.0
|
|
12
|
+
* @public
|
|
12
13
|
*/
|
|
13
14
|
var ToolDefinition = class ToolDefinition {
|
|
14
15
|
_tag = "ToolDefinition";
|
package/schemas/ToolResults.js
CHANGED
|
@@ -1,13 +1,27 @@
|
|
|
1
1
|
import { Data, Schema } from "effect";
|
|
2
2
|
|
|
3
3
|
//#region src/schemas/ToolResults.ts
|
|
4
|
-
/**
|
|
4
|
+
/**
|
|
5
|
+
* Where a tool was resolved from.
|
|
6
|
+
*
|
|
7
|
+
* @since 0.2.0
|
|
8
|
+
* @public
|
|
9
|
+
*/
|
|
5
10
|
const ToolSource = Schema.Literal("global", "local");
|
|
6
|
-
/**
|
|
11
|
+
/**
|
|
12
|
+
* @since 0.2.0
|
|
13
|
+
* @public
|
|
14
|
+
*/
|
|
7
15
|
const VersionExtractor = Data.taggedEnum();
|
|
8
|
-
/**
|
|
16
|
+
/**
|
|
17
|
+
* @since 0.2.0
|
|
18
|
+
* @public
|
|
19
|
+
*/
|
|
9
20
|
const ResolutionPolicy = Data.taggedEnum();
|
|
10
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* @since 0.2.0
|
|
23
|
+
* @public
|
|
24
|
+
*/
|
|
11
25
|
const SourceRequirement = Data.taggedEnum();
|
|
12
26
|
|
|
13
27
|
//#endregion
|
|
@@ -34,11 +34,12 @@ const SnapshotConfig = Schema.Struct({
|
|
|
34
34
|
*
|
|
35
35
|
* @remarks
|
|
36
36
|
* Represents the parsed `.changeset/config.json` file. All fields are optional
|
|
37
|
-
* to allow partial configs. Use {@link SilkChangesetConfigFile} when the Silk changelog
|
|
37
|
+
* to allow partial configs. Use {@link (SilkChangesetConfigFile:type)} when the Silk changelog
|
|
38
38
|
* adapter is detected.
|
|
39
39
|
*
|
|
40
40
|
* @since 0.1.0
|
|
41
41
|
*/
|
|
42
|
+
/** @public */
|
|
42
43
|
const ChangesetConfigFile = Schema.Struct({
|
|
43
44
|
changelog: Schema.optional(Schema.Union(Schema.String, Schema.Array(Schema.Unknown), Schema.Literal(false))),
|
|
44
45
|
commit: Schema.optional(Schema.Union(Schema.Boolean, Schema.String, Schema.Array(Schema.Unknown))),
|
|
@@ -58,12 +59,13 @@ const ChangesetConfigFile = Schema.Struct({
|
|
|
58
59
|
* Extended changeset config for repos using the `@savvy-web/changesets` changelog adapter.
|
|
59
60
|
*
|
|
60
61
|
* @remarks
|
|
61
|
-
* Extends {@link ChangesetConfigFile} with a `_isSilk` marker flag that is automatically
|
|
62
|
+
* Extends {@link (ChangesetConfigFile:type)} with a `_isSilk` marker flag that is automatically
|
|
62
63
|
* set to `true`. Detected by {@link ChangesetConfigReader} when the `changelog` field
|
|
63
64
|
* references `@savvy-web/changesets`.
|
|
64
65
|
*
|
|
65
66
|
* @since 0.1.0
|
|
66
67
|
*/
|
|
68
|
+
/** @public */
|
|
67
69
|
const SilkChangesetConfigFile = Schema.extend(ChangesetConfigFile, Schema.Struct({ _isSilk: Schema.optionalWith(Schema.Boolean, { default: () => true }) }));
|
|
68
70
|
/**
|
|
69
71
|
* Versioning strategy classification for a workspace.
|
|
@@ -74,16 +76,18 @@ const SilkChangesetConfigFile = Schema.extend(ChangesetConfigFile, Schema.Struct
|
|
|
74
76
|
* - `"independent"` — multiple publishable packages with independent version bumps.
|
|
75
77
|
*
|
|
76
78
|
* @since 0.1.0
|
|
79
|
+
* @public
|
|
77
80
|
*/
|
|
78
81
|
const VersioningStrategyType = Schema.Literal("single", "fixed-group", "independent");
|
|
79
82
|
/**
|
|
80
83
|
* Output of the versioning strategy detection, combining the strategy type with group metadata.
|
|
81
84
|
*
|
|
82
85
|
* @remarks
|
|
83
|
-
* Produced by
|
|
86
|
+
* Produced by `VersioningStrategy.detect` and consumed by `TagStrategy.determine`
|
|
84
87
|
* to decide on the appropriate git-tag format.
|
|
85
88
|
*
|
|
86
89
|
* @since 0.1.0
|
|
90
|
+
* @public
|
|
87
91
|
*/
|
|
88
92
|
const VersioningStrategyResult = Schema.Struct({
|
|
89
93
|
type: VersioningStrategyType,
|
|
@@ -23,6 +23,7 @@ const PublishTargetObject = Schema.Struct({
|
|
|
23
23
|
* Silk `targets` extension for multi-registry publishing.
|
|
24
24
|
*
|
|
25
25
|
* @since 0.2.0
|
|
26
|
+
* @public
|
|
26
27
|
*/
|
|
27
28
|
var SilkPublishConfig = class extends PublishConfig.extend("SilkPublishConfig")({ targets: Schema.optional(Schema.Array(Schema.Union(PublishTargetShorthand, PublishTargetObject))) }) {};
|
|
28
29
|
const KNOWN_REGISTRIES = {
|
|
@@ -45,6 +46,7 @@ const WorkspaceVersion = Schema.Struct({ current: Schema.String });
|
|
|
45
46
|
* and release group membership.
|
|
46
47
|
*
|
|
47
48
|
* @since 0.2.0
|
|
49
|
+
* @public
|
|
48
50
|
*/
|
|
49
51
|
var AnalyzedWorkspace = class AnalyzedWorkspace extends Schema.TaggedClass()("AnalyzedWorkspace", {
|
|
50
52
|
name: Schema.String,
|
|
@@ -134,6 +136,7 @@ const PackageManagerInfo = Schema.Struct({
|
|
|
134
136
|
* and project-level configuration.
|
|
135
137
|
*
|
|
136
138
|
* @since 0.2.0
|
|
139
|
+
* @public
|
|
137
140
|
*/
|
|
138
141
|
var WorkspaceAnalysis = class WorkspaceAnalysis extends Schema.TaggedClass()("WorkspaceAnalysis", {
|
|
139
142
|
root: Schema.String,
|
|
@@ -11,6 +11,7 @@ import { parse } from "jsonc-effect";
|
|
|
11
11
|
* @returns The bare semver string (e.g. `"1.9.3"`).
|
|
12
12
|
*
|
|
13
13
|
* @since 0.1.0
|
|
14
|
+
* @public
|
|
14
15
|
*/
|
|
15
16
|
function extractSemver(version) {
|
|
16
17
|
return version.replace(/^[\^~>=<v]+/, "");
|
|
@@ -22,6 +23,7 @@ function extractSemver(version) {
|
|
|
22
23
|
* @returns The canonical `biomejs.dev` schema URL for that version.
|
|
23
24
|
*
|
|
24
25
|
* @since 0.1.0
|
|
26
|
+
* @public
|
|
25
27
|
*/
|
|
26
28
|
function buildSchemaUrl(version) {
|
|
27
29
|
return `https://biomejs.dev/schemas/${version}/schema.json`;
|
|
@@ -58,6 +60,7 @@ function findBiomeConfigs(cwd, fs) {
|
|
|
58
60
|
* ```
|
|
59
61
|
*
|
|
60
62
|
* @since 0.1.0
|
|
63
|
+
* @public
|
|
61
64
|
*/
|
|
62
65
|
var BiomeSchemaSync = class extends Context.Tag("@savvy-web/silk-effects/BiomeSchemaSync")() {};
|
|
63
66
|
/**
|
|
@@ -68,6 +71,7 @@ var BiomeSchemaSync = class extends Context.Tag("@savvy-web/silk-effects/BiomeSc
|
|
|
68
71
|
* `BunContext.layer` to satisfy this dependency.
|
|
69
72
|
*
|
|
70
73
|
* @since 0.1.0
|
|
74
|
+
* @public
|
|
71
75
|
*/
|
|
72
76
|
const BiomeSchemaSyncLive = Layer.effect(BiomeSchemaSync, Effect.gen(function* () {
|
|
73
77
|
const fs = yield* FileSystem.FileSystem;
|
|
@@ -11,6 +11,7 @@ import { Context, Effect, Layer, Option } from "effect";
|
|
|
11
11
|
* to `mode: "none"` and empty/false defaults.
|
|
12
12
|
*
|
|
13
13
|
* @since 0.4.0
|
|
14
|
+
* @public
|
|
14
15
|
*/
|
|
15
16
|
var ChangesetConfig = class extends Context.Tag("@savvy-web/silk-effects/ChangesetConfig")() {
|
|
16
17
|
/**
|
|
@@ -36,6 +37,7 @@ const isSilk = (cfg) => "_isSilk" in cfg && cfg._isSilk === true;
|
|
|
36
37
|
* `ChangesetConfigReaderLive` + a platform layer (`NodeContext.layer`).
|
|
37
38
|
*
|
|
38
39
|
* @since 0.4.0
|
|
40
|
+
* @public
|
|
39
41
|
*/
|
|
40
42
|
const ChangesetConfigLive = Layer.effect(ChangesetConfig, Effect.gen(function* () {
|
|
41
43
|
const reader = yield* ChangesetConfigReader;
|
|
@@ -26,8 +26,8 @@ function isSilkChangelog(changelog) {
|
|
|
26
26
|
*
|
|
27
27
|
* @remarks
|
|
28
28
|
* Automatically detects whether the config uses the Silk changelog adapter
|
|
29
|
-
* (`@savvy-web/changesets`) and decodes as {@link SilkChangesetConfigFile} or the
|
|
30
|
-
* standard {@link ChangesetConfigFile} accordingly.
|
|
29
|
+
* (`@savvy-web/changesets`) and decodes as {@link (SilkChangesetConfigFile:type)} or the
|
|
30
|
+
* standard {@link (ChangesetConfigFile:type)} accordingly.
|
|
31
31
|
*
|
|
32
32
|
* @example
|
|
33
33
|
* ```typescript
|
|
@@ -43,6 +43,7 @@ function isSilkChangelog(changelog) {
|
|
|
43
43
|
* ```
|
|
44
44
|
*
|
|
45
45
|
* @since 0.1.0
|
|
46
|
+
* @public
|
|
46
47
|
*/
|
|
47
48
|
var ChangesetConfigReader = class extends Context.Tag("@savvy-web/silk-effects/ChangesetConfigReader")() {};
|
|
48
49
|
/**
|
|
@@ -53,6 +54,7 @@ var ChangesetConfigReader = class extends Context.Tag("@savvy-web/silk-effects/C
|
|
|
53
54
|
* `BunContext.layer` to satisfy this dependency.
|
|
54
55
|
*
|
|
55
56
|
* @since 0.1.0
|
|
57
|
+
* @public
|
|
56
58
|
*/
|
|
57
59
|
const ChangesetConfigReaderLive = Layer.effect(ChangesetConfigReader, Effect.gen(function* () {
|
|
58
60
|
const fs = yield* FileSystem.FileSystem;
|
|
@@ -26,6 +26,7 @@ import { FileSystem } from "@effect/platform";
|
|
|
26
26
|
* ```
|
|
27
27
|
*
|
|
28
28
|
* @since 0.1.0
|
|
29
|
+
* @public
|
|
29
30
|
*/
|
|
30
31
|
var ConfigDiscovery = class extends Context.Tag("@savvy-web/silk-effects/ConfigDiscovery")() {};
|
|
31
32
|
/**
|
|
@@ -42,6 +43,7 @@ function safeExists(fs, path) {
|
|
|
42
43
|
* `BunContext.layer` to satisfy this dependency.
|
|
43
44
|
*
|
|
44
45
|
* @since 0.1.0
|
|
46
|
+
* @public
|
|
45
47
|
*/
|
|
46
48
|
const ConfigDiscoveryLive = Layer.effect(ConfigDiscovery, Effect.gen(function* () {
|
|
47
49
|
const fs = yield* FileSystem.FileSystem;
|
|
@@ -70,12 +70,14 @@ function findAllSections(content) {
|
|
|
70
70
|
* Content operations (`write`, `sync`, `check`) take a {@link SectionBlock}.
|
|
71
71
|
*
|
|
72
72
|
* @since 0.2.0
|
|
73
|
+
* @public
|
|
73
74
|
*/
|
|
74
75
|
var ManagedSection = class extends Context.Tag("@savvy-web/silk-effects/ManagedSection")() {};
|
|
75
76
|
/**
|
|
76
77
|
* Live implementation of {@link ManagedSection} backed by `@effect/platform` FileSystem.
|
|
77
78
|
*
|
|
78
79
|
* @since 0.2.0
|
|
80
|
+
* @public
|
|
79
81
|
*/
|
|
80
82
|
const ManagedSectionLive = Layer.effect(ManagedSection, Effect.gen(function* () {
|
|
81
83
|
const fs = yield* FileSystem.FileSystem;
|
|
@@ -20,7 +20,7 @@ const DEFAULT_REGISTRIES = {
|
|
|
20
20
|
*
|
|
21
21
|
* @remarks
|
|
22
22
|
* The npm public registry and GitHub Packages both accept provenance attestations through the
|
|
23
|
-
* Sigstore/OIDC trusted-publishing flow, so a
|
|
23
|
+
* Sigstore/OIDC trusted-publishing flow, so a `PublishTarget` bound to either is marked
|
|
24
24
|
* `provenance: true` by default — this is what gates the release action's attestation step. JSR
|
|
25
25
|
* and custom registries do not participate and resolve to `false`. Matching is endpoint-based
|
|
26
26
|
* (not target-key based) so a custom key pointed at one of these registries still opts in.
|
|
@@ -36,7 +36,7 @@ const provenanceForRegistry = (registry) => {
|
|
|
36
36
|
return hostname === "registry.npmjs.org" || hostname === "npm.pkg.github.com";
|
|
37
37
|
};
|
|
38
38
|
/**
|
|
39
|
-
* Silk publishability rules over `workspaces-effect`'s
|
|
39
|
+
* Silk publishability rules over `workspaces-effect`'s `PublishTarget`.
|
|
40
40
|
*
|
|
41
41
|
* @remarks
|
|
42
42
|
* In silk mode `private: true` is the norm on workspace `package.json`; publishability is
|
|
@@ -44,6 +44,7 @@ const provenanceForRegistry = (registry) => {
|
|
|
44
44
|
* default. All helpers are static so a consumer sees the full rule surface in one place.
|
|
45
45
|
*
|
|
46
46
|
* @since 0.4.0
|
|
47
|
+
* @public
|
|
47
48
|
*/
|
|
48
49
|
var SilkPublishability = class {
|
|
49
50
|
/**
|
|
@@ -52,7 +53,7 @@ var SilkPublishability = class {
|
|
|
52
53
|
*
|
|
53
54
|
* - A non-empty `publishConfig.targets` map (the bundler's Record-map form) makes the
|
|
54
55
|
* package publishable regardless of `private`. With a `binding` (post-prod-build), one
|
|
55
|
-
*
|
|
56
|
+
* `PublishTarget` is emitted per resolved registry target, its `directory` set to
|
|
56
57
|
* the bound group's `dist/prod/<group>/pkg` dir. Without a binding (pre-build), one
|
|
57
58
|
* placeholder target is emitted per declared key so publishability and target counts
|
|
58
59
|
* are correct; the directory is best-effort and unused until the build writes the
|
|
@@ -115,7 +116,7 @@ var SilkPublishability = class {
|
|
|
115
116
|
return [];
|
|
116
117
|
}
|
|
117
118
|
/**
|
|
118
|
-
* Resolve a package's publish targets via {@link
|
|
119
|
+
* Resolve a package's publish targets via {@link SilkPublishability}, then drop any
|
|
119
120
|
* whose built `directory` package.json is `private: true`. Returned targets keep the
|
|
120
121
|
* detector's original (possibly package-relative) `directory`.
|
|
121
122
|
*/
|
|
@@ -131,7 +132,7 @@ var SilkPublishability = class {
|
|
|
131
132
|
}
|
|
132
133
|
/**
|
|
133
134
|
* The publishable, non-ignored packages, resolved through the single
|
|
134
|
-
* {@link
|
|
135
|
+
* {@link SilkPublishability} (which already honors changeset ignore in adaptive mode).
|
|
135
136
|
*/
|
|
136
137
|
static listPublishable(root) {
|
|
137
138
|
return Effect.gen(function* () {
|
|
@@ -167,24 +168,26 @@ const readRaw = (fs, packageJsonPath) => fs.readFileString(packageJsonPath).pipe
|
|
|
167
168
|
*
|
|
168
169
|
* @remarks
|
|
169
170
|
* Returns `null` when the file is missing/unreadable/malformed — i.e. before the prod build
|
|
170
|
-
* has run.
|
|
171
|
-
* case. Used by the silk {@link
|
|
171
|
+
* has run. `SilkPublishability.detect` falls back to declared-key placeholders in that
|
|
172
|
+
* case. Used by the silk {@link SilkPublishability} layers and the workspace analyzer.
|
|
172
173
|
*
|
|
173
174
|
* @param fs - The FileSystem service.
|
|
174
175
|
* @param pkgPath - Absolute path to the package directory.
|
|
175
176
|
* @since 1.0.0
|
|
177
|
+
* @public
|
|
176
178
|
*/
|
|
177
179
|
const readTargetsBinding = (fs, pkgPath) => fs.readFileString(join(pkgPath, "dist", "prod", "targets.json")).pipe(Effect.flatMap((content) => Effect.try({
|
|
178
180
|
try: () => JSON.parse(content),
|
|
179
181
|
catch: () => /* @__PURE__ */ new Error("invalid targets.json")
|
|
180
182
|
})), Effect.orElseSucceed(() => null));
|
|
181
183
|
/**
|
|
182
|
-
* Override of `workspaces-effect`'s {@link
|
|
184
|
+
* Override of `workspaces-effect`'s {@link SilkPublishability} Tag with pure silk rules.
|
|
183
185
|
*
|
|
184
186
|
* @remarks Requires `FileSystem` (captured at layer build); `detect` reads the raw
|
|
185
|
-
* `package.json` from `pkg.packageJsonPath` and applies
|
|
187
|
+
* `package.json` from `pkg.packageJsonPath` and applies `SilkPublishability.detect`.
|
|
186
188
|
*
|
|
187
189
|
* @since 0.4.0
|
|
190
|
+
* @public
|
|
188
191
|
*/
|
|
189
192
|
const SilkPublishabilityDetectorLive = Layer.effect(PublishabilityDetector, Effect.gen(function* () {
|
|
190
193
|
const fs = yield* FileSystem.FileSystem;
|
|
@@ -196,13 +199,14 @@ const SilkPublishabilityDetectorLive = Layer.effect(PublishabilityDetector, Effe
|
|
|
196
199
|
}) };
|
|
197
200
|
}));
|
|
198
201
|
/**
|
|
199
|
-
* Ignore-aware override of {@link
|
|
200
|
-
* for changeset-ignored packages, then dispatches on
|
|
201
|
-
* `none` → `[]`; `silk` →
|
|
202
|
+
* Ignore-aware override of {@link SilkPublishability}. `detect` short-circuits to `[]`
|
|
203
|
+
* for changeset-ignored packages, then dispatches on `ChangesetConfig.mode`:
|
|
204
|
+
* `none` → `[]`; `silk` → `SilkPublishability.detect`; `vanilla` → the library default.
|
|
202
205
|
*
|
|
203
206
|
* @remarks Requires `FileSystem` + {@link ChangesetConfig} at build.
|
|
204
207
|
*
|
|
205
208
|
* @since 0.4.0
|
|
209
|
+
* @public
|
|
206
210
|
*/
|
|
207
211
|
const PublishabilityDetectorAdaptiveLive = Layer.effect(PublishabilityDetector, Effect.gen(function* () {
|
|
208
212
|
const fs = yield* FileSystem.FileSystem;
|
|
@@ -16,7 +16,7 @@ import { PackageManagerDetector, TopologicalSorter, WorkspaceDiscovery } from "w
|
|
|
16
16
|
* wiring up fixed/linked release groups.
|
|
17
17
|
*
|
|
18
18
|
* @remarks
|
|
19
|
-
* Orchestrates
|
|
19
|
+
* Orchestrates `WorkspaceDiscovery`, `PackageManagerDetector`,
|
|
20
20
|
* {@link ChangesetConfigReader}, {@link VersioningStrategy}, and
|
|
21
21
|
* {@link TagStrategy} to produce a complete {@link WorkspaceAnalysis} for a
|
|
22
22
|
* given workspace root.
|
|
@@ -35,6 +35,7 @@ import { PackageManagerDetector, TopologicalSorter, WorkspaceDiscovery } from "w
|
|
|
35
35
|
* ```
|
|
36
36
|
*
|
|
37
37
|
* @since 0.2.0
|
|
38
|
+
* @public
|
|
38
39
|
*/
|
|
39
40
|
var SilkWorkspaceAnalyzer = class extends Context.Tag("@savvy-web/silk-effects/SilkWorkspaceAnalyzer")() {};
|
|
40
41
|
/**
|
|
@@ -105,10 +106,11 @@ function computeReleaseStatus(pkgName, isPrivate, isPublishable, config) {
|
|
|
105
106
|
* Live implementation of {@link SilkWorkspaceAnalyzer}.
|
|
106
107
|
*
|
|
107
108
|
* @remarks
|
|
108
|
-
* Requires
|
|
109
|
+
* Requires `WorkspaceDiscovery`, `PackageManagerDetector`,
|
|
109
110
|
* {@link ChangesetConfigReader}, {@link VersioningStrategy}, and {@link TagStrategy}.
|
|
110
111
|
*
|
|
111
112
|
* @since 0.2.0
|
|
113
|
+
* @public
|
|
112
114
|
*/
|
|
113
115
|
const SilkWorkspaceAnalyzerLive = Layer.effect(SilkWorkspaceAnalyzer, Effect.gen(function* () {
|
|
114
116
|
const fs = yield* FileSystem.FileSystem;
|
package/services/TagStrategy.js
CHANGED
|
@@ -6,7 +6,7 @@ import { Context, Effect, Layer } from "effect";
|
|
|
6
6
|
* Service that determines and applies the git-tag naming strategy for a release.
|
|
7
7
|
*
|
|
8
8
|
* @remarks
|
|
9
|
-
* Consumes a {@link VersioningStrategyResult} to pick between `"single"` and `"scoped"`
|
|
9
|
+
* Consumes a {@link (VersioningStrategyResult:type)} to pick between `"single"` and `"scoped"`
|
|
10
10
|
* tag formats, then formats tag strings accordingly. Independent versioning always
|
|
11
11
|
* produces scoped tags; single and fixed-group versioning produces a single shared tag.
|
|
12
12
|
*
|
|
@@ -23,6 +23,7 @@ import { Context, Effect, Layer } from "effect";
|
|
|
23
23
|
* ```
|
|
24
24
|
*
|
|
25
25
|
* @since 0.1.0
|
|
26
|
+
* @public
|
|
26
27
|
*/
|
|
27
28
|
var TagStrategy = class extends Context.Tag("@savvy-web/silk-effects/TagStrategy")() {};
|
|
28
29
|
/**
|
|
@@ -32,6 +33,7 @@ var TagStrategy = class extends Context.Tag("@savvy-web/silk-effects/TagStrategy
|
|
|
32
33
|
* All logic is pure: strategy determination and tag formatting involve no I/O.
|
|
33
34
|
*
|
|
34
35
|
* @since 0.1.0
|
|
36
|
+
* @public
|
|
35
37
|
*/
|
|
36
38
|
const TagStrategyLive = Layer.succeed(TagStrategy, TagStrategy.of({
|
|
37
39
|
determine: (versioningResult) => {
|
|
@@ -27,6 +27,7 @@ import { PackageManagerDetector, WorkspaceRoot } from "workspaces-effect";
|
|
|
27
27
|
* ```
|
|
28
28
|
*
|
|
29
29
|
* @since 0.2.0
|
|
30
|
+
* @public
|
|
30
31
|
*/
|
|
31
32
|
var ToolDiscovery = class extends Context.Tag("@savvy-web/silk-effects/ToolDiscovery")() {};
|
|
32
33
|
/**
|
|
@@ -101,6 +102,7 @@ function extractVersion(output, extractor) {
|
|
|
101
102
|
* and `WorkspaceRoot` from `workspaces-effect`.
|
|
102
103
|
*
|
|
103
104
|
* @since 0.2.0
|
|
105
|
+
* @public
|
|
104
106
|
*/
|
|
105
107
|
const ToolDiscoveryLive = Layer.effect(ToolDiscovery, Effect.gen(function* () {
|
|
106
108
|
const executor = yield* CommandExecutor.CommandExecutor;
|
|
@@ -25,6 +25,7 @@ import { Context, Effect, Layer } from "effect";
|
|
|
25
25
|
* ```
|
|
26
26
|
*
|
|
27
27
|
* @since 0.1.0
|
|
28
|
+
* @public
|
|
28
29
|
*/
|
|
29
30
|
var VersioningStrategy = class extends Context.Tag("@savvy-web/silk-effects/VersioningStrategy")() {};
|
|
30
31
|
/**
|
|
@@ -35,6 +36,7 @@ var VersioningStrategy = class extends Context.Tag("@savvy-web/silk-effects/Vers
|
|
|
35
36
|
* If the config file is absent, an empty `fixed` groups array is assumed.
|
|
36
37
|
*
|
|
37
38
|
* @since 0.1.0
|
|
39
|
+
* @public
|
|
38
40
|
*/
|
|
39
41
|
const VersioningStrategyLive = Layer.effect(VersioningStrategy, Effect.gen(function* () {
|
|
40
42
|
const configReader = yield* ChangesetConfigReader;
|
package/utils/ToolCommand.js
CHANGED
|
@@ -2,11 +2,12 @@ import { Command } from "@effect/platform";
|
|
|
2
2
|
|
|
3
3
|
//#region src/utils/ToolCommand.ts
|
|
4
4
|
/**
|
|
5
|
-
* Wraps `@effect/platform`
|
|
5
|
+
* Wraps `@effect/platform` `Command.Command` with instance method ergonomics.
|
|
6
6
|
*
|
|
7
7
|
* Use `yield* cmd.string()` instead of `yield* Command.string(cmd)`.
|
|
8
8
|
*
|
|
9
9
|
* @since 0.2.0
|
|
10
|
+
* @public
|
|
10
11
|
*/
|
|
11
12
|
var ToolCommand = class ToolCommand {
|
|
12
13
|
command;
|