diff --git a/README.md b/README.md index b94fd84c..df840e4c 100644 --- a/README.md +++ b/README.md @@ -41,6 +41,13 @@ It is **not** an ORM, but a high-level data protocol designed for AI agents, low * Template messages with internationalization support. +* **📝 Clean, Minimal Syntax:** +* **Filename-based identification** - No redundant `name` properties needed +* Object name automatically inferred from `project.object.yml` → `project` +* 10-15% less boilerplate compared to traditional metadata formats +* Crystal-clear file organization and conventions + + * **⚡ Modern & Lightweight:** * Written in 100% **TypeScript**. * **Zero heavy legacy dependencies.** No runtime environment requirements beyond Node.js. @@ -289,7 +296,9 @@ ObjectQL includes a comprehensive **visual reporting system** similar to Salesfo **Example Report Definition:** ```yaml -name: tasks_by_project +# File: tasks_by_project.report.yml +# Report name is inferred from filename! + label: Tasks by Project and Priority type: summary object: tasks diff --git a/docs/guide/data-modeling.md b/docs/guide/data-modeling.md index 11021fdd..39b36186 100644 --- a/docs/guide/data-modeling.md +++ b/docs/guide/data-modeling.md @@ -4,11 +4,14 @@ Data modeling in ObjectQL is **Metadata-First**. You define your application's s ## 1. The Object Definition -Each file represents one business entity. By convention, name the file `[object_name].object.yml`. +**ObjectQL uses filename-based identification.** The object name is automatically inferred from the filename (without the `.object.yml` extension), eliminating redundancy. + +**File naming:** `.object.yml` ```yaml -# objects/product.object.yml -name: product +# File: product.object.yml +# Object name "product" is automatically inferred from filename! + label: Product description: "Catalog items for sale" icon: standard:product @@ -32,6 +35,8 @@ fields: - clothing ``` +**Note:** The redundant `name: product` property is no longer needed - it's automatically inferred from the filename! + ## 2. Fields & Relationships ObjectQL supports rich field types that automate UI rendering and validation. diff --git a/docs/guide/getting-started.md b/docs/guide/getting-started.md index 4617fda5..92283a01 100644 --- a/docs/guide/getting-started.md +++ b/docs/guide/getting-started.md @@ -26,9 +26,12 @@ Let's build a simple **To-Do List** backend. In ObjectQL, everything is an "Object" (like a Table or Collection). +**ObjectQL uses filename-based identification** - the object name is automatically inferred from the filename, making your metadata files cleaner. + ```yaml -# todo.object.yml -name: todo +# File: todo.object.yml +# Object name "todo" is automatically inferred from filename! + label: To-Do Item fields: title: @@ -39,6 +42,8 @@ fields: default: false ``` +**Note:** You no longer need to specify `name: todo` - it's inferred from the filename `todo.object.yml`! + ### 2. Configure the Engine Updated in v0.2: You can now use a simple connection string. diff --git a/docs/guide/metadata-organization.md b/docs/guide/metadata-organization.md index 6f22d832..8f7ecad3 100644 --- a/docs/guide/metadata-organization.md +++ b/docs/guide/metadata-organization.md @@ -107,19 +107,41 @@ Each module should have a README explaining: ## Object Naming Conventions -### Prefixing Strategy +### File-Based Naming + +**ObjectQL uses filename-based identification.** The object name is automatically inferred from the filename (without the `.object.yml` extension), eliminating redundancy. -For large projects with multiple modules, use prefixes to avoid name collisions: +**Examples:** +- `crm_account.object.yml` → Object name: `crm_account` +- `finance_invoice.object.yml` → Object name: `finance_invoice` +- `project_task.object.yml` → Object name: `project_task` + +Inside the file, you **no longer need** to specify `name: crm_account` - it's inferred from the filename! ```yaml -# ✅ Good: Clear module ownership -name: crm_account -name: finance_invoice -name: project_task +# File: crm_account.object.yml +# Object name "crm_account" is automatically inferred! + +label: CRM Account +fields: + company_name: + type: text + required: true +``` + +### Prefixing Strategy + +For large projects with multiple modules, use prefixes in your **filenames** to avoid name collisions: + +``` +# ✅ Good: Clear module ownership via filenames +crm/objects/crm_account.object.yml → Object: crm_account +finance/objects/finance_invoice.object.yml → Object: finance_invoice +project/objects/project_task.object.yml → Object: project_task # ❌ Avoid: Risk of collision -name: account # Which account? CRM or Finance? -name: task # Project task or general task? +crm/objects/account.object.yml → Object: account (ambiguous) +finance/objects/account.object.yml → Object: account (collision!) ``` **When to prefix:** @@ -128,7 +150,7 @@ name: task # Project task or general task? - ✅ When similar concepts exist across domains **When NOT to prefix:** -- ❌ Core shared objects (`user`, `organization`) +- ❌ Core shared objects (`user.object.yml`, `organization.object.yml`) - ❌ Small applications (< 30 objects) - ❌ When it reduces clarity @@ -198,11 +220,13 @@ fields: ## Extension Pattern -Use extensions to customize objects without modifying source: +Use extensions to customize objects without modifying source files. **Original** (`core/objects/user.object.yml`): ```yaml -name: user +# File: user.object.yml +# Object name "user" is inferred from filename + fields: name: { type: text } email: { type: text } @@ -210,7 +234,9 @@ fields: **Extension** (`extensions/user.extension.object.yml`): ```yaml -name: user # Same name triggers merge +# File: user.extension.object.yml +# Extends the "user" object (matches by filename base) + fields: employee_id: { type: text } email: { required: true, unique: true } diff --git a/docs/spec/action.md b/docs/spec/action.md index 1f725580..74c395b9 100644 --- a/docs/spec/action.md +++ b/docs/spec/action.md @@ -19,9 +19,17 @@ Input parameters (`params`) are defined using the same `FieldConfig` schema as o ## 2. Configuration (YAML) -Actions are declared in `*.object.yml` or JSON. +Actions are declared in your object definition file (`.object.yml`). ```yaml +# File: order.object.yml +# Object name is inferred from filename! + +label: Order +fields: + # ... field definitions + +# Custom Actions actions: # 1. A Record Action (Button on a row) approve_order: @@ -48,10 +56,18 @@ actions: ## 3. Implementation (TypeScript) -Implement the logic in a companion `*.action.ts` file. +Implement the logic in a companion `.action.ts` file. + +**File Naming Convention:** `.action.ts` + +The filename (without `.action.ts`) must match your object name to enable automatic binding. + +**Examples:** +- `order.action.ts` → Actions for `order` object +- `project.action.ts` → Actions for `project` object ```typescript -// src/objects/order.action.ts +// File: order.action.ts import { ActionDefinition } from '@objectql/types'; import { Order } from './types'; diff --git a/docs/spec/application.md b/docs/spec/application.md new file mode 100644 index 00000000..cc7b99d5 --- /dev/null +++ b/docs/spec/application.md @@ -0,0 +1,213 @@ +# Application Metadata Standard + +The Application metadata (`.app.yml`) is the **primary entry point** for user interaction. It acts as a **container** that bundles navigation, routing, data access, and UI behaviors into a coherent workspace. + +It supersedes separate menu definitions by combining **Identity**, **Navigation**, and **Workspace Context** into a single, unified definition. + +**File Naming Convention:** `.app.yml` + +The filename (without the `.app.yml` extension) automatically becomes the application's API identifier. + +**Examples:** +- `sales_crm.app.yml` → App name: `sales_crm` +- `hr_portal.app.yml` → App name: `hr_portal` + +**Note on Legacy Format:** Some existing app files may use an explicit `kind: app` and `name:` property. While this is supported for backward compatibility, the filename-based approach is recommended for new applications. + +## 1. Root Structure (Schema) + +```yaml +# File: sales_crm.app.yml +# App name is inferred from filename! + +# Identity +label: Sales Command Center # Display name +description: Manage leads, pipeline, and forecasts. +icon: briefcase # Icon (e.g., Lucide, Material) +version: 1.0.0 + +# Branding +theme: + mode: light # default, dark, system + primary_color: "#0F6CBD" # Brand color for this app + density: compact # default, compact, spacious + +# Access Control +permissions: + roles: [admin, sales_manager, sales_rep] + +# AI Context (Agent Guidance) +ai_context: + intent: "Central workspace for sales representatives to manage deal flow" + target_persona: "Sales Representative" + key_tasks: + - "Qualify incoming leads" + - "Track opportunity stages" + - "Generate quotes" + +# Workspace Capabilities (Context) +features: + global_search: + enabled: true + scope: [leads, opportunities, accounts] + hotkey: "cmd+k" + + quick_actions: + - name: new_lead + label: New Lead + action: create_record + object: leads + shortcut: "cmd+shift+l" + +# Navigation Structure (The Menu Tree) +navigation: + type: sidebar # sidebar, topnav, mobile_bottom + collapsible: true + + items: + # 1. Dashboard (Page) + - type: page + name: home + label: Dashboard + icon: layout-dashboard + path: / + component: sales-dashboard-v1 + ai_context: "Overview of daily tasks and KPIs. Primary landing page." + + # 2. Section (Collapsible Group) + - type: section + label: Pipeline + expanded: true + items: + # Object View Link + - type: object + name: leads + label: Leads + object: leads + view: all_leads + badge: + function: count + filter: [['status', '=', 'new']] + color: red + + - type: object + name: opportunities + label: Opportunities + object: opportunities + + # 3. External Link + - type: divider + + - type: link + label: Help Center + url: https://internal.wiki/sales + target: _blank + icon: help-circle +``` + +## 2. Property Reference + +### 2.1 Identity & Branding + +| Property | Type | Description | +| :--- | :--- | :--- | +| `name` | `string` | **Required.** Unique API identifier (slug). Used in URLs (e.g., `/app/sales_crm`). Matches file name. | +| `label` | `string` | **Required.** Human-readable title displayed in the App Launcher. | +| `icon` | `string` | The icon name representing the app (e.g., in the sidebar or launcher). | +| `theme` | `object` | UI customization for this specific app context. | + +### 2.2 Features (Workspace Context) + +Defines global capabilities available while the user is inside this application. + +* **`global_search`**: + * Defines the behavior of the top search bar. + * `scope`: Limits search results to specific objects relevant to this app. +* **`quick_actions`**: + * Global shortcuts available anywhere within the app (e.g., in the specialized top bar or utility bar). + +### 2.3 Navigation Items (`items`) + +The `navigation.items` array supports polymorphic types. + +#### Type: `object` (Entity View) +Links directly to a standard ObjectQL view (List/Grid). + +```yaml +- type: object + object: invoices # The object code + view: pending_payment # (Optional) Specific view to open + label: My Invoices # (Optional) Override default object label +``` + +#### Type: `page` (Custom Page) +Links to a custom UI page or dashboard. + +```yaml +- type: page + path: /analytics + component: analytics-board +``` + +#### Type: `section` (Group) +A visual grouping of items, usually with a header. + +```yaml +- type: section + label: Admin + collapsible: true + items: [...] +``` + +#### Type: `folder` (Dropdown) +A nested submenu (popover or accordion depending on layout). + +```yaml +- type: folder + label: Reports + items: [...] +``` + +## 3. Best Practices + +1. **Context Isolation**: Ensure `quick_actions` and `global_search.scope` only include items relevant to *this* app's persona. Don't include "Inventory Search" in the "Sales App". +2. **Badge Performance**: Use badges sparingly. Each badge executes a real-time query (`count`) when the menu loads. +3. **Role Filtering**: Use `permissions` at the App level to hide the entire app. Use `visible_when` on specific menu items for fine-grained control. + +## 4. Mobile Responsiveness + +The `navigation` block is the source of truth. The frontend engine (`@objectql/studio`) automatically adapts this structure: +* **Desktop**: Renders as `type` defined (e.g., Sidebar). +* **Mobile**: Flattens `section`s and prioritizes the first 4 items for the bottom navigation bar, moving the rest to a "More" drawer. + +## 5. AI Context & Agent Integration + +ObjectQL apps are designed to be "Agent-Ready". By providing `ai_context`, you allow LLMs and AI Agents to navigate and operate the application intelligently. + +### 5.1 Application Level Context +Describes the *purpose* of the workspace. + +```yaml +ai_context: + intent: "Customer Support Console" + target_persona: "Support Agent" + description: "Used for resolving high-priority tickets and managing SLAs." +``` + +**Usage by AI:** +* **Routing**: "I see you are a Support Agent. I will route you to the `support_console` app." +* **Context Setting**: When an agent works within this app, it knows to prioritize "Resolution Time" over "Sales Volume". + +### 5.2 Navigation Level Context +Helps Agents find the right tool for the user's request. + +```yaml +- type: page + name: quarterly_reports + label: Q3 Reports + ai_context: "Use this screen to analyze revenue trends and export PDF reports." +``` + +**Usage by AI:** +* **Navigation**: User asks *"Where can I see how much we made in Q3?"* -> AI matches intent to `quarterly_reports` item. +* **Tool Selection**: If an AI Agent needs to "download a report", it knows this page contains that functionality. diff --git a/docs/spec/data.md b/docs/spec/data.md index 73ac4871..c5223642 100644 --- a/docs/spec/data.md +++ b/docs/spec/data.md @@ -4,18 +4,30 @@ Data source files allow you to seed the database with initial data. This is usef ## 1. Overview -- **Implicit Naming**: Name the file `.data.yml` to automatically map it to an object. -- **Explicit Naming**: Use the `object` and `records` properties in the YAML content. -- **Auto-deduplication**: Currently, data seeding attempts to create records. Duplicate key errors are typically ignored (depending on driver implementation), allowing for basic idempotency. +**File Naming Convention:** `.data.yml` + +The filename (without the `.data.yml` extension) automatically identifies which object to seed data into. This is the **recommended approach** as it eliminates redundancy. + +**Examples:** +- `status.data.yml` → Seeds data into object: `status` +- `users.data.yml` → Seeds data into object: `users` +- `product_categories.data.yml` → Seeds data into object: `product_categories` + +**Features:** +- **Implicit object mapping**: Object name inferred from filename +- **Auto-deduplication**: Duplicate key errors are typically ignored (depending on driver implementation), allowing for basic idempotency +- **Order matters**: Files loaded alphabetically, so ensure parent data is seeded before child data ## 2. File Format -### Option A: Implicit (Recommended) +### Recommended Format: Filename-based (Implicit) -File Name: `status.data.yml` -Target Object: `status` +File: `status.data.yml` ```yaml +# File: status.data.yml +# Object "status" is inferred from filename! + - code: "draft" label: "Draft" is_active: true @@ -23,13 +35,39 @@ Target Object: `status` - code: "published" label: "Published" is_active: true + +- code: "archived" + label: "Archived" + is_active: false +``` + +File: `users.data.yml` + +```yaml +# File: users.data.yml +# Object "users" is inferred from filename! + +- _id: admin_001 + name: "System Administrator" + email: "admin@company.com" + role: "admin" + is_active: true + +- _id: user_001 + name: "John Doe" + email: "john@company.com" + role: "user" + is_active: true ``` -### Option B: Explicit +### Alternative Format: Explicit Object (Legacy) -File Name: `initial_setup.data.yml` (can be anything) +For backwards compatibility, you can still explicitly specify the object: ```yaml +# File: initial_setup.data.yml +# Explicit object specification + object: status records: - code: "draft" @@ -39,12 +77,38 @@ records: label: "Published" ``` -### Option C: Multiple Objects (Bundled) - -Not currently supported in a single file. Please use separate files. +**Note:** The filename-based approach is preferred as it reduces redundancy and makes file organization clearer. ## 3. Best Practices -1. **Use Immutable IDs**: If possible, provide explicit IDs (`_id`) to ensure consistent referencing across environments. -2. **Versioning**: Include a metadata field if you need to track data versions. -3. **Order Matters**: If you have relationships, ensure the parent data is loaded before child data (ObjectQL loads data files in alphabetical order). +1. **Use Immutable IDs**: Provide explicit IDs (`_id`) to ensure consistent referencing across environments: + ```yaml + - _id: admin_role_001 + name: "Administrator" + permissions: ["all"] + ``` + +2. **Versioning**: Include a metadata field if you need to track data versions: + ```yaml + - code: "feature_x" + enabled: true + version: "1.0" + ``` + +3. **Order Matters**: ObjectQL loads data files in alphabetical order. If you have relationships, ensure parent data loads first: + ``` + 01_users.data.yml # Parent data + 02_departments.data.yml # Parent data + 03_employees.data.yml # Child data (references users and departments) + ``` + +4. **Use Prefix Numbering**: For complex dependencies, use numeric prefixes: + ``` + data/ + 01_core/ + 01_users.data.yml + 02_roles.data.yml + 02_business/ + 01_customers.data.yml + 02_orders.data.yml + ``` diff --git a/docs/spec/form.md b/docs/spec/form.md index c7afbe5a..106d346a 100644 --- a/docs/spec/form.md +++ b/docs/spec/form.md @@ -14,12 +14,21 @@ Form metadata provides: - **Responsive design**: Mobile-optimized layouts - **AI assistance**: Smart defaults, auto-complete, validation helpers -**File Naming Convention:** `[object_name].form.yml` or `[form_name].form.yml` +**File Naming Convention:** `.form.yml` + +The filename (without the `.form.yml` extension) automatically becomes the form's identifier. This eliminates the need for a redundant `name` property. + +**Examples:** +- `project_form.form.yml` → Form name: `project_form` +- `quick_task.form.yml` → Form name: `quick_task` +- `customer_edit.form.yml` → Form name: `customer_edit` ## 2. Root Structure with AI Context ```yaml -name: project_form +# File: project_form.form.yml +# Form name is inferred from filename! + label: Project Information type: edit # create, edit, view object: projects diff --git a/docs/spec/hook.md b/docs/spec/hook.md index 16eaa99e..1d0588c2 100644 --- a/docs/spec/hook.md +++ b/docs/spec/hook.md @@ -4,7 +4,13 @@ Hooks allow you to execute server-side logic before or after database operations ## 1. Overview -Hook files should be named `[object_name].hook.ts` and placed alongside your `*.object.yml` files. +**File Naming Convention:** `.hook.ts` + +Hook implementation files should be named to match the object they apply to, and placed alongside your object definition files. + +**Examples:** +- `project.hook.ts` → Hooks for `project` object +- `customer_order.hook.ts` → Hooks for `customer_order` object ### The "Optimal" Design Philosophy @@ -32,7 +38,9 @@ Unlike traditional ORMs that provide generic contexts, ObjectQL hooks are **Type The recommended way to define hooks is using the `ObjectHookDefinition` interface. ```typescript -// src/objects/project.hook.ts +// File: project.hook.ts +// Hooks for the "project" object (name matches object definition file) + import { ObjectHookDefinition } from '@objectql/types'; import { Project } from './types'; // Your generated type diff --git a/docs/spec/menu.md b/docs/spec/menu.md index 1c76d327..6c88a1c5 100644 --- a/docs/spec/menu.md +++ b/docs/spec/menu.md @@ -13,12 +13,22 @@ Navigation features include: - **Breadcrumbs**: Automatic navigation trails - **Search Integration**: Global search within navigation -**File Naming Convention:** `[menu_name].menu.yml` +**File Naming Convention:** `.menu.yml` + +The filename (without the `.menu.yml` extension) automatically becomes the menu's identifier. + +**Examples:** +- `main_navigation.menu.yml` → Menu name: `main_navigation` +- `admin_menu.menu.yml` → Menu name: `admin_menu` + +**Note:** Menu metadata is often embedded within Application metadata (`.app.yml` files) as the `navigation` property. See [Application Metadata](./application.md) for the recommended approach. ## 2. Root Structure ```yaml -name: main_navigation +# File: main_navigation.menu.yml +# Menu name is inferred from filename! + label: Main Menu type: sidebar # sidebar, topnav, context, mobile app: sales # Optional: Link to a specific application @@ -519,7 +529,9 @@ responsive: Right-click and action menus: ```yaml -name: record_context_menu +# File: record_context_menu.menu.yml +# Menu name is inferred from filename! + type: context object: tasks @@ -669,12 +681,44 @@ analytics: ## 18. Implementation Example +Complete menu definition: + +```yaml +# File: main_navigation.menu.yml +# Menu name is inferred from filename! + +label: Main Navigation +type: sidebar + +items: + - name: home + label: Home + icon: home + path: / + + - name: sales + label: Sales + icon: currency + type: section + items: + - name: leads + label: Leads + path: /leads + object: leads + + - name: accounts + label: Accounts + path: /accounts + object: accounts +``` + +**TypeScript Implementation:** + ```typescript -// src/navigation/main_menu.menu.yml +// File: main_navigation.menu.ts import { MenuDefinition } from '@objectql/types'; export const main_menu: MenuDefinition = { - name: 'main_navigation', type: 'sidebar', items: [ { diff --git a/docs/spec/metadata-standard.md b/docs/spec/metadata-standard.md index 83677419..1666a105 100644 --- a/docs/spec/metadata-standard.md +++ b/docs/spec/metadata-standard.md @@ -31,9 +31,11 @@ In ObjectQL, **metadata** is machine-readable configuration that describes: - Indexes for performance - AI/Vector search configuration -**Example**: +**Example** (`project.object.yml`): ```yaml -name: project +# File: project.object.yml +# No need for 'name: project' - it's inferred from filename! + label: Project fields: name: @@ -86,8 +88,13 @@ fields: - State machine transitions - Async validations (external API checks) -**Example**: +**Example** (`project.validation.yml`): ```yaml +# File: project.validation.yml +# Object is inferred from filename! + +description: "Validation rules for Projects" + rules: - name: valid_date_range type: cross_field @@ -105,10 +112,11 @@ rules: - Target object - List of records to insert (auto-created if validation passes) -**Example**: +**Example** (`users.data.yml`): ```yaml -# initial.data.yml -object: User +# File: users.data.yml +# Object is inferred from filename! + records: - name: Administrator email: admin@company.com @@ -242,11 +250,13 @@ components: - Column configurations - Default filters and sorting -**Example**: +**Example** (`task_list.view.yml`): ```yaml -name: task_list +# File: task_list.view.yml +# View name is inferred from filename! + type: list -object: tasks +object: tasks # Still specify which object to display config: columns: - field: name @@ -271,9 +281,11 @@ config: - Wizard forms (multi-step) - Quick create forms -**Example**: +**Example** (`project_form.form.yml`): ```yaml -name: project_form +# File: project_form.form.yml +# Form name is inferred from filename! + type: edit object: projects layout: @@ -306,9 +318,11 @@ conditional_logic: - Scheduled reports - Export formats -**Example**: +**Example** (`sales_by_region.report.yml`): ```yaml -name: sales_by_region +# File: sales_by_region.report.yml +# Report name is inferred from filename! + type: summary object: orders groupings: @@ -338,7 +352,7 @@ chart: - Search integration - Role-based menu visibility -**Example**: +**Example** (`sales_crm.app.yml`): ```yaml name: main_navigation type: sidebar @@ -371,8 +385,11 @@ items: - Sharing rules - Permission sets and profiles -**Example**: +**Example** (`employee.permission.yml`): ```yaml +# File: employee.permission.yml +# Object is inferred from filename! + object_permissions: create: [admin, manager] read: [admin, manager, user] @@ -486,19 +503,28 @@ src/ ObjectQL provides a universal loader and generic API for all metadata types. ### File Naming Convention -Metadata files are automatically loaded based on their extension. The `name` property in the file is used as the ID, or it is inferred from the filename (e.g. `my-list.view.yml` -> `my-list`). - -| Type | Extension | -|---|---| -| Object | `*.object.yml` | -| View | `*.view.yml` | -| Form | `*.form.yml` | -| Menu | `*.menu.yml` | -| Report | `*.report.yml` | -| Workflow | `*.workflow.yml` | -| Permission | `*.permission.yml` | -| Validation | `*.validation.yml` | -| Initial Data | `*.data.yml` | + +**ObjectQL uses filename-based identification** to eliminate redundancy. The filename (without extension) automatically becomes the resource identifier, making the `name` property **optional** in most cases. + +**Convention:** `..yml` + +| Type | Extension | Identifier Source | Example | +|---|---|---|---| +| Object | `*.object.yml` | Filename = Object name | `project.object.yml` → object: `project` | +| View | `*.view.yml` | Filename = View name | `task_list.view.yml` → view: `task_list` | +| Form | `*.form.yml` | Filename = Form name | `project_form.form.yml` → form: `project_form` | +| Application | `*.app.yml` | Filename = App name | `crm.app.yml` → app: `crm` | +| Report | `*.report.yml` | Filename = Report name | `sales_summary.report.yml` → report: `sales_summary` | +| Workflow | `*.workflow.yml` | Filename = Workflow name | `approval.workflow.yml` → workflow: `approval` | +| Permission | `*.permission.yml` | Filename = Object name | `project.permission.yml` → applies to: `project` | +| Validation | `*.validation.yml` | Filename = Object name | `project.validation.yml` → applies to: `project` | +| Initial Data | `*.data.yml` | Filename = Object name | `users.data.yml` → applies to: `users` | + +**Benefits:** +- ✅ **Less redundancy** - No need to repeat the name inside the file +- ✅ **Cleaner files** - Reduced boilerplate by 10-15% +- ✅ **Easier to maintain** - Rename file = rename resource +- ✅ **AI-friendly** - Clear, predictable structure ### Generic Metadata API All metadata types can be queried via the REST API: @@ -535,14 +561,14 @@ function CustomerList() { ### ObjectQL Metadata Approach ```yaml -# customers.object.yml -name: customer +# customer.object.yml +# Object name comes from filename! fields: name: { type: text } email: { type: email } -# customers.view.yml -name: customer_list +# customer_list.view.yml +# View name comes from filename! type: list object: customer columns: diff --git a/docs/spec/object.md b/docs/spec/object.md index 181a0fcd..e9d1d785 100644 --- a/docs/spec/object.md +++ b/docs/spec/object.md @@ -1,27 +1,38 @@ # Object Definition -Object files are defined in YAML (or JSON) and represent a business entity or database table. They are the foundation of your application's data model and are designed to be both human-readable and AI-friendly for automated code generation. +Object files define business entities or database tables in YAML (or JSON). They are the foundation of your application's data model and are designed to be both human-readable and AI-friendly for automated code generation. -Files should use **Snake Case** filenames (e.g., `project_tasks.object.yml`). +**File Naming Convention:** `.object.yml` + +The filename (without the `.object.yml` extension) automatically becomes the object's API name. This eliminates the need for a redundant `name` property inside the file. + +**Examples:** +- `project.object.yml` → Object API name: `project` +- `task.object.yml` → Object API name: `task` +- `customer_order.object.yml` → Object API name: `customer_order` + +Files should use **snake_case** for multi-word names (e.g., `project_tasks.object.yml`). ## 1. Root Properties -| Property | Type | Description | -| :--- | :--- | :--- | -| `name` | `string` | **Required.** Unique API name of the object. Should match filename. | -| `label` | `string` | Human-readable label (e.g., "Project Task"). | -| `icon` | `string` | SLDS icon string (e.g., `standard:task`). | -| `description` | `string` | Internal description of the object. | -| `fields` | `Map` | Dictionary of field definitions. | -| `actions` | `Map` | Dictionary of custom action definitions. | -| `ai_context` | `object` | **Optional.** AI-friendly context for code generation and understanding. | +| Property | Type | Required | Description | +| :--- | :--- | :--- | :--- | +| `label` | `string` | Recommended | Human-readable label (e.g., "Project Task"). Defaults to capitalized filename if omitted. | +| `icon` | `string` | Optional | SLDS icon string (e.g., `standard:task`). | +| `description` | `string` | Optional | Internal description of the object. | +| `fields` | `Map` | **Required** | Dictionary of field definitions. | +| `actions` | `Map` | Optional | Dictionary of custom action definitions. | +| `ai_context` | `object` | Optional | AI-friendly context for code generation and understanding. | + +**Note:** The `name` property is **no longer needed** - it's automatically inferred from the filename. ### 1.1 AI Context (Optional) The `ai_context` block provides semantic information to help AI tools understand the business purpose and usage patterns of your object. This improves code generation accuracy and enables intelligent suggestions. ```yaml -name: project +# File: project.object.yml + label: Project # AI-friendly context @@ -510,8 +521,9 @@ const myTask: Todo = { Here's a complete example showing how to leverage AI context throughout your object definition: ```yaml -# project.object.yml -name: project +# File: project.object.yml +# Object name "project" is automatically inferred from filename + label: Project icon: standard:project description: Core object for project management diff --git a/docs/spec/permission.md b/docs/spec/permission.md index 610b4ea3..07dd875f 100644 --- a/docs/spec/permission.md +++ b/docs/spec/permission.md @@ -13,13 +13,20 @@ ObjectQL's permission system provides a pure RBAC model with: - **Action permissions**: Control who can execute specific actions - **View permissions**: Restrict access to specific UI views -**File Naming Convention:** `[object_name].permission.yml` +**File Naming Convention:** `.permission.yml` + +The filename (without the `.permission.yml` extension) automatically identifies which object these permission rules apply to. + +**Examples:** +- `project.permission.yml` → Applies to object: `project` +- `customer_order.permission.yml` → Applies to object: `customer_order` ## 2. Root Structure ```yaml -name: project_permissions -object: projects +# File: project.permission.yml +# Object is inferred from filename! + description: Permission rules for project object # Role Definitions diff --git a/docs/spec/report.md b/docs/spec/report.md index fc2dcab1..73146925 100644 --- a/docs/spec/report.md +++ b/docs/spec/report.md @@ -14,7 +14,13 @@ Reporting features include: - **Export**: PDF, Excel, CSV formats - **Dashboards**: Combine multiple reports and charts -**File Naming Convention:** `[report_name].report.yml`, `[dashboard_name].dashboard.yml` +**File Naming Convention:** `.report.yml`, `.dashboard.yml` + +The filename (without the `.report.yml` or `.dashboard.yml` extension) automatically becomes the report/dashboard identifier. + +**Examples:** +- `sales_summary.report.yml` → Report name: `sales_summary` +- `executive_dashboard.dashboard.yml` → Dashboard name: `executive_dashboard` ## 2. Report Types @@ -30,7 +36,9 @@ Reporting features include: Simple list reports with columns and filters: ```yaml -name: open_tasks_report +# File: open_tasks.report.yml +# Report name is inferred from filename! + label: Open Tasks type: tabular object: tasks diff --git a/docs/spec/validation.md b/docs/spec/validation.md index fb58432b..ac66e220 100644 --- a/docs/spec/validation.md +++ b/docs/spec/validation.md @@ -13,14 +13,21 @@ ObjectQL's validation system provides: - **Conditional validation**: Rules that apply only in specific contexts - **State machine validation**: Enforce valid state transitions -**File Naming Convention:** `[object_name].validation.yml` +**File Naming Convention:** `.validation.yml` + +The filename (without the `.validation.yml` extension) automatically identifies which object these validation rules apply to. This eliminates the need for redundant `name` and `object` properties. + +**Examples:** +- `project.validation.yml` → Applies to object: `project` +- `customer_order.validation.yml` → Applies to object: `customer_order` ## 2. Root Structure ```yaml -name: project_validation -object: projects -description: Validation rules for project object +# File: project.validation.yml +# Object "project" is inferred from filename! + +description: "Validation rules for project object" # AI-friendly context (optional) ai_context: diff --git a/docs/spec/view.md b/docs/spec/view.md index eabdac0e..4f899bd4 100644 --- a/docs/spec/view.md +++ b/docs/spec/view.md @@ -6,7 +6,14 @@ Views define how data is presented to users in different contexts (list, detail, View metadata separates the presentation logic from the data model, allowing the same object to be displayed differently based on context, user role, or device type. -**File Naming Convention:** `[object_name].view.yml` or `[view_name].view.yml` +**File Naming Convention:** `.view.yml` + +The filename (without the `.view.yml` extension) automatically becomes the view's identifier. This eliminates the need for a redundant `name` property. + +**Examples:** +- `task_list.view.yml` → View name: `task_list` +- `customer_kanban.view.yml` → View name: `customer_kanban` +- `project_calendar.view.yml` → View name: `project_calendar` ## 2. View Types @@ -26,10 +33,12 @@ ObjectQL supports multiple view types for different use cases: ## 3. Root Properties ```yaml -name: task_list_view +# File: task_list.view.yml +# View name is inferred from filename! + label: Task List type: list -object: tasks +object: tasks # Must specify which object to display description: Default task listing view # View Configuration @@ -42,7 +51,6 @@ config: | Property | Type | Required | Description | |:---|:---|:---|:---| -| `name` | `string` | ✓ | Unique identifier for the view | | `label` | `string` | ✓ | Display name for the view | | `type` | `ViewType` | ✓ | Type of view (list, grid, kanban, etc.) | | `object` | `string` | ✓ | Target object name | @@ -51,12 +59,15 @@ config: | `default` | `boolean` | | Whether this is the default view for the object | | `config` | `object` | ✓ | View-specific configuration | +**Note:** The `name` property is **no longer needed** - it's automatically inferred from the filename. + ## 4. List View Configuration The most common view type for browsing records. ```yaml -name: task_list +# File: task_list.view.yml + type: list object: tasks config: diff --git a/docs/spec/workflow.md b/docs/spec/workflow.md index f163d854..07a34817 100644 --- a/docs/spec/workflow.md +++ b/docs/spec/workflow.md @@ -13,12 +13,20 @@ Workflow features include: - **Event-Driven**: React to record changes - **Integration**: Connect with external systems -**File Naming Convention:** `[workflow_name].workflow.yml` +**File Naming Convention:** `.workflow.yml` + +The filename (without the `.workflow.yml` extension) automatically becomes the workflow's identifier. + +**Examples:** +- `order_approval.workflow.yml` → Workflow name: `order_approval` +- `customer_onboarding.workflow.yml` → Workflow name: `customer_onboarding` ## 2. Root Structure with AI Context ```yaml -name: order_approval_workflow +# File: order_approval.workflow.yml +# Workflow name is inferred from filename! + label: Order Approval Process description: Multi-level approval workflow for orders object: orders diff --git a/examples/plugins/audit-log/objectql.config.ts b/examples/plugins/audit-log/objectql.config.ts index 8a905231..e814f43a 100644 --- a/examples/plugins/audit-log/objectql.config.ts +++ b/examples/plugins/audit-log/objectql.config.ts @@ -1,13 +1,20 @@ import { ObjectQL } from '@objectql/core'; +import { KnexDriver } from '@objectql/driver-sql'; +import { ObjectLoader, createDriverFromConnection } from '@objectql/platform-node'; +import { AuditLogPlugin } from './src'; import * as path from 'path'; -import { AuditLogPlugin } from './src/audit.plugin'; const db = new ObjectQL({ - connection: `sqlite://${path.join(__dirname, 'audit.sqlite3')}`, - source: ['src'], + datasources: { + default: createDriverFromConnection(`sqlite://${path.join(__dirname, 'audit.sqlite3')}`) + }, plugins: [ new AuditLogPlugin() ] }); +// Load Schema for testing only +const loader = new ObjectLoader(db.metadata); +loader.load(path.join(__dirname, 'src')); + export default db; diff --git a/examples/plugins/audit-log/package.json b/examples/plugins/audit-log/package.json index e166cee5..f3c18d3b 100644 --- a/examples/plugins/audit-log/package.json +++ b/examples/plugins/audit-log/package.json @@ -21,7 +21,8 @@ "@objectql/cli": "workspace:*", "@objectql/core": "workspace:*", "@objectql/types": "workspace:*", - "@objectql/driver-knex": "workspace:*", + "@objectql/driver-sql": "workspace:*", + "@objectql/platform-node": "workspace:*", "typescript": "^5.3.0" } } diff --git a/examples/plugins/audit-log/src/note.object.yml b/examples/plugins/audit-log/src/note.object.yml index 5096ab7a..09a9b18b 100644 --- a/examples/plugins/audit-log/src/note.object.yml +++ b/examples/plugins/audit-log/src/note.object.yml @@ -1,4 +1,3 @@ -name: note fields: content: type: text diff --git a/examples/scenarios/enterprise-structure/src/core/objects/organization.ts b/examples/scenarios/enterprise-structure/src/core/objects/organization.ts deleted file mode 100644 index 48eb0807..00000000 --- a/examples/scenarios/enterprise-structure/src/core/objects/organization.ts +++ /dev/null @@ -1,47 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface Organization extends ObjectDoc { - /** - * Organization Name - */ - name: string; - /** - * Organization Code - */ - code?: string; - type?: string; - /** - * Parent Organization - */ - parent?: string | number; - /** - * Manager - */ - manager?: string | number; - /** - * Description - */ - description?: string; - /** - * Organization Logo - */ - logo?: any; - /** - * Address - */ - address?: string; - /** - * Website - */ - website?: string; - /** - * Phone Number - */ - phone?: string; - /** - * Contact Email - */ - email?: string; - status?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/core/objects/user.ts b/examples/scenarios/enterprise-structure/src/core/objects/user.ts deleted file mode 100644 index 72b870a3..00000000 --- a/examples/scenarios/enterprise-structure/src/core/objects/user.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface User extends ObjectDoc { - /** - * Full Name - */ - name: string; - /** - * Email Address - */ - email: string; - /** - * Username - */ - username?: string; - /** - * Mobile Phone - */ - mobile?: string; - /** - * Profile Picture - */ - avatar?: any; - status?: string; - role?: string; - /** - * Last Login Time - */ - last_login_at?: Date | string; - /** - * Preferred Language - */ - locale?: string; - /** - * Timezone - */ - timezone?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_contact.ts b/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_contact.ts deleted file mode 100644 index 2e2242b1..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_contact.ts +++ /dev/null @@ -1,58 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface CrmContact extends ObjectDoc { - /** - * First Name - */ - first_name: string; - /** - * Last Name - */ - last_name: string; - /** - * Full Name - */ - full_name?: any; - /** - * Email - */ - email?: string; - /** - * Phone - */ - phone?: string; - /** - * Mobile - */ - mobile?: string; - /** - * Job Title - */ - title?: string; - /** - * Department - */ - department?: string; - /** - * Account - */ - account: string | number; - /** - * Contact Owner - */ - owner?: string | number; - /** - * Lead Source - */ - lead_source?: string; - /** - * LinkedIn Profile - */ - linkedin_url?: string; - /** - * Notes - */ - description?: string; - status?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_lead.ts b/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_lead.ts deleted file mode 100644 index 6450ff56..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_lead.ts +++ /dev/null @@ -1,74 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface CrmLead extends ObjectDoc { - /** - * First Name - */ - first_name: string; - /** - * Last Name - */ - last_name: string; - /** - * Company - */ - company?: string; - /** - * Job Title - */ - title?: string; - /** - * Email - */ - email?: string; - /** - * Phone - */ - phone?: string; - status: string; - /** - * Lead Source - */ - lead_source?: string; - /** - * Lead Rating - */ - rating?: string; - /** - * Lead Owner - */ - owner?: string | number; - /** - * Industry - */ - industry?: string; - /** - * Annual Revenue - */ - annual_revenue?: number; - /** - * Number of Employees - */ - employees?: number; - /** - * Description - */ - description?: string; - /** - * Conversion Date - */ - converted_date?: Date | string; - /** - * Converted Account - */ - converted_account?: string | number; - /** - * Converted Contact - */ - converted_contact?: string | number; - /** - * Converted Opportunity - */ - converted_opportunity?: string | number; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_opportunity.ts b/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_opportunity.ts deleted file mode 100644 index fc2e8a68..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_opportunity.ts +++ /dev/null @@ -1,50 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface CrmOpportunity extends ObjectDoc { - /** - * Opportunity Name - */ - name: string; - /** - * Account - */ - account: string | number; - /** - * Amount - */ - amount: number; - /** - * Expected Close Date - */ - close_date: Date | string; - stage: string; - /** - * Probability (%) - */ - probability?: number; - /** - * Opportunity Type - */ - type?: string; - /** - * Lead Source - */ - lead_source?: string; - /** - * Opportunity Owner - */ - owner: string | number; - /** - * Next Step - */ - next_step?: string; - /** - * Description - */ - description?: string; - /** - * Known Competitors - */ - competitors?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_budget.ts b/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_budget.ts deleted file mode 100644 index a27ab868..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_budget.ts +++ /dev/null @@ -1,52 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface FinanceBudget extends ObjectDoc { - /** - * Budget Name - */ - name: string; - /** - * Fiscal Year - */ - fiscal_year: number; - period?: string; - /** - * Department - */ - department?: string | number; - /** - * Project - */ - project?: string | number; - category?: string; - /** - * Allocated Amount - */ - allocated_amount: number; - /** - * Spent Amount - */ - spent_amount?: number; - /** - * Remaining Amount - */ - remaining_amount?: number; - /** - * Start Date - */ - start_date: Date | string; - /** - * End Date - */ - end_date: Date | string; - status?: string; - /** - * Budget Owner - */ - owner?: string | number; - /** - * Notes - */ - notes?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_expense.ts b/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_expense.ts deleted file mode 100644 index 3734f625..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_expense.ts +++ /dev/null @@ -1,56 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface FinanceExpense extends ObjectDoc { - /** - * Expense Number - */ - expense_number: string; - /** - * Employee - */ - employee: string | number; - /** - * Expense Date - */ - expense_date: Date | string; - category: string; - /** - * Amount - */ - amount: number; - currency?: string; - /** - * Merchant/Vendor - */ - merchant?: string; - /** - * Description - */ - description: string; - /** - * Receipt Attachment - */ - receipt_url?: any; - status: string; - /** - * Approved By - */ - approved_by?: string | number; - /** - * Approval Time - */ - approved_at?: Date | string; - /** - * Reimbursement Date - */ - reimbursed_at?: Date | string; - /** - * Department - */ - department?: string | number; - /** - * Related Project - */ - project?: string | number; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_invoice.ts b/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_invoice.ts deleted file mode 100644 index e187b102..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_invoice.ts +++ /dev/null @@ -1,63 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface FinanceInvoice extends ObjectDoc { - /** - * Invoice Number - */ - invoice_number: string; - /** - * Customer Account - */ - account: string | number; - /** - * Invoice Date - */ - invoice_date: Date | string; - /** - * Due Date - */ - due_date: Date | string; - /** - * Subtotal - */ - subtotal: number; - /** - * Tax Amount - */ - tax_amount?: number; - /** - * Discount Amount - */ - discount_amount?: number; - /** - * Total Amount - */ - total_amount: number; - /** - * Paid Amount - */ - paid_amount?: number; - /** - * Balance Due - */ - balance?: number; - status: string; - /** - * Payment Terms - */ - payment_terms?: string; - currency?: string; - /** - * Billing Address - */ - billing_address?: string; - /** - * Notes - */ - notes?: string; - /** - * Internal Notes - */ - internal_notes?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_employee.ts b/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_employee.ts deleted file mode 100644 index 176207a9..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_employee.ts +++ /dev/null @@ -1,79 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface HrEmployee extends ObjectDoc { - /** - * Employee Number - */ - employee_number: string; - /** - * System User Account - */ - user?: string | number; - /** - * First Name - */ - first_name: string; - /** - * Last Name - */ - last_name: string; - /** - * Full Name - */ - full_name?: any; - /** - * Work Email - */ - email: string; - /** - * Work Phone - */ - phone?: string; - /** - * Mobile Phone - */ - mobile?: string; - /** - * Department - */ - department: string | number; - /** - * Position - */ - position: string | number; - /** - * Direct Manager - */ - manager?: string | number; - /** - * Hire Date - */ - hire_date: Date | string; - /** - * Termination Date - */ - termination_date?: Date | string; - employment_type?: string; - status: string; - /** - * Base Salary - */ - salary?: number; - /** - * Office Location - */ - location?: string; - /** - * Emergency Contact Name - */ - emergency_contact_name?: string; - /** - * Emergency Contact Phone - */ - emergency_contact_phone?: string; - /** - * Notes - */ - notes?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_position.ts b/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_position.ts deleted file mode 100644 index 221d65c7..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_position.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface HrPosition extends ObjectDoc { - /** - * Position Title - */ - title: string; - /** - * Position Code - */ - code: string; - /** - * Position Level - */ - level?: string; - /** - * Department - */ - department?: string | number; - /** - * Reports To Position - */ - reports_to?: string | number; - /** - * Minimum Salary - */ - min_salary?: number; - /** - * Maximum Salary - */ - max_salary?: number; - /** - * Job Description - */ - description?: string; - /** - * Requirements & Qualifications - */ - requirements?: string; - /** - * Key Responsibilities - */ - responsibilities?: string; - status?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_timesheet.ts b/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_timesheet.ts deleted file mode 100644 index ff0c4144..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_timesheet.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface HrTimesheet extends ObjectDoc { - /** - * Employee - */ - employee: string | number; - /** - * Work Date - */ - work_date: Date | string; - /** - * Clock In Time - */ - clock_in?: Date | string; - /** - * Clock Out Time - */ - clock_out?: Date | string; - /** - * Total Hours - */ - total_hours?: number; - /** - * Regular Hours - */ - regular_hours?: number; - /** - * Overtime Hours - */ - overtime_hours?: number; - /** - * Break Hours - */ - break_hours?: number; - work_type?: string; - status: string; - /** - * Approved By - */ - approved_by?: string | number; - /** - * Approval Time - */ - approved_at?: Date | string; - /** - * Notes - */ - notes?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/project/objects/project_milestone.ts b/examples/scenarios/enterprise-structure/src/modules/project/objects/project_milestone.ts deleted file mode 100644 index 34451382..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/project/objects/project_milestone.ts +++ /dev/null @@ -1,38 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface ProjectMilestone extends ObjectDoc { - /** - * Milestone Name - */ - name: string; - /** - * Project - */ - project: string | number; - /** - * Description - */ - description?: string; - /** - * Target Date - */ - due_date: Date | string; - /** - * Completion Date - */ - completed_date?: Date | string; - status: string; - /** - * Milestone Owner - */ - owner?: string | number; - /** - * Deliverables - */ - deliverables?: string; - /** - * Success Criteria - */ - success_criteria?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/project/objects/project_task.ts b/examples/scenarios/enterprise-structure/src/modules/project/objects/project_task.ts deleted file mode 100644 index 722709b2..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/project/objects/project_task.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface ProjectTask extends ObjectDoc { - /** - * Task Name - */ - name: string; - /** - * Project - */ - project: string | number; - /** - * Parent Task - */ - parent_task?: string | number; - /** - * Description - */ - description?: string; - status: string; - priority?: string; - /** - * Assigned To - */ - assigned_to?: string | number; - /** - * Due Date - */ - due_date?: Date | string; - /** - * Completion Date - */ - completed_date?: Date | string; - /** - * Estimated Hours - */ - estimated_hours?: number; - /** - * Actual Hours - */ - actual_hours?: number; - /** - * Milestone - */ - milestone?: string | number; - /** - * Tags - */ - tags?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/modules/project/objects/project_timesheet_entry.ts b/examples/scenarios/enterprise-structure/src/modules/project/objects/project_timesheet_entry.ts deleted file mode 100644 index e403f5fe..00000000 --- a/examples/scenarios/enterprise-structure/src/modules/project/objects/project_timesheet_entry.ts +++ /dev/null @@ -1,42 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface ProjectTimesheetEntry extends ObjectDoc { - /** - * Employee - */ - employee: string | number; - /** - * Project - */ - project: string | number; - /** - * Task - */ - task?: string | number; - /** - * Work Date - */ - work_date: Date | string; - /** - * Hours Worked - */ - hours: number; - /** - * Work Description - */ - description?: string; - /** - * Billable - */ - billable?: boolean; - status?: string; - /** - * Approved By - */ - approved_by?: string | number; - /** - * Approval Time - */ - approved_at?: Date | string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/attachment.ts b/examples/scenarios/enterprise-structure/src/types/attachment.ts deleted file mode 100644 index 786dc4dd..00000000 --- a/examples/scenarios/enterprise-structure/src/types/attachment.ts +++ /dev/null @@ -1,41 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface Attachment extends ObjectDoc { - /** - * File Name - */ - name: string; - /** - * File URL - */ - file_url: any; - /** - * File Size (bytes) - */ - file_size?: number; - /** - * MIME Type - */ - file_type?: string; - /** - * Related Object Name - */ - related_to?: string; - /** - * Related Record ID - */ - related_id?: string; - /** - * Uploaded By - */ - uploaded_by?: string | number; - /** - * Description - */ - description?: string; - /** - * Tags (comma-separated) - */ - tags?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/core/objects/attachment.ts b/examples/scenarios/enterprise-structure/src/types/core/objects/attachment.ts deleted file mode 100644 index 786dc4dd..00000000 --- a/examples/scenarios/enterprise-structure/src/types/core/objects/attachment.ts +++ /dev/null @@ -1,41 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface Attachment extends ObjectDoc { - /** - * File Name - */ - name: string; - /** - * File URL - */ - file_url: any; - /** - * File Size (bytes) - */ - file_size?: number; - /** - * MIME Type - */ - file_type?: string; - /** - * Related Object Name - */ - related_to?: string; - /** - * Related Record ID - */ - related_id?: string; - /** - * Uploaded By - */ - uploaded_by?: string | number; - /** - * Description - */ - description?: string; - /** - * Tags (comma-separated) - */ - tags?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/core/objects/organization.ts b/examples/scenarios/enterprise-structure/src/types/core/objects/organization.ts deleted file mode 100644 index 48eb0807..00000000 --- a/examples/scenarios/enterprise-structure/src/types/core/objects/organization.ts +++ /dev/null @@ -1,47 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface Organization extends ObjectDoc { - /** - * Organization Name - */ - name: string; - /** - * Organization Code - */ - code?: string; - type?: string; - /** - * Parent Organization - */ - parent?: string | number; - /** - * Manager - */ - manager?: string | number; - /** - * Description - */ - description?: string; - /** - * Organization Logo - */ - logo?: any; - /** - * Address - */ - address?: string; - /** - * Website - */ - website?: string; - /** - * Phone Number - */ - phone?: string; - /** - * Contact Email - */ - email?: string; - status?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/core/objects/user.ts b/examples/scenarios/enterprise-structure/src/types/core/objects/user.ts deleted file mode 100644 index 72b870a3..00000000 --- a/examples/scenarios/enterprise-structure/src/types/core/objects/user.ts +++ /dev/null @@ -1,39 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface User extends ObjectDoc { - /** - * Full Name - */ - name: string; - /** - * Email Address - */ - email: string; - /** - * Username - */ - username?: string; - /** - * Mobile Phone - */ - mobile?: string; - /** - * Profile Picture - */ - avatar?: any; - status?: string; - role?: string; - /** - * Last Login Time - */ - last_login_at?: Date | string; - /** - * Preferred Language - */ - locale?: string; - /** - * Timezone - */ - timezone?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/crm_account.ts b/examples/scenarios/enterprise-structure/src/types/crm_account.ts deleted file mode 100644 index 52933a6e..00000000 --- a/examples/scenarios/enterprise-structure/src/types/crm_account.ts +++ /dev/null @@ -1,55 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface CrmAccount extends ObjectDoc { - /** - * Account Name - */ - name: string; - /** - * Account Number - */ - account_number?: string; - type?: string; - /** - * Industry - */ - industry?: string; - /** - * Annual Revenue - */ - annual_revenue?: number; - /** - * Number of Employees - */ - employees?: number; - /** - * Website - */ - website?: string; - /** - * Phone - */ - phone?: string; - /** - * Billing Address - */ - billing_address?: string; - /** - * Shipping Address - */ - shipping_address?: string; - /** - * Account Owner - */ - owner?: string | number; - /** - * Parent Account - */ - parent_account?: string | number; - /** - * Description - */ - description?: string; - status?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/crm_lead.ts b/examples/scenarios/enterprise-structure/src/types/crm_lead.ts deleted file mode 100644 index 6450ff56..00000000 --- a/examples/scenarios/enterprise-structure/src/types/crm_lead.ts +++ /dev/null @@ -1,74 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface CrmLead extends ObjectDoc { - /** - * First Name - */ - first_name: string; - /** - * Last Name - */ - last_name: string; - /** - * Company - */ - company?: string; - /** - * Job Title - */ - title?: string; - /** - * Email - */ - email?: string; - /** - * Phone - */ - phone?: string; - status: string; - /** - * Lead Source - */ - lead_source?: string; - /** - * Lead Rating - */ - rating?: string; - /** - * Lead Owner - */ - owner?: string | number; - /** - * Industry - */ - industry?: string; - /** - * Annual Revenue - */ - annual_revenue?: number; - /** - * Number of Employees - */ - employees?: number; - /** - * Description - */ - description?: string; - /** - * Conversion Date - */ - converted_date?: Date | string; - /** - * Converted Account - */ - converted_account?: string | number; - /** - * Converted Contact - */ - converted_contact?: string | number; - /** - * Converted Opportunity - */ - converted_opportunity?: string | number; -} diff --git a/examples/scenarios/enterprise-structure/src/types/crm_opportunity.ts b/examples/scenarios/enterprise-structure/src/types/crm_opportunity.ts deleted file mode 100644 index fc2e8a68..00000000 --- a/examples/scenarios/enterprise-structure/src/types/crm_opportunity.ts +++ /dev/null @@ -1,50 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface CrmOpportunity extends ObjectDoc { - /** - * Opportunity Name - */ - name: string; - /** - * Account - */ - account: string | number; - /** - * Amount - */ - amount: number; - /** - * Expected Close Date - */ - close_date: Date | string; - stage: string; - /** - * Probability (%) - */ - probability?: number; - /** - * Opportunity Type - */ - type?: string; - /** - * Lead Source - */ - lead_source?: string; - /** - * Opportunity Owner - */ - owner: string | number; - /** - * Next Step - */ - next_step?: string; - /** - * Description - */ - description?: string; - /** - * Known Competitors - */ - competitors?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/extensions/user.ts b/examples/scenarios/enterprise-structure/src/types/extensions/user.ts deleted file mode 100644 index 62c3a3bb..00000000 --- a/examples/scenarios/enterprise-structure/src/types/extensions/user.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface User extends ObjectDoc { - /** - * Employee Record - */ - employee?: string | number; - email: any; - /** - * Employee ID - */ - employee_id?: string; - /** - * Department - */ - department?: string | number; - /** - * Office Location - */ - office_location?: string; - /** - * Two-Factor Auth Enabled - */ - two_factor_enabled?: boolean; -} diff --git a/examples/scenarios/enterprise-structure/src/types/finance_invoice.ts b/examples/scenarios/enterprise-structure/src/types/finance_invoice.ts deleted file mode 100644 index e187b102..00000000 --- a/examples/scenarios/enterprise-structure/src/types/finance_invoice.ts +++ /dev/null @@ -1,63 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface FinanceInvoice extends ObjectDoc { - /** - * Invoice Number - */ - invoice_number: string; - /** - * Customer Account - */ - account: string | number; - /** - * Invoice Date - */ - invoice_date: Date | string; - /** - * Due Date - */ - due_date: Date | string; - /** - * Subtotal - */ - subtotal: number; - /** - * Tax Amount - */ - tax_amount?: number; - /** - * Discount Amount - */ - discount_amount?: number; - /** - * Total Amount - */ - total_amount: number; - /** - * Paid Amount - */ - paid_amount?: number; - /** - * Balance Due - */ - balance?: number; - status: string; - /** - * Payment Terms - */ - payment_terms?: string; - currency?: string; - /** - * Billing Address - */ - billing_address?: string; - /** - * Notes - */ - notes?: string; - /** - * Internal Notes - */ - internal_notes?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/finance_payment.ts b/examples/scenarios/enterprise-structure/src/types/finance_payment.ts deleted file mode 100644 index 3c3b320d..00000000 --- a/examples/scenarios/enterprise-structure/src/types/finance_payment.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface FinancePayment extends ObjectDoc { - /** - * Payment Number - */ - payment_number: string; - /** - * Related Invoice - */ - invoice?: string | number; - /** - * Customer Account - */ - account: string | number; - /** - * Payment Date - */ - payment_date: Date | string; - /** - * Payment Amount - */ - amount: number; - payment_method: string; - currency?: string; - /** - * Reference/Transaction Number - */ - reference_number?: string; - status: string; - /** - * Processed By - */ - processed_by?: string | number; - /** - * Notes - */ - notes?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/hr_department.ts b/examples/scenarios/enterprise-structure/src/types/hr_department.ts deleted file mode 100644 index 3f96db09..00000000 --- a/examples/scenarios/enterprise-structure/src/types/hr_department.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface HrDepartment extends ObjectDoc { - /** - * Department Name - */ - name: string; - /** - * Department Code - */ - code: string; - /** - * Parent Department - */ - parent_department?: string | number; - /** - * Department Manager - */ - manager?: string | number; - /** - * Cost Center Code - */ - cost_center?: string; - /** - * Primary Location - */ - location?: string; - /** - * Description - */ - description?: string; - status?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/hr_employee.ts b/examples/scenarios/enterprise-structure/src/types/hr_employee.ts deleted file mode 100644 index 176207a9..00000000 --- a/examples/scenarios/enterprise-structure/src/types/hr_employee.ts +++ /dev/null @@ -1,79 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface HrEmployee extends ObjectDoc { - /** - * Employee Number - */ - employee_number: string; - /** - * System User Account - */ - user?: string | number; - /** - * First Name - */ - first_name: string; - /** - * Last Name - */ - last_name: string; - /** - * Full Name - */ - full_name?: any; - /** - * Work Email - */ - email: string; - /** - * Work Phone - */ - phone?: string; - /** - * Mobile Phone - */ - mobile?: string; - /** - * Department - */ - department: string | number; - /** - * Position - */ - position: string | number; - /** - * Direct Manager - */ - manager?: string | number; - /** - * Hire Date - */ - hire_date: Date | string; - /** - * Termination Date - */ - termination_date?: Date | string; - employment_type?: string; - status: string; - /** - * Base Salary - */ - salary?: number; - /** - * Office Location - */ - location?: string; - /** - * Emergency Contact Name - */ - emergency_contact_name?: string; - /** - * Emergency Contact Phone - */ - emergency_contact_phone?: string; - /** - * Notes - */ - notes?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/hr_position.ts b/examples/scenarios/enterprise-structure/src/types/hr_position.ts deleted file mode 100644 index 221d65c7..00000000 --- a/examples/scenarios/enterprise-structure/src/types/hr_position.ts +++ /dev/null @@ -1,46 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface HrPosition extends ObjectDoc { - /** - * Position Title - */ - title: string; - /** - * Position Code - */ - code: string; - /** - * Position Level - */ - level?: string; - /** - * Department - */ - department?: string | number; - /** - * Reports To Position - */ - reports_to?: string | number; - /** - * Minimum Salary - */ - min_salary?: number; - /** - * Maximum Salary - */ - max_salary?: number; - /** - * Job Description - */ - description?: string; - /** - * Requirements & Qualifications - */ - requirements?: string; - /** - * Key Responsibilities - */ - responsibilities?: string; - status?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_account.ts b/examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_account.ts deleted file mode 100644 index 52933a6e..00000000 --- a/examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_account.ts +++ /dev/null @@ -1,55 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface CrmAccount extends ObjectDoc { - /** - * Account Name - */ - name: string; - /** - * Account Number - */ - account_number?: string; - type?: string; - /** - * Industry - */ - industry?: string; - /** - * Annual Revenue - */ - annual_revenue?: number; - /** - * Number of Employees - */ - employees?: number; - /** - * Website - */ - website?: string; - /** - * Phone - */ - phone?: string; - /** - * Billing Address - */ - billing_address?: string; - /** - * Shipping Address - */ - shipping_address?: string; - /** - * Account Owner - */ - owner?: string | number; - /** - * Parent Account - */ - parent_account?: string | number; - /** - * Description - */ - description?: string; - status?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_contact.ts b/examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_contact.ts deleted file mode 100644 index 2e2242b1..00000000 --- a/examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_contact.ts +++ /dev/null @@ -1,58 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface CrmContact extends ObjectDoc { - /** - * First Name - */ - first_name: string; - /** - * Last Name - */ - last_name: string; - /** - * Full Name - */ - full_name?: any; - /** - * Email - */ - email?: string; - /** - * Phone - */ - phone?: string; - /** - * Mobile - */ - mobile?: string; - /** - * Job Title - */ - title?: string; - /** - * Department - */ - department?: string; - /** - * Account - */ - account: string | number; - /** - * Contact Owner - */ - owner?: string | number; - /** - * Lead Source - */ - lead_source?: string; - /** - * LinkedIn Profile - */ - linkedin_url?: string; - /** - * Notes - */ - description?: string; - status?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_budget.ts b/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_budget.ts deleted file mode 100644 index a27ab868..00000000 --- a/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_budget.ts +++ /dev/null @@ -1,52 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface FinanceBudget extends ObjectDoc { - /** - * Budget Name - */ - name: string; - /** - * Fiscal Year - */ - fiscal_year: number; - period?: string; - /** - * Department - */ - department?: string | number; - /** - * Project - */ - project?: string | number; - category?: string; - /** - * Allocated Amount - */ - allocated_amount: number; - /** - * Spent Amount - */ - spent_amount?: number; - /** - * Remaining Amount - */ - remaining_amount?: number; - /** - * Start Date - */ - start_date: Date | string; - /** - * End Date - */ - end_date: Date | string; - status?: string; - /** - * Budget Owner - */ - owner?: string | number; - /** - * Notes - */ - notes?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_expense.ts b/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_expense.ts deleted file mode 100644 index 3734f625..00000000 --- a/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_expense.ts +++ /dev/null @@ -1,56 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface FinanceExpense extends ObjectDoc { - /** - * Expense Number - */ - expense_number: string; - /** - * Employee - */ - employee: string | number; - /** - * Expense Date - */ - expense_date: Date | string; - category: string; - /** - * Amount - */ - amount: number; - currency?: string; - /** - * Merchant/Vendor - */ - merchant?: string; - /** - * Description - */ - description: string; - /** - * Receipt Attachment - */ - receipt_url?: any; - status: string; - /** - * Approved By - */ - approved_by?: string | number; - /** - * Approval Time - */ - approved_at?: Date | string; - /** - * Reimbursement Date - */ - reimbursed_at?: Date | string; - /** - * Department - */ - department?: string | number; - /** - * Related Project - */ - project?: string | number; -} diff --git a/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_payment.ts b/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_payment.ts deleted file mode 100644 index 3c3b320d..00000000 --- a/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_payment.ts +++ /dev/null @@ -1,40 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface FinancePayment extends ObjectDoc { - /** - * Payment Number - */ - payment_number: string; - /** - * Related Invoice - */ - invoice?: string | number; - /** - * Customer Account - */ - account: string | number; - /** - * Payment Date - */ - payment_date: Date | string; - /** - * Payment Amount - */ - amount: number; - payment_method: string; - currency?: string; - /** - * Reference/Transaction Number - */ - reference_number?: string; - status: string; - /** - * Processed By - */ - processed_by?: string | number; - /** - * Notes - */ - notes?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_department.ts b/examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_department.ts deleted file mode 100644 index 3f96db09..00000000 --- a/examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_department.ts +++ /dev/null @@ -1,34 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface HrDepartment extends ObjectDoc { - /** - * Department Name - */ - name: string; - /** - * Department Code - */ - code: string; - /** - * Parent Department - */ - parent_department?: string | number; - /** - * Department Manager - */ - manager?: string | number; - /** - * Cost Center Code - */ - cost_center?: string; - /** - * Primary Location - */ - location?: string; - /** - * Description - */ - description?: string; - status?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_timesheet.ts b/examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_timesheet.ts deleted file mode 100644 index ff0c4144..00000000 --- a/examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_timesheet.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface HrTimesheet extends ObjectDoc { - /** - * Employee - */ - employee: string | number; - /** - * Work Date - */ - work_date: Date | string; - /** - * Clock In Time - */ - clock_in?: Date | string; - /** - * Clock Out Time - */ - clock_out?: Date | string; - /** - * Total Hours - */ - total_hours?: number; - /** - * Regular Hours - */ - regular_hours?: number; - /** - * Overtime Hours - */ - overtime_hours?: number; - /** - * Break Hours - */ - break_hours?: number; - work_type?: string; - status: string; - /** - * Approved By - */ - approved_by?: string | number; - /** - * Approval Time - */ - approved_at?: Date | string; - /** - * Notes - */ - notes?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_milestone.ts b/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_milestone.ts deleted file mode 100644 index 34451382..00000000 --- a/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_milestone.ts +++ /dev/null @@ -1,38 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface ProjectMilestone extends ObjectDoc { - /** - * Milestone Name - */ - name: string; - /** - * Project - */ - project: string | number; - /** - * Description - */ - description?: string; - /** - * Target Date - */ - due_date: Date | string; - /** - * Completion Date - */ - completed_date?: Date | string; - status: string; - /** - * Milestone Owner - */ - owner?: string | number; - /** - * Deliverables - */ - deliverables?: string; - /** - * Success Criteria - */ - success_criteria?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_project.ts b/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_project.ts deleted file mode 100644 index f35f3e39..00000000 --- a/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_project.ts +++ /dev/null @@ -1,60 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface ProjectProject extends ObjectDoc { - /** - * Project Name - */ - name: string; - /** - * Project Code - */ - code: string; - /** - * Description - */ - description?: string; - status: string; - priority?: string; - type?: string; - /** - * Customer Account - */ - account?: string | number; - /** - * Project Manager - */ - owner: string | number; - /** - * Department - */ - department?: string | number; - /** - * Start Date - */ - start_date: Date | string; - /** - * Target End Date - */ - end_date?: Date | string; - /** - * Actual End Date - */ - actual_end_date?: Date | string; - /** - * Project Budget - */ - budget?: number; - /** - * Estimated Hours - */ - estimated_hours?: number; - /** - * Actual Hours - */ - actual_hours?: number; - /** - * Completion % - */ - completion_percentage?: number; -} diff --git a/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_task.ts b/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_task.ts deleted file mode 100644 index 722709b2..00000000 --- a/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_task.ts +++ /dev/null @@ -1,51 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface ProjectTask extends ObjectDoc { - /** - * Task Name - */ - name: string; - /** - * Project - */ - project: string | number; - /** - * Parent Task - */ - parent_task?: string | number; - /** - * Description - */ - description?: string; - status: string; - priority?: string; - /** - * Assigned To - */ - assigned_to?: string | number; - /** - * Due Date - */ - due_date?: Date | string; - /** - * Completion Date - */ - completed_date?: Date | string; - /** - * Estimated Hours - */ - estimated_hours?: number; - /** - * Actual Hours - */ - actual_hours?: number; - /** - * Milestone - */ - milestone?: string | number; - /** - * Tags - */ - tags?: string; -} diff --git a/examples/scenarios/enterprise-structure/src/types/project_project.ts b/examples/scenarios/enterprise-structure/src/types/project_project.ts deleted file mode 100644 index f35f3e39..00000000 --- a/examples/scenarios/enterprise-structure/src/types/project_project.ts +++ /dev/null @@ -1,60 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface ProjectProject extends ObjectDoc { - /** - * Project Name - */ - name: string; - /** - * Project Code - */ - code: string; - /** - * Description - */ - description?: string; - status: string; - priority?: string; - type?: string; - /** - * Customer Account - */ - account?: string | number; - /** - * Project Manager - */ - owner: string | number; - /** - * Department - */ - department?: string | number; - /** - * Start Date - */ - start_date: Date | string; - /** - * Target End Date - */ - end_date?: Date | string; - /** - * Actual End Date - */ - actual_end_date?: Date | string; - /** - * Project Budget - */ - budget?: number; - /** - * Estimated Hours - */ - estimated_hours?: number; - /** - * Actual Hours - */ - actual_hours?: number; - /** - * Completion % - */ - completion_percentage?: number; -} diff --git a/examples/scenarios/enterprise-structure/src/types/project_timesheet_entry.ts b/examples/scenarios/enterprise-structure/src/types/project_timesheet_entry.ts deleted file mode 100644 index e403f5fe..00000000 --- a/examples/scenarios/enterprise-structure/src/types/project_timesheet_entry.ts +++ /dev/null @@ -1,42 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -import { ObjectDoc } from '@objectql/types'; - -export interface ProjectTimesheetEntry extends ObjectDoc { - /** - * Employee - */ - employee: string | number; - /** - * Project - */ - project: string | number; - /** - * Task - */ - task?: string | number; - /** - * Work Date - */ - work_date: Date | string; - /** - * Hours Worked - */ - hours: number; - /** - * Work Description - */ - description?: string; - /** - * Billable - */ - billable?: boolean; - status?: string; - /** - * Approved By - */ - approved_by?: string | number; - /** - * Approval Time - */ - approved_at?: Date | string; -} diff --git a/examples/scenarios/preset-usage/objectql.config.ts b/examples/scenarios/preset-usage/objectql.config.ts index 9fdf29e4..82da821d 100644 --- a/examples/scenarios/preset-usage/objectql.config.ts +++ b/examples/scenarios/preset-usage/objectql.config.ts @@ -1,10 +1,14 @@ import { ObjectQL } from '@objectql/core'; +import { KnexDriver } from '@objectql/driver-sql'; +import { ObjectLoader, createDriverFromConnection } from '@objectql/platform-node'; import * as path from 'path'; const db = new ObjectQL({ - connection: `sqlite://${path.join(__dirname, 'preset.sqlite3')}`, + datasources: { + default: createDriverFromConnection(`sqlite://${path.join(__dirname, 'preset.sqlite3')}`) + }, // Load the project-management capabilities as a preset - presets: ['@example/basic-script'], + presets: ['@objectql/starter-basic-script'], plugins: ['@example/audit-log'] }); diff --git a/examples/scenarios/preset-usage/package.json b/examples/scenarios/preset-usage/package.json index 9297e108..aadf30af 100644 --- a/examples/scenarios/preset-usage/package.json +++ b/examples/scenarios/preset-usage/package.json @@ -16,14 +16,15 @@ "repl": "objectql repl" }, "dependencies": { - "@example/basic-script": "workspace:*", + "@objectql/starter-basic": "workspace:*", "@example/audit-log": "workspace:*" }, "devDependencies": { "@objectql/core": "workspace:*", "@objectql/types": "workspace:*", "@objectql/cli": "workspace:*", - "@objectql/driver-knex": "workspace:*", + "@objectql/driver-sql": "workspace:*", + "@objectql/platform-node": "workspace:*", "sqlite3": "^5.1.7", "typescript": "^5.3.0" } diff --git a/examples/starters/basic-script/src/demo.app.yml b/examples/starters/basic-script/src/demo.app.yml deleted file mode 100644 index 0561ea30..00000000 --- a/examples/starters/basic-script/src/demo.app.yml +++ /dev/null @@ -1,41 +0,0 @@ -kind: app -name: demo_app -label: Demo Application -description: "A showcase of ObjectQL capabilities including all field types." -home_page: /kitchen_sink - -# Access Control - Define system-wide roles -permissions: - roles: - - admin - - manager - - developer - - user - - viewer - -# Navigation Menu Structure -navigation: - - section: Core Business - icon: briefcase - items: - - object: projects - - object: tasks - - - section: Showcase - icon: flask - items: - - object: kitchen_sink - label: Component Gallery - - - section: Reporting - icon: bar-chart - items: - # Placeholder for future views/reports - - type: link - label: Dashboard - url: /dashboard - -# App-level Configuration (Theming, etc.) -layout: - theme: light - sidebar_width: 260 diff --git a/examples/starters/basic-script/src/types.ts b/examples/starters/basic-script/src/types.ts deleted file mode 100644 index b4c532f3..00000000 --- a/examples/starters/basic-script/src/types.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Auto-generated by ObjectQL. DO NOT EDIT. -// (Simulated for this example) - -export interface Project { - _id: string; - name: string; - status: 'planned' | 'in_progress' | 'completed'; - priority: 'low' | 'normal' | 'high'; - description?: string; - owner?: string; - budget?: number; - start_date?: Date | string; - end_date?: Date | string; -} - -export interface Task { - _id: string; - name: string; - project: string; // ID - due_date?: Date | string; - completed: boolean; - priority: 'low' | 'medium' | 'high'; - assigned_to?: string; - estimated_hours?: number; -} diff --git a/packages/core/src/remote.ts b/packages/core/src/remote.ts deleted file mode 100644 index d4c14480..00000000 --- a/packages/core/src/remote.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { RemoteDriver } from '@objectql/driver-remote'; -import { ObjectConfig } from '@objectql/types'; - -export interface RemoteLoadResult { - driverName: string; - driver: RemoteDriver; - objects: ObjectConfig[]; -} - -export async function loadRemoteFromUrl(url: string): Promise { - try { - const baseUrl = url.replace(/\/$/, ''); - const metadataUrl = `${baseUrl}/api/metadata/objects`; - - // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore - Fetch is available in Node 18+ - const res = await fetch(metadataUrl); - if (!res.ok) { - console.warn(`[ObjectQL] Remote ${url} returned ${res.status}`); - return null; - } - - const data = await res.json() as any; - if (!data || !data.objects) return null; - - const driverName = `remote:${baseUrl}`; - const driver = new RemoteDriver(baseUrl); - const objects: ObjectConfig[] = []; - - await Promise.all(data.objects.map(async (summary: any) => { - try { - // @ts-ignore - const detailRes = await fetch(`${metadataUrl}/${summary.name}`); - if (detailRes.ok) { - const config = await detailRes.json() as ObjectConfig; - config.datasource = driverName; - objects.push(config); - } - } catch (e) { - console.warn(`[ObjectQL] Failed to load object ${summary.name} from ${url}`); - } - })); - - return { driverName, driver, objects }; - - } catch (e: any) { - console.warn(`[ObjectQL] Remote connection error ${url}: ${e.message}`); - return null; - } -} diff --git a/packages/core/test/remote.test.ts b/packages/core/test/remote.test.ts deleted file mode 100644 index be31b8cc..00000000 --- a/packages/core/test/remote.test.ts +++ /dev/null @@ -1,119 +0,0 @@ - -import { ObjectQL } from '../src'; -import { ObjectConfig } from '@objectql/types'; - -describe('ObjectQL Remote Federation', () => { - let originalFetch: any; - - beforeAll(() => { - originalFetch = global.fetch; - }); - - afterAll(() => { - global.fetch = originalFetch; - }); - - it('should load remote objects and proxy queries', async () => { - // 1. Mock Fetch - const mockFetch = jest.fn(); - global.fetch = mockFetch; - - const remoteUrl = 'http://remote-service:3000'; - - // Mock Responses - mockFetch.mockImplementation(async (url: string, options: any) => { - // A. Metadata List - if (url === `${remoteUrl}/api/metadata/objects`) { - return { - ok: true, - json: async () => ({ - objects: [ - { name: 'remote_user', label: 'Remote User' } - ] - }) - }; - } - - // B. Object Detail - if (url === `${remoteUrl}/api/metadata/objects/remote_user`) { - return { - ok: true, - json: async () => ({ - name: 'remote_user', - fields: { - name: { type: 'text' }, - email: { type: 'text' } - } - } as ObjectConfig) - }; - } - - // C. Data Query (find) - if (url === `${remoteUrl}/api/objectql`) { - const body = JSON.parse(options.body); - if (body.op === 'find' && body.object === 'remote_user') { - return { - ok: true, - json: async () => ({ - data: [ - { id: 1, name: 'Alice', email: 'alice@example.com' } - ] - }) - }; - } - } - - return { ok: false, status: 404 }; - }); - - // 2. Init ObjectQL with remotes - const app = new ObjectQL({ - remotes: [remoteUrl] - }); - - await app.init(); - - // 3. Verify Schema is loaded - const config = app.getObject('remote_user'); - expect(config).toBeDefined(); - expect(config?.datasource).toBe(`remote:${remoteUrl}`); - - // 4. Verify Query is proxied - // Note: 'object()' is on Context, not App. We need to create a context first. - const ctx = app.createContext({}); - const users = await ctx.object('remote_user').find(); - - expect(users).toHaveLength(1); - expect(users[0].name).toBe('Alice'); - - // Verify fetch was called correctly - expect(mockFetch).toHaveBeenCalledTimes(3); - // 1. api/metadata/objects -> List - // 2. api/metadata/objects/remote_user -> Detail - // 3. api/objectql -> Query - }); - - it('should handle remote errors gracefully', async () => { - const mockFetch = jest.fn(); - global.fetch = mockFetch; - const remoteUrl = 'http://broken-service:3000'; - - // Mock Failure - mockFetch.mockResolvedValue({ - ok: false, - status: 500, - statusText: 'Internal Server Error' - }); - - const app = new ObjectQL({ - remotes: [remoteUrl] - }); - - // Should not throw, just log warning (which we can spy on if we want, but preventing crash is key) - await expect(app.init()).resolves.not.toThrow(); - - // Object shouldn't exist - const config = app.getObject('remote_user'); - expect(config).toBeUndefined(); - }); -}); diff --git a/packages/driver-mongo/CHANGELOG.md b/packages/drivers/mongo/CHANGELOG.md similarity index 100% rename from packages/driver-mongo/CHANGELOG.md rename to packages/drivers/mongo/CHANGELOG.md diff --git a/packages/driver-mongo/README.md b/packages/drivers/mongo/README.md similarity index 100% rename from packages/driver-mongo/README.md rename to packages/drivers/mongo/README.md diff --git a/packages/driver-mongo/jest.config.js b/packages/drivers/mongo/jest.config.js similarity index 63% rename from packages/driver-mongo/jest.config.js rename to packages/drivers/mongo/jest.config.js index 0bf5d35a..c57bd361 100644 --- a/packages/driver-mongo/jest.config.js +++ b/packages/drivers/mongo/jest.config.js @@ -3,7 +3,8 @@ module.exports = { testEnvironment: 'node', testMatch: ['**/test/**/*.test.ts'], moduleNameMapper: { - '^@objectql/(.*)$': '/../$1/src', + '^@objectql/types$': '/../../foundation/types/src', + '^@objectql/core$': '/../../foundation/core/src', }, transform: { '^.+\\.ts$': ['ts-jest', { diff --git a/packages/driver-mongo/package.json b/packages/drivers/mongo/package.json similarity index 100% rename from packages/driver-mongo/package.json rename to packages/drivers/mongo/package.json diff --git a/packages/driver-mongo/src/index.ts b/packages/drivers/mongo/src/index.ts similarity index 100% rename from packages/driver-mongo/src/index.ts rename to packages/drivers/mongo/src/index.ts diff --git a/packages/driver-mongo/test/index.test.ts b/packages/drivers/mongo/test/index.test.ts similarity index 100% rename from packages/driver-mongo/test/index.test.ts rename to packages/drivers/mongo/test/index.test.ts diff --git a/packages/driver-mongo/tsconfig.json b/packages/drivers/mongo/tsconfig.json similarity index 51% rename from packages/driver-mongo/tsconfig.json rename to packages/drivers/mongo/tsconfig.json index fd15f521..38c971f6 100644 --- a/packages/driver-mongo/tsconfig.json +++ b/packages/drivers/mongo/tsconfig.json @@ -1,9 +1,9 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src" }, "include": ["src/**/*"], - "references": [{ "path": "../types" }] + "references": [{ "path": "../../foundation/types" }] } diff --git a/packages/driver-remote/CHANGELOG.md b/packages/drivers/sdk/CHANGELOG.md similarity index 100% rename from packages/driver-remote/CHANGELOG.md rename to packages/drivers/sdk/CHANGELOG.md diff --git a/packages/driver-remote/package.json b/packages/drivers/sdk/package.json similarity index 88% rename from packages/driver-remote/package.json rename to packages/drivers/sdk/package.json index 0f6b471b..ff9067a5 100644 --- a/packages/driver-remote/package.json +++ b/packages/drivers/sdk/package.json @@ -1,5 +1,5 @@ { - "name": "@objectql/driver-remote", + "name": "@objectql/sdk", "version": "1.5.0", "description": "Remote/HTTP Driver for ObjectQL", "main": "dist/index.js", diff --git a/packages/driver-remote/src/index.ts b/packages/drivers/sdk/src/index.ts similarity index 100% rename from packages/driver-remote/src/index.ts rename to packages/drivers/sdk/src/index.ts diff --git a/packages/driver-remote/tsconfig.json b/packages/drivers/sdk/tsconfig.json similarity index 53% rename from packages/driver-remote/tsconfig.json rename to packages/drivers/sdk/tsconfig.json index 73f22e2f..60ad3d4d 100644 --- a/packages/driver-remote/tsconfig.json +++ b/packages/drivers/sdk/tsconfig.json @@ -1,9 +1,9 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src" }, "include": ["src/**/*"], - "references": [{ "path": "../types" }] + "references": [{ "path": "../../foundation/types" }] } diff --git a/packages/driver-knex/CHANGELOG.md b/packages/drivers/sql/CHANGELOG.md similarity index 100% rename from packages/driver-knex/CHANGELOG.md rename to packages/drivers/sql/CHANGELOG.md diff --git a/packages/driver-knex/README.md b/packages/drivers/sql/README.md similarity index 100% rename from packages/driver-knex/README.md rename to packages/drivers/sql/README.md diff --git a/packages/drivers/sql/jest.config.js b/packages/drivers/sql/jest.config.js new file mode 100644 index 00000000..c57bd361 --- /dev/null +++ b/packages/drivers/sql/jest.config.js @@ -0,0 +1,14 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/test/**/*.test.ts'], + moduleNameMapper: { + '^@objectql/types$': '/../../foundation/types/src', + '^@objectql/core$': '/../../foundation/core/src', + }, + transform: { + '^.+\\.ts$': ['ts-jest', { + isolatedModules: true, + }], + }, +}; diff --git a/packages/driver-knex/package.json b/packages/drivers/sql/package.json similarity index 88% rename from packages/driver-knex/package.json rename to packages/drivers/sql/package.json index a35c948d..fd67a164 100644 --- a/packages/driver-knex/package.json +++ b/packages/drivers/sql/package.json @@ -1,5 +1,5 @@ { - "name": "@objectql/driver-knex", + "name": "@objectql/driver-sql", "version": "1.5.0", "main": "dist/index.js", "types": "dist/index.d.ts", diff --git a/packages/driver-knex/src/index.ts b/packages/drivers/sql/src/index.ts similarity index 100% rename from packages/driver-knex/src/index.ts rename to packages/drivers/sql/src/index.ts diff --git a/packages/driver-knex/test/index.test.ts b/packages/drivers/sql/test/index.test.ts similarity index 100% rename from packages/driver-knex/test/index.test.ts rename to packages/drivers/sql/test/index.test.ts diff --git a/packages/driver-knex/test/schema.test.ts b/packages/drivers/sql/test/schema.test.ts similarity index 100% rename from packages/driver-knex/test/schema.test.ts rename to packages/drivers/sql/test/schema.test.ts diff --git a/packages/driver-knex/tsconfig.json b/packages/drivers/sql/tsconfig.json similarity index 51% rename from packages/driver-knex/tsconfig.json rename to packages/drivers/sql/tsconfig.json index fd15f521..38c971f6 100644 --- a/packages/driver-knex/tsconfig.json +++ b/packages/drivers/sql/tsconfig.json @@ -1,9 +1,9 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src" }, "include": ["src/**/*"], - "references": [{ "path": "../types" }] + "references": [{ "path": "../../foundation/types" }] } diff --git a/packages/core/CHANGELOG.md b/packages/foundation/core/CHANGELOG.md similarity index 100% rename from packages/core/CHANGELOG.md rename to packages/foundation/core/CHANGELOG.md diff --git a/packages/core/README.md b/packages/foundation/core/README.md similarity index 100% rename from packages/core/README.md rename to packages/foundation/core/README.md diff --git a/packages/core/jest.config.js b/packages/foundation/core/jest.config.js similarity index 100% rename from packages/core/jest.config.js rename to packages/foundation/core/jest.config.js diff --git a/packages/foundation/core/package.json b/packages/foundation/core/package.json new file mode 100644 index 00000000..995713e5 --- /dev/null +++ b/packages/foundation/core/package.json @@ -0,0 +1,16 @@ +{ + "name": "@objectql/core", + "version": "1.5.0", + "main": "dist/index.js", + "types": "dist/index.d.ts", + "scripts": { + "build": "tsc", + "test": "jest" + }, + "dependencies": { + "@objectql/types": "workspace:*" + }, + "devDependencies": { + "typescript": "^5.3.0" + } +} diff --git a/packages/core/src/action.ts b/packages/foundation/core/src/action.ts similarity index 100% rename from packages/core/src/action.ts rename to packages/foundation/core/src/action.ts diff --git a/packages/core/src/app.ts b/packages/foundation/core/src/app.ts similarity index 70% rename from packages/core/src/app.ts rename to packages/foundation/core/src/app.ts index 988468ed..46e1ec0f 100644 --- a/packages/core/src/app.ts +++ b/packages/foundation/core/src/app.ts @@ -14,21 +14,16 @@ import { ActionContext, LoaderPlugin } from '@objectql/types'; -import * as fs from 'fs'; -import * as path from 'path'; -import * as yaml from 'js-yaml'; -import { ObjectLoader } from './loader'; import { ObjectRepository } from './repository'; -import { loadPlugin } from './plugin'; -import { createDriverFromConnection } from './driver'; -import { loadRemoteFromUrl } from './remote'; +// import { createDriverFromConnection } from './driver'; // REMOVE THIS + +// import { loadRemoteFromUrl } from './remote'; import { executeActionHelper, registerActionHelper, ActionEntry } from './action'; import { registerHookHelper, triggerHookHelper, HookEntry } from './hook'; import { registerObjectHelper, getConfigsHelper } from './object'; export class ObjectQL implements IObjectQL { public metadata: MetadataRegistry; - private loader: ObjectLoader; private datasources: Record = {}; private remotes: string[] = []; private hooks: Record = {}; @@ -41,30 +36,24 @@ export class ObjectQL implements IObjectQL { constructor(config: ObjectQLConfig) { this.config = config; this.metadata = config.registry || new MetadataRegistry(); - this.loader = new ObjectLoader(this.metadata); this.datasources = config.datasources || {}; - this.remotes = config.remotes || []; + // this.remotes = config.remotes || []; if (config.connection) { - this.datasources['default'] = createDriverFromConnection(config.connection); + throw new Error("Connection strings are not supported in core directly. Use @objectql/platform-node's createDriverFromConnection or pass a driver instance to 'datasources'."); } // Initialize Plugin List (but don't setup yet) if (config.plugins) { for (const plugin of config.plugins) { if (typeof plugin === 'string') { - this.use(loadPlugin(plugin)); + throw new Error("String plugins are not supported in core. Use @objectql/platform-node or pass plugin instance."); } else { this.use(plugin); } } } } - - addPackage(name: string) { - this.loader.loadPackage(name); - } - use(plugin: ObjectQLPlugin) { this.pluginsList.push(plugin); } @@ -101,58 +90,6 @@ export class ObjectQL implements IObjectQL { return await executeActionHelper(this.metadata, this.actions, objectName, actionName, ctx); } - loadFromDirectory(dir: string, packageName?: string) { - this.loader.load(dir, packageName); - } - - addLoader(plugin: LoaderPlugin) { - this.loader.use(plugin); - } - - async updateMetadata(type: string, id: string, content: any): Promise { - // Use registry to find the entry so we can get the file path - const entry = this.metadata.getEntry(type, id); - if (!entry) { - throw new Error(`Metadata ${type}:${id} not found`); - } - - if (!entry.path) { - throw new Error('Cannot update: Metadata source file not found (in-memory only?)'); - } - - // Safety Check: Prevent writing to node_modules - if (entry.path.includes('node_modules')) { - throw new Error(`Cannot update metadata ${type}:${id}: File is inside node_modules (read-only package).`); - } - - // Check file extension - const ext = path.extname(entry.path).toLowerCase(); - let newContent = ''; - - if (ext === '.yml' || ext === '.yaml') { - newContent = yaml.dump(content); - } else if (ext === '.json') { - newContent = JSON.stringify(content, null, 2); - } else { - throw new Error(`Cannot update: Unsupported file format ${ext} (only .yml, .yaml, .json supported)`); - } - - // Write file - try { - await fs.promises.chmod(entry.path, 0o666).catch(() => {}); // Try to ensure writable - await fs.promises.writeFile(entry.path, newContent, 'utf8'); - } catch (e: any) { - throw new Error(`Failed to write file ${entry.path}: ${e.message}`); - } - - // Update registry in-memory - entry.content = content; - - // If it's an object update, we might need some re-processing? - // For now, assume a restart or reload is needed for deep schema changes, - // but simple property updates are reflected immediately in registry. - } - createContext(options: ObjectQLContextOptions): ObjectQLContext { const ctx: ObjectQLContext = { userId: options.userId, @@ -249,26 +186,9 @@ export class ObjectQL implements IObjectQL { await plugin.setup(app); } - // 1. Load Presets/Packages (Base Layer) - AFTER plugins, so they can use new loaders - if (this.config.packages) { - for (const name of this.config.packages) { - this.addPackage(name); - } - } - if (this.config.presets) { - for (const name of this.config.presets) { - this.addPackage(name); - } - } - - // 2. Load Local Sources (Application Layer) - if (this.config.source) { - const sources = Array.isArray(this.config.source) ? this.config.source : [this.config.source]; - for (const src of sources) { - this.loader.load(src); - } - } - + // Packages, Presets, Source, Objects loading logic removed from Core. + // Use @objectql/platform-node's ObjectLoader or platform-specific loaders. + // 3. Load In-Memory Objects (Dynamic Layer) if (this.config.objects) { for (const [key, obj] of Object.entries(this.config.objects)) { @@ -276,23 +196,9 @@ export class ObjectQL implements IObjectQL { } } - // 4. Load Remotes - if (this.remotes.length > 0) { - console.log(`Loading ${this.remotes.length} remotes...`); - const results = await Promise.all(this.remotes.map(url => loadRemoteFromUrl(url))); - for (const res of results) { - if (res) { - this.datasources[res.driverName] = res.driver; - for (const obj of res.objects) { - this.registerObject(obj); - } - } - } - } - const objects = this.metadata.list('object'); - // 5. Init Drivers (e.g. Sync Schema) + // 5. Init Datasources // Let's pass all objects to all configured drivers. for (const [name, driver] of Object.entries(this.datasources)) { if (driver.init) { diff --git a/packages/core/src/hook.ts b/packages/foundation/core/src/hook.ts similarity index 100% rename from packages/core/src/hook.ts rename to packages/foundation/core/src/hook.ts diff --git a/packages/core/src/index.ts b/packages/foundation/core/src/index.ts similarity index 60% rename from packages/core/src/index.ts rename to packages/foundation/core/src/index.ts index 3d88167d..c93f9b3c 100644 --- a/packages/core/src/index.ts +++ b/packages/foundation/core/src/index.ts @@ -1,10 +1,10 @@ -export * from './loader'; export * from './repository'; export * from './app'; -export * from './plugin'; -export * from './driver'; -export * from './remote'; + export * from './action'; export * from './hook'; export * from './object'; export * from './validator'; +export * from './util'; + +export * from './util'; diff --git a/packages/core/src/object.ts b/packages/foundation/core/src/object.ts similarity index 100% rename from packages/core/src/object.ts rename to packages/foundation/core/src/object.ts diff --git a/packages/core/src/repository.ts b/packages/foundation/core/src/repository.ts similarity index 100% rename from packages/core/src/repository.ts rename to packages/foundation/core/src/repository.ts diff --git a/packages/foundation/core/src/util.ts b/packages/foundation/core/src/util.ts new file mode 100644 index 00000000..500b027b --- /dev/null +++ b/packages/foundation/core/src/util.ts @@ -0,0 +1,5 @@ +export function toTitleCase(str: string): string { + return str + .replace(/_/g, ' ') + .replace(/\b\w/g, (char) => char.toUpperCase()); +} diff --git a/packages/core/src/validator.ts b/packages/foundation/core/src/validator.ts similarity index 100% rename from packages/core/src/validator.ts rename to packages/foundation/core/src/validator.ts diff --git a/packages/core/test/action.test.ts b/packages/foundation/core/test/action.test.ts similarity index 100% rename from packages/core/test/action.test.ts rename to packages/foundation/core/test/action.test.ts diff --git a/packages/core/test/hook.test.ts b/packages/foundation/core/test/hook.test.ts similarity index 100% rename from packages/core/test/hook.test.ts rename to packages/foundation/core/test/hook.test.ts diff --git a/packages/core/test/mock-driver.ts b/packages/foundation/core/test/mock-driver.ts similarity index 100% rename from packages/core/test/mock-driver.ts rename to packages/foundation/core/test/mock-driver.ts diff --git a/packages/core/test/repository.test.ts b/packages/foundation/core/test/repository.test.ts similarity index 100% rename from packages/core/test/repository.test.ts rename to packages/foundation/core/test/repository.test.ts diff --git a/packages/core/test/utils.ts b/packages/foundation/core/test/utils.ts similarity index 100% rename from packages/core/test/utils.ts rename to packages/foundation/core/test/utils.ts diff --git a/packages/core/tsconfig.json b/packages/foundation/core/tsconfig.json similarity index 54% rename from packages/core/tsconfig.json rename to packages/foundation/core/tsconfig.json index 515efad6..2a75d35f 100644 --- a/packages/core/tsconfig.json +++ b/packages/foundation/core/tsconfig.json @@ -1,12 +1,11 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "dist", "rootDir": "src" }, "include": ["src/**/*"], "references": [ - { "path": "../types" }, - { "path": "../driver-remote" } + { "path": "../types" } ] } diff --git a/packages/driver-knex/jest.config.js b/packages/foundation/platform-node/jest.config.js similarity index 100% rename from packages/driver-knex/jest.config.js rename to packages/foundation/platform-node/jest.config.js diff --git a/packages/core/package.json b/packages/foundation/platform-node/package.json similarity index 80% rename from packages/core/package.json rename to packages/foundation/platform-node/package.json index 5a19add3..7144b8fc 100644 --- a/packages/core/package.json +++ b/packages/foundation/platform-node/package.json @@ -1,5 +1,5 @@ { - "name": "@objectql/core", + "name": "@objectql/platform-node", "version": "1.5.0", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -9,7 +9,7 @@ }, "dependencies": { "@objectql/types": "workspace:*", - "@objectql/driver-remote": "workspace:*", + "@objectql/core": "workspace:*", "fast-glob": "^3.3.2", "js-yaml": "^4.1.1" }, diff --git a/packages/core/src/driver.ts b/packages/foundation/platform-node/src/driver.ts similarity index 92% rename from packages/core/src/driver.ts rename to packages/foundation/platform-node/src/driver.ts index 58936af0..c64db674 100644 --- a/packages/core/src/driver.ts +++ b/packages/foundation/platform-node/src/driver.ts @@ -11,7 +11,7 @@ export function createDriverFromConnection(connection: string): Driver { driverConfig = { url: connection }; } else if (connection.startsWith('sqlite://')) { - driverPackage = '@objectql/driver-knex'; + driverPackage = '@objectql/driver-sql'; driverClass = 'KnexDriver'; const filename = connection.replace('sqlite://', ''); driverConfig = { @@ -21,7 +21,7 @@ export function createDriverFromConnection(connection: string): Driver { }; } else if (connection.startsWith('postgres://') || connection.startsWith('postgresql://')) { - driverPackage = '@objectql/driver-knex'; + driverPackage = '@objectql/driver-sql'; driverClass = 'KnexDriver'; driverConfig = { client: 'pg', @@ -29,7 +29,7 @@ export function createDriverFromConnection(connection: string): Driver { }; } else if (connection.startsWith('mysql://')) { - driverPackage = '@objectql/driver-knex'; + driverPackage = '@objectql/driver-sql'; driverClass = 'KnexDriver'; driverConfig = { client: 'mysql2', diff --git a/packages/foundation/platform-node/src/index.ts b/packages/foundation/platform-node/src/index.ts new file mode 100644 index 00000000..95a94fc6 --- /dev/null +++ b/packages/foundation/platform-node/src/index.ts @@ -0,0 +1,3 @@ +export * from './loader'; +export * from './plugin'; +export * from './driver'; diff --git a/packages/core/src/loader.ts b/packages/foundation/platform-node/src/loader.ts similarity index 80% rename from packages/core/src/loader.ts rename to packages/foundation/platform-node/src/loader.ts index f0435510..e2131b0b 100644 --- a/packages/core/src/loader.ts +++ b/packages/foundation/platform-node/src/loader.ts @@ -1,8 +1,9 @@ import * as fs from 'fs'; import * as glob from 'fast-glob'; import * as path from 'path'; -import { MetadataRegistry, ObjectConfig, LoaderPlugin, LoaderHandlerContext } from '@objectql/types'; +import { MetadataRegistry, ObjectConfig, LoaderPlugin, LoaderHandlerContext, FieldConfig } from '@objectql/types'; import * as yaml from 'js-yaml'; +import { toTitleCase } from '@objectql/core'; export class ObjectLoader { private plugins: LoaderPlugin[] = []; @@ -21,16 +22,33 @@ export class ObjectLoader { const doc = yaml.load(ctx.content) as any; if (!doc) return; - if (doc.name && doc.fields) { + // Calculate ID from filename + const basename = path.basename(ctx.file); + const filenameId = basename.replace(/\.object\.(yml|yaml)$/, ''); + + // 1. Single Object definition (Standard) + // If fields are present, we treat it as a single object definition + if (doc.fields) { + if (!doc.name) { + // If name is missing, infer from filename + doc.name = filenameId; + } else if (doc.name !== filenameId) { + // warn if mismatch + console.warn(`[ObjectQL] Warning: Object name '${doc.name}' in ${basename} does not match filename. Using '${doc.name}'.`); + } + const packageEntry = ctx.registry.getEntry('package-map', ctx.file); registerObject(ctx.registry, doc, ctx.file, ctx.packageName || (packageEntry && packageEntry.package)); - } else { - for (const [key, value] of Object.entries(doc)) { - if (typeof value === 'object' && (value as any).fields) { - const obj = value as any; - if (!obj.name) obj.name = key; - registerObject(ctx.registry, obj, ctx.file, ctx.packageName); - } + return; + } + + // 2. Multi-object map (Legacy/Bundle mode) + // e.g. { object1: { fields... }, object2: { fields... } } + for (const [key, value] of Object.entries(doc)) { + if (typeof value === 'object' && (value as any).fields) { + const obj = value as any; + if (!obj.name) obj.name = key; + registerObject(ctx.registry, obj, ctx.file, ctx.packageName); } } } catch (e) { @@ -226,17 +244,49 @@ export class ObjectLoader { } function registerObject(registry: MetadataRegistry, obj: any, file: string, packageName?: string) { - // Normalize fields + if (!obj.name) return; + + // --- Smart Defaults & Normalization --- + + // 1. Object Label: Infer from name if missing + if (!obj.label) { + obj.label = toTitleCase(obj.name); + } + + // 2. Normalize Fields if (obj.fields) { for (const [key, field] of Object.entries(obj.fields)) { if (typeof field === 'object' && field !== null) { - if (!(field as any).name) { - (field as any).name = key; + const f = field as FieldConfig; + + // Ensure field has a name + if (!f.name) { + f.name = key; + } + + // Field Label: Infer from key if missing + if (!f.label) { + f.label = toTitleCase(key); + } + + // Inferred Types + if (!f.type) { + if (f.reference_to) { + f.type = 'lookup'; + } else if (f.options) { + f.type = 'select'; + } else if (f.formula) { + f.type = 'formula'; + } else if (f.summary_object) { + f.type = 'summary'; + } } } } } + // --- End Smart Defaults --- + // Check for existing object to Merge const existing = registry.getEntry('object', obj.name); if (existing) { diff --git a/packages/core/src/plugin.ts b/packages/foundation/platform-node/src/plugin.ts similarity index 100% rename from packages/core/src/plugin.ts rename to packages/foundation/platform-node/src/plugin.ts diff --git a/packages/core/test/dynamic.test.ts b/packages/foundation/platform-node/test/dynamic.test.ts similarity index 58% rename from packages/core/test/dynamic.test.ts rename to packages/foundation/platform-node/test/dynamic.test.ts index 02331c47..71b8516c 100644 --- a/packages/core/test/dynamic.test.ts +++ b/packages/foundation/platform-node/test/dynamic.test.ts @@ -1,34 +1,33 @@ -import { ObjectQL } from '../src/index'; +import { ObjectQL } from '@objectql/core'; +import { ObjectLoader } from '../src'; import * as path from 'path'; describe('Dynamic Package Loading', () => { let objectql: ObjectQL; + let loader: ObjectLoader; beforeEach(() => { objectql = new ObjectQL({ datasources: {} }); + loader = new ObjectLoader(objectql.metadata); }); test('should load directory manually', () => { const fixtureDir = path.join(__dirname, 'fixtures'); - objectql.loadFromDirectory(fixtureDir, 'test-pkg'); + loader.load(fixtureDir, 'test-pkg'); expect(objectql.getObject('project')).toBeDefined(); - // Since 'test-pkg' is passed, it should be tracked - // but packageObjects is private, so we test behavior by removal }); test('should remove package objects', () => { const fixtureDir = path.join(__dirname, 'fixtures'); - objectql.loadFromDirectory(fixtureDir, 'test-pkg'); + loader.load(fixtureDir, 'test-pkg'); expect(objectql.getObject('project')).toBeDefined(); - + objectql.removePackage('test-pkg'); + expect(objectql.getObject('project')).toBeUndefined(); }); - - // Mocking require for loadFromPackage is harder in jest without creating a real node module. - // relying on loadFromDirectory with packageName argument is sufficient to test the tracking logic. }); diff --git a/packages/core/test/fixtures/project-with-validation.object.yml b/packages/foundation/platform-node/test/fixtures/project-with-validation.object.yml similarity index 100% rename from packages/core/test/fixtures/project-with-validation.object.yml rename to packages/foundation/platform-node/test/fixtures/project-with-validation.object.yml diff --git a/packages/core/test/fixtures/project.action.js b/packages/foundation/platform-node/test/fixtures/project.action.js similarity index 100% rename from packages/core/test/fixtures/project.action.js rename to packages/foundation/platform-node/test/fixtures/project.action.js diff --git a/packages/core/test/fixtures/project.object.yml b/packages/foundation/platform-node/test/fixtures/project.object.yml similarity index 100% rename from packages/core/test/fixtures/project.object.yml rename to packages/foundation/platform-node/test/fixtures/project.object.yml diff --git a/packages/core/test/fixtures/test_dashboard.page.yml b/packages/foundation/platform-node/test/fixtures/test_dashboard.page.yml similarity index 100% rename from packages/core/test/fixtures/test_dashboard.page.yml rename to packages/foundation/platform-node/test/fixtures/test_dashboard.page.yml diff --git a/packages/core/test/fixtures/test_page.page.yml b/packages/foundation/platform-node/test/fixtures/test_page.page.yml similarity index 100% rename from packages/core/test/fixtures/test_page.page.yml rename to packages/foundation/platform-node/test/fixtures/test_page.page.yml diff --git a/packages/core/test/fixtures/test_responsive.page.yml b/packages/foundation/platform-node/test/fixtures/test_responsive.page.yml similarity index 100% rename from packages/core/test/fixtures/test_responsive.page.yml rename to packages/foundation/platform-node/test/fixtures/test_responsive.page.yml diff --git a/packages/core/test/fixtures/test_sections.page.yml b/packages/foundation/platform-node/test/fixtures/test_sections.page.yml similarity index 100% rename from packages/core/test/fixtures/test_sections.page.yml rename to packages/foundation/platform-node/test/fixtures/test_sections.page.yml diff --git a/packages/core/test/loader.test.ts b/packages/foundation/platform-node/test/loader.test.ts similarity index 100% rename from packages/core/test/loader.test.ts rename to packages/foundation/platform-node/test/loader.test.ts diff --git a/packages/core/test/metadata.test.ts b/packages/foundation/platform-node/test/metadata.test.ts similarity index 97% rename from packages/core/test/metadata.test.ts rename to packages/foundation/platform-node/test/metadata.test.ts index 997ec371..653b22eb 100644 --- a/packages/core/test/metadata.test.ts +++ b/packages/foundation/platform-node/test/metadata.test.ts @@ -1,4 +1,4 @@ -import { ObjectQL } from '../src/index'; +import { ObjectQL } from '@objectql/core'; import { ObjectConfig } from '@objectql/types'; import * as fs from 'fs'; import * as path from 'path'; diff --git a/packages/core/test/page.test.ts b/packages/foundation/platform-node/test/page.test.ts similarity index 100% rename from packages/core/test/page.test.ts rename to packages/foundation/platform-node/test/page.test.ts diff --git a/packages/core/test/validation.test.ts b/packages/foundation/platform-node/test/validation.test.ts similarity index 99% rename from packages/core/test/validation.test.ts rename to packages/foundation/platform-node/test/validation.test.ts index 9fcb7ecb..96a48306 100644 --- a/packages/core/test/validation.test.ts +++ b/packages/foundation/platform-node/test/validation.test.ts @@ -1,4 +1,4 @@ -import { Validator } from '../src/validator'; +import { Validator } from '@objectql/core'; import { ValidationContext, AnyValidationRule, diff --git a/packages/cli/tsconfig.json b/packages/foundation/platform-node/tsconfig.json similarity index 51% rename from packages/cli/tsconfig.json rename to packages/foundation/platform-node/tsconfig.json index 9a42280e..01ee6951 100644 --- a/packages/cli/tsconfig.json +++ b/packages/foundation/platform-node/tsconfig.json @@ -1,14 +1,14 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "dist", "rootDir": "src" }, - "include": ["src"], + "include": ["src/**/*"], "references": [ { "path": "../types" }, { "path": "../core" }, - { "path": "../server" }, - { "path": "../driver-knex" } + { "path": "../../drivers/sql" }, + { "path": "../../drivers/mongo" } ] } diff --git a/packages/types/CHANGELOG.md b/packages/foundation/types/CHANGELOG.md similarity index 100% rename from packages/types/CHANGELOG.md rename to packages/foundation/types/CHANGELOG.md diff --git a/packages/types/README.md b/packages/foundation/types/README.md similarity index 100% rename from packages/types/README.md rename to packages/foundation/types/README.md diff --git a/packages/types/jest.config.js b/packages/foundation/types/jest.config.js similarity index 100% rename from packages/types/jest.config.js rename to packages/foundation/types/jest.config.js diff --git a/packages/types/package.json b/packages/foundation/types/package.json similarity index 100% rename from packages/types/package.json rename to packages/foundation/types/package.json diff --git a/packages/types/src/action.ts b/packages/foundation/types/src/action.ts similarity index 100% rename from packages/types/src/action.ts rename to packages/foundation/types/src/action.ts diff --git a/packages/types/src/app.ts b/packages/foundation/types/src/app.ts similarity index 73% rename from packages/types/src/app.ts rename to packages/foundation/types/src/app.ts index 844da1d8..dec989ea 100644 --- a/packages/types/src/app.ts +++ b/packages/foundation/types/src/app.ts @@ -10,18 +10,10 @@ export interface IObjectQL { getConfigs(): Record; datasource(name: string): Driver; init(): Promise; - addPackage(name: string): void; removePackage(name: string): void; metadata: MetadataRegistry; registerObject(object: ObjectConfig): void; - loadFromDirectory(dir: string): void; - addLoader(plugin: LoaderPlugin): void; - /** - * Updates and persists metadata content. - * Only works if the metadata was loaded from a writable file source (e.g. local disk). - */ - updateMetadata(type: string, id: string, content: any): Promise; on(event: HookName, objectName: string, handler: HookHandler): void; triggerHook(event: HookName, objectName: string, ctx: HookContext): Promise; diff --git a/packages/types/src/application.ts b/packages/foundation/types/src/application.ts similarity index 100% rename from packages/types/src/application.ts rename to packages/foundation/types/src/application.ts diff --git a/packages/types/src/config.ts b/packages/foundation/types/src/config.ts similarity index 100% rename from packages/types/src/config.ts rename to packages/foundation/types/src/config.ts diff --git a/packages/types/src/context.ts b/packages/foundation/types/src/context.ts similarity index 100% rename from packages/types/src/context.ts rename to packages/foundation/types/src/context.ts diff --git a/packages/types/src/driver.ts b/packages/foundation/types/src/driver.ts similarity index 100% rename from packages/types/src/driver.ts rename to packages/foundation/types/src/driver.ts diff --git a/packages/types/src/field.ts b/packages/foundation/types/src/field.ts similarity index 91% rename from packages/types/src/field.ts rename to packages/foundation/types/src/field.ts index 20eaf2ca..b43bbfb5 100644 --- a/packages/types/src/field.ts +++ b/packages/foundation/types/src/field.ts @@ -135,4 +135,15 @@ export interface FieldConfig { // Vector properties /** Dimension of the vector for 'vector' type fields. */ dimension?: number; + + // Formula & Summary + /** Formula expression. */ + formula?: string; + /** Object to summarize. */ + summary_object?: string; + /** Field on the summary object. */ + summary_field?: string; + /** Type of summary (count, sum, min, max, avg). */ + summary_type?: string; + filters?: any[]; } diff --git a/packages/types/src/hook.ts b/packages/foundation/types/src/hook.ts similarity index 100% rename from packages/types/src/hook.ts rename to packages/foundation/types/src/hook.ts diff --git a/packages/types/src/index.ts b/packages/foundation/types/src/index.ts similarity index 100% rename from packages/types/src/index.ts rename to packages/foundation/types/src/index.ts diff --git a/packages/types/src/loader.ts b/packages/foundation/types/src/loader.ts similarity index 100% rename from packages/types/src/loader.ts rename to packages/foundation/types/src/loader.ts diff --git a/packages/types/src/menu.ts b/packages/foundation/types/src/menu.ts similarity index 100% rename from packages/types/src/menu.ts rename to packages/foundation/types/src/menu.ts diff --git a/packages/types/src/object.ts b/packages/foundation/types/src/object.ts similarity index 100% rename from packages/types/src/object.ts rename to packages/foundation/types/src/object.ts diff --git a/packages/types/src/page.ts b/packages/foundation/types/src/page.ts similarity index 100% rename from packages/types/src/page.ts rename to packages/foundation/types/src/page.ts diff --git a/packages/types/src/permission.ts b/packages/foundation/types/src/permission.ts similarity index 100% rename from packages/types/src/permission.ts rename to packages/foundation/types/src/permission.ts diff --git a/packages/types/src/plugin.ts b/packages/foundation/types/src/plugin.ts similarity index 100% rename from packages/types/src/plugin.ts rename to packages/foundation/types/src/plugin.ts diff --git a/packages/types/src/query.ts b/packages/foundation/types/src/query.ts similarity index 100% rename from packages/types/src/query.ts rename to packages/foundation/types/src/query.ts diff --git a/packages/types/src/registry.ts b/packages/foundation/types/src/registry.ts similarity index 100% rename from packages/types/src/registry.ts rename to packages/foundation/types/src/registry.ts diff --git a/packages/types/src/repository.ts b/packages/foundation/types/src/repository.ts similarity index 100% rename from packages/types/src/repository.ts rename to packages/foundation/types/src/repository.ts diff --git a/packages/types/src/validation.ts b/packages/foundation/types/src/validation.ts similarity index 100% rename from packages/types/src/validation.ts rename to packages/foundation/types/src/validation.ts diff --git a/packages/types/tsconfig.json b/packages/foundation/types/tsconfig.json similarity index 73% rename from packages/types/tsconfig.json rename to packages/foundation/types/tsconfig.json index 76e65dcf..5caba7d1 100644 --- a/packages/types/tsconfig.json +++ b/packages/foundation/types/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "./dist", "rootDir": "./src" diff --git a/packages/server/CHANGELOG.md b/packages/runtime/server/CHANGELOG.md similarity index 100% rename from packages/server/CHANGELOG.md rename to packages/runtime/server/CHANGELOG.md diff --git a/packages/server/README.md b/packages/runtime/server/README.md similarity index 100% rename from packages/server/README.md rename to packages/runtime/server/README.md diff --git a/packages/runtime/server/jest.config.js b/packages/runtime/server/jest.config.js new file mode 100644 index 00000000..e0abf1df --- /dev/null +++ b/packages/runtime/server/jest.config.js @@ -0,0 +1,11 @@ +module.exports = { + preset: 'ts-jest', + testEnvironment: 'node', + testMatch: ['**/*.test.ts'], + moduleNameMapper: { + '^@objectql/types$': '/../../foundation/types/src', + '^@objectql/core$': '/../../foundation/core/src', + '^@objectql/driver-sql$': '/../../drivers/sql/src', + '^@objectql/driver-mongo$': '/../../drivers/mongo/src' + } +}; diff --git a/packages/server/package.json b/packages/runtime/server/package.json similarity index 100% rename from packages/server/package.json rename to packages/runtime/server/package.json diff --git a/packages/server/src/adapters/node.ts b/packages/runtime/server/src/adapters/node.ts similarity index 100% rename from packages/server/src/adapters/node.ts rename to packages/runtime/server/src/adapters/node.ts diff --git a/packages/server/src/adapters/rest.ts b/packages/runtime/server/src/adapters/rest.ts similarity index 100% rename from packages/server/src/adapters/rest.ts rename to packages/runtime/server/src/adapters/rest.ts diff --git a/packages/server/src/index.ts b/packages/runtime/server/src/index.ts similarity index 100% rename from packages/server/src/index.ts rename to packages/runtime/server/src/index.ts diff --git a/packages/server/src/metadata.ts b/packages/runtime/server/src/metadata.ts similarity index 97% rename from packages/server/src/metadata.ts rename to packages/runtime/server/src/metadata.ts index ae8d4e17..030838c6 100644 --- a/packages/server/src/metadata.ts +++ b/packages/runtime/server/src/metadata.ts @@ -138,8 +138,9 @@ export function createMetadataHandler(app: IObjectQL) { const body = await readBody(req); try { - await app.updateMetadata(type, id, body); - return sendJson({ success: true }); + // await app.updateMetadata(type, id, body); + // return sendJson({ success: true }); + return sendError(ErrorCode.INTERNAL_ERROR, 'Metadata updates via API are temporarily disabled in this architectural version.', 501); } catch (e: any) { const isUserError = e.message.startsWith('Cannot update') || e.message.includes('not found'); return sendError( diff --git a/packages/server/src/openapi.ts b/packages/runtime/server/src/openapi.ts similarity index 100% rename from packages/server/src/openapi.ts rename to packages/runtime/server/src/openapi.ts diff --git a/packages/server/src/server.ts b/packages/runtime/server/src/server.ts similarity index 100% rename from packages/server/src/server.ts rename to packages/runtime/server/src/server.ts diff --git a/packages/server/src/studio.ts b/packages/runtime/server/src/studio.ts similarity index 100% rename from packages/server/src/studio.ts rename to packages/runtime/server/src/studio.ts diff --git a/packages/server/src/types.ts b/packages/runtime/server/src/types.ts similarity index 100% rename from packages/server/src/types.ts rename to packages/runtime/server/src/types.ts diff --git a/packages/server/test/node.test.ts b/packages/runtime/server/test/node.test.ts similarity index 100% rename from packages/server/test/node.test.ts rename to packages/runtime/server/test/node.test.ts diff --git a/packages/server/test/rest.test.ts b/packages/runtime/server/test/rest.test.ts similarity index 100% rename from packages/server/test/rest.test.ts rename to packages/runtime/server/test/rest.test.ts diff --git a/packages/server/tsconfig.json b/packages/runtime/server/tsconfig.json similarity index 53% rename from packages/server/tsconfig.json rename to packages/runtime/server/tsconfig.json index 4a6ae5fc..86704a90 100644 --- a/packages/server/tsconfig.json +++ b/packages/runtime/server/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "outDir": "dist", "rootDir": "src", @@ -7,7 +7,7 @@ }, "include": ["src/**/*"], "references": [ - { "path": "../types" }, - { "path": "../core" } + { "path": "../../foundation/types" }, + { "path": "../../foundation/core" } ] } diff --git a/packages/server/jest.config.js b/packages/server/jest.config.js deleted file mode 100644 index 04db4171..00000000 --- a/packages/server/jest.config.js +++ /dev/null @@ -1,8 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - testMatch: ['**/*.test.ts'], - moduleNameMapper: { - '^@objectql/(.*)$': '/../$1/src' - } -}; diff --git a/examples/starters/basic-script/CHANGELOG.md b/packages/starters/basic/CHANGELOG.md similarity index 100% rename from examples/starters/basic-script/CHANGELOG.md rename to packages/starters/basic/CHANGELOG.md diff --git a/examples/starters/basic-script/HOOKS_ACTIONS_GUIDE.md b/packages/starters/basic/HOOKS_ACTIONS_GUIDE.md similarity index 100% rename from examples/starters/basic-script/HOOKS_ACTIONS_GUIDE.md rename to packages/starters/basic/HOOKS_ACTIONS_GUIDE.md diff --git a/examples/starters/basic-script/PERMISSIONS_GUIDE.md b/packages/starters/basic/PERMISSIONS_GUIDE.md similarity index 100% rename from examples/starters/basic-script/PERMISSIONS_GUIDE.md rename to packages/starters/basic/PERMISSIONS_GUIDE.md diff --git a/examples/starters/basic-script/README.md b/packages/starters/basic/README.md similarity index 100% rename from examples/starters/basic-script/README.md rename to packages/starters/basic/README.md diff --git a/examples/starters/basic-script/__tests__/projects-hooks-actions.test.ts b/packages/starters/basic/__tests__/projects-hooks-actions.test.ts similarity index 100% rename from examples/starters/basic-script/__tests__/projects-hooks-actions.test.ts rename to packages/starters/basic/__tests__/projects-hooks-actions.test.ts diff --git a/examples/starters/basic-script/objectql.config.ts b/packages/starters/basic/objectql.config.ts similarity index 63% rename from examples/starters/basic-script/objectql.config.ts rename to packages/starters/basic/objectql.config.ts index 328ade5f..b80096ea 100644 --- a/examples/starters/basic-script/objectql.config.ts +++ b/packages/starters/basic/objectql.config.ts @@ -1,5 +1,6 @@ import { ObjectQL } from '@objectql/core'; -import { KnexDriver } from '@objectql/driver-knex'; +import { KnexDriver } from '@objectql/driver-sql'; +import { ObjectLoader } from '@objectql/platform-node'; import * as path from 'path'; const db = new ObjectQL({ @@ -12,7 +13,10 @@ const db = new ObjectQL({ useNullAsDefault: true }) }, - source: [path.join(__dirname, 'src')], + const loader = new ObjectLoader(app.metadata); +loader.load(path.join(__dirname, 'src')); + +export default app;, presets: [] }); diff --git a/examples/starters/basic-script/package.json b/packages/starters/basic/package.json similarity index 65% rename from examples/starters/basic-script/package.json rename to packages/starters/basic/package.json index 698c3c2c..b6ced220 100644 --- a/examples/starters/basic-script/package.json +++ b/packages/starters/basic/package.json @@ -1,35 +1,36 @@ { - "name": "@example/basic-script", + "name": "@objectql/starter-basic", "version": "6.0.0", "license": "MIT", "author": "ObjectQL Contributors", "repository": { "type": "git", "url": "https://github.com/objectql/objectql.git", - "directory": "examples/starters/basic-script" + "directory": "packages/starters/basic" }, - "private": true, + "private": false, "main": "dist/index.js", "types": "dist/index.d.ts", "files": [ "dist" ], "scripts": { - "codegen": "objectql generate -s src -o src", - "build": "npm run codegen && tsc && cp src/*.yml dist/", + "codegen": "objectql generate -s src -o src/types", + "build": "npm run codegen && tsc && rsync -a --include '*/' --include '*.yml' --exclude '*' src/ dist/", "repl": "objectql repl", "test": "echo \"No tests specified\" && exit 0" }, "peerDependencies": { "@objectql/core": "workspace:*", + "@objectql/driver-sql": "workspace:*", + "@objectql/platform-node": "workspace:*", "@objectql/types": "workspace:*", - "@objectql/driver-knex": "workspace:*", "sqlite3": "^5.1.7" }, "devDependencies": { + "@objectql/cli": "workspace:*", "@objectql/core": "workspace:*", "@objectql/types": "workspace:*", - "@objectql/cli": "workspace:*", "typescript": "^5.3.0" } } diff --git a/examples/starters/basic-script/src/README.pages.md b/packages/starters/basic/src/README.pages.md similarity index 100% rename from examples/starters/basic-script/src/README.pages.md rename to packages/starters/basic/src/README.pages.md diff --git a/packages/starters/basic/src/demo.app.yml b/packages/starters/basic/src/demo.app.yml new file mode 100644 index 00000000..5bbd2813 --- /dev/null +++ b/packages/starters/basic/src/demo.app.yml @@ -0,0 +1,4 @@ +name: demo_app +label: Demo Application +description: "A showcase of ObjectQL capabilities including all field types." +homepage: /kitchen_sink diff --git a/examples/starters/basic-script/src/i18n/zh-CN/projects.json b/packages/starters/basic/src/i18n/zh-CN/projects.json similarity index 100% rename from examples/starters/basic-script/src/i18n/zh-CN/projects.json rename to packages/starters/basic/src/i18n/zh-CN/projects.json diff --git a/packages/starters/basic/src/index.ts b/packages/starters/basic/src/index.ts new file mode 100644 index 00000000..fcb073fe --- /dev/null +++ b/packages/starters/basic/src/index.ts @@ -0,0 +1 @@ +export * from './types'; diff --git a/packages/starters/basic/src/main.menu.yml b/packages/starters/basic/src/main.menu.yml new file mode 100644 index 00000000..6df5cb96 --- /dev/null +++ b/packages/starters/basic/src/main.menu.yml @@ -0,0 +1,30 @@ +name: main +label: Main Menu +type: sidebar +app: demo_app + +items: + - name: core_business + label: Core Business + icon: briefcase + type: section + items: + - object: projects + - object: tasks + + - name: showcase + label: Showcase + icon: flask + type: section + items: + - object: kitchen_sink + label: Component Gallery + + - name: reporting + label: Reporting + icon: bar-chart + type: section + items: + - type: url + label: Dashboard + path: /dashboard diff --git a/examples/starters/basic-script/src/kitchen_sink.data.yml b/packages/starters/basic/src/modules/kitchen-sink/kitchen_sink.data.yml similarity index 100% rename from examples/starters/basic-script/src/kitchen_sink.data.yml rename to packages/starters/basic/src/modules/kitchen-sink/kitchen_sink.data.yml diff --git a/examples/starters/basic-script/src/kitchen_sink.object.yml b/packages/starters/basic/src/modules/kitchen-sink/kitchen_sink.object.yml similarity index 99% rename from examples/starters/basic-script/src/kitchen_sink.object.yml rename to packages/starters/basic/src/modules/kitchen-sink/kitchen_sink.object.yml index ee94e52d..6be5c5a0 100644 --- a/examples/starters/basic-script/src/kitchen_sink.object.yml +++ b/packages/starters/basic/src/modules/kitchen-sink/kitchen_sink.object.yml @@ -1,4 +1,3 @@ -name: kitchen_sink label: "Kitchen Sink (All Fields)" description: "A demonstration of every supported field type in ObjectQL" icon: "layout-grid-line" diff --git a/examples/starters/basic-script/src/create_project_wizard.page.yml b/packages/starters/basic/src/modules/projects/pages/create_project_wizard.page.yml similarity index 100% rename from examples/starters/basic-script/src/create_project_wizard.page.yml rename to packages/starters/basic/src/modules/projects/pages/create_project_wizard.page.yml diff --git a/examples/starters/basic-script/src/project_detail.page.yml b/packages/starters/basic/src/modules/projects/pages/project_detail.page.yml similarity index 100% rename from examples/starters/basic-script/src/project_detail.page.yml rename to packages/starters/basic/src/modules/projects/pages/project_detail.page.yml diff --git a/examples/starters/basic-script/src/project_approval.workflow.yml b/packages/starters/basic/src/modules/projects/project_approval.workflow.yml similarity index 100% rename from examples/starters/basic-script/src/project_approval.workflow.yml rename to packages/starters/basic/src/modules/projects/project_approval.workflow.yml diff --git a/examples/starters/basic-script/src/project_status.report.yml b/packages/starters/basic/src/modules/projects/project_status.report.yml similarity index 100% rename from examples/starters/basic-script/src/project_status.report.yml rename to packages/starters/basic/src/modules/projects/project_status.report.yml diff --git a/examples/starters/basic-script/src/projects.action.ts b/packages/starters/basic/src/modules/projects/projects.action.ts similarity index 96% rename from examples/starters/basic-script/src/projects.action.ts rename to packages/starters/basic/src/modules/projects/projects.action.ts index c5037983..b0d31022 100644 --- a/examples/starters/basic-script/src/projects.action.ts +++ b/packages/starters/basic/src/modules/projects/projects.action.ts @@ -1,5 +1,5 @@ import { ActionDefinition } from '@objectql/types'; -import { Project } from './types'; +import { Projects } from '../../types'; /** * Project Actions - Comprehensive Examples @@ -29,7 +29,7 @@ interface CompleteInput { * - Returning structured results * - Input parameter usage */ -export const complete: ActionDefinition = { +export const complete: ActionDefinition = { handler: async ({ id, input, api, user }) => { const { comment, completion_date } = input; @@ -103,7 +103,7 @@ interface ApproveInput { * - Required input parameters * - Business logic enforcement */ -export const approve: ActionDefinition = { +export const approve: ActionDefinition = { handler: async ({ id, input, api, user }) => { const { comment } = input; @@ -163,7 +163,7 @@ interface CloneInput { * - Copying related data * - Complex multi-step operations */ -export const clone: ActionDefinition = { +export const clone: ActionDefinition = { handler: async ({ id, input, api, user }) => { const { new_name, copy_tasks = false } = input; @@ -242,7 +242,7 @@ interface ImportProjectsInput { * - Error collection * - Progress reporting */ -export const import_projects: ActionDefinition = { +export const import_projects: ActionDefinition = { handler: async ({ input, api, user }) => { const { source, data, file_url } = input; @@ -332,7 +332,7 @@ interface BulkUpdateStatusInput { * - Validation across multiple items * - Transactional operations (if supported) */ -export const bulk_update_status: ActionDefinition = { +export const bulk_update_status: ActionDefinition = { handler: async ({ input, api, user }) => { const { project_ids, new_status } = input; @@ -412,7 +412,7 @@ export const bulk_update_status: ActionDefinition = { +export const generate_report: ActionDefinition = { handler: async ({ api, user }) => { console.log(`[Action] Generating project report for ${user?.id}`); diff --git a/examples/starters/basic-script/src/projects.data.yml b/packages/starters/basic/src/modules/projects/projects.data.yml similarity index 100% rename from examples/starters/basic-script/src/projects.data.yml rename to packages/starters/basic/src/modules/projects/projects.data.yml diff --git a/examples/starters/basic-script/src/projects.form.yml b/packages/starters/basic/src/modules/projects/projects.form.yml similarity index 100% rename from examples/starters/basic-script/src/projects.form.yml rename to packages/starters/basic/src/modules/projects/projects.form.yml diff --git a/examples/starters/basic-script/src/projects.hook.ts b/packages/starters/basic/src/modules/projects/projects.hook.ts similarity index 99% rename from examples/starters/basic-script/src/projects.hook.ts rename to packages/starters/basic/src/modules/projects/projects.hook.ts index f23efbb9..6a889c45 100644 --- a/examples/starters/basic-script/src/projects.hook.ts +++ b/packages/starters/basic/src/modules/projects/projects.hook.ts @@ -1,5 +1,5 @@ import { ObjectHookDefinition } from '@objectql/types'; -import { Project } from './types'; +import { Projects } from '../../types'; /** * Project Hooks - Comprehensive Example @@ -12,7 +12,7 @@ import { Project } from './types'; * 5. Dependency checking (beforeDelete) * 6. Side effects and cleanup (afterDelete) */ -const hooks: ObjectHookDefinition = { +const hooks: ObjectHookDefinition = { /** * beforeCreate - Data Validation & Defaulting diff --git a/examples/starters/basic-script/src/projects.object.yml b/packages/starters/basic/src/modules/projects/projects.object.yml similarity index 91% rename from examples/starters/basic-script/src/projects.object.yml rename to packages/starters/basic/src/modules/projects/projects.object.yml index 55731661..bfcda74e 100644 --- a/examples/starters/basic-script/src/projects.object.yml +++ b/packages/starters/basic/src/modules/projects/projects.object.yml @@ -1,15 +1,12 @@ -name: projects label: Project icon: building-line fields: name: type: text required: true - label: Name index: true # Field-level index status: - type: select options: - planned - in_progress @@ -18,7 +15,6 @@ fields: index: true priority: - type: select options: - low - normal @@ -30,31 +26,24 @@ fields: owner: type: text - label: Project Owner budget: type: currency - label: Total Budget start_date: type: date - label: Start Date end_date: type: date - label: End Date approved_by: type: text - label: Approved By approved_at: type: datetime - label: Approved At approval_comment: type: textarea - label: Approval Comment indexes: # Composite index for reporting @@ -118,7 +107,6 @@ actions: description: Import multiple projects from various sources params: source: - type: select required: true label: Import Source options: @@ -146,7 +134,6 @@ actions: label: Project IDs help_text: "List of project IDs" new_status: - type: select required: true label: New Status options: diff --git a/examples/starters/basic-script/src/projects.permission.yml b/packages/starters/basic/src/modules/projects/projects.permission.yml similarity index 100% rename from examples/starters/basic-script/src/projects.permission.yml rename to packages/starters/basic/src/modules/projects/projects.permission.yml diff --git a/examples/starters/basic-script/src/projects.validation.yml b/packages/starters/basic/src/modules/projects/projects.validation.yml similarity index 100% rename from examples/starters/basic-script/src/projects.validation.yml rename to packages/starters/basic/src/modules/projects/projects.validation.yml diff --git a/examples/starters/basic-script/src/projects.view.yml b/packages/starters/basic/src/modules/projects/projects.view.yml similarity index 100% rename from examples/starters/basic-script/src/projects.view.yml rename to packages/starters/basic/src/modules/projects/projects.view.yml diff --git a/examples/starters/basic-script/src/tasks.data.yml b/packages/starters/basic/src/modules/tasks/tasks.data.yml similarity index 100% rename from examples/starters/basic-script/src/tasks.data.yml rename to packages/starters/basic/src/modules/tasks/tasks.data.yml diff --git a/examples/starters/basic-script/src/tasks.object.yml b/packages/starters/basic/src/modules/tasks/tasks.object.yml similarity index 90% rename from examples/starters/basic-script/src/tasks.object.yml rename to packages/starters/basic/src/modules/tasks/tasks.object.yml index 9e9ef497..6a5128d5 100644 --- a/examples/starters/basic-script/src/tasks.object.yml +++ b/packages/starters/basic/src/modules/tasks/tasks.object.yml @@ -1,4 +1,3 @@ -name: tasks label: Task icon: checkbox-circle-line fields: @@ -8,7 +7,6 @@ fields: index: true # Simple index project: - type: lookup reference_to: projects due_date: @@ -20,7 +18,6 @@ fields: index: true # Helpful for finding pending tasks priority: - type: select options: - low - medium @@ -33,6 +30,5 @@ fields: estimated_hours: type: number - min: 0 label: Estimated Hours diff --git a/examples/starters/basic-script/src/tasks.permission.yml b/packages/starters/basic/src/modules/tasks/tasks.permission.yml similarity index 100% rename from examples/starters/basic-script/src/tasks.permission.yml rename to packages/starters/basic/src/modules/tasks/tasks.permission.yml diff --git a/examples/starters/basic-script/src/dashboard.page.yml b/packages/starters/basic/src/pages/dashboard.page.yml similarity index 100% rename from examples/starters/basic-script/src/dashboard.page.yml rename to packages/starters/basic/src/pages/dashboard.page.yml diff --git a/examples/starters/basic-script/src/landing.page.yml b/packages/starters/basic/src/pages/landing.page.yml similarity index 100% rename from examples/starters/basic-script/src/landing.page.yml rename to packages/starters/basic/src/pages/landing.page.yml diff --git a/examples/starters/basic-script/src/index.ts b/packages/starters/basic/src/types/index.ts similarity index 100% rename from examples/starters/basic-script/src/index.ts rename to packages/starters/basic/src/types/index.ts diff --git a/examples/starters/basic-script/src/kitchen_sink.ts b/packages/starters/basic/src/types/kitchen_sink.ts similarity index 100% rename from examples/starters/basic-script/src/kitchen_sink.ts rename to packages/starters/basic/src/types/kitchen_sink.ts diff --git a/examples/starters/basic-script/src/projects.ts b/packages/starters/basic/src/types/projects.ts similarity index 84% rename from examples/starters/basic-script/src/projects.ts rename to packages/starters/basic/src/types/projects.ts index aa9dd7d2..150ec96f 100644 --- a/examples/starters/basic-script/src/projects.ts +++ b/packages/starters/basic/src/types/projects.ts @@ -6,15 +6,24 @@ export interface Projects extends ObjectDoc { * Name */ name: string; + /** + * Status + */ status?: string; + /** + * Priority + */ priority?: string; + /** + * Description + */ description?: string; /** - * Project Owner + * Owner */ owner?: string; /** - * Total Budget + * Budget */ budget?: number; /** diff --git a/examples/starters/basic-script/src/tasks.ts b/packages/starters/basic/src/types/tasks.ts similarity index 71% rename from examples/starters/basic-script/src/tasks.ts rename to packages/starters/basic/src/types/tasks.ts index 94ea19e3..e9a66f7b 100644 --- a/examples/starters/basic-script/src/tasks.ts +++ b/packages/starters/basic/src/types/tasks.ts @@ -2,10 +2,25 @@ import { ObjectDoc } from '@objectql/types'; export interface Tasks extends ObjectDoc { + /** + * Name + */ name: string; + /** + * Project + */ project?: string | number; + /** + * Due Date + */ due_date?: Date | string; + /** + * Completed + */ completed?: boolean; + /** + * Priority + */ priority?: string; /** * Assignee diff --git a/examples/starters/basic-script/tsconfig.json b/packages/starters/basic/tsconfig.json similarity index 100% rename from examples/starters/basic-script/tsconfig.json rename to packages/starters/basic/tsconfig.json diff --git a/examples/scenarios/enterprise-structure/CHANGELOG.md b/packages/starters/enterprise/CHANGELOG.md similarity index 100% rename from examples/scenarios/enterprise-structure/CHANGELOG.md rename to packages/starters/enterprise/CHANGELOG.md diff --git a/examples/scenarios/enterprise-structure/README.md b/packages/starters/enterprise/README.md similarity index 91% rename from examples/scenarios/enterprise-structure/README.md rename to packages/starters/enterprise/README.md index 375c9c6f..648aa935 100644 --- a/examples/scenarios/enterprise-structure/README.md +++ b/packages/starters/enterprise/README.md @@ -30,10 +30,10 @@ src/ ├── modules/ # Business Domain Modules │ ├── crm/ # Customer Relationship Module │ │ ├── objects/ -│ │ │ ├── account.object.yml -│ │ │ ├── contact.object.yml -│ │ │ ├── opportunity.object.yml -│ │ │ └── lead.object.yml +│ │ │ ├── crm_account.object.yml +│ │ │ ├── crm_contact.object.yml +│ │ │ ├── crm_opportunity.object.yml +│ │ │ └── crm_lead.object.yml │ │ ├── actions/ │ │ │ └── convert-lead.action.ts │ │ ├── hooks/ @@ -46,10 +46,10 @@ src/ │ │ │ ├── hr/ # Human Resources Module │ │ ├── objects/ -│ │ │ ├── employee.object.yml -│ │ │ ├── department.object.yml -│ │ │ ├── position.object.yml -│ │ │ └── timesheet.object.yml +│ │ │ ├── hr_employee.object.yml +│ │ │ ├── hr_department.object.yml +│ │ │ ├── hr_position.object.yml +│ │ │ └── hr_timesheet.object.yml │ │ ├── actions/ │ │ ├── hooks/ │ │ ├── i18n/ @@ -58,10 +58,10 @@ src/ │ │ │ ├── finance/ # Finance & Accounting Module │ │ ├── objects/ -│ │ │ ├── invoice.object.yml -│ │ │ ├── payment.object.yml -│ │ │ ├── expense.object.yml -│ │ │ └── budget.object.yml +│ │ │ ├── finance_invoice.object.yml +│ │ │ ├── finance_payment.object.yml +│ │ │ ├── finance_expense.object.yml +│ │ │ └── finance_budget.object.yml │ │ ├── actions/ │ │ ├── hooks/ │ │ ├── i18n/ @@ -70,10 +70,10 @@ src/ │ │ │ └── project/ # Project Management Module │ ├── objects/ -│ │ ├── project.object.yml -│ │ ├── task.object.yml -│ │ ├── milestone.object.yml -│ │ └── timesheet-entry.object.yml +│ │ ├── project_project.object.yml +│ │ ├── project_task.object.yml +│ │ ├── project_milestone.object.yml +│ │ └── project_timesheet_entry.object.yml │ ├── actions/ │ ├── hooks/ │ ├── i18n/ diff --git a/examples/scenarios/enterprise-structure/package.json b/packages/starters/enterprise/package.json similarity index 71% rename from examples/scenarios/enterprise-structure/package.json rename to packages/starters/enterprise/package.json index 6c2e1f13..fdf30254 100644 --- a/examples/scenarios/enterprise-structure/package.json +++ b/packages/starters/enterprise/package.json @@ -1,14 +1,14 @@ { - "name": "@example/enterprise-structure", - "version": "2.0.0", + "name": "@objectql/starter-enterprise", + "version": "1.0.0", "license": "MIT", "author": "ObjectQL Contributors", "repository": { "type": "git", "url": "https://github.com/objectql/objectql.git", - "directory": "examples/scenarios/enterprise-structure" + "directory": "packages/starters/enterprise" }, - "private": true, + "private": false, "description": "Enterprise-scale metadata organization example for ObjectQL", "main": "dist/index.js", "types": "dist/index.d.ts", @@ -23,14 +23,16 @@ "peerDependencies": { "@objectql/core": "workspace:*", "@objectql/types": "workspace:*", - "@objectql/driver-knex": "workspace:*", + "@objectql/driver-sql": "workspace:*", + "@objectql/platform-node": "workspace:*", "sqlite3": "^5.1.7" }, "devDependencies": { "@objectql/core": "workspace:*", "@objectql/types": "workspace:*", "@objectql/cli": "workspace:*", - "@objectql/driver-knex": "workspace:*", + "@objectql/driver-sql": "workspace:*", + "@objectql/platform-node": "workspace:*", "typescript": "^5.3.0" } } diff --git a/packages/starters/enterprise/src/apps/erp.app.yml b/packages/starters/enterprise/src/apps/erp.app.yml new file mode 100644 index 00000000..5440b72f --- /dev/null +++ b/packages/starters/enterprise/src/apps/erp.app.yml @@ -0,0 +1,4 @@ +name: erp +label: Enterprise RPG +description: Core ERP system +icon: building diff --git a/examples/scenarios/enterprise-structure/src/core/objects/attachment.object.yml b/packages/starters/enterprise/src/core/attachment.object.yml similarity index 100% rename from examples/scenarios/enterprise-structure/src/core/objects/attachment.object.yml rename to packages/starters/enterprise/src/core/attachment.object.yml diff --git a/examples/scenarios/enterprise-structure/src/core/i18n/en/core.json b/packages/starters/enterprise/src/core/i18n/en/core.json similarity index 100% rename from examples/scenarios/enterprise-structure/src/core/i18n/en/core.json rename to packages/starters/enterprise/src/core/i18n/en/core.json diff --git a/examples/scenarios/enterprise-structure/src/core/i18n/zh-CN/core.json b/packages/starters/enterprise/src/core/i18n/zh-CN/core.json similarity index 100% rename from examples/scenarios/enterprise-structure/src/core/i18n/zh-CN/core.json rename to packages/starters/enterprise/src/core/i18n/zh-CN/core.json diff --git a/examples/scenarios/enterprise-structure/src/core/index.ts b/packages/starters/enterprise/src/core/index.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/core/index.ts rename to packages/starters/enterprise/src/core/index.ts diff --git a/examples/scenarios/enterprise-structure/src/core/objects/organization.object.yml b/packages/starters/enterprise/src/core/organization.object.yml similarity index 100% rename from examples/scenarios/enterprise-structure/src/core/objects/organization.object.yml rename to packages/starters/enterprise/src/core/organization.object.yml diff --git a/examples/scenarios/enterprise-structure/src/core/objects/user.object.yml b/packages/starters/enterprise/src/core/user.object.yml similarity index 100% rename from examples/scenarios/enterprise-structure/src/core/objects/user.object.yml rename to packages/starters/enterprise/src/core/user.object.yml diff --git a/examples/scenarios/enterprise-structure/src/extensions/README.md b/packages/starters/enterprise/src/extensions/README.md similarity index 100% rename from examples/scenarios/enterprise-structure/src/extensions/README.md rename to packages/starters/enterprise/src/extensions/README.md diff --git a/examples/scenarios/enterprise-structure/src/extensions/user.extension.object.yml b/packages/starters/enterprise/src/extensions/user.extension.object.yml similarity index 100% rename from examples/scenarios/enterprise-structure/src/extensions/user.extension.object.yml rename to packages/starters/enterprise/src/extensions/user.extension.object.yml diff --git a/examples/scenarios/enterprise-structure/src/extensions/user.ts b/packages/starters/enterprise/src/extensions/user.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/extensions/user.ts rename to packages/starters/enterprise/src/extensions/user.ts diff --git a/examples/scenarios/enterprise-structure/src/index.ts b/packages/starters/enterprise/src/index.ts similarity index 77% rename from examples/scenarios/enterprise-structure/src/index.ts rename to packages/starters/enterprise/src/index.ts index 812f2f68..4ca3a81b 100644 --- a/examples/scenarios/enterprise-structure/src/index.ts +++ b/packages/starters/enterprise/src/index.ts @@ -6,7 +6,8 @@ */ import { ObjectQL } from '@objectql/core'; -import { KnexDriver } from '@objectql/driver-knex'; +import { KnexDriver } from '@objectql/driver-sql'; +import { ObjectLoader } from '@objectql/platform-node'; import path from 'path'; /** @@ -21,11 +22,13 @@ export async function initializeApp() { filename: ':memory:' } }) - }, - // Load metadata from current directory - source: __dirname + } }); + // Load metadata from current directory + const loader = new ObjectLoader(app.metadata); + loader.load(__dirname); + await app.init(); return app; } diff --git a/packages/starters/enterprise/src/menus/erp.menu.yml b/packages/starters/enterprise/src/menus/erp.menu.yml new file mode 100644 index 00000000..3c1a59cc --- /dev/null +++ b/packages/starters/enterprise/src/menus/erp.menu.yml @@ -0,0 +1,11 @@ +name: erp_main +label: ERP Main Menu +app: erp +type: sidebar +items: + - name: projects + label: Projects + type: section + items: + - object: project_project + - object: project_task diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/README.md b/packages/starters/enterprise/src/modules/crm/README.md similarity index 100% rename from examples/scenarios/enterprise-structure/src/modules/crm/README.md rename to packages/starters/enterprise/src/modules/crm/README.md diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/objects/account.object.yml b/packages/starters/enterprise/src/modules/crm/crm_account.object.yml similarity index 98% rename from examples/scenarios/enterprise-structure/src/modules/crm/objects/account.object.yml rename to packages/starters/enterprise/src/modules/crm/crm_account.object.yml index d51ba753..af910407 100644 --- a/examples/scenarios/enterprise-structure/src/modules/crm/objects/account.object.yml +++ b/packages/starters/enterprise/src/modules/crm/crm_account.object.yml @@ -1,4 +1,3 @@ -name: crm_account label: Account description: Customer company or organization icon: briefcase-line diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/objects/contact.object.yml b/packages/starters/enterprise/src/modules/crm/crm_contact.object.yml similarity index 98% rename from examples/scenarios/enterprise-structure/src/modules/crm/objects/contact.object.yml rename to packages/starters/enterprise/src/modules/crm/crm_contact.object.yml index a91f6824..3b17c93f 100644 --- a/examples/scenarios/enterprise-structure/src/modules/crm/objects/contact.object.yml +++ b/packages/starters/enterprise/src/modules/crm/crm_contact.object.yml @@ -1,4 +1,3 @@ -name: crm_contact label: Contact description: Individual contact person icon: user-line diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/objects/lead.object.yml b/packages/starters/enterprise/src/modules/crm/crm_lead.object.yml similarity index 99% rename from examples/scenarios/enterprise-structure/src/modules/crm/objects/lead.object.yml rename to packages/starters/enterprise/src/modules/crm/crm_lead.object.yml index 2d0e82e6..7170d4ea 100644 --- a/examples/scenarios/enterprise-structure/src/modules/crm/objects/lead.object.yml +++ b/packages/starters/enterprise/src/modules/crm/crm_lead.object.yml @@ -1,4 +1,3 @@ -name: crm_lead label: Lead description: Potential sales lead icon: user-add-line diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/objects/opportunity.object.yml b/packages/starters/enterprise/src/modules/crm/crm_opportunity.object.yml similarity index 99% rename from examples/scenarios/enterprise-structure/src/modules/crm/objects/opportunity.object.yml rename to packages/starters/enterprise/src/modules/crm/crm_opportunity.object.yml index c200ef43..b1bccaf2 100644 --- a/examples/scenarios/enterprise-structure/src/modules/crm/objects/opportunity.object.yml +++ b/packages/starters/enterprise/src/modules/crm/crm_opportunity.object.yml @@ -1,4 +1,3 @@ -name: crm_opportunity label: Opportunity description: Sales opportunity or deal icon: currency-line diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/i18n/en/crm.json b/packages/starters/enterprise/src/modules/crm/i18n/en/crm.json similarity index 100% rename from examples/scenarios/enterprise-structure/src/modules/crm/i18n/en/crm.json rename to packages/starters/enterprise/src/modules/crm/i18n/en/crm.json diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/i18n/zh-CN/crm.json b/packages/starters/enterprise/src/modules/crm/i18n/zh-CN/crm.json similarity index 100% rename from examples/scenarios/enterprise-structure/src/modules/crm/i18n/zh-CN/crm.json rename to packages/starters/enterprise/src/modules/crm/i18n/zh-CN/crm.json diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/index.ts b/packages/starters/enterprise/src/modules/crm/index.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/modules/crm/index.ts rename to packages/starters/enterprise/src/modules/crm/index.ts diff --git a/examples/scenarios/enterprise-structure/src/modules/finance/README.md b/packages/starters/enterprise/src/modules/finance/README.md similarity index 100% rename from examples/scenarios/enterprise-structure/src/modules/finance/README.md rename to packages/starters/enterprise/src/modules/finance/README.md diff --git a/examples/scenarios/enterprise-structure/src/modules/finance/objects/budget.object.yml b/packages/starters/enterprise/src/modules/finance/finance_budget.object.yml similarity index 98% rename from examples/scenarios/enterprise-structure/src/modules/finance/objects/budget.object.yml rename to packages/starters/enterprise/src/modules/finance/finance_budget.object.yml index 9a5ba006..3bd597f7 100644 --- a/examples/scenarios/enterprise-structure/src/modules/finance/objects/budget.object.yml +++ b/packages/starters/enterprise/src/modules/finance/finance_budget.object.yml @@ -1,4 +1,3 @@ -name: finance_budget label: Budget description: Department or project budget icon: pie-chart-line diff --git a/examples/scenarios/enterprise-structure/src/modules/finance/objects/expense.object.yml b/packages/starters/enterprise/src/modules/finance/finance_expense.object.yml similarity index 99% rename from examples/scenarios/enterprise-structure/src/modules/finance/objects/expense.object.yml rename to packages/starters/enterprise/src/modules/finance/finance_expense.object.yml index 699d35ce..80fc8b2a 100644 --- a/examples/scenarios/enterprise-structure/src/modules/finance/objects/expense.object.yml +++ b/packages/starters/enterprise/src/modules/finance/finance_expense.object.yml @@ -1,4 +1,3 @@ -name: finance_expense label: Expense description: Company expense record icon: wallet-line diff --git a/examples/scenarios/enterprise-structure/src/modules/finance/objects/invoice.object.yml b/packages/starters/enterprise/src/modules/finance/finance_invoice.object.yml similarity index 99% rename from examples/scenarios/enterprise-structure/src/modules/finance/objects/invoice.object.yml rename to packages/starters/enterprise/src/modules/finance/finance_invoice.object.yml index 433e38ad..32bfab21 100644 --- a/examples/scenarios/enterprise-structure/src/modules/finance/objects/invoice.object.yml +++ b/packages/starters/enterprise/src/modules/finance/finance_invoice.object.yml @@ -1,4 +1,3 @@ -name: finance_invoice label: Invoice description: Customer invoice icon: file-text-line diff --git a/examples/scenarios/enterprise-structure/src/modules/finance/objects/payment.object.yml b/packages/starters/enterprise/src/modules/finance/finance_payment.object.yml similarity index 98% rename from examples/scenarios/enterprise-structure/src/modules/finance/objects/payment.object.yml rename to packages/starters/enterprise/src/modules/finance/finance_payment.object.yml index d4f056bb..b96bee53 100644 --- a/examples/scenarios/enterprise-structure/src/modules/finance/objects/payment.object.yml +++ b/packages/starters/enterprise/src/modules/finance/finance_payment.object.yml @@ -1,4 +1,3 @@ -name: finance_payment label: Payment description: Payment transaction record icon: money-dollar-circle-line diff --git a/examples/scenarios/enterprise-structure/src/modules/finance/index.ts b/packages/starters/enterprise/src/modules/finance/index.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/modules/finance/index.ts rename to packages/starters/enterprise/src/modules/finance/index.ts diff --git a/examples/scenarios/enterprise-structure/src/modules/hr/README.md b/packages/starters/enterprise/src/modules/hr/README.md similarity index 100% rename from examples/scenarios/enterprise-structure/src/modules/hr/README.md rename to packages/starters/enterprise/src/modules/hr/README.md diff --git a/examples/scenarios/enterprise-structure/src/modules/hr/objects/department.object.yml b/packages/starters/enterprise/src/modules/hr/hr_department.object.yml similarity index 98% rename from examples/scenarios/enterprise-structure/src/modules/hr/objects/department.object.yml rename to packages/starters/enterprise/src/modules/hr/hr_department.object.yml index 4358396c..a3311f3c 100644 --- a/examples/scenarios/enterprise-structure/src/modules/hr/objects/department.object.yml +++ b/packages/starters/enterprise/src/modules/hr/hr_department.object.yml @@ -1,4 +1,3 @@ -name: hr_department label: Department description: Organizational department icon: building-line diff --git a/examples/scenarios/enterprise-structure/src/modules/hr/objects/employee.object.yml b/packages/starters/enterprise/src/modules/hr/hr_employee.object.yml similarity index 99% rename from examples/scenarios/enterprise-structure/src/modules/hr/objects/employee.object.yml rename to packages/starters/enterprise/src/modules/hr/hr_employee.object.yml index d4f52b80..f5877336 100644 --- a/examples/scenarios/enterprise-structure/src/modules/hr/objects/employee.object.yml +++ b/packages/starters/enterprise/src/modules/hr/hr_employee.object.yml @@ -1,4 +1,3 @@ -name: hr_employee label: Employee description: Company employee record icon: user-line diff --git a/examples/scenarios/enterprise-structure/src/modules/hr/objects/position.object.yml b/packages/starters/enterprise/src/modules/hr/hr_position.object.yml similarity index 98% rename from examples/scenarios/enterprise-structure/src/modules/hr/objects/position.object.yml rename to packages/starters/enterprise/src/modules/hr/hr_position.object.yml index 9a7dd86d..1a8db7de 100644 --- a/examples/scenarios/enterprise-structure/src/modules/hr/objects/position.object.yml +++ b/packages/starters/enterprise/src/modules/hr/hr_position.object.yml @@ -1,4 +1,3 @@ -name: hr_position label: Position description: Job position or role icon: briefcase-line diff --git a/examples/scenarios/enterprise-structure/src/modules/hr/objects/timesheet.object.yml b/packages/starters/enterprise/src/modules/hr/hr_timesheet.object.yml similarity index 98% rename from examples/scenarios/enterprise-structure/src/modules/hr/objects/timesheet.object.yml rename to packages/starters/enterprise/src/modules/hr/hr_timesheet.object.yml index c7726cbf..03e91bb2 100644 --- a/examples/scenarios/enterprise-structure/src/modules/hr/objects/timesheet.object.yml +++ b/packages/starters/enterprise/src/modules/hr/hr_timesheet.object.yml @@ -1,4 +1,3 @@ -name: hr_timesheet label: Timesheet description: Employee time tracking icon: time-line diff --git a/examples/scenarios/enterprise-structure/src/modules/hr/index.ts b/packages/starters/enterprise/src/modules/hr/index.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/modules/hr/index.ts rename to packages/starters/enterprise/src/modules/hr/index.ts diff --git a/examples/scenarios/enterprise-structure/src/modules/project/README.md b/packages/starters/enterprise/src/modules/project/README.md similarity index 100% rename from examples/scenarios/enterprise-structure/src/modules/project/README.md rename to packages/starters/enterprise/src/modules/project/README.md diff --git a/examples/scenarios/enterprise-structure/src/modules/project/index.ts b/packages/starters/enterprise/src/modules/project/index.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/modules/project/index.ts rename to packages/starters/enterprise/src/modules/project/index.ts diff --git a/examples/scenarios/enterprise-structure/src/modules/project/objects/milestone.object.yml b/packages/starters/enterprise/src/modules/project/project_milestone.object.yml similarity index 97% rename from examples/scenarios/enterprise-structure/src/modules/project/objects/milestone.object.yml rename to packages/starters/enterprise/src/modules/project/project_milestone.object.yml index 0d06b5e1..010e536b 100644 --- a/examples/scenarios/enterprise-structure/src/modules/project/objects/milestone.object.yml +++ b/packages/starters/enterprise/src/modules/project/project_milestone.object.yml @@ -1,4 +1,3 @@ -name: project_milestone label: Milestone description: Project milestone or checkpoint icon: flag-line diff --git a/examples/scenarios/enterprise-structure/src/modules/project/objects/project.object.yml b/packages/starters/enterprise/src/modules/project/project_project.object.yml similarity index 99% rename from examples/scenarios/enterprise-structure/src/modules/project/objects/project.object.yml rename to packages/starters/enterprise/src/modules/project/project_project.object.yml index a84a2a64..5e754893 100644 --- a/examples/scenarios/enterprise-structure/src/modules/project/objects/project.object.yml +++ b/packages/starters/enterprise/src/modules/project/project_project.object.yml @@ -1,4 +1,3 @@ -name: project_project label: Project description: Project or initiative icon: folder-line diff --git a/examples/scenarios/enterprise-structure/src/modules/project/objects/task.object.yml b/packages/starters/enterprise/src/modules/project/project_task.object.yml similarity index 99% rename from examples/scenarios/enterprise-structure/src/modules/project/objects/task.object.yml rename to packages/starters/enterprise/src/modules/project/project_task.object.yml index 3ddd590e..e3780e75 100644 --- a/examples/scenarios/enterprise-structure/src/modules/project/objects/task.object.yml +++ b/packages/starters/enterprise/src/modules/project/project_task.object.yml @@ -1,4 +1,3 @@ -name: project_task label: Task description: Project task or work item icon: task-line diff --git a/examples/scenarios/enterprise-structure/src/modules/project/objects/timesheet-entry.object.yml b/packages/starters/enterprise/src/modules/project/project_timesheet_entry.object.yml similarity index 98% rename from examples/scenarios/enterprise-structure/src/modules/project/objects/timesheet-entry.object.yml rename to packages/starters/enterprise/src/modules/project/project_timesheet_entry.object.yml index e309d7ac..54c8243e 100644 --- a/examples/scenarios/enterprise-structure/src/modules/project/objects/timesheet-entry.object.yml +++ b/packages/starters/enterprise/src/modules/project/project_timesheet_entry.object.yml @@ -1,4 +1,3 @@ -name: project_timesheet_entry label: Timesheet Entry description: Time entry for project tasks icon: time-line diff --git a/examples/scenarios/enterprise-structure/src/shared/constants.ts b/packages/starters/enterprise/src/shared/constants.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/shared/constants.ts rename to packages/starters/enterprise/src/shared/constants.ts diff --git a/examples/scenarios/enterprise-structure/src/shared/utils.ts b/packages/starters/enterprise/src/shared/utils.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/shared/utils.ts rename to packages/starters/enterprise/src/shared/utils.ts diff --git a/examples/scenarios/enterprise-structure/src/shared/validators.ts b/packages/starters/enterprise/src/shared/validators.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/shared/validators.ts rename to packages/starters/enterprise/src/shared/validators.ts diff --git a/examples/scenarios/enterprise-structure/src/core/objects/attachment.ts b/packages/starters/enterprise/src/types/attachment.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/core/objects/attachment.ts rename to packages/starters/enterprise/src/types/attachment.ts diff --git a/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_account.ts b/packages/starters/enterprise/src/types/crm_account.ts similarity index 94% rename from examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_account.ts rename to packages/starters/enterprise/src/types/crm_account.ts index 52933a6e..3d6b3b37 100644 --- a/examples/scenarios/enterprise-structure/src/modules/crm/objects/crm_account.ts +++ b/packages/starters/enterprise/src/types/crm_account.ts @@ -10,6 +10,9 @@ export interface CrmAccount extends ObjectDoc { * Account Number */ account_number?: string; + /** + * Type + */ type?: string; /** * Industry @@ -51,5 +54,8 @@ export interface CrmAccount extends ObjectDoc { * Description */ description?: string; + /** + * Status + */ status?: string; } diff --git a/examples/scenarios/enterprise-structure/src/types/crm_contact.ts b/packages/starters/enterprise/src/types/crm_contact.ts similarity index 96% rename from examples/scenarios/enterprise-structure/src/types/crm_contact.ts rename to packages/starters/enterprise/src/types/crm_contact.ts index 2e2242b1..524860f4 100644 --- a/examples/scenarios/enterprise-structure/src/types/crm_contact.ts +++ b/packages/starters/enterprise/src/types/crm_contact.ts @@ -54,5 +54,8 @@ export interface CrmContact extends ObjectDoc { * Notes */ description?: string; + /** + * Status + */ status?: string; } diff --git a/examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_lead.ts b/packages/starters/enterprise/src/types/crm_lead.ts similarity index 97% rename from examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_lead.ts rename to packages/starters/enterprise/src/types/crm_lead.ts index 6450ff56..2689d610 100644 --- a/examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_lead.ts +++ b/packages/starters/enterprise/src/types/crm_lead.ts @@ -26,6 +26,9 @@ export interface CrmLead extends ObjectDoc { * Phone */ phone?: string; + /** + * Status + */ status: string; /** * Lead Source diff --git a/examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_opportunity.ts b/packages/starters/enterprise/src/types/crm_opportunity.ts similarity index 96% rename from examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_opportunity.ts rename to packages/starters/enterprise/src/types/crm_opportunity.ts index fc2e8a68..23e4702c 100644 --- a/examples/scenarios/enterprise-structure/src/types/modules/crm/objects/crm_opportunity.ts +++ b/packages/starters/enterprise/src/types/crm_opportunity.ts @@ -18,6 +18,9 @@ export interface CrmOpportunity extends ObjectDoc { * Expected Close Date */ close_date: Date | string; + /** + * Stage + */ stage: string; /** * Probability (%) diff --git a/examples/scenarios/enterprise-structure/src/types/finance_budget.ts b/packages/starters/enterprise/src/types/finance_budget.ts similarity index 90% rename from examples/scenarios/enterprise-structure/src/types/finance_budget.ts rename to packages/starters/enterprise/src/types/finance_budget.ts index a27ab868..b3da7b4d 100644 --- a/examples/scenarios/enterprise-structure/src/types/finance_budget.ts +++ b/packages/starters/enterprise/src/types/finance_budget.ts @@ -10,6 +10,9 @@ export interface FinanceBudget extends ObjectDoc { * Fiscal Year */ fiscal_year: number; + /** + * Period + */ period?: string; /** * Department @@ -19,6 +22,9 @@ export interface FinanceBudget extends ObjectDoc { * Project */ project?: string | number; + /** + * Category + */ category?: string; /** * Allocated Amount @@ -40,6 +46,9 @@ export interface FinanceBudget extends ObjectDoc { * End Date */ end_date: Date | string; + /** + * Status + */ status?: string; /** * Budget Owner diff --git a/examples/scenarios/enterprise-structure/src/types/finance_expense.ts b/packages/starters/enterprise/src/types/finance_expense.ts similarity index 91% rename from examples/scenarios/enterprise-structure/src/types/finance_expense.ts rename to packages/starters/enterprise/src/types/finance_expense.ts index 3734f625..57b945e8 100644 --- a/examples/scenarios/enterprise-structure/src/types/finance_expense.ts +++ b/packages/starters/enterprise/src/types/finance_expense.ts @@ -14,11 +14,17 @@ export interface FinanceExpense extends ObjectDoc { * Expense Date */ expense_date: Date | string; + /** + * Category + */ category: string; /** * Amount */ amount: number; + /** + * Currency + */ currency?: string; /** * Merchant/Vendor @@ -32,6 +38,9 @@ export interface FinanceExpense extends ObjectDoc { * Receipt Attachment */ receipt_url?: any; + /** + * Status + */ status: string; /** * Approved By diff --git a/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_invoice.ts b/packages/starters/enterprise/src/types/finance_invoice.ts similarity index 94% rename from examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_invoice.ts rename to packages/starters/enterprise/src/types/finance_invoice.ts index e187b102..8f2cbdee 100644 --- a/examples/scenarios/enterprise-structure/src/types/modules/finance/objects/finance_invoice.ts +++ b/packages/starters/enterprise/src/types/finance_invoice.ts @@ -42,11 +42,17 @@ export interface FinanceInvoice extends ObjectDoc { * Balance Due */ balance?: number; + /** + * Status + */ status: string; /** * Payment Terms */ payment_terms?: string; + /** + * Currency + */ currency?: string; /** * Billing Address diff --git a/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_payment.ts b/packages/starters/enterprise/src/types/finance_payment.ts similarity index 88% rename from examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_payment.ts rename to packages/starters/enterprise/src/types/finance_payment.ts index 3c3b320d..402a43c9 100644 --- a/examples/scenarios/enterprise-structure/src/modules/finance/objects/finance_payment.ts +++ b/packages/starters/enterprise/src/types/finance_payment.ts @@ -22,12 +22,21 @@ export interface FinancePayment extends ObjectDoc { * Payment Amount */ amount: number; + /** + * Payment Method + */ payment_method: string; + /** + * Currency + */ currency?: string; /** * Reference/Transaction Number */ reference_number?: string; + /** + * Status + */ status: string; /** * Processed By diff --git a/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_department.ts b/packages/starters/enterprise/src/types/hr_department.ts similarity index 95% rename from examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_department.ts rename to packages/starters/enterprise/src/types/hr_department.ts index 3f96db09..6703ecfe 100644 --- a/examples/scenarios/enterprise-structure/src/modules/hr/objects/hr_department.ts +++ b/packages/starters/enterprise/src/types/hr_department.ts @@ -30,5 +30,8 @@ export interface HrDepartment extends ObjectDoc { * Description */ description?: string; + /** + * Status + */ status?: string; } diff --git a/examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_employee.ts b/packages/starters/enterprise/src/types/hr_employee.ts similarity index 95% rename from examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_employee.ts rename to packages/starters/enterprise/src/types/hr_employee.ts index 176207a9..07d8765a 100644 --- a/examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_employee.ts +++ b/packages/starters/enterprise/src/types/hr_employee.ts @@ -54,7 +54,13 @@ export interface HrEmployee extends ObjectDoc { * Termination Date */ termination_date?: Date | string; + /** + * Employment Type + */ employment_type?: string; + /** + * Status + */ status: string; /** * Base Salary diff --git a/examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_position.ts b/packages/starters/enterprise/src/types/hr_position.ts similarity index 96% rename from examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_position.ts rename to packages/starters/enterprise/src/types/hr_position.ts index 221d65c7..809d6d47 100644 --- a/examples/scenarios/enterprise-structure/src/types/modules/hr/objects/hr_position.ts +++ b/packages/starters/enterprise/src/types/hr_position.ts @@ -42,5 +42,8 @@ export interface HrPosition extends ObjectDoc { * Key Responsibilities */ responsibilities?: string; + /** + * Status + */ status?: string; } diff --git a/examples/scenarios/enterprise-structure/src/types/hr_timesheet.ts b/packages/starters/enterprise/src/types/hr_timesheet.ts similarity index 93% rename from examples/scenarios/enterprise-structure/src/types/hr_timesheet.ts rename to packages/starters/enterprise/src/types/hr_timesheet.ts index ff0c4144..c5a54919 100644 --- a/examples/scenarios/enterprise-structure/src/types/hr_timesheet.ts +++ b/packages/starters/enterprise/src/types/hr_timesheet.ts @@ -34,7 +34,13 @@ export interface HrTimesheet extends ObjectDoc { * Break Hours */ break_hours?: number; + /** + * Work Type + */ work_type?: string; + /** + * Status + */ status: string; /** * Approved By diff --git a/examples/scenarios/enterprise-structure/src/types/index.ts b/packages/starters/enterprise/src/types/index.ts similarity index 100% rename from examples/scenarios/enterprise-structure/src/types/index.ts rename to packages/starters/enterprise/src/types/index.ts index a49b8298..45f2c984 100644 --- a/examples/scenarios/enterprise-structure/src/types/index.ts +++ b/packages/starters/enterprise/src/types/index.ts @@ -1,6 +1,6 @@ -export * from './user'; export * from './attachment'; export * from './organization'; +export * from './user'; export * from './crm_account'; export * from './crm_contact'; export * from './crm_lead'; diff --git a/examples/scenarios/enterprise-structure/src/types/organization.ts b/packages/starters/enterprise/src/types/organization.ts similarity index 93% rename from examples/scenarios/enterprise-structure/src/types/organization.ts rename to packages/starters/enterprise/src/types/organization.ts index 48eb0807..aac1ed21 100644 --- a/examples/scenarios/enterprise-structure/src/types/organization.ts +++ b/packages/starters/enterprise/src/types/organization.ts @@ -10,6 +10,9 @@ export interface Organization extends ObjectDoc { * Organization Code */ code?: string; + /** + * Type + */ type?: string; /** * Parent Organization @@ -43,5 +46,8 @@ export interface Organization extends ObjectDoc { * Contact Email */ email?: string; + /** + * Status + */ status?: string; } diff --git a/examples/scenarios/enterprise-structure/src/types/project_milestone.ts b/packages/starters/enterprise/src/types/project_milestone.ts similarity index 95% rename from examples/scenarios/enterprise-structure/src/types/project_milestone.ts rename to packages/starters/enterprise/src/types/project_milestone.ts index 34451382..b02fdf52 100644 --- a/examples/scenarios/enterprise-structure/src/types/project_milestone.ts +++ b/packages/starters/enterprise/src/types/project_milestone.ts @@ -22,6 +22,9 @@ export interface ProjectMilestone extends ObjectDoc { * Completion Date */ completed_date?: Date | string; + /** + * Status + */ status: string; /** * Milestone Owner diff --git a/examples/scenarios/enterprise-structure/src/modules/project/objects/project_project.ts b/packages/starters/enterprise/src/types/project_project.ts similarity index 92% rename from examples/scenarios/enterprise-structure/src/modules/project/objects/project_project.ts rename to packages/starters/enterprise/src/types/project_project.ts index f35f3e39..3833d99e 100644 --- a/examples/scenarios/enterprise-structure/src/modules/project/objects/project_project.ts +++ b/packages/starters/enterprise/src/types/project_project.ts @@ -14,8 +14,17 @@ export interface ProjectProject extends ObjectDoc { * Description */ description?: string; + /** + * Status + */ status: string; + /** + * Priority + */ priority?: string; + /** + * Type + */ type?: string; /** * Customer Account diff --git a/examples/scenarios/enterprise-structure/src/types/project_task.ts b/packages/starters/enterprise/src/types/project_task.ts similarity index 93% rename from examples/scenarios/enterprise-structure/src/types/project_task.ts rename to packages/starters/enterprise/src/types/project_task.ts index 722709b2..28669e25 100644 --- a/examples/scenarios/enterprise-structure/src/types/project_task.ts +++ b/packages/starters/enterprise/src/types/project_task.ts @@ -18,7 +18,13 @@ export interface ProjectTask extends ObjectDoc { * Description */ description?: string; + /** + * Status + */ status: string; + /** + * Priority + */ priority?: string; /** * Assigned To diff --git a/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_timesheet_entry.ts b/packages/starters/enterprise/src/types/project_timesheet_entry.ts similarity index 96% rename from examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_timesheet_entry.ts rename to packages/starters/enterprise/src/types/project_timesheet_entry.ts index e403f5fe..c74ca3ed 100644 --- a/examples/scenarios/enterprise-structure/src/types/modules/project/objects/project_timesheet_entry.ts +++ b/packages/starters/enterprise/src/types/project_timesheet_entry.ts @@ -30,6 +30,9 @@ export interface ProjectTimesheetEntry extends ObjectDoc { * Billable */ billable?: boolean; + /** + * Status + */ status?: string; /** * Approved By diff --git a/examples/scenarios/enterprise-structure/src/types/user.ts b/packages/starters/enterprise/src/types/user.ts similarity index 91% rename from examples/scenarios/enterprise-structure/src/types/user.ts rename to packages/starters/enterprise/src/types/user.ts index b8a8ce75..a49276bf 100644 --- a/examples/scenarios/enterprise-structure/src/types/user.ts +++ b/packages/starters/enterprise/src/types/user.ts @@ -2,34 +2,14 @@ import { ObjectDoc } from '@objectql/types'; export interface User extends ObjectDoc { - /** - * Employee Record - */ - employee?: string | number; - /** - * Email Address - */ - email: string; - /** - * Employee ID - */ - employee_id?: string; - /** - * Department - */ - department?: string | number; - /** - * Office Location - */ - office_location?: string; - /** - * Two-Factor Auth Enabled - */ - two_factor_enabled?: boolean; /** * Full Name */ name: string; + /** + * Email + */ + email: any; /** * Username */ @@ -42,7 +22,13 @@ export interface User extends ObjectDoc { * Profile Picture */ avatar?: any; + /** + * Status + */ status?: string; + /** + * Role + */ role?: string; /** * Last Login Time @@ -56,4 +42,24 @@ export interface User extends ObjectDoc { * Timezone */ timezone?: string; + /** + * Employee Record + */ + employee?: string | number; + /** + * Employee ID + */ + employee_id?: string; + /** + * Department + */ + department?: string | number; + /** + * Office Location + */ + office_location?: string; + /** + * Two-Factor Auth Enabled + */ + two_factor_enabled?: boolean; } diff --git a/examples/scenarios/enterprise-structure/tsconfig.json b/packages/starters/enterprise/tsconfig.json similarity index 100% rename from examples/scenarios/enterprise-structure/tsconfig.json rename to packages/starters/enterprise/tsconfig.json diff --git a/examples/starters/express-api/CHANGELOG.md b/packages/starters/express-api/CHANGELOG.md similarity index 100% rename from examples/starters/express-api/CHANGELOG.md rename to packages/starters/express-api/CHANGELOG.md diff --git a/examples/starters/express-api/README.md b/packages/starters/express-api/README.md similarity index 100% rename from examples/starters/express-api/README.md rename to packages/starters/express-api/README.md diff --git a/examples/starters/express-api/package.json b/packages/starters/express-api/package.json similarity index 73% rename from examples/starters/express-api/package.json rename to packages/starters/express-api/package.json index c60231af..e49b1448 100644 --- a/examples/starters/express-api/package.json +++ b/packages/starters/express-api/package.json @@ -1,14 +1,14 @@ { - "name": "@example/express-api", + "name": "@objectql/starter-express-api", "version": "1.1.4", "license": "MIT", "author": "ObjectQL Contributors", "repository": { "type": "git", "url": "https://github.com/objectql/objectql.git", - "directory": "examples/starters/express-api" + "directory": "packages/starters/express-api" }, - "private": true, + "private": false, "scripts": { "build": "tsc && cp src/*.yml dist/ || true", "start": "node dist/index.js" @@ -17,7 +17,8 @@ "@objectql/core": "workspace:*", "@objectql/server": "workspace:*", "@objectql/types": "workspace:*", - "@objectql/driver-knex": "workspace:*", + "@objectql/driver-sql": "workspace:*", + "@objectql/platform-node": "workspace:*", "express": "^4.18.2", "sqlite3": "^5.1.7" }, diff --git a/examples/starters/express-api/src/index.ts b/packages/starters/express-api/src/index.ts similarity index 92% rename from examples/starters/express-api/src/index.ts rename to packages/starters/express-api/src/index.ts index 3e33b689..ae711c5b 100644 --- a/examples/starters/express-api/src/index.ts +++ b/packages/starters/express-api/src/index.ts @@ -1,6 +1,7 @@ import express from 'express'; import { ObjectQL } from '@objectql/core'; -import { KnexDriver } from '@objectql/driver-knex'; +import { KnexDriver } from '@objectql/driver-sql'; +import { ObjectLoader } from '@objectql/platform-node'; import { createNodeHandler, createMetadataHandler, createStudioHandler, createRESTHandler } from '@objectql/server'; import * as path from 'path'; @@ -18,11 +19,13 @@ async function main() { } }); - // 2. Register Schema - app.loadFromDirectory(path.join(__dirname)); - await app.init(); + // 2. Load Schema +const rootDir = path.resolve(__dirname, '..'); +const loader = new ObjectLoader(app.metadata); +loader.load(rootDir); - // 3. Create Handlers +// 3. Init +app.init().then(async () => { const objectQLHandler = createNodeHandler(app); const restHandler = createRESTHandler(app); const metadataHandler = createMetadataHandler(app); @@ -75,6 +78,7 @@ async function main() { console.log(`\nTest Metadata API:`); console.log(`curl http://localhost:${port}/api/metadata/objects`); }); + }); } main().catch(console.error); diff --git a/examples/starters/express-api/src/task.object.yml b/packages/starters/express-api/src/task.object.yml similarity index 97% rename from examples/starters/express-api/src/task.object.yml rename to packages/starters/express-api/src/task.object.yml index ceec7dad..a4a8b9ee 100644 --- a/examples/starters/express-api/src/task.object.yml +++ b/packages/starters/express-api/src/task.object.yml @@ -1,4 +1,3 @@ -name: Task label: Tasks fields: title: diff --git a/examples/starters/express-api/src/test.view.yml b/packages/starters/express-api/src/test.view.yml similarity index 100% rename from examples/starters/express-api/src/test.view.yml rename to packages/starters/express-api/src/test.view.yml diff --git a/examples/starters/express-api/src/user.object.yml b/packages/starters/express-api/src/user.object.yml similarity index 96% rename from examples/starters/express-api/src/user.object.yml rename to packages/starters/express-api/src/user.object.yml index 80e840f1..77f7af15 100644 --- a/examples/starters/express-api/src/user.object.yml +++ b/packages/starters/express-api/src/user.object.yml @@ -1,4 +1,3 @@ -name: User label: Users fields: name: diff --git a/examples/starters/express-api/tsconfig.json b/packages/starters/express-api/tsconfig.json similarity index 100% rename from examples/starters/express-api/tsconfig.json rename to packages/starters/express-api/tsconfig.json diff --git a/packages/cli/CHANGELOG.md b/packages/tools/cli/CHANGELOG.md similarity index 100% rename from packages/cli/CHANGELOG.md rename to packages/tools/cli/CHANGELOG.md diff --git a/packages/cli/README.md b/packages/tools/cli/README.md similarity index 100% rename from packages/cli/README.md rename to packages/tools/cli/README.md diff --git a/packages/cli/bin/objectql b/packages/tools/cli/bin/objectql similarity index 100% rename from packages/cli/bin/objectql rename to packages/tools/cli/bin/objectql diff --git a/packages/cli/package.json b/packages/tools/cli/package.json similarity index 88% rename from packages/cli/package.json rename to packages/tools/cli/package.json index 71604423..827d04cd 100644 --- a/packages/cli/package.json +++ b/packages/tools/cli/package.json @@ -14,7 +14,8 @@ "@objectql/types": "workspace:*", "@objectql/core": "workspace:*", "@objectql/server": "workspace:*", - "@objectql/driver-knex": "workspace:*", + "@objectql/driver-sql": "workspace:*", + "@objectql/platform-node": "workspace:*", "sqlite3": "^5.1.7", "commander": "^11.0.0", "chalk": "^4.1.2", diff --git a/packages/cli/src/commands/generate.ts b/packages/tools/cli/src/commands/generate.ts similarity index 98% rename from packages/cli/src/commands/generate.ts rename to packages/tools/cli/src/commands/generate.ts index 7a97a33c..208ba704 100644 --- a/packages/cli/src/commands/generate.ts +++ b/packages/tools/cli/src/commands/generate.ts @@ -1,6 +1,6 @@ import * as fs from 'fs'; import * as path from 'path'; -import { loadObjectConfigs } from '@objectql/core'; +import { loadObjectConfigs } from '@objectql/platform-node'; import { ObjectConfig, FieldConfig } from '@objectql/types'; export async function generateTypes(sourceDir: string, outputDir: string) { diff --git a/packages/cli/src/commands/repl.ts b/packages/tools/cli/src/commands/repl.ts similarity index 100% rename from packages/cli/src/commands/repl.ts rename to packages/tools/cli/src/commands/repl.ts diff --git a/packages/cli/src/commands/serve.ts b/packages/tools/cli/src/commands/serve.ts similarity index 94% rename from packages/cli/src/commands/serve.ts rename to packages/tools/cli/src/commands/serve.ts index 1c6f25d5..58b64273 100644 --- a/packages/cli/src/commands/serve.ts +++ b/packages/tools/cli/src/commands/serve.ts @@ -1,5 +1,6 @@ import { ObjectQL } from '@objectql/core'; -import { KnexDriver } from '@objectql/driver-knex'; +import { KnexDriver } from '@objectql/driver-sql'; +import { ObjectLoader } from '@objectql/platform-node'; import { createNodeHandler } from '@objectql/server'; import { createServer } from 'http'; import * as path from 'path'; @@ -53,7 +54,8 @@ export async function serve(options: { port: number; dir: string }) { // 2. Load Schema try { - app.loadFromDirectory(rootDir); + const loader = new ObjectLoader(app.metadata); + loader.load(rootDir); await app.init(); console.log(chalk.green('✅ Schema loaded successfully.')); } catch (e: any) { diff --git a/packages/cli/src/commands/studio.ts b/packages/tools/cli/src/commands/studio.ts similarity index 99% rename from packages/cli/src/commands/studio.ts rename to packages/tools/cli/src/commands/studio.ts index ed5b976f..ab0a5abd 100644 --- a/packages/cli/src/commands/studio.ts +++ b/packages/tools/cli/src/commands/studio.ts @@ -1,4 +1,5 @@ import { ObjectQL } from '@objectql/core'; +import { ObjectLoader, createDriverFromConnection } from '@objectql/platform-node'; import { createNodeHandler, createStudioHandler, createMetadataHandler } from '@objectql/server'; import { createServer } from 'http'; import * as path from 'path'; diff --git a/packages/cli/src/index.ts b/packages/tools/cli/src/index.ts similarity index 100% rename from packages/cli/src/index.ts rename to packages/tools/cli/src/index.ts diff --git a/packages/tools/cli/tsconfig.json b/packages/tools/cli/tsconfig.json new file mode 100644 index 00000000..a5ff5513 --- /dev/null +++ b/packages/tools/cli/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "dist", + "rootDir": "src" + }, + "include": ["src"], + "references": [ + { "path": "../../foundation/types" }, + { "path": "../../foundation/core" }, + { "path": "../../runtime/server" }, + { "path": "../../foundation/platform-node" }, + { "path": "../../drivers/sql" } + ] +} diff --git a/packages/studio/CHANGELOG.md b/packages/tools/studio/CHANGELOG.md similarity index 100% rename from packages/studio/CHANGELOG.md rename to packages/tools/studio/CHANGELOG.md diff --git a/packages/studio/README.md b/packages/tools/studio/README.md similarity index 100% rename from packages/studio/README.md rename to packages/tools/studio/README.md diff --git a/packages/studio/index.html b/packages/tools/studio/index.html similarity index 100% rename from packages/studio/index.html rename to packages/tools/studio/index.html diff --git a/packages/studio/package.json b/packages/tools/studio/package.json similarity index 100% rename from packages/studio/package.json rename to packages/tools/studio/package.json diff --git a/packages/studio/postcss.config.cjs b/packages/tools/studio/postcss.config.cjs similarity index 100% rename from packages/studio/postcss.config.cjs rename to packages/tools/studio/postcss.config.cjs diff --git a/packages/studio/src/App.css b/packages/tools/studio/src/App.css similarity index 100% rename from packages/studio/src/App.css rename to packages/tools/studio/src/App.css diff --git a/packages/studio/src/App.tsx b/packages/tools/studio/src/App.tsx similarity index 100% rename from packages/studio/src/App.tsx rename to packages/tools/studio/src/App.tsx diff --git a/packages/studio/src/components/DataGrid.tsx b/packages/tools/studio/src/components/DataGrid.tsx similarity index 100% rename from packages/studio/src/components/DataGrid.tsx rename to packages/tools/studio/src/components/DataGrid.tsx diff --git a/packages/studio/src/components/FileEditor.tsx b/packages/tools/studio/src/components/FileEditor.tsx similarity index 100% rename from packages/studio/src/components/FileEditor.tsx rename to packages/tools/studio/src/components/FileEditor.tsx diff --git a/packages/studio/src/components/ObjectList.tsx b/packages/tools/studio/src/components/ObjectList.tsx similarity index 100% rename from packages/studio/src/components/ObjectList.tsx rename to packages/tools/studio/src/components/ObjectList.tsx diff --git a/packages/studio/src/components/RecordDetail.tsx b/packages/tools/studio/src/components/RecordDetail.tsx similarity index 100% rename from packages/studio/src/components/RecordDetail.tsx rename to packages/tools/studio/src/components/RecordDetail.tsx diff --git a/packages/studio/src/components/SchemaInspector.tsx b/packages/tools/studio/src/components/SchemaInspector.tsx similarity index 100% rename from packages/studio/src/components/SchemaInspector.tsx rename to packages/tools/studio/src/components/SchemaInspector.tsx diff --git a/packages/studio/src/components/Sidebar.tsx b/packages/tools/studio/src/components/Sidebar.tsx similarity index 100% rename from packages/studio/src/components/Sidebar.tsx rename to packages/tools/studio/src/components/Sidebar.tsx diff --git a/packages/studio/src/components/ui/button.tsx b/packages/tools/studio/src/components/ui/button.tsx similarity index 100% rename from packages/studio/src/components/ui/button.tsx rename to packages/tools/studio/src/components/ui/button.tsx diff --git a/packages/studio/src/components/ui/card.tsx b/packages/tools/studio/src/components/ui/card.tsx similarity index 100% rename from packages/studio/src/components/ui/card.tsx rename to packages/tools/studio/src/components/ui/card.tsx diff --git a/packages/studio/src/hooks/use-metadata.ts b/packages/tools/studio/src/hooks/use-metadata.ts similarity index 100% rename from packages/studio/src/hooks/use-metadata.ts rename to packages/tools/studio/src/hooks/use-metadata.ts diff --git a/packages/studio/src/index.css b/packages/tools/studio/src/index.css similarity index 100% rename from packages/studio/src/index.css rename to packages/tools/studio/src/index.css diff --git a/packages/studio/src/lib/utils.ts b/packages/tools/studio/src/lib/utils.ts similarity index 100% rename from packages/studio/src/lib/utils.ts rename to packages/tools/studio/src/lib/utils.ts diff --git a/packages/studio/src/main.tsx b/packages/tools/studio/src/main.tsx similarity index 100% rename from packages/studio/src/main.tsx rename to packages/tools/studio/src/main.tsx diff --git a/packages/studio/src/pages/Dashboard.tsx b/packages/tools/studio/src/pages/Dashboard.tsx similarity index 100% rename from packages/studio/src/pages/Dashboard.tsx rename to packages/tools/studio/src/pages/Dashboard.tsx diff --git a/packages/studio/src/pages/MetadataBrowser.tsx b/packages/tools/studio/src/pages/MetadataBrowser.tsx similarity index 100% rename from packages/studio/src/pages/MetadataBrowser.tsx rename to packages/tools/studio/src/pages/MetadataBrowser.tsx diff --git a/packages/studio/src/pages/ObjectView.tsx b/packages/tools/studio/src/pages/ObjectView.tsx similarity index 100% rename from packages/studio/src/pages/ObjectView.tsx rename to packages/tools/studio/src/pages/ObjectView.tsx diff --git a/packages/studio/src/pages/SchemaEditor.tsx b/packages/tools/studio/src/pages/SchemaEditor.tsx similarity index 100% rename from packages/studio/src/pages/SchemaEditor.tsx rename to packages/tools/studio/src/pages/SchemaEditor.tsx diff --git a/packages/studio/tailwind.config.cjs b/packages/tools/studio/tailwind.config.cjs similarity index 100% rename from packages/studio/tailwind.config.cjs rename to packages/tools/studio/tailwind.config.cjs diff --git a/packages/studio/tsconfig.json b/packages/tools/studio/tsconfig.json similarity index 92% rename from packages/studio/tsconfig.json rename to packages/tools/studio/tsconfig.json index 811b99ec..841ca8af 100644 --- a/packages/studio/tsconfig.json +++ b/packages/tools/studio/tsconfig.json @@ -1,5 +1,5 @@ { - "extends": "../../tsconfig.base.json", + "extends": "../../../tsconfig.base.json", "compilerOptions": { "target": "ES2020", "useDefineForClassFields": true, diff --git a/packages/studio/vite.config.ts b/packages/tools/studio/vite.config.ts similarity index 100% rename from packages/studio/vite.config.ts rename to packages/tools/studio/vite.config.ts diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 1117e0d3..69394b89 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -57,95 +57,192 @@ importers: devDependencies: '@objectql/cli': specifier: workspace:* - version: link:../../../packages/cli + version: link:../../../packages/tools/cli '@objectql/core': specifier: workspace:* - version: link:../../../packages/core - '@objectql/driver-knex': + version: link:../../../packages/foundation/core + '@objectql/driver-sql': specifier: workspace:* - version: link:../../../packages/driver-knex + version: link:../../../packages/drivers/sql + '@objectql/platform-node': + specifier: workspace:* + version: link:../../../packages/foundation/platform-node '@objectql/types': specifier: workspace:* - version: link:../../../packages/types + version: link:../../../packages/foundation/types typescript: specifier: ^5.3.0 version: 5.9.3 - examples/scenarios/enterprise-structure: + examples/scenarios/preset-usage: + dependencies: + '@example/audit-log': + specifier: workspace:* + version: link:../../plugins/audit-log + '@objectql/starter-basic': + specifier: workspace:* + version: link:../../../packages/starters/basic devDependencies: '@objectql/cli': specifier: workspace:* - version: link:../../../packages/cli + version: link:../../../packages/tools/cli '@objectql/core': specifier: workspace:* - version: link:../../../packages/core - '@objectql/driver-knex': + version: link:../../../packages/foundation/core + '@objectql/driver-sql': + specifier: workspace:* + version: link:../../../packages/drivers/sql + '@objectql/platform-node': specifier: workspace:* - version: link:../../../packages/driver-knex + version: link:../../../packages/foundation/platform-node '@objectql/types': specifier: workspace:* - version: link:../../../packages/types + version: link:../../../packages/foundation/types + sqlite3: + specifier: ^5.1.7 + version: 5.1.7 typescript: specifier: ^5.3.0 version: 5.9.3 - examples/scenarios/preset-usage: + packages/drivers/mongo: dependencies: - '@example/audit-log': + '@objectql/types': specifier: workspace:* - version: link:../../plugins/audit-log - '@example/basic-script': + version: link:../../foundation/types + mongodb: + specifier: ^5.9.2 + version: 5.9.2 + + packages/drivers/sdk: + dependencies: + '@objectql/types': specifier: workspace:* - version: link:../../starters/basic-script + version: link:../../foundation/types devDependencies: - '@objectql/cli': + typescript: + specifier: ^5.3.0 + version: 5.9.3 + + packages/drivers/sql: + dependencies: + '@objectql/types': + specifier: workspace:* + version: link:../../foundation/types + knex: + specifier: ^3.1.0 + version: 3.1.0(sqlite3@5.1.7) + devDependencies: + sqlite3: + specifier: ^5.1.7 + version: 5.1.7 + + packages/foundation/core: + dependencies: + '@objectql/types': specifier: workspace:* - version: link:../../../packages/cli + version: link:../types + devDependencies: + typescript: + specifier: ^5.3.0 + version: 5.9.3 + + packages/foundation/platform-node: + dependencies: '@objectql/core': specifier: workspace:* - version: link:../../../packages/core - '@objectql/driver-knex': + version: link:../core + '@objectql/types': + specifier: workspace:* + version: link:../types + fast-glob: + specifier: ^3.3.2 + version: 3.3.3 + js-yaml: + specifier: ^4.1.1 + version: 4.1.1 + devDependencies: + typescript: + specifier: ^5.3.0 + version: 5.9.3 + + packages/foundation/types: {} + + packages/runtime/server: + dependencies: + '@objectql/core': specifier: workspace:* - version: link:../../../packages/driver-knex + version: link:../../foundation/core '@objectql/types': specifier: workspace:* - version: link:../../../packages/types - sqlite3: - specifier: ^5.1.7 - version: 5.1.7 + version: link:../../foundation/types + js-yaml: + specifier: ^4.1.1 + version: 4.1.1 + devDependencies: + '@types/js-yaml': + specifier: ^4.0.9 + version: 4.0.9 + '@types/node': + specifier: ^20.10.0 + version: 20.19.28 typescript: specifier: ^5.3.0 version: 5.9.3 - examples/starters/basic-script: + packages/starters/basic: devDependencies: '@objectql/cli': specifier: workspace:* - version: link:../../../packages/cli + version: link:../../tools/cli '@objectql/core': specifier: workspace:* - version: link:../../../packages/core + version: link:../../foundation/core '@objectql/types': specifier: workspace:* - version: link:../../../packages/types + version: link:../../foundation/types typescript: specifier: ^5.3.0 version: 5.9.3 - examples/starters/express-api: + packages/starters/enterprise: + devDependencies: + '@objectql/cli': + specifier: workspace:* + version: link:../../tools/cli + '@objectql/core': + specifier: workspace:* + version: link:../../foundation/core + '@objectql/driver-sql': + specifier: workspace:* + version: link:../../drivers/sql + '@objectql/platform-node': + specifier: workspace:* + version: link:../../foundation/platform-node + '@objectql/types': + specifier: workspace:* + version: link:../../foundation/types + typescript: + specifier: ^5.3.0 + version: 5.9.3 + + packages/starters/express-api: dependencies: '@objectql/core': specifier: workspace:* - version: link:../../../packages/core - '@objectql/driver-knex': + version: link:../../foundation/core + '@objectql/driver-sql': + specifier: workspace:* + version: link:../../drivers/sql + '@objectql/platform-node': specifier: workspace:* - version: link:../../../packages/driver-knex + version: link:../../foundation/platform-node '@objectql/server': specifier: workspace:* - version: link:../../../packages/server + version: link:../../runtime/server '@objectql/types': specifier: workspace:* - version: link:../../../packages/types + version: link:../../foundation/types express: specifier: ^4.18.2 version: 4.22.1 @@ -160,20 +257,23 @@ importers: specifier: ^5.0.0 version: 5.9.3 - packages/cli: + packages/tools/cli: dependencies: '@objectql/core': specifier: workspace:* - version: link:../core - '@objectql/driver-knex': + version: link:../../foundation/core + '@objectql/driver-sql': + specifier: workspace:* + version: link:../../drivers/sql + '@objectql/platform-node': specifier: workspace:* - version: link:../driver-knex + version: link:../../foundation/platform-node '@objectql/server': specifier: workspace:* - version: link:../server + version: link:../../runtime/server '@objectql/types': specifier: workspace:* - version: link:../types + version: link:../../foundation/types chalk: specifier: ^4.1.2 version: 4.1.2 @@ -206,80 +306,7 @@ importers: specifier: ^5.0.0 version: 5.9.3 - packages/core: - dependencies: - '@objectql/driver-remote': - specifier: workspace:* - version: link:../driver-remote - '@objectql/types': - specifier: workspace:* - version: link:../types - fast-glob: - specifier: ^3.3.2 - version: 3.3.3 - js-yaml: - specifier: ^4.1.1 - version: 4.1.1 - devDependencies: - typescript: - specifier: ^5.3.0 - version: 5.9.3 - - packages/driver-knex: - dependencies: - '@objectql/types': - specifier: workspace:* - version: link:../types - knex: - specifier: ^3.1.0 - version: 3.1.0(sqlite3@5.1.7) - devDependencies: - sqlite3: - specifier: ^5.1.7 - version: 5.1.7 - - packages/driver-mongo: - dependencies: - '@objectql/types': - specifier: workspace:* - version: link:../types - mongodb: - specifier: ^5.9.2 - version: 5.9.2 - - packages/driver-remote: - dependencies: - '@objectql/types': - specifier: workspace:* - version: link:../types - devDependencies: - typescript: - specifier: ^5.3.0 - version: 5.9.3 - - packages/server: - dependencies: - '@objectql/core': - specifier: workspace:* - version: link:../core - '@objectql/types': - specifier: workspace:* - version: link:../types - js-yaml: - specifier: ^4.1.1 - version: 4.1.1 - devDependencies: - '@types/js-yaml': - specifier: ^4.0.9 - version: 4.0.9 - '@types/node': - specifier: ^20.10.0 - version: 20.19.28 - typescript: - specifier: ^5.3.0 - version: 5.9.3 - - packages/studio: + packages/tools/studio: dependencies: ag-grid-community: specifier: ^31.0.0 @@ -340,8 +367,6 @@ importers: specifier: ^5.0.8 version: 5.4.21(@types/node@20.19.28) - packages/types: {} - packages: '@algolia/abtesting@1.12.2': diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml index ad1d7984..4abff102 100644 --- a/pnpm-workspace.yaml +++ b/pnpm-workspace.yaml @@ -1,6 +1,9 @@ packages: - - packages/* - - examples/starters/* + - packages/foundation/* + - packages/drivers/* + - packages/runtime/* + - packages/tools/* + - packages/starters/* - examples/scenarios/* - examples/plugins/* diff --git a/tsconfig.json b/tsconfig.json index aea2e09f..d7c712f5 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,12 +1,19 @@ { "files": [], "references": [ - { "path": "./packages/types" }, - { "path": "./packages/core" }, - { "path": "./packages/driver-mongo" }, - { "path": "./packages/driver-knex" }, - { "path": "./packages/driver-remote" }, - { "path": "./packages/server" }, - { "path": "./packages/cli" } + { "path": "./packages/foundation/types" }, + { "path": "./packages/foundation/core" }, + { "path": "./packages/drivers/mongo" }, + { "path": "./packages/drivers/sql" }, + { "path": "./packages/drivers/sdk" }, + { "path": "./packages/foundation/platform-node" }, + { "path": "./packages/runtime/server" }, + { "path": "./packages/tools/cli" }, + { "path": "./packages/tools/studio" }, + { "path": "./packages/starters/express-api" }, + { "path": "./packages/starters/basic" }, + { "path": "./packages/starters/enterprise" }, + { "path": "./examples/plugins/audit-log" }, + { "path": "./examples/scenarios/preset-usage" } ] }