@syncbridge/common 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.
Files changed (87) hide show
  1. package/LICENSE +15 -0
  2. package/README.md +1 -0
  3. package/classes/base-element.d.ts +46 -0
  4. package/classes/base-element.js +80 -0
  5. package/classes/component-base.d.ts +26 -0
  6. package/classes/component-base.js +12 -0
  7. package/classes/frame-stream.d.ts +34 -0
  8. package/classes/frame-stream.js +140 -0
  9. package/classes/processor-base.d.ts +15 -0
  10. package/classes/processor-base.js +8 -0
  11. package/classes/runnable.d.ts +86 -0
  12. package/classes/runnable.js +228 -0
  13. package/classes/sb-error.d.ts +11 -0
  14. package/classes/sb-error.js +54 -0
  15. package/classes/stack-executor.d.ts +10 -0
  16. package/classes/stack-executor.js +37 -0
  17. package/constants.d.ts +6 -0
  18. package/constants.js +17 -0
  19. package/decorators/component.decorator.d.ts +15 -0
  20. package/decorators/component.decorator.js +28 -0
  21. package/decorators/decorator-helpers.d.ts +2 -0
  22. package/decorators/decorator-helpers.js +13 -0
  23. package/decorators/define-variable.decorator.d.ts +14 -0
  24. package/decorators/define-variable.decorator.js +57 -0
  25. package/decorators/finalize-element-metadata.d.ts +4 -0
  26. package/decorators/finalize-element-metadata.js +30 -0
  27. package/decorators/processor-events.decorator.d.ts +5 -0
  28. package/decorators/processor-events.decorator.js +21 -0
  29. package/decorators/processor.decorator.d.ts +31 -0
  30. package/decorators/processor.decorator.js +42 -0
  31. package/decorators/use-component.decorator.d.ts +9 -0
  32. package/decorators/use-component.decorator.js +24 -0
  33. package/decorators/use-variables.decorator.d.ts +5 -0
  34. package/decorators/use-variables.decorator.js +20 -0
  35. package/index.d.ts +20 -0
  36. package/index.js +20 -0
  37. package/interfaces/extension-package.interface.d.ts +6 -0
  38. package/interfaces/extension-package.interface.js +1 -0
  39. package/interfaces/index.d.ts +2 -0
  40. package/interfaces/index.js +2 -0
  41. package/interfaces/logger.interface.d.ts +17 -0
  42. package/interfaces/logger.interface.js +1 -0
  43. package/models/enums/log-level.d.ts +9 -0
  44. package/models/enums/log-level.js +15 -0
  45. package/models/enums/service-status.d.ts +8 -0
  46. package/models/enums/service-status.js +14 -0
  47. package/models/enums/variable-format.enum.d.ts +9 -0
  48. package/models/enums/variable-format.enum.js +15 -0
  49. package/models/enums/variable-type.enum.d.ts +8 -0
  50. package/models/enums/variable-type.enum.js +14 -0
  51. package/models/index.d.ts +13 -0
  52. package/models/index.js +13 -0
  53. package/models/metadata/author-metadata.d.ts +8 -0
  54. package/models/metadata/author-metadata.js +48 -0
  55. package/models/metadata/component-metadata.d.ts +8 -0
  56. package/models/metadata/component-metadata.js +25 -0
  57. package/models/metadata/element-component-metadata.d.ts +19 -0
  58. package/models/metadata/element-component-metadata.js +70 -0
  59. package/models/metadata/element-metadata.d.ts +18 -0
  60. package/models/metadata/element-metadata.js +81 -0
  61. package/models/metadata/package-metadata.d.ts +7 -0
  62. package/models/metadata/package-metadata.js +27 -0
  63. package/models/metadata/processor-metadata.d.ts +5 -0
  64. package/models/metadata/processor-metadata.js +14 -0
  65. package/models/metadata/variable-metadata.d.ts +31 -0
  66. package/models/metadata/variable-metadata.js +138 -0
  67. package/models/profile/log-options.d.ts +16 -0
  68. package/models/profile/log-options.js +56 -0
  69. package/models/profile/profile-component.d.ts +23 -0
  70. package/models/profile/profile-component.js +77 -0
  71. package/models/profile/profile.d.ts +25 -0
  72. package/models/profile/profile.js +115 -0
  73. package/models-document.d.ts +3 -0
  74. package/models-document.js +15 -0
  75. package/package.json +33 -0
  76. package/processor-factory.d.ts +13 -0
  77. package/processor-factory.js +106 -0
  78. package/registry.d.ts +32 -0
  79. package/registry.js +205 -0
  80. package/utils/encrypt-helpers.d.ts +2 -0
  81. package/utils/encrypt-helpers.js +43 -0
  82. package/utils/make-extension-package.d.ts +3 -0
  83. package/utils/make-extension-package.js +13 -0
  84. package/utils/metadata-utils.d.ts +7 -0
  85. package/utils/metadata-utils.js +99 -0
  86. package/utils/profile-utils.d.ts +21 -0
  87. package/utils/profile-utils.js +222 -0
