@thisisagile/easy 8.5.6 → 8.5.10

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,7 +1,8 @@
1
1
  import { Scope, UseCase } from '../process';
2
- export declare const requires: {
3
- labCoat: () => PropertyDecorator;
4
- token: () => PropertyDecorator;
5
- scope: (scope: Scope) => PropertyDecorator;
6
- useCase: (uc: UseCase) => PropertyDecorator;
7
- };
2
+ export declare class Requires {
3
+ readonly labCoat: () => PropertyDecorator;
4
+ readonly token: () => PropertyDecorator;
5
+ readonly scope: (scope: Scope) => PropertyDecorator;
6
+ readonly useCase: (uc: UseCase) => PropertyDecorator;
7
+ }
8
+ export declare const requires: Requires;
@@ -1,21 +1,25 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.requires = void 0;
3
+ exports.requires = exports.Requires = void 0;
4
4
  const types_1 = require("../types");
5
- exports.requires = {
6
- labCoat: () => (subject, property) => {
7
- (0, types_1.meta)(subject).property(property).set('labCoat', true);
8
- },
9
- token: () => (subject, property) => {
10
- (0, types_1.meta)(subject).property(property).set('token', true);
11
- },
12
- scope: (scope) => (subject, property) => {
13
- (0, types_1.meta)(subject).property(property).set('token', true);
14
- (0, types_1.meta)(subject).property(property).set('scope', scope);
15
- },
16
- useCase: (uc) => (subject, property) => {
17
- (0, types_1.meta)(subject).property(property).set('token', true);
18
- (0, types_1.meta)(subject).property(property).set('uc', uc);
19
- },
20
- };
5
+ class Requires {
6
+ constructor() {
7
+ this.labCoat = () => (subject, property) => {
8
+ (0, types_1.meta)(subject).property(property).set('labCoat', true);
9
+ };
10
+ this.token = () => (subject, property) => {
11
+ (0, types_1.meta)(subject).property(property).set('token', true);
12
+ };
13
+ this.scope = (scope) => (subject, property) => {
14
+ (0, types_1.meta)(subject).property(property).set('token', true);
15
+ (0, types_1.meta)(subject).property(property).set('scope', scope);
16
+ };
17
+ this.useCase = (uc) => (subject, property) => {
18
+ (0, types_1.meta)(subject).property(property).set('token', true);
19
+ (0, types_1.meta)(subject).property(property).set('uc', uc);
20
+ };
21
+ }
22
+ }
23
+ exports.Requires = Requires;
24
+ exports.requires = new Requires();
21
25
  //# sourceMappingURL=Requires.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Requires.js","sourceRoot":"","sources":["../../src/resources/Requires.ts"],"names":[],"mappings":";;;AAAA,oCAAgC;AAGnB,QAAA,QAAQ,GAAG;IACtB,OAAO,EACL,GAAsB,EAAE,CACxB,CAAC,OAAgB,EAAE,QAAyB,EAAQ,EAAE;QACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IAEH,KAAK,EACH,GAAsB,EAAE,CACxB,CAAC,OAAgB,EAAE,QAAyB,EAAQ,EAAE;QACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;IACtD,CAAC;IAEH,KAAK,EACH,CAAC,KAAY,EAAqB,EAAE,CACpC,CAAC,OAAgB,EAAE,QAAyB,EAAQ,EAAE;QACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACvD,CAAC;IAEH,OAAO,EACL,CAAC,EAAW,EAAqB,EAAE,CACnC,CAAC,OAAgB,EAAE,QAAyB,EAAQ,EAAE;QACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;IACjD,CAAC;CACJ,CAAC"}
1
+ {"version":3,"file":"Requires.js","sourceRoot":"","sources":["../../src/resources/Requires.ts"],"names":[],"mappings":";;;AAAA,oCAAgC;AAGhC,MAAa,QAAQ;IAArB;QACW,YAAO,GACd,GAAsB,EAAE,CACxB,CAAC,OAAgB,EAAE,QAAyB,EAAQ,EAAE;YACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACxD,CAAC,CAAC;QAEK,UAAK,GACZ,GAAsB,EAAE,CACxB,CAAC,OAAgB,EAAE,QAAyB,EAAQ,EAAE;YACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QACtD,CAAC,CAAC;QAEK,UAAK,GACZ,CAAC,KAAY,EAAqB,EAAE,CACpC,CAAC,OAAgB,EAAE,QAAyB,EAAQ,EAAE;YACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;QACvD,CAAC,CAAC;QAEK,YAAO,GACd,CAAC,EAAW,EAAqB,EAAE,CACnC,CAAC,OAAgB,EAAE,QAAyB,EAAQ,EAAE;YACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;YACpD,IAAA,YAAI,EAAC,OAAO,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACjD,CAAC,CAAC;IACN,CAAC;CAAA;AA1BD,4BA0BC;AAEY,QAAA,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC"}
@@ -1,5 +1,6 @@
1
1
  import { Uuid } from './Uuid';
