gh-inari 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.
Files changed (55) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/dist/artifact.d.ts +82 -0
  4. package/dist/artifact.js +472 -0
  5. package/dist/artifact.js.map +1 -0
  6. package/dist/cli.d.ts +14 -0
  7. package/dist/cli.js +395 -0
  8. package/dist/cli.js.map +1 -0
  9. package/dist/contract/index.d.ts +4 -0
  10. package/dist/contract/index.js +5 -0
  11. package/dist/contract/index.js.map +1 -0
  12. package/dist/contract/ir.d.ts +178 -0
  13. package/dist/contract/ir.js +1071 -0
  14. package/dist/contract/ir.js.map +1 -0
  15. package/dist/contract/issue-form.d.ts +38 -0
  16. package/dist/contract/issue-form.js +662 -0
  17. package/dist/contract/issue-form.js.map +1 -0
  18. package/dist/contract/schema.d.ts +48 -0
  19. package/dist/contract/schema.js +162 -0
  20. package/dist/contract/schema.js.map +1 -0
  21. package/dist/contract/validation.d.ts +24 -0
  22. package/dist/contract/validation.js +212 -0
  23. package/dist/contract/validation.js.map +1 -0
  24. package/dist/github/adapter.d.ts +48 -0
  25. package/dist/github/adapter.js +463 -0
  26. package/dist/github/adapter.js.map +1 -0
  27. package/dist/github/errors.d.ts +43 -0
  28. package/dist/github/errors.js +65 -0
  29. package/dist/github/errors.js.map +1 -0
  30. package/dist/github/index.d.ts +4 -0
  31. package/dist/github/index.js +5 -0
  32. package/dist/github/index.js.map +1 -0
  33. package/dist/github/transport.d.ts +19 -0
  34. package/dist/github/transport.js +54 -0
  35. package/dist/github/transport.js.map +1 -0
  36. package/dist/github/types.d.ts +62 -0
  37. package/dist/github/types.js +16 -0
  38. package/dist/github/types.js.map +1 -0
  39. package/dist/github.d.ts +1 -0
  40. package/dist/github.js +2 -0
  41. package/dist/github.js.map +1 -0
  42. package/dist/index.d.ts +10 -0
  43. package/dist/index.js +32 -0
  44. package/dist/index.js.map +1 -0
  45. package/dist/pr-policy.d.ts +39 -0
  46. package/dist/pr-policy.js +313 -0
  47. package/dist/pr-policy.js.map +1 -0
  48. package/dist/pull-request-template.d.ts +42 -0
  49. package/dist/pull-request-template.js +481 -0
  50. package/dist/pull-request-template.js.map +1 -0
  51. package/dist/template-discovery.d.ts +68 -0
  52. package/dist/template-discovery.js +431 -0
  53. package/dist/template-discovery.js.map +1 -0
  54. package/gh-inari +18 -0
  55. package/package.json +92 -0
