@stilhq/core 0.5.0 → 0.6.1
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 +61 -0
- package/dist/changeset/apply.d.ts +11 -0
- package/dist/changeset/apply.d.ts.map +1 -0
- package/dist/changeset/apply.js +239 -0
- package/dist/changeset/apply.js.map +1 -0
- package/dist/changeset/ci-report.d.ts +25 -0
- package/dist/changeset/ci-report.d.ts.map +1 -0
- package/dist/changeset/ci-report.js +206 -0
- package/dist/changeset/ci-report.js.map +1 -0
- package/dist/changeset/classify.d.ts +77 -0
- package/dist/changeset/classify.d.ts.map +1 -0
- package/dist/changeset/classify.js +285 -0
- package/dist/changeset/classify.js.map +1 -0
- package/dist/changeset/cli-gate.d.ts +46 -0
- package/dist/changeset/cli-gate.d.ts.map +1 -0
- package/dist/changeset/cli-gate.js +409 -0
- package/dist/changeset/cli-gate.js.map +1 -0
- package/dist/changeset/conflict.d.ts +11 -0
- package/dist/changeset/conflict.d.ts.map +1 -0
- package/dist/changeset/conflict.js +130 -0
- package/dist/changeset/conflict.js.map +1 -0
- package/dist/changeset/diff-components.d.ts +80 -0
- package/dist/changeset/diff-components.d.ts.map +1 -0
- package/dist/changeset/diff-components.js +264 -0
- package/dist/changeset/diff-components.js.map +1 -0
- package/dist/changeset/diff-text.d.ts +66 -0
- package/dist/changeset/diff-text.d.ts.map +1 -0
- package/dist/changeset/diff-text.js +284 -0
- package/dist/changeset/diff-text.js.map +1 -0
- package/dist/changeset/diff-tokens.d.ts +63 -0
- package/dist/changeset/diff-tokens.d.ts.map +1 -0
- package/dist/changeset/diff-tokens.js +483 -0
- package/dist/changeset/diff-tokens.js.map +1 -0
- package/dist/changeset/impact.d.ts +31 -0
- package/dist/changeset/impact.d.ts.map +1 -0
- package/dist/changeset/impact.js +188 -0
- package/dist/changeset/impact.js.map +1 -0
- package/dist/changeset/pr-body.d.ts +33 -0
- package/dist/changeset/pr-body.d.ts.map +1 -0
- package/dist/changeset/pr-body.js +421 -0
- package/dist/changeset/pr-body.js.map +1 -0
- package/dist/changeset/quality-gate.d.ts +10 -0
- package/dist/changeset/quality-gate.d.ts.map +1 -0
- package/dist/changeset/quality-gate.js +207 -0
- package/dist/changeset/quality-gate.js.map +1 -0
- package/dist/changeset/rollback.d.ts +19 -0
- package/dist/changeset/rollback.d.ts.map +1 -0
- package/dist/changeset/rollback.js +163 -0
- package/dist/changeset/rollback.js.map +1 -0
- package/dist/ci/template-generator.d.ts +22 -0
- package/dist/ci/template-generator.d.ts.map +1 -0
- package/dist/ci/template-generator.js +215 -0
- package/dist/ci/template-generator.js.map +1 -0
- package/dist/core/schema.d.ts +64 -0
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/text.d.ts +45 -0
- package/dist/core/text.d.ts.map +1 -0
- package/dist/core/text.js +189 -0
- package/dist/core/text.js.map +1 -0
- package/dist/gate/engine.d.ts +20 -0
- package/dist/gate/engine.d.ts.map +1 -0
- package/dist/gate/engine.js +109 -0
- package/dist/gate/engine.js.map +1 -0
- package/dist/gate/types.d.ts +76 -0
- package/dist/gate/types.d.ts.map +1 -0
- package/dist/gate/types.js +6 -0
- package/dist/gate/types.js.map +1 -0
- package/dist/index.d.ts +56 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +150 -1
- package/dist/index.js.map +1 -1
- package/dist/pr/comment-manager.d.ts +33 -0
- package/dist/pr/comment-manager.d.ts.map +1 -0
- package/dist/pr/comment-manager.js +137 -0
- package/dist/pr/comment-manager.js.map +1 -0
- package/dist/pr/conflict.d.ts +34 -0
- package/dist/pr/conflict.d.ts.map +1 -0
- package/dist/pr/conflict.js +127 -0
- package/dist/pr/conflict.js.map +1 -0
- package/dist/pr/generator.d.ts +70 -0
- package/dist/pr/generator.d.ts.map +1 -0
- package/dist/pr/generator.js +241 -0
- package/dist/pr/generator.js.map +1 -0
- package/dist/pr/github-api.d.ts +122 -0
- package/dist/pr/github-api.d.ts.map +1 -0
- package/dist/pr/github-api.js +269 -0
- package/dist/pr/github-api.js.map +1 -0
- package/dist/report/changeset-report.d.ts +10 -0
- package/dist/report/changeset-report.d.ts.map +1 -0
- package/dist/report/changeset-report.js +14 -0
- package/dist/report/changeset-report.js.map +1 -0
- package/dist/report/classification-report.d.ts +12 -0
- package/dist/report/classification-report.d.ts.map +1 -0
- package/dist/report/classification-report.js +157 -0
- package/dist/report/classification-report.js.map +1 -0
- package/dist/report/impact-report.d.ts +10 -0
- package/dist/report/impact-report.d.ts.map +1 -0
- package/dist/report/impact-report.js +47 -0
- package/dist/report/impact-report.js.map +1 -0
- package/dist/report/summary-report.d.ts +10 -0
- package/dist/report/summary-report.d.ts.map +1 -0
- package/dist/report/summary-report.js +96 -0
- package/dist/report/summary-report.js.map +1 -0
- package/dist/report/writer.d.ts +17 -0
- package/dist/report/writer.d.ts.map +1 -0
- package/dist/report/writer.js +41 -0
- package/dist/report/writer.js.map +1 -0
- package/dist/rules/engine.d.ts +46 -0
- package/dist/rules/engine.d.ts.map +1 -0
- package/dist/rules/engine.js +200 -0
- package/dist/rules/engine.js.map +1 -0
- package/dist/rules/index.d.ts +10 -0
- package/dist/rules/index.d.ts.map +1 -0
- package/dist/rules/index.js +25 -0
- package/dist/rules/index.js.map +1 -0
- package/dist/rules/loader.d.ts +20 -0
- package/dist/rules/loader.d.ts.map +1 -0
- package/dist/rules/loader.js +93 -0
- package/dist/rules/loader.js.map +1 -0
- package/dist/rules/packs/core.d.ts +14 -0
- package/dist/rules/packs/core.d.ts.map +1 -0
- package/dist/rules/packs/core.js +377 -0
- package/dist/rules/packs/core.js.map +1 -0
- package/dist/rules/schema.d.ts +12 -0
- package/dist/rules/schema.d.ts.map +1 -0
- package/dist/rules/schema.js +149 -0
- package/dist/rules/schema.js.map +1 -0
- package/dist/rules/types.d.ts +86 -0
- package/dist/rules/types.d.ts.map +1 -0
- package/dist/rules/types.js +9 -0
- package/dist/rules/types.js.map +1 -0
- package/dist/types/changeset.d.ts +509 -0
- package/dist/types/changeset.d.ts.map +1 -0
- package/dist/types/changeset.js +14 -0
- package/dist/types/changeset.js.map +1 -0
- package/dist/w3c/__tests__/fixtures/tokens-studio-export.json +58 -0
- package/dist/w3c/parser.d.ts +44 -0
- package/dist/w3c/parser.d.ts.map +1 -0
- package/dist/w3c/parser.js +146 -0
- package/dist/w3c/parser.js.map +1 -0
- package/dist/w3c/types.d.ts +31 -0
- package/dist/w3c/types.d.ts.map +1 -0
- package/dist/w3c/types.js +7 -0
- package/dist/w3c/types.js.map +1 -0
- package/dist/w3c/validator.d.ts +14 -0
- package/dist/w3c/validator.d.ts.map +1 -0
- package/dist/w3c/validator.js +162 -0
- package/dist/w3c/validator.js.map +1 -0
- package/package.json +6 -4
- package/templates/stil-quality-gate.yml +122 -0
- package/templates/workspace/.github/PULL_REQUEST_TEMPLATE.md +14 -0
- package/templates/workspace/.github/workflows/stil-gate.yml +42 -0
- package/templates/workspace/.github/workflows/stil-preview.yml +29 -0
- package/templates/workspace/.stil/components/snapshots/.gitkeep +0 -0
- package/templates/workspace/.stil/reports/.gitkeep +0 -0
- package/templates/workspace/.stil/rules/.gitkeep +0 -0
- package/templates/workspace/.stil/text/snapshots/.gitkeep +0 -0
- package/templates/workspace/.stil/tokens/config/mapping.json +16 -0
- package/templates/workspace/.stil/tokens/raw/.gitkeep +0 -0
- package/templates/workspace/README.md +40 -0
- package/templates/workspace/package.json +19 -0
package/README.md
CHANGED
|
@@ -141,6 +141,67 @@ type ComponentMeta = {
|
|
|
141
141
|
};
|
|
142
142
|
```
|
|
143
143
|
|
|
144
|
+
## Text QA
|
|
145
|
+
|
|
146
|
+
### Basic Usage
|
|
147
|
+
|
|
148
|
+
```typescript
|
|
149
|
+
import { buildTextWithMeta, normalizeTextList } from "@stilhq/core";
|
|
150
|
+
|
|
151
|
+
// Load text snapshot from Figma Plugin
|
|
152
|
+
const snapshot = JSON.parse(fs.readFileSync(".stil/text/snapshots/textlist.json"));
|
|
153
|
+
|
|
154
|
+
// Build with QA validation and metadata
|
|
155
|
+
const { text, meta } = buildTextWithMeta(snapshot);
|
|
156
|
+
|
|
157
|
+
// textlist.dist.json - validated text items
|
|
158
|
+
fs.writeFileSync("textlist.dist.json", JSON.stringify(text, null, 2));
|
|
159
|
+
|
|
160
|
+
// textlist.meta.json - QA issues/warnings/stats
|
|
161
|
+
fs.writeFileSync("textlist.meta.json", JSON.stringify(meta, null, 2));
|
|
162
|
+
```
|
|
163
|
+
|
|
164
|
+
### QA Rules (v1)
|
|
165
|
+
|
|
166
|
+
Text items are validated with the following rules:
|
|
167
|
+
- **Empty text**: Text is empty or whitespace-only (Error)
|
|
168
|
+
- **Duplicates**: Same text appears in multiple locations (Info)
|
|
169
|
+
- **Too long**: Text exceeds 500 characters (Warning)
|
|
170
|
+
- **Too short**: Single character text (Info)
|
|
171
|
+
- **Invalid characters**: Contains control characters except tab/newline (Warning)
|
|
172
|
+
|
|
173
|
+
**QA issues** are:
|
|
174
|
+
- Recorded in `textlist.meta.json` with details
|
|
175
|
+
- Displayed in Storybook QA report
|
|
176
|
+
- Non-fatal: CI passes even with issues (v1 policy)
|
|
177
|
+
|
|
178
|
+
### Text Metadata
|
|
179
|
+
|
|
180
|
+
```typescript
|
|
181
|
+
type TextMeta = {
|
|
182
|
+
issues: {
|
|
183
|
+
emptyText: Array<{ nodeId: string; nodePath?: string }>;
|
|
184
|
+
duplicates: Array<{
|
|
185
|
+
text: string;
|
|
186
|
+
count: number;
|
|
187
|
+
locations: Array<{ nodeId: string; nodePath?: string }>;
|
|
188
|
+
}>;
|
|
189
|
+
tooLong: Array<{ nodeId: string; text: string; length: number }>;
|
|
190
|
+
tooShort: Array<{ nodeId: string; text: string }>;
|
|
191
|
+
invalidChars: Array<{ nodeId: string; text: string; issue: string }>;
|
|
192
|
+
};
|
|
193
|
+
warnings: string[];
|
|
194
|
+
stats: {
|
|
195
|
+
totalItems: number;
|
|
196
|
+
validItems: number;
|
|
197
|
+
itemsWithIssues: number;
|
|
198
|
+
uniqueTexts: number;
|
|
199
|
+
emptyCount: number;
|
|
200
|
+
duplicateCount: number;
|
|
201
|
+
};
|
|
202
|
+
};
|
|
203
|
+
```
|
|
204
|
+
|
|
144
205
|
## Status
|
|
145
206
|
|
|
146
207
|
0.x — API is not yet stable. Breaking changes may occur in minor versions.
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ChangeSet, ApplyOptions, ApplyResult } from "../types/changeset";
|
|
2
|
+
/**
|
|
3
|
+
* ChangeSet から ApplyResult を生成する。
|
|
4
|
+
*
|
|
5
|
+
* - classification が blocked → status: 'blocked'
|
|
6
|
+
* - classification が review → Apply 可能だが確認メッセージ付き
|
|
7
|
+
* - dryRun: true → status: 'dry-run-complete'
|
|
8
|
+
* - maxItems 超過 → status: 'blocked'
|
|
9
|
+
*/
|
|
10
|
+
export declare function generateApplyPlan(changeset: ChangeSet, options: ApplyOptions): ApplyResult;
|
|
11
|
+
//# sourceMappingURL=apply.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.d.ts","sourceRoot":"","sources":["../../src/changeset/apply.ts"],"names":[],"mappings":"AAUA,OAAO,KAAK,EACV,SAAS,EAIT,YAAY,EACZ,WAAW,EAKZ,MAAM,oBAAoB,CAAC;AAa5B;;;;;;;GAOG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,EACpB,OAAO,EAAE,YAAY,GACpB,WAAW,CAgEb"}
|
|
@@ -0,0 +1,239 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// apply.ts — Apply Plan Generator
|
|
3
|
+
//
|
|
4
|
+
// ChangeSet から ApplyPlan を生成するロジック。
|
|
5
|
+
// ApplyPlan は「何を、どの順で適用するか」のステップリスト。
|
|
6
|
+
//
|
|
7
|
+
// ARCHITECTURE_V1.md Section 4 に基づく安全ガード:
|
|
8
|
+
// - dry-run 必須化
|
|
9
|
+
// - 大量変更ブロック
|
|
10
|
+
// - before 値記録(rollback 用)
|
|
11
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
+
exports.generateApplyPlan = generateApplyPlan;
|
|
13
|
+
const rollback_1 = require("./rollback");
|
|
14
|
+
// ========================================
|
|
15
|
+
// Constants
|
|
16
|
+
// ========================================
|
|
17
|
+
const DEFAULT_MAX_ITEMS = 50;
|
|
18
|
+
// ========================================
|
|
19
|
+
// Core: generateApplyPlan
|
|
20
|
+
// ========================================
|
|
21
|
+
/**
|
|
22
|
+
* ChangeSet から ApplyResult を生成する。
|
|
23
|
+
*
|
|
24
|
+
* - classification が blocked → status: 'blocked'
|
|
25
|
+
* - classification が review → Apply 可能だが確認メッセージ付き
|
|
26
|
+
* - dryRun: true → status: 'dry-run-complete'
|
|
27
|
+
* - maxItems 超過 → status: 'blocked'
|
|
28
|
+
*/
|
|
29
|
+
function generateApplyPlan(changeset, options) {
|
|
30
|
+
const maxItems = options.maxItems ?? DEFAULT_MAX_ITEMS;
|
|
31
|
+
const blockedReasons = [];
|
|
32
|
+
// 1. Classification check
|
|
33
|
+
if (changeset.classification === "blocked") {
|
|
34
|
+
blockedReasons.push(...extractBlockedReasons(changeset));
|
|
35
|
+
return buildBlockedResult(changeset, blockedReasons);
|
|
36
|
+
}
|
|
37
|
+
// 2. Max items check
|
|
38
|
+
const itemCount = changeset.items.length;
|
|
39
|
+
if (itemCount > maxItems) {
|
|
40
|
+
blockedReasons.push(`変更件数が閾値を超過しています (${itemCount} > ${maxItems})。分割して適用してください。`);
|
|
41
|
+
return buildBlockedResult(changeset, blockedReasons);
|
|
42
|
+
}
|
|
43
|
+
// 3. Text lane: file-wide scope is blocked
|
|
44
|
+
if (changeset.lane === "text" && options.scope === "file") {
|
|
45
|
+
blockedReasons.push("ファイル全体の Text 置換はブロックされています。selection / frame / page を指定してください。");
|
|
46
|
+
return buildBlockedResult(changeset, blockedReasons);
|
|
47
|
+
}
|
|
48
|
+
// 4. Generate steps
|
|
49
|
+
const steps = generateSteps(changeset, options);
|
|
50
|
+
// 5. Build plan
|
|
51
|
+
const plan = {
|
|
52
|
+
steps,
|
|
53
|
+
estimatedChanges: steps.length,
|
|
54
|
+
requiresReview: changeset.classification === "review",
|
|
55
|
+
blockedReasons: [],
|
|
56
|
+
};
|
|
57
|
+
// 6. Build summary
|
|
58
|
+
const summary = buildSummary(changeset, steps);
|
|
59
|
+
// 7. Build rollback data
|
|
60
|
+
const rollbackData = (0, rollback_1.createRollbackData)(changeset);
|
|
61
|
+
// 8. Determine status
|
|
62
|
+
if (options.dryRun) {
|
|
63
|
+
return {
|
|
64
|
+
status: "dry-run-complete",
|
|
65
|
+
plan,
|
|
66
|
+
summary,
|
|
67
|
+
blockedReasons: [],
|
|
68
|
+
rollbackData,
|
|
69
|
+
};
|
|
70
|
+
}
|
|
71
|
+
return {
|
|
72
|
+
status: "ready",
|
|
73
|
+
plan,
|
|
74
|
+
summary,
|
|
75
|
+
blockedReasons: [],
|
|
76
|
+
rollbackData,
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
// ========================================
|
|
80
|
+
// Step generation per lane
|
|
81
|
+
// ========================================
|
|
82
|
+
function generateSteps(changeset, options) {
|
|
83
|
+
switch (changeset.lane) {
|
|
84
|
+
case "tokens":
|
|
85
|
+
return generateTokenSteps(changeset.items, changeset.direction, options);
|
|
86
|
+
case "text":
|
|
87
|
+
return generateTextSteps(changeset.items, changeset.direction, options);
|
|
88
|
+
case "components":
|
|
89
|
+
return generateComponentSteps(changeset.items, changeset.direction, options);
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
function generateTokenSteps(items, direction, options) {
|
|
93
|
+
return items.map((item) => {
|
|
94
|
+
const action = resolveTokenAction(item, direction, options);
|
|
95
|
+
const before = item.before ?? "(new)";
|
|
96
|
+
const after = item.after ?? "(deleted)";
|
|
97
|
+
return {
|
|
98
|
+
action,
|
|
99
|
+
target: item.tokenKey,
|
|
100
|
+
preview: `${before} → ${after}`,
|
|
101
|
+
};
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
function resolveTokenAction(item, direction, options) {
|
|
105
|
+
if (item.changeType === "RENAME")
|
|
106
|
+
return "rename-token";
|
|
107
|
+
if (item.changeType === "MOVE")
|
|
108
|
+
return "move-token";
|
|
109
|
+
if (item.changeType === "ALIAS")
|
|
110
|
+
return "update-alias";
|
|
111
|
+
if (direction === "code-to-figma") {
|
|
112
|
+
return options.enterprise
|
|
113
|
+
? "rest-api-variable-write"
|
|
114
|
+
: "plugin-api-variable-write";
|
|
115
|
+
}
|
|
116
|
+
return "update-token-value";
|
|
117
|
+
}
|
|
118
|
+
function generateTextSteps(items, direction, _options) {
|
|
119
|
+
return items.map((item) => {
|
|
120
|
+
const action = direction === "code-to-figma"
|
|
121
|
+
? "replace-figma-text"
|
|
122
|
+
: item.changeType === "KEY_BINDING"
|
|
123
|
+
? "bind-i18n-key"
|
|
124
|
+
: "update-text-content";
|
|
125
|
+
const before = item.before ?? "(new)";
|
|
126
|
+
const after = item.after ?? "(deleted)";
|
|
127
|
+
return {
|
|
128
|
+
action,
|
|
129
|
+
target: `${item.i18nKey}#${item.locale}`,
|
|
130
|
+
preview: `${before} → ${after}`,
|
|
131
|
+
};
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
function generateComponentSteps(items, direction, _options) {
|
|
135
|
+
return items.map((item) => {
|
|
136
|
+
const action = resolveComponentAction(item, direction);
|
|
137
|
+
const preview = describeVariantChange(item);
|
|
138
|
+
return {
|
|
139
|
+
action,
|
|
140
|
+
target: item.componentId,
|
|
141
|
+
preview,
|
|
142
|
+
};
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
function resolveComponentAction(item, direction) {
|
|
146
|
+
if (direction === "code-to-figma") {
|
|
147
|
+
switch (item.changeType) {
|
|
148
|
+
case "VARIANT_ADD":
|
|
149
|
+
return "add-figma-variant";
|
|
150
|
+
case "VARIANT_REMOVE":
|
|
151
|
+
return "propose-remove-variant";
|
|
152
|
+
case "VARIANT_RENAME":
|
|
153
|
+
return "propose-rename-variant";
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
switch (item.changeType) {
|
|
157
|
+
case "VARIANT_ADD":
|
|
158
|
+
return "add-code-variant";
|
|
159
|
+
case "VARIANT_REMOVE":
|
|
160
|
+
return "remove-code-variant";
|
|
161
|
+
case "VARIANT_RENAME":
|
|
162
|
+
return "rename-code-variant";
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
function describeVariantChange(item) {
|
|
166
|
+
const parts = [];
|
|
167
|
+
for (const [prop, values] of Object.entries(item.variantProps.added)) {
|
|
168
|
+
parts.push(`+${prop}: [${values.join(", ")}]`);
|
|
169
|
+
}
|
|
170
|
+
for (const [prop, values] of Object.entries(item.variantProps.removed)) {
|
|
171
|
+
parts.push(`-${prop}: [${values.join(", ")}]`);
|
|
172
|
+
}
|
|
173
|
+
for (const [oldName, newName] of Object.entries(item.variantProps.renamed)) {
|
|
174
|
+
parts.push(`${oldName} → ${newName}`);
|
|
175
|
+
}
|
|
176
|
+
return parts.join("; ") || item.changeType;
|
|
177
|
+
}
|
|
178
|
+
// ========================================
|
|
179
|
+
// Helpers
|
|
180
|
+
// ========================================
|
|
181
|
+
function extractBlockedReasons(changeset) {
|
|
182
|
+
const reasons = [];
|
|
183
|
+
// Extract from checksSummary errors
|
|
184
|
+
if (changeset.checksSummary.errors > 0) {
|
|
185
|
+
for (const check of changeset.checksSummary.checks) {
|
|
186
|
+
if (check.severity === "error") {
|
|
187
|
+
reasons.push(check.message);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
// Extract from existing applyPlan blocked reasons
|
|
192
|
+
if (changeset.applyPlan.blockedReasons.length > 0) {
|
|
193
|
+
reasons.push(...changeset.applyPlan.blockedReasons);
|
|
194
|
+
}
|
|
195
|
+
if (reasons.length === 0) {
|
|
196
|
+
reasons.push("ChangeSet の classification が blocked です。手動修正が必要です。");
|
|
197
|
+
}
|
|
198
|
+
return reasons;
|
|
199
|
+
}
|
|
200
|
+
function buildBlockedResult(changeset, blockedReasons) {
|
|
201
|
+
return {
|
|
202
|
+
status: "blocked",
|
|
203
|
+
plan: {
|
|
204
|
+
steps: [],
|
|
205
|
+
estimatedChanges: 0,
|
|
206
|
+
requiresReview: false,
|
|
207
|
+
blockedReasons,
|
|
208
|
+
},
|
|
209
|
+
summary: {
|
|
210
|
+
totalItems: changeset.items.length,
|
|
211
|
+
byAction: {},
|
|
212
|
+
reviewMessages: [],
|
|
213
|
+
},
|
|
214
|
+
blockedReasons,
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
function buildSummary(changeset, steps) {
|
|
218
|
+
const byAction = {};
|
|
219
|
+
for (const step of steps) {
|
|
220
|
+
byAction[step.action] = (byAction[step.action] || 0) + 1;
|
|
221
|
+
}
|
|
222
|
+
const reviewMessages = [];
|
|
223
|
+
if (changeset.classification === "review") {
|
|
224
|
+
reviewMessages.push(`この ChangeSet は review 分類です。${steps.length} 件の変更を確認してください。`);
|
|
225
|
+
if (changeset.checksSummary.warnings > 0) {
|
|
226
|
+
for (const check of changeset.checksSummary.checks) {
|
|
227
|
+
if (check.severity === "warning") {
|
|
228
|
+
reviewMessages.push(`⚠️ ${check.message}`);
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
return {
|
|
234
|
+
totalItems: steps.length,
|
|
235
|
+
byAction,
|
|
236
|
+
reviewMessages,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
//# sourceMappingURL=apply.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"apply.js","sourceRoot":"","sources":["../../src/changeset/apply.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { QualityGateResult } from "../types/changeset";
|
|
2
|
+
import type { GateResult } from "../gate/types";
|
|
3
|
+
/**
|
|
4
|
+
* Quality Gate 結果を CI ログ用テキスト形式にフォーマットする。
|
|
5
|
+
*/
|
|
6
|
+
export declare function formatCILog(result: QualityGateResult): string;
|
|
7
|
+
/**
|
|
8
|
+
* Quality Gate 結果を PR コメント用 Markdown にフォーマットする。
|
|
9
|
+
*/
|
|
10
|
+
export declare function formatPRComment(result: QualityGateResult): string;
|
|
11
|
+
/**
|
|
12
|
+
* Quality Gate 結果を GitHub Actions annotation 形式にフォーマットする。
|
|
13
|
+
*
|
|
14
|
+
* ::error / ::warning の形式で出力。
|
|
15
|
+
* GitHub Actions が自動的にアノテーションとして表示する。
|
|
16
|
+
*/
|
|
17
|
+
export declare function formatGHAnnotations(result: QualityGateResult): string;
|
|
18
|
+
/**
|
|
19
|
+
* Format GateResult as GitHub Actions annotations.
|
|
20
|
+
*
|
|
21
|
+
* Uses ::error / ::warning / ::notice format.
|
|
22
|
+
* This is an alternative to formatGHAnnotations() which takes QualityGateResult.
|
|
23
|
+
*/
|
|
24
|
+
export declare function formatAsGitHubAnnotations(gateResult: GateResult): string;
|
|
25
|
+
//# sourceMappingURL=ci-report.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-report.d.ts","sourceRoot":"","sources":["../../src/changeset/ci-report.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAMhD;;GAEG;AACH,wBAAgB,WAAW,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CA4C7D;AAMD;;GAEG;AACH,wBAAgB,eAAe,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAqEjE;AAMD;;;;;GAKG;AACH,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,iBAAiB,GAAG,MAAM,CAiDrE;AAuBD;;;;;GAKG;AACH,wBAAgB,yBAAyB,CAAC,UAAU,EAAE,UAAU,GAAG,MAAM,CAyCxE"}
|
|
@@ -0,0 +1,206 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// ci-report.ts — CI Report Formatter
|
|
3
|
+
//
|
|
4
|
+
// Quality Gate の結果を CI ログ、PR コメント、GitHub Actions annotation 用に
|
|
5
|
+
// フォーマットするユーティリティ。
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.formatCILog = formatCILog;
|
|
8
|
+
exports.formatPRComment = formatPRComment;
|
|
9
|
+
exports.formatGHAnnotations = formatGHAnnotations;
|
|
10
|
+
exports.formatAsGitHubAnnotations = formatAsGitHubAnnotations;
|
|
11
|
+
// ========================================
|
|
12
|
+
// CI Log format(テキスト形式)
|
|
13
|
+
// ========================================
|
|
14
|
+
/**
|
|
15
|
+
* Quality Gate 結果を CI ログ用テキスト形式にフォーマットする。
|
|
16
|
+
*/
|
|
17
|
+
function formatCILog(result) {
|
|
18
|
+
const lines = [];
|
|
19
|
+
lines.push("═══ Stil Quality Gate ═══");
|
|
20
|
+
lines.push(`Result: ${result.passed ? "PASS ✅" : "FAIL ❌"}`);
|
|
21
|
+
lines.push("");
|
|
22
|
+
// Summary
|
|
23
|
+
lines.push("Summary:");
|
|
24
|
+
lines.push(` Total ChangeSets: ${result.summary.total}`);
|
|
25
|
+
lines.push(` Safe: ${result.summary.safe} ✅`);
|
|
26
|
+
lines.push(` Review: ${result.summary.review} ⚠️`);
|
|
27
|
+
lines.push(` Blocked: ${result.summary.blocked} 🚫`);
|
|
28
|
+
// Failed checks
|
|
29
|
+
if (result.summary.failed.length > 0) {
|
|
30
|
+
lines.push("");
|
|
31
|
+
lines.push("Failed checks:");
|
|
32
|
+
for (const reason of result.summary.failed) {
|
|
33
|
+
lines.push(` ${reason}`);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
// Details per changeset
|
|
37
|
+
if (result.details.length > 0) {
|
|
38
|
+
lines.push("");
|
|
39
|
+
lines.push("Details:");
|
|
40
|
+
for (const detail of result.details) {
|
|
41
|
+
const icon = detail.passed ? "✅" : "❌";
|
|
42
|
+
lines.push(` ${icon} ${detail.changesetId} [${detail.lane}] → ${detail.classification}`);
|
|
43
|
+
if (detail.reason) {
|
|
44
|
+
lines.push(` Reason: ${detail.reason}`);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
lines.push("");
|
|
49
|
+
lines.push("═══════════════════════════");
|
|
50
|
+
return lines.join("\n");
|
|
51
|
+
}
|
|
52
|
+
// ========================================
|
|
53
|
+
// PR Comment format(Markdown 形式)
|
|
54
|
+
// ========================================
|
|
55
|
+
/**
|
|
56
|
+
* Quality Gate 結果を PR コメント用 Markdown にフォーマットする。
|
|
57
|
+
*/
|
|
58
|
+
function formatPRComment(result) {
|
|
59
|
+
const lines = [];
|
|
60
|
+
// Header
|
|
61
|
+
const statusBadge = result.passed ? "✅ PASS" : "❌ FAIL";
|
|
62
|
+
lines.push(`## Stil Quality Gate: ${statusBadge}`);
|
|
63
|
+
lines.push("");
|
|
64
|
+
// Summary table
|
|
65
|
+
lines.push("### Summary");
|
|
66
|
+
lines.push("| Metric | Count |");
|
|
67
|
+
lines.push("|--------|-------|");
|
|
68
|
+
lines.push(`| Total ChangeSets | ${result.summary.total} |`);
|
|
69
|
+
lines.push(`| Safe ✅ | ${result.summary.safe} |`);
|
|
70
|
+
lines.push(`| Review ⚠️ | ${result.summary.review} |`);
|
|
71
|
+
lines.push(`| Blocked 🚫 | ${result.summary.blocked} |`);
|
|
72
|
+
// Failed checks
|
|
73
|
+
if (result.summary.failed.length > 0) {
|
|
74
|
+
lines.push("");
|
|
75
|
+
lines.push("### Failed Checks");
|
|
76
|
+
for (const reason of result.summary.failed) {
|
|
77
|
+
lines.push(`- ${reason}`);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
// Details
|
|
81
|
+
if (result.details.length > 0) {
|
|
82
|
+
lines.push("");
|
|
83
|
+
lines.push("### Details");
|
|
84
|
+
lines.push("| ChangeSet | Lane | Classification | Status |");
|
|
85
|
+
lines.push("|-----------|------|----------------|--------|");
|
|
86
|
+
for (const detail of result.details) {
|
|
87
|
+
const status = detail.passed ? "✅ Pass" : "❌ Fail";
|
|
88
|
+
lines.push(`| \`${detail.changesetId}\` | ${detail.lane} | ${formatClassification(detail.classification)} | ${status} |`);
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
// Error details with checks
|
|
92
|
+
const failedDetails = result.details.filter((d) => !d.passed);
|
|
93
|
+
if (failedDetails.length > 0) {
|
|
94
|
+
lines.push("");
|
|
95
|
+
lines.push("### Error Details");
|
|
96
|
+
for (const detail of failedDetails) {
|
|
97
|
+
lines.push(`\n**\`${detail.changesetId}\`** [${detail.lane}]`);
|
|
98
|
+
if (detail.reason) {
|
|
99
|
+
lines.push(`> ${detail.reason}`);
|
|
100
|
+
}
|
|
101
|
+
const errorChecks = detail.checks.filter((c) => c.severity === "error");
|
|
102
|
+
if (errorChecks.length > 0) {
|
|
103
|
+
for (const check of errorChecks) {
|
|
104
|
+
lines.push(`- ❌ ${check.message}${check.target ? ` (\`${check.target}\`)` : ""}`);
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
lines.push("");
|
|
110
|
+
lines.push("---\nGenerated by [Stil Quality Gate](https://github.com/techang/stil-systems)");
|
|
111
|
+
return lines.join("\n");
|
|
112
|
+
}
|
|
113
|
+
// ========================================
|
|
114
|
+
// GitHub Actions Annotations format
|
|
115
|
+
// ========================================
|
|
116
|
+
/**
|
|
117
|
+
* Quality Gate 結果を GitHub Actions annotation 形式にフォーマットする。
|
|
118
|
+
*
|
|
119
|
+
* ::error / ::warning の形式で出力。
|
|
120
|
+
* GitHub Actions が自動的にアノテーションとして表示する。
|
|
121
|
+
*/
|
|
122
|
+
function formatGHAnnotations(result) {
|
|
123
|
+
const lines = [];
|
|
124
|
+
for (const detail of result.details) {
|
|
125
|
+
if (detail.classification === "blocked") {
|
|
126
|
+
lines.push(`::error title=Stil Quality Gate::Blocked ChangeSet detected: ${detail.changesetId} [${detail.lane}]${detail.reason ? " - " + detail.reason : ""}`);
|
|
127
|
+
}
|
|
128
|
+
if (detail.classification === "review") {
|
|
129
|
+
lines.push(`::warning title=Stil Quality Gate::Review required: ${detail.changesetId} [${detail.lane}] needs manual approval`);
|
|
130
|
+
}
|
|
131
|
+
// Individual error checks
|
|
132
|
+
const errorChecks = detail.checks.filter((c) => c.severity === "error");
|
|
133
|
+
for (const check of errorChecks) {
|
|
134
|
+
lines.push(`::error title=Stil Quality Gate [${check.lane}]::${check.message}${check.target ? " (" + check.target + ")" : ""}`);
|
|
135
|
+
}
|
|
136
|
+
// Individual warning checks
|
|
137
|
+
const warningChecks = detail.checks.filter((c) => c.severity === "warning");
|
|
138
|
+
for (const check of warningChecks) {
|
|
139
|
+
lines.push(`::warning title=Stil Quality Gate [${check.lane}]::${check.message}${check.target ? " (" + check.target + ")" : ""}`);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
// Overall result
|
|
143
|
+
if (result.passed) {
|
|
144
|
+
lines.push(`::notice title=Stil Quality Gate::Quality gate passed (${result.summary.total} changeset(s) checked)`);
|
|
145
|
+
}
|
|
146
|
+
else {
|
|
147
|
+
lines.push(`::error title=Stil Quality Gate::Quality gate FAILED - ${result.summary.failed.length} issue(s) found`);
|
|
148
|
+
}
|
|
149
|
+
return lines.join("\n");
|
|
150
|
+
}
|
|
151
|
+
// ========================================
|
|
152
|
+
// Helpers
|
|
153
|
+
// ========================================
|
|
154
|
+
function formatClassification(classification) {
|
|
155
|
+
switch (classification) {
|
|
156
|
+
case "safe":
|
|
157
|
+
return "safe ✅";
|
|
158
|
+
case "review":
|
|
159
|
+
return "review ⚠️";
|
|
160
|
+
case "blocked":
|
|
161
|
+
return "blocked 🚫";
|
|
162
|
+
default:
|
|
163
|
+
return classification;
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
// ========================================
|
|
167
|
+
// GitHub Annotations from GateResult
|
|
168
|
+
// ========================================
|
|
169
|
+
/**
|
|
170
|
+
* Format GateResult as GitHub Actions annotations.
|
|
171
|
+
*
|
|
172
|
+
* Uses ::error / ::warning / ::notice format.
|
|
173
|
+
* This is an alternative to formatGHAnnotations() which takes QualityGateResult.
|
|
174
|
+
*/
|
|
175
|
+
function formatAsGitHubAnnotations(gateResult) {
|
|
176
|
+
const lines = [];
|
|
177
|
+
const cls = gateResult.classification;
|
|
178
|
+
// Blocked items
|
|
179
|
+
for (const item of cls.items) {
|
|
180
|
+
if (item.classification === "blocked") {
|
|
181
|
+
const reasons = item.reasons.length > 0
|
|
182
|
+
? ` - ${item.reasons.join(", ")}`
|
|
183
|
+
: "";
|
|
184
|
+
lines.push(`::error title=Stil Gate::Blocked: ${item.itemId}${reasons}`);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
// Review items
|
|
188
|
+
for (const item of cls.items) {
|
|
189
|
+
if (item.classification === "review") {
|
|
190
|
+
const reasons = item.reasons.length > 0
|
|
191
|
+
? ` - ${item.reasons.join(", ")}`
|
|
192
|
+
: "";
|
|
193
|
+
lines.push(`::warning title=Stil Gate::Review required: ${item.itemId}${reasons}`);
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
// Overall result
|
|
197
|
+
if (gateResult.passed) {
|
|
198
|
+
lines.push(`::notice title=Stil Gate::Gate PASSED (mode: ${gateResult.mode})`);
|
|
199
|
+
}
|
|
200
|
+
else {
|
|
201
|
+
const failReasons = gateResult.reasons.join(", ");
|
|
202
|
+
lines.push(`::error title=Stil Gate::Gate FAILED (mode: ${gateResult.mode}) - ${failReasons}`);
|
|
203
|
+
}
|
|
204
|
+
return lines.join("\n");
|
|
205
|
+
}
|
|
206
|
+
//# sourceMappingURL=ci-report.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ci-report.js","sourceRoot":"","sources":["../../src/changeset/ci-report.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
import type { ChangeSet, ChangeSetTokenItem, ChangeSetTextItem, ChangeSetComponentItem, Classification, ClassificationThresholds, TokenClassificationContext, TextClassificationContext, ComponentClassificationContext, ClassificationContext } from "../types/changeset";
|
|
2
|
+
import type { RulePack } from "../rules/types";
|
|
3
|
+
/**
|
|
4
|
+
* Tokens レーンの分類判定
|
|
5
|
+
*
|
|
6
|
+
* 判定フロー(CHANGESET_SPEC.md 付録参照):
|
|
7
|
+
* 1. alias 参照先が存在しない → BLOCKED
|
|
8
|
+
* 2. key が衝突 → BLOCKED
|
|
9
|
+
* 3. RENAME/MOVE で参照が壊れる → BLOCKED
|
|
10
|
+
* 4. collection/mode の構造変更 → BLOCKED
|
|
11
|
+
* 5. critical tag (foundation.*, brand.*) → REVIEW
|
|
12
|
+
* 6. alias 参照先の変更 → REVIEW
|
|
13
|
+
* 7. 影響ノード > 閾値 → REVIEW
|
|
14
|
+
* 8. それ以外 → SAFE
|
|
15
|
+
*/
|
|
16
|
+
export declare function classifyTokens(ctx: TokenClassificationContext, thresholds?: ClassificationThresholds): Classification;
|
|
17
|
+
/**
|
|
18
|
+
* Text レーンの分類判定
|
|
19
|
+
*
|
|
20
|
+
* 判定フロー(CHANGESET_SPEC.md 付録参照):
|
|
21
|
+
* 1. placeholder 不一致 → BLOCKED
|
|
22
|
+
* 2. スコープ内に未バインドノード → BLOCKED
|
|
23
|
+
* 3. locale が定義されていない → BLOCKED
|
|
24
|
+
* 4. i18nKey 衝突 → BLOCKED
|
|
25
|
+
* 5. 文字列長差分 > 閾値 → REVIEW
|
|
26
|
+
* 6. 改行の増減がある → REVIEW
|
|
27
|
+
* 7. 新規 placeholder 追加 → REVIEW
|
|
28
|
+
* 8. それ以外 → SAFE
|
|
29
|
+
*/
|
|
30
|
+
export declare function classifyText(ctx: TextClassificationContext, thresholds?: ClassificationThresholds): Classification;
|
|
31
|
+
/**
|
|
32
|
+
* Components レーンの分類判定
|
|
33
|
+
*
|
|
34
|
+
* 判定フロー(CHANGESET_SPEC.md 付録参照):
|
|
35
|
+
* 1. figmaComponentKey が Figma に存在しない → BLOCKED
|
|
36
|
+
* 2. componentId マッピングが存在しない → BLOCKED
|
|
37
|
+
* 3. variant の型定義が壊れる → BLOCKED
|
|
38
|
+
* 4. variant 値の削除 → REVIEW
|
|
39
|
+
* 5. variant 値のリネーム → REVIEW
|
|
40
|
+
* 6. slot 追加/削除 → REVIEW
|
|
41
|
+
* 7. それ以外 → SAFE
|
|
42
|
+
*/
|
|
43
|
+
export declare function classifyComponents(ctx: ComponentClassificationContext): Classification;
|
|
44
|
+
/**
|
|
45
|
+
* ClassificationContext からレーン別に分類を判定する
|
|
46
|
+
*/
|
|
47
|
+
export declare function classifyByContext(classCtx: ClassificationContext, thresholds?: ClassificationThresholds): Classification;
|
|
48
|
+
/**
|
|
49
|
+
* TokenItem 配列から TokenClassificationContext を推定
|
|
50
|
+
*
|
|
51
|
+
* 外部からの参照情報(alias 存在確認等)は引数で渡す。
|
|
52
|
+
* items のみから判定できるフィールドを自動推定する。
|
|
53
|
+
*/
|
|
54
|
+
export declare function buildTokenContext(items: ChangeSetTokenItem[], overrides?: Partial<TokenClassificationContext>): TokenClassificationContext;
|
|
55
|
+
/**
|
|
56
|
+
* TextItem 配列から TextClassificationContext を推定
|
|
57
|
+
*/
|
|
58
|
+
export declare function buildTextContext(items: ChangeSetTextItem[], overrides?: Partial<TextClassificationContext>): TextClassificationContext;
|
|
59
|
+
/**
|
|
60
|
+
* ComponentItem 配列から ComponentClassificationContext を推定
|
|
61
|
+
*/
|
|
62
|
+
export declare function buildComponentContext(items: ChangeSetComponentItem[], overrides?: Partial<ComponentClassificationContext>): ComponentClassificationContext;
|
|
63
|
+
/**
|
|
64
|
+
* ChangeSet を分類する統合関数
|
|
65
|
+
*
|
|
66
|
+
* items の内容からコンテキストを自動推定し、分類を判定する。
|
|
67
|
+
* 外部コンテキスト(alias 存在確認、影響ノード数等)は overrides で渡す。
|
|
68
|
+
*
|
|
69
|
+
* rulePacks が指定された場合は Rule Engine 経由で評価する。
|
|
70
|
+
* 未指定時は既存のハードコードロジックを使用(後方互換性維持)。
|
|
71
|
+
*/
|
|
72
|
+
export declare function classifyChangeSet(changeset: ChangeSet, overrides?: {
|
|
73
|
+
tokenContext?: Partial<TokenClassificationContext>;
|
|
74
|
+
textContext?: Partial<TextClassificationContext>;
|
|
75
|
+
componentContext?: Partial<ComponentClassificationContext>;
|
|
76
|
+
}, thresholds?: ClassificationThresholds, rulePacks?: RulePack[]): Classification;
|
|
77
|
+
//# sourceMappingURL=classify.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"classify.d.ts","sourceRoot":"","sources":["../../src/changeset/classify.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,SAAS,EACT,kBAAkB,EAClB,iBAAiB,EACjB,sBAAsB,EACtB,cAAc,EACd,wBAAwB,EACxB,0BAA0B,EAC1B,yBAAyB,EACzB,8BAA8B,EAC9B,qBAAqB,EACtB,MAAM,oBAAoB,CAAC;AAE5B,OAAO,KAAK,EAAE,QAAQ,EAAe,MAAM,gBAAgB,CAAC;AAO5D;;;;;;;;;;;;GAYG;AACH,wBAAgB,cAAc,CAC5B,GAAG,EAAE,0BAA0B,EAC/B,UAAU,GAAE,wBAA6C,GACxD,cAAc,CAahB;AAMD;;;;;;;;;;;;GAYG;AACH,wBAAgB,YAAY,CAC1B,GAAG,EAAE,yBAAyB,EAC9B,UAAU,GAAE,wBAA6C,GACxD,cAAc,CAchB;AAMD;;;;;;;;;;;GAWG;AACH,wBAAgB,kBAAkB,CAChC,GAAG,EAAE,8BAA8B,GAClC,cAAc,CAYhB;AAMD;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,qBAAqB,EAC/B,UAAU,GAAE,wBAA6C,GACxD,cAAc,CAShB;AASD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,KAAK,EAAE,kBAAkB,EAAE,EAC3B,SAAS,GAAE,OAAO,CAAC,0BAA0B,CAAM,GAClD,0BAA0B,CAqB5B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,KAAK,EAAE,iBAAiB,EAAE,EAC1B,SAAS,GAAE,OAAO,CAAC,yBAAyB,CAAM,GACjD,yBAAyB,CAyC3B;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,KAAK,EAAE,sBAAsB,EAAE,EAC/B,SAAS,GAAE,OAAO,CAAC,8BAA8B,CAAM,GACtD,8BAA8B,CAiBhC;AAED;;;;;;;;GAQG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,EACpB,SAAS,CAAC,EAAE;IACV,YAAY,CAAC,EAAE,OAAO,CAAC,0BAA0B,CAAC,CAAC;IACnD,WAAW,CAAC,EAAE,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACjD,gBAAgB,CAAC,EAAE,OAAO,CAAC,8BAA8B,CAAC,CAAC;CAC5D,EACD,UAAU,GAAE,wBAA6C,EACzD,SAAS,CAAC,EAAE,QAAQ,EAAE,GACrB,cAAc,CAwChB"}
|