@localeguard/core 0.1.0 → 0.2.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/src/index.d.ts +4 -0
- package/dist/src/index.d.ts.map +1 -1
- package/dist/src/index.js +5 -1
- package/dist/src/index.js.map +1 -1
- package/dist/src/reporters/markdown.d.ts +13 -0
- package/dist/src/reporters/markdown.d.ts.map +1 -0
- package/dist/src/reporters/markdown.js +74 -0
- package/dist/src/reporters/markdown.js.map +1 -0
- package/dist/src/reporters/sarif.d.ts +12 -0
- package/dist/src/reporters/sarif.d.ts.map +1 -0
- package/dist/src/reporters/sarif.js +71 -0
- package/dist/src/reporters/sarif.js.map +1 -0
- package/package.json +1 -1
package/dist/src/index.d.ts
CHANGED
|
@@ -16,4 +16,8 @@ export type { RunCheckOptions, SummarizeParams } from "./check";
|
|
|
16
16
|
export { formatText } from "./reporters/text";
|
|
17
17
|
export type { TextReporterOptions } from "./reporters/text";
|
|
18
18
|
export { formatJson } from "./reporters/json";
|
|
19
|
+
export { formatMarkdown } from "./reporters/markdown";
|
|
20
|
+
export type { MarkdownReporterOptions } from "./reporters/markdown";
|
|
21
|
+
export { formatSarif } from "./reporters/sarif";
|
|
22
|
+
export type { SarifReporterOptions } from "./reporters/sarif";
|
|
19
23
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/src/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAClF,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,SAAS,CAAC;AACxB,OAAO,EAAE,SAAS,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACzD,YAAY,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC/C,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AACvD,YAAY,EAAE,OAAO,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EACL,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,qCAAqC,CAAC;AAC7C,YAAY,EAAE,eAAe,EAAE,MAAM,qCAAqC,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,YAAY,EAAE,WAAW,EAAE,MAAM,sBAAsB,CAAC;AACxD,OAAO,EAAE,QAAQ,EAAE,eAAe,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,SAAS,CAAC;AAClF,YAAY,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,YAAY,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAC5D,OAAO,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC9C,OAAO,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AACtD,YAAY,EAAE,uBAAuB,EAAE,MAAM,sBAAsB,CAAC;AACpE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,YAAY,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC"}
|
package/dist/src/index.js
CHANGED
|
@@ -17,7 +17,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
17
17
|
for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
|
|
18
18
|
};
|
|
19
19
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
20
|
-
exports.formatJson = exports.formatText = exports.LocaleGuardError = exports.sortIssues = exports.summarizeIssues = exports.runCheck = exports.loadLocale = exports.comparePlaceholders = exports.extractPlaceholders = exports.compareKeys = exports.flatten = exports.JsonParseError = exports.parseJson = void 0;
|
|
20
|
+
exports.formatSarif = exports.formatMarkdown = exports.formatJson = exports.formatText = exports.LocaleGuardError = exports.sortIssues = exports.summarizeIssues = exports.runCheck = exports.loadLocale = exports.comparePlaceholders = exports.extractPlaceholders = exports.compareKeys = exports.flatten = exports.JsonParseError = exports.parseJson = void 0;
|
|
21
21
|
__exportStar(require("./types"), exports);
|
|
22
22
|
var parse_1 = require("./json/parse");
|
|
23
23
|
Object.defineProperty(exports, "parseJson", { enumerable: true, get: function () { return parse_1.parseJson; } });
|
|
@@ -40,4 +40,8 @@ var text_1 = require("./reporters/text");
|
|
|
40
40
|
Object.defineProperty(exports, "formatText", { enumerable: true, get: function () { return text_1.formatText; } });
|
|
41
41
|
var json_1 = require("./reporters/json");
|
|
42
42
|
Object.defineProperty(exports, "formatJson", { enumerable: true, get: function () { return json_1.formatJson; } });
|
|
43
|
+
var markdown_1 = require("./reporters/markdown");
|
|
44
|
+
Object.defineProperty(exports, "formatMarkdown", { enumerable: true, get: function () { return markdown_1.formatMarkdown; } });
|
|
45
|
+
var sarif_1 = require("./reporters/sarif");
|
|
46
|
+
Object.defineProperty(exports, "formatSarif", { enumerable: true, get: function () { return sarif_1.formatSarif; } });
|
|
43
47
|
//# sourceMappingURL=index.js.map
|
package/dist/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,sCAAyD;AAAhD,kGAAA,SAAS,OAAA;AAAE,uGAAA,cAAc,OAAA;AAElC,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,oDAAuD;AAA9C,sGAAA,WAAW,OAAA;AAEpB,mEAG6C;AAF3C,kHAAA,mBAAmB,OAAA;AACnB,kHAAA,mBAAmB,OAAA;AAGrB,6CAAkD;AAAzC,kGAAA,UAAU,OAAA;AAEnB,iCAAkF;AAAzE,iGAAA,QAAQ,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAEhE,yCAA8C;AAArC,kGAAA,UAAU,OAAA;AAEnB,yCAA8C;AAArC,kGAAA,UAAU,OAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;;;;;;;;;;;;;;;AAEH,0CAAwB;AACxB,sCAAyD;AAAhD,kGAAA,SAAS,OAAA;AAAE,uGAAA,cAAc,OAAA;AAElC,qCAAoC;AAA3B,kGAAA,OAAO,OAAA;AAChB,oDAAuD;AAA9C,sGAAA,WAAW,OAAA;AAEpB,mEAG6C;AAF3C,kHAAA,mBAAmB,OAAA;AACnB,kHAAA,mBAAmB,OAAA;AAGrB,6CAAkD;AAAzC,kGAAA,UAAU,OAAA;AAEnB,iCAAkF;AAAzE,iGAAA,QAAQ,OAAA;AAAE,wGAAA,eAAe,OAAA;AAAE,mGAAA,UAAU,OAAA;AAAE,yGAAA,gBAAgB,OAAA;AAEhE,yCAA8C;AAArC,kGAAA,UAAU,OAAA;AAEnB,yCAA8C;AAArC,kGAAA,UAAU,OAAA;AACnB,iDAAsD;AAA7C,0GAAA,cAAc,OAAA;AAEvB,2CAAgD;AAAvC,oGAAA,WAAW,OAAA"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Markdown reporter — designed for a GitHub PR comment or a job summary
|
|
3
|
+
* (`$GITHUB_STEP_SUMMARY`).
|
|
4
|
+
*/
|
|
5
|
+
import type { CheckResult } from "../types";
|
|
6
|
+
export interface MarkdownReporterOptions {
|
|
7
|
+
/** Tool version to show in the footer. */
|
|
8
|
+
toolVersion?: string;
|
|
9
|
+
/** Maximum number of issue rows to render before truncating. */
|
|
10
|
+
maxRows?: number;
|
|
11
|
+
}
|
|
12
|
+
export declare function formatMarkdown(result: CheckResult, opts?: MarkdownReporterOptions): string;
|
|
13
|
+
//# sourceMappingURL=markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.d.ts","sourceRoot":"","sources":["../../../src/reporters/markdown.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,WAAW,EAAS,MAAM,UAAU,CAAC;AAEnD,MAAM,WAAW,uBAAuB;IACtC,0CAA0C;IAC1C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,gEAAgE;IAChE,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,wBAAgB,cAAc,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE,uBAA4B,GAAG,MAAM,CAgD9F"}
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Markdown reporter — designed for a GitHub PR comment or a job summary
|
|
4
|
+
* (`$GITHUB_STEP_SUMMARY`).
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.formatMarkdown = formatMarkdown;
|
|
8
|
+
function formatMarkdown(result, opts = {}) {
|
|
9
|
+
const maxRows = opts.maxRows ?? 50;
|
|
10
|
+
const { stats } = result;
|
|
11
|
+
const out = [];
|
|
12
|
+
out.push("## 🌐 LocaleGuard");
|
|
13
|
+
out.push("");
|
|
14
|
+
if (result.issues.length === 0) {
|
|
15
|
+
out.push(`✅ **All localization checks passed** — \`${stats.sourceLocale}\` reference locale, ` +
|
|
16
|
+
`${stats.sourceKeyCount} keys validated.`);
|
|
17
|
+
out.push("");
|
|
18
|
+
out.push(footer(opts.toolVersion));
|
|
19
|
+
return out.join("\n");
|
|
20
|
+
}
|
|
21
|
+
if (stats.failed) {
|
|
22
|
+
out.push(`❌ **Localization check failed** — ${stats.errorCount} error(s), ${stats.warningCount} warning(s).`);
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
out.push(`⚠️ **Passed with warnings** — ${stats.warningCount} warning(s).`);
|
|
26
|
+
}
|
|
27
|
+
out.push("");
|
|
28
|
+
const summary = summaryParts(result);
|
|
29
|
+
if (summary.length) {
|
|
30
|
+
out.push(summary.join(" · "));
|
|
31
|
+
out.push("");
|
|
32
|
+
}
|
|
33
|
+
out.push("| | Location | Type | Message |");
|
|
34
|
+
out.push("| :-: | --- | --- | --- |");
|
|
35
|
+
for (const issue of result.issues.slice(0, maxRows)) {
|
|
36
|
+
const icon = issue.severity === "error" ? "❌" : "⚠️";
|
|
37
|
+
const where = issue.line ? `\`${issue.file}:${issue.line}\`` : `\`${issue.file}\``;
|
|
38
|
+
out.push(`| ${icon} | ${where} | \`${issue.type}\` | ${escapeCell(issue.message)} |`);
|
|
39
|
+
}
|
|
40
|
+
if (result.issues.length > maxRows) {
|
|
41
|
+
out.push("");
|
|
42
|
+
out.push(`_…and ${result.issues.length - maxRows} more._`);
|
|
43
|
+
}
|
|
44
|
+
out.push("");
|
|
45
|
+
out.push(footer(opts.toolVersion));
|
|
46
|
+
return out.join("\n");
|
|
47
|
+
}
|
|
48
|
+
function summaryParts(result) {
|
|
49
|
+
const t = result.stats.byType;
|
|
50
|
+
const parts = [];
|
|
51
|
+
if (t["missing-key"])
|
|
52
|
+
parts.push(`**${t["missing-key"]}** missing`);
|
|
53
|
+
if (t["extra-key"])
|
|
54
|
+
parts.push(`**${t["extra-key"]}** extra`);
|
|
55
|
+
if (t["placeholder-mismatch"])
|
|
56
|
+
parts.push(`**${t["placeholder-mismatch"]}** interpolation`);
|
|
57
|
+
if (t["duplicate-key"])
|
|
58
|
+
parts.push(`**${t["duplicate-key"]}** duplicate`);
|
|
59
|
+
if (t["invalid-json"])
|
|
60
|
+
parts.push(`**${t["invalid-json"]}** invalid-json`);
|
|
61
|
+
if (t["hardcoded-string"])
|
|
62
|
+
parts.push(`**${t["hardcoded-string"]}** hardcoded text`);
|
|
63
|
+
if (t["hardcoded-attribute"])
|
|
64
|
+
parts.push(`**${t["hardcoded-attribute"]}** hardcoded attr`);
|
|
65
|
+
return parts;
|
|
66
|
+
}
|
|
67
|
+
function escapeCell(text) {
|
|
68
|
+
return text.replace(/\|/g, "\\|").replace(/\r?\n/g, " ");
|
|
69
|
+
}
|
|
70
|
+
function footer(version) {
|
|
71
|
+
const v = version ? ` ${version}` : "";
|
|
72
|
+
return `<sub>Generated by [LocaleGuard](https://github.com/isamrish/localeguard)${v}.</sub>`;
|
|
73
|
+
}
|
|
74
|
+
//# sourceMappingURL=markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/reporters/markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SARIF 2.1.0 reporter — for GitHub code scanning, which renders results as
|
|
3
|
+
* inline annotations on the pull-request diff.
|
|
4
|
+
*
|
|
5
|
+
* Spec: https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html
|
|
6
|
+
*/
|
|
7
|
+
import type { CheckResult } from "../types";
|
|
8
|
+
export interface SarifReporterOptions {
|
|
9
|
+
toolVersion?: string;
|
|
10
|
+
}
|
|
11
|
+
export declare function formatSarif(result: CheckResult, opts?: SarifReporterOptions): string;
|
|
12
|
+
//# sourceMappingURL=sarif.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sarif.d.ts","sourceRoot":"","sources":["../../../src/reporters/sarif.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,KAAK,EAAE,WAAW,EAAoB,MAAM,UAAU,CAAC;AAE9D,MAAM,WAAW,oBAAoB;IACnC,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAgBD,wBAAgB,WAAW,CAAC,MAAM,EAAE,WAAW,EAAE,IAAI,GAAE,oBAAyB,GAAG,MAAM,CAyCxF"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* SARIF 2.1.0 reporter — for GitHub code scanning, which renders results as
|
|
4
|
+
* inline annotations on the pull-request diff.
|
|
5
|
+
*
|
|
6
|
+
* Spec: https://docs.oasis-open.org/sarif/sarif/v2.1.0/sarif-v2.1.0.html
|
|
7
|
+
*/
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.formatSarif = formatSarif;
|
|
10
|
+
const types_1 = require("../types");
|
|
11
|
+
const RULE_DESCRIPTIONS = {
|
|
12
|
+
"invalid-json": "Locale file is not valid JSON.",
|
|
13
|
+
"missing-key": "A key in the source locale is missing from a target locale.",
|
|
14
|
+
"extra-key": "A key exists in a target locale but not in the source locale.",
|
|
15
|
+
"duplicate-key": "A key is declared more than once within a file.",
|
|
16
|
+
"placeholder-mismatch": "Interpolation variables differ between source and target.",
|
|
17
|
+
"hardcoded-string": "Hardcoded, user-facing JSX text that should be localized.",
|
|
18
|
+
"hardcoded-attribute": "Hardcoded localizable attribute value (aria-label, title, alt, placeholder).",
|
|
19
|
+
};
|
|
20
|
+
function sarifLevel(issue) {
|
|
21
|
+
return issue.severity === "error" ? "error" : "warning";
|
|
22
|
+
}
|
|
23
|
+
function formatSarif(result, opts = {}) {
|
|
24
|
+
const rules = types_1.ISSUE_TYPES.map((id) => ({
|
|
25
|
+
id,
|
|
26
|
+
name: toPascalCase(id),
|
|
27
|
+
shortDescription: { text: RULE_DESCRIPTIONS[id] },
|
|
28
|
+
defaultConfiguration: { level: id === "extra-key" ? "warning" : "error" },
|
|
29
|
+
}));
|
|
30
|
+
const results = result.issues.map((issue) => ({
|
|
31
|
+
ruleId: issue.type,
|
|
32
|
+
level: sarifLevel(issue),
|
|
33
|
+
message: { text: issue.message },
|
|
34
|
+
locations: [
|
|
35
|
+
{
|
|
36
|
+
physicalLocation: {
|
|
37
|
+
artifactLocation: { uri: toUri(issue.file) },
|
|
38
|
+
region: { startLine: Math.max(1, issue.line ?? 1) },
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
],
|
|
42
|
+
}));
|
|
43
|
+
const sarif = {
|
|
44
|
+
$schema: "https://json.schemastore.org/sarif-2.1.0.json",
|
|
45
|
+
version: "2.1.0",
|
|
46
|
+
runs: [
|
|
47
|
+
{
|
|
48
|
+
tool: {
|
|
49
|
+
driver: {
|
|
50
|
+
name: "LocaleGuard",
|
|
51
|
+
informationUri: "https://github.com/isamrish/localeguard",
|
|
52
|
+
version: opts.toolVersion ?? "0.2.0",
|
|
53
|
+
rules,
|
|
54
|
+
},
|
|
55
|
+
},
|
|
56
|
+
results,
|
|
57
|
+
},
|
|
58
|
+
],
|
|
59
|
+
};
|
|
60
|
+
return JSON.stringify(sarif, null, 2);
|
|
61
|
+
}
|
|
62
|
+
function toUri(file) {
|
|
63
|
+
return file.split("\\").join("/");
|
|
64
|
+
}
|
|
65
|
+
function toPascalCase(id) {
|
|
66
|
+
return id
|
|
67
|
+
.split("-")
|
|
68
|
+
.map((part) => part.charAt(0).toUpperCase() + part.slice(1))
|
|
69
|
+
.join("");
|
|
70
|
+
}
|
|
71
|
+
//# sourceMappingURL=sarif.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sarif.js","sourceRoot":"","sources":["../../../src/reporters/sarif.ts"],"names":[],"mappings":";AAAA;;;;;GAKG;;AAuBH,kCAyCC;AA9DD,oCAAuC;AAOvC,MAAM,iBAAiB,GAA8B;IACnD,cAAc,EAAE,gCAAgC;IAChD,aAAa,EAAE,6DAA6D;IAC5E,WAAW,EAAE,+DAA+D;IAC5E,eAAe,EAAE,iDAAiD;IAClE,sBAAsB,EAAE,2DAA2D;IACnF,kBAAkB,EAAE,2DAA2D;IAC/E,qBAAqB,EAAE,8EAA8E;CACtG,CAAC;AAEF,SAAS,UAAU,CAAC,KAAY;IAC9B,OAAO,KAAK,CAAC,QAAQ,KAAK,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;AAC1D,CAAC;AAED,SAAgB,WAAW,CAAC,MAAmB,EAAE,OAA6B,EAAE;IAC9E,MAAM,KAAK,GAAG,mBAAW,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;QACrC,EAAE;QACF,IAAI,EAAE,YAAY,CAAC,EAAE,CAAC;QACtB,gBAAgB,EAAE,EAAE,IAAI,EAAE,iBAAiB,CAAC,EAAE,CAAC,EAAE;QACjD,oBAAoB,EAAE,EAAE,KAAK,EAAE,EAAE,KAAK,WAAW,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,EAAE;KAC1E,CAAC,CAAC,CAAC;IAEJ,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;QAC5C,MAAM,EAAE,KAAK,CAAC,IAAI;QAClB,KAAK,EAAE,UAAU,CAAC,KAAK,CAAC;QACxB,OAAO,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,OAAO,EAAE;QAChC,SAAS,EAAE;YACT;gBACE,gBAAgB,EAAE;oBAChB,gBAAgB,EAAE,EAAE,GAAG,EAAE,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;oBAC5C,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,EAAE;iBACpD;aACF;SACF;KACF,CAAC,CAAC,CAAC;IAEJ,MAAM,KAAK,GAAG;QACZ,OAAO,EAAE,+CAA+C;QACxD,OAAO,EAAE,OAAO;QAChB,IAAI,EAAE;YACJ;gBACE,IAAI,EAAE;oBACJ,MAAM,EAAE;wBACN,IAAI,EAAE,aAAa;wBACnB,cAAc,EAAE,yCAAyC;wBACzD,OAAO,EAAE,IAAI,CAAC,WAAW,IAAI,OAAO;wBACpC,KAAK;qBACN;iBACF;gBACD,OAAO;aACR;SACF;KACF,CAAC;IAEF,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,KAAK,CAAC,IAAY;IACzB,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AACpC,CAAC;AAED,SAAS,YAAY,CAAC,EAAU;IAC9B,OAAO,EAAE;SACN,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC3D,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC"}
|
package/package.json
CHANGED