@forumone/throughline-design-system 0.0.0 → 1.0.0-next.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 (122) hide show
  1. package/CHANGELOG.md +180 -0
  2. package/LICENSE +21 -0
  3. package/README.md +21 -0
  4. package/bin/check-block-props.mjs +51 -0
  5. package/bin/stub-styles.mjs +28 -0
  6. package/dist/admin/BlockGuidance.d.ts +13 -0
  7. package/dist/admin/BlockGuidance.d.ts.map +1 -0
  8. package/dist/admin/BlockGuidance.js +13 -0
  9. package/dist/admin/BlockGuidance.js.map +1 -0
  10. package/dist/admin/BlockSummary.d.ts +10 -0
  11. package/dist/admin/BlockSummary.d.ts.map +1 -0
  12. package/dist/admin/BlockSummary.js +73 -0
  13. package/dist/admin/BlockSummary.js.map +1 -0
  14. package/dist/admin/RowSummary.d.ts +15 -0
  15. package/dist/admin/RowSummary.d.ts.map +1 -0
  16. package/dist/admin/RowSummary.js +16 -0
  17. package/dist/admin/RowSummary.js.map +1 -0
  18. package/dist/admin/summary.d.ts +18 -0
  19. package/dist/admin/summary.d.ts.map +1 -0
  20. package/dist/admin/summary.js +48 -0
  21. package/dist/admin/summary.js.map +1 -0
  22. package/dist/altText.d.ts +16 -0
  23. package/dist/altText.d.ts.map +1 -0
  24. package/dist/altText.js +54 -0
  25. package/dist/altText.js.map +1 -0
  26. package/dist/client.d.ts +15 -0
  27. package/dist/client.d.ts.map +1 -0
  28. package/dist/client.js +12 -0
  29. package/dist/client.js.map +1 -0
  30. package/dist/contract/index.d.ts +5 -0
  31. package/dist/contract/index.d.ts.map +1 -0
  32. package/dist/contract/index.js +4 -0
  33. package/dist/contract/index.js.map +1 -0
  34. package/dist/contract/lint.d.ts +38 -0
  35. package/dist/contract/lint.d.ts.map +1 -0
  36. package/dist/contract/lint.js +110 -0
  37. package/dist/contract/lint.js.map +1 -0
  38. package/dist/contract/loader.d.ts +49 -0
  39. package/dist/contract/loader.d.ts.map +1 -0
  40. package/dist/contract/loader.js +95 -0
  41. package/dist/contract/loader.js.map +1 -0
  42. package/dist/contract/manifest.d.ts +454 -0
  43. package/dist/contract/manifest.d.ts.map +1 -0
  44. package/dist/contract/manifest.js +29 -0
  45. package/dist/contract/manifest.js.map +1 -0
  46. package/dist/contract/schema.d.ts +334 -0
  47. package/dist/contract/schema.d.ts.map +1 -0
  48. package/dist/contract/schema.js +224 -0
  49. package/dist/contract/schema.js.map +1 -0
  50. package/dist/generate/blocks.d.ts +79 -0
  51. package/dist/generate/blocks.d.ts.map +1 -0
  52. package/dist/generate/blocks.js +118 -0
  53. package/dist/generate/blocks.js.map +1 -0
  54. package/dist/generate/fields.d.ts +60 -0
  55. package/dist/generate/fields.d.ts.map +1 -0
  56. package/dist/generate/fields.js +478 -0
  57. package/dist/generate/fields.js.map +1 -0
  58. package/dist/generate/guidance.d.ts +5 -0
  59. package/dist/generate/guidance.d.ts.map +1 -0
  60. package/dist/generate/guidance.js +29 -0
  61. package/dist/generate/guidance.js.map +1 -0
  62. package/dist/generate/index.d.ts +13 -0
  63. package/dist/generate/index.d.ts.map +1 -0
  64. package/dist/generate/index.js +9 -0
  65. package/dist/generate/index.js.map +1 -0
  66. package/dist/generate/labels.d.ts +42 -0
  67. package/dist/generate/labels.d.ts.map +1 -0
  68. package/dist/generate/labels.js +226 -0
  69. package/dist/generate/labels.js.map +1 -0
  70. package/dist/generate/layout.d.ts +42 -0
  71. package/dist/generate/layout.d.ts.map +1 -0
  72. package/dist/generate/layout.js +252 -0
  73. package/dist/generate/layout.js.map +1 -0
  74. package/dist/generate/selectOptionSnapshot.d.ts +26 -0
  75. package/dist/generate/selectOptionSnapshot.d.ts.map +1 -0
  76. package/dist/generate/selectOptionSnapshot.js +47 -0
  77. package/dist/generate/selectOptionSnapshot.js.map +1 -0
  78. package/dist/generate/selectOptions.d.ts +64 -0
  79. package/dist/generate/selectOptions.d.ts.map +1 -0
  80. package/dist/generate/selectOptions.js +145 -0
  81. package/dist/generate/selectOptions.js.map +1 -0
  82. package/dist/overrides.d.ts +71 -0
  83. package/dist/overrides.d.ts.map +1 -0
  84. package/dist/overrides.js +16 -0
  85. package/dist/overrides.js.map +1 -0
  86. package/dist/render/RenderBlocks.d.ts +67 -0
  87. package/dist/render/RenderBlocks.d.ts.map +1 -0
  88. package/dist/render/RenderBlocks.js +31 -0
  89. package/dist/render/RenderBlocks.js.map +1 -0
  90. package/dist/render/coerce.d.ts +78 -0
  91. package/dist/render/coerce.d.ts.map +1 -0
  92. package/dist/render/coerce.js +243 -0
  93. package/dist/render/coerce.js.map +1 -0
  94. package/dist/render/index.d.ts +5 -0
  95. package/dist/render/index.d.ts.map +1 -0
  96. package/dist/render/index.js +3 -0
  97. package/dist/render/index.js.map +1 -0
  98. package/dist/testing/checkBlockProps.d.ts +66 -0
  99. package/dist/testing/checkBlockProps.d.ts.map +1 -0
  100. package/dist/testing/checkBlockProps.js +241 -0
  101. package/dist/testing/checkBlockProps.js.map +1 -0
  102. package/dist/testing/checkBlockPropsCli.d.ts +12 -0
  103. package/dist/testing/checkBlockPropsCli.d.ts.map +1 -0
  104. package/dist/testing/checkBlockPropsCli.js +86 -0
  105. package/dist/testing/checkBlockPropsCli.js.map +1 -0
  106. package/dist/testing/contractDefaults.d.ts +21 -0
  107. package/dist/testing/contractDefaults.d.ts.map +1 -0
  108. package/dist/testing/contractDefaults.js +65 -0
  109. package/dist/testing/contractDefaults.js.map +1 -0
  110. package/dist/testing/describeBlockInvariants.d.ts +39 -0
  111. package/dist/testing/describeBlockInvariants.d.ts.map +1 -0
  112. package/dist/testing/describeBlockInvariants.js +71 -0
  113. package/dist/testing/describeBlockInvariants.js.map +1 -0
  114. package/dist/testing/index.d.ts +18 -0
  115. package/dist/testing/index.d.ts.map +1 -0
  116. package/dist/testing/index.js +14 -0
  117. package/dist/testing/index.js.map +1 -0
  118. package/dist/testing/untouchedBlocks.d.ts +48 -0
  119. package/dist/testing/untouchedBlocks.d.ts.map +1 -0
  120. package/dist/testing/untouchedBlocks.js +155 -0
  121. package/dist/testing/untouchedBlocks.js.map +1 -0
  122. package/package.json +108 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"altText.js","sourceRoot":"","sources":["../src/altText.ts"],"names":[],"mappings":"AAEA;;;;;;;;;;;;;;EAcE;AAEF,oEAAoE;AACpE,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,UAAU,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,UAAU,KAAK,CAAA;AAC1D,CAAC;AAED,wFAAwF;AACxF,MAAM,UAAU,eAAe,CAAC,QAAiC;IAC/D,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAA;IACxD,MAAM,KAAK,GAAG,IAAI,GAAG,EAAkB,CAAA;IACvC,KAAK,MAAM,KAAK,IAAI,QAAQ,EAAE,CAAC;QAC7B,IAAI,KAAK,CAAC,IAAI,KAAK,OAAO;YAAE,SAAQ;QACpC,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAA;QACnC,IAAI,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;IAChD,CAAC;IACD,OAAO,KAAK,CAAA;AACd,CAAC;AAED,iEAAiE;AACjE,MAAM,CAAC,MAAM,iBAAiB,GAAG,yDAAyD,CAAA;AAE1F;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAAC,QAAiC;IAC/D,MAAM,IAAI,GAAG,IAAI,GAAG,CAAC,eAAe,CAAC,QAAQ,CAAC,CAAC,MAAM,EAAE,CAAC,CAAA;IACxD,OAAO,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAC1B,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;QAClB,CAAC,CAAC;YACE,GAAG,KAAK;YACR,QAAQ,EAAE,KAAK;YACf,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC5B,CAAC,CAAC,GAAG,KAAK,CAAC,WAAW,IAAI,iBAAiB,EAAE;gBAC7C,CAAC,CAAC,iBAAiB;SACtB;QACH,CAAC,CAAC,KAAK,CACV,CAAA;AACH,CAAC"}
