@objectstack/objectql 3.0.8 → 3.0.9

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
 
2
- > @objectstack/objectql@3.0.8 build /home/runner/work/spec/spec/packages/objectql
2
+ > @objectstack/objectql@3.0.9 build /home/runner/work/spec/spec/packages/objectql
3
3
  > tsup --config ../../tsup.config.ts
4
4
 
5
5
  CLI Building entry: src/index.ts
@@ -10,13 +10,13 @@
10
10
  CLI Cleaning output folder
11
11
  ESM Build start
12
12
  CJS Build start
13
- CJS dist/index.js 84.46 KB
14
- CJS dist/index.js.map 171.04 KB
15
- CJS ⚡️ Build success in 184ms
16
- ESM dist/index.mjs 82.74 KB
17
- ESM dist/index.mjs.map 169.75 KB
18
- ESM ⚡️ Build success in 186ms
13
+ ESM dist/index.mjs 88.87 KB
14
+ ESM dist/index.mjs.map 182.19 KB
15
+ ESM ⚡️ Build success in 230ms
16
+ CJS dist/index.js 90.59 KB
17
+ CJS dist/index.js.map 183.48 KB
18
+ CJS ⚡️ Build success in 230ms
19
19
  DTS Build start
20
- DTS ⚡️ Build success in 21175ms
21
- DTS dist/index.d.mts 71.63 KB
22
- DTS dist/index.d.ts 71.63 KB
20
+ DTS ⚡️ Build success in 20591ms
21
+ DTS dist/index.d.mts 73.43 KB
22
+ DTS dist/index.d.ts 73.43 KB
package/CHANGELOG.md CHANGED
@@ -1,5 +1,14 @@
1
1
  # @objectstack/objectql
2
2
 
3
+ ## 3.0.9
4
+
5
+ ### Patch Changes
6
+
7
+ - Updated dependencies [15e0df6]
8
+ - @objectstack/spec@3.0.9
9
+ - @objectstack/core@3.0.9
10
+ - @objectstack/types@3.0.9
11
+
3
12
  ## 3.0.8
4
13
 
5
14
  ### Patch Changes
