syncorejs 0.2.3 → 0.2.4
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.
- package/dist/_vendor/core/cli.d.mts.map +1 -1
- package/dist/_vendor/core/cli.mjs +272 -7
- package/dist/_vendor/core/cli.mjs.map +1 -1
- package/dist/_vendor/core/index.d.mts +3 -3
- package/dist/_vendor/core/runtime/devtools.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/devtools.mjs +131 -0
- package/dist/_vendor/core/runtime/devtools.mjs.map +1 -1
- package/dist/_vendor/core/runtime/functions.d.mts +3 -3
- package/dist/_vendor/core/runtime/functions.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs +1 -1
- package/dist/_vendor/core/runtime/internal/engines/devtoolsEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs +1 -1
- package/dist/_vendor/core/runtime/internal/engines/reactivityEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs +5 -1
- package/dist/_vendor/core/runtime/internal/engines/shared.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs +99 -13
- package/dist/_vendor/core/runtime/internal/engines/storageEngine.mjs.map +1 -1
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs +38 -4
- package/dist/_vendor/core/runtime/internal/runtimeKernel.mjs.map +1 -1
- package/dist/_vendor/core/runtime/runtime.d.mts +65 -8
- package/dist/_vendor/core/runtime/runtime.d.mts.map +1 -1
- package/dist/_vendor/core/runtime/runtime.mjs.map +1 -1
- package/dist/_vendor/core/transport.d.mts.map +1 -1
- package/dist/_vendor/core/transport.mjs +30 -5
- package/dist/_vendor/core/transport.mjs.map +1 -1
- package/dist/_vendor/devtools-protocol/index.d.ts +75 -1
- package/dist/_vendor/devtools-protocol/index.d.ts.map +1 -1
- package/dist/_vendor/devtools-protocol/index.js.map +1 -1
- package/dist/_vendor/next/index.js +9 -1
- package/dist/_vendor/next/index.js.map +1 -1
- package/dist/_vendor/platform-expo/index.d.ts +1 -1
- package/dist/_vendor/platform-expo/index.d.ts.map +1 -1
- package/dist/_vendor/platform-expo/index.js +6 -1
- package/dist/_vendor/platform-expo/index.js.map +1 -1
- package/dist/_vendor/platform-node/index.d.mts +2 -1
- package/dist/_vendor/platform-node/index.d.mts.map +1 -1
- package/dist/_vendor/platform-node/index.mjs +27 -2
- package/dist/_vendor/platform-node/index.mjs.map +1 -1
- package/dist/_vendor/platform-node/ipc-react.mjs +4 -0
- package/dist/_vendor/platform-node/ipc-react.mjs.map +1 -1
- package/dist/_vendor/platform-web/external-change.d.ts +2 -2
- package/dist/_vendor/platform-web/external-change.js +2 -2
- package/dist/_vendor/platform-web/external-change.js.map +1 -1
- package/dist/_vendor/platform-web/index.d.ts +13 -10
- package/dist/_vendor/platform-web/index.d.ts.map +1 -1
- package/dist/_vendor/platform-web/index.js +66 -10
- package/dist/_vendor/platform-web/index.js.map +1 -1
- package/dist/_vendor/platform-web/indexeddb.d.ts +3 -3
- package/dist/_vendor/platform-web/indexeddb.js +3 -3
- package/dist/_vendor/platform-web/indexeddb.js.map +1 -1
- package/dist/_vendor/platform-web/opfs.d.ts +3 -1
- package/dist/_vendor/platform-web/opfs.d.ts.map +1 -1
- package/dist/_vendor/platform-web/opfs.js +29 -3
- package/dist/_vendor/platform-web/opfs.js.map +1 -1
- package/dist/_vendor/platform-web/persistence.d.ts +31 -1
- package/dist/_vendor/platform-web/persistence.d.ts.map +1 -1
- package/dist/_vendor/platform-web/persistence.js.map +1 -1
- package/dist/_vendor/platform-web/react.d.ts.map +1 -1
- package/dist/_vendor/platform-web/react.js +9 -1
- package/dist/_vendor/platform-web/react.js.map +1 -1
- package/dist/_vendor/react/index.d.ts +6 -5
- package/dist/_vendor/react/index.d.ts.map +1 -1
- package/dist/_vendor/react/index.js +6 -5
- package/dist/_vendor/react/index.js.map +1 -1
- package/dist/_vendor/svelte/index.d.ts +8 -6
- package/dist/_vendor/svelte/index.d.ts.map +1 -1
- package/dist/_vendor/svelte/index.js +7 -5
- package/dist/_vendor/svelte/index.js.map +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { CronJobs, EmptyArgs, FunctionArgs, FunctionArgsFromDefinition, FunctionConfig, FunctionKindFromDefinition, FunctionReference, FunctionReferenceFor, FunctionResult, FunctionResultFromDefinition, InferArgs, MisfirePolicy, RecurringDailySchedule, RecurringIntervalSchedule, RecurringJobDefinition, RecurringSchedule, RecurringWeeklySchedule, SyncoreFunctionDefinition, SyncoreFunctionKind, action, cronJobs, mutation, query } from "./runtime/functions.mjs";
|
|
2
|
-
import { ActionCtx, CapabilityDescriptor, ComparisonOperator, DevtoolsLiveQueryScope, DevtoolsLiveQuerySnapshot, DevtoolsSink, DocumentForTable, ExecutionResult, FilterBuilder, ImpactScope, ImpactSet, IndexRangeBuilder, InsertValueForTable, JsonObject, MutationCtx, PaginationOptions, PaginationResult, PatchValueForTable, QueryBuilder, QueryCondition, QueryCtx, QueryExpression, RegisteredSyncoreFunction, RegisteredSyncoreHandler, RunResult, SchedulerApi, SchedulerOptions, SearchIndexBuilder, SearchQuery, StorageObject, StorageWriteInput, SyncoreCapabilities, SyncoreClient, SyncoreDataModel, SyncoreDatabaseReader, SyncoreDatabaseWriter, SyncoreExternalChangeApplier, SyncoreExternalChangeEvent, SyncoreExternalChangeReason, SyncoreExternalChangeScope, SyncoreExternalChangeSignal, SyncoreFunctionRegistry, SyncorePaginatedQueryStatus, SyncoreQueriesRequest, SyncoreQueryRequest, SyncoreQueryState, SyncoreQueryStatus, SyncoreResolvedComponents, SyncoreRuntime, SyncoreRuntimeAdmin, SyncoreRuntimeOptions, SyncoreRuntimeStatus, SyncoreRuntimeStatusKind, SyncoreRuntimeStatusReason, SyncoreSqlDriver, SyncoreStorageAdapter, SyncoreStorageApi, SyncoreWatch, TableNames, UpdateScheduledJobOptions, UsePaginatedQueryResult, createFunctionReference, createFunctionReferenceFor } from "./runtime/runtime.mjs";
|
|
2
|
+
import { ActionCtx, CapabilityDescriptor, ComparisonOperator, DevtoolsLiveQueryScope, DevtoolsLiveQuerySnapshot, DevtoolsSink, DocumentForTable, ExecutionResult, FilterBuilder, ImpactScope, ImpactSet, IndexRangeBuilder, InsertValueForTable, JsonObject, MutationCtx, PaginationOptions, PaginationResult, PatchValueForTable, QueryBuilder, QueryCondition, QueryCtx, QueryExpression, RegisteredSyncoreFunction, RegisteredSyncoreHandler, RunResult, SchedulerApi, SchedulerOptions, SearchIndexBuilder, SearchQuery, StorageObject, StorageWriteInput, SyncoreCapabilities, SyncoreClient, SyncoreDataModel, SyncoreDatabaseReader, SyncoreDatabaseWriter, SyncoreExternalChangeApplier, SyncoreExternalChangeEvent, SyncoreExternalChangeReason, SyncoreExternalChangeScope, SyncoreExternalChangeSignal, SyncoreFunctionRegistry, SyncorePaginatedQueryStatus, SyncoreQueriesRequest, SyncoreQueryRequest, SyncoreQueryState, SyncoreQueryStatus, SyncoreResolvedComponents, SyncoreRuntime, SyncoreRuntimeAdmin, SyncoreRuntimeCapabilities, SyncoreRuntimeOptions, SyncoreRuntimeStatus, SyncoreRuntimeStatusKind, SyncoreRuntimeStatusReason, SyncoreRuntimeStorageCapability, SyncoreSqlDriver, SyncoreStorageAdapter, SyncoreStorageApi, SyncoreWatch, TableNames, UpdateScheduledJobOptions, UsePaginatedQueryResult, createFunctionReference, createFunctionReferenceFor } from "./runtime/runtime.mjs";
|
|
3
3
|
import { AnySyncoreFunctionDefinition, ComponentPath, FunctionReferencesForTree, InstalledComponentApi, InstalledComponentsApi, ResolvedSyncoreComponent, SyncoreComponent, SyncoreComponentFunctionMetadata, SyncoreComponentHookContext, SyncoreComponentInstall, SyncoreComponentsManifest, SyncoreCoreCapability, SyncoreFunctionTree, SyncoreHostServiceName, SyncoreRequestedCapability, composeProjectFunctionRegistry, composeProjectSchema, createBindingFunctionReference, createComponentPhysicalTableName, createInstalledComponentsApi, defineComponent, defineComponents, installComponent, resolveComponentsManifest, toCanonicalComponentFunctionName } from "./runtime/components.mjs";
|
|
4
4
|
import { DevtoolsCommandHandler, DevtoolsCommandHandlerDeps, DevtoolsSqlAnalysis, DevtoolsSqlMode, DevtoolsSqlReadResult, DevtoolsSqlSupport, DevtoolsSubscriptionHost, DevtoolsSubscriptionListener, createDevtoolsCommandHandler, createDevtoolsSubscriptionHost } from "./runtime/devtools.mjs";
|
|
5
5
|
import { generateId } from "./runtime/id.mjs";
|
|
@@ -9,9 +9,9 @@ export * from "../schema/index.d.ts";
|
|
|
9
9
|
|
|
10
10
|
//#region src/index.d.ts
|
|
11
11
|
declare namespace index_d_exports {
|
|
12
|
-
export { ActionCtx, AnySyncoreFunctionDefinition, AttachRuntimeBridgeOptions, AttachedRuntimeBridge, BridgeQueryWatch, CapabilityDescriptor, ComparisonOperator, ComponentPath, CronJobs, DevtoolsCommandHandler, DevtoolsCommandHandlerDeps, DevtoolsLiveQueryScope, DevtoolsLiveQuerySnapshot, DevtoolsSink, DevtoolsSqlAnalysis, DevtoolsSqlMode, DevtoolsSqlReadResult, DevtoolsSqlSupport, DevtoolsSubscriptionHost, DevtoolsSubscriptionListener, DocumentForTable, EmptyArgs, ExecutionResult, FilterBuilder, FunctionArgs, FunctionArgsFromDefinition, FunctionConfig, FunctionKindFromDefinition, FunctionReference, FunctionReferenceFor, FunctionReferencesForTree, FunctionResult, FunctionResultFromDefinition, ImpactScope, ImpactSet, IndexRangeBuilder, InferArgs, InsertValueForTable, InstalledComponentApi, InstalledComponentsApi, JsonObject, MisfirePolicy, MutationCtx, PaginationOptions, PaginationResult, PatchValueForTable, QueryBuilder, QueryCondition, QueryCtx, QueryExpression, RecurringDailySchedule, RecurringIntervalSchedule, RecurringJobDefinition, RecurringSchedule, RecurringWeeklySchedule, RegisteredSyncoreFunction, RegisteredSyncoreHandler, ResolvedSyncoreComponent, RunResult, SchedulerApi, SchedulerOptions, SearchIndexBuilder, SearchQuery, StorageObject, StorageWriteInput, SyncoreActiveQueryInfo, SyncoreBridgeClient, SyncoreBridgeMessageEndpoint, SyncoreBridgeRequest, SyncoreBridgeResponse, SyncoreCapabilities, SyncoreClient, SyncoreComponent, SyncoreComponentFunctionMetadata, SyncoreComponentHookContext, SyncoreComponentInstall, SyncoreComponentsManifest, SyncoreCoreCapability, SyncoreDataModel, SyncoreDatabaseReader, SyncoreDatabaseWriter, SyncoreDevtoolsEvent, SyncoreExternalChangeApplier, SyncoreExternalChangeEvent, SyncoreExternalChangeReason, SyncoreExternalChangeScope, SyncoreExternalChangeSignal, SyncoreFunctionDefinition, SyncoreFunctionKind, SyncoreFunctionRegistry, SyncoreFunctionTree, SyncoreHostServiceName, SyncorePaginatedQueryStatus, SyncoreQueriesRequest, SyncoreQueryRequest, SyncoreQueryState, SyncoreQueryStatus, SyncoreRequestedCapability, SyncoreResolvedComponents, SyncoreRuntime, SyncoreRuntimeAdmin, SyncoreRuntimeOptions, SyncoreRuntimeStatus, SyncoreRuntimeStatusKind, SyncoreRuntimeStatusReason, SyncoreRuntimeSummary, SyncoreSqlDriver, SyncoreStorageAdapter, SyncoreStorageApi, SyncoreWatch, TableNames, UpdateScheduledJobOptions, UsePaginatedQueryResult, action, attachRuntimeBridge, composeProjectFunctionRegistry, composeProjectSchema, createBindingFunctionReference, createComponentPhysicalTableName, createDeferredSyncoreClient, createDevtoolsCommandHandler, createDevtoolsSubscriptionHost, createFunctionReference, createFunctionReferenceFor, createInstalledComponentsApi, createInvokeRequest, createUnavailableSyncoreClient, createWatchKey, cronJobs, defineComponent, defineComponents, generateId, installComponent, mutation, normalizeOptionalArgs, query, resolveComponentsManifest, stableStringify, toCanonicalComponentFunctionName };
|
|
12
|
+
export { ActionCtx, AnySyncoreFunctionDefinition, AttachRuntimeBridgeOptions, AttachedRuntimeBridge, BridgeQueryWatch, CapabilityDescriptor, ComparisonOperator, ComponentPath, CronJobs, DevtoolsCommandHandler, DevtoolsCommandHandlerDeps, DevtoolsLiveQueryScope, DevtoolsLiveQuerySnapshot, DevtoolsSink, DevtoolsSqlAnalysis, DevtoolsSqlMode, DevtoolsSqlReadResult, DevtoolsSqlSupport, DevtoolsSubscriptionHost, DevtoolsSubscriptionListener, DocumentForTable, EmptyArgs, ExecutionResult, FilterBuilder, FunctionArgs, FunctionArgsFromDefinition, FunctionConfig, FunctionKindFromDefinition, FunctionReference, FunctionReferenceFor, FunctionReferencesForTree, FunctionResult, FunctionResultFromDefinition, ImpactScope, ImpactSet, IndexRangeBuilder, InferArgs, InsertValueForTable, InstalledComponentApi, InstalledComponentsApi, JsonObject, MisfirePolicy, MutationCtx, PaginationOptions, PaginationResult, PatchValueForTable, QueryBuilder, QueryCondition, QueryCtx, QueryExpression, RecurringDailySchedule, RecurringIntervalSchedule, RecurringJobDefinition, RecurringSchedule, RecurringWeeklySchedule, RegisteredSyncoreFunction, RegisteredSyncoreHandler, ResolvedSyncoreComponent, RunResult, SchedulerApi, SchedulerOptions, SearchIndexBuilder, SearchQuery, StorageObject, StorageWriteInput, SyncoreActiveQueryInfo, SyncoreBridgeClient, SyncoreBridgeMessageEndpoint, SyncoreBridgeRequest, SyncoreBridgeResponse, SyncoreCapabilities, SyncoreClient, SyncoreComponent, SyncoreComponentFunctionMetadata, SyncoreComponentHookContext, SyncoreComponentInstall, SyncoreComponentsManifest, SyncoreCoreCapability, SyncoreDataModel, SyncoreDatabaseReader, SyncoreDatabaseWriter, SyncoreDevtoolsEvent, SyncoreExternalChangeApplier, SyncoreExternalChangeEvent, SyncoreExternalChangeReason, SyncoreExternalChangeScope, SyncoreExternalChangeSignal, SyncoreFunctionDefinition, SyncoreFunctionKind, SyncoreFunctionRegistry, SyncoreFunctionTree, SyncoreHostServiceName, SyncorePaginatedQueryStatus, SyncoreQueriesRequest, SyncoreQueryRequest, SyncoreQueryState, SyncoreQueryStatus, SyncoreRequestedCapability, SyncoreResolvedComponents, SyncoreRuntime, SyncoreRuntimeAdmin, SyncoreRuntimeCapabilities, SyncoreRuntimeOptions, SyncoreRuntimeStatus, SyncoreRuntimeStatusKind, SyncoreRuntimeStatusReason, SyncoreRuntimeStorageCapability, SyncoreRuntimeSummary, SyncoreSqlDriver, SyncoreStorageAdapter, SyncoreStorageApi, SyncoreWatch, TableNames, UpdateScheduledJobOptions, UsePaginatedQueryResult, action, attachRuntimeBridge, composeProjectFunctionRegistry, composeProjectSchema, createBindingFunctionReference, createComponentPhysicalTableName, createDeferredSyncoreClient, createDevtoolsCommandHandler, createDevtoolsSubscriptionHost, createFunctionReference, createFunctionReferenceFor, createInstalledComponentsApi, createInvokeRequest, createUnavailableSyncoreClient, createWatchKey, cronJobs, defineComponent, defineComponents, generateId, installComponent, mutation, normalizeOptionalArgs, query, resolveComponentsManifest, stableStringify, toCanonicalComponentFunctionName };
|
|
13
13
|
}
|
|
14
14
|
import * as import__syncore_schema from "../schema/index.d.ts";
|
|
15
15
|
//#endregion
|
|
16
|
-
export { ActionCtx, AnySyncoreFunctionDefinition, AttachRuntimeBridgeOptions, AttachedRuntimeBridge, BridgeQueryWatch, CapabilityDescriptor, ComparisonOperator, ComponentPath, CronJobs, DevtoolsCommandHandler, DevtoolsCommandHandlerDeps, DevtoolsLiveQueryScope, DevtoolsLiveQuerySnapshot, DevtoolsSink, DevtoolsSqlAnalysis, DevtoolsSqlMode, DevtoolsSqlReadResult, DevtoolsSqlSupport, DevtoolsSubscriptionHost, DevtoolsSubscriptionListener, DocumentForTable, EmptyArgs, ExecutionResult, FilterBuilder, FunctionArgs, FunctionArgsFromDefinition, FunctionConfig, FunctionKindFromDefinition, FunctionReference, FunctionReferenceFor, FunctionReferencesForTree, FunctionResult, FunctionResultFromDefinition, ImpactScope, ImpactSet, IndexRangeBuilder, InferArgs, InsertValueForTable, InstalledComponentApi, InstalledComponentsApi, JsonObject, MisfirePolicy, MutationCtx, PaginationOptions, PaginationResult, PatchValueForTable, QueryBuilder, QueryCondition, QueryCtx, QueryExpression, RecurringDailySchedule, RecurringIntervalSchedule, RecurringJobDefinition, RecurringSchedule, RecurringWeeklySchedule, RegisteredSyncoreFunction, RegisteredSyncoreHandler, ResolvedSyncoreComponent, RunResult, SchedulerApi, SchedulerOptions, SearchIndexBuilder, SearchQuery, StorageObject, StorageWriteInput, type SyncoreActiveQueryInfo, SyncoreBridgeClient, SyncoreBridgeMessageEndpoint, SyncoreBridgeRequest, SyncoreBridgeResponse, SyncoreCapabilities, SyncoreClient, SyncoreComponent, SyncoreComponentFunctionMetadata, SyncoreComponentHookContext, SyncoreComponentInstall, SyncoreComponentsManifest, SyncoreCoreCapability, SyncoreDataModel, SyncoreDatabaseReader, SyncoreDatabaseWriter, type SyncoreDevtoolsEvent, SyncoreExternalChangeApplier, SyncoreExternalChangeEvent, SyncoreExternalChangeReason, SyncoreExternalChangeScope, SyncoreExternalChangeSignal, SyncoreFunctionDefinition, SyncoreFunctionKind, SyncoreFunctionRegistry, SyncoreFunctionTree, SyncoreHostServiceName, SyncorePaginatedQueryStatus, SyncoreQueriesRequest, SyncoreQueryRequest, SyncoreQueryState, SyncoreQueryStatus, SyncoreRequestedCapability, SyncoreResolvedComponents, SyncoreRuntime, SyncoreRuntimeAdmin, SyncoreRuntimeOptions, SyncoreRuntimeStatus, SyncoreRuntimeStatusKind, SyncoreRuntimeStatusReason, type SyncoreRuntimeSummary, SyncoreSqlDriver, SyncoreStorageAdapter, SyncoreStorageApi, SyncoreWatch, TableNames, UpdateScheduledJobOptions, UsePaginatedQueryResult, action, attachRuntimeBridge, composeProjectFunctionRegistry, composeProjectSchema, createBindingFunctionReference, createComponentPhysicalTableName, createDeferredSyncoreClient, createDevtoolsCommandHandler, createDevtoolsSubscriptionHost, createFunctionReference, createFunctionReferenceFor, createInstalledComponentsApi, createInvokeRequest, createUnavailableSyncoreClient, createWatchKey, cronJobs, defineComponent, defineComponents, generateId, index_d_exports, installComponent, mutation, normalizeOptionalArgs, query, resolveComponentsManifest, stableStringify, toCanonicalComponentFunctionName };
|
|
16
|
+
export { ActionCtx, AnySyncoreFunctionDefinition, AttachRuntimeBridgeOptions, AttachedRuntimeBridge, BridgeQueryWatch, CapabilityDescriptor, ComparisonOperator, ComponentPath, CronJobs, DevtoolsCommandHandler, DevtoolsCommandHandlerDeps, DevtoolsLiveQueryScope, DevtoolsLiveQuerySnapshot, DevtoolsSink, DevtoolsSqlAnalysis, DevtoolsSqlMode, DevtoolsSqlReadResult, DevtoolsSqlSupport, DevtoolsSubscriptionHost, DevtoolsSubscriptionListener, DocumentForTable, EmptyArgs, ExecutionResult, FilterBuilder, FunctionArgs, FunctionArgsFromDefinition, FunctionConfig, FunctionKindFromDefinition, FunctionReference, FunctionReferenceFor, FunctionReferencesForTree, FunctionResult, FunctionResultFromDefinition, ImpactScope, ImpactSet, IndexRangeBuilder, InferArgs, InsertValueForTable, InstalledComponentApi, InstalledComponentsApi, JsonObject, MisfirePolicy, MutationCtx, PaginationOptions, PaginationResult, PatchValueForTable, QueryBuilder, QueryCondition, QueryCtx, QueryExpression, RecurringDailySchedule, RecurringIntervalSchedule, RecurringJobDefinition, RecurringSchedule, RecurringWeeklySchedule, RegisteredSyncoreFunction, RegisteredSyncoreHandler, ResolvedSyncoreComponent, RunResult, SchedulerApi, SchedulerOptions, SearchIndexBuilder, SearchQuery, StorageObject, StorageWriteInput, type SyncoreActiveQueryInfo, SyncoreBridgeClient, SyncoreBridgeMessageEndpoint, SyncoreBridgeRequest, SyncoreBridgeResponse, SyncoreCapabilities, SyncoreClient, SyncoreComponent, SyncoreComponentFunctionMetadata, SyncoreComponentHookContext, SyncoreComponentInstall, SyncoreComponentsManifest, SyncoreCoreCapability, SyncoreDataModel, SyncoreDatabaseReader, SyncoreDatabaseWriter, type SyncoreDevtoolsEvent, SyncoreExternalChangeApplier, SyncoreExternalChangeEvent, SyncoreExternalChangeReason, SyncoreExternalChangeScope, SyncoreExternalChangeSignal, SyncoreFunctionDefinition, SyncoreFunctionKind, SyncoreFunctionRegistry, SyncoreFunctionTree, SyncoreHostServiceName, SyncorePaginatedQueryStatus, SyncoreQueriesRequest, SyncoreQueryRequest, SyncoreQueryState, SyncoreQueryStatus, SyncoreRequestedCapability, SyncoreResolvedComponents, SyncoreRuntime, SyncoreRuntimeAdmin, SyncoreRuntimeCapabilities, SyncoreRuntimeOptions, SyncoreRuntimeStatus, SyncoreRuntimeStatusKind, SyncoreRuntimeStatusReason, SyncoreRuntimeStorageCapability, type SyncoreRuntimeSummary, SyncoreSqlDriver, SyncoreStorageAdapter, SyncoreStorageApi, SyncoreWatch, TableNames, UpdateScheduledJobOptions, UsePaginatedQueryResult, action, attachRuntimeBridge, composeProjectFunctionRegistry, composeProjectSchema, createBindingFunctionReference, createComponentPhysicalTableName, createDeferredSyncoreClient, createDevtoolsCommandHandler, createDevtoolsSubscriptionHost, createFunctionReference, createFunctionReferenceFor, createInstalledComponentsApi, createInvokeRequest, createUnavailableSyncoreClient, createWatchKey, cronJobs, defineComponent, defineComponents, generateId, index_d_exports, installComponent, mutation, normalizeOptionalArgs, query, resolveComponentsManifest, stableStringify, toCanonicalComponentFunctionName };
|
|
17
17
|
//# sourceMappingURL=index.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.d.mts","names":[],"sources":["../../src/runtime/devtools.ts"],"mappings":";;;;
|
|
1
|
+
{"version":3,"file":"devtools.d.mts","names":[],"sources":["../../src/runtime/devtools.ts"],"mappings":";;;;UA4BiB,0BAAA;EACf,MAAA,EAAQ,gBAAA;EACR,MAAA,EAAQ,gBAAA;EACR,SAAA,EAAW,qBAAA,CAAsB,gBAAA;EACjC,KAAA,EAAO,mBAAA,CAAoB,gBAAA;EAC3B,GAAA,GAAM,kBAAA;AAAA;AAAA,KAGI,eAAA;AAAA,UAEK,mBAAA;EACf,IAAA,EAAM,eAAA;EACN,UAAA;EACA,WAAA;EACA,aAAA;EACA,cAAA,EAAgB,sBAAsB;AAAA;AAAA,UAGvB,qBAAA;EACf,OAAA;EACA,IAAA;EACA,cAAA;AAAA;AAAA,UAGe,kBAAA;EACf,mBAAA,CAAoB,KAAA,WAAgB,mBAAA;EACpC,aAAA,CACE,QAAA,EAAU,mBAAA,EACV,QAAA,EAAU,eAAA;EAEZ,gBAAA,CAAiB,YAAA,UAAsB,KAAA,WAAgB,qBAAA;AAAA;AAAA,KAG7C,sBAAA,IACV,OAAA,EAAS,6BAAA,KACN,OAAA,CAAQ,mCAAA;AAAA,KAED,4BAAA,IACV,OAAiD,EAAxC,wCAAwC;AAAA,UAGlC,wBAAA;EACf,SAAA,CACE,cAAA,UACA,OAAA,EAAS,kCAAA,EACT,QAAA,EAAU,4BAAA,GACT,OAAA;EACH,WAAA,CAAY,cAAA;EACZ,OAAA;AAAA;AAAA,iBAYc,4BAAA,CACd,IAAA,EAAM,0BAAA,GACL,sBAAsB;AAAA,iBAkZT,8BAAA,CACd,IAAA,EAAM,0BAAA,GACL,wBAAwB"}
|
|
@@ -167,6 +167,94 @@ function createDevtoolsCommandHandler(deps) {
|
|
|
167
167
|
error: error instanceof Error ? error.message : String(error)
|
|
168
168
|
};
|
|
169
169
|
}
|
|
170
|
+
case "storage.list": {
|
|
171
|
+
const limit = normalizeStorageLimit(payload.limit);
|
|
172
|
+
const offset = Math.max(payload.offset ?? 0, 0);
|
|
173
|
+
try {
|
|
174
|
+
const result = await admin.listStorageObjects({
|
|
175
|
+
limit,
|
|
176
|
+
offset,
|
|
177
|
+
...payload.search ? { search: payload.search } : {}
|
|
178
|
+
});
|
|
179
|
+
return {
|
|
180
|
+
kind: "storage.list.result",
|
|
181
|
+
entries: result.entries,
|
|
182
|
+
totalCount: result.totalCount,
|
|
183
|
+
offset,
|
|
184
|
+
hasMore: offset + result.entries.length < result.totalCount
|
|
185
|
+
};
|
|
186
|
+
} catch (error) {
|
|
187
|
+
return {
|
|
188
|
+
kind: "storage.list.result",
|
|
189
|
+
entries: [],
|
|
190
|
+
totalCount: 0,
|
|
191
|
+
offset,
|
|
192
|
+
hasMore: false,
|
|
193
|
+
error: error instanceof Error ? error.message : String(error)
|
|
194
|
+
};
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
case "storage.access.create": try {
|
|
198
|
+
const object = await admin.getStorageObjectAccessInfo(payload.id);
|
|
199
|
+
if (!object) return {
|
|
200
|
+
kind: "storage.access.create.result",
|
|
201
|
+
error: `Storage object ${JSON.stringify(payload.id)} was not found.`
|
|
202
|
+
};
|
|
203
|
+
return {
|
|
204
|
+
kind: "storage.access.create.result",
|
|
205
|
+
entry: object.entry,
|
|
206
|
+
supportsRange: object.supportsRange,
|
|
207
|
+
error: "Storage access URLs must be created by the Syncore devtools hub."
|
|
208
|
+
};
|
|
209
|
+
} catch (error) {
|
|
210
|
+
return {
|
|
211
|
+
kind: "storage.access.create.result",
|
|
212
|
+
error: error instanceof Error ? error.message : String(error)
|
|
213
|
+
};
|
|
214
|
+
}
|
|
215
|
+
case "storage.readRange": try {
|
|
216
|
+
const object = await admin.readStorageObjectRange(payload.id, payload.offset, payload.length);
|
|
217
|
+
if (!object) return {
|
|
218
|
+
kind: "storage.readRange.result",
|
|
219
|
+
offset: payload.offset,
|
|
220
|
+
bytesRead: 0,
|
|
221
|
+
done: true,
|
|
222
|
+
supportsRange: false,
|
|
223
|
+
error: `Storage object ${JSON.stringify(payload.id)} was not found.`
|
|
224
|
+
};
|
|
225
|
+
return {
|
|
226
|
+
kind: "storage.readRange.result",
|
|
227
|
+
entry: object.entry,
|
|
228
|
+
offset: object.offset,
|
|
229
|
+
bytesRead: object.bytesRead,
|
|
230
|
+
done: object.done,
|
|
231
|
+
supportsRange: object.supportsRange,
|
|
232
|
+
base64: bytesToBase64(object.bytes)
|
|
233
|
+
};
|
|
234
|
+
} catch (error) {
|
|
235
|
+
return {
|
|
236
|
+
kind: "storage.readRange.result",
|
|
237
|
+
offset: payload.offset,
|
|
238
|
+
bytesRead: 0,
|
|
239
|
+
done: true,
|
|
240
|
+
supportsRange: false,
|
|
241
|
+
error: error instanceof Error ? error.message : String(error)
|
|
242
|
+
};
|
|
243
|
+
}
|
|
244
|
+
case "storage.delete": try {
|
|
245
|
+
return {
|
|
246
|
+
kind: "storage.delete.result",
|
|
247
|
+
success: true,
|
|
248
|
+
deleted: await admin.deleteStorageObject(payload.id, { origin: "dashboard" })
|
|
249
|
+
};
|
|
250
|
+
} catch (error) {
|
|
251
|
+
return {
|
|
252
|
+
kind: "storage.delete.result",
|
|
253
|
+
success: false,
|
|
254
|
+
deleted: false,
|
|
255
|
+
error: error instanceof Error ? error.message : String(error)
|
|
256
|
+
};
|
|
257
|
+
}
|
|
170
258
|
case "scheduler.cancel": try {
|
|
171
259
|
return {
|
|
172
260
|
kind: "scheduler.cancel.result",
|
|
@@ -345,6 +433,33 @@ async function resolveSubscriptionPayload(payload, deps) {
|
|
|
345
433
|
kind: "functions.catalog.result",
|
|
346
434
|
functions: listFunctions(functions)
|
|
347
435
|
};
|
|
436
|
+
case "storage.list": {
|
|
437
|
+
const limit = normalizeStorageLimit(payload.limit);
|
|
438
|
+
const offset = Math.max(payload.offset ?? 0, 0);
|
|
439
|
+
try {
|
|
440
|
+
const result = await admin.listStorageObjects({
|
|
441
|
+
limit,
|
|
442
|
+
offset,
|
|
443
|
+
...payload.search ? { search: payload.search } : {}
|
|
444
|
+
});
|
|
445
|
+
return {
|
|
446
|
+
kind: "storage.list.result",
|
|
447
|
+
entries: result.entries,
|
|
448
|
+
totalCount: result.totalCount,
|
|
449
|
+
offset,
|
|
450
|
+
hasMore: offset + result.entries.length < result.totalCount
|
|
451
|
+
};
|
|
452
|
+
} catch (error) {
|
|
453
|
+
return {
|
|
454
|
+
kind: "storage.list.result",
|
|
455
|
+
entries: [],
|
|
456
|
+
totalCount: 0,
|
|
457
|
+
offset,
|
|
458
|
+
hasMore: false,
|
|
459
|
+
error: error instanceof Error ? error.message : String(error)
|
|
460
|
+
};
|
|
461
|
+
}
|
|
462
|
+
}
|
|
348
463
|
case "sql.watch": {
|
|
349
464
|
const sqlSupport = requireDevtoolsSqlSupport(deps.sql);
|
|
350
465
|
const databasePath = admin.getDriverDatabasePath();
|
|
@@ -598,6 +713,21 @@ async function runDevtoolsMutation(admin, callback, meta) {
|
|
|
598
713
|
function notifyDataMutationScopes(admin, tableName) {
|
|
599
714
|
admin.notifyDevtoolsScopes(["schema.tables", `table:${tableName}`]);
|
|
600
715
|
}
|
|
716
|
+
function normalizeStorageLimit(limit) {
|
|
717
|
+
return Math.min(Math.max(limit ?? 100, 1), 500);
|
|
718
|
+
}
|
|
719
|
+
function bytesToBase64(bytes) {
|
|
720
|
+
const binaryChunkSize = 32768;
|
|
721
|
+
let binary = "";
|
|
722
|
+
for (let offset = 0; offset < bytes.length; offset += binaryChunkSize) {
|
|
723
|
+
const chunk = bytes.slice(offset, offset + binaryChunkSize);
|
|
724
|
+
binary += String.fromCharCode(...chunk);
|
|
725
|
+
}
|
|
726
|
+
if (typeof btoa === "function") return btoa(binary);
|
|
727
|
+
const buffer = globalThis;
|
|
728
|
+
if (buffer.Buffer) return buffer.Buffer.from(bytes).toString("base64");
|
|
729
|
+
throw new Error("Base64 encoding is not available in this environment.");
|
|
730
|
+
}
|
|
601
731
|
function scopesForSubscription(payload, sql) {
|
|
602
732
|
switch (payload.kind) {
|
|
603
733
|
case "runtime.summary": return new Set(["runtime.summary"]);
|
|
@@ -607,6 +737,7 @@ function scopesForSubscription(payload, sql) {
|
|
|
607
737
|
case "data.table": return new Set([`table:${payload.table}`]);
|
|
608
738
|
case "scheduler.jobs": return new Set(["scheduler.jobs"]);
|
|
609
739
|
case "functions.catalog": return new Set(["all"]);
|
|
740
|
+
case "storage.list": return new Set(["storage.objects"]);
|
|
610
741
|
case "sql.watch": try {
|
|
611
742
|
const sqlSupport = requireDevtoolsSqlSupport(sql);
|
|
612
743
|
const analysis = sqlSupport.analyzeSqlStatement(payload.query);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"devtools.mjs","names":[],"sources":["../../src/runtime/devtools.ts"],"sourcesContent":["import type {\n SchedulerMisfirePolicy,\n SchedulerJob,\n SchedulerRecurringSchedule,\n SyncoreDevtoolsCommandPayload,\n SyncoreDevtoolsCommandResultPayload,\n SyncoreDevtoolsSubscriptionPayload,\n SyncoreDevtoolsSubscriptionResultPayload,\n TableSchema\n} from \"@syncore/devtools-protocol\";\nimport { describeValidator } from \"@syncore/schema\";\nimport type {\n TableDefinition,\n Validator\n} from \"@syncore/schema\";\nimport type {\n DevtoolsLiveQueryScope,\n ImpactScope,\n SyncoreDataModel,\n SyncoreRuntimeAdmin,\n SyncoreRuntimeOptions,\n SyncoreSqlDriver\n} from \"./runtime.js\";\nimport { createFunctionReference } from \"./runtime.js\";\nimport {\n parseCanonicalComponentFunctionName,\n parseComponentScopedIdentifier,\n quoteIdentifier,\n safeReadRecurringSchedule\n} from \"./internal/engines/shared.js\";\n\nexport interface DevtoolsCommandHandlerDeps {\n driver: SyncoreSqlDriver;\n schema: SyncoreDataModel;\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"];\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>;\n sql?: DevtoolsSqlSupport;\n}\n\nexport type DevtoolsSqlMode = \"read\" | \"write\" | \"ddl\";\n\nexport interface DevtoolsSqlAnalysis {\n mode: DevtoolsSqlMode;\n readTables: string[];\n writeTables: string[];\n schemaChanged: boolean;\n observedScopes: DevtoolsLiveQueryScope[];\n}\n\nexport interface DevtoolsSqlReadResult {\n columns: string[];\n rows: unknown[][];\n observedTables: string[];\n}\n\nexport interface DevtoolsSqlSupport {\n analyzeSqlStatement(query: string): DevtoolsSqlAnalysis;\n ensureSqlMode(\n analysis: DevtoolsSqlAnalysis,\n expected: DevtoolsSqlMode | \"watch\"\n ): void;\n runReadonlyQuery(databasePath: string, query: string): DevtoolsSqlReadResult;\n}\n\nexport type DevtoolsCommandHandler = (\n payload: SyncoreDevtoolsCommandPayload\n) => Promise<SyncoreDevtoolsCommandResultPayload>;\n\nexport type DevtoolsSubscriptionListener = (\n payload: SyncoreDevtoolsSubscriptionResultPayload\n) => void;\n\nexport interface DevtoolsSubscriptionHost {\n subscribe(\n subscriptionId: string,\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ): Promise<void>;\n unsubscribe(subscriptionId: string): void;\n dispose(): void;\n}\n\ntype DevtoolsInvalidationScope = DevtoolsLiveQueryScope;\n\ninterface SubscriptionRecord {\n payload: SyncoreDevtoolsSubscriptionPayload;\n listener: DevtoolsSubscriptionListener;\n unsubscribeRuntime: () => void;\n scopes: Set<DevtoolsInvalidationScope>;\n}\n\nexport function createDevtoolsCommandHandler(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsCommandHandler {\n const { driver, admin, sql } = deps;\n\n return async (payload): Promise<SyncoreDevtoolsCommandResultPayload> => {\n await admin.prepareForDirectAccess();\n switch (payload.kind) {\n case \"fn.run\": {\n const start = performance.now();\n try {\n let result: unknown;\n switch (payload.functionType) {\n case \"query\":\n result = await admin.runQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"mutation\":\n result = await admin.runMutation(\n createFunctionReference(\"mutation\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"action\":\n result = await admin.runAction(\n createFunctionReference(\"action\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n }\n return {\n kind: \"fn.run.result\",\n result,\n durationMs: performance.now() - start\n };\n } catch (error) {\n return {\n kind: \"fn.run.result\",\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - start\n };\n }\n }\n\n case \"data.insert\": {\n try {\n const id = await runDevtoolsMutation(admin, async (ctx) =>\n ctx.db.insert(payload.table as never, payload.document as never)\n , { origin: \"dashboard\" });\n notifyDataMutationScopes(admin, payload.table);\n return { kind: \"data.mutate.result\", success: true, id };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.patch\": {\n try {\n await runDevtoolsMutation(admin, async (ctx) => {\n await ctx.db.patch(\n payload.table as never,\n payload.id,\n payload.fields as never\n );\n return null;\n }, { origin: \"dashboard\" });\n notifyDataMutationScopes(admin, payload.table);\n return {\n kind: \"data.mutate.result\",\n success: true,\n id: payload.id\n };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.delete\": {\n try {\n await runDevtoolsMutation(admin, async (ctx) => {\n await ctx.db.delete(payload.table as never, payload.id);\n return null;\n }, { origin: \"dashboard\" });\n notifyDataMutationScopes(admin, payload.table);\n return { kind: \"data.mutate.result\", success: true };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.export\": {\n try {\n const requestedTables =\n payload.tables && payload.tables.length > 0\n ? payload.tables\n : deps.schema.tableNames();\n const tables = await Promise.all(\n requestedTables.map(async (name) => {\n const result = await queryTable(driver, name);\n return {\n name,\n rows: result.rows,\n totalCount: result.totalCount\n };\n })\n );\n return {\n kind: \"data.export.result\",\n tables\n };\n } catch (error) {\n return {\n kind: \"data.export.result\",\n tables: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.referenceOptions\": {\n const limit = Math.min(Math.max(payload.limit ?? 100, 1), 200);\n const offset = Math.max(payload.offset ?? 0, 0);\n try {\n const result = await queryReferenceOptions(\n driver,\n payload.table,\n payload.search,\n limit,\n offset\n );\n return {\n kind: \"data.referenceOptions.result\",\n table: payload.table,\n rows: result.rows,\n totalCount: result.totalCount,\n offset,\n hasMore: offset + result.rows.length < result.totalCount\n };\n } catch (error) {\n return {\n kind: \"data.referenceOptions.result\",\n table: payload.table,\n rows: [],\n totalCount: 0,\n offset,\n hasMore: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.read\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Read requires a file-backed database path.\");\n }\n const { columns, rows } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.read.result\",\n columns,\n rows\n };\n } catch (error) {\n return {\n kind: \"sql.read.result\",\n columns: [],\n rows: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.write\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n if (analysis.mode === \"read\") {\n throw new Error(\n \"Use SQL Read or SQL Live for read-only statements.\"\n );\n }\n const result = await driver.run(payload.query);\n admin.notifyDevtoolsScopes(analysis.observedScopes);\n await admin.forceRefreshDevtools(\n \"SQL write executed from devtools dashboard.\",\n analysis.observedScopes.flatMap((scope) =>\n scope === \"all\" ? [] : ([scope] as ImpactScope[])\n ),\n { origin: \"dashboard\" }\n );\n return {\n kind: \"sql.write.result\",\n rowsAffected: result.changes,\n invalidationScopes: [...analysis.observedScopes]\n };\n } catch (error) {\n return {\n kind: \"sql.write.result\",\n rowsAffected: 0,\n invalidationScopes: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.cancel\": {\n try {\n const cancelled = await admin.cancelScheduledJob(payload.jobId);\n return {\n kind: \"scheduler.cancel.result\",\n success: true,\n cancelled\n };\n } catch (error) {\n return {\n kind: \"scheduler.cancel.result\",\n success: false,\n cancelled: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.update\": {\n try {\n const updated = await admin.updateScheduledJob({\n id: payload.jobId,\n args: payload.args,\n ...(payload.schedule ? { schedule: payload.schedule } : {}),\n ...(payload.misfirePolicy\n ? { misfirePolicy: payload.misfirePolicy }\n : {}),\n ...(payload.runAt !== undefined ? { runAt: payload.runAt } : {})\n });\n const jobs = updated ? await listSchedulerJobs(driver) : [];\n const updatedJob = jobs.find((job) => job.id === payload.jobId);\n return {\n kind: \"scheduler.update.result\",\n success: true,\n updated,\n ...(updated && updatedJob ? { job: updatedJob } : {})\n };\n } catch (error) {\n return {\n kind: \"scheduler.update.result\",\n success: false,\n updated: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n default:\n return {\n kind: \"error\",\n message: `Unknown devtools command: ${(payload as { kind: string }).kind}`\n };\n }\n };\n}\n\nexport function createDevtoolsSubscriptionHost(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsSubscriptionHost {\n const { driver, schema, functions, admin } = deps;\n const subscriptions = new Map<string, SubscriptionRecord>();\n\n const emit = async (\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ) => {\n listener(\n await resolveSubscriptionPayload(payload, {\n driver,\n schema,\n functions,\n admin,\n ...(deps.sql ? { sql: deps.sql } : {})\n })\n );\n };\n\n const handleInvalidation = async (scopes: Set<DevtoolsInvalidationScope>) => {\n for (const record of subscriptions.values()) {\n if (!intersects(scopes, record.scopes)) {\n continue;\n }\n await emit(record.payload, record.listener);\n }\n };\n\n return {\n async subscribe(subscriptionId, payload, listener) {\n if (payload.kind === \"fn.watch\") {\n const definition = functions[payload.functionName];\n if (!definition || definition.kind !== \"query\") {\n listener({\n kind: \"fn.watch.result\",\n error: `Unknown query function: ${payload.functionName}`\n });\n return;\n }\n const client = admin.createClient();\n const watch = client.watchQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args\n );\n const emitWatchResult = () => {\n const error = watch.localQueryError();\n listener({\n kind: \"fn.watch.result\",\n ...(error\n ? {\n error: error.message\n }\n : {\n result: watch.localQueryResult()\n })\n });\n };\n const unsubscribeUpdates = watch.onUpdate(emitWatchResult);\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeUpdates();\n watch.dispose?.();\n },\n scopes: new Set<DevtoolsInvalidationScope>([\"all\"])\n });\n emitWatchResult();\n return;\n }\n\n const unsubscribeRuntime = admin.subscribeToDevtoolsInvalidations(\n (scopes) => {\n void handleInvalidation(scopes);\n }\n );\n const unsubscribeEvents = admin.subscribeToDevtoolsEvents((event) => {\n if (event.type === \"runtime.disconnected\") {\n void emit(payload, listener);\n }\n });\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeRuntime();\n unsubscribeEvents();\n },\n scopes: scopesForSubscription(payload, deps.sql)\n });\n await emit(payload, listener);\n },\n unsubscribe(subscriptionId) {\n const record = subscriptions.get(subscriptionId);\n if (!record) {\n return;\n }\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n },\n dispose() {\n for (const [subscriptionId, record] of subscriptions) {\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n }\n }\n };\n}\n\nasync function resolveSubscriptionPayload(\n payload: SyncoreDevtoolsSubscriptionPayload,\n deps: DevtoolsCommandHandlerDeps\n): Promise<SyncoreDevtoolsSubscriptionResultPayload> {\n const { driver, schema, functions, admin } = deps;\n await admin.prepareForDirectAccess();\n\n switch (payload.kind) {\n case \"runtime.summary\":\n return {\n kind: \"runtime.summary.result\",\n summary: admin.getRuntimeSummary()\n };\n case \"runtime.activeQueries\":\n return {\n kind: \"runtime.activeQueries.result\",\n activeQueries: admin.getActiveQueryInfos()\n };\n case \"fn.watch\":\n throw new Error(\"Function watches are pushed incrementally and have no snapshot payload.\");\n case \"schema.tables\": {\n const tables = await getSchemaTables(driver, schema);\n console.debug(\"[devtools] schema.tables\", {\n runtimeId: admin.getRuntimeId(),\n tables: tables.map((table) => ({\n name: table.name,\n documentCount: table.documentCount\n }))\n });\n return {\n kind: \"schema.tables.result\",\n tables\n };\n }\n case \"data.table\": {\n const result = await queryTable(\n driver,\n payload.table,\n payload.filters,\n payload.limit\n );\n console.debug(\"[devtools] data.table\", {\n runtimeId: admin.getRuntimeId(),\n table: payload.table,\n filters: payload.filters ?? [],\n limit: payload.limit,\n totalCount: result.totalCount,\n rowCount: result.rows.length,\n firstRow: result.rows[0] ?? null\n });\n return {\n kind: \"data.table.result\",\n rows: result.rows,\n totalCount: result.totalCount,\n ...(result.cursor ? { cursor: result.cursor } : {})\n };\n }\n case \"scheduler.jobs\":\n return {\n kind: \"scheduler.jobs.result\",\n jobs: await listSchedulerJobs(driver)\n };\n case \"functions.catalog\":\n return {\n kind: \"functions.catalog.result\",\n functions: listFunctions(functions)\n };\n case \"sql.watch\": {\n const sqlSupport = requireDevtoolsSqlSupport(deps.sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Live requires a file-backed database path.\");\n }\n const { columns, rows, observedTables } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.watch.result\",\n columns,\n rows,\n observedTables\n };\n }\n }\n}\n\nasync function queryTable(\n driver: SyncoreSqlDriver,\n table: string,\n filters?: Array<{\n field: string;\n operator: string;\n value: unknown;\n }>,\n limit?: number\n): Promise<{\n rows: Record<string, unknown>[];\n totalCount: number;\n cursor?: string;\n}> {\n let sql = `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(table)}`;\n const params: unknown[] = [];\n const whereClauses: string[] = [];\n\n if (filters && filters.length > 0) {\n for (const filter of filters) {\n whereClauses.push(filterToSql(filter));\n params.push(normalizeFilterValue(filter));\n }\n sql += ` WHERE ${whereClauses.join(\" AND \")}`;\n }\n\n sql += \" ORDER BY _creationTime DESC\";\n if (limit) {\n sql += ` LIMIT ${limit}`;\n }\n\n const rawRows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(sql, params);\n const rows = rawRows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }));\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${quoteIdentifier(table)}${\n whereClauses.length > 0 ? ` WHERE ${whereClauses.join(\" AND \")}` : \"\"\n }`,\n params\n );\n\n return {\n rows,\n totalCount: countRow?.count ?? 0\n };\n}\n\nasync function queryReferenceOptions(\n driver: SyncoreSqlDriver,\n table: string,\n search: string | undefined,\n limit: number,\n offset: number\n): Promise<{\n rows: Record<string, unknown>[];\n totalCount: number;\n}> {\n let sql = `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(table)}`;\n const params: unknown[] = [];\n const trimmedSearch = search?.trim();\n const whereClause = trimmedSearch\n ? \" WHERE _id LIKE ? OR _json LIKE ?\"\n : \"\";\n if (trimmedSearch) {\n const like = `%${trimmedSearch}%`;\n params.push(like, like);\n }\n\n sql += `${whereClause} ORDER BY _creationTime DESC LIMIT ? OFFSET ?`;\n const rawRows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(sql, [...params, limit, offset]);\n const rows = rawRows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }));\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${quoteIdentifier(table)}${whereClause}`,\n params\n );\n return {\n rows,\n totalCount: countRow?.count ?? 0\n };\n}\n\nasync function getSchemaTables(\n driver: SyncoreSqlDriver,\n schema: SyncoreDataModel\n): Promise<TableSchema[]> {\n return Promise.all(\n schema.tableNames().map(async (name) => {\n const table = schema.getTable(name) as TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >;\n const validatorDesc = describeValidator(table.validator);\n const fields =\n validatorDesc.kind === \"object\"\n ? Object.entries(validatorDesc.shape).map(\n ([fieldName, fieldDesc]) => {\n const field = fieldDesc as {\n validator: { kind: string; tableName?: string };\n optional: boolean;\n };\n return {\n name: fieldName,\n type: field.validator.kind,\n optional: field.optional,\n ...(field.validator.kind === \"id\" && field.validator.tableName\n ? { referenceTable: field.validator.tableName }\n : {})\n };\n }\n )\n : [];\n\n fields.unshift(\n { name: \"_id\", type: \"string\", optional: false },\n { name: \"_creationTime\", type: \"number\", optional: false }\n );\n\n const documentCount = await driver\n .get<{ count: number }>(`SELECT COUNT(*) as count FROM \"${name}\"`)\n .then((countRow) => countRow?.count ?? 0)\n .catch(() => 0);\n\n return {\n name,\n ...(table.options.tableName ? { displayName: table.options.tableName } : {}),\n owner: table.options.componentPath ? (\"component\" as const) : (\"root\" as const),\n ...(table.options.componentPath\n ? { componentPath: table.options.componentPath }\n : {}),\n ...(table.options.componentName\n ? { componentName: table.options.componentName }\n : {}),\n fields,\n indexes: table.indexes.map((index) => ({\n name: index.name,\n fields: index.fields,\n unique: false\n })),\n documentCount\n };\n })\n );\n}\n\nasync function listSchedulerJobs(\n driver: SyncoreSqlDriver\n): Promise<SchedulerJob[]> {\n try {\n const rows = await driver.all<{\n id: string;\n function_name: string;\n args_json: string;\n status: string;\n run_at: number;\n created_at: number;\n updated_at: number;\n recurring_name: string | null;\n schedule_json: string | null;\n timezone: string | null;\n misfire_policy: string;\n last_run_at: number | null;\n window_ms: number | null;\n }>(`SELECT * FROM \"_scheduled_functions\" ORDER BY run_at DESC LIMIT 200`);\n\n return rows.map((row) => {\n const schedule = safeReadRecurringSchedule(row.schedule_json);\n const scheduleLabel = schedule ? formatScheduleLabel(schedule) : undefined;\n const functionComponent = parseCanonicalComponentFunctionName(\n row.function_name\n );\n const idComponent = parseComponentScopedIdentifier(row.id);\n return {\n id: row.id,\n functionName: row.function_name,\n owner:\n functionComponent || idComponent ? (\"component\" as const) : (\"root\" as const),\n ...(functionComponent\n ? {\n componentPath: functionComponent.componentPath\n }\n : idComponent\n ? {\n componentPath: idComponent.componentPath\n }\n : {}),\n args: JSON.parse(row.args_json) as Record<string, unknown>,\n scheduledAt: row.created_at,\n runAt: row.run_at,\n status: mapJobStatus(row.status),\n ...(row.status === \"completed\" || row.status === \"failed\"\n ? { completedAt: row.updated_at }\n : {}),\n ...(row.recurring_name ? { recurringName: row.recurring_name } : {}),\n ...(schedule ? { schedule } : {}),\n ...(scheduleLabel ? { scheduleLabel, cronSchedule: scheduleLabel } : {}),\n ...(row.timezone ? { timezone: row.timezone } : {}),\n ...(row.last_run_at !== null ? { lastRunAt: row.last_run_at } : {}),\n ...(row.updated_at ? { updatedAt: row.updated_at } : {}),\n misfirePolicy: readMisfirePolicy(row.misfire_policy, row.window_ms)\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction listFunctions(\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"]\n) {\n return Object.entries(functions)\n .filter(\n (entry): entry is [string, NonNullable<(typeof entry)[1]>] =>\n entry[1] !== undefined\n )\n .map(([name, fn]) => {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n const descriptor: {\n name: string;\n type: \"query\" | \"mutation\" | \"action\";\n file?: string;\n modulePath?: string;\n namespace?: string;\n metadataAvailable?: boolean;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n visibility?: \"public\" | \"internal\";\n localName?: string;\n args?: Record<string, unknown>;\n } = {\n name,\n type: fn.kind,\n owner: componentFunction ? \"component\" : \"root\",\n namespace: inferFunctionNamespace(name),\n metadataAvailable: componentFunction !== null || name.includes(\":\"),\n ...(componentFunction\n ? {\n file: `components/${componentFunction.componentPath}`,\n modulePath: componentFunction.componentPath,\n componentPath: componentFunction.componentPath,\n visibility: componentFunction.visibility,\n localName: componentFunction.localName\n }\n : inferFileFromFunctionName(name)\n ? {\n file: inferFileFromFunctionName(name),\n modulePath: inferFunctionNamespace(name)\n }\n : {})\n };\n const argsDesc = describeValidator(fn.argsValidator);\n if (argsDesc.kind === \"object\") {\n descriptor.args = argsDesc.shape as Record<string, unknown>;\n }\n return descriptor;\n });\n}\n\nfunction inferFileFromFunctionName(name: string): string {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n if (componentFunction) {\n return `components/${componentFunction.componentPath}`;\n }\n const parts = name.split(\":\");\n if (parts.length > 1) {\n return `${parts[0]}.ts`;\n }\n return \"\";\n}\n\nfunction inferFunctionNamespace(name: string): string {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n if (componentFunction) {\n return componentFunction.componentPath;\n }\n if (name.includes(\":\")) {\n return name.split(\":\")[0] ?? \"root\";\n }\n if (name.includes(\"/\")) {\n return name.split(\"/\")[0] ?? \"root\";\n }\n return \"root\";\n}\n\nfunction normalizeFilterValue(filter: {\n operator: string;\n value: unknown;\n}): unknown {\n const value = coerceFilterValue(filter.value);\n switch (filter.operator) {\n case \"contains\":\n return `%${String(value)}%`;\n case \"startsWith\":\n return `${String(value)}%`;\n default:\n return value;\n }\n}\n\nfunction filterToSql(filter: { field: string; operator: string }): string {\n const operator = filterOperatorToSql(filter.operator);\n if (filter.field === \"_id\") {\n return `_id ${operator} ?`;\n }\n if (filter.field === \"_creationTime\") {\n return `_creationTime ${operator} ?`;\n }\n return `json_extract(_json, ${JSON.stringify(`$.${filter.field}`)}) ${operator} ?`;\n}\n\nfunction coerceFilterValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const trimmed = value.trim();\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\") return null;\n if (/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) {\n const numberValue = Number(trimmed);\n if (Number.isFinite(numberValue)) {\n return numberValue;\n }\n }\n return value;\n}\n\nfunction filterOperatorToSql(operator: string): string {\n switch (operator) {\n case \"eq\":\n return \"=\";\n case \"neq\":\n return \"!=\";\n case \"gt\":\n return \">\";\n case \"gte\":\n return \">=\";\n case \"lt\":\n return \"<\";\n case \"lte\":\n return \"<=\";\n case \"contains\":\n case \"startsWith\":\n return \"LIKE\";\n default:\n return \"=\";\n }\n}\n\nfunction mapJobStatus(\n status: string\n): \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\" {\n switch (status) {\n case \"scheduled\":\n return \"pending\";\n case \"completed\":\n return \"completed\";\n case \"failed\":\n return \"failed\";\n case \"cancelled\":\n case \"skipped\":\n return \"cancelled\";\n default:\n return \"pending\";\n }\n}\n\nfunction formatScheduleLabel(schedule: SchedulerRecurringSchedule): string {\n switch (schedule.type) {\n case \"interval\": {\n const parts: string[] = [];\n if (schedule.hours) {\n parts.push(`${schedule.hours}h`);\n }\n if (schedule.minutes) {\n parts.push(`${schedule.minutes}m`);\n }\n if (schedule.seconds) {\n parts.push(`${schedule.seconds}s`);\n }\n return parts.length > 0 ? `Every ${parts.join(\" \")}` : \"Recurring\";\n }\n case \"daily\":\n return `Daily ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n case \"weekly\":\n return `Weekly ${capitalize(schedule.dayOfWeek)} ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n default:\n return \"Recurring\";\n }\n}\n\nfunction readMisfirePolicy(\n type: string,\n windowMs: number | null\n): SchedulerMisfirePolicy {\n if (type === \"windowed\") {\n return {\n type,\n windowMs: windowMs ?? 0\n };\n }\n if (type === \"skip\" || type === \"run_once_if_missed\") {\n return { type };\n }\n return { type: \"catch_up\" };\n}\n\nfunction padNumber(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction capitalize(value: string): string {\n return value.slice(0, 1).toUpperCase() + value.slice(1);\n}\n\nasync function runDevtoolsMutation<TResult>(\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>,\n callback: (ctx: {\n db: {\n insert(\n tableName: string,\n value: Record<string, unknown>\n ): Promise<string>;\n patch(\n tableName: string,\n id: string,\n value: Record<string, unknown>\n ): Promise<void>;\n delete(tableName: string, id: string): Promise<void>;\n };\n }) => Promise<TResult>,\n meta?: { origin?: \"dashboard\" }\n ): Promise<TResult> {\n return admin.runDevtoolsMutation(callback as never, meta);\n }\n\nfunction notifyDataMutationScopes(\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>,\n tableName: string\n): void {\n admin.notifyDevtoolsScopes([\"schema.tables\", `table:${tableName}`]);\n}\n\nfunction scopesForSubscription(\n payload: SyncoreDevtoolsSubscriptionPayload,\n sql?: DevtoolsSqlSupport\n): Set<DevtoolsInvalidationScope> {\n switch (payload.kind) {\n case \"runtime.summary\":\n return new Set([\"runtime.summary\"]);\n case \"runtime.activeQueries\":\n return new Set([\"runtime.activeQueries\"]);\n case \"fn.watch\":\n return new Set([\"all\"]);\n case \"schema.tables\":\n return new Set([\"schema.tables\"]);\n case \"data.table\":\n return new Set<DevtoolsInvalidationScope>([`table:${payload.table}`]);\n case \"scheduler.jobs\":\n return new Set([\"scheduler.jobs\"]);\n case \"functions.catalog\":\n return new Set([\"all\"]);\n case \"sql.watch\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n sqlSupport.ensureSqlMode(analysis, \"watch\");\n return new Set<DevtoolsInvalidationScope>(analysis.observedScopes);\n } catch {\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n }\n default:\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n}\n\nfunction intersects(\n a: Set<DevtoolsInvalidationScope>,\n b: Set<DevtoolsInvalidationScope>\n): boolean {\n if (a.has(\"all\") || b.has(\"all\")) {\n return true;\n }\n for (const value of a) {\n if (b.has(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction requireDevtoolsSqlSupport(\n sql?: DevtoolsSqlSupport\n): DevtoolsSqlSupport {\n if (!sql) {\n throw new Error(\"SQL Console is not available for this runtime.\");\n }\n return sql;\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"devtools.mjs","names":[],"sources":["../../src/runtime/devtools.ts"],"sourcesContent":["import type {\n SchedulerMisfirePolicy,\n SchedulerJob,\n SchedulerRecurringSchedule,\n SyncoreDevtoolsCommandPayload,\n SyncoreDevtoolsCommandResultPayload,\n SyncoreDevtoolsSubscriptionPayload,\n SyncoreDevtoolsSubscriptionResultPayload,\n TableSchema\n} from \"@syncore/devtools-protocol\";\nimport { describeValidator } from \"@syncore/schema\";\nimport type { TableDefinition, Validator } from \"@syncore/schema\";\nimport type {\n DevtoolsLiveQueryScope,\n ImpactScope,\n SyncoreDataModel,\n SyncoreRuntimeAdmin,\n SyncoreRuntimeOptions,\n SyncoreSqlDriver\n} from \"./runtime.js\";\nimport { createFunctionReference } from \"./runtime.js\";\nimport {\n parseCanonicalComponentFunctionName,\n parseComponentScopedIdentifier,\n quoteIdentifier,\n safeReadRecurringSchedule\n} from \"./internal/engines/shared.js\";\n\nexport interface DevtoolsCommandHandlerDeps {\n driver: SyncoreSqlDriver;\n schema: SyncoreDataModel;\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"];\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>;\n sql?: DevtoolsSqlSupport;\n}\n\nexport type DevtoolsSqlMode = \"read\" | \"write\" | \"ddl\";\n\nexport interface DevtoolsSqlAnalysis {\n mode: DevtoolsSqlMode;\n readTables: string[];\n writeTables: string[];\n schemaChanged: boolean;\n observedScopes: DevtoolsLiveQueryScope[];\n}\n\nexport interface DevtoolsSqlReadResult {\n columns: string[];\n rows: unknown[][];\n observedTables: string[];\n}\n\nexport interface DevtoolsSqlSupport {\n analyzeSqlStatement(query: string): DevtoolsSqlAnalysis;\n ensureSqlMode(\n analysis: DevtoolsSqlAnalysis,\n expected: DevtoolsSqlMode | \"watch\"\n ): void;\n runReadonlyQuery(databasePath: string, query: string): DevtoolsSqlReadResult;\n}\n\nexport type DevtoolsCommandHandler = (\n payload: SyncoreDevtoolsCommandPayload\n) => Promise<SyncoreDevtoolsCommandResultPayload>;\n\nexport type DevtoolsSubscriptionListener = (\n payload: SyncoreDevtoolsSubscriptionResultPayload\n) => void;\n\nexport interface DevtoolsSubscriptionHost {\n subscribe(\n subscriptionId: string,\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ): Promise<void>;\n unsubscribe(subscriptionId: string): void;\n dispose(): void;\n}\n\ntype DevtoolsInvalidationScope = DevtoolsLiveQueryScope;\n\ninterface SubscriptionRecord {\n payload: SyncoreDevtoolsSubscriptionPayload;\n listener: DevtoolsSubscriptionListener;\n unsubscribeRuntime: () => void;\n scopes: Set<DevtoolsInvalidationScope>;\n}\n\nexport function createDevtoolsCommandHandler(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsCommandHandler {\n const { driver, admin, sql } = deps;\n\n return async (payload): Promise<SyncoreDevtoolsCommandResultPayload> => {\n await admin.prepareForDirectAccess();\n switch (payload.kind) {\n case \"fn.run\": {\n const start = performance.now();\n try {\n let result: unknown;\n switch (payload.functionType) {\n case \"query\":\n result = await admin.runQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"mutation\":\n result = await admin.runMutation(\n createFunctionReference(\"mutation\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n case \"action\":\n result = await admin.runAction(\n createFunctionReference(\"action\", payload.functionName),\n payload.args,\n { origin: \"dashboard\" }\n );\n break;\n }\n return {\n kind: \"fn.run.result\",\n result,\n durationMs: performance.now() - start\n };\n } catch (error) {\n return {\n kind: \"fn.run.result\",\n error: error instanceof Error ? error.message : String(error),\n durationMs: performance.now() - start\n };\n }\n }\n\n case \"data.insert\": {\n try {\n const id = await runDevtoolsMutation(\n admin,\n async (ctx) =>\n ctx.db.insert(payload.table as never, payload.document as never),\n { origin: \"dashboard\" }\n );\n notifyDataMutationScopes(admin, payload.table);\n return { kind: \"data.mutate.result\", success: true, id };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.patch\": {\n try {\n await runDevtoolsMutation(\n admin,\n async (ctx) => {\n await ctx.db.patch(\n payload.table as never,\n payload.id,\n payload.fields as never\n );\n return null;\n },\n { origin: \"dashboard\" }\n );\n notifyDataMutationScopes(admin, payload.table);\n return {\n kind: \"data.mutate.result\",\n success: true,\n id: payload.id\n };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.delete\": {\n try {\n await runDevtoolsMutation(\n admin,\n async (ctx) => {\n await ctx.db.delete(payload.table as never, payload.id);\n return null;\n },\n { origin: \"dashboard\" }\n );\n notifyDataMutationScopes(admin, payload.table);\n return { kind: \"data.mutate.result\", success: true };\n } catch (error) {\n return {\n kind: \"data.mutate.result\",\n success: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.export\": {\n try {\n const requestedTables =\n payload.tables && payload.tables.length > 0\n ? payload.tables\n : deps.schema.tableNames();\n const tables = await Promise.all(\n requestedTables.map(async (name) => {\n const result = await queryTable(driver, name);\n return {\n name,\n rows: result.rows,\n totalCount: result.totalCount\n };\n })\n );\n return {\n kind: \"data.export.result\",\n tables\n };\n } catch (error) {\n return {\n kind: \"data.export.result\",\n tables: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"data.referenceOptions\": {\n const limit = Math.min(Math.max(payload.limit ?? 100, 1), 200);\n const offset = Math.max(payload.offset ?? 0, 0);\n try {\n const result = await queryReferenceOptions(\n driver,\n payload.table,\n payload.search,\n limit,\n offset\n );\n return {\n kind: \"data.referenceOptions.result\",\n table: payload.table,\n rows: result.rows,\n totalCount: result.totalCount,\n offset,\n hasMore: offset + result.rows.length < result.totalCount\n };\n } catch (error) {\n return {\n kind: \"data.referenceOptions.result\",\n table: payload.table,\n rows: [],\n totalCount: 0,\n offset,\n hasMore: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.read\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Read requires a file-backed database path.\");\n }\n const { columns, rows } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.read.result\",\n columns,\n rows\n };\n } catch (error) {\n return {\n kind: \"sql.read.result\",\n columns: [],\n rows: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"sql.write\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n if (analysis.mode === \"read\") {\n throw new Error(\n \"Use SQL Read or SQL Live for read-only statements.\"\n );\n }\n const result = await driver.run(payload.query);\n admin.notifyDevtoolsScopes(analysis.observedScopes);\n await admin.forceRefreshDevtools(\n \"SQL write executed from devtools dashboard.\",\n analysis.observedScopes.flatMap((scope) =>\n scope === \"all\" ? [] : ([scope] as ImpactScope[])\n ),\n { origin: \"dashboard\" }\n );\n return {\n kind: \"sql.write.result\",\n rowsAffected: result.changes,\n invalidationScopes: [...analysis.observedScopes]\n };\n } catch (error) {\n return {\n kind: \"sql.write.result\",\n rowsAffected: 0,\n invalidationScopes: [],\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"storage.list\": {\n const limit = normalizeStorageLimit(payload.limit);\n const offset = Math.max(payload.offset ?? 0, 0);\n try {\n const result = await admin.listStorageObjects({\n limit,\n offset,\n ...(payload.search ? { search: payload.search } : {})\n });\n return {\n kind: \"storage.list.result\",\n entries: result.entries,\n totalCount: result.totalCount,\n offset,\n hasMore: offset + result.entries.length < result.totalCount\n };\n } catch (error) {\n return {\n kind: \"storage.list.result\",\n entries: [],\n totalCount: 0,\n offset,\n hasMore: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"storage.access.create\": {\n try {\n const object = await admin.getStorageObjectAccessInfo(payload.id);\n if (!object) {\n return {\n kind: \"storage.access.create.result\",\n error: `Storage object ${JSON.stringify(payload.id)} was not found.`\n };\n }\n return {\n kind: \"storage.access.create.result\",\n entry: object.entry,\n supportsRange: object.supportsRange,\n error:\n \"Storage access URLs must be created by the Syncore devtools hub.\"\n };\n } catch (error) {\n return {\n kind: \"storage.access.create.result\",\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"storage.readRange\": {\n try {\n const object = await admin.readStorageObjectRange(\n payload.id,\n payload.offset,\n payload.length\n );\n if (!object) {\n return {\n kind: \"storage.readRange.result\",\n offset: payload.offset,\n bytesRead: 0,\n done: true,\n supportsRange: false,\n error: `Storage object ${JSON.stringify(payload.id)} was not found.`\n };\n }\n return {\n kind: \"storage.readRange.result\",\n entry: object.entry,\n offset: object.offset,\n bytesRead: object.bytesRead,\n done: object.done,\n supportsRange: object.supportsRange,\n base64: bytesToBase64(object.bytes)\n };\n } catch (error) {\n return {\n kind: \"storage.readRange.result\",\n offset: payload.offset,\n bytesRead: 0,\n done: true,\n supportsRange: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"storage.delete\": {\n try {\n const deleted = await admin.deleteStorageObject(payload.id, {\n origin: \"dashboard\"\n });\n return {\n kind: \"storage.delete.result\",\n success: true,\n deleted\n };\n } catch (error) {\n return {\n kind: \"storage.delete.result\",\n success: false,\n deleted: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.cancel\": {\n try {\n const cancelled = await admin.cancelScheduledJob(payload.jobId);\n return {\n kind: \"scheduler.cancel.result\",\n success: true,\n cancelled\n };\n } catch (error) {\n return {\n kind: \"scheduler.cancel.result\",\n success: false,\n cancelled: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n case \"scheduler.update\": {\n try {\n const updated = await admin.updateScheduledJob({\n id: payload.jobId,\n args: payload.args,\n ...(payload.schedule ? { schedule: payload.schedule } : {}),\n ...(payload.misfirePolicy\n ? { misfirePolicy: payload.misfirePolicy }\n : {}),\n ...(payload.runAt !== undefined ? { runAt: payload.runAt } : {})\n });\n const jobs = updated ? await listSchedulerJobs(driver) : [];\n const updatedJob = jobs.find((job) => job.id === payload.jobId);\n return {\n kind: \"scheduler.update.result\",\n success: true,\n updated,\n ...(updated && updatedJob ? { job: updatedJob } : {})\n };\n } catch (error) {\n return {\n kind: \"scheduler.update.result\",\n success: false,\n updated: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n\n default:\n return {\n kind: \"error\",\n message: `Unknown devtools command: ${(payload as { kind: string }).kind}`\n };\n }\n };\n}\n\nexport function createDevtoolsSubscriptionHost(\n deps: DevtoolsCommandHandlerDeps\n): DevtoolsSubscriptionHost {\n const { driver, schema, functions, admin } = deps;\n const subscriptions = new Map<string, SubscriptionRecord>();\n\n const emit = async (\n payload: SyncoreDevtoolsSubscriptionPayload,\n listener: DevtoolsSubscriptionListener\n ) => {\n listener(\n await resolveSubscriptionPayload(payload, {\n driver,\n schema,\n functions,\n admin,\n ...(deps.sql ? { sql: deps.sql } : {})\n })\n );\n };\n\n const handleInvalidation = async (scopes: Set<DevtoolsInvalidationScope>) => {\n for (const record of subscriptions.values()) {\n if (!intersects(scopes, record.scopes)) {\n continue;\n }\n await emit(record.payload, record.listener);\n }\n };\n\n return {\n async subscribe(subscriptionId, payload, listener) {\n if (payload.kind === \"fn.watch\") {\n const definition = functions[payload.functionName];\n if (!definition || definition.kind !== \"query\") {\n listener({\n kind: \"fn.watch.result\",\n error: `Unknown query function: ${payload.functionName}`\n });\n return;\n }\n const client = admin.createClient();\n const watch = client.watchQuery(\n createFunctionReference(\"query\", payload.functionName),\n payload.args\n );\n const emitWatchResult = () => {\n const error = watch.localQueryError();\n listener({\n kind: \"fn.watch.result\",\n ...(error\n ? {\n error: error.message\n }\n : {\n result: watch.localQueryResult()\n })\n });\n };\n const unsubscribeUpdates = watch.onUpdate(emitWatchResult);\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeUpdates();\n watch.dispose?.();\n },\n scopes: new Set<DevtoolsInvalidationScope>([\"all\"])\n });\n emitWatchResult();\n return;\n }\n\n const unsubscribeRuntime = admin.subscribeToDevtoolsInvalidations(\n (scopes) => {\n void handleInvalidation(scopes);\n }\n );\n const unsubscribeEvents = admin.subscribeToDevtoolsEvents((event) => {\n if (event.type === \"runtime.disconnected\") {\n void emit(payload, listener);\n }\n });\n subscriptions.set(subscriptionId, {\n payload,\n listener,\n unsubscribeRuntime: () => {\n unsubscribeRuntime();\n unsubscribeEvents();\n },\n scopes: scopesForSubscription(payload, deps.sql)\n });\n await emit(payload, listener);\n },\n unsubscribe(subscriptionId) {\n const record = subscriptions.get(subscriptionId);\n if (!record) {\n return;\n }\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n },\n dispose() {\n for (const [subscriptionId, record] of subscriptions) {\n record.unsubscribeRuntime();\n subscriptions.delete(subscriptionId);\n }\n }\n };\n}\n\nasync function resolveSubscriptionPayload(\n payload: SyncoreDevtoolsSubscriptionPayload,\n deps: DevtoolsCommandHandlerDeps\n): Promise<SyncoreDevtoolsSubscriptionResultPayload> {\n const { driver, schema, functions, admin } = deps;\n await admin.prepareForDirectAccess();\n\n switch (payload.kind) {\n case \"runtime.summary\":\n return {\n kind: \"runtime.summary.result\",\n summary: admin.getRuntimeSummary()\n };\n case \"runtime.activeQueries\":\n return {\n kind: \"runtime.activeQueries.result\",\n activeQueries: admin.getActiveQueryInfos()\n };\n case \"fn.watch\":\n throw new Error(\n \"Function watches are pushed incrementally and have no snapshot payload.\"\n );\n case \"schema.tables\": {\n const tables = await getSchemaTables(driver, schema);\n console.debug(\"[devtools] schema.tables\", {\n runtimeId: admin.getRuntimeId(),\n tables: tables.map((table) => ({\n name: table.name,\n documentCount: table.documentCount\n }))\n });\n return {\n kind: \"schema.tables.result\",\n tables\n };\n }\n case \"data.table\": {\n const result = await queryTable(\n driver,\n payload.table,\n payload.filters,\n payload.limit\n );\n console.debug(\"[devtools] data.table\", {\n runtimeId: admin.getRuntimeId(),\n table: payload.table,\n filters: payload.filters ?? [],\n limit: payload.limit,\n totalCount: result.totalCount,\n rowCount: result.rows.length,\n firstRow: result.rows[0] ?? null\n });\n return {\n kind: \"data.table.result\",\n rows: result.rows,\n totalCount: result.totalCount,\n ...(result.cursor ? { cursor: result.cursor } : {})\n };\n }\n case \"scheduler.jobs\":\n return {\n kind: \"scheduler.jobs.result\",\n jobs: await listSchedulerJobs(driver)\n };\n case \"functions.catalog\":\n return {\n kind: \"functions.catalog.result\",\n functions: listFunctions(functions)\n };\n case \"storage.list\": {\n const limit = normalizeStorageLimit(payload.limit);\n const offset = Math.max(payload.offset ?? 0, 0);\n try {\n const result = await admin.listStorageObjects({\n limit,\n offset,\n ...(payload.search ? { search: payload.search } : {})\n });\n return {\n kind: \"storage.list.result\",\n entries: result.entries,\n totalCount: result.totalCount,\n offset,\n hasMore: offset + result.entries.length < result.totalCount\n };\n } catch (error) {\n return {\n kind: \"storage.list.result\",\n entries: [],\n totalCount: 0,\n offset,\n hasMore: false,\n error: error instanceof Error ? error.message : String(error)\n };\n }\n }\n case \"sql.watch\": {\n const sqlSupport = requireDevtoolsSqlSupport(deps.sql);\n const databasePath = admin.getDriverDatabasePath();\n if (!databasePath) {\n throw new Error(\"SQL Live requires a file-backed database path.\");\n }\n const { columns, rows, observedTables } = sqlSupport.runReadonlyQuery(\n databasePath,\n payload.query\n );\n return {\n kind: \"sql.watch.result\",\n columns,\n rows,\n observedTables\n };\n }\n }\n}\n\nasync function queryTable(\n driver: SyncoreSqlDriver,\n table: string,\n filters?: Array<{\n field: string;\n operator: string;\n value: unknown;\n }>,\n limit?: number\n): Promise<{\n rows: Record<string, unknown>[];\n totalCount: number;\n cursor?: string;\n}> {\n let sql = `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(table)}`;\n const params: unknown[] = [];\n const whereClauses: string[] = [];\n\n if (filters && filters.length > 0) {\n for (const filter of filters) {\n whereClauses.push(filterToSql(filter));\n params.push(normalizeFilterValue(filter));\n }\n sql += ` WHERE ${whereClauses.join(\" AND \")}`;\n }\n\n sql += \" ORDER BY _creationTime DESC\";\n if (limit) {\n sql += ` LIMIT ${limit}`;\n }\n\n const rawRows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(sql, params);\n const rows = rawRows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }));\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${quoteIdentifier(table)}${\n whereClauses.length > 0 ? ` WHERE ${whereClauses.join(\" AND \")}` : \"\"\n }`,\n params\n );\n\n return {\n rows,\n totalCount: countRow?.count ?? 0\n };\n}\n\nasync function queryReferenceOptions(\n driver: SyncoreSqlDriver,\n table: string,\n search: string | undefined,\n limit: number,\n offset: number\n): Promise<{\n rows: Record<string, unknown>[];\n totalCount: number;\n}> {\n let sql = `SELECT _id, _creationTime, _json FROM ${quoteIdentifier(table)}`;\n const params: unknown[] = [];\n const trimmedSearch = search?.trim();\n const whereClause = trimmedSearch ? \" WHERE _id LIKE ? OR _json LIKE ?\" : \"\";\n if (trimmedSearch) {\n const like = `%${trimmedSearch}%`;\n params.push(like, like);\n }\n\n sql += `${whereClause} ORDER BY _creationTime DESC LIMIT ? OFFSET ?`;\n const rawRows = await driver.all<{\n _id: string;\n _creationTime: number;\n _json: string;\n }>(sql, [...params, limit, offset]);\n const rows = rawRows.map((row) => ({\n _id: row._id,\n _creationTime: row._creationTime,\n ...(JSON.parse(row._json) as Record<string, unknown>)\n }));\n const countRow = await driver.get<{ count: number }>(\n `SELECT COUNT(*) as count FROM ${quoteIdentifier(table)}${whereClause}`,\n params\n );\n return {\n rows,\n totalCount: countRow?.count ?? 0\n };\n}\n\nasync function getSchemaTables(\n driver: SyncoreSqlDriver,\n schema: SyncoreDataModel\n): Promise<TableSchema[]> {\n return Promise.all(\n schema.tableNames().map(async (name) => {\n const table = schema.getTable(name) as TableDefinition<\n Validator<Record<string, unknown>, Record<string, unknown>, string>\n >;\n const validatorDesc = describeValidator(table.validator);\n const fields =\n validatorDesc.kind === \"object\"\n ? Object.entries(validatorDesc.shape).map(\n ([fieldName, fieldDesc]) => {\n const field = fieldDesc as {\n validator: { kind: string; tableName?: string };\n optional: boolean;\n };\n return {\n name: fieldName,\n type: field.validator.kind,\n optional: field.optional,\n ...(field.validator.kind === \"id\" && field.validator.tableName\n ? { referenceTable: field.validator.tableName }\n : {})\n };\n }\n )\n : [];\n\n fields.unshift(\n { name: \"_id\", type: \"string\", optional: false },\n { name: \"_creationTime\", type: \"number\", optional: false }\n );\n\n const documentCount = await driver\n .get<{ count: number }>(`SELECT COUNT(*) as count FROM \"${name}\"`)\n .then((countRow) => countRow?.count ?? 0)\n .catch(() => 0);\n\n return {\n name,\n ...(table.options.tableName\n ? { displayName: table.options.tableName }\n : {}),\n owner: table.options.componentPath\n ? (\"component\" as const)\n : (\"root\" as const),\n ...(table.options.componentPath\n ? { componentPath: table.options.componentPath }\n : {}),\n ...(table.options.componentName\n ? { componentName: table.options.componentName }\n : {}),\n fields,\n indexes: table.indexes.map((index) => ({\n name: index.name,\n fields: index.fields,\n unique: false\n })),\n documentCount\n };\n })\n );\n}\n\nasync function listSchedulerJobs(\n driver: SyncoreSqlDriver\n): Promise<SchedulerJob[]> {\n try {\n const rows = await driver.all<{\n id: string;\n function_name: string;\n args_json: string;\n status: string;\n run_at: number;\n created_at: number;\n updated_at: number;\n recurring_name: string | null;\n schedule_json: string | null;\n timezone: string | null;\n misfire_policy: string;\n last_run_at: number | null;\n window_ms: number | null;\n }>(`SELECT * FROM \"_scheduled_functions\" ORDER BY run_at DESC LIMIT 200`);\n\n return rows.map((row) => {\n const schedule = safeReadRecurringSchedule(row.schedule_json);\n const scheduleLabel = schedule\n ? formatScheduleLabel(schedule)\n : undefined;\n const functionComponent = parseCanonicalComponentFunctionName(\n row.function_name\n );\n const idComponent = parseComponentScopedIdentifier(row.id);\n return {\n id: row.id,\n functionName: row.function_name,\n owner:\n functionComponent || idComponent\n ? (\"component\" as const)\n : (\"root\" as const),\n ...(functionComponent\n ? {\n componentPath: functionComponent.componentPath\n }\n : idComponent\n ? {\n componentPath: idComponent.componentPath\n }\n : {}),\n args: JSON.parse(row.args_json) as Record<string, unknown>,\n scheduledAt: row.created_at,\n runAt: row.run_at,\n status: mapJobStatus(row.status),\n ...(row.status === \"completed\" || row.status === \"failed\"\n ? { completedAt: row.updated_at }\n : {}),\n ...(row.recurring_name ? { recurringName: row.recurring_name } : {}),\n ...(schedule ? { schedule } : {}),\n ...(scheduleLabel\n ? { scheduleLabel, cronSchedule: scheduleLabel }\n : {}),\n ...(row.timezone ? { timezone: row.timezone } : {}),\n ...(row.last_run_at !== null ? { lastRunAt: row.last_run_at } : {}),\n ...(row.updated_at ? { updatedAt: row.updated_at } : {}),\n misfirePolicy: readMisfirePolicy(row.misfire_policy, row.window_ms)\n };\n });\n } catch {\n return [];\n }\n}\n\nfunction listFunctions(\n functions: SyncoreRuntimeOptions<SyncoreDataModel>[\"functions\"]\n) {\n return Object.entries(functions)\n .filter(\n (entry): entry is [string, NonNullable<(typeof entry)[1]>] =>\n entry[1] !== undefined\n )\n .map(([name, fn]) => {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n const descriptor: {\n name: string;\n type: \"query\" | \"mutation\" | \"action\";\n file?: string;\n modulePath?: string;\n namespace?: string;\n metadataAvailable?: boolean;\n owner?: \"root\" | \"component\";\n componentPath?: string;\n visibility?: \"public\" | \"internal\";\n localName?: string;\n args?: Record<string, unknown>;\n } = {\n name,\n type: fn.kind,\n owner: componentFunction ? \"component\" : \"root\",\n namespace: inferFunctionNamespace(name),\n metadataAvailable: componentFunction !== null || name.includes(\":\"),\n ...(componentFunction\n ? {\n file: `components/${componentFunction.componentPath}`,\n modulePath: componentFunction.componentPath,\n componentPath: componentFunction.componentPath,\n visibility: componentFunction.visibility,\n localName: componentFunction.localName\n }\n : inferFileFromFunctionName(name)\n ? {\n file: inferFileFromFunctionName(name),\n modulePath: inferFunctionNamespace(name)\n }\n : {})\n };\n const argsDesc = describeValidator(fn.argsValidator);\n if (argsDesc.kind === \"object\") {\n descriptor.args = argsDesc.shape as Record<string, unknown>;\n }\n return descriptor;\n });\n}\n\nfunction inferFileFromFunctionName(name: string): string {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n if (componentFunction) {\n return `components/${componentFunction.componentPath}`;\n }\n const parts = name.split(\":\");\n if (parts.length > 1) {\n return `${parts[0]}.ts`;\n }\n return \"\";\n}\n\nfunction inferFunctionNamespace(name: string): string {\n const componentFunction = parseCanonicalComponentFunctionName(name);\n if (componentFunction) {\n return componentFunction.componentPath;\n }\n if (name.includes(\":\")) {\n return name.split(\":\")[0] ?? \"root\";\n }\n if (name.includes(\"/\")) {\n return name.split(\"/\")[0] ?? \"root\";\n }\n return \"root\";\n}\n\nfunction normalizeFilterValue(filter: {\n operator: string;\n value: unknown;\n}): unknown {\n const value = coerceFilterValue(filter.value);\n switch (filter.operator) {\n case \"contains\":\n return `%${String(value)}%`;\n case \"startsWith\":\n return `${String(value)}%`;\n default:\n return value;\n }\n}\n\nfunction filterToSql(filter: { field: string; operator: string }): string {\n const operator = filterOperatorToSql(filter.operator);\n if (filter.field === \"_id\") {\n return `_id ${operator} ?`;\n }\n if (filter.field === \"_creationTime\") {\n return `_creationTime ${operator} ?`;\n }\n return `json_extract(_json, ${JSON.stringify(`$.${filter.field}`)}) ${operator} ?`;\n}\n\nfunction coerceFilterValue(value: unknown): unknown {\n if (typeof value !== \"string\") {\n return value;\n }\n const trimmed = value.trim();\n if (trimmed === \"true\") return true;\n if (trimmed === \"false\") return false;\n if (trimmed === \"null\") return null;\n if (/^-?\\d+(?:\\.\\d+)?$/.test(trimmed)) {\n const numberValue = Number(trimmed);\n if (Number.isFinite(numberValue)) {\n return numberValue;\n }\n }\n return value;\n}\n\nfunction filterOperatorToSql(operator: string): string {\n switch (operator) {\n case \"eq\":\n return \"=\";\n case \"neq\":\n return \"!=\";\n case \"gt\":\n return \">\";\n case \"gte\":\n return \">=\";\n case \"lt\":\n return \"<\";\n case \"lte\":\n return \"<=\";\n case \"contains\":\n case \"startsWith\":\n return \"LIKE\";\n default:\n return \"=\";\n }\n}\n\nfunction mapJobStatus(\n status: string\n): \"pending\" | \"running\" | \"completed\" | \"failed\" | \"cancelled\" {\n switch (status) {\n case \"scheduled\":\n return \"pending\";\n case \"completed\":\n return \"completed\";\n case \"failed\":\n return \"failed\";\n case \"cancelled\":\n case \"skipped\":\n return \"cancelled\";\n default:\n return \"pending\";\n }\n}\n\nfunction formatScheduleLabel(schedule: SchedulerRecurringSchedule): string {\n switch (schedule.type) {\n case \"interval\": {\n const parts: string[] = [];\n if (schedule.hours) {\n parts.push(`${schedule.hours}h`);\n }\n if (schedule.minutes) {\n parts.push(`${schedule.minutes}m`);\n }\n if (schedule.seconds) {\n parts.push(`${schedule.seconds}s`);\n }\n return parts.length > 0 ? `Every ${parts.join(\" \")}` : \"Recurring\";\n }\n case \"daily\":\n return `Daily ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n case \"weekly\":\n return `Weekly ${capitalize(schedule.dayOfWeek)} ${padNumber(schedule.hour)}:${padNumber(schedule.minute)}${schedule.timezone ? ` ${schedule.timezone}` : \"\"}`;\n default:\n return \"Recurring\";\n }\n}\n\nfunction readMisfirePolicy(\n type: string,\n windowMs: number | null\n): SchedulerMisfirePolicy {\n if (type === \"windowed\") {\n return {\n type,\n windowMs: windowMs ?? 0\n };\n }\n if (type === \"skip\" || type === \"run_once_if_missed\") {\n return { type };\n }\n return { type: \"catch_up\" };\n}\n\nfunction padNumber(value: number): string {\n return String(value).padStart(2, \"0\");\n}\n\nfunction capitalize(value: string): string {\n return value.slice(0, 1).toUpperCase() + value.slice(1);\n}\n\nasync function runDevtoolsMutation<TResult>(\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>,\n callback: (ctx: {\n db: {\n insert(\n tableName: string,\n value: Record<string, unknown>\n ): Promise<string>;\n patch(\n tableName: string,\n id: string,\n value: Record<string, unknown>\n ): Promise<void>;\n delete(tableName: string, id: string): Promise<void>;\n };\n }) => Promise<TResult>,\n meta?: { origin?: \"dashboard\" }\n): Promise<TResult> {\n return admin.runDevtoolsMutation(callback as never, meta);\n}\n\nfunction notifyDataMutationScopes(\n admin: SyncoreRuntimeAdmin<SyncoreDataModel>,\n tableName: string\n): void {\n admin.notifyDevtoolsScopes([\"schema.tables\", `table:${tableName}`]);\n}\n\nfunction normalizeStorageLimit(limit: number | undefined): number {\n return Math.min(Math.max(limit ?? 100, 1), 500);\n}\n\nfunction bytesToBase64(bytes: Uint8Array): string {\n const binaryChunkSize = 0x8000;\n let binary = \"\";\n for (let offset = 0; offset < bytes.length; offset += binaryChunkSize) {\n const chunk = bytes.slice(offset, offset + binaryChunkSize);\n binary += String.fromCharCode(...chunk);\n }\n if (typeof btoa === \"function\") {\n return btoa(binary);\n }\n const buffer = globalThis as typeof globalThis & {\n Buffer?: {\n from(input: Uint8Array): { toString(encoding: \"base64\"): string };\n };\n };\n if (buffer.Buffer) {\n return buffer.Buffer.from(bytes).toString(\"base64\");\n }\n throw new Error(\"Base64 encoding is not available in this environment.\");\n}\n\nfunction scopesForSubscription(\n payload: SyncoreDevtoolsSubscriptionPayload,\n sql?: DevtoolsSqlSupport\n): Set<DevtoolsInvalidationScope> {\n switch (payload.kind) {\n case \"runtime.summary\":\n return new Set([\"runtime.summary\"]);\n case \"runtime.activeQueries\":\n return new Set([\"runtime.activeQueries\"]);\n case \"fn.watch\":\n return new Set([\"all\"]);\n case \"schema.tables\":\n return new Set([\"schema.tables\"]);\n case \"data.table\":\n return new Set<DevtoolsInvalidationScope>([`table:${payload.table}`]);\n case \"scheduler.jobs\":\n return new Set([\"scheduler.jobs\"]);\n case \"functions.catalog\":\n return new Set([\"all\"]);\n case \"storage.list\":\n return new Set([\"storage.objects\"]);\n case \"sql.watch\": {\n try {\n const sqlSupport = requireDevtoolsSqlSupport(sql);\n const analysis = sqlSupport.analyzeSqlStatement(payload.query);\n sqlSupport.ensureSqlMode(analysis, \"watch\");\n return new Set<DevtoolsInvalidationScope>(analysis.observedScopes);\n } catch {\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n }\n default:\n return new Set<DevtoolsInvalidationScope>([\"all\"]);\n }\n}\n\nfunction intersects(\n a: Set<DevtoolsInvalidationScope>,\n b: Set<DevtoolsInvalidationScope>\n): boolean {\n if (a.has(\"all\") || b.has(\"all\")) {\n return true;\n }\n for (const value of a) {\n if (b.has(value)) {\n return true;\n }\n }\n return false;\n}\n\nfunction requireDevtoolsSqlSupport(\n sql?: DevtoolsSqlSupport\n): DevtoolsSqlSupport {\n if (!sql) {\n throw new Error(\"SQL Console is not available for this runtime.\");\n }\n return sql;\n}\n"],"mappings":"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"}
|
|
@@ -144,10 +144,10 @@ type FunctionReferenceFor<TDefinition> = FunctionKindFromDefinition<TDefinition>
|
|
|
144
144
|
* Configuration object accepted by {@link query}, {@link mutation}, and
|
|
145
145
|
* {@link action}.
|
|
146
146
|
*
|
|
147
|
-
* @
|
|
147
|
+
* @typeParam TContext - The execution context injected by the runtime
|
|
148
148
|
* (`QueryCtx`, `MutationCtx`, or `ActionCtx`).
|
|
149
|
-
* @
|
|
150
|
-
* @
|
|
149
|
+
* @typeParam TArgs - The validated argument shape after parsing.
|
|
150
|
+
* @typeParam TResult - The return type of the handler.
|
|
151
151
|
*/
|
|
152
152
|
interface FunctionConfig<TContext, TArgs, TResult> {
|
|
153
153
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"functions.mjs","names":[],"sources":["../../src/runtime/functions.ts"],"sourcesContent":["import {\n ensureObjectValidator,\n isValidator,\n type Infer,\n type Validator,\n type ValidatorMap\n} from \"@syncore/schema\";\n\n/**\n * Discriminates the three function kinds Syncore supports.\n *\n * - `\"query\"` — read-only handler that observes local state. Syncore re-runs it\n * automatically whenever any table it read changes, keeping connected clients\n * up to date without manual cache invalidation.\n * - `\"mutation\"` — transactional write handler. Runs inside a single SQLite\n * transaction and automatically invalidates every query that read the tables it\n * modified.\n * - `\"action\"` — arbitrary async handler that may call external services, invoke\n * other Syncore functions, or schedule deferred work. Actions do not run inside\n * a transaction and cannot directly write to the database — they must delegate\n * writes to mutations.\n */\nexport type SyncoreFunctionKind = \"query\" | \"mutation\" | \"action\";\n\n/**\n * Convenience type representing a function that accepts no arguments.\n *\n * Used as the default `TArgs` for {@link FunctionReference} so that calling\n * `client.query(api.tasks.list)` without a second argument is type-safe.\n */\nexport type EmptyArgs = Record<never, never>;\n\n/**\n * A typed, serialisable handle to a registered Syncore function.\n *\n * `FunctionReference` objects are how you address Syncore functions across the\n * entire API surface: hooks, client calls, scheduler helpers, and `ctx.runQuery`\n * / `ctx.runMutation` inside other functions all accept them. They carry the\n * function's kind and its fully-inferred arg / result types at the type level,\n * but at runtime they hold only the function's string name, making them safe to\n * pass across IPC channels.\n *\n * In almost every case you get references from the auto-generated `api` object\n * rather than constructing them manually:\n *\n * ```ts\n * import { api } from \"../syncore/_generated/api\";\n *\n * // In a React component:\n * const tasks = useQuery(api.tasks.list);\n *\n * // Inside a mutation that calls another function:\n * const id = await ctx.runMutation(api.tasks.create, { title: \"Buy milk\" });\n *\n * // Scheduling deferred work:\n * await ctx.scheduler.runAfter(60_000, api.notifications.send, { userId });\n * ```\n *\n * When you need to type a parameter that accepts a function reference, derive\n * the correct type with {@link FunctionReferenceFor}.\n */\nexport interface FunctionReference<\n TKind extends SyncoreFunctionKind = SyncoreFunctionKind,\n TArgs = EmptyArgs,\n TResult = unknown\n> {\n kind: TKind;\n name: string;\n readonly __args?: TArgs;\n readonly __result?: TResult;\n}\n\n/**\n * The full definition of a Syncore function as produced by {@link query},\n * {@link mutation}, or {@link action}.\n *\n * This is the value you export from files inside `syncore/functions/`. Syncore\n * stores it in the function registry and uses the validators at runtime to parse\n * incoming arguments and optionally validate return values.\n *\n * You rarely reference this type directly in application code — use\n * {@link FunctionReferenceFor} when you need a type-level handle, or the\n * generated `api` object for runtime usage.\n */\nexport interface SyncoreFunctionDefinition<\n TKind extends SyncoreFunctionKind,\n TContext,\n TArgs,\n TResult\n> {\n kind: TKind;\n argsValidator: Validator<TArgs, TArgs, string>;\n returnsValidator?: Validator<TResult, TResult, string>;\n handler: (ctx: TContext, args: TArgs) => Promise<TResult> | TResult;\n}\n\n/**\n * Extracts the argument type from a {@link FunctionReference}.\n *\n * Useful when writing generic helpers that accept a function reference and need\n * to type the corresponding arguments:\n *\n * ```ts\n * async function run<TRef extends FunctionReference<\"mutation\">>(\n * ref: TRef,\n * args: FunctionArgs<TRef>\n * ) { ... }\n * ```\n */\nexport type FunctionArgs<TReference> =\n TReference extends FunctionReference<\n SyncoreFunctionKind,\n infer TArgs,\n unknown\n >\n ? TArgs\n : never;\n\n/**\n * Extracts the result type from a {@link FunctionReference}.\n *\n * ```ts\n * type TaskList = FunctionResult<typeof api.tasks.list>; // Task[]\n * ```\n */\nexport type FunctionResult<TReference> =\n TReference extends FunctionReference<\n SyncoreFunctionKind,\n unknown,\n infer TResult\n >\n ? TResult\n : never;\n\n/**\n * Extracts the {@link SyncoreFunctionKind} from a function definition object.\n *\n * Used internally by {@link FunctionReferenceFor} and the code generator.\n */\nexport type FunctionKindFromDefinition<TDefinition> = TDefinition extends {\n kind: infer TKind;\n}\n ? Extract<TKind, SyncoreFunctionKind>\n : never;\n\n/**\n * Extracts the validated argument type from a function definition object.\n *\n * Used internally by {@link FunctionReferenceFor} and the code generator.\n */\nexport type FunctionArgsFromDefinition<TDefinition> = TDefinition extends {\n argsValidator: Validator<infer TArgs, unknown, string>;\n}\n ? TArgs\n : never;\n\n/**\n * Extracts the return type from a function definition object.\n *\n * Used internally by {@link FunctionReferenceFor} and the code generator.\n */\nexport type FunctionResultFromDefinition<TDefinition> = TDefinition extends {\n returnsValidator?: Validator<infer TResult, unknown, string>;\n}\n ? TResult\n : never;\n\n/**\n * Derives a fully-typed {@link FunctionReference} from a function definition.\n *\n * Use this when you need a typed reference to a function you have imported\n * directly — for example when writing test helpers or custom wrappers:\n *\n * ```ts\n * import type { create } from \"../syncore/functions/tasks\";\n *\n * type CreateRef = FunctionReferenceFor<typeof create>;\n * // FunctionReference<\"mutation\", { title: string }, string>\n * ```\n *\n * The generated `api` object already exposes `FunctionReferenceFor`-derived\n * values for every exported function, so you rarely need this in application\n * code.\n */\nexport type FunctionReferenceFor<TDefinition> =\n FunctionKindFromDefinition<TDefinition> extends never\n ? never\n : FunctionReference<\n FunctionKindFromDefinition<TDefinition>,\n FunctionArgsFromDefinition<TDefinition>,\n FunctionResultFromDefinition<TDefinition>\n >;\n\n/**\n * Configuration object accepted by {@link query}, {@link mutation}, and\n * {@link action}.\n *\n * @template TContext - The execution context injected by the runtime\n * (`QueryCtx`, `MutationCtx`, or `ActionCtx`).\n * @template TArgs - The validated argument shape after parsing.\n * @template TResult - The return type of the handler.\n */\nexport interface FunctionConfig<TContext, TArgs, TResult> {\n /**\n * Schema that validates and types the arguments this function accepts.\n *\n * You can pass either a single `Validator` or a plain object (\"validator map\")\n * whose keys map to individual field validators — both forms are equivalent:\n *\n * ```ts\n * // Validator map (most common)\n * args: { title: s.string(), done: s.boolean() }\n *\n * // Single object validator (same result)\n * args: s.object({ title: s.string(), done: s.boolean() })\n * ```\n */\n args: Validator<TArgs, TArgs, string> | ValidatorMap;\n\n /**\n * Optional schema that validates the value returned by the handler.\n *\n * When provided, Syncore validates the return value before sending it to\n * clients. Omitting `returns` disables return-value validation but does not\n * affect the TypeScript return type inferred from the handler.\n */\n returns?: Validator<TResult, TResult, string>;\n\n /**\n * The function body. Receives a typed context object and the validated\n * arguments and must return (or resolve to) the function's result.\n */\n handler: (ctx: TContext, args: TArgs) => Promise<TResult> | TResult;\n}\n\nexport type InferArgs<\n TArgs extends Validator<unknown, unknown, string> | ValidatorMap\n> = TArgs extends Validator<unknown, unknown, string>\n ? Infer<TArgs>\n : TArgs extends ValidatorMap\n ? {\n [TKey in keyof TArgs]: Infer<TArgs[TKey]>;\n }\n : never;\n\nfunction createFunctionDefinition<\n TKind extends SyncoreFunctionKind,\n TContext,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap,\n TResult\n>(\n kind: TKind,\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<TKind, TContext, InferArgs<TArgsShape>, TResult> {\n const argsValidator = isValidator(config.args)\n ? (config.args as Validator<\n InferArgs<TArgsShape>,\n InferArgs<TArgsShape>,\n string\n >)\n : (ensureObjectValidator(config.args as ValidatorMap) as unknown as Validator<\n InferArgs<TArgsShape>,\n InferArgs<TArgsShape>,\n string\n >);\n\n return {\n kind,\n argsValidator,\n ...(config.returns ? { returnsValidator: config.returns } : {}),\n handler: config.handler\n };\n}\n\n/**\n * Define a Syncore query.\n *\n * Queries are the read layer of Syncore. They run inside a read-only database\n * transaction, may call other queries via `ctx.runQuery`, and are\n * **automatically reactive**: whenever a table that a query read changes,\n * every active subscription to that query is invalidated and re-executed.\n *\n * Export one query per named export in a file under `syncore/functions/`.\n * After running `npx syncorejs codegen` a typed reference will be available\n * on the generated `api` object.\n *\n * ```ts\n * // syncore/functions/tasks.ts\n * import { query } from \"syncorejs\";\n * import { s } from \"syncorejs\";\n * import type { QueryCtx } from \"../_generated/server\";\n *\n * export const list = query({\n * args: { projectId: s.optional(s.id(\"projects\")) },\n * handler: async (ctx: QueryCtx, { projectId }) => {\n * return ctx.db\n * .query(\"tasks\")\n * .withIndex(\"by_project\", (q) =>\n * projectId ? q.eq(\"projectId\", projectId) : q\n * )\n * .collect();\n * },\n * });\n * ```\n *\n * @param config - The {@link FunctionConfig} describing the args schema,\n * optional return-value schema, and handler function.\n */\nexport function query<\n TContext = unknown,\n TValidator extends Validator<unknown, unknown, string> = Validator<\n unknown,\n unknown,\n string\n >,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"query\", TContext, Infer<TValidator>, TResult>;\nexport function query<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\"query\", TContext, InferArgs<TArgsShape>, TResult>;\nexport function query<\n TContext = unknown,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap =\n ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"query\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"query\", config);\n}\n\n/**\n * Define a Syncore mutation.\n *\n * Mutations are the write layer of Syncore. Every mutation runs inside an\n * **atomic SQLite transaction**: if the handler throws, all writes are rolled\n * back. After a successful commit Syncore automatically invalidates and\n * re-executes every active query whose read-set overlaps the changed tables.\n *\n * Mutations receive a {@link MutationCtx}, which extends the query context\n * with `ctx.db` write methods and a `ctx.scheduler` for scheduling deferred\n * work.\n *\n * ```ts\n * // syncore/functions/tasks.ts\n * import { mutation } from \"syncorejs\";\n * import { s } from \"syncorejs\";\n * import type { MutationCtx } from \"../_generated/server\";\n *\n * export const create = mutation({\n * args: { title: s.string() },\n * returns: s.id(\"tasks\"),\n * handler: async (ctx: MutationCtx, { title }) => {\n * return ctx.db.insert(\"tasks\", {\n * title,\n * status: \"todo\",\n * projectId: null,\n * });\n * },\n * });\n * ```\n *\n * @param config - The {@link FunctionConfig} describing the args schema,\n * optional return-value schema, and handler function.\n */\nexport function mutation<\n TContext = unknown,\n TValidator extends Validator<unknown, unknown, string> = Validator<\n unknown,\n unknown,\n string\n >,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"mutation\", TContext, Infer<TValidator>, TResult>;\nexport function mutation<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"mutation\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n>;\nexport function mutation<\n TContext = unknown,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap =\n ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"mutation\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"mutation\", config);\n}\n\n/**\n * Define a Syncore action.\n *\n * Actions are the escape hatch for work that goes beyond reading and writing\n * the local database. They run **outside** of any transaction, which means\n * they can:\n *\n * - Call external APIs (HTTP, WebSocket, etc.)\n * - Perform CPU-intensive or long-running work\n * - Invoke other Syncore functions via `ctx.runMutation` / `ctx.runQuery`\n * - Schedule deferred jobs via `ctx.scheduler`\n *\n * Because actions are non-transactional, database writes must be delegated to\n * a mutation. This keeps write atomicity in mutations while actions handle\n * side effects.\n *\n * ```ts\n * // syncore/functions/ai.ts\n * import { action } from \"syncorejs\";\n * import { s } from \"syncorejs\";\n * import type { ActionCtx } from \"../_generated/server\";\n * import { api } from \"../_generated/api\";\n *\n * export const summarise = action({\n * args: { taskId: s.id(\"tasks\") },\n * handler: async (ctx: ActionCtx, { taskId }) => {\n * const task = await ctx.runQuery(api.tasks.get, { id: taskId });\n * const summary = await fetchSummaryFromApi(task.title);\n * await ctx.runMutation(api.tasks.setSummary, { taskId, summary });\n * },\n * });\n * ```\n *\n * @param config - The {@link FunctionConfig} describing the args schema,\n * optional return-value schema, and handler function.\n */\nexport function action<\n TContext = unknown,\n TValidator extends Validator<unknown, unknown, string> = Validator<\n unknown,\n unknown,\n string\n >,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"action\", TContext, Infer<TValidator>, TResult>;\nexport function action<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"action\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n>;\nexport function action<\n TContext = unknown,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap =\n ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"action\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"action\", config);\n}\n\n/**\n * Runs a recurring job repeatedly at a fixed time interval.\n *\n * At least one of `seconds`, `minutes`, or `hours` must be provided; multiple\n * fields are additive (e.g. `{ hours: 1, minutes: 30 }` fires every 90 minutes).\n *\n * ```ts\n * crons.interval(\"refresh-cache\", { minutes: 15 }, api.cache.refresh);\n * ```\n */\nexport interface RecurringIntervalSchedule {\n type: \"interval\";\n /** Number of seconds to add to the interval. */\n seconds?: number;\n /** Number of minutes to add to the interval. */\n minutes?: number;\n /** Number of hours to add to the interval. */\n hours?: number;\n}\n\n/**\n * Runs a recurring job once a day at a specific wall-clock time.\n *\n * ```ts\n * crons.daily(\"nightly-report\", { hour: 2, minute: 0 }, api.reports.generate);\n * ```\n */\nexport interface RecurringDailySchedule {\n type: \"daily\";\n /** Hour of day to run (0–23, in UTC unless `timezone` is provided). */\n hour: number;\n /** Minute of hour to run (0–59). */\n minute: number;\n /**\n * IANA timezone name (e.g. `\"America/New_York\"`). Defaults to UTC when\n * omitted.\n */\n timezone?: string;\n}\n\n/**\n * Runs a recurring job once a week on a specific day and time.\n *\n * ```ts\n * crons.weekly(\n * \"weekly-digest\",\n * { dayOfWeek: \"monday\", hour: 9, minute: 0, timezone: \"Europe/London\" },\n * api.email.weeklyDigest\n * );\n * ```\n */\nexport interface RecurringWeeklySchedule {\n type: \"weekly\";\n /** Day of the week on which to fire. */\n dayOfWeek:\n | \"sunday\"\n | \"monday\"\n | \"tuesday\"\n | \"wednesday\"\n | \"thursday\"\n | \"friday\"\n | \"saturday\";\n /** Hour of day to run (0–23, in UTC unless `timezone` is provided). */\n hour: number;\n /** Minute of hour to run (0–59). */\n minute: number;\n /**\n * IANA timezone name (e.g. `\"America/New_York\"`). Defaults to UTC when\n * omitted.\n */\n timezone?: string;\n}\n\n/**\n * Union of all supported recurring-schedule shapes.\n *\n * Pass this (or one of its members) to {@link RecurringJobDefinition.schedule}\n * or to the fluent helpers on {@link CronJobs}.\n */\nexport type RecurringSchedule =\n | RecurringIntervalSchedule\n | RecurringDailySchedule\n | RecurringWeeklySchedule;\n\n/**\n * Determines how the scheduler reacts when a job run is missed (e.g. because\n * the runtime was offline when the job was supposed to fire).\n *\n * - `\"catch_up\"` — Run the job once for every missed execution window. Use for\n * jobs where every run matters (e.g. per-minute metrics collection).\n * - `\"skip\"` — Skip all missed runs and resume on the next scheduled tick.\n * Safe default when running the job twice in quick succession would be\n * harmful.\n * - `\"run_once_if_missed\"` — If any runs were missed, execute the job exactly\n * once to “catch up”, then continue on the normal schedule.\n * - `\"windowed\"` — Catch up, but only within a specific time window. Missed\n * runs older than `windowMs` milliseconds are discarded.\n *\n * @example\n * ```ts\n * const policy: MisfirePolicy = { type: \"windowed\", windowMs: 5 * 60_000 };\n * ```\n */\nexport type MisfirePolicy =\n | { type: \"catch_up\" }\n | { type: \"skip\" }\n | { type: \"run_once_if_missed\" }\n | { type: \"windowed\"; windowMs: number };\n\n/**\n * A single entry in the recurring-job registry.\n *\n * You can construct these manually and pass them to `scheduler.recurringJobs`,\n * but the fluent {@link CronJobs} builder is usually more readable.\n */\nexport interface RecurringJobDefinition {\n /** Unique name used to identify this job in the scheduler and devtools UI. */\n name: string;\n /** When and how often this job should run. */\n schedule: RecurringSchedule;\n /** The function to invoke. Must be a mutation or action reference. */\n function: FunctionReference<\"mutation\" | \"action\">;\n /** Arguments forwarded to the function on every invocation. */\n args: Record<string, unknown>;\n /** How to handle missed executions. */\n misfirePolicy: MisfirePolicy;\n}\n\n/**\n * Fluent builder for declaring the recurring (cron) jobs of a Syncore app.\n *\n * Instantiate with {@link cronJobs} and chain calls to `.interval()`, `.daily()`,\n * or `.weekly()`. Pass the resulting instance's `.jobs` array to\n * `scheduler.recurringJobs` in your runtime options.\n *\n * ```ts\n * // syncore/crons.ts\n * import { cronJobs } from \"syncorejs\";\n * import { api } from \"./_generated/api\";\n *\n * const crons = cronJobs();\n *\n * crons.interval(\"refresh-feed\", { minutes: 10 }, api.feed.refresh);\n * crons.daily(\"send-digest\", { hour: 8, minute: 0 }, api.email.digest);\n * crons.weekly(\"weekly-cleanup\", { dayOfWeek: \"sunday\", hour: 3, minute: 0 }, api.db.vacuum);\n *\n * export default crons;\n * ```\n *\n * Then in your runtime setup:\n * ```ts\n * createNodeSyncoreRuntime({\n * ...,\n * scheduler: { recurringJobs: crons.jobs },\n * });\n * ```\n */\nexport class CronJobs {\n readonly jobs: RecurringJobDefinition[] = [];\n\n /**\n * Register a job that fires repeatedly at a fixed time interval.\n *\n * @param name - Unique identifier for this job.\n * @param schedule - Interval fields (`seconds`, `minutes`, `hours`).\n * @param functionReference - Mutation or action to invoke.\n * @param args - Arguments forwarded on every invocation.\n * @param misfirePolicy - How to handle runs missed while the runtime was\n * offline. Defaults to `{ type: \"catch_up\" }`.\n */\n interval(\n name: string,\n schedule: Omit<RecurringIntervalSchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"interval\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n\n /**\n * Register a job that fires once a day at a given wall-clock time.\n *\n * @param name - Unique identifier for this job.\n * @param schedule - `hour` (0–23), `minute` (0–59), optional `timezone`.\n * @param functionReference - Mutation or action to invoke.\n * @param args - Arguments forwarded on every invocation.\n * @param misfirePolicy - How to handle runs missed while the runtime was\n * offline. Defaults to `{ type: \"catch_up\" }`.\n */\n daily(\n name: string,\n schedule: Omit<RecurringDailySchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"daily\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n\n /**\n * Register a job that fires once a week on a given day and time.\n *\n * @param name - Unique identifier for this job.\n * @param schedule - `dayOfWeek`, `hour` (0–23), `minute` (0–59),\n * optional `timezone`.\n * @param functionReference - Mutation or action to invoke.\n * @param args - Arguments forwarded on every invocation.\n * @param misfirePolicy - How to handle runs missed while the runtime was\n * offline. Defaults to `{ type: \"catch_up\" }`.\n */\n weekly(\n name: string,\n schedule: Omit<RecurringWeeklySchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"weekly\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n}\n\n/**\n * Create a new {@link CronJobs} builder for declaring recurring Syncore jobs.\n *\n * @example\n * ```ts\n * // syncore/crons.ts\n * import { cronJobs } from \"syncorejs\";\n * import { api } from \"./_generated/api\";\n *\n * const crons = cronJobs();\n * crons.interval(\"sync\", { minutes: 5 }, api.sync.run);\n * export default crons;\n * ```\n */\nexport function cronJobs(): CronJobs {\n return new CronJobs();\n}\n"],"mappings":";;AAqPA,SAAS,yBAMP,MACA,QAG4E;CAa5E,OAAO;EACL;EACA,eAdoB,YAAY,OAAO,IAAI,IACxC,OAAO,OAKP,sBAAsB,OAAO,IAAoB;EASpD,GAAI,OAAO,UAAU,EAAE,kBAAkB,OAAO,QAAQ,IAAI,CAAC;EAC7D,SAAS,OAAO;CAClB;AACF;AA0DA,SAAgB,MAMd,QAQA;CACA,OAAO,yBAAyB,SAAS,MAAM;AACjD;AA+DA,SAAgB,SAMd,QAQA;CACA,OAAO,yBAAyB,YAAY,MAAM;AACpD;AAiEA,SAAgB,OAMd,QAQA;CACA,OAAO,yBAAyB,UAAU,MAAM;AAClD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+JA,IAAa,WAAb,MAAsB;CACpB,OAA0C,CAAC;;;;;;;;;;;CAY3C,SACE,MACA,UACA,mBACA,OAAgC,CAAC,GACjC,gBAA+B,EAAE,MAAM,WAAW,GAC5C;EACN,KAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAY,GAAG;GAAS;GAC1C,UAAU;GACV;GACA;EACF,CAAC;EACD,OAAO;CACT;;;;;;;;;;;CAYA,MACE,MACA,UACA,mBACA,OAAgC,CAAC,GACjC,gBAA+B,EAAE,MAAM,WAAW,GAC5C;EACN,KAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAS,GAAG;GAAS;GACvC,UAAU;GACV;GACA;EACF,CAAC;EACD,OAAO;CACT;;;;;;;;;;;;CAaA,OACE,MACA,UACA,mBACA,OAAgC,CAAC,GACjC,gBAA+B,EAAE,MAAM,WAAW,GAC5C;EACN,KAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAU,GAAG;GAAS;GACxC,UAAU;GACV;GACA;EACF,CAAC;EACD,OAAO;CACT;AACF;;;;;;;;;;;;;;;AAgBA,SAAgB,WAAqB;CACnC,OAAO,IAAI,SAAS;AACtB"}
|
|
1
|
+
{"version":3,"file":"functions.mjs","names":[],"sources":["../../src/runtime/functions.ts"],"sourcesContent":["import {\n ensureObjectValidator,\n isValidator,\n type Infer,\n type Validator,\n type ValidatorMap\n} from \"@syncore/schema\";\n\n/**\n * Discriminates the three function kinds Syncore supports.\n *\n * - `\"query\"` — read-only handler that observes local state. Syncore re-runs it\n * automatically whenever any table it read changes, keeping connected clients\n * up to date without manual cache invalidation.\n * - `\"mutation\"` — transactional write handler. Runs inside a single SQLite\n * transaction and automatically invalidates every query that read the tables it\n * modified.\n * - `\"action\"` — arbitrary async handler that may call external services, invoke\n * other Syncore functions, or schedule deferred work. Actions do not run inside\n * a transaction and cannot directly write to the database — they must delegate\n * writes to mutations.\n */\nexport type SyncoreFunctionKind = \"query\" | \"mutation\" | \"action\";\n\n/**\n * Convenience type representing a function that accepts no arguments.\n *\n * Used as the default `TArgs` for {@link FunctionReference} so that calling\n * `client.query(api.tasks.list)` without a second argument is type-safe.\n */\nexport type EmptyArgs = Record<never, never>;\n\n/**\n * A typed, serialisable handle to a registered Syncore function.\n *\n * `FunctionReference` objects are how you address Syncore functions across the\n * entire API surface: hooks, client calls, scheduler helpers, and `ctx.runQuery`\n * / `ctx.runMutation` inside other functions all accept them. They carry the\n * function's kind and its fully-inferred arg / result types at the type level,\n * but at runtime they hold only the function's string name, making them safe to\n * pass across IPC channels.\n *\n * In almost every case you get references from the auto-generated `api` object\n * rather than constructing them manually:\n *\n * ```ts\n * import { api } from \"../syncore/_generated/api\";\n *\n * // In a React component:\n * const tasks = useQuery(api.tasks.list);\n *\n * // Inside a mutation that calls another function:\n * const id = await ctx.runMutation(api.tasks.create, { title: \"Buy milk\" });\n *\n * // Scheduling deferred work:\n * await ctx.scheduler.runAfter(60_000, api.notifications.send, { userId });\n * ```\n *\n * When you need to type a parameter that accepts a function reference, derive\n * the correct type with {@link FunctionReferenceFor}.\n */\nexport interface FunctionReference<\n TKind extends SyncoreFunctionKind = SyncoreFunctionKind,\n TArgs = EmptyArgs,\n TResult = unknown\n> {\n kind: TKind;\n name: string;\n readonly __args?: TArgs;\n readonly __result?: TResult;\n}\n\n/**\n * The full definition of a Syncore function as produced by {@link query},\n * {@link mutation}, or {@link action}.\n *\n * This is the value you export from files inside `syncore/functions/`. Syncore\n * stores it in the function registry and uses the validators at runtime to parse\n * incoming arguments and optionally validate return values.\n *\n * You rarely reference this type directly in application code — use\n * {@link FunctionReferenceFor} when you need a type-level handle, or the\n * generated `api` object for runtime usage.\n */\nexport interface SyncoreFunctionDefinition<\n TKind extends SyncoreFunctionKind,\n TContext,\n TArgs,\n TResult\n> {\n kind: TKind;\n argsValidator: Validator<TArgs, TArgs, string>;\n returnsValidator?: Validator<TResult, TResult, string>;\n handler: (ctx: TContext, args: TArgs) => Promise<TResult> | TResult;\n}\n\n/**\n * Extracts the argument type from a {@link FunctionReference}.\n *\n * Useful when writing generic helpers that accept a function reference and need\n * to type the corresponding arguments:\n *\n * ```ts\n * async function run<TRef extends FunctionReference<\"mutation\">>(\n * ref: TRef,\n * args: FunctionArgs<TRef>\n * ) { ... }\n * ```\n */\nexport type FunctionArgs<TReference> =\n TReference extends FunctionReference<\n SyncoreFunctionKind,\n infer TArgs,\n unknown\n >\n ? TArgs\n : never;\n\n/**\n * Extracts the result type from a {@link FunctionReference}.\n *\n * ```ts\n * type TaskList = FunctionResult<typeof api.tasks.list>; // Task[]\n * ```\n */\nexport type FunctionResult<TReference> =\n TReference extends FunctionReference<\n SyncoreFunctionKind,\n unknown,\n infer TResult\n >\n ? TResult\n : never;\n\n/**\n * Extracts the {@link SyncoreFunctionKind} from a function definition object.\n *\n * Used internally by {@link FunctionReferenceFor} and the code generator.\n */\nexport type FunctionKindFromDefinition<TDefinition> = TDefinition extends {\n kind: infer TKind;\n}\n ? Extract<TKind, SyncoreFunctionKind>\n : never;\n\n/**\n * Extracts the validated argument type from a function definition object.\n *\n * Used internally by {@link FunctionReferenceFor} and the code generator.\n */\nexport type FunctionArgsFromDefinition<TDefinition> = TDefinition extends {\n argsValidator: Validator<infer TArgs, unknown, string>;\n}\n ? TArgs\n : never;\n\n/**\n * Extracts the return type from a function definition object.\n *\n * Used internally by {@link FunctionReferenceFor} and the code generator.\n */\nexport type FunctionResultFromDefinition<TDefinition> = TDefinition extends {\n returnsValidator?: Validator<infer TResult, unknown, string>;\n}\n ? TResult\n : never;\n\n/**\n * Derives a fully-typed {@link FunctionReference} from a function definition.\n *\n * Use this when you need a typed reference to a function you have imported\n * directly — for example when writing test helpers or custom wrappers:\n *\n * ```ts\n * import type { create } from \"../syncore/functions/tasks\";\n *\n * type CreateRef = FunctionReferenceFor<typeof create>;\n * // FunctionReference<\"mutation\", { title: string }, string>\n * ```\n *\n * The generated `api` object already exposes `FunctionReferenceFor`-derived\n * values for every exported function, so you rarely need this in application\n * code.\n */\nexport type FunctionReferenceFor<TDefinition> =\n FunctionKindFromDefinition<TDefinition> extends never\n ? never\n : FunctionReference<\n FunctionKindFromDefinition<TDefinition>,\n FunctionArgsFromDefinition<TDefinition>,\n FunctionResultFromDefinition<TDefinition>\n >;\n\n/**\n * Configuration object accepted by {@link query}, {@link mutation}, and\n * {@link action}.\n *\n * @typeParam TContext - The execution context injected by the runtime\n * (`QueryCtx`, `MutationCtx`, or `ActionCtx`).\n * @typeParam TArgs - The validated argument shape after parsing.\n * @typeParam TResult - The return type of the handler.\n */\nexport interface FunctionConfig<TContext, TArgs, TResult> {\n /**\n * Schema that validates and types the arguments this function accepts.\n *\n * You can pass either a single `Validator` or a plain object (\"validator map\")\n * whose keys map to individual field validators — both forms are equivalent:\n *\n * ```ts\n * // Validator map (most common)\n * args: { title: s.string(), done: s.boolean() }\n *\n * // Single object validator (same result)\n * args: s.object({ title: s.string(), done: s.boolean() })\n * ```\n */\n args: Validator<TArgs, TArgs, string> | ValidatorMap;\n\n /**\n * Optional schema that validates the value returned by the handler.\n *\n * When provided, Syncore validates the return value before sending it to\n * clients. Omitting `returns` disables return-value validation but does not\n * affect the TypeScript return type inferred from the handler.\n */\n returns?: Validator<TResult, TResult, string>;\n\n /**\n * The function body. Receives a typed context object and the validated\n * arguments and must return (or resolve to) the function's result.\n */\n handler: (ctx: TContext, args: TArgs) => Promise<TResult> | TResult;\n}\n\nexport type InferArgs<\n TArgs extends Validator<unknown, unknown, string> | ValidatorMap\n> = TArgs extends Validator<unknown, unknown, string>\n ? Infer<TArgs>\n : TArgs extends ValidatorMap\n ? {\n [TKey in keyof TArgs]: Infer<TArgs[TKey]>;\n }\n : never;\n\nfunction createFunctionDefinition<\n TKind extends SyncoreFunctionKind,\n TContext,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap,\n TResult\n>(\n kind: TKind,\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<TKind, TContext, InferArgs<TArgsShape>, TResult> {\n const argsValidator = isValidator(config.args)\n ? (config.args as Validator<\n InferArgs<TArgsShape>,\n InferArgs<TArgsShape>,\n string\n >)\n : (ensureObjectValidator(config.args as ValidatorMap) as unknown as Validator<\n InferArgs<TArgsShape>,\n InferArgs<TArgsShape>,\n string\n >);\n\n return {\n kind,\n argsValidator,\n ...(config.returns ? { returnsValidator: config.returns } : {}),\n handler: config.handler\n };\n}\n\n/**\n * Define a Syncore query.\n *\n * Queries are the read layer of Syncore. They run inside a read-only database\n * transaction, may call other queries via `ctx.runQuery`, and are\n * **automatically reactive**: whenever a table that a query read changes,\n * every active subscription to that query is invalidated and re-executed.\n *\n * Export one query per named export in a file under `syncore/functions/`.\n * After running `npx syncorejs codegen` a typed reference will be available\n * on the generated `api` object.\n *\n * ```ts\n * // syncore/functions/tasks.ts\n * import { query } from \"syncorejs\";\n * import { s } from \"syncorejs\";\n * import type { QueryCtx } from \"../_generated/server\";\n *\n * export const list = query({\n * args: { projectId: s.optional(s.id(\"projects\")) },\n * handler: async (ctx: QueryCtx, { projectId }) => {\n * return ctx.db\n * .query(\"tasks\")\n * .withIndex(\"by_project\", (q) =>\n * projectId ? q.eq(\"projectId\", projectId) : q\n * )\n * .collect();\n * },\n * });\n * ```\n *\n * @param config - The {@link FunctionConfig} describing the args schema,\n * optional return-value schema, and handler function.\n */\nexport function query<\n TContext = unknown,\n TValidator extends Validator<unknown, unknown, string> = Validator<\n unknown,\n unknown,\n string\n >,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"query\", TContext, Infer<TValidator>, TResult>;\nexport function query<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\"query\", TContext, InferArgs<TArgsShape>, TResult>;\nexport function query<\n TContext = unknown,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap =\n ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"query\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"query\", config);\n}\n\n/**\n * Define a Syncore mutation.\n *\n * Mutations are the write layer of Syncore. Every mutation runs inside an\n * **atomic SQLite transaction**: if the handler throws, all writes are rolled\n * back. After a successful commit Syncore automatically invalidates and\n * re-executes every active query whose read-set overlaps the changed tables.\n *\n * Mutations receive a {@link MutationCtx}, which extends the query context\n * with `ctx.db` write methods and a `ctx.scheduler` for scheduling deferred\n * work.\n *\n * ```ts\n * // syncore/functions/tasks.ts\n * import { mutation } from \"syncorejs\";\n * import { s } from \"syncorejs\";\n * import type { MutationCtx } from \"../_generated/server\";\n *\n * export const create = mutation({\n * args: { title: s.string() },\n * returns: s.id(\"tasks\"),\n * handler: async (ctx: MutationCtx, { title }) => {\n * return ctx.db.insert(\"tasks\", {\n * title,\n * status: \"todo\",\n * projectId: null,\n * });\n * },\n * });\n * ```\n *\n * @param config - The {@link FunctionConfig} describing the args schema,\n * optional return-value schema, and handler function.\n */\nexport function mutation<\n TContext = unknown,\n TValidator extends Validator<unknown, unknown, string> = Validator<\n unknown,\n unknown,\n string\n >,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"mutation\", TContext, Infer<TValidator>, TResult>;\nexport function mutation<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"mutation\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n>;\nexport function mutation<\n TContext = unknown,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap =\n ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"mutation\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"mutation\", config);\n}\n\n/**\n * Define a Syncore action.\n *\n * Actions are the escape hatch for work that goes beyond reading and writing\n * the local database. They run **outside** of any transaction, which means\n * they can:\n *\n * - Call external APIs (HTTP, WebSocket, etc.)\n * - Perform CPU-intensive or long-running work\n * - Invoke other Syncore functions via `ctx.runMutation` / `ctx.runQuery`\n * - Schedule deferred jobs via `ctx.scheduler`\n *\n * Because actions are non-transactional, database writes must be delegated to\n * a mutation. This keeps write atomicity in mutations while actions handle\n * side effects.\n *\n * ```ts\n * // syncore/functions/ai.ts\n * import { action } from \"syncorejs\";\n * import { s } from \"syncorejs\";\n * import type { ActionCtx } from \"../_generated/server\";\n * import { api } from \"../_generated/api\";\n *\n * export const summarise = action({\n * args: { taskId: s.id(\"tasks\") },\n * handler: async (ctx: ActionCtx, { taskId }) => {\n * const task = await ctx.runQuery(api.tasks.get, { id: taskId });\n * const summary = await fetchSummaryFromApi(task.title);\n * await ctx.runMutation(api.tasks.setSummary, { taskId, summary });\n * },\n * });\n * ```\n *\n * @param config - The {@link FunctionConfig} describing the args schema,\n * optional return-value schema, and handler function.\n */\nexport function action<\n TContext = unknown,\n TValidator extends Validator<unknown, unknown, string> = Validator<\n unknown,\n unknown,\n string\n >,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, Infer<TValidator>, TResult> & {\n args: TValidator;\n }\n): SyncoreFunctionDefinition<\"action\", TContext, Infer<TValidator>, TResult>;\nexport function action<\n TContext = unknown,\n TArgsShape extends ValidatorMap = ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"action\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n>;\nexport function action<\n TContext = unknown,\n TArgsShape extends Validator<unknown, unknown, string> | ValidatorMap =\n ValidatorMap,\n TResult = unknown\n>(\n config: FunctionConfig<TContext, InferArgs<TArgsShape>, TResult> & {\n args: TArgsShape;\n }\n): SyncoreFunctionDefinition<\n \"action\",\n TContext,\n InferArgs<TArgsShape>,\n TResult\n> {\n return createFunctionDefinition(\"action\", config);\n}\n\n/**\n * Runs a recurring job repeatedly at a fixed time interval.\n *\n * At least one of `seconds`, `minutes`, or `hours` must be provided; multiple\n * fields are additive (e.g. `{ hours: 1, minutes: 30 }` fires every 90 minutes).\n *\n * ```ts\n * crons.interval(\"refresh-cache\", { minutes: 15 }, api.cache.refresh);\n * ```\n */\nexport interface RecurringIntervalSchedule {\n type: \"interval\";\n /** Number of seconds to add to the interval. */\n seconds?: number;\n /** Number of minutes to add to the interval. */\n minutes?: number;\n /** Number of hours to add to the interval. */\n hours?: number;\n}\n\n/**\n * Runs a recurring job once a day at a specific wall-clock time.\n *\n * ```ts\n * crons.daily(\"nightly-report\", { hour: 2, minute: 0 }, api.reports.generate);\n * ```\n */\nexport interface RecurringDailySchedule {\n type: \"daily\";\n /** Hour of day to run (0–23, in UTC unless `timezone` is provided). */\n hour: number;\n /** Minute of hour to run (0–59). */\n minute: number;\n /**\n * IANA timezone name (e.g. `\"America/New_York\"`). Defaults to UTC when\n * omitted.\n */\n timezone?: string;\n}\n\n/**\n * Runs a recurring job once a week on a specific day and time.\n *\n * ```ts\n * crons.weekly(\n * \"weekly-digest\",\n * { dayOfWeek: \"monday\", hour: 9, minute: 0, timezone: \"Europe/London\" },\n * api.email.weeklyDigest\n * );\n * ```\n */\nexport interface RecurringWeeklySchedule {\n type: \"weekly\";\n /** Day of the week on which to fire. */\n dayOfWeek:\n | \"sunday\"\n | \"monday\"\n | \"tuesday\"\n | \"wednesday\"\n | \"thursday\"\n | \"friday\"\n | \"saturday\";\n /** Hour of day to run (0–23, in UTC unless `timezone` is provided). */\n hour: number;\n /** Minute of hour to run (0–59). */\n minute: number;\n /**\n * IANA timezone name (e.g. `\"America/New_York\"`). Defaults to UTC when\n * omitted.\n */\n timezone?: string;\n}\n\n/**\n * Union of all supported recurring-schedule shapes.\n *\n * Pass this (or one of its members) to {@link RecurringJobDefinition.schedule}\n * or to the fluent helpers on {@link CronJobs}.\n */\nexport type RecurringSchedule =\n | RecurringIntervalSchedule\n | RecurringDailySchedule\n | RecurringWeeklySchedule;\n\n/**\n * Determines how the scheduler reacts when a job run is missed (e.g. because\n * the runtime was offline when the job was supposed to fire).\n *\n * - `\"catch_up\"` — Run the job once for every missed execution window. Use for\n * jobs where every run matters (e.g. per-minute metrics collection).\n * - `\"skip\"` — Skip all missed runs and resume on the next scheduled tick.\n * Safe default when running the job twice in quick succession would be\n * harmful.\n * - `\"run_once_if_missed\"` — If any runs were missed, execute the job exactly\n * once to “catch up”, then continue on the normal schedule.\n * - `\"windowed\"` — Catch up, but only within a specific time window. Missed\n * runs older than `windowMs` milliseconds are discarded.\n *\n * @example\n * ```ts\n * const policy: MisfirePolicy = { type: \"windowed\", windowMs: 5 * 60_000 };\n * ```\n */\nexport type MisfirePolicy =\n | { type: \"catch_up\" }\n | { type: \"skip\" }\n | { type: \"run_once_if_missed\" }\n | { type: \"windowed\"; windowMs: number };\n\n/**\n * A single entry in the recurring-job registry.\n *\n * You can construct these manually and pass them to `scheduler.recurringJobs`,\n * but the fluent {@link CronJobs} builder is usually more readable.\n */\nexport interface RecurringJobDefinition {\n /** Unique name used to identify this job in the scheduler and devtools UI. */\n name: string;\n /** When and how often this job should run. */\n schedule: RecurringSchedule;\n /** The function to invoke. Must be a mutation or action reference. */\n function: FunctionReference<\"mutation\" | \"action\">;\n /** Arguments forwarded to the function on every invocation. */\n args: Record<string, unknown>;\n /** How to handle missed executions. */\n misfirePolicy: MisfirePolicy;\n}\n\n/**\n * Fluent builder for declaring the recurring (cron) jobs of a Syncore app.\n *\n * Instantiate with {@link cronJobs} and chain calls to `.interval()`, `.daily()`,\n * or `.weekly()`. Pass the resulting instance's `.jobs` array to\n * `scheduler.recurringJobs` in your runtime options.\n *\n * ```ts\n * // syncore/crons.ts\n * import { cronJobs } from \"syncorejs\";\n * import { api } from \"./_generated/api\";\n *\n * const crons = cronJobs();\n *\n * crons.interval(\"refresh-feed\", { minutes: 10 }, api.feed.refresh);\n * crons.daily(\"send-digest\", { hour: 8, minute: 0 }, api.email.digest);\n * crons.weekly(\"weekly-cleanup\", { dayOfWeek: \"sunday\", hour: 3, minute: 0 }, api.db.vacuum);\n *\n * export default crons;\n * ```\n *\n * Then in your runtime setup:\n * ```ts\n * createNodeSyncoreRuntime({\n * ...,\n * scheduler: { recurringJobs: crons.jobs },\n * });\n * ```\n */\nexport class CronJobs {\n readonly jobs: RecurringJobDefinition[] = [];\n\n /**\n * Register a job that fires repeatedly at a fixed time interval.\n *\n * @param name - Unique identifier for this job.\n * @param schedule - Interval fields (`seconds`, `minutes`, `hours`).\n * @param functionReference - Mutation or action to invoke.\n * @param args - Arguments forwarded on every invocation.\n * @param misfirePolicy - How to handle runs missed while the runtime was\n * offline. Defaults to `{ type: \"catch_up\" }`.\n */\n interval(\n name: string,\n schedule: Omit<RecurringIntervalSchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"interval\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n\n /**\n * Register a job that fires once a day at a given wall-clock time.\n *\n * @param name - Unique identifier for this job.\n * @param schedule - `hour` (0–23), `minute` (0–59), optional `timezone`.\n * @param functionReference - Mutation or action to invoke.\n * @param args - Arguments forwarded on every invocation.\n * @param misfirePolicy - How to handle runs missed while the runtime was\n * offline. Defaults to `{ type: \"catch_up\" }`.\n */\n daily(\n name: string,\n schedule: Omit<RecurringDailySchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"daily\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n\n /**\n * Register a job that fires once a week on a given day and time.\n *\n * @param name - Unique identifier for this job.\n * @param schedule - `dayOfWeek`, `hour` (0–23), `minute` (0–59),\n * optional `timezone`.\n * @param functionReference - Mutation or action to invoke.\n * @param args - Arguments forwarded on every invocation.\n * @param misfirePolicy - How to handle runs missed while the runtime was\n * offline. Defaults to `{ type: \"catch_up\" }`.\n */\n weekly(\n name: string,\n schedule: Omit<RecurringWeeklySchedule, \"type\">,\n functionReference: FunctionReference<\"mutation\" | \"action\">,\n args: Record<string, unknown> = {},\n misfirePolicy: MisfirePolicy = { type: \"catch_up\" }\n ): this {\n this.jobs.push({\n name,\n schedule: { type: \"weekly\", ...schedule },\n function: functionReference,\n args,\n misfirePolicy\n });\n return this;\n }\n}\n\n/**\n * Create a new {@link CronJobs} builder for declaring recurring Syncore jobs.\n *\n * @example\n * ```ts\n * // syncore/crons.ts\n * import { cronJobs } from \"syncorejs\";\n * import { api } from \"./_generated/api\";\n *\n * const crons = cronJobs();\n * crons.interval(\"sync\", { minutes: 5 }, api.sync.run);\n * export default crons;\n * ```\n */\nexport function cronJobs(): CronJobs {\n return new CronJobs();\n}\n"],"mappings":";;AAqPA,SAAS,yBAMP,MACA,QAG4E;CAa5E,OAAO;EACL;EACA,eAdoB,YAAY,OAAO,IAAI,IACxC,OAAO,OAKP,sBAAsB,OAAO,IAAoB;EASpD,GAAI,OAAO,UAAU,EAAE,kBAAkB,OAAO,QAAQ,IAAI,CAAC;EAC7D,SAAS,OAAO;CAClB;AACF;AA0DA,SAAgB,MAMd,QAQA;CACA,OAAO,yBAAyB,SAAS,MAAM;AACjD;AA+DA,SAAgB,SAMd,QAQA;CACA,OAAO,yBAAyB,YAAY,MAAM;AACpD;AAiEA,SAAgB,OAMd,QAQA;CACA,OAAO,yBAAyB,UAAU,MAAM;AAClD;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA+JA,IAAa,WAAb,MAAsB;CACpB,OAA0C,CAAC;;;;;;;;;;;CAY3C,SACE,MACA,UACA,mBACA,OAAgC,CAAC,GACjC,gBAA+B,EAAE,MAAM,WAAW,GAC5C;EACN,KAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAY,GAAG;GAAS;GAC1C,UAAU;GACV;GACA;EACF,CAAC;EACD,OAAO;CACT;;;;;;;;;;;CAYA,MACE,MACA,UACA,mBACA,OAAgC,CAAC,GACjC,gBAA+B,EAAE,MAAM,WAAW,GAC5C;EACN,KAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAS,GAAG;GAAS;GACvC,UAAU;GACV;GACA;EACF,CAAC;EACD,OAAO;CACT;;;;;;;;;;;;CAaA,OACE,MACA,UACA,mBACA,OAAgC,CAAC,GACjC,gBAA+B,EAAE,MAAM,WAAW,GAC5C;EACN,KAAK,KAAK,KAAK;GACb;GACA,UAAU;IAAE,MAAM;IAAU,GAAG;GAAS;GACxC,UAAU;GACV;GACA;EACF,CAAC;EACD,OAAO;CACT;AACF;;;;;;;;;;;;;;;AAgBA,SAAgB,WAAqB;CACnC,OAAO,IAAI,SAAS;AACtB"}
|