-
Notifications
You must be signed in to change notification settings - Fork 0
Define RuntimePlugin interface and update protocol plugins for conformance #238
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
…ement it - Define RuntimePlugin and RuntimeContext interfaces in @objectql/types - Update GraphQL, OData V4, and JSON-RPC plugins to implement RuntimePlugin - Replace ObjectStackProtocolImplementation with direct engine access - Add helper methods for metadata and CRUD operations in each plugin - Update package dependencies to use @objectql/types instead of @objectstack/runtime Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
- Add comprehensive tests for RuntimePlugin interface - Test lifecycle hook execution order - Test RuntimeContext functionality - Verify sync and async hook support Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
- Document RuntimePlugin interface and RuntimeContext - Update plugin implementation pattern - Add Engine API documentation - Remove references to deprecated ObjectStackRuntimeProtocol Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
Complete documentation of the RuntimePlugin interface implementation and protocol plugin updates for GraphQL, OData V4, and JSON-RPC. Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
…yaml - Remove references to @objectstack/spec, @objectstack/runtime, @objectstack/objectql, @objectstack/core - Remove ../spec/packages/* and packages/objectstack/* from pnpm-workspace.yaml - Update pnpm-lock.yaml to reflect clean dependencies Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
|
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
…and having properties TypeScript compilation was failing because Data.QueryAST from @objectstack/spec doesn't include all properties being assigned in query-builder.ts. Extended the interface locally to include the missing properties: top, expand, aggregations, having. Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
Fixed CI build error in commit 2a6edbe: Build Error: TypeScript compilation was failing with:
Root Cause: The Fix: Extended the QueryAST interface locally in The CI should now pass the build step. |
|
… from @objectstack packages Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
|
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
|
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
Co-authored-by: hotlong <50353452+hotlong@users.noreply.github.com>
|
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Pull request overview
Defines a new RuntimePlugin contract in @objectql/types and migrates protocol plugins (GraphQL / OData v4 / JSON-RPC) and related tooling/tests to conform to a unified runtime lifecycle (install → onStart → onStop), alongside workspace/dependency updates to use published @objectstack/* packages.
Changes:
- Added
RuntimePlugin/RuntimeContexttypes and updated config typing to use them. - Updated protocol plugins to implement
RuntimePlugin, added Vitest configs + mocks, and adjusted server tests/mocks for compatibility. - Migrated workspace/dependencies (pnpm workspace + lockfile + multiple package.json updates) and tweaked TS/Jest configs to align with the new setup.
Reviewed changes
Copilot reviewed 62 out of 63 changed files in this pull request and generated 18 comments.
Show a summary per file
| File | Description |
|---|---|
| tsconfig.base.json | Switches TS module/moduleResolution to nodenext for the monorepo baseline. |
| pnpm-workspace.yaml | Removes workspace entries for legacy packages/objectstack/* and external ../spec. |
| pnpm-lock.yaml | Updates lockfile to reflect workspace/package dependency migration to @objectstack/*@^0.6.1. |
| packages/tools/cli/jest.config.js | Adjusts Jest transform to handle TS/JS and updates transform ignore patterns. |
| packages/runtime/server/test/rest.test.ts | Updates pagination behavior to support offset + limit consistently. |
| packages/runtime/server/test/graphql.test.ts | Updates pagination behavior to slice by offset + limit consistently. |
| packages/runtime/server/test/mocks/@objectstack/runtime.ts | Adds runtime mock to unblock Jest testing without pulling full runtime package. |
| packages/runtime/server/test/mocks/@objectstack/objectql.ts | Adds objectql mock for Jest tests. |
| packages/runtime/server/test/mocks/@objectstack/core.ts | Adds core mock re-exporting runtime mock for compatibility. |
| packages/runtime/server/jest.config.js | Redirects @objectstack/* imports to local mocks and adds ts-jest transform config. |
| packages/protocols/odata-v4/vitest.config.ts | Adds Vitest config and aliasing to protocol-level mocks. |
| packages/protocols/odata-v4/tsconfig.json | Aligns protocol TS config with repo base config. |
| packages/protocols/odata-v4/test/mocks/@objectstack/core.ts | Adds protocol-local @objectstack/core mock. |
| packages/protocols/odata-v4/src/index.ts | Migrates OData v4 plugin to RuntimePlugin and direct engine access helpers. |
| packages/protocols/odata-v4/src/index.test.ts | Updates tests to import ObjectKernel from @objectstack/core. |
| packages/protocols/odata-v4/package.json | Updates dependencies/devDependencies for the new runtime/plugin model. |
| packages/protocols/json-rpc/vitest.config.ts | Adds Vitest config and aliasing to protocol-level mocks. |
| packages/protocols/json-rpc/tsconfig.json | Aligns protocol TS config with repo base config. |
| packages/protocols/json-rpc/test/mocks/@objectstack/core.ts | Adds protocol-local @objectstack/core mock. |
| packages/protocols/json-rpc/src/index.ts | Migrates JSON-RPC plugin to RuntimePlugin and direct engine access helpers. |
| packages/protocols/json-rpc/src/index.test.ts | Updates tests to import ObjectKernel from @objectstack/core. |
| packages/protocols/json-rpc/package.json | Updates dependencies/devDependencies for the new runtime/plugin model. |
| packages/protocols/graphql/vitest.config.ts | Adds Vitest config and aliasing to protocol-level mocks. |
| packages/protocols/graphql/tsconfig.json | Aligns protocol TS config with repo base config. |
| packages/protocols/graphql/test/mocks/@objectstack/core.ts | Adds protocol-local @objectstack/core mock. |
| packages/protocols/graphql/src/index.ts | Migrates GraphQL plugin to RuntimePlugin and direct engine access helpers. |
| packages/protocols/graphql/src/index.test.ts | Updates tests to import ObjectKernel from @objectstack/core. |
| packages/protocols/graphql/package.json | Updates dependencies/devDependencies for the new runtime/plugin model. |
| packages/protocols/README.md | Updates protocol plugin docs to reference RuntimePlugin (but still contains outdated bridge-layer sections). |
| packages/foundation/types/test/plugin.test.ts | Adds conformance tests for the new RuntimePlugin contract. |
| packages/foundation/types/src/plugin.ts | Introduces the RuntimePlugin and RuntimeContext interfaces. |
| packages/foundation/types/src/index.ts | Exports the new plugin types from the types package entrypoint. |
| packages/foundation/types/src/config.ts | Updates ObjectQL config typing to use RuntimePlugin. |
| packages/foundation/types/package.json | Updates dependencies (notably adds @objectstack/objectql). |
| packages/foundation/plugin-security/src/plugin.ts | Migrates security plugin typing to RuntimePlugin/RuntimeContext. |
| packages/foundation/plugin-security/package.json | Updates dependencies for new runtime/plugin model. |
| packages/foundation/platform-node/test/mocks/@objectstack/runtime.ts | Fixes mock typing (PluginContext naming) for tests. |
| packages/foundation/platform-node/test/mocks/@objectstack/objectql.ts | Adds objectql mock for platform-node Jest tests. |
| packages/foundation/platform-node/test/mocks/@objectstack/core.ts | Adds core mock re-export for platform-node Jest tests. |
| packages/foundation/platform-node/package.json | Pins @objectstack/spec to ^0.6.1. |
| packages/foundation/platform-node/jest.config.js | Redirects @objectstack/* imports to local mocks for tests. |
| packages/foundation/core/tsconfig.json | Adjusts excludes (removes special-casing for @objectstack+objectql path). |
| packages/foundation/core/src/query/query-builder.ts | Extends QueryAST locally and maps UnifiedQuery → AST more explicitly. |
| packages/foundation/core/src/app.ts | Normalizes metadata accessors to unwrap { content } for compatibility. |
| packages/foundation/core/package.json | Migrates dependencies to @objectstack/*@^0.6.1. |
| packages/drivers/sql/package.json | Pins @objectstack/spec to ^0.6.1. |
| packages/drivers/sdk/package.json | Pins @objectstack/spec to ^0.6.1. |
| packages/drivers/redis/package.json | Pins @objectstack/spec to ^0.6.1. |
| packages/drivers/mongo/package.json | Pins @objectstack/spec to ^0.6.1. |
| packages/drivers/memory/package.json | Pins @objectstack/spec to ^0.6.1. |
| packages/drivers/memory/jest.config.js | Adds explicit ts-jest transform configuration. |
| packages/drivers/localstorage/package.json | Pins @objectstack/spec to ^0.6.1. |
| packages/drivers/fs/package.json | Pins @objectstack/spec to ^0.6.1. |
| packages/drivers/fs/jest.config.js | Adds explicit ts-jest transform configuration. |
| packages/drivers/excel/package.json | Pins @objectstack/spec to ^0.6.1. |
| packages/drivers/excel/jest.config.js | Adds explicit ts-jest transform configuration. |
| package.json | Removes root-level workspace deps on @objectstack/*. |
| examples/showcase/project-tracker/jest.config.js | Updates Jest transform to support TS/JS and adjusts ignore patterns. |
| examples/showcase/enterprise-erp/package.json | Removes @objectstack/spec workspace dependency. |
| examples/showcase/enterprise-erp/jest.config.js | Updates Jest transform to support TS/JS and adjusts ignore patterns. |
| examples/protocols/multi-protocol-server/package.json | Removes @objectstack/runtime workspace dependency. |
| examples/integrations/express-server/jest.config.js | Updates Jest transform to support TS/JS and adjusts ignore patterns. |
| RUNTIME_PLUGIN_IMPLEMENTATION_SUMMARY.md | Adds a written summary of the RuntimePlugin migration and testing approach. |
Files not reviewed (1)
- pnpm-lock.yaml: Language not supported
Comments suppressed due to low confidence (6)
packages/protocols/README.md:217
- This section still describes a "bridge layer" and later shows examples importing
ObjectStackRuntimeProtocolfrom@objectstack/runtime, which contradicts the new direct-engineRuntimePluginapproach. Please remove/rewrite the bridge-layer content and keep the custom-plugin example consistent with@objectql/types+RuntimeContext.engine.
packages/foundation/core/src/app.ts:24 - Unused imports LoaderPlugin, MetadataItem.
import {
MetadataRegistry,
MetadataItem,
Driver,
ObjectConfig,
ObjectQLContext,
ObjectQLContextOptions,
IObjectQL,
ObjectQLConfig,
HookName,
HookHandler,
HookContext,
ActionHandler,
ActionContext,
LoaderPlugin
} from '@objectql/types';
packages/foundation/core/src/app.ts:126
- Unused variable type.
for (const [type, collection] of metadata.entries()) {
packages/foundation/core/src/app.ts:445
- Unused variable key.
for (const [key, obj] of Object.entries(this.config.objects)) {
packages/foundation/platform-node/test/mocks/@objectstack/runtime.ts:51
- Unused variable type.
for (const [type, typeMap] of this.store.entries()) {
packages/protocols/graphql/src/index.ts:286
- Unused variable camelCaseName.
| async onStart(ctx: RuntimeContext): Promise<void> { | ||
| if (!this.engine) { | ||
| throw new Error('Protocol not initialized. Install hook must be called first.'); | ||
| } |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This plugin throws a generic Error for missing install. Consider using ObjectQLError with an explicit code to keep error handling consistent across the runtime/plugin ecosystem.
| "dependencies": { | ||
| "@objectstack/runtime": "workspace:*", | ||
| "@objectql/types": "workspace:*", | ||
| "@objectstack/spec": "workspace:*" | ||
| "@objectstack/core": "^0.6.1" | ||
| }, |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@objectstack/core is now listed as a dependency, but there are no imports/usages of @objectstack/core anywhere in packages/foundation/plugin-security/src. If it’s not required at runtime, please remove it to keep the dependency graph minimal.
| async onStart(ctx: RuntimeContext): Promise<void> { | ||
| if (!this.engine) { | ||
| throw new Error('Protocol not initialized. Install hook must be called first.'); | ||
| } |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
This plugin throws a generic Error when install hasn’t been called. Consider throwing ObjectQLError (from @objectql/types) with a stable error code so callers can handle lifecycle/initialization failures predictably.
| transformIgnorePatterns: [ | ||
| "/node_modules/(?!(@objectstack|.pnpm))" | ||
| ], |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
transformIgnorePatterns uses .pnpm in a regex without escaping the dot, so it matches any character + pnpm rather than the literal .pnpm directory. Escaping it (e.g. \.pnpm) avoids unintended matches.
| "@objectstack/spec": "^0.6.1", | ||
| "@objectstack/objectql": "^0.6.1" |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@objectql/types now declares a dependency on @objectstack/objectql, but there are no imports/usages of @objectstack/objectql anywhere under packages/foundation/types/src. This extra dependency increases install surface area and risks circular deps (types <-> runtime) without benefit. Please remove it (or, if it’s required for runtime JS imports, add a concrete import site and explain why).
| "@objectstack/spec": "^0.6.1", | |
| "@objectstack/objectql": "^0.6.1" | |
| "@objectstack/spec": "^0.6.1" |
|
|
||
| unregisterPackage(packageName: string): void { | ||
| // Simple implementation - in real runtime this would filter by package | ||
| for (const [type, typeMap] of this.store.entries()) { |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused variable type.
| @@ -6,7 +6,7 @@ | |||
|
|
|||
| import { describe, it, expect, beforeEach, afterEach, vi } from 'vitest'; | |||
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused import vi.
|
|
||
| unregisterPackage(packageName: string): void { | ||
| // Simple implementation - in real runtime this would filter by package | ||
| for (const [type, typeMap] of this.store.entries()) { |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused variable type.
|
|
||
| unregisterPackage(packageName: string): void { | ||
| // Simple implementation - in real runtime this would filter by package | ||
| for (const [type, typeMap] of this.store.entries()) { |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused variable type.
|
|
||
| unregisterPackage(packageName: string): void { | ||
| // Simple implementation - in real runtime this would filter by package | ||
| for (const [type, typeMap] of this.store.entries()) { |
Copilot
AI
Jan 29, 2026
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Unused variable type.
✅ Protocol Plugins RuntimePlugin Conformance - COMPLETE
Issue: GraphQL, OData V4, and JSON-RPC protocol plugins did not implement the RuntimePlugin interface, lacking standard lifecycle hooks (install, onStart, onStop) and causing architectural inconsistency.
Solution: Implemented RuntimePlugin interface in @objectql/types and updated all three protocol plugins to conform to the specification.
📦 Latest Updates
Build Fix:
CI/Test Fixes:
📦 Changes Summary
Files Changed: 12+ files
New Files:
packages/foundation/types/src/plugin.ts- RuntimePlugin interface definitionpackages/foundation/types/test/plugin.test.ts- Comprehensive test suitepackages/protocols/*/vitest.config.ts- Test configuration for each protocol pluginpackages/protocols/*/test/__mocks__/@objectstack/core.ts- Mock implementationsRUNTIME_PLUGIN_IMPLEMENTATION_SUMMARY.md- Implementation documentation🎯 Compliance Achieved
RuntimePlugin Interface (in @objectql/types)
All Three Plugins Now Implement:
Standard Lifecycle:
🧪 Testing
🎉 Benefits
📚 Documentation
Status: ✅ READY FOR MERGE
All protocol plugins now conform to the RuntimePlugin specification with proper test configuration, mocks for CI/CD, and build fixes applied.
Original prompt
💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.