@@ -0,0 +1,15 @@
1
+ /**
2
+ * Client entry point for the admin components the generated blocks reference,
3
+ * as `@forumone/throughline-design-system/client#RowSummary` in
4
+ * Payload's import map.
5
+ *
6
+ * Kept apart from the package root and `./generate`, which run inside
7
+ * `payload.config.ts`, so the config never pulls in `@payloadcms/ui`.
8
+ */
9
+ export { BlockGuidance } from './admin/BlockGuidance.js';
10
+ export type { BlockGuidanceProps } from './admin/BlockGuidance.js';
11
+ export { BlockSummary } from './admin/BlockSummary.js';
12
+ export type { BlockSummaryProps } from './admin/BlockSummary.js';
13
+ export { RowSummary } from './admin/RowSummary.js';
14
+ export type { RowSummaryProps } from './admin/RowSummary.js';
15
+ //# sourceMappingURL=client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AACxD,YAAY,EAAE,kBAAkB,EAAE,MAAM,0BAA0B,CAAA;AAClE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AACtD,YAAY,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAA;AAChE,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAClD,YAAY,EAAE,eAAe,EAAE,MAAM,uBAAuB,CAAA"}
package/dist/client.js ADDED
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Client entry point for the admin components the generated blocks reference,
3
+ * as `@forumone/throughline-design-system/client#RowSummary` in
4
+ * Payload's import map.
5
+ *
6
+ * Kept apart from the package root and `./generate`, which run inside
7
+ * `payload.config.ts`, so the config never pulls in `@payloadcms/ui`.
8
+ */
9
+ export { BlockGuidance } from './admin/BlockGuidance.js';
10
+ export { BlockSummary } from './admin/BlockSummary.js';
11
+ export { RowSummary } from './admin/RowSummary.js';
12
+ //# sourceMappingURL=client.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAExD,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAA;AAEtD,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './schema.js';
2
+ export * from './manifest.js';
3
+ export * from './loader.js';
4
+ export type { LintIssue, LintOptions } from './lint.js';
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,YAAY,EAAE,SAAS,EAAE,WAAW,EAAE,MAAM,WAAW,CAAA"}
@@ -0,0 +1,4 @@
1
+ export * from './schema.js';
2
+ export * from './manifest.js';
3
+ export * from './loader.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/contract/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAA;AAC3B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA"}
@@ -0,0 +1,38 @@
1
+ import type { Manifest } from './manifest.js';
2
+ export interface LintIssue {
3
+ severity: 'error' | 'warning';
4
+ component: string;
5
+ rule: string;
6
+ message: string;
7
+ }
8
+ export interface LintOptions {
9
+ /**
10
+ * Source of truth for Storybook story IDs. If provided, lint verifies
11
+ * every example's `storyId` exists in this set. Omit to skip the check
12
+ * (e.g. in environments that do not have Storybook output available).
13
+ */
14
+ availableStoryIds?: Set<string>;
15
+ /**
16
+ * Source of truth for token names. If provided, lint verifies every
17
+ * token referenced by a component's `tokens.consumes` exists in this set.
18
+ * Defaults to the manifest's own token table when omitted.
19
+ */
20
+ availableTokens?: Set<string>;
21
+ }
22
+ /**
23
+ * Lints a manifest against the contract's internal consistency rules.
24
+ * Returns an array of issues; an empty array means the manifest is clean.
25
+ *
26
+ * Errors describe unambiguous contract violations (unknown component
27
+ * references, unknown tokens). Warnings surface weaker signals that may
28
+ * still be worth addressing.
29
+ */
30
+ export declare function lintManifest(manifest: Manifest, options?: LintOptions): LintIssue[];
31
+ /** Formats lint issues as a multi-line string suitable for CI output. */
32
+ export declare function formatLintIssues(issues: LintIssue[]): string;
33
+ /**
34
+ * Throws when the manifest has any lint errors. Warnings do not throw.
35
+ * Use in CI to fail the build on contract violations.
36
+ */
37
+ export declare function assertManifestClean(manifest: Manifest, options?: LintOptions): void;
38
+ //# sourceMappingURL=lint.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.d.ts","sourceRoot":"","sources":["../../src/contract/lint.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C,MAAM,WAAW,SAAS;IACxB,QAAQ,EAAE,OAAO,GAAG,SAAS,CAAA;IAC7B,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,MAAM,WAAW,WAAW;IAC1B;;;;OAIG;IACH,iBAAiB,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;IAC/B;;;;OAIG;IACH,eAAe,CAAC,EAAE,GAAG,CAAC,MAAM,CAAC,CAAA;CAC9B;AAED;;;;;;;GAOG;AACH,wBAAgB,YAAY,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,GAAE,WAAgB,GAAG,SAAS,EAAE,CAyEvF;AAED,yEAAyE;AACzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,EAAE,GAAG,MAAM,CAwB5D;AAED;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,QAAQ,EAAE,OAAO,CAAC,EAAE,WAAW,GAAG,IAAI,CAMnF"}
@@ -0,0 +1,110 @@
1
+ /**
2
+ * Lints a manifest against the contract's internal consistency rules.
3
+ * Returns an array of issues; an empty array means the manifest is clean.
4
+ *
5
+ * Errors describe unambiguous contract violations (unknown component
6
+ * references, unknown tokens). Warnings surface weaker signals that may
7
+ * still be worth addressing.
8
+ */
9
+ export function lintManifest(manifest, options = {}) {
10
+ const issues = [];
11
+ const componentNames = new Set(Object.keys(manifest.components));
12
+ const tokenNames = options.availableTokens ?? new Set(manifest.tokens.map((t) => t.name));
13
+ const storyIds = options.availableStoryIds;
14
+ for (const [name, component] of Object.entries(manifest.components)) {
15
+ for (const sibling of component.composition.requiredSiblings) {
16
+ if (!componentNames.has(sibling)) {
17
+ issues.push({
18
+ severity: 'error',
19
+ component: name,
20
+ rule: 'composition.requiredSiblings',
21
+ message: `References unknown component "${sibling}"`,
22
+ });
23
+ }
24
+ }
25
+ for (const adjacent of component.composition.forbiddenAdjacent) {
26
+ if (!componentNames.has(adjacent)) {
27
+ issues.push({
28
+ severity: 'error',
29
+ component: name,
30
+ rule: 'composition.forbiddenAdjacent',
31
+ message: `References unknown component "${adjacent}"`,
32
+ });
33
+ }
34
+ }
35
+ for (const token of component.tokens.consumes) {
36
+ if (!tokenNames.has(token)) {
37
+ issues.push({
38
+ severity: 'error',
39
+ component: name,
40
+ rule: 'tokens.consumes',
41
+ message: `References unknown token "${token}"`,
42
+ });
43
+ }
44
+ }
45
+ if (storyIds) {
46
+ for (const example of component.examples) {
47
+ if (!storyIds.has(example.storyId)) {
48
+ issues.push({
49
+ severity: 'error',
50
+ component: name,
51
+ rule: 'examples.storyId',
52
+ message: `Example "${example.label}" references unknown story "${example.storyId}"`,
53
+ });
54
+ }
55
+ }
56
+ }
57
+ if (component.antiExamples.length === 0) {
58
+ issues.push({
59
+ severity: 'warning',
60
+ component: name,
61
+ rule: 'antiExamples.empty',
62
+ message: 'Component has no anti-examples; consider adding at least one',
63
+ });
64
+ }
65
+ if (component.intent.length < 50) {
66
+ issues.push({
67
+ severity: 'warning',
68
+ component: name,
69
+ rule: 'intent.brevity',
70
+ message: 'Intent statement is quite short; consider a more specific description',
71
+ });
72
+ }
73
+ }
74
+ return issues;
75
+ }
76
+ /** Formats lint issues as a multi-line string suitable for CI output. */
77
+ export function formatLintIssues(issues) {
78
+ if (issues.length === 0)
79
+ return 'No issues found.';
80
+ const errors = issues.filter((i) => i.severity === 'error');
81
+ const warnings = issues.filter((i) => i.severity === 'warning');
82
+ const lines = [];
83
+ if (errors.length > 0) {
84
+ lines.push(`Errors (${errors.length}):`);
85
+ for (const issue of errors) {
86
+ lines.push(` [${issue.component}] ${issue.rule}: ${issue.message}`);
87
+ }
88
+ }
89
+ if (warnings.length > 0) {
90
+ if (lines.length > 0)
91
+ lines.push('');
92
+ lines.push(`Warnings (${warnings.length}):`);
93
+ for (const issue of warnings) {
94
+ lines.push(` [${issue.component}] ${issue.rule}: ${issue.message}`);
95
+ }
96
+ }
97
+ return lines.join('\n');
98
+ }
99
+ /**
100
+ * Throws when the manifest has any lint errors. Warnings do not throw.
101
+ * Use in CI to fail the build on contract violations.
102
+ */
103
+ export function assertManifestClean(manifest, options) {
104
+ const issues = lintManifest(manifest, options);
105
+ const errors = issues.filter((i) => i.severity === 'error');
106
+ if (errors.length > 0) {
107
+ throw new Error(`Manifest has errors:\n${formatLintIssues(errors)}`);
108
+ }
109
+ }
110
+ //# sourceMappingURL=lint.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"lint.js","sourceRoot":"","sources":["../../src/contract/lint.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,49 @@
1
+ import { type Manifest } from './manifest.js';
2
+ import type { ComponentContract, ComponentCategory, ComponentGroup } from './schema.js';
3
+ /**
4
+ * A validated, queryable manifest. Returned by {@link loadManifest} and
5
+ * {@link loadManifestFromUrl}. Consumers use the helper methods rather than
6
+ * poking at {@link raw} directly, which lets the implementation evolve.
7
+ */
8
+ export declare class LoadedManifest {
9
+ readonly raw: Manifest;
10
+ constructor(raw: Manifest);
11
+ /** The design system's metadata. */
12
+ get designSystem(): Manifest['designSystem'];
13
+ /** The contract version this manifest satisfies. */
14
+ get contractVersion(): Manifest['contractVersion'];
15
+ /** Full contract for a component by name, or `undefined` if absent. */
16
+ getComponent(name: string): ComponentContract | undefined;
17
+ /** Like {@link getComponent} but throws when the component is missing. */
18
+ requireComponent(name: string): ComponentContract;
19
+ /** Every component name in declaration order. */
20
+ listComponents(): string[];
21
+ /** Every component whose category matches. */
22
+ listByCategory(category: ComponentCategory | string): ComponentContract[];
23
+ /** Every distinct category present, sorted alphabetically. */
24
+ listCategories(): string[];
25
+ /**
26
+ * Every component filed under a shelf. Matches on the resolved group, so a
27
+ * component with no `group` is found by its category.
28
+ */
29
+ listByGroup(group: ComponentGroup | string): ComponentContract[];
30
+ /** Every distinct resolved group present, sorted alphabetically. */
31
+ listGroups(): string[];
32
+ /** Token definition by name, or `undefined` if absent. */
33
+ getToken(name: string): {
34
+ name: string;
35
+ value: string;
36
+ category: string;
37
+ } | undefined;
38
+ }
39
+ /**
40
+ * Loads a manifest from a plain object. Validates against {@link ManifestSchema}
41
+ * and throws on any validation error with a readable, line-by-line message.
42
+ */
43
+ export declare function loadManifest(input: unknown): LoadedManifest;
44
+ /**
45
+ * Fetches a manifest from a URL and loads it. Useful when a design system
46
+ * serves its manifest via HTTP rather than bundling into the consumer.
47
+ */
48
+ export declare function loadManifestFromUrl(url: string, init?: RequestInit): Promise<LoadedManifest>;
49
+ //# sourceMappingURL=loader.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.d.ts","sourceRoot":"","sources":["../../src/contract/loader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAkB,MAAM,eAAe,CAAA;AAE7D,OAAO,KAAK,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,aAAa,CAAA;AAEvF;;;;GAIG;AACH,qBAAa,cAAc;aACG,GAAG,EAAE,QAAQ;gBAAb,GAAG,EAAE,QAAQ;IAEzC,oCAAoC;IACpC,IAAI,YAAY,IAAI,QAAQ,CAAC,cAAc,CAAC,CAE3C;IAED,oDAAoD;IACpD,IAAI,eAAe,IAAI,QAAQ,CAAC,iBAAiB,CAAC,CAEjD;IAED,uEAAuE;IACvE,YAAY,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB,GAAG,SAAS;IAIzD,0EAA0E;IAC1E,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,iBAAiB;IAQjD,iDAAiD;IACjD,cAAc,IAAI,MAAM,EAAE;IAI1B,8CAA8C;IAC9C,cAAc,CAAC,QAAQ,EAAE,iBAAiB,GAAG,MAAM,GAAG,iBAAiB,EAAE;IAIzE,8DAA8D;IAC9D,cAAc,IAAI,MAAM,EAAE;IAQ1B;;;OAGG;IACH,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM,GAAG,iBAAiB,EAAE;IAIhE,oEAAoE;IACpE,UAAU,IAAI,MAAM,EAAE;IAQtB,0DAA0D;IAC1D,QAAQ,CAAC,IAAI,EAAE,MAAM;;;;;CAGtB;AAED;;;GAGG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,cAAc,CAS3D;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CACvC,GAAG,EAAE,MAAM,EACX,IAAI,CAAC,EAAE,WAAW,GACjB,OAAO,CAAC,cAAc,CAAC,CAOzB"}
@@ -0,0 +1,95 @@
1
+ import { ManifestSchema } from './manifest.js';
2
+ import { groupOf } from './schema.js';
3
+ /**
4
+ * A validated, queryable manifest. Returned by {@link loadManifest} and
5
+ * {@link loadManifestFromUrl}. Consumers use the helper methods rather than
6
+ * poking at {@link raw} directly, which lets the implementation evolve.
7
+ */
8
+ export class LoadedManifest {
9
+ raw;
10
+ constructor(raw) {
11
+ this.raw = raw;
12
+ }
13
+ /** The design system's metadata. */
14
+ get designSystem() {
15
+ return this.raw.designSystem;
16
+ }
17
+ /** The contract version this manifest satisfies. */
18
+ get contractVersion() {
19
+ return this.raw.contractVersion;
20
+ }
21
+ /** Full contract for a component by name, or `undefined` if absent. */
22
+ getComponent(name) {
23
+ return this.raw.components[name];
24
+ }
25
+ /** Like {@link getComponent} but throws when the component is missing. */
26
+ requireComponent(name) {
27
+ const component = this.getComponent(name);
28
+ if (!component) {
29
+ throw new Error(`Component "${name}" not found in manifest`);
30
+ }
31
+ return component;
32
+ }
33
+ /** Every component name in declaration order. */
34
+ listComponents() {
35
+ return Object.keys(this.raw.components);
36
+ }
37
+ /** Every component whose category matches. */
38
+ listByCategory(category) {
39
+ return Object.values(this.raw.components).filter((c) => c.category === category);
40
+ }
41
+ /** Every distinct category present, sorted alphabetically. */
42
+ listCategories() {
43
+ const categories = new Set();
44
+ for (const component of Object.values(this.raw.components)) {
45
+ categories.add(component.category);
46
+ }
47
+ return Array.from(categories).sort();
48
+ }
49
+ /**
50
+ * Every component filed under a shelf. Matches on the resolved group, so a
51
+ * component with no `group` is found by its category.
52
+ */
53
+ listByGroup(group) {
54
+ return Object.values(this.raw.components).filter((c) => groupOf(c) === group);
55
+ }
56
+ /** Every distinct resolved group present, sorted alphabetically. */
57
+ listGroups() {
58
+ const groups = new Set();
59
+ for (const component of Object.values(this.raw.components)) {
60
+ groups.add(groupOf(component));
61
+ }
62
+ return Array.from(groups).sort();
63
+ }
64
+ /** Token definition by name, or `undefined` if absent. */
65
+ getToken(name) {
66
+ return this.raw.tokens.find((t) => t.name === name);
67
+ }
68
+ }
69
+ /**
70
+ * Loads a manifest from a plain object. Validates against {@link ManifestSchema}
71
+ * and throws on any validation error with a readable, line-by-line message.
72
+ */
73
+ export function loadManifest(input) {
74
+ const result = ManifestSchema.safeParse(input);
75
+ if (!result.success) {
76
+ const issues = result.error.issues
77
+ .map((i) => ` - ${i.path.join('.') || '(root)'}: ${i.message}`)
78
+ .join('\n');
79
+ throw new Error(`Invalid manifest:\n${issues}`);
80
+ }
81
+ return new LoadedManifest(result.data);
82
+ }
83
+ /**
84
+ * Fetches a manifest from a URL and loads it. Useful when a design system
85
+ * serves its manifest via HTTP rather than bundling into the consumer.
86
+ */
87
+ export async function loadManifestFromUrl(url, init) {
88
+ const response = await fetch(url, init);
89
+ if (!response.ok) {
90
+ throw new Error(`Failed to fetch manifest from ${url}: HTTP ${response.status}`);
91
+ }
92
+ const json = (await response.json());
93
+ return loadManifest(json);
94
+ }
95
+ //# sourceMappingURL=loader.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"loader.js","sourceRoot":"","sources":["../../src/contract/loader.ts"],"names":[],"mappings":"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"}