learngraph 0.1.0 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (99) hide show
  1. package/LICENSE +190 -21
  2. package/README.md +187 -5
  3. package/dist/cjs/index.js +1 -1
  4. package/dist/cjs/parsers/base.js +189 -0
  5. package/dist/cjs/parsers/base.js.map +1 -0
  6. package/dist/cjs/parsers/demo.js +159 -0
  7. package/dist/cjs/parsers/demo.js.map +1 -0
  8. package/dist/cjs/parsers/extractor.js +191 -0
  9. package/dist/cjs/parsers/extractor.js.map +1 -0
  10. package/dist/cjs/parsers/index.js +43 -4
  11. package/dist/cjs/parsers/index.js.map +1 -1
  12. package/dist/cjs/parsers/json.js +157 -0
  13. package/dist/cjs/parsers/json.js.map +1 -0
  14. package/dist/cjs/parsers/markdown.js +168 -0
  15. package/dist/cjs/parsers/markdown.js.map +1 -0
  16. package/dist/cjs/parsers/samples.js +139 -0
  17. package/dist/cjs/parsers/samples.js.map +1 -0
  18. package/dist/cjs/storage/base.js +231 -0
  19. package/dist/cjs/storage/base.js.map +1 -0
  20. package/dist/cjs/storage/errors.js +128 -0
  21. package/dist/cjs/storage/errors.js.map +1 -0
  22. package/dist/cjs/storage/index.js +92 -5
  23. package/dist/cjs/storage/index.js.map +1 -1
  24. package/dist/cjs/storage/levelgraph.js +855 -0
  25. package/dist/cjs/storage/levelgraph.js.map +1 -0
  26. package/dist/cjs/storage/memory.js +447 -0
  27. package/dist/cjs/storage/memory.js.map +1 -0
  28. package/dist/cjs/storage/neo4j.js +866 -0
  29. package/dist/cjs/storage/neo4j.js.map +1 -0
  30. package/dist/cjs/storage/seeds.js +565 -0
  31. package/dist/cjs/storage/seeds.js.map +1 -0
  32. package/dist/cjs/types/parser.js +8 -0
  33. package/dist/cjs/types/parser.js.map +1 -0
  34. package/dist/esm/index.js +1 -1
  35. package/dist/esm/parsers/base.js +179 -0
  36. package/dist/esm/parsers/base.js.map +1 -0
  37. package/dist/esm/parsers/demo.js +154 -0
  38. package/dist/esm/parsers/demo.js.map +1 -0
  39. package/dist/esm/parsers/extractor.js +187 -0
  40. package/dist/esm/parsers/extractor.js.map +1 -0
  41. package/dist/esm/parsers/index.js +24 -5
  42. package/dist/esm/parsers/index.js.map +1 -1
  43. package/dist/esm/parsers/json.js +153 -0
  44. package/dist/esm/parsers/json.js.map +1 -0
  45. package/dist/esm/parsers/markdown.js +164 -0
  46. package/dist/esm/parsers/markdown.js.map +1 -0
  47. package/dist/esm/parsers/samples.js +136 -0
  48. package/dist/esm/parsers/samples.js.map +1 -0
  49. package/dist/esm/storage/base.js +221 -0
  50. package/dist/esm/storage/base.js.map +1 -0
  51. package/dist/esm/storage/errors.js +116 -0
  52. package/dist/esm/storage/errors.js.map +1 -0
  53. package/dist/esm/storage/index.js +71 -6
  54. package/dist/esm/storage/index.js.map +1 -1
  55. package/dist/esm/storage/levelgraph.js +818 -0
  56. package/dist/esm/storage/levelgraph.js.map +1 -0
  57. package/dist/esm/storage/memory.js +443 -0
  58. package/dist/esm/storage/memory.js.map +1 -0
  59. package/dist/esm/storage/neo4j.js +829 -0
  60. package/dist/esm/storage/neo4j.js.map +1 -0
  61. package/dist/esm/storage/seeds.js +561 -0
  62. package/dist/esm/storage/seeds.js.map +1 -0
  63. package/dist/esm/types/parser.js +7 -0
  64. package/dist/esm/types/parser.js.map +1 -0
  65. package/dist/types/index.d.ts +1 -1
  66. package/dist/types/parsers/base.d.ts +39 -0
  67. package/dist/types/parsers/base.d.ts.map +1 -0
  68. package/dist/types/parsers/demo.d.ts +87 -0
  69. package/dist/types/parsers/demo.d.ts.map +1 -0
  70. package/dist/types/parsers/extractor.d.ts +43 -0
  71. package/dist/types/parsers/extractor.d.ts.map +1 -0
  72. package/dist/types/parsers/index.d.ts +10 -0
  73. package/dist/types/parsers/index.d.ts.map +1 -1
  74. package/dist/types/parsers/json.d.ts +71 -0
  75. package/dist/types/parsers/json.d.ts.map +1 -0
  76. package/dist/types/parsers/markdown.d.ts +43 -0
  77. package/dist/types/parsers/markdown.d.ts.map +1 -0
  78. package/dist/types/parsers/samples.d.ts +27 -0
  79. package/dist/types/parsers/samples.d.ts.map +1 -0
  80. package/dist/types/storage/base.d.ts +39 -0
  81. package/dist/types/storage/base.d.ts.map +1 -0
  82. package/dist/types/storage/errors.d.ts +74 -0
  83. package/dist/types/storage/errors.d.ts.map +1 -0
  84. package/dist/types/storage/index.d.ts +50 -2
  85. package/dist/types/storage/index.d.ts.map +1 -1
  86. package/dist/types/storage/levelgraph.d.ts +92 -0
  87. package/dist/types/storage/levelgraph.d.ts.map +1 -0
  88. package/dist/types/storage/memory.d.ts +70 -0
  89. package/dist/types/storage/memory.d.ts.map +1 -0
  90. package/dist/types/storage/neo4j.d.ts +88 -0
  91. package/dist/types/storage/neo4j.d.ts.map +1 -0
  92. package/dist/types/storage/seeds.d.ts +27 -0
  93. package/dist/types/storage/seeds.d.ts.map +1 -0
  94. package/dist/types/types/index.d.ts +1 -0
  95. package/dist/types/types/index.d.ts.map +1 -1
  96. package/dist/types/types/parser.d.ts +208 -0
  97. package/dist/types/types/parser.d.ts.map +1 -0
  98. package/package.json +33 -6
  99. package/scripts/postinstall.js +68 -0
