@vira-ui/cli 1.0.0 → 1.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.
@@ -16,6 +16,11 @@ import (
16
16
  // VRP_VERSION is the current protocol version.
17
17
  const VRP_VERSION = "0.1"
18
18
 
19
+ // ProtocolVersion returns the current VRP version.
20
+ func ProtocolVersion() string {
21
+ return VRP_VERSION
22
+ }
23
+
19
24
  // WSMessage matches protocol message schema.
20
25
  type WSMessage struct {
21
26
  Type string \`json:"type"\`
@@ -2,51 +2,65 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.appTsx = void 0;
4
4
  // src/App.tsx
5
- exports.appTsx = `import { useState } from 'react';
6
- import { Container, Heading, Text, Button, Stack, Code } from '@vira-ui/ui';
7
- import { useViraState } from '@vira-ui/core';
8
- import './index.css';
9
-
10
- export function App() {
11
- const { data, sendEvent, sendUpdate, sendDiff } = useViraState<any>('demo');
12
- const [counter, setCounter] = useState(0);
13
-
14
- const bump = () => {
15
- const next = counter + 1;
16
- setCounter(next);
17
- sendUpdate({ counter: next });
18
- };
19
-
20
- const echo = () => {
21
- sendEvent('demo.echo', { message: 'hello from client', at: Date.now(), counter });
22
- };
23
-
24
- const patch = () => {
25
- sendDiff({ patched: true, ts: Date.now() });
26
- };
27
-
28
- return (
29
- <Container design={{ padding: 8, maxWidth: '900px', margin: '0 auto' }}>
30
- <Stack space={3}>
31
- <Heading design={{ fontSize: '2rem', fontWeight: 'bold' }}>Vira Engine demo</Heading>
32
- <Text color="#555">
33
- WebSocket demo channel <Code>demo</Code>. Uses handshake/session, versioned updates/diffs.
34
- </Text>
35
- <Stack direction="row" space={2}>
36
- <Button preset="primary" onClick={bump}>
37
- sendUpdate (counter)
38
- </Button>
39
- <Button preset="secondary" onClick={patch}>
40
- sendDiff (patch)
41
- </Button>
42
- <Button preset="ghost" onClick={echo}>
43
- sendEvent (demo.echo)
44
- </Button>
45
- </Stack>
46
- <Heading design={{ fontSize: '1.1rem' }}>State:</Heading>
47
- <Code block>{JSON.stringify(data ?? {}, null, 2)}</Code>
48
- </Stack>
49
- </Container>
50
- );
51
- }
5
+ exports.appTsx = `import { Container, Heading, Text, Button, Stack, Code } from '@vira-ui/ui';
6
+ import { useViraState } from '@vira-ui/react';
7
+ import './index.css';
8
+
9
+ interface DemoState {
10
+ counter: number;
11
+ patched?: boolean;
12
+ ts?: number;
13
+ message?: string;
14
+ at?: number;
15
+ }
16
+
17
+ export function App() {
18
+ const { data, sendEvent, sendUpdate, sendDiff } = useViraState<DemoState>('demo', {
19
+ enableMsgId: true,
20
+ });
21
+
22
+ // Use server state instead of local counter
23
+ const currentCounter = data?.counter ?? 0;
24
+
25
+ const bump = () => {
26
+ // Send diff with increment - server will handle versioning
27
+ sendDiff({ counter: currentCounter + 1 });
28
+ };
29
+
30
+ const echo = () => {
31
+ sendEvent('demo.echo', {
32
+ message: 'hello from client',
33
+ at: Date.now(),
34
+ counter: currentCounter,
35
+ });
36
+ };
37
+
38
+ const patch = () => {
39
+ sendDiff({ patched: true, ts: Date.now() });
40
+ };
41
+
42
+ return (
43
+ <Container design={{ padding: 8, maxWidth: '900px', margin: '0 auto' }}>
44
+ <Stack space={3}>
45
+ <Heading design={{ fontSize: '2rem', fontWeight: 'bold' }}>Vira Engine demo</Heading>
46
+ <Text color="#555">
47
+ WebSocket demo channel <Code>demo</Code>. Uses handshake/session, versioned updates/diffs.
48
+ </Text>
49
+ <Stack direction="row" space={2}>
50
+ <Button preset="primary" onClick={bump}>
51
+ sendDiff (counter + 1)
52
+ </Button>
53
+ <Button preset="secondary" onClick={patch}>
54
+ sendDiff (patch)
55
+ </Button>
56
+ <Button preset="ghost" onClick={echo}>
57
+ sendEvent (demo.echo)
58
+ </Button>
59
+ </Stack>
60
+ <Heading design={{ fontSize: '1.1rem' }}>State:</Heading>
61
+ <Code block>{JSON.stringify(data ?? {}, null, 2)}</Code>
62
+ </Stack>
63
+ </Container>
64
+ );
65
+ }
52
66
  `;
@@ -2,98 +2,99 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.kanbanService = void 0;
4
4
  // src/services/kanban.ts
5
- exports.kanbanService = `// Kanban service using Vira Core DI container + VRP
6
- // This demonstrates the Vira standard: services for business logic, hooks for React state
7
-
8
- import { createService, useService, useViraState } from '@vira-ui/core';
9
- import type { KanbanBoard, KanbanCard, KanbanChannel } from '../models/kanban';
10
-
11
- // Create kanban service (singleton via DI container)
12
- // Service holds pure business logic helpers
13
- createService('kanban', () => ({
14
- getColumnCards(board: KanbanBoard | null, columnId: string): KanbanCard[] {
15
- if (!board) return [];
16
- const column = board.columns.find(col => col.id === columnId);
17
- if (!column) return [];
18
- return column.cardIds
19
- .map(id => board.cards[id])
20
- .filter((card): card is KanbanCard => card !== undefined)
21
- .sort((a, b) => a.order - b.order);
22
- },
23
- }));
24
-
25
- // Hook for board operations (combines service + VRP state)
26
- export function useKanbanBoard(boardId: string) {
27
- const channel: KanbanChannel = \`kanban:\${boardId}\`;
28
- const { data: board, sendEvent, sendUpdate, sendDiff } = useViraState<KanbanBoard>(channel, null);
29
- const kanbanService = useService<{ getColumnCards: (board: KanbanBoard | null, columnId: string) => KanbanCard[] }>('kanban');
30
-
31
- return {
32
- board,
33
- // Card operations
34
- createCard(columnId: string, title: string, description?: string) {
35
- sendEvent('kanban.card.create', {
36
- boardId,
37
- columnId,
38
- title,
39
- description,
40
- at: Date.now(),
41
- });
42
- },
43
- updateCard(cardId: string, updates: Partial<Pick<KanbanCard, 'title' | 'description' | 'assignee' | 'tags'>>) {
44
- sendDiff({
45
- cards: {
46
- [cardId]: updates,
47
- },
48
- updatedAt: Date.now(),
49
- });
50
- },
51
- moveCard(cardId: string, fromColumnId: string, toColumnId: string, newOrder: number) {
52
- sendEvent('kanban.card.move', {
53
- boardId,
54
- cardId,
55
- fromColumnId,
56
- toColumnId,
57
- newOrder,
58
- at: Date.now(),
59
- });
60
- },
61
- deleteCard(cardId: string) {
62
- sendEvent('kanban.card.delete', {
63
- boardId,
64
- cardId,
65
- at: Date.now(),
66
- });
67
- },
68
- // Column operations
69
- createColumn(title: string, order: number) {
70
- sendEvent('kanban.column.create', {
71
- boardId,
72
- title,
73
- order,
74
- at: Date.now(),
75
- });
76
- },
77
- updateColumn(columnId: string, title: string) {
78
- if (!board) return;
79
- sendDiff({
80
- columns: board.columns.map(col =>
81
- col.id === columnId ? { ...col, title } : col
82
- ),
83
- updatedAt: Date.now(),
84
- });
85
- },
86
- // Board operations
87
- updateBoardTitle(title: string) {
88
- sendDiff({
89
- title,
90
- updatedAt: Date.now(),
91
- });
92
- },
93
- // Helper: get cards for a column (uses service)
94
- getColumnCards(columnId: string): KanbanCard[] {
95
- return kanbanService.getColumnCards(board, columnId);
96
- },
97
- };
98
- }
5
+ exports.kanbanService = `// Kanban service using Vira Core DI container + VRP
6
+ // This demonstrates the Vira standard: services for business logic, hooks for React state
7
+
8
+ import { createService, useService } from '@vira-ui/core';
9
+ import { useViraState } from '@vira-ui/react';
10
+ import type { KanbanBoard, KanbanCard, KanbanChannel } from '../models/kanban';
11
+
12
+ // Create kanban service (singleton via DI container)
13
+ // Service holds pure business logic helpers
14
+ createService('kanban', () => ({
15
+ getColumnCards(board: KanbanBoard | null, columnId: string): KanbanCard[] {
16
+ if (!board) return [];
17
+ const column = board.columns.find(col => col.id === columnId);
18
+ if (!column) return [];
19
+ return column.cardIds
20
+ .map(id => board.cards[id])
21
+ .filter((card): card is KanbanCard => card !== undefined)
22
+ .sort((a, b) => a.order - b.order);
23
+ },
24
+ }));
25
+
26
+ // Hook for board operations (combines service + VRP state)
27
+ export function useKanbanBoard(boardId: string) {
28
+ const channel: KanbanChannel = \`kanban:\${boardId}\`;
29
+ const { data: board, sendEvent, sendUpdate, sendDiff } = useViraState<KanbanBoard>(channel, null);
30
+ const kanbanService = useService<{ getColumnCards: (board: KanbanBoard | null, columnId: string) => KanbanCard[] }>('kanban');
31
+
32
+ return {
33
+ board,
34
+ // Card operations
35
+ createCard(columnId: string, title: string, description?: string) {
36
+ sendEvent('kanban.card.create', {
37
+ boardId,
38
+ columnId,
39
+ title,
40
+ description,
41
+ at: Date.now(),
42
+ });
43
+ },
44
+ updateCard(cardId: string, updates: Partial<Pick<KanbanCard, 'title' | 'description' | 'assignee' | 'tags'>>) {
45
+ sendDiff({
46
+ cards: {
47
+ [cardId]: updates,
48
+ },
49
+ updatedAt: Date.now(),
50
+ });
51
+ },
52
+ moveCard(cardId: string, fromColumnId: string, toColumnId: string, newOrder: number) {
53
+ sendEvent('kanban.card.move', {
54
+ boardId,
55
+ cardId,
56
+ fromColumnId,
57
+ toColumnId,
58
+ newOrder,
59
+ at: Date.now(),
60
+ });
61
+ },
62
+ deleteCard(cardId: string) {
63
+ sendEvent('kanban.card.delete', {
64
+ boardId,
65
+ cardId,
66
+ at: Date.now(),
67
+ });
68
+ },
69
+ // Column operations
70
+ createColumn(title: string, order: number) {
71
+ sendEvent('kanban.column.create', {
72
+ boardId,
73
+ title,
74
+ order,
75
+ at: Date.now(),
76
+ });
77
+ },
78
+ updateColumn(columnId: string, title: string) {
79
+ if (!board) return;
80
+ sendDiff({
81
+ columns: board.columns.map(col =>
82
+ col.id === columnId ? { ...col, title } : col
83
+ ),
84
+ updatedAt: Date.now(),
85
+ });
86
+ },
87
+ // Board operations
88
+ updateBoardTitle(title: string) {
89
+ sendDiff({
90
+ title,
91
+ updatedAt: Date.now(),
92
+ });
93
+ },
94
+ // Helper: get cards for a column (uses service)
95
+ getColumnCards(columnId: string): KanbanCard[] {
96
+ return kanbanService.getColumnCards(board, columnId);
97
+ },
98
+ };
99
+ }
99
100
  `;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vira-ui/cli",
3
- "version": "1.0.0",
3
+ "version": "1.0.1",
4
4
  "description": "CLI tool for ViraJS project generation",
5
5
  "author": "Vira Team",
6
6
  "license": "MIT",