business-as-code 0.2.1 → 2.0.2

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 (190) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/CHANGELOG.md +17 -0
  3. package/IMPLEMENTATION.md +226 -0
  4. package/README.md +1133 -193
  5. package/dist/business.d.ts +62 -0
  6. package/dist/business.d.ts.map +1 -0
  7. package/dist/business.js +109 -0
  8. package/dist/business.js.map +1 -0
  9. package/dist/dollar.d.ts +60 -0
  10. package/dist/dollar.d.ts.map +1 -0
  11. package/dist/dollar.js +107 -0
  12. package/dist/dollar.js.map +1 -0
  13. package/dist/entities/assets.d.ts +21 -0
  14. package/dist/entities/assets.d.ts.map +1 -0
  15. package/dist/entities/assets.js +323 -0
  16. package/dist/entities/assets.js.map +1 -0
  17. package/dist/entities/business.d.ts +36 -0
  18. package/dist/entities/business.d.ts.map +1 -0
  19. package/dist/entities/business.js +370 -0
  20. package/dist/entities/business.js.map +1 -0
  21. package/dist/entities/communication.d.ts +21 -0
  22. package/dist/entities/communication.d.ts.map +1 -0
  23. package/dist/entities/communication.js +255 -0
  24. package/dist/entities/communication.js.map +1 -0
  25. package/dist/entities/customers.d.ts +58 -0
  26. package/dist/entities/customers.d.ts.map +1 -0
  27. package/dist/entities/customers.js +989 -0
  28. package/dist/entities/customers.js.map +1 -0
  29. package/dist/entities/financials.d.ts +59 -0
  30. package/dist/entities/financials.d.ts.map +1 -0
  31. package/dist/entities/financials.js +932 -0
  32. package/dist/entities/financials.js.map +1 -0
  33. package/dist/entities/goals.d.ts +58 -0
  34. package/dist/entities/goals.d.ts.map +1 -0
  35. package/dist/entities/goals.js +800 -0
  36. package/dist/entities/goals.js.map +1 -0
  37. package/dist/entities/index.d.ts +299 -0
  38. package/dist/entities/index.d.ts.map +1 -0
  39. package/dist/entities/index.js +198 -0
  40. package/dist/entities/index.js.map +1 -0
  41. package/dist/entities/legal.d.ts +21 -0
  42. package/dist/entities/legal.d.ts.map +1 -0
  43. package/dist/entities/legal.js +301 -0
  44. package/dist/entities/legal.js.map +1 -0
  45. package/dist/entities/market.d.ts +21 -0
  46. package/dist/entities/market.d.ts.map +1 -0
  47. package/dist/entities/market.js +301 -0
  48. package/dist/entities/market.js.map +1 -0
  49. package/dist/entities/marketing.d.ts +67 -0
  50. package/dist/entities/marketing.d.ts.map +1 -0
  51. package/dist/entities/marketing.js +1157 -0
  52. package/dist/entities/marketing.js.map +1 -0
  53. package/dist/entities/offerings.d.ts +51 -0
  54. package/dist/entities/offerings.d.ts.map +1 -0
  55. package/dist/entities/offerings.js +727 -0
  56. package/dist/entities/offerings.js.map +1 -0
  57. package/dist/entities/operations.d.ts +58 -0
  58. package/dist/entities/operations.d.ts.map +1 -0
  59. package/dist/entities/operations.js +787 -0
  60. package/dist/entities/operations.js.map +1 -0
  61. package/dist/entities/organization.d.ts +57 -0
  62. package/dist/entities/organization.d.ts.map +1 -0
  63. package/dist/entities/organization.js +807 -0
  64. package/dist/entities/organization.js.map +1 -0
  65. package/dist/entities/partnerships.d.ts +21 -0
  66. package/dist/entities/partnerships.d.ts.map +1 -0
  67. package/dist/entities/partnerships.js +300 -0
  68. package/dist/entities/partnerships.js.map +1 -0
  69. package/dist/entities/planning.d.ts +87 -0
  70. package/dist/entities/planning.d.ts.map +1 -0
  71. package/dist/entities/planning.js +271 -0
  72. package/dist/entities/planning.js.map +1 -0
  73. package/dist/entities/projects.d.ts +25 -0
  74. package/dist/entities/projects.d.ts.map +1 -0
  75. package/dist/entities/projects.js +349 -0
  76. package/dist/entities/projects.js.map +1 -0
  77. package/dist/entities/risk.d.ts +21 -0
  78. package/dist/entities/risk.d.ts.map +1 -0
  79. package/dist/entities/risk.js +293 -0
  80. package/dist/entities/risk.js.map +1 -0
  81. package/dist/entities/sales.d.ts +72 -0
  82. package/dist/entities/sales.d.ts.map +1 -0
  83. package/dist/entities/sales.js +1248 -0
  84. package/dist/entities/sales.js.map +1 -0
  85. package/dist/financials.d.ts +130 -0
  86. package/dist/financials.d.ts.map +1 -0
  87. package/dist/financials.js +297 -0
  88. package/dist/financials.js.map +1 -0
  89. package/dist/goals.d.ts +87 -0
  90. package/dist/goals.d.ts.map +1 -0
  91. package/dist/goals.js +215 -0
  92. package/dist/goals.js.map +1 -0
  93. package/dist/index.d.ts +97 -4
  94. package/dist/index.d.ts.map +1 -0
  95. package/dist/index.js +131 -1079
  96. package/dist/index.js.map +1 -1
  97. package/dist/kpis.d.ts +118 -0
  98. package/dist/kpis.d.ts.map +1 -0
  99. package/dist/kpis.js +232 -0
  100. package/dist/kpis.js.map +1 -0
  101. package/dist/metrics.d.ts +448 -0
  102. package/dist/metrics.d.ts.map +1 -0
  103. package/dist/metrics.js +325 -0
  104. package/dist/metrics.js.map +1 -0
  105. package/dist/okrs.d.ts +123 -0
  106. package/dist/okrs.d.ts.map +1 -0
  107. package/dist/okrs.js +269 -0
  108. package/dist/okrs.js.map +1 -0
  109. package/dist/organization.d.ts +585 -0
  110. package/dist/organization.d.ts.map +1 -0
  111. package/dist/organization.js +173 -0
  112. package/dist/organization.js.map +1 -0
  113. package/dist/process.d.ts +112 -0
  114. package/dist/process.d.ts.map +1 -0
  115. package/dist/process.js +241 -0
  116. package/dist/process.js.map +1 -0
  117. package/dist/product.d.ts +85 -0
  118. package/dist/product.d.ts.map +1 -0
  119. package/dist/product.js +145 -0
  120. package/dist/product.js.map +1 -0
  121. package/dist/queries.d.ts +304 -0
  122. package/dist/queries.d.ts.map +1 -0
  123. package/dist/queries.js +415 -0
  124. package/dist/queries.js.map +1 -0
  125. package/dist/roles.d.ts +340 -0
  126. package/dist/roles.d.ts.map +1 -0
  127. package/dist/roles.js +255 -0
  128. package/dist/roles.js.map +1 -0
  129. package/dist/service.d.ts +61 -0
  130. package/dist/service.d.ts.map +1 -0
  131. package/dist/service.js +140 -0
  132. package/dist/service.js.map +1 -0
  133. package/dist/types.d.ts +459 -0
  134. package/dist/types.d.ts.map +1 -0
  135. package/dist/types.js +5 -0
  136. package/dist/types.js.map +1 -0
  137. package/dist/vision.d.ts +38 -0
  138. package/dist/vision.d.ts.map +1 -0
  139. package/dist/vision.js +68 -0
  140. package/dist/vision.js.map +1 -0
  141. package/dist/workflow.d.ts +115 -0
  142. package/dist/workflow.d.ts.map +1 -0
  143. package/dist/workflow.js +247 -0
  144. package/dist/workflow.js.map +1 -0
  145. package/examples/basic-usage.ts +307 -0
  146. package/package.json +19 -60
  147. package/src/business.ts +121 -0
  148. package/src/dollar.ts +132 -0
  149. package/src/entities/assets.ts +332 -0
  150. package/src/entities/business.ts +406 -0
  151. package/src/entities/communication.ts +264 -0
  152. package/src/entities/customers.ts +1072 -0
  153. package/src/entities/financials.ts +1011 -0
  154. package/src/entities/goals.ts +871 -0
  155. package/src/entities/index.ts +383 -0
  156. package/src/entities/legal.ts +310 -0
  157. package/src/entities/market.ts +310 -0
  158. package/src/entities/marketing.ts +1249 -0
  159. package/src/entities/offerings.ts +789 -0
  160. package/src/entities/operations.ts +861 -0
  161. package/src/entities/organization.ts +876 -0
  162. package/src/entities/partnerships.ts +309 -0
  163. package/src/entities/planning.ts +307 -0
  164. package/src/entities/projects.ts +360 -0
  165. package/src/entities/risk.ts +302 -0
  166. package/src/entities/sales.ts +1352 -0
  167. package/src/financials.ts +352 -0
  168. package/src/goals.ts +250 -0
  169. package/src/index.test.ts +336 -0
  170. package/src/index.ts +530 -0
  171. package/src/kpis.ts +275 -0
  172. package/src/metrics.ts +825 -0
  173. package/src/okrs.ts +325 -0
  174. package/src/organization.ts +909 -0
  175. package/src/process.ts +272 -0
  176. package/src/product.ts +178 -0
  177. package/src/queries.ts +767 -0
  178. package/src/roles.ts +686 -0
  179. package/src/service.ts +164 -0
  180. package/src/types.ts +493 -0
  181. package/src/vision.ts +88 -0
  182. package/src/workflow.ts +280 -0
  183. package/tsconfig.json +9 -0
  184. package/dist/loaders/index.d.ts +0 -174
  185. package/dist/loaders/index.js +0 -366
  186. package/dist/loaders/index.js.map +0 -1
  187. package/dist/schema/index.d.ts +0 -146
  188. package/dist/schema/index.js +0 -716
  189. package/dist/schema/index.js.map +0 -1
  190. package/dist/types-CJ9eGS_C.d.ts +0 -86
