pebblebed
Version:
Simplified interactions with Google Datastore for NodeJS
199 lines (177 loc) • 5.63 kB
text/typescript
import {
IOJoiSchemaObjectPropertyMetaInput,
IOJoiSchemaPropertyMetaInput,
IOJoiSchemaSerializedJsonPropertyMetaInput,
} from "../";
import Core from "../Core";
import * as Joi from "joi";
export type TPebblebedJoiTypeFunction<T, K, I = IOJoiSchemaPropertyMetaInput<K>, E = any> = (
meta?: I,
extraOptions?: E
) => T;
function alterSchemaForPropertyMeta<T extends Joi.AnySchema, K>(
schema: T,
meta: IOJoiSchemaPropertyMetaInput<K>
): T {
if (meta.required) {
return schema.required();
}
return schema.allow(null);
}
// console.log(Joi);
// console.log(require.resolve("joi"))
export const PebbleStringId: () => Joi.StringSchema = () =>
Joi.string()
.required()
.meta({
__typeDefinition: true,
type: "string",
role: "id",
});
export const PebbleStringIdStrict: () => Joi.StringSchema = () =>
PebbleStringId().regex(/^[^\/\s]+$/, "strict Datastore string id");
export const PebbleStringIdStrictWithFirebase: () => Joi.StringSchema = () =>
PebbleStringId().regex(/^[^\/\s\[\].$#]+$/, "strict Firebase-compliant string id");
export const PebbleIntegerId: () => Joi.NumberSchema = () =>
Core.Joi.number()
.integer()
.meta({
__typeDefinition: true,
type: "int",
role: "id",
});
export const PebbleInteger: TPebblebedJoiTypeFunction<Joi.NumberSchema, number> = (meta = {}) =>
alterSchemaForPropertyMeta<Joi.NumberSchema, number>(
Core.Joi.number()
.integer()
.meta({
__typeDefinition: true,
type: "int",
propertyMeta: meta,
}),
meta
);
export const PebbleDouble: TPebblebedJoiTypeFunction<Joi.NumberSchema, number> = (meta = {}) =>
alterSchemaForPropertyMeta<Joi.NumberSchema, number>(
Core.Joi.number().meta({
__typeDefinition: true,
type: "double",
propertyMeta: meta,
}),
meta
);
export const PebbleGeoPoint: TPebblebedJoiTypeFunction<Joi.AnySchema, any> = (meta = {}) =>
alterSchemaForPropertyMeta<Joi.AnySchema, any>(
Core.Joi.any().meta({
__typeDefinition: true,
type: "geoPoint",
propertyMeta: meta,
}),
meta
);
interface IPebbleStringExtraOptions {
allowEmpty?: boolean;
}
export const PebbleString: TPebblebedJoiTypeFunction<Joi.StringSchema,
string,
IOJoiSchemaPropertyMetaInput<string>,
IPebbleStringExtraOptions> = (meta = {}, {allowEmpty = true}: IPebbleStringExtraOptions = {}) =>
alterSchemaForPropertyMeta<Joi.StringSchema, string>(
allowEmpty
? Core.Joi.string()
.allow("")
.meta({
__typeDefinition: true,
type: "string",
propertyMeta: meta,
})
: Core.Joi.string().min(1).meta({
__typeDefinition: true,
type: "string",
propertyMeta: meta,
}),
meta
);
export const PebbleBoolean: TPebblebedJoiTypeFunction<Joi.BooleanSchema, boolean> = (meta = {}) =>
alterSchemaForPropertyMeta<Joi.BooleanSchema, boolean>(
Core.Joi.boolean().meta({
__typeDefinition: true,
type: "boolean",
propertyMeta: meta,
}),
meta
);
export const PebbleDateTime: TPebblebedJoiTypeFunction<Joi.DateSchema, Date> = (meta = {}) =>
alterSchemaForPropertyMeta<Joi.DateSchema, Date>(
Core.Joi.date().meta({
__typeDefinition: true,
type: "datetime",
propertyMeta: meta,
}),
meta
);
export const PebbleArray: TPebblebedJoiTypeFunction<Joi.ArraySchema, any[]> = (meta = {}) =>
alterSchemaForPropertyMeta<Joi.ArraySchema, any[]>(
Core.Joi.array().meta({
__typeDefinition: true,
type: "array",
propertyMeta: meta,
}),
meta
);
export const PebbleObject: TPebblebedJoiTypeFunction<Joi.ObjectSchema,
object,
IOJoiSchemaPropertyMetaInput<object> & IOJoiSchemaObjectPropertyMetaInput> = (meta = {}) =>
alterSchemaForPropertyMeta<Joi.ObjectSchema, object>(
Core.Joi.object().meta({
__typeDefinition: true,
type: "object",
propertyMeta: meta,
}),
meta
);
export const PebbleSerializedJson: TPebblebedJoiTypeFunction<Joi.AnySchema,
any,
IOJoiSchemaPropertyMetaInput<any> & IOJoiSchemaSerializedJsonPropertyMetaInput> = (meta = {}) =>
meta.joiSchema != null
? alterSchemaForPropertyMeta<Joi.AnySchema, any>(
meta.joiSchema.meta({
__typeDefinition: true,
type: "serializedJson",
propertyMeta: meta,
}),
meta
)
: alterSchemaForPropertyMeta<Joi.AnySchema, any>(
Core.Joi.any().meta({
__typeDefinition: true,
type: "serializedJson",
propertyMeta: meta,
}),
meta
);
const dateTimeUpdated: TPebblebedJoiTypeFunction<Joi.DateSchema, Date> = (meta: {}) => {
return PebbleDateTime({onSave: () => new Date(), ...meta});
};
const dateTimeCreated: TPebblebedJoiTypeFunction<Joi.DateSchema, Date> = (meta: {}) => {
return PebbleDateTime({onSave: date => (date ? date : new Date())});
};
export const types = {
integerId: PebbleIntegerId,
stringId: PebbleStringId,
stringIdStrict: PebbleStringIdStrict,
stringIdStrictFirebase: PebbleStringIdStrictWithFirebase,
integer: PebbleInteger,
string: PebbleString,
double: PebbleDouble,
geoPoint: PebbleGeoPoint,
boolean: PebbleBoolean,
dateTime: PebbleDateTime,
array: PebbleArray,
object: PebbleObject,
serializedJson: PebbleSerializedJson,
specialized: {
dateTimeUpdated,
dateTimeCreated,
},
};