@red-hat-developer-hub/plugin-cost-management-common 2.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.
- package/CHANGELOG.md +49 -0
- package/README.md +17 -0
- package/dist/DefaultApiClient.cjs.js +8 -0
- package/dist/DefaultApiClient.cjs.js.map +1 -0
- package/dist/DefaultApiClient.d.ts +83 -0
- package/dist/DefaultApiClient.esm.js +2 -0
- package/dist/DefaultApiClient.esm.js.map +1 -0
- package/dist/clients/cost-management/CostManagementSlimClient.cjs.js +378 -0
- package/dist/clients/cost-management/CostManagementSlimClient.cjs.js.map +1 -0
- package/dist/clients/cost-management/CostManagementSlimClient.esm.js +372 -0
- package/dist/clients/cost-management/CostManagementSlimClient.esm.js.map +1 -0
- package/dist/clients/optimizations/OptimizationsClient.cjs.js +99 -0
- package/dist/clients/optimizations/OptimizationsClient.cjs.js.map +1 -0
- package/dist/clients/optimizations/OptimizationsClient.esm.js +92 -0
- package/dist/clients/optimizations/OptimizationsClient.esm.js.map +1 -0
- package/dist/clients/orchestrator-slim/OrchestratorSlimClient.cjs.js +107 -0
- package/dist/clients/orchestrator-slim/OrchestratorSlimClient.cjs.js.map +1 -0
- package/dist/clients/orchestrator-slim/OrchestratorSlimClient.esm.js +105 -0
- package/dist/clients/orchestrator-slim/OrchestratorSlimClient.esm.js.map +1 -0
- package/dist/clients.cjs.js +12 -0
- package/dist/clients.cjs.js.map +1 -0
- package/dist/clients.d.ts +432 -0
- package/dist/clients.esm.js +4 -0
- package/dist/clients.esm.js.map +1 -0
- package/dist/generated/apis/DefaultApi.client.cjs.js +91 -0
- package/dist/generated/apis/DefaultApi.client.cjs.js.map +1 -0
- package/dist/generated/apis/DefaultApi.client.esm.js +66 -0
- package/dist/generated/apis/DefaultApi.client.esm.js.map +1 -0
- package/dist/generated/pluginId.cjs.js +6 -0
- package/dist/generated/pluginId.cjs.js.map +1 -0
- package/dist/generated/pluginId.esm.js +4 -0
- package/dist/generated/pluginId.esm.js.map +1 -0
- package/dist/index.cjs.js +14 -0
- package/dist/index.cjs.js.map +1 -0
- package/dist/index.d.ts +6 -0
- package/dist/index.esm.js +5 -0
- package/dist/index.esm.js.map +1 -0
- package/dist/json-utils.cjs.js +22 -0
- package/dist/json-utils.cjs.js.map +1 -0
- package/dist/json-utils.d.ts +46 -0
- package/dist/json-utils.esm.js +20 -0
- package/dist/json-utils.esm.js.map +1 -0
- package/dist/models.cjs.js +3 -0
- package/dist/models.cjs.js.map +1 -0
- package/dist/models.d.ts +25 -0
- package/dist/models.esm.js +2 -0
- package/dist/models.esm.js.map +1 -0
- package/dist/permissions.cjs.js +47 -0
- package/dist/permissions.cjs.js.map +1 -0
- package/dist/permissions.d.ts +24 -0
- package/dist/permissions.esm.js +36 -0
- package/dist/permissions.esm.js.map +1 -0
- package/dist/types/RecommendationList.model.d-J74WXrJI.d.ts +414 -0
- package/dist/util/lib/json.cjs.js +20 -0
- package/dist/util/lib/json.cjs.js.map +1 -0
- package/dist/util/lib/json.esm.js +15 -0
- package/dist/util/lib/json.esm.js.map +1 -0
- package/dist/util/lib/json_node.cjs.js +191 -0
- package/dist/util/lib/json_node.cjs.js.map +1 -0
- package/dist/util/lib/json_node.esm.js +189 -0
- package/dist/util/lib/json_node.esm.js.map +1 -0
- package/package.json +124 -0
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
class OrchestratorSlimClient {
|
|
4
|
+
discoveryApi;
|
|
5
|
+
fetchApi;
|
|
6
|
+
baseUrl;
|
|
7
|
+
/** @deprecated identityApi is retained for backward compatibility but no longer used. */
|
|
8
|
+
constructor(options) {
|
|
9
|
+
this.discoveryApi = options.discoveryApi;
|
|
10
|
+
this.fetchApi = options.fetchApi;
|
|
11
|
+
}
|
|
12
|
+
async isWorkflowAvailable(workflowId) {
|
|
13
|
+
const result = await this.checkWorkflowAvailability(workflowId);
|
|
14
|
+
return result.available;
|
|
15
|
+
}
|
|
16
|
+
async checkWorkflowAvailability(workflowId) {
|
|
17
|
+
if (!workflowId) {
|
|
18
|
+
return {
|
|
19
|
+
available: false,
|
|
20
|
+
reason: "not_configured",
|
|
21
|
+
errorMessage: "No workflow configured to apply recommendations"
|
|
22
|
+
};
|
|
23
|
+
}
|
|
24
|
+
if (!this.baseUrl) {
|
|
25
|
+
this.baseUrl = await this.discoveryApi.getBaseUrl("orchestrator");
|
|
26
|
+
}
|
|
27
|
+
const url = `${this.baseUrl}/v2/workflows/${encodeURIComponent(
|
|
28
|
+
workflowId
|
|
29
|
+
)}/overview`;
|
|
30
|
+
try {
|
|
31
|
+
const response = await this.fetchApi.fetch(url, { method: "GET" });
|
|
32
|
+
if (response.ok) {
|
|
33
|
+
return { available: true };
|
|
34
|
+
}
|
|
35
|
+
const statusCode = response.status;
|
|
36
|
+
if (statusCode === 404) {
|
|
37
|
+
return {
|
|
38
|
+
available: false,
|
|
39
|
+
reason: "not_found",
|
|
40
|
+
errorMessage: "Workflow doesn't exist"
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
if (statusCode === 503) {
|
|
44
|
+
return {
|
|
45
|
+
available: false,
|
|
46
|
+
reason: "service_unavailable",
|
|
47
|
+
errorMessage: "Workflow is not available"
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
if (statusCode === 500) {
|
|
51
|
+
return {
|
|
52
|
+
available: false,
|
|
53
|
+
reason: "service_unavailable",
|
|
54
|
+
errorMessage: "Workflow is not available yet or misconfigured"
|
|
55
|
+
};
|
|
56
|
+
}
|
|
57
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
58
|
+
return {
|
|
59
|
+
available: false,
|
|
60
|
+
reason: "access_denied",
|
|
61
|
+
errorMessage: "No permission to access the workflow"
|
|
62
|
+
};
|
|
63
|
+
}
|
|
64
|
+
return {
|
|
65
|
+
available: false,
|
|
66
|
+
reason: "service_unavailable",
|
|
67
|
+
errorMessage: "Workflow service is currently unavailable"
|
|
68
|
+
};
|
|
69
|
+
} catch (err) {
|
|
70
|
+
return {
|
|
71
|
+
available: false,
|
|
72
|
+
reason: "service_unavailable",
|
|
73
|
+
errorMessage: "Unable to connect to workflow service"
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Executes a workflow through the cost-management backend which validates
|
|
79
|
+
* inputs and checks ros.apply permission before forwarding to orchestrator.
|
|
80
|
+
* @public
|
|
81
|
+
*/
|
|
82
|
+
async executeWorkflow(workflowId, workflowInputData) {
|
|
83
|
+
const costManagementBase = await this.discoveryApi.getBaseUrl(
|
|
84
|
+
"cost-management"
|
|
85
|
+
);
|
|
86
|
+
const url = `${costManagementBase}/apply-recommendation`;
|
|
87
|
+
const response = await this.fetchApi.fetch(url, {
|
|
88
|
+
method: "POST",
|
|
89
|
+
body: JSON.stringify({
|
|
90
|
+
workflowId,
|
|
91
|
+
...workflowInputData
|
|
92
|
+
}),
|
|
93
|
+
headers: {
|
|
94
|
+
"Content-Type": "application/json"
|
|
95
|
+
}
|
|
96
|
+
});
|
|
97
|
+
if (!response.ok) {
|
|
98
|
+
const errorPayload = await response.json().catch(() => ({}));
|
|
99
|
+
const message = errorPayload.error ?? `Workflow execution failed (${response.status})`;
|
|
100
|
+
throw new Error(message);
|
|
101
|
+
}
|
|
102
|
+
return await response.json();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
exports.OrchestratorSlimClient = OrchestratorSlimClient;
|
|
107
|
+
//# sourceMappingURL=OrchestratorSlimClient.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrchestratorSlimClient.cjs.js","sources":["../../../src/clients/orchestrator-slim/OrchestratorSlimClient.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport type {\n OrchestratorSlimApi,\n WorkflowAvailabilityResult,\n} from './OrchestratorSlimApi';\nimport type { JsonObject } from '@backstage/types';\n\n/** @public */\nexport class OrchestratorSlimClient implements OrchestratorSlimApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n private baseUrl?: string;\n\n /** @deprecated identityApi is retained for backward compatibility but no longer used. */\n constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n identityApi?: IdentityApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n async isWorkflowAvailable(workflowId: string): Promise<boolean> {\n const result = await this.checkWorkflowAvailability(workflowId);\n return result.available;\n }\n\n async checkWorkflowAvailability(\n workflowId: string,\n ): Promise<WorkflowAvailabilityResult> {\n if (!workflowId) {\n return {\n available: false,\n reason: 'not_configured',\n errorMessage: 'No workflow configured to apply recommendations',\n };\n }\n\n if (!this.baseUrl) {\n this.baseUrl = await this.discoveryApi.getBaseUrl('orchestrator');\n }\n\n const url = `${this.baseUrl}/v2/workflows/${encodeURIComponent(\n workflowId,\n )}/overview`;\n\n try {\n const response = await this.fetchApi.fetch(url, { method: 'GET' });\n\n if (response.ok) {\n return { available: true };\n }\n\n const statusCode = response.status;\n\n if (statusCode === 404) {\n return {\n available: false,\n reason: 'not_found',\n errorMessage: \"Workflow doesn't exist\",\n };\n }\n\n if (statusCode === 503) {\n return {\n available: false,\n reason: 'service_unavailable',\n errorMessage: 'Workflow is not available',\n };\n }\n\n if (statusCode === 500) {\n return {\n available: false,\n reason: 'service_unavailable',\n errorMessage: 'Workflow is not available yet or misconfigured',\n };\n }\n\n if (statusCode === 401 || statusCode === 403) {\n return {\n available: false,\n reason: 'access_denied',\n errorMessage: 'No permission to access the workflow',\n };\n }\n\n // Handle any other error status codes\n return {\n available: false,\n reason: 'service_unavailable',\n errorMessage: 'Workflow service is currently unavailable',\n };\n } catch (err) {\n return {\n available: false,\n reason: 'service_unavailable',\n errorMessage: 'Unable to connect to workflow service',\n };\n }\n }\n\n /**\n * Executes a workflow through the cost-management backend which validates\n * inputs and checks ros.apply permission before forwarding to orchestrator.\n * @public\n */\n async executeWorkflow<D = JsonObject>(\n workflowId: string,\n workflowInputData: D,\n ): Promise<{ id: string }> {\n const costManagementBase = await this.discoveryApi.getBaseUrl(\n 'cost-management',\n );\n const url = `${costManagementBase}/apply-recommendation`;\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n workflowId,\n ...(workflowInputData as object),\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorPayload = await response.json().catch(() => ({}));\n const message =\n (errorPayload as { error?: string }).error ??\n `Workflow execution failed (${response.status})`;\n throw new Error(message);\n }\n\n return (await response.json()) as { id: string };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
class OrchestratorSlimClient {
|
|
2
|
+
discoveryApi;
|
|
3
|
+
fetchApi;
|
|
4
|
+
baseUrl;
|
|
5
|
+
/** @deprecated identityApi is retained for backward compatibility but no longer used. */
|
|
6
|
+
constructor(options) {
|
|
7
|
+
this.discoveryApi = options.discoveryApi;
|
|
8
|
+
this.fetchApi = options.fetchApi;
|
|
9
|
+
}
|
|
10
|
+
async isWorkflowAvailable(workflowId) {
|
|
11
|
+
const result = await this.checkWorkflowAvailability(workflowId);
|
|
12
|
+
return result.available;
|
|
13
|
+
}
|
|
14
|
+
async checkWorkflowAvailability(workflowId) {
|
|
15
|
+
if (!workflowId) {
|
|
16
|
+
return {
|
|
17
|
+
available: false,
|
|
18
|
+
reason: "not_configured",
|
|
19
|
+
errorMessage: "No workflow configured to apply recommendations"
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
if (!this.baseUrl) {
|
|
23
|
+
this.baseUrl = await this.discoveryApi.getBaseUrl("orchestrator");
|
|
24
|
+
}
|
|
25
|
+
const url = `${this.baseUrl}/v2/workflows/${encodeURIComponent(
|
|
26
|
+
workflowId
|
|
27
|
+
)}/overview`;
|
|
28
|
+
try {
|
|
29
|
+
const response = await this.fetchApi.fetch(url, { method: "GET" });
|
|
30
|
+
if (response.ok) {
|
|
31
|
+
return { available: true };
|
|
32
|
+
}
|
|
33
|
+
const statusCode = response.status;
|
|
34
|
+
if (statusCode === 404) {
|
|
35
|
+
return {
|
|
36
|
+
available: false,
|
|
37
|
+
reason: "not_found",
|
|
38
|
+
errorMessage: "Workflow doesn't exist"
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
if (statusCode === 503) {
|
|
42
|
+
return {
|
|
43
|
+
available: false,
|
|
44
|
+
reason: "service_unavailable",
|
|
45
|
+
errorMessage: "Workflow is not available"
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
if (statusCode === 500) {
|
|
49
|
+
return {
|
|
50
|
+
available: false,
|
|
51
|
+
reason: "service_unavailable",
|
|
52
|
+
errorMessage: "Workflow is not available yet or misconfigured"
|
|
53
|
+
};
|
|
54
|
+
}
|
|
55
|
+
if (statusCode === 401 || statusCode === 403) {
|
|
56
|
+
return {
|
|
57
|
+
available: false,
|
|
58
|
+
reason: "access_denied",
|
|
59
|
+
errorMessage: "No permission to access the workflow"
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
return {
|
|
63
|
+
available: false,
|
|
64
|
+
reason: "service_unavailable",
|
|
65
|
+
errorMessage: "Workflow service is currently unavailable"
|
|
66
|
+
};
|
|
67
|
+
} catch (err) {
|
|
68
|
+
return {
|
|
69
|
+
available: false,
|
|
70
|
+
reason: "service_unavailable",
|
|
71
|
+
errorMessage: "Unable to connect to workflow service"
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Executes a workflow through the cost-management backend which validates
|
|
77
|
+
* inputs and checks ros.apply permission before forwarding to orchestrator.
|
|
78
|
+
* @public
|
|
79
|
+
*/
|
|
80
|
+
async executeWorkflow(workflowId, workflowInputData) {
|
|
81
|
+
const costManagementBase = await this.discoveryApi.getBaseUrl(
|
|
82
|
+
"cost-management"
|
|
83
|
+
);
|
|
84
|
+
const url = `${costManagementBase}/apply-recommendation`;
|
|
85
|
+
const response = await this.fetchApi.fetch(url, {
|
|
86
|
+
method: "POST",
|
|
87
|
+
body: JSON.stringify({
|
|
88
|
+
workflowId,
|
|
89
|
+
...workflowInputData
|
|
90
|
+
}),
|
|
91
|
+
headers: {
|
|
92
|
+
"Content-Type": "application/json"
|
|
93
|
+
}
|
|
94
|
+
});
|
|
95
|
+
if (!response.ok) {
|
|
96
|
+
const errorPayload = await response.json().catch(() => ({}));
|
|
97
|
+
const message = errorPayload.error ?? `Workflow execution failed (${response.status})`;
|
|
98
|
+
throw new Error(message);
|
|
99
|
+
}
|
|
100
|
+
return await response.json();
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
export { OrchestratorSlimClient };
|
|
105
|
+
//# sourceMappingURL=OrchestratorSlimClient.esm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"OrchestratorSlimClient.esm.js","sources":["../../../src/clients/orchestrator-slim/OrchestratorSlimClient.ts"],"sourcesContent":["/*\n * Copyright Red Hat, Inc.\n *\n * Licensed under the Apache License, Version 2.0 (the \"License\");\n * you may not use this file except in compliance with the License.\n * You may obtain a copy of the License at\n *\n * http://www.apache.org/licenses/LICENSE-2.0\n *\n * Unless required by applicable law or agreed to in writing, software\n * distributed under the License is distributed on an \"AS IS\" BASIS,\n * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n * See the License for the specific language governing permissions and\n * limitations under the License.\n */\n\nimport {\n DiscoveryApi,\n FetchApi,\n IdentityApi,\n} from '@backstage/core-plugin-api';\nimport type {\n OrchestratorSlimApi,\n WorkflowAvailabilityResult,\n} from './OrchestratorSlimApi';\nimport type { JsonObject } from '@backstage/types';\n\n/** @public */\nexport class OrchestratorSlimClient implements OrchestratorSlimApi {\n private readonly discoveryApi: DiscoveryApi;\n private readonly fetchApi: FetchApi;\n private baseUrl?: string;\n\n /** @deprecated identityApi is retained for backward compatibility but no longer used. */\n constructor(options: {\n discoveryApi: DiscoveryApi;\n fetchApi: FetchApi;\n identityApi?: IdentityApi;\n }) {\n this.discoveryApi = options.discoveryApi;\n this.fetchApi = options.fetchApi;\n }\n\n async isWorkflowAvailable(workflowId: string): Promise<boolean> {\n const result = await this.checkWorkflowAvailability(workflowId);\n return result.available;\n }\n\n async checkWorkflowAvailability(\n workflowId: string,\n ): Promise<WorkflowAvailabilityResult> {\n if (!workflowId) {\n return {\n available: false,\n reason: 'not_configured',\n errorMessage: 'No workflow configured to apply recommendations',\n };\n }\n\n if (!this.baseUrl) {\n this.baseUrl = await this.discoveryApi.getBaseUrl('orchestrator');\n }\n\n const url = `${this.baseUrl}/v2/workflows/${encodeURIComponent(\n workflowId,\n )}/overview`;\n\n try {\n const response = await this.fetchApi.fetch(url, { method: 'GET' });\n\n if (response.ok) {\n return { available: true };\n }\n\n const statusCode = response.status;\n\n if (statusCode === 404) {\n return {\n available: false,\n reason: 'not_found',\n errorMessage: \"Workflow doesn't exist\",\n };\n }\n\n if (statusCode === 503) {\n return {\n available: false,\n reason: 'service_unavailable',\n errorMessage: 'Workflow is not available',\n };\n }\n\n if (statusCode === 500) {\n return {\n available: false,\n reason: 'service_unavailable',\n errorMessage: 'Workflow is not available yet or misconfigured',\n };\n }\n\n if (statusCode === 401 || statusCode === 403) {\n return {\n available: false,\n reason: 'access_denied',\n errorMessage: 'No permission to access the workflow',\n };\n }\n\n // Handle any other error status codes\n return {\n available: false,\n reason: 'service_unavailable',\n errorMessage: 'Workflow service is currently unavailable',\n };\n } catch (err) {\n return {\n available: false,\n reason: 'service_unavailable',\n errorMessage: 'Unable to connect to workflow service',\n };\n }\n }\n\n /**\n * Executes a workflow through the cost-management backend which validates\n * inputs and checks ros.apply permission before forwarding to orchestrator.\n * @public\n */\n async executeWorkflow<D = JsonObject>(\n workflowId: string,\n workflowInputData: D,\n ): Promise<{ id: string }> {\n const costManagementBase = await this.discoveryApi.getBaseUrl(\n 'cost-management',\n );\n const url = `${costManagementBase}/apply-recommendation`;\n const response = await this.fetchApi.fetch(url, {\n method: 'POST',\n body: JSON.stringify({\n workflowId,\n ...(workflowInputData as object),\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n });\n\n if (!response.ok) {\n const errorPayload = await response.json().catch(() => ({}));\n const message =\n (errorPayload as { error?: string }).error ??\n `Workflow execution failed (${response.status})`;\n throw new Error(message);\n }\n\n return (await response.json()) as { id: string };\n }\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
'use strict';
|
|
2
|
+
|
|
3
|
+
var OptimizationsClient = require('./clients/optimizations/OptimizationsClient.cjs.js');
|
|
4
|
+
var OrchestratorSlimClient = require('./clients/orchestrator-slim/OrchestratorSlimClient.cjs.js');
|
|
5
|
+
var CostManagementSlimClient = require('./clients/cost-management/CostManagementSlimClient.cjs.js');
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
exports.OptimizationsClient = OptimizationsClient.OptimizationsClient;
|
|
10
|
+
exports.OrchestratorSlimClient = OrchestratorSlimClient.OrchestratorSlimClient;
|
|
11
|
+
exports.CostManagementSlimClient = CostManagementSlimClient.CostManagementSlimClient;
|
|
12
|
+
//# sourceMappingURL=clients.cjs.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"clients.cjs.js","sources":[],"sourcesContent":[],"names":[],"mappings":";;;;;;;;;;"}
|