-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathobjectstack.config.ts
More file actions
76 lines (66 loc) · 3.25 KB
/
objectstack.config.ts
File metadata and controls
76 lines (66 loc) · 3.25 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
// Copyright (c) 2025 ObjectStack. Licensed under the Apache-2.0 license.
import { defineStack } from '@objectstack/spec';
// ─── Barrel Imports (one per metadata type) ─────────────────────────
import * as objects from './src/objects';
import * as actions from './src/actions';
import * as dashboards from './src/dashboards';
import * as reports from './src/reports';
import { allFlows } from './src/flows';
import * as apps from './src/apps';
import * as translations from './src/translations';
// ─── Action Handler Registration (runtime lifecycle) ────────────────
// Handlers are wired separately from metadata. The `onEnable` export
// is called by the kernel's AppPlugin after the engine is ready.
// See: src/actions/register-handlers.ts for the full registration flow.
import { registerTaskActionHandlers } from './src/actions/register-handlers';
/**
* Plugin lifecycle hook — called by AppPlugin when the engine is ready.
* This is where action handlers are registered on the ObjectQL engine.
*/
export const onEnable = async (ctx: { ql: { registerAction: (...args: unknown[]) => void } }) => {
registerTaskActionHandlers(ctx.ql);
};
export default defineStack({
manifest: {
id: 'com.example.todo',
namespace: 'todo',
version: '2.0.0',
type: 'app',
name: 'Todo Manager',
description: 'A comprehensive Todo app demonstrating ObjectStack Protocol features including automation, dashboards, and reports',
},
// Seed Data (top-level, registered as metadata)
data: [
{
object: 'task',
mode: 'upsert' as const,
externalId: 'subject',
records: [
{ subject: 'Learn ObjectStack', status: 'completed', priority: 'high', category: 'work' },
{ subject: 'Build a cool app', status: 'in_progress', priority: 'normal', category: 'work', due_date: new Date(Date.now() + 86400000 * 3) },
{ subject: 'Review PR #102', status: 'completed', priority: 'high', category: 'work' },
{ subject: 'Write Documentation', status: 'not_started', priority: 'normal', category: 'work', due_date: new Date(Date.now() + 86400000) },
{ subject: 'Fix Server bug', status: 'waiting', priority: 'urgent', category: 'work' },
{ subject: 'Buy groceries', status: 'not_started', priority: 'low', category: 'shopping', due_date: new Date() },
{ subject: 'Schedule dentist appointment', status: 'not_started', priority: 'normal', category: 'health', due_date: new Date(Date.now() + 86400000 * 7) },
{ subject: 'Pay utility bills', status: 'not_started', priority: 'high', category: 'finance', due_date: new Date(Date.now() + 86400000 * 2) },
]
}
],
// Auto-collected from barrel index files via Object.values()
objects: Object.values(objects),
actions: Object.values(actions),
dashboards: Object.values(dashboards),
reports: Object.values(reports),
flows: allFlows,
apps: Object.values(apps),
// I18n Configuration — per-locale file organization
i18n: {
defaultLocale: 'en',
supportedLocales: ['en', 'zh-CN', 'ja-JP'],
fallbackLocale: 'en',
fileOrganization: 'per_locale',
},
// I18n Translation Bundles (en, zh-CN, ja-JP)
translations: Object.values(translations),
});