@need-code/nc-ddd 0.3.1 → 0.4.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.
@@ -0,0 +1,5 @@
1
+ import { type Either } from "effect/Either";
2
+ type MapOptionalResult<V, L, R> = undefined extends V ? null extends V ? Either<L, R | null | undefined> : Either<L, R | undefined> : null extends V ? Either<L, R | null> : Either<L, R>;
3
+ export declare function effectMapOptional<V, L, R>(value: V, factory: (value: NonNullable<V>) => Either<L, R>): Either<undefined, never> | Either<null, never> | MapOptionalResult<V, L, R>;
4
+ export {};
5
+ //# sourceMappingURL=effect-map-optional.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-map-optional.d.ts","sourceRoot":"","sources":["../../src/helpers/effect-map-optional.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,MAAM,EAAS,MAAM,eAAe,CAAC;AAEnD,KAAK,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,IAAI,SAAS,SAAS,CAAC,GACjD,IAAI,SAAS,CAAC,GACZ,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,GAAG,SAAS,CAAC,GAC/B,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,SAAS,CAAC,GAC1B,IAAI,SAAS,CAAC,GACZ,MAAM,CAAC,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,GACnB,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEnB,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EACvC,KAAK,EAAE,CAAC,EACR,OAAO,EAAE,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,+EAWjD"}
@@ -0,0 +1,11 @@
1
+ import { right } from "effect/Either";
2
+ export function effectMapOptional(value, factory) {
3
+ if (value === undefined) {
4
+ return right(undefined);
5
+ }
6
+ if (value === null) {
7
+ return right(null);
8
+ }
9
+ return factory(value);
10
+ }
11
+ //# sourceMappingURL=effect-map-optional.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"effect-map-optional.js","sourceRoot":"","sources":["../../src/helpers/effect-map-optional.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,KAAK,EAAE,MAAM,eAAe,CAAC;AAUnD,MAAM,UAAU,iBAAiB,CAC/B,KAAQ,EACR,OAAgD;IAEhD,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,KAAK,CAAC,SAAS,CAAC,CAAC;IAC1B,CAAC;IAED,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,KAAK,CAAC,IAAI,CAAC,CAAC;IACrB,CAAC;IAED,OAAO,OAAO,CAAC,KAAuB,CAA+B,CAAC;AACxE,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare function extractEffectErrors(input: Record<string, unknown>): Record<string, string[]>;
2
+ //# sourceMappingURL=extract-effect-errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-effect-errors.d.ts","sourceRoot":"","sources":["../../src/helpers/extract-effect-errors.ts"],"names":[],"mappings":"AAcA,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,CAmD5F"}
@@ -0,0 +1,57 @@
1
+ import { Option } from "effect";
2
+ // ─── Хелперы ─────────────────────────────────────────────────────────────────
3
+ function isStringArray(value) {
4
+ return Array.isArray(value) && value.every((v) => typeof v === "string");
5
+ }
6
+ function isOptionArray(value) {
7
+ return Array.isArray(value) && value.every(Option.isOption);
8
+ }
9
+ // ─── Основная функция ────────────────────────────────────────────────────────
10
+ export function extractEffectErrors(input) {
11
+ const result = {};
12
+ for (const [key, raw] of Object.entries(input)) {
13
+ // Пропускаем всё что не Option
14
+ if (!Option.isOption(raw))
15
+ continue;
16
+ if (Option.isNone(raw))
17
+ continue;
18
+ const value = raw.value;
19
+ if (!value)
20
+ continue;
21
+ // Простой массив строк: { name: Some(["Name can't be empty"]) }
22
+ if (isStringArray(value)) {
23
+ result[key] = value;
24
+ continue;
25
+ }
26
+ // Массив Option-ов: { contacts: Some([Some({ "contacts.0": { value: [...] } })]) }
27
+ if (isOptionArray(value)) {
28
+ for (const item of value) {
29
+ if (Option.isNone(item))
30
+ continue;
31
+ const inner = item.value;
32
+ if (typeof inner === "object" && inner !== null) {
33
+ for (const [nestedKey, nestedVal] of Object.entries(inner)) {
34
+ if (typeof nestedVal === "object" && nestedVal !== null) {
35
+ for (const [fieldKey, fieldVal] of Object.entries(nestedVal)) {
36
+ if (isStringArray(fieldVal)) {
37
+ // "contacts.0" + "." + "value" = "contacts.0.value"
38
+ result[`${nestedKey}.${fieldKey}`] = fieldVal;
39
+ }
40
+ }
41
+ }
42
+ }
43
+ }
44
+ }
45
+ continue;
46
+ }
47
+ // Вложенный объект: рекурсия
48
+ if (typeof value === "object") {
49
+ const nested = extractEffectErrors(value);
50
+ for (const [nestedKey, val] of Object.entries(nested)) {
51
+ result[`${key}.${nestedKey}`] = val;
52
+ }
53
+ }
54
+ }
55
+ return result;
56
+ }
57
+ //# sourceMappingURL=extract-effect-errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"extract-effect-errors.js","sourceRoot":"","sources":["../../src/helpers/extract-effect-errors.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,gFAAgF;AAEhF,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC;AAC9D,CAAC;AAED,gFAAgF;AAEhF,MAAM,UAAU,mBAAmB,CAAC,KAA8B;IAChE,MAAM,MAAM,GAA6B,EAAE,CAAC;IAE5C,KAAK,MAAM,CAAC,GAAG,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC/C,+BAA+B;QAC/B,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC;YAAE,SAAS;QACpC,IAAI,MAAM,CAAC,MAAM,CAAC,GAAG,CAAC;YAAE,SAAS;QAEjC,MAAM,KAAK,GAAG,GAAG,CAAC,KAAK,CAAC;QAExB,IAAI,CAAC,KAAK;YAAE,SAAS;QAErB,gEAAgE;QAChE,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;YACpB,SAAS;QACX,CAAC;QAED,mFAAmF;QACnF,IAAI,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;gBACzB,IAAI,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC;oBAAE,SAAS;gBAElC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;gBAEzB,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;oBAChD,KAAK,MAAM,CAAC,SAAS,EAAE,SAAS,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;wBAC3D,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,SAAS,KAAK,IAAI,EAAE,CAAC;4BACxD,KAAK,MAAM,CAAC,QAAQ,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE,CAAC;gCAC7D,IAAI,aAAa,CAAC,QAAQ,CAAC,EAAE,CAAC;oCAC5B,oDAAoD;oCACpD,MAAM,CAAC,GAAG,SAAS,IAAI,QAAQ,EAAE,CAAC,GAAG,QAAQ,CAAC;gCAChD,CAAC;4BACH,CAAC;wBACH,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,SAAS;QACX,CAAC;QAED,6BAA6B;QAC7B,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC9B,MAAM,MAAM,GAAG,mBAAmB,CAAC,KAAgC,CAAC,CAAC;YACrE,KAAK,MAAM,CAAC,SAAS,EAAE,GAAG,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;gBACtD,MAAM,CAAC,GAAG,GAAG,IAAI,SAAS,EAAE,CAAC,GAAG,GAAG,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import * as v from "valibot";
2
+ import type { VO } from "@/core/vo.js";
3
+ export declare function voEffectFactory<S extends v.BaseSchema<unknown, unknown, v.BaseIssue<unknown>>>(value: unknown, schema: S, constructorFn: (props: v.InferOutput<S>) => VO<S>, key?: string): import("effect/Either").Either<never, [string, ...string[]] | {
4
+ [key]: [string, ...string[]] | (Readonly<Partial<Record<S extends v.BaseSchema<unknown, unknown, v.BaseIssue<unknown>> | v.BaseSchemaAsync<unknown, unknown, v.BaseIssue<unknown>> ? v.IssueDotPath<S> : string, [string, ...string[]]>>> extends infer T ? { [TKey in keyof T]: T[TKey]; } : never) | undefined;
5
+ } | undefined> | import("effect/Either").Either<VO<S>, never>;
6
+ //# sourceMappingURL=vo-effect-factory.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vo-effect-factory.d.ts","sourceRoot":"","sources":["../../src/helpers/vo-effect-factory.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAC7B,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,cAAc,CAAC;AAEvC,wBAAgB,eAAe,CAAC,CAAC,SAAS,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC,EAC5F,KAAK,EAAE,OAAO,EACd,MAAM,EAAE,CAAC,EACT,aAAa,EAAE,CAAC,KAAK,EAAE,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,EACjD,GAAG,CAAC,EAAE,MAAM;IASF,CAAC,GAAG,CAAC,4SAAW;8DAM3B"}
@@ -0,0 +1,16 @@
1
+ import { left, right } from "effect/Either";
2
+ import * as v from "valibot";
3
+ export function voEffectFactory(value, schema, constructorFn, key) {
4
+ const parseResult = v.safeParse(schema, value);
5
+ if (!parseResult.success) {
6
+ const flattedErrors = v.flatten(parseResult.issues);
7
+ const errorsRes = flattedErrors.root || flattedErrors.nested || flattedErrors.other;
8
+ return left(key
9
+ ? {
10
+ [key]: errorsRes,
11
+ }
12
+ : errorsRes);
13
+ }
14
+ return right(constructorFn(parseResult.output));
15
+ }
16
+ //# sourceMappingURL=vo-effect-factory.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vo-effect-factory.js","sourceRoot":"","sources":["../../src/helpers/vo-effect-factory.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,CAAC,MAAM,SAAS,CAAC;AAG7B,MAAM,UAAU,eAAe,CAC7B,KAAc,EACd,MAAS,EACT,aAAiD,EACjD,GAAY;IAEZ,MAAM,WAAW,GAAG,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC;IAC/C,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE,CAAC;QACzB,MAAM,aAAa,GAAG,CAAC,CAAC,OAAO,CAAgB,WAAW,CAAC,MAAM,CAAC,CAAC;QACnE,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,IAAI,aAAa,CAAC,MAAM,IAAI,aAAa,CAAC,KAAK,CAAC;QACpF,OAAO,IAAI,CACT,GAAG;YACD,CAAC,CAAC;gBACE,CAAC,GAAG,CAAC,EAAE,SAAS;aACjB;YACH,CAAC,CAAC,SAAS,CACd,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,aAAa,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC,CAAC;AAClD,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,5 +1,8 @@
1
1
  export * from "./core/aggregate-root.js";