@@ -0,0 +1,228 @@
1
+ import { clearTimeout } from 'node:timers';
2
+ import { AsyncEventEmitter } from 'node-events-async';
3
+ import { NODE_ENV, noOp } from '../constants.js';
4
+ import { ServiceStatus } from '../models/index.js';
5
+ import { SbError } from './sb-error.js';
6
+ /**
7
+ *
8
+ */
9
+ export class Runnable extends AsyncEventEmitter {
10
+ _context;
11
+ constructor(init) {
12
+ super();
13
+ this.setMaxListeners(1000);
14
+ this._context = {
15
+ initialized: false,
16
+ status: ServiceStatus.stopped,
17
+ statusMessage: 'Stopped',
18
+ startMaxWaitMs: init?.startMaxWaitMs ?? (NODE_ENV === 'dev' ? 60000 * 5 : 30000),
19
+ stopMaxWaitMs: init?.stopMaxWaitMs ?? (NODE_ENV === 'dev' ? 60000 * 5 : 30000),
20
+ };
21
+ }
22
+ get status() {
23
+ return this._context.status;
24
+ }
25
+ get statusMessage() {
26
+ return this._context.statusMessage;
27
+ }
28
+ get startTime() {
29
+ return this._context.startTime;
30
+ }
31
+ /**
32
+ *
33
+ */
34
+ get stopped() {
35
+ return (this.status === ServiceStatus.stopped ||
36
+ this.status === ServiceStatus.invalid);
37
+ }
38
+ startNoWait() {
39
+ this.start().catch(noOp);
40
+ }
41
+ stopNoWait() {
42
+ this.stop().catch(noOp);
43
+ }
44
+ /**
45
+ *
46
+ */
47
+ async init() {
48
+ if (this._context.initialized)
49
+ return;
50
+ this._context.initialized = true;
51
+ await this._init().catch(e => {
52
+ const err = e instanceof SbError ? e : new SbError(e);
53
+ err.code = 'INIT_FAILED';
54
+ err.message = `Initialization failed doe to: ${err.message}`;
55
+ this.setStatus(ServiceStatus.invalid, err.message);
56
+ this.onError(err);
57
+ throw err;
58
+ });
59
+ this.onInitialize();
60
+ }
61
+ /**
62
+ *
63
+ */
64
+ async start(abortSignal) {
65
+ if (this._context.waitTimer)
66
+ await this._context.waitTimer;
67
+ if (this.status === ServiceStatus.started)
68
+ return;
69
+ this.setStatus(ServiceStatus.starting);
70
+ this._context.waitTimer = Promise.resolve()
71
+ .then(async () => {
72
+ await this.init();
73
+ try {
74
+ let promiseSettled = false;
75
+ await new Promise((resolve, reject) => {
76
+ let startWaitTimer;
77
+ const abortController = new AbortController();
78
+ abortSignal?.addEventListener('abort', () => abortController.abort());
79
+ if (this._context.startMaxWaitMs) {
80
+ startWaitTimer = setTimeout(() => {
81
+ const err = new SbError('Start timeout', {
82
+ code: 'START_TIMEOUT',
83
+ });
84
+ abortController.abort(err);
85
+ reject(err);
86
+ }, this._context.startMaxWaitMs).unref();
87
+ }
88
+ const onStopping = () => {
89
+ clearTimeout(startWaitTimer);
90
+ abortController.abort();
91
+ reject();
92
+ };
93
+ this.once('stopping', onStopping);
94
+ Promise.resolve()
95
+ .then(async () => {
96
+ await this._start(abortController.signal);
97
+ if (promiseSettled)
98
+ return;
99
+ if (this._context.status === ServiceStatus.starting)
100
+ this.setStatus(ServiceStatus.started);
101
+ resolve();
102
+ })
103
+ .catch(e => {
104
+ reject(e);
105
+ })
106
+ .finally(() => {
107
+ this.removeListener('stopping', onStopping);
108
+ clearTimeout(startWaitTimer);
109
+ });
110
+ }).finally(() => (promiseSettled = true));
111
+ }
112
+ catch (e) {
113
+ const err = e instanceof SbError ? e : new SbError(e);
114
+ err.code = err.code || 'START_FAILED';
115
+ this.onError(err);
116
+ throw err;
117
+ }
118
+ })
119
+ .catch(async (e) => {
120
+ const err = e instanceof SbError ? e : new SbError(e);
121
+ this._context.waitTimer = undefined;
122
+ await this.stop().then(() => {
123
+ throw err;
124
+ });
125
+ })
126
+ .finally(() => {
127
+ this._context.waitTimer = undefined;
128
+ });
129
+ await this._context.waitTimer;
130
+ }
131
+ /**
132
+ *
133
+ */
134
+ async stop() {
135
+ if (this._context.waitTimer)
136
+ await this._context.waitTimer;
137
+ if (this.status === ServiceStatus.stopped)
138
+ return;
139
+ this.setStatus(ServiceStatus.stopping);
140
+ this.emit('stopping');
141
+ this._context.waitTimer = Promise.resolve()
142
+ .then(async () => {
143
+ try {
144
+ let promiseSettled = false;
145
+ await new Promise((resolve, reject) => {
146
+ let stopWaitTimer;
147
+ if (this._context.stopMaxWaitMs) {
148
+ stopWaitTimer = setTimeout(() => {
149
+ const err = new SbError('Stop timeout', {
150
+ code: 'STOP_TIMEOUT',
151
+ });
152
+ reject(err);
153
+ }, this._context.stopMaxWaitMs).unref();
154
+ }
155
+ Promise.resolve()
156
+ .then(async () => {
157
+ await this._stop();
158
+ if (promiseSettled)
159
+ return;
160
+ if (this._context.status === ServiceStatus.stopping)
161
+ this.setStatus(ServiceStatus.stopped);
162
+ resolve();
163
+ })
164
+ .catch(e => reject(e))
165
+ .finally(() => {
166
+ clearTimeout(stopWaitTimer);
167
+ });
168
+ }).finally(() => (promiseSettled = true));
169
+ }
170
+ catch (e) {
171
+ const err = e instanceof SbError ? e : new SbError(e);
172
+ err.code = err.code || 'STOP_FAILED';
173
+ this.onError(err);
174
+ this._context.waitTimer = undefined;
175
+ await this._terminate().then(() => {
176
+ this.setStatus(ServiceStatus.stopped, err.message);
177
+ throw e;
178
+ });
179
+ }
180
+ })
181
+ .finally(() => {
182
+ this._context.waitTimer = undefined;
183
+ });
184
+ await this._context.waitTimer;
185
+ }
186
+ /**
187
+ *
188
+ */
189
+ _init() {
190
+ return Promise.resolve();
191
+ }
192
+ /**
193
+ *
194
+ */
195
+ _terminate() {
196
+ return Promise.resolve();
197
+ }
198
+ /**
199
+ *
200
+ */
201
+ onError(err) {
202
+ this.emitSafe('error', err);
203
+ }
204
+ /**
205
+ *
206
+ */
207
+ onInitialize() {
208
+ this.emitSafe('initialize');
209
+ }
210
+ /**
211
+ *
212
+ */
213
+ onStatusChange() {
214
+ this.emitSafe('status-change', this.status, this.statusMessage);
215
+ }
216
+ /**
217
+ *
218
+ */
219
+ setStatus(status, statusMessage) {
220
+ if (this._context.status !== status) {
221
+ this._context.status = status;
222
+ this._context.statusMessage = statusMessage || '';
223
+ if (status === ServiceStatus.started)
224
+ this._context.startTime = new Date();
225
+ this.onStatusChange();
226
+ }
227
+ }
228
+ }
@@ -0,0 +1,11 @@
1
+ export declare class SbError extends Error {
2
+ readonly cause?: Error;
3
+ code?: string;
4
+ [index: string]: any;
5
+ constructor(message?: string | Error, options?: SbErrorOptions);
6
+ toJSON(): any;
7
+ }
8
+ export interface SbErrorOptions {
9
+ cause?: Error;
10
+ [key: string]: any;
11
+ }
@@ -0,0 +1,54 @@
1
+ import { isPlainObject } from '@jsopen/objects';
2
+ export class SbError extends Error {
3
+ code;
4
+ constructor(message, options) {
5
+ super(typeof message === 'object' ? message.message || '' : message);
6
+ if (message && typeof message === 'object') {
7
+ if (message instanceof Error) {
8
+ this.stack = message.stack;
9
+ Object.defineProperty(this, 'cause', {
10
+ value: message,
11
+ enumerable: false,
12
+ configurable: true,
13
+ writable: true,
14
+ });
15
+ }
16
+ for (const k of Object.keys(message)) {
17
+ if (message[k] !== undefined) {
18
+ Object.defineProperty(this, k, {
19
+ value: message[k],
20
+ writable: true,
21
+ configurable: true,
22
+ enumerable: !message[k] ||
23
+ typeof message[k] !== 'object' ||
24
+ isPlainObject(message[k]),
25
+ });
26
+ }
27
+ }
28
+ }
29
+ if (options) {
30
+ for (const k of Object.keys(options)) {
31
+ if (options[k] !== undefined) {
32
+ Object.defineProperty(this, k, {
33
+ value: options[k],
34
+ writable: true,
35
+ configurable: true,
36
+ enumerable: !options[k] ||
37
+ typeof options[k] !== 'object' ||
38
+ isPlainObject(options[k]),
39
+ });
40
+ }
41
+ }
42
+ }
43
+ }
44
+ toJSON() {
45
+ const out = {
46
+ message: this.message,
47
+ };
48
+ for (const k of Object.keys(this)) {
49
+ if (k !== 'stack')
50
+ out[k] = this[k];
51
+ }
52
+ return out;
53
+ }
54
+ }
@@ -0,0 +1,10 @@
1
+ import { ErrorIssue } from '@opra/common';
2
+ export declare class StackExecutor {
3
+ stack: string[];
4
+ issues: StackExecutor.Issue[];
5
+ execute(stack: string, fn: () => any): void;
6
+ handleError(e: any): void;
7
+ }
8
+ export declare namespace StackExecutor {
9
+ type Issue = ErrorIssue;
10
+ }
@@ -0,0 +1,37 @@
1
+ import { ValidationError } from 'valgen';
2
+ export class StackExecutor {
3
+ stack = [];
4
+ issues = [];
5
+ execute(stack, fn) {
6
+ this.stack.push(stack);
7
+ try {
8
+ fn();
9
+ }
10
+ catch (e) {
11
+ this.handleError(e);
12
+ }
13
+ finally {
14
+ this.stack.pop();
15
+ }
16
+ }
17
+ handleError(e) {
18
+ const location = this.stack.join('/');
19
+ if (e instanceof ValidationError) {
20
+ e.issues.forEach(x => {
21
+ this.issues.push({
22
+ ...x,
23
+ severity: 'error',
24
+ location: location + (x.location ? '/' + x.location : ''),
25
+ });
26
+ });
27
+ }
28
+ else {
29
+ this.issues.push({
30
+ message: e.message,
31
+ ...e,
32
+ severity: 'error',
33
+ location,
34
+ });
35
+ }
36
+ }
37
+ }
package/constants.d.ts ADDED
@@ -0,0 +1,6 @@
1
+ export declare const OWN_ELEMENT_METADATA: unique symbol;
2
+ export declare const COMPONENT_OPTIONS: unique symbol;
3
+ export declare const PROCESSOR_OPTIONS: unique symbol;
4
+ export declare const VARIABLE_CONTAINER: unique symbol;
5
+ export declare const noOp: () => undefined;
6
+ export declare const NODE_ENV: string;
package/constants.js ADDED
@@ -0,0 +1,17 @@
1
+ export const OWN_ELEMENT_METADATA = Symbol.for('OWN_ELEMENT_METADATA');
2
+ export const COMPONENT_OPTIONS = Symbol.for('COMPONENT_OPTIONS');
3
+ export const PROCESSOR_OPTIONS = Symbol.for('PROCESSOR_OPTIONS');
4
+ // export const USE_COMPONENT_OPTIONS_STORE = Symbol.for(
5
+ // 'USE_COMPONENT_OPTIONS_STORE',
6
+ // );
7
+ // export const USE_VARIABLES_OPTIONS_STORE = Symbol.for(
8
+ // 'USE_VARIABLE_OPTIONS_STORE',
9
+ // );
10
+ // export const USE_VARIABLES_PROPERTY = Symbol.for('USE_VARIABLE_PROPERTY');
11
+ export const VARIABLE_CONTAINER = Symbol.for('VARIABLE_CONTAINER');
12
+ export const noOp = () => undefined;
13
+ export const NODE_ENV = process.env.NODE_ENV === 'test'
14
+ ? 'test'
15
+ : (process.env.NODE_ENV || '').startsWith('dev')
16
+ ? 'dev'
17
+ : 'prod';
@@ -0,0 +1,15 @@
1
+ import 'reflect-metadata';
2
+ import { DeepPartial, PartialSome, StrictOmit, Type } from 'ts-gems';
3
+ import { ComponentBase } from '../classes/component-base.js';
4
+ import { ComponentMetadata, ElementComponentMetadata, VariableMetadataRecord } from '../models/index.js';
5
+ import { UseComponent as _UseComponent } from './use-component.decorator.js';
6
+ export declare function Component<T extends ComponentBase>(options: Component.Options): (target: Type<T>) => void;
7
+ export declare namespace Component {
8
+ interface Options extends PartialSome<StrictOmit<ComponentMetadata, 'components' | 'variables'>, 'className' | 'displayName' | 'tags' | 'interfaces' | 'author'> {
9
+ abstract?: boolean;
10
+ components?: Record<string, Partial<ElementComponentMetadata>>;
11
+ variables?: DeepPartial<VariableMetadataRecord>;
12
+ }
13
+ function UseVariables<T extends ComponentBase>(variablesClass?: Type): (target: T, propertyKey: "values") => void;
14
+ function UseComponent<T extends ComponentBase>(options: _UseComponent.Options): (target: T, propertyKey: string | symbol) => void;
15
+ }
@@ -0,0 +1,28 @@
1
+ import 'reflect-metadata';
2
+ import { COMPONENT_OPTIONS } from '../constants.js';
3
+ import { finalizeElementMetadata } from './finalize-element-metadata.js';
4
+ import { UseComponent as _UseComponent } from './use-component.decorator.js';
5
+ import { UseVariables as _UseVariables } from './use-variables.decorator.js';
6
+ const NAME_PATTERN = /^(.*?)(Component)?$/;
7
+ export function Component(options) {
8
+ return function (target) {
9
+ finalizeElementMetadata(target, options, COMPONENT_OPTIONS, NAME_PATTERN);
10
+ const metadata = Reflect.getMetadata(COMPONENT_OPTIONS, target);
11
+ metadata.interfaces = [
12
+ ...(metadata.interfaces || []),
13
+ ...(options.interfaces || [metadata.className]),
14
+ ];
15
+ target.className = metadata.className;
16
+ target.interfaces = [...metadata.interfaces];
17
+ };
18
+ }
19
+ (function (Component) {
20
+ function UseVariables(variablesClass) {
21
+ return _UseVariables(variablesClass);
22
+ }
23
+ Component.UseVariables = UseVariables;
24
+ function UseComponent(options) {
25
+ return _UseComponent(options);
26
+ }
27
+ Component.UseComponent = UseComponent;
28
+ })(Component || (Component = {}));
@@ -0,0 +1,2 @@
1
+ import 'reflect-metadata';
2
+ export declare function defineMergeMetadata(target: any, metadataKey: any, metadata: any): any;
@@ -0,0 +1,13 @@
1
+ import 'reflect-metadata';
2
+ import { merge } from '@jsopen/objects';
3
+ export function defineMergeMetadata(target, metadataKey, metadata) {
4
+ const oldMetadata = Reflect.getMetadata(metadataKey, target);
5
+ const finalMetadata = merge({}, [oldMetadata || {}, metadata], {
6
+ deep: 'full',
7
+ mergeArrays: true,
8
+ ignoreNulls: false,
9
+ ignoreUndefined: false,
10
+ });
11
+ Reflect.defineMetadata(metadataKey, finalMetadata, target);
12
+ return finalMetadata;
13
+ }
@@ -0,0 +1,14 @@
1
+ import 'reflect-metadata';
2
+ import { DeepPartial, StrictOmit, Type } from 'ts-gems';
3
+ import { VariableMetadata, VariableMetadataRecord } from '../models/index.js';
4
+ export declare function DefineVariable(options: DefineVariable.Options): (target: Object, propertyKey: string | symbol) => void;
5
+ type TEnumValue = (string | number)[] | Record<string, string | number>;
6
+ type TVariable = DeepPartial<VariableMetadataRecord> | Type;
7
+ export declare namespace DefineVariable {
8
+ interface Options extends Partial<StrictOmit<VariableMetadata, 'variables' | 'enumValues' | 'choice'>> {
9
+ variables?: TVariable | Promise<TVariable>;
10
+ enumValues?: TEnumValue | Promise<TEnumValue>;
11
+ choice?: string[] | Promise<string[]>;
12
+ }
13
+ }
14
+ export {};
@@ -0,0 +1,57 @@
1
+ import 'reflect-metadata';
2
+ import { deepClone, merge, omitUndefined } from '@jsopen/objects';
3
+ import { VARIABLE_CONTAINER } from '../constants.js';
4
+ import { VariableType, } from '../models/index.js';
5
+ export function DefineVariable(options) {
6
+ return function (target, propertyKey) {
7
+ /** c8 ignore next */
8
+ if (typeof propertyKey !== 'string')
9
+ throw new TypeError('Property key must be a string');
10
+ const designType = Reflect.getMetadata('design:type', target, propertyKey);
11
+ if (designType === Array)
12
+ options.isArray = true;
13
+ if (typeof options.variables === 'function') {
14
+ options.type = VariableType.Nested;
15
+ options.variables = Reflect.getMetadata(VARIABLE_CONTAINER, options.variables.prototype);
16
+ }
17
+ if (options.enumValues && !options.type) {
18
+ options.type = VariableType.Enum;
19
+ }
20
+ if (options.type !== VariableType.Enum)
21
+ delete options.enumValues;
22
+ if (!options.type) {
23
+ if (designType === String)
24
+ options.type = VariableType.String;
25
+ else if (designType === Boolean)
26
+ options.type = VariableType.Boolean;
27
+ else if (designType === Number)
28
+ options.type = VariableType.Number;
29
+ else if (typeof designType === 'function' &&
30
+ Reflect.hasMetadata(VARIABLE_CONTAINER, designType.prototype)) {
31
+ options.type = VariableType.Nested;
32
+ options.variables = Reflect.getMetadata(VARIABLE_CONTAINER, designType.prototype);
33
+ }
34
+ }
35
+ if (options.isArray && !options.type)
36
+ throw new TypeError('Array variables must have type defined. ' +
37
+ (target.constructor.name +
38
+ '.' +
39
+ propertyKey +
40
+ ' is an array variable'));
41
+ const base = Object.getPrototypeOf(target);
42
+ const baseMetadata = Reflect.hasMetadata(VARIABLE_CONTAINER, base)
43
+ ? deepClone(Reflect.getMetadata(VARIABLE_CONTAINER, base))
44
+ : {};
45
+ let metadata = merge(baseMetadata, options, {
46
+ deep: 'full',
47
+ ignoreNulls: false,
48
+ ignoreUndefined: false,
49
+ });
50
+ metadata = omitUndefined(metadata, 'full');
51
+ const metadataRecord = Reflect.hasOwnMetadata(VARIABLE_CONTAINER, target)
52
+ ? Reflect.getMetadata(VARIABLE_CONTAINER, target)
53
+ : {};
54
+ metadataRecord[propertyKey] = metadata;
55
+ Reflect.defineMetadata(VARIABLE_CONTAINER, metadataRecord, target);
56
+ };
57
+ }
@@ -0,0 +1,4 @@
1
+ import 'reflect-metadata';
2
+ import { DeepPartial, Type } from 'ts-gems';
3
+ import { ElementMetadata } from '../models/index.js';
4
+ export declare function finalizeElementMetadata(target: Type, options: DeepPartial<ElementMetadata>, metadataKey: any, namePattern?: RegExp): void;
@@ -0,0 +1,30 @@
1
+ import 'reflect-metadata';
2
+ import { merge } from '@jsopen/objects';
3
+ import { OWN_ELEMENT_METADATA } from '../constants.js';
4
+ export function finalizeElementMetadata(target, options, metadataKey, namePattern) {
5
+ /** Determine class name */
6
+ let className = options.className;
7
+ if (!className && namePattern) {
8
+ const m = namePattern.exec(target.name);
9
+ if (!m)
10
+ throw new TypeError('Class name must be PascalCase and should contains only letters and numbers. Example: MyProcessor ');
11
+ if (m)
12
+ className = m[1];
13
+ }
14
+ if (!className)
15
+ throw new TypeError('Class name is required');
16
+ const base = Object.getPrototypeOf(target);
17
+ const baseMetadata = Reflect.getMetadata(metadataKey, base) || {};
18
+ const ownMetadata = Reflect.getMetadata(OWN_ELEMENT_METADATA, target);
19
+ const finalMetadata = merge({}, [baseMetadata, options, ownMetadata], {
20
+ deep: 'full',
21
+ mergeArrays: 'unique',
22
+ ignoreNulls: false,
23
+ ignoreUndefined: false,
24
+ });
25
+ finalMetadata.abstract = !!options.abstract;
26
+ finalMetadata.className = className;
27
+ finalMetadata.displayName = finalMetadata.displayName || className;
28
+ Reflect.defineMetadata(metadataKey, finalMetadata, target);
29
+ target.className = finalMetadata.className;
30
+ }
@@ -0,0 +1,5 @@
1
+ import 'reflect-metadata';
2
+ import { Type } from 'ts-gems';
3
+ import type { ProcessorBase } from '../classes/processor-base.js';
4
+ export declare function OnCreateProfile<T extends Type<ProcessorBase>>(): (target: T, propertyKey: string | symbol) => void;
5
+ export declare function OnUpdateProfile<T extends Type<ProcessorBase>>(): (target: T, propertyKey: string | symbol) => void;
@@ -0,0 +1,21 @@
1
+ import 'reflect-metadata';
2
+ import { OWN_ELEMENT_METADATA } from '../constants.js';
3
+ import { defineMergeMetadata } from './decorator-helpers.js';
4
+ export function OnCreateProfile() {
5
+ return function (target, propertyKey) {
6
+ defineMergeMetadata(target, OWN_ELEMENT_METADATA, {
7
+ staticEvents: {
8
+ onCreateProfile: propertyKey,
9
+ },
10
+ });
11
+ };
12
+ }
13
+ export function OnUpdateProfile() {
14
+ return function (target, propertyKey) {
15
+ defineMergeMetadata(target, OWN_ELEMENT_METADATA, {
16
+ staticEvents: {
17
+ onUpdateProfile: propertyKey,
18
+ },
19
+ });
20
+ };
21
+ }
@@ -0,0 +1,31 @@
1
+ import 'reflect-metadata';
2
+ import { DeepPartial, PartialSome, StrictOmit, Type } from 'ts-gems';
3
+ import type { ProcessorBase } from '../classes/processor-base.js';
4
+ import { ElementComponentMetadata, ProcessorMetadata, VariableMetadataRecord } from '../models/index.js';
5
+ import { UseComponent as _UseComponent } from './use-component.decorator.js';
6
+ export declare function Processor<T extends ProcessorBase>(options: Processor.Options): (target: Type<T>) => void;
7
+ export declare namespace Processor {
8
+ /**
9
+ *
10
+ */
11
+ function UseVariables<T extends ProcessorBase>(variablesClass?: Type): (target: T, propertyKey: "values") => void;
12
+ /**
13
+ *
14
+ */
15
+ function UseComponent<T extends ProcessorBase>(options: _UseComponent.Options): (target: T, propertyKey: string | symbol) => void;
16
+ /**
17
+ *
18
+ */
19
+ function OnCreateProfile<T extends ProcessorBase>(): (target: Type<T>, propertyKey: string | symbol) => void;
20
+ /**
21
+ *
22
+ */
23
+ function OnUpdateProfile<T extends ProcessorBase>(): (target: Type<T>, propertyKey: string | symbol) => void;
24
+ }
25
+ export declare namespace Processor {
26
+ interface Options extends PartialSome<StrictOmit<ProcessorMetadata, 'components' | 'variables'>, 'className' | 'displayName' | 'tags' | 'author'> {
27
+ abstract?: boolean;
28
+ components?: Record<string, Partial<ElementComponentMetadata>>;
29
+ variables?: DeepPartial<VariableMetadataRecord>;
30
+ }
31
+ }
@@ -0,0 +1,42 @@
1
+ import 'reflect-metadata';
2
+ import { PROCESSOR_OPTIONS } from '../constants.js';
3
+ import { finalizeElementMetadata } from './finalize-element-metadata.js';
4
+ import { OnCreateProfile as _OnCreateProfile, OnUpdateProfile as _OnUpdateProfile, } from './processor-events.decorator.js';
5
+ import { UseComponent as _UseComponent } from './use-component.decorator.js';
6
+ import { UseVariables as _UseVariables } from './use-variables.decorator.js';
7
+ const NAME_PATTERN = /^(.*?)(Processor)?$/;
8
+ export function Processor(options) {
9
+ return function (target) {
10
+ finalizeElementMetadata(target, options, PROCESSOR_OPTIONS, NAME_PATTERN);
11
+ };
12
+ }
13
+ (function (Processor) {
14
+ /**
15
+ *
16
+ */
17
+ function UseVariables(variablesClass) {
18
+ return _UseVariables(variablesClass);
19
+ }
20
+ Processor.UseVariables = UseVariables;
21
+ /**
22
+ *
23
+ */
24
+ function UseComponent(options) {
25
+ return _UseComponent(options);
26
+ }
27
+ Processor.UseComponent = UseComponent;
28
+ /**
29
+ *
30
+ */
31
+ function OnCreateProfile() {
32
+ return _OnCreateProfile();
33
+ }
34
+ Processor.OnCreateProfile = OnCreateProfile;
35
+ /**
36
+ *
37
+ */
38
+ function OnUpdateProfile() {
39
+ return _OnUpdateProfile();
40
+ }
41
+ Processor.OnUpdateProfile = OnUpdateProfile;
42
+ })(Processor || (Processor = {}));
@@ -0,0 +1,9 @@
1
+ import 'reflect-metadata';
2
+ import { ComponentBase } from '../classes/component-base.js';
3
+ import { ProcessorBase } from '../classes/processor-base.js';
4
+ import { ElementComponentMetadata } from '../models/index.js';
5
+ export declare function UseComponent<T extends ProcessorBase | ComponentBase>(options: UseComponent.Options): (target: T, propertyKey: string | symbol) => void;
6
+ export declare namespace UseComponent {
7
+ interface Options extends Partial<ElementComponentMetadata> {
8
+ }
9
+ }