@rhtml/custom-attributes 0.0.112 → 0.0.113

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
@@ -396,3 +396,34 @@ export class Color extends MediaQueryAttribute<Styles> {
396
396
  | gt-sm | screen and (min-width: 960px) |
397
397
  | gt-md | screen and (min-width: 1280px) |
398
398
  | gt-lg | screen and (min-width: 1920px) |
399
+
400
+ #### Defining custom MutationObserver which is attached on the element used by the Attribute
401
+
402
+ ```typescript
403
+ import { Attribute, Modifier } from '@rhtml/custom-attributes';
404
+
405
+ @Modifier({
406
+ selector: 'color',
407
+ observe: {
408
+ childList: true,
409
+ subtree: true,
410
+ attributes: true,
411
+ attributeFilter: ['my-attribute']
412
+ }
413
+ })
414
+ export class Color extends Attribute {
415
+ OnChange(records: MutationRecord[]) {
416
+ console.log(records);
417
+ const attributeValue = this.element.getAttribute('my-attribute');
418
+ console.log(attributeValue); // 'test'
419
+ }
420
+ }
421
+ ```
422
+
423
+ ```html
424
+ <div color="red" my-attribute="test">
425
+ My element
426
+ </div>
427
+ ```
428
+
429
+ If we change `my-attribute` value we will trigger `OnChange` which will give us mutation records
@@ -0,0 +1,15 @@
1
+ import { ModifierOptions } from './types';
2
+ export declare abstract class Attribute<T = {}> {
3
+ static options: ModifierOptions;
4
+ element?: HTMLElement;
5
+ value?: string;
6
+ selector?: string;
7
+ parent?: HTMLElement;
8
+ observer?: MutationObserver;
9
+ setStyles(keys: T): (div: HTMLElement | Element | HTMLDivElement) => void;
10
+ OnInit(): void;
11
+ OnDestroy(): void;
12
+ OnUpdate(_oldValue: string, _newValue: string): void;
13
+ OnUpdateAttribute(_name: string, _value: string): void;
14
+ OnChange(_records: MutationRecord[]): void;
15
+ }
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Attribute = void 0;
4
+ /* */
5
+ class Attribute {
6
+ setStyles(keys) {
7
+ return (div) => {
8
+ for (const [key, value] of Object.entries(keys)) {
9
+ div['style'][key] = value;
10
+ }
11
+ };
12
+ }
13
+ OnInit() {
14
+ /* */
15
+ }
16
+ OnDestroy() {
17
+ /* */
18
+ }
19
+ OnUpdate(_oldValue, _newValue) {
20
+ /* */
21
+ }
22
+ OnUpdateAttribute(_name, _value) {
23
+ /* */
24
+ }
25
+ OnChange(_records) {
26
+ /* */
27
+ }
28
+ }
29
+ exports.Attribute = Attribute;
30
+ //# sourceMappingURL=attribute.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"attribute.js","sourceRoot":"","sources":["../src/attribute.ts"],"names":[],"mappings":";;;AAGA,MAAM;AACN,MAAsB,SAAS;IAO7B,SAAS,CAAC,IAAO;QACf,OAAO,CAAC,GAA2C,EAAE,EAAE;YACrD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;gBAC/C,GAAG,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;aAC3B;QACH,CAAC,CAAC;IACJ,CAAC;IACD,MAAM;QACJ,KAAK;IACP,CAAC;IACD,SAAS;QACP,KAAK;IACP,CAAC;IACD,QAAQ,CAAC,SAAiB,EAAE,SAAiB;QAC3C,KAAK;IACP,CAAC;IACD,iBAAiB,CAAC,KAAa,EAAE,MAAc;QAC7C,KAAK;IACP,CAAC;IAED,QAAQ,CAAC,QAA0B;QACjC,KAAK;IACP,CAAC;CACF;AA9BD,8BA8BC"}
@@ -0,0 +1,18 @@
1
+ import { Attribute } from './attribute';
2
+ import { Constructor } from './types';
3
+ export declare class CustomAttributeRegistry {
4
+ private parent;
5
+ private _attrMap;
6
+ private _elementMap;
7
+ private observer;
8
+ constructor(parent: HTMLElement);
9
+ define(attrName: string, Constructor: Constructor<Attribute>): void;
10
+ get(element: HTMLElement, attrName: string): Attribute<{}>;
11
+ private getConstructor;
12
+ private observe;
13
+ unsubscribe(): void;
14
+ private upgradeAttribute;
15
+ private upgradeElement;
16
+ private downgrade;
17
+ private found;
18
+ }
@@ -0,0 +1,155 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CustomAttributeRegistry = void 0;
4
+ const helpers_1 = require("./helpers");
5
+ class CustomAttributeRegistry {
6
+ constructor(parent) {
7
+ this.parent = parent;
8
+ this._attrMap = new Map();
9
+ this._elementMap = new Map();
10
+ if (!parent) {
11
+ throw new Error('Must be given a parent element');
12
+ }
13
+ this.observe();
14
+ }
15
+ define(attrName, Constructor) {
16
+ this._attrMap.set(attrName.toLowerCase(), Constructor);
17
+ this.upgradeAttribute(attrName);
18
+ }
19
+ get(element, attrName) {
20
+ const map = this._elementMap.get(element);
21
+ if (!map)
22
+ return;
23
+ return map.get(attrName.toLowerCase());
24
+ }
25
+ getConstructor(attrName) {
26
+ return this._attrMap.get(attrName.toLowerCase());
27
+ }
28
+ observe() {
29
+ var _a, _b;
30
+ this.observer = new MutationObserver(mutations => {
31
+ for (const mutation of mutations) {
32
+ if (mutation.type === 'attributes') {
33
+ const attr = this.getConstructor(mutation.attributeName);
34
+ if (attr) {
35
+ this.found(mutation.attributeName, mutation.target, mutation.oldValue);
36
+ }
37
+ }
38
+ else {
39
+ for (const node of mutation.removedNodes) {
40
+ this.downgrade(node);
41
+ }
42
+ for (const node of mutation.addedNodes) {
43
+ this.upgradeElement(node);
44
+ }
45
+ }
46
+ }
47
+ });
48
+ this.observer.observe((_b = (_a = this.parent) === null || _a === void 0 ? void 0 : _a['shadowRoot']) !== null && _b !== void 0 ? _b : this.parent, {
49
+ childList: true,
50
+ subtree: true,
51
+ attributes: true,
52
+ attributeOldValue: true
53
+ });
54
+ }
55
+ unsubscribe() {
56
+ var _a;
57
+ (_a = this.observer) === null || _a === void 0 ? void 0 : _a.disconnect();
58
+ const values = [...this._elementMap.values()];
59
+ for (const elModifiers of values) {
60
+ const modifiers = [...elModifiers.values()];
61
+ for (const modifier of modifiers) {
62
+ modifier.OnDestroy();
63
+ if (modifier.observer) {
64
+ modifier.observer.disconnect();
65
+ }
66
+ }
67
+ elModifiers.clear();
68
+ }
69
+ this._elementMap.clear();
70
+ }
71
+ upgradeAttribute(attrName, doc) {
72
+ const parent = doc || this.parent;
73
+ const matches = parent.querySelectorAll('[' + attrName + ']');
74
+ for (const match of [...matches]) {
75
+ this.found(attrName, match);
76
+ }
77
+ }
78
+ upgradeElement(element) {
79
+ if (element.nodeType !== 1) {
80
+ return;
81
+ }
82
+ for (const attr of element.attributes) {
83
+ if (this.getConstructor(attr.name)) {
84
+ this.found(attr.name, element);
85
+ }
86
+ }
87
+ for (const [attr] of this._attrMap) {
88
+ this.upgradeAttribute(attr, element);
89
+ }
90
+ }
91
+ downgrade(element) {
92
+ const map = this._elementMap.get(element);
93
+ if (!map) {
94
+ return;
95
+ }
96
+ for (const [, instance] of map) {
97
+ if (instance.OnDestroy) {
98
+ instance.OnDestroy();
99
+ }
100
+ }
101
+ this._elementMap.delete(element);
102
+ }
103
+ found(attributeName, el, oldVal) {
104
+ var _a, _b;
105
+ let map = this._elementMap.get(el);
106
+ if (!map) {
107
+ map = new Map();
108
+ this._elementMap.set(el, map);
109
+ }
110
+ let modifier = map.get(attributeName);
111
+ const attribute = el.getAttribute(attributeName);
112
+ if (!modifier) {
113
+ const Modifier = this.getConstructor(attributeName);
114
+ modifier = new Modifier();
115
+ if ((_b = (_a = Modifier.options) === null || _a === void 0 ? void 0 : _a.observedAttributes) === null || _b === void 0 ? void 0 : _b.length) {
116
+ for (const observedAttribute of Modifier.options.observedAttributes) {
117
+ helpers_1.observe(modifier, observedAttribute);
118
+ }
119
+ }
120
+ modifier.element = el;
121
+ modifier.selector = attributeName;
122
+ modifier.value = attribute || modifier.value;
123
+ modifier.parent = this.parent;
124
+ if (modifier.OnInit) {
125
+ modifier.OnInit();
126
+ }
127
+ if (Modifier.options.observe) {
128
+ modifier.observer = new MutationObserver(records => modifier.OnChange(records));
129
+ modifier.observer.observe(modifier.element, Modifier.options.observe);
130
+ }
131
+ map.set(attributeName, modifier);
132
+ return;
133
+ }
134
+ if (attribute == null && !!modifier.value) {
135
+ modifier.value = attribute;
136
+ if (modifier.OnDestroy) {
137
+ modifier.OnDestroy();
138
+ }
139
+ if (modifier.observer) {
140
+ modifier.observer.disconnect();
141
+ }
142
+ map.delete(attributeName);
143
+ return;
144
+ }
145
+ if (attribute !== modifier.value) {
146
+ modifier.value = attribute;
147
+ if (modifier.OnUpdate) {
148
+ modifier.OnUpdate(oldVal, attribute);
149
+ }
150
+ return;
151
+ }
152
+ }
153
+ }
154
+ exports.CustomAttributeRegistry = CustomAttributeRegistry;
155
+ //# sourceMappingURL=custom-registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"custom-registry.js","sourceRoot":"","sources":["../src/custom-registry.ts"],"names":[],"mappings":";;;AACA,uCAAoC;AAGpC,MAAa,uBAAuB;IAKlC,YAAoB,MAAmB;QAAnB,WAAM,GAAN,MAAM,CAAa;QAJ/B,aAAQ,GAAwC,IAAI,GAAG,EAAE,CAAC;QAC1D,gBAAW,GAA6C,IAAI,GAAG,EAAE,CAAC;QAIxE,IAAI,CAAC,MAAM,EAAE;YACX,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC;SACnD;QACD,IAAI,CAAC,OAAO,EAAE,CAAC;IACjB,CAAC;IAED,MAAM,CAAC,QAAgB,EAAE,WAAmC;QAC1D,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,EAAE,WAAW,CAAC,CAAC;QACvD,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC;IAClC,CAAC;IAED,GAAG,CAAC,OAAoB,EAAE,QAAgB;QACxC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG;YAAE,OAAO;QACjB,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACzC,CAAC;IAEO,cAAc,CAAC,QAAgB;QACrC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACnD,CAAC;IAEO,OAAO;;QACb,IAAI,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,SAAS,CAAC,EAAE;YAC/C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,IAAI,QAAQ,CAAC,IAAI,KAAK,YAAY,EAAE;oBAClC,MAAM,IAAI,GAAG,IAAI,CAAC,cAAc,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;oBACzD,IAAI,IAAI,EAAE;wBACR,IAAI,CAAC,KAAK,CACR,QAAQ,CAAC,aAAa,EACtB,QAAQ,CAAC,MAAe,EACxB,QAAQ,CAAC,QAAQ,CAClB,CAAC;qBACH;iBACF;qBAAM;oBACL,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,YAAY,EAAE;wBACxC,IAAI,CAAC,SAAS,CAAC,IAAa,CAAC,CAAC;qBAC/B;oBACD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,UAAU,EAAE;wBACtC,IAAI,CAAC,cAAc,CAAC,IAAa,CAAC,CAAC;qBACpC;iBACF;aACF;QACH,CAAC,CAAC,CAAC;QACH,IAAI,CAAC,QAAQ,CAAC,OAAO,aAAC,IAAI,CAAC,MAAM,0CAAG,YAAY,oCAAK,IAAI,CAAC,MAAM,EAAE;YAChE,SAAS,EAAE,IAAI;YACf,OAAO,EAAE,IAAI;YACb,UAAU,EAAE,IAAI;YAChB,iBAAiB,EAAE,IAAI;SACxB,CAAC,CAAC;IACL,CAAC;IAED,WAAW;;QACT,MAAA,IAAI,CAAC,QAAQ,0CAAE,UAAU,GAAG;QAC5B,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;QAC9C,KAAK,MAAM,WAAW,IAAI,MAAM,EAAE;YAChC,MAAM,SAAS,GAAG,CAAC,GAAG,WAAW,CAAC,MAAM,EAAE,CAAC,CAAC;YAC5C,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE;gBAChC,QAAQ,CAAC,SAAS,EAAE,CAAC;gBACrB,IAAI,QAAQ,CAAC,QAAQ,EAAE;oBACrB,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;iBAChC;aACF;YACD,WAAW,CAAC,KAAK,EAAE,CAAC;SACrB;QACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;IAC3B,CAAC;IAEO,gBAAgB,CAAC,QAAgB,EAAE,GAAiB;QAC1D,MAAM,MAAM,GAAG,GAAG,IAAI,IAAI,CAAC,MAAM,CAAC;QAElC,MAAM,OAAO,GAAG,MAAM,CAAC,gBAAgB,CAAC,GAAG,GAAG,QAAQ,GAAG,GAAG,CAAC,CAAC;QAE9D,KAAK,MAAM,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,EAAE;YAChC,IAAI,CAAC,KAAK,CAAC,QAAQ,EAAE,KAAc,CAAC,CAAC;SACtC;IACH,CAAC;IAEO,cAAc,CAAC,OAAoB;QACzC,IAAI,OAAO,CAAC,QAAQ,KAAK,CAAC,EAAE;YAC1B,OAAO;SACR;QACD,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,UAAU,EAAE;YACrC,IAAI,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;gBAClC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;aAChC;SACF;QACD,KAAK,MAAM,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;YAClC,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;SACtC;IACH,CAAC;IAEO,SAAS,CAAC,OAAoB;QACpC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,GAAG,EAAE;YACR,OAAO;SACR;QACD,KAAK,MAAM,CAAC,EAAE,QAAQ,CAAC,IAAI,GAAG,EAAE;YAC9B,IAAI,QAAQ,CAAC,SAAS,EAAE;gBACtB,QAAQ,CAAC,SAAS,EAAE,CAAC;aACtB;SACF;QACD,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACnC,CAAC;IAEO,KAAK,CAAC,aAAqB,EAAE,EAAe,EAAE,MAAe;;QACnE,IAAI,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QACnC,IAAI,CAAC,GAAG,EAAE;YACR,GAAG,GAAG,IAAI,GAAG,EAAE,CAAC;YAChB,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC;SAC/B;QAED,IAAI,QAAQ,GAAG,GAAG,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;QACtC,MAAM,SAAS,GAAG,EAAE,CAAC,YAAY,CAAC,aAAa,CAAC,CAAC;QAEjD,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,QAAQ,GAAG,IAAI,CAAC,cAAc,CAAC,aAAa,CAAC,CAAC;YACpD,QAAQ,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC1B,gBAAI,QAAQ,CAAC,OAAO,0CAAE,kBAAkB,0CAAE,MAAM,EAAE;gBAChD,KAAK,MAAM,iBAAiB,IAAI,QAAQ,CAAC,OAAO,CAAC,kBAAkB,EAAE;oBACnE,iBAAO,CAAC,QAAQ,EAAE,iBAAiB,CAAC,CAAC;iBACtC;aACF;YACD,QAAQ,CAAC,OAAO,GAAG,EAAE,CAAC;YACtB,QAAQ,CAAC,QAAQ,GAAG,aAAa,CAAC;YAElC,QAAQ,CAAC,KAAK,GAAG,SAAS,IAAI,QAAQ,CAAC,KAAK,CAAC;YAC7C,QAAQ,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;YAE9B,IAAI,QAAQ,CAAC,MAAM,EAAE;gBACnB,QAAQ,CAAC,MAAM,EAAE,CAAC;aACnB;YACD,IAAI,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;gBAC5B,QAAQ,CAAC,QAAQ,GAAG,IAAI,gBAAgB,CAAC,OAAO,CAAC,EAAE,CACjD,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAC3B,CAAC;gBACF,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,OAAO,EAAE,QAAQ,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;aACvE;YACD,GAAG,CAAC,GAAG,CAAC,aAAa,EAAE,QAAQ,CAAC,CAAC;YACjC,OAAO;SACR;QAED,IAAI,SAAS,IAAI,IAAI,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,EAAE;YACzC,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC;YAC3B,IAAI,QAAQ,CAAC,SAAS,EAAE;gBACtB,QAAQ,CAAC,SAAS,EAAE,CAAC;aACtB;YACD,IAAI,QAAQ,CAAC,QAAQ,EAAE;gBACrB,QAAQ,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC;aAChC;YACD,GAAG,CAAC,MAAM,CAAC,aAAa,CAAC,CAAC;YAC1B,OAAO;SACR;QACD,IAAI,SAAS,KAAK,QAAQ,CAAC,KAAK,EAAE;YAChC,QAAQ,CAAC,KAAK,GAAG,SAAS,CAAC;YAC3B,IAAI,QAAQ,CAAC,QAAQ,EAAE;gBACrB,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;aACtC;YACD,OAAO;SACR;IACH,CAAC;CACF;AAtKD,0DAsKC"}
@@ -0,0 +1,21 @@
1
+ import { InputOptions, ModifierOptions } from '../types';
2
+ /**
3
+ * Decorator @Input
4
+ * Used to get attribute from element
5
+ */
6
+ export declare const Input: (options?: InputOptions) => (target: any, memberName: string) => void;
7
+ /**
8
+ * Decorator @Modifier
9
+ * Accepts parameter options with selector and registry
10
+ */
11
+ export declare const Modifier: (options: ModifierOptions) => (target: Function) => void;
12
+ /**
13
+ * Decorator @CustomAttribute
14
+ * Accepts parameter options with selector and registry
15
+ */
16
+ export declare const CustomAttribute: (options: ModifierOptions) => (target: Function) => void;
17
+ /**
18
+ * Decorator @Directive
19
+ * Accepts parameter options with selector and registry
20
+ */
21
+ export declare const Directive: (options: ModifierOptions) => (target: Function) => void;
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Directive = exports.CustomAttribute = exports.Modifier = exports.Input = void 0;
4
+ const helpers_1 = require("../helpers");
5
+ /**
6
+ * Decorator @Input
7
+ * Used to get attribute from element
8
+ */
9
+ exports.Input = (options) => (target, memberName) => {
10
+ const OnInit = target.OnInit || helpers_1.noop;
11
+ Object.defineProperty(target, 'OnInit', {
12
+ value() {
13
+ var _a;
14
+ let originalValue = this[memberName];
15
+ const element = (_a = this.element) !== null && _a !== void 0 ? _a : this;
16
+ Object.defineProperty(this, memberName, {
17
+ get: function () {
18
+ originalValue = element.getAttribute(memberName.toLowerCase());
19
+ return originalValue;
20
+ },
21
+ set(value) {
22
+ element.setAttribute(memberName.toLowerCase(), value);
23
+ originalValue = value;
24
+ },
25
+ configurable: true
26
+ });
27
+ return OnInit.call(this);
28
+ },
29
+ configurable: true
30
+ });
31
+ if (options === null || options === void 0 ? void 0 : options.observe) {
32
+ helpers_1.observe(target, memberName);
33
+ }
34
+ };
35
+ /**
36
+ * Decorator @Modifier
37
+ * Accepts parameter options with selector and registry
38
+ */
39
+ exports.Modifier = (options) => {
40
+ return (target) => {
41
+ target['options'] = options;
42
+ };
43
+ };
44
+ /**
45
+ * Decorator @CustomAttribute
46
+ * Accepts parameter options with selector and registry
47
+ */
48
+ exports.CustomAttribute = exports.Modifier;
49
+ /**
50
+ * Decorator @Directive
51
+ * Accepts parameter options with selector and registry
52
+ */
53
+ exports.Directive = exports.Modifier;
54
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/decorators/index.ts"],"names":[],"mappings":";;;AAAA,wCAA2C;AAG3C;;;GAGG;AACU,QAAA,KAAK,GAAG,CAAC,OAAsB,EAAE,EAAE,CAAC,CAC/C,MAAM,EACN,UAAkB,EAClB,EAAE;IACF,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,cAAI,CAAC;IACrC,MAAM,CAAC,cAAc,CAAC,MAAM,EAAE,QAAQ,EAAE;QACtC,KAAK;;YACH,IAAI,aAAa,GAAG,IAAI,CAAC,UAAU,CAAC,CAAC;YAErC,MAAM,OAAO,SAAG,IAAI,CAAC,OAAO,mCAAI,IAAI,CAAC;YACrC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,UAAU,EAAE;gBACtC,GAAG,EAAE;oBACH,aAAa,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,EAAE,CAAC,CAAC;oBAC/D,OAAO,aAAa,CAAC;gBACvB,CAAC;gBACD,GAAG,CAAC,KAAK;oBACP,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,WAAW,EAAE,EAAE,KAAK,CAAC,CAAC;oBACtD,aAAa,GAAG,KAAK,CAAC;gBACxB,CAAC;gBACD,YAAY,EAAE,IAAI;aACnB,CAAC,CAAC;YACH,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC3B,CAAC;QACD,YAAY,EAAE,IAAI;KACnB,CAAC,CAAC;IAEH,IAAI,OAAO,aAAP,OAAO,uBAAP,OAAO,CAAE,OAAO,EAAE;QACpB,iBAAO,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC;KAC7B;AACH,CAAC,CAAC;AAEF;;;GAGG;AACU,QAAA,QAAQ,GAAG,CAAC,OAAwB,EAAE,EAAE;IACnD,OAAO,CAAC,MAAgB,EAAE,EAAE;QAC1B,MAAM,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC;IAC9B,CAAC,CAAC;AACJ,CAAC,CAAC;AAEF;;;GAGG;AACU,QAAA,eAAe,GAAG,gBAAQ,CAAC;AACxC;;;GAGG;AACU,QAAA,SAAS,GAAG,gBAAQ,CAAC"}
@@ -0,0 +1,2 @@
1
+ export declare const noop: () => void;
2
+ export declare const observe: (target: unknown, memberName: string) => void;
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.observe = exports.noop = void 0;
4
+ exports.noop = function () {
5
+ /* */
6
+ };
7
+ exports.observe = (target, memberName) => {
8
+ const prototype = target.constructor.prototype;
9
+ const OnInit = prototype.OnInit || exports.noop;
10
+ const OnDestroy = prototype.OnDestroy || exports.noop;
11
+ const OnUpdateAttribute = prototype.OnUpdateAttribute || exports.noop;
12
+ let observer;
13
+ prototype.OnInit = function () {
14
+ var _a;
15
+ const element = (_a = this.element) !== null && _a !== void 0 ? _a : this;
16
+ if (observer) {
17
+ observer.disconnect();
18
+ }
19
+ observer = new MutationObserver(() => {
20
+ OnUpdateAttribute.call(this, memberName, element.getAttribute(memberName));
21
+ target[memberName] = element.getAttribute(memberName);
22
+ });
23
+ observer.observe(element, {
24
+ attributeFilter: [memberName],
25
+ attributes: true
26
+ });
27
+ return OnInit.call(this);
28
+ };
29
+ prototype.OnDestroy = function () {
30
+ observer.disconnect();
31
+ return OnDestroy.call(this);
32
+ };
33
+ };
34
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/helpers/index.ts"],"names":[],"mappings":";;;AAAa,QAAA,IAAI,GAAG;IAClB,MAAM;AACR,CAAC,CAAC;AAEW,QAAA,OAAO,GAAG,CAAC,MAAe,EAAE,UAAkB,EAAE,EAAE;IAC7D,MAAM,SAAS,GAAG,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC;IAC/C,MAAM,MAAM,GAAG,SAAS,CAAC,MAAM,IAAI,YAAI,CAAC;IACxC,MAAM,SAAS,GAAG,SAAS,CAAC,SAAS,IAAI,YAAI,CAAC;IAC9C,MAAM,iBAAiB,GAAG,SAAS,CAAC,iBAAiB,IAAI,YAAI,CAAC;IAE9D,IAAI,QAA0B,CAAC;IAC/B,SAAS,CAAC,MAAM,GAAG;;QACjB,MAAM,OAAO,SAAG,IAAI,CAAC,OAAO,mCAAI,IAAI,CAAC;QACrC,IAAI,QAAQ,EAAE;YACZ,QAAQ,CAAC,UAAU,EAAE,CAAC;SACvB;QACD,QAAQ,GAAG,IAAI,gBAAgB,CAAC,GAAG,EAAE;YACnC,iBAAiB,CAAC,IAAI,CACpB,IAAI,EACJ,UAAU,EACV,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CACjC,CAAC;YACF,MAAM,CAAC,UAAU,CAAC,GAAG,OAAO,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;QACxD,CAAC,CAAC,CAAC;QACH,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE;YACxB,eAAe,EAAE,CAAC,UAAU,CAAC;YAC7B,UAAU,EAAE,IAAI;SACjB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC3B,CAAC,CAAC;IACF,SAAS,CAAC,SAAS,GAAG;QACpB,QAAQ,CAAC,UAAU,EAAE,CAAC;QACtB,OAAO,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9B,CAAC,CAAC;AACJ,CAAC,CAAC"}
package/dist/index.d.ts CHANGED
@@ -1,89 +1,6 @@
1
- export declare type C<T> = new (...args: never[]) => T;
2
- export interface Constructor<T> extends C<T> {
3
- options: ModifierOptions;
4
- }
5
- interface ModifierOptions {
6
- selector: string;
7
- registry?(this: HTMLElement): CustomAttributeRegistry;
8
- observedAttributes?: string[];
9
- }
10
- interface InputOptions {
11
- /**
12
- * If enabled will trigger OnUpdate method on the Attribute
13
- * */
14
- observe: true;
15
- }
16
- /**
17
- * Decorator @Input
18
- * Used to get attribute from element
19
- */
20
- export declare const Input: (options?: InputOptions) => (target: any, memberName: string) => void;
21
- /**
22
- * Decorator @Modifier
23
- * Accepts parameter options with selector and registry
24
- */
25
- export declare const Modifier: (options: ModifierOptions) => (target: Function) => void;
26
- /**
27
- * Decorator @CustomAttribute
28
- * Accepts parameter options with selector and registry
29
- */
30
- export declare const CustomAttribute: (options: ModifierOptions) => (target: Function) => void;
31
- /**
32
- * Decorator @Directive
33
- * Accepts parameter options with selector and registry
34
- */
35
- export declare const Directive: (options: ModifierOptions) => (target: Function) => void;
36
- export declare abstract class Attribute<T = {}> {
37
- static options: ModifierOptions;
38
- element?: HTMLElement;
39
- value?: string;
40
- selector?: string;
41
- parent?: HTMLElement;
42
- setStyles(keys: T): (div: HTMLElement | Element | HTMLDivElement) => void;
43
- OnInit(): void;
44
- OnDestroy(): void;
45
- OnUpdate(_oldValue: string, _newValue: string): void;
46
- OnUpdateAttribute(_name: string, _value: string): void;
47
- }
48
- /**
49
- * Media query Attribute
50
- * for performance reasons it is key value pair
51
- */
52
- export declare const MediaMatchers: Map<string, string>;
53
- declare type MediaEvent = MediaQueryList | MediaQueryListEvent;
54
- export declare type EnterMediaQueryAttributes = [MediaEvent, Attr];
55
- export declare type ExitMediaQueryAttributes = [MediaEvent, string];
56
- export interface OnUpdateMediaQuery {
57
- OnEnterMediaQuery(tuple: [MediaEvent, Attr]): void;
58
- OnExitMediaQuery(tuple: [MediaEvent, string]): void;
59
- }
60
- export declare const Breakpoints: string[];
61
- export declare const createFiltersFromSelector: (selector: string) => string[];
62
- export declare abstract class MediaQueryAttribute<T> extends Attribute<T> implements OnUpdateMediaQuery {
63
- prevValue: string;
64
- originalValue: string;
65
- private matchers;
66
- private cachedAttributes;
67
- listener: (event: MediaQueryList | MediaQueryListEvent) => void;
68
- OnInit(): void;
69
- OnDestroy(): void;
70
- abstract OnEnterMediaQuery(tuple: [MediaEvent, Attr]): void;
71
- abstract OnExitMediaQuery(tuple: [MediaEvent, string]): void;
72
- }
73
- export declare class CustomAttributeRegistry {
74
- private parent;
75
- private _attrMap;
76
- private _elementMap;
77
- private observer;
78
- constructor(parent: HTMLElement);
79
- define(attrName: string, Constructor: Constructor<Attribute>): void;
80
- get(element: HTMLElement, attrName: string): Attribute<{}>;
81
- private getConstructor;
82
- private observe;
83
- unsubscribe(): void;
84
- private upgradeAttribute;
85
- private upgradeElement;
86
- private downgrade;
87
- private found;
88
- }
89
- export {};
1
+ export * from './attribute';
2
+ export * from './custom-registry';
3
+ export * from './decorators';
4
+ export * from './helpers';
5
+ export * from './media-attribute';
6
+ export * from './types';