2
2
  export * from "./core/entity.js";
3
3
  export * from "./core/vo.js";
4
+ export * from "./helpers/effect-map-optional.js";
5
+ export * from "./helpers/extract-effect-errors.js";
6
+ export * from "./helpers/vo-effect-factory.js";
4
7
  export * from "./helpers/vo-factory.js";
5
8
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,8 @@
1
1
  export * from "./core/aggregate-root.js";
2
2
  export * from "./core/entity.js";
3
3
  export * from "./core/vo.js";
4
+ export * from "./helpers/effect-map-optional.js";
5
+ export * from "./helpers/extract-effect-errors.js";
6
+ export * from "./helpers/vo-effect-factory.js";
4
7
  export * from "./helpers/vo-factory.js";
5
8
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,yBAAyB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,0BAA0B,CAAC;AACzC,cAAc,kBAAkB,CAAC;AACjC,cAAc,cAAc,CAAC;AAC7B,cAAc,kCAAkC,CAAC;AACjD,cAAc,oCAAoC,CAAC;AACnD,cAAc,gCAAgC,CAAC;AAC/C,cAAc,yBAAyB,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@need-code/nc-ddd",
3
- "version": "0.3.1",
3
+ "version": "0.4.0",
4
4
  "description": "A set of base classes for implementing Domain-Driven Design patterns.",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -38,6 +38,7 @@
38
38
  },
39
39
  "peerDependencies": {
40
40
  "@sweet-monads/either": ">=3.0.0",
41
+ "effect": "^3.20.0",
41
42
  "valibot": ">=1.0.0"
42
43
  }
43
44
  }