@@ -0,0 +1,159 @@
1
+ "use strict";
2
+ /**
3
+ * Demo utilities for quick testing and exploration
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.tryWithSample = tryWithSample;
9
+ exports.tryWithSyllabus = tryWithSyllabus;
10
+ exports.printDemoResults = printDemoResults;
11
+ const markdown_js_1 = require("./markdown.js");
12
+ const extractor_js_1 = require("./extractor.js");
13
+ const memory_js_1 = require("../storage/memory.js");
14
+ const samples_js_1 = require("./samples.js");
15
+ /**
16
+ * Try LearnGraph with a sample syllabus
17
+ *
18
+ * This is the easiest way to see LearnGraph in action.
19
+ *
20
+ * @example
21
+ * ```typescript
22
+ * import { tryWithSample } from 'learngraph/parsers';
23
+ *
24
+ * // Try with physics syllabus
25
+ * const result = await tryWithSample('physics');
26
+ * console.log(`Created ${result.skills.length} skills!`);
27
+ * console.log('Skills:', result.skills.map(s => s.name));
28
+ *
29
+ * // Try with kindergarten math
30
+ * const kResult = await tryWithSample('kindergarten');
31
+ * console.log(`Kindergarten: ${kResult.skills.length} skills`);
32
+ * ```
33
+ */
34
+ async function tryWithSample(sample = 'physics') {
35
+ const syllabus = samples_js_1.SAMPLE_SYLLABI[sample];
36
+ return tryWithSyllabus(syllabus);
37
+ }
38
+ /**
39
+ * Try LearnGraph with your own syllabus
40
+ *
41
+ * Paste your syllabus as markdown and see the magic happen!
42
+ *
43
+ * @example
44
+ * ```typescript
45
+ * import { tryWithSyllabus } from 'learngraph/parsers';
46
+ *
47
+ * const mySyllabus = `
48
+ * # My Course
49
+ *
50
+ * ## Week 1: Introduction
51
+ *
52
+ * ### Learning Objectives
53
+ * - Understand the course structure
54
+ * - Identify key topics
55
+ * - Apply basic concepts
56
+ * `;
57
+ *
58
+ * const result = await tryWithSyllabus(mySyllabus);
59
+ * console.log('Found', result.parseResult.stats.objectiveCount, 'objectives');
60
+ * console.log('Created', result.skills.length, 'skills');
61
+ *
62
+ * // See the skills
63
+ * for (const skill of result.skills) {
64
+ * console.log(`- ${skill.name} (${skill.bloomLevel}, difficulty: ${skill.difficulty})`);
65
+ * }
66
+ * ```
67
+ */
68
+ async function tryWithSyllabus(syllabus, options) {
69
+ // Parse the syllabus
70
+ const parser = new markdown_js_1.MarkdownParser();
71
+ const parseResult = await parser.parse(syllabus);
72
+ // Extract skills
73
+ const extractor = new extractor_js_1.BasicExtractor();
74
+ const extraction = await extractor.extract(parseResult, options);
75
+ // Create storage and populate
76
+ const storage = new memory_js_1.MemoryStorage();
77
+ await storage.connect({ backend: 'memory' });
78
+ // Create skills
79
+ const skills = [];
80
+ const skillMap = new Map();
81
+ for (const { skill: input } of extraction.skills) {
82
+ const skill = await storage.createSkill(input);
83
+ skills.push(skill);
84
+ skillMap.set(skill.name, skill);
85
+ }
86
+ // Create edges
87
+ const edges = [];
88
+ for (const suggested of extraction.suggestedEdges) {
89
+ const source = skillMap.get(suggested.sourceName);
90
+ const target = skillMap.get(suggested.targetName);
91
+ if (source && target) {
92
+ const edgeInput = {
93
+ sourceId: source.id,
94
+ targetId: target.id,
95
+ strength: suggested.strength,
96
+ type: suggested.strength >= 0.8 ? 'hard' : 'soft',
97
+ metadata: {},
98
+ };
99
+ if (suggested.reasoning) {
100
+ edgeInput.reasoning = suggested.reasoning;
101
+ }
102
+ const edge = await storage.createPrerequisite(edgeInput);
103
+ edges.push(edge);
104
+ }
105
+ }
106
+ // Get stats
107
+ const stats = await storage.getStats();
108
+ await storage.disconnect();
109
+ return {
110
+ parseResult,
111
+ extraction,
112
+ skills,
113
+ edges,
114
+ stats,
115
+ };
116
+ }
117
+ /**
118
+ * Quick console output of demo results
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * import { tryWithSample, printDemoResults } from 'learngraph/parsers';
123
+ *
124
+ * const result = await tryWithSample('physics');
125
+ * printDemoResults(result);
126
+ * ```
127
+ */
128
+ function printDemoResults(result) {
129
+ console.log('\n' + '='.repeat(60));
130
+ console.log('LearnGraph Demo Results');
131
+ console.log('='.repeat(60));
132
+ console.log(`\nCourse: ${result.parseResult.metadata.title || 'Untitled'}`);
133
+ console.log(`Format: ${result.parseResult.metadata.format}`);
134
+ console.log('\n--- Parse Statistics ---');
135
+ console.log(`Modules: ${result.parseResult.stats.moduleCount}`);
136
+ console.log(`Topics: ${result.parseResult.stats.topicCount}`);
137
+ console.log(`Objectives: ${result.parseResult.stats.objectiveCount}`);
138
+ console.log(`Bloom's Detected: ${result.parseResult.stats.bloomDetectedCount}`);
139
+ console.log('\n--- Skills Created ---');
140
+ for (const skill of result.skills) {
141
+ console.log(` - ${skill.name} [${skill.bloomLevel}] (difficulty: ${skill.difficulty.toFixed(2)})`);
142
+ }
143
+ console.log('\n--- Prerequisites ---');
144
+ for (const edge of result.edges) {
145
+ const source = result.skills.find((s) => s.id === edge.sourceId);
146
+ const target = result.skills.find((s) => s.id === edge.targetId);
147
+ if (source && target) {
148
+ console.log(` ${source.name} → ${target.name} (${edge.type})`);
149
+ }
150
+ }
151
+ console.log('\n--- Graph Statistics ---');
152
+ console.log(`Total Skills: ${result.stats.nodeCount}`);
153
+ console.log(`Total Edges: ${result.stats.edgeCount}`);
154
+ console.log(`Root Skills: ${result.stats.rootNodeCount}`);
155
+ console.log(`Max Depth: ${result.stats.maxDepth}`);
156
+ console.log(`Bloom Distribution:`, result.stats.bloomDistribution);
157
+ console.log('\n' + '='.repeat(60) + '\n');
158
+ }
159
+ //# sourceMappingURL=demo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.js","sourceRoot":"","sources":["../../../src/parsers/demo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,191 @@
1
+ "use strict";
2
+ /**
3
+ * Skill extractor - converts parsed syllabi into graph-ready skills
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ Object.defineProperty(exports, "__esModule", { value: true });
8
+ exports.BasicExtractor = exports.DEFAULT_EXTRACTION_OPTIONS = void 0;
9
+ const base_js_1 = require("./base.js");
10
+ /**
11
+ * Default extraction options
12
+ */
13
+ exports.DEFAULT_EXTRACTION_OPTIONS = {
14
+ detectBloom: true,
15
+ extractTime: true,
16
+ suggestNames: true,
17
+ includeRaw: false,
18
+ sectionHeaders: [],
19
+ objectiveMarkers: [],
20
+ defaultDifficulty: 0.5,
21
+ defaultMasteryThreshold: 0.8,
22
+ defaultEstimatedMinutes: 30,
23
+ tags: [],
24
+ domain: '',
25
+ gradeLevel: '',
26
+ };
27
+ /**
28
+ * Map Bloom's level to difficulty estimate
29
+ */
30
+ function bloomToDifficulty(level) {
31
+ switch (level) {
32
+ case 'remember':
33
+ return 0.2;
34
+ case 'understand':
35
+ return 0.35;
36
+ case 'apply':
37
+ return 0.5;
38
+ case 'analyze':
39
+ return 0.65;
40
+ case 'evaluate':
41
+ return 0.8;
42
+ case 'create':
43
+ return 0.9;
44
+ default:
45
+ return 0.5;
46
+ }
47
+ }
48
+ /**
49
+ * Basic skill extractor
50
+ *
51
+ * Converts parsed syllabus content into skills ready for graph storage.
52
+ *
53
+ * @example
54
+ * ```typescript
55
+ * import { MarkdownParser, BasicExtractor } from 'learngraph/parsers';
56
+ *
57
+ * const parser = new MarkdownParser();
58
+ * const extractor = new BasicExtractor();
59
+ *
60
+ * const parseResult = await parser.parse(syllabusMarkdown);
61
+ * const extraction = await extractor.extract(parseResult, {
62
+ * tags: ['physics', 'intro'],
63
+ * domain: 'Physics',
64
+ * gradeLevel: 'Undergraduate'
65
+ * });
66
+ *
67
+ * // Now create skills in storage
68
+ * for (const { skill } of extraction.skills) {
69
+ * await storage.createSkill(skill);
70
+ * }
71
+ * ```
72
+ */
73
+ class BasicExtractor {
74
+ async extract(parseResult, options) {
75
+ const opts = { ...exports.DEFAULT_EXTRACTION_OPTIONS, ...options };
76
+ const skills = [];
77
+ const warnings = [];
78
+ const skillNames = new Set();
79
+ // Helper to create skill from objective
80
+ const createSkillFromObjective = (objective, topic, moduleTitle) => {
81
+ const name = objective.suggestedName || (0, base_js_1.objectiveToSkillName)(objective.text);
82
+ // Skip duplicates
83
+ if (skillNames.has(name.toLowerCase())) {
84
+ return null;
85
+ }
86
+ skillNames.add(name.toLowerCase());
87
+ const difficulty = objective.bloomLevel
88
+ ? bloomToDifficulty(objective.bloomLevel)
89
+ : opts.defaultDifficulty;
90
+ const skill = {
91
+ name,
92
+ description: objective.text,
93
+ bloomLevel: objective.bloomLevel || 'understand',
94
+ difficulty,
95
+ isThresholdConcept: objective.bloomLevel === 'analyze' || objective.bloomLevel === 'evaluate',
96
+ masteryThreshold: opts.defaultMasteryThreshold,
97
+ estimatedMinutes: topic?.estimatedMinutes || opts.defaultEstimatedMinutes,
98
+ tags: [
99
+ ...opts.tags,
100
+ ...(moduleTitle ? [moduleTitle.toLowerCase().replace(/[^a-z0-9]+/g, '-')] : []),
101
+ ],
102
+ metadata: {
103
+ source: parseResult.metadata.source,
104
+ section: objective.section,
105
+ week: objective.week,
106
+ },
107
+ };
108
+ // Add optional fields
109
+ if (opts.domain) {
110
+ skill.domain = opts.domain;
111
+ }
112
+ if (opts.gradeLevel) {
113
+ skill.gradeLevel = opts.gradeLevel;
114
+ }
115
+ return {
116
+ skill,
117
+ source: objective,
118
+ confidence: objective.bloomConfidence || 0.7,
119
+ };
120
+ };
121
+ // Extract from standalone objectives
122
+ for (const objective of parseResult.objectives) {
123
+ const extracted = createSkillFromObjective(objective);
124
+ if (extracted)
125
+ skills.push(extracted);
126
+ }
127
+ // Extract from standalone topics
128
+ for (const topic of parseResult.topics) {
129
+ for (const objective of topic.objectives) {
130
+ const extracted = createSkillFromObjective(objective, topic);
131
+ if (extracted)
132
+ skills.push(extracted);
133
+ }
134
+ }
135
+ // Extract from modules
136
+ for (const mod of parseResult.modules) {
137
+ // Module-level objectives
138
+ for (const objective of mod.objectives) {
139
+ const extracted = createSkillFromObjective(objective, undefined, mod.title);
140
+ if (extracted)
141
+ skills.push(extracted);
142
+ }
143
+ // Topic objectives within modules
144
+ for (const topic of mod.topics) {
145
+ for (const objective of topic.objectives) {
146
+ const extracted = createSkillFromObjective(objective, topic, mod.title);
147
+ if (extracted)
148
+ skills.push(extracted);
149
+ }
150
+ }
151
+ }
152
+ // Suggest prerequisite edges based on order and Bloom's levels
153
+ const suggestedEdges = this.suggestEdges(skills);
154
+ return {
155
+ skills,
156
+ suggestedEdges,
157
+ warnings,
158
+ };
159
+ }
160
+ /**
161
+ * Suggest prerequisite relationships based on skill order and Bloom's levels
162
+ */
163
+ suggestEdges(skills) {
164
+ const edges = [];
165
+ for (let i = 1; i < skills.length; i++) {
166
+ const current = skills[i];
167
+ const previous = skills[i - 1];
168
+ if (!current || !previous)
169
+ continue;
170
+ // Skills in the same module/section are likely related
171
+ const sameSection = current.skill.metadata?.section === previous.skill.metadata?.section;
172
+ const sameWeek = current.skill.metadata?.week === previous.skill.metadata?.week;
173
+ if (sameSection || sameWeek) {
174
+ // Higher Bloom's level likely depends on lower
175
+ const currentDiff = current.skill.difficulty;
176
+ const prevDiff = previous.skill.difficulty;
177
+ if (currentDiff > prevDiff) {
178
+ edges.push({
179
+ sourceName: previous.skill.name,
180
+ targetName: current.skill.name,
181
+ strength: 0.7,
182
+ reasoning: 'Sequential in syllabus, increasing complexity',
183
+ });
184
+ }
185
+ }
186
+ }
187
+ return edges;
188
+ }
189
+ }
190
+ exports.BasicExtractor = BasicExtractor;
191
+ //# sourceMappingURL=extractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extractor.js","sourceRoot":"","sources":["../../../src/parsers/extractor.ts"],"names":[],"mappings":"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"}
@@ -2,10 +2,49 @@
2
2
  /**
3
3
  * Content parsers for educational materials
4
4
  *
5
+ * Parse syllabi, course outlines, and learning objectives into
6
+ * structured skill graphs.
7
+ *
5
8
  * @packageDocumentation
6
9
  */
