Builds after update refactor

main
Jackson Morgan 6 months ago
parent 8dd341bb87
commit 81aa841f6b
  1. 4
      packages/connected-solid/src/SolidConnectedPlugin.ts
  2. 3
      packages/connected-solid/src/requester/requests/createDataResource.ts
  3. 3
      packages/connected-solid/src/requester/requests/readResource.ts
  4. 3
      packages/connected-solid/src/requester/requests/updateDataResource.ts
  5. 6
      packages/connected-solid/src/requester/results/success/SolidReadSuccess.ts
  6. 14
      packages/connected-solid/src/resources/SolidContainer.ts
  7. 44
      packages/connected-solid/src/resources/SolidLeaf.ts
  8. 25
      packages/connected-solid/src/resources/SolidResource.ts
  9. 5
      packages/connected/src/ConnectedContext.ts
  10. 8
      packages/connected/src/ConnectedLdoDataset.ts
  11. 13
      packages/connected/src/ConnectedLdoTransactionDataset.ts
  12. 6
      packages/connected/src/ConnectedPlugin.ts
  13. 2
      packages/connected/src/InvalidIdentifierResource.ts
  14. 11
      packages/connected/src/Resource.ts
  15. 2
      packages/connected/src/index.ts
  16. 4
      packages/connected/src/results/success/ReadSuccess.ts
  17. 4
      packages/connected/src/results/success/UpdateSuccess.ts
  18. 2
      packages/connected/test/MockResource.ts

@ -44,9 +44,7 @@ export const solidConnectedPlugin: SolidConnectedPlugin = {
throw new Error("Function not implemented."); throw new Error("Function not implemented.");
}, },
isUriValid: function ( isUriValid: function (uri: string): uri is SolidLeafUri | SolidContainerUri {
uri: SolidContainerUri | SolidLeafUri,
): uri is SolidLeafUri | SolidContainerUri {
return isSolidUri(uri); return isSolidUri(uri);
}, },

