confluence.js 2.0.0-dev20250512001800 → 2.0.0-dev20250512123346
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cjs/clients/baseClient.js +13 -2
- package/dist/cjs/clients/baseClient.js.map +1 -1
- package/dist/cjs/config.js +1 -1
- package/dist/cjs/config.js.map +1 -1
- package/dist/esm/clients/baseClient.js +11 -0
- package/dist/esm/clients/baseClient.js.map +1 -1
- package/dist/esm/config.js +1 -1
- package/dist/esm/config.js.map +1 -1
- package/dist/esm/types/clients/baseClient.d.ts +1 -1
- package/package.json +1 -1
- package/src/clients/baseClient.ts +16 -1
- package/src/config.ts +1 -1
|
@@ -2,15 +2,26 @@
|
|
|
2
2
|
|
|
3
3
|
var axios = require('axios');
|
|
4
4
|
var authenticationService = require('../services/authenticationService/authenticationService.js');
|
|
5
|
+
var config = require('../config.js');
|
|
6
|
+
var zod = require('zod');
|
|
5
7
|
|
|
6
8
|
const ATLASSIAN_TOKEN_CHECK_FLAG = 'X-Atlassian-Token';
|
|
7
9
|
const ATLASSIAN_TOKEN_CHECK_NOCHECK_VALUE = 'no-check';
|
|
8
10
|
class BaseClient {
|
|
9
11
|
config;
|
|
10
12
|
#instance;
|
|
11
|
-
constructor(config) {
|
|
12
|
-
this.config = config;
|
|
13
|
+
constructor(config$1) {
|
|
14
|
+
this.config = config$1;
|
|
13
15
|
this.config.apiPrefix = this.config.apiPrefix || '/wiki/rest/';
|
|
16
|
+
try {
|
|
17
|
+
this.config = config.ConfigSchema.parse(this.config);
|
|
18
|
+
}
|
|
19
|
+
catch (e) {
|
|
20
|
+
if (e instanceof zod.ZodError && e.errors[0].code === 'invalid_string') {
|
|
21
|
+
throw new Error(e.errors[0].message);
|
|
22
|
+
}
|
|
23
|
+
throw e;
|
|
24
|
+
}
|
|
14
25
|
}
|
|
15
26
|
paramSerializer(parameters) {
|
|
16
27
|
const parts = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseClient.js","sources":["../../../../src/clients/baseClient.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\nimport type { AxiosInstance } from 'axios';\nimport axios from 'axios';\nimport { getAuthenticationToken } from '~/services';\nimport type { Callback } from '~/callback';\nimport type { Client } from './client';\nimport type
|
|
1
|
+
{"version":3,"file":"baseClient.js","sources":["../../../../src/clients/baseClient.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\nimport type { AxiosInstance } from 'axios';\nimport axios from 'axios';\nimport { getAuthenticationToken } from '~/services';\nimport type { Callback } from '~/callback';\nimport type { Client } from './client';\nimport {\n ConfigSchema,\n type Config,\n type Error as ConfluenceError,\n} from '~/config';\nimport type { RequestConfig } from '~/requestConfig';\nimport { ZodError } from 'zod';\n\nconst ATLASSIAN_TOKEN_CHECK_FLAG = 'X-Atlassian-Token';\nconst ATLASSIAN_TOKEN_CHECK_NOCHECK_VALUE = 'no-check';\n\nexport class BaseClient implements Client {\n #instance: AxiosInstance | undefined;\n\n constructor(protected readonly config: Config) {\n this.config.apiPrefix = this.config.apiPrefix || '/wiki/rest/';\n\n try {\n this.config = ConfigSchema.parse(this.config);\n } catch (e) {\n if (e instanceof ZodError && e.errors[0].code === 'invalid_string') {\n throw new Error(e.errors[0].message);\n }\n\n throw e;\n }\n }\n\n protected paramSerializer(parameters: Record<string, any>): string {\n const parts: string[] = [];\n\n Object.entries(parameters).forEach(([key, value]) => {\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n if (Array.isArray(value)) {\n value = value.join(',');\n }\n\n if (value instanceof Date) {\n value = value.toISOString();\n } else if (value !== null && typeof value === 'object') {\n value = JSON.stringify(value);\n } else if (value instanceof Function) {\n const part = value();\n\n return part && parts.push(part);\n }\n\n parts.push(`${this.encode(key)}=${this.encode(value)}`);\n });\n\n return parts.join('&');\n }\n\n protected encode(value: string) {\n return encodeURIComponent(value)\n .replace(/%3A/gi, ':')\n .replace(/%24/g, '$')\n .replace(/%2C/gi, ',')\n .replace(/%20/g, '+')\n .replace(/%5B/gi, '[')\n .replace(/%5D/gi, ']');\n }\n\n protected removeUndefinedProperties(obj: Record<string, any>): Record<string, any> {\n return Object.entries(obj)\n .filter(([, value]) => typeof value !== 'undefined')\n .reduce((accumulator, [key, value]) => ({ ...accumulator, [key]: value }), {});\n }\n\n private get instance() {\n if (this.#instance) {\n return this.#instance;\n }\n\n this.#instance = axios.create({\n paramsSerializer: this.paramSerializer.bind(this),\n ...this.config.baseRequestConfig,\n baseURL: `${this.config.host}${this.config.apiPrefix}`,\n headers: this.removeUndefinedProperties({\n [ATLASSIAN_TOKEN_CHECK_FLAG]: this.config.noCheckAtlassianToken\n ? ATLASSIAN_TOKEN_CHECK_NOCHECK_VALUE\n : undefined,\n ...this.config.baseRequestConfig?.headers,\n }),\n });\n\n return this.#instance;\n }\n\n async sendRequest<T>(requestConfig: RequestConfig, callback: never): Promise<T>;\n async sendRequest<T>(requestConfig: RequestConfig, callback: Callback<T>): Promise<void>;\n async sendRequest<T>(requestConfig: RequestConfig, callback: Callback<T> | never): Promise<void | T> {\n try {\n const modifiedRequestConfig = {\n ...requestConfig,\n headers: this.removeUndefinedProperties({\n Authorization: await getAuthenticationToken(this.config.authentication, {\n baseURL: this.config.host,\n url: this.instance.getUri(requestConfig),\n method: requestConfig.method!,\n }),\n ...requestConfig.headers,\n }),\n };\n\n const response = await this.instance.request<T>(modifiedRequestConfig);\n\n const callbackResponseHandler = callback && ((data: T): void => callback(null, data));\n const defaultResponseHandler = (data: T): T => data;\n\n const responseHandler = callbackResponseHandler ?? defaultResponseHandler;\n\n this.config.middlewares?.onResponse?.(response.data);\n\n return responseHandler(response.data);\n } catch (e: any) {\n const err = e.isAxiosError ? e.response.data : e;\n\n const callbackErrorHandler = callback && ((error: ConfluenceError) => callback(error));\n const defaultErrorHandler = (error: Error) => {\n throw error;\n };\n\n const errorHandler = callbackErrorHandler ?? defaultErrorHandler;\n\n this.config.middlewares?.onError?.(err);\n\n return errorHandler(err);\n }\n }\n}\n"],"names":["config","ConfigSchema","ZodError","getAuthenticationToken"],"mappings":"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"}
|
package/dist/cjs/config.js
CHANGED
|
@@ -49,7 +49,7 @@ const MiddlewaresSchema = zod.z.object({
|
|
|
49
49
|
onResponse: zod.z.optional(zod.z.function().args(zod.z.any()).returns(zod.z.void())),
|
|
50
50
|
});
|
|
51
51
|
const ConfigSchema = zod.z.object({
|
|
52
|
-
host: zod.z.string(),
|
|
52
|
+
host: zod.z.string().url({ message: 'Couldn\'t parse the host URL. Perhaps you forgot to add \'http://\' or \'https://\' at the beginning of the URL?' }),
|
|
53
53
|
baseRequestConfig: zod.z.optional(RequestConfigSchema),
|
|
54
54
|
authentication: zod.z.optional(AuthenticationSchema),
|
|
55
55
|
middlewares: zod.z.optional(MiddlewaresSchema),
|
package/dist/cjs/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../../src/config.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { AxiosError } from 'axios';\n\n/**\n * Basic authentication configuration using email and API token\n *\n * @see {@link https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/} for how to create API tokens\n */\nexport const BasicSchema = z.strictObject({\n basic: z.strictObject({\n /** User's email associated with Atlassian account */\n email: z.string().email(),\n /**\n * API token generated from Atlassian account settings\n *\n * @see {@link https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/} for how to create API tokens\n */\n apiToken: z.string().min(1, 'API token is required'),\n }),\n});\n\n/** JWT authentication configuration */\nexport const JWTSchema = z.strictObject({\n jwt: z.strictObject({\n /** The key from the app descriptor */\n issuer: z.string(),\n /** The shared secret key from app installation */\n secret: z.string(),\n /** Token expiry time (default: 180) */\n expiryTimeSeconds: z.optional(z.number()),\n }),\n});\n\n/** OAuth2 authentication configuration */\nexport const OAuth2Schema = z.strictObject({\n oauth2: z.strictObject({\n /** OAuth2 access token */\n accessToken: z.string(),\n }),\n});\n\n/** Authentication configuration schema */\nexport const AuthenticationSchema = z.union([BasicSchema, JWTSchema, OAuth2Schema]);\n\n/** Base request configuration */\nexport const RequestConfigSchema = z.any();\n\n/** Middleware configuration schema */\nexport const MiddlewaresSchema = z.object({\n /** Error handler middleware */\n onError: z.optional(z.function().args(z.any()).returns(z.void())),\n /** Response handler middleware */\n onResponse: z.optional(z.function().args(z.any()).returns(z.void())),\n});\n\nexport const ConfigSchema = z.object({\n host: z.string(),\n baseRequestConfig: z.optional(RequestConfigSchema),\n authentication: z.optional(AuthenticationSchema),\n middlewares: z.optional(MiddlewaresSchema),\n /** Adds `'X-Atlassian-Token': 'no-check'` to each request header */\n noCheckAtlassianToken: z.optional(z.boolean()),\n /** Prefix for all API routes. */\n apiPrefix: z.optional(z.string()),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type Authentication = z.infer<typeof AuthenticationSchema>;\nexport type Basic = z.infer<typeof BasicSchema>;\nexport type JWT = z.infer<typeof JWTSchema>;\nexport type OAuth2 = z.infer<typeof OAuth2Schema>;\nexport type Error = AxiosError;\n"],"names":["z"],"mappings":";;;;AAGA;;;;AAIG;AACU,MAAA,WAAW,GAAGA,KAAC,CAAC,YAAY,CAAC;AACxC,IAAA,KAAK,EAAEA,KAAC,CAAC,YAAY,CAAC;;AAEpB,QAAA,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;AACzB;;;;AAIG;QACH,QAAQ,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC;KACrD,CAAC;AACH,CAAA;AAED;AACa,MAAA,SAAS,GAAGA,KAAC,CAAC,YAAY,CAAC;AACtC,IAAA,GAAG,EAAEA,KAAC,CAAC,YAAY,CAAC;;AAElB,QAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE;;AAElB,QAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE;;QAElB,iBAAiB,EAAEA,KAAC,CAAC,QAAQ,CAACA,KAAC,CAAC,MAAM,EAAE,CAAC;KAC1C,CAAC;AACH,CAAA;AAED;AACa,MAAA,YAAY,GAAGA,KAAC,CAAC,YAAY,CAAC;AACzC,IAAA,MAAM,EAAEA,KAAC,CAAC,YAAY,CAAC;;AAErB,QAAA,WAAW,EAAEA,KAAC,CAAC,MAAM,EAAE;KACxB,CAAC;AACH,CAAA;AAED;AACa,MAAA,oBAAoB,GAAGA,KAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC;AAElF;MACa,mBAAmB,GAAGA,KAAC,CAAC,GAAG;AAExC;AACa,MAAA,iBAAiB,GAAGA,KAAC,CAAC,MAAM,CAAC;;IAExC,OAAO,EAAEA,KAAC,CAAC,QAAQ,CAACA,KAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAACA,KAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAACA,KAAC,CAAC,IAAI,EAAE,CAAC,CAAC;;IAEjE,UAAU,EAAEA,KAAC,CAAC,QAAQ,CAACA,KAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAACA,KAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAACA,KAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,CAAA;AAEY,MAAA,YAAY,GAAGA,KAAC,CAAC,MAAM,CAAC;AACnC,IAAA,IAAI,EAAEA,KAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../src/config.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { AxiosError } from 'axios';\n\n/**\n * Basic authentication configuration using email and API token\n *\n * @see {@link https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/} for how to create API tokens\n */\nexport const BasicSchema = z.strictObject({\n basic: z.strictObject({\n /** User's email associated with Atlassian account */\n email: z.string().email(),\n /**\n * API token generated from Atlassian account settings\n *\n * @see {@link https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/} for how to create API tokens\n */\n apiToken: z.string().min(1, 'API token is required'),\n }),\n});\n\n/** JWT authentication configuration */\nexport const JWTSchema = z.strictObject({\n jwt: z.strictObject({\n /** The key from the app descriptor */\n issuer: z.string(),\n /** The shared secret key from app installation */\n secret: z.string(),\n /** Token expiry time (default: 180) */\n expiryTimeSeconds: z.optional(z.number()),\n }),\n});\n\n/** OAuth2 authentication configuration */\nexport const OAuth2Schema = z.strictObject({\n oauth2: z.strictObject({\n /** OAuth2 access token */\n accessToken: z.string(),\n }),\n});\n\n/** Authentication configuration schema */\nexport const AuthenticationSchema = z.union([BasicSchema, JWTSchema, OAuth2Schema]);\n\n/** Base request configuration */\nexport const RequestConfigSchema = z.any();\n\n/** Middleware configuration schema */\nexport const MiddlewaresSchema = z.object({\n /** Error handler middleware */\n onError: z.optional(z.function().args(z.any()).returns(z.void())),\n /** Response handler middleware */\n onResponse: z.optional(z.function().args(z.any()).returns(z.void())),\n});\n\nexport const ConfigSchema = z.object({\n host: z.string().url({ message: 'Couldn\\'t parse the host URL. Perhaps you forgot to add \\'http://\\' or \\'https://\\' at the beginning of the URL?' }),\n baseRequestConfig: z.optional(RequestConfigSchema),\n authentication: z.optional(AuthenticationSchema),\n middlewares: z.optional(MiddlewaresSchema),\n /** Adds `'X-Atlassian-Token': 'no-check'` to each request header */\n noCheckAtlassianToken: z.optional(z.boolean()),\n /** Prefix for all API routes. */\n apiPrefix: z.optional(z.string()),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type Authentication = z.infer<typeof AuthenticationSchema>;\nexport type Basic = z.infer<typeof BasicSchema>;\nexport type JWT = z.infer<typeof JWTSchema>;\nexport type OAuth2 = z.infer<typeof OAuth2Schema>;\nexport type Error = AxiosError;\n"],"names":["z"],"mappings":";;;;AAGA;;;;AAIG;AACU,MAAA,WAAW,GAAGA,KAAC,CAAC,YAAY,CAAC;AACxC,IAAA,KAAK,EAAEA,KAAC,CAAC,YAAY,CAAC;;AAEpB,QAAA,KAAK,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;AACzB;;;;AAIG;QACH,QAAQ,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC;KACrD,CAAC;AACH,CAAA;AAED;AACa,MAAA,SAAS,GAAGA,KAAC,CAAC,YAAY,CAAC;AACtC,IAAA,GAAG,EAAEA,KAAC,CAAC,YAAY,CAAC;;AAElB,QAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE;;AAElB,QAAA,MAAM,EAAEA,KAAC,CAAC,MAAM,EAAE;;QAElB,iBAAiB,EAAEA,KAAC,CAAC,QAAQ,CAACA,KAAC,CAAC,MAAM,EAAE,CAAC;KAC1C,CAAC;AACH,CAAA;AAED;AACa,MAAA,YAAY,GAAGA,KAAC,CAAC,YAAY,CAAC;AACzC,IAAA,MAAM,EAAEA,KAAC,CAAC,YAAY,CAAC;;AAErB,QAAA,WAAW,EAAEA,KAAC,CAAC,MAAM,EAAE;KACxB,CAAC;AACH,CAAA;AAED;AACa,MAAA,oBAAoB,GAAGA,KAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC;AAElF;MACa,mBAAmB,GAAGA,KAAC,CAAC,GAAG;AAExC;AACa,MAAA,iBAAiB,GAAGA,KAAC,CAAC,MAAM,CAAC;;IAExC,OAAO,EAAEA,KAAC,CAAC,QAAQ,CAACA,KAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAACA,KAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAACA,KAAC,CAAC,IAAI,EAAE,CAAC,CAAC;;IAEjE,UAAU,EAAEA,KAAC,CAAC,QAAQ,CAACA,KAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAACA,KAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAACA,KAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,CAAA;AAEY,MAAA,YAAY,GAAGA,KAAC,CAAC,MAAM,CAAC;AACnC,IAAA,IAAI,EAAEA,KAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAG,kHAAkH,EAAE,CAAC;AACtJ,IAAA,iBAAiB,EAAEA,KAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;AAClD,IAAA,cAAc,EAAEA,KAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;AAChD,IAAA,WAAW,EAAEA,KAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;;IAE1C,qBAAqB,EAAEA,KAAC,CAAC,QAAQ,CAACA,KAAC,CAAC,OAAO,EAAE,CAAC;;IAE9C,SAAS,EAAEA,KAAC,CAAC,QAAQ,CAACA,KAAC,CAAC,MAAM,EAAE,CAAC;AAClC,CAAA;;;;;;;;;;"}
|
|
@@ -1,5 +1,7 @@
|
|
|
1
1
|
import axios from 'axios';
|
|
2
2
|
import { getAuthenticationToken } from '../services/authenticationService/authenticationService.js';
|
|
3
|
+
import { ConfigSchema } from '../config.js';
|
|
4
|
+
import { ZodError } from 'zod';
|
|
3
5
|
|
|
4
6
|
const ATLASSIAN_TOKEN_CHECK_FLAG = 'X-Atlassian-Token';
|
|
5
7
|
const ATLASSIAN_TOKEN_CHECK_NOCHECK_VALUE = 'no-check';
|
|
@@ -9,6 +11,15 @@ class BaseClient {
|
|
|
9
11
|
constructor(config) {
|
|
10
12
|
this.config = config;
|
|
11
13
|
this.config.apiPrefix = this.config.apiPrefix || '/wiki/rest/';
|
|
14
|
+
try {
|
|
15
|
+
this.config = ConfigSchema.parse(this.config);
|
|
16
|
+
}
|
|
17
|
+
catch (e) {
|
|
18
|
+
if (e instanceof ZodError && e.errors[0].code === 'invalid_string') {
|
|
19
|
+
throw new Error(e.errors[0].message);
|
|
20
|
+
}
|
|
21
|
+
throw e;
|
|
22
|
+
}
|
|
12
23
|
}
|
|
13
24
|
paramSerializer(parameters) {
|
|
14
25
|
const parts = [];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"baseClient.js","sources":["../../../../src/clients/baseClient.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\nimport type { AxiosInstance } from 'axios';\nimport axios from 'axios';\nimport { getAuthenticationToken } from '~/services';\nimport type { Callback } from '~/callback';\nimport type { Client } from './client';\nimport type
|
|
1
|
+
{"version":3,"file":"baseClient.js","sources":["../../../../src/clients/baseClient.ts"],"sourcesContent":["/* eslint-disable @typescript-eslint/no-explicit-any,@typescript-eslint/no-unnecessary-condition */\nimport type { AxiosInstance } from 'axios';\nimport axios from 'axios';\nimport { getAuthenticationToken } from '~/services';\nimport type { Callback } from '~/callback';\nimport type { Client } from './client';\nimport {\n ConfigSchema,\n type Config,\n type Error as ConfluenceError,\n} from '~/config';\nimport type { RequestConfig } from '~/requestConfig';\nimport { ZodError } from 'zod';\n\nconst ATLASSIAN_TOKEN_CHECK_FLAG = 'X-Atlassian-Token';\nconst ATLASSIAN_TOKEN_CHECK_NOCHECK_VALUE = 'no-check';\n\nexport class BaseClient implements Client {\n #instance: AxiosInstance | undefined;\n\n constructor(protected readonly config: Config) {\n this.config.apiPrefix = this.config.apiPrefix || '/wiki/rest/';\n\n try {\n this.config = ConfigSchema.parse(this.config);\n } catch (e) {\n if (e instanceof ZodError && e.errors[0].code === 'invalid_string') {\n throw new Error(e.errors[0].message);\n }\n\n throw e;\n }\n }\n\n protected paramSerializer(parameters: Record<string, any>): string {\n const parts: string[] = [];\n\n Object.entries(parameters).forEach(([key, value]) => {\n if (value === null || typeof value === 'undefined') {\n return;\n }\n\n if (Array.isArray(value)) {\n value = value.join(',');\n }\n\n if (value instanceof Date) {\n value = value.toISOString();\n } else if (value !== null && typeof value === 'object') {\n value = JSON.stringify(value);\n } else if (value instanceof Function) {\n const part = value();\n\n return part && parts.push(part);\n }\n\n parts.push(`${this.encode(key)}=${this.encode(value)}`);\n });\n\n return parts.join('&');\n }\n\n protected encode(value: string) {\n return encodeURIComponent(value)\n .replace(/%3A/gi, ':')\n .replace(/%24/g, '$')\n .replace(/%2C/gi, ',')\n .replace(/%20/g, '+')\n .replace(/%5B/gi, '[')\n .replace(/%5D/gi, ']');\n }\n\n protected removeUndefinedProperties(obj: Record<string, any>): Record<string, any> {\n return Object.entries(obj)\n .filter(([, value]) => typeof value !== 'undefined')\n .reduce((accumulator, [key, value]) => ({ ...accumulator, [key]: value }), {});\n }\n\n private get instance() {\n if (this.#instance) {\n return this.#instance;\n }\n\n this.#instance = axios.create({\n paramsSerializer: this.paramSerializer.bind(this),\n ...this.config.baseRequestConfig,\n baseURL: `${this.config.host}${this.config.apiPrefix}`,\n headers: this.removeUndefinedProperties({\n [ATLASSIAN_TOKEN_CHECK_FLAG]: this.config.noCheckAtlassianToken\n ? ATLASSIAN_TOKEN_CHECK_NOCHECK_VALUE\n : undefined,\n ...this.config.baseRequestConfig?.headers,\n }),\n });\n\n return this.#instance;\n }\n\n async sendRequest<T>(requestConfig: RequestConfig, callback: never): Promise<T>;\n async sendRequest<T>(requestConfig: RequestConfig, callback: Callback<T>): Promise<void>;\n async sendRequest<T>(requestConfig: RequestConfig, callback: Callback<T> | never): Promise<void | T> {\n try {\n const modifiedRequestConfig = {\n ...requestConfig,\n headers: this.removeUndefinedProperties({\n Authorization: await getAuthenticationToken(this.config.authentication, {\n baseURL: this.config.host,\n url: this.instance.getUri(requestConfig),\n method: requestConfig.method!,\n }),\n ...requestConfig.headers,\n }),\n };\n\n const response = await this.instance.request<T>(modifiedRequestConfig);\n\n const callbackResponseHandler = callback && ((data: T): void => callback(null, data));\n const defaultResponseHandler = (data: T): T => data;\n\n const responseHandler = callbackResponseHandler ?? defaultResponseHandler;\n\n this.config.middlewares?.onResponse?.(response.data);\n\n return responseHandler(response.data);\n } catch (e: any) {\n const err = e.isAxiosError ? e.response.data : e;\n\n const callbackErrorHandler = callback && ((error: ConfluenceError) => callback(error));\n const defaultErrorHandler = (error: Error) => {\n throw error;\n };\n\n const errorHandler = callbackErrorHandler ?? defaultErrorHandler;\n\n this.config.middlewares?.onError?.(err);\n\n return errorHandler(err);\n }\n }\n}\n"],"names":[],"mappings":"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"}
|
package/dist/esm/config.js
CHANGED
|
@@ -47,7 +47,7 @@ const MiddlewaresSchema = z.object({
|
|
|
47
47
|
onResponse: z.optional(z.function().args(z.any()).returns(z.void())),
|
|
48
48
|
});
|
|
49
49
|
const ConfigSchema = z.object({
|
|
50
|
-
host: z.string(),
|
|
50
|
+
host: z.string().url({ message: 'Couldn\'t parse the host URL. Perhaps you forgot to add \'http://\' or \'https://\' at the beginning of the URL?' }),
|
|
51
51
|
baseRequestConfig: z.optional(RequestConfigSchema),
|
|
52
52
|
authentication: z.optional(AuthenticationSchema),
|
|
53
53
|
middlewares: z.optional(MiddlewaresSchema),
|
package/dist/esm/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sources":["../../../src/config.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { AxiosError } from 'axios';\n\n/**\n * Basic authentication configuration using email and API token\n *\n * @see {@link https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/} for how to create API tokens\n */\nexport const BasicSchema = z.strictObject({\n basic: z.strictObject({\n /** User's email associated with Atlassian account */\n email: z.string().email(),\n /**\n * API token generated from Atlassian account settings\n *\n * @see {@link https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/} for how to create API tokens\n */\n apiToken: z.string().min(1, 'API token is required'),\n }),\n});\n\n/** JWT authentication configuration */\nexport const JWTSchema = z.strictObject({\n jwt: z.strictObject({\n /** The key from the app descriptor */\n issuer: z.string(),\n /** The shared secret key from app installation */\n secret: z.string(),\n /** Token expiry time (default: 180) */\n expiryTimeSeconds: z.optional(z.number()),\n }),\n});\n\n/** OAuth2 authentication configuration */\nexport const OAuth2Schema = z.strictObject({\n oauth2: z.strictObject({\n /** OAuth2 access token */\n accessToken: z.string(),\n }),\n});\n\n/** Authentication configuration schema */\nexport const AuthenticationSchema = z.union([BasicSchema, JWTSchema, OAuth2Schema]);\n\n/** Base request configuration */\nexport const RequestConfigSchema = z.any();\n\n/** Middleware configuration schema */\nexport const MiddlewaresSchema = z.object({\n /** Error handler middleware */\n onError: z.optional(z.function().args(z.any()).returns(z.void())),\n /** Response handler middleware */\n onResponse: z.optional(z.function().args(z.any()).returns(z.void())),\n});\n\nexport const ConfigSchema = z.object({\n host: z.string(),\n baseRequestConfig: z.optional(RequestConfigSchema),\n authentication: z.optional(AuthenticationSchema),\n middlewares: z.optional(MiddlewaresSchema),\n /** Adds `'X-Atlassian-Token': 'no-check'` to each request header */\n noCheckAtlassianToken: z.optional(z.boolean()),\n /** Prefix for all API routes. */\n apiPrefix: z.optional(z.string()),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type Authentication = z.infer<typeof AuthenticationSchema>;\nexport type Basic = z.infer<typeof BasicSchema>;\nexport type JWT = z.infer<typeof JWTSchema>;\nexport type OAuth2 = z.infer<typeof OAuth2Schema>;\nexport type Error = AxiosError;\n"],"names":[],"mappings":";;AAGA;;;;AAIG;AACU,MAAA,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC;AACxC,IAAA,KAAK,EAAE,CAAC,CAAC,YAAY,CAAC;;AAEpB,QAAA,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;AACzB;;;;AAIG;QACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC;KACrD,CAAC;AACH,CAAA;AAED;AACa,MAAA,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC;AACtC,IAAA,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC;;AAElB,QAAA,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;;AAElB,QAAA,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;;QAElB,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC1C,CAAC;AACH,CAAA;AAED;AACa,MAAA,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;AACzC,IAAA,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC;;AAErB,QAAA,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;KACxB,CAAC;AACH,CAAA;AAED;AACa,MAAA,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC;AAElF;MACa,mBAAmB,GAAG,CAAC,CAAC,GAAG;AAExC;AACa,MAAA,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;;IAExC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;;IAEjE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,CAAA;AAEY,MAAA,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;AACnC,IAAA,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;
|
|
1
|
+
{"version":3,"file":"config.js","sources":["../../../src/config.ts"],"sourcesContent":["import { z } from 'zod';\nimport type { AxiosError } from 'axios';\n\n/**\n * Basic authentication configuration using email and API token\n *\n * @see {@link https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/} for how to create API tokens\n */\nexport const BasicSchema = z.strictObject({\n basic: z.strictObject({\n /** User's email associated with Atlassian account */\n email: z.string().email(),\n /**\n * API token generated from Atlassian account settings\n *\n * @see {@link https://support.atlassian.com/atlassian-account/docs/manage-api-tokens-for-your-atlassian-account/} for how to create API tokens\n */\n apiToken: z.string().min(1, 'API token is required'),\n }),\n});\n\n/** JWT authentication configuration */\nexport const JWTSchema = z.strictObject({\n jwt: z.strictObject({\n /** The key from the app descriptor */\n issuer: z.string(),\n /** The shared secret key from app installation */\n secret: z.string(),\n /** Token expiry time (default: 180) */\n expiryTimeSeconds: z.optional(z.number()),\n }),\n});\n\n/** OAuth2 authentication configuration */\nexport const OAuth2Schema = z.strictObject({\n oauth2: z.strictObject({\n /** OAuth2 access token */\n accessToken: z.string(),\n }),\n});\n\n/** Authentication configuration schema */\nexport const AuthenticationSchema = z.union([BasicSchema, JWTSchema, OAuth2Schema]);\n\n/** Base request configuration */\nexport const RequestConfigSchema = z.any();\n\n/** Middleware configuration schema */\nexport const MiddlewaresSchema = z.object({\n /** Error handler middleware */\n onError: z.optional(z.function().args(z.any()).returns(z.void())),\n /** Response handler middleware */\n onResponse: z.optional(z.function().args(z.any()).returns(z.void())),\n});\n\nexport const ConfigSchema = z.object({\n host: z.string().url({ message: 'Couldn\\'t parse the host URL. Perhaps you forgot to add \\'http://\\' or \\'https://\\' at the beginning of the URL?' }),\n baseRequestConfig: z.optional(RequestConfigSchema),\n authentication: z.optional(AuthenticationSchema),\n middlewares: z.optional(MiddlewaresSchema),\n /** Adds `'X-Atlassian-Token': 'no-check'` to each request header */\n noCheckAtlassianToken: z.optional(z.boolean()),\n /** Prefix for all API routes. */\n apiPrefix: z.optional(z.string()),\n});\n\nexport type Config = z.infer<typeof ConfigSchema>;\nexport type Authentication = z.infer<typeof AuthenticationSchema>;\nexport type Basic = z.infer<typeof BasicSchema>;\nexport type JWT = z.infer<typeof JWTSchema>;\nexport type OAuth2 = z.infer<typeof OAuth2Schema>;\nexport type Error = AxiosError;\n"],"names":[],"mappings":";;AAGA;;;;AAIG;AACU,MAAA,WAAW,GAAG,CAAC,CAAC,YAAY,CAAC;AACxC,IAAA,KAAK,EAAE,CAAC,CAAC,YAAY,CAAC;;AAEpB,QAAA,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,KAAK,EAAE;AACzB;;;;AAIG;QACH,QAAQ,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,EAAE,uBAAuB,CAAC;KACrD,CAAC;AACH,CAAA;AAED;AACa,MAAA,SAAS,GAAG,CAAC,CAAC,YAAY,CAAC;AACtC,IAAA,GAAG,EAAE,CAAC,CAAC,YAAY,CAAC;;AAElB,QAAA,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;;AAElB,QAAA,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE;;QAElB,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;KAC1C,CAAC;AACH,CAAA;AAED;AACa,MAAA,YAAY,GAAG,CAAC,CAAC,YAAY,CAAC;AACzC,IAAA,MAAM,EAAE,CAAC,CAAC,YAAY,CAAC;;AAErB,QAAA,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE;KACxB,CAAC;AACH,CAAA;AAED;AACa,MAAA,oBAAoB,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,YAAY,CAAC;AAElF;MACa,mBAAmB,GAAG,CAAC,CAAC,GAAG;AAExC;AACa,MAAA,iBAAiB,GAAG,CAAC,CAAC,MAAM,CAAC;;IAExC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;;IAEjE,UAAU,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;AACrE,CAAA;AAEY,MAAA,YAAY,GAAG,CAAC,CAAC,MAAM,CAAC;AACnC,IAAA,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,EAAE,OAAO,EAAG,kHAAkH,EAAE,CAAC;AACtJ,IAAA,iBAAiB,EAAE,CAAC,CAAC,QAAQ,CAAC,mBAAmB,CAAC;AAClD,IAAA,cAAc,EAAE,CAAC,CAAC,QAAQ,CAAC,oBAAoB,CAAC;AAChD,IAAA,WAAW,EAAE,CAAC,CAAC,QAAQ,CAAC,iBAAiB,CAAC;;IAE1C,qBAAqB,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;;IAE9C,SAAS,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC;AAClC,CAAA;;;;"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { Callback } from "~/callback";
|
|
2
2
|
import type { Client } from "./client.js";
|
|
3
|
-
import type
|
|
3
|
+
import { type Config } from "~/config";
|
|
4
4
|
import type { RequestConfig } from "~/requestConfig";
|
|
5
5
|
export declare class BaseClient implements Client {
|
|
6
6
|
#private;
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "confluence.js",
|
|
3
|
-
"version": "2.0.0-
|
|
3
|
+
"version": "2.0.0-dev20250512123346",
|
|
4
4
|
"description": "confluence.js is a powerful Node.JS/Browser module that allows you to interact with the Confluence API very easily",
|
|
5
5
|
"author": "Vladislav Tupikin <vladislav.tupikin@icloud.com>",
|
|
6
6
|
"license": "MIT",
|
|
@@ -4,8 +4,13 @@ import axios from 'axios';
|
|
|
4
4
|
import { getAuthenticationToken } from '~/services';
|
|
5
5
|
import type { Callback } from '~/callback';
|
|
6
6
|
import type { Client } from './client';
|
|
7
|
-
import
|
|
7
|
+
import {
|
|
8
|
+
ConfigSchema,
|
|
9
|
+
type Config,
|
|
10
|
+
type Error as ConfluenceError,
|
|
11
|
+
} from '~/config';
|
|
8
12
|
import type { RequestConfig } from '~/requestConfig';
|
|
13
|
+
import { ZodError } from 'zod';
|
|
9
14
|
|
|
10
15
|
const ATLASSIAN_TOKEN_CHECK_FLAG = 'X-Atlassian-Token';
|
|
11
16
|
const ATLASSIAN_TOKEN_CHECK_NOCHECK_VALUE = 'no-check';
|
|
@@ -15,6 +20,16 @@ export class BaseClient implements Client {
|
|
|
15
20
|
|
|
16
21
|
constructor(protected readonly config: Config) {
|
|
17
22
|
this.config.apiPrefix = this.config.apiPrefix || '/wiki/rest/';
|
|
23
|
+
|
|
24
|
+
try {
|
|
25
|
+
this.config = ConfigSchema.parse(this.config);
|
|
26
|
+
} catch (e) {
|
|
27
|
+
if (e instanceof ZodError && e.errors[0].code === 'invalid_string') {
|
|
28
|
+
throw new Error(e.errors[0].message);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
throw e;
|
|
32
|
+
}
|
|
18
33
|
}
|
|
19
34
|
|
|
20
35
|
protected paramSerializer(parameters: Record<string, any>): string {
|
package/src/config.ts
CHANGED
|
@@ -54,7 +54,7 @@ export const MiddlewaresSchema = z.object({
|
|
|
54
54
|
});
|
|
55
55
|
|
|
56
56
|
export const ConfigSchema = z.object({
|
|
57
|
-
host: z.string(),
|
|
57
|
+
host: z.string().url({ message: 'Couldn\'t parse the host URL. Perhaps you forgot to add \'http://\' or \'https://\' at the beginning of the URL?' }),
|
|
58
58
|
baseRequestConfig: z.optional(RequestConfigSchema),
|
|
59
59
|
authentication: z.optional(AuthenticationSchema),
|
|
60
60
|
middlewares: z.optional(MiddlewaresSchema),
|