@logto/connector-dingtalk-web 0.2.0 → 0.2.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.
package/lib/index.js CHANGED
@@ -176,9 +176,9 @@ var createDingtalkConnector = async ({ getConfig }) => {
176
176
  getUserInfo: getUserInfo(getConfig)
177
177
  };
178
178
  };
179
- var src_default = createDingtalkConnector;
179
+ var index_default = createDingtalkConnector;
180
180
  export {
181
- src_default as default,
181
+ index_default as default,
182
182
  getAccessToken
183
183
  };
184
184
  //# sourceMappingURL=index.js.map
package/lib/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/constant.ts","../src/types.ts"],"sourcesContent":["/**\n * DingTalk OAuth2 Connector\n * https://open.dingtalk.com/document/orgapp/obtain-identity-credentials#title-4up-u8w-5ug\n */\n\nimport { got, HTTPError } from 'got';\n\nimport type {\n GetAuthorizationUri,\n GetUserInfo,\n GetConnectorConfig,\n CreateConnector,\n SocialConnector,\n} from '@logto/connector-kit';\nimport {\n ConnectorError,\n ConnectorErrorCodes,\n validateConfig,\n ConnectorType,\n parseJson,\n} from '@logto/connector-kit';\n\nimport {\n authorizationEndpoint,\n accessTokenEndpoint,\n userInfoEndpoint,\n scope as defaultScope,\n defaultMetadata,\n defaultTimeout,\n} from './constant.js';\nimport type { DingtalkConfig } from './types.js';\nimport {\n dingtalkConfigGuard,\n accessTokenResponseGuard,\n userInfoResponseGuard,\n authResponseGuard,\n} from './types.js';\n\nconst getAuthorizationUri =\n (getConfig: GetConnectorConfig): GetAuthorizationUri =>\n async ({ state, redirectUri }) => {\n const config = await getConfig(defaultMetadata.id);\n validateConfig(config, dingtalkConfigGuard);\n\n const { clientId, scope } = config;\n\n const queryParameters = new URLSearchParams({\n client_id: clientId,\n redirect_uri: encodeURI(redirectUri), // The variable `redirectUri` should match {clientId, clientSecret}\n response_type: 'code',\n scope: scope ?? defaultScope,\n state,\n prompt: 'consent',\n });\n\n return `${authorizationEndpoint}?${queryParameters.toString()}`;\n };\n\nexport const getAccessToken = async (\n code: string,\n config: DingtalkConfig\n): Promise<{ accessToken: string }> => {\n const { clientId, clientSecret } = config;\n\n const httpResponse = await got.post(accessTokenEndpoint, {\n json: {\n clientId,\n clientSecret,\n code,\n grantType: 'authorization_code',\n },\n timeout: { request: defaultTimeout },\n });\n\n const result = accessTokenResponseGuard.safeParse(parseJson(httpResponse.body));\n\n if (!result.success) {\n throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error);\n }\n\n const { accessToken } = result.data;\n\n return { accessToken };\n};\n\nconst getUserInfo =\n (getConfig: GetConnectorConfig): GetUserInfo =>\n async (data) => {\n const { code } = await authorizationCallbackHandler(data);\n const config = await getConfig(defaultMetadata.id);\n validateConfig(config, dingtalkConfigGuard);\n const { accessToken } = await getAccessToken(code, config);\n\n try {\n const httpResponse = await got.get(userInfoEndpoint, {\n headers: {\n 'x-acs-dingtalk-access-token': accessToken,\n },\n timeout: { request: defaultTimeout },\n });\n const rawData = parseJson(httpResponse.body);\n const result = userInfoResponseGuard.safeParse(rawData);\n\n if (!result.success) {\n throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error);\n }\n\n const { nick: name, avatarUrl: avatar, unionId: id, email, mobile, stateCode } = result.data;\n return {\n id,\n avatar,\n phone: stateCode && mobile ? `${stateCode}${mobile}` : undefined,\n email,\n name,\n rawData,\n };\n } catch (error: unknown) {\n return getUserInfoErrorHandler(error);\n }\n };\n\nconst getUserInfoErrorHandler = (error: unknown) => {\n // https://open.dingtalk.com/document/personalapp/error-code-2#title-m5s-krt-vds\n if (error instanceof HTTPError) {\n const { statusCode, body: rawBody } = error.response;\n\n if (statusCode === 400) {\n throw new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid);\n }\n\n throw new ConnectorError(ConnectorErrorCodes.General, JSON.stringify(rawBody));\n }\n\n throw error;\n};\n\nconst authorizationCallbackHandler = async (parameterObject: unknown) => {\n const result = authResponseGuard.safeParse(parameterObject);\n\n if (!result.success) {\n throw new ConnectorError(ConnectorErrorCodes.General, JSON.stringify(parameterObject));\n }\n\n return result.data;\n};\n\nconst createDingtalkConnector: CreateConnector<SocialConnector> = async ({ getConfig }) => {\n return {\n metadata: defaultMetadata,\n type: ConnectorType.Social,\n configGuard: dingtalkConfigGuard,\n getAuthorizationUri: getAuthorizationUri(getConfig),\n getUserInfo: getUserInfo(getConfig),\n };\n};\n\nexport default createDingtalkConnector;\n","import type { ConnectorMetadata } from '@logto/connector-kit';\nimport { ConnectorConfigFormItemType, ConnectorPlatform } from '@logto/connector-kit';\n\n// https://open.dingtalk.com/document/orgapp-server/use-dingtalk-account-to-log-on-to-third-party-websites-1\nexport const authorizationEndpoint = 'https://login.dingtalk.com/oauth2/auth';\n// https://open.dingtalk.com/document/isvapp/obtain-user-token\nexport const accessTokenEndpoint = 'https://api.dingtalk.com/v1.0/oauth2/userAccessToken';\n// https://open.dingtalk.com/document/isvapp/dingtalk-retrieve-user-information\n// To obtain the current authorized person's information, the unionId parameter can be set to \"me\".\nexport const userInfoEndpoint = 'https://api.dingtalk.com/v1.0/contact/users/me';\nexport const scope = 'openid';\n\nexport const defaultMetadata: ConnectorMetadata = {\n id: 'dingtalk-web',\n target: 'dingtalk',\n platform: ConnectorPlatform.Web,\n name: {\n en: 'DingTalk',\n 'zh-CN': '钉钉',\n 'tr-TR': 'DingTalk',\n ko: 'DingTalk',\n },\n logo: './logo.svg',\n logoDark: null,\n description: {\n en: 'DingTalk is an enterprise-level intelligent mobile office platform launched by Alibaba Group.',\n 'zh-CN': '钉钉是一个由阿里巴巴集团推出的企业级智能移动办公平台。',\n 'tr-TR':\n 'DingTalk, Alibaba Grubu tarafından piyasaya sürülen kurumsal düzeyde akıllı mobil ofis platformudur.',\n ko: '딩톡은 알리바바 그룹이 출시한 기업용 지능형 모바일 오피스 플랫폼입니다.',\n },\n readme: './README.md',\n formItems: [\n {\n key: 'clientId',\n label: 'Client ID',\n required: true,\n type: ConnectorConfigFormItemType.Text,\n placeholder: '<client-id>',\n },\n {\n key: 'clientSecret',\n label: 'Client Secret',\n required: true,\n type: ConnectorConfigFormItemType.Text,\n placeholder: '<client-secret>',\n },\n {\n key: 'scope',\n type: ConnectorConfigFormItemType.Text,\n label: 'Scope',\n required: false,\n placeholder: '<scope>',\n description:\n \"The `scope` determines permissions granted by the user's authorization. If you are not sure what to enter, do not worry, just leave it blank.\",\n },\n ],\n};\n\nexport const defaultTimeout = 5000;\n","import { z } from 'zod';\n\nexport const dingtalkConfigGuard = z.object({\n clientId: z.string(),\n clientSecret: z.string(),\n scope: z.string().optional(),\n});\n\nexport type DingtalkConfig = z.infer<typeof dingtalkConfigGuard>;\n\nexport const accessTokenResponseGuard = z.object({\n accessToken: z.string(),\n refreshToken: z.string().optional(),\n expireIn: z.number().optional(), // In seconds\n corpId: z.string().optional(),\n});\n\n// https://open.dingtalk.com/document/isvapp/dingtalk-retrieve-user-information\nexport const userInfoResponseGuard = z.object({\n nick: z.string().optional(),\n avatarUrl: z.string().optional(),\n mobile: z.string().optional(),\n openId: z.string().optional(), // DingTalk no longer recommends using OpenId for integration. Instead, use unionId.\n unionId: z.string(),\n email: z.string().optional(),\n stateCode: z.string().optional(),\n});\n\nexport type UserInfoResponse = z.infer<typeof userInfoResponseGuard>;\n\nexport type UserInfoResponseMessageParser = (userInfo: Partial<UserInfoResponse>) => void;\n\nexport const authResponseGuard = z.object({ code: z.string() });\n"],"mappings":"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","names":["scope"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/constant.ts","../src/types.ts"],"sourcesContent":["/**\n * DingTalk OAuth2 Connector\n * https://open.dingtalk.com/document/orgapp/obtain-identity-credentials#title-4up-u8w-5ug\n */\n\nimport { got, HTTPError } from 'got';\n\nimport type {\n GetAuthorizationUri,\n GetUserInfo,\n GetConnectorConfig,\n CreateConnector,\n SocialConnector,\n} from '@logto/connector-kit';\nimport {\n ConnectorError,\n ConnectorErrorCodes,\n validateConfig,\n ConnectorType,\n parseJson,\n} from '@logto/connector-kit';\n\nimport {\n authorizationEndpoint,\n accessTokenEndpoint,\n userInfoEndpoint,\n scope as defaultScope,\n defaultMetadata,\n defaultTimeout,\n} from './constant.js';\nimport type { DingtalkConfig } from './types.js';\nimport {\n dingtalkConfigGuard,\n accessTokenResponseGuard,\n userInfoResponseGuard,\n authResponseGuard,\n} from './types.js';\n\nconst getAuthorizationUri =\n (getConfig: GetConnectorConfig): GetAuthorizationUri =>\n async ({ state, redirectUri }) => {\n const config = await getConfig(defaultMetadata.id);\n validateConfig(config, dingtalkConfigGuard);\n\n const { clientId, scope } = config;\n\n const queryParameters = new URLSearchParams({\n client_id: clientId,\n redirect_uri: encodeURI(redirectUri), // The variable `redirectUri` should match {clientId, clientSecret}\n response_type: 'code',\n scope: scope ?? defaultScope,\n state,\n prompt: 'consent',\n });\n\n return `${authorizationEndpoint}?${queryParameters.toString()}`;\n };\n\nexport const getAccessToken = async (\n code: string,\n config: DingtalkConfig\n): Promise<{ accessToken: string }> => {\n const { clientId, clientSecret } = config;\n\n const httpResponse = await got.post(accessTokenEndpoint, {\n json: {\n clientId,\n clientSecret,\n code,\n grantType: 'authorization_code',\n },\n timeout: { request: defaultTimeout },\n });\n\n const result = accessTokenResponseGuard.safeParse(parseJson(httpResponse.body));\n\n if (!result.success) {\n throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error);\n }\n\n const { accessToken } = result.data;\n\n return { accessToken };\n};\n\nconst getUserInfo =\n (getConfig: GetConnectorConfig): GetUserInfo =>\n async (data) => {\n const { code } = await authorizationCallbackHandler(data);\n const config = await getConfig(defaultMetadata.id);\n validateConfig(config, dingtalkConfigGuard);\n const { accessToken } = await getAccessToken(code, config);\n\n try {\n const httpResponse = await got.get(userInfoEndpoint, {\n headers: {\n 'x-acs-dingtalk-access-token': accessToken,\n },\n timeout: { request: defaultTimeout },\n });\n const rawData = parseJson(httpResponse.body);\n const result = userInfoResponseGuard.safeParse(rawData);\n\n if (!result.success) {\n throw new ConnectorError(ConnectorErrorCodes.InvalidResponse, result.error);\n }\n\n const { nick: name, avatarUrl: avatar, unionId: id, email, mobile, stateCode } = result.data;\n return {\n id,\n avatar,\n phone: stateCode && mobile ? `${stateCode}${mobile}` : undefined,\n email,\n name,\n rawData,\n };\n } catch (error: unknown) {\n return getUserInfoErrorHandler(error);\n }\n };\n\nconst getUserInfoErrorHandler = (error: unknown) => {\n // https://open.dingtalk.com/document/personalapp/error-code-2#title-m5s-krt-vds\n if (error instanceof HTTPError) {\n const { statusCode, body: rawBody } = error.response;\n\n if (statusCode === 400) {\n throw new ConnectorError(ConnectorErrorCodes.SocialAccessTokenInvalid);\n }\n\n throw new ConnectorError(ConnectorErrorCodes.General, JSON.stringify(rawBody));\n }\n\n throw error;\n};\n\nconst authorizationCallbackHandler = async (parameterObject: unknown) => {\n const result = authResponseGuard.safeParse(parameterObject);\n\n if (!result.success) {\n throw new ConnectorError(ConnectorErrorCodes.General, JSON.stringify(parameterObject));\n }\n\n return result.data;\n};\n\nconst createDingtalkConnector: CreateConnector<SocialConnector> = async ({ getConfig }) => {\n return {\n metadata: defaultMetadata,\n type: ConnectorType.Social,\n configGuard: dingtalkConfigGuard,\n getAuthorizationUri: getAuthorizationUri(getConfig),\n getUserInfo: getUserInfo(getConfig),\n };\n};\n\nexport default createDingtalkConnector;\n","import type { ConnectorMetadata } from '@logto/connector-kit';\nimport { ConnectorConfigFormItemType, ConnectorPlatform } from '@logto/connector-kit';\n\n// https://open.dingtalk.com/document/orgapp-server/use-dingtalk-account-to-log-on-to-third-party-websites-1\nexport const authorizationEndpoint = 'https://login.dingtalk.com/oauth2/auth';\n// https://open.dingtalk.com/document/isvapp/obtain-user-token\nexport const accessTokenEndpoint = 'https://api.dingtalk.com/v1.0/oauth2/userAccessToken';\n// https://open.dingtalk.com/document/isvapp/dingtalk-retrieve-user-information\n// To obtain the current authorized person's information, the unionId parameter can be set to \"me\".\nexport const userInfoEndpoint = 'https://api.dingtalk.com/v1.0/contact/users/me';\nexport const scope = 'openid';\n\nexport const defaultMetadata: ConnectorMetadata = {\n id: 'dingtalk-web',\n target: 'dingtalk',\n platform: ConnectorPlatform.Web,\n name: {\n en: 'DingTalk',\n 'zh-CN': '钉钉',\n 'tr-TR': 'DingTalk',\n ko: 'DingTalk',\n },\n logo: './logo.svg',\n logoDark: null,\n description: {\n en: 'DingTalk is an enterprise-level intelligent mobile office platform launched by Alibaba Group.',\n 'zh-CN': '钉钉是一个由阿里巴巴集团推出的企业级智能移动办公平台。',\n 'tr-TR':\n 'DingTalk, Alibaba Grubu tarafından piyasaya sürülen kurumsal düzeyde akıllı mobil ofis platformudur.',\n ko: '딩톡은 알리바바 그룹이 출시한 기업용 지능형 모바일 오피스 플랫폼입니다.',\n },\n readme: './README.md',\n formItems: [\n {\n key: 'clientId',\n label: 'Client ID',\n required: true,\n type: ConnectorConfigFormItemType.Text,\n placeholder: '<client-id>',\n },\n {\n key: 'clientSecret',\n label: 'Client Secret',\n required: true,\n type: ConnectorConfigFormItemType.Text,\n placeholder: '<client-secret>',\n },\n {\n key: 'scope',\n type: ConnectorConfigFormItemType.Text,\n label: 'Scope',\n required: false,\n placeholder: '<scope>',\n description:\n \"The `scope` determines permissions granted by the user's authorization. If you are not sure what to enter, do not worry, just leave it blank.\",\n },\n ],\n};\n\nexport const defaultTimeout = 5000;\n","import { z } from 'zod';\n\nexport const dingtalkConfigGuard = z.object({\n clientId: z.string(),\n clientSecret: z.string(),\n scope: z.string().optional(),\n});\n\nexport type DingtalkConfig = z.infer<typeof dingtalkConfigGuard>;\n\nexport const accessTokenResponseGuard = z.object({\n accessToken: z.string(),\n refreshToken: z.string().optional(),\n expireIn: z.number().optional(), // In seconds\n corpId: z.string().optional(),\n});\n\n// https://open.dingtalk.com/document/isvapp/dingtalk-retrieve-user-information\nexport const userInfoResponseGuard = z.object({\n nick: z.string().optional(),\n avatarUrl: z.string().optional(),\n mobile: z.string().optional(),\n openId: z.string().optional(), // DingTalk no longer recommends using OpenId for integration. Instead, use unionId.\n unionId: z.string(),\n email: z.string().optional(),\n stateCode: z.string().optional(),\n});\n\nexport type UserInfoResponse = z.infer<typeof userInfoResponseGuard>;\n\nexport type UserInfoResponseMessageParser = (userInfo: Partial<UserInfoResponse>) => void;\n\nexport const authResponseGuard = z.object({ code: z.string() });\n"],"mappings":"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","names":["scope"]}
package/package.json CHANGED
@@ -1,9 +1,9 @@
1
1
  {
2
2
  "name": "@logto/connector-dingtalk-web",
3
- "version": "0.2.0",
3
+ "version": "0.2.1",
4
4
  "description": "Dingtalk web connector implementation.",
5
5
  "dependencies": {
6
- "@logto/connector-kit": "^4.0.0",
6
+ "@logto/connector-kit": "^4.1.1",
7
7
  "@silverhand/essentials": "^2.9.1",
8
8
  "dayjs": "^1.10.5",
9
9
  "got": "^14.0.0",
@@ -17,15 +17,15 @@
17
17
  "@silverhand/ts-config": "6.0.0",
18
18
  "@types/node": "^20.11.20",
19
19
  "@types/supertest": "^6.0.2",
20
- "@vitest/coverage-v8": "^2.0.0",
20
+ "@vitest/coverage-v8": "^2.1.9",
21
21
  "eslint": "^8.56.0",
22
22
  "lint-staged": "^15.0.2",
23
23
  "nock": "^13.3.1",
24
24
  "prettier": "^3.0.0",
25
25
  "supertest": "^7.0.0",
26
- "tsup": "^8.1.0",
26
+ "tsup": "^8.3.0",
27
27
  "typescript": "^5.5.3",
28
- "vitest": "^2.0.0"
28
+ "vitest": "^2.1.9"
29
29
  },
30
30
  "main": "./lib/index.js",
31
31
  "module": "./lib/index.js",