@atlassian-dc-mcp/common 0.16.0 → 0.17.0
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/CHANGELOG.md +11 -0
- package/build/__tests__/runtime-config.test.js +65 -14
- package/build/__tests__/runtime-config.test.js.map +1 -1
- package/build/__tests__/setup-cli.test.d.ts +2 -0
- package/build/__tests__/setup-cli.test.d.ts.map +1 -0
- package/build/__tests__/setup-cli.test.js +166 -0
- package/build/__tests__/setup-cli.test.js.map +1 -0
- package/build/config/__tests__/registry.test.d.ts +2 -0
- package/build/config/__tests__/registry.test.d.ts.map +1 -0
- package/build/config/__tests__/registry.test.js +105 -0
- package/build/config/__tests__/registry.test.js.map +1 -0
- package/build/config/__tests__/sources/env-file.test.d.ts +2 -0
- package/build/config/__tests__/sources/env-file.test.d.ts.map +1 -0
- package/build/config/__tests__/sources/env-file.test.js +93 -0
- package/build/config/__tests__/sources/env-file.test.js.map +1 -0
- package/build/config/__tests__/sources/home-file.test.d.ts +2 -0
- package/build/config/__tests__/sources/home-file.test.d.ts.map +1 -0
- package/build/config/__tests__/sources/home-file.test.js +114 -0
- package/build/config/__tests__/sources/home-file.test.js.map +1 -0
- package/build/config/__tests__/sources/macos-keychain.test.d.ts +2 -0
- package/build/config/__tests__/sources/macos-keychain.test.d.ts.map +1 -0
- package/build/config/__tests__/sources/macos-keychain.test.js +109 -0
- package/build/config/__tests__/sources/macos-keychain.test.js.map +1 -0
- package/build/config/__tests__/sources/process-env.test.d.ts +2 -0
- package/build/config/__tests__/sources/process-env.test.d.ts.map +1 -0
- package/build/config/__tests__/sources/process-env.test.js +51 -0
- package/build/config/__tests__/sources/process-env.test.js.map +1 -0
- package/build/config/index.d.ts +8 -0
- package/build/config/index.d.ts.map +1 -0
- package/build/config/index.js +8 -0
- package/build/config/index.js.map +1 -0
- package/build/config/registry.d.ts +26 -0
- package/build/config/registry.d.ts.map +1 -0
- package/build/config/registry.js +51 -0
- package/build/config/registry.js.map +1 -0
- package/build/config/runtime-config.d.ts +14 -0
- package/build/config/runtime-config.d.ts.map +1 -0
- package/build/config/runtime-config.js +41 -0
- package/build/config/runtime-config.js.map +1 -0
- package/build/config/source.d.ts +28 -0
- package/build/config/source.d.ts.map +1 -0
- package/build/config/source.js +11 -0
- package/build/config/source.js.map +1 -0
- package/build/config/sources/dotenv-file-cache.d.ts +12 -0
- package/build/config/sources/dotenv-file-cache.d.ts.map +1 -0
- package/build/config/sources/dotenv-file-cache.js +41 -0
- package/build/config/sources/dotenv-file-cache.js.map +1 -0
- package/build/config/sources/env-file.d.ts +16 -0
- package/build/config/sources/env-file.d.ts.map +1 -0
- package/build/config/sources/env-file.js +48 -0
- package/build/config/sources/env-file.js.map +1 -0
- package/build/config/sources/home-file.d.ts +19 -0
- package/build/config/sources/home-file.d.ts.map +1 -0
- package/build/config/sources/home-file.js +102 -0
- package/build/config/sources/home-file.js.map +1 -0
- package/build/config/sources/macos-keychain.d.ts +26 -0
- package/build/config/sources/macos-keychain.d.ts.map +1 -0
- package/build/config/sources/macos-keychain.js +88 -0
- package/build/config/sources/macos-keychain.js.map +1 -0
- package/build/config/sources/process-env.d.ts +8 -0
- package/build/config/sources/process-env.d.ts.map +1 -0
- package/build/config/sources/process-env.js +12 -0
- package/build/config/sources/process-env.js.map +1 -0
- package/build/index.d.ts +2 -1
- package/build/index.d.ts.map +1 -1
- package/build/index.js +2 -1
- package/build/index.js.map +1 -1
- package/build/setup-cli.d.ts +25 -0
- package/build/setup-cli.d.ts.map +1 -0
- package/build/setup-cli.js +215 -0
- package/build/setup-cli.js.map +1 -0
- package/package.json +5 -4
- package/src/__tests__/runtime-config.test.ts +75 -27
- package/src/__tests__/setup-cli.test.ts +175 -0
- package/src/config/__tests__/registry.test.ts +118 -0
- package/src/config/__tests__/sources/env-file.test.ts +113 -0
- package/src/config/__tests__/sources/home-file.test.ts +129 -0
- package/src/config/__tests__/sources/macos-keychain.test.ts +136 -0
- package/src/config/__tests__/sources/process-env.test.ts +59 -0
- package/src/config/index.ts +7 -0
- package/src/config/registry.ts +79 -0
- package/src/config/runtime-config.ts +60 -0
- package/src/config/source.ts +37 -0
- package/src/config/sources/dotenv-file-cache.ts +54 -0
- package/src/config/sources/env-file.ts +61 -0
- package/src/config/sources/home-file.ts +121 -0
- package/src/config/sources/macos-keychain.ts +117 -0
- package/src/config/sources/process-env.ts +15 -0
- package/src/index.ts +2 -1
- package/src/setup-cli.ts +308 -0
- package/tsconfig.tsbuildinfo +1 -1
- package/build/runtime-config.d.ts +0 -14
- package/build/runtime-config.d.ts.map +0 -1
- package/build/runtime-config.js +0 -123
- package/build/runtime-config.js.map +0 -1
- package/src/runtime-config.ts +0 -176
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export declare const ATLASSIAN_DC_MCP_CONFIG_FILE_ENV_VAR = "ATLASSIAN_DC_MCP_CONFIG_FILE";
|
|
2
|
-
export type AtlassianProduct = 'jira' | 'confluence' | 'bitbucket';
|
|
3
|
-
export type ProductRuntimeConfig = {
|
|
4
|
-
host?: string;
|
|
5
|
-
apiBasePath?: string;
|
|
6
|
-
token?: string;
|
|
7
|
-
defaultPageSize: number;
|
|
8
|
-
};
|
|
9
|
-
export declare function initializeRuntimeConfig(options?: {
|
|
10
|
-
cwd?: string;
|
|
11
|
-
}): void;
|
|
12
|
-
export declare function getProductRuntimeConfig(product: AtlassianProduct): ProductRuntimeConfig;
|
|
13
|
-
export declare function validateProductRuntimeConfig(product: AtlassianProduct): string[];
|
|
14
|
-
//# sourceMappingURL=runtime-config.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-config.d.ts","sourceRoot":"","sources":["../src/runtime-config.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,oCAAoC,iCAAiC,CAAC;AAEnF,MAAM,MAAM,gBAAgB,GAAG,MAAM,GAAG,YAAY,GAAG,WAAW,CAAC;AAoBnE,MAAM,MAAM,oBAAoB,GAAG;IACjC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;CACzB,CAAC;AA+GF,wBAAgB,uBAAuB,CAAC,OAAO,CAAC,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,QAGjE;AAED,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,gBAAgB,GAAG,oBAAoB,CAUvF;AAED,wBAAgB,4BAA4B,CAAC,OAAO,EAAE,gBAAgB,GAAG,MAAM,EAAE,CAchF"}
|
package/build/runtime-config.js
DELETED
|
@@ -1,123 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import dotenv from 'dotenv';
|
|
4
|
-
const FALLBACK_PAGE_SIZE = 25;
|
|
5
|
-
export const ATLASSIAN_DC_MCP_CONFIG_FILE_ENV_VAR = 'ATLASSIAN_DC_MCP_CONFIG_FILE';
|
|
6
|
-
const PRODUCT_METADATA = {
|
|
7
|
-
jira: {
|
|
8
|
-
hostKey: 'JIRA_HOST',
|
|
9
|
-
apiBasePathKey: 'JIRA_API_BASE_PATH',
|
|
10
|
-
tokenKey: 'JIRA_API_TOKEN',
|
|
11
|
-
defaultPageSizeKey: 'JIRA_DEFAULT_PAGE_SIZE',
|
|
12
|
-
},
|
|
13
|
-
confluence: {
|
|
14
|
-
hostKey: 'CONFLUENCE_HOST',
|
|
15
|
-
apiBasePathKey: 'CONFLUENCE_API_BASE_PATH',
|
|
16
|
-
tokenKey: 'CONFLUENCE_API_TOKEN',
|
|
17
|
-
defaultPageSizeKey: 'CONFLUENCE_DEFAULT_PAGE_SIZE',
|
|
18
|
-
},
|
|
19
|
-
bitbucket: {
|
|
20
|
-
hostKey: 'BITBUCKET_HOST',
|
|
21
|
-
apiBasePathKey: 'BITBUCKET_API_BASE_PATH',
|
|
22
|
-
tokenKey: 'BITBUCKET_API_TOKEN',
|
|
23
|
-
defaultPageSizeKey: 'BITBUCKET_DEFAULT_PAGE_SIZE',
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
const runtimeConfigState = {
|
|
27
|
-
cwd: process.cwd(),
|
|
28
|
-
};
|
|
29
|
-
function parsePositiveInteger(value) {
|
|
30
|
-
if (!value) {
|
|
31
|
-
return undefined;
|
|
32
|
-
}
|
|
33
|
-
const trimmed = value.trim();
|
|
34
|
-
if (!/^\d+$/.test(trimmed)) {
|
|
35
|
-
return undefined;
|
|
36
|
-
}
|
|
37
|
-
const parsed = Number.parseInt(trimmed, 10);
|
|
38
|
-
return parsed > 0 ? parsed : undefined;
|
|
39
|
-
}
|
|
40
|
-
function getNonEmptyValue(value) {
|
|
41
|
-
if (!value) {
|
|
42
|
-
return undefined;
|
|
43
|
-
}
|
|
44
|
-
const trimmed = value.trim();
|
|
45
|
-
return trimmed.length > 0 ? trimmed : undefined;
|
|
46
|
-
}
|
|
47
|
-
function getExplicitConfigFilePath() {
|
|
48
|
-
const filePath = getNonEmptyValue(process.env[ATLASSIAN_DC_MCP_CONFIG_FILE_ENV_VAR]);
|
|
49
|
-
if (!filePath) {
|
|
50
|
-
return undefined;
|
|
51
|
-
}
|
|
52
|
-
if (!path.isAbsolute(filePath)) {
|
|
53
|
-
throw new Error(`${ATLASSIAN_DC_MCP_CONFIG_FILE_ENV_VAR} must be an absolute path: ${filePath}`);
|
|
54
|
-
}
|
|
55
|
-
return filePath;
|
|
56
|
-
}
|
|
57
|
-
function clearCachedFileIfNeeded(filePath) {
|
|
58
|
-
if (runtimeConfigState.cachedFile?.filePath === filePath) {
|
|
59
|
-
runtimeConfigState.cachedFile = undefined;
|
|
60
|
-
}
|
|
61
|
-
}
|
|
62
|
-
function getParsedFileEnvironment() {
|
|
63
|
-
const explicitFilePath = getExplicitConfigFilePath();
|
|
64
|
-
const filePath = explicitFilePath ?? path.join(runtimeConfigState.cwd, '.env');
|
|
65
|
-
let stats;
|
|
66
|
-
try {
|
|
67
|
-
stats = fs.statSync(filePath);
|
|
68
|
-
}
|
|
69
|
-
catch (error) {
|
|
70
|
-
clearCachedFileIfNeeded(filePath);
|
|
71
|
-
if (error.code === 'ENOENT' && !explicitFilePath) {
|
|
72
|
-
return {};
|
|
73
|
-
}
|
|
74
|
-
if (error.code === 'ENOENT' && explicitFilePath) {
|
|
75
|
-
throw new Error(`${ATLASSIAN_DC_MCP_CONFIG_FILE_ENV_VAR} points to a missing file: ${filePath}`);
|
|
76
|
-
}
|
|
77
|
-
throw error;
|
|
78
|
-
}
|
|
79
|
-
const cachedFile = runtimeConfigState.cachedFile;
|
|
80
|
-
if (cachedFile && cachedFile.filePath === filePath && cachedFile.mtimeMs === stats.mtimeMs) {
|
|
81
|
-
return cachedFile.values;
|
|
82
|
-
}
|
|
83
|
-
const values = dotenv.parse(fs.readFileSync(filePath));
|
|
84
|
-
runtimeConfigState.cachedFile = {
|
|
85
|
-
filePath,
|
|
86
|
-
mtimeMs: stats.mtimeMs,
|
|
87
|
-
values,
|
|
88
|
-
};
|
|
89
|
-
return values;
|
|
90
|
-
}
|
|
91
|
-
function getMergedEnvironment() {
|
|
92
|
-
return {
|
|
93
|
-
...getParsedFileEnvironment(),
|
|
94
|
-
...process.env,
|
|
95
|
-
};
|
|
96
|
-
}
|
|
97
|
-
export function initializeRuntimeConfig(options) {
|
|
98
|
-
runtimeConfigState.cwd = options?.cwd ?? process.cwd();
|
|
99
|
-
getParsedFileEnvironment();
|
|
100
|
-
}
|
|
101
|
-
export function getProductRuntimeConfig(product) {
|
|
102
|
-
const environment = getMergedEnvironment();
|
|
103
|
-
const metadata = PRODUCT_METADATA[product];
|
|
104
|
-
return {
|
|
105
|
-
host: getNonEmptyValue(environment[metadata.hostKey]),
|
|
106
|
-
apiBasePath: getNonEmptyValue(environment[metadata.apiBasePathKey]),
|
|
107
|
-
token: getNonEmptyValue(environment[metadata.tokenKey]),
|
|
108
|
-
defaultPageSize: parsePositiveInteger(environment[metadata.defaultPageSizeKey]) ?? FALLBACK_PAGE_SIZE,
|
|
109
|
-
};
|
|
110
|
-
}
|
|
111
|
-
export function validateProductRuntimeConfig(product) {
|
|
112
|
-
const metadata = PRODUCT_METADATA[product];
|
|
113
|
-
const config = getProductRuntimeConfig(product);
|
|
114
|
-
const missing = [];
|
|
115
|
-
if (!config.token) {
|
|
116
|
-
missing.push(metadata.tokenKey);
|
|
117
|
-
}
|
|
118
|
-
if (!config.host && !config.apiBasePath) {
|
|
119
|
-
missing.push(`${metadata.hostKey} or ${metadata.apiBasePathKey}`);
|
|
120
|
-
}
|
|
121
|
-
return missing;
|
|
122
|
-
}
|
|
123
|
-
//# sourceMappingURL=runtime-config.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-config.js","sourceRoot":"","sources":["../src/runtime-config.ts"],"names":[],"mappings":"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"}
|
package/src/runtime-config.ts
DELETED
|
@@ -1,176 +0,0 @@
|
|
|
1
|
-
import fs from 'node:fs';
|
|
2
|
-
import path from 'node:path';
|
|
3
|
-
import dotenv from 'dotenv';
|
|
4
|
-
|
|
5
|
-
const FALLBACK_PAGE_SIZE = 25;
|
|
6
|
-
|
|
7
|
-
export const ATLASSIAN_DC_MCP_CONFIG_FILE_ENV_VAR = 'ATLASSIAN_DC_MCP_CONFIG_FILE';
|
|
8
|
-
|
|
9
|
-
export type AtlassianProduct = 'jira' | 'confluence' | 'bitbucket';
|
|
10
|
-
|
|
11
|
-
type ProductMetadata = {
|
|
12
|
-
hostKey: string;
|
|
13
|
-
apiBasePathKey: string;
|
|
14
|
-
tokenKey: string;
|
|
15
|
-
defaultPageSizeKey: string;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
type ParsedEnvironment = Record<string, string>;
|
|
19
|
-
|
|
20
|
-
type RuntimeConfigState = {
|
|
21
|
-
cwd: string;
|
|
22
|
-
cachedFile?: {
|
|
23
|
-
filePath: string;
|
|
24
|
-
mtimeMs: number;
|
|
25
|
-
values: ParsedEnvironment;
|
|
26
|
-
};
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
export type ProductRuntimeConfig = {
|
|
30
|
-
host?: string;
|
|
31
|
-
apiBasePath?: string;
|
|
32
|
-
token?: string;
|
|
33
|
-
defaultPageSize: number;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const PRODUCT_METADATA: Record<AtlassianProduct, ProductMetadata> = {
|
|
37
|
-
jira: {
|
|
38
|
-
hostKey: 'JIRA_HOST',
|
|
39
|
-
apiBasePathKey: 'JIRA_API_BASE_PATH',
|
|
40
|
-
tokenKey: 'JIRA_API_TOKEN',
|
|
41
|
-
defaultPageSizeKey: 'JIRA_DEFAULT_PAGE_SIZE',
|
|
42
|
-
},
|
|
43
|
-
confluence: {
|
|
44
|
-
hostKey: 'CONFLUENCE_HOST',
|
|
45
|
-
apiBasePathKey: 'CONFLUENCE_API_BASE_PATH',
|
|
46
|
-
tokenKey: 'CONFLUENCE_API_TOKEN',
|
|
47
|
-
defaultPageSizeKey: 'CONFLUENCE_DEFAULT_PAGE_SIZE',
|
|
48
|
-
},
|
|
49
|
-
bitbucket: {
|
|
50
|
-
hostKey: 'BITBUCKET_HOST',
|
|
51
|
-
apiBasePathKey: 'BITBUCKET_API_BASE_PATH',
|
|
52
|
-
tokenKey: 'BITBUCKET_API_TOKEN',
|
|
53
|
-
defaultPageSizeKey: 'BITBUCKET_DEFAULT_PAGE_SIZE',
|
|
54
|
-
},
|
|
55
|
-
};
|
|
56
|
-
|
|
57
|
-
const runtimeConfigState: RuntimeConfigState = {
|
|
58
|
-
cwd: process.cwd(),
|
|
59
|
-
};
|
|
60
|
-
|
|
61
|
-
function parsePositiveInteger(value: string | undefined): number | undefined {
|
|
62
|
-
if (!value) {
|
|
63
|
-
return undefined;
|
|
64
|
-
}
|
|
65
|
-
|
|
66
|
-
const trimmed = value.trim();
|
|
67
|
-
if (!/^\d+$/.test(trimmed)) {
|
|
68
|
-
return undefined;
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
const parsed = Number.parseInt(trimmed, 10);
|
|
72
|
-
return parsed > 0 ? parsed : undefined;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
function getNonEmptyValue(value: string | undefined): string | undefined {
|
|
76
|
-
if (!value) {
|
|
77
|
-
return undefined;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
const trimmed = value.trim();
|
|
81
|
-
return trimmed.length > 0 ? trimmed : undefined;
|
|
82
|
-
}
|
|
83
|
-
|
|
84
|
-
function getExplicitConfigFilePath(): string | undefined {
|
|
85
|
-
const filePath = getNonEmptyValue(process.env[ATLASSIAN_DC_MCP_CONFIG_FILE_ENV_VAR]);
|
|
86
|
-
if (!filePath) {
|
|
87
|
-
return undefined;
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
if (!path.isAbsolute(filePath)) {
|
|
91
|
-
throw new Error(`${ATLASSIAN_DC_MCP_CONFIG_FILE_ENV_VAR} must be an absolute path: ${filePath}`);
|
|
92
|
-
}
|
|
93
|
-
|
|
94
|
-
return filePath;
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function clearCachedFileIfNeeded(filePath: string) {
|
|
98
|
-
if (runtimeConfigState.cachedFile?.filePath === filePath) {
|
|
99
|
-
runtimeConfigState.cachedFile = undefined;
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
function getParsedFileEnvironment(): ParsedEnvironment {
|
|
104
|
-
const explicitFilePath = getExplicitConfigFilePath();
|
|
105
|
-
const filePath = explicitFilePath ?? path.join(runtimeConfigState.cwd, '.env');
|
|
106
|
-
|
|
107
|
-
let stats: fs.Stats;
|
|
108
|
-
try {
|
|
109
|
-
stats = fs.statSync(filePath);
|
|
110
|
-
} catch (error) {
|
|
111
|
-
clearCachedFileIfNeeded(filePath);
|
|
112
|
-
|
|
113
|
-
if ((error as NodeJS.ErrnoException).code === 'ENOENT' && !explicitFilePath) {
|
|
114
|
-
return {};
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
if ((error as NodeJS.ErrnoException).code === 'ENOENT' && explicitFilePath) {
|
|
118
|
-
throw new Error(`${ATLASSIAN_DC_MCP_CONFIG_FILE_ENV_VAR} points to a missing file: ${filePath}`);
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
throw error;
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
const cachedFile = runtimeConfigState.cachedFile;
|
|
125
|
-
if (cachedFile && cachedFile.filePath === filePath && cachedFile.mtimeMs === stats.mtimeMs) {
|
|
126
|
-
return cachedFile.values;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
const values = dotenv.parse(fs.readFileSync(filePath));
|
|
130
|
-
runtimeConfigState.cachedFile = {
|
|
131
|
-
filePath,
|
|
132
|
-
mtimeMs: stats.mtimeMs,
|
|
133
|
-
values,
|
|
134
|
-
};
|
|
135
|
-
return values;
|
|
136
|
-
}
|
|
137
|
-
|
|
138
|
-
function getMergedEnvironment(): NodeJS.ProcessEnv {
|
|
139
|
-
return {
|
|
140
|
-
...getParsedFileEnvironment(),
|
|
141
|
-
...process.env,
|
|
142
|
-
};
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
export function initializeRuntimeConfig(options?: { cwd?: string }) {
|
|
146
|
-
runtimeConfigState.cwd = options?.cwd ?? process.cwd();
|
|
147
|
-
getParsedFileEnvironment();
|
|
148
|
-
}
|
|
149
|
-
|
|
150
|
-
export function getProductRuntimeConfig(product: AtlassianProduct): ProductRuntimeConfig {
|
|
151
|
-
const environment = getMergedEnvironment();
|
|
152
|
-
const metadata = PRODUCT_METADATA[product];
|
|
153
|
-
|
|
154
|
-
return {
|
|
155
|
-
host: getNonEmptyValue(environment[metadata.hostKey]),
|
|
156
|
-
apiBasePath: getNonEmptyValue(environment[metadata.apiBasePathKey]),
|
|
157
|
-
token: getNonEmptyValue(environment[metadata.tokenKey]),
|
|
158
|
-
defaultPageSize: parsePositiveInteger(environment[metadata.defaultPageSizeKey]) ?? FALLBACK_PAGE_SIZE,
|
|
159
|
-
};
|
|
160
|
-
}
|
|
161
|
-
|
|
162
|
-
export function validateProductRuntimeConfig(product: AtlassianProduct): string[] {
|
|
163
|
-
const metadata = PRODUCT_METADATA[product];
|
|
164
|
-
const config = getProductRuntimeConfig(product);
|
|
165
|
-
const missing: string[] = [];
|
|
166
|
-
|
|
167
|
-
if (!config.token) {
|
|
168
|
-
missing.push(metadata.tokenKey);
|
|
169
|
-
}
|
|
170
|
-
|
|
171
|
-
if (!config.host && !config.apiBasePath) {
|
|
172
|
-
missing.push(`${metadata.hostKey} or ${metadata.apiBasePathKey}`);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
return missing;
|
|
176
|
-
}
|