@@ -0,0 +1,54 @@
1
+ import { spawn } from "node:child_process";
2
+ export class ProcessGhTransport {
3
+ executable;
4
+ constructor(executable = "gh") {
5
+ this.executable = executable;
6
+ }
7
+ run(args, options = {}) {
8
+ return new Promise((resolve, reject) => {
9
+ let child;
10
+ try {
11
+ child = spawn(this.executable, [...args], {
12
+ cwd: options.cwd,
13
+ stdio: ["ignore", "pipe", "pipe"],
14
+ });
15
+ }
16
+ catch (error) {
17
+ reject(error);
18
+ return;
19
+ }
20
+ if (child.stdout === null || child.stderr === null) {
21
+ reject(new Error("gh transport did not provide stdout and stderr pipes"));
22
+ return;
23
+ }
24
+ let stdout = "";
25
+ let stderr = "";
26
+ child.stdout.setEncoding("utf8");
27
+ child.stderr.setEncoding("utf8");
28
+ child.stdout.on("data", (chunk) => {
29
+ stdout += chunk;
30
+ });
31
+ child.stderr.on("data", (chunk) => {
32
+ stderr += chunk;
33
+ });
34
+ child.once("error", reject);
35
+ const timer = options.timeoutMs === undefined
36
+ ? undefined
37
+ : setTimeout(() => {
38
+ child.kill("SIGTERM");
39
+ }, options.timeoutMs);
40
+ timer?.unref();
41
+ child.once("close", (exitCode, signal) => {
42
+ if (timer !== undefined)
43
+ clearTimeout(timer);
44
+ resolve({
45
+ exitCode: exitCode ?? 1,
46
+ stdout,
47
+ stderr,
48
+ ...(signal === null ? {} : { signal }),
49
+ });
50
+ });
51
+ });
52
+ }
53
+ }
54
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../src/github/transport.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAmB3C,MAAM,OAAO,kBAAkB;IACpB,UAAU,CAAS;IAE5B,YAAY,UAAU,GAAG,IAAI;QAC3B,IAAI,CAAC,UAAU,GAAG,UAAU,CAAC;IAC/B,CAAC;IAED,GAAG,CAAC,IAAuB,EAAE,UAA8B,EAAE;QAC3D,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrC,IAAI,KAA+B,CAAC;YACpC,IAAI,CAAC;gBACH,KAAK,GAAG,KAAK,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC,GAAG,IAAI,CAAC,EAAE;oBACxC,GAAG,EAAE,OAAO,CAAC,GAAG;oBAChB,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;iBAClC,CAAC,CAAC;YACL,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,MAAM,CAAC,KAAK,CAAC,CAAC;gBACd,OAAO;YACT,CAAC;YAED,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,IAAI,KAAK,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;gBACnD,MAAM,CAAC,IAAI,KAAK,CAAC,sDAAsD,CAAC,CAAC,CAAC;gBAC1E,OAAO;YACT,CAAC;YAED,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACxC,MAAM,IAAI,KAAK,CAAC;YAClB,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACxC,MAAM,IAAI,KAAK,CAAC;YAClB,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,MAAM,KAAK,GACT,OAAO,CAAC,SAAS,KAAK,SAAS;gBAC7B,CAAC,CAAC,SAAS;gBACX,CAAC,CAAC,UAAU,CAAC,GAAG,EAAE;oBACd,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;gBACxB,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC;YAC5B,KAAK,EAAE,KAAK,EAAE,CAAC;YACf,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAuB,EAAE,MAA6B,EAAE,EAAE;gBAC7E,IAAI,KAAK,KAAK,SAAS;oBAAE,YAAY,CAAC,KAAK,CAAC,CAAC;gBAC7C,OAAO,CAAC;oBACN,QAAQ,EAAE,QAAQ,IAAI,CAAC;oBACvB,MAAM;oBACN,MAAM;oBACN,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC;iBACvC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;CACF"}
@@ -0,0 +1,62 @@
1
+ export declare const VALIDATED_RENDERED_PHASE: "validated-rendered";
2
+ export type ValidatedRenderedPhase = typeof VALIDATED_RENDERED_PHASE;
3
+ /**
4
+ * This discriminator is the handoff contract from Inari's compiler/validator.
5
+ * The adapter checks the handoff shape but does not compile, validate, or render it.
6
+ */
7
+ export interface ValidatedRenderedIssueArtifact {
8
+ readonly phase: ValidatedRenderedPhase;
9
+ readonly kind: "issue";
10
+ readonly title: string;
11
+ readonly body: string;
12
+ readonly labels?: readonly string[];
13
+ readonly assignees?: readonly string[];
14
+ }
15
+ export interface ValidatedRenderedPullRequestArtifact {
16
+ readonly phase: ValidatedRenderedPhase;
17
+ readonly kind: "pull_request";
18
+ readonly title: string;
19
+ readonly body: string;
20
+ readonly head: string;
21
+ readonly base: string;
22
+ readonly draft?: boolean;
23
+ readonly maintainerCanModify?: boolean;
24
+ }
25
+ export type ValidatedRenderedArtifact = ValidatedRenderedIssueArtifact | ValidatedRenderedPullRequestArtifact;
26
+ /**
27
+ * Creates the explicit compiler-to-adapter handoff marker. Callers must invoke
28
+ * this only after their own contract validation and canonical rendering.
29
+ */
30
+ export declare function markValidatedRenderedIssueArtifact(artifact: Omit<ValidatedRenderedIssueArtifact, "phase">): ValidatedRenderedIssueArtifact;
31
+ /**
32
+ * Creates the explicit compiler-to-adapter handoff marker. Callers must invoke
33
+ * this only after their own contract validation and canonical rendering.
34
+ */
35
+ export declare function markValidatedRenderedPullRequestArtifact(artifact: Omit<ValidatedRenderedPullRequestArtifact, "phase">): ValidatedRenderedPullRequestArtifact;
36
+ export interface RepositoryContext {
37
+ readonly hostname: string;
38
+ readonly host: string;
39
+ readonly owner: string;
40
+ readonly name: string;
41
+ readonly nameWithOwner: string;
42
+ readonly url: string;
43
+ }
44
+ export interface GitHubIssue {
45
+ readonly number: number;
46
+ readonly title: string;
47
+ readonly body: string | null;
48
+ readonly state: "open" | "closed";
49
+ readonly url: string;
50
+ readonly labels: readonly string[];
51
+ readonly assignees: readonly string[];
52
+ }
53
+ export interface GitHubPullRequest {
54
+ readonly number: number;
55
+ readonly title: string;
56
+ readonly body: string | null;
57
+ readonly state: "open" | "closed";
58
+ readonly url: string;
59
+ readonly draft: boolean;
60
+ readonly head: string;
61
+ readonly base: string;
62
+ }
@@ -0,0 +1,16 @@
1
+ export const VALIDATED_RENDERED_PHASE = "validated-rendered";
2
+ /**
3
+ * Creates the explicit compiler-to-adapter handoff marker. Callers must invoke
4
+ * this only after their own contract validation and canonical rendering.
5
+ */
6
+ export function markValidatedRenderedIssueArtifact(artifact) {
7
+ return { ...artifact, phase: VALIDATED_RENDERED_PHASE };
8
+ }
9
+ /**
10
+ * Creates the explicit compiler-to-adapter handoff marker. Callers must invoke
11
+ * this only after their own contract validation and canonical rendering.
12
+ */
13
+ export function markValidatedRenderedPullRequestArtifact(artifact) {
14
+ return { ...artifact, phase: VALIDATED_RENDERED_PHASE };
15
+ }
16
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/github/types.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAA6B,CAAC;AA8BtE;;;GAGG;AACH,MAAM,UAAU,kCAAkC,CAChD,QAAuD;IAEvD,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;AAC1D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,wCAAwC,CACtD,QAA6D;IAE7D,OAAO,EAAE,GAAG,QAAQ,EAAE,KAAK,EAAE,wBAAwB,EAAE,CAAC;AAC1D,CAAC"}
@@ -0,0 +1 @@
1
+ export * from "./github/index.js";
package/dist/github.js ADDED
@@ -0,0 +1,2 @@
1
+ export * from "./github/index.js";
2
+ //# sourceMappingURL=github.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github.js","sourceRoot":"","sources":["../src/github.ts"],"names":[],"mappings":"AAAA,cAAc,mBAAmB,CAAC"}
@@ -0,0 +1,10 @@
1
+ #!/usr/bin/env node
2
+ import { runCli } from "./cli.js";
3
+ export { runCli };
4
+ export * from "./artifact.js";
5
+ export * from "./pr-policy.js";
6
+ export * from "./contract/index.js";
7
+ export * from "./github/index.js";
8
+ export * from "./pull-request-template.js";
9
+ export { discoverTemplates, discoverTemplatesSync, selectTemplate, selectIssueTemplate, selectPullRequestTemplate, TemplateDiscoveryError, TemplateFilesystemError, TemplateNotFoundError, TemplateSelectionAmbiguousError, TemplateNameConflictError, InvalidTemplateSelectorError, } from "./template-discovery.js";
10
+ export type { TemplateDiscoveryResult, TemplateSelector, TemplateType, TemplateKind, TemplateDiscoveryErrorCode, TemplateDiscoveryErrorDetails, } from "./template-discovery.js";
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ #!/usr/bin/env node
2
+ import path from "node:path";
3
+ import { realpathSync } from "node:fs";
4
+ import { fileURLToPath } from "node:url";
5
+ import { runCli } from "./cli.js";
6
+ export { runCli };
7
+ export * from "./artifact.js";
8
+ export * from "./pr-policy.js";
9
+ export * from "./contract/index.js";
10
+ export * from "./github/index.js";
11
+ export * from "./pull-request-template.js";
12
+ export { discoverTemplates, discoverTemplatesSync, selectTemplate, selectIssueTemplate, selectPullRequestTemplate, TemplateDiscoveryError, TemplateFilesystemError, TemplateNotFoundError, TemplateSelectionAmbiguousError, TemplateNameConflictError, InvalidTemplateSelectorError, } from "./template-discovery.js";
13
+ let invokedPath;
14
+ try {
15
+ invokedPath = process.argv[1] === undefined ? undefined : realpathSync(path.resolve(process.argv[1]));
16
+ }
17
+ catch {
18
+ invokedPath = undefined;
19
+ }
20
+ if (invokedPath === fileURLToPath(import.meta.url)) {
21
+ runCli(process.argv.slice(2))
22
+ .then((exitCode) => {
23
+ process.exitCode = exitCode;
24
+ })
25
+ .catch((error) => {
26
+ console.error(error instanceof Error ? error.message : String(error));
27
+ if (process.exitCode === undefined || process.exitCode === 0) {
28
+ process.exitCode = 1;
29
+ }
30
+ });
31
+ }
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,UAAU,CAAC;AAElC,OAAO,EAAE,MAAM,EAAE,CAAC;AAClB,cAAc,eAAe,CAAC;AAC9B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,qBAAqB,CAAC;AACpC,cAAc,mBAAmB,CAAC;AAClC,cAAc,4BAA4B,CAAC;AAC3C,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,cAAc,EACd,mBAAmB,EACnB,yBAAyB,EACzB,sBAAsB,EACtB,uBAAuB,EACvB,qBAAqB,EACrB,+BAA+B,EAC/B,yBAAyB,EACzB,4BAA4B,GAC7B,MAAM,yBAAyB,CAAC;AAUjC,IAAI,WAA+B,CAAC;AACpC,IAAI,CAAC;IACH,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACxG,CAAC;AAAC,MAAM,CAAC;IACP,WAAW,GAAG,SAAS,CAAC;AAC1B,CAAC;AACD,IAAI,WAAW,KAAK,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;IACnD,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;SAC1B,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE;QACjB,OAAO,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC9B,CAAC,CAAC;SACD,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxB,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC7D,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;QACvB,CAAC;IACH,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -0,0 +1,39 @@
1
+ import { type CanonicalContract } from "./contract/ir.js";
2
+ export declare const PULL_REQUEST_POLICY_VERSION: 1;
3
+ export type PullRequestPolicyErrorCode = "PR_POLICY_INVALID_YAML" | "PR_POLICY_INVALID_ROOT" | "PR_POLICY_UNSUPPORTED_VERSION" | "PR_POLICY_UNKNOWN_PROPERTY" | "PR_POLICY_INVALID_VALUE" | "PR_POLICY_TEMPLATE_MISMATCH" | "PR_POLICY_UNKNOWN_REFERENCE" | "PR_POLICY_AMBIGUOUS_REFERENCE" | "PR_POLICY_UNSUPPORTED_CONSTRAINT" | "PR_POLICY_CONFLICT";
4
+ export declare class PullRequestPolicyError extends Error {
5
+ readonly code: PullRequestPolicyErrorCode;
6
+ readonly path: string;
7
+ constructor(code: PullRequestPolicyErrorCode, message: string, path?: string);
8
+ toJSON(): {
9
+ code: PullRequestPolicyErrorCode;
10
+ path: string;
11
+ message: string;
12
+ };
13
+ }
14
+ export interface PullRequestPolicyOverlay {
15
+ readonly version: typeof PULL_REQUEST_POLICY_VERSION;
16
+ readonly template?: string | PullRequestPolicyTemplateSelector;
17
+ readonly sections: readonly PullRequestPolicySectionRule[];
18
+ }
19
+ export interface PullRequestPolicyTemplateSelector {
20
+ readonly id?: string;
21
+ readonly path?: string;
22
+ readonly name?: string;
23
+ }
24
+ export interface PullRequestPolicySectionRule {
25
+ readonly fieldId: string;
26
+ readonly required?: boolean;
27
+ readonly minLength?: number;
28
+ readonly maxLength?: number;
29
+ readonly pattern?: string;
30
+ readonly minItems?: number;
31
+ readonly maxItems?: number;
32
+ readonly linkedIssue?: boolean;
33
+ readonly checklistMinCompleted?: number;
34
+ readonly checklistRequireComplete?: boolean;
35
+ }
36
+ /** Compile a small, data-only PR overlay into the shared canonical contract. */
37
+ export declare function compilePullRequestPolicyOverlay(contractInput: unknown, source: string | PullRequestPolicyOverlay): CanonicalContract;
38
+ export declare function parsePullRequestPolicyOverlay(source: string): PullRequestPolicyOverlay;
39
+ export declare function compilePullRequestPolicyFile(contract: unknown, filePath: string): Promise<CanonicalContract>;
@@ -0,0 +1,313 @@
1
+ import { readFile } from "node:fs/promises";
2
+ import { parse as parseYaml } from "yaml";
3
+ import { assertCanonicalContract, } from "./contract/ir.js";
4
+ export const PULL_REQUEST_POLICY_VERSION = 1;
5
+ export class PullRequestPolicyError extends Error {
6
+ code;
7
+ path;
8
+ constructor(code, message, path = "$") {
9
+ super(message);
10
+ this.name = "PullRequestPolicyError";
11
+ this.code = code;
12
+ this.path = path;
13
+ }
14
+ toJSON() {
15
+ return { code: this.code, path: this.path, message: this.message };
16
+ }
17
+ }
18
+ /** Compile a small, data-only PR overlay into the shared canonical contract. */
19
+ export function compilePullRequestPolicyOverlay(contractInput, source) {
20
+ assertCanonicalContract(contractInput);
21
+ const contract = contractInput;
22
+ if (contract.artifactKind !== "pull_request") {
23
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "PR policy overlays apply only to pull request contracts.");
24
+ }
25
+ const overlay = typeof source === "string" ? parsePullRequestPolicyOverlay(source) : source;
26
+ assertOverlayVersion(overlay);
27
+ assertTemplateMatch(overlay.template, contract);
28
+ const mergedFields = [...contract.supplementalConstraints.fields];
29
+ overlay.sections.forEach((rule, ruleIndex) => {
30
+ const field = resolveField(contract, rule.fieldId);
31
+ const rulePath = `$.sections[${ruleIndex}]`;
32
+ const constraint = ruleToConstraint(rule, field, rulePath);
33
+ const existingIndex = mergedFields.findIndex((entry) => entry.fieldId === field.id);
34
+ if (existingIndex < 0)
35
+ mergedFields.push(constraint);
36
+ else
37
+ mergedFields[existingIndex] = mergeConstraints(mergedFields[existingIndex], constraint, rulePath);
38
+ });
39
+ const merged = {
40
+ ...contract,
41
+ supplementalConstraints: {
42
+ fields: mergedFields,
43
+ },
44
+ };
45
+ try {
46
+ assertCanonicalContract(merged);
47
+ }
48
+ catch (error) {
49
+ const message = error instanceof Error ? error.message : "Compiled PR policy is not a valid canonical contract.";
50
+ throw new PullRequestPolicyError("PR_POLICY_CONFLICT", message, "$.sections");
51
+ }
52
+ return merged;
53
+ }
54
+ function mergeConstraints(previous, next, path) {
55
+ const keys = [
56
+ "required",
57
+ "minLength",
58
+ "maxLength",
59
+ "pattern",
60
+ "minItems",
61
+ "maxItems",
62
+ "linkedIssue",
63
+ "checklistMinCompleted",
64
+ "checklistRequireComplete",
65
+ ];
66
+ for (const key of keys) {
67
+ if (previous[key] !== undefined && next[key] !== undefined && previous[key] !== next[key]) {
68
+ throw new PullRequestPolicyError("PR_POLICY_CONFLICT", `Overlay constraint for field "${previous.fieldId}" conflicts with an existing supplemental constraint.`, `${path}.${String(key)}`);
69
+ }
70
+ }
71
+ return { ...previous, ...next };
72
+ }
73
+ export function parsePullRequestPolicyOverlay(source) {
74
+ let value;
75
+ try {
76
+ value = parseYaml(source);
77
+ }
78
+ catch (error) {
79
+ const message = error instanceof Error ? error.message : "Invalid YAML.";
80
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_YAML", message);
81
+ }
82
+ if (!isRecord(value))
83
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_ROOT", "PR policy must be a mapping.");
84
+ assertKeys(value, ["version", "template", "templates", "sections", "fields"], "$");
85
+ if (value.template !== undefined && value.templates !== undefined) {
86
+ throw new PullRequestPolicyError("PR_POLICY_CONFLICT", "Cannot specify both 'template' and 'templates'.", "$.template");
87
+ }
88
+ if (value.sections !== undefined && value.fields !== undefined) {
89
+ throw new PullRequestPolicyError("PR_POLICY_CONFLICT", "Cannot specify both 'sections' and 'fields'.", "$.sections");
90
+ }
91
+ const version = value.version;
92
+ if (version !== PULL_REQUEST_POLICY_VERSION) {
93
+ throw new PullRequestPolicyError("PR_POLICY_UNSUPPORTED_VERSION", `Only PR policy version ${PULL_REQUEST_POLICY_VERSION} is supported.`, "$.version");
94
+ }
95
+ if (Array.isArray(value.templates)) {
96
+ if (value.templates.length !== 1) {
97
+ throw new PullRequestPolicyError("PR_POLICY_UNSUPPORTED_CONSTRAINT", "A standalone overlay must contain exactly one template entry; use a repository policy file to hold multiple entries.", "$.templates");
98
+ }
99
+ const entry = value.templates[0];
100
+ if (!isRecord(entry))
101
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "Template entries must be objects.", "$.templates[0]");
102
+ assertKeys(entry, ["template", "sections", "fields"], "$.templates[0]");
103
+ if (entry.sections !== undefined && entry.fields !== undefined) {
104
+ throw new PullRequestPolicyError("PR_POLICY_CONFLICT", "Cannot specify both 'sections' and 'fields'.", "$.templates[0].sections");
105
+ }
106
+ const sections = parseRules(entry.sections ?? entry.fields, "$.templates[0].sections");
107
+ return {
108
+ version: PULL_REQUEST_POLICY_VERSION,
109
+ template: parseSelector(entry.template, "$.templates[0].template"),
110
+ sections,
111
+ };
112
+ }
113
+ return {
114
+ version: PULL_REQUEST_POLICY_VERSION,
115
+ ...(value.template === undefined ? {} : { template: parseSelector(value.template, "$.template") }),
116
+ sections: parseRules(value.sections ?? value.fields, "$.sections"),
117
+ };
118
+ }
119
+ export async function compilePullRequestPolicyFile(contract, filePath) {
120
+ let source;
121
+ try {
122
+ source = await readFile(filePath, "utf8");
123
+ }
124
+ catch (cause) {
125
+ const error = new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", `Cannot read PR policy file "${filePath}".`);
126
+ if (cause instanceof Error)
127
+ error.cause = cause;
128
+ throw error;
129
+ }
130
+ return compilePullRequestPolicyOverlay(contract, source);
131
+ }
132
+ function parseRules(value, path) {
133
+ if (!Array.isArray(value))
134
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "sections must be an array.", path);
135
+ return value.map((entry, index) => parseRule(entry, `${path}[${index}]`));
136
+ }
137
+ function parseRule(value, path) {
138
+ if (!isRecord(value))
139
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "Section rules must be objects.", path);
140
+ assertKeys(value, [
141
+ "id",
142
+ "fieldId",
143
+ "section",
144
+ "sectionId",
145
+ "required",
146
+ "minLength",
147
+ "maxLength",
148
+ "pattern",
149
+ "minItems",
150
+ "maxItems",
151
+ "linkedIssue",
152
+ "checklistMinCompleted",
153
+ "checklistRequireComplete",
154
+ "checklist",
155
+ ], path);
156
+ const references = ["id", "fieldId", "section", "sectionId"].filter((key) => value[key] !== undefined);
157
+ if (references.length !== 1 || typeof value[references[0]] !== "string") {
158
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "Each rule must contain exactly one string field identity using id, fieldId, section, or sectionId.", path);
159
+ }
160
+ const fieldId = value[references[0]];
161
+ const required = optionalBoolean(value, "required", path);
162
+ const minLength = optionalInteger(value, "minLength", path);
163
+ const maxLength = optionalInteger(value, "maxLength", path);
164
+ const directPattern = optionalString(value, "pattern", path);
165
+ const minItems = optionalInteger(value, "minItems", path);
166
+ const maxItems = optionalInteger(value, "maxItems", path);
167
+ const linkedIssue = optionalBoolean(value, "linkedIssue", path);
168
+ let checklistMinCompleted = optionalInteger(value, "checklistMinCompleted", path);
169
+ let checklistRequireComplete = optionalBoolean(value, "checklistRequireComplete", path);
170
+ if (value.checklist !== undefined) {
171
+ if (!isRecord(value.checklist))
172
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "checklist must be an object.", `${path}.checklist`);
173
+ assertKeys(value.checklist, ["minCompleted", "requireComplete"], `${path}.checklist`);
174
+ if (checklistMinCompleted !== undefined || checklistRequireComplete !== undefined) {
175
+ throw new PullRequestPolicyError("PR_POLICY_CONFLICT", "Use either checklist shorthand or checklist object, not both.", path);
176
+ }
177
+ checklistMinCompleted = optionalInteger(value.checklist, "minCompleted", `${path}.checklist`);
178
+ checklistRequireComplete = optionalBoolean(value.checklist, "requireComplete", `${path}.checklist`);
179
+ }
180
+ if (linkedIssue === true && directPattern !== undefined) {
181
+ throw new PullRequestPolicyError("PR_POLICY_CONFLICT", "linkedIssue cannot be combined with pattern.", path);
182
+ }
183
+ if (minLength !== undefined && maxLength !== undefined && minLength > maxLength) {
184
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "minLength cannot exceed maxLength.", path);
185
+ }
186
+ if (minItems !== undefined && maxItems !== undefined && minItems > maxItems) {
187
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "minItems cannot exceed maxItems.", path);
188
+ }
189
+ return {
190
+ fieldId,
191
+ ...(required === undefined ? {} : { required }),
192
+ ...(minLength === undefined ? {} : { minLength }),
193
+ ...(maxLength === undefined ? {} : { maxLength }),
194
+ ...(directPattern === undefined ? {} : { pattern: directPattern }),
195
+ ...(minItems === undefined ? {} : { minItems }),
196
+ ...(maxItems === undefined ? {} : { maxItems }),
197
+ ...(linkedIssue === undefined ? {} : { linkedIssue }),
198
+ ...(checklistMinCompleted === undefined ? {} : { checklistMinCompleted }),
199
+ ...(checklistRequireComplete === undefined ? {} : { checklistRequireComplete }),
200
+ };
201
+ }
202
+ function ruleToConstraint(rule, field, path) {
203
+ if (rule.linkedIssue === true && field.type !== "string" && field.type !== "enum") {
204
+ throw new PullRequestPolicyError("PR_POLICY_UNSUPPORTED_CONSTRAINT", "linkedIssue requires a string-like section.", path);
205
+ }
206
+ if ((rule.checklistMinCompleted !== undefined || rule.checklistRequireComplete !== undefined) &&
207
+ field.type !== "checklist") {
208
+ throw new PullRequestPolicyError("PR_POLICY_UNSUPPORTED_CONSTRAINT", "Checklist constraints require a checklist section.", path);
209
+ }
210
+ if (rule.pattern !== undefined) {
211
+ try {
212
+ new RegExp(rule.pattern, "u");
213
+ }
214
+ catch {
215
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "pattern must be a valid regular expression.", path);
216
+ }
217
+ }
218
+ if (rule.linkedIssue === true && rule.required === false) {
219
+ throw new PullRequestPolicyError("PR_POLICY_CONFLICT", "linkedIssue cannot be combined with required=false.", path);
220
+ }
221
+ return {
222
+ fieldId: field.id,
223
+ ...(rule.required === undefined && rule.linkedIssue !== true ? {} : { required: rule.required ?? true }),
224
+ ...(rule.minLength === undefined ? {} : { minLength: rule.minLength }),
225
+ ...(rule.maxLength === undefined ? {} : { maxLength: rule.maxLength }),
226
+ ...(rule.pattern === undefined ? {} : { pattern: rule.pattern }),
227
+ ...(rule.minItems === undefined ? {} : { minItems: rule.minItems }),
228
+ ...(rule.maxItems === undefined ? {} : { maxItems: rule.maxItems }),
229
+ ...(rule.linkedIssue === undefined ? {} : { linkedIssue: rule.linkedIssue }),
230
+ ...(rule.checklistMinCompleted === undefined ? {} : { checklistMinCompleted: rule.checklistMinCompleted }),
231
+ ...(rule.checklistRequireComplete === undefined ? {} : { checklistRequireComplete: rule.checklistRequireComplete }),
232
+ };
233
+ }
234
+ function resolveField(contract, reference) {
235
+ const matches = contract.sections
236
+ .flatMap((section) => [...section.fields])
237
+ .filter((field) => field.id === reference || field.nativeMetadata.sourceId === reference);
238
+ if (matches.length === 0) {
239
+ throw new PullRequestPolicyError("PR_POLICY_UNKNOWN_REFERENCE", `No native PR section matches "${reference}".`, reference);
240
+ }
241
+ if (matches.length > 1) {
242
+ throw new PullRequestPolicyError("PR_POLICY_AMBIGUOUS_REFERENCE", `Multiple native PR sections match "${reference}".`, reference);
243
+ }
244
+ return matches[0];
245
+ }
246
+ function assertOverlayVersion(overlay) {
247
+ if (overlay.version !== PULL_REQUEST_POLICY_VERSION) {
248
+ throw new PullRequestPolicyError("PR_POLICY_UNSUPPORTED_VERSION", "Unsupported PR policy version.", "$.version");
249
+ }
250
+ }
251
+ function assertTemplateMatch(selector, contract) {
252
+ if (selector === undefined)
253
+ return;
254
+ const matches = typeof selector === "string"
255
+ ? selector === contract.templateIdentity.id ||
256
+ selector === contract.templateIdentity.path ||
257
+ selector.toLocaleLowerCase("en-US") === contract.templateIdentity.name.toLocaleLowerCase("en-US")
258
+ : (selector.id === undefined || selector.id === contract.templateIdentity.id) &&
259
+ (selector.path === undefined || selector.path === contract.templateIdentity.path) &&
260
+ (selector.name === undefined ||
261
+ selector.name.toLocaleLowerCase("en-US") === contract.templateIdentity.name.toLocaleLowerCase("en-US"));
262
+ if (!matches) {
263
+ throw new PullRequestPolicyError("PR_POLICY_TEMPLATE_MISMATCH", "PR policy does not target the selected native template.", "$.template");
264
+ }
265
+ }
266
+ function parseSelector(value, path) {
267
+ if (typeof value === "string" && value.trim().length > 0)
268
+ return value;
269
+ if (!isRecord(value))
270
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "template must be a non-empty string or selector object.", path);
271
+ assertKeys(value, ["id", "path", "name"], path);
272
+ const selector = {
273
+ ...(typeof value.id === "string" ? { id: value.id } : {}),
274
+ ...(typeof value.path === "string" ? { path: value.path } : {}),
275
+ ...(typeof value.name === "string" ? { name: value.name } : {}),
276
+ };
277
+ if (Object.keys(selector).length === 0)
278
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", "template selector must not be empty.", path);
279
+ return selector;
280
+ }
281
+ function assertKeys(record, allowed, path) {
282
+ const allowedSet = new Set(allowed);
283
+ const unknown = Object.keys(record).filter((key) => !allowedSet.has(key));
284
+ if (unknown.length > 0) {
285
+ throw new PullRequestPolicyError("PR_POLICY_UNKNOWN_PROPERTY", `Unknown property "${unknown[0]}".`, `${path}.${unknown[0]}`);
286
+ }
287
+ }
288
+ function optionalString(record, key, path) {
289
+ if (record[key] === undefined)
290
+ return undefined;
291
+ if (typeof record[key] !== "string")
292
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", `${key} must be a string.`, `${path}.${key}`);
293
+ return record[key];
294
+ }
295
+ function optionalBoolean(record, key, path) {
296
+ if (record[key] === undefined)
297
+ return undefined;
298
+ if (typeof record[key] !== "boolean")
299
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", `${key} must be a boolean.`, `${path}.${key}`);
300
+ return record[key];
301
+ }
302
+ function optionalInteger(record, key, path) {
303
+ if (record[key] === undefined)
304
+ return undefined;
305
+ if (!Number.isSafeInteger(record[key]) || typeof record[key] !== "number" || record[key] < 0) {
306
+ throw new PullRequestPolicyError("PR_POLICY_INVALID_VALUE", `${key} must be a non-negative integer.`, `${path}.${key}`);
307
+ }
308
+ return record[key];
309
+ }
310
+ function isRecord(value) {
311
+ return typeof value === "object" && value !== null && !Array.isArray(value);
312
+ }
313
+ //# sourceMappingURL=pr-policy.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pr-policy.js","sourceRoot":"","sources":["../src/pr-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,MAAM,CAAC;AAC1C,OAAO,EACL,uBAAuB,GAIxB,MAAM,kBAAkB,CAAC;AAE1B,MAAM,CAAC,MAAM,2BAA2B,GAAG,CAAU,CAAC;AActD,MAAM,OAAO,sBAAuB,SAAQ,KAAK;IACtC,IAAI,CAA6B;IACjC,IAAI,CAAS;IAEtB,YAAY,IAAgC,EAAE,OAAe,EAAE,IAAI,GAAG,GAAG;QACvE,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,wBAAwB,CAAC;QACrC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IAED,MAAM;QACJ,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACrE,CAAC;CACF;AA2BD,gFAAgF;AAChF,MAAM,UAAU,+BAA+B,CAC7C,aAAsB,EACtB,MAAyC;IAEzC,uBAAuB,CAAC,aAAa,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,aAAa,CAAC;IAC/B,IAAI,QAAQ,CAAC,YAAY,KAAK,cAAc,EAAE,CAAC;QAC7C,MAAM,IAAI,sBAAsB,CAC9B,yBAAyB,EACzB,0DAA0D,CAC3D,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,OAAO,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,6BAA6B,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC;IAC5F,oBAAoB,CAAC,OAAO,CAAC,CAAC;IAC9B,mBAAmB,CAAC,OAAO,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;IAEhD,MAAM,YAAY,GAAG,CAAC,GAAG,QAAQ,CAAC,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAClE,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,SAAS,EAAE,EAAE;QAC3C,MAAM,KAAK,GAAG,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,OAAO,CAAC,CAAC;QACnD,MAAM,QAAQ,GAAG,cAAc,SAAS,GAAG,CAAC;QAC5C,MAAM,UAAU,GAAG,gBAAgB,CAAC,IAAI,EAAE,KAAK,EAAE,QAAQ,CAAC,CAAC;QAC3D,MAAM,aAAa,GAAG,YAAY,CAAC,SAAS,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,KAAK,KAAK,CAAC,EAAE,CAAC,CAAC;QACpF,IAAI,aAAa,GAAG,CAAC;YAAE,YAAY,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;;YAEnD,YAAY,CAAC,aAAa,CAAC,GAAG,gBAAgB,CAC5C,YAAY,CAAC,aAAa,CAAgC,EAC1D,UAAU,EACV,QAAQ,CACT,CAAC;IACN,CAAC,CAAC,CAAC;IAEH,MAAM,MAAM,GAAsB;QAChC,GAAG,QAAQ;QACX,uBAAuB,EAAE;YACvB,MAAM,EAAE,YAAY;SACrB;KACF,CAAC;IACF,IAAI,CAAC;QACH,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,uDAAuD,CAAC;QACjH,MAAM,IAAI,sBAAsB,CAAC,oBAAoB,EAAE,OAAO,EAAE,YAAY,CAAC,CAAC;IAChF,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,gBAAgB,CACvB,QAAqC,EACrC,IAAiC,EACjC,IAAY;IAEZ,MAAM,IAAI,GAAmD;QAC3D,UAAU;QACV,WAAW;QACX,WAAW;QACX,SAAS;QACT,UAAU;QACV,UAAU;QACV,aAAa;QACb,uBAAuB;QACvB,0BAA0B;KAC3B,CAAC;IACF,KAAK,MAAM,GAAG,IAAI,IAAI,EAAE,CAAC;QACvB,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,SAAS,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;YAC1F,MAAM,IAAI,sBAAsB,CAC9B,oBAAoB,EACpB,iCAAiC,QAAQ,CAAC,OAAO,uDAAuD,EACxG,GAAG,IAAI,IAAI,MAAM,CAAC,GAAG,CAAC,EAAE,CACzB,CAAC;QACJ,CAAC;IACH,CAAC;IACD,OAAO,EAAE,GAAG,QAAQ,EAAE,GAAG,IAAI,EAAE,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAc;IAC1D,IAAI,KAAc,CAAC;IACnB,IAAI,CAAC;QACH,KAAK,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5B,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,OAAO,GAAG,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,CAAC;QACzE,MAAM,IAAI,sBAAsB,CAAC,wBAAwB,EAAE,OAAO,CAAC,CAAC;IACtE,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,sBAAsB,CAAC,wBAAwB,EAAE,8BAA8B,CAAC,CAAC;IACjH,UAAU,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,UAAU,EAAE,WAAW,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,GAAG,CAAC,CAAC;IAEnF,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClE,MAAM,IAAI,sBAAsB,CAC9B,oBAAoB,EACpB,iDAAiD,EACjD,YAAY,CACb,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;QAC/D,MAAM,IAAI,sBAAsB,CAC9B,oBAAoB,EACpB,8CAA8C,EAC9C,YAAY,CACb,CAAC;IACJ,CAAC;IAED,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC;IAC9B,IAAI,OAAO,KAAK,2BAA2B,EAAE,CAAC;QAC5C,MAAM,IAAI,sBAAsB,CAC9B,+BAA+B,EAC/B,0BAA0B,2BAA2B,gBAAgB,EACrE,WAAW,CACZ,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;QACnC,IAAI,KAAK,CAAC,SAAS,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACjC,MAAM,IAAI,sBAAsB,CAC9B,kCAAkC,EAClC,sHAAsH,EACtH,aAAa,CACd,CAAC;QACJ,CAAC;QACD,MAAM,KAAK,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACjC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;YAClB,MAAM,IAAI,sBAAsB,CAC9B,yBAAyB,EACzB,mCAAmC,EACnC,gBAAgB,CACjB,CAAC;QACJ,UAAU,CAAC,KAAK,EAAE,CAAC,UAAU,EAAE,UAAU,EAAE,QAAQ,CAAC,EAAE,gBAAgB,CAAC,CAAC;QAExE,IAAI,KAAK,CAAC,QAAQ,KAAK,SAAS,IAAI,KAAK,CAAC,MAAM,KAAK,SAAS,EAAE,CAAC;YAC/D,MAAM,IAAI,sBAAsB,CAC9B,oBAAoB,EACpB,8CAA8C,EAC9C,yBAAyB,CAC1B,CAAC;QACJ,CAAC;QAED,MAAM,QAAQ,GAAG,UAAU,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,yBAAyB,CAAC,CAAC;QACvF,OAAO;YACL,OAAO,EAAE,2BAA2B;YACpC,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,yBAAyB,CAAC;YAClE,QAAQ;SACT,CAAC;IACJ,CAAC;IAED,OAAO;QACL,OAAO,EAAE,2BAA2B;QACpC,GAAG,CAAC,KAAK,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,aAAa,CAAC,KAAK,CAAC,QAAQ,EAAE,YAAY,CAAC,EAAE,CAAC;QAClG,QAAQ,EAAE,UAAU,CAAC,KAAK,CAAC,QAAQ,IAAI,KAAK,CAAC,MAAM,EAAE,YAAY,CAAC;KACnE,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,4BAA4B,CAAC,QAAiB,EAAE,QAAgB;IACpF,IAAI,MAAc,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,GAAG,MAAM,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAc,EAAE,CAAC;QACxB,MAAM,KAAK,GAAG,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,+BAA+B,QAAQ,IAAI,CAAC,CAAC;QACjH,IAAI,KAAK,YAAY,KAAK;YAAE,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC;QAChD,MAAM,KAAK,CAAC;IACd,CAAC;IACD,OAAO,+BAA+B,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;AAC3D,CAAC;AAED,SAAS,UAAU,CAAC,KAAc,EAAE,IAAY;IAC9C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QACvB,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,4BAA4B,EAAE,IAAI,CAAC,CAAC;IAClG,OAAO,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE,CAAC,SAAS,CAAC,KAAK,EAAE,GAAG,IAAI,IAAI,KAAK,GAAG,CAAC,CAAC,CAAC;AAC5E,CAAC;AAED,SAAS,SAAS,CAAC,KAAc,EAAE,IAAY;IAC7C,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClB,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,gCAAgC,EAAE,IAAI,CAAC,CAAC;IACtG,UAAU,CACR,KAAK,EACL;QACE,IAAI;QACJ,SAAS;QACT,SAAS;QACT,WAAW;QACX,UAAU;QACV,WAAW;QACX,WAAW;QACX,SAAS;QACT,UAAU;QACV,UAAU;QACV,aAAa;QACb,uBAAuB;QACvB,0BAA0B;QAC1B,WAAW;KACZ,EACD,IAAI,CACL,CAAC;IACF,MAAM,UAAU,GAAG,CAAC,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,WAAW,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,SAAS,CAAC,CAAC;IACvG,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,KAAK,CAAC,UAAU,CAAC,CAAC,CAAW,CAAC,KAAK,QAAQ,EAAE,CAAC;QAClF,MAAM,IAAI,sBAAsB,CAC9B,yBAAyB,EACzB,oGAAoG,EACpG,IAAI,CACL,CAAC;IACJ,CAAC;IACD,MAAM,OAAO,GAAG,KAAK,CAAC,UAAU,CAAC,CAAC,CAAW,CAAW,CAAC;IACzD,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,SAAS,GAAG,eAAe,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC;IAC5D,MAAM,aAAa,GAAG,cAAc,CAAC,KAAK,EAAE,SAAS,EAAE,IAAI,CAAC,CAAC;IAC7D,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,QAAQ,GAAG,eAAe,CAAC,KAAK,EAAE,UAAU,EAAE,IAAI,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,eAAe,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,CAAC,CAAC;IAChE,IAAI,qBAAqB,GAAG,eAAe,CAAC,KAAK,EAAE,uBAAuB,EAAE,IAAI,CAAC,CAAC;IAClF,IAAI,wBAAwB,GAAG,eAAe,CAAC,KAAK,EAAE,0BAA0B,EAAE,IAAI,CAAC,CAAC;IACxF,IAAI,KAAK,CAAC,SAAS,KAAK,SAAS,EAAE,CAAC;QAClC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,SAAS,CAAC;YAC5B,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,8BAA8B,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;QACnH,UAAU,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC,cAAc,EAAE,iBAAiB,CAAC,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;QACtF,IAAI,qBAAqB,KAAK,SAAS,IAAI,wBAAwB,KAAK,SAAS,EAAE,CAAC;YAClF,MAAM,IAAI,sBAAsB,CAC9B,oBAAoB,EACpB,+DAA+D,EAC/D,IAAI,CACL,CAAC;QACJ,CAAC;QACD,qBAAqB,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,cAAc,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;QAC9F,wBAAwB,GAAG,eAAe,CAAC,KAAK,CAAC,SAAS,EAAE,iBAAiB,EAAE,GAAG,IAAI,YAAY,CAAC,CAAC;IACtG,CAAC;IACD,IAAI,WAAW,KAAK,IAAI,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QACxD,MAAM,IAAI,sBAAsB,CAAC,oBAAoB,EAAE,8CAA8C,EAAE,IAAI,CAAC,CAAC;IAC/G,CAAC;IACD,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,IAAI,SAAS,GAAG,SAAS,EAAE,CAAC;QAChF,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,oCAAoC,EAAE,IAAI,CAAC,CAAC;IAC1G,CAAC;IACD,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,KAAK,SAAS,IAAI,QAAQ,GAAG,QAAQ,EAAE,CAAC;QAC5E,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,kCAAkC,EAAE,IAAI,CAAC,CAAC;IACxG,CAAC;IACD,OAAO;QACL,OAAO;QACP,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,CAAC;QACjD,GAAG,CAAC,aAAa,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,aAAa,EAAE,CAAC;QAClE,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC;QAC/C,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,CAAC;QACrD,GAAG,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,CAAC;QACzE,GAAG,CAAC,wBAAwB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,wBAAwB,EAAE,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,SAAS,gBAAgB,CACvB,IAAkC,EAClC,KAAqB,EACrB,IAAY;IAEZ,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE,CAAC;QAClF,MAAM,IAAI,sBAAsB,CAC9B,kCAAkC,EAClC,6CAA6C,EAC7C,IAAI,CACL,CAAC;IACJ,CAAC;IACD,IACE,CAAC,IAAI,CAAC,qBAAqB,KAAK,SAAS,IAAI,IAAI,CAAC,wBAAwB,KAAK,SAAS,CAAC;QACzF,KAAK,CAAC,IAAI,KAAK,WAAW,EAC1B,CAAC;QACD,MAAM,IAAI,sBAAsB,CAC9B,kCAAkC,EAClC,oDAAoD,EACpD,IAAI,CACL,CAAC;IACJ,CAAC;IACD,IAAI,IAAI,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QAC/B,IAAI,CAAC;YACH,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAChC,CAAC;QAAC,MAAM,CAAC;YACP,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,6CAA6C,EAAE,IAAI,CAAC,CAAC;QACnH,CAAC;IACH,CAAC;IACD,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,EAAE,CAAC;QACzD,MAAM,IAAI,sBAAsB,CAAC,oBAAoB,EAAE,qDAAqD,EAAE,IAAI,CAAC,CAAC;IACtH,CAAC;IACD,OAAO;QACL,OAAO,EAAE,KAAK,CAAC,EAAE;QACjB,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,WAAW,KAAK,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,IAAI,EAAE,CAAC;QACxG,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC;QACtE,GAAG,CAAC,IAAI,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,CAAC,OAAO,EAAE,CAAC;QAChE,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,IAAI,CAAC,QAAQ,EAAE,CAAC;QACnE,GAAG,CAAC,IAAI,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,IAAI,CAAC,WAAW,EAAE,CAAC;QAC5E,GAAG,CAAC,IAAI,CAAC,qBAAqB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,qBAAqB,EAAE,IAAI,CAAC,qBAAqB,EAAE,CAAC;QAC1G,GAAG,CAAC,IAAI,CAAC,wBAAwB,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,wBAAwB,EAAE,IAAI,CAAC,wBAAwB,EAAE,CAAC;KACpH,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CAAC,QAA2B,EAAE,SAAiB;IAClE,MAAM,OAAO,GAAG,QAAQ,CAAC,QAAQ;SAC9B,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC;SACzC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,CAAC,EAAE,KAAK,SAAS,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;IAC5F,IAAI,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACzB,MAAM,IAAI,sBAAsB,CAC9B,6BAA6B,EAC7B,iCAAiC,SAAS,IAAI,EAC9C,SAAS,CACV,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,sBAAsB,CAC9B,+BAA+B,EAC/B,sCAAsC,SAAS,IAAI,EACnD,SAAS,CACV,CAAC;IACJ,CAAC;IACD,OAAO,OAAO,CAAC,CAAC,CAAmB,CAAC;AACtC,CAAC;AAED,SAAS,oBAAoB,CAAC,OAAiC;IAC7D,IAAI,OAAO,CAAC,OAAO,KAAK,2BAA2B,EAAE,CAAC;QACpD,MAAM,IAAI,sBAAsB,CAAC,+BAA+B,EAAE,gCAAgC,EAAE,WAAW,CAAC,CAAC;IACnH,CAAC;AACH,CAAC;AAED,SAAS,mBAAmB,CAC1B,QAAgE,EAChE,QAA2B;IAE3B,IAAI,QAAQ,KAAK,SAAS;QAAE,OAAO;IACnC,MAAM,OAAO,GACX,OAAO,QAAQ,KAAK,QAAQ;QAC1B,CAAC,CAAC,QAAQ,KAAK,QAAQ,CAAC,gBAAgB,CAAC,EAAE;YACzC,QAAQ,KAAK,QAAQ,CAAC,gBAAgB,CAAC,IAAI;YAC3C,QAAQ,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC;QACnG,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,KAAK,SAAS,IAAI,QAAQ,CAAC,EAAE,KAAK,QAAQ,CAAC,gBAAgB,CAAC,EAAE,CAAC;YAC3E,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS,IAAI,QAAQ,CAAC,IAAI,KAAK,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC;YACjF,CAAC,QAAQ,CAAC,IAAI,KAAK,SAAS;gBAC1B,QAAQ,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,gBAAgB,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC,CAAC;IAChH,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,MAAM,IAAI,sBAAsB,CAC9B,6BAA6B,EAC7B,yDAAyD,EACzD,YAAY,CACb,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,aAAa,CAAC,KAAc,EAAE,IAAY;IACjD,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,OAAO,KAAK,CAAC;IACvE,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAClB,MAAM,IAAI,sBAAsB,CAC9B,yBAAyB,EACzB,yDAAyD,EACzD,IAAI,CACL,CAAC;IACJ,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,IAAI,CAAC,CAAC;IAChD,MAAM,QAAQ,GAAsC;QAClD,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACzD,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAChE,CAAC;IACF,IAAI,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC;QACpC,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,sCAAsC,EAAE,IAAI,CAAC,CAAC;IAC5G,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,SAAS,UAAU,CAAC,MAAmB,EAAE,OAA0B,EAAE,IAAY;IAC/E,MAAM,UAAU,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC;IACpC,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC;IAC1E,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,sBAAsB,CAC9B,4BAA4B,EAC5B,qBAAqB,OAAO,CAAC,CAAC,CAAC,IAAI,EACnC,GAAG,IAAI,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,CACxB,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,cAAc,CAAC,MAAmB,EAAE,GAAW,EAAE,IAAY;IACpE,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ;QACjC,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,GAAG,GAAG,oBAAoB,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IAC5G,OAAO,MAAM,CAAC,GAAG,CAAW,CAAC;AAC/B,CAAC;AAED,SAAS,eAAe,CAAC,MAAmB,EAAE,GAAW,EAAE,IAAY;IACrE,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS;QAClC,MAAM,IAAI,sBAAsB,CAAC,yBAAyB,EAAE,GAAG,GAAG,qBAAqB,EAAE,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC;IAC7G,OAAO,MAAM,CAAC,GAAG,CAAY,CAAC;AAChC,CAAC;AAED,SAAS,eAAe,CAAC,MAAmB,EAAE,GAAW,EAAE,IAAY;IACrE,IAAI,MAAM,CAAC,GAAG,CAAC,KAAK,SAAS;QAAE,OAAO,SAAS,CAAC;IAChD,IAAI,CAAC,MAAM,CAAC,aAAa,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,OAAO,MAAM,CAAC,GAAG,CAAC,KAAK,QAAQ,IAAK,MAAM,CAAC,GAAG,CAAY,GAAG,CAAC,EAAE,CAAC;QACzG,MAAM,IAAI,sBAAsB,CAC9B,yBAAyB,EACzB,GAAG,GAAG,kCAAkC,EACxC,GAAG,IAAI,IAAI,GAAG,EAAE,CACjB,CAAC;IACJ,CAAC;IACD,OAAO,MAAM,CAAC,GAAG,CAAW,CAAC;AAC/B,CAAC;AAMD,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC"}
@@ -0,0 +1,42 @@
1
+ import { type CanonicalContract } from "./contract/ir.js";
2
+ import { type TemplateIdentity as DiscoveredTemplateIdentity, type TemplateSelector } from "./template-discovery.js";
3
+ export type PullRequestTemplateErrorCode = "PR_TEMPLATE_EMPTY" | "PR_TEMPLATE_UNSUPPORTED_CONSTRUCT" | "PR_TEMPLATE_AMBIGUOUS_STRUCTURE" | "PR_TEMPLATE_NOT_PULL_REQUEST" | "PR_TEMPLATE_READ_FAILED";
4
+ export interface PullRequestTemplateErrorDetails {
5
+ readonly path?: string;
6
+ readonly line?: number;
7
+ readonly construct?: string;
8
+ readonly reason?: string;
9
+ }
10
+ /** A typed failure raised when the supported PR-template subset cannot be represented safely. */
11
+ export declare class PullRequestTemplateError extends Error {
12
+ readonly code: PullRequestTemplateErrorCode;
13
+ readonly details: PullRequestTemplateErrorDetails;
14
+ constructor(code: PullRequestTemplateErrorCode, message: string, details?: PullRequestTemplateErrorDetails, options?: ErrorOptions);
15
+ toJSON(): {
16
+ code: PullRequestTemplateErrorCode;
17
+ message: string;
18
+ details: PullRequestTemplateErrorDetails;
19
+ };
20
+ }
21
+ /**
22
+ * Parse one repository-native PR template into the existing canonical IR.
23
+ *
24
+ * The identity is deliberately the discovery-layer identity. This keeps
25
+ * filesystem discovery and parsing as separate concerns while ensuring the
26
+ * compiled contract cannot be detached from a native template path.
27
+ */
28
+ export declare function parsePullRequestTemplate(markdown: string, identity: DiscoveredTemplateIdentity): CanonicalContract;
29
+ /** Compile one discovered native PR template from a repository root. */
30
+ export declare function compilePullRequestTemplate(repositoryRoot?: string | URL, selector?: string | TemplateSelector): Promise<CanonicalContract>;
31
+ /** Synchronous counterpart for callers that already operate synchronously. */
32
+ export declare function compilePullRequestTemplateSync(repositoryRoot?: string | URL, selector?: string | TemplateSelector): CanonicalContract;
33
+ /** Compile all native PR templates in the discovery layer's stable order. */
34
+ export declare function compilePullRequestTemplates(repositoryRoot?: string | URL): Promise<readonly CanonicalContract[]>;
35
+ /** Synchronous counterpart of compilePullRequestTemplates. */
36
+ export declare function compilePullRequestTemplatesSync(repositoryRoot?: string | URL): readonly CanonicalContract[];
37
+ /**
38
+ * Render the structural portion of a validated PR contract as canonical GFM.
39
+ * No placeholder, requirement, or policy is invented when the IR does not
40
+ * contain one.
41
+ */
42
+ export declare function renderPullRequestTemplate(input: unknown): string;