@loomcore/common 0.0.42 → 0.0.44

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,11 +1,11 @@
1
- import { AppId } from '../types/app.types.js';
1
+ import { AppIdType } from '../types/app.types.js';
2
2
  export interface IAuditable {
3
3
  _created: Date;
4
- _createdBy: AppId;
4
+ _createdBy: AppIdType;
5
5
  _updated: Date;
6
- _updatedBy: AppId;
6
+ _updatedBy: AppIdType;
7
7
  _deleted?: Date;
8
- _deletedBy?: AppId;
8
+ _deletedBy?: AppIdType;
9
9
  }
10
10
  export declare const AuditableSchema: import("@sinclair/typebox").TObject<{
11
11
  _created: import("@sinclair/typebox").TTransform<import("@sinclair/typebox").TString, Date>;
@@ -0,0 +1,15 @@
1
+ import type { IAuditable, IEntity } from "@loomcore/common/models";
2
+ import { AppIdType } from "../types/app.types.js";
3
+ export interface IEmailAddressModel extends IEntity, IAuditable {
4
+ personId: AppIdType;
5
+ emailAddress: string;
6
+ emailAddressType: string;
7
+ isDefault: boolean;
8
+ }
9
+ export declare const emailAddressSchema: import("@sinclair/typebox").TObject<{
10
+ personId: import("@sinclair/typebox").TSchema;
11
+ emailAddress: import("@sinclair/typebox").TString;
12
+ emailAddressType: import("@sinclair/typebox").TString;
13
+ isDefault: import("@sinclair/typebox").TBoolean;
14
+ }>;
15
+ export declare const emailAddressModelSpec: import("@loomcore/common/models").IModelSpec<import("@sinclair/typebox").TSchema>;
@@ -0,0 +1,11 @@
1
+ import { entityUtils } from "@loomcore/common/utils";
2
+ import { Type } from "@sinclair/typebox";
3
+ import { getIdSchema } from "../validation/index.js";
4
+ const idSchema = getIdSchema();
5
+ export const emailAddressSchema = Type.Object({
6
+ personId: idSchema,
7
+ emailAddress: Type.String(),
8
+ emailAddressType: Type.String(),
9
+ isDefault: Type.Boolean(),
10
+ });
11
+ export const emailAddressModelSpec = entityUtils.getModelSpec(emailAddressSchema, { isAuditable: true });
@@ -1,7 +1,7 @@
1
- import { AppId } from '../types/app.types.js';
1
+ import { AppIdType } from '../types/app.types.js';
2
2
  export interface IEntity {
3
- _id: AppId;
4
- _orgId?: AppId;
3
+ _id: AppIdType;
4
+ _orgId?: AppIdType;
5
5
  }
6
6
  export declare const EntitySchema: import("@sinclair/typebox").TObject<{
7
7
  _id: import("@sinclair/typebox").TSchema;
@@ -1,7 +1,7 @@
1
1
  import { IAuditable } from './auditable.model.js';
2
- import { AppId } from '../types/app.types.js';
2
+ import { AppIdType } from '../types/app.types.js';
3
3
  export interface IOrganization extends IAuditable {
4
- _id: AppId;
4
+ _id: AppIdType;
5
5
  name: string;
6
6
  code: string;
7
7
  description?: string;
@@ -0,0 +1,39 @@
1
+ import type { IAuditable, IEntity } from "@loomcore/common/models";
2
+ import { IEmailAddressModel } from "./email-address.model.js";
3
+ import { IPhoneNumberModel } from "./phone-number.model.js";
4
+ export interface IPersonModel extends IEntity, IAuditable {
5
+ externalId: string | null;
6
+ firstName: string;
7
+ middleName: string | null;
8
+ lastName: string;
9
+ emailAddresses: IEmailAddressModel[];
10
+ phoneNumbers: IPhoneNumberModel[];
11
+ isAgent: boolean;
12
+ isClient: boolean;
13
+ isEmployee: boolean;
14
+ dateOfBirth: Date | null;
15
+ extendedTypes: number;
16
+ }
17
+ export declare const personSchema: import("@sinclair/typebox").TObject<{
18
+ externalId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
19
+ firstName: import("@sinclair/typebox").TString;
20
+ middleName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
21
+ lastName: import("@sinclair/typebox").TString;
22
+ emailAddresses: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
23
+ personId: import("@sinclair/typebox").TSchema;
24
+ emailAddress: import("@sinclair/typebox").TString;
25
+ emailAddressType: import("@sinclair/typebox").TString;
26
+ isDefault: import("@sinclair/typebox").TBoolean;
27
+ }>>;
28
+ phoneNumbers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
29
+ phoneNumber: import("@sinclair/typebox").TString;
30
+ phoneNumberType: import("@sinclair/typebox").TString;
31
+ isDefault: import("@sinclair/typebox").TBoolean;
32
+ }>>;
33
+ isAgent: import("@sinclair/typebox").TBoolean;
34
+ isClient: import("@sinclair/typebox").TBoolean;
35
+ isEmployee: import("@sinclair/typebox").TBoolean;
36
+ dateOfBirth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
37
+ extendedTypes: import("@sinclair/typebox").TNumber;
38
+ }>;
39
+ export declare const personModelSpec: import("@loomcore/common/models").IModelSpec<import("@sinclair/typebox").TSchema>;
@@ -0,0 +1,18 @@
1
+ import { entityUtils } from "@loomcore/common/utils";
2
+ import { Type } from "@sinclair/typebox";
3
+ import { emailAddressSchema } from "./email-address.model.js";
4
+ import { phoneNumberSchema } from "./phone-number.model.js";
5
+ export const personSchema = Type.Object({
6
+ externalId: Type.Optional(Type.String()),
7
+ firstName: Type.String(),
8
+ middleName: Type.Optional(Type.String()),
9
+ lastName: Type.String(),
10
+ emailAddresses: Type.Array(emailAddressSchema),
11
+ phoneNumbers: Type.Array(phoneNumberSchema),
12
+ isAgent: Type.Boolean(),
13
+ isClient: Type.Boolean(),
14
+ isEmployee: Type.Boolean(),
15
+ dateOfBirth: Type.Optional(Type.String()),
16
+ extendedTypes: Type.Number(),
17
+ });
18
+ export const personModelSpec = entityUtils.getModelSpec(personSchema);
@@ -0,0 +1,12 @@
1
+ import { IAuditable, IEntity } from "@loomcore/common/models";
2
+ export interface IPhoneNumberModel extends IEntity, IAuditable {
3
+ phoneNumber: string;
4
+ phoneNumberType: string;
5
+ isDefault: boolean;
6
+ }
7
+ export declare const phoneNumberSchema: import("@sinclair/typebox").TObject<{
8
+ phoneNumber: import("@sinclair/typebox").TString;
9
+ phoneNumberType: import("@sinclair/typebox").TString;
10
+ isDefault: import("@sinclair/typebox").TBoolean;
11
+ }>;
12
+ export declare const phoneNumberModelSpec: import("@loomcore/common/models").IModelSpec<import("@sinclair/typebox").TSchema>;
@@ -0,0 +1,8 @@
1
+ import { entityUtils } from "@loomcore/common/utils";
2
+ import { Type } from "@sinclair/typebox";
3
+ export const phoneNumberSchema = Type.Object({
4
+ phoneNumber: Type.String(),
5
+ phoneNumberType: Type.String(),
6
+ isDefault: Type.Boolean(),
7
+ });
8
+ export const phoneNumberModelSpec = entityUtils.getModelSpec(phoneNumberSchema, { isAuditable: true });
@@ -28,11 +28,28 @@ export function initializeSystemUserContext(systemEmail, metaOrg) {
28
28
  user: {
29
29
  _id: systemId,
30
30
  _orgId: metaOrg?._id,
31
+ external_id: 'system',
31
32
  email: systemEmail,
32
- firstName: 'System',
33
- lastName: 'User',
34
33
  displayName: 'System User',
35
34
  password: 'systemPassword',
35
+ person: {
36
+ _id: systemId,
37
+ externalId: 'system',
38
+ firstName: 'System',
39
+ middleName: null,
40
+ lastName: 'User',
41
+ emailAddresses: [],
42
+ phoneNumbers: [],
43
+ isAgent: true,
44
+ isClient: false,
45
+ isEmployee: false,
46
+ dateOfBirth: null,
47
+ extendedTypes: 0,
48
+ _created: new Date(),
49
+ _createdBy: systemId,
50
+ _updated: new Date(),
51
+ _updatedBy: systemId,
52
+ },
36
53
  _created: new Date(),
37
54
  _createdBy: systemId,
38
55
  _updated: new Date(),
@@ -1,11 +1,12 @@
1
1
  import { IAuditable } from './auditable.model.js';
2
2
  import { IEntity } from './entity.model.js';
3
+ import { IPersonModel } from './person.model.js';
3
4
  export interface IUser extends IEntity, IAuditable {
5
+ external_id: string | null;
4
6
  email: string;
5
- firstName?: string;
6
- lastName?: string;
7
7
  displayName?: string;
8
8
  password: string;
9
+ person: IPersonModel;
9
10
  _lastLoggedIn?: Date;
10
11
  _lastPasswordChange?: Date;
11
12
  }
@@ -16,20 +17,62 @@ export declare const passwordValidator: import("@sinclair/typebox/compiler").Typ
16
17
  password: import("@sinclair/typebox").TString;
17
18
  }>>;
18
19
  export declare const UserSchema: import("@sinclair/typebox").TObject<{
20
+ external_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
19
21
  email: import("@sinclair/typebox").TString;
20
- firstName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
21
- lastName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
22
22
  displayName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
23
23
  password: import("@sinclair/typebox").TString;
24
+ person: import("@sinclair/typebox").TObject<{
25
+ externalId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
26
+ firstName: import("@sinclair/typebox").TString;
27
+ middleName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
28
+ lastName: import("@sinclair/typebox").TString;
29
+ emailAddresses: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
30
+ personId: import("@sinclair/typebox").TSchema;
31
+ emailAddress: import("@sinclair/typebox").TString;
32
+ emailAddressType: import("@sinclair/typebox").TString;
33
+ isDefault: import("@sinclair/typebox").TBoolean;
34
+ }>>;
35
+ phoneNumbers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
36
+ phoneNumber: import("@sinclair/typebox").TString;
37
+ phoneNumberType: import("@sinclair/typebox").TString;
38
+ isDefault: import("@sinclair/typebox").TBoolean;
39
+ }>>;
40
+ isAgent: import("@sinclair/typebox").TBoolean;
41
+ isClient: import("@sinclair/typebox").TBoolean;
42
+ isEmployee: import("@sinclair/typebox").TBoolean;
43
+ dateOfBirth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
44
+ extendedTypes: import("@sinclair/typebox").TNumber;
45
+ }>;
24
46
  _lastLoggedIn: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TTransform<import("@sinclair/typebox").TString, Date>>;
25
47
  _lastPasswordChange: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TTransform<import("@sinclair/typebox").TString, Date>>;
26
48
  }>;
