@savvy-web/silk-effects 3.0.1 → 3.0.3
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/utils/jsonpath.js +48 -69
- package/changesets/utils/version-files.js +108 -24
- package/index.d.ts +59 -5
- package/package.json +5 -5
|
@@ -69,23 +69,46 @@ function parseJsonPath(path) {
|
|
|
69
69
|
* @internal
|
|
70
70
|
*/
|
|
71
71
|
function jsonPathGet(obj, path) {
|
|
72
|
+
return walkJsonPath(obj, path).map((entry) => entry.node);
|
|
73
|
+
}
|
|
74
|
+
/**
|
|
75
|
+
* Shared breadth-first traversal behind {@link jsonPathGet} and
|
|
76
|
+
* {@link jsonPathResolve}: each segment fans out the current set of matched
|
|
77
|
+
* entries, carrying both the node and the concrete path taken to reach it.
|
|
78
|
+
* The two public functions differ only in which half of the entry they keep.
|
|
79
|
+
*/
|
|
80
|
+
function walkJsonPath(obj, path) {
|
|
72
81
|
const segments = parseJsonPath(path);
|
|
73
|
-
let current = [
|
|
82
|
+
let current = [{
|
|
83
|
+
node: obj,
|
|
84
|
+
path: []
|
|
85
|
+
}];
|
|
74
86
|
for (const segment of segments) {
|
|
75
87
|
const next = [];
|
|
76
|
-
for (const node of current) {
|
|
88
|
+
for (const { node, path: nodePath } of current) {
|
|
77
89
|
if (node === null || node === void 0 || typeof node !== "object") continue;
|
|
78
90
|
switch (segment.type) {
|
|
79
91
|
case "property": {
|
|
80
92
|
const value = node[segment.key];
|
|
81
|
-
if (value !== void 0) next.push(
|
|
93
|
+
if (value !== void 0) next.push({
|
|
94
|
+
node: value,
|
|
95
|
+
path: [...nodePath, segment.key]
|
|
96
|
+
});
|
|
82
97
|
break;
|
|
83
98
|
}
|
|
84
99
|
case "index":
|
|
85
|
-
if (Array.isArray(node) && segment.index < node.length) next.push(
|
|
100
|
+
if (Array.isArray(node) && segment.index < node.length) next.push({
|
|
101
|
+
node: node[segment.index],
|
|
102
|
+
path: [...nodePath, segment.index]
|
|
103
|
+
});
|
|
86
104
|
break;
|
|
87
105
|
case "wildcard":
|
|
88
|
-
if (Array.isArray(node))
|
|
106
|
+
if (Array.isArray(node)) node.forEach((element, index) => {
|
|
107
|
+
next.push({
|
|
108
|
+
node: element,
|
|
109
|
+
path: [...nodePath, index]
|
|
110
|
+
});
|
|
111
|
+
});
|
|
89
112
|
break;
|
|
90
113
|
}
|
|
91
114
|
}
|
|
@@ -94,82 +117,38 @@ function jsonPathGet(obj, path) {
|
|
|
94
117
|
return current;
|
|
95
118
|
}
|
|
96
119
|
/**
|
|
97
|
-
*
|
|
120
|
+
* Resolve a JSONPath expression to the concrete paths of every existing match.
|
|
98
121
|
*
|
|
99
122
|
* @remarks
|
|
100
|
-
*
|
|
101
|
-
*
|
|
102
|
-
*
|
|
103
|
-
*
|
|
123
|
+
* Uses the same breadth-first expansion as {@link jsonPathGet}, but instead of
|
|
124
|
+
* collecting the matched *values* it records the concrete `(string | number)[]`
|
|
125
|
+
* path taken to reach each one. Wildcards and indices are materialized into the
|
|
126
|
+
* numeric array index actually traversed, so the returned paths are directly
|
|
127
|
+
* consumable by structural editors such as `jsonc-effect`'s `modify`, which
|
|
128
|
+
* require a fully concrete path (no wildcards).
|
|
129
|
+
*
|
|
130
|
+
* Only existing locations are returned; nothing is created. A path with no
|
|
131
|
+
* matches yields an empty array, and the empty path (`"$."`) yields a single
|
|
132
|
+
* empty concrete path (the document root).
|
|
104
133
|
*
|
|
105
|
-
* @param obj - The object to
|
|
134
|
+
* @param obj - The object to query
|
|
106
135
|
* @param path - JSONPath string (e.g., `"$.packages[*].version"`)
|
|
107
|
-
* @
|
|
108
|
-
* @returns The number of locations updated (0 if no matches or empty path)
|
|
136
|
+
* @returns Array of concrete paths, each an array of string keys / numeric indices
|
|
109
137
|
*
|
|
110
138
|
* @example
|
|
111
139
|
* ```typescript
|
|
112
|
-
* import {
|
|
140
|
+
* import { jsonPathResolve } from "../utils/jsonpath.js";
|
|
113
141
|
*
|
|
114
|
-
* const obj = { version: "1.0.0" };
|
|
115
|
-
* const
|
|
116
|
-
* //
|
|
142
|
+
* const obj = { packages: [{ version: "1.0.0" }, { version: "2.0.0" }] };
|
|
143
|
+
* const paths = jsonPathResolve(obj, "$.packages[*].version");
|
|
144
|
+
* // [["packages", 0, "version"], ["packages", 1, "version"]]
|
|
117
145
|
* ```
|
|
118
146
|
*
|
|
119
147
|
* @internal
|
|
120
148
|
*/
|
|
121
|
-
function
|
|
122
|
-
|
|
123
|
-
if (segments.length === 0) return 0;
|
|
124
|
-
const lastSegment = segments[segments.length - 1];
|
|
125
|
-
const parentSegments = segments.slice(0, -1);
|
|
126
|
-
let parents = [obj];
|
|
127
|
-
for (const segment of parentSegments) {
|
|
128
|
-
const next = [];
|
|
129
|
-
for (const node of parents) {
|
|
130
|
-
if (node === null || node === void 0 || typeof node !== "object") continue;
|
|
131
|
-
switch (segment.type) {
|
|
132
|
-
case "property": {
|
|
133
|
-
const child = node[segment.key];
|
|
134
|
-
if (child !== void 0) next.push(child);
|
|
135
|
-
break;
|
|
136
|
-
}
|
|
137
|
-
case "index":
|
|
138
|
-
if (Array.isArray(node) && segment.index < node.length) next.push(node[segment.index]);
|
|
139
|
-
break;
|
|
140
|
-
case "wildcard":
|
|
141
|
-
if (Array.isArray(node)) next.push(...node);
|
|
142
|
-
break;
|
|
143
|
-
}
|
|
144
|
-
}
|
|
145
|
-
parents = next;
|
|
146
|
-
}
|
|
147
|
-
let count = 0;
|
|
148
|
-
for (const parent of parents) {
|
|
149
|
-
if (parent === null || parent === void 0 || typeof parent !== "object") continue;
|
|
150
|
-
switch (lastSegment.type) {
|
|
151
|
-
case "property":
|
|
152
|
-
if (lastSegment.key in parent) {
|
|
153
|
-
parent[lastSegment.key] = value;
|
|
154
|
-
count++;
|
|
155
|
-
}
|
|
156
|
-
break;
|
|
157
|
-
case "index":
|
|
158
|
-
if (Array.isArray(parent) && lastSegment.index < parent.length) {
|
|
159
|
-
parent[lastSegment.index] = value;
|
|
160
|
-
count++;
|
|
161
|
-
}
|
|
162
|
-
break;
|
|
163
|
-
case "wildcard":
|
|
164
|
-
if (Array.isArray(parent)) for (let i = 0; i < parent.length; i++) {
|
|
165
|
-
parent[i] = value;
|
|
166
|
-
count++;
|
|
167
|
-
}
|
|
168
|
-
break;
|
|
169
|
-
}
|
|
170
|
-
}
|
|
171
|
-
return count;
|
|
149
|
+
function jsonPathResolve(obj, path) {
|
|
150
|
+
return walkJsonPath(obj, path).map((entry) => entry.path);
|
|
172
151
|
}
|
|
173
152
|
|
|
174
153
|
//#endregion
|
|
175
|
-
export { jsonPathGet,
|
|
154
|
+
export { jsonPathGet, jsonPathResolve, parseJsonPath };
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { LegacyVersionFilesSchema } from "../schemas/version-files.js";
|
|
2
|
-
import { jsonPathGet,
|
|
3
|
-
import { Schema } from "effect";
|
|
2
|
+
import { jsonPathGet, jsonPathResolve, parseJsonPath } from "./jsonpath.js";
|
|
3
|
+
import { Effect, Schema } from "effect";
|
|
4
4
|
import { readFileSync, writeFileSync } from "node:fs";
|
|
5
5
|
import { join, relative, resolve } from "node:path";
|
|
6
6
|
import { globSync } from "tinyglobby";
|
|
7
|
+
import { applyEdits, modify, parse } from "jsonc-effect";
|
|
7
8
|
|
|
8
9
|
//#region src/changesets/utils/version-files.ts
|
|
9
10
|
/**
|
|
@@ -193,31 +194,39 @@ var VersionFiles = class VersionFiles {
|
|
|
193
194
|
return content.match(/^(\s+)"/m)?.[1] ?? " ";
|
|
194
195
|
}
|
|
195
196
|
/**
|
|
196
|
-
* Update JSON file at specified JSONPath locations
|
|
197
|
+
* Update a JSON (or JSONC) file at specified JSONPath locations,
|
|
198
|
+
* preserving the original formatting byte-for-byte.
|
|
197
199
|
*
|
|
198
200
|
* @remarks
|
|
199
|
-
*
|
|
200
|
-
*
|
|
201
|
-
*
|
|
202
|
-
*
|
|
201
|
+
* The write is performed with `jsonc-effect`'s format-preserving
|
|
202
|
+
* `modify`/`applyEdits` rather than a `JSON.parse`/`JSON.stringify`
|
|
203
|
+
* round-trip (which always explodes inline arrays one-element-per-line and
|
|
204
|
+
* drops comments). Each JSONPath expression is resolved to concrete
|
|
205
|
+
* `(string | number)[]` paths against the parsed document, and each
|
|
206
|
+
* concrete path becomes a minimal text edit that touches only the target
|
|
207
|
+
* value's span — so inline arrays, comments,
|
|
208
|
+
* indentation, and the trailing-newline preference all survive; a one-line
|
|
209
|
+
* version bump produces a one-line diff.
|
|
210
|
+
*
|
|
211
|
+
* Insertion semantics: a concrete, wildcard-free JSONPath whose leaf
|
|
212
|
+
* property does not exist yet is inserted after the last sibling using the
|
|
213
|
+
* document's detected indent (the one case where indent detection still
|
|
214
|
+
* matters). Wildcard expressions only ever update existing matches. Returns
|
|
215
|
+
* `undefined` (no write) when nothing was updated or inserted.
|
|
203
216
|
*
|
|
204
217
|
* @param filePath - Absolute path to the JSON file
|
|
205
218
|
* @param jsonPaths - JSONPath expressions to update
|
|
206
219
|
* @param version - New version string
|
|
207
220
|
* @returns Update result, or `undefined` if no changes were made
|
|
221
|
+
*
|
|
222
|
+
* @see {@link jsonPathResolve} for concrete-path enumeration
|
|
223
|
+
* @see {@link VersionFiles.applyVersionEdit} for the per-path edit
|
|
208
224
|
*/
|
|
209
225
|
static updateFile(filePath, jsonPaths, version) {
|
|
210
|
-
const
|
|
211
|
-
const
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
const previousValues = jsonPaths.flatMap((jp) => jsonPathGet(obj, jp));
|
|
215
|
-
let totalUpdated = 0;
|
|
216
|
-
for (const jp of jsonPaths) totalUpdated += jsonPathSet(obj, jp, version);
|
|
217
|
-
if (totalUpdated === 0) return;
|
|
218
|
-
let output = JSON.stringify(obj, null, indent);
|
|
219
|
-
if (trailingNewline) output += "\n";
|
|
220
|
-
writeFileSync(filePath, output, "utf-8");
|
|
226
|
+
const original = readFileSync(filePath, "utf-8");
|
|
227
|
+
const { content, previousValues, totalChanged } = VersionFiles.computeUpdate(original, jsonPaths, version);
|
|
228
|
+
if (totalChanged === 0) return;
|
|
229
|
+
writeFileSync(filePath, content, "utf-8");
|
|
221
230
|
return {
|
|
222
231
|
filePath,
|
|
223
232
|
jsonPaths,
|
|
@@ -226,6 +235,83 @@ var VersionFiles = class VersionFiles {
|
|
|
226
235
|
};
|
|
227
236
|
}
|
|
228
237
|
/**
|
|
238
|
+
* Compute the full update for a document without touching the filesystem:
|
|
239
|
+
* the edited content, the previous values at every matched path, and how
|
|
240
|
+
* many locations actually changed.
|
|
241
|
+
*
|
|
242
|
+
* @remarks
|
|
243
|
+
* This is the single decision path shared by {@link VersionFiles.updateFile}
|
|
244
|
+
* and the dry-run branches of the two process methods, so a preview reports
|
|
245
|
+
* exactly the files a real run would write — including pending inserts of a
|
|
246
|
+
* not-yet-existing wildcard-free leaf, and excluding same-value no-ops.
|
|
247
|
+
*
|
|
248
|
+
* @param original - Document text as read from disk
|
|
249
|
+
* @param jsonPaths - JSONPath expressions to update
|
|
250
|
+
* @param version - New version string
|
|
251
|
+
* @returns The updated content, previous values, and changed-location count
|
|
252
|
+
*/
|
|
253
|
+
static computeUpdate(original, jsonPaths, version) {
|
|
254
|
+
let content = original;
|
|
255
|
+
const obj = Effect.runSync(parse(content));
|
|
256
|
+
const previousValues = jsonPaths.flatMap((jp) => jsonPathGet(obj, jp));
|
|
257
|
+
const indent = VersionFiles.detectIndent(content);
|
|
258
|
+
const eol = content.includes("\r\n") ? "\r\n" : "\n";
|
|
259
|
+
let totalChanged = 0;
|
|
260
|
+
for (const jp of jsonPaths) {
|
|
261
|
+
const segments = parseJsonPath(jp);
|
|
262
|
+
if (segments.length === 0) continue;
|
|
263
|
+
const hasWildcard = segments.some((segment) => segment.type === "wildcard");
|
|
264
|
+
let concretePaths;
|
|
265
|
+
if (hasWildcard) concretePaths = jsonPathResolve(obj, jp);
|
|
266
|
+
else {
|
|
267
|
+
const direct = segments.map((segment) => segment.type === "property" ? segment.key : segment.index);
|
|
268
|
+
concretePaths = jsonPathResolve(obj, jp).length > 0 || typeof direct[direct.length - 1] === "string" ? [direct] : [];
|
|
269
|
+
}
|
|
270
|
+
for (const concretePath of concretePaths) {
|
|
271
|
+
const updated = VersionFiles.applyVersionEdit(content, concretePath, version, indent, eol);
|
|
272
|
+
if (updated !== void 0) {
|
|
273
|
+
content = updated;
|
|
274
|
+
totalChanged += 1;
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
}
|
|
278
|
+
return {
|
|
279
|
+
content,
|
|
280
|
+
previousValues,
|
|
281
|
+
totalChanged
|
|
282
|
+
};
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Compute the format-preserving edit for a single concrete path, returning
|
|
286
|
+
* the updated document, or `undefined` when nothing changed.
|
|
287
|
+
*
|
|
288
|
+
* @remarks
|
|
289
|
+
* Delegates to `jsonc-effect`'s {@link modify} + {@link applyEdits}
|
|
290
|
+
* (requires `jsonc-effect >= 0.3.1`, whose edit spans touch only the target
|
|
291
|
+
* value), so every other byte of the document is preserved. When the leaf
|
|
292
|
+
* of a wildcard-free path does not exist, `modify` inserts the property
|
|
293
|
+
* after the last sibling using the supplied formatting options — the only
|
|
294
|
+
* case where the detected indent matters. A path whose parent is missing or
|
|
295
|
+
* not an object cannot be navigated; the resulting modification error is
|
|
296
|
+
* caught and reported as "no change" so the file is left alone.
|
|
297
|
+
*
|
|
298
|
+
* @param content - Current document text
|
|
299
|
+
* @param concretePath - A wildcard-free `(string | number)[]` path
|
|
300
|
+
* @param version - New version string
|
|
301
|
+
* @param indentUnit - One indentation level, for inserted text
|
|
302
|
+
* @param eol - End-of-line sequence, for inserted text
|
|
303
|
+
* @returns The updated document, or `undefined` if the path was unchanged
|
|
304
|
+
*/
|
|
305
|
+
static applyVersionEdit(content, concretePath, version, indentUnit, eol) {
|
|
306
|
+
const insertSpaces = !indentUnit.includes(" ");
|
|
307
|
+
const program = modify(content, [...concretePath], version, { formattingOptions: {
|
|
308
|
+
insertSpaces,
|
|
309
|
+
tabSize: insertSpaces ? indentUnit.length : 1,
|
|
310
|
+
eol
|
|
311
|
+
} }).pipe(Effect.flatMap((edits) => applyEdits(content, edits)), Effect.map((updated) => updated === content ? void 0 : updated), Effect.catchTag("JsoncModificationError", () => Effect.succeed(void 0)));
|
|
312
|
+
return Effect.runSync(program);
|
|
313
|
+
}
|
|
314
|
+
/**
|
|
229
315
|
* Orchestrate the full version file update flow.
|
|
230
316
|
*
|
|
231
317
|
* @remarks
|
|
@@ -251,9 +337,8 @@ var VersionFiles = class VersionFiles {
|
|
|
251
337
|
try {
|
|
252
338
|
if (dryRun) {
|
|
253
339
|
const content = readFileSync(filePath, "utf-8");
|
|
254
|
-
const
|
|
255
|
-
|
|
256
|
-
if (previousValues.length > 0) updates.push({
|
|
340
|
+
const { previousValues, totalChanged } = VersionFiles.computeUpdate(content, jsonPaths, version);
|
|
341
|
+
if (totalChanged > 0) updates.push({
|
|
257
342
|
filePath,
|
|
258
343
|
jsonPaths,
|
|
259
344
|
version,
|
|
@@ -297,9 +382,8 @@ var VersionFiles = class VersionFiles {
|
|
|
297
382
|
for (const filePath of vf.matchedFiles) try {
|
|
298
383
|
if (dryRun) {
|
|
299
384
|
const content = readFileSync(filePath, "utf-8");
|
|
300
|
-
const
|
|
301
|
-
|
|
302
|
-
if (previousValues.length > 0) updates.push({
|
|
385
|
+
const { previousValues, totalChanged } = VersionFiles.computeUpdate(content, jsonPaths, scope.version);
|
|
386
|
+
if (totalChanged > 0) updates.push({
|
|
303
387
|
filePath,
|
|
304
388
|
jsonPaths,
|
|
305
389
|
version: scope.version,
|
package/index.d.ts
CHANGED
|
@@ -4848,20 +4848,74 @@ declare class VersionFiles {
|
|
|
4848
4848
|
*/
|
|
4849
4849
|
static detectIndent(content: string): string;
|
|
4850
4850
|
/**
|
|
4851
|
-
* Update JSON file at specified JSONPath locations
|
|
4851
|
+
* Update a JSON (or JSONC) file at specified JSONPath locations,
|
|
4852
|
+
* preserving the original formatting byte-for-byte.
|
|
4852
4853
|
*
|
|
4853
4854
|
* @remarks
|
|
4854
|
-
*
|
|
4855
|
-
*
|
|
4856
|
-
*
|
|
4857
|
-
*
|
|
4855
|
+
* The write is performed with `jsonc-effect`'s format-preserving
|
|
4856
|
+
* `modify`/`applyEdits` rather than a `JSON.parse`/`JSON.stringify`
|
|
4857
|
+
* round-trip (which always explodes inline arrays one-element-per-line and
|
|
4858
|
+
* drops comments). Each JSONPath expression is resolved to concrete
|
|
4859
|
+
* `(string | number)[]` paths against the parsed document, and each
|
|
4860
|
+
* concrete path becomes a minimal text edit that touches only the target
|
|
4861
|
+
* value's span — so inline arrays, comments,
|
|
4862
|
+
* indentation, and the trailing-newline preference all survive; a one-line
|
|
4863
|
+
* version bump produces a one-line diff.
|
|
4864
|
+
*
|
|
4865
|
+
* Insertion semantics: a concrete, wildcard-free JSONPath whose leaf
|
|
4866
|
+
* property does not exist yet is inserted after the last sibling using the
|
|
4867
|
+
* document's detected indent (the one case where indent detection still
|
|
4868
|
+
* matters). Wildcard expressions only ever update existing matches. Returns
|
|
4869
|
+
* `undefined` (no write) when nothing was updated or inserted.
|
|
4858
4870
|
*
|
|
4859
4871
|
* @param filePath - Absolute path to the JSON file
|
|
4860
4872
|
* @param jsonPaths - JSONPath expressions to update
|
|
4861
4873
|
* @param version - New version string
|
|
4862
4874
|
* @returns Update result, or `undefined` if no changes were made
|
|
4875
|
+
*
|
|
4876
|
+
* @see {@link jsonPathResolve} for concrete-path enumeration
|
|
4877
|
+
* @see {@link VersionFiles.applyVersionEdit} for the per-path edit
|
|
4863
4878
|
*/
|
|
4864
4879
|
static updateFile(filePath: string, jsonPaths: readonly string[], version: string): VersionFileUpdate | undefined;
|
|
4880
|
+
/**
|
|
4881
|
+
* Compute the full update for a document without touching the filesystem:
|
|
4882
|
+
* the edited content, the previous values at every matched path, and how
|
|
4883
|
+
* many locations actually changed.
|
|
4884
|
+
*
|
|
4885
|
+
* @remarks
|
|
4886
|
+
* This is the single decision path shared by {@link VersionFiles.updateFile}
|
|
4887
|
+
* and the dry-run branches of the two process methods, so a preview reports
|
|
4888
|
+
* exactly the files a real run would write — including pending inserts of a
|
|
4889
|
+
* not-yet-existing wildcard-free leaf, and excluding same-value no-ops.
|
|
4890
|
+
*
|
|
4891
|
+
* @param original - Document text as read from disk
|
|
4892
|
+
* @param jsonPaths - JSONPath expressions to update
|
|
4893
|
+
* @param version - New version string
|
|
4894
|
+
* @returns The updated content, previous values, and changed-location count
|
|
4895
|
+
*/
|
|
4896
|
+
private static computeUpdate;
|
|
4897
|
+
/**
|
|
4898
|
+
* Compute the format-preserving edit for a single concrete path, returning
|
|
4899
|
+
* the updated document, or `undefined` when nothing changed.
|
|
4900
|
+
*
|
|
4901
|
+
* @remarks
|
|
4902
|
+
* Delegates to `jsonc-effect`'s {@link modify} + {@link applyEdits}
|
|
4903
|
+
* (requires `jsonc-effect >= 0.3.1`, whose edit spans touch only the target
|
|
4904
|
+
* value), so every other byte of the document is preserved. When the leaf
|
|
4905
|
+
* of a wildcard-free path does not exist, `modify` inserts the property
|
|
4906
|
+
* after the last sibling using the supplied formatting options — the only
|
|
4907
|
+
* case where the detected indent matters. A path whose parent is missing or
|
|
4908
|
+
* not an object cannot be navigated; the resulting modification error is
|
|
4909
|
+
* caught and reported as "no change" so the file is left alone.
|
|
4910
|
+
*
|
|
4911
|
+
* @param content - Current document text
|
|
4912
|
+
* @param concretePath - A wildcard-free `(string | number)[]` path
|
|
4913
|
+
* @param version - New version string
|
|
4914
|
+
* @param indentUnit - One indentation level, for inserted text
|
|
4915
|
+
* @param eol - End-of-line sequence, for inserted text
|
|
4916
|
+
* @returns The updated document, or `undefined` if the path was unchanged
|
|
4917
|
+
*/
|
|
4918
|
+
private static applyVersionEdit;
|
|
4865
4919
|
/**
|
|
4866
4920
|
* Orchestrate the full version file update flow.
|
|
4867
4921
|
*
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@savvy-web/silk-effects",
|
|
3
|
-
"version": "3.0.
|
|
3
|
+
"version": "3.0.3",
|
|
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",
|
|
@@ -33,10 +33,10 @@
|
|
|
33
33
|
"@changesets/get-github-info": "^1.0.0-next.3",
|
|
34
34
|
"@changesets/get-release-plan": "^5.0.0-next.7",
|
|
35
35
|
"@manypkg/get-packages": "^3.1.0",
|
|
36
|
-
"jsonc-effect": "^0.3.
|
|
36
|
+
"jsonc-effect": "^0.3.1",
|
|
37
37
|
"mdast-util-heading-range": "^4.0.0",
|
|
38
38
|
"mdast-util-to-string": "^4.0.0",
|
|
39
|
-
"prettier": "^3.
|
|
39
|
+
"prettier": "^3.9.4",
|
|
40
40
|
"remark-gfm": "^4.0.1",
|
|
41
41
|
"remark-parse": "^11.0.0",
|
|
42
42
|
"remark-stringify": "^11.0.0",
|
|
@@ -47,9 +47,9 @@
|
|
|
47
47
|
"unified": "^11.0.5",
|
|
48
48
|
"unified-lint-rule": "^3.0.1",
|
|
49
49
|
"unist-util-visit": "^5.1.0",
|
|
50
|
-
"workspaces-effect": "^2.0.
|
|
50
|
+
"workspaces-effect": "^2.0.2",
|
|
51
51
|
"yaml": "^2.9.0",
|
|
52
|
-
"yaml-effect": "^0.7.
|
|
52
|
+
"yaml-effect": "^0.7.2",
|
|
53
53
|
"yaml-lint": "^1.7.0"
|
|
54
54
|
},
|
|
55
55
|
"peerDependencies": {
|