2
2
  import { Identity } from './Identity';
3
+ import { Construct } from './Constructor';
3
4
  export declare type EnvContext = {
4
5
  readonly domain: string;
5
6
  readonly name: string;
@@ -39,13 +40,23 @@ export declare class BaseContext implements RequestContext {
39
40
  set<T>(key: string, value: T): T;
40
41
  readonly create: (f: () => void) => void;
41
42
  }
42
- export declare class Context {
43
- protected state: any;
44
- constructor(state?: any);
45
- get env(): EnvContext;
46
- set env(env: EnvContext);
47
- get request(): RequestContext;
48
- set request(request: RequestContext);
43
+ export declare type Contexts<E extends EnvContext, R extends RequestContext> = {
44
+ env?: E;
45
+ request?: R;
46
+ other?: any;
47
+ };
48
+ export declare class Context<E extends EnvContext, R extends RequestContext> {
49
+ protected state: Contexts<E, R>;
50
+ constructor(state?: Contexts<E, R>);
51
+ get env(): E;
52
+ set env(env: E);
53
+ get request(): R;
54
+ set request(request: R);
49
55
  get other(): any;
56
+ static use: <E_1 extends EnvContext, R_1 extends RequestContext>({ env, request, other, }: {
57
+ env?: Construct<E_1> | undefined;
58
+ request?: Construct<R_1> | undefined;
59
+ other?: any;
60
+ }) => Context<E_1, R_1>;
50
61
  }
51
- export declare const ctx: Context;
62
+ export declare const ctx: Context<EnvContext, RequestContext>;
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.ctx = exports.Context = exports.BaseContext = exports.DotEnvContext = void 0;
4
4
  const Text_1 = require("./Text");
5
5
  const Try_1 = require("./Try");
6
+ const Constructor_1 = require("./Constructor");
6
7
  class DotEnvContext {
7
8
  constructor() {
8
9
  this.domain = process.env.DOMAIN ?? 'easy';
@@ -56,8 +57,15 @@ class BaseContext {
56
57
  }
57
58
  exports.BaseContext = BaseContext;
58
59
  class Context {
59
- constructor(state = { env: new DotEnvContext(), request: new BaseContext(), other: {} }) {
60
+ constructor(state = {}) {
60
61
  this.state = state;
62
+ this.state = {
63
+ ...({
64
+ env: new DotEnvContext(),
65
+ request: new BaseContext(),
66
+ other: {},
67
+ }), ...this.state,
68
+ };
61
69
  }
62
70
  get env() {
63
71
  return this.state.env;
@@ -76,5 +84,10 @@ class Context {
76
84
  }
77
85
  }
78
86
  exports.Context = Context;
87
+ Context.use = ({ env, request, other, }) => new Context({
88
+ env: env && (0, Constructor_1.ofConstruct)(env),
89
+ request: request && (0, Constructor_1.ofConstruct)(request),
90
+ other,
91
+ });
79
92
  exports.ctx = new Context();
80
93
  //# sourceMappingURL=Context.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"Context.js","sourceRoot":"","sources":["../../src/types/Context.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Context.js","sourceRoot":"","sources":["../../src/types/Context.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@thisisagile/easy",
3
- "version": "8.5.6",
3
+ "version": "8.5.10",
4
4
  "description": "Straightforward library for building domain-driven microservice architectures",
5
5
  "author": "Sander Hoogendoorn",
6
6
  "license": "MIT",
@@ -31,7 +31,7 @@
31
31
  "access": "public"
32
32
  },
33
33
  "devDependencies": {
34
- "@thisisagile/easy-test": "8.5.6",
34
+ "@thisisagile/easy-test": "8.5.10",
35
35
  "@types/form-urlencoded": "^4.4.0",
36
36
  "@types/jsonwebtoken": "^8.5.6",
37
37
  "@types/validator": "^13.7.0"
@@ -1,30 +1,32 @@
1
1
  import { meta } from '../types';
2
2
  import { Scope, UseCase } from '../process';
3
3
 
4
- export const requires = {
5
- labCoat:
4
+ export class Requires {
5
+ readonly labCoat =
6
6
  (): PropertyDecorator =>
7
7
  (subject: unknown, property: string | symbol): void => {
8
8
  meta(subject).property(property).set('labCoat', true);
9
- },
9
+ };
10
10
 
11
- token:
11
+ readonly token =
12
12
  (): PropertyDecorator =>
13
13
  (subject: unknown, property: string | symbol): void => {
14
14
  meta(subject).property(property).set('token', true);
15
- },
15
+ };
16
16
 
17
- scope:
17
+ readonly scope =
18
18
  (scope: Scope): PropertyDecorator =>
19
19
  (subject: unknown, property: string | symbol): void => {
20
20
  meta(subject).property(property).set('token', true);
21
21
  meta(subject).property(property).set('scope', scope);
22
- },
22
+ };
23
23
 
24
- useCase:
24
+ readonly useCase =
25
25
  (uc: UseCase): PropertyDecorator =>
26
26
  (subject: unknown, property: string | symbol): void => {
27
27
  meta(subject).property(property).set('token', true);
28
28
  meta(subject).property(property).set('uc', uc);
29
- },
30
- };
29
+ };
30
+ }
31
+
32
+ export const requires = new Requires();
@@ -2,6 +2,7 @@ import { Uuid } from './Uuid';
2
2
  import { text } from './Text';
3
3
  import { Identity } from './Identity';
4
4
  import { tryTo } from './Try';
5
+ import { Construct, ofConstruct } from './Constructor';
5
6
 
6
7
  export type EnvContext = {
7
8
  readonly domain: string;
@@ -22,7 +23,7 @@ export class DotEnvContext implements EnvContext {
22
23
  tryTo(() =>
23
24
  text(key)
24
25
  .map(k => k.replace(/([a-z])([A-Z])/g, '$1 $2'))
25
- .snake.toString()
26
+ .snake.toString(),
26
27
  ).map(k => process.env[k] ?? alt).value;
27
28
  }
28
29
 
@@ -87,28 +88,52 @@ export class BaseContext implements RequestContext {
87
88
  public readonly create = (f: () => void): void => f();
88
89
  }
89
90
 
90
- export class Context {
91
- constructor(protected state: any = { env: new DotEnvContext(), request: new BaseContext(), other: {} }) {}
91
+ export type Contexts<E extends EnvContext, R extends RequestContext> = {
92
+ env?: E;
93
+ request?: R;
94
+ other?: any;
95
+ }
96
+
97
+ export class Context<E extends EnvContext, R extends RequestContext> {
98
+ constructor(protected state: Contexts<E, R> = {}) {
99
+ this.state = {
100
+ ...({
101
+ env: new DotEnvContext() as E,
102
+ request: new BaseContext() as RequestContext as R,
103
+ other: {},
104
+ }), ...this.state,
105
+ };
106
+ }
92
107
 
93
- get env(): EnvContext {
94
- return this.state.env;
108
+ get env(): E {
109
+ return this.state.env as E;
95
110
  }
96
111
 
97
- set env(env: EnvContext) {
112
+ set env(env: E) {
98
113
  this.state.env = env;
99
114
  }
100
115
 
101
- get request(): RequestContext {
102
- return this.state.request;
116
+ get request(): R {
117
+ return this.state.request as R;
103
118
  }
104
119
 
105
- set request(request: RequestContext) {
120
+ set request(request: R) {
106
121
  this.state.request = request;
107
122
  }
108
123
 
109
124
  get other(): any {
110
125
  return this.state.other;
111
126
  }
127
+
128
+ static use = <E extends EnvContext, R extends RequestContext>({
129
+ env,
130
+ request,
131
+ other,
132
+ }: { env?: Construct<E>, request?: Construct<R>, other?: any }): Context<E, R> => new Context<E, R>({
133
+ env: env && ofConstruct(env),
134
+ request: request && ofConstruct(request),
135
+ other,
136
+ });
112
137
  }
113
138
 
114
139
  export const ctx = new Context();