27
49
  export declare const UserSpec: import("./model-spec.interface.js").IModelSpec<import("@sinclair/typebox").TSchema>;
28
50
  export declare const PublicUserSchema: import("@sinclair/typebox").TObject<{
29
51
  email: import("@sinclair/typebox").TString;
30
- firstName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
31
- lastName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
52
+ external_id: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
32
53
  displayName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
54
+ person: import("@sinclair/typebox").TObject<{
55
+ externalId: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
56
+ firstName: import("@sinclair/typebox").TString;
57
+ middleName: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
58
+ lastName: import("@sinclair/typebox").TString;
59
+ emailAddresses: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
60
+ personId: import("@sinclair/typebox").TSchema;
61
+ emailAddress: import("@sinclair/typebox").TString;
62
+ emailAddressType: import("@sinclair/typebox").TString;
63
+ isDefault: import("@sinclair/typebox").TBoolean;
64
+ }>>;
65
+ phoneNumbers: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
66
+ phoneNumber: import("@sinclair/typebox").TString;
67
+ phoneNumberType: import("@sinclair/typebox").TString;
68
+ isDefault: import("@sinclair/typebox").TBoolean;
69
+ }>>;
70
+ isAgent: import("@sinclair/typebox").TBoolean;
71
+ isClient: import("@sinclair/typebox").TBoolean;
72
+ isEmployee: import("@sinclair/typebox").TBoolean;
73
+ dateOfBirth: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
74
+ extendedTypes: import("@sinclair/typebox").TNumber;
75
+ }>;
33
76
  _lastLoggedIn: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TTransform<import("@sinclair/typebox").TString, Date>>;
