@ouispec/cli 0.1.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 (51) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +112 -0
  3. package/dist/analyze.d.ts +282 -0
  4. package/dist/analyze.d.ts.map +1 -0
  5. package/dist/analyze.js +1421 -0
  6. package/dist/analyze.js.map +1 -0
  7. package/dist/assemble.d.ts +50 -0
  8. package/dist/assemble.d.ts.map +1 -0
  9. package/dist/assemble.js +555 -0
  10. package/dist/assemble.js.map +1 -0
  11. package/dist/cli.d.ts +12 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +54 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/config.d.ts +54 -0
  16. package/dist/config.d.ts.map +1 -0
  17. package/dist/config.js +126 -0
  18. package/dist/config.js.map +1 -0
  19. package/dist/contract.d.ts +10 -0
  20. package/dist/contract.d.ts.map +1 -0
  21. package/dist/contract.js +15 -0
  22. package/dist/contract.js.map +1 -0
  23. package/dist/generate.d.ts +49 -0
  24. package/dist/generate.d.ts.map +1 -0
  25. package/dist/generate.js +178 -0
  26. package/dist/generate.js.map +1 -0
  27. package/dist/index.d.ts +9 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +8 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/inputs.d.ts +134 -0
  32. package/dist/inputs.d.ts.map +1 -0
  33. package/dist/inputs.js +705 -0
  34. package/dist/inputs.js.map +1 -0
  35. package/dist/knowledge.d.ts +19 -0
  36. package/dist/knowledge.d.ts.map +1 -0
  37. package/dist/knowledge.js +366 -0
  38. package/dist/knowledge.js.map +1 -0
  39. package/dist/program.d.ts +60 -0
  40. package/dist/program.d.ts.map +1 -0
  41. package/dist/program.js +302 -0
  42. package/dist/program.js.map +1 -0
  43. package/dist/recipes.d.ts +17 -0
  44. package/dist/recipes.d.ts.map +1 -0
  45. package/dist/recipes.js +48 -0
  46. package/dist/recipes.js.map +1 -0
  47. package/dist/tier2.d.ts +74 -0
  48. package/dist/tier2.d.ts.map +1 -0
  49. package/dist/tier2.js +303 -0
  50. package/dist/tier2.js.map +1 -0
  51. package/package.json +62 -0
