learngraph 0.1.1 → 0.3.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 (150) hide show
  1. package/LICENSE +190 -21
  2. package/README.md +165 -3
  3. package/dist/cjs/llm/adapters/anthropic.js +124 -0
  4. package/dist/cjs/llm/adapters/anthropic.js.map +1 -0
  5. package/dist/cjs/llm/adapters/base.js +100 -0
  6. package/dist/cjs/llm/adapters/base.js.map +1 -0
  7. package/dist/cjs/llm/adapters/index.js +22 -0
  8. package/dist/cjs/llm/adapters/index.js.map +1 -0
  9. package/dist/cjs/llm/adapters/ollama.js +149 -0
  10. package/dist/cjs/llm/adapters/ollama.js.map +1 -0
  11. package/dist/cjs/llm/adapters/openai.js +126 -0
  12. package/dist/cjs/llm/adapters/openai.js.map +1 -0
  13. package/dist/cjs/llm/index.js +34 -5
  14. package/dist/cjs/llm/index.js.map +1 -1
  15. package/dist/cjs/llm/orchestrator.js +219 -0
  16. package/dist/cjs/llm/orchestrator.js.map +1 -0
  17. package/dist/cjs/llm/prompts.js +367 -0
  18. package/dist/cjs/llm/prompts.js.map +1 -0
  19. package/dist/cjs/parsers/base.js +189 -0
  20. package/dist/cjs/parsers/base.js.map +1 -0
  21. package/dist/cjs/parsers/demo.js +159 -0
  22. package/dist/cjs/parsers/demo.js.map +1 -0
  23. package/dist/cjs/parsers/extractor.js +191 -0
  24. package/dist/cjs/parsers/extractor.js.map +1 -0
  25. package/dist/cjs/parsers/index.js +43 -4
  26. package/dist/cjs/parsers/index.js.map +1 -1
  27. package/dist/cjs/parsers/json.js +157 -0
  28. package/dist/cjs/parsers/json.js.map +1 -0
  29. package/dist/cjs/parsers/markdown.js +168 -0
  30. package/dist/cjs/parsers/markdown.js.map +1 -0
  31. package/dist/cjs/parsers/samples.js +139 -0
  32. package/dist/cjs/parsers/samples.js.map +1 -0
  33. package/dist/cjs/storage/base.js +231 -0
  34. package/dist/cjs/storage/base.js.map +1 -0
  35. package/dist/cjs/storage/errors.js +128 -0
  36. package/dist/cjs/storage/errors.js.map +1 -0
  37. package/dist/cjs/storage/index.js +92 -5
  38. package/dist/cjs/storage/index.js.map +1 -1
  39. package/dist/cjs/storage/levelgraph.js +855 -0
  40. package/dist/cjs/storage/levelgraph.js.map +1 -0
  41. package/dist/cjs/storage/memory.js +447 -0
  42. package/dist/cjs/storage/memory.js.map +1 -0
  43. package/dist/cjs/storage/neo4j.js +866 -0
  44. package/dist/cjs/storage/neo4j.js.map +1 -0
  45. package/dist/cjs/storage/seeds.js +565 -0
  46. package/dist/cjs/storage/seeds.js.map +1 -0
  47. package/dist/cjs/types/llm.js +8 -0
  48. package/dist/cjs/types/llm.js.map +1 -0
  49. package/dist/cjs/types/parser.js +8 -0
  50. package/dist/cjs/types/parser.js.map +1 -0
  51. package/dist/esm/llm/adapters/anthropic.js +119 -0
  52. package/dist/esm/llm/adapters/anthropic.js.map +1 -0
  53. package/dist/esm/llm/adapters/base.js +95 -0
  54. package/dist/esm/llm/adapters/base.js.map +1 -0
  55. package/dist/esm/llm/adapters/index.js +10 -0
  56. package/dist/esm/llm/adapters/index.js.map +1 -0
  57. package/dist/esm/llm/adapters/ollama.js +144 -0
  58. package/dist/esm/llm/adapters/ollama.js.map +1 -0
  59. package/dist/esm/llm/adapters/openai.js +121 -0
  60. package/dist/esm/llm/adapters/openai.js.map +1 -0
  61. package/dist/esm/llm/index.js +12 -6
  62. package/dist/esm/llm/index.js.map +1 -1
  63. package/dist/esm/llm/orchestrator.js +214 -0
  64. package/dist/esm/llm/orchestrator.js.map +1 -0
  65. package/dist/esm/llm/prompts.js +360 -0
  66. package/dist/esm/llm/prompts.js.map +1 -0
  67. package/dist/esm/parsers/base.js +179 -0
  68. package/dist/esm/parsers/base.js.map +1 -0
  69. package/dist/esm/parsers/demo.js +154 -0
  70. package/dist/esm/parsers/demo.js.map +1 -0
  71. package/dist/esm/parsers/extractor.js +187 -0
  72. package/dist/esm/parsers/extractor.js.map +1 -0
  73. package/dist/esm/parsers/index.js +24 -5
  74. package/dist/esm/parsers/index.js.map +1 -1
  75. package/dist/esm/parsers/json.js +153 -0
  76. package/dist/esm/parsers/json.js.map +1 -0
  77. package/dist/esm/parsers/markdown.js +164 -0
  78. package/dist/esm/parsers/markdown.js.map +1 -0
  79. package/dist/esm/parsers/samples.js +136 -0
  80. package/dist/esm/parsers/samples.js.map +1 -0
  81. package/dist/esm/storage/base.js +221 -0
  82. package/dist/esm/storage/base.js.map +1 -0
  83. package/dist/esm/storage/errors.js +116 -0
  84. package/dist/esm/storage/errors.js.map +1 -0
  85. package/dist/esm/storage/index.js +71 -6
  86. package/dist/esm/storage/index.js.map +1 -1
  87. package/dist/esm/storage/levelgraph.js +818 -0
  88. package/dist/esm/storage/levelgraph.js.map +1 -0
  89. package/dist/esm/storage/memory.js +443 -0
  90. package/dist/esm/storage/memory.js.map +1 -0
  91. package/dist/esm/storage/neo4j.js +829 -0
  92. package/dist/esm/storage/neo4j.js.map +1 -0
  93. package/dist/esm/storage/seeds.js +561 -0
  94. package/dist/esm/storage/seeds.js.map +1 -0
  95. package/dist/esm/types/llm.js +7 -0
  96. package/dist/esm/types/llm.js.map +1 -0
  97. package/dist/esm/types/parser.js +7 -0
  98. package/dist/esm/types/parser.js.map +1 -0
  99. package/dist/types/llm/adapters/anthropic.d.ts +21 -0
  100. package/dist/types/llm/adapters/anthropic.d.ts.map +1 -0
  101. package/dist/types/llm/adapters/base.d.ts +46 -0
  102. package/dist/types/llm/adapters/base.d.ts.map +1 -0
  103. package/dist/types/llm/adapters/index.d.ts +11 -0
  104. package/dist/types/llm/adapters/index.d.ts.map +1 -0
  105. package/dist/types/llm/adapters/ollama.d.ts +30 -0
  106. package/dist/types/llm/adapters/ollama.d.ts.map +1 -0
  107. package/dist/types/llm/adapters/openai.d.ts +22 -0
  108. package/dist/types/llm/adapters/openai.d.ts.map +1 -0
  109. package/dist/types/llm/index.d.ts +5 -0
  110. package/dist/types/llm/index.d.ts.map +1 -1
  111. package/dist/types/llm/orchestrator.d.ts +35 -0
  112. package/dist/types/llm/orchestrator.d.ts.map +1 -0
  113. package/dist/types/llm/prompts.d.ts +269 -0
  114. package/dist/types/llm/prompts.d.ts.map +1 -0
  115. package/dist/types/parsers/base.d.ts +39 -0
  116. package/dist/types/parsers/base.d.ts.map +1 -0
  117. package/dist/types/parsers/demo.d.ts +87 -0
  118. package/dist/types/parsers/demo.d.ts.map +1 -0
  119. package/dist/types/parsers/extractor.d.ts +43 -0
  120. package/dist/types/parsers/extractor.d.ts.map +1 -0
  121. package/dist/types/parsers/index.d.ts +10 -0
  122. package/dist/types/parsers/index.d.ts.map +1 -1
  123. package/dist/types/parsers/json.d.ts +71 -0
  124. package/dist/types/parsers/json.d.ts.map +1 -0
  125. package/dist/types/parsers/markdown.d.ts +43 -0
  126. package/dist/types/parsers/markdown.d.ts.map +1 -0
  127. package/dist/types/parsers/samples.d.ts +27 -0
  128. package/dist/types/parsers/samples.d.ts.map +1 -0
  129. package/dist/types/storage/base.d.ts +39 -0
  130. package/dist/types/storage/base.d.ts.map +1 -0
  131. package/dist/types/storage/errors.d.ts +74 -0
  132. package/dist/types/storage/errors.d.ts.map +1 -0
  133. package/dist/types/storage/index.d.ts +50 -2
  134. package/dist/types/storage/index.d.ts.map +1 -1
  135. package/dist/types/storage/levelgraph.d.ts +92 -0
  136. package/dist/types/storage/levelgraph.d.ts.map +1 -0
  137. package/dist/types/storage/memory.d.ts +70 -0
  138. package/dist/types/storage/memory.d.ts.map +1 -0
  139. package/dist/types/storage/neo4j.d.ts +88 -0
  140. package/dist/types/storage/neo4j.d.ts.map +1 -0
  141. package/dist/types/storage/seeds.d.ts +27 -0
  142. package/dist/types/storage/seeds.d.ts.map +1 -0
  143. package/dist/types/types/index.d.ts +2 -0
  144. package/dist/types/types/index.d.ts.map +1 -1
  145. package/dist/types/types/llm.d.ts +298 -0
  146. package/dist/types/types/llm.d.ts.map +1 -0
  147. package/dist/types/types/parser.d.ts +208 -0
  148. package/dist/types/types/parser.d.ts.map +1 -0
  149. package/package.json +4 -2
  150. package/scripts/postinstall.js +68 -0