34
77
  _lastPasswordChange: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TTransform<import("@sinclair/typebox").TString, Date>>;
35
78
  }>;
@@ -2,6 +2,7 @@ import { TypeboxIsoDate } from '../validation/typebox-extensions.js';
2
2
  import { Type } from '@sinclair/typebox';
3
3
  import { entityUtils } from '../utils/entity.utils.js';
4
4
  import { TypeCompiler } from '@sinclair/typebox/compiler';
5
+ import { personSchema } from './person.model.js';
5
6
  export const UserPasswordSchema = Type.Object({
6
7
  password: Type.String({
7
8
  title: 'Password',
@@ -11,20 +12,16 @@ export const UserPasswordSchema = Type.Object({
11
12
  });
12
13
  export const passwordValidator = TypeCompiler.Compile(UserPasswordSchema);
13
14
  export const UserSchema = Type.Object({
15
+ external_id: Type.Optional(Type.String()),
14
16
  email: Type.String({
15
17
  title: 'Email',
16
18
  format: 'email'
17
19
  }),
18
- firstName: Type.Optional(Type.String({
19
- title: 'First Name'
20
- })),
21
- lastName: Type.Optional(Type.String({
22
- title: 'Last Name'
23
- })),
24
20
  displayName: Type.Optional(Type.String({
25
21
  title: 'Display Name'
26
22
  })),
27
23
  password: UserPasswordSchema.properties.password,
24
+ person: personSchema,
28
25
  _lastLoggedIn: Type.Optional(TypeboxIsoDate({ title: 'Last Login Date' })),
29
26
  _lastPasswordChange: Type.Optional(TypeboxIsoDate({ title: 'Last Password Change Date' })),
30
27
  });
@@ -1,4 +1,4 @@
1
- export interface AppIdType {
1
+ export interface IAppIdType {
2
2
  id: string | number;
3
3
  }
4
- export type AppId = AppIdType['id'];
4
+ export type AppIdType = IAppIdType['id'];
@@ -1,8 +1,8 @@
1
1
  import { Kind, TSchema, NumberOptions } from '@sinclair/typebox';
2
- import { AppId } from '../types/app.types.js';
2
+ import { AppIdType } from '../types/app.types.js';
3
3
  export declare const setIdSchema: (schema: TSchema) => void;
4
4
  export declare const getIdSchema: () => TSchema;
5
- export declare const getSystemUserId: () => AppId;
5
+ export declare const getSystemUserId: () => AppIdType;
6
6
  export declare function TypeboxIsoDate(options?: object): import("@sinclair/typebox").TTransform<import("@sinclair/typebox").TString, Date>;
7
7
  export declare function TypeboxDate(options?: object): import("@sinclair/typebox").TTransform<import("@sinclair/typebox").TString, Date>;
8
8
  export declare function TypeboxObjectId(options?: object): import("@sinclair/typebox").TString;
package/package.json CHANGED
@@ -1,51 +1,51 @@
1
- {
2
- "name": "@loomcore/common",
3
- "version": "0.0.42",
4
- "private": false,
5
- "description": "Loom Core Models- common models, interfaces, types, and utils for Loom Core. All things common to both api and client apps.",
6
- "scripts": {
7
- "clean": "rm -rf dist",
8
- "tsc": "tsc --project tsconfig.prod.json",
9
- "build": "npm-run-all -s clean tsc",
10
- "add": "git add .",
11
- "commit": "git commit -m \"Updates\"",
12
- "patch": "npm version patch",
13
- "push": "git push",
14
- "gar-login": "npx --yes google-artifactregistry-auth",
15
- "publishMe": "npm publish --access public",
16
- "pub": "npm-run-all -s add commit patch build push publishMe",
17
- "auth-and-pub": "npm-run-all -s add commit patch build push gar-login publishMe",
18
- "test": "cross-env NODE_ENV=test vitest run",
19
- "test:ci": "cross-env NODE_ENV=test vitest run --reporter=json --outputFile=test-results.json",
20
- "test:watch": "cross-env NODE_ENV=test vitest"
21
- },
22
- "keywords": [],
23
- "author": "Tim Hardy",
24
- "license": "Apache-2.0",
25
- "main": "dist/index.js",
26
- "type": "module",
27
- "types": "dist/index.d.ts",
28
- "files": [
29
- "dist/**/*"
30
- ],
31
- "exports": {
32
- "./errors": "./dist/errors/index.js",
33
- "./models": "./dist/models/index.js",
34
- "./types": "./dist/types/index.js",
35
- "./utils": "./dist/utils/index.js",
36
- "./validation": "./dist/validation/index.js"
37
- },
38
- "dependencies": {
39
- "decimal.js": "^10.5.0"
40
- },
41
- "peerDependencies": {
42
- "@types/node": "^24.10.2",
43
- "@sinclair/typebox": "0.34.33"
44
- },
45
- "devDependencies": {
46
- "cross-env": "^7.0.3",
47
- "npm-run-all": "^4.1.5",
48
- "typescript": "^5.8.3",
49
- "vitest": "^3.0.9"
50
- }
51
- }
1
+ {
2
+ "name": "@loomcore/common",
3
+ "version": "0.0.44",
4
+ "private": false,
5
+ "description": "Loom Core Models- common models, interfaces, types, and utils for Loom Core. All things common to both api and client apps.",
6
+ "scripts": {
7
+ "clean": "rm -rf dist",
8
+ "tsc": "tsc --project tsconfig.prod.json",
9
+ "build": "npm-run-all -s clean tsc",
10
+ "add": "git add .",
11
+ "commit": "git commit -m \"Updates\"",
12
+ "patch": "npm version patch",
13
+ "push": "git push",
14
+ "gar-login": "npx --yes google-artifactregistry-auth",
15
+ "publishMe": "npm publish --access public",
16
+ "pub": "npm-run-all -s add commit patch build push publishMe",
17
+ "auth-and-pub": "npm-run-all -s add commit patch build push gar-login publishMe",
18
+ "test": "cross-env NODE_ENV=test vitest run",
19
+ "test:ci": "cross-env NODE_ENV=test vitest run --reporter=json --outputFile=test-results.json",
20
+ "test:watch": "cross-env NODE_ENV=test vitest"
21
+ },
22
+ "keywords": [],
23
+ "author": "Tim Hardy",
24
+ "license": "Apache-2.0",
25
+ "main": "dist/index.js",
26
+ "type": "module",
27
+ "types": "dist/index.d.ts",
28
+ "files": [
29
+ "dist/**/*"
30
+ ],
31
+ "exports": {
32
+ "./errors": "./dist/errors/index.js",
33
+ "./models": "./dist/models/index.js",
34
+ "./types": "./dist/types/index.js",
35
+ "./utils": "./dist/utils/index.js",
36
+ "./validation": "./dist/validation/index.js"
37
+ },
38
+ "dependencies": {
39
+ "decimal.js": "^10.5.0"
40
+ },
41
+ "peerDependencies": {
42
+ "@types/node": "^24.10.2",
43
+ "@sinclair/typebox": "0.34.33"
44
+ },
45
+ "devDependencies": {
46
+ "cross-env": "^7.0.3",
47
+ "npm-run-all": "^4.1.5",
48
+ "typescript": "^5.8.3",
49
+ "vitest": "^3.0.9"
50
+ }
51
+ }