* wip * stash * fix: make authenticationId nullable fk * fix: apply generics to resolve compile time type errors * fix: loosen integration settings * chore: refactor into functional component * feat: pass integrations all the way to embeds * perf: avoid re-fetching integrations * fix: change attr name to avoid type overlap * feat: use hostname from embed settings in matcher * Revert "feat: use hostname from embed settings in matcher" This reverts commit e7485d9cda4dcf45104e460465ca104a56c67ddc. * feat: refactor into a class * chore: refactor url regex formation as a util * fix: escape regex special chars * fix: remove in-house escapeRegExp in favor of lodash's * fix: sanitize url * perf: memoize embeds * fix: rename hostname to url and allow spreading entire settings instead of just url * fix: replace diagrams with drawio * fix: rename * fix: support self-hosted and saas both * fix: assert on settings url * fix: move embed integrations loading to hook * fix: address review comments * fix: use observer in favor of explicit state setters * fix: refactor useEmbedIntegrations into useEmbeds * fix: use translations for toasts Co-authored-by: Tom Moor <tom.moor@gmail.com>
107 lines
2.5 KiB
TypeScript
107 lines
2.5 KiB
TypeScript
import { isArrayLike } from "lodash";
|
|
import validator from "validator";
|
|
import { validateColorHex } from "../shared/utils/color";
|
|
import { validateIndexCharacters } from "../shared/utils/indexCharacters";
|
|
import { ParamRequiredError, ValidationError } from "./errors";
|
|
|
|
export const assertPresent = (value: unknown, message: string) => {
|
|
if (value === undefined || value === null || value === "") {
|
|
throw ParamRequiredError(message);
|
|
}
|
|
};
|
|
|
|
export const assertArray = (value: unknown, message?: string) => {
|
|
if (!isArrayLike(value)) {
|
|
throw ValidationError(message);
|
|
}
|
|
};
|
|
|
|
export const assertIn = (
|
|
value: string,
|
|
options: (string | undefined | null)[],
|
|
message?: string
|
|
) => {
|
|
if (!options.includes(value)) {
|
|
throw ValidationError(message ?? `Must be one of ${options.join(", ")}`);
|
|
}
|
|
};
|
|
|
|
export const assertSort = (
|
|
value: string,
|
|
model: any,
|
|
message = "Invalid sort parameter"
|
|
) => {
|
|
if (!Object.keys(model.rawAttributes).includes(value)) {
|
|
throw ValidationError(message);
|
|
}
|
|
};
|
|
|
|
export const assertNotEmpty = (value: unknown, message: string) => {
|
|
assertPresent(value, message);
|
|
|
|
if (typeof value === "string" && value.trim() === "") {
|
|
throw ValidationError(message);
|
|
}
|
|
};
|
|
|
|
export const assertEmail = (value = "", message?: string) => {
|
|
if (!validator.isEmail(value)) {
|
|
throw ValidationError(message);
|
|
}
|
|
};
|
|
|
|
export const assertUrl = (value = "", message?: string) => {
|
|
if (
|
|
!validator.isURL(value, {
|
|
protocols: ["http", "https"],
|
|
require_valid_protocol: true,
|
|
})
|
|
) {
|
|
throw ValidationError(message ?? `${value} is an invalid url!`);
|
|
}
|
|
};
|
|
|
|
export const assertUuid = (value: unknown, message?: string) => {
|
|
if (typeof value !== "string") {
|
|
throw ValidationError(message);
|
|
}
|
|
if (!validator.isUUID(value)) {
|
|
throw ValidationError(message);
|
|
}
|
|
};
|
|
|
|
export const assertPositiveInteger = (value: unknown, message?: string) => {
|
|
if (
|
|
!validator.isInt(String(value), {
|
|
min: 0,
|
|
})
|
|
) {
|
|
throw ValidationError(message);
|
|
}
|
|
};
|
|
|
|
export const assertHexColor = (value: string, message?: string) => {
|
|
if (!validateColorHex(value)) {
|
|
throw ValidationError(message);
|
|
}
|
|
};
|
|
|
|
export const assertValueInArray = (
|
|
value: string,
|
|
values: string[],
|
|
message?: string
|
|
) => {
|
|
if (!values.includes(value)) {
|
|
throw ValidationError(message);
|
|
}
|
|
};
|
|
|
|
export const assertIndexCharacters = (
|
|
value: string,
|
|
message = "index must be between x20 to x7E ASCII"
|
|
) => {
|
|
if (!validateIndexCharacters(value)) {
|
|
throw ValidationError(message);
|
|
}
|
|
};
|