package/dist/index.d.mts CHANGED
@@ -4,6 +4,7 @@ import { ServiceObject, ObjectOwnership, HookContext, QueryAST, DataEngineQueryO
4
4
  import { ObjectStackManifest, InstalledPackage, ExecutionContext } from '@objectstack/spec/kernel';
5
5
  import { ObjectStackProtocol, MetadataCacheRequest, MetadataCacheResponse, BatchUpdateRequest, BatchUpdateResponse, UpdateManyDataRequest, DeleteManyDataRequest } from '@objectstack/spec/api';
6
6
  import { IDataEngine, DriverInterface, Logger, Plugin, PluginContext, ObjectKernel } from '@objectstack/core';
7
+ import { IFeedService } from '@objectstack/spec/contracts';
7
8
 
8
9
  /**
9
10
  * XState-inspired State Machine Protocol
@@ -840,6 +841,9 @@ declare class SchemaRegistry {
840
841
  } | undefined;
841
842
  } | undefined;
842
843
  } | undefined;
844
+ engine?: {
845
+ objectstack: string;
846
+ } | undefined;
843
847
  };
844
848
  status: "error" | "disabled" | "installed" | "installing" | "upgrading" | "uninstalling";
845
849
  enabled: boolean;
@@ -850,6 +854,14 @@ declare class SchemaRegistry {
850
854
  statusChangedAt?: string | undefined;
851
855
  errorMessage?: string | undefined;
852
856
  settings?: Record<string, unknown> | undefined;
857
+ upgradeHistory?: {
858
+ fromVersion: string;
859
+ toVersion: string;
860
+ upgradedAt: string;
861
+ status: "success" | "failed" | "rolled_back";
862
+ migrationLog?: string[] | undefined;
863
+ }[] | undefined;
864
+ registeredNamespaces?: string[] | undefined;
853
865
  } | {
854
866
  id: string;
855
867
  version: string;
@@ -1154,6 +1166,9 @@ declare class SchemaRegistry {
1154
1166
  } | undefined;
1155
1167
  } | undefined;
1156
1168
  } | undefined;
1169
+ engine?: {
1170
+ objectstack: string;
1171
+ } | undefined;
1157
1172
  };
1158
1173
  /**
1159
1174
  * Universal Unregister Method
@@ -1199,7 +1214,9 @@ declare class SchemaRegistry {
1199
1214
  declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1200
1215
  private engine;
1201
1216
  private getServicesRegistry?;
1202
- constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>);
1217
+ private getFeedService?;
1218
+ constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>, getFeedService?: () => IFeedService | undefined);
1219
+ private requireFeedService;
1203
1220
  getDiscovery(): Promise<{
1204
1221
  version: string;
1205
1222
  apiName: string;
@@ -1224,8 +1241,24 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1224
1241
  status: "degraded" | "stub" | "available" | "unavailable";
1225
1242
  route?: string | undefined;
1226
1243
  provider?: string | undefined;
1244
+ version?: string | undefined;
1227
1245
  message?: string | undefined;
1246
+ rateLimit?: {
1247
+ requestsPerMinute?: number | undefined;
1248
+ requestsPerHour?: number | undefined;
1249
+ burstLimit?: number | undefined;
1250
+ retryAfterMs?: number | undefined;
1251
+ } | undefined;
1228
1252
  }>;
1253
+ capabilities: {
1254
+ feed: boolean;
1255
+ comments: boolean;
1256
+ automation: boolean;
1257
+ cron: boolean;
1258
+ search: boolean;
1259
+ export: boolean;
1260
+ chunkedUpload: boolean;
1261
+ };
1229
1262
  }>;
1230
1263
  getMetaTypes(): Promise<{
1231
1264
  types: string[];
@@ -1353,6 +1386,20 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1353
1386
  success: boolean;
1354
1387
  message: string;
1355
1388
  }>;
1389
+ listFeed(request: any): Promise<any>;
1390
+ createFeedItem(request: any): Promise<any>;
1391
+ updateFeedItem(request: any): Promise<any>;
1392
+ deleteFeedItem(request: any): Promise<any>;
1393
+ addReaction(request: any): Promise<any>;
1394
+ removeReaction(request: any): Promise<any>;
1395
+ pinFeedItem(request: any): Promise<any>;
1396
+ unpinFeedItem(request: any): Promise<any>;
1397
+ starFeedItem(request: any): Promise<any>;
1398
+ unstarFeedItem(request: any): Promise<any>;
1399
+ searchFeed(request: any): Promise<any>;
1400
+ getChangelog(request: any): Promise<any>;
1401
+ feedSubscribe(request: any): Promise<any>;
1402
+ feedUnsubscribe(request: any): Promise<any>;
1356
1403
  }
1357
1404
 
1358
1405
  type HookHandler = (context: HookContext) => Promise<void> | void;
package/dist/index.d.ts CHANGED
@@ -4,6 +4,7 @@ import { ServiceObject, ObjectOwnership, HookContext, QueryAST, DataEngineQueryO
4
4
  import { ObjectStackManifest, InstalledPackage, ExecutionContext } from '@objectstack/spec/kernel';
5
5
  import { ObjectStackProtocol, MetadataCacheRequest, MetadataCacheResponse, BatchUpdateRequest, BatchUpdateResponse, UpdateManyDataRequest, DeleteManyDataRequest } from '@objectstack/spec/api';
6
6
  import { IDataEngine, DriverInterface, Logger, Plugin, PluginContext, ObjectKernel } from '@objectstack/core';
7
+ import { IFeedService } from '@objectstack/spec/contracts';
7
8
 
8
9
  /**
9
10
  * XState-inspired State Machine Protocol
@@ -840,6 +841,9 @@ declare class SchemaRegistry {
840
841
  } | undefined;
841
842
  } | undefined;
842
843
  } | undefined;
844
+ engine?: {
845
+ objectstack: string;
846
+ } | undefined;
843
847
  };
844
848
  status: "error" | "disabled" | "installed" | "installing" | "upgrading" | "uninstalling";
845
849
  enabled: boolean;
@@ -850,6 +854,14 @@ declare class SchemaRegistry {
850
854
  statusChangedAt?: string | undefined;
851
855
  errorMessage?: string | undefined;
852
856
  settings?: Record<string, unknown> | undefined;
857
+ upgradeHistory?: {
858
+ fromVersion: string;
859
+ toVersion: string;
860
+ upgradedAt: string;
861
+ status: "success" | "failed" | "rolled_back";
862
+ migrationLog?: string[] | undefined;
863
+ }[] | undefined;
864
+ registeredNamespaces?: string[] | undefined;
853
865
  } | {
854
866
  id: string;
855
867
  version: string;
@@ -1154,6 +1166,9 @@ declare class SchemaRegistry {
1154
1166
  } | undefined;
1155
1167
  } | undefined;
1156
1168
  } | undefined;
1169
+ engine?: {
1170
+ objectstack: string;
1171
+ } | undefined;
1157
1172
  };
1158
1173
  /**
1159
1174
  * Universal Unregister Method
@@ -1199,7 +1214,9 @@ declare class SchemaRegistry {
1199
1214
  declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1200
1215
  private engine;
1201
1216
  private getServicesRegistry?;
1202
- constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>);
1217
+ private getFeedService?;
1218
+ constructor(engine: IDataEngine, getServicesRegistry?: () => Map<string, any>, getFeedService?: () => IFeedService | undefined);
1219
+ private requireFeedService;
1203
1220
  getDiscovery(): Promise<{
1204
1221
  version: string;
1205
1222
  apiName: string;
@@ -1224,8 +1241,24 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1224
1241
  status: "degraded" | "stub" | "available" | "unavailable";
1225
1242
  route?: string | undefined;
1226
1243
  provider?: string | undefined;
1244
+ version?: string | undefined;
1227
1245
  message?: string | undefined;
1246
+ rateLimit?: {
1247
+ requestsPerMinute?: number | undefined;
1248
+ requestsPerHour?: number | undefined;
1249
+ burstLimit?: number | undefined;
1250
+ retryAfterMs?: number | undefined;
1251
+ } | undefined;
1228
1252
  }>;
1253
+ capabilities: {
1254
+ feed: boolean;
1255
+ comments: boolean;
1256
+ automation: boolean;
1257
+ cron: boolean;
1258
+ search: boolean;
1259
+ export: boolean;
1260
+ chunkedUpload: boolean;
1261
+ };
1229
1262
  }>;
1230
1263
  getMetaTypes(): Promise<{
1231
1264
  types: string[];
@@ -1353,6 +1386,20 @@ declare class ObjectStackProtocolImplementation implements ObjectStackProtocol {
1353
1386
  success: boolean;
1354
1387
  message: string;
1355
1388
  }>;
1389
+ listFeed(request: any): Promise<any>;
1390
+ createFeedItem(request: any): Promise<any>;
1391
+ updateFeedItem(request: any): Promise<any>;
1392
+ deleteFeedItem(request: any): Promise<any>;
1393
+ addReaction(request: any): Promise<any>;
1394
+ removeReaction(request: any): Promise<any>;
1395
+ pinFeedItem(request: any): Promise<any>;
1396
+ unpinFeedItem(request: any): Promise<any>;
1397
+ starFeedItem(request: any): Promise<any>;
1398
+ unstarFeedItem(request: any): Promise<any>;
1399
+ searchFeed(request: any): Promise<any>;
1400
+ getChangelog(request: any): Promise<any>;
1401
+ feedSubscribe(request: any): Promise<any>;
1402
+ feedUnsubscribe(request: any): Promise<any>;
1356
1403
  }
1357
1404
 
1358
1405
  type HookHandler = (context: HookContext) => Promise<void> | void;
package/dist/index.js CHANGED
@@ -558,9 +558,17 @@ var SERVICE_CONFIG = {
558
558
  search: { route: "/api/v1/search", plugin: "plugin-search" }
559
559
  };
560
560
  var ObjectStackProtocolImplementation = class {
561
- constructor(engine, getServicesRegistry) {
561
+ constructor(engine, getServicesRegistry, getFeedService) {
562
562
  this.engine = engine;
563
563
  this.getServicesRegistry = getServicesRegistry;
564
+ this.getFeedService = getFeedService;
565
+ }
566
+ requireFeedService() {
567
+ const svc = this.getFeedService?.();
568
+ if (!svc) {
569
+ throw new Error("Feed service not available. Install and register service-feed to enable feed operations.");
570
+ }
571
+ return svc;
564
572
  }
565
573
  async getDiscovery() {
566
574
  const registeredServices = this.getServicesRegistry ? this.getServicesRegistry() : /* @__PURE__ */ new Map();
@@ -609,16 +617,40 @@ var ObjectStackProtocolImplementation = class {
609
617
  }
610
618
  }
