typebulb 0.11.9 → 0.13.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 (191) hide show
  1. package/dist/agents/claude/client.js +341 -205
  2. package/dist/agents/claude/styles.css +3 -21
  3. package/dist/ai/aiProvider.d.ts +59 -0
  4. package/dist/ai/aiProvider.d.ts.map +1 -0
  5. package/dist/ai/aiProvider.js +109 -0
  6. package/dist/ai/aiProvider.js.map +1 -0
  7. package/dist/ai/aiProviders.d.ts +28 -0
  8. package/dist/ai/aiProviders.d.ts.map +1 -0
  9. package/dist/ai/aiProviders.js +47 -0
  10. package/dist/ai/aiProviders.js.map +1 -0
  11. package/dist/ai/chat.d.ts +32 -0
  12. package/dist/ai/chat.d.ts.map +1 -0
  13. package/dist/ai/chat.js +5 -0
  14. package/dist/ai/chat.js.map +1 -0
  15. package/dist/ai/index.d.ts +9 -0
  16. package/dist/ai/index.d.ts.map +1 -0
  17. package/dist/ai/index.js +11 -0
  18. package/dist/ai/index.js.map +1 -0
  19. package/dist/ai/protocol.d.ts +18 -0
  20. package/dist/ai/protocol.d.ts.map +1 -0
  21. package/dist/ai/protocol.js +3 -0
  22. package/dist/ai/protocol.js.map +1 -0
  23. package/dist/ai/providers/anthropic.d.ts +123 -0
  24. package/dist/ai/providers/anthropic.d.ts.map +1 -0
  25. package/dist/ai/providers/anthropic.js +130 -0
  26. package/dist/ai/providers/anthropic.js.map +1 -0
  27. package/dist/ai/providers/gemini.d.ts +62 -0
  28. package/dist/ai/providers/gemini.d.ts.map +1 -0
  29. package/dist/ai/providers/gemini.js +136 -0
  30. package/dist/ai/providers/gemini.js.map +1 -0
  31. package/dist/ai/providers/openAI.d.ts +146 -0
  32. package/dist/ai/providers/openAI.d.ts.map +1 -0
  33. package/dist/ai/providers/openAI.js +127 -0
  34. package/dist/ai/providers/openAI.js.map +1 -0
  35. package/dist/ai/providers/openRouter.d.ts +65 -0
  36. package/dist/ai/providers/openRouter.d.ts.map +1 -0
  37. package/dist/ai/providers/openRouter.js +82 -0
  38. package/dist/ai/providers/openRouter.js.map +1 -0
  39. package/dist/ai/sseParser.d.ts +32 -0
  40. package/dist/ai/sseParser.d.ts.map +1 -0
  41. package/dist/ai/sseParser.js +121 -0
  42. package/dist/ai/sseParser.js.map +1 -0
  43. package/dist/ai/stream.d.ts +20 -0
  44. package/dist/ai/stream.d.ts.map +1 -0
  45. package/dist/ai/stream.js +6 -0
  46. package/dist/ai/stream.js.map +1 -0
  47. package/dist/dts/cache.d.ts +30 -0
  48. package/dist/dts/cache.d.ts.map +1 -0
  49. package/dist/dts/cache.js +2 -0
  50. package/dist/dts/cache.js.map +1 -0
  51. package/dist/dts/definitelyTypedProvider.d.ts +20 -0
  52. package/dist/dts/definitelyTypedProvider.d.ts.map +1 -0
  53. package/dist/dts/definitelyTypedProvider.js +93 -0
  54. package/dist/dts/definitelyTypedProvider.js.map +1 -0
  55. package/dist/dts/dtsConfig.d.ts +12 -0
  56. package/dist/dts/dtsConfig.d.ts.map +1 -0
  57. package/dist/dts/dtsConfig.js +24 -0
  58. package/dist/dts/dtsConfig.js.map +1 -0
  59. package/dist/dts/dtsResolver.d.ts +63 -0
  60. package/dist/dts/dtsResolver.d.ts.map +1 -0
  61. package/dist/dts/dtsResolver.js +272 -0
  62. package/dist/dts/dtsResolver.js.map +1 -0
  63. package/dist/dts/fetchDts.d.ts +13 -0
  64. package/dist/dts/fetchDts.d.ts.map +1 -0
  65. package/dist/dts/fetchDts.js +46 -0
  66. package/dist/dts/fetchDts.js.map +1 -0
  67. package/dist/dts/httpFetch.d.ts +17 -0
  68. package/dist/dts/httpFetch.d.ts.map +1 -0
  69. package/dist/dts/httpFetch.js +35 -0
  70. package/dist/dts/httpFetch.js.map +1 -0
  71. package/dist/dts/index.d.ts +14 -0
  72. package/dist/dts/index.d.ts.map +1 -0
  73. package/dist/dts/index.js +14 -0
  74. package/dist/dts/index.js.map +1 -0
  75. package/dist/dts/libManifest.d.ts +41 -0
  76. package/dist/dts/libManifest.d.ts.map +1 -0
  77. package/dist/dts/libManifest.js +109 -0
  78. package/dist/dts/libManifest.js.map +1 -0
  79. package/dist/dts/negativeCacheHelper.d.ts +29 -0
  80. package/dist/dts/negativeCacheHelper.d.ts.map +1 -0
  81. package/dist/dts/negativeCacheHelper.js +44 -0
  82. package/dist/dts/negativeCacheHelper.js.map +1 -0
  83. package/dist/dts/tarballFetcher.d.ts +13 -0
  84. package/dist/dts/tarballFetcher.d.ts.map +1 -0
  85. package/dist/dts/tarballFetcher.js +58 -0
  86. package/dist/dts/tarballFetcher.js.map +1 -0
  87. package/dist/dts/tbTypings.d.ts +15 -0
  88. package/dist/dts/tbTypings.d.ts.map +1 -0
  89. package/dist/dts/tbTypings.js +210 -0
  90. package/dist/dts/tbTypings.js.map +1 -0
  91. package/dist/dts/typeProvider.d.ts +37 -0
  92. package/dist/dts/typeProvider.d.ts.map +1 -0
  93. package/dist/dts/typeProvider.js +30 -0
  94. package/dist/dts/typeProvider.js.map +1 -0
  95. package/dist/dts/typeRefScanner.d.ts +8 -0
  96. package/dist/dts/typeRefScanner.d.ts.map +1 -0
  97. package/dist/dts/typeRefScanner.js +33 -0
  98. package/dist/dts/typeRefScanner.js.map +1 -0
  99. package/dist/dts/typescriptProvider.d.ts +21 -0
  100. package/dist/dts/typescriptProvider.d.ts.map +1 -0
  101. package/dist/dts/typescriptProvider.js +140 -0
  102. package/dist/dts/typescriptProvider.js.map +1 -0
  103. package/dist/dts/virtualFs.d.ts +20 -0
  104. package/dist/dts/virtualFs.d.ts.map +1 -0
  105. package/dist/dts/virtualFs.js +48 -0
  106. package/dist/dts/virtualFs.js.map +1 -0
  107. package/dist/format/chunks.d.ts +20 -0
  108. package/dist/format/chunks.d.ts.map +1 -0
  109. package/dist/format/chunks.js +51 -0
  110. package/dist/format/chunks.js.map +1 -0
  111. package/dist/format/config.d.ts +17 -0
  112. package/dist/format/config.d.ts.map +1 -0
  113. package/dist/format/config.js +13 -0
  114. package/dist/format/config.js.map +1 -0
  115. package/dist/format/detection.d.ts +11 -0
  116. package/dist/format/detection.d.ts.map +1 -0
  117. package/dist/format/detection.js +43 -0
  118. package/dist/format/detection.js.map +1 -0
  119. package/dist/format/index.d.ts +8 -0
  120. package/dist/format/index.d.ts.map +1 -0
  121. package/dist/format/index.js +8 -0
  122. package/dist/format/index.js.map +1 -0
  123. package/dist/format/parse.d.ts +20 -0
  124. package/dist/format/parse.d.ts.map +1 -0
  125. package/dist/format/parse.js +88 -0
  126. package/dist/format/parse.js.map +1 -0
  127. package/dist/format/registry.d.ts +24 -0
  128. package/dist/format/registry.d.ts.map +1 -0
  129. package/dist/format/registry.js +31 -0
  130. package/dist/format/registry.js.map +1 -0
  131. package/dist/format/serialize.d.ts +8 -0
  132. package/dist/format/serialize.d.ts.map +1 -0
  133. package/dist/format/serialize.js +30 -0
  134. package/dist/format/serialize.js.map +1 -0
  135. package/dist/format/yaml.d.ts +4 -0
  136. package/dist/format/yaml.d.ts.map +1 -0
  137. package/dist/format/yaml.js +17 -0
  138. package/dist/format/yaml.js.map +1 -0
  139. package/dist/index.js +385 -84
  140. package/dist/lint/index.d.ts +29 -0
  141. package/dist/lint/index.d.ts.map +1 -0
  142. package/dist/lint/index.js +257 -0
  143. package/dist/lint/index.js.map +1 -0
  144. package/dist/render.js +174 -38
  145. package/dist/resolver/attempt.d.ts +2 -0
  146. package/dist/resolver/attempt.d.ts.map +1 -0
  147. package/dist/resolver/attempt.js +9 -0
  148. package/dist/resolver/attempt.js.map +1 -0
  149. package/dist/resolver/cdnClient.d.ts +46 -0
  150. package/dist/resolver/cdnClient.d.ts.map +1 -0
  151. package/dist/resolver/cdnClient.js +107 -0
  152. package/dist/resolver/cdnClient.js.map +1 -0
  153. package/dist/resolver/cdnConstants.d.ts +10 -0
  154. package/dist/resolver/cdnConstants.d.ts.map +1 -0
  155. package/dist/resolver/cdnConstants.js +10 -0
  156. package/dist/resolver/cdnConstants.js.map +1 -0
  157. package/dist/resolver/index.d.ts +20 -0
  158. package/dist/resolver/index.d.ts.map +1 -0
  159. package/dist/resolver/index.js +20 -0
  160. package/dist/resolver/index.js.map +1 -0
  161. package/dist/resolver/packageRef.d.ts +21 -0
  162. package/dist/resolver/packageRef.d.ts.map +1 -0
  163. package/dist/resolver/packageRef.js +89 -0
  164. package/dist/resolver/packageRef.js.map +1 -0
  165. package/dist/resolver/packageService.d.ts +40 -0
  166. package/dist/resolver/packageService.d.ts.map +1 -0
  167. package/dist/resolver/packageService.js +156 -0
  168. package/dist/resolver/packageService.js.map +1 -0
  169. package/dist/resolver/peerResolver.d.ts +33 -0
  170. package/dist/resolver/peerResolver.d.ts.map +1 -0
  171. package/dist/resolver/peerResolver.js +66 -0
  172. package/dist/resolver/peerResolver.js.map +1 -0
  173. package/dist/resolver/semver.d.ts +17 -0
  174. package/dist/resolver/semver.d.ts.map +1 -0
  175. package/dist/resolver/semver.js +56 -0
  176. package/dist/resolver/semver.js.map +1 -0
  177. package/dist/resolver/types.d.ts +33 -0
  178. package/dist/resolver/types.d.ts.map +1 -0
  179. package/dist/resolver/types.js +2 -0
  180. package/dist/resolver/types.js.map +1 -0
  181. package/dist/resolver/versionResolver.d.ts +29 -0
  182. package/dist/resolver/versionResolver.d.ts.map +1 -0
  183. package/dist/resolver/versionResolver.js +79 -0
  184. package/dist/resolver/versionResolver.js.map +1 -0
  185. package/dist/servers.js +142 -3
  186. package/dist/transpile/index.d.ts +19 -0
  187. package/dist/transpile/index.d.ts.map +1 -0
  188. package/dist/transpile/index.js +23 -0
  189. package/dist/transpile/index.js.map +1 -0
  190. package/dist/tsconfig.tsbuildinfo +1 -0
  191. package/package.json +99 -68
