From 9afd82ee69fcc967b5276f87966b2d6da8adc11a Mon Sep 17 00:00:00 2001 From: Jackson Morgan Date: Tue, 15 Apr 2025 13:59:05 -0400 Subject: [PATCH] Reconcile interfaces --- packages/connected/src/ConnectedLdoDataset.ts | 6 +- .../src/ConnectedLdoTransactionDataset.ts | 4 +- .../src/createConntectedLdoDataset.ts | 2 +- packages/connected/src/index.ts | 8 +- .../notifications/NotificationSubscription.ts | 4 +- .../SubscriptionCallbacks.ts | 0 .../src/{ => types}/ConnectedContext.ts | 2 +- .../src/{ => types}/ConnectedPlugin.ts | 4 +- .../src/types/IConnectedLdoBuilder.ts | 12 +++ .../src/{ => types}/IConnectedLdoDataset.ts | 2 +- .../src/types/linkQuery/LinkQuery.ts | 88 +++++++++++++++++++ .../connected/src/types/linkQuery/test.ts | 0 packages/ldo/test/profileData.ts | 1 - 13 files changed, 116 insertions(+), 17 deletions(-) rename packages/connected/src/{ => notifications}/SubscriptionCallbacks.ts (100%) rename packages/connected/src/{ => types}/ConnectedContext.ts (88%) rename packages/connected/src/{ => types}/ConnectedPlugin.ts (94%) create mode 100644 packages/connected/src/types/IConnectedLdoBuilder.ts rename packages/connected/src/{ => types}/IConnectedLdoDataset.ts (98%) create mode 100644 packages/connected/src/types/linkQuery/LinkQuery.ts create mode 100644 packages/connected/src/types/linkQuery/test.ts diff --git a/packages/connected/src/ConnectedLdoDataset.ts b/packages/connected/src/ConnectedLdoDataset.ts index e9a043f..cd9cdb5 100644 --- a/packages/connected/src/ConnectedLdoDataset.ts +++ b/packages/connected/src/ConnectedLdoDataset.ts @@ -1,15 +1,15 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { LdoBase, ShapeType } from "@ldo/ldo"; import { LdoDataset, startTransaction } from "@ldo/ldo"; -import type { ConnectedPlugin } from "./ConnectedPlugin"; +import type { ConnectedPlugin } from "./types/ConnectedPlugin"; import type { Dataset, DatasetFactory, Quad } from "@rdfjs/types"; import type { ITransactionDatasetFactory } from "@ldo/subscribable-dataset"; import { InvalidIdentifierResource } from "./InvalidIdentifierResource"; -import type { ConnectedContext } from "./ConnectedContext"; +import type { ConnectedContext } from "./types/ConnectedContext"; import type { GetResourceReturnType, IConnectedLdoDataset, -} from "./IConnectedLdoDataset"; +} from "./types/IConnectedLdoDataset"; import { ConnectedLdoTransactionDataset } from "./ConnectedLdoTransactionDataset"; import type { SubjectNode } from "@ldo/rdf-utils"; diff --git a/packages/connected/src/ConnectedLdoTransactionDataset.ts b/packages/connected/src/ConnectedLdoTransactionDataset.ts index f3e8155..74dc142 100644 --- a/packages/connected/src/ConnectedLdoTransactionDataset.ts +++ b/packages/connected/src/ConnectedLdoTransactionDataset.ts @@ -6,12 +6,12 @@ import { type ITransactionDatasetFactory, } from "@ldo/subscribable-dataset"; import type { DatasetChanges, GraphNode } from "@ldo/rdf-utils"; -import type { ConnectedPlugin } from "./ConnectedPlugin"; +import type { ConnectedPlugin } from "./types/ConnectedPlugin"; import type { ConnectedContext } from "./ConnectedContext"; import type { GetResourceReturnType, IConnectedLdoDataset, -} from "./IConnectedLdoDataset"; +} from "./types/IConnectedLdoDataset"; import { splitChangesByGraph } from "./util/splitChangesByGraph"; import type { IgnoredInvalidUpdateSuccess } from "./results/success/UpdateSuccess"; import { UpdateDefaultGraphSuccess } from "./results/success/UpdateSuccess"; diff --git a/packages/connected/src/createConntectedLdoDataset.ts b/packages/connected/src/createConntectedLdoDataset.ts index d42df33..d67e815 100644 --- a/packages/connected/src/createConntectedLdoDataset.ts +++ b/packages/connected/src/createConntectedLdoDataset.ts @@ -1,6 +1,6 @@ import { createDatasetFactory } from "@ldo/dataset"; import { ConnectedLdoDataset } from "./ConnectedLdoDataset"; -import type { ConnectedPlugin } from "./ConnectedPlugin"; +import type { ConnectedPlugin } from "./types/ConnectedPlugin"; import { createTransactionDatasetFactory } from "@ldo/subscribable-dataset"; /** diff --git a/packages/connected/src/index.ts b/packages/connected/src/index.ts index f822389..806e8ec 100644 --- a/packages/connected/src/index.ts +++ b/packages/connected/src/index.ts @@ -1,13 +1,13 @@ -export * from "./IConnectedLdoDataset"; +export * from "./types/IConnectedLdoDataset"; export * from "./ConnectedLdoDataset"; export * from "./ConnectedLdoTransactionDataset"; -export * from "./ConnectedPlugin"; +export * from "./types/ConnectedPlugin"; export * from "./Resource"; export * from "./InvalidIdentifierResource"; -export * from "./ConnectedContext"; +export * from "./types/ConnectedContext"; export * from "./methods"; export * from "./createConntectedLdoDataset"; -export * from "./SubscriptionCallbacks"; +export * from "./notifications/SubscriptionCallbacks"; export * from "./util/splitChangesByGraph"; diff --git a/packages/connected/src/notifications/NotificationSubscription.ts b/packages/connected/src/notifications/NotificationSubscription.ts index b23d682..11989dc 100644 --- a/packages/connected/src/notifications/NotificationSubscription.ts +++ b/packages/connected/src/notifications/NotificationSubscription.ts @@ -1,7 +1,7 @@ import { v4 } from "uuid"; -import type { ConnectedPlugin } from "../ConnectedPlugin"; +import type { ConnectedPlugin } from "../types/ConnectedPlugin"; import type { ConnectedContext } from "../ConnectedContext"; -import type { SubscriptionCallbacks } from "../SubscriptionCallbacks"; +import type { SubscriptionCallbacks } from "./SubscriptionCallbacks"; import type { NotificationCallbackError } from "../results/error/NotificationErrors"; /** diff --git a/packages/connected/src/SubscriptionCallbacks.ts b/packages/connected/src/notifications/SubscriptionCallbacks.ts similarity index 100% rename from packages/connected/src/SubscriptionCallbacks.ts rename to packages/connected/src/notifications/SubscriptionCallbacks.ts diff --git a/packages/connected/src/ConnectedContext.ts b/packages/connected/src/types/ConnectedContext.ts similarity index 88% rename from packages/connected/src/ConnectedContext.ts rename to packages/connected/src/types/ConnectedContext.ts index 92aea64..18db26e 100644 --- a/packages/connected/src/ConnectedContext.ts +++ b/packages/connected/src/types/ConnectedContext.ts @@ -1,6 +1,6 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { ConnectedLdoDataset } from "./ConnectedLdoDataset"; -import type { ConnectedPlugin } from "./ConnectedPlugin"; +import type { ConnectedPlugin } from "./types/ConnectedPlugin"; /** * Each Plugin comes with a context. This is the aggregate of all those contexts diff --git a/packages/connected/src/ConnectedPlugin.ts b/packages/connected/src/types/ConnectedPlugin.ts similarity index 94% rename from packages/connected/src/ConnectedPlugin.ts rename to packages/connected/src/types/ConnectedPlugin.ts index 4ed7306..760e7e5 100644 --- a/packages/connected/src/ConnectedPlugin.ts +++ b/packages/connected/src/types/ConnectedPlugin.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { ConnectedContext } from "./ConnectedContext"; -import type { Resource } from "./Resource"; -import type { ErrorResult } from "./results/error/ErrorResult"; +import type { Resource } from "../Resource"; +import type { ErrorResult } from "../results/error/ErrorResult"; /** * A ConnectedPlugin can be passed to a ConnectedDataset to allow it to connect diff --git a/packages/connected/src/types/IConnectedLdoBuilder.ts b/packages/connected/src/types/IConnectedLdoBuilder.ts new file mode 100644 index 0000000..ae2c756 --- /dev/null +++ b/packages/connected/src/types/IConnectedLdoBuilder.ts @@ -0,0 +1,12 @@ +import type { LdoBase, LdoBuilder } from "@ldo/ldo"; +import type { ConnectedPlugin } from "./ConnectedPlugin"; +import { SubjectNode } from "@ldo/rdf-utils"; + +export interface IConnectedLdoBuilder< + Type extends LdoBase, + Plugins extends ConnectedPlugin[], +> extends LdoBuilder { + fromLinkQuery(startingResource: Plugins[number]["types"]["resource"], startingSubject: SubjectNode | string, linkQueryInput: + + ) +} diff --git a/packages/connected/src/IConnectedLdoDataset.ts b/packages/connected/src/types/IConnectedLdoDataset.ts similarity index 98% rename from packages/connected/src/IConnectedLdoDataset.ts rename to packages/connected/src/types/IConnectedLdoDataset.ts index 73c99a9..18b3969 100644 --- a/packages/connected/src/IConnectedLdoDataset.ts +++ b/packages/connected/src/types/IConnectedLdoDataset.ts @@ -1,7 +1,7 @@ /* eslint-disable @typescript-eslint/no-explicit-any */ import type { LdoDataset } from "@ldo/ldo"; import type { ConnectedPlugin } from "./ConnectedPlugin"; -import type { InvalidIdentifierResource } from "./InvalidIdentifierResource"; +import type { InvalidIdentifierResource } from "../InvalidIdentifierResource"; export type ReturnTypeFromArgs = Func extends ( arg: Arg, diff --git a/packages/connected/src/types/linkQuery/LinkQuery.ts b/packages/connected/src/types/linkQuery/LinkQuery.ts new file mode 100644 index 0000000..1626c63 --- /dev/null +++ b/packages/connected/src/types/linkQuery/LinkQuery.ts @@ -0,0 +1,88 @@ +// This file is a stripped down version of a full-implmentation of a global +// query interface found here https://github.com/o-development/ldo-query/blob/main/lib/ShapeQuery.ts +// If I ever want to implement a global query interface, this is a good place +// to start. + +import type { LdoBase, LdSet, ShapeType } from "@ldo/ldo"; +import { ProfileShapeType } from "packages/ldo/test/profileData"; +import { SolidProfileShape } from "packages/ldo/test/profileData"; +import { PostShShapeType } from "packages/solid-react/test/.ldo/post.shapeTypes"; + +/** + * Link Query Input + */ +export type LQInputObject = Partial<{ + [key in keyof Type]: LQInput; +}>; + +export type LQInputSubArray = Type extends object + ? LQInputObject + : true; + +export type LQInput = Type extends LdSet + ? LQInputSubArray + : LQInputSubArray; + +/** + * Link Query Input Default + */ +export type LQInputDefaultType = { + [key in keyof Type]: Type[key] extends object ? undefined : true; +}; + +export type LQInputDefault = + LQInputDefaultType extends LQInput + ? LQInputDefaultType + : never; + +/** + * Link Query Return + */ +export type LQReturnObject> = { + [key in keyof Required as undefined extends Input[key] + ? never + : key]: Input[key] extends LQInput + ? undefined extends Type[key] + ? LQReturnRecursive | undefined + : LQReturnRecursive + : never; +}; + +export type LQReturnSubArray = Input extends LQInputSubArray + ? Type extends object + ? LQReturnObject + : Type + : never; + +export type LQReturnRecursive< + Type, + Input extends LQInput, +> = NonNullable extends LdSet + ? LdSet> + : LQReturnSubArray; + +export type LQReturn> = LQReturnRecursive< + Type, + Input +>; + +type ExpandDeep = T extends LdSet + ? LdSet> // recursively expand arrays + : T extends object + ? { [K in keyof T]: ExpandDeep } // recursively expand objects + : T; // base case (primitive types) + +function sampleFunction>( + _shapeType: ShapeType, + _input: Input, +): ExpandDeep> { + throw new Error("NotImplemented"); +} + +type other = ExpandDeep>; + +const value = sampleFunction(ProfileShapeType, { + hasTelephone: { type: { "@id": true }, value: true }, +}); + +value; diff --git a/packages/connected/src/types/linkQuery/test.ts b/packages/connected/src/types/linkQuery/test.ts new file mode 100644 index 0000000..e69de29 diff --git a/packages/ldo/test/profileData.ts b/packages/ldo/test/profileData.ts index 74d823d..a58570c 100644 --- a/packages/ldo/test/profileData.ts +++ b/packages/ldo/test/profileData.ts @@ -974,7 +974,6 @@ export interface RSAPublicKeyShape { export interface SolidProfileShape { "@id"?: string; - "@context"?: ContextDefinition; /** * Defines the node as a Person (from Schema.org) | Defines the node as a Person (from foaf) */