@artkit-ai/format-openui 0.0.0-stage → 0.2.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.
- package/LICENSE +202 -0
- package/README.md +4 -2
- package/dist/diff.d.ts +4 -0
- package/dist/diff.d.ts.map +1 -0
- package/dist/diff.js +24 -0
- package/dist/diff.js.map +1 -0
- package/dist/index.d.ts +47 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +202 -0
- package/dist/index.js.map +1 -0
- package/dist/lint.d.ts +4 -0
- package/dist/lint.d.ts.map +1 -0
- package/dist/lint.js +81 -0
- package/dist/lint.js.map +1 -0
- package/dist/operations.d.ts +41 -0
- package/dist/operations.d.ts.map +1 -0
- package/dist/operations.js +140 -0
- package/dist/operations.js.map +1 -0
- package/dist/read.d.ts +4 -0
- package/dist/read.d.ts.map +1 -0
- package/dist/read.js +58 -0
- package/dist/read.js.map +1 -0
- package/dist/syntax.d.ts +68 -0
- package/dist/syntax.d.ts.map +1 -0
- package/dist/syntax.js +204 -0
- package/dist/syntax.js.map +1 -0
- package/package.json +46 -3
- package/src/diff.ts +22 -0
- package/src/index.ts +221 -0
- package/src/lint.ts +86 -0
- package/src/operations.ts +172 -0
- package/src/read.ts +59 -0
- package/src/syntax.ts +226 -0
|
@@ -0,0 +1,41 @@
|
|
|
1
|
+
import type { AdapterContext } from '@artkit-ai/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { formatStatement, type Statement } from './syntax.js';
|
|
4
|
+
export declare const openuiOperationSchema: z.ZodDiscriminatedUnion<[z.ZodObject<{
|
|
5
|
+
op: z.ZodLiteral<"set_statement">;
|
|
6
|
+
name: z.ZodString;
|
|
7
|
+
expr: z.ZodString;
|
|
8
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
9
|
+
op: z.ZodLiteral<"remove_statement">;
|
|
10
|
+
name: z.ZodString;
|
|
11
|
+
cascade: z.ZodDefault<z.ZodBoolean>;
|
|
12
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
13
|
+
op: z.ZodLiteral<"rename_statement">;
|
|
14
|
+
name: z.ZodString;
|
|
15
|
+
to: z.ZodString;
|
|
16
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
17
|
+
op: z.ZodLiteral<"insert_child">;
|
|
18
|
+
name: z.ZodString;
|
|
19
|
+
child: z.ZodString;
|
|
20
|
+
position: z.ZodOptional<z.ZodNumber>;
|
|
21
|
+
after: z.ZodOptional<z.ZodString>;
|
|
22
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
23
|
+
op: z.ZodLiteral<"remove_child">;
|
|
24
|
+
name: z.ZodString;
|
|
25
|
+
child: z.ZodString;
|
|
26
|
+
}, z.core.$strict>, z.ZodObject<{
|
|
27
|
+
op: z.ZodLiteral<"move_child">;
|
|
28
|
+
name: z.ZodString;
|
|
29
|
+
child: z.ZodString;
|
|
30
|
+
position: z.ZodNumber;
|
|
31
|
+
}, z.core.$strict>], "op">;
|
|
32
|
+
export type OpenUIOperation = z.infer<typeof openuiOperationSchema>;
|
|
33
|
+
export declare const OPENUI_OPERATION_NAMES: readonly ['set_statement', 'remove_statement', 'rename_statement', 'insert_child', 'remove_child', 'move_child'];
|
|
34
|
+
export interface OpenUIApplyState {
|
|
35
|
+
statements: Statement[];
|
|
36
|
+
createdRefs: string[];
|
|
37
|
+
}
|
|
38
|
+
/** Applies one declaration operation on the list of statements. Order is kept; new statements are appended. */
|
|
39
|
+
export declare function applyOpenUIOperation(state: OpenUIApplyState, op: OpenUIOperation, ctx: AdapterContext): void;
|
|
40
|
+
export { formatStatement };
|
|
41
|
+
//# sourceMappingURL=operations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.d.ts","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AACxB,OAAO,EAGL,eAAe,EAIf,KAAK,SAAS,EAEf,MAAM,aAAa,CAAC;AAYrB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;0BAehC,CAAC;AAEH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;AAEpE,eAAO,MAAM,sBAAsB,YACjC,eAAe,EACf,kBAAkB,EAClB,kBAAkB,EAClB,cAAc,EACd,cAAc,EACd,YAAY,CACJ,CAAC;AAEX,MAAM,WAAW,gBAAgB;IAC/B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAwBD,+GAA+G;AAC/G,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,gBAAgB,EACvB,EAAE,EAAE,eAAe,EACnB,GAAG,EAAE,cAAc,GAClB,IAAI,CAsFN;AAED,OAAO,EAAE,eAAe,EAAE,CAAC"}
|
|
@@ -0,0 +1,140 @@
|
|
|
1
|
+
import { z } from 'zod';
|
|
2
|
+
import { childrenOf, componentOf, formatStatement, references, removeReferences, renameReferences, setChildren, } from './syntax.js';
|
|
3
|
+
const name = z
|
|
4
|
+
.string()
|
|
5
|
+
.regex(/^[a-z][A-Za-z0-9_]{0,63}$/, 'Declaration names start with a lowercase letter (e.g. "capa").');
|
|
6
|
+
const expr = z
|
|
7
|
+
.string()
|
|
8
|
+
.min(3)
|
|
9
|
+
.max(4000)
|
|
10
|
+
.refine((text) => !text.includes('\n'), 'One declaration per line.')
|
|
11
|
+
.describe('Right-hand side, e.g. Slide("title", [Title("Portal")]).');
|
|
12
|
+
export const openuiOperationSchema = z.discriminatedUnion('op', [
|
|
13
|
+
z.object({ op: z.literal('set_statement'), name, expr }).strict(),
|
|
14
|
+
z.object({ op: z.literal('remove_statement'), name, cascade: z.boolean().default(false) }).strict(),
|
|
15
|
+
z.object({ op: z.literal('rename_statement'), name, to: name }).strict(),
|
|
16
|
+
z
|
|
17
|
+
.object({
|
|
18
|
+
op: z.literal('insert_child'),
|
|
19
|
+
name,
|
|
20
|
+
child: name,
|
|
21
|
+
position: z.number().int().min(0).optional().describe('0-based position; omit to append.'),
|
|
22
|
+
after: name.optional().describe('Insert after this child name.'),
|
|
23
|
+
})
|
|
24
|
+
.strict(),
|
|
25
|
+
z.object({ op: z.literal('remove_child'), name, child: name }).strict(),
|
|
26
|
+
z.object({ op: z.literal('move_child'), name, child: name, position: z.number().int().min(0) }).strict(),
|
|
27
|
+
]);
|
|
28
|
+
export const OPENUI_OPERATION_NAMES = [
|
|
29
|
+
'set_statement',
|
|
30
|
+
'remove_statement',
|
|
31
|
+
'rename_statement',
|
|
32
|
+
'insert_child',
|
|
33
|
+
'remove_child',
|
|
34
|
+
'move_child',
|
|
35
|
+
];
|
|
36
|
+
function indexOfStatement(statements, target, ctx, path) {
|
|
37
|
+
const index = statements.findIndex((statement) => statement.name === target);
|
|
38
|
+
if (index < 0) {
|
|
39
|
+
ctx.fail(`A declaração "${target}" não existe.`, {
|
|
40
|
+
path,
|
|
41
|
+
hint: 'Leia o outline e use um nome declarado nele.',
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
return index;
|
|
45
|
+
}
|
|
46
|
+
function referrersOf(statements, target) {
|
|
47
|
+
return statements
|
|
48
|
+
.filter((statement) => statement.name !== target && references(statement.expr).includes(target))
|
|
49
|
+
.map((statement) => statement.name);
|
|
50
|
+
}
|
|
51
|
+
/** Applies one declaration operation on the list of statements. Order is kept; new statements are appended. */
|
|
52
|
+
export function applyOpenUIOperation(state, op, ctx) {
|
|
53
|
+
const statements = state.statements;
|
|
54
|
+
switch (op.op) {
|
|
55
|
+
case 'set_statement': {
|
|
56
|
+
if (!componentOf(op.expr) || !op.expr.includes('(')) {
|
|
57
|
+
ctx.fail(`A declaração "${op.name}" precisa chamar um componente, como Title("texto").`, {
|
|
58
|
+
path: 'expr',
|
|
59
|
+
hint: 'Escreva o componente com seus argumentos entre parênteses.',
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
const at = statements.findIndex((statement) => statement.name === op.name);
|
|
63
|
+
if (at >= 0)
|
|
64
|
+
statements[at] = { name: op.name, expr: op.expr };
|
|
65
|
+
else {
|
|
66
|
+
statements.push({ name: op.name, expr: op.expr });
|
|
67
|
+
state.createdRefs.push(op.name);
|
|
68
|
+
}
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
case 'remove_statement': {
|
|
72
|
+
const at = indexOfStatement(statements, op.name, ctx, 'name');
|
|
73
|
+
const referrers = referrersOf(statements, op.name);
|
|
74
|
+
if (referrers.length > 0 && !op.cascade) {
|
|
75
|
+
ctx.fail(`"${op.name}" ainda é usada por ${referrers.join(', ')}.`, {
|
|
76
|
+
path: 'cascade',
|
|
77
|
+
hint: 'Remova ou troque a referência antes, ou envie cascade: true para remover as referências junto.',
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
statements.splice(at, 1);
|
|
81
|
+
for (const statement of statements)
|
|
82
|
+
statement.expr = removeReferences(statement.expr, op.name);
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
case 'rename_statement': {
|
|
86
|
+
const at = indexOfStatement(statements, op.name, ctx, 'name');
|
|
87
|
+
if (statements.some((statement) => statement.name === op.to)) {
|
|
88
|
+
ctx.fail(`Já existe uma declaração chamada "${op.to}".`, { path: 'to', hint: 'Escolha outro nome.' });
|
|
89
|
+
}
|
|
90
|
+
statements[at].name = op.to;
|
|
91
|
+
for (const statement of statements)
|
|
92
|
+
statement.expr = renameReferences(statement.expr, op.name, op.to);
|
|
93
|
+
state.createdRefs.push(op.to);
|
|
94
|
+
return;
|
|
95
|
+
}
|
|
96
|
+
case 'insert_child': {
|
|
97
|
+
const at = indexOfStatement(statements, op.name, ctx, 'name');
|
|
98
|
+
indexOfStatement(statements, op.child, ctx, 'child');
|
|
99
|
+
const current = childrenOf(statements[at].expr);
|
|
100
|
+
if (!/\[/.test(statements[at].expr)) {
|
|
101
|
+
ctx.fail(`A declaração "${op.name}" não tem lista de filhos.`, {
|
|
102
|
+
path: 'name',
|
|
103
|
+
hint: 'Escolha um componente que aceite filhos, como Slide ou Card.',
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
const items = current.filter((item) => item !== op.child);
|
|
107
|
+
let position = op.position ?? items.length;
|
|
108
|
+
if (op.after !== undefined) {
|
|
109
|
+
const index = items.indexOf(op.after);
|
|
110
|
+
if (index < 0)
|
|
111
|
+
ctx.fail(`"${op.after}" não está na lista de filhos de "${op.name}".`, { path: 'after' });
|
|
112
|
+
position = index + 1;
|
|
113
|
+
}
|
|
114
|
+
items.splice(Math.min(position, items.length), 0, op.child);
|
|
115
|
+
statements[at].expr = setChildren(statements[at].expr, items);
|
|
116
|
+
return;
|
|
117
|
+
}
|
|
118
|
+
case 'remove_child': {
|
|
119
|
+
const at = indexOfStatement(statements, op.name, ctx, 'name');
|
|
120
|
+
const items = childrenOf(statements[at].expr);
|
|
121
|
+
if (!items.includes(op.child)) {
|
|
122
|
+
ctx.fail(`"${op.child}" não está na lista de filhos de "${op.name}".`, { path: 'child' });
|
|
123
|
+
}
|
|
124
|
+
statements[at].expr = setChildren(statements[at].expr, items.filter((item) => item !== op.child));
|
|
125
|
+
return;
|
|
126
|
+
}
|
|
127
|
+
case 'move_child': {
|
|
128
|
+
const at = indexOfStatement(statements, op.name, ctx, 'name');
|
|
129
|
+
const items = childrenOf(statements[at].expr);
|
|
130
|
+
if (!items.includes(op.child))
|
|
131
|
+
ctx.fail(`"${op.child}" não está na lista de filhos de "${op.name}".`, { path: 'child' });
|
|
132
|
+
const rest = items.filter((item) => item !== op.child);
|
|
133
|
+
rest.splice(Math.min(op.position, rest.length), 0, op.child);
|
|
134
|
+
statements[at].expr = setChildren(statements[at].expr, rest);
|
|
135
|
+
return;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
export { formatStatement };
|
|
140
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../src/operations.ts"],"names":[],"mappings":"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"}
|
package/dist/read.d.ts
ADDED
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { type ReadRequest, type ReadResult } from '@artkit-ai/core';
|
|
2
|
+
/** Compact reading (spec §12.4): `outline` from the root, `statements` by name, and `full`. */
|
|
3
|
+
export declare function readOpenUI(content: string, request: ReadRequest): ReadResult;
|
|
4
|
+
//# sourceMappingURL=read.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.d.ts","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"AAAA,OAAO,EAA2C,KAAK,WAAW,EAAE,KAAK,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAkB7G,+FAA+F;AAC/F,wBAAgB,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,UAAU,CAuC5E"}
|
package/dist/read.js
ADDED
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import { ellipsis, paginate } from '@artkit-ai/core';
|
|
2
|
+
import { childrenOf, componentOf, formatStatement, parseStatements } from './syntax.js';
|
|
3
|
+
function labelOf(expr) {
|
|
4
|
+
const match = /"((?:[^"\\]|\\.)*)"/.exec(expr);
|
|
5
|
+
return match ? ellipsis(match[1], 60) : '';
|
|
6
|
+
}
|
|
7
|
+
function outlineLine(statement) {
|
|
8
|
+
const component = componentOf(statement.expr) ?? '?';
|
|
9
|
+
const children = childrenOf(statement.expr);
|
|
10
|
+
const parts = [`- ${statement.name}: ${component}`];
|
|
11
|
+
const label = labelOf(statement.expr);
|
|
12
|
+
if (label)
|
|
13
|
+
parts.push(`"${label}"`);
|
|
14
|
+
if (children.length > 0)
|
|
15
|
+
parts.push(`(${children.length} filhos: ${children.join(', ')})`);
|
|
16
|
+
return parts.join(' ');
|
|
17
|
+
}
|
|
18
|
+
/** Compact reading (spec §12.4): `outline` from the root, `statements` by name, and `full`. */
|
|
19
|
+
export function readOpenUI(content, request) {
|
|
20
|
+
const { statements } = parseStatements(content);
|
|
21
|
+
const budget = {
|
|
22
|
+
...(request.maxTokens === undefined ? {} : { maxTokens: request.maxTokens }),
|
|
23
|
+
...(request.cursor === undefined ? {} : { cursor: request.cursor }),
|
|
24
|
+
...(request.charsPerToken === undefined ? {} : { charsPerToken: request.charsPerToken }),
|
|
25
|
+
};
|
|
26
|
+
if (request.mode === 'outline') {
|
|
27
|
+
const items = statements.map((statement) => {
|
|
28
|
+
const line = outlineLine(statement);
|
|
29
|
+
return { id: statement.name, text: line, outline: line };
|
|
30
|
+
});
|
|
31
|
+
const projection = paginate(items, {
|
|
32
|
+
header: 'Declarações (raiz primeiro):',
|
|
33
|
+
...budget,
|
|
34
|
+
outlineOnly: true,
|
|
35
|
+
});
|
|
36
|
+
return {
|
|
37
|
+
text: projection.text,
|
|
38
|
+
truncated: projection.truncated,
|
|
39
|
+
...(projection.cursor ? { cursor: projection.cursor } : {}),
|
|
40
|
+
};
|
|
41
|
+
}
|
|
42
|
+
const wanted = request.mode === 'statements' && request.range
|
|
43
|
+
? new Set(request.range.split(',').map((part) => part.trim()))
|
|
44
|
+
: undefined;
|
|
45
|
+
const items = statements
|
|
46
|
+
.filter((statement) => !wanted || wanted.has(statement.name))
|
|
47
|
+
.map((statement) => {
|
|
48
|
+
const line = formatStatement(statement);
|
|
49
|
+
return { id: statement.name, text: line, outline: ellipsis(line, 80) };
|
|
50
|
+
});
|
|
51
|
+
const projection = paginate(items, budget);
|
|
52
|
+
return {
|
|
53
|
+
text: projection.text,
|
|
54
|
+
truncated: projection.truncated,
|
|
55
|
+
...(projection.cursor ? { cursor: projection.cursor } : {}),
|
|
56
|
+
};
|
|
57
|
+
}
|
|
58
|
+
//# sourceMappingURL=read.js.map
|
package/dist/read.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"read.js","sourceRoot":"","sources":["../src/read.ts"],"names":[],"mappings":"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"}
|
package/dist/syntax.d.ts
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Line-based OpenUI Lang syntax (spec §12.1): one declaration per line, `name = Component(args)`. This module only
|
|
3
|
+
* tokenizes and edits text; schema checks belong to the parser of `@openuidev/lang-core`.
|
|
4
|
+
*/
|
|
5
|
+
export interface Statement {
|
|
6
|
+
name: string;
|
|
7
|
+
expr: string;
|
|
8
|
+
}
|
|
9
|
+
export interface ParsedLines {
|
|
10
|
+
statements: Statement[];
|
|
11
|
+
/** 1-based numbers of non-empty lines that are not declarations. */
|
|
12
|
+
invalidLines: number[];
|
|
13
|
+
}
|
|
14
|
+
export declare function parseStatements(content: string): ParsedLines;
|
|
15
|
+
export declare function serializeStatements(statements: readonly Statement[]): string;
|
|
16
|
+
export declare function formatStatement(statement: Statement): string;
|
|
17
|
+
export type Token = {
|
|
18
|
+
kind: 'string';
|
|
19
|
+
text: string;
|
|
20
|
+
start: number;
|
|
21
|
+
end: number;
|
|
22
|
+
} | {
|
|
23
|
+
kind: 'ident';
|
|
24
|
+
text: string;
|
|
25
|
+
start: number;
|
|
26
|
+
end: number;
|
|
27
|
+
} | {
|
|
28
|
+
kind: 'punct';
|
|
29
|
+
text: string;
|
|
30
|
+
start: number;
|
|
31
|
+
end: number;
|
|
32
|
+
} | {
|
|
33
|
+
kind: 'other';
|
|
34
|
+
text: string;
|
|
35
|
+
start: number;
|
|
36
|
+
end: number;
|
|
37
|
+
};
|
|
38
|
+
/** Tokenizes an expression. Strings keep their quotes and escapes; identifiers may contain dots (e.g. `Q1.total`). */
|
|
39
|
+
export declare function tokenize(expr: string): Token[];
|
|
40
|
+
/** Names a declaration refers to: identifiers that are not component calls, literals or function calls. */
|
|
41
|
+
export declare function references(expr: string): string[];
|
|
42
|
+
/** Component name of a declaration (`Slide` for `Slide("title", [...])`), or undefined when there is none. */
|
|
43
|
+
export declare function componentOf(expr: string): string | undefined;
|
|
44
|
+
/** Replaces every reference to `from` with `to`, keeping the rest of the text untouched. */
|
|
45
|
+
export declare function renameReferences(expr: string, from: string, to: string): string;
|
|
46
|
+
/** Removes every reference to `name` inside array items (cascade). Items that are whole references are dropped. */
|
|
47
|
+
export declare function removeReferences(expr: string, name: string): string;
|
|
48
|
+
/** Position of the first `[ ... ]` argument of the outer call, or undefined. */
|
|
49
|
+
export declare function firstArraySpan(expr: string): {
|
|
50
|
+
start: number;
|
|
51
|
+
end: number;
|
|
52
|
+
} | undefined;
|
|
53
|
+
/** Splits the inside of an array into top-level items (commas inside calls and strings do not split). Items keep their text. */
|
|
54
|
+
export declare function splitItems(inner: string): string[];
|
|
55
|
+
/** Children of the first array argument (names and inline components), in order. */
|
|
56
|
+
export declare function childrenOf(expr: string): string[];
|
|
57
|
+
/** Replaces the children of the first array argument with `items`. */
|
|
58
|
+
export declare function setChildren(expr: string, items: string[]): string | undefined;
|
|
59
|
+
export interface ComponentCall {
|
|
60
|
+
component: string;
|
|
61
|
+
/** Text between the parentheses of this call. */
|
|
62
|
+
inner: string;
|
|
63
|
+
}
|
|
64
|
+
/** Every component call in an expression, outer and inline ones (`Slide(…, [Bullets([…])])` yields both). */
|
|
65
|
+
export declare function callsOf(expr: string): ComponentCall[];
|
|
66
|
+
/** Top-level arguments of a call's inside text (commas inside nested calls and arrays do not split). */
|
|
67
|
+
export declare function argsOf(inner: string): string[];
|
|
68
|
+
//# sourceMappingURL=syntax.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntax.d.ts","sourceRoot":"","sources":["../src/syntax.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,SAAS;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd;AAID,MAAM,WAAW,WAAW;IAC1B,UAAU,EAAE,SAAS,EAAE,CAAC;IACxB,oEAAoE;IACpE,YAAY,EAAE,MAAM,EAAE,CAAC;CACxB;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,WAAW,CAU5D;AAED,wBAAgB,mBAAmB,CAAC,UAAU,EAAE,SAAS,SAAS,EAAE,GAAG,MAAM,CAE5E;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,SAAS,GAAG,MAAM,CAE5D;AAED,MAAM,MAAM,KAAK,GACb;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC5D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAC3D;IAAE,IAAI,EAAE,OAAO,CAAC;IAAC,IAAI,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,CAAC;AAEhE,sHAAsH;AACtH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,EAAE,CAmC9C;AAID,2GAA2G;AAC3G,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAUjD;AAED,8GAA8G;AAC9G,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAG5D;AAED,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAM/E;AAED,mHAAmH;AACnH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAMnE;AAED,gFAAgF;AAChF,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,GAAG;IAAE,KAAK,EAAE,MAAM,CAAC;IAAC,GAAG,EAAE,MAAM,CAAA;CAAE,GAAG,SAAS,CAcvF;AAED,gIAAgI;AAChI,wBAAgB,UAAU,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAsBlD;AAED,oFAAoF;AACpF,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAGjD;AAED,sEAAsE;AACtE,wBAAgB,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,MAAM,GAAG,SAAS,CAI7E;AAkBD,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,iDAAiD;IACjD,KAAK,EAAE,MAAM,CAAC;CACf;AAED,6GAA6G;AAC7G,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAqBrD;AAED,wGAAwG;AACxG,wBAAgB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE,CAE9C"}
|
package/dist/syntax.js
ADDED
|
@@ -0,0 +1,204 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Line-based OpenUI Lang syntax (spec §12.1): one declaration per line, `name = Component(args)`. This module only
|
|
3
|
+
* tokenizes and edits text; schema checks belong to the parser of `@openuidev/lang-core`.
|
|
4
|
+
*/
|
|
5
|
+
const DECLARATION = /^([a-z][A-Za-z0-9_]{0,63})\s*=\s*(.+)$/;
|
|
6
|
+
export function parseStatements(content) {
|
|
7
|
+
const statements = [];
|
|
8
|
+
const invalidLines = [];
|
|
9
|
+
content.split('\n').forEach((line, index) => {
|
|
10
|
+
if (line.trim() === '')
|
|
11
|
+
return;
|
|
12
|
+
const match = DECLARATION.exec(line.trim());
|
|
13
|
+
if (match)
|
|
14
|
+
statements.push({ name: match[1], expr: match[2].trim() });
|
|
15
|
+
else
|
|
16
|
+
invalidLines.push(index + 1);
|
|
17
|
+
});
|
|
18
|
+
return { statements, invalidLines };
|
|
19
|
+
}
|
|
20
|
+
export function serializeStatements(statements) {
|
|
21
|
+
return `${statements.map((statement) => `${statement.name} = ${statement.expr}`).join('\n')}\n`;
|
|
22
|
+
}
|
|
23
|
+
export function formatStatement(statement) {
|
|
24
|
+
return `${statement.name} = ${statement.expr}`;
|
|
25
|
+
}
|
|
26
|
+
/** Tokenizes an expression. Strings keep their quotes and escapes; identifiers may contain dots (e.g. `Q1.total`). */
|
|
27
|
+
export function tokenize(expr) {
|
|
28
|
+
const tokens = [];
|
|
29
|
+
let i = 0;
|
|
30
|
+
while (i < expr.length) {
|
|
31
|
+
const char = expr[i];
|
|
32
|
+
if (/\s/.test(char)) {
|
|
33
|
+
i += 1;
|
|
34
|
+
continue;
|
|
35
|
+
}
|
|
36
|
+
if (char === '"') {
|
|
37
|
+
let j = i + 1;
|
|
38
|
+
while (j < expr.length && expr[j] !== '"')
|
|
39
|
+
j += expr[j] === '\\' ? 2 : 1;
|
|
40
|
+
const end = Math.min(j + 1, expr.length);
|
|
41
|
+
tokens.push({ kind: 'string', text: expr.slice(i, end), start: i, end });
|
|
42
|
+
i = end;
|
|
43
|
+
continue;
|
|
44
|
+
}
|
|
45
|
+
if (/[A-Za-z_]/.test(char)) {
|
|
46
|
+
let j = i + 1;
|
|
47
|
+
while (j < expr.length && /[A-Za-z0-9_.]/.test(expr[j]))
|
|
48
|
+
j += 1;
|
|
49
|
+
tokens.push({ kind: 'ident', text: expr.slice(i, j), start: i, end: j });
|
|
50
|
+
i = j;
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
if ('()[],'.includes(char)) {
|
|
54
|
+
tokens.push({ kind: 'punct', text: char, start: i, end: i + 1 });
|
|
55
|
+
i += 1;
|
|
56
|
+
continue;
|
|
57
|
+
}
|
|
58
|
+
let j = i + 1;
|
|
59
|
+
while (j < expr.length && !/[\sA-Za-z_"()[\],]/.test(expr[j]))
|
|
60
|
+
j += 1;
|
|
61
|
+
tokens.push({ kind: 'other', text: expr.slice(i, j), start: i, end: j });
|
|
62
|
+
i = j;
|
|
63
|
+
}
|
|
64
|
+
return tokens;
|
|
65
|
+
}
|
|
66
|
+
const LITERALS = new Set(['true', 'false', 'null']);
|
|
67
|
+
/** Names a declaration refers to: identifiers that are not component calls, literals or function calls. */
|
|
68
|
+
export function references(expr) {
|
|
69
|
+
const tokens = tokenize(expr);
|
|
70
|
+
const refs = [];
|
|
71
|
+
tokens.forEach((token, index) => {
|
|
72
|
+
if (token.kind !== 'ident' || LITERALS.has(token.text))
|
|
73
|
+
return;
|
|
74
|
+
const next = tokens[index + 1];
|
|
75
|
+
if (next?.kind === 'punct' && next.text === '(')
|
|
76
|
+
return;
|
|
77
|
+
refs.push(token.text);
|
|
78
|
+
});
|
|
79
|
+
return refs;
|
|
80
|
+
}
|
|
81
|
+
/** Component name of a declaration (`Slide` for `Slide("title", [...])`), or undefined when there is none. */
|
|
82
|
+
export function componentOf(expr) {
|
|
83
|
+
const first = tokenize(expr)[0];
|
|
84
|
+
return first?.kind === 'ident' ? first.text : undefined;
|
|
85
|
+
}
|
|
86
|
+
/** Replaces every reference to `from` with `to`, keeping the rest of the text untouched. */
|
|
87
|
+
export function renameReferences(expr, from, to) {
|
|
88
|
+
return rewriteTokens(expr, (token, next) => {
|
|
89
|
+
if (token.kind === 'ident' && token.text === from && !(next?.kind === 'punct' && next.text === '('))
|
|
90
|
+
return to;
|
|
91
|
+
return undefined;
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
/** Removes every reference to `name` inside array items (cascade). Items that are whole references are dropped. */
|
|
95
|
+
export function removeReferences(expr, name) {
|
|
96
|
+
const span = firstArraySpan(expr);
|
|
97
|
+
if (!span)
|
|
98
|
+
return expr;
|
|
99
|
+
const items = splitItems(expr.slice(span.start + 1, span.end));
|
|
100
|
+
const kept = items.filter((item) => item !== name);
|
|
101
|
+
return `${expr.slice(0, span.start)}[${kept.join(', ')}]${expr.slice(span.end + 1)}`;
|
|
102
|
+
}
|
|
103
|
+
/** Position of the first `[ ... ]` argument of the outer call, or undefined. */
|
|
104
|
+
export function firstArraySpan(expr) {
|
|
105
|
+
let depth = 0;
|
|
106
|
+
let start = -1;
|
|
107
|
+
const tokens = tokenize(expr);
|
|
108
|
+
for (const token of tokens) {
|
|
109
|
+
if (token.kind === 'punct' && (token.text === '(' || token.text === '[')) {
|
|
110
|
+
if (token.text === '[' && depth === 1 && start < 0)
|
|
111
|
+
start = token.start;
|
|
112
|
+
depth += 1;
|
|
113
|
+
}
|
|
114
|
+
else if (token.kind === 'punct' && (token.text === ')' || token.text === ']')) {
|
|
115
|
+
depth -= 1;
|
|
116
|
+
if (token.text === ']' && start >= 0 && depth === 1)
|
|
117
|
+
return { start, end: token.start };
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
return undefined;
|
|
121
|
+
}
|
|
122
|
+
/** Splits the inside of an array into top-level items (commas inside calls and strings do not split). Items keep their text. */
|
|
123
|
+
export function splitItems(inner) {
|
|
124
|
+
const items = [];
|
|
125
|
+
let depth = 0;
|
|
126
|
+
let first;
|
|
127
|
+
let last;
|
|
128
|
+
const flush = () => {
|
|
129
|
+
if (first && last)
|
|
130
|
+
items.push(inner.slice(first.start, last.end));
|
|
131
|
+
first = undefined;
|
|
132
|
+
last = undefined;
|
|
133
|
+
};
|
|
134
|
+
for (const token of tokenize(inner)) {
|
|
135
|
+
if (token.kind === 'punct' && token.text === ',' && depth === 0) {
|
|
136
|
+
flush();
|
|
137
|
+
continue;
|
|
138
|
+
}
|
|
139
|
+
if (token.kind === 'punct' && (token.text === '(' || token.text === '['))
|
|
140
|
+
depth += 1;
|
|
141
|
+
if (token.kind === 'punct' && (token.text === ')' || token.text === ']'))
|
|
142
|
+
depth -= 1;
|
|
143
|
+
first ??= token;
|
|
144
|
+
last = token;
|
|
145
|
+
}
|
|
146
|
+
flush();
|
|
147
|
+
return items;
|
|
148
|
+
}
|
|
149
|
+
/** Children of the first array argument (names and inline components), in order. */
|
|
150
|
+
export function childrenOf(expr) {
|
|
151
|
+
const span = firstArraySpan(expr);
|
|
152
|
+
return span ? splitItems(expr.slice(span.start + 1, span.end)) : [];
|
|
153
|
+
}
|
|
154
|
+
/** Replaces the children of the first array argument with `items`. */
|
|
155
|
+
export function setChildren(expr, items) {
|
|
156
|
+
const span = firstArraySpan(expr);
|
|
157
|
+
if (!span)
|
|
158
|
+
return undefined;
|
|
159
|
+
return `${expr.slice(0, span.start)}[${items.join(', ')}]${expr.slice(span.end + 1)}`;
|
|
160
|
+
}
|
|
161
|
+
function rewriteTokens(expr, replace) {
|
|
162
|
+
const tokens = tokenize(expr);
|
|
163
|
+
let out = '';
|
|
164
|
+
let cursor = 0;
|
|
165
|
+
tokens.forEach((token, index) => {
|
|
166
|
+
const replacement = replace(token, tokens[index + 1]);
|
|
167
|
+
if (replacement === undefined)
|
|
168
|
+
return;
|
|
169
|
+
out += expr.slice(cursor, token.start) + replacement;
|
|
170
|
+
cursor = token.end;
|
|
171
|
+
});
|
|
172
|
+
return out + expr.slice(cursor);
|
|
173
|
+
}
|
|
174
|
+
/** Every component call in an expression, outer and inline ones (`Slide(…, [Bullets([…])])` yields both). */
|
|
175
|
+
export function callsOf(expr) {
|
|
176
|
+
const tokens = tokenize(expr);
|
|
177
|
+
const calls = [];
|
|
178
|
+
tokens.forEach((token, index) => {
|
|
179
|
+
const next = tokens[index + 1];
|
|
180
|
+
if (token.kind !== 'ident' || next?.kind !== 'punct' || next.text !== '(')
|
|
181
|
+
return;
|
|
182
|
+
let depth = 0;
|
|
183
|
+
for (let j = index + 1; j < tokens.length; j++) {
|
|
184
|
+
const current = tokens[j];
|
|
185
|
+
if (current.kind !== 'punct')
|
|
186
|
+
continue;
|
|
187
|
+
if (current.text === '(')
|
|
188
|
+
depth += 1;
|
|
189
|
+
if (current.text === ')') {
|
|
190
|
+
depth -= 1;
|
|
191
|
+
if (depth === 0) {
|
|
192
|
+
calls.push({ component: token.text, inner: expr.slice(next.end, current.start) });
|
|
193
|
+
return;
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
});
|
|
198
|
+
return calls;
|
|
199
|
+
}
|
|
200
|
+
/** Top-level arguments of a call's inside text (commas inside nested calls and arrays do not split). */
|
|
201
|
+
export function argsOf(inner) {
|
|
202
|
+
return splitItems(inner);
|
|
203
|
+
}
|
|
204
|
+
//# sourceMappingURL=syntax.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"syntax.js","sourceRoot":"","sources":["../src/syntax.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,49 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@artkit-ai/format-openui",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"
|
|
5
|
-
"
|
|
3
|
+
"version": "0.2.0",
|
|
4
|
+
"description": "OpenUI Lang native format for artkit: declarations, validation against the artkit component library, compact reading, operations, lint and diff.",
|
|
5
|
+
"license": "Apache-2.0",
|
|
6
|
+
"type": "module",
|
|
7
|
+
"sideEffects": false,
|
|
8
|
+
"keywords": [
|
|
9
|
+
"artkit",
|
|
10
|
+
"ai",
|
|
11
|
+
"agents",
|
|
12
|
+
"artifacts",
|
|
13
|
+
"openui"
|
|
14
|
+
],
|
|
15
|
+
"exports": {
|
|
16
|
+
".": {
|
|
17
|
+
"@artkit/source": "./src/index.ts",
|
|
18
|
+
"types": "./dist/index.d.ts",
|
|
19
|
+
"import": "./dist/index.js"
|
|
20
|
+
},
|
|
21
|
+
"./package.json": "./package.json"
|
|
22
|
+
},
|
|
23
|
+
"files": [
|
|
24
|
+
"dist",
|
|
25
|
+
"src",
|
|
26
|
+
"README.md"
|
|
27
|
+
],
|
|
28
|
+
"engines": {
|
|
29
|
+
"node": ">=22"
|
|
30
|
+
},
|
|
31
|
+
"repository": {
|
|
32
|
+
"type": "git",
|
|
33
|
+
"url": "git+https://github.com/gustavonpco/artkit.git",
|
|
34
|
+
"directory": "packages/format-openui"
|
|
35
|
+
},
|
|
36
|
+
"publishConfig": {
|
|
37
|
+
"access": "public",
|
|
38
|
+
"provenance": true
|
|
39
|
+
},
|
|
40
|
+
"dependencies": {
|
|
41
|
+
"@openuidev/lang-core": "1.1.0",
|
|
42
|
+
"zod": "^4.6.7",
|
|
43
|
+
"@artkit-ai/openui-components": "^0.2.0",
|
|
44
|
+
"@artkit-ai/core": "^0.2.0"
|
|
45
|
+
},
|
|
46
|
+
"scripts": {
|
|
47
|
+
"build": "tsc -b"
|
|
48
|
+
}
|
|
6
49
|
}
|
package/src/diff.ts
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import type { ChangeSummary } from '@artkit-ai/core';
|
|
2
|
+
import { parseStatements } from './syntax.js';
|
|
3
|
+
|
|
4
|
+
/** Changes between two OpenUI documents, targeted by declaration name (`node:capa`). */
|
|
5
|
+
export function diffOpenUI(before: string, after: string): ChangeSummary[] {
|
|
6
|
+
if (before === after) return [];
|
|
7
|
+
const a = new Map(parseStatements(before).statements.map((statement) => [statement.name, statement.expr]));
|
|
8
|
+
const b = new Map(parseStatements(after).statements.map((statement) => [statement.name, statement.expr]));
|
|
9
|
+
const changes: ChangeSummary[] = [];
|
|
10
|
+
for (const [name, expr] of b) {
|
|
11
|
+
if (!a.has(name)) changes.push({ type: 'added', target: `node:${name}`, summary: expr.slice(0, 80) });
|
|
12
|
+
else if (a.get(name) !== expr)
|
|
13
|
+
changes.push({
|
|
14
|
+
type: 'changed',
|
|
15
|
+
target: `node:${name}`,
|
|
16
|
+
summary: `${a.get(name)!.slice(0, 40)} → ${expr.slice(0, 40)}`,
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
for (const name of a.keys())
|
|
20
|
+
if (!b.has(name)) changes.push({ type: 'removed', target: `node:${name}`, summary: name });
|
|
21
|
+
return changes;
|
|
22
|
+
}
|