@supersoniks/concorde 1.1.21 → 1.1.23

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.
@@ -56,14 +56,27 @@ let Submit = class Submit extends Subscriber(LitElement) {
56
56
  submit() {
57
57
  var _a, _b, _c, _d, _e;
58
58
  return __awaiter(this, void 0, void 0, function* () {
59
+ const formPublisher = PublisherManager.getInstance().get(this.getAncestorAttributeValue("formDataProvider"));
60
+ //
61
+ // Validation du formulaire
62
+ formPublisher.isFormValid = true;
63
+ formPublisher.invalidate();
64
+ if (!formPublisher.isFormValid.get())
65
+ return;
59
66
  this.publisher.disabled = true;
67
+ formPublisher.isFormValid;
68
+ //
69
+ //Recup données
60
70
  let method = ((_a = this.getAttribute("method")) === null || _a === void 0 ? void 0 : _a.toLocaleLowerCase()) || "post";
61
- let postData = PublisherManager.getInstance().get(this.getAncestorAttributeValue("formDataProvider")).get();
71
+ let postData = formPublisher.get();
72
+ delete postData.isFormValid;
62
73
  let headerData = PublisherManager.getInstance().get(this.getAncestorAttributeValue("headersDataProvider")).get();
63
74
  let result = null;
64
75
  let dataProvider = this.getAncestorAttributeValue("dataProvider");
65
76
  let endPoint = this.endPoint || dataProvider;
66
77
  Loader.show();
78
+ //
79
+ //envoi données
67
80
  switch (method) {
68
81
  case "put":
69
82
  result = yield ((_b = this.api) === null || _b === void 0 ? void 0 : _b.put(endPoint, postData, headerData));
@@ -46,6 +46,7 @@ declare const Checkbox_base: {
46
46
  };
47
47
  } & {
48
48
  new (...args: any[]): {
49
+ validateFormElement(): void;
49
50
  type: "number" | "search" | "file" | "button" | "password" | "url" | "color" | "hidden" | "time" | "image" | "text" | "reset" | "submit" | "month" | "week" | "checkbox" | "radio" | "range" | "tel" | "email" | "date" | "datetime-local";
50
51
  tabindex: string | null;
51
52
  autocomplete: "url" | "name" | "language" | "on" | "tel" | "email" | "honorific-prefix" | "given-name" | "additional-name" | "family-name" | "honorific-suffix" | "nickname" | "username" | "new-password" | "current-password" | "one-time-code" | "organization-title" | "organization" | "street-address" | "address-line1" | "address-line2" | "address-line3" | "address-level4" | "address-level3" | "address-level2" | "address-level1" | "country" | "country-name" | "postal-code" | "cc-name" | "cc-given-name" | "cc-additional-name" | "cc-family-name" | "cc-number" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-csc" | "cc-type" | "transaction-currency" | "transaction-amount" | "bday" | "bday-day" | "bday-month" | "bday-year" | "sex" | "tel-country-code" | "tel-national" | "tel-area-code" | "tel-local" | "tel-extension" | "impp" | "photo" | null;
@@ -145,7 +145,7 @@ export const formControl = css `
145
145
  --sc-input-border-color: var(--sc-danger);
146
146
  }
147
147
 
148
- :host :not([value=""]):not(:focus):invalid {
148
+ :host :not(select):not(textarea):not([value=""]):not(:focus):invalid {
149
149
  --sc-input-color: var(--sc-danger);
150
150
  }
151
151
 
@@ -1,6 +1,7 @@
1
1
  import { LitElement } from "lit";
2
2
  declare const Input_base: {
3
3
  new (...args: any[]): {
4
+ validateFormElement(): void;
4
5
  type: "number" | "search" | "file" | "button" | "password" | "url" | "color" | "hidden" | "time" | "image" | "text" | "reset" | "submit" | "month" | "week" | "checkbox" | "radio" | "range" | "tel" | "email" | "date" | "datetime-local";
5
6
  tabindex: string | null;
6
7
  autocomplete: "url" | "name" | "language" | "on" | "tel" | "email" | "honorific-prefix" | "given-name" | "additional-name" | "family-name" | "honorific-suffix" | "nickname" | "username" | "new-password" | "current-password" | "one-time-code" | "organization-title" | "organization" | "street-address" | "address-line1" | "address-line2" | "address-line3" | "address-level4" | "address-level3" | "address-level2" | "address-level1" | "country" | "country-name" | "postal-code" | "cc-name" | "cc-given-name" | "cc-additional-name" | "cc-family-name" | "cc-number" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-csc" | "cc-type" | "transaction-currency" | "transaction-amount" | "bday" | "bday-day" | "bday-month" | "bday-year" | "sex" | "tel-country-code" | "tel-national" | "tel-area-code" | "tel-local" | "tel-extension" | "impp" | "photo" | null;
@@ -34,6 +34,7 @@ export declare class Select extends Select_base {
34
34
  hasPrefix: true | false;
35
35
  updated(): void;
36
36
  onSlotChange(): void;
37
+ validateFormElement(): void;
37
38
  render(): import("lit-html").TemplateResult<1>;
38
39
  }
39
40
  export {};
@@ -92,6 +92,15 @@ let Select = class Select extends FormElement(Subscriber(LitElement)) {
92
92
  onSlotChange() {
93
93
  this.requestUpdate();
94
94
  }
95
+ validateFormElement() {
96
+ var _a;
97
+ const that = this;
98
+ const select = (_a = that.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector("select");
99
+ if (!select || select.checkValidity())
100
+ return;
101
+ this.getFormPublisher().isFormValid = false;
102
+ select.reportValidity();
103
+ }
95
104
  render() {
96
105
  const slotClasses = {
97
106
  "has-prefix": this.hasPrefix,
@@ -1,6 +1,7 @@
1
1
  import { LitElement } from "lit";
2
2
  declare const Textarea_base: {
3
3
  new (...args: any[]): {
4
+ validateFormElement(): void;
4
5
  type: "number" | "search" | "file" | "button" | "password" | "url" | "color" | "hidden" | "time" | "image" | "text" | "reset" | "submit" | "month" | "week" | "checkbox" | "radio" | "range" | "tel" | "email" | "date" | "datetime-local";
5
6
  tabindex: string | null;
6
7
  autocomplete: "url" | "name" | "language" | "on" | "tel" | "email" | "honorific-prefix" | "given-name" | "additional-name" | "family-name" | "honorific-suffix" | "nickname" | "username" | "new-password" | "current-password" | "one-time-code" | "organization-title" | "organization" | "street-address" | "address-line1" | "address-line2" | "address-line3" | "address-level4" | "address-level3" | "address-level2" | "address-level1" | "country" | "country-name" | "postal-code" | "cc-name" | "cc-given-name" | "cc-additional-name" | "cc-family-name" | "cc-number" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-csc" | "cc-type" | "transaction-currency" | "transaction-amount" | "bday" | "bday-day" | "bday-month" | "bday-year" | "sex" | "tel-country-code" | "tel-national" | "tel-area-code" | "tel-local" | "tel-extension" | "impp" | "photo" | null;
@@ -64,6 +65,7 @@ export declare class Textarea extends Textarea_base {
64
65
  slotClasses: {};
65
66
  updated(): void;
66
67
  onSlotChange(): void;
68
+ validateFormElement(): void;
67
69
  render(): import("lit-html").TemplateResult<1>;
68
70
  }
69
71
  export {};
@@ -47,6 +47,15 @@ let Textarea = class Textarea extends FormInput(FormElement(Subscriber(LitElemen
47
47
  onSlotChange() {
48
48
  this.requestUpdate();
49
49
  }
50
+ validateFormElement() {
51
+ var _a;
52
+ const that = this;
53
+ const textarea = (_a = that.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector("textarea");
54
+ if (!textarea || textarea.checkValidity())
55
+ return;
56
+ this.getFormPublisher().isFormValid = false;
57
+ textarea.reportValidity();
58
+ }
50
59
  render() {
51
60
  return html `
52
61
  <label for="form-element" class="${this.hasLabel ? "form-label" : "hidden"}"
@@ -57,6 +66,7 @@ let Textarea = class Textarea extends FormInput(FormElement(Subscriber(LitElemen
57
66
  <textarea
58
67
  @input=${this.handleChange}
59
68
  ?disabled=${this.disabled}
69
+ ?required=${this.required}
60
70
  autocomplete=${ifDefined(this.autocomplete)}
61
71
  autofocus=${ifDefined(this.autofocus)}
62
72
  rows=${ifDefined(this.rows)}
@@ -26,6 +26,7 @@ const Form = (superClass) => {
26
26
  this.required = null;
27
27
  this.onValueAssign = null;
28
28
  this.onFormValueAssign = null;
29
+ this.onFormDataInValidate = null;
29
30
  this.formDataProvider = "";
30
31
  /**
31
32
  * Le nom du champ avec des caractéristiques similaire à un input html classique.
@@ -42,6 +43,12 @@ const Form = (superClass) => {
42
43
  this.onFormValueAssign = (value) => {
43
44
  this.setFormValueFromPublisher(value);
44
45
  };
46
+ this.onFormDataInValidate = () => {
47
+ if (!this.getFormPublisher().isFormValid.get()) {
48
+ return;
49
+ }
50
+ this.validateFormElement();
51
+ };
45
52
  }
46
53
  get name() {
47
54
  return this._name;
@@ -49,6 +56,7 @@ const Form = (superClass) => {
49
56
  set name(value) {
50
57
  this._name = value;
51
58
  }
59
+ validateFormElement() { }
52
60
  updateDataValue() {
53
61
  if (this._name) {
54
62
  let formPublisher = this.getFormPublisher();
@@ -119,8 +127,10 @@ const Form = (superClass) => {
119
127
  this.publisher[this._name].onAssign(this.onValueAssign);
120
128
  }
121
129
  formPublisher = this.getFormPublisher();
122
- if (this._name && formPublisher)
130
+ if (this._name && formPublisher) {
123
131
  formPublisher[this._name].onAssign(this.onFormValueAssign);
132
+ formPublisher.onInvalidate((this.onFormDataInValidate));
133
+ }
124
134
  }
125
135
  handleChange(e) {
126
136
  this.value = e.target.value;
@@ -202,8 +212,10 @@ const Form = (superClass) => {
202
212
  if (this._name && this.publisher)
203
213
  this.publisher[this._name].offAssign(this.onValueAssign);
204
214
  let formPublisher = this.getFormPublisher();
205
- if (this._name && formPublisher)
215
+ if (this._name && formPublisher) {
206
216
  formPublisher[this._name].offAssign(this.onFormValueAssign);
217
+ formPublisher.offInvalidate(this.onFormDataInValidate);
218
+ }
207
219
  }
208
220
  }
209
221
  __decorate([
@@ -2,6 +2,7 @@ import { FormElementInterface } from "@supersoniks/concorde/core/mixins/FormElem
2
2
  declare type Constructor<T> = new (...args: any[]) => T;
3
3
  declare const Form: <T extends Constructor<FormElementInterface>>(superClass: T) => {
4
4
  new (...args: any[]): {
5
+ validateFormElement(): void;
5
6
  /**
6
7
  * Le type De l'input, comme en html cependant tous les types ne sont pas actuellements compatibles en raison du style en vigueur
7
8
  * On peut essayer text, date, color, email par exemple, mais pas radio/checkbox/range a priori
@@ -18,6 +18,15 @@ const Form = (superClass) => {
18
18
  this.autocomplete = null;
19
19
  args;
20
20
  }
21
+ validateFormElement() {
22
+ var _a;
23
+ const that = this;
24
+ const input = (_a = that.shadowRoot) === null || _a === void 0 ? void 0 : _a.querySelector("input");
25
+ if (!input || input.checkValidity())
26
+ return;
27
+ this.getFormPublisher().isFormValid = false;
28
+ input.reportValidity();
29
+ }
21
30
  }
22
31
  __decorate([
23
32
  property({ type: String })
@@ -398,7 +398,7 @@ export default class Publisher extends PublisherProxy {
398
398
  * Autres propriétés classiques d'un objet implémentées par le proxy
399
399
  */
400
400
  deleteProperty: function (oTarget, sKey) {
401
- that._proxies_.get(sKey).set(null);
401
+ // that._proxies_.get(sKey).set(null);
402
402
  that._publishDynamicFilling_(sKey, null);
403
403
  that._proxies_.delete(sKey);
404
404
  return delete that._value_[sKey];
package/mixins.d.ts ADDED
@@ -0,0 +1,133 @@
1
+ export declare const Fetcher: <T extends new (...args: any[]) => mySubscriber.SubscriberInterface>(superClass: T) => {
2
+ new (...args: any[]): {
3
+ api: import("./core/utils/api").default | null;
4
+ key: String;
5
+ isFirstLoad: boolean;
6
+ isLoading: boolean;
7
+ iObserver: IntersectionObserver | null;
8
+ isDefaultLoaderEnabled: boolean;
9
+ isFetchEnabled: boolean;
10
+ _endPoint: string;
11
+ endPoint: string;
12
+ _fetchData(): Promise<void>;
13
+ onInvalidate: any;
14
+ disconnectedCallback(): void;
15
+ connectedCallback(): void;
16
+ firstUpdated(): void;
17
+ onIntersection(entries: IntersectionObserverEntry[]): void;
18
+ props: any;
19
+ isConnected: boolean;
20
+ getAncestorAttributeValue(attributeName: string): string;
21
+ hasAncestorAttribute(attributeName: string): boolean;
22
+ querySelectorAll(selector: string): NodeListOf<Element>;
23
+ publisher: any;
24
+ dataProvider: string | null;
25
+ noShadowDom: string | null;
26
+ debug: HTMLElement | null;
27
+ defferedDebug: boolean | null;
28
+ dispatchEvent(event: Event): void;
29
+ setAttribute(name: string, value: string): void;
30
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void;
31
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions | undefined): void;
32
+ removeAttribute(name: string): void;
33
+ initPublisher(): void;
34
+ getApiConfiguration(): import("./core/utils/api").APIConfiguration;
35
+ requestUpdate(): void;
36
+ getAttribute(name: string): string;
37
+ hasAttribute(attributeName: String): boolean;
38
+ };
39
+ } & T;
40
+ export declare const FormCheckable: <T extends new (...args: any[]) => myFormElement.FormElementInterface>(superClass: T) => {
41
+ new (...args: any[]): {
42
+ _value: string | null;
43
+ value: string | null;
44
+ _name: string;
45
+ name: string;
46
+ unique: true | null;
47
+ radio: true | null;
48
+ _checked: true | null;
49
+ checked: true | null;
50
+ setCheckedValue(checked: true | null): void;
51
+ handleChange(): void;
52
+ getValueForFormPublisher(): any;
53
+ setFormValueFromPublisher(value: any): void;
54
+ initPublisher(): void;
55
+ getFormPublisher(): any;
56
+ updateDataValue(): void;
57
+ error: true | null;
58
+ autofocus: true | null;
59
+ disabled: true | null;
60
+ required: true | null;
61
+ formDataProvider: string;
62
+ props: any;
63
+ isConnected: boolean;
64
+ getAncestorAttributeValue(attributeName: string): string;
65
+ hasAncestorAttribute(attributeName: string): boolean;
66
+ querySelectorAll(selector: string): NodeListOf<Element>;
67
+ publisher: any;
68
+ dataProvider: string | null;
69
+ noShadowDom: string | null;
70
+ debug: HTMLElement | null;
71
+ defferedDebug: boolean | null;
72
+ dispatchEvent(event: Event): void;
73
+ setAttribute(name: string, value: string): void;
74
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void;
75
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions | undefined): void;
76
+ removeAttribute(name: string): void;
77
+ getApiConfiguration(): import("./core/utils/api").APIConfiguration;
78
+ connectedCallback(): void;
79
+ requestUpdate(): void;
80
+ getAttribute(name: string): string;
81
+ hasAttribute(attributeName: String): boolean;
82
+ disconnectedCallback(): void;
83
+ };
84
+ } & T;
85
+ import * as myFormElement from "./core/mixins/FormElement";
86
+ export declare const FormElement: <T extends new (...args: any[]) => mySubscriber.SubscriberInterface>(superClass: T) => (new (...args: any[]) => myFormElement.FormElementInterface) & T;
87
+ export declare const FormInput: <T extends new (...args: any[]) => myFormElement.FormElementInterface>(superClass: T) => {
88
+ new (...args: any[]): {
89
+ validateFormElement(): void;
90
+ type: "number" | "search" | "file" | "button" | "password" | "url" | "color" | "hidden" | "time" | "image" | "text" | "reset" | "submit" | "month" | "week" | "checkbox" | "radio" | "range" | "tel" | "email" | "date" | "datetime-local";
91
+ tabindex: string | null;
92
+ autocomplete: "url" | "name" | "language" | "on" | "tel" | "email" | "honorific-prefix" | "given-name" | "additional-name" | "family-name" | "honorific-suffix" | "nickname" | "username" | "new-password" | "current-password" | "one-time-code" | "organization-title" | "organization" | "street-address" | "address-line1" | "address-line2" | "address-line3" | "address-level4" | "address-level3" | "address-level2" | "address-level1" | "country" | "country-name" | "postal-code" | "cc-name" | "cc-given-name" | "cc-additional-name" | "cc-family-name" | "cc-number" | "cc-exp" | "cc-exp-month" | "cc-exp-year" | "cc-csc" | "cc-type" | "transaction-currency" | "transaction-amount" | "bday" | "bday-day" | "bday-month" | "bday-year" | "sex" | "tel-country-code" | "tel-national" | "tel-area-code" | "tel-local" | "tel-extension" | "impp" | "photo" | null;
93
+ getFormPublisher(): any;
94
+ updateDataValue(): void;
95
+ handleChange(e?: any): void;
96
+ getValueForFormPublisher(): any;
97
+ error: true | null;
98
+ autofocus: true | null;
99
+ disabled: true | null;
100
+ required: true | null;
101
+ formDataProvider: string;
102
+ _value: any;
103
+ value: any;
104
+ _name: string;
105
+ name: string;
106
+ props: any;
107
+ isConnected: boolean;
108
+ getAncestorAttributeValue(attributeName: string): string;
109
+ hasAncestorAttribute(attributeName: string): boolean;
110
+ querySelectorAll(selector: string): NodeListOf<Element>;
111
+ publisher: any;
112
+ dataProvider: string | null;
113
+ noShadowDom: string | null;
114
+ debug: HTMLElement | null;
115
+ defferedDebug: boolean | null;
116
+ dispatchEvent(event: Event): void;
117
+ setAttribute(name: string, value: string): void;
118
+ addEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | AddEventListenerOptions | undefined): void;
119
+ removeEventListener(type: string, listener: EventListenerOrEventListenerObject, options?: boolean | EventListenerOptions | undefined): void;
120
+ removeAttribute(name: string): void;
121
+ initPublisher(): void;
122
+ getApiConfiguration(): import("./core/utils/api").APIConfiguration;
123
+ connectedCallback(): void;
124
+ requestUpdate(): void;
125
+ getAttribute(name: string): string;
126
+ hasAttribute(attributeName: String): boolean;
127
+ disconnectedCallback(): void;
128
+ };
129
+ } & T;
130
+ import * as mySubscriber from "./core/mixins/Subscriber";
131
+ export declare const Subscriber: <T extends new (...args: any[]) => import("lit").LitElement>(superClass: T) => (new (...args: any[]) => mySubscriber.SubscriberInterface) & T;
132
+ import * as myTemplatesContainer from "./core/mixins/TemplatesContainer";
133
+ export declare const TemplatesContainer: <T extends new (...args: any[]) => import("lit").LitElement>(superClass: T) => (new (...args: any[]) => myTemplatesContainer.TemplatesContainerInterface) & T;
package/mixins.js ADDED
@@ -0,0 +1,23 @@
1
+ //
2
+ import * as myFetcher from "./core/mixins/Fetcher";
3
+ export const Fetcher = myFetcher.default;
4
+ import * as myFormCheckable from "./core/mixins/FormCheckable";
5
+ export const FormCheckable = myFormCheckable.default;
6
+ import * as myFormElement from "./core/mixins/FormElement";
7
+ export const FormElement = myFormElement.default;
8
+ import * as myFormInput from "./core/mixins/FormInput";
9
+ export const FormInput = myFormInput.default;
10
+ import * as mySubscriber from "./core/mixins/Subscriber";
11
+ export const Subscriber = mySubscriber.default;
12
+ import * as myTemplatesContainer from "./core/mixins/TemplatesContainer";
13
+ export const TemplatesContainer = myTemplatesContainer.default;
14
+ let win = window;
15
+ win["concorde-mixins"] = win["concorde-mixins"] || {};
16
+ win["concorde-mixins"] = {
17
+ Fetcher: Fetcher,
18
+ FormCheckable: FormCheckable,
19
+ FormElement: FormElement,
20
+ FormInput: FormInput,
21
+ Subscriber: Subscriber,
22
+ TemplatesContainer: TemplatesContainer
23
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@supersoniks/concorde",
3
- "version": "1.1.21",
3
+ "version": "1.1.23",
4
4
  "customElements": "custom-elements.json",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
package/utils.d.ts ADDED
@@ -0,0 +1,17 @@
1
+ import * as myArrays from "./core/utils/Arrays";
2
+ export declare const Arrays: typeof myArrays.default;
3
+ import * as myDataBindObserver from "./core/utils/DataBindObserver";
4
+ export declare const DataBindObserver: typeof myDataBindObserver.default;
5
+ import * as myFormat from "./core/utils/Format";
6
+ export declare const Format: typeof myFormat.default;
7
+ import * as myHTML from "./core/utils/HTML";
8
+ export declare const HTML: typeof myHTML.default;
9
+ import * as myLocationHandler from "./core/utils/LocationHandler";
10
+ export declare const LocationHandler: typeof myLocationHandler.default;
11
+ import * as myObjects from "./core/utils/Objects";
12
+ export declare const Objects: typeof myObjects.default;
13
+ import * as myPublisherProxy from "./core/utils/PublisherProxy.mjs";
14
+ export declare const PublisherProxy: typeof myPublisherProxy.default;
15
+ export declare const PublisherManager: typeof myPublisherProxy.PublisherManager;
16
+ import * as myApi from "./core/utils/api";
17
+ export declare const api: typeof myApi.default;
package/utils.js ADDED
@@ -0,0 +1,32 @@
1
+ //
2
+ //
3
+ import * as myArrays from "./core/utils/Arrays";
4
+ export const Arrays = myArrays.default;
5
+ import * as myDataBindObserver from "./core/utils/DataBindObserver";
6
+ export const DataBindObserver = myDataBindObserver.default;
7
+ import * as myFormat from "./core/utils/Format";
8
+ export const Format = myFormat.default;
9
+ import * as myHTML from "./core/utils/HTML";
10
+ export const HTML = myHTML.default;
11
+ import * as myLocationHandler from "./core/utils/LocationHandler";
12
+ export const LocationHandler = myLocationHandler.default;
13
+ import * as myObjects from "./core/utils/Objects";
14
+ export const Objects = myObjects.default;
15
+ import * as myPublisherProxy from "./core/utils/PublisherProxy.mjs";
16
+ export const PublisherProxy = myPublisherProxy.default;
17
+ export const PublisherManager = myPublisherProxy.PublisherManager;
18
+ import * as myApi from "./core/utils/api";
19
+ export const api = myApi.default;
20
+ let win = window;
21
+ win["concorde-utils"] = win["concorde-utils"] || {};
22
+ win["concorde-utils"] = {
23
+ Arrays: Arrays,
24
+ DataBindObserver: DataBindObserver,
25
+ Format: Format,
26
+ HTML: HTML,
27
+ LocationHandler: LocationHandler,
28
+ Objects: Objects,
29
+ PublisherProxy: PublisherProxy,
30
+ PublisherManager: PublisherManager,
31
+ api: api
32
+ };