7
- // Parsers will be implemented in Phase 3
8
- // export { SyllabusParser } from './syllabus.js';
9
- // export { ChapterParser } from './chapter.js';
10
- // export { ObjectiveParser } from './objective.js';
10
+ Object.defineProperty(exports, "__esModule", { value: true });
11
+ exports.printDemoResults = exports.tryWithSyllabus = exports.tryWithSample = exports.SAMPLE_SYLLABI = exports.PROGRAMMING_101_SYLLABUS = exports.KINDERGARTEN_MATH_SYLLABUS = exports.PHYSICS_101_SYLLABUS = exports.createObjective = exports.objectiveToSkillName = exports.cleanText = exports.isObjectiveLine = exports.extractTime = exports.DEFAULT_PARSE_OPTIONS = exports.DEFAULT_EXTRACTION_OPTIONS = exports.BasicExtractor = exports.JSONParser = exports.MarkdownParser = void 0;
12
+ // ─────────────────────────────────────────────────────────────────────────────
13
+ // Parsers
14
+ // ─────────────────────────────────────────────────────────────────────────────
15
+ var markdown_js_1 = require("./markdown.js");
16
+ Object.defineProperty(exports, "MarkdownParser", { enumerable: true, get: function () { return markdown_js_1.MarkdownParser; } });
17
+ var json_js_1 = require("./json.js");
18
+ Object.defineProperty(exports, "JSONParser", { enumerable: true, get: function () { return json_js_1.JSONParser; } });
19
+ // ─────────────────────────────────────────────────────────────────────────────
20
+ // Skill Extraction
21
+ // ─────────────────────────────────────────────────────────────────────────────
22
+ var extractor_js_1 = require("./extractor.js");
23
+ Object.defineProperty(exports, "BasicExtractor", { enumerable: true, get: function () { return extractor_js_1.BasicExtractor; } });
24
+ Object.defineProperty(exports, "DEFAULT_EXTRACTION_OPTIONS", { enumerable: true, get: function () { return extractor_js_1.DEFAULT_EXTRACTION_OPTIONS; } });
25
+ // ─────────────────────────────────────────────────────────────────────────────
26
+ // Utilities
27
+ // ─────────────────────────────────────────────────────────────────────────────
28
+ var base_js_1 = require("./base.js");
29
+ Object.defineProperty(exports, "DEFAULT_PARSE_OPTIONS", { enumerable: true, get: function () { return base_js_1.DEFAULT_PARSE_OPTIONS; } });
30
+ Object.defineProperty(exports, "extractTime", { enumerable: true, get: function () { return base_js_1.extractTime; } });
31
+ Object.defineProperty(exports, "isObjectiveLine", { enumerable: true, get: function () { return base_js_1.isObjectiveLine; } });
32
+ Object.defineProperty(exports, "cleanText", { enumerable: true, get: function () { return base_js_1.cleanText; } });
33
+ Object.defineProperty(exports, "objectiveToSkillName", { enumerable: true, get: function () { return base_js_1.objectiveToSkillName; } });
34
+ Object.defineProperty(exports, "createObjective", { enumerable: true, get: function () { return base_js_1.createObjective; } });
35
+ // ─────────────────────────────────────────────────────────────────────────────
36
+ // Sample Syllabi
37
+ // ─────────────────────────────────────────────────────────────────────────────
38
+ var samples_js_1 = require("./samples.js");
39
+ Object.defineProperty(exports, "PHYSICS_101_SYLLABUS", { enumerable: true, get: function () { return samples_js_1.PHYSICS_101_SYLLABUS; } });
40
+ Object.defineProperty(exports, "KINDERGARTEN_MATH_SYLLABUS", { enumerable: true, get: function () { return samples_js_1.KINDERGARTEN_MATH_SYLLABUS; } });
41
+ Object.defineProperty(exports, "PROGRAMMING_101_SYLLABUS", { enumerable: true, get: function () { return samples_js_1.PROGRAMMING_101_SYLLABUS; } });
42
+ Object.defineProperty(exports, "SAMPLE_SYLLABI", { enumerable: true, get: function () { return samples_js_1.SAMPLE_SYLLABI; } });
43
+ // ─────────────────────────────────────────────────────────────────────────────
44
+ // Demo Functions
45
+ // ─────────────────────────────────────────────────────────────────────────────
46
+ var demo_js_1 = require("./demo.js");
47
+ Object.defineProperty(exports, "tryWithSample", { enumerable: true, get: function () { return demo_js_1.tryWithSample; } });
48
+ Object.defineProperty(exports, "tryWithSyllabus", { enumerable: true, get: function () { return demo_js_1.tryWithSyllabus; } });
49
+ Object.defineProperty(exports, "printDemoResults", { enumerable: true, get: function () { return demo_js_1.printDemoResults; } });
11
50
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parsers/index.ts"],"names":[],"mappings":";AAAA;;;;GAIG;AAEH,yCAAyC;AACzC,kDAAkD;AAClD,gDAAgD;AAChD,oDAAoD"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/parsers/index.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;;AAsBH,gFAAgF;AAChF,UAAU;AACV,gFAAgF;AAChF,6CAA+C;AAAtC,6GAAA,cAAc,OAAA;AACvB,qCAA0D;AAAjD,qGAAA,UAAU,OAAA;AAEnB,gFAAgF;AAChF,mBAAmB;AACnB,gFAAgF;AAChF,+CAA4E;AAAnE,8GAAA,cAAc,OAAA;AAAE,0HAAA,0BAA0B,OAAA;AAEnD,gFAAgF;AAChF,YAAY;AACZ,gFAAgF;AAChF,qCAOmB;AANjB,gHAAA,qBAAqB,OAAA;AACrB,sGAAA,WAAW,OAAA;AACX,0GAAA,eAAe,OAAA;AACf,oGAAA,SAAS,OAAA;AACT,+GAAA,oBAAoB,OAAA;AACpB,0GAAA,eAAe,OAAA;AAGjB,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAChF,2CAMsB;AALpB,kHAAA,oBAAoB,OAAA;AACpB,wHAAA,0BAA0B,OAAA;AAC1B,sHAAA,wBAAwB,OAAA;AACxB,4GAAA,cAAc,OAAA;AAIhB,gFAAgF;AAChF,iBAAiB;AACjB,gFAAgF;AAChF,qCAKmB;AAJjB,wGAAA,aAAa,OAAA;AACb,0GAAA,eAAe,OAAA;AACf,2GAAA,gBAAgB,OAAA"}
@@ -0,0 +1,157 @@
1
+ "use strict";
2
+ /**
3
+ * JSON/YAML syllabus parser
4
+ *
5
+ * Parses structured JSON or YAML syllabi into the standard format.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ Object.defineProperty(exports, "__esModule", { value: true });
10
+ exports.JSONParser = void 0;
11
+ const base_js_1 = require("./base.js");
12
+ /**
13
+ * JSON/YAML parser for structured syllabi
14
+ *
15
+ * @example
16
+ * ```typescript
17
+ * import { JSONParser } from 'learngraph/parsers';
18
+ *
19
+ * const parser = new JSONParser();
20
+ * const result = await parser.parse(JSON.stringify({
21
+ * title: "Kindergarten Math",
22
+ * modules: [
23
+ * {
24
+ * title: "Counting",
25
+ * week: 1,
26
+ * objectives: [
27
+ * "Count objects from 1 to 10",
28
+ * "Recognize number symbols 1-10",
29
+ * "Compare groups using more, less, same"
30
+ * ]
31
+ * }
32
+ * ]
33
+ * }));
34
+ * ```
35
+ */
36
+ class JSONParser {
37
+ format = 'json';
38
+ async parse(content, _options) {
39
+ const startTime = Date.now();
40
+ const result = (0, base_js_1.createEmptyResult)('json', 'json');
41
+ let data;
42
+ try {
43
+ data = JSON.parse(content);
44
+ }
45
+ catch {
46
+ // Try YAML-like simple format (key: value)
47
+ data = this.parseSimpleFormat(content);
48
+ }
49
+ // Extract metadata
50
+ if (data.title)
51
+ result.metadata.title = data.title;
52
+ if (data.course)
53
+ result.metadata.course = data.course;
54
+ if (data.institution)
55
+ result.metadata.institution = data.institution;
56
+ if (data.gradeLevel)
57
+ result.metadata.gradeLevel = data.gradeLevel;
58
+ // Parse modules
59
+ if (data.modules) {
60
+ for (let i = 0; i < data.modules.length; i++) {
61
+ const mod = data.modules[i];
62
+ if (!mod)
63
+ continue;
64
+ const module = {
65
+ id: mod.id || `module-${i + 1}`,
66
+ title: mod.title,
67
+ topics: [],
68
+ objectives: [],
69
+ };
70
+ // Conditionally set optional properties
71
+ if (mod.description !== undefined) {
72
+ module.description = mod.description;
73
+ }
74
+ if (mod.week !== undefined) {
75
+ module.week = mod.week;
76
+ }
77
+ if (mod.estimatedMinutes !== undefined) {
78
+ module.estimatedMinutes = mod.estimatedMinutes;
79
+ }
80
+ // Parse module topics
81
+ if (mod.topics) {
82
+ for (const t of mod.topics) {
83
+ const topic = {
84
+ name: t.name,
85
+ objectives: (t.objectives || []).map((obj) => (0, base_js_1.createObjective)(obj, module.title, module.week)),
86
+ };
87
+ if (t.description !== undefined) {
88
+ topic.description = t.description;
89
+ }
90
+ if (t.estimatedMinutes !== undefined) {
91
+ topic.estimatedMinutes = t.estimatedMinutes;
92
+ }
93
+ module.topics.push(topic);
94
+ }
95
+ }
96
+ // Parse module-level objectives
97
+ if (mod.objectives) {
98
+ module.objectives = mod.objectives.map((obj) => (0, base_js_1.createObjective)(obj, module.title, module.week));
99
+ }
100
+ result.modules.push(module);
101
+ }
102
+ }
103
+ // Parse standalone topics
104
+ if (data.topics) {
105
+ for (const t of data.topics) {
106
+ const topic = {
107
+ name: t.name,
108
+ objectives: (t.objectives || []).map((obj) => (0, base_js_1.createObjective)(obj)),
109
+ };
110
+ if (t.description !== undefined) {
111
+ topic.description = t.description;
112
+ }
113
+ if (t.estimatedMinutes !== undefined) {
114
+ topic.estimatedMinutes = t.estimatedMinutes;
115
+ }
116
+ result.topics.push(topic);
117
+ }
118
+ }
119
+ // Parse standalone objectives
120
+ if (data.objectives) {
121
+ result.objectives = data.objectives.map((obj) => (0, base_js_1.createObjective)(obj));
122
+ }
123
+ result.stats = (0, base_js_1.calculateStats)(result, startTime);
124
+ return result;
125
+ }
126
+ /**
127
+ * Parse simple key-value format (basic YAML-like)
128
+ */
129
+ parseSimpleFormat(content) {
130
+ const lines = content.split('\n');
131
+ const result = { objectives: [] };
132
+ for (const line of lines) {
133
+ const trimmed = line.trim();
134
+ if (!trimmed || trimmed.startsWith('#'))
135
+ continue;
136
+ // Check for key: value
137
+ const colonIndex = trimmed.indexOf(':');
138
+ if (colonIndex > 0) {
139
+ const key = trimmed.substring(0, colonIndex).trim().toLowerCase();
140
+ const value = trimmed.substring(colonIndex + 1).trim();
141
+ if (key === 'title')
142
+ result.title = value;
143
+ else if (key === 'course')
144
+ result.course = value;
145
+ else if (key === 'institution')
146
+ result.institution = value;
147
+ }
148
+ else if (trimmed.startsWith('-') || trimmed.startsWith('*')) {
149
+ // List item = objective
150
+ result.objectives.push(trimmed.substring(1).trim());
151
+ }
152
+ }
153
+ return result;
154
+ }
155
+ }
156
+ exports.JSONParser = JSONParser;
157
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/parsers/json.ts"],"names":[],"mappings":"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"}