Skip to content

Commit 5edecc5

Browse files
committed
Add ObjectStack server example with configuration and metadata definitions
1 parent 0691fbb commit 5edecc5

10 files changed

Lines changed: 247 additions & 53 deletions

File tree

README.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,12 @@ Since this package is not yet published to NPM, here is how to play with the sou
7676

7777
Edit the JSON schema files and the changes will be instantly reflected in the browser.
7878

79+
## Examples
80+
81+
- [examples/crm](examples/crm) - CRM metadata app with a custom server.
82+
- [examples/kitchen-sink](examples/kitchen-sink) - Component catalog metadata app.
83+
- [examples/objectstack-server](examples/objectstack-server) - Run a metadata app with @objectstack/cli.
84+
7985
## 📦 For React Developers
8086

8187
Install the core packages to use `<SchemaRenderer>` inside your Next.js or Vite app.

content/docs/guide/index.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,3 +6,13 @@ description: "Complete guide to using ObjectUI - from getting started to advance
66
# ObjectUI Guide
77

88
Welcome to the ObjectUI Guide! This comprehensive guide covers everything you need to know to build powerful server-driven UIs with ObjectUI.
9+
10+
## Examples
11+
12+
- [examples/server](examples/server) - Run a metadata app using @objectstack/cli.
13+
14+
### Run the ObjectStack Server Example
15+
16+
```bash
17+
pnpm --filter @object-ui/example-objectstack-server serve
18+
```

examples/server/README.md

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
# ObjectStack Server Example
2+
3+
An ObjectStack server example that runs the metadata app using `@objectstack/cli`.
4+
5+
## Quick Start
6+
7+
```bash
8+
# From the repo root
9+
pnpm install
10+
11+
# Start the server with the ObjectStack CLI
12+
pnpm --filter @object-ui/example-server serve
13+
```
14+
15+
The server starts on http://localhost:3000 by default.
16+
17+
## What's Included
18+
19+
- `objectstack.config.ts` - Metadata app (objects, navigation, seed data)
20+
- `src/objects` - Project and Task object definitions
21+
22+
## CLI Usage
23+
24+
You can also run the CLI directly from this folder:
25+
26+
```bash
27+
objectstack serve objectstack.config.ts
28+
```
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import { defineStack } from '@objectstack/spec';
2+
import { App } from '@objectstack/spec/ui';
3+
import { ObjectQLPlugin } from '@objectstack/objectql';
4+
import { AppPlugin, DriverPlugin } from '@objectstack/runtime';
5+
import { InMemoryDriver } from '@objectstack/driver-memory';
6+
import { ProjectObject } from './src/objects/project.object';
7+
import { TaskObject } from './src/objects/task.object';
8+
9+
const stack = defineStack({
10+
metadata: {
11+
name: 'objectstack-server',
12+
version: '0.1.0',
13+
description: 'ObjectStack server example using @objectstack/cli'
14+
},
15+
objects: [ProjectObject, TaskObject],
16+
apps: [
17+
App.create({
18+
name: 'objectstack_server_app',
19+
label: 'ObjectStack Server',
20+
icon: 'server',
21+
navigation: [
22+
{
23+
id: 'nav_projects',
24+
type: 'object',
25+
objectName: 'project',
26+
label: 'Projects'
27+
},
28+
{
29+
id: 'nav_tasks',
30+
type: 'object',
31+
objectName: 'task',
32+
label: 'Tasks'
33+
}
34+
]
35+
})
36+
],
37+
manifest: {
38+
id: 'com.example.objectstack-server',
39+
version: '1.0.0',
40+
type: 'app',
41+
name: 'ObjectStack Server Example',
42+
description: 'Metadata app served by ObjectStack CLI',
43+
data: [
44+
{
45+
object: 'project',
46+
mode: 'upsert',
47+
records: [
48+
{
49+
_id: 'p1',
50+
name: 'Console Revamp',
51+
owner: 'Ada Lovelace',
52+
status: 'active',
53+
start_date: '2026-02-01'
54+
},
55+
{
56+
_id: 'p2',
57+
name: 'Schema Editor',
58+
owner: 'Alan Turing',
59+
status: 'paused',
60+
start_date: '2026-01-15'
61+
}
62+
]
63+
},
64+
{
65+
object: 'task',
66+
mode: 'upsert',
67+
records: [
68+
{
69+
_id: 't1',
70+
name: 'Draft object schemas',
71+
status: 'doing',
72+
priority: 1,
73+
due_date: '2026-02-10',
74+
is_done: false,
75+
project: 'p1'
76+
},
77+
{
78+
_id: 't2',
79+
name: 'Review navigation',
80+
status: 'todo',
81+
priority: 2,
82+
due_date: '2026-02-15',
83+
is_done: false,
84+
project: 'p1'
85+
}
86+
]
87+
}
88+
]
89+
}
90+
});
91+
92+
export default {
93+
...stack,
94+
plugins: [
95+
new ObjectQLPlugin(),
96+
new DriverPlugin(new InMemoryDriver()),
97+
new AppPlugin(stack)
98+
]
99+
};