@@ -0,0 +1,140 @@
1
+ import { resolve as resolveExports } from 'resolve.exports';
2
+ import { PackageRef } from 'typebulb/resolver';
3
+ import { TypeProvider } from './typeProvider.js';
4
+ import { DECLARATION_EXTENSIONS, DTS_REGEX, makeDeclarationCandidates } from './dtsConfig.js';
5
+ import { fetchWithRetry } from './httpFetch.js';
6
+ export class TypescriptProvider extends TypeProvider {
7
+ constructor(fetchDts, cdnClient) {
8
+ super(fetchDts);
9
+ this.cdnClient = cdnClient;
10
+ }
11
+ async loadPackageAtVersionedRoot(root, version) {
12
+ const url = this.cdnClient.packageJson(new PackageRef({ name: root, version }));
13
+ const resp = await fetchWithRetry(url);
14
+ if (!resp?.ok)
15
+ return undefined;
16
+ let pkg;
17
+ try {
18
+ pkg = await resp.json();
19
+ }
20
+ catch {
21
+ return undefined;
22
+ }
23
+ if (!pkg)
24
+ return undefined;
25
+ return {
26
+ pkg,
27
+ baseDir: this.cdnClient.baseDir(new PackageRef({ name: root, version: version ?? pkg.version })),
28
+ version,
29
+ };
30
+ }
31
+ extractPathFromResult(result) {
32
+ if (typeof result === 'string')
33
+ return result;
34
+ if (Array.isArray(result))
35
+ return result.find(x => typeof x === 'string');
36
+ return undefined;
37
+ }
38
+ async tryUntilSuccess(items, fn) {
39
+ for (const item of items) {
40
+ const res = await fn(item);
41
+ if (res)
42
+ return res;
43
+ }
44
+ }
45
+ async resolveFromSelected(sel, fetchCandidate) {
46
+ if (sel.kind === 'types') {
47
+ const clean = this.cdnClient.normalizeRelative(sel.path);
48
+ if (!clean || clean === '/' || clean === '.') {
49
+ return this.tryUntilSuccess([...DECLARATION_EXTENSIONS], fetchCandidate);
50
+ }
51
+ if (!DTS_REGEX.test(clean)) {
52
+ const res = await this.tryUntilSuccess(this.declarationCandidatesFor(clean), fetchCandidate);
53
+ if (res)
54
+ return res;
55
+ }
56
+ return fetchCandidate(clean);
57
+ }
58
+ const others = this.declarationCandidatesFor(sel.path);
59
+ return this.tryUntilSuccess([...DECLARATION_EXTENSIONS, ...others], fetchCandidate);
60
+ }
61
+ toResolutionResult(path) {
62
+ return { kind: DTS_REGEX.test(path) ? 'types' : 'probe', path };
63
+ }
64
+ resolveExportsPath(pkg, subpath) {
65
+ const key = subpath || '.';
66
+ const pkgRecord = pkg;
67
+ try {
68
+ const typesPath = this.extractPathFromResult(resolveExports(pkgRecord, key, { conditions: ['types'] }));
69
+ if (typesPath)
70
+ return typesPath;
71
+ }
72
+ catch { }
73
+ try {
74
+ return this.extractPathFromResult(resolveExports(pkgRecord, key, {
75
+ browser: true,
76
+ conditions: ['import', 'default', 'module', 'browser', 'node'],
77
+ }));
78
+ }
79
+ catch {
80
+ return undefined;
81
+ }
82
+ }
83
+ async resolve(packageRef) {
84
+ try {
85
+ const parsed = PackageRef.parse(packageRef);
86
+ const { pkg, baseDir } = await this.loadPackageAtVersionedRoot(parsed.name, parsed.version) || {};
87
+ if (!pkg || !baseDir)
88
+ return undefined;
89
+ const resolvedBase = { name: parsed.name, version: parsed.version };
90
+ const resolvedRootPkg = new PackageRef(resolvedBase).format();
91
+ const resolvedFullPkg = new PackageRef({ ...resolvedBase, subpath: parsed.subpath }).format();
92
+ const fetcher = (rel) => this.fetchCandidateFrom(baseDir, parsed.name, rel);
93
+ if (parsed.subpath) {
94
+ const key = this.cdnClient.ensureLeadingDotSlash(parsed.subpath);
95
+ const expPath = this.resolveExportsPath(pkg, key);
96
+ if (expPath) {
97
+ const res = await this.resolveFromSelected(this.toResolutionResult(expPath), fetcher);
98
+ if (res)
99
+ return { ...res, resolvedPkg: resolvedFullPkg };
100
+ }
101
+ const res = await this.tryUntilSuccess(this.declarationCandidatesFor(key), fetcher);
102
+ if (res)
103
+ return { ...res, resolvedPkg: resolvedFullPkg };
104
+ }
105
+ const declared = pkg.types ?? pkg.typings;
106
+ if (declared) {
107
+ const res = await this.resolveFromSelected({ kind: 'types', path: declared }, fetcher);
108
+ if (res)
109
+ return { ...res, resolvedPkg: resolvedRootPkg };
110
+ }
111
+ const rootExport = this.resolveExportsPath(pkg, '.');
112
+ if (rootExport) {
113
+ const res = await this.resolveFromSelected(this.toResolutionResult(rootExport), fetcher);
114
+ if (res)
115
+ return { ...res, resolvedPkg: resolvedRootPkg };
116
+ }
117
+ return undefined;
118
+ }
119
+ catch {
120
+ return undefined;
121
+ }
122
+ }
123
+ async fetchCandidateFrom(baseDir, root, rel) {
124
+ const relNorm = this.cdnClient.normalizeRelative(rel);
125
+ const url = new URL(relNorm, baseDir).toString();
126
+ const out = await this.fetchDtsText(url);
127
+ return out ? { dts: out.dts, url: out.url, resolvedPkg: root } : undefined;
128
+ }
129
+ declarationCandidatesFor(runtimePath) {
130
+ if (!runtimePath || runtimePath === './' || runtimePath === '/') {
131
+ return [...DECLARATION_EXTENSIONS];
132
+ }
133
+ const base = runtimePath.replace(/\.(mjs|cjs|js|mts|cts|ts)$/i, '');
134
+ const candidates = makeDeclarationCandidates(base);
135
+ const trailingBase = base.endsWith('/') ? base : `${base}/`;
136
+ candidates.push(...makeDeclarationCandidates(`${trailingBase}index`));
137
+ return candidates;
138
+ }
139
+ }
140
+ //# sourceMappingURL=typescriptProvider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"typescriptProvider.js","sourceRoot":"","sources":["../../dts/src/typescriptProvider.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Virtual filesystem layout for DTS resolution. Each entry lives under
3
+ * `file:///node_modules/__tsepoch_N/<pkg>/...`. The CLI's emit step strips
4
+ * the epoch and writes real files; the web client's TypeChecker treats
5
+ * these paths as virtual.
6
+ *
7
+ * Epoch is bumpable so reactive consumers (web client) can invalidate the
8
+ * world when package ranges change. CLI never bumps within a single emit.
9
+ */
10
+ export declare class VirtualFs {
11
+ private epoch;
12
+ private listeners;
13
+ getEpoch(): number;
14
+ bumpEpoch(): number;
15
+ onEpochChange(cb: (n: number) => void): () => void;
16
+ epochDir(): string;
17
+ pathForMain(pkg: string): string;
18
+ pathFor(pkg: string, rel: string): string;
19
+ }
20
+ //# sourceMappingURL=virtualFs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualFs.d.ts","sourceRoot":"","sources":["../../dts/src/virtualFs.ts"],"names":[],"mappings":"AAEA;;;;;;;;GAQG;AACH,qBAAa,SAAS;IACpB,OAAO,CAAC,KAAK,CAAI;IACjB,OAAO,CAAC,SAAS,CAAiC;IAElD,QAAQ,IAAI,MAAM;IAIlB,SAAS,IAAI,MAAM;IAQnB,aAAa,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,IAAI;IAKlD,QAAQ,IAAI,MAAM;IAIlB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM;IAIhC,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM;CAI1C"}
@@ -0,0 +1,48 @@
1
+ const NODE_MODULES_PREFIX = 'file:///node_modules';
2
+ /**
3
+ * Virtual filesystem layout for DTS resolution. Each entry lives under
4
+ * `file:///node_modules/__tsepoch_N/<pkg>/...`. The CLI's emit step strips
5
+ * the epoch and writes real files; the web client's TypeChecker treats
6
+ * these paths as virtual.
7
+ *
8
+ * Epoch is bumpable so reactive consumers (web client) can invalidate the
9
+ * world when package ranges change. CLI never bumps within a single emit.
10
+ */
11
+ export class VirtualFs {
12
+ constructor() {
13
+ this.epoch = 0;
14
+ this.listeners = new Set();
15
+ }
16
+ getEpoch() {
17
+ return this.epoch;
18
+ }
19
+ bumpEpoch() {
20
+ this.epoch += 1;
21
+ for (const l of this.listeners) {
22
+ try {
23
+ l(this.epoch);
24
+ }
25
+ catch { }
26
+ }
27
+ return this.epoch;
28
+ }
29
+ onEpochChange(cb) {
30
+ this.listeners.add(cb);
31
+ return () => { this.listeners.delete(cb); };
32
+ }
33
+ epochDir() {
34
+ return `__tsepoch_${this.epoch}`;
35
+ }
36
+ pathForMain(pkg) {
37
+ return `${NODE_MODULES_PREFIX}/${this.epochDir()}/${pkg}/index.d.ts`;
38
+ }
39
+ pathFor(pkg, rel) {
40
+ const clean = normalizeRelative(rel);
41
+ return `${NODE_MODULES_PREFIX}/${this.epochDir()}/${pkg}/${clean}`;
42
+ }
43
+ }
44
+ function normalizeRelative(rel) {
45
+ const s = rel || '';
46
+ return s.startsWith('./') ? s.slice(2) : s.replace(/^\/+/, '');
47
+ }
48
+ //# sourceMappingURL=virtualFs.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"virtualFs.js","sourceRoot":"","sources":["../../dts/src/virtualFs.ts"],"names":[],"mappings":"AAAA,MAAM,mBAAmB,GAAG,sBAAsB,CAAA;AAElD;;;;;;;;GAQG;AACH,MAAM,OAAO,SAAS;IAAtB;QACU,UAAK,GAAG,CAAC,CAAA;QACT,cAAS,GAAG,IAAI,GAAG,EAAuB,CAAA;IA+BpD,CAAC;IA7BC,QAAQ;QACN,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,SAAS;QACP,IAAI,CAAC,KAAK,IAAI,CAAC,CAAA;QACf,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YAC/B,IAAI,CAAC;gBAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAA;YAAC,CAAC;YAAC,MAAM,CAAC,CAAA,CAAC;QAChC,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAA;IACnB,CAAC;IAED,aAAa,CAAC,EAAuB;QACnC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,CAAC,CAAA;QACtB,OAAO,GAAG,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,CAAC,CAAA,CAAC,CAAC,CAAA;IAC5C,CAAC;IAED,QAAQ;QACN,OAAO,aAAa,IAAI,CAAC,KAAK,EAAE,CAAA;IAClC,CAAC;IAED,WAAW,CAAC,GAAW;QACrB,OAAO,GAAG,mBAAmB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,aAAa,CAAA;IACtE,CAAC;IAED,OAAO,CAAC,GAAW,EAAE,GAAW;QAC9B,MAAM,KAAK,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAA;QACpC,OAAO,GAAG,mBAAmB,IAAI,IAAI,CAAC,QAAQ,EAAE,IAAI,GAAG,IAAI,KAAK,EAAE,CAAA;IACpE,CAAC;CACF;AAED,SAAS,iBAAiB,CAAC,GAAW;IACpC,MAAM,CAAC,GAAG,GAAG,IAAI,EAAE,CAAA;IACnB,OAAO,CAAC,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAA;AAChE,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Split the `data.txt` block into chunks. The single source of truth, shared by the CLI and
3
+ * typebulb.com.
4
+ *
5
+ * Rules:
6
+ * - A valid structural format (JSON/XML/YAML) → a single chunk (preserves internal blank lines).
7
+ * - Otherwise → split on 2+ blank lines.
8
+ */
9
+ /** Separator for rejoining chunks (2 blank lines = 3 newlines). */
10
+ export declare const CHUNK_SEPARATOR = "\n\n\n";
11
+ export type ChunkWithBoundaries = {
12
+ text: string;
13
+ startLine: number;
14
+ endLine: number;
15
+ };
16
+ /** Split raw data into chunks with their 1-based line boundaries. */
17
+ export declare function splitIntoChunksWithBoundaries(raw: string): ChunkWithBoundaries[];
18
+ /** Convenience: just the chunk texts. */
19
+ export declare function splitIntoChunks(raw: string): string[];
20
+ //# sourceMappingURL=chunks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunks.d.ts","sourceRoot":"","sources":["../../format/src/chunks.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,mEAAmE;AACnE,eAAO,MAAM,eAAe,WAAW,CAAA;AAEvC,MAAM,MAAM,mBAAmB,GAAG;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAA;AAEtF,qEAAqE;AACrE,wBAAgB,6BAA6B,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAiChF;AAED,yCAAyC;AACzC,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,EAAE,CAErD"}
@@ -0,0 +1,51 @@
1
+ /**
2
+ * Split the `data.txt` block into chunks. The single source of truth, shared by the CLI and
3
+ * typebulb.com.
4
+ *
5
+ * Rules:
6
+ * - A valid structural format (JSON/XML/YAML) → a single chunk (preserves internal blank lines).
7
+ * - Otherwise → split on 2+ blank lines.
8
+ */
9
+ import { isStructuralData } from './detection.js';
10
+ /** Separator for rejoining chunks (2 blank lines = 3 newlines). */
11
+ export const CHUNK_SEPARATOR = '\n\n\n';
12
+ /** Split raw data into chunks with their 1-based line boundaries. */
13
+ export function splitIntoChunksWithBoundaries(raw) {
14
+ if (!raw?.trim())
15
+ return [];
16
+ const normalized = raw.replace(/\r\n/g, '\n');
17
+ const trimmed = normalized.trim();
18
+ if (isStructuralData(trimmed)) {
19
+ return [{ text: trimmed, startLine: 1, endLine: normalized.split('\n').length }];
20
+ }
21
+ const lines = normalized.split('\n');
22
+ const chunks = [];
23
+ let start = 0, lastContent = -1, blankRun = 0;
24
+ const flush = () => {
25
+ if (lastContent >= start) {
26
+ const text = lines.slice(start, lastContent + 1).join('\n').trim();
27
+ if (text)
28
+ chunks.push({ text, startLine: start + 1, endLine: lastContent + 1 });
29
+ }
30
+ };
31
+ for (let i = 0; i < lines.length; i++) {
32
+ if (!lines[i].trim()) {
33
+ blankRun++;
34
+ }
35
+ else {
36
+ if (blankRun >= 2 && lastContent >= start) {
37
+ flush();
38
+ start = i;
39
+ }
40
+ blankRun = 0;
41
+ lastContent = i;
42
+ }
43
+ }
44
+ flush();
45
+ return chunks;
46
+ }
47
+ /** Convenience: just the chunk texts. */
48
+ export function splitIntoChunks(raw) {
49
+ return splitIntoChunksWithBoundaries(raw).map(c => c.text);
50
+ }
51
+ //# sourceMappingURL=chunks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"chunks.js","sourceRoot":"","sources":["../../format/src/chunks.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAA;AAEjD,mEAAmE;AACnE,MAAM,CAAC,MAAM,eAAe,GAAG,QAAQ,CAAA;AAIvC,qEAAqE;AACrE,MAAM,UAAU,6BAA6B,CAAC,GAAW;IACvD,IAAI,CAAC,GAAG,EAAE,IAAI,EAAE;QAAE,OAAO,EAAE,CAAA;IAE3B,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,CAAA;IAC7C,MAAM,OAAO,GAAG,UAAU,CAAC,IAAI,EAAE,CAAA;IAEjC,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CAAC;QAC9B,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,OAAO,EAAE,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;IAClF,CAAC;IAED,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;IACpC,MAAM,MAAM,GAA0B,EAAE,CAAA;IACxC,IAAI,KAAK,GAAG,CAAC,EAAE,WAAW,GAAG,CAAC,CAAC,EAAE,QAAQ,GAAG,CAAC,CAAA;IAE7C,MAAM,KAAK,GAAG,GAAG,EAAE;QACjB,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,KAAK,EAAE,WAAW,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,CAAA;YAClE,IAAI,IAAI;gBAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,GAAG,CAAC,EAAE,OAAO,EAAE,WAAW,GAAG,CAAC,EAAE,CAAC,CAAA;QACjF,CAAC;IACH,CAAC,CAAA;IAED,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC;YACrB,QAAQ,EAAE,CAAA;QACZ,CAAC;aAAM,CAAC;YACN,IAAI,QAAQ,IAAI,CAAC,IAAI,WAAW,IAAI,KAAK,EAAE,CAAC;gBAAC,KAAK,EAAE,CAAC;gBAAC,KAAK,GAAG,CAAC,CAAA;YAAC,CAAC;YACjE,QAAQ,GAAG,CAAC,CAAA;YACZ,WAAW,GAAG,CAAC,CAAA;QACjB,CAAC;IACH,CAAC;IACD,KAAK,EAAE,CAAA;IAEP,OAAO,MAAM,CAAA;AACf,CAAC;AAED,yCAAyC;AACzC,MAAM,UAAU,eAAe,CAAC,GAAW;IACzC,OAAO,6BAA6B,CAAC,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAA;AAC5D,CAAC"}
@@ -0,0 +1,17 @@
1
+ /** The `config.json` block shape — dependencies, description, and inference-modal settings. */
2
+ export interface InferenceConfig {
3
+ title?: string;
4
+ dataTitle?: string;
5
+ submitTitle?: string;
6
+ }
7
+ export interface BulbConfig {
8
+ dependencies?: Record<string, string>;
9
+ description?: string;
10
+ inference?: InferenceConfig;
11
+ ts?: {
12
+ jsxImportSource?: string;
13
+ };
14
+ }
15
+ /** Parse the `config.json` block, returning {} for empty or malformed JSON. */
16
+ export declare function parseConfig(config: string): BulbConfig;
17
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../format/src/config.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAE/F,MAAM,WAAW,eAAe;IAC9B,KAAK,CAAC,EAAE,MAAM,CAAA;IACd,SAAS,CAAC,EAAE,MAAM,CAAA;IAClB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB;AAED,MAAM,WAAW,UAAU;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;IACrC,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,SAAS,CAAC,EAAE,eAAe,CAAA;IAC3B,EAAE,CAAC,EAAE;QAAE,eAAe,CAAC,EAAE,MAAM,CAAA;KAAE,CAAA;CAClC;AAED,+EAA+E;AAC/E,wBAAgB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,UAAU,CAOtD"}
@@ -0,0 +1,13 @@
1
+ /** The `config.json` block shape — dependencies, description, and inference-modal settings. */
2
+ /** Parse the `config.json` block, returning {} for empty or malformed JSON. */
3
+ export function parseConfig(config) {
4
+ if (!config.trim())
5
+ return {};
6
+ try {
7
+ return JSON.parse(config);
8
+ }
9
+ catch {
10
+ return {};
11
+ }
12
+ }
13
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../format/src/config.ts"],"names":[],"mappings":"AAAA,+FAA+F;AAe/F,+EAA+E;AAC/E,MAAM,UAAU,WAAW,CAAC,MAAc;IACxC,IAAI,CAAC,MAAM,CAAC,IAAI,EAAE;QAAE,OAAO,EAAE,CAAA;IAC7B,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,CAAA;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAA;IACX,CAAC;AACH,CAAC"}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * Structural data-format detection for the `data.txt` block. The single source of truth for "is this
3
+ * chunk JSON / XML / YAML", shared by the data-chunk splitter (here) and typebulb.com's summarizer
4
+ * selection (its JSON/XML/YAML summarizers' `canHandle` delegate to these).
5
+ */
6
+ export declare function isJsonData(content: string): boolean;
7
+ export declare function isXmlData(content: string): boolean;
8
+ export declare function isYamlData(content: string): boolean;
9
+ /** True if content is a structural format (JSON/XML/YAML) — kept as a single data chunk. */
10
+ export declare function isStructuralData(content: string): boolean;
11
+ //# sourceMappingURL=detection.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection.d.ts","sourceRoot":"","sources":["../../format/src/detection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEnD;AAED,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKlD;AAED,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAQnD;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAEzD"}
@@ -0,0 +1,43 @@
1
+ /**
2
+ * Structural data-format detection for the `data.txt` block. The single source of truth for "is this
3
+ * chunk JSON / XML / YAML", shared by the data-chunk splitter (here) and typebulb.com's summarizer
4
+ * selection (its JSON/XML/YAML summarizers' `canHandle` delegate to these).
5
+ */
6
+ import { findTagByName } from 'xml-utils';
7
+ import * as yaml from 'yaml';
8
+ const XML_TAG_RE = /<([a-zA-Z_][\w.-]*)/;
9
+ export function isJsonData(content) {
10
+ try {
11
+ JSON.parse(content.trim());
12
+ return true;
13
+ }
14
+ catch {
15
+ return false;
16
+ }
17
+ }
18
+ export function isXmlData(content) {
19
+ const t = content.trim();
20
+ if (!t.startsWith('<'))
21
+ return false;
22
+ const m = t.match(XML_TAG_RE);
23
+ return m ? findTagByName(t, m[1]) !== null : false;
24
+ }
25
+ export function isYamlData(content) {
26
+ const trimmed = content.trim();
27
+ if (!trimmed.match(/^(---|#|\w+:|-)/))
28
+ return false;
29
+ if ('[{<'.includes(trimmed[0]))
30
+ return false;
31
+ try {
32
+ const parsed = yaml.parse(trimmed);
33
+ return parsed !== null && typeof parsed === 'object';
34
+ }
35
+ catch {
36
+ return false;
37
+ }
38
+ }
39
+ /** True if content is a structural format (JSON/XML/YAML) — kept as a single data chunk. */
40
+ export function isStructuralData(content) {
41
+ return isJsonData(content) || isXmlData(content) || isYamlData(content);
42
+ }
43
+ //# sourceMappingURL=detection.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"detection.js","sourceRoot":"","sources":["../../format/src/detection.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,aAAa,EAAE,MAAM,WAAW,CAAA;AACzC,OAAO,KAAK,IAAI,MAAM,MAAM,CAAA;AAE5B,MAAM,UAAU,GAAG,qBAAqB,CAAA;AAExC,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,IAAI,CAAC;QAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC;QAAC,OAAO,IAAI,CAAA;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;AACxE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,OAAe;IACvC,MAAM,CAAC,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IACxB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,KAAK,CAAA;IACpC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IAC7B,OAAO,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,CAAC,CAAC,KAAK,CAAA;AACpD,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,OAAe;IACxC,MAAM,OAAO,GAAG,OAAO,CAAC,IAAI,EAAE,CAAA;IAC9B,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,iBAAiB,CAAC;QAAE,OAAO,KAAK,CAAA;IACnD,IAAI,KAAK,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;QAAE,OAAO,KAAK,CAAA;IAC5C,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;QAClC,OAAO,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,CAAA;IACtD,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,KAAK,CAAA;IAAC,CAAC;AAC1B,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,gBAAgB,CAAC,OAAe;IAC9C,OAAO,UAAU,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,OAAO,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,CAAA;AACzE,CAAC"}
@@ -0,0 +1,8 @@
1
+ export * from './registry.js';
2
+ export * from './parse.js';
3
+ export * from './serialize.js';
4
+ export * from './config.js';
5
+ export * from './detection.js';
6
+ export * from './chunks.js';
7
+ export { escapeYamlString, unescapeYamlString } from './yaml.js';
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../format/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,8 @@
1
+ export * from './registry.js';
2
+ export * from './parse.js';
3
+ export * from './serialize.js';
4
+ export * from './config.js';
5
+ export * from './detection.js';
6
+ export * from './chunks.js';
7
+ export { escapeYamlString, unescapeYamlString } from './yaml.js';
8
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../format/src/index.ts"],"names":[],"mappings":"AAAA,cAAc,eAAe,CAAA;AAC7B,cAAc,YAAY,CAAA;AAC1B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,20 @@
1
+ /** Parse a `.bulb.md` file: strict Markdown bundle with YAML frontmatter and `**filename**` blocks. */
2
+ import { type SubscriptKind } from './registry.js';
3
+ export interface BulbFrontmatter {
4
+ format: string;
5
+ name: string;
6
+ }
7
+ export interface ParsedBulb {
8
+ frontmatter: BulbFrontmatter;
9
+ /** Block contents keyed by filename (e.g. `code.tsx`). */
10
+ files: Map<string, string>;
11
+ }
12
+ /** Structured per-block content, keyed by kind. */
13
+ export type BulbData = {
14
+ name: string;
15
+ } & Record<SubscriptKind, string>;
16
+ /** Parse a `.bulb.md` file into frontmatter and file contents, or null if malformed. */
17
+ export declare function parseBulb(content: string): ParsedBulb | null;
18
+ /** Convert a parsed bulb to a structured per-kind object (missing blocks become ''). */
19
+ export declare function toBulbData(parsed: ParsedBulb): BulbData;
20
+ //# sourceMappingURL=parse.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.d.ts","sourceRoot":"","sources":["../../format/src/parse.ts"],"names":[],"mappings":"AAAA,uGAAuG;AAEvG,OAAO,EAAE,KAAK,aAAa,EAAsC,MAAM,eAAe,CAAA;AAGtF,MAAM,WAAW,eAAe;IAC9B,MAAM,EAAE,MAAM,CAAA;IACd,IAAI,EAAE,MAAM,CAAA;CACb;AAED,MAAM,WAAW,UAAU;IACzB,WAAW,EAAE,eAAe,CAAA;IAC5B,0DAA0D;IAC1D,KAAK,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;CAC3B;AAED,mDAAmD;AACnD,MAAM,MAAM,QAAQ,GAAG;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,MAAM,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AAEvE,wFAAwF;AACxF,wBAAgB,SAAS,CAAC,OAAO,EAAE,MAAM,GAAG,UAAU,GAAG,IAAI,CA2D5D;AAsBD,wFAAwF;AACxF,wBAAgB,UAAU,CAAC,MAAM,EAAE,UAAU,GAAG,QAAQ,CAKvD"}
@@ -0,0 +1,88 @@
1
+ /** Parse a `.bulb.md` file: strict Markdown bundle with YAML frontmatter and `**filename**` blocks. */
2
+ import { blocks, orderedKinds, isBulbFormat } from './registry.js';
3
+ import { unescapeYamlString } from './yaml.js';
4
+ /** Parse a `.bulb.md` file into frontmatter and file contents, or null if malformed. */
5
+ export function parseBulb(content) {
6
+ try {
7
+ const lines = content.split('\n');
8
+ let i = 0;
9
+ // Parse frontmatter
10
+ if (lines[i]?.trim() !== '---')
11
+ return null;
12
+ i++;
13
+ const frontmatterLines = [];
14
+ while (i < lines.length && lines[i]?.trim() !== '---') {
15
+ frontmatterLines.push(lines[i]);
16
+ i++;
17
+ }
18
+ if (lines[i]?.trim() !== '---')
19
+ return null;
20
+ i++;
21
+ const frontmatter = parseFrontmatter(frontmatterLines);
22
+ if (!frontmatter)
23
+ return null;
24
+ // Parse file sections
25
+ const files = new Map();
26
+ while (i < lines.length) {
27
+ const line = lines[i]?.trim();
28
+ // Look for **filename** (bold markdown, tolerant of whitespace)
29
+ const fileMatch = line?.match(/^\*\*(.+)\*\*$/);
30
+ if (fileMatch) {
31
+ const filename = fileMatch[1].trim();
32
+ i++;
33
+ // Skip empty lines until fence
34
+ while (i < lines.length && lines[i]?.trim() === '')
35
+ i++;
36
+ // Parse fenced code block (tolerant of trailing whitespace)
37
+ const fenceMatch = lines[i]?.match(/^(`{3,})(\w*)\s*$/);
38
+ if (!fenceMatch) {
39
+ i++;
40
+ continue;
41
+ }
42
+ const fence = fenceMatch[1];
43
+ i++;
44
+ const contentLines = [];
45
+ while (i < lines.length && !lines[i]?.match(new RegExp(`^${fence}\\s*$`))) {
46
+ contentLines.push(lines[i]);
47
+ i++;
48
+ }
49
+ i++; // Skip closing fence
50
+ files.set(filename, contentLines.join('\n'));
51
+ }
52
+ else {
53
+ i++;
54
+ }
55
+ }
56
+ return { frontmatter, files };
57
+ }
58
+ catch {
59
+ return null;
60
+ }
61
+ }
62
+ function parseFrontmatter(lines) {
63
+ const fm = {};
64
+ for (const line of lines) {
65
+ const colonIdx = line.indexOf(':');
66
+ if (colonIdx === -1)
67
+ continue;
68
+ const key = line.slice(0, colonIdx).trim();
69
+ const value = line.slice(colonIdx + 1).trim();
70
+ switch (key) {
71
+ case 'format':
72
+ fm.format = value;
73
+ break;
74
+ case 'name':
75
+ fm.name = unescapeYamlString(value);
76
+ break;
77
+ }
78
+ }
79
+ if (!isBulbFormat(fm.format) || !fm.name)
80
+ return null;
81
+ return fm;
82
+ }
83
+ /** Convert a parsed bulb to a structured per-kind object (missing blocks become ''). */
84
+ export function toBulbData(parsed) {
85
+ const kinds = Object.fromEntries(orderedKinds.map(kind => [kind, parsed.files.get(blocks[kind].path) || '']));
86
+ return { name: parsed.frontmatter.name, ...kinds };
87
+ }
88
+ //# sourceMappingURL=parse.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse.js","sourceRoot":"","sources":["../../format/src/parse.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,24 @@
1
+ /**
2
+ * The canonical bulb block registry — the single source of truth for what blocks a bulb has,
3
+ * their filenames, and their languages. Both the typebulb CLI and the typebulb.com editor derive
4
+ * their block handling from this; the editor extends each entry with its own presentation fields.
5
+ *
6
+ * `server.ts` is intentionally not here: it is a CLI-only block (local Node code), owned by the CLI.
7
+ */
8
+ export type SubscriptKind = 'code' | 'css' | 'html' | 'config' | 'notes' | 'data' | 'infer' | 'insight';
9
+ export type SubscriptPath = 'code.tsx' | 'index.html' | 'styles.css' | 'config.json' | 'notes.md' | 'data.txt' | 'infer.md' | 'insight.json';
10
+ export interface BlockSpec {
11
+ path: SubscriptPath;
12
+ language: string;
13
+ }
14
+ export declare const blocks: Record<SubscriptKind, BlockSpec>;
15
+ /** Block order as serialized in a `.bulb.md` file. */
16
+ export declare const orderedKinds: SubscriptKind[];
17
+ /** Look up the kind that owns a given filename (e.g. `code.tsx` → `code`). */
18
+ export declare function kindFromPath(path: string): SubscriptKind | undefined;
19
+ /** Bulb file format identifier (YAML frontmatter `format:`) and file extension. */
20
+ export declare const BULB_FORMAT = "typebulb/v1";
21
+ export declare const BULB_EXT = ".bulb.md";
22
+ /** A bulb's frontmatter `format:` value is recognised iff it starts with `typebulb`. */
23
+ export declare function isBulbFormat(format: string | undefined): boolean;
24
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../../format/src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,CAAA;AAEvG,MAAM,MAAM,aAAa,GACrB,UAAU,GAAG,YAAY,GAAG,YAAY,GAAG,aAAa,GACxD,UAAU,GAAG,UAAU,GAAG,UAAU,GAAG,cAAc,CAAA;AAEzD,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,aAAa,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;CACjB;AAED,eAAO,MAAM,MAAM,EAAE,MAAM,CAAC,aAAa,EAAE,SAAS,CASnD,CAAA;AAED,sDAAsD;AACtD,eAAO,MAAM,YAAY,EAAE,aAAa,EAA2E,CAAA;AAEnH,8EAA8E;AAC9E,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,GAAG,SAAS,CAEpE;AAED,mFAAmF;AACnF,eAAO,MAAM,WAAW,gBAAgB,CAAA;AACxC,eAAO,MAAM,QAAQ,aAAa,CAAA;AAElC,wFAAwF;AACxF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,GAAG,OAAO,CAEhE"}
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The canonical bulb block registry — the single source of truth for what blocks a bulb has,
3
+ * their filenames, and their languages. Both the typebulb CLI and the typebulb.com editor derive
4
+ * their block handling from this; the editor extends each entry with its own presentation fields.
5
+ *
6
+ * `server.ts` is intentionally not here: it is a CLI-only block (local Node code), owned by the CLI.
7
+ */
8
+ export const blocks = {
9
+ code: { path: 'code.tsx', language: 'typescript' },
10
+ css: { path: 'styles.css', language: 'css' },
11
+ html: { path: 'index.html', language: 'html' },
12
+ config: { path: 'config.json', language: 'json' },
13
+ notes: { path: 'notes.md', language: 'markdown' },
14
+ data: { path: 'data.txt', language: 'text' },
15
+ infer: { path: 'infer.md', language: 'markdown' },
16
+ insight: { path: 'insight.json', language: 'json' },
17
+ };
18
+ /** Block order as serialized in a `.bulb.md` file. */
19
+ export const orderedKinds = ['code', 'css', 'html', 'data', 'infer', 'insight', 'config', 'notes'];
20
+ /** Look up the kind that owns a given filename (e.g. `code.tsx` → `code`). */
21
+ export function kindFromPath(path) {
22
+ return orderedKinds.find(kind => blocks[kind].path === path);
23
+ }
24
+ /** Bulb file format identifier (YAML frontmatter `format:`) and file extension. */
25
+ export const BULB_FORMAT = 'typebulb/v1';
26
+ export const BULB_EXT = '.bulb.md';
27
+ /** A bulb's frontmatter `format:` value is recognised iff it starts with `typebulb`. */
28
+ export function isBulbFormat(format) {
29
+ return !!format?.startsWith('typebulb');
30
+ }
31
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../../format/src/registry.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAaH,MAAM,CAAC,MAAM,MAAM,GAAqC;IACtD,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,YAAY,EAAE;IAClD,GAAG,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE;IAC5C,IAAI,EAAE,EAAE,IAAI,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC9C,MAAM,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,MAAM,EAAE;IACjD,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACjD,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,EAAE;IAC5C,KAAK,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,QAAQ,EAAE,UAAU,EAAE;IACjD,OAAO,EAAE,EAAE,IAAI,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE;CACpD,CAAA;AAED,sDAAsD;AACtD,MAAM,CAAC,MAAM,YAAY,GAAoB,CAAC,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,OAAO,CAAC,CAAA;AAEnH,8EAA8E;AAC9E,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,IAAI,CAAC,CAAA;AAC9D,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAA;AACxC,MAAM,CAAC,MAAM,QAAQ,GAAG,UAAU,CAAA;AAElC,wFAAwF;AACxF,MAAM,UAAU,YAAY,CAAC,MAA0B;IACrD,OAAO,CAAC,CAAC,MAAM,EAAE,UAAU,CAAC,UAAU,CAAC,CAAA;AACzC,CAAC"}