@oila/0account 3.4.8 → 3.4.9
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/dist/cjs/index-ef57218a.js +1948 -0
- package/dist/cjs/index-ef57218a.js.map +1 -0
- package/dist/cjs/index.cjs.js +4 -0
- package/dist/cjs/index.cjs.js.map +1 -0
- package/dist/cjs/loader.cjs.js +15 -0
- package/dist/cjs/loader.cjs.js.map +1 -0
- package/dist/cjs/qr-code_2.cjs.entry.js +1550 -0
- package/dist/cjs/qr-code_2.cjs.entry.js.map +1 -0
- package/dist/cjs/zero-account.cjs.js +25 -0
- package/dist/cjs/zero-account.cjs.js.map +1 -0
- package/dist/collection/collection-manifest.json +13 -0
- package/dist/collection/components/zero-account/enums.js +18 -0
- package/dist/collection/components/zero-account/enums.js.map +1 -0
- package/dist/collection/components/zero-account/logo.js +6 -0
- package/dist/collection/components/zero-account/logo.js.map +1 -0
- package/dist/collection/components/zero-account/qrcode.js +111 -0
- package/dist/collection/components/zero-account/qrcode.js.map +1 -0
- package/dist/collection/components/zero-account/websocket.js +176 -0
- package/dist/collection/components/zero-account/websocket.js.map +1 -0
- package/dist/collection/components/zero-account/zero-account.css +294 -0
- package/dist/collection/components/zero-account/zero-account.e2e.js +26 -0
- package/dist/collection/components/zero-account/zero-account.e2e.js.map +1 -0
- package/dist/collection/components/zero-account/zero-account.js +402 -0
- package/dist/collection/components/zero-account/zero-account.js.map +1 -0
- package/dist/collection/components/zero-account/zero-account.spec.js +35 -0
- package/dist/collection/components/zero-account/zero-account.spec.js.map +1 -0
- package/dist/collection/index.js +2 -0
- package/dist/collection/index.js.map +1 -0
- package/dist/{zero-account/qr-code.entry.js → collection/utils/qrcode/qrcode.js} +3 -35
- package/dist/collection/utils/request.js +45 -0
- package/dist/collection/utils/request.js.map +1 -0
- package/dist/collection/utils/url.js +43 -0
- package/dist/collection/utils/utils.js +16 -0
- package/dist/collection/utils/utils.js.map +1 -0
- package/dist/collection/utils/utils.spec.js +10 -0
- package/dist/collection/utils/utils.spec.js.map +1 -0
- package/dist/components/index.d.ts +6 -0
- package/dist/components/index.js +3 -0
- package/dist/components/index.js.map +1 -0
- package/dist/components/qr-code.d.ts +2 -2
- package/dist/components/qr-code.js +8 -0
- package/dist/components/qr-code.js.map +1 -0
- package/dist/components/qrcode.js +1073 -0
- package/dist/components/qrcode.js.map +1 -0
- package/dist/components/zero-account.d.ts +2 -2
- package/dist/components/zero-account.js +535 -0
- package/dist/components/zero-account.js.map +1 -0
- package/dist/esm/index-798be1d4.js +1919 -0
- package/dist/esm/index-798be1d4.js.map +1 -0
- package/dist/esm/index.js +3 -0
- package/dist/esm/index.js.map +1 -0
- package/dist/esm/loader.js +11 -0
- package/dist/esm/loader.js.map +1 -0
- package/dist/esm/polyfills/core-js.js +11 -0
- package/dist/esm/polyfills/dom.js +79 -0
- package/dist/esm/polyfills/es5-html-element.js +1 -0
- package/dist/esm/polyfills/index.js +34 -0
- package/dist/esm/polyfills/system.js +6 -0
- package/dist/esm/qr-code_2.entry.js +1545 -0
- package/dist/esm/qr-code_2.entry.js.map +1 -0
- package/dist/esm/zero-account.js +20 -0
- package/dist/esm/zero-account.js.map +1 -0
- package/dist/index.cjs.js +1 -0
- package/dist/index.js +1 -0
- package/dist/types/components/zero-account/enums.d.ts +8 -8
- package/dist/types/components/zero-account/logo.d.ts +2 -2
- package/dist/types/components/zero-account/qrcode.d.ts +5 -5
- package/dist/types/components/zero-account/websocket.d.ts +27 -25
- package/dist/types/components/zero-account/zero-account.d.ts +39 -39
- package/dist/types/stencil-public-runtime.d.ts +46 -5
- package/dist/types/utils/request.d.ts +5 -5
- package/dist/types/utils/utils.d.ts +3 -3
- package/dist/zero-account/index.esm.js +0 -1
- package/dist/zero-account/index.esm.js.map +1 -1
- package/dist/zero-account/p-3b6bbcf5.js +3 -0
- package/dist/zero-account/p-3b6bbcf5.js.map +1 -0
- package/dist/zero-account/p-b6f591cf.entry.js +2 -0
- package/dist/zero-account/p-b6f591cf.entry.js.map +1 -0
- package/dist/zero-account/zero-account.esm.js +1 -64
- package/dist/zero-account/zero-account.esm.js.map +1 -1
- package/loader/index.d.ts +1 -1
- package/package.json +10 -10
- package/dist/zero-account/app-globals-0f993ce5.js +0 -5
- package/dist/zero-account/app-globals-0f993ce5.js.map +0 -1
- package/dist/zero-account/enums-816340c2.js +0 -21
- package/dist/zero-account/enums-816340c2.js.map +0 -1
- package/dist/zero-account/enums-e7827156.js +0 -21
- package/dist/zero-account/enums-e7827156.js.map +0 -1
- package/dist/zero-account/index-57856b47.js +0 -3380
- package/dist/zero-account/index-57856b47.js.map +0 -1
- package/dist/zero-account/qr-code.entry.js.map +0 -1
- package/dist/zero-account/shadow-css-8a6ccf47.js +0 -389
- package/dist/zero-account/shadow-css-8a6ccf47.js.map +0 -1
- package/dist/zero-account/zero-account.entry.js +0 -1994
- package/dist/zero-account/zero-account.entry.js.map +0 -1
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import qr from "../../utils/qrcode/qrcode";
|
|
2
|
+
import { h } from "@stencil/core";
|
|
3
|
+
import { ErrorCorrectionLevel } from "./enums";
|
|
4
|
+
const QRC = qr.QrCode;
|
|
5
|
+
export class QRCode {
|
|
6
|
+
constructor() {
|
|
7
|
+
this.url = undefined;
|
|
8
|
+
this.level = ErrorCorrectionLevel.M;
|
|
9
|
+
this.class = '';
|
|
10
|
+
this.color = 'black';
|
|
11
|
+
}
|
|
12
|
+
render() {
|
|
13
|
+
const getEcc = (ecc) => {
|
|
14
|
+
ecc = ecc.toUpperCase();
|
|
15
|
+
if (ecc === 'L')
|
|
16
|
+
return QRC.Ecc.LOW;
|
|
17
|
+
if (ecc === 'M')
|
|
18
|
+
return QRC.Ecc.MEDIUM;
|
|
19
|
+
if (ecc === 'Q')
|
|
20
|
+
return QRC.Ecc.QUARTILE;
|
|
21
|
+
return QRC.Ecc.HIGH;
|
|
22
|
+
};
|
|
23
|
+
const ecc = getEcc(this.level);
|
|
24
|
+
const qr = QRC.encodeText(this.url, ecc);
|
|
25
|
+
const qrcode = qr.svgObject();
|
|
26
|
+
return (h("svg", { class: this.class, viewBox: `0 0 ${qrcode.size} ${qrcode.size}` }, h("path", { d: qrcode.path, fill: this.color })));
|
|
27
|
+
}
|
|
28
|
+
static get is() { return "qr-code"; }
|
|
29
|
+
static get properties() {
|
|
30
|
+
return {
|
|
31
|
+
"url": {
|
|
32
|
+
"type": "string",
|
|
33
|
+
"mutable": false,
|
|
34
|
+
"complexType": {
|
|
35
|
+
"original": "string",
|
|
36
|
+
"resolved": "string",
|
|
37
|
+
"references": {}
|
|
38
|
+
},
|
|
39
|
+
"required": true,
|
|
40
|
+
"optional": false,
|
|
41
|
+
"docs": {
|
|
42
|
+
"tags": [],
|
|
43
|
+
"text": ""
|
|
44
|
+
},
|
|
45
|
+
"attribute": "url",
|
|
46
|
+
"reflect": false
|
|
47
|
+
},
|
|
48
|
+
"level": {
|
|
49
|
+
"type": "string",
|
|
50
|
+
"mutable": false,
|
|
51
|
+
"complexType": {
|
|
52
|
+
"original": "ErrorCorrectionLevel",
|
|
53
|
+
"resolved": "ErrorCorrectionLevel.H | ErrorCorrectionLevel.L | ErrorCorrectionLevel.M | ErrorCorrectionLevel.Q",
|
|
54
|
+
"references": {
|
|
55
|
+
"ErrorCorrectionLevel": {
|
|
56
|
+
"location": "import",
|
|
57
|
+
"path": "./enums",
|
|
58
|
+
"id": "src/components/zero-account/enums.ts::ErrorCorrectionLevel"
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
},
|
|
62
|
+
"required": false,
|
|
63
|
+
"optional": true,
|
|
64
|
+
"docs": {
|
|
65
|
+
"tags": [],
|
|
66
|
+
"text": ""
|
|
67
|
+
},
|
|
68
|
+
"attribute": "level",
|
|
69
|
+
"reflect": false,
|
|
70
|
+
"defaultValue": "ErrorCorrectionLevel.M"
|
|
71
|
+
},
|
|
72
|
+
"class": {
|
|
73
|
+
"type": "string",
|
|
74
|
+
"mutable": false,
|
|
75
|
+
"complexType": {
|
|
76
|
+
"original": "string",
|
|
77
|
+
"resolved": "string",
|
|
78
|
+
"references": {}
|
|
79
|
+
},
|
|
80
|
+
"required": false,
|
|
81
|
+
"optional": true,
|
|
82
|
+
"docs": {
|
|
83
|
+
"tags": [],
|
|
84
|
+
"text": ""
|
|
85
|
+
},
|
|
86
|
+
"attribute": "class",
|
|
87
|
+
"reflect": false,
|
|
88
|
+
"defaultValue": "''"
|
|
89
|
+
},
|
|
90
|
+
"color": {
|
|
91
|
+
"type": "string",
|
|
92
|
+
"mutable": false,
|
|
93
|
+
"complexType": {
|
|
94
|
+
"original": "string",
|
|
95
|
+
"resolved": "string",
|
|
96
|
+
"references": {}
|
|
97
|
+
},
|
|
98
|
+
"required": false,
|
|
99
|
+
"optional": true,
|
|
100
|
+
"docs": {
|
|
101
|
+
"tags": [],
|
|
102
|
+
"text": ""
|
|
103
|
+
},
|
|
104
|
+
"attribute": "color",
|
|
105
|
+
"reflect": false,
|
|
106
|
+
"defaultValue": "'black'"
|
|
107
|
+
}
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=qrcode.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"qrcode.js","sourceRoot":"","sources":["../../../src/components/zero-account/qrcode.tsx"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,2BAA2B,CAAC;AAC3C,OAAO,EAAE,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,MAAM,eAAe,CAAC;AACnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,SAAS,CAAC;AAE/C,MAAM,GAAG,GAAG,EAAE,CAAC,MAAM,CAAC;AAKtB,MAAM,OAAO,MAAM;;;qBAEsB,oBAAoB,CAAC,CAAC;qBACpC,EAAE;qBACF,OAAO;;IAEhC,MAAM;QACJ,MAAM,MAAM,GAAG,CAAC,GAAW,EAAE,EAAE;YAC7B,GAAG,GAAG,GAAG,CAAC,WAAW,EAAE,CAAC;YACxB,IAAI,GAAG,KAAK,GAAG;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,GAAG,CAAC;YACpC,IAAI,GAAG,KAAK,GAAG;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;YACvC,IAAI,GAAG,KAAK,GAAG;gBAAE,OAAO,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC;YACzC,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC;QACtB,CAAC,CAAC;QAEF,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAE/B,MAAM,EAAE,GAAG,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;QACzC,MAAM,MAAM,GAAG,EAAE,CAAC,SAAS,EAAE,CAAC;QAE9B,OAAO,CACL,WAAK,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;YAClE,YAAM,CAAC,EAAE,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,GAAI,CACtC,CACP,CAAC;IACJ,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CACF","sourcesContent":["import qr from '../../utils/qrcode/qrcode';\nimport { Component, h, Prop } from '@stencil/core';\nimport { ErrorCorrectionLevel } from './enums';\n\nconst QRC = qr.QrCode;\n\n@Component({\n tag: 'qr-code',\n})\nexport class QRCode {\n @Prop() url!: string;\n @Prop() level?: ErrorCorrectionLevel = ErrorCorrectionLevel.M;\n @Prop() class?: string = '';\n @Prop() color?: string = 'black';\n\n render() {\n const getEcc = (ecc: string) => {\n ecc = ecc.toUpperCase();\n if (ecc === 'L') return QRC.Ecc.LOW;\n if (ecc === 'M') return QRC.Ecc.MEDIUM;\n if (ecc === 'Q') return QRC.Ecc.QUARTILE;\n return QRC.Ecc.HIGH;\n };\n\n const ecc = getEcc(this.level);\n\n const qr = QRC.encodeText(this.url, ecc);\n const qrcode = qr.svgObject();\n\n return (\n <svg class={this.class} viewBox={`0 0 ${qrcode.size} ${qrcode.size}`}>\n <path d={qrcode.path} fill={this.color} />\n </svg>\n );\n }\n}\n"]}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import { Environment } from "./enums";
|
|
2
|
+
import http from "../../utils/request";
|
|
3
|
+
const DEFAULT_CALLBACK_URL = window.location.origin + '/zero/auth';
|
|
4
|
+
const API_URL = 'wss://ws.0account.com/ws';
|
|
5
|
+
const API_URL_STAGING = 'wss://staging.ws.0account.com/ws';
|
|
6
|
+
const PREFIX = '0account';
|
|
7
|
+
const SESSION_ID = 'session-id';
|
|
8
|
+
const SESSION_TOKEN = 'session-token';
|
|
9
|
+
const fromWidgetUUIDUpdated = 'from-widget-uuid-updated';
|
|
10
|
+
// const fromWidgetAuthenticationStarted = 'from-widget-authentication-started';
|
|
11
|
+
const fromWidgetEnsureSession = 'from-widget-ensure-session';
|
|
12
|
+
const toWidgetLogout = 'to-widget-logout';
|
|
13
|
+
const toWidgetApproved = 'to-widget-approved';
|
|
14
|
+
const toAnyError = 'to-any-error';
|
|
15
|
+
// CustomEvents
|
|
16
|
+
const zeroLogout = '0account-logout';
|
|
17
|
+
const zeroAuthenticated = '0account-authenticated';
|
|
18
|
+
// const zeroAuthenticationFailed = '0account-authentication-failed';
|
|
19
|
+
function debounce(func, timeout = 300) {
|
|
20
|
+
let timer;
|
|
21
|
+
return (...args) => {
|
|
22
|
+
clearTimeout(timer);
|
|
23
|
+
timer = setTimeout(() => {
|
|
24
|
+
func.apply(this, args);
|
|
25
|
+
}, timeout);
|
|
26
|
+
};
|
|
27
|
+
}
|
|
28
|
+
export class WS {
|
|
29
|
+
constructor(appId, opts) {
|
|
30
|
+
this.wsURL = API_URL;
|
|
31
|
+
this.callbackURL = DEFAULT_CALLBACK_URL;
|
|
32
|
+
if (!opts.env)
|
|
33
|
+
opts.env = Environment.production;
|
|
34
|
+
this.appId = appId;
|
|
35
|
+
this.uaParser = opts.uaParser;
|
|
36
|
+
this.callbackURL = opts.callbackURL;
|
|
37
|
+
this.updateInterval = opts.updateInterval;
|
|
38
|
+
this.enableWithCredentials = opts.enableWithCredentials;
|
|
39
|
+
this.log = opts.log;
|
|
40
|
+
if (opts.env !== Environment.production)
|
|
41
|
+
this.wsURL = API_URL_STAGING;
|
|
42
|
+
this.init();
|
|
43
|
+
}
|
|
44
|
+
deviceInfo() {
|
|
45
|
+
return {
|
|
46
|
+
appId: this.appId,
|
|
47
|
+
browser: this.uaParser.getBrowser().withFeatureCheck().name,
|
|
48
|
+
os: this.uaParser.getOS().withFeatureCheck().name,
|
|
49
|
+
// TODO: handle these on backend:
|
|
50
|
+
// device: `${this.uaParser.getDevice().vendor} ${this.uaParser.getDevice().model}`,
|
|
51
|
+
// all: this.uaParser.getResult()
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
reinit() {
|
|
55
|
+
const retry = debounce(this.init.bind(this), 1000);
|
|
56
|
+
retry();
|
|
57
|
+
}
|
|
58
|
+
init() {
|
|
59
|
+
const onopen = (_) => {
|
|
60
|
+
this.send(fromWidgetEnsureSession, this.deviceInfo());
|
|
61
|
+
};
|
|
62
|
+
const onmessage = (event) => {
|
|
63
|
+
try {
|
|
64
|
+
const data = JSON.parse(event.data);
|
|
65
|
+
this.handleMessage(data);
|
|
66
|
+
}
|
|
67
|
+
catch (e) {
|
|
68
|
+
this.log(e);
|
|
69
|
+
}
|
|
70
|
+
};
|
|
71
|
+
const onerror = (_) => {
|
|
72
|
+
if (this.socket && (this.socket.readyState !== WebSocket.CLOSED
|
|
73
|
+
&& this.socket.readyState !== WebSocket.CLOSING)) {
|
|
74
|
+
this.socket.close();
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
const onclose = (_) => {
|
|
78
|
+
if (this.socket) {
|
|
79
|
+
this.socket.removeEventListener('open', onopen);
|
|
80
|
+
this.socket.removeEventListener('message', onmessage);
|
|
81
|
+
this.socket.removeEventListener('error', onerror);
|
|
82
|
+
this.socket.removeEventListener('close', onclose);
|
|
83
|
+
delete this.socket;
|
|
84
|
+
}
|
|
85
|
+
this.reinit();
|
|
86
|
+
};
|
|
87
|
+
if (this.socket) {
|
|
88
|
+
this.socket.removeEventListener('open', onopen);
|
|
89
|
+
this.socket.removeEventListener('message', onmessage);
|
|
90
|
+
this.socket.removeEventListener('error', onerror);
|
|
91
|
+
this.socket.removeEventListener('close', onclose);
|
|
92
|
+
}
|
|
93
|
+
this.socket = new WebSocket(this.wsURL);
|
|
94
|
+
this.socket.addEventListener('open', onopen);
|
|
95
|
+
this.socket.addEventListener('message', onmessage);
|
|
96
|
+
this.socket.addEventListener('error', onerror);
|
|
97
|
+
this.socket.addEventListener('close', onclose);
|
|
98
|
+
}
|
|
99
|
+
updateUUID(uuid) {
|
|
100
|
+
this.uuid = uuid;
|
|
101
|
+
this.send(fromWidgetUUIDUpdated, this.deviceInfo());
|
|
102
|
+
}
|
|
103
|
+
send(action, data) {
|
|
104
|
+
if (!this.socket || !this.socket.readyState || this.socket.readyState !== WebSocket.OPEN) {
|
|
105
|
+
const retry = debounce(this.send.bind(this), 1000);
|
|
106
|
+
return retry();
|
|
107
|
+
}
|
|
108
|
+
const msg = {
|
|
109
|
+
action: action,
|
|
110
|
+
timeout: `${this.updateInterval}ms`,
|
|
111
|
+
uuid: this.uuid,
|
|
112
|
+
appId: `${this.appId}`,
|
|
113
|
+
message: {},
|
|
114
|
+
};
|
|
115
|
+
if (action === fromWidgetEnsureSession) {
|
|
116
|
+
const sessionId = localStorage.getItem(`${PREFIX}_${SESSION_ID}`);
|
|
117
|
+
const sessionToken = localStorage.getItem(`${PREFIX}_${SESSION_TOKEN}`);
|
|
118
|
+
if (!sessionId || !sessionToken)
|
|
119
|
+
return;
|
|
120
|
+
msg.sessionId = sessionId;
|
|
121
|
+
msg.sessionToken = sessionToken;
|
|
122
|
+
}
|
|
123
|
+
if (data)
|
|
124
|
+
msg.message = data;
|
|
125
|
+
this.socket.send(JSON.stringify(msg));
|
|
126
|
+
}
|
|
127
|
+
onZeroAuth() {
|
|
128
|
+
if (this.request)
|
|
129
|
+
this.request.abort();
|
|
130
|
+
this.request = http.send(this.callbackURL, {
|
|
131
|
+
enableWithCredentials: this.enableWithCredentials,
|
|
132
|
+
headers: {
|
|
133
|
+
'x-0account-uuid': this.uuid,
|
|
134
|
+
'x-0account-auth': 'true',
|
|
135
|
+
},
|
|
136
|
+
}, (responseText) => {
|
|
137
|
+
try {
|
|
138
|
+
const data = JSON.parse(responseText);
|
|
139
|
+
this.dispatchEventAndWsSend(zeroAuthenticated, data);
|
|
140
|
+
}
|
|
141
|
+
catch (err) {
|
|
142
|
+
this.log(err);
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
handleMessage(msg) {
|
|
147
|
+
switch (msg.action) {
|
|
148
|
+
case toWidgetApproved:
|
|
149
|
+
this.onZeroAuth();
|
|
150
|
+
localStorage.setItem(`${PREFIX}_${SESSION_ID}`, msg.sessionId);
|
|
151
|
+
localStorage.setItem(`${PREFIX}_${SESSION_TOKEN}`, msg.message);
|
|
152
|
+
break;
|
|
153
|
+
case toWidgetLogout:
|
|
154
|
+
localStorage.removeItem(`${PREFIX}_${SESSION_ID}`);
|
|
155
|
+
localStorage.removeItem(`${PREFIX}_${SESSION_TOKEN}`);
|
|
156
|
+
this.dispatchEvent(zeroLogout);
|
|
157
|
+
break;
|
|
158
|
+
case toAnyError:
|
|
159
|
+
this.log('ws error', msg);
|
|
160
|
+
break;
|
|
161
|
+
default:
|
|
162
|
+
this.log('incorrect action', msg.action, msg);
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
dispatchEventAndWsSend(name, data) {
|
|
166
|
+
this.dispatchEvent(name, data);
|
|
167
|
+
this.send('from-widget-' + name, data);
|
|
168
|
+
}
|
|
169
|
+
dispatchEvent(name, data) {
|
|
170
|
+
let event = new CustomEvent(name);
|
|
171
|
+
if (data)
|
|
172
|
+
event = new CustomEvent(name, { detail: data });
|
|
173
|
+
document.dispatchEvent(event);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=websocket.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../../../src/components/zero-account/websocket.ts"],"names":[],"mappings":"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","sourcesContent":["import { UAParser } from 'ua-parser-js';\nimport { Environment } from './enums';\nimport http from '../../utils/request';\n\nconst DEFAULT_CALLBACK_URL = window.location.origin + '/zero/auth';\nconst API_URL = 'wss://ws.0account.com/ws';\nconst API_URL_STAGING = 'wss://staging.ws.0account.com/ws';\n\nconst PREFIX = '0account';\nconst SESSION_ID = 'session-id';\nconst SESSION_TOKEN = 'session-token';\n\nconst fromWidgetUUIDUpdated = 'from-widget-uuid-updated';\n// const fromWidgetAuthenticationStarted = 'from-widget-authentication-started';\nconst fromWidgetEnsureSession = 'from-widget-ensure-session';\n\nconst toWidgetLogout = 'to-widget-logout';\nconst toWidgetApproved = 'to-widget-approved';\nconst toAnyError = 'to-any-error';\n// CustomEvents\nconst zeroLogout = '0account-logout';\nconst zeroAuthenticated = '0account-authenticated';\n// const zeroAuthenticationFailed = '0account-authentication-failed';\n\nfunction debounce(func, timeout = 300) {\n let timer;\n return (...args) => {\n clearTimeout(timer);\n timer = setTimeout(() => {\n func.apply(this, args);\n }, timeout);\n };\n}\n\ntype Options = {\n callbackURL: string,\n updateInterval: number,\n enableWithCredentials: boolean,\n uaParser: UAParser,\n log: (...args) => void\n env?: Environment,\n}\n\n\nexport class WS {\n private readonly appId: string;\n private socket: WebSocket;\n private uaParser: UAParser;\n private readonly log: (...args) => void;\n private uuid: string;\n private wsURL = API_URL;\n private callbackURL = DEFAULT_CALLBACK_URL;\n private request: XMLHttpRequest;\n private readonly updateInterval: number;\n private enableWithCredentials: boolean;\n\n constructor(appId: string, opts: Options) {\n if (!opts.env) opts.env = Environment.production\n\n this.appId = appId;\n this.uaParser = opts.uaParser;\n this.callbackURL = opts.callbackURL;\n this.updateInterval = opts.updateInterval;\n this.enableWithCredentials = opts.enableWithCredentials;\n this.log = opts.log;\n if (opts.env !== Environment.production) this.wsURL = API_URL_STAGING;\n this.init();\n }\n\n private deviceInfo() {\n return {\n appId: this.appId,\n browser: this.uaParser.getBrowser().withFeatureCheck().name,\n os: this.uaParser.getOS().withFeatureCheck().name,\n // TODO: handle these on backend:\n // device: `${this.uaParser.getDevice().vendor} ${this.uaParser.getDevice().model}`,\n // all: this.uaParser.getResult()\n };\n }\n\n private reinit() {\n const retry = debounce(this.init.bind(this), 1000)\n retry()\n }\n\n private init() {\n const onopen = (_) => {\n this.send(fromWidgetEnsureSession, this.deviceInfo());\n };\n const onmessage = (event) => {\n try {\n const data = JSON.parse(event.data);\n this.handleMessage(data);\n } catch (e) {\n this.log(e);\n }\n };\n const onerror = (_) => {\n if (this.socket && (this.socket.readyState !== WebSocket.CLOSED\n && this.socket.readyState !== WebSocket.CLOSING)) {\n this.socket.close();\n }\n };\n const onclose = (_) => {\n if (this.socket) {\n this.socket.removeEventListener('open', onopen);\n this.socket.removeEventListener('message', onmessage);\n this.socket.removeEventListener('error', onerror);\n this.socket.removeEventListener('close', onclose);\n delete this.socket;\n }\n this.reinit();\n };\n\n if (this.socket) {\n this.socket.removeEventListener('open', onopen);\n this.socket.removeEventListener('message', onmessage);\n this.socket.removeEventListener('error', onerror);\n this.socket.removeEventListener('close', onclose);\n }\n this.socket = new WebSocket(this.wsURL);\n this.socket.addEventListener('open', onopen);\n this.socket.addEventListener('message', onmessage);\n this.socket.addEventListener('error', onerror);\n this.socket.addEventListener('close', onclose);\n }\n\n updateUUID(uuid: string) {\n this.uuid = uuid;\n this.send(fromWidgetUUIDUpdated, this.deviceInfo());\n }\n\n send(action, data) {\n if (!this.socket || !this.socket.readyState || this.socket.readyState !== WebSocket.OPEN) {\n const retry = debounce(this.send.bind(this), 1000)\n return retry();\n }\n\n const msg: any = {\n action: action,\n timeout: `${this.updateInterval}ms`,\n uuid: this.uuid,\n appId: `${this.appId}`,\n message: {},\n };\n if (action === fromWidgetEnsureSession) {\n const sessionId = localStorage.getItem(`${PREFIX}_${SESSION_ID}`);\n const sessionToken = localStorage.getItem(`${PREFIX}_${SESSION_TOKEN}`);\n if (!sessionId || !sessionToken) return;\n msg.sessionId = sessionId;\n msg.sessionToken = sessionToken;\n }\n\n if (data) msg.message = data;\n this.socket.send(JSON.stringify(msg));\n }\n\n onZeroAuth() {\n if (this.request) this.request.abort();\n this.request = http.send(this.callbackURL,\n {\n enableWithCredentials: this.enableWithCredentials,\n headers: {\n 'x-0account-uuid': this.uuid,\n 'x-0account-auth': 'true',\n },\n },\n (responseText) => {\n try {\n const data = JSON.parse(responseText);\n this.dispatchEventAndWsSend(zeroAuthenticated, data);\n } catch (err) {\n this.log(err);\n }\n },\n );\n }\n\n private handleMessage(msg: any) {\n switch (msg.action) {\n case toWidgetApproved:\n this.onZeroAuth();\n localStorage.setItem(`${PREFIX}_${SESSION_ID}`, msg.sessionId);\n localStorage.setItem(`${PREFIX}_${SESSION_TOKEN}`, msg.message);\n break;\n case toWidgetLogout:\n localStorage.removeItem(`${PREFIX}_${SESSION_ID}`);\n localStorage.removeItem(`${PREFIX}_${SESSION_TOKEN}`);\n this.dispatchEvent(zeroLogout);\n break;\n case toAnyError:\n this.log('ws error', msg);\n break;\n default:\n this.log('incorrect action', msg.action, msg);\n }\n }\n\n private dispatchEventAndWsSend(name, data) {\n this.dispatchEvent(name, data);\n this.send('from-widget-' + name, data);\n }\n\n private dispatchEvent(name: string, data?: any) {\n let event = new CustomEvent(name);\n if (data) event = new CustomEvent(name, { detail: data });\n document.dispatchEvent(event);\n }\n\n}\n"]}
|
|
@@ -0,0 +1,294 @@
|
|
|
1
|
+
:host {
|
|
2
|
+
--primary-color: #7263FA;
|
|
3
|
+
--primary-background-color: #FFF;
|
|
4
|
+
--theme-based-radius: 0px;
|
|
5
|
+
--theme-based-padding: 0px;
|
|
6
|
+
|
|
7
|
+
/* buttons */
|
|
8
|
+
--button-animation-duration: 200ms;
|
|
9
|
+
--text-color: #000;
|
|
10
|
+
--button-border-color: #B2D4FF;
|
|
11
|
+
--button-border-radius: 9999px;
|
|
12
|
+
--button-background-color: var(--primary-background-color);
|
|
13
|
+
|
|
14
|
+
/* modal */
|
|
15
|
+
--modal-logo-border-color: var(--primary-color);
|
|
16
|
+
--modal-animation-duration: 350ms;
|
|
17
|
+
--easing: cubic-bezier(0.16, 1, 0.3, 1);
|
|
18
|
+
/*--easing: ease;*/
|
|
19
|
+
|
|
20
|
+
font-family: sans-serif;
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
.dark {
|
|
24
|
+
--button-background-color: rgb(30, 41, 59);
|
|
25
|
+
--primary-background-color: rgb(30, 41, 59);
|
|
26
|
+
--button-border-color: #FFFFF9;
|
|
27
|
+
--text-color: #FFFFF9;
|
|
28
|
+
--modal-logo-border-color: #CCC;
|
|
29
|
+
--theme-based-radius: 4px;
|
|
30
|
+
--theme-based-padding: 8px;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
.button {
|
|
34
|
+
font-size: 16px;
|
|
35
|
+
color: var(--text-color);
|
|
36
|
+
cursor: pointer;
|
|
37
|
+
padding: 8px 12px 8px 10px;
|
|
38
|
+
display: flex;
|
|
39
|
+
flex-direction: row;
|
|
40
|
+
align-items: center;
|
|
41
|
+
gap: 6px;
|
|
42
|
+
border: 1px solid var(--button-border-color);
|
|
43
|
+
background-color: var(--button-background-color);
|
|
44
|
+
border-radius: var(--button-border-radius);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
.button:hover {
|
|
48
|
+
transition: box-shadow var(--button-animation-duration);
|
|
49
|
+
box-shadow: 0 0 3px rgba(0, 0, 0, 0.3);
|
|
50
|
+
/* lighter shade of --button-background-color */
|
|
51
|
+
background: linear-gradient(
|
|
52
|
+
to top,
|
|
53
|
+
rgba(200, 200, 200, 0.1),
|
|
54
|
+
rgba(200, 200, 200, 0.1)
|
|
55
|
+
) var(--button-background-color)
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
.button:active {
|
|
59
|
+
transition: box-shadow var(--button-animation-duration);
|
|
60
|
+
box-shadow: 0 0 0 rgba(0, 0, 0, 0);
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
.button__logo {
|
|
64
|
+
width: 1.3rem;
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/* -------- modal --------- */
|
|
68
|
+
|
|
69
|
+
.modal {
|
|
70
|
+
display: flex;
|
|
71
|
+
z-index: 9999;
|
|
72
|
+
justify-content: center;
|
|
73
|
+
align-items: center;
|
|
74
|
+
position: fixed;
|
|
75
|
+
top: 0;
|
|
76
|
+
left: 0;
|
|
77
|
+
width: 100%;
|
|
78
|
+
height: 100%;
|
|
79
|
+
opacity: 1;
|
|
80
|
+
background-color: rgba(0, 0, 0, 0.3);
|
|
81
|
+
transition: opacity var(--modal-animation-duration) var(--easing);
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
.modal--hidden {
|
|
85
|
+
opacity: 0;
|
|
86
|
+
pointer-events: none;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
.modal__content {
|
|
90
|
+
max-width: 240px;
|
|
91
|
+
border-radius: 4px;
|
|
92
|
+
position: relative;
|
|
93
|
+
display: flex;
|
|
94
|
+
flex-direction: column;
|
|
95
|
+
align-items: center;
|
|
96
|
+
padding: 16px;
|
|
97
|
+
background-color: var(--primary-background-color);
|
|
98
|
+
transform: scale(1);
|
|
99
|
+
transition: transform var(--modal-animation-duration) var(--easing);
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
.modal--hidden .modal__content {
|
|
103
|
+
transform: scale(0.5);
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
.modal__qrcode__container {
|
|
107
|
+
position: relative;
|
|
108
|
+
background-color: white;
|
|
109
|
+
border-radius: var(--theme-based-radius);
|
|
110
|
+
padding: var(--theme-based-padding);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
.modal__qrcode {
|
|
114
|
+
border-radius: 4px;
|
|
115
|
+
width: 100%;
|
|
116
|
+
height: auto;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
.modal__logo {
|
|
120
|
+
padding: 8px;
|
|
121
|
+
border: 2px var(--modal-logo-border-color) solid;
|
|
122
|
+
border-radius: var(--button-border-radius);
|
|
123
|
+
background-color: var(--primary-background-color);
|
|
124
|
+
position: absolute;
|
|
125
|
+
width: 16%;
|
|
126
|
+
top: 50%;
|
|
127
|
+
left: 50%;
|
|
128
|
+
transform: translate3d(-50%, -50%, 0);
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
.modal-animated .circle__overlay {
|
|
132
|
+
width: 100%;
|
|
133
|
+
height: 100%;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
.modal-animated .modal__qrcode {
|
|
137
|
+
filter: blur(2px);
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
.modal-animated .modal__logo {
|
|
141
|
+
border: none;
|
|
142
|
+
animation: spin 2.5s var(--easing) infinite;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
@keyframes spin {
|
|
146
|
+
0% {
|
|
147
|
+
transform: translate3d(-50%, -50%, 0) rotate(0deg);
|
|
148
|
+
}
|
|
149
|
+
50% {
|
|
150
|
+
transform: translate3d(-50%, -50%, 0) rotate(180deg);
|
|
151
|
+
}
|
|
152
|
+
100% {
|
|
153
|
+
transform: translate3d(-50%, -50%, 0) rotate(360deg);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
.modal__buttons {
|
|
158
|
+
width: 100%;
|
|
159
|
+
flex-direction: column;
|
|
160
|
+
align-items: center;
|
|
161
|
+
margin-top: 14px;
|
|
162
|
+
display: flex;
|
|
163
|
+
text-align: center;
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
.modal:not(.modal--hidden) .modal__button {
|
|
167
|
+
transform: scale(1) translate3d(0, 0, 0);
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
.modal:not(.modal--hidden) .modal__link {
|
|
171
|
+
transform: scale(1) translate3d(0, 0, 0);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
.modal__button {
|
|
175
|
+
transform: scale(0) translate3d(0, 150px, 0);
|
|
176
|
+
transition: calc(var(--modal-animation-duration) + 50ms) var(--easing);
|
|
177
|
+
transition-property: scale, transform, background-color;
|
|
178
|
+
cursor: pointer;
|
|
179
|
+
padding: 12px;
|
|
180
|
+
font-size: 14px;
|
|
181
|
+
background-color: var(--primary-color);
|
|
182
|
+
color: white;
|
|
183
|
+
border: none;
|
|
184
|
+
border-radius: 6px;
|
|
185
|
+
width: 100%;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
.modal__button:hover {
|
|
189
|
+
/* darker shade of --primary-color */
|
|
190
|
+
background: linear-gradient(
|
|
191
|
+
to top,
|
|
192
|
+
rgba(0, 0, 0, 0.1),
|
|
193
|
+
rgba(0, 0, 0, 0.1)
|
|
194
|
+
) var(--primary-color);
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
.modal__link {
|
|
198
|
+
transform: scale(0) translate3d(0, 150px, 0);
|
|
199
|
+
transition: calc(var(--modal-animation-duration) + 150ms) var(--easing);
|
|
200
|
+
transition-property: scale, transform;
|
|
201
|
+
font-size: 0.8rem;
|
|
202
|
+
padding: 10px 20px 0;
|
|
203
|
+
color: var(--primary-color);
|
|
204
|
+
width: 100%;
|
|
205
|
+
text-decoration: underline rgba(0, 0, 0, 0);
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
.modal__link:hover {
|
|
209
|
+
text-decoration-color:var(--primary-color);
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
.modal__close-button {
|
|
213
|
+
position: absolute;
|
|
214
|
+
top: -26px;
|
|
215
|
+
right: -26px;
|
|
216
|
+
width: 24px;
|
|
217
|
+
height: 24px;
|
|
218
|
+
background-color: rgba(0, 0, 0, 0.1);
|
|
219
|
+
border-radius: 10px;
|
|
220
|
+
cursor: pointer;
|
|
221
|
+
transition: background-color var(--modal-animation-duration) var(--easing);
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
.modal__close-button:hover {
|
|
225
|
+
background-color: rgba(0, 0, 0, 0.3);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
.modal__close-button:before,
|
|
229
|
+
.modal__close-button:after {
|
|
230
|
+
content: "";
|
|
231
|
+
position: absolute;
|
|
232
|
+
top: 50%;
|
|
233
|
+
left: 50%;
|
|
234
|
+
width: 50%;
|
|
235
|
+
height: 1px;
|
|
236
|
+
background-color: rgba(255, 255, 255, 0.8);
|
|
237
|
+
transform: translate(-50%, -50%) rotate(45deg);
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
.modal__close-button:after {
|
|
241
|
+
transform: translate(-50%, -50%) rotate(-45deg);
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/* circle ripple */
|
|
245
|
+
|
|
246
|
+
.circle__overlay{
|
|
247
|
+
overflow: hidden;
|
|
248
|
+
top: 50%;
|
|
249
|
+
left: 50%;
|
|
250
|
+
transform: translate(-50%, -50%);
|
|
251
|
+
position: absolute;
|
|
252
|
+
background-color: var(--primary-background-color);
|
|
253
|
+
border-radius: var(--button-border-radius);
|
|
254
|
+
width: 10%;
|
|
255
|
+
height: 10%;
|
|
256
|
+
border: 2px var(--modal-logo-border-color) solid;
|
|
257
|
+
transition: calc(var(--modal-animation-duration) + 200ms) var(--easing);
|
|
258
|
+
transition-property: width, height, opacity;
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
.circle {
|
|
262
|
+
position: absolute;
|
|
263
|
+
top: 50%;
|
|
264
|
+
left: 50%;
|
|
265
|
+
transform: translate(-50%, -50%);
|
|
266
|
+
width: 100px;
|
|
267
|
+
height: 100px;
|
|
268
|
+
border-radius: 50%;
|
|
269
|
+
background-color: #E0E0E0;
|
|
270
|
+
animation: circle__ripple 2s linear infinite;
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
.circle--medium {
|
|
274
|
+
width: 150px;
|
|
275
|
+
height: 150px;
|
|
276
|
+
animation-duration: 2.5s;
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
.circle--large {
|
|
280
|
+
width: 200px;
|
|
281
|
+
height: 200px;
|
|
282
|
+
animation-duration: 3s;
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
@keyframes circle__ripple {
|
|
286
|
+
0% {
|
|
287
|
+
transform: translate(-50%, -50%) scale(0);
|
|
288
|
+
opacity: 1;
|
|
289
|
+
}
|
|
290
|
+
100% {
|
|
291
|
+
transform: translate(-50%, -50%) scale(1.5);
|
|
292
|
+
opacity: 0;
|
|
293
|
+
}
|
|
294
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { newE2EPage } from "@stencil/core/testing";
|
|
2
|
+
describe('zero-account', () => {
|
|
3
|
+
it('renders', async () => {
|
|
4
|
+
const page = await newE2EPage();
|
|
5
|
+
await page.setContent('<zero-account></zero-account>');
|
|
6
|
+
const element = await page.find('zero-account');
|
|
7
|
+
expect(element).toHaveClass('hydrated');
|
|
8
|
+
});
|
|
9
|
+
it('renders changes to the name data', async () => {
|
|
10
|
+
const page = await newE2EPage();
|
|
11
|
+
await page.setContent('<zero-account></zero-account>');
|
|
12
|
+
const component = await page.find('zero-account');
|
|
13
|
+
const element = await page.find('zero-account >>> div');
|
|
14
|
+
expect(element.textContent).toEqual(`Hello, World! I'm `);
|
|
15
|
+
component.setProperty('first', 'James');
|
|
16
|
+
await page.waitForChanges();
|
|
17
|
+
expect(element.textContent).toEqual(`Hello, World! I'm James`);
|
|
18
|
+
component.setProperty('last', 'Quincy');
|
|
19
|
+
await page.waitForChanges();
|
|
20
|
+
expect(element.textContent).toEqual(`Hello, World! I'm James Quincy`);
|
|
21
|
+
component.setProperty('middle', 'Earl');
|
|
22
|
+
await page.waitForChanges();
|
|
23
|
+
expect(element.textContent).toEqual(`Hello, World! I'm James Earl Quincy`);
|
|
24
|
+
});
|
|
25
|
+
});
|
|
26
|
+
//# sourceMappingURL=zero-account.e2e.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"zero-account.e2e.js","sourceRoot":"","sources":["../../../src/components/zero-account/zero-account.e2e.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAC;AAEnD,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,SAAS,EAAE,KAAK,IAAI,EAAE;QACvB,MAAM,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;QAEhC,MAAM,IAAI,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAChD,MAAM,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,UAAU,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,IAAI,GAAG,MAAM,UAAU,EAAE,CAAC;QAEhC,MAAM,IAAI,CAAC,UAAU,CAAC,+BAA+B,CAAC,CAAC;QACvD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;QAClD,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACxD,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,oBAAoB,CAAC,CAAC;QAE1D,SAAS,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;QAE/D,SAAS,CAAC,WAAW,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,gCAAgC,CAAC,CAAC;QAEtE,SAAS,CAAC,WAAW,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QACxC,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAC5B,MAAM,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,OAAO,CAAC,qCAAqC,CAAC,CAAC;IAC7E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC","sourcesContent":["import { newE2EPage } from '@stencil/core/testing';\n\ndescribe('zero-account', () => {\n it('renders', async () => {\n const page = await newE2EPage();\n\n await page.setContent('<zero-account></zero-account>');\n const element = await page.find('zero-account');\n expect(element).toHaveClass('hydrated');\n });\n\n it('renders changes to the name data', async () => {\n const page = await newE2EPage();\n\n await page.setContent('<zero-account></zero-account>');\n const component = await page.find('zero-account');\n const element = await page.find('zero-account >>> div');\n expect(element.textContent).toEqual(`Hello, World! I'm `);\n\n component.setProperty('first', 'James');\n await page.waitForChanges();\n expect(element.textContent).toEqual(`Hello, World! I'm James`);\n\n component.setProperty('last', 'Quincy');\n await page.waitForChanges();\n expect(element.textContent).toEqual(`Hello, World! I'm James Quincy`);\n\n component.setProperty('middle', 'Earl');\n await page.waitForChanges();\n expect(element.textContent).toEqual(`Hello, World! I'm James Earl Quincy`);\n });\n});\n"]}
|