@ctrl/ngx-codemirror 4.1.0 → 5.1.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.
@@ -1 +0,0 @@
1
- {"__symbolic":"module","version":4,"metadata":{"CodemirrorComponent":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Component","line":34,"character":1},"arguments":[{"selector":"ngx-codemirror","template":"\n <textarea\n [name]=\"name\"\n class=\"ngx-codemirror {{ className }}\"\n [class.ngx-codemirror--focused]=\"isFocused\"\n autocomplete=\"off\"\n [autofocus]=\"autoFocus\"\n #ref\n >\n </textarea>\n ","providers":[{"provide":{"__symbolic":"reference","module":"@angular/forms","name":"NG_VALUE_ACCESSOR","line":49,"character":15},"useExisting":{"__symbolic":"reference","name":"CodemirrorComponent"},"multi":true}],"preserveWhitespaces":false,"changeDetection":{"__symbolic":"select","expression":{"__symbolic":"reference","module":"@angular/core","name":"ChangeDetectionStrategy","line":55,"character":19},"member":"OnPush"}}]}],"members":{"className":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":60,"character":3}}]}],"name":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":62,"character":3}}]}],"autoFocus":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":64,"character":3}}]}],"options":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":69,"character":3}}]}],"preserveScrollPosition":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Input","line":77,"character":3}}]}],"cursorActivity":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":79,"character":3}}]}],"focusChange":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":81,"character":3}}]}],"scroll":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":84,"character":3}}]}],"drop":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"Output","line":87,"character":3}}]}],"ref":[{"__symbolic":"property","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"ViewChild","line":88,"character":3},"arguments":["ref",{"static":true}]}]}],"__ctor__":[{"__symbolic":"constructor","parameters":[{"__symbolic":"reference","module":"@angular/core","name":"KeyValueDiffers","line":101,"character":32},{"__symbolic":"reference","module":"@angular/core","name":"NgZone","line":101,"character":66}]}],"ngAfterViewInit":[{"__symbolic":"method"}],"ngDoCheck":[{"__symbolic":"method"}],"ngOnDestroy":[{"__symbolic":"method"}],"codemirrorValueChanged":[{"__symbolic":"method"}],"setOptionIfChanged":[{"__symbolic":"method"}],"focusChanged":[{"__symbolic":"method"}],"scrollChanged":[{"__symbolic":"method"}],"cursorActive":[{"__symbolic":"method"}],"dropFiles":[{"__symbolic":"method"}],"writeValue":[{"__symbolic":"method"}],"registerOnChange":[{"__symbolic":"method"}],"registerOnTouched":[{"__symbolic":"method"}],"setDisabledState":[{"__symbolic":"method"}]}},"CodemirrorModule":{"__symbolic":"class","decorators":[{"__symbolic":"call","expression":{"__symbolic":"reference","module":"@angular/core","name":"NgModule","line":4,"character":1},"arguments":[{"exports":[{"__symbolic":"reference","name":"CodemirrorComponent"}],"declarations":[{"__symbolic":"reference","name":"CodemirrorComponent"}]}]}],"members":{}}},"origins":{"CodemirrorComponent":"./codemirror.component","CodemirrorModule":"./codemirror.module"},"importAs":"@ctrl/ngx-codemirror"}
@@ -1,198 +0,0 @@
1
- import { ChangeDetectionStrategy, Component, EventEmitter, forwardRef, Input, KeyValueDiffers, NgZone, Output, ViewChild, } from '@angular/core';
2
- import { NG_VALUE_ACCESSOR } from '@angular/forms';
3
- function normalizeLineEndings(str) {
4
- if (!str) {
5
- return str;
6
- }
7
- return str.replace(/\r\n|\r/g, '\n');
8
- }
9
- export class CodemirrorComponent {
10
- constructor(_differs, _ngZone) {
11
- this._differs = _differs;
12
- this._ngZone = _ngZone;
13
- /* class applied to the created textarea */
14
- this.className = '';
15
- /* name applied to the created textarea */
16
- this.name = 'codemirror';
17
- /* autofocus setting applied to the created textarea */
18
- this.autoFocus = false;
19
- /* preserve previous scroll position after updating value */
20
- this.preserveScrollPosition = false;
21
- /* called when the text cursor is moved */
22
- this.cursorActivity = new EventEmitter();
23
- /* called when the editor is focused or loses focus */
24
- this.focusChange = new EventEmitter();
25
- /* called when the editor is scrolled */
26
- // tslint:disable-next-line:no-output-native
27
- this.scroll = new EventEmitter();
28
- /* called when file(s) are dropped */
29
- // tslint:disable-next-line:no-output-native
30
- this.drop = new EventEmitter();
31
- this.value = '';
32
- this.disabled = false;
33
- this.isFocused = false;
34
- /** Implemented as part of ControlValueAccessor. */
35
- this.onChange = (_) => { };
36
- /** Implemented as part of ControlValueAccessor. */
37
- this.onTouched = () => { };
38
- }
39
- /**
40
- * set options for codemirror
41
- * @link http://codemirror.net/doc/manual.html#config
42
- */
43
- set options(value) {
44
- this._options = value;
45
- if (!this._differ && value) {
46
- this._differ = this._differs.find(value).create();
47
- }
48
- }
49
- get codeMirrorGlobal() {
50
- if (this._codeMirror) {
51
- return this._codeMirror;
52
- }
53
- this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : require('codemirror');
54
- return this._codeMirror;
55
- }
56
- ngAfterViewInit() {
57
- if (!this.ref) {
58
- return;
59
- }
60
- // in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors
61
- this._ngZone.runOutsideAngular(() => {
62
- this.codeMirror = this.codeMirrorGlobal.fromTextArea(this.ref.nativeElement, this._options);
63
- this.codeMirror.on('cursorActivity', cm => this._ngZone.run(() => this.cursorActive(cm)));
64
- this.codeMirror.on('scroll', this.scrollChanged.bind(this));
65
- this.codeMirror.on('blur', () => this._ngZone.run(() => this.focusChanged(false)));
66
- this.codeMirror.on('focus', () => this._ngZone.run(() => this.focusChanged(true)));
67
- this.codeMirror.on('change', (cm, change) => this._ngZone.run(() => this.codemirrorValueChanged(cm, change)));
68
- this.codeMirror.on('drop', (cm, e) => {
69
- this._ngZone.run(() => this.dropFiles(cm, e));
70
- });
71
- this.codeMirror.setValue(this.value);
72
- });
73
- }
74
- ngDoCheck() {
75
- if (!this._differ) {
76
- return;
77
- }
78
- // check options have not changed
79
- const changes = this._differ.diff(this._options);
80
- if (changes) {
81
- changes.forEachChangedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
82
- changes.forEachAddedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
83
- changes.forEachRemovedItem(option => this.setOptionIfChanged(option.key, option.currentValue));
84
- }
85
- }
86
- ngOnDestroy() {
87
- // is there a lighter-weight way to remove the cm instance?
88
- if (this.codeMirror) {
89
- this.codeMirror.toTextArea();
90
- }
91
- }
92
- codemirrorValueChanged(cm, change) {
93
- if (change.origin !== 'setValue') {
94
- this.value = cm.getValue();
95
- this.onChange(this.value);
96
- }
97
- }
98
- setOptionIfChanged(optionName, newValue) {
99
- if (!this.codeMirror) {
100
- return;
101
- }
102
- // cast to any to handle strictly typed option names
103
- // could possibly import settings strings available in the future
104
- this.codeMirror.setOption(optionName, newValue);
105
- }
106
- focusChanged(focused) {
107
- this.onTouched();
108
- this.isFocused = focused;
109
- this.focusChange.emit(focused);
110
- }
111
- scrollChanged(cm) {
112
- this.scroll.emit(cm.getScrollInfo());
113
- }
114
- cursorActive(cm) {
115
- this.cursorActivity.emit(cm);
116
- }
117
- dropFiles(cm, e) {
118
- this.drop.emit([cm, e]);
119
- }
120
- /** Implemented as part of ControlValueAccessor. */
121
- writeValue(value) {
122
- if (value === null || value === undefined) {
123
- return;
124
- }
125
- if (!this.codeMirror) {
126
- this.value = value;
127
- return;
128
- }
129
- const cur = this.codeMirror.getValue();
130
- if (value !== cur &&
131
- normalizeLineEndings(cur) !== normalizeLineEndings(value)) {
132
- this.value = value;
133
- if (this.preserveScrollPosition) {
134
- const prevScrollPosition = this.codeMirror.getScrollInfo();
135
- this.codeMirror.setValue(this.value);
136
- this.codeMirror.scrollTo(prevScrollPosition.left, prevScrollPosition.top);
137
- }
138
- else {
139
- this.codeMirror.setValue(this.value);
140
- }
141
- }
142
- }
143
- /** Implemented as part of ControlValueAccessor. */
144
- registerOnChange(fn) {
145
- this.onChange = fn;
146
- }
147
- /** Implemented as part of ControlValueAccessor. */
148
- registerOnTouched(fn) {
149
- this.onTouched = fn;
150
- }
151
- /** Implemented as part of ControlValueAccessor. */
152
- setDisabledState(isDisabled) {
153
- this.disabled = isDisabled;
154
- this.setOptionIfChanged('readOnly', this.disabled);
155
- }
156
- }
157
- CodemirrorComponent.decorators = [
158
- { type: Component, args: [{
159
- selector: 'ngx-codemirror',
160
- template: `
161
- <textarea
162
- [name]="name"
163
- class="ngx-codemirror {{ className }}"
164
- [class.ngx-codemirror--focused]="isFocused"
165
- autocomplete="off"
166
- [autofocus]="autoFocus"
167
- #ref
168
- >
169
- </textarea>
170
- `,
171
- providers: [
172
- {
173
- provide: NG_VALUE_ACCESSOR,
174
- useExisting: forwardRef(() => CodemirrorComponent),
175
- multi: true,
176
- },
177
- ],
178
- preserveWhitespaces: false,
179
- changeDetection: ChangeDetectionStrategy.OnPush
180
- },] }
181
- ];
182
- CodemirrorComponent.ctorParameters = () => [
183
- { type: KeyValueDiffers },
184
- { type: NgZone }
185
- ];
186
- CodemirrorComponent.propDecorators = {
187
- className: [{ type: Input }],
188
- name: [{ type: Input }],
189
- autoFocus: [{ type: Input }],
190
- options: [{ type: Input }],
191
- preserveScrollPosition: [{ type: Input }],
192
- cursorActivity: [{ type: Output }],
193
- focusChange: [{ type: Output }],
194
- scroll: [{ type: Output }],
195
- drop: [{ type: Output }],
196
- ref: [{ type: ViewChild, args: ['ref', { static: true },] }]
197
- };
198
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5jb21wb25lbnQuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vc3JjL2xpYi8iLCJzb3VyY2VzIjpbImNvZGVtaXJyb3IuY29tcG9uZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFFTCx1QkFBdUIsRUFDdkIsU0FBUyxFQUdULFlBQVksRUFDWixVQUFVLEVBQ1YsS0FBSyxFQUVMLGVBQWUsRUFDZixNQUFNLEVBRU4sTUFBTSxFQUNOLFNBQVMsR0FDVixNQUFNLGVBQWUsQ0FBQztBQUN2QixPQUFPLEVBQXdCLGlCQUFpQixFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFRekUsU0FBUyxvQkFBb0IsQ0FBQyxHQUFXO0lBQ3ZDLElBQUksQ0FBQyxHQUFHLEVBQUU7UUFDUixPQUFPLEdBQUcsQ0FBQztLQUNaO0lBQ0QsT0FBTyxHQUFHLENBQUMsT0FBTyxDQUFDLFVBQVUsRUFBRSxJQUFJLENBQUMsQ0FBQztBQUN2QyxDQUFDO0FBNEJELE1BQU0sT0FBTyxtQkFBbUI7SUE0QzlCLFlBQW9CLFFBQXlCLEVBQVUsT0FBZTtRQUFsRCxhQUFRLEdBQVIsUUFBUSxDQUFpQjtRQUFVLFlBQU8sR0FBUCxPQUFPLENBQVE7UUExQ3RFLDJDQUEyQztRQUNsQyxjQUFTLEdBQUcsRUFBRSxDQUFDO1FBQ3hCLDBDQUEwQztRQUNqQyxTQUFJLEdBQUcsWUFBWSxDQUFDO1FBQzdCLHVEQUF1RDtRQUM5QyxjQUFTLEdBQUcsS0FBSyxDQUFDO1FBWTNCLDREQUE0RDtRQUNuRCwyQkFBc0IsR0FBRyxLQUFLLENBQUM7UUFDeEMsMENBQTBDO1FBQ2hDLG1CQUFjLEdBQUcsSUFBSSxZQUFZLEVBQVUsQ0FBQztRQUN0RCxzREFBc0Q7UUFDNUMsZ0JBQVcsR0FBRyxJQUFJLFlBQVksRUFBVyxDQUFDO1FBQ3BELHdDQUF3QztRQUN4Qyw0Q0FBNEM7UUFDbEMsV0FBTSxHQUFHLElBQUksWUFBWSxFQUFjLENBQUM7UUFDbEQscUNBQXFDO1FBQ3JDLDRDQUE0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Z0JBQzFCLFFBQVEsRUFBRTs7Ozs7Ozs7OztHQVVUO2dCQUNELFNBQVMsRUFBRTtvQkFDVDt3QkFDRSxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixXQUFXLEVBQUUsVUFBVSxDQUFDLEdBQUcsRUFBRSxDQUFDLG1CQUFtQixDQUFDO3dCQUNsRCxLQUFLLEVBQUUsSUFBSTtxQkFDWjtpQkFDRjtnQkFDRCxtQkFBbUIsRUFBRSxLQUFLO2dCQUMxQixlQUFlLEVBQUUsdUJBQXVCLENBQUMsTUFBTTthQUNoRDs7O1lBOUNDLGVBQWU7WUFDZixNQUFNOzs7d0JBaURMLEtBQUs7bUJBRUwsS0FBSzt3QkFFTCxLQUFLO3NCQUtMLEtBQUs7cUNBUUwsS0FBSzs2QkFFTCxNQUFNOzBCQUVOLE1BQU07cUJBR04sTUFBTTttQkFHTixNQUFNO2tCQUNOLFNBQVMsU0FBQyxLQUFLLEVBQUUsRUFBRSxNQUFNLEVBQUUsSUFBSSxFQUFFIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHtcbiAgQWZ0ZXJWaWV3SW5pdCxcbiAgQ2hhbmdlRGV0ZWN0aW9uU3RyYXRlZ3ksXG4gIENvbXBvbmVudCxcbiAgRG9DaGVjayxcbiAgRWxlbWVudFJlZixcbiAgRXZlbnRFbWl0dGVyLFxuICBmb3J3YXJkUmVmLFxuICBJbnB1dCxcbiAgS2V5VmFsdWVEaWZmZXIsXG4gIEtleVZhbHVlRGlmZmVycyxcbiAgTmdab25lLFxuICBPbkRlc3Ryb3ksXG4gIE91dHB1dCxcbiAgVmlld0NoaWxkLFxufSBmcm9tICdAYW5ndWxhci9jb3JlJztcbmltcG9ydCB7IENvbnRyb2xWYWx1ZUFjY2Vzc29yLCBOR19WQUxVRV9BQ0NFU1NPUiB9IGZyb20gJ0Bhbmd1bGFyL2Zvcm1zJztcbmltcG9ydCB7XG4gIEVkaXRvcixcbiAgRWRpdG9yQ2hhbmdlTGlua2VkTGlzdCxcbiAgRWRpdG9yRnJvbVRleHRBcmVhLFxuICBTY3JvbGxJbmZvLFxufSBmcm9tICdjb2RlbWlycm9yJztcblxuZnVuY3Rpb24gbm9ybWFsaXplTGluZUVuZGluZ3Moc3RyOiBzdHJpbmcpOiBzdHJpbmcge1xuICBpZiAoIXN0cikge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbiAgcmV0dXJuIHN0ci5yZXBsYWNlKC9cXHJcXG58XFxyL2csICdcXG4nKTtcbn1cblxuZGVjbGFyZSB2YXIgcmVxdWlyZTogYW55O1xuZGVjbGFyZSB2YXIgQ29kZU1pcnJvcjogYW55O1xuXG5AQ29tcG9uZW50KHtcbiAgc2VsZWN0b3I6ICduZ3gtY29kZW1pcnJvcicsXG4gIHRlbXBsYXRlOiBgXG4gICAgPHRleHRhcmVhXG4gICAgICBbbmFtZV09XCJuYW1lXCJcbiAgICAgIGNsYXNzPVwibmd4LWNvZGVtaXJyb3Ige3sgY2xhc3NOYW1lIH19XCJcbiAgICAgIFtjbGFzcy5uZ3gtY29kZW1pcnJvci0tZm9jdXNlZF09XCJpc0ZvY3VzZWRcIlxuICAgICAgYXV0b2NvbXBsZXRlPVwib2ZmXCJcbiAgICAgIFthdXRvZm9jdXNdPVwiYXV0b0ZvY3VzXCJcbiAgICAgICNyZWZcbiAgICA+XG4gICAgPC90ZXh0YXJlYT5cbiAgYCxcbiAgcHJvdmlkZXJzOiBbXG4gICAge1xuICAgICAgcHJvdmlkZTogTkdfVkFMVUVfQUNDRVNTT1IsXG4gICAgICB1c2VFeGlzdGluZzogZm9yd2FyZFJlZigoKSA9PiBDb2RlbWlycm9yQ29tcG9uZW50KSxcbiAgICAgIG11bHRpOiB0cnVlLFxuICAgIH0sXG4gIF0sXG4gIHByZXNlcnZlV2hpdGVzcGFjZXM6IGZhbHNlLFxuICBjaGFuZ2VEZXRlY3Rpb246IENoYW5nZURldGVjdGlvblN0cmF0ZWd5Lk9uUHVzaCxcbn0pXG5leHBvcnQgY2xhc3MgQ29kZW1pcnJvckNvbXBvbmVudFxuICBpbXBsZW1lbnRzIEFmdGVyVmlld0luaXQsIE9uRGVzdHJveSwgQ29udHJvbFZhbHVlQWNjZXNzb3IsIERvQ2hlY2sge1xuICAvKiBjbGFzcyBhcHBsaWVkIHRvIHRoZSBjcmVhdGVkIHRleHRhcmVhICovXG4gIEBJbnB1dCgpIGNsYXNzTmFtZSA9ICcnO1xuICAvKiBuYW1lIGFwcGxpZWQgdG8gdGhlIGNyZWF0ZWQgdGV4dGFyZWEgKi9cbiAgQElucHV0KCkgbmFtZSA9ICdjb2RlbWlycm9yJztcbiAgLyogYXV0b2ZvY3VzIHNldHRpbmcgYXBwbGllZCB0byB0aGUgY3JlYXRlZCB0ZXh0YXJlYSAqL1xuICBASW5wdXQoKSBhdXRvRm9jdXMgPSBmYWxzZTtcbiAgLyoqXG4gICAqIHNldCBvcHRpb25zIGZvciBjb2RlbWlycm9yXG4gICAqIEBsaW5rIGh0dHA6Ly9jb2RlbWlycm9yLm5ldC9kb2MvbWFudWFsLmh0bWwjY29uZmlnXG4gICAqL1xuICBASW5wdXQoKVxuICBzZXQgb3B0aW9ucyh2YWx1ZTogeyBba2V5OiBzdHJpbmddOiBhbnkgfSkge1xuICAgIHRoaXMuX29wdGlvbnMgPSB2YWx1ZTtcbiAgICBpZiAoIXRoaXMuX2RpZmZlciAmJiB2YWx1ZSkge1xuICAgICAgdGhpcy5fZGlmZmVyID0gdGhpcy5fZGlmZmVycy5maW5kKHZhbHVlKS5jcmVhdGUoKTtcbiAgICB9XG4gIH1cbiAgLyogcHJlc2VydmUgcHJldmlvdXMgc2Nyb2xsIHBvc2l0aW9uIGFmdGVyIHVwZGF0aW5nIHZhbHVlICovXG4gIEBJbnB1dCgpIHByZXNlcnZlU2Nyb2xsUG9zaXRpb24gPSBmYWxzZTtcbiAgLyogY2FsbGVkIHdoZW4gdGhlIHRleHQgY3Vyc29yIGlzIG1vdmVkICovXG4gIEBPdXRwdXQoKSBjdXJzb3JBY3Rpdml0eSA9IG5ldyBFdmVudEVtaXR0ZXI8RWRpdG9yPigpO1xuICAvKiBjYWxsZWQgd2hlbiB0aGUgZWRpdG9yIGlzIGZvY3VzZWQgb3IgbG9zZXMgZm9jdXMgKi9cbiAgQE91dHB1dCgpIGZvY3VzQ2hhbmdlID0gbmV3IEV2ZW50RW1pdHRlcjxib29sZWFuPigpO1xuICAvKiBjYWxsZWQgd2hlbiB0aGUgZWRpdG9yIGlzIHNjcm9sbGVkICovXG4gIC8vIHRzbGludDpkaXNhYmxlLW5leHQtbGluZTpuby1vdXRwdXQtbmF0aXZlXG4gIEBPdXRwdXQoKSBzY3JvbGwgPSBuZXcgRXZlbnRFbWl0dGVyPFNjcm9sbEluZm8+KCk7XG4gIC8qIGNhbGxlZCB3aGVuIGZpbGUocykgYXJlIGRyb3BwZWQgKi9cbiAgLy8gdHNsaW50OmRpc2FibGUtbmV4dC1saW5lOm5vLW91dHB1dC1uYXRpdmVcbiAgQE91dHB1dCgpIGRyb3AgPSBuZXcgRXZlbnRFbWl0dGVyPFtFZGl0b3IsIERyYWdFdmVudF0+KCk7XG4gIEBWaWV3Q2hpbGQoJ3JlZicsIHsgc3RhdGljOiB0cnVlIH0pIHJlZiE6IEVsZW1lbnRSZWY7XG4gIHZhbHVlID0gJyc7XG4gIGRpc2FibGVkID0gZmFsc2U7XG4gIGlzRm9jdXNlZCA9IGZhbHNlO1xuICBjb2RlTWlycm9yPzogRWRpdG9yRnJvbVRleHRBcmVhO1xuICAvKipcbiAgICogZWl0aGVyIGdsb2JhbCB2YXJpYWJsZSBvciByZXF1aXJlZCBsaWJyYXJ5XG4gICAqL1xuICBwcml2YXRlIF9jb2RlTWlycm9yOiBhbnk7XG5cbiAgcHJpdmF0ZSBfZGlmZmVyPzogS2V5VmFsdWVEaWZmZXI8c3RyaW5nLCBhbnk+O1xuICBwcml2YXRlIF9vcHRpb25zOiBhbnk7XG5cbiAgY29uc3RydWN0b3IocHJpdmF0ZSBfZGlmZmVyczogS2V5VmFsdWVEaWZmZXJzLCBwcml2YXRlIF9uZ1pvbmU6IE5nWm9uZSkge31cblxuICBnZXQgY29kZU1pcnJvckdsb2JhbCgpOiBhbnkge1xuICAgIGlmICh0aGlzLl9jb2RlTWlycm9yKSB7XG4gICAgICByZXR1cm4gdGhpcy5fY29kZU1pcnJvcjtcbiAgICB9XG5cbiAgICB0aGlzLl9jb2RlTWlycm9yID0gdHlwZW9mIENvZGVNaXJyb3IgIT09ICd1bmRlZmluZWQnID8gQ29kZU1pcnJvciA6IHJlcXVpcmUoJ2NvZGVtaXJyb3InKTtcbiAgICByZXR1cm4gdGhpcy5fY29kZU1pcnJvcjtcbiAgfVxuXG4gIG5nQWZ0ZXJWaWV3SW5pdCgpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMucmVmKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGluIG9yZGVyIHRvIGFsbG93IGZvciB1bml2ZXJzYWwgcmVuZGVyaW5nLCB3ZSBpbXBvcnQgQ29kZW1pcnJvciBydW50aW1lIHdpdGggYHJlcXVpcmVgIHRvIHByZXZlbnQgbm9kZSBlcnJvcnNcbiAgICB0aGlzLl9uZ1pvbmUucnVuT3V0c2lkZUFuZ3VsYXIoKCkgPT4ge1xuICAgICAgdGhpcy5jb2RlTWlycm9yID0gdGhpcy5jb2RlTWlycm9yR2xvYmFsLmZyb21UZXh0QXJlYShcbiAgICAgICAgdGhpcy5yZWYubmF0aXZlRWxlbWVudCxcbiAgICAgICAgdGhpcy5fb3B0aW9ucyxcbiAgICAgICkgYXMgRWRpdG9yRnJvbVRleHRBcmVhO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKCdjdXJzb3JBY3Rpdml0eScsIGNtID0+XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5jdXJzb3JBY3RpdmUoY20pKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ3Njcm9sbCcsIHRoaXMuc2Nyb2xsQ2hhbmdlZC5iaW5kKHRoaXMpKTtcbiAgICAgIHRoaXMuY29kZU1pcnJvci5vbignYmx1cicsICgpID0+XG4gICAgICAgIHRoaXMuX25nWm9uZS5ydW4oKCkgPT4gdGhpcy5mb2N1c0NoYW5nZWQoZmFsc2UpKSxcbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGVNaXJyb3Iub24oJ2ZvY3VzJywgKCkgPT5cbiAgICAgICAgdGhpcy5fbmdab25lLnJ1bigoKSA9PiB0aGlzLmZvY3VzQ2hhbmdlZCh0cnVlKSksXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKFxuICAgICAgICAnY2hhbmdlJyxcbiAgICAgICAgKGNtOiBFZGl0b3IsIGNoYW5nZTogRWRpdG9yQ2hhbmdlTGlua2VkTGlzdCkgPT5cbiAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuY29kZW1pcnJvclZhbHVlQ2hhbmdlZChjbSwgY2hhbmdlKSksXG4gICAgICApO1xuICAgICAgdGhpcy5jb2RlTWlycm9yLm9uKFxuICAgICAgICAnZHJvcCcsXG4gICAgICAgIChjbTogRWRpdG9yLCBlOiBEcmFnRXZlbnQpID0+IHtcbiAgICAgICAgICB0aGlzLl9uZ1pvbmUucnVuKCgpID0+IHRoaXMuZHJvcEZpbGVzKGNtLCBlKSk7XG4gICAgICAgIH1cbiAgICAgICk7XG4gICAgICB0aGlzLmNvZGVNaXJyb3Iuc2V0VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgfSk7XG4gIH1cbiAgbmdEb0NoZWNrKCk6IHZvaWQge1xuICAgIGlmICghdGhpcy5fZGlmZmVyKSB7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIGNoZWNrIG9wdGlvbnMgaGF2ZSBub3QgY2hhbmdlZFxuICAgIGNvbnN0IGNoYW5nZXMgPSB0aGlzLl9kaWZmZXIuZGlmZih0aGlzLl9vcHRpb25zKTtcbiAgICBpZiAoY2hhbmdlcykge1xuICAgICAgY2hhbmdlcy5mb3JFYWNoQ2hhbmdlZEl0ZW0ob3B0aW9uID0+XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uSWZDaGFuZ2VkKG9wdGlvbi5rZXksIG9wdGlvbi5jdXJyZW50VmFsdWUpLFxuICAgICAgKTtcbiAgICAgIGNoYW5nZXMuZm9yRWFjaEFkZGVkSXRlbShvcHRpb24gPT5cbiAgICAgICAgdGhpcy5zZXRPcHRpb25JZkNoYW5nZWQob3B0aW9uLmtleSwgb3B0aW9uLmN1cnJlbnRWYWx1ZSksXG4gICAgICApO1xuICAgICAgY2hhbmdlcy5mb3JFYWNoUmVtb3ZlZEl0ZW0ob3B0aW9uID0+XG4gICAgICAgIHRoaXMuc2V0T3B0aW9uSWZDaGFuZ2VkKG9wdGlvbi5rZXksIG9wdGlvbi5jdXJyZW50VmFsdWUpLFxuICAgICAgKTtcbiAgICB9XG4gIH1cbiAgbmdPbkRlc3Ryb3koKTogdm9pZCB7XG4gICAgLy8gaXMgdGhlcmUgYSBsaWdodGVyLXdlaWdodCB3YXkgdG8gcmVtb3ZlIHRoZSBjbSBpbnN0YW5jZT9cbiAgICBpZiAodGhpcy5jb2RlTWlycm9yKSB7XG4gICAgICB0aGlzLmNvZGVNaXJyb3IudG9UZXh0QXJlYSgpO1xuICAgIH1cbiAgfVxuICBjb2RlbWlycm9yVmFsdWVDaGFuZ2VkKGNtOiBFZGl0b3IsIGNoYW5nZTogRWRpdG9yQ2hhbmdlTGlua2VkTGlzdCk6IHZvaWQge1xuICAgIGlmIChjaGFuZ2Uub3JpZ2luICE9PSAnc2V0VmFsdWUnKSB7XG4gICAgICB0aGlzLnZhbHVlID0gY20uZ2V0VmFsdWUoKTtcbiAgICAgIHRoaXMub25DaGFuZ2UodGhpcy52YWx1ZSk7XG4gICAgfVxuICB9XG4gIHNldE9wdGlvbklmQ2hhbmdlZChvcHRpb25OYW1lOiBzdHJpbmcsIG5ld1ZhbHVlOiBhbnkpOiB2b2lkIHtcbiAgICBpZiAoIXRoaXMuY29kZU1pcnJvcikge1xuICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIC8vIGNhc3QgdG8gYW55IHRvIGhhbmRsZSBzdHJpY3RseSB0eXBlZCBvcHRpb24gbmFtZXNcbiAgICAvLyBjb3VsZCBwb3NzaWJseSBpbXBvcnQgc2V0dGluZ3Mgc3RyaW5ncyBhdmFpbGFibGUgaW4gdGhlIGZ1dHVyZVxuICAgIHRoaXMuY29kZU1pcnJvci5zZXRPcHRpb24ob3B0aW9uTmFtZSBhcyBhbnksIG5ld1ZhbHVlKTtcbiAgfVxuICBmb2N1c0NoYW5nZWQoZm9jdXNlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkKCk7XG4gICAgdGhpcy5pc0ZvY3VzZWQgPSBmb2N1c2VkO1xuICAgIHRoaXMuZm9jdXNDaGFuZ2UuZW1pdChmb2N1c2VkKTtcbiAgfVxuICBzY3JvbGxDaGFuZ2VkKGNtOiBFZGl0b3IpOiB2b2lkIHtcbiAgICB0aGlzLnNjcm9sbC5lbWl0KGNtLmdldFNjcm9sbEluZm8oKSk7XG4gIH1cbiAgY3Vyc29yQWN0aXZlKGNtOiBFZGl0b3IpOiB2b2lkIHtcbiAgICB0aGlzLmN1cnNvckFjdGl2aXR5LmVtaXQoY20pO1xuICB9XG4gIGRyb3BGaWxlcyhjbTogRWRpdG9yLCBlOiBEcmFnRXZlbnQpOiB2b2lkIHtcbiAgICB0aGlzLmRyb3AuZW1pdChbY20sIGVdKTtcbiAgfVxuICAvKiogSW1wbGVtZW50ZWQgYXMgcGFydCBvZiBDb250cm9sVmFsdWVBY2Nlc3Nvci4gKi9cbiAgd3JpdGVWYWx1ZSh2YWx1ZTogc3RyaW5nKTogdm9pZCB7XG4gICAgaWYgKHZhbHVlID09PSBudWxsIHx8IHZhbHVlID09PSB1bmRlZmluZWQpIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgaWYgKCF0aGlzLmNvZGVNaXJyb3IpIHtcbiAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgY29uc3QgY3VyID0gdGhpcy5jb2RlTWlycm9yLmdldFZhbHVlKCk7XG4gICAgaWYgKFxuICAgICAgdmFsdWUgIT09IGN1ciAmJlxuICAgICAgbm9ybWFsaXplTGluZUVuZGluZ3MoY3VyKSAhPT0gbm9ybWFsaXplTGluZUVuZGluZ3ModmFsdWUpXG4gICAgKSB7XG4gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgICBpZiAodGhpcy5wcmVzZXJ2ZVNjcm9sbFBvc2l0aW9uKSB7XG4gICAgICAgIGNvbnN0IHByZXZTY3JvbGxQb3NpdGlvbiA9IHRoaXMuY29kZU1pcnJvci5nZXRTY3JvbGxJbmZvKCk7XG4gICAgICAgIHRoaXMuY29kZU1pcnJvci5zZXRWYWx1ZSh0aGlzLnZhbHVlKTtcbiAgICAgICAgdGhpcy5jb2RlTWlycm9yLnNjcm9sbFRvKFxuICAgICAgICAgIHByZXZTY3JvbGxQb3NpdGlvbi5sZWZ0LFxuICAgICAgICAgIHByZXZTY3JvbGxQb3NpdGlvbi50b3AsXG4gICAgICAgICk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aGlzLmNvZGVNaXJyb3Iuc2V0VmFsdWUodGhpcy52YWx1ZSk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICovXG4gIHJlZ2lzdGVyT25DaGFuZ2UoZm46ICh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkKTogdm9pZCB7XG4gICAgdGhpcy5vbkNoYW5nZSA9IGZuO1xuICB9XG4gIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xuICByZWdpc3Rlck9uVG91Y2hlZChmbjogKCkgPT4gdm9pZCk6IHZvaWQge1xuICAgIHRoaXMub25Ub3VjaGVkID0gZm47XG4gIH1cbiAgLyoqIEltcGxlbWVudGVkIGFzIHBhcnQgb2YgQ29udHJvbFZhbHVlQWNjZXNzb3IuICovXG4gIHNldERpc2FibGVkU3RhdGUoaXNEaXNhYmxlZDogYm9vbGVhbik6IHZvaWQge1xuICAgIHRoaXMuZGlzYWJsZWQgPSBpc0Rpc2FibGVkO1xuICAgIHRoaXMuc2V0T3B0aW9uSWZDaGFuZ2VkKCdyZWFkT25seScsIHRoaXMuZGlzYWJsZWQpO1xuICB9XG4gIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xuICBwcml2YXRlIG9uQ2hhbmdlID0gKF86IGFueSkgPT4ge307XG4gIC8qKiBJbXBsZW1lbnRlZCBhcyBwYXJ0IG9mIENvbnRyb2xWYWx1ZUFjY2Vzc29yLiAqL1xuICBwcml2YXRlIG9uVG91Y2hlZCA9ICgpID0+IHt9O1xufVxuIl19
@@ -1,11 +0,0 @@
1
- import { NgModule } from '@angular/core';
2
- import { CodemirrorComponent } from './codemirror.component';
3
- export class CodemirrorModule {
4
- }
5
- CodemirrorModule.decorators = [
6
- { type: NgModule, args: [{
7
- exports: [CodemirrorComponent],
8
- declarations: [CodemirrorComponent],
9
- },] }
10
- ];
11
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY29kZW1pcnJvci5tb2R1bGUuanMiLCJzb3VyY2VSb290IjoiLi4vLi4vc3JjL2xpYi8iLCJzb3VyY2VzIjpbImNvZGVtaXJyb3IubW9kdWxlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxlQUFlLENBQUM7QUFFekMsT0FBTyxFQUFFLG1CQUFtQixFQUFFLE1BQU0sd0JBQXdCLENBQUM7QUFNN0QsTUFBTSxPQUFPLGdCQUFnQjs7O1lBSjVCLFFBQVEsU0FBQztnQkFDUixPQUFPLEVBQUUsQ0FBQyxtQkFBbUIsQ0FBQztnQkFDOUIsWUFBWSxFQUFFLENBQUMsbUJBQW1CLENBQUM7YUFDcEMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBOZ01vZHVsZSB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuXG5pbXBvcnQgeyBDb2RlbWlycm9yQ29tcG9uZW50IH0gZnJvbSAnLi9jb2RlbWlycm9yLmNvbXBvbmVudCc7XG5cbkBOZ01vZHVsZSh7XG4gIGV4cG9ydHM6IFtDb2RlbWlycm9yQ29tcG9uZW50XSxcbiAgZGVjbGFyYXRpb25zOiBbQ29kZW1pcnJvckNvbXBvbmVudF0sXG59KVxuZXhwb3J0IGNsYXNzIENvZGVtaXJyb3JNb2R1bGUge31cbiJdfQ==
@@ -1 +0,0 @@
1
- {"version":3,"file":"ctrl-ngx-codemirror.js","sources":["../../src/lib/codemirror.component.ts","../../src/lib/codemirror.module.ts","../../src/lib/ctrl-ngx-codemirror.ts"],"sourcesContent":["import {\n AfterViewInit,\n ChangeDetectionStrategy,\n Component,\n DoCheck,\n ElementRef,\n EventEmitter,\n forwardRef,\n Input,\n KeyValueDiffer,\n KeyValueDiffers,\n NgZone,\n OnDestroy,\n Output,\n ViewChild,\n} from '@angular/core';\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms';\nimport {\n Editor,\n EditorChangeLinkedList,\n EditorFromTextArea,\n ScrollInfo,\n} from 'codemirror';\n\nfunction normalizeLineEndings(str: string): string {\n if (!str) {\n return str;\n }\n return str.replace(/\\r\\n|\\r/g, '\\n');\n}\n\ndeclare var require: any;\ndeclare var CodeMirror: any;\n\n@Component({\n selector: 'ngx-codemirror',\n template: `\n <textarea\n [name]=\"name\"\n class=\"ngx-codemirror {{ className }}\"\n [class.ngx-codemirror--focused]=\"isFocused\"\n autocomplete=\"off\"\n [autofocus]=\"autoFocus\"\n #ref\n >\n </textarea>\n `,\n providers: [\n {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => CodemirrorComponent),\n multi: true,\n },\n ],\n preserveWhitespaces: false,\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class CodemirrorComponent\n implements AfterViewInit, OnDestroy, ControlValueAccessor, DoCheck {\n /* class applied to the created textarea */\n @Input() className = '';\n /* name applied to the created textarea */\n @Input() name = 'codemirror';\n /* autofocus setting applied to the created textarea */\n @Input() autoFocus = false;\n /**\n * set options for codemirror\n * @link http://codemirror.net/doc/manual.html#config\n */\n @Input()\n set options(value: { [key: string]: any }) {\n this._options = value;\n if (!this._differ && value) {\n this._differ = this._differs.find(value).create();\n }\n }\n /* preserve previous scroll position after updating value */\n @Input() preserveScrollPosition = false;\n /* called when the text cursor is moved */\n @Output() cursorActivity = new EventEmitter<Editor>();\n /* called when the editor is focused or loses focus */\n @Output() focusChange = new EventEmitter<boolean>();\n /* called when the editor is scrolled */\n // tslint:disable-next-line:no-output-native\n @Output() scroll = new EventEmitter<ScrollInfo>();\n /* called when file(s) are dropped */\n // tslint:disable-next-line:no-output-native\n @Output() drop = new EventEmitter<[Editor, DragEvent]>();\n @ViewChild('ref', { static: true }) ref!: ElementRef;\n value = '';\n disabled = false;\n isFocused = false;\n codeMirror?: EditorFromTextArea;\n /**\n * either global variable or required library\n */\n private _codeMirror: any;\n\n private _differ?: KeyValueDiffer<string, any>;\n private _options: any;\n\n constructor(private _differs: KeyValueDiffers, private _ngZone: NgZone) {}\n\n get codeMirrorGlobal(): any {\n if (this._codeMirror) {\n return this._codeMirror;\n }\n\n this._codeMirror = typeof CodeMirror !== 'undefined' ? CodeMirror : require('codemirror');\n return this._codeMirror;\n }\n\n ngAfterViewInit(): void {\n if (!this.ref) {\n return;\n }\n // in order to allow for universal rendering, we import Codemirror runtime with `require` to prevent node errors\n this._ngZone.runOutsideAngular(() => {\n this.codeMirror = this.codeMirrorGlobal.fromTextArea(\n this.ref.nativeElement,\n this._options,\n ) as EditorFromTextArea;\n this.codeMirror.on('cursorActivity', cm =>\n this._ngZone.run(() => this.cursorActive(cm)),\n );\n this.codeMirror.on('scroll', this.scrollChanged.bind(this));\n this.codeMirror.on('blur', () =>\n this._ngZone.run(() => this.focusChanged(false)),\n );\n this.codeMirror.on('focus', () =>\n this._ngZone.run(() => this.focusChanged(true)),\n );\n this.codeMirror.on(\n 'change',\n (cm: Editor, change: EditorChangeLinkedList) =>\n this._ngZone.run(() => this.codemirrorValueChanged(cm, change)),\n );\n this.codeMirror.on(\n 'drop',\n (cm: Editor, e: DragEvent) => {\n this._ngZone.run(() => this.dropFiles(cm, e));\n }\n );\n this.codeMirror.setValue(this.value);\n });\n }\n ngDoCheck(): void {\n if (!this._differ) {\n return;\n }\n // check options have not changed\n const changes = this._differ.diff(this._options);\n if (changes) {\n changes.forEachChangedItem(option =>\n this.setOptionIfChanged(option.key, option.currentValue),\n );\n changes.forEachAddedItem(option =>\n this.setOptionIfChanged(option.key, option.currentValue),\n );\n changes.forEachRemovedItem(option =>\n this.setOptionIfChanged(option.key, option.currentValue),\n );\n }\n }\n ngOnDestroy(): void {\n // is there a lighter-weight way to remove the cm instance?\n if (this.codeMirror) {\n this.codeMirror.toTextArea();\n }\n }\n codemirrorValueChanged(cm: Editor, change: EditorChangeLinkedList): void {\n if (change.origin !== 'setValue') {\n this.value = cm.getValue();\n this.onChange(this.value);\n }\n }\n setOptionIfChanged(optionName: string, newValue: any): void {\n if (!this.codeMirror) {\n return;\n }\n\n // cast to any to handle strictly typed option names\n // could possibly import settings strings available in the future\n this.codeMirror.setOption(optionName as any, newValue);\n }\n focusChanged(focused: boolean): void {\n this.onTouched();\n this.isFocused = focused;\n this.focusChange.emit(focused);\n }\n scrollChanged(cm: Editor): void {\n this.scroll.emit(cm.getScrollInfo());\n }\n cursorActive(cm: Editor): void {\n this.cursorActivity.emit(cm);\n }\n dropFiles(cm: Editor, e: DragEvent): void {\n this.drop.emit([cm, e]);\n }\n /** Implemented as part of ControlValueAccessor. */\n writeValue(value: string): void {\n if (value === null || value === undefined) {\n return;\n }\n if (!this.codeMirror) {\n this.value = value;\n return;\n }\n const cur = this.codeMirror.getValue();\n if (\n value !== cur &&\n normalizeLineEndings(cur) !== normalizeLineEndings(value)\n ) {\n this.value = value;\n if (this.preserveScrollPosition) {\n const prevScrollPosition = this.codeMirror.getScrollInfo();\n this.codeMirror.setValue(this.value);\n this.codeMirror.scrollTo(\n prevScrollPosition.left,\n prevScrollPosition.top,\n );\n } else {\n this.codeMirror.setValue(this.value);\n }\n }\n }\n\n /** Implemented as part of ControlValueAccessor. */\n registerOnChange(fn: (value: string) => void): void {\n this.onChange = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n registerOnTouched(fn: () => void): void {\n this.onTouched = fn;\n }\n /** Implemented as part of ControlValueAccessor. */\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled;\n this.setOptionIfChanged('readOnly', this.disabled);\n }\n /** Implemented as part of ControlValueAccessor. */\n private onChange = (_: any) => {};\n /** Implemented as part of ControlValueAccessor. */\n private onTouched = () => {};\n}\n","import { NgModule } from '@angular/core';\n\nimport { CodemirrorComponent } from './codemirror.component';\n\n@NgModule({\n exports: [CodemirrorComponent],\n declarations: [CodemirrorComponent],\n})\nexport class CodemirrorModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public_api';\n"],"names":[],"mappings":"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"}