@naeemo/capnp 0.8.0 → 0.9.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.
@@ -0,0 +1,251 @@
1
+ #!/usr/bin/env node
2
+ import { t as SchemaNodeType } from "./schema-types-B6M2jsM7.js";
3
+ import { readFileSync } from "node:fs";
4
+
5
+ //#region src/compat/index.ts
6
+ /**
7
+ * Check compatibility between two schemas
8
+ */
9
+ function checkCompatibility(oldSchema, newSchema, options) {
10
+ const opts = {
11
+ strictRenames: false,
12
+ allowRemoveDeprecated: false,
13
+ checkUnions: true,
14
+ ...options
15
+ };
16
+ const issues = [];
17
+ const oldNodes = Array.isArray(oldSchema) ? oldSchema : [oldSchema];
18
+ const newNodes = Array.isArray(newSchema) ? newSchema : [newSchema];
19
+ const oldMap = new Map(oldNodes.map((n) => [n.id, n]));
20
+ const newMap = new Map(newNodes.map((n) => [n.id, n]));
21
+ for (const oldNode of oldNodes) {
22
+ const newNode = newMap.get(oldNode.id);
23
+ if (!newNode) {
24
+ if (oldNode.type === SchemaNodeType.STRUCT) issues.push({
25
+ type: "breaking",
26
+ category: "struct_removed",
27
+ message: `Struct '${oldNode.displayName}' was removed`,
28
+ path: oldNode.displayName,
29
+ suggestion: "Consider deprecating before removing"
30
+ });
31
+ continue;
32
+ }
33
+ compareNodes(oldNode, newNode, issues, opts);
34
+ }
35
+ for (const newNode of newNodes) {
36
+ const oldNode = oldMap.get(newNode.id);
37
+ if (oldNode) checkNewRequiredFields(oldNode, newNode, issues);
38
+ }
39
+ const breaking = issues.filter((i) => i.type === "breaking").length;
40
+ const warning = issues.filter((i) => i.type === "warning").length;
41
+ const info = issues.filter((i) => i.type === "info").length;
42
+ return {
43
+ compatible: breaking === 0,
44
+ issues,
45
+ summary: {
46
+ breaking,
47
+ warning,
48
+ info
49
+ },
50
+ oldVersion: oldNodes[0] ? {
51
+ id: oldNodes[0].id,
52
+ displayName: oldNodes[0].displayName
53
+ } : void 0,
54
+ newVersion: newNodes[0] ? {
55
+ id: newNodes[0].id,
56
+ displayName: newNodes[0].displayName
57
+ } : void 0
58
+ };
59
+ }
60
+ function compareNodes(oldNode, newNode, issues, options) {
61
+ if (oldNode.type !== newNode.type) {
62
+ issues.push({
63
+ type: "breaking",
64
+ category: "field_type_changed",
65
+ message: `Node '${oldNode.displayName}' type changed from ${SchemaNodeType[oldNode.type]} to ${SchemaNodeType[newNode.type]}`,
66
+ path: oldNode.displayName
67
+ });
68
+ return;
69
+ }
70
+ if (oldNode.type === SchemaNodeType.STRUCT && newNode.type === SchemaNodeType.STRUCT) compareStructs(oldNode, newNode, issues, options);
71
+ if (oldNode.type === SchemaNodeType.ENUM && newNode.type === SchemaNodeType.ENUM) compareEnums(oldNode, newNode, issues);
72
+ }
73
+ function compareStructs(oldNode, newNode, issues, options) {
74
+ if (!oldNode.structInfo || !newNode.structInfo) return;
75
+ const oldFields = new Map(oldNode.structInfo.fields.map((f) => [f.name, f]));
76
+ const newFields = new Map(newNode.structInfo.fields.map((f) => [f.name, f]));
77
+ for (const [name, oldField] of oldFields) {
78
+ if (!newFields.has(name)) {
79
+ issues.push({
80
+ type: "breaking",
81
+ category: "field_removed",
82
+ message: `Field '${oldNode.displayName}.${name}' was removed`,
83
+ path: `${oldNode.displayName}.${name}`,
84
+ suggestion: "Consider deprecating before removing"
85
+ });
86
+ continue;
87
+ }
88
+ compareFields(oldField, newFields.get(name), oldNode.displayName, issues);
89
+ }
90
+ if (options.checkUnions) {
91
+ if (oldNode.structInfo.discriminantCount !== newNode.structInfo.discriminantCount) issues.push({
92
+ type: "breaking",
93
+ category: "union_changed",
94
+ message: `Union in '${oldNode.displayName}' changed`,
95
+ path: oldNode.displayName,
96
+ suggestion: "Avoid changing union structure"
97
+ });
98
+ }
99
+ }
100
+ function compareFields(oldField, newField, structName, issues) {
101
+ const oldType = oldField.type.kind.type;
102
+ const newType = newField.type.kind.type;
103
+ if (oldType !== newType) {
104
+ issues.push({
105
+ type: "breaking",
106
+ category: "field_type_changed",
107
+ message: `Field '${structName}.${oldField.name}' type changed from ${oldType} to ${newType}`,
108
+ path: `${structName}.${oldField.name}`,
109
+ suggestion: "Create new field with different name instead of changing type"
110
+ });
111
+ return;
112
+ }
113
+ }
114
+ function compareEnums(oldNode, newNode, issues) {
115
+ if (!oldNode.enumInfo || !newNode.enumInfo) return;
116
+ const newValues = new Set(newNode.enumInfo.enumerants.map((e) => e.name));
117
+ for (const oldValue of oldNode.enumInfo.enumerants) if (!newValues.has(oldValue.name)) issues.push({
118
+ type: "breaking",
119
+ category: "enum_value_removed",
120
+ message: `Enum value '${oldNode.displayName}.${oldValue.name}' was removed`,
121
+ path: `${oldNode.displayName}.${oldValue.name}`,
122
+ suggestion: "Reserve enum values instead of removing them"
123
+ });
124
+ }
125
+ function checkNewRequiredFields(oldNode, newNode, issues) {
126
+ if (!oldNode.structInfo || !newNode.structInfo) return;
127
+ const oldFields = new Set(oldNode.structInfo.fields.map((f) => f.name));
128
+ for (const newField of newNode.structInfo.fields) if (!oldFields.has(newField.name)) issues.push({
129
+ type: "info",
130
+ category: "field_added_optional",
131
+ message: `New field '${newNode.displayName}.${newField.name}' added`,
132
+ path: `${newNode.displayName}.${newField.name}`
133
+ });
134
+ }
135
+ /**
136
+ * Format compatibility report as human-readable text
137
+ */
138
+ function formatReport(report) {
139
+ const lines = [];
140
+ lines.push("=".repeat(60));
141
+ lines.push("SCHEMA COMPATIBILITY REPORT");
142
+ lines.push("=".repeat(60));
143
+ lines.push("");
144
+ if (report.compatible) lines.push("✅ Schemas are compatible");
145
+ else lines.push("❌ Schemas are NOT compatible");
146
+ lines.push("");
147
+ lines.push("Summary:");
148
+ lines.push(` Breaking: ${report.summary.breaking}`);
149
+ lines.push(` Warnings: ${report.summary.warning}`);
150
+ lines.push(` Info: ${report.summary.info}`);
151
+ lines.push("");
152
+ if (report.issues.length > 0) {
153
+ lines.push("Issues:");
154
+ lines.push("-".repeat(60));
155
+ for (const issue of report.issues) {
156
+ const icon = issue.type === "breaking" ? "❌" : issue.type === "warning" ? "⚠️" : "ℹ️";
157
+ lines.push(`${icon} [${issue.type.toUpperCase()}] ${issue.category}`);
158
+ lines.push(` Path: ${issue.path}`);
159
+ lines.push(` ${issue.message}`);
160
+ if (issue.suggestion) lines.push(` 💡 ${issue.suggestion}`);
161
+ lines.push("");
162
+ }
163
+ }
164
+ return lines.join("\n");
165
+ }
166
+
167
+ //#endregion
168
+ //#region src/compat/cli.ts
169
+ /**
170
+ * Schema Compatibility Checker CLI
171
+ *
172
+ * Check compatibility between Cap'n Proto schema versions
173
+ *
174
+ * Usage: capnp compat <old-schema> <new-schema> [options]
175
+ */
176
+ const VERSION = "0.9.0";
177
+ function printUsage() {
178
+ console.log(`
179
+ Cap'n Proto Schema Compatibility Checker v${VERSION}
180
+
181
+ Usage: capnp compat <old-schema> <new-schema> [options]
182
+
183
+ Arguments:
184
+ old-schema Path to old schema JSON file
185
+ new-schema Path to new schema JSON file
186
+
187
+ Options:
188
+ --strict-renames Treat field renames as breaking
189
+ --allow-remove-dep Allow removing deprecated fields
190
+ --json Output as JSON
191
+ --quiet Only output errors
192
+ -h, --help Show this help
193
+
194
+ Examples:
195
+ capnp compat schema-v1.json schema-v2.json
196
+ capnp compat old.json new.json --json
197
+ capnp compat old.json new.json --strict-renames
198
+ `);
199
+ }
200
+ function parseArgs(args) {
201
+ const options = {};
202
+ for (let i = 0; i < args.length; i++) {
203
+ const arg = args[i];
204
+ if (arg === "-h" || arg === "--help") {
205
+ printUsage();
206
+ process.exit(0);
207
+ }
208
+ if (arg === "--strict-renames") options.strictRenames = true;
209
+ else if (arg === "--allow-remove-dep") options.allowRemoveDeprecated = true;
210
+ else if (arg === "--json") options.json = true;
211
+ else if (arg === "--quiet") options.quiet = true;
212
+ else if (!arg.startsWith("-")) {
213
+ if (!options.oldSchema) options.oldSchema = arg;
214
+ else if (!options.newSchema) options.newSchema = arg;
215
+ }
216
+ }
217
+ return options;
218
+ }
219
+ function loadSchema(path) {
220
+ const content = readFileSync(path, "utf-8");
221
+ const parsed = JSON.parse(content);
222
+ return (Array.isArray(parsed) ? parsed : [parsed]).map((node) => ({
223
+ ...node,
224
+ id: typeof node.id === "string" ? BigInt(node.id) : node.id,
225
+ scopeId: typeof node.scopeId === "string" ? BigInt(node.scopeId) : node.scopeId ?? 0n
226
+ }));
227
+ }
228
+ async function run(args) {
229
+ const options = parseArgs(args);
230
+ if (!options.oldSchema || !options.newSchema) {
231
+ console.error("Error: Both old and new schema files are required");
232
+ printUsage();
233
+ process.exit(1);
234
+ }
235
+ try {
236
+ const report = checkCompatibility(loadSchema(options.oldSchema), loadSchema(options.newSchema), {
237
+ strictRenames: options.strictRenames,
238
+ allowRemoveDeprecated: options.allowRemoveDeprecated
239
+ });
240
+ if (options.json) console.log(JSON.stringify(report, (_, v) => typeof v === "bigint" ? v.toString() : v, 2));
241
+ else if (!options.quiet) console.log(formatReport(report));
242
+ process.exit(report.compatible ? 0 : 1);
243
+ } catch (err) {
244
+ console.error("Error:", err instanceof Error ? err.message : err);
245
+ process.exit(2);
246
+ }
247
+ }
248
+
249
+ //#endregion
250
+ export { run };
251
+ //# sourceMappingURL=cli-DHKzE1UX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli-DHKzE1UX.js","names":[],"sources":["../src/compat/index.ts","../src/compat/cli.ts"],"sourcesContent":["/**\n * Schema Compatibility Checker\n *\n * Detect breaking changes between Cap'n Proto schema versions.\n */\n\nimport type { SchemaField, SchemaNode } from '../rpc/schema-types.js';\nimport { SchemaNodeType } from '../rpc/schema-types.js';\n\nexport interface CompatibilityOptions {\n /** Treat field renames as breaking (default: false) */\n strictRenames?: boolean;\n /** Allow removing deprecated fields (default: false) */\n allowRemoveDeprecated?: boolean;\n /** Check union changes (default: true) */\n checkUnions?: boolean;\n}\n\nexport interface CompatibilityIssue {\n /** Type of compatibility issue */\n type: 'breaking' | 'warning' | 'info';\n /** Category of the issue */\n category:\n | 'field_removed'\n | 'field_type_changed'\n | 'field_default_changed'\n | 'struct_removed'\n | 'enum_value_removed'\n | 'union_changed'\n | 'capability_added'\n | 'field_added_optional'\n | 'field_added_required';\n /** Human-readable description */\n message: string;\n /** Path to the affected element */\n path: string;\n /** Suggested fix */\n suggestion?: string;\n}\n\nexport interface CompatibilityReport {\n /** Whether schemas are compatible */\n compatible: boolean;\n /** List of all issues */\n issues: CompatibilityIssue[];\n /** Summary counts */\n summary: {\n breaking: number;\n warning: number;\n info: number;\n };\n /** Old schema version info */\n oldVersion?: {\n id: bigint;\n displayName: string;\n };\n /** New schema version info */\n newVersion?: {\n id: bigint;\n displayName: string;\n };\n}\n\n/**\n * Check compatibility between two schemas\n */\nexport function checkCompatibility(\n oldSchema: SchemaNode | SchemaNode[],\n newSchema: SchemaNode | SchemaNode[],\n options?: CompatibilityOptions\n): CompatibilityReport {\n const opts = {\n strictRenames: false,\n allowRemoveDeprecated: false,\n checkUnions: true,\n ...options,\n };\n\n const issues: CompatibilityIssue[] = [];\n\n // Normalize to arrays\n const oldNodes = Array.isArray(oldSchema) ? oldSchema : [oldSchema];\n const newNodes = Array.isArray(newSchema) ? newSchema : [newSchema];\n\n // Build maps for quick lookup\n const oldMap = new Map(oldNodes.map((n) => [n.id, n]));\n const newMap = new Map(newNodes.map((n) => [n.id, n]));\n\n // Check each old node\n for (const oldNode of oldNodes) {\n const newNode = newMap.get(oldNode.id);\n\n if (!newNode) {\n // Node was removed\n if (oldNode.type === SchemaNodeType.STRUCT) {\n issues.push({\n type: 'breaking',\n category: 'struct_removed',\n message: `Struct '${oldNode.displayName}' was removed`,\n path: oldNode.displayName,\n suggestion: 'Consider deprecating before removing',\n });\n }\n continue;\n }\n\n // Compare same-id nodes\n compareNodes(oldNode, newNode, issues, opts);\n }\n\n // Check for new required fields (also breaking)\n for (const newNode of newNodes) {\n const oldNode = oldMap.get(newNode.id);\n if (oldNode) {\n checkNewRequiredFields(oldNode, newNode, issues);\n }\n }\n\n const breaking = issues.filter((i) => i.type === 'breaking').length;\n const warning = issues.filter((i) => i.type === 'warning').length;\n const info = issues.filter((i) => i.type === 'info').length;\n\n return {\n compatible: breaking === 0,\n issues,\n summary: { breaking, warning, info },\n oldVersion: oldNodes[0]\n ? { id: oldNodes[0].id, displayName: oldNodes[0].displayName }\n : undefined,\n newVersion: newNodes[0]\n ? { id: newNodes[0].id, displayName: newNodes[0].displayName }\n : undefined,\n };\n}\n\nfunction compareNodes(\n oldNode: SchemaNode,\n newNode: SchemaNode,\n issues: CompatibilityIssue[],\n options: Required<CompatibilityOptions>\n): void {\n // Check type hasn't changed\n if (oldNode.type !== newNode.type) {\n issues.push({\n type: 'breaking',\n category: 'field_type_changed',\n message: `Node '${oldNode.displayName}' type changed from ${SchemaNodeType[oldNode.type]} to ${SchemaNodeType[newNode.type]}`,\n path: oldNode.displayName,\n });\n return;\n }\n\n // Compare structs\n if (oldNode.type === SchemaNodeType.STRUCT && newNode.type === SchemaNodeType.STRUCT) {\n compareStructs(oldNode, newNode, issues, options);\n }\n\n // Compare enums\n if (oldNode.type === SchemaNodeType.ENUM && newNode.type === SchemaNodeType.ENUM) {\n compareEnums(oldNode, newNode, issues);\n }\n}\n\nfunction compareStructs(\n oldNode: SchemaNode,\n newNode: SchemaNode,\n issues: CompatibilityIssue[],\n options: Required<CompatibilityOptions>\n): void {\n if (!oldNode.structInfo || !newNode.structInfo) return;\n\n const oldFields = new Map(oldNode.structInfo.fields.map((f) => [f.name, f]));\n const newFields = new Map(newNode.structInfo.fields.map((f) => [f.name, f]));\n\n // Check for removed fields\n for (const [name, oldField] of oldFields) {\n if (!newFields.has(name)) {\n issues.push({\n type: 'breaking',\n category: 'field_removed',\n message: `Field '${oldNode.displayName}.${name}' was removed`,\n path: `${oldNode.displayName}.${name}`,\n suggestion: 'Consider deprecating before removing',\n });\n continue;\n }\n\n // Compare field types\n const newField = newFields.get(name)!;\n compareFields(oldField, newField, oldNode.displayName, issues);\n }\n\n // Check union changes\n if (options.checkUnions) {\n const oldUnionCount = oldNode.structInfo.discriminantCount;\n const newUnionCount = newNode.structInfo.discriminantCount;\n\n if (oldUnionCount !== newUnionCount) {\n issues.push({\n type: 'breaking',\n category: 'union_changed',\n message: `Union in '${oldNode.displayName}' changed`,\n path: oldNode.displayName,\n suggestion: 'Avoid changing union structure',\n });\n }\n }\n}\n\nfunction compareFields(\n oldField: SchemaField,\n newField: SchemaField,\n structName: string,\n issues: CompatibilityIssue[]\n): void {\n // Check type changes\n const oldType = oldField.type.kind.type;\n const newType = newField.type.kind.type;\n\n if (oldType !== newType) {\n issues.push({\n type: 'breaking',\n category: 'field_type_changed',\n message: `Field '${structName}.${oldField.name}' type changed from ${oldType} to ${newType}`,\n path: `${structName}.${oldField.name}`,\n suggestion: 'Create new field with different name instead of changing type',\n });\n return;\n }\n\n // Check for required -> optional (safe) vs optional -> required (breaking)\n // This is handled in checkNewRequiredFields\n}\n\nfunction compareEnums(\n oldNode: SchemaNode,\n newNode: SchemaNode,\n issues: CompatibilityIssue[]\n): void {\n if (!oldNode.enumInfo || !newNode.enumInfo) return;\n\n const newValues = new Set(newNode.enumInfo.enumerants.map((e) => e.name));\n\n for (const oldValue of oldNode.enumInfo.enumerants) {\n if (!newValues.has(oldValue.name)) {\n issues.push({\n type: 'breaking',\n category: 'enum_value_removed',\n message: `Enum value '${oldNode.displayName}.${oldValue.name}' was removed`,\n path: `${oldNode.displayName}.${oldValue.name}`,\n suggestion: 'Reserve enum values instead of removing them',\n });\n }\n }\n}\n\nfunction checkNewRequiredFields(\n oldNode: SchemaNode,\n newNode: SchemaNode,\n issues: CompatibilityIssue[]\n): void {\n if (!oldNode.structInfo || !newNode.structInfo) return;\n\n const oldFields = new Set(oldNode.structInfo.fields.map((f) => f.name));\n\n for (const newField of newNode.structInfo.fields) {\n if (!oldFields.has(newField.name)) {\n // This is a new field\n // In Cap'n Proto, all fields are effectively optional (have defaults)\n // So adding fields is safe\n issues.push({\n type: 'info',\n category: 'field_added_optional',\n message: `New field '${newNode.displayName}.${newField.name}' added`,\n path: `${newNode.displayName}.${newField.name}`,\n });\n }\n }\n}\n\n/**\n * Format compatibility report as human-readable text\n */\nexport function formatReport(report: CompatibilityReport): string {\n const lines: string[] = [];\n\n lines.push('='.repeat(60));\n lines.push('SCHEMA COMPATIBILITY REPORT');\n lines.push('='.repeat(60));\n lines.push('');\n\n if (report.compatible) {\n lines.push('✅ Schemas are compatible');\n } else {\n lines.push('❌ Schemas are NOT compatible');\n }\n lines.push('');\n\n lines.push('Summary:');\n lines.push(` Breaking: ${report.summary.breaking}`);\n lines.push(` Warnings: ${report.summary.warning}`);\n lines.push(` Info: ${report.summary.info}`);\n lines.push('');\n\n if (report.issues.length > 0) {\n lines.push('Issues:');\n lines.push('-'.repeat(60));\n\n for (const issue of report.issues) {\n const icon = issue.type === 'breaking' ? '❌' : issue.type === 'warning' ? '⚠️' : 'ℹ️';\n lines.push(`${icon} [${issue.type.toUpperCase()}] ${issue.category}`);\n lines.push(` Path: ${issue.path}`);\n lines.push(` ${issue.message}`);\n if (issue.suggestion) {\n lines.push(` 💡 ${issue.suggestion}`);\n }\n lines.push('');\n }\n }\n\n return lines.join('\\n');\n}\n","/**\n * Schema Compatibility Checker CLI\n *\n * Check compatibility between Cap'n Proto schema versions\n *\n * Usage: capnp compat <old-schema> <new-schema> [options]\n */\n\nimport { readFileSync } from 'node:fs';\nimport type { SchemaNode } from '../rpc/schema-types.js';\nimport { checkCompatibility, formatReport } from './index.js';\n\nconst VERSION = '0.9.0';\n\nfunction printUsage() {\n console.log(`\nCap'n Proto Schema Compatibility Checker v${VERSION}\n\nUsage: capnp compat <old-schema> <new-schema> [options]\n\nArguments:\n old-schema Path to old schema JSON file\n new-schema Path to new schema JSON file\n\nOptions:\n --strict-renames Treat field renames as breaking\n --allow-remove-dep Allow removing deprecated fields\n --json Output as JSON\n --quiet Only output errors\n -h, --help Show this help\n\nExamples:\n capnp compat schema-v1.json schema-v2.json\n capnp compat old.json new.json --json\n capnp compat old.json new.json --strict-renames\n`);\n}\n\nfunction parseArgs(args: string[]) {\n const options: {\n oldSchema?: string;\n newSchema?: string;\n strictRenames?: boolean;\n allowRemoveDeprecated?: boolean;\n json?: boolean;\n quiet?: boolean;\n } = {};\n\n for (let i = 0; i < args.length; i++) {\n const arg = args[i];\n\n if (arg === '-h' || arg === '--help') {\n printUsage();\n process.exit(0);\n }\n\n if (arg === '--strict-renames') {\n options.strictRenames = true;\n } else if (arg === '--allow-remove-dep') {\n options.allowRemoveDeprecated = true;\n } else if (arg === '--json') {\n options.json = true;\n } else if (arg === '--quiet') {\n options.quiet = true;\n } else if (!arg.startsWith('-')) {\n if (!options.oldSchema) {\n options.oldSchema = arg;\n } else if (!options.newSchema) {\n options.newSchema = arg;\n }\n }\n }\n\n return options;\n}\n\nfunction loadSchema(path: string): SchemaNode | SchemaNode[] {\n const content = readFileSync(path, 'utf-8');\n const parsed = JSON.parse(content);\n\n // Handle array or single object\n const nodes = Array.isArray(parsed) ? parsed : [parsed];\n\n // Convert string IDs to bigints\n return nodes.map((node: Record<string, unknown>) => ({\n ...node,\n id: typeof node.id === 'string' ? BigInt(node.id) : node.id,\n scopeId: typeof node.scopeId === 'string' ? BigInt(node.scopeId) : (node.scopeId ?? 0n),\n })) as SchemaNode[];\n}\n\nexport async function run(args: string[]): Promise<void> {\n const options = parseArgs(args);\n\n if (!options.oldSchema || !options.newSchema) {\n console.error('Error: Both old and new schema files are required');\n printUsage();\n process.exit(1);\n }\n\n try {\n const oldSchema = loadSchema(options.oldSchema);\n const newSchema = loadSchema(options.newSchema);\n\n const report = checkCompatibility(oldSchema, newSchema, {\n strictRenames: options.strictRenames,\n allowRemoveDeprecated: options.allowRemoveDeprecated,\n });\n\n if (options.json) {\n console.log(JSON.stringify(report, (_, v) => (typeof v === 'bigint' ? v.toString() : v), 2));\n } else if (!options.quiet) {\n console.log(formatReport(report));\n }\n\n // Exit with error code if not compatible\n process.exit(report.compatible ? 0 : 1);\n } catch (err) {\n console.error('Error:', err instanceof Error ? err.message : err);\n process.exit(2);\n }\n}\n"],"mappings":"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"}