@@ -0,0 +1,302 @@
1
+ /**
2
+ * The app's source as the TypeScript compiler sees it, and what can be read
3
+ * from it without running it: literals, constants, JSX text.
4
+ */
5
+ import { dirname, relative } from 'node:path';
6
+ import ts from 'typescript';
7
+ /**
8
+ * The app's program. `overlay` holds files the generator is about to emit (a
9
+ * tier 2 bound module), by absolute path: the program reads them as written
10
+ * now, not as they are on disk, so a page's imports of them resolve and type
11
+ * against the output of this run, in `--check` too.
12
+ */
13
+ export function loadSource(root, tsconfig, rootNames, overlay = new Map()) {
14
+ const read = ts.readConfigFile(tsconfig, ts.sys.readFile);
15
+ if (read.error)
16
+ throw new Error(ts.flattenDiagnosticMessageText(read.error.messageText, '\n'));
17
+ const parsed = ts.parseJsonConfigFileContent(read.config, ts.sys, dirname(tsconfig));
18
+ const options = { ...parsed.options, noEmit: true };
19
+ const host = ts.createCompilerHost(options);
20
+ if (overlay.size) {
21
+ const dirs = new Set([...overlay.keys()].map(f => dirname(f)));
22
+ const { fileExists, readFile, getSourceFile, directoryExists } = host;
23
+ host.fileExists = file => overlay.has(file) || fileExists.call(host, file);
24
+ host.readFile = file => overlay.get(file) ?? readFile.call(host, file);
25
+ host.directoryExists = dir => dirs.has(dir) || (directoryExists ? directoryExists.call(host, dir) : ts.sys.directoryExists(dir));
26
+ host.getSourceFile = (file, languageVersion, onError, shouldCreate) => {
27
+ const text = overlay.get(file);
28
+ return text !== undefined
29
+ ? ts.createSourceFile(file, text, languageVersion, true)
30
+ : getSourceFile.call(host, file, languageVersion, onError, shouldCreate);
31
+ };
32
+ }
33
+ const program = ts.createProgram({
34
+ rootNames: [...(rootNames ?? parsed.fileNames), ...[...overlay.keys()].filter(f => /\.[cm]?tsx?$/.test(f))],
35
+ options,
36
+ projectReferences: parsed.projectReferences,
37
+ host,
38
+ });
39
+ const checker = program.getTypeChecker();
40
+ const src = `${root}/`;
41
+ return {
42
+ program,
43
+ checker,
44
+ root,
45
+ isAppFile: file => !file.isDeclarationFile && file.fileName.startsWith(src) && !file.fileName.includes('/node_modules/'),
46
+ rel: file => relative(root, typeof file === 'string' ? file : file.fileName),
47
+ };
48
+ }
49
+ /** A value that cannot be known without running the app. */
50
+ export const UNKNOWN = Symbol('unknown');
51
+ /** Strip `as`, `satisfies`, `!` and parentheses. */
52
+ export function unwrap(expr) {
53
+ let e = expr;
54
+ while (ts.isParenthesizedExpression(e) ||
55
+ ts.isAsExpression(e) ||
56
+ ts.isSatisfiesExpression(e) ||
57
+ ts.isNonNullExpression(e) ||
58
+ ts.isTypeAssertionExpression(e)) {
59
+ e = e.expression;
60
+ }
61
+ return e;
62
+ }
63
+ /** The declaration a symbol finally stands for, through imports and re-exports. */
64
+ export function resolveSymbol(checker, node) {
65
+ let symbol = checker.getSymbolAtLocation(node);
66
+ if (symbol && symbol.flags & ts.SymbolFlags.Alias)
67
+ symbol = checker.getAliasedSymbol(symbol);
68
+ return symbol;
69
+ }
70
+ /** The initializer of the constant an identifier names, if it is one. */
71
+ export function constInitializer(checker, id) {
72
+ const symbol = resolveSymbol(checker, id);
73
+ const decl = symbol?.valueDeclaration ?? symbol?.declarations?.[0];
74
+ if (decl && ts.isVariableDeclaration(decl) && decl.initializer) {
75
+ const list = decl.parent;
76
+ if (ts.isVariableDeclarationList(list) && list.flags & ts.NodeFlags.Const)
77
+ return decl.initializer;
78
+ }
79
+ return undefined;
80
+ }
81
+ /** Arithmetic on numbers the evaluator reads, other than `+` (which also joins text). */
82
+ const ARITHMETIC = new Map([
83
+ [ts.SyntaxKind.AsteriskToken, (a, b) => a * b],
84
+ [ts.SyntaxKind.MinusToken, (a, b) => a - b],
85
+ [ts.SyntaxKind.SlashToken, (a, b) => a / b],
86
+ ]);
87
+ /**
88
+ * The value an expression has without running anything: literals, arrays and
89
+ * objects of them, constants (imported ones too), properties of constant
90
+ * objects, arithmetic on known numbers, and strings built only from those — a template literal or a `+`
91
+ * whose every part is itself known. Anything else, a call above all, is
92
+ * `UNKNOWN` (inside objects and arrays too, so a partly-known value keeps what
93
+ * is known). A text written once as a constant can so be a binding's
94
+ * description without being copied into it.
95
+ */
96
+ export function evaluate(checker, expr, depth = 0) {
97
+ // Deep enough for a text built from constants built from constants.
98
+ if (!expr || depth > 16)
99
+ return UNKNOWN;
100
+ const e = unwrap(expr);
101
+ if (ts.isStringLiteral(e) || ts.isNoSubstitutionTemplateLiteral(e))
102
+ return e.text;
103
+ if (ts.isNumericLiteral(e))
104
+ return Number(e.text);
105
+ if (e.kind === ts.SyntaxKind.TrueKeyword)
106
+ return true;
107
+ if (e.kind === ts.SyntaxKind.FalseKeyword)
108
+ return false;
109
+ if (e.kind === ts.SyntaxKind.NullKeyword)
110
+ return null;
111
+ if (ts.isIdentifier(e) && e.text === 'undefined')
112
+ return undefined;
113
+ if (ts.isPrefixUnaryExpression(e) && e.operator === ts.SyntaxKind.MinusToken) {
114
+ const v = evaluate(checker, e.operand, depth + 1);
115
+ return typeof v === 'number' ? -v : UNKNOWN;
116
+ }
117
+ if (ts.isArrayLiteralExpression(e)) {
118
+ const out = [];
119
+ for (const el of e.elements) {
120
+ if (ts.isSpreadElement(el)) {
121
+ const spread = evaluate(checker, el.expression, depth + 1);
122
+ if (Array.isArray(spread))
123
+ out.push(...spread);
124
+ else
125
+ return UNKNOWN;
126
+ }
127
+ else {
128
+ out.push(evaluate(checker, el, depth + 1));
129
+ }
130
+ }
131
+ return out;
132
+ }
133
+ if (ts.isObjectLiteralExpression(e)) {
134
+ const out = {};
135
+ for (const prop of e.properties) {
136
+ if (ts.isPropertyAssignment(prop)) {
137
+ const name = propertyName(prop.name);
138
+ if (name !== null)
139
+ out[name] = evaluate(checker, prop.initializer, depth + 1);
140
+ }
141
+ else if (ts.isShorthandPropertyAssignment(prop)) {
142
+ out[prop.name.text] = evaluate(checker, prop.name, depth + 1);
143
+ }
144
+ else if (ts.isSpreadAssignment(prop)) {
145
+ const spread = evaluate(checker, prop.expression, depth + 1);
146
+ if (spread && typeof spread === 'object')
147
+ Object.assign(out, spread);
148
+ }
149
+ }
150
+ return out;
151
+ }
152
+ if (ts.isIdentifier(e)) {
153
+ const init = constInitializer(checker, e);
154
+ return init ? evaluate(checker, init, depth + 1) : literalType(checker, e);
155
+ }
156
+ if (ts.isPropertyAccessExpression(e)) {
157
+ const base = evaluate(checker, e.expression, depth + 1);
158
+ if (base && typeof base === 'object' && e.name.text in base) {
159
+ return base[e.name.text];
160
+ }
161
+ return literalType(checker, e);
162
+ }
163
+ if (ts.isTemplateExpression(e)) {
164
+ let text = e.head.text;
165
+ for (const span of e.templateSpans) {
166
+ const part = evaluate(checker, span.expression, depth + 1);
167
+ if (!isTextPart(part))
168
+ return UNKNOWN;
169
+ text += String(part) + span.literal.text;
170
+ }
171
+ return text;
172
+ }
173
+ // A number built from constants: `30 * 60_000`, `HOUR - MINUTE`.
174
+ if (ts.isBinaryExpression(e) && ARITHMETIC.has(e.operatorToken.kind)) {
175
+ const left = evaluate(checker, e.left, depth + 1);
176
+ const right = evaluate(checker, e.right, depth + 1);
177
+ if (typeof left !== 'number' || typeof right !== 'number')
178
+ return UNKNOWN;
179
+ const value = ARITHMETIC.get(e.operatorToken.kind)(left, right);
180
+ return Number.isFinite(value) ? value : UNKNOWN;
181
+ }
182
+ if (ts.isBinaryExpression(e) && e.operatorToken.kind === ts.SyntaxKind.PlusToken) {
183
+ const left = evaluate(checker, e.left, depth + 1);
184
+ const right = evaluate(checker, e.right, depth + 1);
185
+ if (typeof left === 'number' && typeof right === 'number')
186
+ return left + right;
187
+ if (isTextPart(left) && isTextPart(right) && (typeof left === 'string' || typeof right === 'string')) {
188
+ return String(left) + String(right);
189
+ }
190
+ return UNKNOWN;
191
+ }
192
+ return UNKNOWN;
193
+ }
194
+ /**
195
+ * The one value a name's type allows, when its type is a single string or
196
+ * number literal: a declared constant with no initializer to read, such as a
197
+ * generated API schema's `readonly description: "…"` in a `.d.ts`.
198
+ */
199
+ function literalType(checker, e) {
200
+ const type = checker.getTypeAtLocation(e);
201
+ if (type.isStringLiteral() || type.isNumberLiteral())
202
+ return type.value;
203
+ return UNKNOWN;
204
+ }
205
+ /** A value a template or a `+` can put in a string as JavaScript would, and the same on every build. */
206
+ function isTextPart(v) {
207
+ return typeof v === 'string' || typeof v === 'number' || typeof v === 'boolean';
208
+ }
209
+ export function propertyName(name) {
210
+ if (ts.isIdentifier(name) || ts.isStringLiteral(name) || ts.isNumericLiteral(name))
211
+ return name.text;
212
+ return null;
213
+ }
214
+ /** An object literal's property, by name. */
215
+ export function objectProperty(obj, name) {
216
+ for (const prop of obj.properties) {
217
+ if (ts.isPropertyAssignment(prop) && propertyName(prop.name) === name)
218
+ return prop.initializer;
219
+ if (ts.isShorthandPropertyAssignment(prop) && prop.name.text === name)
220
+ return prop.name;
221
+ }
222
+ return undefined;
223
+ }
224
+ /** A JSX element's attribute expression (`true` for a bare attribute), by name. */
225
+ export function jsxAttribute(el, name) {
226
+ for (const attr of el.attributes.properties) {
227
+ if (ts.isJsxAttribute(attr) && attr.name.getText() === name) {
228
+ if (!attr.initializer)
229
+ return true;
230
+ if (ts.isStringLiteral(attr.initializer))
231
+ return attr.initializer;
232
+ if (ts.isJsxExpression(attr.initializer))
233
+ return attr.initializer.expression;
234
+ return undefined;
235
+ }
236
+ }
237
+ return undefined;
238
+ }
239
+ export function hasJsxAttribute(el, name) {
240
+ return el.attributes.properties.some(a => ts.isJsxAttribute(a) && a.name.getText() === name);
241
+ }
242
+ /**
243
+ * The label a JSX element's own children show: its direct text, and for an
244
+ * expression that is not static (`{busy ? 'Saving…' : 'Save'}`) its resting
245
+ * label, the last alternative. Nested elements (icons, badges) are not read:
246
+ * their text is not the control's name.
247
+ */
248
+ export function jsxText(checker, node) {
249
+ const parts = [];
250
+ const children = ts.isJsxElement(node) ? node.children : ts.isJsxFragment(node) ? node.children : [];
251
+ for (const n of children) {
252
+ if (ts.isJsxText(n))
253
+ parts.push(n.text);
254
+ else if (ts.isJsxExpression(n) && n.expression) {
255
+ const v = evaluate(checker, n.expression);
256
+ if (typeof v === 'string' || typeof v === 'number')
257
+ parts.push(String(v));
258
+ else {
259
+ const literals = stringLiterals(n.expression);
260
+ if (literals.length)
261
+ parts.push(literals[literals.length - 1]);
262
+ }
263
+ }
264
+ else if (ts.isJsxFragment(n))
265
+ parts.push(jsxText(checker, n));
266
+ }
267
+ return parts.join(' ').replace(/\s+/g, ' ').trim();
268
+ }
269
+ /** `voices.detail.preview-save-sound` → `Preview save sound`: a name when the code gives none. */
270
+ export function humanizeId(id) {
271
+ const last = id.split('.').pop() ?? id;
272
+ const words = last
273
+ .replace(/([a-z0-9])([A-Z])/g, '$1 $2')
274
+ .replace(/[-_]/g, ' ')
275
+ .trim()
276
+ .toLowerCase();
277
+ return words ? words[0].toUpperCase() + words.slice(1) : id;
278
+ }
279
+ /** Every string literal in an expression: the words a conditional title or description can show. */
280
+ export function stringLiterals(expr) {
281
+ const out = [];
282
+ const visit = (n) => {
283
+ if (ts.isStringLiteral(n) || ts.isNoSubstitutionTemplateLiteral(n)) {
284
+ // Not a comparison operand (`scope === 'extended'`): only the values shown.
285
+ const parent = n.parent;
286
+ if (parent && ts.isBinaryExpression(parent) && isComparison(parent.operatorToken.kind))
287
+ return;
288
+ out.push(n.text);
289
+ }
290
+ ts.forEachChild(n, visit);
291
+ };
292
+ if (expr)
293
+ visit(expr);
294
+ return [...new Set(out.map(s => s.trim()).filter(Boolean))];
295
+ }
296
+ export function isComparison(kind) {
297
+ return (kind === ts.SyntaxKind.EqualsEqualsEqualsToken ||
298
+ kind === ts.SyntaxKind.ExclamationEqualsEqualsToken ||
299
+ kind === ts.SyntaxKind.EqualsEqualsToken ||
300
+ kind === ts.SyntaxKind.ExclamationEqualsToken);
301
+ }
302
+ //# sourceMappingURL=program.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"program.js","sourceRoot":"","sources":["../src/program.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ /**
2
+ * Recipes a room declares (`RoomCatalog.recipes`, ADR-0226 §2.6): tasks only
3
+ * the room knows, written in its own words, whose references to its entries
4
+ * become the tools that carry each step out. The generator infers no recipe
5
+ * from what entries are called.
6
+ */
7
+ import { type KnowledgeRecipe, type RoomCatalogData, type RoomRecipe } from '@ouispec/bindings';
8
+ /** A room entry's tool name: `<room>_<entry>`. */
9
+ export declare const roomToolName: (room: string, entry: string) => string;
10
+ /** A declared recipe with its references resolved, or what it names that the room does not have. */
11
+ export declare function resolveRecipe(catalog: RoomCatalogData, recipe: RoomRecipe): {
12
+ recipe: KnowledgeRecipe;
13
+ problems: string[];
14
+ };
15
+ /** Every declared recipe's problems. */
16
+ export declare function recipeProblems(catalog: RoomCatalogData): string[];
17
+ //# sourceMappingURL=recipes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipes.d.ts","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAKL,KAAK,eAAe,EACpB,KAAK,eAAe,EACpB,KAAK,UAAU,EAChB,MAAM,mBAAmB,CAAC;AAI3B,kDAAkD;AAClD,eAAO,MAAM,YAAY,GAAI,MAAM,MAAM,EAAE,OAAO,MAAM,WAAiC,CAAC;AAE1F,oGAAoG;AACpG,wBAAgB,aAAa,CAC3B,OAAO,EAAE,eAAe,EACxB,MAAM,EAAE,UAAU,GACjB;IAAE,MAAM,EAAE,eAAe,CAAC;IAAC,QAAQ,EAAE,MAAM,EAAE,CAAA;CAAE,CAoCjD;AAED,wCAAwC;AACxC,wBAAgB,cAAc,CAAC,OAAO,EAAE,eAAe,GAAG,MAAM,EAAE,CAEjE"}
@@ -0,0 +1,48 @@
1
+ /**
2
+ * Recipes a room declares (`RoomCatalog.recipes`, ADR-0226 §2.6): tasks only
3
+ * the room knows, written in its own words, whose references to its entries
4
+ * become the tools that carry each step out. The generator infers no recipe
5
+ * from what entries are called.
6
+ */
7
+ import { isKeyframeable, ROOM_RUN_COMMAND_ID, ROOM_SET_PROPERTIES_ID, toolName, } from '@ouispec/bindings';
8
+ const REFERENCE = /\{(room|keyframeable|action:[^}]+|command:[^}]+|field:[^}]+)\}/g;
9
+ /** A room entry's tool name: `<room>_<entry>`. */
10
+ export const roomToolName = (room, entry) => toolName(`${room}.${entry}`);
11
+ /** A declared recipe with its references resolved, or what it names that the room does not have. */
12
+ export function resolveRecipe(catalog, recipe) {
13
+ const problems = [];
14
+ const has = (kind, id) => kind === 'action'
15
+ ? catalog.actions.some(a => a.id === id)
16
+ : kind === 'command'
17
+ ? catalog.commands.some(c => c.id === id && c.status === 'available')
18
+ : catalog.fields.some(f => f.id === id);
19
+ const missing = (kind, id) => problems.push(`${catalog.room}’s recipe "${recipe.name}" names ${kind} ${id}, which the room does not have`);
20
+ const resolve = (text) => text.replace(REFERENCE, (_, ref) => {
21
+ if (ref === 'room')
22
+ return catalog.title;
23
+ if (ref === 'keyframeable')
24
+ return catalog.fields
25
+ .filter(isKeyframeable)
26
+ .map(f => f.id)
27
+ .join(', ');
28
+ const [kind, id] = [ref.slice(0, ref.indexOf(':')), ref.slice(ref.indexOf(':') + 1)];
29
+ if (!has(kind, id)) {
30
+ missing(kind === 'command' ? 'available command' : kind, id);
31
+ return ref;
32
+ }
33
+ if (kind === 'action')
34
+ return roomToolName(catalog.room, id);
35
+ if (kind === 'command')
36
+ return `${roomToolName(catalog.room, ROOM_RUN_COMMAND_ID)} ${id}`;
37
+ return `${roomToolName(catalog.room, ROOM_SET_PROPERTIES_ID)} ${id}`;
38
+ });
39
+ return {
40
+ recipe: { name: resolve(recipe.name), trigger: resolve(recipe.trigger), steps: recipe.steps.map(resolve) },
41
+ problems,
42
+ };
43
+ }
44
+ /** Every declared recipe's problems. */
45
+ export function recipeProblems(catalog) {
46
+ return (catalog.recipes ?? []).flatMap(r => resolveRecipe(catalog, r).problems);
47
+ }
48
+ //# sourceMappingURL=recipes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"recipes.js","sourceRoot":"","sources":["../src/recipes.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,74 @@
1
+ /**
2
+ * Tier 2 (ADR-0226 §2.3): each mapping of a third-party design system the app
3
+ * does not own becomes a bound module in `<out>/bound/`, and the generator
4
+ * reads every use of a bound control as it reads a tier 1 control.
5
+ *
6
+ * - `loadMappings` reads and checks each mapping the config names.
7
+ * - `boundModuleSource` is the module emitted for one: a wrapper per mapped
8
+ * control, built from `@ouispec/bindings/react`, under the
9
+ * package's own export names, with every other member of a namespace kept.
10
+ * - `checkMappingTypes` holds each mapping to the package's types: every
11
+ * export it names exists, and every prop it names is one the component takes.
12
+ */
13
+ import { type ControlDescriptor, type Tier2Control, type Tier2Mapping } from '@ouispec/bindings';
14
+ import type { Finding } from './analyze.js';
15
+ import { type GeneratorConfig } from './config.js';
16
+ import type { Source } from './program.js';
17
+ /** Where the bound wrappers' runtime is imported from, in every emitted module. */
18
+ export declare const BINDINGS_REACT_MODULE = "@ouispec/bindings/react";
19
+ /** What adds `agent` to JSX for an app with bound modules, imported by every emitted module. */
20
+ export declare const BINDINGS_JSX_MODULE = "@ouispec/bindings/jsx";
21
+ /** The directory under `out` the bound modules go in. */
22
+ export declare const BOUND_DIR = "bound";
23
+ /** One part of a mapped control, as the analyzer reads a use of it. */
24
+ export interface Tier2PartInfo {
25
+ /** The mapped control's name in the mapping (`Select`). */
26
+ control: string;
27
+ part: 'root' | 'item';
28
+ /** The control's mapping. */
29
+ mapping: Tier2Control;
30
+ }
31
+ export interface LoadedMapping {
32
+ /** The mapping file, relative to the app root, for messages. */
33
+ file: string;
34
+ package: string;
35
+ /** How the analyzer names the bound module, where a tier 1 package name would be. */
36
+ key: string;
37
+ /** The bound module's file name, without extension (`mantine-core`). */
38
+ slug: string;
39
+ /** The bound module, absolute. */
40
+ module: string;
41
+ /** Its control table, absolute. */
42
+ table: string;
43
+ mapping: Tier2Mapping;
44
+ /** Each part's export path (`Select`, `Select.Root`, `Tabs.Tab`) → how the analyzer reads its uses. */
45
+ descriptors: ReadonlyMap<string, ControlDescriptor>;
46
+ parts: ReadonlyMap<string, Tier2PartInfo>;
47
+ /** The package's exports an app must import from the bound module instead: each part's first segment. */
48
+ exports: ReadonlySet<string>;
49
+ }
50
+ /** `@mantine/core` → `mantine-core`: the bound module's name. */
51
+ export declare function boundModuleSlug(pkg: string): string;
52
+ /**
53
+ * Every mapping `oui.config.json` names, read and checked against the
54
+ * contract and against each other: one mapping per package, never a package
55
+ * also listed as a tier 1 design system, and every kind a built-in one or
56
+ * one a design system registers.
57
+ */
58
+ export declare function loadMappings(config: GeneratorConfig): {
59
+ mappings: LoadedMapping[];
60
+ errors: Finding[];
61
+ };
62
+ /** The bound module emitted for one mapping: deterministic, the same mapping always gives the same bytes. */
63
+ export declare function boundModuleSource(loaded: LoadedMapping): string;
64
+ /** The control table emitted beside the bound module: it ships as a tier 1 package's does. */
65
+ export declare function boundTableSource(loaded: LoadedMapping): string;
66
+ /**
67
+ * Each mapping held to its package's types, through its bound module as the
68
+ * app compiles it: every diagnostic in the module (an export the package does
69
+ * not have, a package the app cannot resolve), and every prop the mapping
70
+ * names that its component does not take. A prop the types cannot decide (a
71
+ * polymorphic component's) is left to the conformance kit.
72
+ */
73
+ export declare function checkMappingTypes(source: Source, mappings: readonly LoadedMapping[]): Finding[];
74
+ //# sourceMappingURL=tier2.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tier2.d.ts","sourceRoot":"","sources":["../src/tier2.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,EAQL,KAAK,iBAAiB,EACtB,KAAK,YAAY,EACjB,KAAK,YAAY,EAClB,MAAM,mBAAmB,CAAC;AAE3B,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAC5C,OAAO,EAAe,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAEhE,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAE3C,mFAAmF;AACnF,eAAO,MAAM,qBAAqB,4BAA4B,CAAC;AAE/D,gGAAgG;AAChG,eAAO,MAAM,mBAAmB,0BAA0B,CAAC;AAE3D,yDAAyD;AACzD,eAAO,MAAM,SAAS,UAAU,CAAC;AAEjC,uEAAuE;AACvE,MAAM,WAAW,aAAa;IAC5B,2DAA2D;IAC3D,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;IACtB,6BAA6B;IAC7B,OAAO,EAAE,YAAY,CAAC;CACvB;AAED,MAAM,WAAW,aAAa;IAC5B,gEAAgE;IAChE,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,qFAAqF;IACrF,GAAG,EAAE,MAAM,CAAC;IACZ,wEAAwE;IACxE,IAAI,EAAE,MAAM,CAAC;IACb,kCAAkC;IAClC,MAAM,EAAE,MAAM,CAAC;IACf,mCAAmC;IACnC,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,YAAY,CAAC;IACtB,uGAAuG;IACvG,WAAW,EAAE,WAAW,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC;IACpD,KAAK,EAAE,WAAW,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IAC1C,yGAAyG;IACzG,OAAO,EAAE,WAAW,CAAC,MAAM,CAAC,CAAC;CAC9B;AAED,iEAAiE;AACjE,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAMnD;AAMD;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,MAAM,EAAE,eAAe,GAAG;IAAE,QAAQ,EAAE,aAAa,EAAE,CAAC;IAAC,MAAM,EAAE,OAAO,EAAE,CAAA;CAAE,CA0FtG;AASD,6GAA6G;AAC7G,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAkE/D;AAED,8FAA8F;AAC9F,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,GAAG,MAAM,CAE9D;AAkCD;;;;;;GAMG;AACH,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,aAAa,EAAE,GAAG,OAAO,EAAE,CAmE/F"}