marlarky 1.0.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 (274) hide show
  1. package/README.md +489 -0
  2. package/dist/adapters/faker-js-adapter.d.ts +44 -0
  3. package/dist/adapters/faker-js-adapter.d.ts.map +1 -0
  4. package/dist/adapters/faker-js-adapter.js +46 -0
  5. package/dist/adapters/faker-js-adapter.js.map +1 -0
  6. package/dist/adapters/index.d.ts +3 -0
  7. package/dist/adapters/index.d.ts.map +1 -0
  8. package/dist/adapters/index.js +3 -0
  9. package/dist/adapters/index.js.map +1 -0
  10. package/dist/adapters/simple-faker-adapter.d.ts +22 -0
  11. package/dist/adapters/simple-faker-adapter.d.ts.map +1 -0
  12. package/dist/adapters/simple-faker-adapter.js +54 -0
  13. package/dist/adapters/simple-faker-adapter.js.map +1 -0
  14. package/dist/cli.d.ts +7 -0
  15. package/dist/cli.d.ts.map +1 -0
  16. package/dist/cli.js +588 -0
  17. package/dist/cli.js.map +1 -0
  18. package/dist/defaults/index.d.ts +2 -0
  19. package/dist/defaults/index.d.ts.map +1 -0
  20. package/dist/defaults/index.js +2 -0
  21. package/dist/defaults/index.js.map +1 -0
  22. package/dist/defaults/word-lists.d.ts +22 -0
  23. package/dist/defaults/word-lists.d.ts.map +1 -0
  24. package/dist/defaults/word-lists.js +124 -0
  25. package/dist/defaults/word-lists.js.map +1 -0
  26. package/dist/generator/index.d.ts +2 -0
  27. package/dist/generator/index.d.ts.map +1 -0
  28. package/dist/generator/index.js +2 -0
  29. package/dist/generator/index.js.map +1 -0
  30. package/dist/generator/text-generator.d.ts +93 -0
  31. package/dist/generator/text-generator.d.ts.map +1 -0
  32. package/dist/generator/text-generator.js +411 -0
  33. package/dist/generator/text-generator.js.map +1 -0
  34. package/dist/generator/text-generator.test.d.ts +2 -0
  35. package/dist/generator/text-generator.test.d.ts.map +1 -0
  36. package/dist/generator/text-generator.test.js +151 -0
  37. package/dist/generator/text-generator.test.js.map +1 -0
  38. package/dist/grammar/index.d.ts +5 -0
  39. package/dist/grammar/index.d.ts.map +1 -0
  40. package/dist/grammar/index.js +3 -0
  41. package/dist/grammar/index.js.map +1 -0
  42. package/dist/grammar/phrase-builders.d.ts +72 -0
  43. package/dist/grammar/phrase-builders.d.ts.map +1 -0
  44. package/dist/grammar/phrase-builders.js +241 -0
  45. package/dist/grammar/phrase-builders.js.map +1 -0
  46. package/dist/grammar/sentence-templates.d.ts +67 -0
  47. package/dist/grammar/sentence-templates.d.ts.map +1 -0
  48. package/dist/grammar/sentence-templates.js +272 -0
  49. package/dist/grammar/sentence-templates.js.map +1 -0
  50. package/dist/index.d.ts +17 -0
  51. package/dist/index.d.ts.map +1 -0
  52. package/dist/index.js +40 -0
  53. package/dist/index.js.map +1 -0
  54. package/dist/interfaces/faker-adapter.d.ts +25 -0
  55. package/dist/interfaces/faker-adapter.d.ts.map +1 -0
  56. package/dist/interfaces/faker-adapter.js +2 -0
  57. package/dist/interfaces/faker-adapter.js.map +1 -0
  58. package/dist/interfaces/index.d.ts +4 -0
  59. package/dist/interfaces/index.d.ts.map +1 -0
  60. package/dist/interfaces/index.js +2 -0
  61. package/dist/interfaces/index.js.map +1 -0
  62. package/dist/interfaces/lexicon-store.d.ts +39 -0
  63. package/dist/interfaces/lexicon-store.d.ts.map +1 -0
  64. package/dist/interfaces/lexicon-store.js +2 -0
  65. package/dist/interfaces/lexicon-store.js.map +1 -0
  66. package/dist/interfaces/rng.d.ts +25 -0
  67. package/dist/interfaces/rng.d.ts.map +1 -0
  68. package/dist/interfaces/rng.js +2 -0
  69. package/dist/interfaces/rng.js.map +1 -0
  70. package/dist/lexicon/index.d.ts +4 -0
  71. package/dist/lexicon/index.d.ts.map +1 -0
  72. package/dist/lexicon/index.js +4 -0
  73. package/dist/lexicon/index.js.map +1 -0
  74. package/dist/lexicon/loader.d.ts +24 -0
  75. package/dist/lexicon/loader.d.ts.map +1 -0
  76. package/dist/lexicon/loader.js +47 -0
  77. package/dist/lexicon/loader.js.map +1 -0
  78. package/dist/lexicon/store.d.ts +39 -0
  79. package/dist/lexicon/store.d.ts.map +1 -0
  80. package/dist/lexicon/store.js +291 -0
  81. package/dist/lexicon/store.js.map +1 -0
  82. package/dist/lexicon/validator.d.ts +10 -0
  83. package/dist/lexicon/validator.d.ts.map +1 -0
  84. package/dist/lexicon/validator.js +273 -0
  85. package/dist/lexicon/validator.js.map +1 -0
  86. package/dist/morphology/articles.d.ts +17 -0
  87. package/dist/morphology/articles.d.ts.map +1 -0
  88. package/dist/morphology/articles.js +66 -0
  89. package/dist/morphology/articles.js.map +1 -0
  90. package/dist/morphology/articles.test.d.ts +2 -0
  91. package/dist/morphology/articles.test.d.ts.map +1 -0
  92. package/dist/morphology/articles.test.js +56 -0
  93. package/dist/morphology/articles.test.js.map +1 -0
  94. package/dist/morphology/conjugate.d.ts +46 -0
  95. package/dist/morphology/conjugate.d.ts.map +1 -0
  96. package/dist/morphology/conjugate.js +337 -0
  97. package/dist/morphology/conjugate.js.map +1 -0
  98. package/dist/morphology/conjugate.test.d.ts +2 -0
  99. package/dist/morphology/conjugate.test.d.ts.map +1 -0
  100. package/dist/morphology/conjugate.test.js +168 -0
  101. package/dist/morphology/conjugate.test.js.map +1 -0
  102. package/dist/morphology/index.d.ts +6 -0
  103. package/dist/morphology/index.d.ts.map +1 -0
  104. package/dist/morphology/index.js +9 -0
  105. package/dist/morphology/index.js.map +1 -0
  106. package/dist/morphology/normalize.d.ts +52 -0
  107. package/dist/morphology/normalize.d.ts.map +1 -0
  108. package/dist/morphology/normalize.js +127 -0
  109. package/dist/morphology/normalize.js.map +1 -0
  110. package/dist/morphology/pluralize.d.ts +17 -0
  111. package/dist/morphology/pluralize.d.ts.map +1 -0
  112. package/dist/morphology/pluralize.js +186 -0
  113. package/dist/morphology/pluralize.js.map +1 -0
  114. package/dist/morphology/pluralize.test.d.ts +2 -0
  115. package/dist/morphology/pluralize.test.d.ts.map +1 -0
  116. package/dist/morphology/pluralize.test.js +86 -0
  117. package/dist/morphology/pluralize.test.js.map +1 -0
  118. package/dist/providers/index.d.ts +2 -0
  119. package/dist/providers/index.d.ts.map +1 -0
  120. package/dist/providers/index.js +2 -0
  121. package/dist/providers/index.js.map +1 -0
  122. package/dist/providers/word-provider.d.ts +125 -0
  123. package/dist/providers/word-provider.d.ts.map +1 -0
  124. package/dist/providers/word-provider.js +266 -0
  125. package/dist/providers/word-provider.js.map +1 -0
  126. package/dist/rng/index.d.ts +2 -0
  127. package/dist/rng/index.d.ts.map +1 -0
  128. package/dist/rng/index.js +2 -0
  129. package/dist/rng/index.js.map +1 -0
  130. package/dist/rng/seedable-rng.d.ts +19 -0
  131. package/dist/rng/seedable-rng.d.ts.map +1 -0
  132. package/dist/rng/seedable-rng.js +77 -0
  133. package/dist/rng/seedable-rng.js.map +1 -0
  134. package/dist/rng/seedable-rng.test.d.ts +2 -0
  135. package/dist/rng/seedable-rng.test.d.ts.map +1 -0
  136. package/dist/rng/seedable-rng.test.js +165 -0
  137. package/dist/rng/seedable-rng.test.js.map +1 -0
  138. package/dist/rules/index.d.ts +3 -0
  139. package/dist/rules/index.d.ts.map +1 -0
  140. package/dist/rules/index.js +2 -0
  141. package/dist/rules/index.js.map +1 -0
  142. package/dist/rules/rule-engine.d.ts +78 -0
  143. package/dist/rules/rule-engine.d.ts.map +1 -0
  144. package/dist/rules/rule-engine.js +271 -0
  145. package/dist/rules/rule-engine.js.map +1 -0
  146. package/dist/transforms/config-merge.d.ts +19 -0
  147. package/dist/transforms/config-merge.d.ts.map +1 -0
  148. package/dist/transforms/config-merge.js +88 -0
  149. package/dist/transforms/config-merge.js.map +1 -0
  150. package/dist/transforms/config-merge.test.d.ts +2 -0
  151. package/dist/transforms/config-merge.test.d.ts.map +1 -0
  152. package/dist/transforms/config-merge.test.js +91 -0
  153. package/dist/transforms/config-merge.test.js.map +1 -0
  154. package/dist/transforms/default-registry.d.ts +10 -0
  155. package/dist/transforms/default-registry.d.ts.map +1 -0
  156. package/dist/transforms/default-registry.js +17 -0
  157. package/dist/transforms/default-registry.js.map +1 -0
  158. package/dist/transforms/index.d.ts +15 -0
  159. package/dist/transforms/index.d.ts.map +1 -0
  160. package/dist/transforms/index.js +20 -0
  161. package/dist/transforms/index.js.map +1 -0
  162. package/dist/transforms/pipeline.d.ts +28 -0
  163. package/dist/transforms/pipeline.d.ts.map +1 -0
  164. package/dist/transforms/pipeline.js +176 -0
  165. package/dist/transforms/pipeline.js.map +1 -0
  166. package/dist/transforms/pipeline.test.d.ts +2 -0
  167. package/dist/transforms/pipeline.test.d.ts.map +1 -0
  168. package/dist/transforms/pipeline.test.js +175 -0
  169. package/dist/transforms/pipeline.test.js.map +1 -0
  170. package/dist/transforms/protection.d.ts +16 -0
  171. package/dist/transforms/protection.d.ts.map +1 -0
  172. package/dist/transforms/protection.js +97 -0
  173. package/dist/transforms/protection.js.map +1 -0
  174. package/dist/transforms/protection.test.d.ts +2 -0
  175. package/dist/transforms/protection.test.d.ts.map +1 -0
  176. package/dist/transforms/protection.test.js +79 -0
  177. package/dist/transforms/protection.test.js.map +1 -0
  178. package/dist/transforms/registry.d.ts +25 -0
  179. package/dist/transforms/registry.d.ts.map +1 -0
  180. package/dist/transforms/registry.js +32 -0
  181. package/dist/transforms/registry.js.map +1 -0
  182. package/dist/transforms/registry.test.d.ts +2 -0
  183. package/dist/transforms/registry.test.d.ts.map +1 -0
  184. package/dist/transforms/registry.test.js +64 -0
  185. package/dist/transforms/registry.test.js.map +1 -0
  186. package/dist/transforms/tokenizer.d.ts +26 -0
  187. package/dist/transforms/tokenizer.d.ts.map +1 -0
  188. package/dist/transforms/tokenizer.js +137 -0
  189. package/dist/transforms/tokenizer.js.map +1 -0
  190. package/dist/transforms/tokenizer.test.d.ts +2 -0
  191. package/dist/transforms/tokenizer.test.d.ts.map +1 -0
  192. package/dist/transforms/tokenizer.test.js +85 -0
  193. package/dist/transforms/tokenizer.test.js.map +1 -0
  194. package/dist/transforms/transforms/biz-jargon.d.ts +7 -0
  195. package/dist/transforms/transforms/biz-jargon.d.ts.map +1 -0
  196. package/dist/transforms/transforms/biz-jargon.js +117 -0
  197. package/dist/transforms/transforms/biz-jargon.js.map +1 -0
  198. package/dist/transforms/transforms/emoji.d.ts +7 -0
  199. package/dist/transforms/transforms/emoji.d.ts.map +1 -0
  200. package/dist/transforms/transforms/emoji.js +127 -0
  201. package/dist/transforms/transforms/emoji.js.map +1 -0
  202. package/dist/transforms/transforms/index.d.ts +17 -0
  203. package/dist/transforms/transforms/index.d.ts.map +1 -0
  204. package/dist/transforms/transforms/index.js +37 -0
  205. package/dist/transforms/transforms/index.js.map +1 -0
  206. package/dist/transforms/transforms/leet.d.ts +7 -0
  207. package/dist/transforms/transforms/leet.d.ts.map +1 -0
  208. package/dist/transforms/transforms/leet.js +109 -0
  209. package/dist/transforms/transforms/leet.js.map +1 -0
  210. package/dist/transforms/transforms/mock-case.d.ts +7 -0
  211. package/dist/transforms/transforms/mock-case.d.ts.map +1 -0
  212. package/dist/transforms/transforms/mock-case.js +116 -0
  213. package/dist/transforms/transforms/mock-case.js.map +1 -0
  214. package/dist/transforms/transforms/pig-latin.d.ts +7 -0
  215. package/dist/transforms/transforms/pig-latin.d.ts.map +1 -0
  216. package/dist/transforms/transforms/pig-latin.js +132 -0
  217. package/dist/transforms/transforms/pig-latin.js.map +1 -0
  218. package/dist/transforms/transforms/pig-latin.test.d.ts +2 -0
  219. package/dist/transforms/transforms/pig-latin.test.d.ts.map +1 -0
  220. package/dist/transforms/transforms/pig-latin.test.js +77 -0
  221. package/dist/transforms/transforms/pig-latin.test.js.map +1 -0
  222. package/dist/transforms/transforms/pirate.d.ts +7 -0
  223. package/dist/transforms/transforms/pirate.d.ts.map +1 -0
  224. package/dist/transforms/transforms/pirate.js +150 -0
  225. package/dist/transforms/transforms/pirate.js.map +1 -0
  226. package/dist/transforms/transforms/redact.d.ts +7 -0
  227. package/dist/transforms/transforms/redact.d.ts.map +1 -0
  228. package/dist/transforms/transforms/redact.js +109 -0
  229. package/dist/transforms/transforms/redact.js.map +1 -0
  230. package/dist/transforms/transforms/reverse-words.d.ts +7 -0
  231. package/dist/transforms/transforms/reverse-words.d.ts.map +1 -0
  232. package/dist/transforms/transforms/reverse-words.js +88 -0
  233. package/dist/transforms/transforms/reverse-words.js.map +1 -0
  234. package/dist/transforms/transforms/transforms.test.d.ts +11 -0
  235. package/dist/transforms/transforms/transforms.test.d.ts.map +1 -0
  236. package/dist/transforms/transforms/transforms.test.js +489 -0
  237. package/dist/transforms/transforms/transforms.test.js.map +1 -0
  238. package/dist/transforms/transforms/ubbi-dubbi.d.ts +7 -0
  239. package/dist/transforms/transforms/ubbi-dubbi.d.ts.map +1 -0
  240. package/dist/transforms/transforms/ubbi-dubbi.js +120 -0
  241. package/dist/transforms/transforms/ubbi-dubbi.js.map +1 -0
  242. package/dist/transforms/transforms/uwu.d.ts +7 -0
  243. package/dist/transforms/transforms/uwu.d.ts.map +1 -0
  244. package/dist/transforms/transforms/uwu.js +106 -0
  245. package/dist/transforms/transforms/uwu.js.map +1 -0
  246. package/dist/transforms/types.d.ts +159 -0
  247. package/dist/transforms/types.d.ts.map +1 -0
  248. package/dist/transforms/types.js +22 -0
  249. package/dist/transforms/types.js.map +1 -0
  250. package/dist/types/api.d.ts +158 -0
  251. package/dist/types/api.d.ts.map +1 -0
  252. package/dist/types/api.js +6 -0
  253. package/dist/types/api.js.map +1 -0
  254. package/dist/types/config.d.ts +86 -0
  255. package/dist/types/config.d.ts.map +1 -0
  256. package/dist/types/config.js +66 -0
  257. package/dist/types/config.js.map +1 -0
  258. package/dist/types/context.d.ts +74 -0
  259. package/dist/types/context.d.ts.map +1 -0
  260. package/dist/types/context.js +83 -0
  261. package/dist/types/context.js.map +1 -0
  262. package/dist/types/index.d.ts +7 -0
  263. package/dist/types/index.d.ts.map +1 -0
  264. package/dist/types/index.js +3 -0
  265. package/dist/types/index.js.map +1 -0
  266. package/dist/types/lexicon.d.ts +247 -0
  267. package/dist/types/lexicon.d.ts.map +1 -0
  268. package/dist/types/lexicon.js +6 -0
  269. package/dist/types/lexicon.js.map +1 -0
  270. package/examples/basic-usage.ts +48 -0
  271. package/examples/corporate-lexicon.ts +71 -0
  272. package/examples/lexicons/corporate-min.json +200 -0
  273. package/examples/with-tracing.ts +85 -0
  274. package/package.json +70 -0
