@trail-cli/guide-schema 0.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/dist/index.d.ts +4361 -0
- package/dist/index.js +290 -0
- package/dist/index.js.map +1 -0
- package/package.json +37 -0
package/dist/index.js
ADDED
|
@@ -0,0 +1,290 @@
|
|
|
1
|
+
// src/target.ts
|
|
2
|
+
import { z } from "zod";
|
|
3
|
+
var TARGET_STRATEGY_ORDER = [
|
|
4
|
+
"testId",
|
|
5
|
+
"role",
|
|
6
|
+
"label",
|
|
7
|
+
"text",
|
|
8
|
+
"selector"
|
|
9
|
+
];
|
|
10
|
+
var TargetSchema = z.object({
|
|
11
|
+
testId: z.string().min(1).optional(),
|
|
12
|
+
role: z.string().min(1).optional(),
|
|
13
|
+
name: z.string().min(1).optional(),
|
|
14
|
+
label: z.string().min(1).optional(),
|
|
15
|
+
text: z.string().min(1).optional(),
|
|
16
|
+
selector: z.string().min(1).optional()
|
|
17
|
+
}).strict().superRefine((value, ctx) => {
|
|
18
|
+
const hasStrategy = !!value.testId || !!value.role && !!value.name || !!value.label || !!value.text || !!value.selector;
|
|
19
|
+
if (!hasStrategy) {
|
|
20
|
+
ctx.addIssue({
|
|
21
|
+
code: z.ZodIssueCode.custom,
|
|
22
|
+
message: "Target must specify at least one of testId, role+name, label, text, or selector."
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
if (value.role && !value.name) {
|
|
26
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["name"], message: "A role target also requires a name." });
|
|
27
|
+
}
|
|
28
|
+
if (value.name && !value.role) {
|
|
29
|
+
ctx.addIssue({ code: z.ZodIssueCode.custom, path: ["role"], message: "A name target also requires a role." });
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
// src/steps.ts
|
|
34
|
+
import { z as z2 } from "zod";
|
|
35
|
+
var id = z2.string().min(1);
|
|
36
|
+
var instruction = z2.string().min(1);
|
|
37
|
+
var autoAdvance = z2.boolean().optional();
|
|
38
|
+
var ClickStepSchema = z2.object({ id, action: z2.literal("click"), target: TargetSchema, instruction, autoAdvance }).strict();
|
|
39
|
+
var InputStepSchema = z2.object({
|
|
40
|
+
id,
|
|
41
|
+
action: z2.literal("input"),
|
|
42
|
+
target: TargetSchema,
|
|
43
|
+
value: z2.string(),
|
|
44
|
+
instruction,
|
|
45
|
+
autoAdvance
|
|
46
|
+
}).strict();
|
|
47
|
+
var SelectStepSchema = z2.object({
|
|
48
|
+
id,
|
|
49
|
+
action: z2.literal("select"),
|
|
50
|
+
target: TargetSchema,
|
|
51
|
+
value: z2.string(),
|
|
52
|
+
instruction,
|
|
53
|
+
autoAdvance
|
|
54
|
+
}).strict();
|
|
55
|
+
var VerifyStepSchema = z2.object({ id, action: z2.literal("verify"), target: TargetSchema, instruction }).strict();
|
|
56
|
+
var NavigateStepSchema = z2.object({ id, action: z2.literal("navigate"), url: z2.string().min(1), instruction }).strict();
|
|
57
|
+
var WaitStepSchema = z2.object({
|
|
58
|
+
id,
|
|
59
|
+
action: z2.literal("wait"),
|
|
60
|
+
target: TargetSchema.optional(),
|
|
61
|
+
timeoutMs: z2.number().int().positive().optional(),
|
|
62
|
+
instruction
|
|
63
|
+
}).strict();
|
|
64
|
+
var GuideStepSchema = z2.discriminatedUnion("action", [
|
|
65
|
+
ClickStepSchema,
|
|
66
|
+
InputStepSchema,
|
|
67
|
+
SelectStepSchema,
|
|
68
|
+
VerifyStepSchema,
|
|
69
|
+
NavigateStepSchema,
|
|
70
|
+
WaitStepSchema
|
|
71
|
+
]);
|
|
72
|
+
var placementFields = {
|
|
73
|
+
before: z2.string().min(1).optional(),
|
|
74
|
+
after: z2.string().min(1).optional()
|
|
75
|
+
};
|
|
76
|
+
var AuthorGuideStepSchema = z2.discriminatedUnion("action", [
|
|
77
|
+
ClickStepSchema.extend(placementFields),
|
|
78
|
+
InputStepSchema.extend(placementFields),
|
|
79
|
+
SelectStepSchema.extend(placementFields),
|
|
80
|
+
VerifyStepSchema.extend(placementFields),
|
|
81
|
+
NavigateStepSchema.extend(placementFields),
|
|
82
|
+
WaitStepSchema.extend(placementFields)
|
|
83
|
+
]);
|
|
84
|
+
|
|
85
|
+
// src/guide.ts
|
|
86
|
+
import { z as z3 } from "zod";
|
|
87
|
+
var GuideSchema = z3.object({
|
|
88
|
+
id: z3.string().min(1),
|
|
89
|
+
title: z3.string().min(1),
|
|
90
|
+
application: z3.string().min(1),
|
|
91
|
+
release: z3.string().min(1),
|
|
92
|
+
start: z3.object({ url: z3.string().min(1) }).strict(),
|
|
93
|
+
steps: z3.array(GuideStepSchema).min(1, "A guide must contain at least one step.")
|
|
94
|
+
}).passthrough();
|
|
95
|
+
var AuthorGuideSchema = z3.object({
|
|
96
|
+
id: z3.string().min(1),
|
|
97
|
+
title: z3.string().min(1),
|
|
98
|
+
application: z3.string().min(1),
|
|
99
|
+
release: z3.string().min(1),
|
|
100
|
+
start: z3.object({ url: z3.string().min(1) }).strict(),
|
|
101
|
+
extends: z3.string().min(1).optional(),
|
|
102
|
+
steps: z3.array(AuthorGuideStepSchema).min(1, "A guide must contain at least one step.")
|
|
103
|
+
}).passthrough().superRefine((guide, context) => {
|
|
104
|
+
guide.steps.forEach((step, index) => {
|
|
105
|
+
const hasBefore = step.before !== void 0;
|
|
106
|
+
const hasAfter = step.after !== void 0;
|
|
107
|
+
if (hasBefore && hasAfter) {
|
|
108
|
+
context.addIssue({
|
|
109
|
+
code: z3.ZodIssueCode.custom,
|
|
110
|
+
path: ["steps", index],
|
|
111
|
+
message: "An extension step must use either before or after, not both."
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
if (guide.extends && !hasBefore && !hasAfter) {
|
|
115
|
+
context.addIssue({
|
|
116
|
+
code: z3.ZodIssueCode.custom,
|
|
117
|
+
path: ["steps", index],
|
|
118
|
+
message: "An extension step must specify before or after."
|
|
119
|
+
});
|
|
120
|
+
}
|
|
121
|
+
if (!guide.extends && (hasBefore || hasAfter)) {
|
|
122
|
+
context.addIssue({
|
|
123
|
+
code: z3.ZodIssueCode.custom,
|
|
124
|
+
path: ["steps", index],
|
|
125
|
+
message: "before and after are only valid on a guide with extends."
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
// src/parse.ts
|
|
132
|
+
import { parse as parseYamlText } from "yaml";
|
|
133
|
+
function formatPath(path) {
|
|
134
|
+
if (path.length === 0) return "(root)";
|
|
135
|
+
let out = "";
|
|
136
|
+
for (const segment of path) {
|
|
137
|
+
if (typeof segment === "number") {
|
|
138
|
+
out += `[${segment}]`;
|
|
139
|
+
} else {
|
|
140
|
+
out += out ? `.${segment}` : segment;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
return out;
|
|
144
|
+
}
|
|
145
|
+
function issuesFromZodError(error) {
|
|
146
|
+
return error.issues.map((issue) => {
|
|
147
|
+
const path = formatPath(issue.path);
|
|
148
|
+
const lastSegment = issue.path[issue.path.length - 1];
|
|
149
|
+
if (lastSegment === "target" && issue.code === "invalid_type") {
|
|
150
|
+
return { path, message: "Target is required." };
|
|
151
|
+
}
|
|
152
|
+
return { path, message: issue.message };
|
|
153
|
+
});
|
|
154
|
+
}
|
|
155
|
+
function parseData(raw) {
|
|
156
|
+
const result = GuideSchema.safeParse(raw);
|
|
157
|
+
if (!result.success) {
|
|
158
|
+
return { success: false, issues: issuesFromZodError(result.error) };
|
|
159
|
+
}
|
|
160
|
+
return { success: true, guide: result.data };
|
|
161
|
+
}
|
|
162
|
+
function parseAuthorData(raw) {
|
|
163
|
+
const result = AuthorGuideSchema.safeParse(raw);
|
|
164
|
+
if (!result.success) {
|
|
165
|
+
return { success: false, issues: issuesFromZodError(result.error) };
|
|
166
|
+
}
|
|
167
|
+
return { success: true, guide: result.data };
|
|
168
|
+
}
|
|
169
|
+
function parseGuideYaml(yamlText) {
|
|
170
|
+
let raw;
|
|
171
|
+
try {
|
|
172
|
+
raw = parseYamlText(yamlText);
|
|
173
|
+
} catch (error) {
|
|
174
|
+
return {
|
|
175
|
+
success: false,
|
|
176
|
+
issues: [
|
|
177
|
+
{ path: "(yaml)", message: error instanceof Error ? error.message : "Invalid YAML." }
|
|
178
|
+
]
|
|
179
|
+
};
|
|
180
|
+
}
|
|
181
|
+
return parseData(raw);
|
|
182
|
+
}
|
|
183
|
+
function parseAuthorGuideYaml(yamlText) {
|
|
184
|
+
let raw;
|
|
185
|
+
try {
|
|
186
|
+
raw = parseYamlText(yamlText);
|
|
187
|
+
} catch (error) {
|
|
188
|
+
return {
|
|
189
|
+
success: false,
|
|
190
|
+
issues: [
|
|
191
|
+
{ path: "(yaml)", message: error instanceof Error ? error.message : "Invalid YAML." }
|
|
192
|
+
]
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
return parseAuthorData(raw);
|
|
196
|
+
}
|
|
197
|
+
function parseGuideJson(jsonText) {
|
|
198
|
+
let raw;
|
|
199
|
+
try {
|
|
200
|
+
raw = JSON.parse(jsonText);
|
|
201
|
+
} catch (error) {
|
|
202
|
+
return {
|
|
203
|
+
success: false,
|
|
204
|
+
issues: [
|
|
205
|
+
{ path: "(json)", message: error instanceof Error ? error.message : "Invalid JSON." }
|
|
206
|
+
]
|
|
207
|
+
};
|
|
208
|
+
}
|
|
209
|
+
return parseData(raw);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
// src/resolve.ts
|
|
213
|
+
function withoutPlacement(step) {
|
|
214
|
+
const { before: _before, after: _after, ...runtimeStep } = step;
|
|
215
|
+
return runtimeStep;
|
|
216
|
+
}
|
|
217
|
+
function duplicateStepIssue(steps) {
|
|
218
|
+
const ids = /* @__PURE__ */ new Set();
|
|
219
|
+
for (const step of steps) {
|
|
220
|
+
if (ids.has(step.id)) {
|
|
221
|
+
return { path: "steps", message: `Duplicate step id: ${step.id}.` };
|
|
222
|
+
}
|
|
223
|
+
ids.add(step.id);
|
|
224
|
+
}
|
|
225
|
+
return void 0;
|
|
226
|
+
}
|
|
227
|
+
function runtimeGuideData(guide, steps) {
|
|
228
|
+
const { extends: _extends, steps: _steps, ...runtimeGuide } = guide;
|
|
229
|
+
return { ...runtimeGuide, steps };
|
|
230
|
+
}
|
|
231
|
+
function resolveGuide(guide, guidesById, resolving = /* @__PURE__ */ new Set()) {
|
|
232
|
+
var _a;
|
|
233
|
+
if (resolving.has(guide.id)) {
|
|
234
|
+
return { success: false, issues: [{ path: "extends", message: "Guide inheritance cycle detected." }] };
|
|
235
|
+
}
|
|
236
|
+
if (!guide.extends) {
|
|
237
|
+
const steps2 = guide.steps.map(withoutPlacement);
|
|
238
|
+
const duplicateIssue2 = duplicateStepIssue(steps2);
|
|
239
|
+
if (duplicateIssue2) return { success: false, issues: [duplicateIssue2] };
|
|
240
|
+
const parsed2 = GuideSchema.safeParse(runtimeGuideData(guide, steps2));
|
|
241
|
+
return parsed2.success ? { success: true, guide: parsed2.data } : { success: false, issues: parsed2.error.issues.map((issue) => ({ path: issue.path.join("."), message: issue.message })) };
|
|
242
|
+
}
|
|
243
|
+
const base = guidesById.get(guide.extends);
|
|
244
|
+
if (!base) {
|
|
245
|
+
return { success: false, issues: [{ path: "extends", message: `Base guide not found: ${guide.extends}.` }] };
|
|
246
|
+
}
|
|
247
|
+
if (guide.release !== base.release || guide.application !== base.application) {
|
|
248
|
+
return {
|
|
249
|
+
success: false,
|
|
250
|
+
issues: [{ path: "extends", message: "An extension must match its base guide's release and application." }]
|
|
251
|
+
};
|
|
252
|
+
}
|
|
253
|
+
const nextResolving = new Set(resolving);
|
|
254
|
+
nextResolving.add(guide.id);
|
|
255
|
+
const baseResult = resolveGuide(base, guidesById, nextResolving);
|
|
256
|
+
if (!baseResult.success) return baseResult;
|
|
257
|
+
const steps = [...baseResult.guide.steps];
|
|
258
|
+
for (const extensionStep of guide.steps) {
|
|
259
|
+
const anchorId = (_a = extensionStep.before) != null ? _a : extensionStep.after;
|
|
260
|
+
const anchorIndex = steps.findIndex((step) => step.id === anchorId);
|
|
261
|
+
if (anchorIndex === -1) {
|
|
262
|
+
return { success: false, issues: [{ path: "steps", message: `Anchor step not found: ${anchorId}.` }] };
|
|
263
|
+
}
|
|
264
|
+
steps.splice(extensionStep.before ? anchorIndex : anchorIndex + 1, 0, withoutPlacement(extensionStep));
|
|
265
|
+
}
|
|
266
|
+
const duplicateIssue = duplicateStepIssue(steps);
|
|
267
|
+
if (duplicateIssue) return { success: false, issues: [duplicateIssue] };
|
|
268
|
+
const parsed = GuideSchema.safeParse(runtimeGuideData(guide, steps));
|
|
269
|
+
return parsed.success ? { success: true, guide: parsed.data } : { success: false, issues: parsed.error.issues.map((issue) => ({ path: issue.path.join("."), message: issue.message })) };
|
|
270
|
+
}
|
|
271
|
+
export {
|
|
272
|
+
AuthorGuideSchema,
|
|
273
|
+
AuthorGuideStepSchema,
|
|
274
|
+
ClickStepSchema,
|
|
275
|
+
GuideSchema,
|
|
276
|
+
GuideStepSchema,
|
|
277
|
+
InputStepSchema,
|
|
278
|
+
NavigateStepSchema,
|
|
279
|
+
SelectStepSchema,
|
|
280
|
+
TARGET_STRATEGY_ORDER,
|
|
281
|
+
TargetSchema,
|
|
282
|
+
VerifyStepSchema,
|
|
283
|
+
WaitStepSchema,
|
|
284
|
+
issuesFromZodError,
|
|
285
|
+
parseAuthorGuideYaml,
|
|
286
|
+
parseGuideJson,
|
|
287
|
+
parseGuideYaml,
|
|
288
|
+
resolveGuide
|
|
289
|
+
};
|
|
290
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/target.ts","../src/steps.ts","../src/guide.ts","../src/parse.ts","../src/resolve.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\n/**\r\n * Priority order used by the SDK's target resolver, highest priority first.\r\n * A single target may carry more than one hint (e.g. a `testId` with a `selector`\r\n * fallback); the resolver tries them in this order until one matches.\r\n */\r\nexport const TARGET_STRATEGY_ORDER = [\r\n \"testId\",\r\n \"role\",\r\n \"label\",\r\n \"text\",\r\n \"selector\",\r\n] as const;\r\n\r\nexport const TargetSchema = z\r\n .object({\r\n testId: z.string().min(1).optional(),\r\n role: z.string().min(1).optional(),\r\n name: z.string().min(1).optional(),\r\n label: z.string().min(1).optional(),\r\n text: z.string().min(1).optional(),\r\n selector: z.string().min(1).optional(),\r\n })\r\n .strict()\r\n .superRefine((value, ctx) => {\r\n const hasStrategy =\r\n !!value.testId || (!!value.role && !!value.name) || !!value.label || !!value.text || !!value.selector;\r\n if (!hasStrategy) {\r\n ctx.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n message: \"Target must specify at least one of testId, role+name, label, text, or selector.\",\r\n });\r\n }\r\n if (value.role && !value.name) {\r\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"name\"], message: \"A role target also requires a name.\" });\r\n }\r\n if (value.name && !value.role) {\r\n ctx.addIssue({ code: z.ZodIssueCode.custom, path: [\"role\"], message: \"A name target also requires a role.\" });\r\n }\r\n });\r\n\r\nexport type Target = z.infer<typeof TargetSchema>;\r\n","import { z } from \"zod\";\r\nimport { TargetSchema } from \"./target.js\";\r\n\r\nconst id = z.string().min(1);\r\nconst instruction = z.string().min(1);\r\nconst autoAdvance = z.boolean().optional();\r\n\r\nexport const ClickStepSchema = z\r\n .object({ id, action: z.literal(\"click\"), target: TargetSchema, instruction, autoAdvance })\r\n .strict();\r\n\r\nexport const InputStepSchema = z\r\n .object({\r\n id,\r\n action: z.literal(\"input\"),\r\n target: TargetSchema,\r\n value: z.string(),\r\n instruction,\r\n autoAdvance,\r\n })\r\n .strict();\r\n\r\nexport const SelectStepSchema = z\r\n .object({\r\n id,\r\n action: z.literal(\"select\"),\r\n target: TargetSchema,\r\n value: z.string(),\r\n instruction,\r\n autoAdvance,\r\n })\r\n .strict();\r\n\r\nexport const VerifyStepSchema = z\r\n .object({ id, action: z.literal(\"verify\"), target: TargetSchema, instruction })\r\n .strict();\r\n\r\nexport const NavigateStepSchema = z\r\n .object({ id, action: z.literal(\"navigate\"), url: z.string().min(1), instruction })\r\n .strict();\r\n\r\nexport const WaitStepSchema = z\r\n .object({\r\n id,\r\n action: z.literal(\"wait\"),\r\n target: TargetSchema.optional(),\r\n timeoutMs: z.number().int().positive().optional(),\r\n instruction,\r\n })\r\n .strict();\r\n\r\n/** Discriminated union keyed on `action`, so each step carries only the fields it needs. */\r\nexport const GuideStepSchema = z.discriminatedUnion(\"action\", [\r\n ClickStepSchema,\r\n InputStepSchema,\r\n SelectStepSchema,\r\n VerifyStepSchema,\r\n NavigateStepSchema,\r\n WaitStepSchema,\r\n]);\r\n\r\nexport type ClickStep = z.infer<typeof ClickStepSchema>;\r\nexport type InputStep = z.infer<typeof InputStepSchema>;\r\nexport type SelectStep = z.infer<typeof SelectStepSchema>;\r\nexport type VerifyStep = z.infer<typeof VerifyStepSchema>;\r\nexport type NavigateStep = z.infer<typeof NavigateStepSchema>;\r\nexport type WaitStep = z.infer<typeof WaitStepSchema>;\r\nexport type GuideStep = z.infer<typeof GuideStepSchema>;\r\nexport type GuideActionType = GuideStep[\"action\"];\r\n\r\nconst placementFields = {\r\n before: z.string().min(1).optional(),\r\n after: z.string().min(1).optional(),\r\n};\r\n\r\n/** A source-only step that is inserted relative to a step inherited from a base guide. */\r\nexport const AuthorGuideStepSchema = z.discriminatedUnion(\"action\", [\r\n ClickStepSchema.extend(placementFields),\r\n InputStepSchema.extend(placementFields),\r\n SelectStepSchema.extend(placementFields),\r\n VerifyStepSchema.extend(placementFields),\r\n NavigateStepSchema.extend(placementFields),\r\n WaitStepSchema.extend(placementFields),\r\n]);\r\n\r\nexport type AuthorGuideStep = z.infer<typeof AuthorGuideStepSchema>;\r\n","import { z } from \"zod\";\r\nimport { AuthorGuideStepSchema, GuideStepSchema } from \"./steps.js\";\r\n\r\n/**\r\n * `.passthrough()` keeps unknown top-level keys (e.g. future `meta` blocks used by\r\n * a browser recorder) so older guides stay forward-compatible without a schema bump.\r\n */\r\nexport const GuideSchema = z\r\n .object({\r\n id: z.string().min(1),\r\n title: z.string().min(1),\r\n application: z.string().min(1),\r\n release: z.string().min(1),\r\n start: z.object({ url: z.string().min(1) }).strict(),\r\n steps: z.array(GuideStepSchema).min(1, \"A guide must contain at least one step.\"),\r\n })\r\n .passthrough();\r\n\r\nexport type Guide = z.infer<typeof GuideSchema>;\r\n\r\n/**\r\n * Authoring guides may extend another guide from the same release. Extension steps\r\n * are additive and must declare one stable insertion anchor.\r\n */\r\nexport const AuthorGuideSchema = z\r\n .object({\r\n id: z.string().min(1),\r\n title: z.string().min(1),\r\n application: z.string().min(1),\r\n release: z.string().min(1),\r\n start: z.object({ url: z.string().min(1) }).strict(),\r\n extends: z.string().min(1).optional(),\r\n steps: z.array(AuthorGuideStepSchema).min(1, \"A guide must contain at least one step.\"),\r\n })\r\n .passthrough()\r\n .superRefine((guide, context) => {\r\n guide.steps.forEach((step, index) => {\r\n const hasBefore = step.before !== undefined;\r\n const hasAfter = step.after !== undefined;\r\n\r\n if (hasBefore && hasAfter) {\r\n context.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"steps\", index],\r\n message: \"An extension step must use either before or after, not both.\",\r\n });\r\n }\r\n\r\n if (guide.extends && !hasBefore && !hasAfter) {\r\n context.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"steps\", index],\r\n message: \"An extension step must specify before or after.\",\r\n });\r\n }\r\n\r\n if (!guide.extends && (hasBefore || hasAfter)) {\r\n context.addIssue({\r\n code: z.ZodIssueCode.custom,\r\n path: [\"steps\", index],\r\n message: \"before and after are only valid on a guide with extends.\",\r\n });\r\n }\r\n });\r\n });\r\n\r\nexport type AuthorGuide = z.infer<typeof AuthorGuideSchema>;\r\n","import { parse as parseYamlText } from \"yaml\";\r\nimport type { ZodError } from \"zod\";\r\nimport { AuthorGuideSchema, GuideSchema, type AuthorGuide, type Guide } from \"./guide.js\";\r\n\r\nexport interface GuideValidationIssue {\r\n path: string;\r\n message: string;\r\n}\r\n\r\nexport type GuideParseResult =\r\n | { success: true; guide: Guide }\r\n | { success: false; issues: GuideValidationIssue[] };\r\n\r\nexport type AuthorGuideParseResult =\r\n | { success: true; guide: AuthorGuide }\r\n | { success: false; issues: GuideValidationIssue[] };\r\n\r\nfunction formatPath(path: (string | number)[]): string {\r\n if (path.length === 0) return \"(root)\";\r\n let out = \"\";\r\n for (const segment of path) {\r\n if (typeof segment === \"number\") {\r\n out += `[${segment}]`;\r\n } else {\r\n out += out ? `.${segment}` : segment;\r\n }\r\n }\r\n return out;\r\n}\r\n\r\nexport function issuesFromZodError(error: ZodError): GuideValidationIssue[] {\r\n return error.issues.map((issue) => {\r\n const path = formatPath(issue.path);\r\n const lastSegment = issue.path[issue.path.length - 1];\r\n // Give the common \"missing target\" case from the spec a friendlier message.\r\n if (lastSegment === \"target\" && issue.code === \"invalid_type\") {\r\n return { path, message: \"Target is required.\" };\r\n }\r\n return { path, message: issue.message };\r\n });\r\n}\r\n\r\nfunction parseData(raw: unknown): GuideParseResult {\r\n const result = GuideSchema.safeParse(raw);\r\n if (!result.success) {\r\n return { success: false, issues: issuesFromZodError(result.error) };\r\n }\r\n return { success: true, guide: result.data };\r\n}\r\n\r\nfunction parseAuthorData(raw: unknown): AuthorGuideParseResult {\r\n const result = AuthorGuideSchema.safeParse(raw);\r\n if (!result.success) {\r\n return { success: false, issues: issuesFromZodError(result.error) };\r\n }\r\n return { success: true, guide: result.data };\r\n}\r\n\r\nexport function parseGuideYaml(yamlText: string): GuideParseResult {\r\n let raw: unknown;\r\n try {\r\n raw = parseYamlText(yamlText);\r\n } catch (error) {\r\n return {\r\n success: false,\r\n issues: [\r\n { path: \"(yaml)\", message: error instanceof Error ? error.message : \"Invalid YAML.\" },\r\n ],\r\n };\r\n }\r\n return parseData(raw);\r\n}\r\n\r\nexport function parseAuthorGuideYaml(yamlText: string): AuthorGuideParseResult {\r\n let raw: unknown;\r\n try {\r\n raw = parseYamlText(yamlText);\r\n } catch (error) {\r\n return {\r\n success: false,\r\n issues: [\r\n { path: \"(yaml)\", message: error instanceof Error ? error.message : \"Invalid YAML.\" },\r\n ],\r\n };\r\n }\r\n return parseAuthorData(raw);\r\n}\r\n\r\nexport function parseGuideJson(jsonText: string): GuideParseResult {\r\n let raw: unknown;\r\n try {\r\n raw = JSON.parse(jsonText);\r\n } catch (error) {\r\n return {\r\n success: false,\r\n issues: [\r\n { path: \"(json)\", message: error instanceof Error ? error.message : \"Invalid JSON.\" },\r\n ],\r\n };\r\n }\r\n return parseData(raw);\r\n}\r\n","import { GuideSchema, type AuthorGuide, type Guide } from \"./guide.js\";\r\nimport type { GuideStep } from \"./steps.js\";\r\n\r\nexport interface GuideResolutionIssue {\r\n path: string;\r\n message: string;\r\n}\r\n\r\nexport type GuideResolutionResult =\r\n | { success: true; guide: Guide }\r\n | { success: false; issues: GuideResolutionIssue[] };\r\n\r\nfunction withoutPlacement(step: AuthorGuide[\"steps\"][number]): GuideStep {\r\n const { before: _before, after: _after, ...runtimeStep } = step;\r\n return runtimeStep as GuideStep;\r\n}\r\n\r\nfunction duplicateStepIssue(steps: GuideStep[]): GuideResolutionIssue | undefined {\r\n const ids = new Set<string>();\r\n for (const step of steps) {\r\n if (ids.has(step.id)) {\r\n return { path: \"steps\", message: `Duplicate step id: ${step.id}.` };\r\n }\r\n ids.add(step.id);\r\n }\r\n return undefined;\r\n}\r\n\r\nfunction runtimeGuideData(guide: AuthorGuide, steps: GuideStep[]): Omit<AuthorGuide, \"extends\" | \"steps\"> & { steps: GuideStep[] } {\r\n const { extends: _extends, steps: _steps, ...runtimeGuide } = guide;\r\n return { ...runtimeGuide, steps };\r\n}\r\n\r\n/** Resolves an authoring guide and all of its same-release bases into a runtime guide. */\r\nexport function resolveGuide(\r\n guide: AuthorGuide,\r\n guidesById: ReadonlyMap<string, AuthorGuide>,\r\n resolving = new Set<string>(),\r\n): GuideResolutionResult {\r\n if (resolving.has(guide.id)) {\r\n return { success: false, issues: [{ path: \"extends\", message: \"Guide inheritance cycle detected.\" }] };\r\n }\r\n\r\n if (!guide.extends) {\r\n const steps = guide.steps.map(withoutPlacement);\r\n const duplicateIssue = duplicateStepIssue(steps);\r\n if (duplicateIssue) return { success: false, issues: [duplicateIssue] };\r\n const parsed = GuideSchema.safeParse(runtimeGuideData(guide, steps));\r\n return parsed.success\r\n ? { success: true, guide: parsed.data }\r\n : { success: false, issues: parsed.error.issues.map((issue) => ({ path: issue.path.join(\".\"), message: issue.message })) };\r\n }\r\n\r\n const base = guidesById.get(guide.extends);\r\n if (!base) {\r\n return { success: false, issues: [{ path: \"extends\", message: `Base guide not found: ${guide.extends}.` }] };\r\n }\r\n if (guide.release !== base.release || guide.application !== base.application) {\r\n return {\r\n success: false,\r\n issues: [{ path: \"extends\", message: \"An extension must match its base guide's release and application.\" }],\r\n };\r\n }\r\n\r\n const nextResolving = new Set(resolving);\r\n nextResolving.add(guide.id);\r\n const baseResult = resolveGuide(base, guidesById, nextResolving);\r\n if (!baseResult.success) return baseResult;\r\n\r\n const steps = [...baseResult.guide.steps];\r\n for (const extensionStep of guide.steps) {\r\n const anchorId = extensionStep.before ?? extensionStep.after;\r\n const anchorIndex = steps.findIndex((step) => step.id === anchorId);\r\n if (anchorIndex === -1) {\r\n return { success: false, issues: [{ path: \"steps\", message: `Anchor step not found: ${anchorId}.` }] };\r\n }\r\n steps.splice(extensionStep.before ? anchorIndex : anchorIndex + 1, 0, withoutPlacement(extensionStep));\r\n }\r\n\r\n const duplicateIssue = duplicateStepIssue(steps);\r\n if (duplicateIssue) return { success: false, issues: [duplicateIssue] };\r\n const parsed = GuideSchema.safeParse(runtimeGuideData(guide, steps));\r\n return parsed.success\r\n ? { success: true, guide: parsed.data }\r\n : { success: false, issues: parsed.error.issues.map((issue) => ({ path: issue.path.join(\".\"), message: issue.message })) };\r\n}"],"mappings":"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","names":["z","z","z","z","steps","duplicateIssue","parsed"]}
|
package/package.json
ADDED
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
{
|
|
2
|
+
"name": "@trail-cli/guide-schema",
|
|
3
|
+
"version": "0.1.0",
|
|
4
|
+
"publishConfig": {
|
|
5
|
+
"access": "public"
|
|
6
|
+
},
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/ndivhomakhuvha/trail.git"
|
|
10
|
+
},
|
|
11
|
+
"type": "module",
|
|
12
|
+
"main": "./dist/index.js",
|
|
13
|
+
"types": "./dist/index.d.ts",
|
|
14
|
+
"exports": {
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./dist/index.d.ts",
|
|
17
|
+
"import": "./dist/index.js",
|
|
18
|
+
"default": "./dist/index.js"
|
|
19
|
+
}
|
|
20
|
+
},
|
|
21
|
+
"files": [
|
|
22
|
+
"dist"
|
|
23
|
+
],
|
|
24
|
+
"scripts": {
|
|
25
|
+
"build": "tsup",
|
|
26
|
+
"dev": "tsup --watch",
|
|
27
|
+
"typecheck": "tsc --noEmit"
|
|
28
|
+
},
|
|
29
|
+
"dependencies": {
|
|
30
|
+
"yaml": "^2.5.0",
|
|
31
|
+
"zod": "^3.23.8"
|
|
32
|
+
},
|
|
33
|
+
"devDependencies": {
|
|
34
|
+
"tsup": "^8.2.4",
|
|
35
|
+
"typescript": "^5.5.4"
|
|
36
|
+
}
|
|
37
|
+
}
|