digital-products 2.0.1

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 (110) hide show
  1. package/.turbo/turbo-build.log +5 -0
  2. package/CHANGELOG.md +9 -0
  3. package/README.md +535 -0
  4. package/dist/api.d.ts +99 -0
  5. package/dist/api.d.ts.map +1 -0
  6. package/dist/api.js +129 -0
  7. package/dist/api.js.map +1 -0
  8. package/dist/app.d.ts +79 -0
  9. package/dist/app.d.ts.map +1 -0
  10. package/dist/app.js +107 -0
  11. package/dist/app.js.map +1 -0
  12. package/dist/content.d.ts +58 -0
  13. package/dist/content.d.ts.map +1 -0
  14. package/dist/content.js +78 -0
  15. package/dist/content.js.map +1 -0
  16. package/dist/data.d.ts +67 -0
  17. package/dist/data.d.ts.map +1 -0
  18. package/dist/data.js +107 -0
  19. package/dist/data.js.map +1 -0
  20. package/dist/dataset.d.ts +32 -0
  21. package/dist/dataset.d.ts.map +1 -0
  22. package/dist/dataset.js +50 -0
  23. package/dist/dataset.js.map +1 -0
  24. package/dist/entities/ai.d.ts +53 -0
  25. package/dist/entities/ai.d.ts.map +1 -0
  26. package/dist/entities/ai.js +859 -0
  27. package/dist/entities/ai.js.map +1 -0
  28. package/dist/entities/content.d.ts +52 -0
  29. package/dist/entities/content.d.ts.map +1 -0
  30. package/dist/entities/content.js +784 -0
  31. package/dist/entities/content.js.map +1 -0
  32. package/dist/entities/index.d.ts +112 -0
  33. package/dist/entities/index.d.ts.map +1 -0
  34. package/dist/entities/index.js +89 -0
  35. package/dist/entities/index.js.map +1 -0
  36. package/dist/entities/interfaces.d.ts +67 -0
  37. package/dist/entities/interfaces.d.ts.map +1 -0
  38. package/dist/entities/interfaces.js +930 -0
  39. package/dist/entities/interfaces.js.map +1 -0
  40. package/dist/entities/lifecycle.d.ts +51 -0
  41. package/dist/entities/lifecycle.d.ts.map +1 -0
  42. package/dist/entities/lifecycle.js +804 -0
  43. package/dist/entities/lifecycle.js.map +1 -0
  44. package/dist/entities/products.d.ts +53 -0
  45. package/dist/entities/products.d.ts.map +1 -0
  46. package/dist/entities/products.js +798 -0
  47. package/dist/entities/products.js.map +1 -0
  48. package/dist/entities/web.d.ts +44 -0
  49. package/dist/entities/web.d.ts.map +1 -0
  50. package/dist/entities/web.js +658 -0
  51. package/dist/entities/web.js.map +1 -0
  52. package/dist/index.d.ts +29 -0
  53. package/dist/index.d.ts.map +1 -0
  54. package/dist/index.js +36 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/mcp.d.ts +101 -0
  57. package/dist/mcp.d.ts.map +1 -0
  58. package/dist/mcp.js +140 -0
  59. package/dist/mcp.js.map +1 -0
  60. package/dist/product.d.ts +37 -0
  61. package/dist/product.d.ts.map +1 -0
  62. package/dist/product.js +54 -0
  63. package/dist/product.js.map +1 -0
  64. package/dist/registry.d.ts +9 -0
  65. package/dist/registry.d.ts.map +1 -0
  66. package/dist/registry.js +32 -0
  67. package/dist/registry.js.map +1 -0
  68. package/dist/sdk.d.ts +99 -0
  69. package/dist/sdk.d.ts.map +1 -0
  70. package/dist/sdk.js +128 -0
  71. package/dist/sdk.js.map +1 -0
  72. package/dist/site.d.ts +85 -0
  73. package/dist/site.d.ts.map +1 -0
  74. package/dist/site.js +113 -0
  75. package/dist/site.js.map +1 -0
  76. package/dist/types.d.ts +528 -0
  77. package/dist/types.d.ts.map +1 -0
  78. package/dist/types.js +5 -0
  79. package/dist/types.js.map +1 -0
  80. package/example.ts +236 -0
  81. package/package.json +35 -0
  82. package/src/api.ts +140 -0
  83. package/src/app.ts +117 -0
  84. package/src/content.ts +82 -0
  85. package/src/data.ts +129 -0
  86. package/src/dataset.ts +53 -0
  87. package/src/entities/ai.ts +932 -0
  88. package/src/entities/content.ts +851 -0
  89. package/src/entities/index.ts +156 -0
  90. package/src/entities/interfaces.ts +1017 -0
  91. package/src/entities/lifecycle.ts +872 -0
  92. package/src/entities/products.ts +867 -0
  93. package/src/entities/web.ts +719 -0
  94. package/src/index.ts +55 -0
  95. package/src/mcp.ts +163 -0
  96. package/src/product.ts +59 -0
  97. package/src/registry.ts +41 -0
  98. package/src/sdk.ts +148 -0
  99. package/src/site.ts +127 -0
  100. package/src/types.ts +558 -0
  101. package/test/api.test.ts +247 -0
  102. package/test/app.test.ts +220 -0
  103. package/test/content.test.ts +171 -0
  104. package/test/data.test.ts +201 -0
  105. package/test/dataset.test.ts +181 -0
  106. package/test/mcp.test.ts +230 -0
  107. package/test/product.test.ts +200 -0
  108. package/test/sdk.test.ts +236 -0
  109. package/test/site.test.ts +245 -0
  110. package/tsconfig.json +9 -0
