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,48 @@
1
+ /**
2
+ * Example A: Basic Usage (No Lexicon)
3
+ * Demonstrates text generation using only the built-in word lists
4
+ */
5
+
6
+ import { TextGenerator, SimpleFakerAdapter } from '../src';
7
+
8
+ // Create a generator with just the simple faker adapter
9
+ const generator = new TextGenerator({
10
+ fakerAdapter: new SimpleFakerAdapter(),
11
+ });
12
+
13
+ // Set a seed for reproducible output
14
+ generator.setSeed(42);
15
+
16
+ console.log('=== Basic Text Generation (No Lexicon) ===\n');
17
+
18
+ // Generate a single sentence
19
+ console.log('Single sentence:');
20
+ console.log(generator.sentence());
21
+ console.log();
22
+
23
+ // Generate different sentence types
24
+ console.log('Different sentence types:');
25
+ console.log('Simple declarative:', generator.sentence({ type: 'simpleDeclarative' }));
26
+ console.log('Question:', generator.sentence({ type: 'question' }));
27
+ console.log('Compound:', generator.sentence({ type: 'compound' }));
28
+ console.log('With intro adverbial:', generator.sentence({ type: 'introAdverbial' }));
29
+ console.log();
30
+
31
+ // Generate a paragraph
32
+ console.log('Paragraph (5 sentences):');
33
+ console.log(generator.paragraph({ sentences: 5 }));
34
+ console.log();
35
+
36
+ // Generate multiple paragraphs
37
+ console.log('Text block (2 paragraphs):');
38
+ console.log(generator.textBlock({ paragraphs: 2 }));
39
+ console.log();
40
+
41
+ // Demonstrate determinism
42
+ console.log('=== Determinism Test ===\n');
43
+ generator.setSeed(12345);
44
+ const text1 = generator.sentence();
45
+ generator.setSeed(12345);
46
+ const text2 = generator.sentence();
47
+ console.log('Same seed produces same output:', text1 === text2);
48
+ console.log('Output:', text1);
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Example B: Lexicon-Steered Corporate Text
3
+ * Demonstrates text generation using a corporate lexicon
4
+ */
5
+
6
+ import { readFileSync } from 'fs';
7
+ import { join, dirname } from 'path';
8
+ import { fileURLToPath } from 'url';
9
+ import { TextGenerator, SimpleFakerAdapter, loadLexiconFromString } from '../src';
10
+
11
+ const __dirname = dirname(fileURLToPath(import.meta.url));
12
+
13
+ // Load the corporate lexicon
14
+ const lexiconPath = join(__dirname, 'lexicons', 'corporate-min.json');
15
+ const lexiconJson = readFileSync(lexiconPath, 'utf-8');
16
+ const lexicon = loadLexiconFromString(lexiconJson);
17
+
18
+ console.log('=== Lexicon-Steered Corporate Text ===\n');
19
+ console.log(`Loaded lexicon: ${lexicon.id} v${lexicon.version}\n`);
20
+
21
+ // Create generator with lexicon
22
+ const generator = new TextGenerator({
23
+ fakerAdapter: new SimpleFakerAdapter(),
24
+ lexicon,
25
+ });
26
+
27
+ // Set archetype to "corporate"
28
+ generator.setArchetype('corporate');
29
+ generator.setSeed(42);
30
+
31
+ // Generate corporate sentences
32
+ console.log('Corporate sentences:');
33
+ for (let i = 0; i < 5; i++) {
34
+ console.log(`${i + 1}. ${generator.sentence()}`);
35
+ }
36
+ console.log();
37
+
38
+ // Generate a corporate paragraph
39
+ console.log('Corporate paragraph:');
40
+ console.log(generator.paragraph({ sentences: 4 }));
41
+ console.log();
42
+
43
+ // Generate corporate text block
44
+ console.log('Corporate text block (3 paragraphs):');
45
+ console.log(generator.textBlock({ paragraphs: 3 }));
46
+ console.log();
47
+
48
+ // Compare with non-lexicon output
49
+ console.log('=== Comparison: With vs Without Lexicon ===\n');
50
+
51
+ const withLexicon = new TextGenerator({
52
+ fakerAdapter: new SimpleFakerAdapter(),
53
+ lexicon,
54
+ });
55
+ withLexicon.setArchetype('corporate');
56
+ withLexicon.setSeed(100);
57
+
58
+ const withoutLexicon = new TextGenerator({
59
+ fakerAdapter: new SimpleFakerAdapter(),
60
+ });
61
+ withoutLexicon.setSeed(100);
62
+
63
+ console.log('With corporate lexicon:');
64
+ for (let i = 0; i < 3; i++) {
65
+ console.log(` ${withLexicon.sentence()}`);
66
+ }
67
+
68
+ console.log('\nWithout lexicon (same seed):');
69
+ for (let i = 0; i < 3; i++) {
70
+ console.log(` ${withoutLexicon.sentence()}`);
71
+ }
@@ -0,0 +1,200 @@
1
+ {
2
+ "id": "lexicon.corporate.min",
3
+ "version": "1.0.0",
4
+ "language": "en",
5
+ "termSets": {
6
+ "noun.business": {
7
+ "pos": "noun",
8
+ "tags": ["domain:business", "register:formal"],
9
+ "terms": [
10
+ { "value": "strategy", "weight": 5 },
11
+ { "value": "initiative", "weight": 4 },
12
+ { "value": "stakeholder", "weight": 4 },
13
+ { "value": "synergy", "weight": 3 },
14
+ { "value": "deliverable", "weight": 3 },
15
+ { "value": "benchmark", "weight": 3 },
16
+ { "value": "pipeline", "weight": 2 },
17
+ { "value": "bandwidth", "weight": 2 },
18
+ { "value": "ecosystem", "weight": 2 },
19
+ { "value": "leverage", "weight": 2 }
20
+ ]
21
+ },
22
+ "noun.meeting": {
23
+ "pos": "noun",
24
+ "tags": ["domain:business"],
25
+ "terms": [
26
+ { "value": "meeting", "weight": 5 },
27
+ { "value": "conference", "weight": 3 },
28
+ { "value": "summit", "weight": 2 },
29
+ { "value": "workshop", "weight": 3 },
30
+ { "value": "briefing", "weight": 2 },
31
+ { "value": "presentation", "weight": 4 },
32
+ { "value": "discussion", "weight": 3 }
33
+ ]
34
+ },
35
+ "verb.business": {
36
+ "pos": "verb",
37
+ "tags": ["domain:business"],
38
+ "terms": [
39
+ { "value": "leverage", "weight": 4 },
40
+ { "value": "optimize", "weight": 4 },
41
+ { "value": "streamline", "weight": 3 },
42
+ { "value": "synergize", "weight": 2 },
43
+ { "value": "facilitate", "weight": 3 },
44
+ { "value": "implement", "weight": 5 },
45
+ { "value": "execute", "weight": 4 },
46
+ { "value": "deliver", "weight": 4 },
47
+ { "value": "align", "weight": 3 },
48
+ { "value": "prioritize", "weight": 3 }
49
+ ]
50
+ },
51
+ "verb.meeting": {
52
+ "pos": "verb",
53
+ "tags": ["domain:business"],
54
+ "terms": [
55
+ { "value": "schedule", "weight": 4 },
56
+ { "value": "convene", "weight": 2 },
57
+ { "value": "adjourn", "weight": 2 },
58
+ { "value": "attend", "weight": 4 },
59
+ { "value": "organize", "weight": 3 },
60
+ { "value": "chair", "weight": 2 }
61
+ ]
62
+ },
63
+ "adj.business": {
64
+ "pos": "adj",
65
+ "tags": ["domain:business", "register:formal"],
66
+ "terms": [
67
+ { "value": "strategic", "weight": 5 },
68
+ { "value": "proactive", "weight": 4 },
69
+ { "value": "scalable", "weight": 3 },
70
+ { "value": "robust", "weight": 3 },
71
+ { "value": "agile", "weight": 4 },
72
+ { "value": "sustainable", "weight": 3 },
73
+ { "value": "innovative", "weight": 4 },
74
+ { "value": "competitive", "weight": 3 },
75
+ { "value": "dynamic", "weight": 3 },
76
+ { "value": "holistic", "weight": 2 }
77
+ ]
78
+ },
79
+ "adv.business": {
80
+ "pos": "adv",
81
+ "tags": ["domain:business"],
82
+ "terms": [
83
+ { "value": "strategically", "weight": 4 },
84
+ { "value": "proactively", "weight": 3 },
85
+ { "value": "effectively", "weight": 5 },
86
+ { "value": "efficiently", "weight": 4 },
87
+ { "value": "seamlessly", "weight": 3 },
88
+ { "value": "holistically", "weight": 2 },
89
+ { "value": "comprehensively", "weight": 3 }
90
+ ]
91
+ },
92
+ "prep.business": {
93
+ "pos": "prep",
94
+ "tags": ["domain:business"],
95
+ "terms": [
96
+ { "value": "regarding", "weight": 3 },
97
+ { "value": "concerning", "weight": 2 },
98
+ { "value": "throughout", "weight": 3 },
99
+ { "value": "within", "weight": 4 },
100
+ { "value": "across", "weight": 4 }
101
+ ]
102
+ },
103
+ "intj.formal": {
104
+ "pos": "intj",
105
+ "tags": ["register:formal"],
106
+ "terms": [
107
+ { "value": "indeed", "weight": 4 },
108
+ { "value": "certainly", "weight": 4 },
109
+ { "value": "naturally", "weight": 3 },
110
+ { "value": "accordingly", "weight": 2 },
111
+ { "value": "importantly", "weight": 3 }
112
+ ]
113
+ }
114
+ },
115
+ "patterns": {
116
+ "sentence.corporate": {
117
+ "type": "sentence",
118
+ "slots": ["NP", "VP", "PUNCT"],
119
+ "tags": ["domain:business"],
120
+ "weight": 2
121
+ }
122
+ },
123
+ "distributions": {
124
+ "sentenceTypes.corporate": [
125
+ { "key": "simpleDeclarative", "weight": 50 },
126
+ { "key": "compound", "weight": 20 },
127
+ { "key": "introAdverbial", "weight": 15 },
128
+ { "key": "subordinate", "weight": 12 },
129
+ { "key": "interjection", "weight": 2 },
130
+ { "key": "question", "weight": 1 }
131
+ ],
132
+ "termSetBias.domain:business": [
133
+ { "key": "noun.business", "weight": 10 },
134
+ { "key": "noun.meeting", "weight": 5 },
135
+ { "key": "verb.business", "weight": 8 },
136
+ { "key": "verb.meeting", "weight": 4 },
137
+ { "key": "adj.business", "weight": 8 },
138
+ { "key": "adv.business", "weight": 5 }
139
+ ]
140
+ },
141
+ "correlations": [
142
+ {
143
+ "when": { "chosenTermSet": "noun.business" },
144
+ "thenBoost": [
145
+ { "termSet": "verb.business", "weightDelta": 5 },
146
+ { "termSet": "adj.business", "weightDelta": 3 }
147
+ ],
148
+ "scope": "sentence"
149
+ },
150
+ {
151
+ "when": { "chosenTermSet": "noun.meeting" },
152
+ "thenBoost": [
153
+ { "termSet": "verb.meeting", "weightDelta": 5 }
154
+ ],
155
+ "scope": "sentence"
156
+ }
157
+ ],
158
+ "constraints": [
159
+ {
160
+ "id": "c.noRepeatNoun",
161
+ "level": "hard",
162
+ "scope": "sentence",
163
+ "type": "noRepeat",
164
+ "target": "pos:noun"
165
+ },
166
+ {
167
+ "id": "c.maxPP",
168
+ "level": "hard",
169
+ "scope": "phrase",
170
+ "type": "maxCount",
171
+ "target": "PP",
172
+ "value": 2
173
+ }
174
+ ],
175
+ "invariants": [
176
+ { "id": "inv.capitalized", "type": "capitalization", "scope": "sentence" },
177
+ { "id": "inv.endsWithPunct", "type": "punctuation", "scope": "sentence" },
178
+ { "id": "inv.noDoubleSpaces", "type": "whitespace", "scope": "text" }
179
+ ],
180
+ "archetypes": {
181
+ "corporate": {
182
+ "tags": ["register:formal", "domain:business"],
183
+ "distributions": {
184
+ "sentenceTypes": "sentenceTypes.corporate",
185
+ "termSetBias": "termSetBias.domain:business"
186
+ },
187
+ "overrides": {
188
+ "interjectionRate": 0.02,
189
+ "subordinateClauseRate": 0.12,
190
+ "questionRate": 0.01
191
+ }
192
+ }
193
+ },
194
+ "relations": [
195
+ { "from": "strategy", "type": "hasPart", "to": "initiative", "weight": 3 },
196
+ { "from": "initiative", "type": "requires", "to": "stakeholder", "weight": 2 },
197
+ { "from": "meeting", "type": "produces", "to": "deliverable", "weight": 2 },
198
+ { "from": "synergy", "type": "enables", "to": "leverage", "weight": 2 }
199
+ ]
200
+ }
@@ -0,0 +1,85 @@
1
+ /**
2
+ * Example C: Generation with Tracing
3
+ * Demonstrates the tracing/metadata output feature
4
+ */
5
+
6
+ import { TextGenerator, SimpleFakerAdapter, GeneratedText } from '../src';
7
+
8
+ // Create generator with tracing enabled
9
+ const generator = new TextGenerator({
10
+ fakerAdapter: new SimpleFakerAdapter(),
11
+ enableTrace: true,
12
+ });
13
+
14
+ generator.setSeed(42);
15
+
16
+ console.log('=== Text Generation with Tracing ===\n');
17
+
18
+ // Generate a sentence with trace
19
+ const result = generator.sentence() as GeneratedText;
20
+
21
+ console.log('Generated text:', result.text);
22
+ console.log();
23
+
24
+ console.log('Metadata:');
25
+ console.log(' Archetype:', result.meta.archetype);
26
+ console.log(' Seed:', result.meta.seed);
27
+ if (result.meta.lexiconId) {
28
+ console.log(' Lexicon ID:', result.meta.lexiconId);
29
+ console.log(' Lexicon Version:', result.meta.lexiconVersion);
30
+ }
31
+ console.log();
32
+
33
+ if (result.trace) {
34
+ console.log('Trace:');
35
+ const sentence = result.trace.paragraphs[0]?.sentences[0];
36
+ if (sentence) {
37
+ console.log(' Template:', sentence.template);
38
+ console.log(' Retry count:', sentence.retryCount);
39
+ console.log(' Token count:', sentence.tokens.length);
40
+ console.log();
41
+
42
+ console.log(' Tokens:');
43
+ for (const token of sentence.tokens.slice(0, 10)) {
44
+ console.log(` "${token.value}" - source: ${token.source}${token.pos ? `, pos: ${token.pos}` : ''}`);
45
+ }
46
+ if (sentence.tokens.length > 10) {
47
+ console.log(` ... and ${sentence.tokens.length - 10} more tokens`);
48
+ }
49
+ console.log();
50
+
51
+ console.log(' Constraints evaluated:');
52
+ for (const c of sentence.constraintsEvaluated) {
53
+ console.log(` ${c.id}: ${c.passed ? 'PASS' : 'FAIL'}`);
54
+ }
55
+ }
56
+
57
+ console.log();
58
+ console.log(' Invariants checked:');
59
+ for (const inv of result.trace.invariantsChecked) {
60
+ console.log(` ${inv.id}: ${inv.passed ? 'PASS' : 'FAIL'}`);
61
+ }
62
+
63
+ if (result.trace.correlationsApplied.length > 0) {
64
+ console.log();
65
+ console.log(' Correlations applied:', result.trace.correlationsApplied);
66
+ }
67
+ }
68
+
69
+ // Generate a paragraph with trace
70
+ console.log('\n\n=== Paragraph with Tracing ===\n');
71
+
72
+ const paragraphResult = generator.paragraph({ sentences: 3 }) as GeneratedText;
73
+
74
+ console.log('Generated text:');
75
+ console.log(paragraphResult.text);
76
+ console.log();
77
+
78
+ if (paragraphResult.trace) {
79
+ const sentences = paragraphResult.trace.paragraphs[0]?.sentences || [];
80
+ console.log(`Trace: ${sentences.length} sentences`);
81
+ for (let i = 0; i < sentences.length; i++) {
82
+ const s = sentences[i]!;
83
+ console.log(` Sentence ${i + 1}: template=${s.template}, tokens=${s.tokens.length}, retries=${s.retryCount}`);
84
+ }
85
+ }
package/package.json ADDED
@@ -0,0 +1,70 @@
1
+ {
2
+ "name": "marlarky",
3
+ "version": "1.0.0",
4
+ "description": "Marlarky - A faker-like library for generating syntactically plausible English text",
5
+ "type": "module",
6
+ "main": "dist/index.js",
7
+ "types": "dist/index.d.ts",
8
+ "bin": {
9
+ "marlarky": "dist/cli.js"
10
+ },
11
+ "exports": {
12
+ ".": {
13
+ "import": "./dist/index.js",
14
+ "types": "./dist/index.d.ts"
15
+ },
16
+ "./cli": "./dist/cli.js"
17
+ },
18
+ "files": [
19
+ "dist",
20
+ "examples"
21
+ ],
22
+ "scripts": {
23
+ "build": "tsc",
24
+ "dev": "tsc --watch",
25
+ "test": "vitest",
26
+ "test:run": "vitest run",
27
+ "test:coverage": "vitest run --coverage",
28
+ "lint": "eslint src --ext .ts",
29
+ "example:basic": "tsx examples/basic-usage.ts",
30
+ "example:corporate": "tsx examples/corporate-lexicon.ts",
31
+ "cli": "node dist/cli.js",
32
+ "prepublishOnly": "npm run build"
33
+ },
34
+ "keywords": [
35
+ "faker",
36
+ "text-generation",
37
+ "english",
38
+ "nlp",
39
+ "lexicon",
40
+ "syntax",
41
+ "grammar",
42
+ "pig-latin",
43
+ "ubbidubbi",
44
+ "leetspeak",
45
+ "pirate-speak",
46
+ "redaction",
47
+ "emoji",
48
+ "mock-case",
49
+ "reverse-words",
50
+ "biz-jargon"
51
+ ],
52
+ "author": "JPaulDuncan <jpaulduncan@gmail.com> (https://github.com/jpaulduncan)",
53
+ "license": "MIT",
54
+ "devDependencies": {
55
+ "@faker-js/faker": "^9.0.0",
56
+ "@types/node": "^22.0.0",
57
+ "eslint": "^9.0.0",
58
+ "tsx": "^4.19.0",
59
+ "typescript": "^5.6.0",
60
+ "vitest": "^2.1.0"
61
+ },
62
+ "peerDependencies": {
63
+ "@faker-js/faker": ">=8.0.0"
64
+ },
65
+ "peerDependenciesMeta": {
66
+ "@faker-js/faker": {
67
+ "optional": true
68
+ }
69
+ }
70
+ }