From 81aa841f6bca3c45d9562583a465cbeead1484e3 Mon Sep 17 00:00:00 2001 From: Jackson Morgan Date: Sat, 22 Mar 2025 11:39:45 -0400 Subject: [PATCH] Builds after update refactor --- .../src/SolidConnectedPlugin.ts | 4 +- .../requester/requests/createDataResource.ts | 3 +- .../src/requester/requests/readResource.ts | 3 +- .../requester/requests/updateDataResource.ts | 3 +- .../results/success/SolidReadSuccess.ts | 6 ++- .../src/resources/SolidContainer.ts | 14 +++++- .../src/resources/SolidLeaf.ts | 44 +++++++------------ .../src/resources/SolidResource.ts | 25 ++++++----- packages/connected/src/ConnectedContext.ts | 5 ++- packages/connected/src/ConnectedLdoDataset.ts | 8 ++-- .../src/ConnectedLdoTransactionDataset.ts | 13 +++--- packages/connected/src/ConnectedPlugin.ts | 6 +-- .../src/InvalidIdentifierResource.ts | 2 +- packages/connected/src/Resource.ts | 11 +++-- packages/connected/src/index.ts | 2 + .../src/results/success/ReadSuccess.ts | 4 +- .../src/results/success/UpdateSuccess.ts | 4 +- packages/connected/test/MockResource.ts | 2 +- 18 files changed, 86 insertions(+), 73 deletions(-) diff --git a/packages/connected-solid/src/SolidConnectedPlugin.ts b/packages/connected-solid/src/SolidConnectedPlugin.ts index 4f59ad7..b6b2c5d 100644 --- a/packages/connected-solid/src/SolidConnectedPlugin.ts +++ b/packages/connected-solid/src/SolidConnectedPlugin.ts @@ -44,9 +44,7 @@ export const solidConnectedPlugin: SolidConnectedPlugin = { throw new Error("Function not implemented."); }, - isUriValid: function ( - uri: SolidContainerUri | SolidLeafUri, - ): uri is SolidLeafUri | SolidContainerUri { + isUriValid: function (uri: string): uri is SolidLeafUri | SolidContainerUri { return isSolidUri(uri); }, diff --git a/packages/connected-solid/src/requester/requests/createDataResource.ts b/packages/connected-solid/src/requester/requests/createDataResource.ts index e17dc44..de2a8ec 100644 --- a/packages/connected-solid/src/requester/requests/createDataResource.ts +++ b/packages/connected-solid/src/requester/requests/createDataResource.ts @@ -5,12 +5,11 @@ import { getParentUri, getSlug, } from "../../util/rdfUtils"; -import type { Resource } from "@ldo/connected"; +import type { AbsentReadSuccess, Resource } from "@ldo/connected"; import { UnexpectedResourceError } from "@ldo/connected"; import type { HttpErrorResultType } from "../results/error/HttpErrorResult"; import { HttpErrorResult } from "../results/error/HttpErrorResult"; import { CreateSuccess } from "../results/success/CreateSuccess"; -import type { AbsentReadSuccess } from "../results/success/SolidReadSuccess"; import type { DeleteResultError } from "./deleteResource"; import { deleteResource } from "./deleteResource"; import type { diff --git a/packages/connected-solid/src/requester/requests/readResource.ts b/packages/connected-solid/src/requester/requests/readResource.ts index f8f4e6e..ee1ac9c 100644 --- a/packages/connected-solid/src/requester/requests/readResource.ts +++ b/packages/connected-solid/src/requester/requests/readResource.ts @@ -13,11 +13,10 @@ import { DataReadSuccess, } from "../results/success/SolidReadSuccess"; import { ContainerReadSuccess } from "../results/success/SolidReadSuccess"; -import { AbsentReadSuccess } from "../results/success/SolidReadSuccess"; import { NoncompliantPodError } from "../results/error/NoncompliantPodError"; import { guaranteeFetch } from "../../util/guaranteeFetch"; import type { Resource } from "@ldo/connected"; -import { UnexpectedResourceError } from "@ldo/connected"; +import { UnexpectedResourceError, AbsentReadSuccess } from "@ldo/connected"; import { checkHeadersForRootContainer } from "./checkRootContainer"; import { namedNode } from "@rdfjs/data-model"; import type { SolidLeaf } from "../../resources/SolidLeaf"; diff --git a/packages/connected-solid/src/requester/requests/updateDataResource.ts b/packages/connected-solid/src/requester/requests/updateDataResource.ts index fd0d994..5804183 100644 --- a/packages/connected-solid/src/requester/requests/updateDataResource.ts +++ b/packages/connected-solid/src/requester/requests/updateDataResource.ts @@ -3,10 +3,9 @@ import { changesToSparqlUpdate } from "@ldo/rdf-utils"; import type { Quad } from "@rdfjs/types"; import { guaranteeFetch } from "../../util/guaranteeFetch"; import type { Resource } from "@ldo/connected"; -import { UnexpectedResourceError } from "@ldo/connected"; +import { UnexpectedResourceError, UpdateSuccess } from "@ldo/connected"; import type { HttpErrorResultType } from "../results/error/HttpErrorResult"; import { HttpErrorResult } from "../results/error/HttpErrorResult"; -import { UpdateSuccess } from "../results/success/UpdateSuccess"; import type { DatasetRequestOptions } from "./requestOptions"; import type { SolidContainer } from "../../resources/SolidContainer"; import type { SolidLeaf } from "../../resources/SolidLeaf"; diff --git a/packages/connected-solid/src/requester/results/success/SolidReadSuccess.ts b/packages/connected-solid/src/requester/results/success/SolidReadSuccess.ts index 530e551..d91681f 100644 --- a/packages/connected-solid/src/requester/results/success/SolidReadSuccess.ts +++ b/packages/connected-solid/src/requester/results/success/SolidReadSuccess.ts @@ -1,4 +1,8 @@ -import type { Resource, ResourceResult } from "@ldo/connected"; +import { + ReadSuccess, + type Resource, + type ResourceResult, +} from "@ldo/connected"; import type { SolidLeaf } from "../../../resources/SolidLeaf"; import type { SolidContainer } from "../../../resources/SolidContainer"; diff --git a/packages/connected-solid/src/resources/SolidContainer.ts b/packages/connected-solid/src/resources/SolidContainer.ts index 45a000c..5d72086 100644 --- a/packages/connected-solid/src/resources/SolidContainer.ts +++ b/packages/connected-solid/src/resources/SolidContainer.ts @@ -19,7 +19,6 @@ import type { ReadResultError, } from "../requester/requests/readResource"; import type { DeleteSuccess } from "../requester/results/success/DeleteSuccess"; -import type { AbsentReadSuccess } from "../requester/results/success/SolidReadSuccess"; import type { ContainerReadSuccess } from "../requester/results/success/SolidReadSuccess"; import { getParentUri, ldpContains } from "../util/rdfUtils"; import { NoRootContainerError } from "../requester/results/error/NoRootContainerError"; @@ -30,7 +29,8 @@ import type { SolidContainerUri, SolidLeafSlug, } from "../types"; -import { AggregateSuccess } from "@ldo/connected"; +import type { AbsentReadSuccess } from "@ldo/connected"; +import { AggregateSuccess, IgnoredInvalidUpdateSuccess } from "@ldo/connected"; import { Unfetched, type ConnectedContext, @@ -39,6 +39,7 @@ import { import type { SolidConnectedPlugin } from "../SolidConnectedPlugin"; import type { SolidLeaf } from "./SolidLeaf"; import type { HttpErrorResultType } from "../requester/results/error/HttpErrorResult"; +import type { DatasetChanges } from "@ldo/rdf-utils"; /** * Represents the current status of a specific container on a Pod as known by @@ -577,4 +578,13 @@ export class SolidContainer extends SolidResource { if (createResult.isError) return createResult; return { ...createResult, resource: this }; } + + /** + * You cannot update a Container, so we return an IgnoredInvalidUpdateSuccess + */ + async update( + _datasetChanges: DatasetChanges, + ): Promise> { + return new IgnoredInvalidUpdateSuccess(this); + } } diff --git a/packages/connected-solid/src/resources/SolidLeaf.ts b/packages/connected-solid/src/resources/SolidLeaf.ts index a8eb6c3..1f105d9 100644 --- a/packages/connected-solid/src/resources/SolidLeaf.ts +++ b/packages/connected-solid/src/resources/SolidLeaf.ts @@ -10,18 +10,19 @@ import type { DeleteResult } from "../requester/requests/deleteResource"; import type { ReadLeafResult } from "../requester/requests/readResource"; import type { UpdateResult } from "../requester/requests/updateDataResource"; import type { DeleteSuccess } from "../requester/results/success/DeleteSuccess"; -import type { AbsentReadSuccess } from "../requester/results/success/SolidReadSuccess"; -import type { - BinaryReadSuccess, - DataReadSuccess, -} from "../requester/results/success/SolidReadSuccess"; +import { DataReadSuccess } from "../requester/results/success/SolidReadSuccess"; +import { BinaryReadSuccess } from "../requester/results/success/SolidReadSuccess"; import { getParentUri } from "../util/rdfUtils"; import type { NoRootContainerError } from "../requester/results/error/NoRootContainerError"; import type { SharedStatuses } from "./SolidResource"; import { SolidResource } from "./SolidResource"; import type { SolidLeafUri } from "../types"; import type { ResourceSuccess } from "@ldo/connected"; -import { Unfetched, type ConnectedContext } from "@ldo/connected"; +import { + AbsentReadSuccess, + Unfetched, + type ConnectedContext, +} from "@ldo/connected"; import type { SolidConnectedPlugin } from "../SolidConnectedPlugin"; import type { SolidContainer } from "./SolidContainer"; @@ -253,31 +254,16 @@ export class SolidLeaf extends SolidResource { */ protected toReadResult(): ReadLeafResult { if (this.isAbsent()) { - return { - isError: false, - type: "absentReadSuccess", - uri: this.uri, - recalledFromMemory: true, - resource: this, - }; + return new AbsentReadSuccess(this, true); } else if (this.isBinary()) { - return { - isError: false, - type: "binaryReadSuccess", - uri: this.uri, - recalledFromMemory: true, - blob: this.binaryData!.blob, - mimeType: this.binaryData!.mimeType, - resource: this, - }; + return new BinaryReadSuccess( + this, + true, + this.binaryData!.blob, + this.binaryData!.mimeType, + ); } else { - return { - isError: false, - type: "dataReadSuccess", - uri: this.uri, - recalledFromMemory: true, - resource: this, - }; + return new DataReadSuccess(this, true); } } diff --git a/packages/connected-solid/src/resources/SolidResource.ts b/packages/connected-solid/src/resources/SolidResource.ts index 9b0e9ba..b4de696 100644 --- a/packages/connected-solid/src/resources/SolidResource.ts +++ b/packages/connected-solid/src/resources/SolidResource.ts @@ -1,9 +1,10 @@ import type { ConnectedContext, ConnectedResult, + IgnoredInvalidUpdateSuccess, + ReadSuccess, Resource, ResourceEventEmitter, - ResourceResult, ResourceSuccess, Unfetched, } from "@ldo/connected"; @@ -18,10 +19,7 @@ import type { } from "../notifications/SolidNotificationSubscription"; import { Websocket2023NotificationSubscription } from "../notifications/Websocket2023NotificationSubscription"; import { getParentUri } from "../util/rdfUtils"; -import { - isReadSuccess, - type ReadSuccess, -} from "../requester/results/success/SolidReadSuccess"; +import { isReadSuccess } from "../requester/results/success/SolidReadSuccess"; import type { ReadContainerResult, ReadLeafResult, @@ -51,6 +49,8 @@ import type { SolidNotificationMessage } from "../notifications/SolidNotificatio import type { CreateSuccess } from "../requester/results/success/CreateSuccess"; import { GetWacUriSuccess } from "../wac/results/GetWacUriSuccess"; import { GetWacRuleSuccess } from "../wac/results/GetWacRuleSuccess"; +import type { DatasetChanges } from "@ldo/rdf-utils"; +import type { UpdateResult } from "../requester/requests/updateDataResource"; /** * Statuses shared between both Leaf and Container @@ -141,10 +141,6 @@ export abstract class SolidResource ); } - readIfAbsent(): Promise> { - throw new Error("Method not implemented."); - } - /** * =========================================================================== * GETTERS @@ -477,7 +473,7 @@ export abstract class SolidResource this.absent = false; this.didInitialFetch = true; if (isReadSuccess(result)) { - this.updateWithReadSuccess(result); + this.updateWithReadSuccess(result as ReadSuccess); } } @@ -547,6 +543,15 @@ export abstract class SolidResource return result; } + /** + * UPDATE METHODS + */ + abstract update( + datasetChanges: DatasetChanges, + ): Promise< + UpdateResult | IgnoredInvalidUpdateSuccess + >; + /** * =========================================================================== * PARENT CONTAINER METHODS diff --git a/packages/connected/src/ConnectedContext.ts b/packages/connected/src/ConnectedContext.ts index 9f097cc..7bb6716 100644 --- a/packages/connected/src/ConnectedContext.ts +++ b/packages/connected/src/ConnectedContext.ts @@ -1,7 +1,10 @@ +/* eslint-disable @typescript-eslint/no-explicit-any */ import type { ConnectedLdoDataset } from "./ConnectedLdoDataset"; import type { ConnectedPlugin } from "./ConnectedPlugin"; -export type ConnectedContext = { +export type ConnectedContext< + Plugins extends ConnectedPlugin[], +> = { dataset: ConnectedLdoDataset; } & { [P in Plugins[number] as P["name"]]: P["types"]["context"]; diff --git a/packages/connected/src/ConnectedLdoDataset.ts b/packages/connected/src/ConnectedLdoDataset.ts index 987db77..dfb2a73 100644 --- a/packages/connected/src/ConnectedLdoDataset.ts +++ b/packages/connected/src/ConnectedLdoDataset.ts @@ -11,7 +11,9 @@ import type { } from "./IConnectedLdoDataset"; import { ConnectedLdoTransactionDataset } from "./ConnectedLdoTransactionDataset"; -export class ConnectedLdoDataset +export class ConnectedLdoDataset< + Plugins extends ConnectedPlugin[], + > extends LdoDataset implements IConnectedLdoDataset { @@ -89,7 +91,7 @@ export class ConnectedLdoDataset let resource = this.resourceMap.get(normalizedUri); if (!resource) { // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore I'm not sure why this doesn't work + // @ts-ignore I don't know why this doesn't work resource = plugin.getResource(uri, this.context); this.resourceMap.set(normalizedUri, resource); } @@ -103,7 +105,7 @@ export class ConnectedLdoDataset >(name: Name): Promise> { const validPlugin = this.plugins.find((plugin) => name === plugin.name)!; // eslint-disable-next-line @typescript-eslint/ban-ts-comment - // @ts-ignore I'm not sure why this doesn't work + // @ts-ignore I don't know why this doesn't work const newResourceResult = await validPlugin.createResource(this.context); // HACK: cast to any if (newResourceResult.isError) return newResourceResult as any; diff --git a/packages/connected/src/ConnectedLdoTransactionDataset.ts b/packages/connected/src/ConnectedLdoTransactionDataset.ts index 94d380c..ab9a3ad 100644 --- a/packages/connected/src/ConnectedLdoTransactionDataset.ts +++ b/packages/connected/src/ConnectedLdoTransactionDataset.ts @@ -9,7 +9,10 @@ import type { DatasetChanges, GraphNode } from "@ldo/rdf-utils"; import type { ConnectedPlugin } from "./ConnectedPlugin"; import type { ConnectedContext } from "./ConnectedContext"; import type { InvalidIdentifierResource } from "./InvalidIdentifierResource"; -import type { IConnectedLdoDataset } from "./IConnectedLdoDataset"; +import type { + IConnectedLdoDataset, + ReturnTypeFromArgs, +} from "./IConnectedLdoDataset"; import { splitChangesByGraph } from "./util/splitChangesByGraph"; import type { IgnoredInvalidUpdateSuccess } from "./results/success/UpdateSuccess"; import { UpdateDefaultGraphSuccess } from "./results/success/UpdateSuccess"; @@ -87,12 +90,10 @@ export class ConnectedLdoTransactionDataset UriType extends string, >( uri: UriType, - pluginName?: Name | undefined, + pluginName?: Name, ): UriType extends Plugin["types"]["uri"] - ? Plugin["getResource"] extends (arg: UriType, context: any) => infer R - ? R - : never - : InvalidIdentifierResource | ReturnType { + ? ReturnTypeFromArgs + : ReturnType | InvalidIdentifierResource { return this.context.dataset.getResource(uri, pluginName); } diff --git a/packages/connected/src/ConnectedPlugin.ts b/packages/connected/src/ConnectedPlugin.ts index ca427b3..b1288c8 100644 --- a/packages/connected/src/ConnectedPlugin.ts +++ b/packages/connected/src/ConnectedPlugin.ts @@ -12,12 +12,12 @@ export interface ConnectedPlugin< name: Name; getResource( uri: UriType, - context: ConnectedContext, + context: ConnectedContext[]>, ): ResourceType; createResource( - context: ConnectedContext, + context: ConnectedContext[]>, ): Promise; - isUriValid(uri: UriType): uri is UriType; + isUriValid(uri: string): uri is UriType; normalizeUri?: (uri: UriType) => UriType; initialContext: ContextType; // This object exists to transfer typescript types. It does not need to be diff --git a/packages/connected/src/InvalidIdentifierResource.ts b/packages/connected/src/InvalidIdentifierResource.ts index 1d975a0..fca53eb 100644 --- a/packages/connected/src/InvalidIdentifierResource.ts +++ b/packages/connected/src/InvalidIdentifierResource.ts @@ -41,7 +41,7 @@ export class InvalidIdentifierResource async read(): Promise> { return this.status; } - async readIfAbsent(): Promise> { + async readIfUnfetched(): Promise> { return this.status; } async update(): Promise> { diff --git a/packages/connected/src/Resource.ts b/packages/connected/src/Resource.ts index 98d9212..d300388 100644 --- a/packages/connected/src/Resource.ts +++ b/packages/connected/src/Resource.ts @@ -2,7 +2,10 @@ import type TypedEmitter from "typed-emitter"; import type { ConnectedResult } from "./results/ConnectedResult"; import type { DatasetChanges } from "@ldo/rdf-utils"; -import type { UpdateSuccess } from "./results/success/UpdateSuccess"; +import type { + IgnoredInvalidUpdateSuccess, + UpdateSuccess, +} from "./results/success/UpdateSuccess"; import type { ResourceError } from "./results/error/ErrorResult"; import type { ReadSuccess } from "./results/success/ReadSuccess"; @@ -25,10 +28,12 @@ export interface Resource isAbsent(): boolean | undefined; isSubscribedToNotifications(): boolean; read(): Promise | ResourceError>; - readIfAbsent(): Promise | ResourceError>; + readIfUnfetched(): Promise | ResourceError>; update( datasetChanges: DatasetChanges, - ): Promise | ResourceError>; + ): Promise< + UpdateSuccess | IgnoredInvalidUpdateSuccess | ResourceError + >; subscribeToNotifications(callbacks?: { onNotification: (message: any) => void; onNotificationError: (err: Error) => void; diff --git a/packages/connected/src/index.ts b/packages/connected/src/index.ts index 8c5f7ee..d7c66cc 100644 --- a/packages/connected/src/index.ts +++ b/packages/connected/src/index.ts @@ -15,3 +15,5 @@ export * from "./results/error/InvalidUriError"; export * from "./results/error/NotificationErrors"; export * from "./results/success/SuccessResult"; export * from "./results/success/Unfetched"; +export * from "./results/success/ReadSuccess"; +export * from "./results/success/UpdateSuccess"; diff --git a/packages/connected/src/results/success/ReadSuccess.ts b/packages/connected/src/results/success/ReadSuccess.ts index 5dcc698..e440879 100644 --- a/packages/connected/src/results/success/ReadSuccess.ts +++ b/packages/connected/src/results/success/ReadSuccess.ts @@ -1,5 +1,5 @@ -import { ResourceSuccess } from "@ldo/connected"; -import type { Resource } from "@ldo/connected"; +import type { Resource } from "../../Resource"; +import { ResourceSuccess } from "./SuccessResult"; /** * Indicates that the request to read a resource was a success diff --git a/packages/connected/src/results/success/UpdateSuccess.ts b/packages/connected/src/results/success/UpdateSuccess.ts index e8f3322..49dbdd6 100644 --- a/packages/connected/src/results/success/UpdateSuccess.ts +++ b/packages/connected/src/results/success/UpdateSuccess.ts @@ -1,5 +1,5 @@ -import { ResourceSuccess, SuccessResult } from "@ldo/connected"; -import type { Resource } from "@ldo/connected"; +import type { Resource } from "../../Resource"; +import { ResourceSuccess, SuccessResult } from "./SuccessResult"; /** * Indicates that an update request to a resource was successful diff --git a/packages/connected/test/MockResource.ts b/packages/connected/test/MockResource.ts index 468c32a..e84b0b3 100644 --- a/packages/connected/test/MockResource.ts +++ b/packages/connected/test/MockResource.ts @@ -50,7 +50,7 @@ export class MockResouce read(): Promise | ResourceError> { throw new Error("Method not implemented."); } - readIfAbsent(): Promise | ResourceError> { + readIfUnfetched(): Promise | ResourceError> { throw new Error("Method not implemented."); } update(