@ -5,12 +5,11 @@ import {
getParentUri, getParentUri,
getSlug, getSlug,
} from "../../util/rdfUtils"; } from "../../util/rdfUtils";
import type { Resource } from "@ldo/connected"; import type { AbsentReadSuccess, Resource } from "@ldo/connected";
import { UnexpectedResourceError } from "@ldo/connected"; import { UnexpectedResourceError } from "@ldo/connected";
import type { HttpErrorResultType } from "../results/error/HttpErrorResult"; import type { HttpErrorResultType } from "../results/error/HttpErrorResult";
import { HttpErrorResult } from "../results/error/HttpErrorResult"; import { HttpErrorResult } from "../results/error/HttpErrorResult";
import { CreateSuccess } from "../results/success/CreateSuccess"; import { CreateSuccess } from "../results/success/CreateSuccess";
import type { AbsentReadSuccess } from "../results/success/SolidReadSuccess";
import type { DeleteResultError } from "./deleteResource"; import type { DeleteResultError } from "./deleteResource";
import { deleteResource } from "./deleteResource"; import { deleteResource } from "./deleteResource";
import type { import type {

@ -13,11 +13,10 @@ import {
DataReadSuccess, DataReadSuccess,
} from "../results/success/SolidReadSuccess"; } from "../results/success/SolidReadSuccess";
import { ContainerReadSuccess } from "../results/success/SolidReadSuccess"; import { ContainerReadSuccess } from "../results/success/SolidReadSuccess";
import { AbsentReadSuccess } from "../results/success/SolidReadSuccess";
import { NoncompliantPodError } from "../results/error/NoncompliantPodError"; import { NoncompliantPodError } from "../results/error/NoncompliantPodError";
import { guaranteeFetch } from "../../util/guaranteeFetch"; import { guaranteeFetch } from "../../util/guaranteeFetch";
import type { Resource } from "@ldo/connected"; import type { Resource } from "@ldo/connected";
import { UnexpectedResourceError } from "@ldo/connected"; import { UnexpectedResourceError, AbsentReadSuccess } from "@ldo/connected";
import { checkHeadersForRootContainer } from "./checkRootContainer"; import { checkHeadersForRootContainer } from "./checkRootContainer";
import { namedNode } from "@rdfjs/data-model"; import { namedNode } from "@rdfjs/data-model";
import type { SolidLeaf } from "../../resources/SolidLeaf"; import type { SolidLeaf } from "../../resources/SolidLeaf";

@ -3,10 +3,9 @@ import { changesToSparqlUpdate } from "@ldo/rdf-utils";
import type { Quad } from "@rdfjs/types"; import type { Quad } from "@rdfjs/types";
import { guaranteeFetch } from "../../util/guaranteeFetch"; import { guaranteeFetch } from "../../util/guaranteeFetch";
import type { Resource } from "@ldo/connected"; 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 type { HttpErrorResultType } from "../results/error/HttpErrorResult";
import { HttpErrorResult } from "../results/error/HttpErrorResult"; import { HttpErrorResult } from "../results/error/HttpErrorResult";
import { UpdateSuccess } from "../results/success/UpdateSuccess";
import type { DatasetRequestOptions } from "./requestOptions"; import type { DatasetRequestOptions } from "./requestOptions";
import type { SolidContainer } from "../../resources/SolidContainer"; import type { SolidContainer } from "../../resources/SolidContainer";
import type { SolidLeaf } from "../../resources/SolidLeaf"; import type { SolidLeaf } from "../../resources/SolidLeaf";

@ -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 { SolidLeaf } from "../../../resources/SolidLeaf";
import type { SolidContainer } from "../../../resources/SolidContainer"; import type { SolidContainer } from "../../../resources/SolidContainer";

@ -19,7 +19,6 @@ import type {
ReadResultError, ReadResultError,
} from "../requester/requests/readResource"; } from "../requester/requests/readResource";
import type { DeleteSuccess } from "../requester/results/success/DeleteSuccess"; 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 type { ContainerReadSuccess } from "../requester/results/success/SolidReadSuccess";
import { getParentUri, ldpContains } from "../util/rdfUtils"; import { getParentUri, ldpContains } from "../util/rdfUtils";
import { NoRootContainerError } from "../requester/results/error/NoRootContainerError"; import { NoRootContainerError } from "../requester/results/error/NoRootContainerError";
@ -30,7 +29,8 @@ import type {
SolidContainerUri, SolidContainerUri,
SolidLeafSlug, SolidLeafSlug,
} from "../types"; } from "../types";
import { AggregateSuccess } from "@ldo/connected"; import type { AbsentReadSuccess } from "@ldo/connected";
import { AggregateSuccess, IgnoredInvalidUpdateSuccess } from "@ldo/connected";
import { import {
Unfetched, Unfetched,
type ConnectedContext, type ConnectedContext,
@ -39,6 +39,7 @@ import {
import type { SolidConnectedPlugin } from "../SolidConnectedPlugin"; import type { SolidConnectedPlugin } from "../SolidConnectedPlugin";
import type { SolidLeaf } from "./SolidLeaf"; import type { SolidLeaf } from "./SolidLeaf";
import type { HttpErrorResultType } from "../requester/results/error/HttpErrorResult"; 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 * 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; if (createResult.isError) return createResult;
return { ...createResult, resource: this }; return { ...createResult, resource: this };
} }
/**
* You cannot update a Container, so we return an IgnoredInvalidUpdateSuccess
*/
async update(
_datasetChanges: DatasetChanges,
): Promise<IgnoredInvalidUpdateSuccess<this>> {
return new IgnoredInvalidUpdateSuccess(this);
}
} }

