@domain-first/types 3.0.7 → 5.0.0

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.
package/README.md CHANGED
@@ -5,7 +5,7 @@
5
5
  </p>
6
6
 
7
7
  <p align="center">
8
- Type-Safe Entities and Value Objects with Standard Schema Validation.
8
+ Type-safe domain models powered by Standard Schema validation.
9
9
  </p>
10
10
 
11
11
  <p align="center">
@@ -22,41 +22,95 @@ npm i @domain-first/types
22
22
 
23
23
  # Motivation
24
24
 
25
- Building Entities and Value Objects often involves repetitive boilerplate, such as validation, while each class still needs its own domain-specific behavior. Domain-First Types implements the shared parts while leaving domain-specific behavior to your classes.
25
+ Domain models often need both runtime validation and domain-specific behavior. Keeping validation, type inference, and business logic together can lead to repetitive boilerplate.
26
26
 
27
- # Quick Start
27
+ Domain-First Types creates type-safe domain models from Standard Schema validators while leaving domain-specific behavior to your classes.
28
+
29
+ # Features
30
+
31
+ - Runtime validation through any Standard Schema compatible library
32
+ - Full TypeScript inference
33
+ - Domain behavior through class methods
34
+ - Recursive domain types
35
+
36
+ # Examples
37
+
38
+ ## Quick Start
28
39
 