611
619
  }
620
+ if (registeredServices.has("feed")) {
621
+ services["feed"] = {
622
+ enabled: true,
623
+ status: "available",
624
+ route: "/api/v1/data",
625
+ provider: "service-feed"
626
+ };
627
+ } else {
628
+ services["feed"] = {
629
+ enabled: false,
630
+ status: "unavailable",
631
+ message: "Install service-feed to enable"
632
+ };
633
+ }
612
634
  const routes = {
613
635
  data: "/api/v1/data",
614
636
  metadata: "/api/v1/meta",
615
637
  ...optionalRoutes
616
638
  };
639
+ const capabilities = {
640
+ feed: registeredServices.has("feed"),
641
+ comments: registeredServices.has("feed"),
642
+ automation: registeredServices.has("automation"),
643
+ cron: registeredServices.has("job"),
644
+ search: registeredServices.has("search"),
645
+ export: registeredServices.has("automation") || registeredServices.has("queue"),
646
+ chunkedUpload: registeredServices.has("file-storage")
647
+ };
617
648
  return {
618
649
  version: "1.0",
619
650
  apiName: "ObjectStack API",
620
651
  routes,
621
- services
652
+ services,
653
+ capabilities
622
654
  };
623
655
  }
624
656
  async getMetaTypes() {
@@ -1100,6 +1132,137 @@ var ObjectStackProtocolImplementation = class {
1100
1132
  message: "Saved to memory registry"
1101
1133
  };
1102
1134
  }
