@inrupt/solid-client
Version:
Make your web apps work with Solid Pods.
338 lines (320 loc) • 13.6 kB
text/typescript
// Copyright Inrupt Inc.
//
// Permission is hereby granted, free of charge, to any person obtaining a copy
// of this software and associated documentation files (the "Software"), to deal in
// the Software without restriction, including without limitation the rights to use,
// copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the
// Software, and to permit persons to whom the Software is furnished to do so,
// subject to the following conditions:
//
// The above copyright notice and this permission notice shall be included in
// all copies or substantial portions of the Software.
//
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
// INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
// PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
//
import type { Literal, NamedNode, Quad_Object } from "@rdfjs/types";
import type { Thing, Url, UrlString } from "../interfaces";
import type { Time } from "../datatypes";
import { internal_isValidUrl } from "../datatypes";
import { internal_throwIfNotThing } from "./thing.internal";
import { removeAll } from "./remove";
import {
isThing,
ValidPropertyUrlExpectedError,
ValidValueUrlExpectedError,
} from "./thing";
import {
addBoolean,
addDatetime,
addDate,
addDecimal,
addInteger,
addLiteral,
addNamedNode,
addStringNoLocale,
addStringWithLocale,
addTerm,
addTime,
addUrl,
} from "./add";
/**
* Create a new Thing with existing values replaced by the given URL for the given Property.
*
* To preserve existing values, see [[addUrl]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set a URL value on.
* @param property Property for which to set the given URL value.
* @param url URL to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
*/
export const setUrl: SetOfType<Url | UrlString | Thing> = (
thing,
property,
url,
) => {
internal_throwIfNotThing(thing);
if (!internal_isValidUrl(property)) {
throw new ValidPropertyUrlExpectedError(property);
}
if (!isThing(url) && !internal_isValidUrl(url)) {
throw new ValidValueUrlExpectedError(url);
}
return addUrl(removeAll(thing, property), property, url);
};
/** @hidden Alias of [[setUrl]] for those who prefer IRI terminology. */
export const setIri = setUrl;
/**
* Create a new Thing with existing values replaced by the given boolean for the given Property.
*
* To preserve existing values, see [[addBoolean]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set a boolean value on.
* @param property Property for which to set the given boolean value.
* @param value Boolean to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
*/
export const setBoolean: SetOfType<boolean> = (thing, property, value) => {
internal_throwIfNotThing(thing);
return addBoolean(removeAll(thing, property), property, value);
};
/**
* Create a new Thing with existing values replaced by the given datetime for the given Property.
*
* To preserve existing values, see [[addDatetime]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set an datetime value on.
* @param property Property for which to set the given datetime value.
* @param value Datetime to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
*/
export const setDatetime: SetOfType<Date> = (thing, property, value) => {
internal_throwIfNotThing(thing);
return addDatetime(removeAll(thing, property), property, value);
};
/**
* Create a new Thing with existing values replaced by the given date for the given Property.
*
* To preserve existing values, see [[addDate]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set an date value on.
* @param property Property for which to set the given date value.
* @param value Date to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
* @since 1.10.0
*/
export const setDate: SetOfType<Date> = (thing, property, value) => {
internal_throwIfNotThing(thing);
return addDate(removeAll(thing, property), property, value);
};
/**
* Create a new Thing with existing values replaced by the given time for the given Property.
*
* To preserve existing values, see [[addTime]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set an time value on.
* @param property Property for which to set the given time value.
* @param value time to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
* @since 1.10.0
*/
export const setTime: SetOfType<Time> = (thing, property, value) => {
internal_throwIfNotThing(thing);
return addTime(removeAll(thing, property), property, value);
};
/**
* Create a new Thing with existing values replaced by the given decimal for the given Property.
*
* To preserve existing values, see [[addDecimal]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set a decimal value on.
* @param property Property for which to set the given decimal value.
* @param value Decimal to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
*/
export const setDecimal: SetOfType<number> = (thing, property, value) => {
internal_throwIfNotThing(thing);
return addDecimal(removeAll(thing, property), property, value);
};
/**
* Create a new Thing with existing values replaced by the given integer for the given Property.
*
* To preserve existing values, see [[addInteger]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set an integer value on.
* @param property Property for which to set the given integer value.
* @param value Integer to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
*/
export const setInteger: SetOfType<number> = (thing, property, value) => {
internal_throwIfNotThing(thing);
return addInteger(removeAll(thing, property), property, value);
};
/**
* Create a new Thing with existing values replaced by the given English string for the given
* Property.
*
* To preserve existing values, see [[addStringEnglish]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set a localised string value on.
* @param property Property for which to set the given localised string value.
* @param value Localised string to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
* @since 1.13.0
*/
export function setStringEnglish<T extends Thing>(
thing: T,
property: Url | UrlString,
value: string,
): T {
return setStringWithLocale(thing, property, value, "en");
}
/**
* Create a new Thing with existing values replaced by the given localised string for the given Property.
*
* To preserve existing values, see [[addStringWithLocale]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set a localised string value on.
* @param property Property for which to set the given localised string value.
* @param value Localised string to set on `thing` for the given `property`.
* @param locale Locale of the added string.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
*/
export function setStringWithLocale<T extends Thing>(
thing: T,
property: Url | UrlString,
value: string,
locale: string,
): T {
internal_throwIfNotThing(thing);
return addStringWithLocale(
removeAll(thing, property),
property,
value,
locale,
);
}
/**
* Create a new Thing with existing values replaced by the given unlocalised string for the given Property.
*
* To preserve existing values, see [[addStringNoLocale]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set an unlocalised string value on.
* @param property Property for which to set the given unlocalised string value.
* @param value Unlocalised string to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
*/
export const setStringNoLocale: SetOfType<string> = (
thing,
property,
value,
) => {
internal_throwIfNotThing(thing);
return addStringNoLocale(removeAll(thing, property), property, value);
};
/**
* Create a new Thing with existing values replaced by the given Named Node for the given Property.
*
* This replaces existing values for the given Property. To preserve them, see [[addNamedNode]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @ignore This should not be needed due to the other set*() functions. If you do find yourself needing it, please file a feature request for your use case.
* @param thing The [[Thing]] to set a NamedNode on.
* @param property Property for which to set the value.
* @param value The NamedNode to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
*/
export function setNamedNode<T extends Thing>(
thing: T,
property: Url | UrlString,
value: NamedNode,
): T {
internal_throwIfNotThing(thing);
return addNamedNode(removeAll(thing, property), property, value);
}
/**
* Create a new Thing with existing values replaced by the given Literal for the given Property.
*
* This replaces existing values for the given Property. To preserve them, see [[addLiteral]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @ignore This should not be needed due to the other set*() functions. If you do find yourself needing it, please file a feature request for your use case.
* @param thing The [[Thing]] to set a Literal on.
* @param property Property for which to set the value.
* @param value The Literal to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
*/
export function setLiteral<T extends Thing>(
thing: T,
property: Url | UrlString,
value: Literal,
): T {
internal_throwIfNotThing(thing);
return addLiteral(removeAll(thing, property), property, value);
}
/**
* Creates a new Thing with existing values replaced by the given Term for the given Property.
*
* This replaces existing values for the given Property. To preserve them, see [[addTerm]].
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @ignore This should not be needed due to the other set*() functions. If you do find yourself needing it, please file a feature request for your use case.
* @param thing The [[Thing]] to set a Term on.
* @param property Property for which to set the value.
* @param value The raw RDF/JS value to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
* @since 0.3.0
*/
export function setTerm<T extends Thing>(
thing: T,
property: Url | UrlString,
value: Quad_Object,
): T {
internal_throwIfNotThing(thing);
if (!internal_isValidUrl(property)) {
throw new ValidPropertyUrlExpectedError(property);
}
return addTerm(removeAll(thing, property), property, value);
}
/**
* Create a new Thing with existing values replaced by the given value for the given Property.
*
* The original `thing` is not modified; this function returns a cloned Thing with updated values.
*
* @param thing Thing to set a value on.
* @param property Property for which to set the given value.
* @param value Value to set on `thing` for the given `property`.
* @returns A new Thing equal to the input Thing with existing values replaced by the given value for the given Property.
*/
export type SetOfType<Type> = <T extends Thing>(
thing: T,
property: Url | UrlString,
value: Type,
) => T;