@@ -0,0 +1,784 @@
1
+ /**
2
+ * Content Entity Types (Nouns)
3
+ *
4
+ * Content and data products: ContentProduct, DataProduct, Dataset, Documentation, Template
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ // =============================================================================
9
+ // ContentProduct
10
+ // =============================================================================
11
+ /**
12
+ * ContentProduct entity
13
+ *
14
+ * Text/media content as a product.
15
+ */
16
+ export const ContentProduct = {
17
+ singular: 'content-product',
18
+ plural: 'content-products',
19
+ description: 'A content-based digital product',
20
+ properties: {
21
+ // Identity
22
+ name: {
23
+ type: 'string',
24
+ description: 'Content product name',
25
+ },
26
+ slug: {
27
+ type: 'string',
28
+ optional: true,
29
+ description: 'URL-friendly identifier',
30
+ },
31
+ description: {
32
+ type: 'string',
33
+ optional: true,
34
+ description: 'Product description',
35
+ },
36
+ // Classification
37
+ type: {
38
+ type: 'string',
39
+ description: 'Content type',
40
+ examples: ['course', 'book', 'newsletter', 'podcast', 'video-series', 'documentation', 'blog'],
41
+ },
42
+ format: {
43
+ type: 'string',
44
+ description: 'Primary format',
45
+ examples: ['text', 'video', 'audio', 'interactive', 'mixed'],
46
+ },
47
+ category: {
48
+ type: 'string',
49
+ optional: true,
50
+ description: 'Content category',
51
+ },
52
+ // Structure
53
+ contentFormat: {
54
+ type: 'string',
55
+ optional: true,
56
+ description: 'File format',
57
+ examples: ['markdown', 'mdx', 'html', 'json', 'yaml', 'pdf', 'epub'],
58
+ },
59
+ schema: {
60
+ type: 'json',
61
+ optional: true,
62
+ description: 'Content schema for structured content',
63
+ },
64
+ frontmatterSchema: {
65
+ type: 'json',
66
+ optional: true,
67
+ description: 'Frontmatter schema',
68
+ },
69
+ // Publishing
70
+ publishingModel: {
71
+ type: 'string',
72
+ optional: true,
73
+ description: 'Publishing model',
74
+ examples: ['one-time', 'subscription', 'freemium', 'drip', 'cohort'],
75
+ },
76
+ updateFrequency: {
77
+ type: 'string',
78
+ optional: true,
79
+ description: 'Update frequency',
80
+ examples: ['one-time', 'daily', 'weekly', 'monthly', 'on-demand'],
81
+ },
82
+ // Access
83
+ accessModel: {
84
+ type: 'string',
85
+ optional: true,
86
+ description: 'Access model',
87
+ examples: ['free', 'paid', 'subscription', 'gated', 'preview'],
88
+ },
89
+ previewPercent: {
90
+ type: 'number',
91
+ optional: true,
92
+ description: 'Percentage available for preview',
93
+ },
94
+ // Metrics
95
+ itemCount: {
96
+ type: 'number',
97
+ optional: true,
98
+ description: 'Number of content items',
99
+ },
100
+ totalDuration: {
101
+ type: 'number',
102
+ optional: true,
103
+ description: 'Total duration in minutes (for video/audio)',
104
+ },
105
+ wordCount: {
106
+ type: 'number',
107
+ optional: true,
108
+ description: 'Total word count',
109
+ },
110
+ // Status
111
+ status: {
112
+ type: 'string',
113
+ description: 'Product status',
114
+ examples: ['draft', 'production', 'published', 'archived'],
115
+ },
116
+ },
117
+ relationships: {
118
+ product: {
119
+ type: 'DigitalProduct',
120
+ description: 'Parent product',
121
+ },
122
+ items: {
123
+ type: 'ContentItem[]',
124
+ description: 'Content items',
125
+ },
126
+ categories: {
127
+ type: 'Category[]',
128
+ description: 'Content categories',
129
+ },
130
+ authors: {
131
+ type: 'Author[]',
132
+ description: 'Content authors',
133
+ },
134
+ },
135
+ actions: [
136
+ 'create',
137
+ 'update',
138
+ 'addItem',
139
+ 'removeItem',
140
+ 'publish',
141
+ 'unpublish',
142
+ 'archive',
143
+ ],
144
+ events: [
145
+ 'created',
146
+ 'updated',
147
+ 'itemAdded',
148
+ 'itemRemoved',
149
+ 'published',
150
+ 'unpublished',
151
+ 'archived',
152
+ ],
153
+ };
154
+ // =============================================================================
155
+ // DataProduct
156
+ // =============================================================================
157
+ /**
158
+ * DataProduct entity
159
+ *
160
+ * Structured data as a product.
161
+ */
162
+ export const DataProduct = {
163
+ singular: 'data-product',
164
+ plural: 'data-products',
165
+ description: 'A data-based digital product',
166
+ properties: {
167
+ // Identity
168
+ name: {
169
+ type: 'string',
170
+ description: 'Data product name',
171
+ },
172
+ slug: {
173
+ type: 'string',
174
+ optional: true,
175
+ description: 'URL-friendly identifier',
176
+ },
177
+ description: {
178
+ type: 'string',
179
+ optional: true,
180
+ description: 'Product description',
181
+ },
182
+ // Classification
183
+ type: {
184
+ type: 'string',
185
+ description: 'Data product type',
186
+ examples: ['raw', 'derived', 'aggregated', 'enriched', 'curated', 'synthetic'],
187
+ },
188
+ domain: {
189
+ type: 'string',
190
+ optional: true,
191
+ description: 'Data domain',
192
+ },
193
+ // Schema
194
+ schema: {
195
+ type: 'json',
196
+ description: 'Data schema',
197
+ },
198
+ format: {
199
+ type: 'string',
200
+ optional: true,
201
+ description: 'Data format',
202
+ examples: ['json', 'csv', 'parquet', 'avro', 'protobuf', 'arrow'],
203
+ },
204
+ // Storage
205
+ storageType: {
206
+ type: 'string',
207
+ optional: true,
208
+ description: 'Storage backend',
209
+ examples: ['postgres', 'mysql', 'mongo', 'clickhouse', 's3', 'bigquery', 'snowflake'],
210
+ },
211
+ sizeBytes: {
212
+ type: 'number',
213
+ optional: true,
214
+ description: 'Data size in bytes',
215
+ },
216
+ recordCount: {
217
+ type: 'number',
218
+ optional: true,
219
+ description: 'Number of records',
220
+ },
221
+ // Quality
222
+ qualityScore: {
223
+ type: 'number',
224
+ optional: true,
225
+ description: 'Data quality score (0-100)',
226
+ },
227
+ freshness: {
228
+ type: 'string',
229
+ optional: true,
230
+ description: 'Data freshness',
231
+ examples: ['realtime', 'hourly', 'daily', 'weekly', 'static'],
232
+ },
233
+ lastUpdatedAt: {
234
+ type: 'date',
235
+ optional: true,
236
+ description: 'Last data update',
237
+ },
238
+ // Access
239
+ accessMethod: {
240
+ type: 'string',
241
+ optional: true,
242
+ description: 'Access method',
243
+ examples: ['api', 'download', 'stream', 'query', 'embedded'],
244
+ },
245
+ apiEndpoint: {
246
+ type: 'string',
247
+ optional: true,
248
+ description: 'API endpoint for access',
249
+ },
250
+ // Governance
251
+ owner: {
252
+ type: 'string',
253
+ optional: true,
254
+ description: 'Data owner',
255
+ },
256
+ classification: {
257
+ type: 'string',
258
+ optional: true,
259
+ description: 'Data classification',
260
+ examples: ['public', 'internal', 'confidential', 'restricted', 'pii'],
261
+ },
262
+ retentionDays: {
263
+ type: 'number',
264
+ optional: true,
265
+ description: 'Data retention period in days',
266
+ },
267
+ // Status
268
+ status: {
269
+ type: 'string',
270
+ description: 'Product status',
271
+ examples: ['draft', 'active', 'deprecated', 'archived'],
272
+ },
273
+ },
274
+ relationships: {
275
+ product: {
276
+ type: 'DigitalProduct',
277
+ description: 'Parent product',
278
+ },
279
+ datasets: {
280
+ type: 'Dataset[]',
281
+ description: 'Associated datasets',
282
+ },
283
+ api: {
284
+ type: 'API',
285
+ required: false,
286
+ description: 'Access API',
287
+ },
288
+ lineage: {
289
+ type: 'DataProduct[]',
290
+ description: 'Source data products',
291
+ },
292
+ },
293
+ actions: [
294
+ 'create',
295
+ 'update',
296
+ 'ingest',
297
+ 'transform',
298
+ 'publish',
299
+ 'unpublish',
300
+ 'deprecate',
301
+ 'archive',
302
+ ],
303
+ events: [
304
+ 'created',
305
+ 'updated',
306
+ 'ingested',
307
+ 'transformed',
308
+ 'published',
309
+ 'unpublished',
310
+ 'deprecated',
311
+ 'archived',
312
+ ],
313
+ };
314
+ // =============================================================================
315
+ // Dataset
316
+ // =============================================================================
317
+ /**
318
+ * Dataset entity
319
+ *
320
+ * Curated data collection.
321
+ */
322
+ export const Dataset = {
323
+ singular: 'dataset',
324
+ plural: 'datasets',
325
+ description: 'A curated collection of data',
326
+ properties: {
327
+ // Identity
328
+ name: {
329
+ type: 'string',
330
+ description: 'Dataset name',
331
+ },
332
+ slug: {
333
+ type: 'string',
334
+ optional: true,
335
+ description: 'URL-friendly identifier',
336
+ },
337
+ description: {
338
+ type: 'string',
339
+ optional: true,
340
+ description: 'Dataset description',
341
+ },
342
+ // Schema
343
+ schema: {
344
+ type: 'json',
345
+ description: 'Dataset schema',
346
+ },
347
+ format: {
348
+ type: 'string',
349
+ description: 'Data format',
350
+ examples: ['json', 'jsonl', 'csv', 'parquet', 'arrow', 'avro'],
351
+ },
352
+ // Size
353
+ recordCount: {
354
+ type: 'number',
355
+ optional: true,
356
+ description: 'Number of records',
357
+ },
358
+ sizeBytes: {
359
+ type: 'number',
360
+ optional: true,
361
+ description: 'Size in bytes',
362
+ },
363
+ columnCount: {
364
+ type: 'number',
365
+ optional: true,
366
+ description: 'Number of columns/fields',
367
+ },
368
+ // Source
369
+ source: {
370
+ type: 'string',
371
+ optional: true,
372
+ description: 'Data source',
373
+ },
374
+ sourceUrl: {
375
+ type: 'string',
376
+ optional: true,
377
+ description: 'Source URL',
378
+ },
379
+ collectionMethod: {
380
+ type: 'string',
381
+ optional: true,
382
+ description: 'How data was collected',
383
+ examples: ['scraped', 'api', 'manual', 'generated', 'aggregated'],
384
+ },
385
+ // Temporal
386
+ startDate: {
387
+ type: 'date',
388
+ optional: true,
389
+ description: 'Data start date',
390
+ },
391
+ endDate: {
392
+ type: 'date',
393
+ optional: true,
394
+ description: 'Data end date',
395
+ },
396
+ updateFrequency: {
397
+ type: 'string',
398
+ optional: true,
399
+ description: 'Update frequency',
400
+ examples: ['static', 'daily', 'weekly', 'monthly', 'realtime'],
401
+ },
402
+ // License
403
+ license: {
404
+ type: 'string',
405
+ optional: true,
406
+ description: 'Data license',
407
+ examples: ['mit', 'cc-by', 'cc-by-sa', 'cc0', 'proprietary', 'custom'],
408
+ },
409
+ usageRestrictions: {
410
+ type: 'string',
411
+ array: true,
412
+ optional: true,
413
+ description: 'Usage restrictions',
414
+ },
415
+ // Distribution
416
+ downloadUrl: {
417
+ type: 'string',
418
+ optional: true,
419
+ description: 'Download URL',
420
+ },
421
+ downloadFormats: {
422
+ type: 'string',
423
+ array: true,
424
+ optional: true,
425
+ description: 'Available download formats',
426
+ },
427
+ // Status
428
+ status: {
429
+ type: 'string',
430
+ description: 'Dataset status',
431
+ examples: ['draft', 'published', 'deprecated', 'archived'],
432
+ },
433
+ version: {
434
+ type: 'string',
435
+ optional: true,
436
+ description: 'Dataset version',
437
+ },
438
+ },
439
+ relationships: {
440
+ dataProduct: {
441
+ type: 'DataProduct',
442
+ required: false,
443
+ description: 'Parent data product',
444
+ },
445
+ versions: {
446
+ type: 'DatasetVersion[]',
447
+ description: 'Dataset versions',
448
+ },
449
+ },
450
+ actions: [
451
+ 'create',
452
+ 'update',
453
+ 'addRecords',
454
+ 'removeRecords',
455
+ 'publish',
456
+ 'version',
457
+ 'deprecate',
458
+ 'archive',
459
+ ],
460
+ events: [
461
+ 'created',
462
+ 'updated',
463
+ 'recordsAdded',
464
+ 'recordsRemoved',
465
+ 'published',
466
+ 'versioned',
467
+ 'deprecated',
468
+ 'archived',
469
+ ],
470
+ };
471
+ // =============================================================================
472
+ // Documentation
473
+ // =============================================================================
474
+ /**
475
+ * Documentation entity
476
+ *
477
+ * Technical documentation product.
478
+ */
479
+ export const Documentation = {
480
+ singular: 'documentation',
481
+ plural: 'documentations',
482
+ description: 'Technical documentation for a product or API',
483
+ properties: {
484
+ // Identity
485
+ name: {
486
+ type: 'string',
487
+ description: 'Documentation name',
488
+ },
489
+ slug: {
490
+ type: 'string',
491
+ optional: true,
492
+ description: 'URL-friendly identifier',
493
+ },
494
+ description: {
495
+ type: 'string',
496
+ optional: true,
497
+ description: 'Documentation description',
498
+ },
499
+ // Classification
500
+ type: {
501
+ type: 'string',
502
+ description: 'Documentation type',
503
+ examples: ['api', 'guide', 'reference', 'tutorial', 'howto', 'explanation', 'changelog'],
504
+ },
505
+ audience: {
506
+ type: 'string',
507
+ optional: true,
508
+ description: 'Target audience',
509
+ examples: ['developers', 'users', 'admins', 'everyone'],
510
+ },
511
+ // Structure
512
+ format: {
513
+ type: 'string',
514
+ description: 'Content format',
515
+ examples: ['markdown', 'mdx', 'rst', 'html', 'openapi'],
516
+ },
517
+ generator: {
518
+ type: 'string',
519
+ optional: true,
520
+ description: 'Documentation generator',
521
+ examples: ['fumadocs', 'docusaurus', 'mintlify', 'readme', 'gitbook', 'custom'],
522
+ },
523
+ sourceDir: {
524
+ type: 'string',
525
+ optional: true,
526
+ description: 'Source content directory',
527
+ },
528
+ // Hosting
529
+ url: {
530
+ type: 'string',
531
+ optional: true,
532
+ description: 'Documentation URL',
533
+ },
534
+ customDomain: {
535
+ type: 'string',
536
+ optional: true,
537
+ description: 'Custom domain',
538
+ },
539
+ // Features
540
+ searchEnabled: {
541
+ type: 'boolean',
542
+ optional: true,
543
+ description: 'Search functionality enabled',
544
+ },
545
+ versioned: {
546
+ type: 'boolean',
547
+ optional: true,
548
+ description: 'Multi-version support',
549
+ },
550
+ i18n: {
551
+ type: 'boolean',
552
+ optional: true,
553
+ description: 'Internationalization support',
554
+ },
555
+ languages: {
556
+ type: 'string',
557
+ array: true,
558
+ optional: true,
559
+ description: 'Supported languages',
560
+ },
561
+ // Metrics
562
+ pageCount: {
563
+ type: 'number',
564
+ optional: true,
565
+ description: 'Number of pages',
566
+ },
567
+ lastUpdatedAt: {
568
+ type: 'date',
569
+ optional: true,
570
+ description: 'Last content update',
571
+ },
572
+ // Status
573
+ status: {
574
+ type: 'string',
575
+ description: 'Documentation status',
576
+ examples: ['draft', 'published', 'archived'],
577
+ },
578
+ version: {
579
+ type: 'string',
580
+ optional: true,
581
+ description: 'Documentation version',
582
+ },
583
+ },
584
+ relationships: {
585
+ product: {
586
+ type: 'DigitalProduct',
587
+ required: false,
588
+ description: 'Documented product',
589
+ },
590
+ api: {
591
+ type: 'API',
592
+ required: false,
593
+ description: 'Documented API',
594
+ },
595
+ pages: {
596
+ type: 'DocPage[]',
597
+ description: 'Documentation pages',
598
+ },
599
+ },
600
+ actions: [
601
+ 'create',
602
+ 'update',
603
+ 'addPage',
604
+ 'removePage',
605
+ 'publish',
606
+ 'version',
607
+ 'archive',
608
+ ],
609
+ events: [
610
+ 'created',
611
+ 'updated',
612
+ 'pageAdded',
613
+ 'pageRemoved',
614
+ 'published',
615
+ 'versioned',
616
+ 'archived',
617
+ ],
618
+ };
619
+ // =============================================================================
620
+ // Template
621
+ // =============================================================================
622
+ /**
623
+ * Template entity
624
+ *
625
+ * Reusable template or starter.
626
+ */
627
+ export const Template = {
628
+ singular: 'template',
629
+ plural: 'templates',
630
+ description: 'A reusable template or starter project',
631
+ properties: {
632
+ // Identity
633
+ name: {
634
+ type: 'string',
635
+ description: 'Template name',
636
+ },
637
+ slug: {
638
+ type: 'string',
639
+ optional: true,
640
+ description: 'URL-friendly identifier',
641
+ },
642
+ description: {
643
+ type: 'string',
644
+ optional: true,
645
+ description: 'Template description',
646
+ },
647
+ // Classification
648
+ type: {
649
+ type: 'string',
650
+ description: 'Template type',
651
+ examples: ['starter', 'boilerplate', 'scaffold', 'example', 'demo'],
652
+ },
653
+ category: {
654
+ type: 'string',
655
+ optional: true,
656
+ description: 'Template category',
657
+ },
658
+ tags: {
659
+ type: 'string',
660
+ array: true,
661
+ optional: true,
662
+ description: 'Template tags',
663
+ },
664
+ // Technology
665
+ framework: {
666
+ type: 'string',
667
+ optional: true,
668
+ description: 'Primary framework',
669
+ },
670
+ language: {
671
+ type: 'string',
672
+ optional: true,
673
+ description: 'Primary language',
674
+ },
675
+ stack: {
676
+ type: 'string',
677
+ array: true,
678
+ optional: true,
679
+ description: 'Technology stack',
680
+ },
681
+ // Source
682
+ repositoryUrl: {
683
+ type: 'string',
684
+ optional: true,
685
+ description: 'Source repository URL',
686
+ },
687
+ branch: {
688
+ type: 'string',
689
+ optional: true,
690
+ description: 'Git branch',
691
+ },
692
+ // Installation
693
+ installCommand: {
694
+ type: 'string',
695
+ optional: true,
696
+ description: 'Installation command',
697
+ },
698
+ scaffoldTool: {
699
+ type: 'string',
700
+ optional: true,
701
+ description: 'Scaffolding tool',
702
+ examples: ['create-next-app', 'degit', 'tiged', 'custom'],
703
+ },
704
+ // Configuration
705
+ configurable: {
706
+ type: 'boolean',
707
+ optional: true,
708
+ description: 'Has configuration options',
709
+ },
710
+ configSchema: {
711
+ type: 'json',
712
+ optional: true,
713
+ description: 'Configuration schema',
714
+ },
715
+ // Metrics
716
+ useCount: {
717
+ type: 'number',
718
+ optional: true,
719
+ description: 'Number of uses/clones',
720
+ },
721
+ starCount: {
722
+ type: 'number',
723
+ optional: true,
724
+ description: 'GitHub stars',
725
+ },
726
+ // Status
727
+ status: {
728
+ type: 'string',
729
+ description: 'Template status',
730
+ examples: ['draft', 'published', 'deprecated', 'archived'],
731
+ },
732
+ version: {
733
+ type: 'string',
734
+ optional: true,
735
+ description: 'Template version',
736
+ },
737
+ },
738
+ relationships: {
739
+ product: {
740
+ type: 'DigitalProduct',
741
+ required: false,
742
+ description: 'Parent product',
743
+ },
744
+ examples: {
745
+ type: 'Example[]',
746
+ description: 'Usage examples',
747
+ },
748
+ },
749
+ actions: [
750
+ 'create',
751
+ 'update',
752
+ 'publish',
753
+ 'clone',
754
+ 'fork',
755
+ 'deprecate',
756
+ 'archive',
757
+ ],
758
+ events: [
759
+ 'created',
760
+ 'updated',
761
+ 'published',
762
+ 'cloned',
763
+ 'forked',
764
+ 'deprecated',
765
+ 'archived',
766
+ ],
767
+ };
768
+ // =============================================================================
769
+ // Exports
770
+ // =============================================================================
771
+ export const ContentEntities = {
772
+ ContentProduct,
773
+ DataProduct,
774
+ Dataset,
775
+ Documentation,
776
+ Template,
777
+ };
778
+ export const ContentCategories = {
779
+ content: ['ContentProduct'],
780
+ data: ['DataProduct', 'Dataset'],
781
+ docs: ['Documentation'],
782
+ templates: ['Template'],
783
+ };
784
+ //# sourceMappingURL=content.js.map