@@ -1,366 +0,0 @@
1
- // src/loaders/mdx.ts
2
- import { parseMDXAsync, extractNodesByName } from "db.sb";
3
- function nodeToNounSchema(node) {
4
- const fields = [];
5
- if (node.children) {
6
- for (const child of node.children) {
7
- if (typeof child === "object" && "__dsl" in child) {
8
- const fieldNode = child;
9
- fields.push({
10
- name: fieldNode.name,
11
- type: fieldNode.type,
12
- required: fieldNode.props.required,
13
- unique: fieldNode.props.unique,
14
- config: fieldNode.props
15
- });
16
- }
17
- }
18
- }
19
- return {
20
- slug: node.props.slug || node.name,
21
- group: node.props.group,
22
- titleField: node.props.titleField || node.props.useAsTitle,
23
- fields
24
- };
25
- }
26
- async function loadFromMDX(source, options = {}) {
27
- const ast = await parseMDXAsync(source, options.context || "app");
28
- const name = ast.props.name || "unnamed";
29
- const version = ast.props.version || "1.0.0";
30
- const description = ast.props.description;
31
- const nounNodes = extractNodesByName(ast, "noun");
32
- const domains = {};
33
- for (const node of nounNodes) {
34
- const noun = nodeToNounSchema(node);
35
- const group = noun.group?.toLowerCase() || "business";
36
- if (!domains[group]) {
37
- domains[group] = [];
38
- }
39
- domains[group].push(noun);
40
- }
41
- return {
42
- name,
43
- version,
44
- description,
45
- domains
46
- };
47
- }
48
- async function loadNounFromMDX(source, options = {}) {
49
- const ast = await parseMDXAsync(source, options.context || "noun");
50
- if (ast.name !== "noun") {
51
- const nounNodes = extractNodesByName(ast, "noun");
52
- if (nounNodes.length === 0) {
53
- throw new Error("No Noun definition found in MDX");
54
- }
55
- return nodeToNounSchema(nounNodes[0]);
56
- }
57
- return nodeToNounSchema(ast);
58
- }
59
- async function loadNounsFromMDX(source, options = {}) {
60
- const ast = await parseMDXAsync(source, options.context || "app");
61
- const nounNodes = extractNodesByName(ast, "noun");
62
- return nounNodes.map(nodeToNounSchema);
63
- }
64
-
65
- // src/loaders/yaml.ts
66
- import YAML from "yaml";
67
- function parseFieldShorthand(name, value) {
68
- if (typeof value === "object") {
69
- return { ...value, name };
70
- }
71
- const parts = value.split(" ");
72
- const field = { name, type: "text" };
73
- for (const part of parts) {
74
- if (part === "required") {
75
- field.required = true;
76
- } else if (part === "unique") {
77
- field.unique = true;
78
- } else if (part.includes(":")) {
79
- const [type, options] = part.split(":");
80
- field.type = type;
81
- if (type === "status" || type === "select") {
82
- field.options = options.split("|");
83
- } else if (type === "ref") {
84
- field.to = options;
85
- }
86
- } else {
87
- field.type = part;
88
- }
89
- }
90
- return field;
91
- }
92
- function parseNoun(data) {
93
- const fields = [];
94
- if (data.fields) {
95
- if (Array.isArray(data.fields)) {
96
- for (const field of data.fields) {
97
- fields.push(field);
98
- }
99
- } else {
100
- for (const [name, value] of Object.entries(data.fields)) {
101
- fields.push(parseFieldShorthand(name, value));
102
- }
103
- }
104
- }
105
- return {
106
- slug: data.slug || data.name?.toLowerCase().replace(/\s+/g, "-"),
107
- group: data.group,
108
- titleField: data.titleField || data.useAsTitle,
109
- fields
110
- };
111
- }
112
- function loadFromYAML(source, _options = {}) {
113
- const data = YAML.parse(source);
114
- const schema = {
115
- name: data.name || "unnamed",
116
- version: data.version || "1.0.0",
117
- description: data.description,
118
- domains: {}
119
- };
120
- if (data.domains) {
121
- for (const [domain, nouns] of Object.entries(data.domains)) {
122
- if (Array.isArray(nouns)) {
123
- schema.domains[domain] = nouns.map(parseNoun);
124
- }
125
- }
126
- }
127
- if (data.nouns) {
128
- for (const nounData of data.nouns) {
129
- const noun = parseNoun(nounData);
130
- const domain = noun.group?.toLowerCase() || "business";
131
- if (!schema.domains[domain]) {
132
- schema.domains[domain] = [];
133
- }
134
- schema.domains[domain].push(noun);
135
- }
136
- }
137
- return schema;
138
- }
139
- function loadNounFromYAML(source, _options = {}) {
140
- const data = YAML.parse(source);
141
- return parseNoun(data);
142
- }
143
- function loadNounsFromYAML(source, _options = {}) {
144
- const data = YAML.parse(source);
145
- if (Array.isArray(data)) {
146
- return data.map(parseNoun);
147
- }
148
- if (data.nouns) {
149
- return data.nouns.map(parseNoun);
150
- }
151
- return [parseNoun(data)];
152
- }
153
- function toYAML(schema) {
154
- return YAML.stringify({
155
- name: schema.name,
156
- version: schema.version,
157
- description: schema.description,
158
- domains: schema.domains
159
- });
160
- }
161
- function nounToYAML(noun) {
162
- return YAML.stringify(noun);
163
- }
164
-
165
- // src/loaders/json.ts
166
- function parseFieldShorthand2(name, value) {
167
- if (typeof value === "object") {
168
- return { ...value, name };
169
- }
170
- const parts = value.split(" ");
171
- const field = { name, type: "text" };
172
- for (const part of parts) {
173
- if (part === "required") {
174
- field.required = true;
175
- } else if (part === "unique") {
176
- field.unique = true;
177
- } else if (part.includes(":")) {
178
- const [type, options] = part.split(":");
179
- field.type = type;
180
- if (type === "status" || type === "select") {
181
- field.options = options.split("|");
182
- } else if (type === "ref") {
183
- field.to = options;
184
- }
185
- } else {
186
- field.type = part;
187
- }
188
- }
189
- return field;
190
- }
191
- function parseNoun2(data) {
192
- const fields = [];
193
- if (data.fields) {
194
- if (Array.isArray(data.fields)) {
195
- for (const field of data.fields) {
196
- fields.push(field);
197
- }
198
- } else {
199
- for (const [name, value] of Object.entries(data.fields)) {
200
- fields.push(parseFieldShorthand2(name, value));
201
- }
202
- }
203
- }
204
- return {
205
- slug: data.slug || data.name?.toLowerCase().replace(/\s+/g, "-"),
206
- group: data.group,
207
- titleField: data.titleField || data.useAsTitle,
208
- fields
209
- };
210
- }
211
- function loadFromJSON(source, _options = {}) {
212
- const data = JSON.parse(source);
213
- const schema = {
214
- name: data.name || "unnamed",
215
- version: data.version || "1.0.0",
216
- description: data.description,
217
- domains: {}
218
- };
219
- if (data.domains) {
220
- for (const [domain, nouns] of Object.entries(data.domains)) {
221
- if (Array.isArray(nouns)) {
222
- schema.domains[domain] = nouns.map(parseNoun2);
223
- }
224
- }
225
- }
226
- if (data.nouns) {
227
- for (const nounData of data.nouns) {
228
- const noun = parseNoun2(nounData);
229
- const domain = noun.group?.toLowerCase() || "business";
230
- if (!schema.domains[domain]) {
231
- schema.domains[domain] = [];
232
- }
233
- schema.domains[domain].push(noun);
234
- }
235
- }
236
- return schema;
237
- }
238
- function loadNounFromJSON(source, _options = {}) {
239
- const data = JSON.parse(source);
240
- return parseNoun2(data);
241
- }
242
- function loadNounsFromJSON(source, _options = {}) {
243
- const data = JSON.parse(source);
244
- if (Array.isArray(data)) {
245
- return data.map(parseNoun2);
246
- }
247
- if (data.nouns) {
248
- return data.nouns.map(parseNoun2);
249
- }
250
- return [parseNoun2(data)];
251
- }
252
- function toJSON(schema, pretty = true) {
253
- return JSON.stringify(
254
- {
255
- name: schema.name,
256
- version: schema.version,
257
- description: schema.description,
258
- domains: schema.domains
259
- },
260
- null,
261
- pretty ? 2 : void 0
262
- );
263
- }
264
- function nounToJSON(noun, pretty = true) {
265
- return JSON.stringify(noun, null, pretty ? 2 : void 0);
266
- }
267
-
268
- // src/loaders/index.ts
269
- function detectFormat(source) {
270
- const trimmed = source.trim();
271
- if (trimmed.startsWith("{") || trimmed.startsWith("[")) {
272
- return "json";
273
- }
274
- if (trimmed.includes("<") && trimmed.includes(">")) {
275
- return "mdx";
276
- }
277
- return "yaml";
278
- }
279
- async function load(source, options = {}) {
280
- const format = options.format || detectFormat(source);
281
- let schema;
282
- switch (format) {
283
- case "mdx":
284
- schema = await loadFromMDX(source, options);
285
- break;
286
- case "yaml":
287
- schema = loadFromYAML(source, options);
288
- break;
289
- case "json":
290
- schema = loadFromJSON(source, options);
291
- break;
292
- default:
293
- throw new Error(`Unsupported format: ${format}`);
294
- }
295
- return {
296
- schema,
297
- format
298
- };
299
- }
300
- async function loadNoun(source, options = {}) {
301
- const format = options.format || detectFormat(source);
302
- switch (format) {
303
- case "mdx":
304
- return loadNounFromMDX(source, options);
305
- case "yaml":
306
- return loadNounFromYAML(source, options);
307
- case "json":
308
- return loadNounFromJSON(source, options);
309
- default:
310
- throw new Error(`Unsupported format: ${format}`);
311
- }
312
- }
313
- async function loadNouns(source, options = {}) {
314
- const format = options.format || detectFormat(source);
315
- switch (format) {
316
- case "mdx":
317
- return loadNounsFromMDX(source, options);
318
- case "yaml":
319
- return loadNounsFromYAML(source, options);
320
- case "json":
321
- return loadNounsFromJSON(source, options);
322
- default:
323
- throw new Error(`Unsupported format: ${format}`);
324
- }
325
- }
326
- function serialize(schema, format = "yaml") {
327
- switch (format) {
328
- case "yaml":
329
- return toYAML(schema);
330
- case "json":
331
- return toJSON(schema);
332
- default:
333
- throw new Error(`Unsupported format: ${format}`);
334
- }
335
- }
336
- function serializeNoun(noun, format = "yaml") {
337
- switch (format) {
338
- case "yaml":
339
- return nounToYAML(noun);
340
- case "json":
341
- return nounToJSON(noun);
342
- default:
343
- throw new Error(`Unsupported format: ${format}`);
344
- }
345
- }
346
- export {
347
- load,
348
- loadFromJSON,
349
- loadFromMDX,
350
- loadFromYAML,
351
- loadNoun,
352
- loadNounFromJSON,
353
- loadNounFromMDX,
354
- loadNounFromYAML,
355
- loadNouns,
356
- loadNounsFromJSON,
357
- loadNounsFromMDX,
358
- loadNounsFromYAML,
359
- nounToJSON,
360
- nounToYAML,
361
- serialize,
362
- serializeNoun,
363
- toJSON,
364
- toYAML
365
- };
366
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/loaders/mdx.ts","../../src/loaders/yaml.ts","../../src/loaders/json.ts","../../src/loaders/index.ts"],"sourcesContent":["/**\n * MDX Loader\n *\n * Load business schemas from MDX files using the DSL parser from db.sb\n */\n\nimport { parseMDXAsync, extractNodesByName, type DSLNode } from 'db.sb'\nimport type { BusinessSchema, NounSchema, FieldSchema, LoaderOptions, BusinessDomain } from '../types'\n\n/**\n * Convert a DSLNode to a NounSchema\n */\nfunction nodeToNounSchema(node: DSLNode): NounSchema {\n const fields: FieldSchema[] = []\n\n if (node.children) {\n for (const child of node.children) {\n if (typeof child === 'object' && '__dsl' in child) {\n const fieldNode = child as DSLNode\n fields.push({\n name: fieldNode.name,\n type: fieldNode.type as any,\n required: fieldNode.props.required as boolean,\n unique: fieldNode.props.unique as boolean,\n config: fieldNode.props,\n })\n }\n }\n }\n\n return {\n slug: node.props.slug as string || node.name,\n group: node.props.group as string,\n titleField: node.props.titleField as string || node.props.useAsTitle as string,\n fields,\n }\n}\n\n/**\n * Load a business schema from MDX source\n *\n * @example\n * ```typescript\n * const mdx = `\n * <Business name=\"My Startup\">\n * <Noun name=\"Customer\" group=\"Success\">\n * <Name text required />\n * <Email />\n * <Status status=\"active|inactive|churned\" />\n * </Noun>\n * </Business>\n * `\n * const schema = await loadFromMDX(mdx)\n * ```\n */\nexport async function loadFromMDX(\n source: string,\n options: LoaderOptions = {}\n): Promise<BusinessSchema> {\n const ast = await parseMDXAsync(source, options.context || 'app')\n\n // Extract business name and version from root node\n const name = ast.props.name as string || 'unnamed'\n const version = ast.props.version as string || '1.0.0'\n const description = ast.props.description as string\n\n // Extract all Noun nodes\n const nounNodes = extractNodesByName(ast, 'noun')\n\n // Group nouns by their group property (which maps to domain)\n const domains: Partial<Record<BusinessDomain, NounSchema[]>> = {}\n\n for (const node of nounNodes) {\n const noun = nodeToNounSchema(node)\n const group = (noun.group?.toLowerCase() || 'business') as BusinessDomain\n\n if (!domains[group]) {\n domains[group] = []\n }\n domains[group]!.push(noun)\n }\n\n return {\n name,\n version,\n description,\n domains,\n }\n}\n\n/**\n * Load a single noun definition from MDX\n *\n * @example\n * ```typescript\n * const mdx = `\n * <Noun name=\"Customer\" group=\"Success\">\n * <Name text required />\n * <Email />\n * </Noun>\n * `\n * const noun = await loadNounFromMDX(mdx)\n * ```\n */\nexport async function loadNounFromMDX(\n source: string,\n options: LoaderOptions = {}\n): Promise<NounSchema> {\n const ast = await parseMDXAsync(source, options.context || 'noun')\n\n // The root should be a Noun node\n if (ast.name !== 'noun') {\n // Try to find a Noun node\n const nounNodes = extractNodesByName(ast, 'noun')\n if (nounNodes.length === 0) {\n throw new Error('No Noun definition found in MDX')\n }\n return nodeToNounSchema(nounNodes[0])\n }\n\n return nodeToNounSchema(ast)\n}\n\n/**\n * Load multiple noun definitions from MDX\n */\nexport async function loadNounsFromMDX(\n source: string,\n options: LoaderOptions = {}\n): Promise<NounSchema[]> {\n const ast = await parseMDXAsync(source, options.context || 'app')\n const nounNodes = extractNodesByName(ast, 'noun')\n return nounNodes.map(nodeToNounSchema)\n}\n","/**\n * YAML Loader\n *\n * Load business schemas from YAML files\n */\n\nimport YAML from 'yaml'\nimport type { BusinessSchema, NounSchema, FieldSchema, LoaderOptions, BusinessDomain, FieldShorthand } from '../types'\n\n/**\n * Parse a field shorthand into a FieldSchema\n *\n * Supports formats like:\n * - \"email\" -> { type: 'email' }\n * - \"text required\" -> { type: 'text', required: true }\n * - \"status:active|inactive\" -> { type: 'status', options: ['active', 'inactive'] }\n * - \"ref:customers\" -> { type: 'ref', to: 'customers' }\n */\nfunction parseFieldShorthand(name: string, value: FieldShorthand): FieldSchema {\n if (typeof value === 'object') {\n // Spread value first, then override with name to avoid duplicate key\n return { ...value, name } as FieldSchema\n }\n\n const parts = value.split(' ')\n const field: FieldSchema = { name, type: 'text' }\n\n for (const part of parts) {\n if (part === 'required') {\n field.required = true\n } else if (part === 'unique') {\n field.unique = true\n } else if (part.includes(':')) {\n const [type, options] = part.split(':')\n field.type = type as any\n\n if (type === 'status' || type === 'select') {\n field.options = options.split('|')\n } else if (type === 'ref') {\n // Use 'to' property for relationships (DSL uses 'to', Payload uses 'relationTo')\n field.to = options\n }\n } else {\n // It's a type name\n field.type = part as any\n }\n }\n\n return field\n}\n\n/**\n * Parse a YAML noun definition into a NounSchema\n */\nfunction parseNoun(data: any): NounSchema {\n const fields: FieldSchema[] = []\n\n if (data.fields) {\n if (Array.isArray(data.fields)) {\n // Fields as array of objects\n for (const field of data.fields) {\n fields.push(field as FieldSchema)\n }\n } else {\n // Fields as object (shorthand format)\n for (const [name, value] of Object.entries(data.fields)) {\n fields.push(parseFieldShorthand(name, value as FieldShorthand))\n }\n }\n }\n\n return {\n slug: data.slug || data.name?.toLowerCase().replace(/\\s+/g, '-'),\n group: data.group,\n titleField: data.titleField || data.useAsTitle,\n fields,\n }\n}\n\n/**\n * Load a business schema from YAML source\n *\n * @example\n * ```yaml\n * name: My Startup\n * version: 1.0.0\n *\n * domains:\n * success:\n * - name: Customer\n * titleField: name\n * fields:\n * name: text required\n * email: email\n * status: status:active|inactive|churned\n * healthScore: score\n * ```\n */\nexport function loadFromYAML(\n source: string,\n _options: LoaderOptions = {}\n): BusinessSchema {\n const data = YAML.parse(source)\n\n const schema: BusinessSchema = {\n name: data.name || 'unnamed',\n version: data.version || '1.0.0',\n description: data.description,\n domains: {},\n }\n\n if (data.domains) {\n for (const [domain, nouns] of Object.entries(data.domains)) {\n if (Array.isArray(nouns)) {\n schema.domains[domain as BusinessDomain] = nouns.map(parseNoun)\n }\n }\n }\n\n // Also support flat noun definitions under a 'nouns' key\n if (data.nouns) {\n for (const nounData of data.nouns) {\n const noun = parseNoun(nounData)\n const domain = (noun.group?.toLowerCase() || 'business') as BusinessDomain\n\n if (!schema.domains[domain]) {\n schema.domains[domain] = []\n }\n schema.domains[domain]!.push(noun)\n }\n }\n\n return schema\n}\n\n/**\n * Load a single noun from YAML\n */\nexport function loadNounFromYAML(\n source: string,\n _options: LoaderOptions = {}\n): NounSchema {\n const data = YAML.parse(source)\n return parseNoun(data)\n}\n\n/**\n * Load multiple nouns from YAML\n */\nexport function loadNounsFromYAML(\n source: string,\n _options: LoaderOptions = {}\n): NounSchema[] {\n const data = YAML.parse(source)\n\n if (Array.isArray(data)) {\n return data.map(parseNoun)\n }\n\n if (data.nouns) {\n return data.nouns.map(parseNoun)\n }\n\n // Single noun\n return [parseNoun(data)]\n}\n\n/**\n * Serialize a business schema to YAML\n */\nexport function toYAML(schema: BusinessSchema): string {\n return YAML.stringify({\n name: schema.name,\n version: schema.version,\n description: schema.description,\n domains: schema.domains,\n })\n}\n\n/**\n * Serialize a noun to YAML\n */\nexport function nounToYAML(noun: NounSchema): string {\n return YAML.stringify(noun)\n}\n","/**\n * JSON Loader\n *\n * Load business schemas from JSON files\n */\n\nimport type { BusinessSchema, NounSchema, FieldSchema, LoaderOptions, BusinessDomain, FieldShorthand } from '../types'\n\n/**\n * Parse a field shorthand into a FieldSchema\n *\n * Supports formats like:\n * - \"email\" -> { type: 'email' }\n * - \"text required\" -> { type: 'text', required: true }\n * - \"status:active|inactive\" -> { type: 'status', options: ['active', 'inactive'] }\n * - \"ref:customers\" -> { type: 'ref', to: 'customers' }\n */\nfunction parseFieldShorthand(name: string, value: FieldShorthand): FieldSchema {\n if (typeof value === 'object') {\n // Spread value first, then override with name to avoid duplicate key\n return { ...value, name } as FieldSchema\n }\n\n const parts = value.split(' ')\n const field: FieldSchema = { name, type: 'text' }\n\n for (const part of parts) {\n if (part === 'required') {\n field.required = true\n } else if (part === 'unique') {\n field.unique = true\n } else if (part.includes(':')) {\n const [type, options] = part.split(':')\n field.type = type as any\n\n if (type === 'status' || type === 'select') {\n field.options = options.split('|')\n } else if (type === 'ref') {\n // Use 'to' property for relationships (DSL uses 'to', Payload uses 'relationTo')\n field.to = options\n }\n } else {\n field.type = part as any\n }\n }\n\n return field\n}\n\n/**\n * Parse a JSON noun definition into a NounSchema\n */\nfunction parseNoun(data: any): NounSchema {\n const fields: FieldSchema[] = []\n\n if (data.fields) {\n if (Array.isArray(data.fields)) {\n for (const field of data.fields) {\n fields.push(field as FieldSchema)\n }\n } else {\n for (const [name, value] of Object.entries(data.fields)) {\n fields.push(parseFieldShorthand(name, value as FieldShorthand))\n }\n }\n }\n\n return {\n slug: data.slug || data.name?.toLowerCase().replace(/\\s+/g, '-'),\n group: data.group,\n titleField: data.titleField || data.useAsTitle,\n fields,\n }\n}\n\n/**\n * Load a business schema from JSON source\n *\n * @example\n * ```json\n * {\n * \"name\": \"My Startup\",\n * \"version\": \"1.0.0\",\n * \"domains\": {\n * \"success\": [\n * {\n * \"name\": \"Customer\",\n * \"titleField\": \"name\",\n * \"fields\": {\n * \"name\": \"text required\",\n * \"email\": \"email\",\n * \"status\": \"status:active|inactive|churned\"\n * }\n * }\n * ]\n * }\n * }\n * ```\n */\nexport function loadFromJSON(\n source: string,\n _options: LoaderOptions = {}\n): BusinessSchema {\n const data = JSON.parse(source)\n\n const schema: BusinessSchema = {\n name: data.name || 'unnamed',\n version: data.version || '1.0.0',\n description: data.description,\n domains: {},\n }\n\n if (data.domains) {\n for (const [domain, nouns] of Object.entries(data.domains)) {\n if (Array.isArray(nouns)) {\n schema.domains[domain as BusinessDomain] = nouns.map(parseNoun)\n }\n }\n }\n\n if (data.nouns) {\n for (const nounData of data.nouns) {\n const noun = parseNoun(nounData)\n const domain = (noun.group?.toLowerCase() || 'business') as BusinessDomain\n\n if (!schema.domains[domain]) {\n schema.domains[domain] = []\n }\n schema.domains[domain]!.push(noun)\n }\n }\n\n return schema\n}\n\n/**\n * Load a single noun from JSON\n */\nexport function loadNounFromJSON(\n source: string,\n _options: LoaderOptions = {}\n): NounSchema {\n const data = JSON.parse(source)\n return parseNoun(data)\n}\n\n/**\n * Load multiple nouns from JSON\n */\nexport function loadNounsFromJSON(\n source: string,\n _options: LoaderOptions = {}\n): NounSchema[] {\n const data = JSON.parse(source)\n\n if (Array.isArray(data)) {\n return data.map(parseNoun)\n }\n\n if (data.nouns) {\n return data.nouns.map(parseNoun)\n }\n\n return [parseNoun(data)]\n}\n\n/**\n * Serialize a business schema to JSON\n */\nexport function toJSON(schema: BusinessSchema, pretty = true): string {\n return JSON.stringify(\n {\n name: schema.name,\n version: schema.version,\n description: schema.description,\n domains: schema.domains,\n },\n null,\n pretty ? 2 : undefined\n )\n}\n\n/**\n * Serialize a noun to JSON\n */\nexport function nounToJSON(noun: NounSchema, pretty = true): string {\n return JSON.stringify(noun, null, pretty ? 2 : undefined)\n}\n","/**\n * Loaders Module\n *\n * Load business schemas from various formats (MDX, YAML, JSON)\n */\n\nimport type { BusinessSchema, NounSchema, LoaderOptions, LoadResult } from '../types'\n\n// Export all loader functions\nexport * from './mdx'\nexport * from './yaml'\nexport * from './json'\n\n// Import for unified loader\nimport { loadFromMDX, loadNounFromMDX, loadNounsFromMDX } from './mdx'\nimport { loadFromYAML, loadNounFromYAML, loadNounsFromYAML, toYAML, nounToYAML } from './yaml'\nimport { loadFromJSON, loadNounFromJSON, loadNounsFromJSON, toJSON, nounToJSON } from './json'\n\n/**\n * Detect format from source content\n */\nfunction detectFormat(source: string): 'mdx' | 'yaml' | 'json' {\n const trimmed = source.trim()\n\n // JSON starts with { or [\n if (trimmed.startsWith('{') || trimmed.startsWith('[')) {\n return 'json'\n }\n\n // MDX contains JSX tags\n if (trimmed.includes('<') && trimmed.includes('>')) {\n return 'mdx'\n }\n\n // Default to YAML\n return 'yaml'\n}\n\n/**\n * Load a business schema from any supported format\n *\n * Automatically detects the format from the source content.\n */\nexport async function load(\n source: string,\n options: LoaderOptions & { format?: 'mdx' | 'yaml' | 'json' } = {}\n): Promise<LoadResult> {\n const format = options.format || detectFormat(source)\n\n let schema: BusinessSchema\n\n switch (format) {\n case 'mdx':\n schema = await loadFromMDX(source, options)\n break\n case 'yaml':\n schema = loadFromYAML(source, options)\n break\n case 'json':\n schema = loadFromJSON(source, options)\n break\n default:\n throw new Error(`Unsupported format: ${format}`)\n }\n\n return {\n schema,\n format,\n }\n}\n\n/**\n * Load a single noun from any supported format\n */\nexport async function loadNoun(\n source: string,\n options: LoaderOptions & { format?: 'mdx' | 'yaml' | 'json' } = {}\n): Promise<NounSchema> {\n const format = options.format || detectFormat(source)\n\n switch (format) {\n case 'mdx':\n return loadNounFromMDX(source, options)\n case 'yaml':\n return loadNounFromYAML(source, options)\n case 'json':\n return loadNounFromJSON(source, options)\n default:\n throw new Error(`Unsupported format: ${format}`)\n }\n}\n\n/**\n * Load multiple nouns from any supported format\n */\nexport async function loadNouns(\n source: string,\n options: LoaderOptions & { format?: 'mdx' | 'yaml' | 'json' } = {}\n): Promise<NounSchema[]> {\n const format = options.format || detectFormat(source)\n\n switch (format) {\n case 'mdx':\n return loadNounsFromMDX(source, options)\n case 'yaml':\n return loadNounsFromYAML(source, options)\n case 'json':\n return loadNounsFromJSON(source, options)\n default:\n throw new Error(`Unsupported format: ${format}`)\n }\n}\n\n/**\n * Serialize a business schema to a specific format\n */\nexport function serialize(\n schema: BusinessSchema,\n format: 'yaml' | 'json' = 'yaml'\n): string {\n switch (format) {\n case 'yaml':\n return toYAML(schema)\n case 'json':\n return toJSON(schema)\n default:\n throw new Error(`Unsupported format: ${format}`)\n }\n}\n\n/**\n * Serialize a noun to a specific format\n */\nexport function serializeNoun(\n noun: NounSchema,\n format: 'yaml' | 'json' = 'yaml'\n): string {\n switch (format) {\n case 'yaml':\n return nounToYAML(noun)\n case 'json':\n return nounToJSON(noun)\n default:\n throw new Error(`Unsupported format: ${format}`)\n }\n}\n"],"mappings":"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","names":["parseFieldShorthand","parseNoun"]}
@@ -1,146 +0,0 @@
1
- import { B as BusinessSchema, a as BusinessDomain } from '../types-CJ9eGS_C.js';
2
- import { NounSchema } from 'db.sb';
3
-
4
- /**
5
- * Admin Domain - Core system entities
6
- */
7
-
8
- declare const Users: NounSchema;
9
- declare const Orgs: NounSchema;
10
- declare const ServiceAccounts: NounSchema;
11
- declare const adminNouns: NounSchema[];
12
-
13
- /**
14
- * Business Domain - Core business entities
15
- */
16
-
17
- declare const Businesses: NounSchema;
18
- declare const Goals: NounSchema;
19
- declare const Metrics: NounSchema;
20
- declare const Teams: NounSchema;
21
- declare const Processes: NounSchema;
22
- declare const businessNouns: NounSchema[];
23
-
24
- /**
25
- * Product Domain - Products, services, and offerings
26
- */
27
-
28
- declare const Products: NounSchema;
29
- declare const Services: NounSchema;
30
- declare const Offers: NounSchema;
31
- declare const Prices: NounSchema;
32
- declare const Features: NounSchema;
33
- declare const productNouns: NounSchema[];
34
-
35
- /**
36
- * Success Domain - Customer success and relationships
37
- */
38
-
39
- declare const Customers: NounSchema;
40
- declare const Contacts: NounSchema;
41
- declare const Subscriptions: NounSchema;
42
- declare const successNouns: NounSchema[];
43
-
44
- /**
45
- * Sales Domain - Sales pipeline and deals
46
- */
47
-
48
- declare const Deals: NounSchema;
49
- declare const Quotes: NounSchema;
50
- declare const Proposals: NounSchema;
51
- declare const salesNouns: NounSchema[];
52
-
53
- /**
54
- * Marketing Domain - Leads, brands, and marketing assets
55
- */
56
-
57
- declare const Leads: NounSchema;
58
- declare const Brands: NounSchema;
59
- declare const Domains: NounSchema;
60
- declare const Competitors: NounSchema;
61
- declare const marketingNouns: NounSchema[];
62
-
63
- /**
64
- * Work Domain - Projects, tasks, and workflows
65
- */
66
-
67
- declare const Projects: NounSchema;
68
- declare const Tasks: NounSchema;
69
- declare const Issues: NounSchema;
70
- declare const Workflows: NounSchema;
71
- declare const Roles: NounSchema;
72
- declare const Agents: NounSchema;
73
- declare const workNouns: NounSchema[];
74
-
75
- /**
76
- * Financial Domain - Accounting, invoicing, and payments
77
- */
78
-
79
- declare const Invoices: NounSchema;
80
- declare const Payments: NounSchema;
81
- declare const Refunds: NounSchema;
82
- declare const ChartOfAccounts: NounSchema;
83
- declare const JournalEntries: NounSchema;
84
- declare const financialNouns: NounSchema[];
85
-
86
- /**
87
- * Communications Domain - Messaging, sequences, and engagement
88
- */
89
-
90
- declare const Channels: NounSchema;
91
- declare const Messages: NounSchema;
92
- declare const Sequences: NounSchema;
93
- declare const Templates: NounSchema;
94
- declare const Posts: NounSchema;
95
- declare const communicationsNouns: NounSchema[];
96
-
97
- /**
98
- * Business Schema Module
99
- *
100
- * Exports the default business schema and utilities for working with
101
- * business definitions.
102
- */
103
-
104
- /**
105
- * The default business schema
106
- *
107
- * This represents a complete business with all standard domains.
108
- * Use this as a base and extend/customize for specific use cases.
109
- */
110
- declare const defaultBusinessSchema: BusinessSchema;
111
- /**
112
- * Get all nouns from a business schema as a flat array
113
- */
114
- declare function getAllNouns(schema: BusinessSchema): NounSchema[];
115
- /**
116
- * Get nouns for a specific domain
117
- */
118
- declare function getDomainNouns(schema: BusinessSchema, domain: BusinessDomain): NounSchema[];
119
- /**
120
- * Find a noun by slug across all domains
121
- */
122
- declare function findNounBySlug(schema: BusinessSchema, slug: string): NounSchema | undefined;
123
- /**
124
- * Get all domain names in a schema
125
- */
126
- declare function getDomains(schema: BusinessSchema): BusinessDomain[];
127
- /**
128
- * Merge two business schemas
129
- *
130
- * The extension schema's nouns override the base schema's nouns
131
- * when they have the same slug.
132
- */
133
- declare function mergeSchemas(base: BusinessSchema, extension: Partial<BusinessSchema>): BusinessSchema;
134
- /**
135
- * Create a minimal business schema with only specified domains
136
- */
137
- declare function createMinimalSchema(domains: BusinessDomain[], options?: {
138
- name?: string;
139
- version?: string;
140
- }): BusinessSchema;
141
- /**
142
- * Validate a business schema
143
- */
144
- declare function validateSchema(schema: BusinessSchema): string[];
145
-
146
- export { Agents, Brands, Businesses, Channels, ChartOfAccounts, Competitors, Contacts, Customers, Deals, Domains, Features, Goals, Invoices, Issues, JournalEntries, Leads, Messages, Metrics, Offers, Orgs, Payments, Posts, Prices, Processes, Products, Projects, Proposals, Quotes, Refunds, Roles, Sequences, ServiceAccounts, Services, Subscriptions, Tasks, Teams, Templates, Users, Workflows, adminNouns, businessNouns, communicationsNouns, createMinimalSchema, defaultBusinessSchema, financialNouns, findNounBySlug, getAllNouns, getDomainNouns, getDomains, marketingNouns, mergeSchemas, productNouns, salesNouns, successNouns, validateSchema, workNouns };