@@ -0,0 +1,153 @@
1
+ /**
2
+ * JSON/YAML syllabus parser
3
+ *
4
+ * Parses structured JSON or YAML syllabi into the standard format.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ import { createObjective, createEmptyResult, calculateStats } from './base.js';
9
+ /**
10
+ * JSON/YAML parser for structured syllabi
11
+ *
12
+ * @example
13
+ * ```typescript
14
+ * import { JSONParser } from 'learngraph/parsers';
15
+ *
16
+ * const parser = new JSONParser();
17
+ * const result = await parser.parse(JSON.stringify({
18
+ * title: "Kindergarten Math",
19
+ * modules: [
20
+ * {
21
+ * title: "Counting",
22
+ * week: 1,
23
+ * objectives: [
24
+ * "Count objects from 1 to 10",
25
+ * "Recognize number symbols 1-10",
26
+ * "Compare groups using more, less, same"
27
+ * ]
28
+ * }
29
+ * ]
30
+ * }));
31
+ * ```
32
+ */
33
+ export class JSONParser {
34
+ format = 'json';
35
+ async parse(content, _options) {
36
+ const startTime = Date.now();
37
+ const result = createEmptyResult('json', 'json');
38
+ let data;
39
+ try {
40
+ data = JSON.parse(content);
41
+ }
42
+ catch {
43
+ // Try YAML-like simple format (key: value)
44
+ data = this.parseSimpleFormat(content);
45
+ }
46
+ // Extract metadata
47
+ if (data.title)
48
+ result.metadata.title = data.title;
49
+ if (data.course)
50
+ result.metadata.course = data.course;
51
+ if (data.institution)
52
+ result.metadata.institution = data.institution;
53
+ if (data.gradeLevel)
54
+ result.metadata.gradeLevel = data.gradeLevel;
55
+ // Parse modules
56
+ if (data.modules) {
57
+ for (let i = 0; i < data.modules.length; i++) {
58
+ const mod = data.modules[i];
59
+ if (!mod)
60
+ continue;
61
+ const module = {
62
+ id: mod.id || `module-${i + 1}`,
63
+ title: mod.title,
64
+ topics: [],
65
+ objectives: [],
66
+ };
67
+ // Conditionally set optional properties
68
+ if (mod.description !== undefined) {
69
+ module.description = mod.description;
70
+ }
71
+ if (mod.week !== undefined) {
72
+ module.week = mod.week;
73
+ }
74
+ if (mod.estimatedMinutes !== undefined) {
75
+ module.estimatedMinutes = mod.estimatedMinutes;
76
+ }
77
+ // Parse module topics
78
+ if (mod.topics) {
79
+ for (const t of mod.topics) {
80
+ const topic = {
81
+ name: t.name,
82
+ objectives: (t.objectives || []).map((obj) => createObjective(obj, module.title, module.week)),
83
+ };
84
+ if (t.description !== undefined) {
85
+ topic.description = t.description;
86
+ }
87
+ if (t.estimatedMinutes !== undefined) {
88
+ topic.estimatedMinutes = t.estimatedMinutes;
89
+ }
90
+ module.topics.push(topic);
91
+ }
92
+ }
93
+ // Parse module-level objectives
94
+ if (mod.objectives) {
95
+ module.objectives = mod.objectives.map((obj) => createObjective(obj, module.title, module.week));
96
+ }
97
+ result.modules.push(module);
98
+ }
99
+ }
100
+ // Parse standalone topics
101
+ if (data.topics) {
102
+ for (const t of data.topics) {
103
+ const topic = {
104
+ name: t.name,
105
+ objectives: (t.objectives || []).map((obj) => createObjective(obj)),
106
+ };
107
+ if (t.description !== undefined) {
108
+ topic.description = t.description;
109
+ }
110
+ if (t.estimatedMinutes !== undefined) {
111
+ topic.estimatedMinutes = t.estimatedMinutes;
112
+ }
113
+ result.topics.push(topic);
114
+ }
115
+ }
116
+ // Parse standalone objectives
117
+ if (data.objectives) {
118
+ result.objectives = data.objectives.map((obj) => createObjective(obj));
119
+ }
120
+ result.stats = calculateStats(result, startTime);
121
+ return result;
122
+ }
123
+ /**
124
+ * Parse simple key-value format (basic YAML-like)
125
+ */
126
+ parseSimpleFormat(content) {
127
+ const lines = content.split('\n');
128
+ const result = { objectives: [] };
129
+ for (const line of lines) {
130
+ const trimmed = line.trim();
131
+ if (!trimmed || trimmed.startsWith('#'))
132
+ continue;
133
+ // Check for key: value
134
+ const colonIndex = trimmed.indexOf(':');
135
+ if (colonIndex > 0) {
136
+ const key = trimmed.substring(0, colonIndex).trim().toLowerCase();
137
+ const value = trimmed.substring(colonIndex + 1).trim();
138
+ if (key === 'title')
139
+ result.title = value;
140
+ else if (key === 'course')
141
+ result.course = value;
142
+ else if (key === 'institution')
143
+ result.institution = value;
144
+ }
145
+ else if (trimmed.startsWith('-') || trimmed.startsWith('*')) {
146
+ // List item = objective
147
+ result.objectives.push(trimmed.substring(1).trim());
148
+ }
149
+ }
150
+ return result;
151
+ }
152
+ }
153
+ //# 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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"}
@@ -0,0 +1,164 @@
1
+ /**
2
+ * Markdown syllabus parser
3
+ *
4
+ * Parses markdown-formatted syllabi into structured content.
5
+ * Works with common syllabus formats from universities and K-12.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { DEFAULT_PARSE_OPTIONS, createObjective, createEmptyResult, calculateStats, cleanText, extractTime, } from './base.js';
10
+ /**
11
+ * Markdown parser for syllabi and course outlines
12
+ *
13
+ * @example
14
+ * ```typescript
15
+ * import { MarkdownParser } from 'learngraph/parsers';
16
+ *
17
+ * const parser = new MarkdownParser();
18
+ * const result = await parser.parse(`
19
+ * # Introduction to Physics
20
+ *
21
+ * ## Week 1: Motion
22
+ *
23
+ * ### Learning Objectives
24
+ * - Describe the relationship between position, velocity, and acceleration
25
+ * - Calculate velocity from displacement and time
26
+ * - Apply kinematic equations to solve motion problems
27
+ *
28
+ * ## Week 2: Forces
29
+ *
30
+ * ### Learning Objectives
31
+ * - Identify forces acting on objects
32
+ * - Apply Newton's laws to predict motion
33
+ * `);
34
+ *
35
+ * console.log(result.modules); // 2 modules (Week 1, Week 2)
36
+ * console.log(result.stats.objectiveCount); // 5 objectives
37
+ * ```
38
+ */
39
+ export class MarkdownParser {
40
+ format = 'markdown';
41
+ async parse(content, options) {
42
+ const startTime = Date.now();
43
+ const opts = { ...DEFAULT_PARSE_OPTIONS, ...options };
44
+ const result = createEmptyResult('markdown', 'markdown');
45
+ const warnings = [];
46
+ const lines = content.split('\n');
47
+ let currentModule = null;
48
+ let currentTopic = null;
49
+ // Extract title from first H1
50
+ const titleMatch = content.match(/^#\s+(.+)$/m);
51
+ if (titleMatch && titleMatch[1]) {
52
+ result.metadata.title = titleMatch[1].trim();
53
+ }
54
+ for (let i = 0; i < lines.length; i++) {
55
+ const line = lines[i] ?? '';
56
+ const trimmed = line.trim();
57
+ if (!trimmed) {
58
+ continue;
59
+ }
60
+ // H1: Course title (already extracted)
61
+ if (trimmed.startsWith('# ')) {
62
+ continue;
63
+ }
64
+ // H2: Module/Week/Chapter
65
+ if (trimmed.startsWith('## ')) {
66
+ // Save previous module
67
+ if (currentModule) {
68
+ if (currentTopic) {
69
+ currentModule.topics.push(currentTopic);
70
+ currentTopic = null;
71
+ }
72
+ result.modules.push(currentModule);
73
+ }
74
+ const title = trimmed.substring(3).trim();
75
+ const weekMatch = title.match(/week\s*(\d+)/i);
76
+ const mod = {
77
+ id: `module-${result.modules.length + 1}`,
78
+ title,
79
+ topics: [],
80
+ objectives: [],
81
+ };
82
+ if (weekMatch && weekMatch[1]) {
83
+ mod.week = parseInt(weekMatch[1], 10);
84
+ }
85
+ const estTime = extractTime(title);
86
+ if (estTime !== undefined) {
87
+ mod.estimatedMinutes = estTime;
88
+ }
89
+ currentModule = mod;
90
+ continue;
91
+ }
92
+ // H3: Topic or "Learning Objectives" section
93
+ if (trimmed.startsWith('### ')) {
94
+ const title = trimmed.substring(4).trim();
95
+ const lower = title.toLowerCase();
96
+ // Check if this is an objectives section header - skip it as a topic
97
+ if (lower.includes('objective') ||
98
+ lower.includes('outcome') ||
99
+ lower.includes('goal')) {
100
+ continue;
101
+ }
102
+ // Save previous topic
103
+ if (currentTopic && currentModule) {
104
+ currentModule.topics.push(currentTopic);
105
+ }
106
+ const topic = {
107
+ name: title,
108
+ objectives: [],
109
+ };
110
+ const topicTime = extractTime(title);
111
+ if (topicTime !== undefined) {
112
+ topic.estimatedMinutes = topicTime;
113
+ }
114
+ currentTopic = topic;
115
+ continue;
116
+ }
117
+ // H4: Sub-topic or nested objectives - skip
118
+ if (trimmed.startsWith('#### ')) {
119
+ continue;
120
+ }
121
+ // List items: potential objectives
122
+ if (trimmed.startsWith('- ') ||
123
+ trimmed.startsWith('* ') ||
124
+ trimmed.match(/^\d+\.\s/)) {
125
+ const text = cleanText(trimmed);
126
+ // Skip if too short
127
+ if (text.length < 10) {
128
+ continue;
129
+ }
130
+ const objective = createObjective(text, currentModule?.title, currentModule?.week);
131
+ // Add to appropriate container
132
+ if (currentTopic) {
133
+ currentTopic.objectives.push(objective);
134
+ }
135
+ else if (currentModule) {
136
+ currentModule.objectives.push(objective);
137
+ }
138
+ else {
139
+ result.objectives.push(objective);
140
+ }
141
+ // Warn if Bloom's not detected
142
+ if (opts.detectBloom && !objective.bloomLevel) {
143
+ warnings.push({
144
+ type: 'ambiguous_bloom',
145
+ message: `Could not detect Bloom's level: "${text.substring(0, 50)}..."`,
146
+ location: `Line ${i + 1}`,
147
+ });
148
+ }
149
+ continue;
150
+ }
151
+ }
152
+ // Save final module/topic
153
+ if (currentTopic && currentModule) {
154
+ currentModule.topics.push(currentTopic);
155
+ }
156
+ if (currentModule) {
157
+ result.modules.push(currentModule);
158
+ }
159
+ result.warnings = warnings;
160
+ result.stats = calculateStats(result, startTime);
161
+ return result;
162
+ }
163
+ }
164
+ //# sourceMappingURL=markdown.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"markdown.js","sourceRoot":"","sources":["../../../src/parsers/markdown.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Sample syllabi for testing and demonstration
3
+ *
4
+ * @packageDocumentation
5
+ */
6
+ /**
7
+ * Sample physics syllabus (university level)
8
+ */
9
+ export const PHYSICS_101_SYLLABUS = `# Introduction to Physics
10
+
11
+ ## Course Information
12
+ PHYS 101 - Introduction to Physics
13
+ Fall Semester
14
+
15
+ ## Week 1: Motion and Kinematics
16
+
17
+ ### Learning Objectives
18
+ - Define position, displacement, velocity, and acceleration
19
+ - Calculate average and instantaneous velocity from position data
20
+ - Apply kinematic equations to solve motion problems in one dimension
21
+ - Analyze position-time and velocity-time graphs
22
+
23
+ ## Week 2: Forces and Newton's Laws
24
+
25
+ ### Learning Objectives
26
+ - Identify all forces acting on an object using free-body diagrams
27
+ - Apply Newton's First Law to explain equilibrium conditions
28
+ - Calculate net force and acceleration using Newton's Second Law
29
+ - Analyze action-reaction pairs using Newton's Third Law
30
+
31
+ ## Week 3: Work and Energy
32
+
33
+ ### Learning Objectives
34
+ - Calculate work done by constant and variable forces
35
+ - Apply the work-energy theorem to solve problems
36
+ - Distinguish between kinetic and potential energy
37
+ - Analyze systems using conservation of energy
38
+
39
+ ## Week 4: Momentum and Collisions
40
+
41
+ ### Learning Objectives
42
+ - Calculate linear momentum of objects and systems
43
+ - Apply impulse-momentum theorem to analyze collisions
44
+ - Distinguish between elastic and inelastic collisions
45
+ - Solve collision problems using conservation of momentum
46
+ `;
47
+ /**
48
+ * Sample kindergarten math syllabus
49
+ */
50
+ export const KINDERGARTEN_MATH_SYLLABUS = `# Kindergarten Mathematics
51
+
52
+ ## Course Information
53
+ Grade: Kindergarten
54
+ Subject: Mathematics
55
+
56
+ ## Unit 1: Counting and Cardinality
57
+
58
+ ### Learning Objectives
59
+ - Count objects from 1 to 20
60
+ - Recognize and write number symbols 0-20
61
+ - Compare groups using words: more, less, same
62
+ - Understand that the last number counted tells how many
63
+
64
+ ## Unit 2: Number Operations
65
+
66
+ ### Learning Objectives
67
+ - Understand addition as putting together
68
+ - Understand subtraction as taking apart
69
+ - Represent addition and subtraction with objects
70
+ - Solve simple addition problems within 10
71
+
72
+ ## Unit 3: Shapes and Geometry
73
+
74
+ ### Learning Objectives
75
+ - Identify circles, squares, triangles, and rectangles
76
+ - Describe shapes using words like sides and corners
77
+ - Compare shapes by size and orientation
78
+ - Create pictures using basic shapes
79
+
80
+ ## Unit 4: Measurement
81
+
82
+ ### Learning Objectives
83
+ - Compare objects by length (longer, shorter)
84
+ - Compare objects by weight (heavier, lighter)
85
+ - Sort objects by size, color, or shape
86
+ - Describe position using words: above, below, beside
87
+ `;
88
+ /**
89
+ * Sample programming course syllabus
90
+ */
91
+ export const PROGRAMMING_101_SYLLABUS = `# Introduction to Programming
92
+
93
+ ## Course Information
94
+ CS 101 - Introduction to Programming with Python
95
+
96
+ ## Module 1: Getting Started
97
+
98
+ ### Learning Objectives
99
+ - Install and configure Python development environment
100
+ - Write and execute a simple Python program
101
+ - Identify syntax errors in Python code
102
+ - Use print statements to display output
103
+
104
+ ## Module 2: Variables and Data Types
105
+
106
+ ### Learning Objectives
107
+ - Define variables and assign values
108
+ - Distinguish between integers, floats, and strings
109
+ - Apply type conversion between data types
110
+ - Calculate results using arithmetic operators
111
+
112
+ ## Module 3: Control Flow
113
+
114
+ ### Learning Objectives
115
+ - Write conditional statements using if-else
116
+ - Evaluate boolean expressions
117
+ - Create loops using for and while statements
118
+ - Design nested control structures
119
+
120
+ ## Module 4: Functions
121
+
122
+ ### Learning Objectives
123
+ - Define functions with parameters
124
+ - Apply return values from functions
125
+ - Design functions that call other functions
126
+ - Analyze scope and local variables
127
+ `;
128
+ /**
129
+ * All sample syllabi
130
+ */
131
+ export const SAMPLE_SYLLABI = {
132
+ physics: PHYSICS_101_SYLLABUS,
133
+ kindergarten: KINDERGARTEN_MATH_SYLLABUS,
134
+ programming: PROGRAMMING_101_SYLLABUS,
135
+ };
136
+ //# sourceMappingURL=samples.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"samples.js","sourceRoot":"","sources":["../../../src/parsers/samples.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH;;GAEG;AACH,MAAM,CAAC,MAAM,oBAAoB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCnC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,0BAA0B,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqCzC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAoCvC,CAAC;AAEF;;GAEG;AACH,MAAM,CAAC,MAAM,cAAc,GAAG;IAC5B,OAAO,EAAE,oBAAoB;IAC7B,YAAY,EAAE,0BAA0B;IACxC,WAAW,EAAE,wBAAwB;CAC7B,CAAC"}