@ -10,18 +10,19 @@ import type { DeleteResult } from "../requester/requests/deleteResource";
import type { ReadLeafResult } from "../requester/requests/readResource"; import type { ReadLeafResult } from "../requester/requests/readResource";
import type { UpdateResult } from "../requester/requests/updateDataResource"; import type { UpdateResult } from "../requester/requests/updateDataResource";
import type { DeleteSuccess } from "../requester/results/success/DeleteSuccess"; import type { DeleteSuccess } from "../requester/results/success/DeleteSuccess";
import type { AbsentReadSuccess } from "../requester/results/success/SolidReadSuccess"; import { DataReadSuccess } from "../requester/results/success/SolidReadSuccess";
import type { import { BinaryReadSuccess } from "../requester/results/success/SolidReadSuccess";
BinaryReadSuccess,
DataReadSuccess,
} from "../requester/results/success/SolidReadSuccess";
import { getParentUri } from "../util/rdfUtils"; import { getParentUri } from "../util/rdfUtils";
import type { NoRootContainerError } from "../requester/results/error/NoRootContainerError"; import type { NoRootContainerError } from "../requester/results/error/NoRootContainerError";
import type { SharedStatuses } from "./SolidResource"; import type { SharedStatuses } from "./SolidResource";
import { SolidResource } from "./SolidResource"; import { SolidResource } from "./SolidResource";
import type { SolidLeafUri } from "../types"; import type { SolidLeafUri } from "../types";
import type { ResourceSuccess } from "@ldo/connected"; 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 { SolidConnectedPlugin } from "../SolidConnectedPlugin";
import type { SolidContainer } from "./SolidContainer"; import type { SolidContainer } from "./SolidContainer";
@ -253,31 +254,16 @@ export class SolidLeaf extends SolidResource {
*/ */
protected toReadResult(): ReadLeafResult { protected toReadResult(): ReadLeafResult {
if (this.isAbsent()) { if (this.isAbsent()) {
return { return new AbsentReadSuccess(this, true);
isError: false,
type: "absentReadSuccess",
uri: this.uri,
recalledFromMemory: true,
resource: this,
};
} else if (this.isBinary()) { } else if (this.isBinary()) {
return { return new BinaryReadSuccess(
isError: false, this,
type: "binaryReadSuccess", true,
uri: this.uri, this.binaryData!.blob,
recalledFromMemory: true, this.binaryData!.mimeType,
blob: this.binaryData!.blob, );
mimeType: this.binaryData!.mimeType,
resource: this,
};
} else { } else {
return { return new DataReadSuccess(this, true);
isError: false,
type: "dataReadSuccess",
uri: this.uri,
recalledFromMemory: true,
resource: this,
};
} }
} }

@ -1,9 +1,10 @@
import type { import type {
ConnectedContext, ConnectedContext,
ConnectedResult, ConnectedResult,
IgnoredInvalidUpdateSuccess,
ReadSuccess,
Resource, Resource,
ResourceEventEmitter, ResourceEventEmitter,
ResourceResult,
ResourceSuccess, ResourceSuccess,
Unfetched, Unfetched,
} from "@ldo/connected"; } from "@ldo/connected";
@ -18,10 +19,7 @@ import type {
} from "../notifications/SolidNotificationSubscription"; } from "../notifications/SolidNotificationSubscription";
import { Websocket2023NotificationSubscription } from "../notifications/Websocket2023NotificationSubscription"; import { Websocket2023NotificationSubscription } from "../notifications/Websocket2023NotificationSubscription";
import { getParentUri } from "../util/rdfUtils"; import { getParentUri } from "../util/rdfUtils";
import { import { isReadSuccess } from "../requester/results/success/SolidReadSuccess";
isReadSuccess,
type ReadSuccess,
} from "../requester/results/success/SolidReadSuccess";
import type { import type {
ReadContainerResult, ReadContainerResult,
ReadLeafResult, ReadLeafResult,
@ -51,6 +49,8 @@ import type { SolidNotificationMessage } from "../notifications/SolidNotificatio
import type { CreateSuccess } from "../requester/results/success/CreateSuccess"; import type { CreateSuccess } from "../requester/results/success/CreateSuccess";
import { GetWacUriSuccess } from "../wac/results/GetWacUriSuccess"; import { GetWacUriSuccess } from "../wac/results/GetWacUriSuccess";
import { GetWacRuleSuccess } from "../wac/results/GetWacRuleSuccess"; 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 * Statuses shared between both Leaf and Container
@ -141,10 +141,6 @@ export abstract class SolidResource
); );
} }
readIfAbsent(): Promise<ResourceResult<this>> {
throw new Error("Method not implemented.");
}
/** /**
* =========================================================================== * ===========================================================================
* GETTERS * GETTERS
@ -477,7 +473,7 @@ export abstract class SolidResource
this.absent = false; this.absent = false;
this.didInitialFetch = true; this.didInitialFetch = true;
if (isReadSuccess(result)) { if (isReadSuccess(result)) {
this.updateWithReadSuccess(result); this.updateWithReadSuccess(result as ReadSuccess<this>);
} }
} }
@ -547,6 +543,15 @@ export abstract class SolidResource
return result; return result;
} }
/**
* UPDATE METHODS
*/
abstract update(
datasetChanges: DatasetChanges,
): Promise<
UpdateResult<SolidLeaf> | IgnoredInvalidUpdateSuccess<SolidContainer>
>;
/** /**
* =========================================================================== * ===========================================================================
* PARENT CONTAINER METHODS * PARENT CONTAINER METHODS

@ -1,7 +1,10 @@
/* eslint-disable @typescript-eslint/no-explicit-any */
import type { ConnectedLdoDataset } from "./ConnectedLdoDataset"; import type { ConnectedLdoDataset } from "./ConnectedLdoDataset";
import type { ConnectedPlugin } from "./ConnectedPlugin"; import type { ConnectedPlugin } from "./ConnectedPlugin";
export type ConnectedContext<Plugins extends ConnectedPlugin[]> = { export type ConnectedContext<
Plugins extends ConnectedPlugin<any, any, any, any>[],
> = {
dataset: ConnectedLdoDataset<Plugins>; dataset: ConnectedLdoDataset<Plugins>;
} & { } & {
[P in Plugins[number] as P["name"]]: P["types"]["context"]; [P in Plugins[number] as P["name"]]: P["types"]["context"];

@ -11,7 +11,9 @@ import type {
} from "./IConnectedLdoDataset"; } from "./IConnectedLdoDataset";
import { ConnectedLdoTransactionDataset } from "./ConnectedLdoTransactionDataset"; import { ConnectedLdoTransactionDataset } from "./ConnectedLdoTransactionDataset";
export class ConnectedLdoDataset<Plugins extends ConnectedPlugin[]> export class ConnectedLdoDataset<
Plugins extends ConnectedPlugin<any, any, any, any>[],
>
extends LdoDataset extends LdoDataset
implements IConnectedLdoDataset<Plugins> implements IConnectedLdoDataset<Plugins>
{ {
@ -89,7 +91,7 @@ export class ConnectedLdoDataset<Plugins extends ConnectedPlugin[]>
let resource = this.resourceMap.get(normalizedUri); let resource = this.resourceMap.get(normalizedUri);
if (!resource) { if (!resource) {
// eslint-disable-next-line @typescript-eslint/ban-ts-comment // 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); resource = plugin.getResource(uri, this.context);
this.resourceMap.set(normalizedUri, resource); this.resourceMap.set(normalizedUri, resource);
} }
@ -103,7 +105,7 @@ export class ConnectedLdoDataset<Plugins extends ConnectedPlugin[]>
>(name: Name): Promise<ReturnType<Plugin["createResource"]>> { >(name: Name): Promise<ReturnType<Plugin["createResource"]>> {
const validPlugin = this.plugins.find((plugin) => name === plugin.name)!; const validPlugin = this.plugins.find((plugin) => name === plugin.name)!;
// eslint-disable-next-line @typescript-eslint/ban-ts-comment // 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); const newResourceResult = await validPlugin.createResource(this.context);
// HACK: cast to any // HACK: cast to any
if (newResourceResult.isError) return newResourceResult as any; if (newResourceResult.isError) return newResourceResult as any;

@ -9,7 +9,10 @@ import type { DatasetChanges, GraphNode } from "@ldo/rdf-utils";
import type { ConnectedPlugin } from "./ConnectedPlugin"; import type { ConnectedPlugin } from "./ConnectedPlugin";
import type { ConnectedContext } from "./ConnectedContext"; import type { ConnectedContext } from "./ConnectedContext";
import type { InvalidIdentifierResource } from "./InvalidIdentifierResource"; import type { InvalidIdentifierResource } from "./InvalidIdentifierResource";
import type { IConnectedLdoDataset } from "./IConnectedLdoDataset"; import type {
IConnectedLdoDataset,
ReturnTypeFromArgs,
} from "./IConnectedLdoDataset";
import { splitChangesByGraph } from "./util/splitChangesByGraph"; import { splitChangesByGraph } from "./util/splitChangesByGraph";
import type { IgnoredInvalidUpdateSuccess } from "./results/success/UpdateSuccess"; import type { IgnoredInvalidUpdateSuccess } from "./results/success/UpdateSuccess";
import { UpdateDefaultGraphSuccess } from "./results/success/UpdateSuccess"; import { UpdateDefaultGraphSuccess } from "./results/success/UpdateSuccess";
@ -87,12 +90,10 @@ export class ConnectedLdoTransactionDataset<Plugins extends ConnectedPlugin[]>
UriType extends string, UriType extends string,
>( >(
uri: UriType, uri: UriType,
pluginName?: Name | undefined, pluginName?: Name,
): UriType extends Plugin["types"]["uri"] ): UriType extends Plugin["types"]["uri"]
? Plugin["getResource"] extends (arg: UriType, context: any) => infer R ? ReturnTypeFromArgs<Plugin["getResource"], UriType>
? R : ReturnType<Plugin["getResource"]> | InvalidIdentifierResource {
: never
: InvalidIdentifierResource | ReturnType<Plugin["getResource"]> {
return this.context.dataset.getResource(uri, pluginName); return this.context.dataset.getResource(uri, pluginName);
} }

@ -12,12 +12,12 @@ export interface ConnectedPlugin<
name: Name; name: Name;
getResource( getResource(
uri: UriType, uri: UriType,
context: ConnectedContext<ConnectedPlugin[]>, context: ConnectedContext<ConnectedPlugin<any, any, any, any>[]>,
): ResourceType; ): ResourceType;
createResource( createResource(
context: ConnectedContext<ConnectedPlugin[]>, context: ConnectedContext<ConnectedPlugin<any, any, any, any>[]>,
): Promise<ResourceType | ErrorResult>; ): Promise<ResourceType | ErrorResult>;
isUriValid(uri: UriType): uri is UriType; isUriValid(uri: string): uri is UriType;
normalizeUri?: (uri: UriType) => UriType; normalizeUri?: (uri: UriType) => UriType;
initialContext: ContextType; initialContext: ContextType;
// This object exists to transfer typescript types. It does not need to be // This object exists to transfer typescript types. It does not need to be

@ -41,7 +41,7 @@ export class InvalidIdentifierResource
async read(): Promise<InvalidUriError<this>> { async read(): Promise<InvalidUriError<this>> {
return this.status; return this.status;
} }
async readIfAbsent(): Promise<InvalidUriError<this>> { async readIfUnfetched(): Promise<InvalidUriError<this>> {
return this.status; return this.status;
} }
async update(): Promise<InvalidUriError<this>> { async update(): Promise<InvalidUriError<this>> {

@ -2,7 +2,10 @@
import type TypedEmitter from "typed-emitter"; import type TypedEmitter from "typed-emitter";
import type { ConnectedResult } from "./results/ConnectedResult"; import type { ConnectedResult } from "./results/ConnectedResult";
import type { DatasetChanges } from "@ldo/rdf-utils"; 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 { ResourceError } from "./results/error/ErrorResult";
import type { ReadSuccess } from "./results/success/ReadSuccess"; import type { ReadSuccess } from "./results/success/ReadSuccess";
@ -25,10 +28,12 @@ export interface Resource<UriType extends string = string>
isAbsent(): boolean | undefined; isAbsent(): boolean | undefined;
isSubscribedToNotifications(): boolean; isSubscribedToNotifications(): boolean;
read(): Promise<ReadSuccess<any> | ResourceError<any>>; read(): Promise<ReadSuccess<any> | ResourceError<any>>;
readIfAbsent(): Promise<ReadSuccess<any> | ResourceError<any>>; readIfUnfetched(): Promise<ReadSuccess<any> | ResourceError<any>>;
update( update(
datasetChanges: DatasetChanges, datasetChanges: DatasetChanges,
): Promise<UpdateSuccess<any> | ResourceError<any>>; ): Promise<
UpdateSuccess<any> | IgnoredInvalidUpdateSuccess<any> | ResourceError<any>
>;
subscribeToNotifications(callbacks?: { subscribeToNotifications(callbacks?: {
onNotification: (message: any) => void; onNotification: (message: any) => void;
onNotificationError: (err: Error) => void; onNotificationError: (err: Error) => void;

@ -15,3 +15,5 @@ export * from "./results/error/InvalidUriError";
export * from "./results/error/NotificationErrors"; export * from "./results/error/NotificationErrors";
export * from "./results/success/SuccessResult"; export * from "./results/success/SuccessResult";
export * from "./results/success/Unfetched"; export * from "./results/success/Unfetched";
export * from "./results/success/ReadSuccess";
export * from "./results/success/UpdateSuccess";

@ -1,5 +1,5 @@
import { ResourceSuccess } from "@ldo/connected"; import type { Resource } from "../../Resource";
import type { Resource } from "@ldo/connected"; import { ResourceSuccess } from "./SuccessResult";
/** /**
* Indicates that the request to read a resource was a success * Indicates that the request to read a resource was a success

@ -1,5 +1,5 @@
import { ResourceSuccess, SuccessResult } from "@ldo/connected"; import type { Resource } from "../../Resource";
import type { Resource } from "@ldo/connected"; import { ResourceSuccess, SuccessResult } from "./SuccessResult";
/** /**
* Indicates that an update request to a resource was successful * Indicates that an update request to a resource was successful

@ -50,7 +50,7 @@ export class MockResouce
read(): Promise<ReadSuccess<any> | ResourceError<any>> { read(): Promise<ReadSuccess<any> | ResourceError<any>> {
throw new Error("Method not implemented."); throw new Error("Method not implemented.");
} }
readIfAbsent(): Promise<ReadSuccess<any> | ResourceError<any>> { readIfUnfetched(): Promise<ReadSuccess<any> | ResourceError<any>> {
throw new Error("Method not implemented."); throw new Error("Method not implemented.");
} }
update( update(

Loading…
Cancel
Save