@wix/astro 0.2.14 → 0.2.16
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/components/login-helpers/bi-header-generator.d.ts +11 -0
- package/dist/components/login-helpers/bi-header-generator.js +18 -0
- package/dist/components/login-helpers/iframeUtils.d.ts +4 -0
- package/dist/components/login-helpers/iframeUtils.js +44 -0
- package/dist/components/login-helpers/login-helpers.d.ts +39 -0
- package/dist/components/login-helpers/login-helpers.js +117 -0
- package/dist/components/login.astro +859 -0
- package/dist/integration.d.ts +1 -0
- package/dist/integration.js +24 -21
- package/dist/vite-plugins/sdk-context.js +3 -2
- package/package.json +6 -3
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { APIMetadata, PublicMetadata } from '@wix/sdk-types';
|
|
2
|
+
export declare const WixBIHeaderName = "x-wix-bi-gateway";
|
|
3
|
+
export type WixBIHeaderValues = {
|
|
4
|
+
['environment']: 'js-sdk' | string;
|
|
5
|
+
['package-name']?: string;
|
|
6
|
+
['method-fqn']?: string;
|
|
7
|
+
['entity']?: string;
|
|
8
|
+
};
|
|
9
|
+
export declare function biHeaderGenerator(apiMetadata: APIMetadata, publicMetadata?: PublicMetadata, environment?: string): {
|
|
10
|
+
[WixBIHeaderName]: string;
|
|
11
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
export const WixBIHeaderName = 'x-wix-bi-gateway';
|
|
2
|
+
export function biHeaderGenerator(apiMetadata, publicMetadata, environment) {
|
|
3
|
+
return {
|
|
4
|
+
[WixBIHeaderName]: objectToKeyValue({
|
|
5
|
+
environment: `js-sdk${environment ? `-${environment}` : ``}`,
|
|
6
|
+
'package-name': apiMetadata.packageName ?? publicMetadata?.PACKAGE_NAME,
|
|
7
|
+
'method-fqn': apiMetadata.methodFqn,
|
|
8
|
+
entity: apiMetadata.entityFqdn,
|
|
9
|
+
}),
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
function objectToKeyValue(input) {
|
|
13
|
+
return Object.entries(input)
|
|
14
|
+
.filter(([_, value]) => Boolean(value))
|
|
15
|
+
.map(([key, value]) => `${key}=${value}`)
|
|
16
|
+
.join(',');
|
|
17
|
+
}
|
|
18
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYmktaGVhZGVyLWdlbmVyYXRvci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2xvZ2luLWhlbHBlcnMvYmktaGVhZGVyLWdlbmVyYXRvci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsa0JBQWtCLENBQUM7QUFTbEQsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixXQUF3QixFQUN4QixjQUErQixFQUMvQixXQUFvQjtJQUVwQixPQUFPO1FBQ0wsQ0FBQyxlQUFlLENBQUMsRUFBRSxnQkFBZ0IsQ0FBQztZQUNsQyxXQUFXLEVBQUUsU0FBUyxXQUFXLENBQUMsQ0FBQyxDQUFDLElBQUksV0FBVyxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsRUFBRTtZQUM1RCxjQUFjLEVBQUUsV0FBVyxDQUFDLFdBQVcsSUFBSSxjQUFjLEVBQUUsWUFBWTtZQUN2RSxZQUFZLEVBQUUsV0FBVyxDQUFDLFNBQVM7WUFDbkMsTUFBTSxFQUFFLFdBQVcsQ0FBQyxVQUFVO1NBQy9CLENBQUM7S0FDSCxDQUFDO0FBQ0osQ0FBQztBQUVELFNBQVMsZ0JBQWdCLENBQUMsS0FBd0I7SUFDaEQsT0FBTyxNQUFNLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQztTQUN6QixNQUFNLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxLQUFLLENBQUMsRUFBRSxFQUFFLENBQUMsT0FBTyxDQUFDLEtBQUssQ0FBQyxDQUFDO1NBQ3RDLEdBQUcsQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUUsQ0FBQyxHQUFHLEdBQUcsSUFBSSxLQUFLLEVBQUUsQ0FBQztTQUN4QyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUM7QUFDZixDQUFDIn0=
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export declare function addListener(eventTarget: any, name: string, fn: Function): void;
|
|
2
|
+
export declare function removeListener(eventTarget: any, name: string, fn: Function): void;
|
|
3
|
+
export declare function loadFrame(src: string): HTMLIFrameElement;
|
|
4
|
+
export declare function addPostMessageListener(state: string): Promise<unknown>;
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export function addListener(eventTarget, name, fn) {
|
|
2
|
+
if (eventTarget.addEventListener) {
|
|
3
|
+
eventTarget.addEventListener(name, fn);
|
|
4
|
+
}
|
|
5
|
+
else {
|
|
6
|
+
eventTarget.attachEvent('on' + name, fn);
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
export function removeListener(eventTarget, name, fn) {
|
|
10
|
+
if (eventTarget.removeEventListener) {
|
|
11
|
+
eventTarget.removeEventListener(name, fn);
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
eventTarget.detachEvent('on' + name, fn);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
export function loadFrame(src) {
|
|
18
|
+
const iframe = document.createElement('iframe');
|
|
19
|
+
iframe.style.display = 'none';
|
|
20
|
+
iframe.src = src;
|
|
21
|
+
return document.body.appendChild(iframe);
|
|
22
|
+
}
|
|
23
|
+
export function addPostMessageListener(state) {
|
|
24
|
+
let responseHandler;
|
|
25
|
+
let timeoutId;
|
|
26
|
+
const msgReceivedOrTimeout = new Promise((resolve, reject) => {
|
|
27
|
+
responseHandler = (e) => {
|
|
28
|
+
if (!e.data || e.data.state !== state) {
|
|
29
|
+
// A message not meant for us
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
resolve(e.data);
|
|
33
|
+
};
|
|
34
|
+
addListener(window, 'message', responseHandler);
|
|
35
|
+
timeoutId = setTimeout(() => {
|
|
36
|
+
reject(new Error('OAuth flow timed out'));
|
|
37
|
+
}, 120000);
|
|
38
|
+
});
|
|
39
|
+
return msgReceivedOrTimeout.finally(() => {
|
|
40
|
+
clearTimeout(timeoutId);
|
|
41
|
+
removeListener(window, 'message', responseHandler);
|
|
42
|
+
});
|
|
43
|
+
}
|
|
44
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaWZyYW1lVXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvY29tcG9uZW50cy9sb2dpbi1oZWxwZXJzL2lmcmFtZVV0aWxzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE1BQU0sVUFBVSxXQUFXLENBQUMsV0FBZ0IsRUFBRSxJQUFZLEVBQUUsRUFBWTtJQUN0RSxJQUFJLFdBQVcsQ0FBQyxnQkFBZ0IsRUFBRSxDQUFDO1FBQ2pDLFdBQVcsQ0FBQyxnQkFBZ0IsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDekMsQ0FBQztTQUFNLENBQUM7UUFDTixXQUFXLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRyxJQUFJLEVBQUUsRUFBRSxDQUFDLENBQUM7SUFDM0MsQ0FBQztBQUNILENBQUM7QUFFRCxNQUFNLFVBQVUsY0FBYyxDQUFDLFdBQWdCLEVBQUUsSUFBWSxFQUFFLEVBQVk7SUFDekUsSUFBSSxXQUFXLENBQUMsbUJBQW1CLEVBQUUsQ0FBQztRQUNwQyxXQUFXLENBQUMsbUJBQW1CLENBQUMsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzVDLENBQUM7U0FBTSxDQUFDO1FBQ04sV0FBVyxDQUFDLFdBQVcsQ0FBQyxJQUFJLEdBQUcsSUFBSSxFQUFFLEVBQUUsQ0FBQyxDQUFDO0lBQzNDLENBQUM7QUFDSCxDQUFDO0FBRUQsTUFBTSxVQUFVLFNBQVMsQ0FBQyxHQUFXO0lBQ25DLE1BQU0sTUFBTSxHQUFHLFFBQVEsQ0FBQyxhQUFhLENBQUMsUUFBUSxDQUFDLENBQUM7SUFDaEQsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFPLEdBQUcsTUFBTSxDQUFDO0lBQzlCLE1BQU0sQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDO0lBRWpCLE9BQU8sUUFBUSxDQUFDLElBQUksQ0FBQyxXQUFXLENBQUMsTUFBTSxDQUFDLENBQUM7QUFDM0MsQ0FBQztBQUVELE1BQU0sVUFBVSxzQkFBc0IsQ0FBQyxLQUFhO0lBQ2xELElBQUksZUFBb0IsQ0FBQztJQUN6QixJQUFJLFNBQWMsQ0FBQztJQUNuQixNQUFNLG9CQUFvQixHQUFHLElBQUksT0FBTyxDQUFDLENBQUMsT0FBTyxFQUFFLE1BQU0sRUFBRSxFQUFFO1FBQzNELGVBQWUsR0FBRyxDQUFDLENBQU0sRUFBRSxFQUFFO1lBQzNCLElBQUksQ0FBQyxDQUFDLENBQUMsSUFBSSxJQUFJLENBQUMsQ0FBQyxJQUFJLENBQUMsS0FBSyxLQUFLLEtBQUssRUFBRSxDQUFDO2dCQUN0Qyw2QkFBNkI7Z0JBQzdCLE9BQU87WUFDVCxDQUFDO1lBQ0QsT0FBTyxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUNsQixDQUFDLENBQUM7UUFFRixXQUFXLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztRQUVoRCxTQUFTLEdBQUcsVUFBVSxDQUFDLEdBQUcsRUFBRTtZQUMxQixNQUFNLENBQUMsSUFBSSxLQUFLLENBQUMsc0JBQXNCLENBQUMsQ0FBQyxDQUFDO1FBQzVDLENBQUMsRUFBRSxNQUFNLENBQUMsQ0FBQztJQUNiLENBQUMsQ0FBQyxDQUFDO0lBRUgsT0FBTyxvQkFBb0IsQ0FBQyxPQUFPLENBQUMsR0FBRyxFQUFFO1FBQ3ZDLFlBQVksQ0FBQyxTQUFTLENBQUMsQ0FBQztRQUN4QixjQUFjLENBQUMsTUFBTSxFQUFFLFNBQVMsRUFBRSxlQUFlLENBQUMsQ0FBQztJQUNyRCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMifQ==
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export interface OauthPKCE {
|
|
2
|
+
codeVerifier: string;
|
|
3
|
+
codeChallenge: string;
|
|
4
|
+
state: string;
|
|
5
|
+
}
|
|
6
|
+
export interface OauthData extends OauthPKCE {
|
|
7
|
+
originalUri: string;
|
|
8
|
+
redirectUri: string;
|
|
9
|
+
}
|
|
10
|
+
export interface OauthPKCE {
|
|
11
|
+
codeVerifier: string;
|
|
12
|
+
codeChallenge: string;
|
|
13
|
+
state: string;
|
|
14
|
+
}
|
|
15
|
+
export interface Token {
|
|
16
|
+
value: string;
|
|
17
|
+
}
|
|
18
|
+
export interface AccessToken extends Token {
|
|
19
|
+
expiresAt: number;
|
|
20
|
+
}
|
|
21
|
+
export declare enum TokenRole {
|
|
22
|
+
NONE = "none",
|
|
23
|
+
VISITOR = "visitor",
|
|
24
|
+
MEMBER = "member"
|
|
25
|
+
}
|
|
26
|
+
export interface TokenResponse {
|
|
27
|
+
access_token: string;
|
|
28
|
+
expires_in: number;
|
|
29
|
+
refresh_token: string | null;
|
|
30
|
+
token_type: string;
|
|
31
|
+
scope?: string | null;
|
|
32
|
+
}
|
|
33
|
+
export declare const getMemberTokensForDirectLogin: (sessionToken: string) => Promise<{
|
|
34
|
+
accessToken: AccessToken;
|
|
35
|
+
refreshToken: {
|
|
36
|
+
value: string;
|
|
37
|
+
role: TokenRole;
|
|
38
|
+
};
|
|
39
|
+
}>;
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
import { redirects } from '@wix/redirects';
|
|
2
|
+
import { loadFrame, addPostMessageListener } from './iframeUtils.js';
|
|
3
|
+
import { biHeaderGenerator } from './bi-header-generator.js';
|
|
4
|
+
import { wixContext } from '@wix/sdk-context';
|
|
5
|
+
import { generateRandomCodeVerifier, calculatePKCECodeChallenge, generateRandomState } from 'oauth4webapi';
|
|
6
|
+
const DEFAULT_API_URL = 'www.wixapis.com';
|
|
7
|
+
export var TokenRole;
|
|
8
|
+
(function (TokenRole) {
|
|
9
|
+
TokenRole["NONE"] = "none";
|
|
10
|
+
TokenRole["VISITOR"] = "visitor";
|
|
11
|
+
TokenRole["MEMBER"] = "member";
|
|
12
|
+
})(TokenRole || (TokenRole = {}));
|
|
13
|
+
const generatePKCE = async () => {
|
|
14
|
+
const codeVerifier = generateRandomCodeVerifier();
|
|
15
|
+
const pkceState = await calculatePKCECodeChallenge(codeVerifier);
|
|
16
|
+
return {
|
|
17
|
+
codeChallenge: pkceState,
|
|
18
|
+
codeVerifier: codeVerifier,
|
|
19
|
+
state: generateRandomState(),
|
|
20
|
+
};
|
|
21
|
+
};
|
|
22
|
+
const getAuthorizationUrlWithOptions = async (oauthData, responseMode, prompt, sessionToken) => {
|
|
23
|
+
const { redirectSession } = await redirects.createRedirectSession({
|
|
24
|
+
auth: {
|
|
25
|
+
authRequest: {
|
|
26
|
+
redirectUri: oauthData.redirectUri,
|
|
27
|
+
...(oauthData.redirectUri && {
|
|
28
|
+
redirectUri: oauthData.redirectUri,
|
|
29
|
+
}),
|
|
30
|
+
codeChallenge: oauthData.codeChallenge,
|
|
31
|
+
codeChallengeMethod: 'S256',
|
|
32
|
+
responseMode,
|
|
33
|
+
responseType: 'code',
|
|
34
|
+
scope: 'offline_access',
|
|
35
|
+
state: oauthData.state,
|
|
36
|
+
clientId: wixContext['clientId'],
|
|
37
|
+
...(sessionToken && { sessionToken }),
|
|
38
|
+
},
|
|
39
|
+
prompt: redirects.Prompt[prompt],
|
|
40
|
+
},
|
|
41
|
+
});
|
|
42
|
+
return {
|
|
43
|
+
authUrl: redirectSession.fullUrl,
|
|
44
|
+
authorizationEndpoint: redirectSession.urlDetails.endpoint,
|
|
45
|
+
sessionToken: redirectSession.sessionToken,
|
|
46
|
+
};
|
|
47
|
+
};
|
|
48
|
+
const fetchTokens = async (payload, headers = {}) => {
|
|
49
|
+
const res = await fetch(`https://${DEFAULT_API_URL}/oauth2/token`, {
|
|
50
|
+
method: 'POST',
|
|
51
|
+
body: JSON.stringify(payload),
|
|
52
|
+
headers: {
|
|
53
|
+
...biHeaderGenerator({
|
|
54
|
+
entityFqdn: 'wix.identity.oauth.v1.refresh_token',
|
|
55
|
+
methodFqn: 'wix.identity.oauth2.v1.Oauth2Ng.Token',
|
|
56
|
+
packageName: '@wix/sdk',
|
|
57
|
+
}),
|
|
58
|
+
'Content-Type': 'application/json',
|
|
59
|
+
...headers,
|
|
60
|
+
},
|
|
61
|
+
});
|
|
62
|
+
if (res.status !== 200) {
|
|
63
|
+
let responseJson;
|
|
64
|
+
try {
|
|
65
|
+
responseJson = await res.json();
|
|
66
|
+
}
|
|
67
|
+
catch { }
|
|
68
|
+
throw new Error(`Failed to fetch tokens from OAuth API: ${res.statusText}. request id: ${res.headers.get('x-request-id')}. ${responseJson ? `Response: ${JSON.stringify(responseJson)}` : ''}`);
|
|
69
|
+
}
|
|
70
|
+
const json = await res.json();
|
|
71
|
+
return json;
|
|
72
|
+
};
|
|
73
|
+
function getCurrentDate() {
|
|
74
|
+
return Math.floor(Date.now() / 1000);
|
|
75
|
+
}
|
|
76
|
+
function createAccessToken(accessToken, expiresIn) {
|
|
77
|
+
const now = getCurrentDate();
|
|
78
|
+
return { value: accessToken, expiresAt: Number(expiresIn) + now };
|
|
79
|
+
}
|
|
80
|
+
const getMemberTokens = async (code, state, oauthData) => {
|
|
81
|
+
if (!code || !state) {
|
|
82
|
+
throw new Error('Missing code or _state');
|
|
83
|
+
}
|
|
84
|
+
else if (state !== oauthData.state) {
|
|
85
|
+
throw new Error('Invalid _state');
|
|
86
|
+
}
|
|
87
|
+
const tokensResponse = await fetchTokens({
|
|
88
|
+
clientId: wixContext['clientId'],
|
|
89
|
+
grantType: 'authorization_code',
|
|
90
|
+
...(oauthData.redirectUri && { redirectUri: oauthData.redirectUri }),
|
|
91
|
+
code,
|
|
92
|
+
codeVerifier: oauthData.codeVerifier,
|
|
93
|
+
});
|
|
94
|
+
return {
|
|
95
|
+
accessToken: createAccessToken(tokensResponse.access_token, tokensResponse.expires_in),
|
|
96
|
+
refreshToken: {
|
|
97
|
+
value: tokensResponse.refresh_token,
|
|
98
|
+
role: TokenRole.MEMBER,
|
|
99
|
+
},
|
|
100
|
+
};
|
|
101
|
+
};
|
|
102
|
+
export const getMemberTokensForDirectLogin = async (sessionToken) => {
|
|
103
|
+
const oauthPKCE = await generatePKCE();
|
|
104
|
+
const { authUrl } = await getAuthorizationUrlWithOptions(oauthPKCE, 'web_message', 'none', sessionToken);
|
|
105
|
+
const iframePromise = addPostMessageListener(oauthPKCE.state);
|
|
106
|
+
const iframeEl = loadFrame(authUrl);
|
|
107
|
+
return iframePromise
|
|
108
|
+
.then((res) => {
|
|
109
|
+
return getMemberTokens(res.code, res.state, oauthPKCE);
|
|
110
|
+
})
|
|
111
|
+
.finally(() => {
|
|
112
|
+
if (document.body.contains(iframeEl)) {
|
|
113
|
+
iframeEl.parentElement?.removeChild(iframeEl);
|
|
114
|
+
}
|
|
115
|
+
});
|
|
116
|
+
};
|
|
117
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9naW4taGVscGVycy5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9jb21wb25lbnRzL2xvZ2luLWhlbHBlcnMvbG9naW4taGVscGVycy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0sZ0JBQWdCLENBQUM7QUFDM0MsT0FBTyxFQUFFLFNBQVMsRUFBRSxzQkFBc0IsRUFBRSxNQUFNLGtCQUFrQixDQUFDO0FBQ3JFLE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBQzdELE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxrQkFBa0IsQ0FBQztBQUM5QyxPQUFPLEVBQUUsMEJBQTBCLEVBQUUsMEJBQTBCLEVBQUUsbUJBQW1CLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFFM0csTUFBTSxlQUFlLEdBQUcsaUJBQWlCLENBQUM7QUEyQjFDLE1BQU0sQ0FBTixJQUFZLFNBSVg7QUFKRCxXQUFZLFNBQVM7SUFDbkIsMEJBQWEsQ0FBQTtJQUNiLGdDQUFtQixDQUFBO0lBQ25CLDhCQUFpQixDQUFBO0FBQ25CLENBQUMsRUFKVyxTQUFTLEtBQVQsU0FBUyxRQUlwQjtBQUVELE1BQU0sWUFBWSxHQUFHLEtBQUssSUFBd0IsRUFBRTtJQUNsRCxNQUFNLFlBQVksR0FBRywwQkFBMEIsRUFBRSxDQUFDO0lBQ2xELE1BQU0sU0FBUyxHQUFHLE1BQU0sMEJBQTBCLENBQUMsWUFBWSxDQUFDLENBQUM7SUFDakUsT0FBTztRQUNMLGFBQWEsRUFBRSxTQUFTO1FBQ3hCLFlBQVksRUFBRSxZQUFZO1FBQzFCLEtBQUssRUFBRSxtQkFBbUIsRUFBRTtLQUM3QixDQUFDO0FBQ0osQ0FBQyxDQUFDO0FBRUYsTUFBTSw4QkFBOEIsR0FBRyxLQUFLLEVBQzFDLFNBQTZCLEVBQzdCLFlBQWtELEVBQ2xELE1BQXdCLEVBQ3hCLFlBQXFCLEVBQ3JCLEVBQUU7SUFDRixNQUFNLEVBQUUsZUFB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
|
|
@@ -0,0 +1,859 @@
|
|
|
1
|
+
---
|
|
2
|
+
---
|
|
3
|
+
|
|
4
|
+
<div class="login-form-wrapper">
|
|
5
|
+
<login-form>
|
|
6
|
+
<form id="loginForm">
|
|
7
|
+
<div class="form-container">
|
|
8
|
+
<h3 id="formTitle">
|
|
9
|
+
<span id="title-login">
|
|
10
|
+
<slot name="title-login">Log In</slot>
|
|
11
|
+
</span>
|
|
12
|
+
<span id="title-signup" style="display: none;">
|
|
13
|
+
<slot name="title-signup">Sign Up</slot>
|
|
14
|
+
</span>
|
|
15
|
+
<span id="title-reset" style="display: none;">
|
|
16
|
+
<slot name="title-reset">Reset Password</slot>
|
|
17
|
+
</span>
|
|
18
|
+
<span id="title-verify" style="display: none;">
|
|
19
|
+
<slot name="title-verify">Email Verification</slot>
|
|
20
|
+
</span>
|
|
21
|
+
<span id="title-success" style="display: none;">
|
|
22
|
+
<slot name="title-success">Success</slot>
|
|
23
|
+
</span>
|
|
24
|
+
</h3>
|
|
25
|
+
|
|
26
|
+
<!-- Success message with animation -->
|
|
27
|
+
<div id="successMessage" style="display: none;">
|
|
28
|
+
<div class="success-animation">
|
|
29
|
+
<svg class="checkmark" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 52 52">
|
|
30
|
+
<circle class="checkmark__circle" cx="26" cy="26" r="25" fill="none"/>
|
|
31
|
+
<path class="checkmark__check" fill="none" d="M14.1 27.2l7.1 7.2 16.7-16.8"/>
|
|
32
|
+
</svg>
|
|
33
|
+
</div>
|
|
34
|
+
<p class="success-title">
|
|
35
|
+
<slot name="success-title">Login Successful!</slot>
|
|
36
|
+
</p>
|
|
37
|
+
<p id="successText">
|
|
38
|
+
<slot name="success-message">You are now logged in.</slot>
|
|
39
|
+
</p>
|
|
40
|
+
</div>
|
|
41
|
+
|
|
42
|
+
<div id="pendingMessage" style="display: none;">
|
|
43
|
+
<p id="pendingText"></p>
|
|
44
|
+
<button id="okButton" type="button">
|
|
45
|
+
<slot name="ok-button">OK</slot>
|
|
46
|
+
</button>
|
|
47
|
+
</div>
|
|
48
|
+
|
|
49
|
+
<!-- General Error Message -->
|
|
50
|
+
<div id="errorMessage" style="display: none;">
|
|
51
|
+
<div class="error-container">
|
|
52
|
+
<svg class="error-icon" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 20 20" fill="currentColor">
|
|
53
|
+
<path fill-rule="evenodd" d="M10 18a8 8 0 100-16 8 8 0 000 16zM8.707 7.293a1 1 0 00-1.414 1.414L8.586 10l-1.293 1.293a1 1 0 101.414 1.414L10 11.414l1.293 1.293a1 1 0 001.414-1.414L11.414 10l1.293-1.293a1 1 0 00-1.414-1.414L10 8.586 8.707 7.293z" clip-rule="evenodd" />
|
|
54
|
+
</svg>
|
|
55
|
+
<p id="errorText">
|
|
56
|
+
<slot name="error-message">Authentication error. Please try again.</slot>
|
|
57
|
+
</p>
|
|
58
|
+
</div>
|
|
59
|
+
</div>
|
|
60
|
+
|
|
61
|
+
<div id="formFields">
|
|
62
|
+
<!-- Username field (sign up only) -->
|
|
63
|
+
<div id="usernameField" style="display: none;">
|
|
64
|
+
<div class="field-label">
|
|
65
|
+
<label for="username">
|
|
66
|
+
<slot name="username-label">Username</slot>
|
|
67
|
+
</label>
|
|
68
|
+
</div>
|
|
69
|
+
<input
|
|
70
|
+
class={Astro.props["input-class"]}
|
|
71
|
+
id="username"
|
|
72
|
+
name="username"
|
|
73
|
+
type="text"
|
|
74
|
+
required
|
|
75
|
+
/>
|
|
76
|
+
</div>
|
|
77
|
+
|
|
78
|
+
<!-- Email field -->
|
|
79
|
+
<div id="emailField">
|
|
80
|
+
<div class="field-label">
|
|
81
|
+
<label for="email">
|
|
82
|
+
<slot name="email-label">Email</slot>
|
|
83
|
+
</label>
|
|
84
|
+
</div>
|
|
85
|
+
<input
|
|
86
|
+
class={Astro.props["input-class"]}
|
|
87
|
+
id="email"
|
|
88
|
+
name="email"
|
|
89
|
+
type="email"
|
|
90
|
+
required
|
|
91
|
+
/>
|
|
92
|
+
</div>
|
|
93
|
+
|
|
94
|
+
<!-- Verification code field -->
|
|
95
|
+
<div id="codeField" style="display: none;">
|
|
96
|
+
<div class="field-label">
|
|
97
|
+
<label for="code">
|
|
98
|
+
<slot name="code-label">Code</slot>
|
|
99
|
+
</label>
|
|
100
|
+
</div>
|
|
101
|
+
<input
|
|
102
|
+
class={Astro.props["input-class"]}
|
|
103
|
+
id="code"
|
|
104
|
+
name="code"
|
|
105
|
+
type="number"
|
|
106
|
+
required
|
|
107
|
+
/>
|
|
108
|
+
</div>
|
|
109
|
+
|
|
110
|
+
<!-- Password field -->
|
|
111
|
+
<div id="passwordField">
|
|
112
|
+
<div class="field-label">
|
|
113
|
+
<label for="password">
|
|
114
|
+
<slot name="password-label">Password</slot>
|
|
115
|
+
</label>
|
|
116
|
+
</div>
|
|
117
|
+
<input
|
|
118
|
+
class={Astro.props["input-class"]}
|
|
119
|
+
id="password"
|
|
120
|
+
name="password"
|
|
121
|
+
type="password"
|
|
122
|
+
required
|
|
123
|
+
/>
|
|
124
|
+
</div>
|
|
125
|
+
|
|
126
|
+
<!-- Forgot password link -->
|
|
127
|
+
<div id="forgotPasswordLink">
|
|
128
|
+
<a id="forgotPassword" href="#">
|
|
129
|
+
<slot name="forgot-password">Forgot password?</slot>
|
|
130
|
+
</a>
|
|
131
|
+
</div>
|
|
132
|
+
|
|
133
|
+
<!-- reCAPTCHA container -->
|
|
134
|
+
<div id="recaptcha-container" style="display: none;"></div>
|
|
135
|
+
|
|
136
|
+
<!-- Submit button -->
|
|
137
|
+
<div class="submit-button-container">
|
|
138
|
+
<button id="submitButton" type="submit" class={Astro.props["button-class"]}>
|
|
139
|
+
<span class="login-text">
|
|
140
|
+
<slot name="button-login">Log In</slot>
|
|
141
|
+
</span>
|
|
142
|
+
<span class="signup-text" style="display: none;">
|
|
143
|
+
<slot name="button-signup">Sign Up</slot>
|
|
144
|
+
</span>
|
|
145
|
+
<span class="reset-text" style="display: none;">
|
|
146
|
+
<slot name="button-reset">Reset</slot>
|
|
147
|
+
</span>
|
|
148
|
+
<span class="verify-text" style="display: none;">
|
|
149
|
+
<slot name="button-verify">Submit</slot>
|
|
150
|
+
</span>
|
|
151
|
+
<span class="loading-text loading-bounce" style="display: none;">
|
|
152
|
+
<slot name="button-loading">Loading</slot><span class="dot">.</span><span class="dot">.</span><span class="dot">.</span>
|
|
153
|
+
</span>
|
|
154
|
+
</button>
|
|
155
|
+
</div>
|
|
156
|
+
|
|
157
|
+
<!-- Toggle login/signup -->
|
|
158
|
+
<div id="toggleStateContainer">
|
|
159
|
+
<span class="login-toggle">
|
|
160
|
+
<slot name="toggle-login-text">Not registered?</slot>
|
|
161
|
+
<a id="toggleState" href="#">
|
|
162
|
+
<slot name="toggle-login-link">Sign up</slot>
|
|
163
|
+
</a>
|
|
164
|
+
</span>
|
|
165
|
+
<span class="signup-toggle" style="display: none;">
|
|
166
|
+
<slot name="toggle-signup-text">Already registered?</slot>
|
|
167
|
+
<a id="toggleState-signup" href="#">
|
|
168
|
+
<slot name="toggle-signup-link">Log in</slot>
|
|
169
|
+
</a>
|
|
170
|
+
</span>
|
|
171
|
+
</div>
|
|
172
|
+
</div>
|
|
173
|
+
</div>
|
|
174
|
+
</form>
|
|
175
|
+
</login-form>
|
|
176
|
+
</div>
|
|
177
|
+
|
|
178
|
+
<style>
|
|
179
|
+
button:disabled {
|
|
180
|
+
opacity: 0.5;
|
|
181
|
+
cursor: not-allowed;
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
/* Success animation styles */
|
|
185
|
+
.success-animation {
|
|
186
|
+
display: flex;
|
|
187
|
+
justify-content: center;
|
|
188
|
+
margin: 20px 0;
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
.checkmark {
|
|
192
|
+
width: 80px;
|
|
193
|
+
height: 80px;
|
|
194
|
+
border-radius: 50%;
|
|
195
|
+
display: block;
|
|
196
|
+
stroke-width: 2;
|
|
197
|
+
stroke: #4BB71B;
|
|
198
|
+
stroke-miterlimit: 10;
|
|
199
|
+
box-shadow: inset 0px 0px 0px #4BB71B;
|
|
200
|
+
animation: fill .4s ease-in-out .4s forwards, scale .3s ease-in-out .9s both;
|
|
201
|
+
}
|
|
202
|
+
|
|
203
|
+
.checkmark__circle {
|
|
204
|
+
stroke-dasharray: 166;
|
|
205
|
+
stroke-dashoffset: 166;
|
|
206
|
+
stroke-width: 2;
|
|
207
|
+
stroke-miterlimit: 10;
|
|
208
|
+
stroke: #4BB71B;
|
|
209
|
+
fill: none;
|
|
210
|
+
animation: stroke 0.6s cubic-bezier(0.65, 0, 0.45, 1) forwards;
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
.checkmark__check {
|
|
214
|
+
transform-origin: 50% 50%;
|
|
215
|
+
stroke-dasharray: 48;
|
|
216
|
+
stroke-dashoffset: 48;
|
|
217
|
+
animation: stroke 0.3s cubic-bezier(0.65, 0, 0.45, 1) 0.8s forwards;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
@keyframes stroke {
|
|
221
|
+
100% {
|
|
222
|
+
stroke-dashoffset: 0;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
@keyframes scale {
|
|
227
|
+
0%, 100% {
|
|
228
|
+
transform: none;
|
|
229
|
+
}
|
|
230
|
+
50% {
|
|
231
|
+
transform: scale3d(1.1, 1.1, 1);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
@keyframes fill {
|
|
236
|
+
100% {
|
|
237
|
+
box-shadow: inset 0px 0px 0px 30px rgba(75, 183, 27, 0.2);
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
|
|
242
|
+
/* RTL support for Hebrew and other RTL languages */
|
|
243
|
+
:global([dir="rtl"]) .form-container {
|
|
244
|
+
text-align: right;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
:global([dir="rtl"]) input {
|
|
248
|
+
text-align: right;
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
|
|
252
|
+
/* Loading text on submit button animation */
|
|
253
|
+
.loading-bounce .dot {
|
|
254
|
+
display: inline-block; /* Needed for transform */
|
|
255
|
+
position: relative; /* Or just rely on inline-block default */
|
|
256
|
+
animation: bounce 0.6s infinite ease-in-out alternate;
|
|
257
|
+
}
|
|
258
|
+
|
|
259
|
+
/* Add delays to each dot */
|
|
260
|
+
.loading-bounce .dot:nth-child(1) {
|
|
261
|
+
animation-delay: 0.1s;
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
.loading-bounce .dot:nth-child(2) {
|
|
265
|
+
animation-delay: 0.2s;
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
.loading-bounce .dot:nth-child(3) {
|
|
269
|
+
animation-delay: 0.3s;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
@keyframes bounce {
|
|
273
|
+
from {
|
|
274
|
+
transform: translateY(0);
|
|
275
|
+
}
|
|
276
|
+
to {
|
|
277
|
+
transform: translateY(-5px); /* Adjust bounce height */
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
</style>
|
|
281
|
+
|
|
282
|
+
<script>
|
|
283
|
+
import { authentication, verification, recovery } from '@wix/identity';
|
|
284
|
+
import { getMemberTokensForDirectLogin } from './login-helpers/login-helpers.js';
|
|
285
|
+
import { wixContext } from '@wix/sdk-context';
|
|
286
|
+
|
|
287
|
+
class LoginForm extends HTMLElement {
|
|
288
|
+
constructor() {
|
|
289
|
+
super();
|
|
290
|
+
// States enum
|
|
291
|
+
this.State = {
|
|
292
|
+
LOGIN: 'LOGIN',
|
|
293
|
+
SIGNUP: 'SIGNUP',
|
|
294
|
+
RESET_PASSWORD: 'RESET_PASSWORD',
|
|
295
|
+
EMAIL_VERIFICATION: 'EMAIL_VERIFICATION',
|
|
296
|
+
SUCCESS: 'SUCCESS'
|
|
297
|
+
};
|
|
298
|
+
|
|
299
|
+
// Initialize state variables
|
|
300
|
+
this.state = this.State.LOGIN;
|
|
301
|
+
this.loading = false;
|
|
302
|
+
this.email = '';
|
|
303
|
+
this.code = '';
|
|
304
|
+
this.username = '';
|
|
305
|
+
this.password = '';
|
|
306
|
+
this.pending = { state: false, message: '' };
|
|
307
|
+
this.passwordInvalid = false;
|
|
308
|
+
this.emailInvalid = false;
|
|
309
|
+
this.captcha = '';
|
|
310
|
+
this.error = { state: false, message: '' };
|
|
311
|
+
|
|
312
|
+
// Bind methods to this
|
|
313
|
+
this.resetState = this.resetState.bind(this);
|
|
314
|
+
this.submit = this.submit.bind(this);
|
|
315
|
+
this.updateUI = this.updateUI.bind(this);
|
|
316
|
+
this.handleInputChange = this.handleInputChange.bind(this);
|
|
317
|
+
this.showSuccessMessage = this.showSuccessMessage.bind(this);
|
|
318
|
+
this.showErrorMessage = this.showErrorMessage.bind(this);
|
|
319
|
+
}
|
|
320
|
+
|
|
321
|
+
connectedCallback() {
|
|
322
|
+
// Initial setup
|
|
323
|
+
this.setupEventListenersForStaticElements();
|
|
324
|
+
this.updateUI(); // This will handle dynamic element setup
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
setupEventListenersForStaticElements() {
|
|
328
|
+
// Form submission
|
|
329
|
+
this.querySelector('#loginForm').addEventListener('submit', this.submit);
|
|
330
|
+
|
|
331
|
+
// OK button for messages
|
|
332
|
+
this.querySelector('#okButton').addEventListener('click', () => {
|
|
333
|
+
this.resetState();
|
|
334
|
+
});
|
|
335
|
+
|
|
336
|
+
// Forgot password link
|
|
337
|
+
const forgotPasswordLink = this.querySelector('#forgotPassword');
|
|
338
|
+
if (forgotPasswordLink) {
|
|
339
|
+
forgotPasswordLink.addEventListener('click', (e) => {
|
|
340
|
+
e.preventDefault();
|
|
341
|
+
this.state = this.State.RESET_PASSWORD;
|
|
342
|
+
this.resetState();
|
|
343
|
+
});
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// Input event listeners for all form fields
|
|
347
|
+
const inputs = this.querySelectorAll('input');
|
|
348
|
+
inputs.forEach(input => {
|
|
349
|
+
input.addEventListener('input', this.handleInputChange);
|
|
350
|
+
});
|
|
351
|
+
}
|
|
352
|
+
|
|
353
|
+
async setupCaptcha() {
|
|
354
|
+
try {
|
|
355
|
+
// Set up recaptcha
|
|
356
|
+
if (!window.grecaptcha && this.state === this.State.SIGNUP) {
|
|
357
|
+
const script = document.createElement('script');
|
|
358
|
+
script.src = "https://www.google.com/recaptcha/enterprise.js";
|
|
359
|
+
document.head.appendChild(script);
|
|
360
|
+
|
|
361
|
+
script.onload = () => {
|
|
362
|
+
window.grecaptcha.enterprise.ready(() => {
|
|
363
|
+
window.grecaptcha.enterprise.render('recaptcha-container', {
|
|
364
|
+
'sitekey': '6Ld0J8IcAAAAANyrnxzrRlX1xrrdXsOmsepUYosy', // Replace with your actual site key
|
|
365
|
+
'size': 'normal', // or 'compact' for mobile-friendly
|
|
366
|
+
'callback': this.onCaptchaChange.bind(this),
|
|
367
|
+
'expired-callback': () => {
|
|
368
|
+
this.captcha = '';
|
|
369
|
+
this.updateInputValues(); // Update UI without full render
|
|
370
|
+
},
|
|
371
|
+
});
|
|
372
|
+
});
|
|
373
|
+
};
|
|
374
|
+
}
|
|
375
|
+
} catch (error) {
|
|
376
|
+
console.error("Error setting up captcha:", error);
|
|
377
|
+
}
|
|
378
|
+
}
|
|
379
|
+
|
|
380
|
+
resetState() {
|
|
381
|
+
this.loading = false;
|
|
382
|
+
this.pending = { state: false, message: '' };
|
|
383
|
+
this.email = '';
|
|
384
|
+
this.code = '';
|
|
385
|
+
this.passwordInvalid = false;
|
|
386
|
+
this.emailInvalid = false;
|
|
387
|
+
this.username = '';
|
|
388
|
+
this.password = '';
|
|
389
|
+
this.error = { state: false, message: '' };
|
|
390
|
+
|
|
391
|
+
// Reset recaptcha if it exists
|
|
392
|
+
if (this.querySelector('.g-recaptcha') && window.grecaptcha) {
|
|
393
|
+
window.grecaptcha.enterprise.reset();
|
|
394
|
+
}
|
|
395
|
+
|
|
396
|
+
this.updateUI();
|
|
397
|
+
}
|
|
398
|
+
|
|
399
|
+
handleInputChange(event) {
|
|
400
|
+
const { id, value } = event.target;
|
|
401
|
+
|
|
402
|
+
// Clear error message when user starts typing
|
|
403
|
+
if (this.error.state) {
|
|
404
|
+
this.error = { state: false, message: '' };
|
|
405
|
+
this.updateUI();
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
if (id === 'email') {
|
|
409
|
+
this.email = value;
|
|
410
|
+
this.emailInvalid = false;
|
|
411
|
+
} else if (id === 'password') {
|
|
412
|
+
this.password = value;
|
|
413
|
+
this.passwordInvalid = false;
|
|
414
|
+
} else if (id === 'username') {
|
|
415
|
+
this.username = value;
|
|
416
|
+
} else if (id === 'code') {
|
|
417
|
+
this.code = value;
|
|
418
|
+
}
|
|
419
|
+
|
|
420
|
+
// Update UI state without full re-render
|
|
421
|
+
this.updateInputValues();
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
async submit(event) {
|
|
425
|
+
event.preventDefault();
|
|
426
|
+
this.loading = true;
|
|
427
|
+
this.error = { state: false, message: '' }; // Clear any previous errors
|
|
428
|
+
this.updateInputValues(); // Update UI without full render
|
|
429
|
+
this.updateButtonText();
|
|
430
|
+
|
|
431
|
+
let response;
|
|
432
|
+
|
|
433
|
+
try {
|
|
434
|
+
if (this.state === this.State.RESET_PASSWORD) {
|
|
435
|
+
await recovery.sendRecoveryEmail(
|
|
436
|
+
this.email,
|
|
437
|
+
{ redirect: { url: window.location.origin, clientId: wixContext['clientId'] as string } }
|
|
438
|
+
);
|
|
439
|
+
this.pending = { message: 'Password reset email sent', state: true };
|
|
440
|
+
this.updateUI(); // Update UI for modal state change
|
|
441
|
+
return;
|
|
442
|
+
}
|
|
443
|
+
|
|
444
|
+
if (this.state === this.State.EMAIL_VERIFICATION) {
|
|
445
|
+
response = await verification.verifyDuringAuthentication(
|
|
446
|
+
this.code,
|
|
447
|
+
{ stateToken: this.emailVerificationStateToken },
|
|
448
|
+
);
|
|
449
|
+
} else if (this.state === this.State.LOGIN) {
|
|
450
|
+
response = await authentication.loginV2(
|
|
451
|
+
{
|
|
452
|
+
email: this.email,
|
|
453
|
+
},
|
|
454
|
+
{
|
|
455
|
+
password: this.password,
|
|
456
|
+
}
|
|
457
|
+
);
|
|
458
|
+
} else {
|
|
459
|
+
response = await authentication.registerV2({
|
|
460
|
+
email: this.email,
|
|
461
|
+
},
|
|
462
|
+
{
|
|
463
|
+
password: this.password,
|
|
464
|
+
profile: {
|
|
465
|
+
nickname: this.username,
|
|
466
|
+
},
|
|
467
|
+
captchaTokens: [
|
|
468
|
+
{
|
|
469
|
+
Recaptcha: this.captcha,
|
|
470
|
+
},
|
|
471
|
+
],
|
|
472
|
+
});
|
|
473
|
+
}
|
|
474
|
+
|
|
475
|
+
// Handle login success
|
|
476
|
+
if (response.state === 'SUCCESS') {
|
|
477
|
+
const tokens = await getMemberTokensForDirectLogin(
|
|
478
|
+
response.sessionToken!
|
|
479
|
+
);
|
|
480
|
+
|
|
481
|
+
// Set cookie
|
|
482
|
+
this.setCookie('wixSession', JSON.stringify(tokens.refreshToken), 2);
|
|
483
|
+
|
|
484
|
+
// Show success animation
|
|
485
|
+
this.showSuccessMessage();
|
|
486
|
+
|
|
487
|
+
// Dispatch a success event that consumers can listen for
|
|
488
|
+
this.dispatchEvent(new CustomEvent('login-success'));
|
|
489
|
+
return;
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
// Handle various states
|
|
493
|
+
if (response.state === 'OWNER_APPROVAL_REQUIRED') {
|
|
494
|
+
this.pending = { message: 'Your account is pending approval', state: true };
|
|
495
|
+
this.updateUI(); // Update UI for state change
|
|
496
|
+
} else if (response.state === 'REQUIRE_EMAIL_VERIFICATION') {
|
|
497
|
+
this.state = this.State.EMAIL_VERIFICATION;
|
|
498
|
+
this.emailVerificationStateToken = response.stateToken;
|
|
499
|
+
this.updateUI(); // Update UI for state change
|
|
500
|
+
} else if (response.state === 'FAILURE') {
|
|
501
|
+
if (response.errorCode === 'invalidPassword') {
|
|
502
|
+
this.passwordInvalid = true;
|
|
503
|
+
this.updateInputValues(); // Update without full render
|
|
504
|
+
} else if (
|
|
505
|
+
response.errorCode === 'invalidEmail' ||
|
|
506
|
+
response.errorCode === 'emailAlreadyExists'
|
|
507
|
+
) {
|
|
508
|
+
this.emailInvalid = true;
|
|
509
|
+
this.updateInputValues(); // Update without full render
|
|
510
|
+
} else if (response.errorCode === 'resetPassword') {
|
|
511
|
+
this.pending = {
|
|
512
|
+
message: 'Your password requires reset',
|
|
513
|
+
state: true,
|
|
514
|
+
};
|
|
515
|
+
this.updateUI(); // Update UI for state change
|
|
516
|
+
} else {
|
|
517
|
+
// Handle other error codes with a generic message
|
|
518
|
+
this.showErrorMessage();
|
|
519
|
+
const errorElem = this.querySelector('#errorText');
|
|
520
|
+
if (errorElem) {
|
|
521
|
+
errorElem.setAttribute('data-error-code', response.errorCode || 'unknown');
|
|
522
|
+
}
|
|
523
|
+
}
|
|
524
|
+
}
|
|
525
|
+
} catch (error) {
|
|
526
|
+
console.error('Authentication error:', error);
|
|
527
|
+
// Show user-friendly error message
|
|
528
|
+
this.showErrorMessage();
|
|
529
|
+
}
|
|
530
|
+
|
|
531
|
+
// Reset recaptcha
|
|
532
|
+
if (this.querySelector('.g-recaptcha') && window.grecaptcha) {
|
|
533
|
+
window.grecaptcha.reset();
|
|
534
|
+
}
|
|
535
|
+
|
|
536
|
+
this.loading = false;
|
|
537
|
+
this.updateInputValues(); // Update UI without full render
|
|
538
|
+
}
|
|
539
|
+
|
|
540
|
+
// New method to show error message
|
|
541
|
+
showErrorMessage() {
|
|
542
|
+
this.error = { state: true, message: '' };
|
|
543
|
+
this.updateUI();
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
setCookie(name, value, days) {
|
|
547
|
+
// Using a simplified cookie setter for demonstration
|
|
548
|
+
let expires = '';
|
|
549
|
+
if (days) {
|
|
550
|
+
const date = new Date();
|
|
551
|
+
date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
|
|
552
|
+
expires = "; expires=" + date.toUTCString();
|
|
553
|
+
}
|
|
554
|
+
document.cookie = name + "=" + (value || "") + expires + "; path=/";
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
onCaptchaChange(token) {
|
|
558
|
+
this.captcha = token;
|
|
559
|
+
this.updateInputValues(); // Update UI without full render
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
// New method to show success message with animation
|
|
563
|
+
showSuccessMessage() {
|
|
564
|
+
// Update state
|
|
565
|
+
this.state = this.State.SUCCESS;
|
|
566
|
+
|
|
567
|
+
// Update UI to show success message
|
|
568
|
+
this.updateUI();
|
|
569
|
+
}
|
|
570
|
+
|
|
571
|
+
updateUI() {
|
|
572
|
+
// Handle success message visibility first
|
|
573
|
+
const successMessage = this.querySelector('#successMessage');
|
|
574
|
+
if (this.state === this.State.SUCCESS) {
|
|
575
|
+
this.updateTitleVisibility();
|
|
576
|
+
|
|
577
|
+
successMessage.style.display = 'block';
|
|
578
|
+
this.querySelector('#formFields').style.display = 'none';
|
|
579
|
+
this.querySelector('#pendingMessage').style.display = 'none';
|
|
580
|
+
this.querySelector('#errorMessage').style.display = 'none';
|
|
581
|
+
return; // Exit early as we don't need to update other UI parts
|
|
582
|
+
} else {
|
|
583
|
+
successMessage.style.display = 'none';
|
|
584
|
+
}
|
|
585
|
+
|
|
586
|
+
// Update title visibility
|
|
587
|
+
this.updateTitleVisibility();
|
|
588
|
+
|
|
589
|
+
// Handle error message visibility
|
|
590
|
+
const errorMessage = this.querySelector('#errorMessage');
|
|
591
|
+
|
|
592
|
+
if (this.error.state) {
|
|
593
|
+
errorMessage.style.display = 'block';
|
|
594
|
+
} else {
|
|
595
|
+
errorMessage.style.display = 'none';
|
|
596
|
+
}
|
|
597
|
+
|
|
598
|
+
// Handle pending message visibility
|
|
599
|
+
this.updatePendingMessageVisibility();
|
|
600
|
+
|
|
601
|
+
// Update field visibility based on current state
|
|
602
|
+
this.updateFieldVisibility();
|
|
603
|
+
|
|
604
|
+
// Update toggle state link
|
|
605
|
+
this.updateToggleStateLink();
|
|
606
|
+
|
|
607
|
+
// Set up captcha if needed
|
|
608
|
+
if (this.state === this.State.SIGNUP) {
|
|
609
|
+
this.setupCaptcha();
|
|
610
|
+
}
|
|
611
|
+
|
|
612
|
+
// Update input values
|
|
613
|
+
this.updateInputValues();
|
|
614
|
+
|
|
615
|
+
// Update button text
|
|
616
|
+
this.updateButtonText();
|
|
617
|
+
}
|
|
618
|
+
|
|
619
|
+
updateTitleVisibility() {
|
|
620
|
+
// First create a map of all title elements
|
|
621
|
+
const titleMap = {
|
|
622
|
+
[this.State.LOGIN]: this.querySelector('#title-login'),
|
|
623
|
+
[this.State.SIGNUP]: this.querySelector('#title-signup'),
|
|
624
|
+
[this.State.RESET_PASSWORD]: this.querySelector('#title-reset'),
|
|
625
|
+
[this.State.EMAIL_VERIFICATION]: this.querySelector('#title-verify'),
|
|
626
|
+
[this.State.SUCCESS]: this.querySelector('#title-success')
|
|
627
|
+
};
|
|
628
|
+
|
|
629
|
+
// Hide all title elements first
|
|
630
|
+
Object.values(titleMap).forEach(elem => {
|
|
631
|
+
if (elem) elem.style.display = 'none';
|
|
632
|
+
});
|
|
633
|
+
|
|
634
|
+
// Show only the current state's title
|
|
635
|
+
const currentTitleElem = titleMap[this.state];
|
|
636
|
+
if (currentTitleElem) {
|
|
637
|
+
currentTitleElem.style.display = '';
|
|
638
|
+
}
|
|
639
|
+
}
|
|
640
|
+
|
|
641
|
+
updateButtonText() {
|
|
642
|
+
// Hide all button text elements
|
|
643
|
+
const buttonTextElements = {
|
|
644
|
+
login: this.querySelector('.login-text'),
|
|
645
|
+
signup: this.querySelector('.signup-text'),
|
|
646
|
+
reset: this.querySelector('.reset-text'),
|
|
647
|
+
verify: this.querySelector('.verify-text'),
|
|
648
|
+
loading: this.querySelector('.loading-text')
|
|
649
|
+
};
|
|
650
|
+
|
|
651
|
+
// Hide all text elements first
|
|
652
|
+
Object.values(buttonTextElements).forEach(elem => {
|
|
653
|
+
if (elem) elem.style.display = 'none';
|
|
654
|
+
});
|
|
655
|
+
|
|
656
|
+
// Determine which text to show based on state
|
|
657
|
+
const textToShow = this.loading ? 'loading' :
|
|
658
|
+
{
|
|
659
|
+
[this.State.LOGIN]: 'login',
|
|
660
|
+
[this.State.SIGNUP]: 'signup',
|
|
661
|
+
[this.State.RESET_PASSWORD]: 'reset',
|
|
662
|
+
[this.State.EMAIL_VERIFICATION]: 'verify'
|
|
663
|
+
}[this.state];
|
|
664
|
+
|
|
665
|
+
// Show the selected text
|
|
666
|
+
const selectedElement = buttonTextElements[textToShow];
|
|
667
|
+
if (selectedElement) {
|
|
668
|
+
selectedElement.style.display = '';
|
|
669
|
+
}
|
|
670
|
+
}
|
|
671
|
+
|
|
672
|
+
updatePendingMessageVisibility() {
|
|
673
|
+
const pendingMessage = this.querySelector('#pendingMessage');
|
|
674
|
+
const formFields = this.querySelector('#formFields');
|
|
675
|
+
|
|
676
|
+
if (this.pending.state) {
|
|
677
|
+
pendingMessage.style.display = 'block';
|
|
678
|
+
formFields.style.display = 'none';
|
|
679
|
+
this.querySelector('#pendingText').textContent = this.pending.message;
|
|
680
|
+
} else {
|
|
681
|
+
pendingMessage.style.display = 'none';
|
|
682
|
+
formFields.style.display = 'block';
|
|
683
|
+
}
|
|
684
|
+
}
|
|
685
|
+
|
|
686
|
+
updateFieldVisibility() {
|
|
687
|
+
// Username field (only visible during signup)
|
|
688
|
+
const usernameField = this.querySelector('#usernameField');
|
|
689
|
+
const usernameInput = this.querySelector('#username');
|
|
690
|
+
if (this.state === this.State.SIGNUP) {
|
|
691
|
+
usernameField.style.display = 'block';
|
|
692
|
+
usernameInput.setAttribute('required', '');
|
|
693
|
+
} else {
|
|
694
|
+
usernameField.style.display = 'none';
|
|
695
|
+
usernameInput.removeAttribute('required');
|
|
696
|
+
}
|
|
697
|
+
|
|
698
|
+
// Email vs Code field visibility
|
|
699
|
+
const emailField = this.querySelector('#emailField');
|
|
700
|
+
const emailInput = this.querySelector('#email');
|
|
701
|
+
const codeField = this.querySelector('#codeField');
|
|
702
|
+
const codeInput = this.querySelector('#code');
|
|
703
|
+
|
|
704
|
+
if (this.state === this.State.EMAIL_VERIFICATION) {
|
|
705
|
+
emailField.style.display = 'none';
|
|
706
|
+
emailInput.removeAttribute('required');
|
|
707
|
+
codeField.style.display = 'block';
|
|
708
|
+
codeInput.setAttribute('required', '');
|
|
709
|
+
} else {
|
|
710
|
+
emailField.style.display = 'block';
|
|
711
|
+
emailInput.setAttribute('required', '');
|
|
712
|
+
codeField.style.display = 'none';
|
|
713
|
+
codeInput.removeAttribute('required');
|
|
714
|
+
}
|
|
715
|
+
|
|
716
|
+
// Password field visibility
|
|
717
|
+
const passwordField = this.querySelector('#passwordField');
|
|
718
|
+
const passwordInput = this.querySelector('#password');
|
|
719
|
+
if (this.state === this.State.RESET_PASSWORD || this.state === this.State.EMAIL_VERIFICATION) {
|
|
720
|
+
passwordField.style.display = 'none';
|
|
721
|
+
passwordInput.removeAttribute('required');
|
|
722
|
+
} else {
|
|
723
|
+
passwordField.style.display = 'block';
|
|
724
|
+
passwordInput.setAttribute('required', '');
|
|
725
|
+
}
|
|
726
|
+
|
|
727
|
+
// Forgot password link visibility
|
|
728
|
+
const forgotPasswordLink = this.querySelector('#forgotPasswordLink');
|
|
729
|
+
if (this.state === this.State.LOGIN) {
|
|
730
|
+
forgotPasswordLink.style.display = 'block';
|
|
731
|
+
} else {
|
|
732
|
+
forgotPasswordLink.style.display = 'none';
|
|
733
|
+
}
|
|
734
|
+
|
|
735
|
+
// Recaptcha visibility
|
|
736
|
+
const recaptchaContainer = this.querySelector('#recaptcha-container');
|
|
737
|
+
if (this.state === this.State.SIGNUP) {
|
|
738
|
+
recaptchaContainer.style.display = 'block';
|
|
739
|
+
} else {
|
|
740
|
+
recaptchaContainer.style.display = 'none';
|
|
741
|
+
}
|
|
742
|
+
}
|
|
743
|
+
|
|
744
|
+
updateToggleStateLink() {
|
|
745
|
+
const toggleStateContainer = this.querySelector('#toggleStateContainer');
|
|
746
|
+
const loginToggle = this.querySelector('.login-toggle');
|
|
747
|
+
const signupToggle = this.querySelector('.signup-toggle');
|
|
748
|
+
|
|
749
|
+
if (this.state === this.State.RESET_PASSWORD || this.state === this.State.EMAIL_VERIFICATION) {
|
|
750
|
+
toggleStateContainer.style.display = 'none';
|
|
751
|
+
} else {
|
|
752
|
+
toggleStateContainer.style.display = 'block';
|
|
753
|
+
|
|
754
|
+
// Show the appropriate toggle based on state
|
|
755
|
+
if (this.state === this.State.LOGIN) {
|
|
756
|
+
loginToggle.style.display = '';
|
|
757
|
+
signupToggle.style.display = 'none';
|
|
758
|
+
|
|
759
|
+
// Add event listener to login toggle
|
|
760
|
+
const toggleLink = loginToggle.querySelector('#toggleState');
|
|
761
|
+
if (toggleLink) {
|
|
762
|
+
toggleLink.addEventListener('click', (e) => {
|
|
763
|
+
e.preventDefault();
|
|
764
|
+
this.state = this.State.SIGNUP;
|
|
765
|
+
this.updateUI();
|
|
766
|
+
});
|
|
767
|
+
}
|
|
768
|
+
} else {
|
|
769
|
+
loginToggle.style.display = 'none';
|
|
770
|
+
signupToggle.style.display = '';
|
|
771
|
+
|
|
772
|
+
// Add event listener to signup toggle
|
|
773
|
+
const toggleLink = signupToggle.querySelector('#toggleState-signup');
|
|
774
|
+
if (toggleLink) {
|
|
775
|
+
toggleLink.addEventListener('click', (e) => {
|
|
776
|
+
e.preventDefault();
|
|
777
|
+
this.state = this.State.LOGIN;
|
|
778
|
+
this.updateUI();
|
|
779
|
+
});
|
|
780
|
+
}
|
|
781
|
+
}
|
|
782
|
+
}
|
|
783
|
+
}
|
|
784
|
+
|
|
785
|
+
updateInputValues() {
|
|
786
|
+
// Update email input
|
|
787
|
+
const emailInput = this.querySelector('#email');
|
|
788
|
+
if (emailInput) {
|
|
789
|
+
emailInput.value = this.email;
|
|
790
|
+
if (this.emailInvalid) {
|
|
791
|
+
emailInput.classList.add('error');
|
|
792
|
+
} else {
|
|
793
|
+
emailInput.classList.remove('error');
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
|
|
797
|
+
// Update password input
|
|
798
|
+
const passwordInput = this.querySelector('#password');
|
|
799
|
+
if (passwordInput) {
|
|
800
|
+
passwordInput.value = this.password;
|
|
801
|
+
if (this.passwordInvalid) {
|
|
802
|
+
passwordInput.classList.add('error');
|
|
803
|
+
} else {
|
|
804
|
+
passwordInput.classList.remove('error');
|
|
805
|
+
}
|
|
806
|
+
}
|
|
807
|
+
|
|
808
|
+
// Update username input
|
|
809
|
+
const usernameInput = this.querySelector('#username');
|
|
810
|
+
if (usernameInput) {
|
|
811
|
+
usernameInput.value = this.username;
|
|
812
|
+
}
|
|
813
|
+
|
|
814
|
+
// Update code input
|
|
815
|
+
const codeInput = this.querySelector('#code');
|
|
816
|
+
if (codeInput) {
|
|
817
|
+
codeInput.value = this.code;
|
|
818
|
+
}
|
|
819
|
+
|
|
820
|
+
// Update submit button state
|
|
821
|
+
const submitButton = this.querySelector('#submitButton');
|
|
822
|
+
if (submitButton) {
|
|
823
|
+
let shouldDisable =
|
|
824
|
+
(!this.email && this.state !== this.State.EMAIL_VERIFICATION) ||
|
|
825
|
+
(!this.password &&
|
|
826
|
+
this.state !== this.State.RESET_PASSWORD &&
|
|
827
|
+
this.state !== this.State.EMAIL_VERIFICATION) ||
|
|
828
|
+
this.loading;
|
|
829
|
+
|
|
830
|
+
// Add captcha check for signup
|
|
831
|
+
if (this.state === this.State.SIGNUP) {
|
|
832
|
+
// For signup, require username and captcha as well
|
|
833
|
+
shouldDisable = shouldDisable ||
|
|
834
|
+
!this.username ||
|
|
835
|
+
!this.captcha; // Make button disabled if captcha is not completed
|
|
836
|
+
}
|
|
837
|
+
|
|
838
|
+
submitButton.disabled = shouldDisable;
|
|
839
|
+
}
|
|
840
|
+
}
|
|
841
|
+
|
|
842
|
+
restoreFocus(activeElementId) {
|
|
843
|
+
if (activeElementId) {
|
|
844
|
+
const elementToFocus = this.querySelector(`#${activeElementId}`);
|
|
845
|
+
if (elementToFocus) {
|
|
846
|
+
elementToFocus.focus();
|
|
847
|
+
|
|
848
|
+
// If it's an input, place cursor at the end
|
|
849
|
+
if (elementToFocus.tagName === 'INPUT' && (elementToFocus.type === 'text' || elementToFocus.type === 'email')) {
|
|
850
|
+
elementToFocus.selectionStart = elementToFocus.selectionEnd = elementToFocus.value.length;
|
|
851
|
+
}
|
|
852
|
+
}
|
|
853
|
+
}
|
|
854
|
+
}
|
|
855
|
+
}
|
|
856
|
+
|
|
857
|
+
// Define the custom element
|
|
858
|
+
customElements.define('login-form', LoginForm);
|
|
859
|
+
</script>
|
package/dist/integration.d.ts
CHANGED
package/dist/integration.js
CHANGED
|
@@ -13,6 +13,7 @@ import { wixSDKContext } from "./vite-plugins/sdk-context.js";
|
|
|
13
13
|
export { wixBlogLoader };
|
|
14
14
|
export function createIntegration(opts = {
|
|
15
15
|
sessionCookieName: "wixSession",
|
|
16
|
+
useWixAuth: true,
|
|
16
17
|
}) {
|
|
17
18
|
const sessionCookieName = opts.sessionCookieName ?? "wixSession";
|
|
18
19
|
let _config;
|
|
@@ -24,26 +25,28 @@ export function createIntegration(opts = {
|
|
|
24
25
|
const aRequire = buildResolver(fileURLToPath(import.meta.url), {
|
|
25
26
|
resolveToAbsolute: true,
|
|
26
27
|
});
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
28
|
+
if (opts.useWixAuth) {
|
|
29
|
+
injectRoute({
|
|
30
|
+
entrypoint: aRequire("./routes/auth/login"),
|
|
31
|
+
pattern: "/api/auth/login",
|
|
32
|
+
prerender: false,
|
|
33
|
+
});
|
|
34
|
+
injectRoute({
|
|
35
|
+
entrypoint: aRequire("./routes/auth/logout"),
|
|
36
|
+
pattern: "/api/auth/logout",
|
|
37
|
+
prerender: false,
|
|
38
|
+
});
|
|
39
|
+
injectRoute({
|
|
40
|
+
entrypoint: aRequire("./routes/auth/callback"),
|
|
41
|
+
pattern: "/api/auth/callback",
|
|
42
|
+
prerender: false,
|
|
43
|
+
});
|
|
44
|
+
injectRoute({
|
|
45
|
+
entrypoint: aRequire("./routes/auth/logout-callback"),
|
|
46
|
+
pattern: "/api/auth/logout-callback",
|
|
47
|
+
prerender: false,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
47
50
|
addMiddleware({
|
|
48
51
|
entrypoint: aRequire("./middleware"),
|
|
49
52
|
order: "pre",
|
|
@@ -223,4 +226,4 @@ export function createIntegration(opts = {
|
|
|
223
226
|
},
|
|
224
227
|
};
|
|
225
228
|
}
|
|
226
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
229
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW50ZWdyYXRpb24uanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9zcmMvaW50ZWdyYXRpb24udHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBRUEsT0FBTyxFQUNMLGtCQUFrQixFQUNsQixtQkFBbUIsR0FDcEIsTUFBTSxnQ0FBZ0MsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBRTVDLE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGNBQWMsQ0FBQztBQUN2RCxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sYUFBYSxDQUFDO0FBQzVDLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSxVQUFVLENBQUM7QUFFekMsT0FBTyxFQUFFLGFBQWEsRUFBRSxNQUFNLG1CQUFtQixDQUFDO0FBQ2xELE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxNQUFNLENBQUM7QUFDL0IsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFDO0FBQzFCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsSUFBSSxFQUFFLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDekMsT0FBTyxJQUFJLE1BQU0sV0FBVyxDQUFDO0FBQzdCLE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUM5RCxPQUFPLEVBQUUsYUFBYSxFQUFFLENBQUM7QUFJekIsTUFBTSxVQUFVLGlCQUFpQixDQUMvQixPQUdJO0lBQ0YsaUJBQWlCLEVBQUUsWUFBWTtJQUMvQixVQUFVLEVBQUUsSUFBSTtDQUNqQjtJQUVELE1BQU0saUJBQWlCLEdBQUcsSUFBSSxDQUFDLGlCQUFpQixJQUFJLFlBQVksQ0FBQztJQUVqRSxJQUFJLE9BQW9CLENBQUM7SUFDekIsSUFBSSxZQUFpQyxDQUFDO0lBRXRDLE9BQU87UUFDTCxJQUFJLEVBQUUsWUFBWTtRQUNsQixLQUFLLEVBQUU7WUFDTCxvQkFBb0IsRUFBRSxLQUFLLEVBQUUsRUFDM0IsTUFBTSxFQUNOLFlBQVksRUFDWixhQUFhLEVBQ2IsV0FBVyxFQUNYLE1BQU0sR0FDUCxFQUFFLEVBQUU7Z0JBQ0gsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUFDLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxFQUFFO29CQUM3RCxpQkFBaUIsRUFBRSxJQUFJO2lCQUN4QixDQUFDLENBQUM7Z0JBRUgsSUFBSSxJQUFJLENBQUMsVUFBVSxFQUFFLENBQUM7b0JBQ3BCLFdBQVcsQ0FBQzt3QkFDVixVQUFVLEVBQUUsUUFBUSxDQUFDLHFCQUFxQixDQUFFO3dCQUM1QyxPQUFPLEVBQUUsaUJBQWlCO3dCQUMxQixTQUFTLEVBQUUsS0FBSztxQkFDakIsQ0FBQyxDQUFDO29CQUVMLFdBQVcsQ0FBQzt3QkFDVixVQUFVLEVBQUUsUUFBUSxDQUFDLHNCQUFzQixDQUFFO3dCQUM3QyxPQUFPLEVBQUUsa0JBQWtCO3dCQUMzQixTQUFTLEVBQUUsS0FBSztxQkFDakIsQ0FBQyxDQUFDO29CQUVILFdBQVcsQ0FBQzt3QkFDVixVQUFVLEVBQUUsUUFBUSxDQUFDLHdCQUF3QixDQUFFO3dCQUMvQyxPQUFPLEVBQUUsb0JBQW9CO3dCQUM3QixTQUFTLEVBQUUsS0FBSztxQkFDakIsQ0FBQyxDQUFDO29CQUVILFdBQVcsQ0FBQzt3QkFDVixVQUFVLEVBQUUsUUFBUSxDQUFDLCtCQUErQixDQUFFO3dCQUNwRCxPQUFPLEVBQUUsMkJBQTJCO3dCQUNwQyxTQUFTLEVBQUUsS0FBSztxQkFDakIsQ0FBQyxDQUFDO2dCQUNMLENBQUM7Z0JBRUQsYUFBYSxDQUFDO29CQUNaLFVBQVUsRUFBRSxRQUFRLENBQUMsY0FBYyxDQUFFO29CQUNyQyxLQUFLLEVBQUUsS0FBSztpQkFDYixDQUFDLENBQUM7Z0JBRUgsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUNyQixPQUFPLENBQUMsR0FBRyxDQUFDLFVBQVUsQ0FBQyxJQUFJLGFBQWEsRUFDeEMsT0FBTyxDQUFDLEdBQUcsRUFBRSxFQUNiLEVBQUUsQ0FDSCxDQUFDO2dCQUVGLElBQUksQ0FBQyxPQUFPLENBQUMsZUFBZSxDQUFDLEVBQUUsQ0FBQztvQkFDOUIsTUFBTSxDQUFDLEtBQUssQ0FDVixPQUFPLENBQUE7MkNBQ3dCLEtBQUssQ0FBQyxVQUFVLENBQUMsZUFBZSxDQUFDO3VEQUNyQixLQUFLLENBQUMsVUFBVSxDQUN6RCxlQUFlLENBQ2hCOzs7Z0JBR0csS0FBSyxDQUFDLE9BQU8sQ0FBQyxtQ0FBbUMsQ0FBQzs7Ozs7O2VBTW5ELENBQ0osQ0FBQztvQkFFRixNQUFNLElBQUksS0FBSyxDQUNiLEdBQUcsS0FBSyxDQUFDLE9BQU8sQ0FDZCxlQUFlLENBQ2hCLDRDQUE0QyxDQUM5QyxDQUFDO2dCQUNKLENBQUM7Z0JBRUQsWUFBWSxDQUFDO29CQUNYLEdBQUcsRUFBRTt3QkFDSCxNQUFNLEVBQUU7NEJBQ04sYUFBYSxFQUFFO2dDQUNiLElBQUksRUFBRSxRQUFRO2dDQUNkLE1BQU0sRUFBRSxRQUFRO2dDQUNoQixPQUFPLEVBQUUsUUFBUTs2QkFDbEI7NEJBQ0QsaUJBQWlCLEVBQUU7Z0NBQ2pCLElBQUksRUFBRSxRQUFRO2dDQUNkLE1BQU0sRUFBRSxRQUFRO2dDQUNoQixPQUFPLEVBQUUsUUFBUTtnQ0FDakIsUUFBUSxFQUFFLElBQUk7NkJBQ2Y7NEJBQ0QscUJBQXFCLEVBQUU7Z0NBQ3JCLElBQUksRUFBRSxRQUFRO2dDQUNkLE1BQU0sRUFBRSxRQUFRO2dDQUNoQixPQUFPLEVBQUUsUUFBUTtnQ0FDakIsUUFBUSxFQUFFLElBQUk7NkJBQ2Y7NEJBQ0Qsc0JBQXNCLEVBQUU7Z0NBQ3RCLElBQUksRUFBRSxRQUFRO2dDQUNkLE1BQU0sRUFBRSxRQUFRO2dDQUNoQixPQUFPLEVBQUUsUUFBUTtnQ0FDakIsUUFBUSxFQUFFLElBQUk7NkJBQ2Y7NEJBQ0QsUUFBUSxFQUFFO2dDQUNSLElBQUksRUFBRSxRQUFRO2dDQUNkLE1BQU0sRUFBRSxRQUFRO2dDQUNoQixPQUFPLEVBQUUsUUFBUTs2QkFDbEI7NEJBQ0QsdUJBQXVCLEVBQUU7Z0NBQ3ZCLElBQUksRUFBRSxRQUFRO2dDQUNkLE1BQU0sRUFBRSxRQUFRO2dDQUNoQixPQUFPLEVBQUUsUUFBUTtnQ0FDakIsUUFBUSxFQUFFLElBQUk7Z0NBQ2QsT0FBTyxFQUFFLElBQUksQ0FBQyxpQkFBaUI7NkJBQ2hDO3lCQUNGO3FCQUNGO29CQUNELEtBQUssRUFBRTt3QkFDTCxNQUFNLEVBQUUsSUFBSSxHQUFHLENBQ2IsV0FBVyxtQkFBbUIsQ0FBQyxrQkFBa0IsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUMsRUFBRSxFQUNqRSxNQUFNLENBQUMsTUFBTSxDQUNkO3dCQUNELE1BQU0sRUFBRSxJQUFJLEdBQUcsQ0FBQyxXQUFXLEVBQUUsTUFBTSxDQUFDLE1BQU0sQ0FBQzt3QkFDM0MsV0FBVyxFQUFFLFVBQVU7d0JBQ3ZCLFNBQVMsRUFBRSxLQUFLO3FCQUNqQjtvQkFDRCxJQUFJLEVBQUU7d0JBQ0osT0FBTyxFQUFFOzRCQUNQLDBFQUEwRTs0QkFDMUUsNkZBQTZGOzRCQUM3RixnRkFBZ0Y7NEJBQ2hGLGtGQUFrRjs0QkFDbEYsYUFBYSxDQUFDO2dDQUNaLGlCQUFpQjs2QkFDbEIsQ0FBQzt5QkFDSDtxQkFDRjtvQkFDRCxLQUFLLEVBQUU7d0JBQ0wsT0FBTyxFQUFFLHVCQUF1QixFQUFFO3dCQUNsQyxPQUFPLEVBQUUsQ0FBQyxzQkFBc0IsQ0FBQztxQkFDbEM7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELG1CQUFtQixFQUFFLEtBQUssRUFBRSxFQUFFLFVBQVUsRUFBRSxNQUFNLEVBQUUsV0FBVyxFQUFFLEVBQUUsRUFBRTtnQkFDakUsT0FBTyxHQUFHLE1BQU0sQ0FBQztnQkFFakIsWUFBWSxHQUFHLFdBQVcsQ0FBQztnQkFFM0IsSUFBSSxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzlCLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxVQUFVLENBQUM7b0JBQ1QsSUFBSSxFQUFFLFlBQVk7b0JBQ2xCLGdCQUFnQixFQUFFLGFBQWEsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FDdEQsc0JBQXNCLENBQ3ZCO29CQUNELE9BQU8sRUFBRSxDQUFDLFNBQVMsQ0FBQztvQkFDcEIsZUFBZSxFQUFFO3dCQUNmLGNBQWMsRUFBRSxLQUFLO3dCQUNyQixXQUFXLEVBQUUsUUFBUTtxQkFDdEI7b0JBQ0Qsc0JBQXNCLEVBQUU7d0JBQ3RCLFlBQVksRUFBRSxRQUFRO3dCQUN0QixZQUFZLEVBQUUsUUFBUTt3QkFDdEIsWUFBWSxFQUFFLGFBQWE7d0JBQzNCLFdBQVcsRUFBRSxjQUFjO3dCQUMzQixpQkFBaUIsRUFBRSxhQUFhO3dCQUNoQyxZQUFZLEVBQUUsUUFBUTtxQkFDdkI7aUJBQ0YsQ0FBQyxDQUFDO1lBQ0wsQ0FBQztZQUNELG1CQUFtQixFQUFFLENBQUMsRUFBRSxJQUFJLEVBQUUsTUFBTSxFQUFFLEVBQUUsRUFBRTtnQkFDeEMsSUFBSSxZQUFZLEtBQUssUUFBUSxFQUFFLENBQUM7b0JBQzlCLE9BQU87Z0JBQ1QsQ0FBQztnQkFFRCxJQUFJLE1BQU0sS0FBSyxRQUFRLEVBQUUsQ0FBQztvQkFDeEIsSUFBSSxDQUFDLE9BQU8sS0FBSyxFQUFFLENBQUM7b0JBQ3BCLElBQUksQ0FBQyxPQUFPLENBQUMsS0FBSyxLQUFLLEVBQUUsQ0FBQztvQkFFMUIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssRUFBRSxDQUFDO29CQUMvQix5R0FBeUc7b0JBQ3pHLCtDQUErQztvQkFDL0MsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFFbEQsSUFBSSxDQUFDLEdBQUcsS0FBSyxFQUFFLENBQUM7b0JBQ2hCLElBQUksQ0FBQyxHQUFHLENBQUMsTUFBTSxHQUFHLFdBQVcsQ0FBQztvQkFDOUIsSUFBSSxDQUFDLEdBQUcsQ0FBQyxVQUFVLEdBQUcsSUFBSSxDQUFDO29CQUUzQixJQUFJLE9BQU8sT0FBTyxDQUFDLElBQUksQ0FBQyxHQUFHLEVBQUUsUUFBUSxLQUFLLFdBQVc7d0JBQ25ELElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLENBQUMsa0JBQWtCLENBQUMsQ0FBQztvQkFDM0MsSUFBSSxPQUFPLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsS0FBSyxTQUFTO3dCQUNqRCxJQUFJLENBQUMsR0FBRyxDQUFDLFFBQVEsR0FBRyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUM7b0JBQ2pELElBQUksS0FBSyxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsSUFBSSxDQUFDLEdBQUcsRUFBRSxRQUFRLENBQUMsRUFBRSxDQUFDO3dCQUM5Qyx5REFBeUQ7d0JBQ3pELCtIQUErSDt3QkFDL0gsdUlBQXVJO3dCQUN2SSxvRkFBb0Y7d0JBQ3BGLElBQUksQ0FBQyxHQUFHLENBQUMsUUFBUSxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLFFBQVEsQ0FBQyxNQUFNLENBQ25ELENBQUMsS0FBSyxFQUFFLEVBQUUsQ0FBQyxLQUFLLEtBQUssc0JBQXNCLENBQzVDLENBQUM7d0JBQ0YsSUFBSSxDQUFDLEdBQUcsQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLGtCQUFrQixDQUFDLENBQUM7b0JBQzdDLENBQUM7Z0JBQ0gsQ0FBQztnQkFDRCwyRkFBMkY7Z0JBQzNGLCtEQUErRDtnQkFDL0QsdURBQXVEO2dCQUN2RCwyREFBMkQ7Z0JBQzNELElBQUksTUFBTSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUN4QixJQUFJLENBQUMsT0FBTyxLQUFLLEVBQUUsQ0FBQztvQkFDcEIsSUFBSSxDQUFDLE9BQU8sQ0FBQyxVQUFVLEtBQUssRUFBRSxDQUFDO29CQUMvQixJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsR0FBRyxJQUFJLENBQUMsT0FBTyxDQUFDLFVBQVUsQ0FBQyxNQUFNLENBQ3RELENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssU0FBUyxJQUFJLENBQUMsS0FBSyxRQUFRLENBQ3pDLENBQUM7Z0JBQ0osQ0FBQztZQUNILENBQUM7WUFDRCxrQkFBa0IsRUFBRSxLQUFLLEVBQUUsV0FBVyxFQUFFLEVBQUU7Z0JBQ3hDLE1BQU0sUUFBUSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FBQztnQkFDOUMsTUFBTSxlQUFlLEdBQ25CLFlBQVksS0FBSyxRQUFRO29CQUN2QixDQUFDLENBQUMsUUFBUTtvQkFDVixDQUFDLENBQUMsUUFBUTt3QkFDVixDQUFDLENBQUMsUUFBUTt3QkFDVixDQUFDLENBQUMsYUFBYSxDQUFDO2dCQUVwQixNQUFNLGVBQWUsR0FBRyxLQUFLLElBQUksRUFBRTtvQkFDakMsTUFBTSxTQUFTLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsRUFBRSxRQUFRLENBQUMsQ0FBQztvQkFDL0QsTUFBTSxFQUFFLENBQUMsS0FBSyxDQUFDLFNBQVMsRUFBRSxFQUFFLFNBQVMsRUFBRSxJQUFJLEVBQUUsQ0FBQyxDQUFDO29CQUUvQywyQ0FBMkM7b0JBQzNDLE1BQU0sS0FBSyxHQUFHLE1BQU0sRUFBRSxDQUFDLE9BQU8sQ0FBQyxPQUFPLENBQUMsTUFBTSxDQUFDLFFBQVEsQ0FBQyxDQUFDO29CQUN4RCxNQUFNLE9BQU8sQ0FBQyxHQUFHLENBQ2YsS0FBSzt5QkFDRixNQUFNLENBQUMsQ0FBQyxJQUFJLEVBQUUsRUFBRSxDQUFDLElBQUksS0FBSyxRQUFRLENBQUM7eUJBQ25DLEdBQUcsQ0FBQyxDQUFDLElBQUksRUFBRSxFQUFFLENBQ1osRUFBRSxDQUFDLE1BQU0sQ0FDUCxJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLElBQUksQ0FBQyxFQUN4QyxJQUFJLENBQUMsSUFBSSxDQUFDLFNBQVMsRUFBRSxJQUFJLENBQUMsQ0FDM0IsQ0FDRixDQUNKLENBQUM7Z0JBQ0osQ0FBQyxDQUFDO2dCQUVGLElBQUksWUFBWSxLQUFLLFFBQVEsRUFBRSxDQUFDO29CQUM5QixJQUFJLENBQUM7d0JBQ0gsTUFBTSxlQUFlLEVBQUUsQ0FBQztvQkFDMUIsQ0FBQztvQkFBQyxPQUFPLEVBQUUsRUFBRSxDQUFDO3dCQUNaLE9BQU8sQ0FBQyxLQUFLLENBQ1gsd0RBQ0csRUFBWSxDQUFDLE9BQ2hCLEVBQUUsQ0FDSCxDQUFDO3dCQUNGLE1BQU0sRUFBRSxDQUFDO29CQUNYLENBQUM7Z0JBQ0gsQ0FBQztnQkFFRCxNQUFNLFFBQVEsR0FBRztvQkFDZixPQUFPLEVBQUUsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUM7b0JBQ2hDLGVBQWU7aUJBQ2hCLENBQUM7Z0JBRUYsTUFBTSxFQUFFLENBQUMsU0FBUyxDQUNoQixJQUFJLENBQUMsSUFBSSxDQUFDLE9BQU8sQ0FBQyxNQUFNLENBQUMsUUFBUSxFQUFFLDBCQUEwQixDQUFDLEVBQzlELElBQUksQ0FBQyxTQUFTLENBQUMsUUFBUSxFQUFFLElBQUksRUFBRSxDQUFDLENBQUMsQ0FBQyxvQ0FBb0M7aUJBQ3ZFLENBQUM7WUFDSixDQUFDO1NBQ0Y7S0FDRixDQUFDO0FBQ0osQ0FBQyJ9
|
|
@@ -56,7 +56,8 @@ export function wixSDKContext(opts) {
|
|
|
56
56
|
clientId: ${JSON.stringify(userLoadedEnv["WIX_CLIENT_ID"])},
|
|
57
57
|
tokens: getCookieAsJson(${JSON.stringify(opts.sessionCookieName)})?.tokens,
|
|
58
58
|
}),
|
|
59
|
-
})
|
|
59
|
+
}),
|
|
60
|
+
clientId: ${JSON.stringify(userLoadedEnv["WIX_CLIENT_ID"])},
|
|
60
61
|
};
|
|
61
62
|
`;
|
|
62
63
|
}
|
|
@@ -64,4 +65,4 @@ export function wixSDKContext(opts) {
|
|
|
64
65
|
},
|
|
65
66
|
};
|
|
66
67
|
}
|
|
67
|
-
//# sourceMappingURL=data:application/json;base64,
|
|
68
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2RrLWNvbnRleHQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvdml0ZS1wbHVnaW5zL3Nkay1jb250ZXh0LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sYUFBYSxNQUFNLGFBQWEsQ0FBQztBQUN4QyxPQUFPLEVBQUUsYUFBYSxFQUFFLE1BQU0sVUFBVSxDQUFDO0FBQ3pDLE9BQU8sRUFBRSxPQUFPLEVBQVUsTUFBTSxNQUFNLENBQUM7QUFHdkMsTUFBTSxVQUFVLGFBQWEsQ0FBQyxJQUFtQztJQUMvRCxNQUFNLGVBQWUsR0FBRyxrQkFBa0IsQ0FBQztJQUMzQyxNQUFNLHVCQUF1QixHQUFHLElBQUksR0FBRyxlQUFlLENBQUM7SUFFdkQsT0FBTztRQUNMLElBQUksRUFBRSx5QkFBeUI7UUFDL0IsT0FBTyxFQUFFLEtBQUssRUFBRSw0REFBNEQ7UUFFNUUsTUFBTSxDQUFDLENBQUMsRUFBRSxFQUFFLFVBQVUsRUFBRTtZQUN0QixJQUFJLFVBQVU7Z0JBQUUsT0FBTyxDQUFDLGlDQUFpQztZQUN6RCxPQUFPO2dCQUNMLFlBQVksRUFBRTtvQkFDWixPQUFPLEVBQUUsQ0FBQyxlQUFlLENBQUMsRUFBRSwrQ0FBK0M7aUJBQzVFO2FBQ0YsQ0FBQztRQUNKLENBQUM7UUFFRCxTQUFTLENBQUMsRUFBRSxFQUFFLENBQUMsRUFBRSxFQUFFLEdBQUcsRUFBRTtZQUN0QixJQUFJLEdBQUc7Z0JBQUUsT0FBTyxJQUFJLENBQUMsQ0FBQyxpQ0FBaUM7WUFDdkQsSUFBSSxFQUFFLEtBQUssZUFBZSxFQUFFLENBQUM7Z0JBQzNCLE9BQU8sdUJBQXVCLENBQUM7WUFDakMsQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztRQUVELElBQUksQ0FBQyxFQUFFO1lBQ0wsSUFBSSxFQUFFLEtBQUssdUJBQXVCLEVBQUUsQ0FBQztnQkFDbkMsTUFBTSxRQUFRLEdBQUcsYUFBYSxDQUM1QixhQUFhLENBQUMsTUFBTSxDQUFDLElBQUksQ0FBQyxHQUFHLENBQUMsRUFDOUI7b0JBQ0UsaUJBQWlCLEVBQUUsSUFBSTtpQkFDeEIsQ0FDRixDQUFDO2dCQUVGLE1BQU0sYUFBYSxHQUFHLE9BQU8sQ0FDM0IsT0FBTyxDQUFDLEdBQUcsQ0FBQyxVQUFVLENBQUMsSUFBSSxhQUFhLEVBQ3hDLE9BQU8sQ0FBQyxHQUFHLEVBQUUsRUFDYixFQUFFLENBQ0gsQ0FBQztnQkFDRixNQUFNLGNBQWMsR0FBRyxRQUFRLENBQUMsaUJBQWlCLENBQUMsQ0FBQztnQkFDbkQsTUFBTSxrQkFBa0IsR0FBRyxRQUFRLENBQ2pDLDRCQUE0QixDQUM3QixDQUFDO2dCQUVKLE9BQU8saUNBQWlDLGNBQWM7aURBQ1gsa0JBQWtCOzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztnQ0FvQm5DLElBQUksQ0FBQyxTQUFTLENBQ3hCLGFBQWEsQ0FBQyxlQUFlLENBQUMsQ0FDL0I7OENBQ3lCLElBQUksQ0FBQyxTQUFTLENBQ3RDLElBQUksQ0FBQyxpQkFBaUIsQ0FDdkI7Ozs0QkFHTyxJQUFJLENBQUMsU0FBUyxDQUN4QixhQUFhLENBQUMsZUFBZSxDQUFDLENBQy9COztpQkFFQSxDQUFDO1lBQ1osQ0FBQztZQUNELE9BQU8sSUFBSSxDQUFDO1FBQ2QsQ0FBQztLQUNGLENBQUM7QUFDSixDQUFDIn0=
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wix/astro",
|
|
3
3
|
"description": "Develop your Astro site on the Wix Platform",
|
|
4
|
-
"version": "0.2.
|
|
4
|
+
"version": "0.2.16",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"license": "MIT",
|
|
7
7
|
"keywords": [
|
|
@@ -14,13 +14,14 @@
|
|
|
14
14
|
"./loaders": "./dist/loaders/index.js",
|
|
15
15
|
"./entrypoints/server.js": "./dist/entrypoints/server.js",
|
|
16
16
|
"./package.json": "./package.json",
|
|
17
|
-
"./runtime": "./dist/runtime.js"
|
|
17
|
+
"./runtime": "./dist/runtime.js",
|
|
18
|
+
"./components/login.astro": "./dist/components/login.astro"
|
|
18
19
|
},
|
|
19
20
|
"files": [
|
|
20
21
|
"dist"
|
|
21
22
|
],
|
|
22
23
|
"scripts": {
|
|
23
|
-
"build": "tsc",
|
|
24
|
+
"build": "tsc && cp -r src/components/*.astro dist/components/",
|
|
24
25
|
"test": ":"
|
|
25
26
|
},
|
|
26
27
|
"dependencies": {
|
|
@@ -30,11 +31,13 @@
|
|
|
30
31
|
"@cloudflare/workers-types": "^4.20241224.0",
|
|
31
32
|
"@wix/blog": "^1.0.345",
|
|
32
33
|
"@wix/data": "^1.0.194",
|
|
34
|
+
"@wix/identity": "^1.0.125",
|
|
33
35
|
"@wix/sdk": "^1.15.14",
|
|
34
36
|
"chalk": "^5.4.1",
|
|
35
37
|
"esm-resolve": "^1.0.11",
|
|
36
38
|
"globby": "^14.0.2",
|
|
37
39
|
"magic-string": "^0.30.17",
|
|
40
|
+
"oauth4webapi": "^3.4.0",
|
|
38
41
|
"outdent": "^0.8.0",
|
|
39
42
|
"p-retry": "^6.2.1",
|
|
40
43
|
"vite": "^6.0.0"
|