1135
+ // ==========================================
1136
+ // Feed Operations
1137
+ // ==========================================
1138
+ async listFeed(request) {
1139
+ const svc = this.requireFeedService();
1140
+ const result = await svc.listFeed({
1141
+ object: request.object,
1142
+ recordId: request.recordId,
1143
+ filter: request.type,
1144
+ limit: request.limit,
1145
+ cursor: request.cursor
1146
+ });
1147
+ return { success: true, data: result };
1148
+ }
1149
+ async createFeedItem(request) {
1150
+ const svc = this.requireFeedService();
1151
+ const item = await svc.createFeedItem({
1152
+ object: request.object,
1153
+ recordId: request.recordId,
1154
+ type: request.type,
1155
+ actor: { type: "user", id: "current_user" },
1156
+ body: request.body,
1157
+ mentions: request.mentions,
1158
+ parentId: request.parentId,
1159
+ visibility: request.visibility
1160
+ });
1161
+ return { success: true, data: item };
1162
+ }
1163
+ async updateFeedItem(request) {
1164
+ const svc = this.requireFeedService();
1165
+ const item = await svc.updateFeedItem(request.feedId, {
1166
+ body: request.body,
1167
+ mentions: request.mentions,
1168
+ visibility: request.visibility
1169
+ });
1170
+ return { success: true, data: item };
1171
+ }
1172
+ async deleteFeedItem(request) {
1173
+ const svc = this.requireFeedService();
1174
+ await svc.deleteFeedItem(request.feedId);
1175
+ return { success: true, data: { feedId: request.feedId } };
1176
+ }
1177
+ async addReaction(request) {
1178
+ const svc = this.requireFeedService();
1179
+ const reactions = await svc.addReaction(request.feedId, request.emoji, "current_user");
1180
+ return { success: true, data: { reactions } };
1181
+ }
1182
+ async removeReaction(request) {
1183
+ const svc = this.requireFeedService();
1184
+ const reactions = await svc.removeReaction(request.feedId, request.emoji, "current_user");
1185
+ return { success: true, data: { reactions } };
1186
+ }
1187
+ async pinFeedItem(request) {
1188
+ const svc = this.requireFeedService();
1189
+ const item = await svc.getFeedItem(request.feedId);
1190
+ if (!item) throw new Error(`Feed item ${request.feedId} not found`);
1191
+ await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
1192
+ return { success: true, data: { feedId: request.feedId, pinned: true, pinnedAt: (/* @__PURE__ */ new Date()).toISOString() } };
1193
+ }
1194
+ async unpinFeedItem(request) {
1195
+ const svc = this.requireFeedService();
1196
+ const item = await svc.getFeedItem(request.feedId);
1197
+ if (!item) throw new Error(`Feed item ${request.feedId} not found`);
1198
+ await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
1199
+ return { success: true, data: { feedId: request.feedId, pinned: false } };
1200
+ }
1201
+ async starFeedItem(request) {
1202
+ const svc = this.requireFeedService();
1203
+ const item = await svc.getFeedItem(request.feedId);
1204
+ if (!item) throw new Error(`Feed item ${request.feedId} not found`);
1205
+ await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
1206
+ return { success: true, data: { feedId: request.feedId, starred: true, starredAt: (/* @__PURE__ */ new Date()).toISOString() } };
1207
+ }
1208
+ async unstarFeedItem(request) {
1209
+ const svc = this.requireFeedService();
1210
+ const item = await svc.getFeedItem(request.feedId);
1211
+ if (!item) throw new Error(`Feed item ${request.feedId} not found`);
1212
+ await svc.updateFeedItem(request.feedId, { visibility: item.visibility });
1213
+ return { success: true, data: { feedId: request.feedId, starred: false } };
1214
+ }
1215
+ async searchFeed(request) {
1216
+ const svc = this.requireFeedService();
1217
+ const result = await svc.listFeed({
1218
+ object: request.object,
1219
+ recordId: request.recordId,
1220
+ filter: request.type,
1221
+ limit: request.limit,
1222
+ cursor: request.cursor
1223
+ });
1224
+ const queryLower = (request.query || "").toLowerCase();
1225
+ const filtered = result.items.filter(
1226
+ (item) => item.body?.toLowerCase().includes(queryLower)
1227
+ );
1228
+ return { success: true, data: { items: filtered, total: filtered.length, hasMore: false } };
1229
+ }
1230
+ async getChangelog(request) {
1231
+ const svc = this.requireFeedService();
1232
+ const result = await svc.listFeed({
1233
+ object: request.object,
1234
+ recordId: request.recordId,
1235
+ filter: "changes_only",
1236
+ limit: request.limit,
1237
+ cursor: request.cursor
1238
+ });
1239
+ const entries = result.items.map((item) => ({
1240
+ id: item.id,
1241
+ object: item.object,
1242
+ recordId: item.recordId,
1243
+ actor: item.actor,
1244
+ changes: item.changes || [],
1245
+ timestamp: item.createdAt,
1246
+ source: item.source
1247
+ }));
1248
+ return { success: true, data: { entries, total: result.total, nextCursor: result.nextCursor, hasMore: result.hasMore } };
1249
+ }
1250
+ async feedSubscribe(request) {
1251
+ const svc = this.requireFeedService();
1252
+ const subscription = await svc.subscribe({
1253
+ object: request.object,
1254
+ recordId: request.recordId,
1255
+ userId: "current_user",
1256
+ events: request.events,
1257
+ channels: request.channels
1258
+ });
1259
+ return { success: true, data: subscription };
1260
+ }
1261
+ async feedUnsubscribe(request) {
1262
+ const svc = this.requireFeedService();
1263
+ const unsubscribed = await svc.unsubscribe(request.object, request.recordId, "current_user");
1264
+ return { success: true, data: { object: request.object, recordId: request.recordId, unsubscribed } };
1265
+ }
1103
1266
  };
1104
1267
 
1105
1268
  // src/engine.ts