test-workflow-executor-json-repair.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. import { extractJsonFromText } from './src/vl/workflow-executor.js';
  2. function assert(condition, message) {
  3. if (!condition) throw new Error(message);
  4. }
  5. console.log('\n── Workflow Executor JSON Repair ──');
  6. const raw = `\`\`\`json
  7. {
  8. "section": {
  9. "id": "AnalyticsOverview",
  10. "interactiveElements": [],
  11. },
  12. "components": [],
  13. "updatedMeta": {
  14. "sections": [
  15. {
  16. "sectionId": "AnalyticsOverview",
  17. "internalMethods": [
  18. { "kind": "METHOD", "name": "loadAnalytics", "returns": "{success:BOOL}" }
  19. ],
  20. `;
  21. const repaired = extractJsonFromText(raw);
  22. assert(repaired, 'extractJsonFromText should recover truncated fenced JSON');
  23. const parsed = JSON.parse(repaired);
  24. assert(parsed.section.id === 'AnalyticsOverview', 'recovered JSON should preserve section.id');
  25. assert(Array.isArray(parsed.updatedMeta.sections), 'recovered JSON should preserve updatedMeta.sections');
  26. const truncatedStringRaw = `\`\`\`json
  27. {
  28. "updatedMeta": {
  29. "sections": [
  30. {
  31. "globalVars": [
  32. {"name": "gradeOptions", "type": "[{value:STRING,label:STRING}]", "default": "[{value:\\"大一\\",label:\\"大一\\"},{value:\\"大二\\",label:\\"大二\\"},{value:\\"大三\\",label:\\""}
  33. `;
  34. const repairedTruncatedString = extractJsonFromText(truncatedStringRaw);
  35. assert(repairedTruncatedString, 'extractJsonFromText should recover truncated unterminated strings');
  36. const parsedTruncatedString = JSON.parse(repairedTruncatedString);
  37. assert(
  38. parsedTruncatedString.updatedMeta.sections[0].globalVars[0].name === 'gradeOptions',
  39. 'recovered truncated string JSON should preserve nested fields'
  40. );
  41. console.log('PASS test-workflow-executor-json-repair.js');