@geexcode/geex-extensions-authentication-wechat 0.0.1

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.
@@ -0,0 +1,207 @@
1
+ import gql from 'graphql-tag';
2
+ import { Apollo } from 'apollo-angular';
3
+ import { OAuthService } from 'angular-oauth2-oidc';
4
+ import { isObservable, firstValueFrom } from 'rxjs';
5
+ import { geex, provideGeexModuleContribution } from '@geexcode/geex-angular';
6
+ import { InjectionToken, makeEnvironmentProviders } from '@angular/core';
7
+
8
+ const RESOLVE_LOGIN = gql `
9
+ mutation resolveLogin($loginProvider: LoginProviderEnum!, $code: String!) {
10
+ resolveLogin(request: { loginProvider: $loginProvider, code: $code }) {
11
+ isLinked
12
+ userLoginLinkToken
13
+ displayName
14
+ session {
15
+ token
16
+ userId
17
+ loginProvider
18
+ }
19
+ }
20
+ }
21
+ `;
22
+ const LINK_LOGIN = gql `
23
+ mutation linkLogin($userLoginLinkToken: String!) {
24
+ linkLogin(request: { userLoginLinkToken: $userLoginLinkToken }) {
25
+ token
26
+ userId
27
+ loginProvider
28
+ }
29
+ }
30
+ `;
31
+ const REGISTER_AND_LINK_LOGIN = gql `
32
+ mutation registerAndLinkLogin(
33
+ $userLoginLinkToken: String!
34
+ $username: String!
35
+ $password: String!
36
+ $phoneNumber: String
37
+ $email: String
38
+ $nickname: String
39
+ ) {
40
+ registerAndLinkLogin(
41
+ request: {
42
+ userLoginLinkToken: $userLoginLinkToken
43
+ username: $username
44
+ password: $password
45
+ phoneNumber: $phoneNumber
46
+ email: $email
47
+ nickname: $nickname
48
+ }
49
+ ) {
50
+ token
51
+ userId
52
+ loginProvider
53
+ }
54
+ }
55
+ `;
56
+
57
+ const WX_LOGIN_SCRIPT = "https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js";
58
+ async function mutate(client, options) {
59
+ const result = client.mutate(options);
60
+ if (isObservable(result)) {
61
+ const response = await firstValueFrom(result);
62
+ return response.data;
63
+ }
64
+ const response = await result;
65
+ return response.data;
66
+ }
67
+ function createAuthenticationWechatModule(injector, options) {
68
+ const apollo = () => injector.get(Apollo);
69
+ const oauth = () => injector.get(OAuthService);
70
+ const getConfig = (overrides) => {
71
+ const merged = { ...options, ...overrides };
72
+ if (!merged.webAppId || !merged.redirectUri) {
73
+ throw new Error("GeexAuthenticationWechatOptions.webAppId and redirectUri are required.");
74
+ }
75
+ return merged;
76
+ };
77
+ const loadWxLoginScript = async () => {
78
+ if (typeof window === "undefined") {
79
+ return;
80
+ }
81
+ if (window.WxLogin) {
82
+ return;
83
+ }
84
+ await new Promise((resolve, reject) => {
85
+ const existing = document.querySelector(`script[src="${WX_LOGIN_SCRIPT}"]`);
86
+ if (existing) {
87
+ existing.addEventListener("load", () => resolve());
88
+ existing.addEventListener("error", () => reject(new Error("Failed to load WxLogin.js")));
89
+ return;
90
+ }
91
+ const script = document.createElement("script");
92
+ script.src = WX_LOGIN_SCRIPT;
93
+ script.async = true;
94
+ script.onload = () => resolve();
95
+ script.onerror = () => reject(new Error("Failed to load WxLogin.js"));
96
+ document.body.appendChild(script);
97
+ });
98
+ };
99
+ const establishSession = (sessionOptions) => {
100
+ // Hand Geex token to IdP; browser leaves this page and returns via OIDC callback,
101
+ // which is then consumed once by GeexStartupService.tryOidcCodeCallback.
102
+ oauth().initCodeFlow(sessionOptions.returnUrl ?? "/", { access_token: sessionOptions.token });
103
+ };
104
+ const resolveLogin = async (params) => {
105
+ const data = await mutate(apollo(), {
106
+ mutation: RESOLVE_LOGIN,
107
+ variables: {
108
+ loginProvider: params.loginProvider,
109
+ code: params.code,
110
+ },
111
+ });
112
+ return data.resolveLogin;
113
+ };
114
+ const module = {
115
+ getConfig,
116
+ buildAuthorizeUrl: (overrides) => {
117
+ const config = getConfig(overrides);
118
+ const state = overrides?.state ?? "WechatWeb";
119
+ const redirectUri = encodeURIComponent(config.redirectUri);
120
+ return `https://open.weixin.qq.com/connect/qrconnect?appid=${encodeURIComponent(config.webAppId)}&redirect_uri=${redirectUri}&response_type=code&scope=snsapi_login&state=${encodeURIComponent(state)}#wechat_redirect`;
121
+ },
122
+ renderQr: async (overrides) => {
123
+ const mocking = geex.mocking;
124
+ if (mocking?.getCapabilities && mocking.renderWechatQr) {
125
+ const caps = await mocking.getCapabilities();
126
+ if (caps.enabled && caps.wechatWeb) {
127
+ await mocking.renderWechatQr(overrides);
128
+ return;
129
+ }
130
+ }
131
+ const config = getConfig(overrides);
132
+ await loadWxLoginScript();
133
+ const id = config.containerId ?? "wechat_login_container";
134
+ if (!window.WxLogin) {
135
+ throw new Error("WxLogin is not available.");
136
+ }
137
+ new window.WxLogin({
138
+ self_redirect: false,
139
+ id,
140
+ appid: config.webAppId,
141
+ scope: "snsapi_login",
142
+ redirect_uri: encodeURIComponent(config.redirectUri),
143
+ state: overrides?.state ?? "WechatWeb",
144
+ style: config.style,
145
+ href: config.href,
146
+ });
147
+ },
148
+ extractCallbackCode: (search = typeof location !== "undefined" ? location.search : "") => {
149
+ const params = new URLSearchParams(search.startsWith("?") ? search : `?${search}`);
150
+ return {
151
+ code: params.get("code") ?? undefined,
152
+ state: params.get("state") ?? undefined,
153
+ };
154
+ },
155
+ resolveLogin,
156
+ linkLogin: async (userLoginLinkToken, context) => {
157
+ const data = await mutate(apollo(), {
158
+ mutation: LINK_LOGIN,
159
+ variables: { userLoginLinkToken },
160
+ context,
161
+ });
162
+ return data.linkLogin;
163
+ },
164
+ registerAndLinkLogin: async (params) => {
165
+ const data = await mutate(apollo(), {
166
+ mutation: REGISTER_AND_LINK_LOGIN,
167
+ variables: params,
168
+ });
169
+ return data.registerAndLinkLogin;
170
+ },
171
+ establishSession,
172
+ loginWithMiniProgramCode: async (code, returnUrl) => {
173
+ const result = await resolveLogin({
174
+ loginProvider: "WechatMiniProgram",
175
+ code,
176
+ });
177
+ if (result.isLinked && result.session?.token) {
178
+ establishSession({
179
+ token: result.session.token,
180
+ returnUrl,
181
+ });
182
+ }
183
+ return result;
184
+ },
185
+ init: async () => undefined,
186
+ };
187
+ return module;
188
+ }
189
+
190
+ const GEEX_AUTHENTICATION_WECHAT_OPTIONS = new InjectionToken("GEEX_AUTHENTICATION_WECHAT_OPTIONS");
191
+ function provideGeexAuthenticationWechat(options) {
192
+ return makeEnvironmentProviders([
193
+ { provide: GEEX_AUTHENTICATION_WECHAT_OPTIONS, useValue: options },
194
+ provideGeexModuleContribution({
195
+ createModules: ({ injector }) => ({
196
+ authenticationWechat: (options.createAuthenticationWechatModule ?? createAuthenticationWechatModule)(injector, options),
197
+ }),
198
+ }),
199
+ ]);
200
+ }
201
+
202
+ /**
203
+ * Generated bundle index. Do not edit.
204
+ */
205
+
206
+ export { GEEX_AUTHENTICATION_WECHAT_OPTIONS, LINK_LOGIN, REGISTER_AND_LINK_LOGIN, RESOLVE_LOGIN, createAuthenticationWechatModule, provideGeexAuthenticationWechat };
207
+ //# sourceMappingURL=geexcode-geex-extensions-authentication-wechat.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"geexcode-geex-extensions-authentication-wechat.mjs","sources":["../../src/graphql.ts","../../src/authentication-wechat.module.ts","../../src/provide-geex-authentication-wechat.ts","../../src/geexcode-geex-extensions-authentication-wechat.ts"],"sourcesContent":["import { TypedDocumentNode as DocumentNode } from \"@graphql-typed-document-node/core\";\nimport gql from \"graphql-tag\";\nimport { ResolveLoginResult, WechatLoginProvider } from \"./authentication-wechat.types\";\n\nexport type UserSessionResult = {\n token?: string | null;\n userId: string;\n loginProvider: string;\n};\n\nexport type ResolveLoginVariables = {\n loginProvider: WechatLoginProvider;\n code: string;\n};\n\nexport type ResolveLoginMutationResult = {\n resolveLogin: ResolveLoginResult;\n};\n\nexport type LinkLoginVariables = {\n userLoginLinkToken: string;\n};\n\nexport type LinkLoginResult = {\n linkLogin: UserSessionResult;\n};\n\nexport type RegisterAndLinkLoginVariables = {\n userLoginLinkToken: string;\n username: string;\n password: string;\n phoneNumber?: string | null;\n email?: string | null;\n nickname?: string | null;\n};\n\nexport type RegisterAndLinkLoginResult = {\n registerAndLinkLogin: UserSessionResult;\n};\n\nexport const RESOLVE_LOGIN = gql`\n mutation resolveLogin($loginProvider: LoginProviderEnum!, $code: String!) {\n resolveLogin(request: { loginProvider: $loginProvider, code: $code }) {\n isLinked\n userLoginLinkToken\n displayName\n session {\n token\n userId\n loginProvider\n }\n }\n }\n` as unknown as DocumentNode<ResolveLoginMutationResult, ResolveLoginVariables>;\n\nexport const LINK_LOGIN = gql`\n mutation linkLogin($userLoginLinkToken: String!) {\n linkLogin(request: { userLoginLinkToken: $userLoginLinkToken }) {\n token\n userId\n loginProvider\n }\n }\n` as unknown as DocumentNode<LinkLoginResult, LinkLoginVariables>;\n\nexport const REGISTER_AND_LINK_LOGIN = gql`\n mutation registerAndLinkLogin(\n $userLoginLinkToken: String!\n $username: String!\n $password: String!\n $phoneNumber: String\n $email: String\n $nickname: String\n ) {\n registerAndLinkLogin(\n request: {\n userLoginLinkToken: $userLoginLinkToken\n username: $username\n password: $password\n phoneNumber: $phoneNumber\n email: $email\n nickname: $nickname\n }\n ) {\n token\n userId\n loginProvider\n }\n }\n` as unknown as DocumentNode<RegisterAndLinkLoginResult, RegisterAndLinkLoginVariables>;\n","import { Injector } from \"@angular/core\";\nimport { ApolloClient } from \"@apollo/client/core\";\nimport { Apollo } from \"apollo-angular\";\nimport { OAuthService } from \"angular-oauth2-oidc\";\nimport { firstValueFrom, isObservable } from \"rxjs\";\nimport { geex } from \"@geexcode/geex-angular\";\nimport { LINK_LOGIN, REGISTER_AND_LINK_LOGIN, RESOLVE_LOGIN } from \"./graphql\";\nimport type {\n AuthenticationWechatModule,\n AuthenticationWechatRenderOverrides,\n EstablishSessionOptions,\n GeexAuthenticationWechatOptions,\n ResolveLoginResult,\n WechatLoginProvider,\n} from \"./authentication-wechat.types\";\n\nconst WX_LOGIN_SCRIPT = \"https://res.wx.qq.com/connect/zh_CN/htmledition/js/wxLogin.js\";\n\ntype ApolloLike = Apollo | ApolloClient;\n\ntype MockingWechatHost = {\n getCapabilities(): Promise<{ enabled: boolean; wechatWeb: boolean }>;\n renderWechatQr(overrides?: AuthenticationWechatRenderOverrides): Promise<void>;\n};\n\nasync function mutate<T>(\n client: ApolloLike,\n options: { mutation: unknown; variables: Record<string, unknown>; context?: Record<string, unknown> },\n): Promise<T> {\n const result = (client as Apollo).mutate<T>(options as never) as unknown;\n if (isObservable(result)) {\n const response = await firstValueFrom(result as import(\"rxjs\").Observable<{ data: T }>);\n return response.data;\n }\n const response = await (result as Promise<{ data: T }>);\n return response.data;\n}\n\nexport function createAuthenticationWechatModule(\n injector: Injector,\n options: Readonly<GeexAuthenticationWechatOptions>,\n): AuthenticationWechatModule {\n const apollo = () => injector.get(Apollo);\n const oauth = () => injector.get(OAuthService);\n\n const getConfig = (overrides?: Partial<GeexAuthenticationWechatOptions>): GeexAuthenticationWechatOptions => {\n const merged = { ...options, ...overrides };\n if (!merged.webAppId || !merged.redirectUri) {\n throw new Error(\"GeexAuthenticationWechatOptions.webAppId and redirectUri are required.\");\n }\n return merged;\n };\n\n const loadWxLoginScript = async (): Promise<void> => {\n if (typeof window === \"undefined\") {\n return;\n }\n if (window.WxLogin) {\n return;\n }\n await new Promise<void>((resolve, reject) => {\n const existing = document.querySelector(`script[src=\"${WX_LOGIN_SCRIPT}\"]`);\n if (existing) {\n existing.addEventListener(\"load\", () => resolve());\n existing.addEventListener(\"error\", () => reject(new Error(\"Failed to load WxLogin.js\")));\n return;\n }\n const script = document.createElement(\"script\");\n script.src = WX_LOGIN_SCRIPT;\n script.async = true;\n script.onload = () => resolve();\n script.onerror = () => reject(new Error(\"Failed to load WxLogin.js\"));\n document.body.appendChild(script);\n });\n };\n\n const establishSession = (sessionOptions: EstablishSessionOptions): void => {\n // Hand Geex token to IdP; browser leaves this page and returns via OIDC callback,\n // which is then consumed once by GeexStartupService.tryOidcCodeCallback.\n oauth().initCodeFlow(sessionOptions.returnUrl ?? \"/\", { access_token: sessionOptions.token });\n };\n\n const resolveLogin = async (params: {\n loginProvider: WechatLoginProvider;\n code: string;\n }): Promise<ResolveLoginResult> => {\n const data = await mutate<{ resolveLogin: ResolveLoginResult }>(apollo(), {\n mutation: RESOLVE_LOGIN,\n variables: {\n loginProvider: params.loginProvider,\n code: params.code,\n },\n });\n return data.resolveLogin;\n };\n\n const module: AuthenticationWechatModule = {\n getConfig,\n buildAuthorizeUrl: (overrides?: AuthenticationWechatRenderOverrides) => {\n const config = getConfig(overrides);\n const state = overrides?.state ?? \"WechatWeb\";\n const redirectUri = encodeURIComponent(config.redirectUri);\n return `https://open.weixin.qq.com/connect/qrconnect?appid=${encodeURIComponent(config.webAppId)}&redirect_uri=${redirectUri}&response_type=code&scope=snsapi_login&state=${encodeURIComponent(state)}#wechat_redirect`;\n },\n renderQr: async (overrides?: AuthenticationWechatRenderOverrides) => {\n const mocking = (geex as unknown as { mocking?: MockingWechatHost }).mocking;\n if (mocking?.getCapabilities && mocking.renderWechatQr) {\n const caps = await mocking.getCapabilities();\n if (caps.enabled && caps.wechatWeb) {\n await mocking.renderWechatQr(overrides);\n return;\n }\n }\n\n const config = getConfig(overrides);\n await loadWxLoginScript();\n const id = config.containerId ?? \"wechat_login_container\";\n if (!window.WxLogin) {\n throw new Error(\"WxLogin is not available.\");\n }\n new window.WxLogin({\n self_redirect: false,\n id,\n appid: config.webAppId,\n scope: \"snsapi_login\",\n redirect_uri: encodeURIComponent(config.redirectUri),\n state: overrides?.state ?? \"WechatWeb\",\n style: config.style,\n href: config.href,\n });\n },\n extractCallbackCode: (search: string = typeof location !== \"undefined\" ? location.search : \"\") => {\n const params = new URLSearchParams(search.startsWith(\"?\") ? search : `?${search}`);\n return {\n code: params.get(\"code\") ?? undefined,\n state: params.get(\"state\") ?? undefined,\n };\n },\n resolveLogin,\n linkLogin: async (userLoginLinkToken, context) => {\n const data = await mutate<{\n linkLogin: { token?: string | null; userId: string; loginProvider: string };\n }>(apollo(), {\n mutation: LINK_LOGIN,\n variables: { userLoginLinkToken },\n context,\n });\n return data.linkLogin;\n },\n registerAndLinkLogin: async params => {\n const data = await mutate<{\n registerAndLinkLogin: { token?: string | null; userId: string; loginProvider: string };\n }>(apollo(), {\n mutation: REGISTER_AND_LINK_LOGIN,\n variables: params,\n });\n return data.registerAndLinkLogin;\n },\n establishSession,\n loginWithMiniProgramCode: async (code, returnUrl) => {\n const result = await resolveLogin({\n loginProvider: \"WechatMiniProgram\",\n code,\n });\n if (result.isLinked && result.session?.token) {\n establishSession({\n token: result.session.token,\n returnUrl,\n });\n }\n return result;\n },\n init: async () => undefined,\n };\n\n return module;\n}\n","import { EnvironmentProviders, InjectionToken, Injector, makeEnvironmentProviders } from \"@angular/core\";\nimport { provideGeexModuleContribution } from \"@geexcode/geex-angular\";\nimport { createAuthenticationWechatModule } from \"./authentication-wechat.module\";\nimport type { AuthenticationWechatModule, GeexAuthenticationWechatOptions } from \"./authentication-wechat.types\";\n\nexport interface GeexAuthenticationWechatProvideOptions extends GeexAuthenticationWechatOptions {\n readonly createAuthenticationWechatModule?: (\n injector: Injector,\n options: Readonly<GeexAuthenticationWechatOptions>,\n ) => AuthenticationWechatModule;\n}\n\nexport const GEEX_AUTHENTICATION_WECHAT_OPTIONS =\n new InjectionToken<Readonly<GeexAuthenticationWechatProvideOptions>>(\n \"GEEX_AUTHENTICATION_WECHAT_OPTIONS\",\n );\n\nexport function provideGeexAuthenticationWechat(\n options: Readonly<GeexAuthenticationWechatProvideOptions>,\n): EnvironmentProviders {\n return makeEnvironmentProviders([\n { provide: GEEX_AUTHENTICATION_WECHAT_OPTIONS, useValue: options },\n provideGeexModuleContribution({\n createModules: ({ injector }) => ({\n authenticationWechat: (options.createAuthenticationWechatModule ?? createAuthenticationWechatModule)(\n injector,\n options,\n ),\n }),\n }),\n ]);\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,129 @@
1
+ import { GeexModule } from '@geexcode/geex-angular';
2
+ import { TypedDocumentNode } from '@graphql-typed-document-node/core';
3
+ import { Injector, InjectionToken, EnvironmentProviders } from '@angular/core';
4
+
5
+ type WechatLoginProvider = "WechatWeb" | "WechatMiniProgram";
6
+ interface GeexAuthenticationWechatOptions {
7
+ readonly webAppId: string;
8
+ readonly redirectUri: string;
9
+ readonly containerId?: string;
10
+ readonly style?: string;
11
+ readonly href?: string;
12
+ }
13
+ interface ResolveLoginResult {
14
+ isLinked: boolean;
15
+ session?: {
16
+ token?: string | null;
17
+ userId: string;
18
+ loginProvider: string;
19
+ } | null;
20
+ userLoginLinkToken?: string | null;
21
+ displayName?: string | null;
22
+ }
23
+ interface EstablishSessionOptions {
24
+ token: string;
25
+ /** Post-login navigate target, carried as OIDC `state` through IdP roundtrip. */
26
+ returnUrl?: string;
27
+ }
28
+ type AuthenticationWechatRenderOverrides = Partial<GeexAuthenticationWechatOptions> & {
29
+ state?: string;
30
+ };
31
+ interface AuthenticationWechatModule extends GeexModule<{
32
+ getConfig(overrides?: Partial<GeexAuthenticationWechatOptions>): GeexAuthenticationWechatOptions;
33
+ buildAuthorizeUrl(overrides?: AuthenticationWechatRenderOverrides): string;
34
+ renderQr(overrides?: AuthenticationWechatRenderOverrides): Promise<void>;
35
+ extractCallbackCode(search?: string): {
36
+ code?: string;
37
+ state?: string;
38
+ };
39
+ resolveLogin(params: {
40
+ loginProvider: WechatLoginProvider;
41
+ code: string;
42
+ }): Promise<ResolveLoginResult>;
43
+ linkLogin(userLoginLinkToken: string, context?: {
44
+ headers?: Record<string, string>;
45
+ }): Promise<{
46
+ token?: string | null;
47
+ userId: string;
48
+ loginProvider: string;
49
+ }>;
50
+ registerAndLinkLogin(params: {
51
+ userLoginLinkToken: string;
52
+ username: string;
53
+ password: string;
54
+ phoneNumber?: string;
55
+ email?: string;
56
+ nickname?: string;
57
+ }): Promise<{
58
+ token?: string | null;
59
+ userId: string;
60
+ loginProvider: string;
61
+ }>;
62
+ establishSession(options: EstablishSessionOptions): void;
63
+ loginWithMiniProgramCode(code: string, returnUrl?: string): Promise<ResolveLoginResult>;
64
+ }> {
65
+ }
66
+ declare module "@geexcode/geex-angular" {
67
+ interface GeexModuleMap {
68
+ authenticationWechat: AuthenticationWechatModule;
69
+ }
70
+ }
71
+ declare global {
72
+ interface Window {
73
+ WxLogin?: new (options: {
74
+ self_redirect?: boolean;
75
+ id: string;
76
+ appid: string;
77
+ scope: string;
78
+ redirect_uri: string;
79
+ state: string;
80
+ style?: string;
81
+ href?: string;
82
+ }) => void;
83
+ }
84
+ }
85
+
86
+ type UserSessionResult = {
87
+ token?: string | null;
88
+ userId: string;
89
+ loginProvider: string;
90
+ };
91
+ type ResolveLoginVariables = {
92
+ loginProvider: WechatLoginProvider;
93
+ code: string;
94
+ };
95
+ type ResolveLoginMutationResult = {
96
+ resolveLogin: ResolveLoginResult;
97
+ };
98
+ type LinkLoginVariables = {
99
+ userLoginLinkToken: string;
100
+ };
101
+ type LinkLoginResult = {
102
+ linkLogin: UserSessionResult;
103
+ };
104
+ type RegisterAndLinkLoginVariables = {
105
+ userLoginLinkToken: string;
106
+ username: string;
107
+ password: string;
108
+ phoneNumber?: string | null;
109
+ email?: string | null;
110
+ nickname?: string | null;
111
+ };
112
+ type RegisterAndLinkLoginResult = {
113
+ registerAndLinkLogin: UserSessionResult;
114
+ };
115
+ declare const RESOLVE_LOGIN: TypedDocumentNode<ResolveLoginMutationResult, ResolveLoginVariables>;
116
+ declare const LINK_LOGIN: TypedDocumentNode<LinkLoginResult, LinkLoginVariables>;
117
+ declare const REGISTER_AND_LINK_LOGIN: TypedDocumentNode<RegisterAndLinkLoginResult, RegisterAndLinkLoginVariables>;
118
+
119
+ declare function createAuthenticationWechatModule(injector: Injector, options: Readonly<GeexAuthenticationWechatOptions>): AuthenticationWechatModule;
120
+
121
+ interface GeexAuthenticationWechatProvideOptions extends GeexAuthenticationWechatOptions {
122
+ readonly createAuthenticationWechatModule?: (injector: Injector, options: Readonly<GeexAuthenticationWechatOptions>) => AuthenticationWechatModule;
123
+ }
124
+ declare const GEEX_AUTHENTICATION_WECHAT_OPTIONS: InjectionToken<Readonly<GeexAuthenticationWechatProvideOptions>>;
125
+ declare function provideGeexAuthenticationWechat(options: Readonly<GeexAuthenticationWechatProvideOptions>): EnvironmentProviders;
126
+
127
+ export { GEEX_AUTHENTICATION_WECHAT_OPTIONS, LINK_LOGIN, REGISTER_AND_LINK_LOGIN, RESOLVE_LOGIN, createAuthenticationWechatModule, provideGeexAuthenticationWechat };
128
+ export type { AuthenticationWechatModule, AuthenticationWechatRenderOverrides, EstablishSessionOptions, GeexAuthenticationWechatOptions, GeexAuthenticationWechatProvideOptions, LinkLoginResult, LinkLoginVariables, RegisterAndLinkLoginResult, RegisterAndLinkLoginVariables, ResolveLoginMutationResult, ResolveLoginResult, ResolveLoginVariables, UserSessionResult, WechatLoginProvider };
129
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sources":["../src/authentication-wechat.types.ts","../src/graphql.ts","../src/authentication-wechat.module.ts","../src/provide-geex-authentication-wechat.ts"],"mappings":";;;;AAEA,KAAA,mBAAY;AAEZ,yCAAiB;AACf;AACA;AACA;AACA;AACA;AACD;AAED,4BAAiB;;AAEf;AACE;;;AAGD;AACD;AACA;AACD;AAED,iCAAiB;;;;AAIhB;AAED,KAAA,mCAAY,GAAA,OAAsC,gCAAQ;;;AAI1D,UAAM,0BAAW,SAA2B,UAAQ;0BAC5B,OAAO,CAAC,+BAA+B,IAAI,+BAA+B;AAChG,kCAA8B,mCAAmC;yBAC5C,mCAAmC,GAAG,OAAO;AAClE;;;;;uBACsC,mBAAmB;;AAAgB,QAAG,OAAO,CAAC,kBAAkB;AACtG;kBAEwB,MAAM;AAAkB,QAC7C,OAAO;AAAG;;;AAA8D;;;;;;;;AAQ1E,QAAG,OAAO;AAAG;;;AAA8D;AAC5E,8BAA0B,uBAAuB;AACjD,gEAA4D,OAAO,CAAC,kBAAkB;;AACnF;AAEL;AACE;8BACwB,0BAA0B;AACjD;AACF;AAED;AACE;AACE;;;;;;;;;AASC;AACF;AACF;;ACtED,KAAA;AACE;;;;AAKF,KAAA;mBACiB,mBAAmB;;;AAIpC,KAAA;kBACgB,kBAAkB;;AAGlC,KAAA;;;AAIA,KAAA;eACa,iBAAiB;;AAG9B,KAAA;;;;AAIE;AACA;AACA;;AAGF,KAAA;0BACwB,iBAAiB;;AAGzC,cAAA,gCAagB,CAAA,0BAAa,EAAA,qBAA4B;AAEzD,cAAA,6BAQgB,CAAA,eAAa,EAAA,kBAAiB;AAE9C,cAAA,0CAwBgB,CAAA,0BAAa,EAAA,6BAA4B;;ACnDzD,iBAAA,gCAAgB,WACd,mBACA,QAAS,CAAA,+BAAS,IAAA;;ACnCpB,UAAM,sCAAW,SAAuC,+BAAQ;AAC9D,2DACY,QAAQ,WACT,QAAQ,CAAC,+BAA+B,MAC9C,0BAA0B;AAChC;AAED,cAAA,kCAAa,EAAA,cAAkC,CAAA,QAAA,CAAA,sCAAA;AAK/C,iBAAA,+BAAgB,UACd,QAAS,CAAA,sCAAS,IAAA,oBACjB;;;;","names":[]}
package/package.json ADDED
@@ -0,0 +1,56 @@
1
+ {
2
+ "name": "@geexcode/geex-extensions-authentication-wechat",
3
+ "version": "0.0.1",
4
+ "description": "WeChat login extension: headless wechatAuth module for Geex Angular apps.",
5
+ "sideEffects": false,
6
+ "peerDependencies": {
7
+ "@angular/core": "^20.0.0",
8
+ "@apollo/client": "^4.0.1",
9
+ "@geexcode/geex-angular": ">=0.0.41",
10
+ "angular-oauth2-oidc": ">=15.0.0 <21.0.0",
11
+ "apollo-angular": "^14.0.0",
12
+ "graphql": "^16.8.0",
13
+ "rxjs": "^7.8.0"
14
+ },
15
+ "dependencies": {
16
+ "@graphql-typed-document-node/core": "^3.2.0",
17
+ "graphql-tag": "^2.12.6",
18
+ "tslib": "^2.6.3"
19
+ },
20
+ "files": [
21
+ "dist"
22
+ ],
23
+ "module": "dist/fesm2022/geexcode-geex-extensions-authentication-wechat.mjs",
24
+ "typings": "dist/index.d.ts",
25
+ "exports": {
26
+ "./package.json": {
27
+ "default": "./package.json"
28
+ },
29
+ ".": {
30
+ "types": "./dist/index.d.ts",
31
+ "import": "./dist/fesm2022/geexcode-geex-extensions-authentication-wechat.mjs",
32
+ "default": "./dist/fesm2022/geexcode-geex-extensions-authentication-wechat.mjs"
33
+ }
34
+ },
35
+ "scripts": {
36
+ "clean": "rimraf dist",
37
+ "build": "ng-packagr -p ng-package.json -c tsconfig.lib.json",
38
+ "test": "node --test src/provide-geex-authentication-wechat.node-test.mjs",
39
+ "prepublishOnly": "npm run build",
40
+ "publish:public": "npm publish ./dist --access public"
41
+ },
42
+ "devDependencies": {
43
+ "@angular/compiler": "^20.0.0",
44
+ "@angular/compiler-cli": "^20.0.0",
45
+ "@angular/core": "^20.0.0",
46
+ "@apollo/client": "^4.2.7",
47
+ "@geexcode/geex-angular": "workspace:*",
48
+ "angular-oauth2-oidc": "^20.0.2",
49
+ "apollo-angular": "^14.1.0",
50
+ "graphql": "^16.9.0",
51
+ "ng-packagr": "^20.0.0",
52
+ "rimraf": "^5.0.5",
53
+ "rxjs": "^7.8.2",
54
+ "typescript": "~5.8.3"
55
+ }
56
+ }