@agent-teams/engineering-foundation 0.13.1 → 0.15.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/canonical-json.d.ts +12 -0
- package/dist/canonical-json.d.ts.map +1 -0
- package/dist/canonical-json.js +151 -0
- package/dist/canonical-json.js.map +1 -0
- package/dist/document-authoring/adapters/canonical-markdown.d.ts +14 -0
- package/dist/document-authoring/adapters/canonical-markdown.d.ts.map +1 -0
- package/dist/document-authoring/adapters/canonical-markdown.js +354 -0
- package/dist/document-authoring/adapters/canonical-markdown.js.map +1 -0
- package/dist/document-authoring/adapters/node/load-validated-document-authoring-profile.d.ts +31 -0
- package/dist/document-authoring/adapters/node/load-validated-document-authoring-profile.d.ts.map +1 -0
- package/dist/document-authoring/adapters/node/load-validated-document-authoring-profile.js +47 -0
- package/dist/document-authoring/adapters/node/load-validated-document-authoring-profile.js.map +1 -0
- package/dist/document-authoring/adapters/node/node-authoring-profile-reader.d.ts.map +1 -1
- package/dist/document-authoring/adapters/node/node-authoring-profile-reader.js +14 -36
- package/dist/document-authoring/adapters/node/node-authoring-profile-reader.js.map +1 -1
- package/dist/document-authoring/adapters/node/node-document-contract-validator.d.ts +7 -0
- package/dist/document-authoring/adapters/node/node-document-contract-validator.d.ts.map +1 -0
- package/dist/document-authoring/adapters/node/node-document-contract-validator.js +179 -0
- package/dist/document-authoring/adapters/node/node-document-contract-validator.js.map +1 -0
- package/dist/document-authoring/adapters/node/node-document-planning-profile-reader.d.ts +10 -0
- package/dist/document-authoring/adapters/node/node-document-planning-profile-reader.d.ts.map +1 -0
- package/dist/document-authoring/adapters/node/node-document-planning-profile-reader.js +72 -0
- package/dist/document-authoring/adapters/node/node-document-planning-profile-reader.js.map +1 -0
- package/dist/document-authoring/adapters/node/node-document-planning-state-reader.d.ts +10 -0
- package/dist/document-authoring/adapters/node/node-document-planning-state-reader.d.ts.map +1 -0
- package/dist/document-authoring/adapters/node/node-document-planning-state-reader.js +164 -0
- package/dist/document-authoring/adapters/node/node-document-planning-state-reader.js.map +1 -0
- package/dist/document-authoring/adapters/node/node-document-template-reader.d.ts +10 -0
- package/dist/document-authoring/adapters/node/node-document-template-reader.d.ts.map +1 -0
- package/dist/document-authoring/adapters/node/node-document-template-reader.js +32 -0
- package/dist/document-authoring/adapters/node/node-document-template-reader.js.map +1 -0
- package/dist/document-authoring/adapters/node/read-document-authority-file.d.ts.map +1 -1
- package/dist/document-authoring/adapters/node/read-document-authority-file.js +3 -13
- package/dist/document-authoring/adapters/node/read-document-authority-file.js.map +1 -1
- package/dist/document-authoring/application/model/document-planning.d.ts +171 -0
- package/dist/document-authoring/application/model/document-planning.d.ts.map +1 -0
- package/dist/document-authoring/application/model/document-planning.js +2 -0
- package/dist/document-authoring/application/model/document-planning.js.map +1 -0
- package/dist/document-authoring/application/policies/authoring-profile-semantics.d.ts +38 -0
- package/dist/document-authoring/application/policies/authoring-profile-semantics.d.ts.map +1 -0
- package/dist/document-authoring/application/policies/authoring-profile-semantics.js +122 -0
- package/dist/document-authoring/application/policies/authoring-profile-semantics.js.map +1 -0
- package/dist/document-authoring/application/policies/document-contract-digests.d.ts +20 -0
- package/dist/document-authoring/application/policies/document-contract-digests.d.ts.map +1 -0
- package/dist/document-authoring/application/policies/document-contract-digests.js +275 -0
- package/dist/document-authoring/application/policies/document-contract-digests.js.map +1 -0
- package/dist/document-authoring/application/policies/document-logical-preimage.d.ts +14 -0
- package/dist/document-authoring/application/policies/document-logical-preimage.d.ts.map +1 -0
- package/dist/document-authoring/application/policies/document-logical-preimage.js +61 -0
- package/dist/document-authoring/application/policies/document-logical-preimage.js.map +1 -0
- package/dist/document-authoring/application/policies/document-planning-policy-error.d.ts +6 -0
- package/dist/document-authoring/application/policies/document-planning-policy-error.d.ts.map +1 -0
- package/dist/document-authoring/application/policies/document-planning-policy-error.js +9 -0
- package/dist/document-authoring/application/policies/document-planning-policy-error.js.map +1 -0
- package/dist/document-authoring/application/policies/document-repository-path.d.ts +1 -0
- package/dist/document-authoring/application/policies/document-repository-path.d.ts.map +1 -1
- package/dist/document-authoring/application/policies/document-repository-path.js +21 -2
- package/dist/document-authoring/application/policies/document-repository-path.js.map +1 -1
- package/dist/document-authoring/application/policies/document-temporary-path.d.ts +7 -0
- package/dist/document-authoring/application/policies/document-temporary-path.d.ts.map +1 -0
- package/dist/document-authoring/application/policies/document-temporary-path.js +34 -0
- package/dist/document-authoring/application/policies/document-temporary-path.js.map +1 -0
- package/dist/document-authoring/application/policies/normalize-document-intent.d.ts +3 -0
- package/dist/document-authoring/application/policies/normalize-document-intent.d.ts.map +1 -0
- package/dist/document-authoring/application/policies/normalize-document-intent.js +104 -0
- package/dist/document-authoring/application/policies/normalize-document-intent.js.map +1 -0
- package/dist/document-authoring/application/policies/resolve-document-authoring.d.ts +13 -0
- package/dist/document-authoring/application/policies/resolve-document-authoring.d.ts.map +1 -0
- package/dist/document-authoring/application/policies/resolve-document-authoring.js +154 -0
- package/dist/document-authoring/application/policies/resolve-document-authoring.js.map +1 -0
- package/dist/document-authoring/application/ports/canonical-document-renderer.d.ts +29 -0
- package/dist/document-authoring/application/ports/canonical-document-renderer.d.ts.map +1 -0
- package/dist/document-authoring/application/ports/canonical-document-renderer.js +2 -0
- package/dist/document-authoring/application/ports/canonical-document-renderer.js.map +1 -0
- package/dist/document-authoring/application/ports/document-contract-validator.d.ts +6 -0
- package/dist/document-authoring/application/ports/document-contract-validator.d.ts.map +1 -0
- package/dist/document-authoring/application/ports/document-contract-validator.js +2 -0
- package/dist/document-authoring/application/ports/document-contract-validator.js.map +1 -0
- package/dist/document-authoring/application/ports/document-planning-profile-reader.d.ts +9 -0
- package/dist/document-authoring/application/ports/document-planning-profile-reader.d.ts.map +1 -0
- package/dist/document-authoring/application/ports/document-planning-profile-reader.js +2 -0
- package/dist/document-authoring/application/ports/document-planning-profile-reader.js.map +1 -0
- package/dist/document-authoring/application/ports/document-planning-state-reader.d.ts +9 -0
- package/dist/document-authoring/application/ports/document-planning-state-reader.d.ts.map +1 -0
- package/dist/document-authoring/application/ports/document-planning-state-reader.js +2 -0
- package/dist/document-authoring/application/ports/document-planning-state-reader.js.map +1 -0
- package/dist/document-authoring/application/ports/document-template-reader.d.ts +9 -0
- package/dist/document-authoring/application/ports/document-template-reader.d.ts.map +1 -0
- package/dist/document-authoring/application/ports/document-template-reader.js +2 -0
- package/dist/document-authoring/application/ports/document-template-reader.js.map +1 -0
- package/dist/document-authoring/application/ports/documentation-catalog-reader.d.ts +11 -0
- package/dist/document-authoring/application/ports/documentation-catalog-reader.d.ts.map +1 -0
- package/dist/document-authoring/application/ports/documentation-catalog-reader.js +2 -0
- package/dist/document-authoring/application/ports/documentation-catalog-reader.js.map +1 -0
- package/dist/document-authoring/application/use-cases/build-documentation-catalog.d.ts +2 -1
- package/dist/document-authoring/application/use-cases/build-documentation-catalog.d.ts.map +1 -1
- package/dist/document-authoring/application/use-cases/build-documentation-catalog.js.map +1 -1
- package/dist/document-authoring/application/use-cases/compile-document-plan.d.ts +6 -0
- package/dist/document-authoring/application/use-cases/compile-document-plan.d.ts.map +1 -0
- package/dist/document-authoring/application/use-cases/compile-document-plan.js +156 -0
- package/dist/document-authoring/application/use-cases/compile-document-plan.js.map +1 -0
- package/dist/document-authoring/application/use-cases/plan-documentation-document.d.ts +66 -0
- package/dist/document-authoring/application/use-cases/plan-documentation-document.d.ts.map +1 -0
- package/dist/document-authoring/application/use-cases/plan-documentation-document.js +276 -0
- package/dist/document-authoring/application/use-cases/plan-documentation-document.js.map +1 -0
- package/dist/document-authoring/document-planning-error.d.ts +6 -0
- package/dist/document-authoring/document-planning-error.d.ts.map +1 -0
- package/dist/document-authoring/document-planning-error.js +9 -0
- package/dist/document-authoring/document-planning-error.js.map +1 -0
- package/dist/document-authoring/index.d.ts +10 -0
- package/dist/document-authoring/index.d.ts.map +1 -1
- package/dist/document-authoring/index.js +72 -0
- package/dist/document-authoring/index.js.map +1 -1
- package/dist/transaction-coordination/adapters/node/document-temporary-identity.d.ts +4 -0
- package/dist/transaction-coordination/adapters/node/document-temporary-identity.d.ts.map +1 -0
- package/dist/transaction-coordination/adapters/node/document-temporary-identity.js +30 -0
- package/dist/transaction-coordination/adapters/node/document-temporary-identity.js.map +1 -0
- package/dist/transaction-coordination/adapters/node/legacy-document-envelope-v2.d.ts +5 -0
- package/dist/transaction-coordination/adapters/node/legacy-document-envelope-v2.d.ts.map +1 -0
- package/dist/transaction-coordination/adapters/node/legacy-document-envelope-v2.js +212 -0
- package/dist/transaction-coordination/adapters/node/legacy-document-envelope-v2.js.map +1 -0
- package/dist/transaction-coordination/adapters/node/node-foundation-transaction-slot.d.ts.map +1 -1
- package/dist/transaction-coordination/adapters/node/node-foundation-transaction-slot.js +47 -25
- package/dist/transaction-coordination/adapters/node/node-foundation-transaction-slot.js.map +1 -1
- package/package.json +1 -1
- package/schemas/document-authoring-profile/v1.schema.json +64 -15
- package/schemas/document-command-envelope/v1.schema.json +1 -1
- package/schemas/document-intent/v1.schema.json +48 -6
- package/schemas/document-plan/v1.schema.json +20 -4
- package/schemas/document-receipt/v1.schema.json +1 -1
- package/schemas/foundation-transaction-envelope/v2.schema.json +21 -3
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
type CanonicalJsonPrimitive = boolean | null | number | string;
|
|
2
|
+
export type CanonicalJsonValue = CanonicalJsonPrimitive | readonly CanonicalJsonValue[] | {
|
|
3
|
+
readonly [key: string]: CanonicalJsonValue;
|
|
4
|
+
};
|
|
5
|
+
export declare class CanonicalJsonError extends Error {
|
|
6
|
+
constructor(message: string);
|
|
7
|
+
}
|
|
8
|
+
export declare function canonicalJson(value: CanonicalJsonValue): string;
|
|
9
|
+
export declare function sha256Bytes(value: Uint8Array): `sha256:${string}`;
|
|
10
|
+
export declare function sha256Json(value: CanonicalJsonValue): `sha256:${string}`;
|
|
11
|
+
export {};
|
|
12
|
+
//# sourceMappingURL=canonical-json.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-json.d.ts","sourceRoot":"","sources":["../src/canonical-json.ts"],"names":[],"mappings":"AAEA,KAAK,sBAAsB,GAAG,OAAO,GAAG,IAAI,GAAG,MAAM,GAAG,MAAM,CAAC;AAC/D,MAAM,MAAM,kBAAkB,GAC1B,sBAAsB,GACtB,SAAS,kBAAkB,EAAE,GAC7B;IAAE,QAAQ,EAAE,GAAG,EAAE,MAAM,GAAG,kBAAkB,CAAA;CAAE,CAAC;AAEnD,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,YAAmB,OAAO,EAAE,MAAM,EAGjC;CACF;AA+KD,wBAAgB,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,MAAM,CAE/D;AAED,wBAAgB,WAAW,CAAC,KAAK,EAAE,UAAU,GAAG,UAAU,MAAM,EAAE,CAEjE;AAMD,wBAAgB,UAAU,CAAC,KAAK,EAAE,kBAAkB,GAAG,UAAU,MAAM,EAAE,CAExE"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
import { createHash } from "node:crypto";
|
|
2
|
+
export class CanonicalJsonError extends Error {
|
|
3
|
+
constructor(message) {
|
|
4
|
+
super(message);
|
|
5
|
+
this.name = "CanonicalJsonError";
|
|
6
|
+
}
|
|
7
|
+
}
|
|
8
|
+
function compareStrings(left, right) {
|
|
9
|
+
if (left < right) {
|
|
10
|
+
return -1;
|
|
11
|
+
}
|
|
12
|
+
if (left > right) {
|
|
13
|
+
return 1;
|
|
14
|
+
}
|
|
15
|
+
return 0;
|
|
16
|
+
}
|
|
17
|
+
function assertCanonicalString(value) {
|
|
18
|
+
if (value.normalize("NFC") !== value) {
|
|
19
|
+
throw new CanonicalJsonError("Canonical JSON strings must use NFC normalization.");
|
|
20
|
+
}
|
|
21
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
22
|
+
const codeUnit = value.charCodeAt(index);
|
|
23
|
+
if (codeUnit >= 0xd800 && codeUnit <= 0xdbff) {
|
|
24
|
+
const nextCodeUnit = value.charCodeAt(index + 1);
|
|
25
|
+
if (!(nextCodeUnit >= 0xdc00 && nextCodeUnit <= 0xdfff)) {
|
|
26
|
+
throw new CanonicalJsonError("Canonical JSON strings must not contain lone UTF-16 surrogates.");
|
|
27
|
+
}
|
|
28
|
+
index += 1;
|
|
29
|
+
}
|
|
30
|
+
else if (codeUnit >= 0xdc00 && codeUnit <= 0xdfff) {
|
|
31
|
+
throw new CanonicalJsonError("Canonical JSON strings must not contain lone UTF-16 surrogates.");
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
function invalidContainer(message) {
|
|
36
|
+
throw new CanonicalJsonError(`Canonical JSON ${message}.`);
|
|
37
|
+
}
|
|
38
|
+
function enterContainer(value, ancestors) {
|
|
39
|
+
if (ancestors.has(value)) {
|
|
40
|
+
invalidContainer("must not contain cycles");
|
|
41
|
+
}
|
|
42
|
+
ancestors.add(value);
|
|
43
|
+
return () => ancestors.delete(value);
|
|
44
|
+
}
|
|
45
|
+
function canonicalizeArray(value, ancestors) {
|
|
46
|
+
const leave = enterContainer(value, ancestors);
|
|
47
|
+
try {
|
|
48
|
+
if (Object.getPrototypeOf(value) !== Array.prototype) {
|
|
49
|
+
invalidContainer("arrays must use the intrinsic Array prototype");
|
|
50
|
+
}
|
|
51
|
+
const keys = Reflect.ownKeys(value);
|
|
52
|
+
if (keys.some((key) => typeof key !== "string" ||
|
|
53
|
+
(key !== "length" && !/^(?:0|[1-9][0-9]*)$/u.test(key)))) {
|
|
54
|
+
invalidContainer("arrays must not contain extra or symbolic properties");
|
|
55
|
+
}
|
|
56
|
+
const lengthDescriptor = Object.getOwnPropertyDescriptor(value, "length");
|
|
57
|
+
if (lengthDescriptor === undefined ||
|
|
58
|
+
!("value" in lengthDescriptor) ||
|
|
59
|
+
typeof lengthDescriptor.value !== "number") {
|
|
60
|
+
invalidContainer("arrays must expose an own data length");
|
|
61
|
+
}
|
|
62
|
+
const length = lengthDescriptor.value;
|
|
63
|
+
for (const key of keys) {
|
|
64
|
+
if (typeof key === "string" &&
|
|
65
|
+
key !== "length" &&
|
|
66
|
+
BigInt(key) >= BigInt(length)) {
|
|
67
|
+
invalidContainer("array indexes must be within the declared length");
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
const items = [];
|
|
71
|
+
for (let index = 0; index < length; index += 1) {
|
|
72
|
+
const descriptor = Object.getOwnPropertyDescriptor(value, String(index));
|
|
73
|
+
if (descriptor === undefined ||
|
|
74
|
+
!("value" in descriptor) ||
|
|
75
|
+
descriptor.enumerable !== true) {
|
|
76
|
+
invalidContainer("arrays must be dense own-data sequences");
|
|
77
|
+
}
|
|
78
|
+
items.push(canonicalize(descriptor.value, ancestors));
|
|
79
|
+
}
|
|
80
|
+
return `[${items.join(",")}]`;
|
|
81
|
+
}
|
|
82
|
+
finally {
|
|
83
|
+
leave();
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
function canonicalizeObject(candidate, ancestors) {
|
|
87
|
+
const prototype = Object.getPrototypeOf(candidate);
|
|
88
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
89
|
+
invalidContainer("objects must have a plain or null prototype");
|
|
90
|
+
}
|
|
91
|
+
const leave = enterContainer(candidate, ancestors);
|
|
92
|
+
try {
|
|
93
|
+
const entries = Reflect.ownKeys(candidate).map((key) => {
|
|
94
|
+
if (typeof key !== "string") {
|
|
95
|
+
invalidContainer("objects must not contain symbolic properties");
|
|
96
|
+
}
|
|
97
|
+
const descriptor = Object.getOwnPropertyDescriptor(candidate, key);
|
|
98
|
+
if (descriptor === undefined ||
|
|
99
|
+
!("value" in descriptor) ||
|
|
100
|
+
descriptor.enumerable !== true) {
|
|
101
|
+
invalidContainer("objects must contain only enumerable own-data properties");
|
|
102
|
+
}
|
|
103
|
+
assertCanonicalString(key);
|
|
104
|
+
return [key, descriptor.value];
|
|
105
|
+
});
|
|
106
|
+
entries.sort(([left], [right]) => compareStrings(left, right));
|
|
107
|
+
return `{${entries
|
|
108
|
+
.map(([key, item]) => `${JSON.stringify(key)}:${canonicalize(item, ancestors)}`)
|
|
109
|
+
.join(",")}}`;
|
|
110
|
+
}
|
|
111
|
+
finally {
|
|
112
|
+
leave();
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function canonicalize(value, ancestors) {
|
|
116
|
+
if (value === null || typeof value === "boolean") {
|
|
117
|
+
return JSON.stringify(value);
|
|
118
|
+
}
|
|
119
|
+
if (typeof value === "string") {
|
|
120
|
+
assertCanonicalString(value);
|
|
121
|
+
return JSON.stringify(value);
|
|
122
|
+
}
|
|
123
|
+
if (typeof value === "number") {
|
|
124
|
+
if (!Number.isFinite(value) ||
|
|
125
|
+
!Number.isSafeInteger(value) ||
|
|
126
|
+
Object.is(value, -0)) {
|
|
127
|
+
throw new CanonicalJsonError("Canonical JSON numbers must be finite safe integers other than negative zero.");
|
|
128
|
+
}
|
|
129
|
+
return JSON.stringify(value);
|
|
130
|
+
}
|
|
131
|
+
if (typeof value !== "object") {
|
|
132
|
+
invalidContainer("values must use the closed JSON data model");
|
|
133
|
+
}
|
|
134
|
+
if (Array.isArray(value)) {
|
|
135
|
+
return canonicalizeArray(value, ancestors);
|
|
136
|
+
}
|
|
137
|
+
return canonicalizeObject(value, ancestors);
|
|
138
|
+
}
|
|
139
|
+
export function canonicalJson(value) {
|
|
140
|
+
return canonicalize(value, new WeakSet());
|
|
141
|
+
}
|
|
142
|
+
export function sha256Bytes(value) {
|
|
143
|
+
return `sha256:${createHash("sha256").update(value).digest("hex")}`;
|
|
144
|
+
}
|
|
145
|
+
function sha256Text(value) {
|
|
146
|
+
return sha256Bytes(Buffer.from(value, "utf8"));
|
|
147
|
+
}
|
|
148
|
+
export function sha256Json(value) {
|
|
149
|
+
return sha256Text(canonicalJson(value));
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=canonical-json.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-json.js","sourceRoot":"","sources":["../src/canonical-json.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { CanonicalDocumentInput, CanonicalDocumentRenderer, CanonicalFrontmatter, GovernedTemplateSkeleton } from "../application/ports/canonical-document-renderer.js";
|
|
2
|
+
export type CanonicalMarkdownFailure = "frontmatter-invalid" | "template-invalid" | "template-limit-exceeded";
|
|
3
|
+
export declare class CanonicalMarkdownError extends Error {
|
|
4
|
+
readonly failure: CanonicalMarkdownFailure;
|
|
5
|
+
constructor(failure: CanonicalMarkdownFailure, message: string);
|
|
6
|
+
}
|
|
7
|
+
export declare function renderCanonicalFrontmatter(input: CanonicalFrontmatter): string;
|
|
8
|
+
export declare function parseGovernedTemplateSkeleton(source: string): GovernedTemplateSkeleton;
|
|
9
|
+
export declare function renderCanonicalDocument(input: CanonicalDocumentInput): string;
|
|
10
|
+
export declare class YamlCanonicalDocumentRenderer implements CanonicalDocumentRenderer {
|
|
11
|
+
parseTemplate(source: string): GovernedTemplateSkeleton;
|
|
12
|
+
render(input: CanonicalDocumentInput): string;
|
|
13
|
+
}
|
|
14
|
+
//# sourceMappingURL=canonical-markdown.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-markdown.d.ts","sourceRoot":"","sources":["../../../src/document-authoring/adapters/canonical-markdown.ts"],"names":[],"mappings":"AAMA,OAAO,KAAK,EACV,sBAAsB,EACtB,yBAAyB,EACzB,oBAAoB,EAEpB,wBAAwB,EACzB,MAAM,qDAAqD,CAAC;AAqC7D,MAAM,MAAM,wBAAwB,GAChC,qBAAqB,GACrB,kBAAkB,GAClB,yBAAyB,CAAC;AAE9B,qBAAa,sBAAuB,SAAQ,KAAK;IAC/C,QAAQ,CAAC,OAAO,EAAE,wBAAwB,CAAC;IAE3C,YAAY,OAAO,EAAE,wBAAwB,EAAE,OAAO,EAAE,MAAM,EAI7D;CACF;AAoOD,wBAAgB,0BAA0B,CAAC,KAAK,EAAE,oBAAoB,GAAG,MAAM,CA0B9E;AAkGD,wBAAgB,6BAA6B,CAC3C,MAAM,EAAE,MAAM,GACb,wBAAwB,CAoB1B;AAED,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAK7E;AAED,qBAAa,6BAA8B,YAAW,yBAAyB;IAC7E,aAAa,CAAC,MAAM,EAAE,MAAM,GAAG,wBAAwB,CAEtD;IAED,MAAM,CAAC,KAAK,EAAE,sBAAsB,GAAG,MAAM,CAE5C;CACF"}
|
|
@@ -0,0 +1,354 @@
|
|
|
1
|
+
import remarkParse from "remark-parse";
|
|
2
|
+
import { unified } from "unified";
|
|
3
|
+
import { visit as visitMarkdown } from "unist-util-visit";
|
|
4
|
+
import { isAlias, isNode, parseDocument, stringify, visit } from "yaml";
|
|
5
|
+
import { compareBinaryStrings } from "../../binary-string-comparator.js";
|
|
6
|
+
const MAX_TEMPLATE_BYTES = 256 * 1024;
|
|
7
|
+
const RESERVED_KEYS = new Set(["__proto__", "constructor", "prototype"]);
|
|
8
|
+
const FOUNDATION_FRONTMATTER_KEYS = Object.freeze([
|
|
9
|
+
"id",
|
|
10
|
+
"type",
|
|
11
|
+
"status",
|
|
12
|
+
"owner",
|
|
13
|
+
"summary",
|
|
14
|
+
"related"
|
|
15
|
+
]);
|
|
16
|
+
const INTENT_RESERVED_KEYS = new Set([
|
|
17
|
+
...FOUNDATION_FRONTMATTER_KEYS,
|
|
18
|
+
"destination",
|
|
19
|
+
"slug",
|
|
20
|
+
"title"
|
|
21
|
+
]);
|
|
22
|
+
const PLACEHOLDER_FRONTMATTER_PATTERN = /^---[ \t]*\n([\s\S]*?)\n---[ \t]*\n+/u;
|
|
23
|
+
const markdownParser = unified().use(remarkParse).freeze();
|
|
24
|
+
export class CanonicalMarkdownError extends Error {
|
|
25
|
+
failure;
|
|
26
|
+
constructor(failure, message) {
|
|
27
|
+
super(message);
|
|
28
|
+
this.name = "CanonicalMarkdownError";
|
|
29
|
+
this.failure = failure;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function invalidFrontmatter(message) {
|
|
33
|
+
throw new CanonicalMarkdownError("frontmatter-invalid", message);
|
|
34
|
+
}
|
|
35
|
+
function invalidTemplate(message) {
|
|
36
|
+
throw new CanonicalMarkdownError("template-invalid", message);
|
|
37
|
+
}
|
|
38
|
+
function assertText(value, field) {
|
|
39
|
+
if (value.length === 0 || value.includes("\0") || /[\r\n]/u.test(value)) {
|
|
40
|
+
invalidFrontmatter(`${field} must be a non-empty single-line string.`);
|
|
41
|
+
}
|
|
42
|
+
assertCanonicalUnicode(value, field);
|
|
43
|
+
}
|
|
44
|
+
function assertCanonicalUnicode(value, field) {
|
|
45
|
+
if (value.normalize("NFC") !== value) {
|
|
46
|
+
invalidFrontmatter(`${field} must use Unicode NFC.`);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function canonicalizeArray(value, ancestors) {
|
|
50
|
+
const ownKeys = Reflect.ownKeys(value);
|
|
51
|
+
if (ownKeys.length !== value.length + 1 ||
|
|
52
|
+
ownKeys.some((key) => typeof key !== "string" ||
|
|
53
|
+
(key !== "length" && !/^(?:0|[1-9][0-9]*)$/u.test(key)))) {
|
|
54
|
+
invalidFrontmatter("Frontmatter arrays must be dense and cannot have extra properties.");
|
|
55
|
+
}
|
|
56
|
+
const output = [];
|
|
57
|
+
for (let index = 0; index < value.length; index += 1) {
|
|
58
|
+
const item = Object.getOwnPropertyDescriptor(value, String(index));
|
|
59
|
+
if (item === undefined || !("value" in item) || item.enumerable !== true) {
|
|
60
|
+
invalidFrontmatter("Frontmatter arrays must contain enumerable data items.");
|
|
61
|
+
}
|
|
62
|
+
output.push(canonicalizeValue(item.value, ancestors));
|
|
63
|
+
}
|
|
64
|
+
return output;
|
|
65
|
+
}
|
|
66
|
+
function canonicalizeMap(value, ancestors) {
|
|
67
|
+
const prototype = Object.getPrototypeOf(value);
|
|
68
|
+
if (prototype !== Object.prototype && prototype !== null) {
|
|
69
|
+
invalidFrontmatter("Frontmatter mappings must be plain objects.");
|
|
70
|
+
}
|
|
71
|
+
const output = Object.create(null);
|
|
72
|
+
const ownKeys = Reflect.ownKeys(value);
|
|
73
|
+
if (ownKeys.some((key) => typeof key !== "string")) {
|
|
74
|
+
invalidFrontmatter("Frontmatter mappings cannot contain symbol keys.");
|
|
75
|
+
}
|
|
76
|
+
for (const key of ownKeys.toSorted(compareBinaryStrings)) {
|
|
77
|
+
assertCanonicalUnicode(key, "Frontmatter key");
|
|
78
|
+
if (RESERVED_KEYS.has(key)) {
|
|
79
|
+
invalidFrontmatter(`Frontmatter key ${key} is reserved.`);
|
|
80
|
+
}
|
|
81
|
+
const item = Object.getOwnPropertyDescriptor(value, key);
|
|
82
|
+
if (item === undefined || !("value" in item) || item.enumerable !== true) {
|
|
83
|
+
invalidFrontmatter("Frontmatter mappings cannot contain accessors.");
|
|
84
|
+
}
|
|
85
|
+
output[key] = canonicalizeValue(item.value, ancestors);
|
|
86
|
+
}
|
|
87
|
+
return output;
|
|
88
|
+
}
|
|
89
|
+
function canonicalizeValue(value, ancestors) {
|
|
90
|
+
if (value === null ||
|
|
91
|
+
typeof value === "string" ||
|
|
92
|
+
typeof value === "boolean") {
|
|
93
|
+
if (typeof value === "string") {
|
|
94
|
+
assertCanonicalUnicode(value, "Frontmatter string");
|
|
95
|
+
}
|
|
96
|
+
return value;
|
|
97
|
+
}
|
|
98
|
+
if (typeof value === "number") {
|
|
99
|
+
if (!Number.isSafeInteger(value) || Object.is(value, -0)) {
|
|
100
|
+
invalidFrontmatter("Frontmatter numbers must be safe integers and cannot be negative zero.");
|
|
101
|
+
}
|
|
102
|
+
return value;
|
|
103
|
+
}
|
|
104
|
+
if (typeof value !== "object") {
|
|
105
|
+
invalidFrontmatter("Frontmatter values must use the JSON data model.");
|
|
106
|
+
}
|
|
107
|
+
if (ancestors.has(value)) {
|
|
108
|
+
invalidFrontmatter("Frontmatter values cannot contain cycles.");
|
|
109
|
+
}
|
|
110
|
+
const nextAncestors = new Set(ancestors);
|
|
111
|
+
nextAncestors.add(value);
|
|
112
|
+
if (Array.isArray(value)) {
|
|
113
|
+
return canonicalizeArray(value, nextAncestors);
|
|
114
|
+
}
|
|
115
|
+
return canonicalizeMap(value, nextAncestors);
|
|
116
|
+
}
|
|
117
|
+
function canonicalFrontmatterObject(input) {
|
|
118
|
+
for (const [key, value] of [
|
|
119
|
+
["id", input.id],
|
|
120
|
+
["type", input.type],
|
|
121
|
+
["status", input.status],
|
|
122
|
+
["owner", input.owner],
|
|
123
|
+
["summary", input.summary]
|
|
124
|
+
]) {
|
|
125
|
+
assertText(value, key);
|
|
126
|
+
}
|
|
127
|
+
const result = Object.create(null);
|
|
128
|
+
result.id = input.id;
|
|
129
|
+
result.type = input.type;
|
|
130
|
+
result.status = input.status;
|
|
131
|
+
result.owner = input.owner;
|
|
132
|
+
result.summary = input.summary;
|
|
133
|
+
if (input.related !== undefined) {
|
|
134
|
+
const relatedSet = new Set(input.related);
|
|
135
|
+
if (relatedSet.size !== input.related.length) {
|
|
136
|
+
invalidFrontmatter("related must not contain duplicate identifiers.");
|
|
137
|
+
}
|
|
138
|
+
const relatedItems = [...input.related].toSorted(compareBinaryStrings);
|
|
139
|
+
for (const related of relatedItems) {
|
|
140
|
+
assertText(related, "related item");
|
|
141
|
+
}
|
|
142
|
+
result.related = relatedItems;
|
|
143
|
+
}
|
|
144
|
+
const metadata = input.additionalMetadata ?? {};
|
|
145
|
+
const metadataPrototype = Object.getPrototypeOf(metadata);
|
|
146
|
+
if (metadataPrototype !== Object.prototype && metadataPrototype !== null) {
|
|
147
|
+
invalidFrontmatter("Additional metadata must be a plain object.");
|
|
148
|
+
}
|
|
149
|
+
const metadataOwnKeys = Reflect.ownKeys(metadata);
|
|
150
|
+
if (metadataOwnKeys.some((key) => typeof key !== "string")) {
|
|
151
|
+
invalidFrontmatter("Additional metadata cannot contain symbol keys.");
|
|
152
|
+
}
|
|
153
|
+
const metadataKeys = metadataOwnKeys;
|
|
154
|
+
for (const key of metadataKeys) {
|
|
155
|
+
assertCanonicalUnicode(key, "Frontmatter key");
|
|
156
|
+
if (INTENT_RESERVED_KEYS.has(key)) {
|
|
157
|
+
invalidFrontmatter(`Additional metadata cannot replace governed key ${key}.`);
|
|
158
|
+
}
|
|
159
|
+
if (RESERVED_KEYS.has(key)) {
|
|
160
|
+
invalidFrontmatter(`Frontmatter key ${key} is reserved.`);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
const orderedMetadataKeys = metadataKeys.toSorted(compareBinaryStrings);
|
|
164
|
+
for (const key of orderedMetadataKeys) {
|
|
165
|
+
const item = Object.getOwnPropertyDescriptor(metadata, key);
|
|
166
|
+
if (item === undefined || !("value" in item) || item.enumerable !== true) {
|
|
167
|
+
invalidFrontmatter("Additional metadata cannot contain accessors.");
|
|
168
|
+
}
|
|
169
|
+
result[key] = canonicalizeValue(item.value, new Set());
|
|
170
|
+
}
|
|
171
|
+
return result;
|
|
172
|
+
}
|
|
173
|
+
function orderedYamlValue(value) {
|
|
174
|
+
if (Array.isArray(value)) {
|
|
175
|
+
const items = value;
|
|
176
|
+
return items.map((item) => orderedYamlValue(item));
|
|
177
|
+
}
|
|
178
|
+
if (value !== null && typeof value === "object") {
|
|
179
|
+
const mapping = value;
|
|
180
|
+
return new Map(Reflect.ownKeys(mapping)
|
|
181
|
+
.map((key) => key)
|
|
182
|
+
.toSorted(compareBinaryStrings)
|
|
183
|
+
.map((key) => [key, orderedYamlValue(mapping[key])]));
|
|
184
|
+
}
|
|
185
|
+
return value;
|
|
186
|
+
}
|
|
187
|
+
function orderedYamlFrontmatter(value) {
|
|
188
|
+
const entries = [];
|
|
189
|
+
for (const key of FOUNDATION_FRONTMATTER_KEYS) {
|
|
190
|
+
if (Object.hasOwn(value, key)) {
|
|
191
|
+
entries.push([
|
|
192
|
+
key,
|
|
193
|
+
orderedYamlValue(value[key])
|
|
194
|
+
]);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
const additionalKeys = Reflect.ownKeys(value)
|
|
198
|
+
.map((key) => key)
|
|
199
|
+
.filter((key) => !FOUNDATION_FRONTMATTER_KEYS.includes(key))
|
|
200
|
+
.toSorted(compareBinaryStrings);
|
|
201
|
+
for (const key of additionalKeys) {
|
|
202
|
+
entries.push([
|
|
203
|
+
key,
|
|
204
|
+
orderedYamlValue(value[key])
|
|
205
|
+
]);
|
|
206
|
+
}
|
|
207
|
+
return new Map(entries);
|
|
208
|
+
}
|
|
209
|
+
export function renderCanonicalFrontmatter(input) {
|
|
210
|
+
const value = canonicalFrontmatterObject(input);
|
|
211
|
+
const rendered = stringify(orderedYamlFrontmatter(value), {
|
|
212
|
+
aliasDuplicateObjects: false,
|
|
213
|
+
lineWidth: 0,
|
|
214
|
+
sortMapEntries: false
|
|
215
|
+
}).replaceAll("\r\n", "\n");
|
|
216
|
+
const parsed = parseDocument(rendered, {
|
|
217
|
+
customTags: [],
|
|
218
|
+
merge: false,
|
|
219
|
+
schema: "core",
|
|
220
|
+
uniqueKeys: true
|
|
221
|
+
});
|
|
222
|
+
if (parsed.errors.length > 0 || parsed.warnings.length > 0) {
|
|
223
|
+
invalidFrontmatter("Canonical YAML failed strict self-validation.");
|
|
224
|
+
}
|
|
225
|
+
const roundTrip = parsed.toJS({ maxAliasCount: 0 });
|
|
226
|
+
const canonicalRoundTrip = canonicalizeValue(roundTrip, new Set());
|
|
227
|
+
const canonicalExpected = canonicalizeValue(value, new Set());
|
|
228
|
+
if (JSON.stringify(canonicalRoundTrip) !== JSON.stringify(canonicalExpected)) {
|
|
229
|
+
invalidFrontmatter("Canonical YAML changed a frontmatter value during serialization.");
|
|
230
|
+
}
|
|
231
|
+
return rendered.trimEnd();
|
|
232
|
+
}
|
|
233
|
+
function normalizeTemplateSource(source) {
|
|
234
|
+
if (Buffer.byteLength(source, "utf8") > MAX_TEMPLATE_BYTES) {
|
|
235
|
+
throw new CanonicalMarkdownError("template-limit-exceeded", `Template exceeds the ${MAX_TEMPLATE_BYTES}-byte limit.`);
|
|
236
|
+
}
|
|
237
|
+
if (source.includes("\0") || /\r(?!\n)/u.test(source)) {
|
|
238
|
+
invalidTemplate("Template must be NUL-free text with LF or CRLF line endings.");
|
|
239
|
+
}
|
|
240
|
+
if (source.normalize("NFC") !== source) {
|
|
241
|
+
invalidTemplate("Template must use Unicode NFC.");
|
|
242
|
+
}
|
|
243
|
+
return source.replaceAll("\r\n", "\n");
|
|
244
|
+
}
|
|
245
|
+
function assertSafePlaceholderFrontmatter(source) {
|
|
246
|
+
const document = parseDocument(source, {
|
|
247
|
+
customTags: [],
|
|
248
|
+
merge: false,
|
|
249
|
+
schema: "core",
|
|
250
|
+
uniqueKeys: true
|
|
251
|
+
});
|
|
252
|
+
if (document.errors.length > 0 || document.warnings.length > 0) {
|
|
253
|
+
invalidTemplate("Markdown skeleton placeholder frontmatter must be valid strict YAML.");
|
|
254
|
+
}
|
|
255
|
+
let prohibited = { found: false };
|
|
256
|
+
visit(document, (_key, node) => {
|
|
257
|
+
if (isAlias(node) || (isNode(node) && (node.anchor !== undefined || node.tag !== undefined))) {
|
|
258
|
+
prohibited = { found: true };
|
|
259
|
+
return visit.BREAK;
|
|
260
|
+
}
|
|
261
|
+
return;
|
|
262
|
+
});
|
|
263
|
+
if (prohibited.found) {
|
|
264
|
+
invalidTemplate("Markdown skeleton placeholder frontmatter cannot use tags, anchors, or aliases.");
|
|
265
|
+
}
|
|
266
|
+
const value = document.toJS({ maxAliasCount: 0 });
|
|
267
|
+
if (value === null || typeof value !== "object" || Array.isArray(value)) {
|
|
268
|
+
invalidTemplate("Markdown skeleton placeholder frontmatter must be a mapping.");
|
|
269
|
+
}
|
|
270
|
+
canonicalizeValue(value, new Set());
|
|
271
|
+
}
|
|
272
|
+
function markdownNodes(source, type) {
|
|
273
|
+
const nodes = [];
|
|
274
|
+
const tree = markdownParser.parse(source);
|
|
275
|
+
visitMarkdown(tree, type, (node) => {
|
|
276
|
+
nodes.push(node);
|
|
277
|
+
});
|
|
278
|
+
return nodes;
|
|
279
|
+
}
|
|
280
|
+
function extractMarkdownSkeleton(source) {
|
|
281
|
+
const candidates = markdownNodes(source, "code").filter((node) => node.lang === "markdown" && (node.meta === null || node.meta === undefined));
|
|
282
|
+
if (candidates.length !== 1) {
|
|
283
|
+
invalidTemplate("Template must contain exactly one fenced markdown skeleton.");
|
|
284
|
+
}
|
|
285
|
+
const candidate = candidates[0];
|
|
286
|
+
const start = candidate?.position?.start.offset;
|
|
287
|
+
const end = candidate?.position?.end.offset;
|
|
288
|
+
if (start === undefined || end === undefined) {
|
|
289
|
+
invalidTemplate("Markdown skeleton must have a bounded source position.");
|
|
290
|
+
}
|
|
291
|
+
const fenced = source.slice(start, end);
|
|
292
|
+
const opening = /^(?<fence>`{3,})markdown[ \t]*\n/u.exec(fenced);
|
|
293
|
+
if (opening?.groups?.fence === undefined) {
|
|
294
|
+
invalidTemplate("Markdown skeleton must use a backtick fence and exact markdown info string.");
|
|
295
|
+
}
|
|
296
|
+
const closingStart = fenced.lastIndexOf("\n") + 1;
|
|
297
|
+
const closing = fenced.slice(closingStart);
|
|
298
|
+
if (!new RegExp(`^${opening.groups.fence}[ \\t]*$`, "u").test(closing)) {
|
|
299
|
+
invalidTemplate("Markdown skeleton fence must be closed canonically.");
|
|
300
|
+
}
|
|
301
|
+
return fenced.slice(opening[0].length, closingStart - 1);
|
|
302
|
+
}
|
|
303
|
+
function leadingH1(source) {
|
|
304
|
+
const headings = markdownNodes(source, "heading").filter((node) => node.depth === 1);
|
|
305
|
+
const first = headings[0];
|
|
306
|
+
const start = first?.position?.start.offset;
|
|
307
|
+
const end = first?.position?.end.offset;
|
|
308
|
+
if (headings.length !== 1 || first?.depth !== 1 || start !== 0 || end === undefined) {
|
|
309
|
+
invalidTemplate("Markdown skeleton must contain exactly one leading H1 heading.");
|
|
310
|
+
}
|
|
311
|
+
const line = source.slice(0, end);
|
|
312
|
+
const match = /^# (?<heading>[^\n]+)$/u.exec(line);
|
|
313
|
+
const heading = match?.groups?.heading;
|
|
314
|
+
if (heading === undefined || heading.trim() !== heading || heading.length === 0) {
|
|
315
|
+
invalidTemplate("Markdown skeleton H1 must contain a non-empty canonical ATX heading.");
|
|
316
|
+
}
|
|
317
|
+
return { end, heading };
|
|
318
|
+
}
|
|
319
|
+
export function parseGovernedTemplateSkeleton(source) {
|
|
320
|
+
const normalized = normalizeTemplateSource(source);
|
|
321
|
+
const skeleton = extractMarkdownSkeleton(normalized);
|
|
322
|
+
const frontmatter = PLACEHOLDER_FRONTMATTER_PATTERN.exec(skeleton);
|
|
323
|
+
if (frontmatter === null) {
|
|
324
|
+
invalidTemplate("Markdown skeleton must begin with placeholder frontmatter.");
|
|
325
|
+
}
|
|
326
|
+
assertSafePlaceholderFrontmatter(frontmatter[1] ?? "");
|
|
327
|
+
const bodyWithHeading = skeleton.slice(frontmatter[0].length);
|
|
328
|
+
const heading = leadingH1(bodyWithHeading);
|
|
329
|
+
const placeholderHeading = heading.heading;
|
|
330
|
+
const headingEnd = heading.end;
|
|
331
|
+
const body = bodyWithHeading.slice(headingEnd);
|
|
332
|
+
if (body.length > 0 && !body.startsWith("\n\n")) {
|
|
333
|
+
invalidTemplate("Markdown skeleton H1 must be followed by one blank line.");
|
|
334
|
+
}
|
|
335
|
+
return Object.freeze({
|
|
336
|
+
body: body.length === 0 ? "" : body.slice(2).replace(/\n+$/u, ""),
|
|
337
|
+
placeholderHeading
|
|
338
|
+
});
|
|
339
|
+
}
|
|
340
|
+
export function renderCanonicalDocument(input) {
|
|
341
|
+
assertText(input.heading, "heading");
|
|
342
|
+
const body = input.template.body.replace(/\n+$/u, "");
|
|
343
|
+
const suffix = body.length === 0 ? "" : `\n\n${body}`;
|
|
344
|
+
return `---\n${renderCanonicalFrontmatter(input.frontmatter)}\n---\n\n# ${input.heading}${suffix}\n`;
|
|
345
|
+
}
|
|
346
|
+
export class YamlCanonicalDocumentRenderer {
|
|
347
|
+
parseTemplate(source) {
|
|
348
|
+
return parseGovernedTemplateSkeleton(source);
|
|
349
|
+
}
|
|
350
|
+
render(input) {
|
|
351
|
+
return renderCanonicalDocument(input);
|
|
352
|
+
}
|
|
353
|
+
}
|
|
354
|
+
//# sourceMappingURL=canonical-markdown.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"canonical-markdown.js","sourceRoot":"","sources":["../../../src/document-authoring/adapters/canonical-markdown.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { DocumentArtifactType, DocumentCatalogCollection } from "../../application/model/document-planning.js";
|
|
2
|
+
import { readDocumentAuthorityFile } from "./read-document-authority-file.js";
|
|
3
|
+
export interface ValidatedDocumentAuthoringProfile {
|
|
4
|
+
readonly authoring: {
|
|
5
|
+
readonly artifactTypes: readonly DocumentArtifactType[];
|
|
6
|
+
readonly mode: "create-only";
|
|
7
|
+
};
|
|
8
|
+
readonly catalog: {
|
|
9
|
+
readonly collections: readonly DocumentCatalogCollection[];
|
|
10
|
+
readonly excludedPrefixes?: readonly string[];
|
|
11
|
+
readonly metadataSchemaPath: string;
|
|
12
|
+
readonly ownerCatalog: {
|
|
13
|
+
readonly contract: "foundation.owner-map/v1";
|
|
14
|
+
readonly path: string;
|
|
15
|
+
};
|
|
16
|
+
};
|
|
17
|
+
readonly projectId: string;
|
|
18
|
+
readonly schemaVersion: 1;
|
|
19
|
+
}
|
|
20
|
+
export declare class InvalidDocumentAuthoringProfileError extends Error {
|
|
21
|
+
constructor(message: string, options?: ErrorOptions);
|
|
22
|
+
}
|
|
23
|
+
export declare function loadValidatedDocumentAuthoringProfile(request: {
|
|
24
|
+
readonly consumerRoot: string;
|
|
25
|
+
readonly path: string;
|
|
26
|
+
readonly signal?: AbortSignal;
|
|
27
|
+
}): Promise<{
|
|
28
|
+
readonly evidence: Awaited<ReturnType<typeof readDocumentAuthorityFile>>["evidence"];
|
|
29
|
+
readonly profile: ValidatedDocumentAuthoringProfile;
|
|
30
|
+
}>;
|
|
31
|
+
//# sourceMappingURL=load-validated-document-authoring-profile.d.ts.map
|
package/dist/document-authoring/adapters/node/load-validated-document-authoring-profile.d.ts.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"load-validated-document-authoring-profile.d.ts","sourceRoot":"","sources":["../../../../src/document-authoring/adapters/node/load-validated-document-authoring-profile.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,oBAAoB,EACpB,yBAAyB,EAC1B,MAAM,8CAA8C,CAAC;AAMtD,OAAO,EAAE,yBAAyB,EAAE,MAAM,mCAAmC,CAAC;AAI9E,MAAM,WAAW,iCAAiC;IAChD,QAAQ,CAAC,SAAS,EAAE;QAClB,QAAQ,CAAC,aAAa,EAAE,SAAS,oBAAoB,EAAE,CAAC;QACxD,QAAQ,CAAC,IAAI,EAAE,aAAa,CAAC;KAC9B,CAAC;IACF,QAAQ,CAAC,OAAO,EAAE;QAChB,QAAQ,CAAC,WAAW,EAAE,SAAS,yBAAyB,EAAE,CAAC;QAC3D,QAAQ,CAAC,gBAAgB,CAAC,EAAE,SAAS,MAAM,EAAE,CAAC;QAC9C,QAAQ,CAAC,kBAAkB,EAAE,MAAM,CAAC;QACpC,QAAQ,CAAC,YAAY,EAAE;YACrB,QAAQ,CAAC,QAAQ,EAAE,yBAAyB,CAAC;YAC7C,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;SACvB,CAAC;KACH,CAAC;IACF,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC;CAC3B;AAED,qBAAa,oCAAqC,SAAQ,KAAK;IAC7D,YAAY,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY,EAGlD;CACF;AASD,wBAAsB,qCAAqC,CAAC,OAAO,EAAE;IACnE,QAAQ,CAAC,YAAY,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,MAAM,CAAC,EAAE,WAAW,CAAC;CAC/B,GAAG,OAAO,CAAC;IACV,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC,UAAU,CAAC,OAAO,yBAAyB,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IACrF,QAAQ,CAAC,OAAO,EAAE,iCAAiC,CAAC;CACrD,CAAC,CA+BD"}
|