@@ -0,0 +1,272 @@
1
+ /**
2
+ * Sentence Templates
3
+ * Defines and builds various sentence structures
4
+ */
5
+ import { joinTokens, formatSentence } from '../morphology/index.js';
6
+ export class SentenceTemplates {
7
+ phraseBuilders;
8
+ rng;
9
+ config;
10
+ constructor(phraseBuilders, rng, config) {
11
+ this.phraseBuilders = phraseBuilders;
12
+ this.rng = rng;
13
+ this.config = config;
14
+ }
15
+ /**
16
+ * Select a sentence type based on weights
17
+ */
18
+ selectSentenceType() {
19
+ const weights = this.config.sentenceTypeWeights;
20
+ const total = weights.simpleDeclarative +
21
+ weights.compound +
22
+ weights.introAdverbial +
23
+ weights.subordinate +
24
+ weights.interjection +
25
+ weights.question;
26
+ const rand = this.rng.float() * total;
27
+ let cumulative = 0;
28
+ cumulative += weights.simpleDeclarative;
29
+ if (rand < cumulative)
30
+ return 'simpleDeclarative';
31
+ cumulative += weights.compound;
32
+ if (rand < cumulative)
33
+ return 'compound';
34
+ cumulative += weights.introAdverbial;
35
+ if (rand < cumulative)
36
+ return 'introAdverbial';
37
+ cumulative += weights.subordinate;
38
+ if (rand < cumulative)
39
+ return 'subordinate';
40
+ cumulative += weights.interjection;
41
+ if (rand < cumulative)
42
+ return 'interjection';
43
+ return 'question';
44
+ }
45
+ /**
46
+ * Build a sentence of the given type
47
+ */
48
+ buildSentence(ctx, type) {
49
+ const sentenceType = type ?? this.selectSentenceType();
50
+ switch (sentenceType) {
51
+ case 'simpleDeclarative':
52
+ return this.buildSimpleDeclarative(ctx);
53
+ case 'compound':
54
+ return this.buildCompound(ctx);
55
+ case 'introAdverbial':
56
+ return this.buildIntroAdverbial(ctx);
57
+ case 'subordinate':
58
+ return this.buildSubordinate(ctx);
59
+ case 'interjection':
60
+ return this.buildInterjection(ctx);
61
+ case 'question':
62
+ return this.buildQuestion(ctx);
63
+ default:
64
+ return this.buildSimpleDeclarative(ctx);
65
+ }
66
+ }
67
+ /**
68
+ * Simple declarative: NP VP
69
+ * "The system processes data."
70
+ */
71
+ buildSimpleDeclarative(ctx) {
72
+ const clause = this.phraseBuilders.buildClause(ctx, {
73
+ tense: this.rng.pick(['present', 'past']),
74
+ usePronoun: this.rng.chance(0.3),
75
+ });
76
+ const text = formatSentence(joinTokens(clause.tokens));
77
+ return {
78
+ text,
79
+ type: 'simpleDeclarative',
80
+ tokens: clause.tokens,
81
+ };
82
+ }
83
+ /**
84
+ * Compound: CLAUSE, CONJ CLAUSE
85
+ * "The team works hard, and the project succeeds."
86
+ */
87
+ buildCompound(ctx) {
88
+ const tense = this.rng.pick(['present', 'past']);
89
+ const clause1 = this.phraseBuilders.buildClause(ctx, { tense });
90
+ const conjunction = this.rng.pick(this.config.coordinators);
91
+ const clause2 = this.phraseBuilders.buildClause(ctx, { tense });
92
+ const tokens = [...clause1.tokens, ',', conjunction, ...clause2.tokens];
93
+ const text = formatSentence(joinTokens(tokens));
94
+ return {
95
+ text,
96
+ type: 'compound',
97
+ tokens,
98
+ };
99
+ }
100
+ /**
101
+ * Intro adverbial: ADVP/PP, CLAUSE
102
+ * "Generally, the system performs well."
103
+ * "In most cases, the results are positive."
104
+ */
105
+ buildIntroAdverbial(ctx) {
106
+ const tokens = [];
107
+ // Choose between transition word or PP
108
+ if (this.rng.chance(0.6)) {
109
+ const transition = this.rng.pick(this.config.transitions);
110
+ tokens.push(transition);
111
+ }
112
+ else {
113
+ const pp = this.phraseBuilders.buildPP(ctx);
114
+ tokens.push(...pp.tokens);
115
+ }
116
+ tokens.push(',');
117
+ const clause = this.phraseBuilders.buildClause(ctx, {
118
+ tense: this.rng.pick(['present', 'past']),
119
+ });
120
+ tokens.push(...clause.tokens);
121
+ const text = formatSentence(joinTokens(tokens));
122
+ return {
123
+ text,
124
+ type: 'introAdverbial',
125
+ tokens,
126
+ };
127
+ }
128
+ /**
129
+ * Subordinate: SUBCLAUSE, CLAUSE or CLAUSE SUBCLAUSE
130
+ * "Because the data is accurate, the results are reliable."
131
+ * "The system works well when conditions are optimal."
132
+ */
133
+ buildSubordinate(ctx) {
134
+ const tokens = [];
135
+ const subClause = this.phraseBuilders.buildSubordinateClause(ctx);
136
+ const mainClause = this.phraseBuilders.buildClause(ctx, {
137
+ tense: this.rng.pick(['present', 'past']),
138
+ });
139
+ // Subordinate clause first or last
140
+ if (this.rng.chance(0.5)) {
141
+ // Subordinate first
142
+ tokens.push(...subClause.tokens, ',', ...mainClause.tokens);
143
+ }
144
+ else {
145
+ // Main clause first
146
+ tokens.push(...mainClause.tokens, ...subClause.tokens);
147
+ }
148
+ const text = formatSentence(joinTokens(tokens));
149
+ return {
150
+ text,
151
+ type: 'subordinate',
152
+ tokens,
153
+ };
154
+ }
155
+ /**
156
+ * Interjection: INTJ, CLAUSE
157
+ * "Indeed, the approach is effective."
158
+ */
159
+ buildInterjection(ctx) {
160
+ const tokens = [];
161
+ const interjection = this.rng.pick(this.config.interjections);
162
+ tokens.push(interjection, ',');
163
+ const clause = this.phraseBuilders.buildClause(ctx, {
164
+ tense: 'present',
165
+ });
166
+ tokens.push(...clause.tokens);
167
+ const text = formatSentence(joinTokens(tokens));
168
+ return {
169
+ text,
170
+ type: 'interjection',
171
+ tokens,
172
+ };
173
+ }
174
+ /**
175
+ * Question: Do/Does/Did NP VP? or WH NP VP?
176
+ * "Does the system work efficiently?"
177
+ * "What makes the process effective?"
178
+ */
179
+ buildQuestion(ctx) {
180
+ const tokens = [];
181
+ // Choose between yes/no question or wh-question
182
+ if (this.rng.chance(0.6)) {
183
+ // Yes/no question with do-support
184
+ const subject = this.phraseBuilders.buildNP(ctx, {
185
+ usePronoun: this.rng.chance(0.4),
186
+ includePP: false,
187
+ });
188
+ // Select do/does/did based on subject and tense
189
+ const isPast = this.rng.chance(0.3);
190
+ let doAux;
191
+ if (isPast) {
192
+ doAux = 'did';
193
+ }
194
+ else if (subject.features.number === 'singular' && subject.features.person === 3) {
195
+ doAux = 'does';
196
+ }
197
+ else {
198
+ doAux = 'do';
199
+ }
200
+ tokens.push(doAux);
201
+ tokens.push(...subject.tokens);
202
+ // VP in base form (after do-support)
203
+ const vp = this.phraseBuilders.buildVP(ctx, subject.features, {
204
+ includeObject: true,
205
+ tense: 'present', // Base form after do-support
206
+ });
207
+ // Remove any conjugated form (the VP might have conjugated it)
208
+ tokens.push(...vp.tokens);
209
+ }
210
+ else {
211
+ // Wh-question
212
+ const whWord = this.rng.pick(['what', 'how', 'why', 'when', 'where']);
213
+ tokens.push(whWord);
214
+ if (whWord === 'what' || whWord === 'how') {
215
+ // "What makes X work?" or "How does X work?"
216
+ if (this.rng.chance(0.5)) {
217
+ // "What + VP"
218
+ const vp = this.phraseBuilders.buildVP(ctx, { number: 'singular', person: 3 }, {
219
+ includeObject: true,
220
+ });
221
+ tokens.push(...vp.tokens);
222
+ }
223
+ else {
224
+ // "How does NP VP"
225
+ const subject = this.phraseBuilders.buildNP(ctx, { includePP: false });
226
+ const doAux = subject.features.number === 'singular' && subject.features.person === 3 ? 'does' : 'do';
227
+ tokens.push(doAux);
228
+ tokens.push(...subject.tokens);
229
+ const vp = this.phraseBuilders.buildVP(ctx, subject.features, { includeObject: false });
230
+ tokens.push(...vp.tokens);
231
+ }
232
+ }
233
+ else {
234
+ // "Why/When/Where does NP VP"
235
+ const subject = this.phraseBuilders.buildNP(ctx, { includePP: false });
236
+ const doAux = subject.features.number === 'singular' && subject.features.person === 3 ? 'does' : 'do';
237
+ tokens.push(doAux);
238
+ tokens.push(...subject.tokens);
239
+ const vp = this.phraseBuilders.buildVP(ctx, subject.features, { includeObject: true });
240
+ tokens.push(...vp.tokens);
241
+ }
242
+ }
243
+ const text = formatSentence(joinTokens(tokens), '?');
244
+ return {
245
+ text,
246
+ type: 'question',
247
+ tokens,
248
+ };
249
+ }
250
+ /**
251
+ * Build a sentence with a relative clause
252
+ * "The system that processes data is efficient."
253
+ */
254
+ buildWithRelativeClause(ctx) {
255
+ // Build subject NP
256
+ const subject = this.phraseBuilders.buildNP(ctx, { includePP: false });
257
+ // Build relative clause
258
+ const relClause = this.phraseBuilders.buildRelativeClause(ctx, subject.features);
259
+ // Build main VP
260
+ const vp = this.phraseBuilders.buildVP(ctx, subject.features, {
261
+ includeObject: false,
262
+ });
263
+ const tokens = [...subject.tokens, ...relClause.tokens, ...vp.tokens];
264
+ const text = formatSentence(joinTokens(tokens));
265
+ return {
266
+ text,
267
+ type: 'simpleDeclarative', // Classify as declarative
268
+ tokens,
269
+ };
270
+ }
271
+ }
272
+ //# sourceMappingURL=sentence-templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sentence-templates.js","sourceRoot":"","sources":["../../src/grammar/sentence-templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * LSETG - Lexicon-Steered English Syntax Text Generator
3
+ * A faker-like library for generating syntactically plausible English text
4
+ */
5
+ export { TextGenerator } from './generator/index.js';
6
+ export { FakerJsAdapter, SimpleFakerAdapter } from './adapters/index.js';
7
+ export { LexiconStore, validateLexicon, loadLexiconFromString, loadLexiconFromObject, tryLoadLexicon } from './lexicon/index.js';
8
+ export { SeedableRng } from './rng/index.js';
9
+ export { useAn, getIndefiniteArticle, withIndefiniteArticle, pluralize, singularize, isPlural, getPastTense, getPastParticiple, getPresentParticiple, getThirdPersonSingular, conjugateBe, conjugateHave, conjugateDo, conjugate, normalizeWhitespace, capitalize, capitalizeSentences, ensureEndPunctuation, isCapitalized, endsWithPunctuation, hasNoDoubleSpaces, joinTokens, formatSentence, formatParagraph, formatTextBlock, } from './morphology/index.js';
10
+ export { tokenize, render, classifyChar, applyProtection, isProtected, TransformRegistry, createDefaultRegistry, executePipeline, checkPipelineOrder, mergeOutputTransformsConfig, mergeProtectionConfig, DEFAULT_PROTECTION_CONFIG, DEFAULT_OUTPUT_TRANSFORMS_CONFIG, pigLatinTransform, ubbiDubbiTransform, leetTransform, uwuTransform, pirateTransform, redactTransform, emojiTransform, mockCaseTransform, reverseWordsTransform, bizJargonTransform, V1_TRANSFORMS, } from './transforms/index.js';
11
+ export type { IRng, WeightedItem, IFakerAdapter, ILexiconStore, } from './interfaces/index.js';
12
+ export type { Lexicon, TermSet, Term, TermFeatures, LexicalItem, Pattern, DistributionEntry, Correlation, CorrelationCondition, CorrelationBoost, Constraint, Invariant, Archetype, Relation, TermQuery, PatternQuery, ChoiceEvent, RelationResult, POS, GenerationContext, GenerationHistory, PhraseFeatures, ScopeEntry, GeneratorConfig, SentenceTypeWeights, GeneratorInitOptions, SentenceOptions, ParagraphOptions, TextBlockOptions, TokenTrace, SentenceTrace, ParagraphTrace, GenerationTrace, GenerationMeta, GeneratedText, LexiconValidationError, LexiconValidationResult, } from './types/index.js';
13
+ export { DEFAULT_CONFIG, mergeConfig } from './types/index.js';
14
+ export type { Tense, Aspect, ConjugationOptions } from './morphology/conjugate.js';
15
+ export type { SentenceType, SentenceResult, PhraseResult } from './grammar/index.js';
16
+ export type { Token, TokenType, TokenMeta, ProtectionConfig, TransformStep, OutputTransformsConfig, OutputTransformsOverride, TransformCapabilities, TransformInput, TransformOutput, ValidationResult as TransformValidationResult, IOutputTransform, OutputTokenTrace, TransformEvent, LexiconOutputTransforms, ArchetypeOutputTransforms, PipelineResult, } from './transforms/index.js';
17
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAGrD,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAGzE,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGjI,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAG7C,OAAO,EAEL,KAAK,EACL,oBAAoB,EACpB,qBAAqB,EAErB,SAAS,EACT,WAAW,EACX,QAAQ,EAER,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,WAAW,EACX,SAAS,EAET,mBAAmB,EACnB,UAAU,EACV,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAG/B,OAAO,EAEL,QAAQ,EACR,MAAM,EACN,YAAY,EAEZ,eAAe,EACf,WAAW,EAEX,iBAAiB,EACjB,qBAAqB,EAErB,eAAe,EACf,kBAAkB,EAElB,2BAA2B,EAC3B,qBAAqB,EAErB,yBAAyB,EACzB,gCAAgC,EAEhC,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EAEV,IAAI,EACJ,YAAY,EACZ,aAAa,EACb,aAAa,GACd,MAAM,uBAAuB,CAAC;AAE/B,YAAY,EAEV,OAAO,EACP,OAAO,EACP,IAAI,EACJ,YAAY,EACZ,WAAW,EACX,OAAO,EACP,iBAAiB,EACjB,WAAW,EACX,oBAAoB,EACpB,gBAAgB,EAChB,UAAU,EACV,SAAS,EACT,SAAS,EACT,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,EACd,GAAG,EAEH,iBAAiB,EACjB,iBAAiB,EACjB,cAAc,EACd,UAAU,EAEV,eAAe,EACf,mBAAmB,EAEnB,oBAAoB,EACpB,eAAe,EACf,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,aAAa,EACb,cAAc,EACd,eAAe,EACf,cAAc,EACd,aAAa,EACb,sBAAsB,EACtB,uBAAuB,GACxB,MAAM,kBAAkB,CAAC;AAE1B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAG/D,YAAY,EAAE,KAAK,EAAE,MAAM,EAAE,kBAAkB,EAAE,MAAM,2BAA2B,CAAC;AAGnF,YAAY,EAAE,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAGrF,YAAY,EACV,KAAK,EACL,SAAS,EACT,SAAS,EACT,gBAAgB,EAChB,aAAa,EACb,sBAAsB,EACtB,wBAAwB,EACxB,qBAAqB,EACrB,cAAc,EACd,eAAe,EACf,gBAAgB,IAAI,yBAAyB,EAC7C,gBAAgB,EAChB,gBAAgB,EAChB,cAAc,EACd,uBAAuB,EACvB,yBAAyB,EACzB,cAAc,GACf,MAAM,uBAAuB,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,40 @@
1
+ /**
2
+ * LSETG - Lexicon-Steered English Syntax Text Generator
3
+ * A faker-like library for generating syntactically plausible English text
4
+ */
5
+ // Main API
6
+ export { TextGenerator } from './generator/index.js';
7
+ // Adapters
8
+ export { FakerJsAdapter, SimpleFakerAdapter } from './adapters/index.js';
9
+ // Lexicon utilities
10
+ export { LexiconStore, validateLexicon, loadLexiconFromString, loadLexiconFromObject, tryLoadLexicon } from './lexicon/index.js';
11
+ // RNG
12
+ export { SeedableRng } from './rng/index.js';
13
+ // Morphology utilities
14
+ export {
15
+ // Articles
16
+ useAn, getIndefiniteArticle, withIndefiniteArticle,
17
+ // Pluralization
18
+ pluralize, singularize, isPlural,
19
+ // Conjugation
20
+ getPastTense, getPastParticiple, getPresentParticiple, getThirdPersonSingular, conjugateBe, conjugateHave, conjugateDo, conjugate,
21
+ // Normalization
22
+ normalizeWhitespace, capitalize, capitalizeSentences, ensureEndPunctuation, isCapitalized, endsWithPunctuation, hasNoDoubleSpaces, joinTokens, formatSentence, formatParagraph, formatTextBlock, } from './morphology/index.js';
23
+ // Output Transform System
24
+ export {
25
+ // Tokenizer
26
+ tokenize, render, classifyChar,
27
+ // Protection
28
+ applyProtection, isProtected,
29
+ // Registry
30
+ TransformRegistry, createDefaultRegistry,
31
+ // Pipeline
32
+ executePipeline, checkPipelineOrder,
33
+ // Config Merge
34
+ mergeOutputTransformsConfig, mergeProtectionConfig,
35
+ // Constants
36
+ DEFAULT_PROTECTION_CONFIG, DEFAULT_OUTPUT_TRANSFORMS_CONFIG,
37
+ // V1 Transforms
38
+ pigLatinTransform, ubbiDubbiTransform, leetTransform, uwuTransform, pirateTransform, redactTransform, emojiTransform, mockCaseTransform, reverseWordsTransform, bizJargonTransform, V1_TRANSFORMS, } from './transforms/index.js';
39
+ export { DEFAULT_CONFIG, mergeConfig } from './types/index.js';
40
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,WAAW;AACX,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAErD,WAAW;AACX,OAAO,EAAE,cAAc,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzE,oBAAoB;AACpB,OAAO,EAAE,YAAY,EAAE,eAAe,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAEjI,MAAM;AACN,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAE7C,uBAAuB;AACvB,OAAO;AACL,WAAW;AACX,KAAK,EACL,oBAAoB,EACpB,qBAAqB;AACrB,gBAAgB;AAChB,SAAS,EACT,WAAW,EACX,QAAQ;AACR,cAAc;AACd,YAAY,EACZ,iBAAiB,EACjB,oBAAoB,EACpB,sBAAsB,EACtB,WAAW,EACX,aAAa,EACb,WAAW,EACX,SAAS;AACT,gBAAgB;AAChB,mBAAmB,EACnB,UAAU,EACV,mBAAmB,EACnB,oBAAoB,EACpB,aAAa,EACb,mBAAmB,EACnB,iBAAiB,EACjB,UAAU,EACV,cAAc,EACd,eAAe,EACf,eAAe,GAChB,MAAM,uBAAuB,CAAC;AAE/B,0BAA0B;AAC1B,OAAO;AACL,YAAY;AACZ,QAAQ,EACR,MAAM,EACN,YAAY;AACZ,aAAa;AACb,eAAe,EACf,WAAW;AACX,WAAW;AACX,iBAAiB,EACjB,qBAAqB;AACrB,WAAW;AACX,eAAe,EACf,kBAAkB;AAClB,eAAe;AACf,2BAA2B,EAC3B,qBAAqB;AACrB,YAAY;AACZ,yBAAyB,EACzB,gCAAgC;AAChC,gBAAgB;AAChB,iBAAiB,EACjB,kBAAkB,EAClB,aAAa,EACb,YAAY,EACZ,eAAe,EACf,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,qBAAqB,EACrB,kBAAkB,EAClB,aAAa,GACd,MAAM,uBAAuB,CAAC;AAuD/B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Faker Adapter Interface
3
+ * Provides fallback word generation when lexicon doesn't have terms
4
+ */
5
+ export interface IFakerAdapter {
6
+ /** Generate an adjective */
7
+ adjective(): string;
8
+ /** Generate an adverb */
9
+ adverb(): string;
10
+ /** Generate a common noun */
11
+ noun(): string;
12
+ /** Generate a verb (base form) */
13
+ verb(): string;
14
+ /** Generate a preposition */
15
+ preposition(): string;
16
+ /** Generate a conjunction */
17
+ conjunction(): string;
18
+ /** Generate an interjection */
19
+ interjection(): string;
20
+ /** Generate a proper noun (name, place, etc.) - optional */
21
+ properNoun?(): string;
22
+ /** Generate a number word or digit - optional */
23
+ number?(): string;
24
+ }
25
+ //# sourceMappingURL=faker-adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faker-adapter.d.ts","sourceRoot":"","sources":["../../src/interfaces/faker-adapter.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,4BAA4B;IAC5B,SAAS,IAAI,MAAM,CAAC;IAEpB,yBAAyB;IACzB,MAAM,IAAI,MAAM,CAAC;IAEjB,6BAA6B;IAC7B,IAAI,IAAI,MAAM,CAAC;IAEf,kCAAkC;IAClC,IAAI,IAAI,MAAM,CAAC;IAEf,6BAA6B;IAC7B,WAAW,IAAI,MAAM,CAAC;IAEtB,6BAA6B;IAC7B,WAAW,IAAI,MAAM,CAAC;IAEtB,+BAA+B;IAC/B,YAAY,IAAI,MAAM,CAAC;IAEvB,4DAA4D;IAC5D,UAAU,CAAC,IAAI,MAAM,CAAC;IAEtB,iDAAiD;IACjD,MAAM,CAAC,IAAI,MAAM,CAAC;CACnB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=faker-adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"faker-adapter.js","sourceRoot":"","sources":["../../src/interfaces/faker-adapter.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export type { IRng, WeightedItem } from './rng.js';
2
+ export type { IFakerAdapter } from './faker-adapter.js';
3
+ export type { ILexiconStore } from './lexicon-store.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,IAAI,EAAE,YAAY,EAAE,MAAM,UAAU,CAAC;AACnD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACxD,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/interfaces/index.ts"],"names":[],"mappings":""}
@@ -0,0 +1,39 @@
1
+ import type { GenerationContext } from '../types/context.js';
2
+ import type { TermSet, Pattern, LexicalItem, TermQuery, PatternQuery, ChoiceEvent, RelationResult } from '../types/lexicon.js';
3
+ /**
4
+ * Lexicon Store Interface
5
+ * Provides access to lexicon data and sampling utilities
6
+ */
7
+ export interface ILexiconStore {
8
+ /** Get a term set by ID */
9
+ getTermSet(id: string): TermSet | undefined;
10
+ /** Get all term set IDs */
11
+ getTermSetIds(): string[];
12
+ /** Sample a term from the lexicon based on query and context */
13
+ sampleTerm(termQuery: TermQuery, ctx: GenerationContext): LexicalItem | undefined;
14
+ /** Get a pattern by ID */
15
+ getPattern(id: string): Pattern | undefined;
16
+ /** Get all pattern IDs */
17
+ getPatternIds(): string[];
18
+ /** Sample a pattern based on query and context */
19
+ samplePattern(patternQuery: PatternQuery, ctx: GenerationContext): Pattern | undefined;
20
+ /** Apply correlations after a choice event */
21
+ applyCorrelations(ctx: GenerationContext, chosen: ChoiceEvent): void;
22
+ /** Evaluate relations for an entity or term */
23
+ evaluateRelations(entityOrTerm: string, relationType?: string): RelationResult[];
24
+ /** Get archetype by name */
25
+ getArchetype(name: string): import('../types/lexicon.js').Archetype | undefined;
26
+ /** Get all archetype names */
27
+ getArchetypeNames(): string[];
28
+ /** Get distribution by ID */
29
+ getDistribution(id: string): import('../types/lexicon.js').DistributionEntry[] | undefined;
30
+ /** Check if lexicon is loaded */
31
+ isLoaded(): boolean;
32
+ /** Get lexicon metadata */
33
+ getMeta(): {
34
+ id: string;
35
+ version?: string;
36
+ language: string;
37
+ } | undefined;
38
+ }
39
+ //# sourceMappingURL=lexicon-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexicon-store.d.ts","sourceRoot":"","sources":["../../src/interfaces/lexicon-store.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAC7D,OAAO,KAAK,EACV,OAAO,EACP,OAAO,EACP,WAAW,EACX,SAAS,EACT,YAAY,EACZ,WAAW,EACX,cAAc,EACf,MAAM,qBAAqB,CAAC;AAE7B;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC5B,2BAA2B;IAC3B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAE5C,2BAA2B;IAC3B,aAAa,IAAI,MAAM,EAAE,CAAC;IAE1B,gEAAgE;IAChE,UAAU,CAAC,SAAS,EAAE,SAAS,EAAE,GAAG,EAAE,iBAAiB,GAAG,WAAW,GAAG,SAAS,CAAC;IAElF,0BAA0B;IAC1B,UAAU,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,GAAG,SAAS,CAAC;IAE5C,0BAA0B;IAC1B,aAAa,IAAI,MAAM,EAAE,CAAC;IAE1B,kDAAkD;IAClD,aAAa,CAAC,YAAY,EAAE,YAAY,EAAE,GAAG,EAAE,iBAAiB,GAAG,OAAO,GAAG,SAAS,CAAC;IAEvF,8CAA8C;IAC9C,iBAAiB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,WAAW,GAAG,IAAI,CAAC;IAErE,+CAA+C;IAC/C,iBAAiB,CAAC,YAAY,EAAE,MAAM,EAAE,YAAY,CAAC,EAAE,MAAM,GAAG,cAAc,EAAE,CAAC;IAEjF,4BAA4B;IAC5B,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,qBAAqB,EAAE,SAAS,GAAG,SAAS,CAAC;IAEhF,8BAA8B;IAC9B,iBAAiB,IAAI,MAAM,EAAE,CAAC;IAE9B,6BAA6B;IAC7B,eAAe,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,qBAAqB,EAAE,iBAAiB,EAAE,GAAG,SAAS,CAAC;IAE3F,iCAAiC;IACjC,QAAQ,IAAI,OAAO,CAAC;IAEpB,2BAA2B;IAC3B,OAAO,IAAI;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,OAAO,CAAC,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,SAAS,CAAC;CAC3E"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=lexicon-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lexicon-store.js","sourceRoot":"","sources":["../../src/interfaces/lexicon-store.ts"],"names":[],"mappings":""}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Random Number Generator Interface
3
+ * Must be deterministic when seeded for reproducible output
4
+ */
5
+ export interface IRng {
6
+ /** Set the seed for deterministic output */
7
+ seed(n: number): void;
8
+ /** Return a float in [0, 1) */
9
+ float(): number;
10
+ /** Return an integer in [min, max] inclusive */
11
+ int(min: number, max: number): number;
12
+ /** Pick a random element from a non-empty array */
13
+ pick<T>(list: T[]): T;
14
+ /** Pick an element using weighted probability */
15
+ weightedPick<T>(items: WeightedItem<T>[]): T;
16
+ /** Shuffle an array (returns a new array) */
17
+ shuffle<T>(list: T[]): T[];
18
+ /** Return true with the given probability (0-1) */
19
+ chance(probability: number): boolean;
20
+ }
21
+ export interface WeightedItem<T> {
22
+ item: T;
23
+ weight: number;
24
+ }
25
+ //# sourceMappingURL=rng.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rng.d.ts","sourceRoot":"","sources":["../../src/interfaces/rng.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,WAAW,IAAI;IACnB,4CAA4C;IAC5C,IAAI,CAAC,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAEtB,+BAA+B;IAC/B,KAAK,IAAI,MAAM,CAAC;IAEhB,gDAAgD;IAChD,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAAC;IAEtC,mDAAmD;IACnD,IAAI,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC;IAEtB,iDAAiD;IACjD,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IAE7C,6CAA6C;IAC7C,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;IAE3B,mDAAmD;IACnD,MAAM,CAAC,WAAW,EAAE,MAAM,GAAG,OAAO,CAAC;CACtC;AAED,MAAM,WAAW,YAAY,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC;IACR,MAAM,EAAE,MAAM,CAAC;CAChB"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=rng.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rng.js","sourceRoot":"","sources":["../../src/interfaces/rng.ts"],"names":[],"mappings":""}
@@ -0,0 +1,4 @@
1
+ export { LexiconStore } from './store.js';
2
+ export { validateLexicon } from './validator.js';
3
+ export { loadLexiconFromString, loadLexiconFromObject, tryLoadLexicon } from './loader.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lexicon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { LexiconStore } from './store.js';
2
+ export { validateLexicon } from './validator.js';
3
+ export { loadLexiconFromString, loadLexiconFromObject, tryLoadLexicon } from './loader.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lexicon/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,qBAAqB,EAAE,qBAAqB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * Lexicon Loader
3
+ * Loads and parses lexicon JSON
4
+ */
5
+ import type { Lexicon } from '../types/lexicon.js';
6
+ import { validateLexicon } from './validator.js';
7
+ /**
8
+ * Load a lexicon from a JSON string
9
+ * @throws Error if JSON is invalid or lexicon validation fails
10
+ */
11
+ export declare function loadLexiconFromString(jsonString: string): Lexicon;
12
+ /**
13
+ * Load a lexicon from an object (e.g., already parsed JSON)
14
+ * @throws Error if lexicon validation fails
15
+ */
16
+ export declare function loadLexiconFromObject(obj: unknown): Lexicon;
17
+ /**
18
+ * Try to load a lexicon, returning validation result instead of throwing
19
+ */
20
+ export declare function tryLoadLexicon(obj: unknown): {
21
+ lexicon?: Lexicon;
22
+ validation: ReturnType<typeof validateLexicon>;
23
+ };
24
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/lexicon/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AACnD,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAiBjE;AAED;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAS3D;AAED;;GAEG;AACH,wBAAgB,cAAc,CAAC,GAAG,EAAE,OAAO,GAAG;IAAE,OAAO,CAAC,EAAE,OAAO,CAAC;IAAC,UAAU,EAAE,UAAU,CAAC,OAAO,eAAe,CAAC,CAAA;CAAE,CAQlH"}
@@ -0,0 +1,47 @@
1
+ /**
2
+ * Lexicon Loader
3
+ * Loads and parses lexicon JSON
4
+ */
5
+ import { validateLexicon } from './validator.js';
6
+ /**
7
+ * Load a lexicon from a JSON string
8
+ * @throws Error if JSON is invalid or lexicon validation fails
9
+ */
10
+ export function loadLexiconFromString(jsonString) {
11
+ let parsed;
12
+ try {
13
+ parsed = JSON.parse(jsonString);
14
+ }
15
+ catch (e) {
16
+ throw new Error(`Invalid JSON: ${e instanceof Error ? e.message : 'Unknown error'}`);
17
+ }
18
+ const validation = validateLexicon(parsed);
19
+ if (!validation.valid) {
20
+ const errorMessages = validation.errors.map(e => ` ${e.path}: ${e.message}`).join('\n');
21
+ throw new Error(`Invalid lexicon:\n${errorMessages}`);
22
+ }
23
+ return parsed;
24
+ }
25
+ /**
26
+ * Load a lexicon from an object (e.g., already parsed JSON)
27
+ * @throws Error if lexicon validation fails
28
+ */
29
+ export function loadLexiconFromObject(obj) {
30
+ const validation = validateLexicon(obj);
31
+ if (!validation.valid) {
32
+ const errorMessages = validation.errors.map(e => ` ${e.path}: ${e.message}`).join('\n');
33
+ throw new Error(`Invalid lexicon:\n${errorMessages}`);
34
+ }
35
+ return obj;
36
+ }
37
+ /**
38
+ * Try to load a lexicon, returning validation result instead of throwing
39
+ */
40
+ export function tryLoadLexicon(obj) {
41
+ const validation = validateLexicon(obj);
42
+ if (validation.valid) {
43
+ return { lexicon: obj, validation };
44
+ }
45
+ return { validation };
46
+ }
47
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/lexicon/loader.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,UAAkB;IACtD,IAAI,MAAe,CAAC;IAEpB,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC;IAClC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CAAC,iBAAiB,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe,EAAE,CAAC,CAAC;IACvF,CAAC;IAED,MAAM,UAAU,GAAG,eAAe,CAAC,MAAM,CAAC,CAAC;IAE3C,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,qBAAqB,aAAa,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,MAAiB,CAAC;AAC3B,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAY;IAChD,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;QACtB,MAAM,aAAa,GAAG,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzF,MAAM,IAAI,KAAK,CAAC,qBAAqB,aAAa,EAAE,CAAC,CAAC;IACxD,CAAC;IAED,OAAO,GAAc,CAAC;AACxB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,cAAc,CAAC,GAAY;IACzC,MAAM,UAAU,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAExC,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;QACrB,OAAO,EAAE,OAAO,EAAE,GAAc,EAAE,UAAU,EAAE,CAAC;IACjD,CAAC;IAED,OAAO,EAAE,UAAU,EAAE,CAAC;AACxB,CAAC"}