29
40
  ```ts
30
- import {
31
- defineValueObject,
32
- defineEntity,
33
- InvalidDataParsingError,
34
- } from "@domain-first/types";
41
+ import { domainType } from "@domain-first/types";
35
42
  // any schema library supporting Standard Schema can be used
36
43
  import { z } from "zod";
37
44
 
38
- class UserId extends defineValueObject(
39
- // model schema
40
- z.string().nonempty(),
41
- ) {}
45
+ class UserId extends domainType(z.string().nonempty()) {
46
+ static get randomId() {
47
+ return new UserId(globalThis.crypto.randomUUID());
48
+ }
49
+ }
42
50
 
43
- class User extends defineEntity(
44
- // id schema
45
- z.instanceof(UserId),
46
- // model schema
47
- z.object({ name: z.string().nonempty() }),
48
- ) {}
51
+ class User extends domainType(
52
+ z.object({
53
+ id: z.instanceof(UserId),
54
+ name: z.string().nonempty(),
55
+ }),
56
+ ) {
57
+ withNewName = (name: string) => {
58
+ return new User({
59
+ id: this.id,
60
+ name,
61
+ });
62
+ };
63
+ }
64
+
65
+ const user = new User({
66
+ id: UserId.randomId,
67
+ name: "First User",
68
+ });
69
+
70
+ console.log(user.name); // 'First User'
71
+ // user.name = 'New Name' -> TS Error
49
72
 
50
- const user = new User(new UserId("user-1"), { name: "First User" });
73
+ /**
74
+ * Domain types created from primitive schemas
75
+ * expose their value through the `value` property.
76
+ */
77
+ console.log(user.id.value); // 'user-1'
78
+ // user.id.value = 'new value' -> TS Error
79
+
80
+ console.log(user.withNewName("Test Name").name); // 'Test Name'
81
+ ```
82
+
83
+ ## Recursive types
84
+
85
+ ```ts
86
+ import z from "zod";
87
+ import { recursiveDomainType } from "@domain-first/types";
88
+
89
+ class Node extends recursiveDomainType((isNode) => {
90
+ return z.object({
91
+ id: z.string().nonempty(),
92
+ linkedNode: z.custom<Node>(isNode).optional(),
93
+ });
94
+ }) {}
95
+
96
+ const node = new Node({ id: "1" });
97
+ const nodeWithLink = new Node({ id: "2", linkedNode: node });
98
+
99
+ console.log(nodeWithLink.linkedNode?.id); // 1
100
+ ```
101
+
102
+ ## Error handling
103
+
104
+ ```ts
105
+ import { domainType, TypeParsingError } from "@domain-first/types";
106
+ import z from "zod";
51
107
 
52
- console.log(user.id.model); // "user-1", deep readonly
53
- console.log(user.model); // { name: "First User" }, deep readonly
108
+ class NonEmptyString extends domainType(z.string().nonempty()) {}
54
109
 
55
110
  try {
56
- const invalidUserId = new UserId("");
111
+ const _string = new NonEmptyString("");
57
112
  } catch (e: unknown) {
58
- // use static `is` method for error checks
59
- if (InvalidDataParsingError.is(e)) {
113
+ if (e instanceof InvalidDataError) {
60
114
  console.error(e.details.parsingIssues);
61
115
  console.error(e.details.value);
62
116
  }
@@ -0,0 +1,12 @@
1
+ import type { StandardSchemaV1 } from '@standard-schema/spec';
2
+ import { type DeepReadonly } from './utils';
3
+ export declare const domainType: <ModelSchema extends StandardSchemaV1>(modelSchema: ModelSchema) => (abstract new (model: StandardSchemaV1.InferInput<ModelSchema>) => DeepReadonly<StandardSchemaV1.InferOutput<ModelSchema> extends object ? StandardSchemaV1.InferOutput<ModelSchema> : {
4
+ value: StandardSchemaV1.InferOutput<ModelSchema>;
5
+ }>) & {
6
+ schema: ModelSchema;
7
+ };
8
+ export declare const recursiveDomainType: <ModelSchema extends StandardSchemaV1>(modelSchema: (isCurrentType: (target: unknown) => boolean) => ModelSchema) => (abstract new (model: StandardSchemaV1.InferInput<ModelSchema>) => DeepReadonly<StandardSchemaV1.InferOutput<ModelSchema> extends object ? StandardSchemaV1.InferOutput<ModelSchema> : {
9
+ value: StandardSchemaV1.InferOutput<ModelSchema>;
10
+ }>) & {
11
+ schema: ModelSchema;
12
+ };
@@ -1,2 +1,2 @@
1
1
  export * from './async-schema-in-sync-parsing-error';
2
- export * from './invalid-data-parsing-error';
2
+ export * from './type-parsing-error';
@@ -0,0 +1,133 @@
1
+ export declare const DomainFirstTypesError: {
2
+ subnamespace: (subnamespace: string) => {
3
+ subnamespace: any;
4
+ error: <Details extends Record<string, unknown> = Record<string, unknown>>(code: string, errorProps?: Partial<import("@domain-first/errors").ErrorProps<{}, Details>>) => {
5
+ new (details: Details, options?: ErrorOptions): {
6
+ readonly code: string;
7
+ readonly metadata: {};
8
+ readonly details: Details;
9
+ get formattedDetails(): import("@domain-first/errors").PlainPrimitivesObject;
10
+ get serialized(): import("@domain-first/errors").TransportedError<{}>;
11
+ get serializedWithNativeData(): import("@domain-first/errors").TransportedErrorWithNativeData<{}>;
12
+ get serializedFull(): import("@domain-first/errors").FullTransportedError<Details, {}>;
13
+ name: string;
14
+ message: string;
15
+ stack?: string;
16
+ cause?: unknown;
17
+ };
18
+ matches: (target: unknown) => boolean | null;
19
+ is: (target: unknown) => target is {
20
+ readonly code: string;
21
+ readonly metadata: Metadata;
22
+ readonly details: Details_1;
23
+ get formattedDetails(): import("@domain-first/errors").PlainPrimitivesObject;
24
+ get serialized(): import("@domain-first/errors").TransportedError<Metadata>;
25
+ get serializedWithNativeData(): import("@domain-first/errors").TransportedErrorWithNativeData<Metadata>;
26
+ get serializedFull(): import("@domain-first/errors").FullTransportedError<Details_1, Metadata>;
27
+ name: string;
28
+ message: string;
29
+ stack?: string;
30
+ cause?: unknown;
31
+ };
32
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
33
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
34
+ stackTraceLimit: number;
35
+ };
36
+ errorWithMetadata: <Details extends Record<string, unknown> = Record<string, unknown>, Metadata extends import("@domain-first/errors").PlainPrimitivesObject = import("@domain-first/errors").PlainPrimitivesObject>(code: string, metadata: Metadata, errorProps?: Partial<import("@domain-first/errors").ErrorProps<Metadata, Details>>) => {
37
+ new (details: Details, options?: ErrorOptions): {
38
+ readonly code: string;
39
+ readonly metadata: Metadata;
40
+ readonly details: Details;
41
+ get formattedDetails(): import("@domain-first/errors").PlainPrimitivesObject;
42
+ get serialized(): import("@domain-first/errors").TransportedError<Metadata>;
43
+ get serializedWithNativeData(): import("@domain-first/errors").TransportedErrorWithNativeData<Metadata>;
44
+ get serializedFull(): import("@domain-first/errors").FullTransportedError<Details, Metadata>;
45
+ name: string;
46
+ message: string;
47
+ stack?: string;
48
+ cause?: unknown;
49
+ };
50
+ matches: (target: unknown) => boolean | null;
51
+ is: (target: unknown) => target is {
52
+ readonly code: string;
53
+ readonly metadata: Metadata_1;
54
+ readonly details: Details_1;
55
+ get formattedDetails(): import("@domain-first/errors").PlainPrimitivesObject;
56
+ get serialized(): import("@domain-first/errors").TransportedError<Metadata_1>;
57
+ get serializedWithNativeData(): import("@domain-first/errors").TransportedErrorWithNativeData<Metadata_1>;
58
+ get serializedFull(): import("@domain-first/errors").FullTransportedError<Details_1, Metadata_1>;
59
+ name: string;
60
+ message: string;
61
+ stack?: string;
62
+ cause?: unknown;
63
+ };
64
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
65
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
66
+ stackTraceLimit: number;
67
+ };
68
+ };
69
+ error: <Details extends Record<string, unknown> = Record<string, unknown>>(code: string, errorProps?: Partial<import("@domain-first/errors").ErrorProps<{}, Details>>) => {
70
+ new (details: Details, options?: ErrorOptions): {
71
+ readonly code: string;
72
+ readonly metadata: {};
73
+ readonly details: Details;
74
+ get formattedDetails(): import("@domain-first/errors").PlainPrimitivesObject;
75
+ get serialized(): import("@domain-first/errors").TransportedError<{}>;
76
+ get serializedWithNativeData(): import("@domain-first/errors").TransportedErrorWithNativeData<{}>;
77
+ get serializedFull(): import("@domain-first/errors").FullTransportedError<Details, {}>;
78
+ name: string;
79
+ message: string;
80
+ stack?: string;
81
+ cause?: unknown;
82
+ };
83
+ matches: (target: unknown) => boolean | null;
84
+ is: (target: unknown) => target is {
85
+ readonly code: string;
86
+ readonly metadata: Metadata;
87
+ readonly details: Details_1;
88
+ get formattedDetails(): import("@domain-first/errors").PlainPrimitivesObject;
89
+ get serialized(): import("@domain-first/errors").TransportedError<Metadata>;
90
+ get serializedWithNativeData(): import("@domain-first/errors").TransportedErrorWithNativeData<Metadata>;
91
+ get serializedFull(): import("@domain-first/errors").FullTransportedError<Details_1, Metadata>;
92
+ name: string;
93
+ message: string;
94
+ stack?: string;
95
+ cause?: unknown;
96
+ };
97
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
98
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
99
+ stackTraceLimit: number;
100
+ };
101
+ errorWithMetadata: <Details extends Record<string, unknown> = Record<string, unknown>, Metadata extends import("@domain-first/errors").PlainPrimitivesObject = import("@domain-first/errors").PlainPrimitivesObject>(code: string, metadata: Metadata, errorProps?: Partial<import("@domain-first/errors").ErrorProps<Metadata, Details>>) => {
102
+ new (details: Details, options?: ErrorOptions): {
103
+ readonly code: string;
104
+ readonly metadata: Metadata;
105
+ readonly details: Details;
106
+ get formattedDetails(): import("@domain-first/errors").PlainPrimitivesObject;
107
+ get serialized(): import("@domain-first/errors").TransportedError<Metadata>;
108
+ get serializedWithNativeData(): import("@domain-first/errors").TransportedErrorWithNativeData<Metadata>;
109
+ get serializedFull(): import("@domain-first/errors").FullTransportedError<Details, Metadata>;
110
+ name: string;
111
+ message: string;
112
+ stack?: string;
113
+ cause?: unknown;
114
+ };
115
+ matches: (target: unknown) => boolean | null;
116
+ is: (target: unknown) => target is {
117
+ readonly code: string;
118
+ readonly metadata: Metadata_1;
119
+ readonly details: Details_1;
120
+ get formattedDetails(): import("@domain-first/errors").PlainPrimitivesObject;
121
+ get serialized(): import("@domain-first/errors").TransportedError<Metadata_1>;
122
+ get serializedWithNativeData(): import("@domain-first/errors").TransportedErrorWithNativeData<Metadata_1>;
123
+ get serializedFull(): import("@domain-first/errors").FullTransportedError<Details_1, Metadata_1>;
124
+ name: string;
125
+ message: string;
126
+ stack?: string;
127
+ cause?: unknown;
128
+ };
129
+ captureStackTrace(targetObject: object, constructorOpt?: Function): void;
130
+ prepareStackTrace(err: Error, stackTraces: NodeJS.CallSite[]): any;
131
+ stackTraceLimit: number;
132
+ };
133
+ };
@@ -1,5 +1,5 @@
1
1
  import type { StandardSchemaV1 } from '@standard-schema/spec';
2
- export declare const InvalidDataParsingError: {
2
+ export declare const TypeParsingError: {
3
3
  new (details: {
4
4
  parsingIssues: readonly StandardSchemaV1.Issue[];
5
5
  value: unknown;
package/dist/index.cjs CHANGED
@@ -1,2 +1,2 @@
1
- "use strict";const __rslib_import_meta_url__="u"<typeof document?new(require("url".replace("",""))).URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href;var __webpack_require__={};__webpack_require__.d=(e,r,t)=>{var a=(r,t)=>{for(var a in r)__webpack_require__.o(r,a)&&!__webpack_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,[t]:r[a]})};a(r,"get"),a(t,"value")},__webpack_require__.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),__webpack_require__.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{AsyncSchemaInSyncParsingError:()=>AsyncSchemaInSyncParsingError,InvalidDataParsingError:()=>InvalidDataParsingError,defineEntity:()=>defineEntity,defineRecursiveEntity:()=>defineRecursiveEntity,defineRecursiveValueObject:()=>defineRecursiveValueObject,defineValueObject:()=>defineValueObject});const errors_namespaceObject=require("@domain-first/errors"),SchemaErrors=(0,errors_namespaceObject.errorNamespace)("SCHEMA"),AsyncSchemaInSyncParsingError=SchemaErrors.error("ASYNC_LOGIC"),ParsingErrors=(0,errors_namespaceObject.errorNamespace)("PARSING"),InvalidDataParsingError=ParsingErrors.error("INVALID_DATA");function parseSync(e,r){let t=e["~standard"].validate(r);if(t instanceof Promise)throw new AsyncSchemaInSyncParsingError({schema:e,value:r});if("issues"in t&&t.issues)throw new InvalidDataParsingError({parsingIssues:t.issues,value:r});return t.value}const createEntity=(e,r)=>{let t=Symbol(),a=Symbol(),n=Symbol(),i=e=>!!e&&"object"==typeof e&&n in e;class c{static idSchema=e;static modelSchema=r(i);constructor(e,r){const i=parseSync(c.idSchema,e),_=parseSync(c.modelSchema,r);Object.defineProperty(this,t,{value:i}),Object.defineProperty(this,a,{value:_}),Object.defineProperty(this,n,{value:!0})}get model(){return this[a]}get id(){return this[t]}}return c},defineEntity=(e,r)=>createEntity(e,()=>r),defineRecursiveEntity=(e,r)=>createEntity(e,r),createValueObject=e=>{let r=Symbol(),t=Symbol(),a=e=>!!e&&"object"==typeof e&&t in e;class n{static schema=e(a);constructor(e){Object.defineProperty(this,r,{value:parseSync(n.schema,e)}),Object.defineProperty(this,t,{value:!0})}get model(){return this[r]}}return n},defineValueObject=e=>createValueObject(()=>e),defineRecursiveValueObject=e=>createValueObject(e);for(var __rspack_i in exports.AsyncSchemaInSyncParsingError=__webpack_exports__.AsyncSchemaInSyncParsingError,exports.InvalidDataParsingError=__webpack_exports__.InvalidDataParsingError,exports.defineEntity=__webpack_exports__.defineEntity,exports.defineRecursiveEntity=__webpack_exports__.defineRecursiveEntity,exports.defineRecursiveValueObject=__webpack_exports__.defineRecursiveValueObject,exports.defineValueObject=__webpack_exports__.defineValueObject,__webpack_exports__)-1===["AsyncSchemaInSyncParsingError","InvalidDataParsingError","defineEntity","defineRecursiveEntity","defineRecursiveValueObject","defineValueObject"].indexOf(__rspack_i)&&(exports[__rspack_i]=__webpack_exports__[__rspack_i]);Object.defineProperty(exports,"__esModule",{value:!0});
1
+ "use strict";const __rslib_import_meta_url__="u"<typeof document?new(require("url".replace("",""))).URL("file:"+__filename).href:document.currentScript&&document.currentScript.src||new URL("main.js",document.baseURI).href;var __webpack_require__={};__webpack_require__.d=(e,r,_)=>{var a=(r,_)=>{for(var a in r)__webpack_require__.o(r,a)&&!__webpack_require__.o(e,a)&&Object.defineProperty(e,a,{enumerable:!0,[_]:r[a]})};a(r,"get"),a(_,"value")},__webpack_require__.o=(e,r)=>Object.prototype.hasOwnProperty.call(e,r),__webpack_require__.r=e=>{"u">typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})};var __webpack_exports__={};__webpack_require__.r(__webpack_exports__),__webpack_require__.d(__webpack_exports__,{AsyncSchemaInSyncParsingError:()=>AsyncSchemaInSyncParsingError,TypeParsingError:()=>TypeParsingError,domainType:()=>domainType,recursiveDomainType:()=>recursiveDomainType});const errors_namespaceObject=require("@domain-first/errors"),DomainFirstTypesError=(0,errors_namespaceObject.errorNamespace)("@DOMAIN-FIRST/TYPES"),AsyncSchemaInSyncParsingError=DomainFirstTypesError.error("ASYNC_LOGIC"),TypeParsingError=DomainFirstTypesError.error("INVALID_DATA");function parseSync(e,r){let _=e["~standard"].validate(r);if(_ instanceof Promise)throw new AsyncSchemaInSyncParsingError({schema:e,value:r});if("issues"in _&&_.issues)throw new TypeParsingError({parsingIssues:_.issues,value:r});return _.value}const createDomainType=e=>{let r=Symbol(),_=e=>!!e&&"object"==typeof e&&r in e;class a{static schema=e(_);constructor(e){const _=parseSync(this.constructor.schema,e);if(_&&"object"==typeof _)for(const[e,r]of Object.entries(_))Object.defineProperty(this,e,{value:r,writable:!1,configurable:!1,enumerable:!0});else Object.defineProperty(this,"value",{value:_,writable:!1,configurable:!1,enumerable:!0});Object.defineProperty(this,r,{value:!0,writable:!1,configurable:!1})}}return a},domainType=e=>createDomainType(()=>e),recursiveDomainType=e=>createDomainType(e);for(var __rspack_i in exports.AsyncSchemaInSyncParsingError=__webpack_exports__.AsyncSchemaInSyncParsingError,exports.TypeParsingError=__webpack_exports__.TypeParsingError,exports.domainType=__webpack_exports__.domainType,exports.recursiveDomainType=__webpack_exports__.recursiveDomainType,__webpack_exports__)-1===["AsyncSchemaInSyncParsingError","TypeParsingError","domainType","recursiveDomainType"].indexOf(__rspack_i)&&(exports[__rspack_i]=__webpack_exports__[__rspack_i]);Object.defineProperty(exports,"__esModule",{value:!0});
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","sources":["webpack://webpack/runtime/define_property_getters","webpack://webpack/runtime/has_own_property","webpack://webpack/runtime/make_namespace_object","../src/errors/async-schema-in-sync-parsing-error.ts","../src/errors/invalid-data-parsing-error.ts","../src/utils/parse-sync.ts","../src/entity.ts","../src/value-object.ts"],"sourcesContent":["__webpack_require__.d = (exports, getters, values) => {\n\tvar define = (defs, kind) => {\n\t\tfor(var key in defs) {\n\t\t\tif(__webpack_require__.o(defs, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, [kind]: defs[key] });\n\t\t\t}\n\t\t}\n\t};\n\tdefine(getters, \"get\");\n\tdefine(values, \"value\");\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { errorNamespace } from '@domain-first/errors';\n\nconst SchemaErrors = errorNamespace('SCHEMA')\n\nexport const AsyncSchemaInSyncParsingError = SchemaErrors.error('ASYNC_LOGIC');\n","import { errorNamespace } from '@domain-first/errors';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\n\nconst ParsingErrors = errorNamespace(\"PARSING\")\n\nexport const InvalidDataParsingError = ParsingErrors.error<{\n parsingIssues: readonly StandardSchemaV1.Issue[];\n value: unknown;\n}>('INVALID_DATA');\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport {\n AsyncSchemaInSyncParsingError,\n InvalidDataParsingError\n} from '../errors';\n\nexport function parseSync<S extends StandardSchemaV1>(\n schema: S,\n value: StandardSchemaV1.InferInput<S>\n): StandardSchemaV1.InferOutput<S> {\n const result = schema['~standard'].validate(value);\n\n if (result instanceof Promise) {\n throw new AsyncSchemaInSyncParsingError({ schema, value });\n }\n\n if ('issues' in result && result.issues) {\n throw new InvalidDataParsingError({ parsingIssues: result.issues, value });\n }\n\n return result.value;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type DeepReadonly, parseSync } from './utils';\n\nconst createEntity = <\n IdSchema extends StandardSchemaV1,\n ModelSchema extends StandardSchemaV1\n>(\n idSchema: IdSchema,\n getModelSchema: (\n isCurrentEntity: (target: unknown) => boolean\n ) => ModelSchema\n) => {\n const idSymbol = Symbol();\n const modelSymbol = Symbol();\n const classSymbol = Symbol();\n\n const isThisClass = (target: unknown): boolean => {\n return !!target && typeof target === 'object' && classSymbol in target;\n };\n\n abstract class Entity {\n public static readonly idSchema = idSchema;\n public static readonly modelSchema = getModelSchema(isThisClass);\n\n constructor(\n id: StandardSchemaV1.InferInput<IdSchema>,\n model: StandardSchemaV1.InferInput<ModelSchema>\n ) {\n const parsedId = parseSync(Entity.idSchema, id);\n const parsedModelData = parseSync(Entity.modelSchema, model);\n\n Object.defineProperty(this, idSymbol, {\n value: parsedId\n });\n\n Object.defineProperty(this, modelSymbol, {\n value: parsedModelData\n });\n\n Object.defineProperty(this, classSymbol, {\n value: true\n });\n }\n\n get model() {\n return (this as any)[modelSymbol] as DeepReadonly<\n StandardSchemaV1.InferOutput<ModelSchema>\n >;\n }\n\n get id() {\n return (this as any)[idSymbol] as DeepReadonly<\n StandardSchemaV1.InferOutput<IdSchema>\n >;\n }\n }\n\n return Entity;\n};\n\nexport const defineEntity = <\n IdSchema extends StandardSchemaV1,\n ModelSchema extends StandardSchemaV1\n>(\n idSchema: IdSchema,\n modelSchema: ModelSchema\n) => {\n return createEntity(idSchema, () => modelSchema);\n};\n\nexport const defineRecursiveEntity = <\n IdSchema extends StandardSchemaV1,\n ModelSchema extends StandardSchemaV1\n>(\n idSchema: IdSchema,\n modelSchema: (isCurrentEntity: (target: unknown) => boolean) => ModelSchema\n) => {\n return createEntity(idSchema, modelSchema);\n};\n\nexport type InferEntityModel<T> = T extends { modelSchema: StandardSchemaV1 }\n ? StandardSchemaV1.InferOutput<T['modelSchema']>\n : T extends { model: infer M }\n ? M\n : never;\n\nexport type InferEntityId<T> = T extends { idSchema: StandardSchemaV1 }\n ? StandardSchemaV1.InferOutput<T['idSchema']>\n : T extends { id: infer M }\n ? M\n : never;\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type DeepReadonly, parseSync } from './utils';\n\nconst createValueObject = <Schema extends StandardSchemaV1>(\n getSchema: (isCurrentValueObject: (target: unknown) => boolean) => Schema\n) => {\n const modelSymbol = Symbol();\n const classSymbol = Symbol();\n\n const isThisClass = (target: unknown): boolean => {\n return !!target && typeof target === 'object' && classSymbol in target;\n };\n\n abstract class ValueObject {\n public static readonly schema = getSchema(isThisClass);\n\n constructor(data: StandardSchemaV1.InferInput<Schema>) {\n const parsedData = parseSync(ValueObject.schema, data);\n\n Object.defineProperty(this, modelSymbol, {\n value: parsedData\n });\n\n Object.defineProperty(this, classSymbol, {\n value: true\n });\n }\n\n get model() {\n const thisWithSymbol = this as unknown as {\n [modelSymbol]: StandardSchemaV1.InferOutput<Schema>;\n };\n\n return thisWithSymbol[modelSymbol] as DeepReadonly<\n StandardSchemaV1.InferOutput<Schema>\n >;\n }\n }\n\n return ValueObject;\n};\n\nexport const defineValueObject = <Schema extends StandardSchemaV1>(\n schema: Schema\n) => {\n return createValueObject(() => schema);\n};\n\nexport const defineRecursiveValueObject = <Schema extends StandardSchemaV1>(\n schema: (isCurrentValueObject: (target: unknown) => boolean) => Schema\n) => {\n return createValueObject(schema);\n};\n\nexport type InferValueObjectSchema<T> = T extends {\n schema: infer S extends StandardSchemaV1;\n}\n ? StandardSchemaV1.InferOutput<S>\n : T extends { model: infer M }\n ? M\n : never;\n"],"names":["__webpack_require__","e","Object","Symbol","SchemaErrors","errorNamespace","AsyncSchemaInSyncParsingError","ParsingErrors","InvalidDataParsingError","parseSync","schema","value","result","Promise","createEntity","idSchema","getModelSchema","idSymbol","modelSymbol","classSymbol","isThisClass","target","Entity","id","model","parsedId","parsedModelData","defineEntity","modelSchema","defineRecursiveEntity","createValueObject","getSchema","ValueObject","data","thisWithSymbol","defineValueObject","defineRecursiveValueObject"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","sources":["webpack://webpack/runtime/define_property_getters","webpack://webpack/runtime/has_own_property","webpack://webpack/runtime/make_namespace_object","../src/errors/namespace.ts","../src/errors/async-schema-in-sync-parsing-error.ts","../src/errors/type-parsing-error.ts","../src/utils/parse-sync.ts","../src/domain-type.ts"],"sourcesContent":["__webpack_require__.d = (exports, getters, values) => {\n\tvar define = (defs, kind) => {\n\t\tfor(var key in defs) {\n\t\t\tif(__webpack_require__.o(defs, key) && !__webpack_require__.o(exports, key)) {\n\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, [kind]: defs[key] });\n\t\t\t}\n\t\t}\n\t};\n\tdefine(getters, \"get\");\n\tdefine(values, \"value\");\n};","__webpack_require__.o = (obj, prop) => (Object.prototype.hasOwnProperty.call(obj, prop))","// define __esModule on exports\n__webpack_require__.r = (exports) => {\n\tif(typeof Symbol !== 'undefined' && Symbol.toStringTag) {\n\t\tObject.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });\n\t}\n\tObject.defineProperty(exports, '__esModule', { value: true });\n};","import { errorNamespace } from \"@domain-first/errors\";\n\nexport const DomainFirstTypesError = errorNamespace(\"@DOMAIN-FIRST/TYPES\")\n","import { DomainFirstTypesError } from './namespace';\n\nexport const AsyncSchemaInSyncParsingError = DomainFirstTypesError.error('ASYNC_LOGIC');\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { DomainFirstTypesError } from './namespace';\n\nexport const TypeParsingError = DomainFirstTypesError.error<{\n parsingIssues: readonly StandardSchemaV1.Issue[];\n value: unknown;\n}>('INVALID_DATA');\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport {\n AsyncSchemaInSyncParsingError,\n TypeParsingError\n} from '../errors';\n\nexport function parseSync<S extends StandardSchemaV1>(\n schema: S,\n value: StandardSchemaV1.InferInput<S>\n): StandardSchemaV1.InferOutput<S> {\n const result = schema['~standard'].validate(value);\n\n if (result instanceof Promise) {\n throw new AsyncSchemaInSyncParsingError({ schema, value });\n }\n\n if ('issues' in result && result.issues) {\n throw new TypeParsingError({ parsingIssues: result.issues, value });\n }\n\n return result.value;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type DeepReadonly, parseSync } from './utils';\n\nconst createDomainType = <ModelSchema extends StandardSchemaV1>(\n getModelSchema: (\n isCurrentEntity: (target: unknown) => boolean\n ) => ModelSchema\n) => {\n const classSymbol = Symbol();\n\n const isInstanceOfThisType = (target: unknown): boolean => {\n return !!target && typeof target === 'object' && classSymbol in target;\n };\n\n class DomainType {\n public static readonly schema = getModelSchema(isInstanceOfThisType);\n\n constructor(model: StandardSchemaV1.InferInput<ModelSchema>) {\n const schema = (this.constructor as typeof DomainType).schema;\n\n const parsedModelData = parseSync(schema, model);\n\n if (parsedModelData && typeof parsedModelData === 'object') {\n for (const [key, value] of Object.entries(parsedModelData)) {\n Object.defineProperty(this, key, {\n value,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n } else {\n Object.defineProperty(this, 'value', {\n value: parsedModelData,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n\n Object.defineProperty(this, classSymbol, {\n value: true,\n writable: false,\n configurable: false\n });\n }\n }\n\n return DomainType as unknown as (abstract new (\n model: StandardSchemaV1.InferInput<ModelSchema>\n ) => DeepReadonly<\n StandardSchemaV1.InferOutput<ModelSchema> extends object\n ? StandardSchemaV1.InferOutput<ModelSchema>\n : {\n value: StandardSchemaV1.InferOutput<ModelSchema>;\n }\n >) & { schema: ModelSchema };\n};\n\nexport const domainType = <ModelSchema extends StandardSchemaV1>(\n modelSchema: ModelSchema\n) => {\n return createDomainType(() => modelSchema);\n};\n\nexport const recursiveDomainType = <ModelSchema extends StandardSchemaV1>(\n modelSchema: (isCurrentType: (target: unknown) => boolean) => ModelSchema\n) => {\n return createDomainType(modelSchema);\n};\n"],"names":["__webpack_require__","e","Object","Symbol","DomainFirstTypesError","errorNamespace","AsyncSchemaInSyncParsingError","TypeParsingError","parseSync","schema","value","result","Promise","createDomainType","getModelSchema","classSymbol","isInstanceOfThisType","target","DomainType","model","parsedModelData","key","domainType","modelSchema","recursiveDomainType"],"mappings":"wPAAAA,CAAAA,oBAAoB,CAAC,CAAG,CAACC,EAAS,EAAS,KAC1C,IAAI,EAAS,CAAC,EAAM,KACnB,IAAI,IAAI,KAAO,EACXD,oBAAoB,CAAC,CAAC,EAAM,IAAQ,CAACA,oBAAoB,CAAC,CAACC,EAAS,IACtEC,OAAO,cAAc,CAACD,EAAS,EAAK,CAAE,WAAY,GAAM,CAAC,EAAK,CAAE,CAAI,CAAC,EAAI,AAAC,EAG7E,EACA,EAAO,EAAS,OAChB,EAAO,EAAQ,QAChB,ECVAD,oBAAoB,CAAC,CAAG,CAAC,EAAK,IAAUE,OAAO,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,EAAK,GCClFF,oBAAoB,CAAC,CAAG,AAACC,IACrB,AAAkB,IAAlB,OAAOE,QAA0BA,OAAO,WAAW,EACrDD,OAAO,cAAc,CAACD,EAASE,OAAO,WAAW,CAAE,CAAE,MAAO,QAAS,GAEtED,OAAO,cAAc,CAACD,EAAS,aAAc,CAAE,MAAO,EAAK,EAC5D,E,4VCJaG,sBAAwBC,AAAAA,GAAAA,uBAAAA,cAAAA,AAAAA,EAAe,uBCAvCC,8BAAgCF,sBAAsB,KAAK,CAAC,eCC5DG,iBAAmBH,sBAAsB,KAAK,CAGxD,gBCAI,SAASI,UACZC,CAAS,CACTC,CAAqC,EAErC,IAAMC,EAASF,CAAM,CAAC,YAAY,CAAC,QAAQ,CAACC,GAE5C,GAAIC,aAAkBC,QAClB,MAAM,IAAIN,8BAA8B,CAAEG,OAAAA,EAAQC,MAAAA,CAAM,GAG5D,GAAI,WAAYC,GAAUA,EAAO,MAAM,CACnC,MAAM,IAAIJ,iBAAiB,CAAE,cAAeI,EAAO,MAAM,CAAED,MAAAA,CAAM,GAGrE,OAAOC,EAAO,KAAK,AACvB,CClBA,MAAME,iBAAmB,AACrBC,IAIA,IAAMC,EAAcZ,SAEda,EAAuB,AAACC,GACnB,CAAC,CAACA,GAAU,AAAkB,UAAlB,OAAOA,GAAuBF,KAAeE,CAGpE,OAAMC,EACF,OAAuB,OAASJ,EAAeE,EAAsB,AAErE,aAAYG,CAA+C,CAAE,CAGzD,MAAMC,EAAkBZ,UAFR,IAAI,CAAC,WAAW,CAAuB,MAAM,CAEnBW,GAE1C,GAAIC,GAAmB,AAA2B,UAA3B,OAAOA,EAC1B,IAAK,KAAM,CAACC,EAAKX,EAAM,GAAIR,OAAO,OAAO,CAACkB,GACtClB,OAAO,cAAc,CAAC,IAAI,CAAEmB,EAAK,CAC7BX,MAAAA,EACA,SAAU,GACV,aAAc,GACd,WAAY,EAChB,QAGJR,OAAO,cAAc,CAAC,IAAI,CAAE,QAAS,CACjC,MAAOkB,EACP,SAAU,GACV,aAAc,GACd,WAAY,EAChB,GAGJlB,OAAO,cAAc,CAAC,IAAI,CAAEa,EAAa,CACrC,MAAO,GACP,SAAU,GACV,aAAc,EAClB,EACJ,CACJ,CAEA,OAAOG,CASX,EAEaI,WAAa,AACtBC,GAEOV,iBAAiB,IAAMU,GAGrBC,oBAAsB,AAC/BD,GAEOV,iBAAiBU,G"}
package/dist/index.d.ts CHANGED
@@ -1,4 +1,3 @@
1
- export * from './entity';
1
+ export * from './domain-type';
2
2
  export * from './errors';
3
3
  export type { DeepReadonly } from './utils';
4
- export * from './value-object';
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{errorNamespace as e}from"@domain-first/errors";let t=e("SCHEMA").error("ASYNC_LOGIC"),r=e("PARSING").error("INVALID_DATA");function i(e,i){let s=e["~standard"].validate(i);if(s instanceof Promise)throw new t({schema:e,value:i});if("issues"in s&&s.issues)throw new r({parsingIssues:s.issues,value:i});return s.value}let s=(e,t)=>{let r=Symbol(),s=Symbol(),n=Symbol(),o=e=>!!e&&"object"==typeof e&&n in e;class a{static idSchema=e;static modelSchema=t(o);constructor(e,t){let o=i(a.idSchema,e),c=i(a.modelSchema,t);Object.defineProperty(this,r,{value:o}),Object.defineProperty(this,s,{value:c}),Object.defineProperty(this,n,{value:!0})}get model(){return this[s]}get id(){return this[r]}}return a},n=(e,t)=>s(e,()=>t),o=(e,t)=>s(e,t),a=e=>{let t=Symbol(),r=Symbol(),s=e=>!!e&&"object"==typeof e&&r in e;class n{static schema=e(s);constructor(e){Object.defineProperty(this,t,{value:i(n.schema,e)}),Object.defineProperty(this,r,{value:!0})}get model(){return this[t]}}return n},c=e=>a(()=>e),l=e=>a(e);export{t as AsyncSchemaInSyncParsingError,r as InvalidDataParsingError,n as defineEntity,o as defineRecursiveEntity,l as defineRecursiveValueObject,c as defineValueObject};
1
+ import{errorNamespace as e}from"@domain-first/errors";let r=e("@DOMAIN-FIRST/TYPES"),t=r.error("ASYNC_LOGIC"),i=r.error("INVALID_DATA"),s=e=>{let r=Symbol(),s=e=>!!e&&"object"==typeof e&&r in e;class o{static schema=e(s);constructor(e){let s=function(e,r){let s=e["~standard"].validate(r);if(s instanceof Promise)throw new t({schema:e,value:r});if("issues"in s&&s.issues)throw new i({parsingIssues:s.issues,value:r});return s.value}(this.constructor.schema,e);if(s&&"object"==typeof s)for(let[e,r]of Object.entries(s))Object.defineProperty(this,e,{value:r,writable:!1,configurable:!1,enumerable:!0});else Object.defineProperty(this,"value",{value:s,writable:!1,configurable:!1,enumerable:!0});Object.defineProperty(this,r,{value:!0,writable:!1,configurable:!1})}}return o},o=e=>s(()=>e),n=e=>s(e);export{t as AsyncSchemaInSyncParsingError,i as TypeParsingError,o as domainType,n as recursiveDomainType};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/errors/async-schema-in-sync-parsing-error.ts","../src/errors/invalid-data-parsing-error.ts","../src/utils/parse-sync.ts","../src/entity.ts","../src/value-object.ts"],"sourcesContent":["import { errorNamespace } from '@domain-first/errors';\n\nconst SchemaErrors = errorNamespace('SCHEMA')\n\nexport const AsyncSchemaInSyncParsingError = SchemaErrors.error('ASYNC_LOGIC');\n","import { errorNamespace } from '@domain-first/errors';\nimport type { StandardSchemaV1 } from '@standard-schema/spec';\n\nconst ParsingErrors = errorNamespace(\"PARSING\")\n\nexport const InvalidDataParsingError = ParsingErrors.error<{\n parsingIssues: readonly StandardSchemaV1.Issue[];\n value: unknown;\n}>('INVALID_DATA');\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport {\n AsyncSchemaInSyncParsingError,\n InvalidDataParsingError\n} from '../errors';\n\nexport function parseSync<S extends StandardSchemaV1>(\n schema: S,\n value: StandardSchemaV1.InferInput<S>\n): StandardSchemaV1.InferOutput<S> {\n const result = schema['~standard'].validate(value);\n\n if (result instanceof Promise) {\n throw new AsyncSchemaInSyncParsingError({ schema, value });\n }\n\n if ('issues' in result && result.issues) {\n throw new InvalidDataParsingError({ parsingIssues: result.issues, value });\n }\n\n return result.value;\n}\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type DeepReadonly, parseSync } from './utils';\n\nconst createEntity = <\n IdSchema extends StandardSchemaV1,\n ModelSchema extends StandardSchemaV1\n>(\n idSchema: IdSchema,\n getModelSchema: (\n isCurrentEntity: (target: unknown) => boolean\n ) => ModelSchema\n) => {\n const idSymbol = Symbol();\n const modelSymbol = Symbol();\n const classSymbol = Symbol();\n\n const isThisClass = (target: unknown): boolean => {\n return !!target && typeof target === 'object' && classSymbol in target;\n };\n\n abstract class Entity {\n public static readonly idSchema = idSchema;\n public static readonly modelSchema = getModelSchema(isThisClass);\n\n constructor(\n id: StandardSchemaV1.InferInput<IdSchema>,\n model: StandardSchemaV1.InferInput<ModelSchema>\n ) {\n const parsedId = parseSync(Entity.idSchema, id);\n const parsedModelData = parseSync(Entity.modelSchema, model);\n\n Object.defineProperty(this, idSymbol, {\n value: parsedId\n });\n\n Object.defineProperty(this, modelSymbol, {\n value: parsedModelData\n });\n\n Object.defineProperty(this, classSymbol, {\n value: true\n });\n }\n\n get model() {\n return (this as any)[modelSymbol] as DeepReadonly<\n StandardSchemaV1.InferOutput<ModelSchema>\n >;\n }\n\n get id() {\n return (this as any)[idSymbol] as DeepReadonly<\n StandardSchemaV1.InferOutput<IdSchema>\n >;\n }\n }\n\n return Entity;\n};\n\nexport const defineEntity = <\n IdSchema extends StandardSchemaV1,\n ModelSchema extends StandardSchemaV1\n>(\n idSchema: IdSchema,\n modelSchema: ModelSchema\n) => {\n return createEntity(idSchema, () => modelSchema);\n};\n\nexport const defineRecursiveEntity = <\n IdSchema extends StandardSchemaV1,\n ModelSchema extends StandardSchemaV1\n>(\n idSchema: IdSchema,\n modelSchema: (isCurrentEntity: (target: unknown) => boolean) => ModelSchema\n) => {\n return createEntity(idSchema, modelSchema);\n};\n\nexport type InferEntityModel<T> = T extends { modelSchema: StandardSchemaV1 }\n ? StandardSchemaV1.InferOutput<T['modelSchema']>\n : T extends { model: infer M }\n ? M\n : never;\n\nexport type InferEntityId<T> = T extends { idSchema: StandardSchemaV1 }\n ? StandardSchemaV1.InferOutput<T['idSchema']>\n : T extends { id: infer M }\n ? M\n : never;\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type DeepReadonly, parseSync } from './utils';\n\nconst createValueObject = <Schema extends StandardSchemaV1>(\n getSchema: (isCurrentValueObject: (target: unknown) => boolean) => Schema\n) => {\n const modelSymbol = Symbol();\n const classSymbol = Symbol();\n\n const isThisClass = (target: unknown): boolean => {\n return !!target && typeof target === 'object' && classSymbol in target;\n };\n\n abstract class ValueObject {\n public static readonly schema = getSchema(isThisClass);\n\n constructor(data: StandardSchemaV1.InferInput<Schema>) {\n const parsedData = parseSync(ValueObject.schema, data);\n\n Object.defineProperty(this, modelSymbol, {\n value: parsedData\n });\n\n Object.defineProperty(this, classSymbol, {\n value: true\n });\n }\n\n get model() {\n const thisWithSymbol = this as unknown as {\n [modelSymbol]: StandardSchemaV1.InferOutput<Schema>;\n };\n\n return thisWithSymbol[modelSymbol] as DeepReadonly<\n StandardSchemaV1.InferOutput<Schema>\n >;\n }\n }\n\n return ValueObject;\n};\n\nexport const defineValueObject = <Schema extends StandardSchemaV1>(\n schema: Schema\n) => {\n return createValueObject(() => schema);\n};\n\nexport const defineRecursiveValueObject = <Schema extends StandardSchemaV1>(\n schema: (isCurrentValueObject: (target: unknown) => boolean) => Schema\n) => {\n return createValueObject(schema);\n};\n\nexport type InferValueObjectSchema<T> = T extends {\n schema: infer S extends StandardSchemaV1;\n}\n ? StandardSchemaV1.InferOutput<S>\n : T extends { model: infer M }\n ? M\n : never;\n"],"names":["AsyncSchemaInSyncParsingError","SchemaErrors","errorNamespace","InvalidDataParsingError","ParsingErrors","parseSync","schema","value","result","Promise","createEntity","idSchema","getModelSchema","idSymbol","Symbol","modelSymbol","classSymbol","isThisClass","target","Entity","id","model","parsedId","parsedModelData","Object","defineEntity","modelSchema","defineRecursiveEntity","createValueObject","getSchema","ValueObject","data","thisWithSymbol","defineValueObject","defineRecursiveValueObject"],"mappings":"sDAIO,IAAMA,EAAgCC,AAFxBC,EAAe,UAEsB,KAAK,CAAC,eCCnDC,EAA0BC,AAFjBF,EAAe,WAEgB,KAAK,CAGvD,gBCFI,SAASG,EACZC,CAAS,CACTC,CAAqC,EAErC,IAAMC,EAASF,CAAM,CAAC,YAAY,CAAC,QAAQ,CAACC,GAE5C,GAAIC,aAAkBC,QAClB,MAAM,IAAIT,EAA8B,CAAEM,OAAAA,EAAQC,MAAAA,CAAM,GAG5D,GAAI,WAAYC,GAAUA,EAAO,MAAM,CACnC,MAAM,IAAIL,EAAwB,CAAE,cAAeK,EAAO,MAAM,CAAED,MAAAA,CAAM,GAG5E,OAAOC,EAAO,KAAK,AACvB,CClBA,IAAME,EAAe,CAIjBC,EACAC,KAIA,IAAMC,EAAWC,SACXC,EAAcD,SACdE,EAAcF,SAEdG,EAAc,AAACC,GACV,CAAC,CAACA,GAAU,AAAkB,UAAlB,OAAOA,GAAuBF,KAAeE,CAGpE,OAAeC,EACX,OAAuB,SAAWR,CAAS,AAC3C,QAAuB,YAAcC,EAAeK,EAAa,AAEjE,aACIG,CAAyC,CACzCC,CAA+C,CACjD,CACE,IAAMC,EAAWjB,EAAUc,EAAO,QAAQ,CAAEC,GACtCG,EAAkBlB,EAAUc,EAAO,WAAW,CAAEE,GAEtDG,OAAO,cAAc,CAAC,IAAI,CAAEX,EAAU,CAClC,MAAOS,CACX,GAEAE,OAAO,cAAc,CAAC,IAAI,CAAET,EAAa,CACrC,MAAOQ,CACX,GAEAC,OAAO,cAAc,CAAC,IAAI,CAAER,EAAa,CACrC,MAAO,EACX,EACJ,CAEA,IAAI,OAAQ,CACR,OAAQ,IAAY,CAACD,EAAY,AAGrC,CAEA,IAAI,IAAK,CACL,OAAQ,IAAY,CAACF,EAAS,AAGlC,CACJ,CAEA,OAAOM,CACX,EAEaM,EAAe,CAIxBd,EACAe,IAEOhB,EAAaC,EAAU,IAAMe,GAG3BC,EAAwB,CAIjChB,EACAe,IAEOhB,EAAaC,EAAUe,GC1E5BE,EAAoB,AACtBC,IAEA,IAAMd,EAAcD,SACdE,EAAcF,SAEdG,EAAc,AAACC,GACV,CAAC,CAACA,GAAU,AAAkB,UAAlB,OAAOA,GAAuBF,KAAeE,CAGpE,OAAeY,EACX,OAAuB,OAASD,EAAUZ,EAAa,AAEvD,aAAYc,CAAyC,CAAE,CAGnDP,OAAO,cAAc,CAAC,IAAI,CAAET,EAAa,CACrC,MAHeV,EAAUyB,EAAY,MAAM,CAAEC,EAIjD,GAEAP,OAAO,cAAc,CAAC,IAAI,CAAER,EAAa,CACrC,MAAO,EACX,EACJ,CAEA,IAAI,OAAQ,CAKR,OAAOgB,AAJgB,IAAI,AAIN,CAACjB,EAAY,AAGtC,CACJ,CAEA,OAAOe,CACX,EAEaG,EAAoB,AAC7B3B,GAEOsB,EAAkB,IAAMtB,GAGtB4B,EAA6B,AACtC5B,GAEOsB,EAAkBtB,U"}
1
+ {"version":3,"file":"index.js","sources":["../src/errors/namespace.ts","../src/errors/async-schema-in-sync-parsing-error.ts","../src/errors/type-parsing-error.ts","../src/domain-type.ts","../src/utils/parse-sync.ts"],"sourcesContent":["import { errorNamespace } from \"@domain-first/errors\";\n\nexport const DomainFirstTypesError = errorNamespace(\"@DOMAIN-FIRST/TYPES\")\n","import { DomainFirstTypesError } from './namespace';\n\nexport const AsyncSchemaInSyncParsingError = DomainFirstTypesError.error('ASYNC_LOGIC');\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { DomainFirstTypesError } from './namespace';\n\nexport const TypeParsingError = DomainFirstTypesError.error<{\n parsingIssues: readonly StandardSchemaV1.Issue[];\n value: unknown;\n}>('INVALID_DATA');\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport { type DeepReadonly, parseSync } from './utils';\n\nconst createDomainType = <ModelSchema extends StandardSchemaV1>(\n getModelSchema: (\n isCurrentEntity: (target: unknown) => boolean\n ) => ModelSchema\n) => {\n const classSymbol = Symbol();\n\n const isInstanceOfThisType = (target: unknown): boolean => {\n return !!target && typeof target === 'object' && classSymbol in target;\n };\n\n class DomainType {\n public static readonly schema = getModelSchema(isInstanceOfThisType);\n\n constructor(model: StandardSchemaV1.InferInput<ModelSchema>) {\n const schema = (this.constructor as typeof DomainType).schema;\n\n const parsedModelData = parseSync(schema, model);\n\n if (parsedModelData && typeof parsedModelData === 'object') {\n for (const [key, value] of Object.entries(parsedModelData)) {\n Object.defineProperty(this, key, {\n value,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n } else {\n Object.defineProperty(this, 'value', {\n value: parsedModelData,\n writable: false,\n configurable: false,\n enumerable: true\n });\n }\n\n Object.defineProperty(this, classSymbol, {\n value: true,\n writable: false,\n configurable: false\n });\n }\n }\n\n return DomainType as unknown as (abstract new (\n model: StandardSchemaV1.InferInput<ModelSchema>\n ) => DeepReadonly<\n StandardSchemaV1.InferOutput<ModelSchema> extends object\n ? StandardSchemaV1.InferOutput<ModelSchema>\n : {\n value: StandardSchemaV1.InferOutput<ModelSchema>;\n }\n >) & { schema: ModelSchema };\n};\n\nexport const domainType = <ModelSchema extends StandardSchemaV1>(\n modelSchema: ModelSchema\n) => {\n return createDomainType(() => modelSchema);\n};\n\nexport const recursiveDomainType = <ModelSchema extends StandardSchemaV1>(\n modelSchema: (isCurrentType: (target: unknown) => boolean) => ModelSchema\n) => {\n return createDomainType(modelSchema);\n};\n","import type { StandardSchemaV1 } from '@standard-schema/spec';\nimport {\n AsyncSchemaInSyncParsingError,\n TypeParsingError\n} from '../errors';\n\nexport function parseSync<S extends StandardSchemaV1>(\n schema: S,\n value: StandardSchemaV1.InferInput<S>\n): StandardSchemaV1.InferOutput<S> {\n const result = schema['~standard'].validate(value);\n\n if (result instanceof Promise) {\n throw new AsyncSchemaInSyncParsingError({ schema, value });\n }\n\n if ('issues' in result && result.issues) {\n throw new TypeParsingError({ parsingIssues: result.issues, value });\n }\n\n return result.value;\n}\n"],"names":["DomainFirstTypesError","errorNamespace","AsyncSchemaInSyncParsingError","TypeParsingError","createDomainType","getModelSchema","classSymbol","Symbol","isInstanceOfThisType","target","DomainType","model","parsedModelData","parseSync","schema","value","result","Promise","key","Object","domainType","modelSchema","recursiveDomainType"],"mappings":"sDAEO,IAAMA,EAAwBC,EAAe,uBCAvCC,EAAgCF,EAAsB,KAAK,CAAC,eCC5DG,EAAmBH,EAAsB,KAAK,CAGxD,gBCHGI,EAAmB,AACrBC,IAIA,IAAMC,EAAcC,SAEdC,EAAuB,AAACC,GACnB,CAAC,CAACA,GAAU,AAAkB,UAAlB,OAAOA,GAAuBH,KAAeG,CAGpE,OAAMC,EACF,OAAuB,OAASL,EAAeG,EAAsB,AAErE,aAAYG,CAA+C,CAAE,CAGzD,IAAMC,EAAkBC,ACd7B,SACHC,CAAS,CACTC,CAAqC,EAErC,IAAMC,EAASF,CAAM,CAAC,YAAY,CAAC,QAAQ,CAACC,GAE5C,GAAIC,aAAkBC,QAClB,MAAM,IAAIf,EAA8B,CAAEY,OAAAA,EAAQC,MAAAA,CAAM,GAG5D,GAAI,WAAYC,GAAUA,EAAO,MAAM,CACnC,MAAM,IAAIb,EAAiB,CAAE,cAAea,EAAO,MAAM,CAAED,MAAAA,CAAM,GAGrE,OAAOC,EAAO,KAAK,AACvB,EDH4B,IAAI,CAAC,WAAW,CAAuB,MAAM,CAEnBL,GAE1C,GAAIC,GAAmB,AAA2B,UAA3B,OAAOA,EAC1B,IAAK,GAAM,CAACM,EAAKH,EAAM,GAAII,OAAO,OAAO,CAACP,GACtCO,OAAO,cAAc,CAAC,IAAI,CAAED,EAAK,CAC7BH,MAAAA,EACA,SAAU,GACV,aAAc,GACd,WAAY,EAChB,QAGJI,OAAO,cAAc,CAAC,IAAI,CAAE,QAAS,CACjC,MAAOP,EACP,SAAU,GACV,aAAc,GACd,WAAY,EAChB,GAGJO,OAAO,cAAc,CAAC,IAAI,CAAEb,EAAa,CACrC,MAAO,GACP,SAAU,GACV,aAAc,EAClB,EACJ,CACJ,CAEA,OAAOI,CASX,EAEaU,EAAa,AACtBC,GAEOjB,EAAiB,IAAMiB,GAGrBC,EAAsB,AAC/BD,GAEOjB,EAAiBiB,U"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@domain-first/types",
3
- "description": "Type-Safe Entities and Value Objects with Standard Schema Validation",
3
+ "description": "Type-safe domain models powered by Standard Schema validation",
4
4
  "license": "MIT",
5
5
  "keywords": [
6
6
  "entity",
@@ -16,7 +16,7 @@
16
16
  "valibot"
17
17
  ],
18
18
  "homepage": "https://codesandbox.io/p/devbox/async-cache-d8crnx?file=%2Findex.js%3A8%2C65",
19
- "version": "3.0.7",
19
+ "version": "5.0.0",
20
20
  "type": "module",
21
21
  "repository": {
22
22
  "type": "git",
package/dist/entity.d.ts DELETED
@@ -1,26 +0,0 @@
1
- import type { StandardSchemaV1 } from '@standard-schema/spec';
2
- import { type DeepReadonly } from './utils';
3
- export declare const defineEntity: <IdSchema extends StandardSchemaV1, ModelSchema extends StandardSchemaV1>(idSchema: IdSchema, modelSchema: ModelSchema) => (abstract new (id: StandardSchemaV1.InferInput<IdSchema>, model: StandardSchemaV1.InferInput<ModelSchema>) => {
4
- get model(): DeepReadonly<StandardSchemaV1.InferOutput<ModelSchema>>;
5
- get id(): DeepReadonly<StandardSchemaV1.InferOutput<IdSchema>>;
6
- }) & {
7
- readonly idSchema: IdSchema;
8
- readonly modelSchema: ModelSchema;
9
- };
10
- export declare const defineRecursiveEntity: <IdSchema extends StandardSchemaV1, ModelSchema extends StandardSchemaV1>(idSchema: IdSchema, modelSchema: (isCurrentEntity: (target: unknown) => boolean) => ModelSchema) => (abstract new (id: StandardSchemaV1.InferInput<IdSchema>, model: StandardSchemaV1.InferInput<ModelSchema>) => {
11
- get model(): DeepReadonly<StandardSchemaV1.InferOutput<ModelSchema>>;
12
- get id(): DeepReadonly<StandardSchemaV1.InferOutput<IdSchema>>;
13
- }) & {
14
- readonly idSchema: IdSchema;
15
- readonly modelSchema: ModelSchema;
16
- };
17
- export type InferEntityModel<T> = T extends {
18
- modelSchema: StandardSchemaV1;
19
- } ? StandardSchemaV1.InferOutput<T['modelSchema']> : T extends {
20
- model: infer M;
21
- } ? M : never;
22
- export type InferEntityId<T> = T extends {
23
- idSchema: StandardSchemaV1;
24
- } ? StandardSchemaV1.InferOutput<T['idSchema']> : T extends {
25
- id: infer M;
26
- } ? M : never;
@@ -1,17 +0,0 @@
1
- import type { StandardSchemaV1 } from '@standard-schema/spec';
2
- import { type DeepReadonly } from './utils';
3
- export declare const defineValueObject: <Schema extends StandardSchemaV1>(schema: Schema) => (abstract new (data: StandardSchemaV1.InferInput<Schema>) => {
4
- get model(): DeepReadonly<StandardSchemaV1.InferOutput<Schema>>;
5
- }) & {
6
- readonly schema: Schema;
7
- };
8
- export declare const defineRecursiveValueObject: <Schema extends StandardSchemaV1>(schema: (isCurrentValueObject: (target: unknown) => boolean) => Schema) => (abstract new (data: StandardSchemaV1.InferInput<Schema>) => {
9
- get model(): DeepReadonly<StandardSchemaV1.InferOutput<Schema>>;
10
- }) & {
11
- readonly schema: Schema;
12
- };
13
- export type InferValueObjectSchema<T> = T extends {
14
- schema: infer S extends StandardSchemaV1;
15
- } ? StandardSchemaV1.InferOutput<S> : T extends {
16
- model: infer M;
17
- } ? M : never;