examples/server/package.json

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
{
2+
"name": "@object-ui/example-server",
3+
"version": "0.1.0",
4+
"description": "ObjectStack server example using @objectstack/cli",
5+
"private": true,
6+
"main": "dist/objectstack.json",
7+
"types": "src/index.ts",
8+
"exports": {
9+
".": "./src/index.ts",
10+
"./objectstack.config": "./objectstack.config.ts"
11+
},
12+
"scripts": {
13+
"build": "objectstack compile objectstack.config.ts dist/objectstack.json",
14+
"serve": "objectstack serve objectstack.config.ts",
15+
"start": "objectstack serve objectstack.config.ts"
16+
},
17+
"dependencies": {
18+
"@objectstack/spec": "^0.9.0",
19+
"@objectstack/runtime": "^0.9.0",
20+
"@objectstack/objectql": "^0.9.0",
21+
"@objectstack/driver-memory": "^0.9.0"
22+
},
23+
"devDependencies": {
24+
"@objectstack/cli": "^0.9.0",
25+
"typescript": "^5.0.0"
26+
}
27+
}

examples/server/src/index.ts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export * from './objects/project.object';
2+
export * from './objects/task.object';
3+
export { default as config } from '../objectstack.config';
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
import { ObjectSchema, Field } from '@objectstack/spec/data';
2+
3+
export const ProjectObject = ObjectSchema.create({
4+
name: 'project',
5+
label: 'Project',
6+
fields: {
7+
name: Field.text({ label: 'Project Name', required: true }),
8+
owner: Field.text({ label: 'Owner' }),
9+
status: Field.select({
10+
label: 'Status',
11+
options: [
12+
{ label: 'Active', value: 'active' },
13+
{ label: 'Paused', value: 'paused' },
14+
{ label: 'Done', value: 'done' }
15+
]
16+
}),
17+
start_date: Field.date({ label: 'Start Date' })
18+
}
19+
});
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
import { ObjectSchema, Field } from '@objectstack/spec/data';
2+
3+
export const TaskObject = ObjectSchema.create({
4+
name: 'task',
5+
label: 'Task',
6+
fields: {
7+
name: Field.text({ label: 'Task Name', required: true }),
8+
status: Field.select({
9+
label: 'Status',
10+
options: [
11+
{ label: 'Todo', value: 'todo' },
12+
{ label: 'In Progress', value: 'doing' },
13+
{ label: 'Done', value: 'done' }
14+
]
15+
}),
16+
priority: Field.number({ label: 'Priority', scale: 0 }),
17+
due_date: Field.date({ label: 'Due Date' }),
18+
is_done: Field.boolean({ label: 'Completed', defaultValue: false }),
19+
project: Field.lookup('project', { label: 'Project' })
20+
}
21+
});

examples/server/tsconfig.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"compilerOptions": {
3+
"target": "ESNext",
4+
"module": "ESNext",
5+
"moduleResolution": "bundler",
6+
"declaration": true,
7+
"strict": true,
8+
"skipLibCheck": true,
9+
"outDir": "./dist"
10+
},
11+
"include": ["src", "objectstack.config.ts"]
12+
}

0 commit comments

Comments
 (0)