@grafana/plugin-ui 0.17.0 → 0.17.2
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/index.cjs +13147 -7646
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/index.d.cts +860 -542
- package/dist/esm/components/ConfigEditor/Auth/auth-method/AuthMethodSettings.js +3 -3
- package/dist/esm/components/ConfigEditor/Auth/auth-method/AuthMethodSettings.js.map +1 -1
- package/dist/esm/components/ConfigEditor/ConfigSection/ConfigDescriptionLink.js +2 -2
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js +23 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceConfigWizard.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js +27 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/DatasourceErrorBoundary.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js +61 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/SchemaField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/WizardLayout.js +91 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/WizardLayout.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js +75 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/cel.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js +262 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/config.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js +354 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/datasource.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/formInterpreter.js +93 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/formInterpreter.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js +257 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceConfigForm.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceSchema.js +39 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useDatasourceSchema.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js +106 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/hooks/useHealthChecks.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js +52 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/AuthorizationHeaderField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js +32 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ComplexFieldNote.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FieldInput.js +110 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FieldInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js +112 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/FileUploadField.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js +140 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/IndexedPairEditor.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js +201 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/ObjectArrayEditor.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PrimitiveInputs.js +103 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/PrimitiveInputs.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js +72 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/SecureFieldInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js +94 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/StringArrayInput.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/fieldUtils.js +138 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/inputs/fieldUtils.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/layoutParts.js +82 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/layoutParts.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js +30 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/resolvePluginName.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js +128 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/styles.js.map +1 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tracking.js +18 -0
- package/dist/esm/components/ConfigEditor/DatasourceConfigWizard/tracking.js.map +1 -0
- package/dist/esm/components/DataLinks/DataLink.js +2 -2
- package/dist/esm/components/DataLinks/DataLinks.js +2 -2
- package/dist/esm/components/DataSourcePicker/DataSourcePicker.js +7 -7
- package/dist/esm/components/DatePicker/styles.js +2 -2
- package/dist/esm/components/DatePickerWithInput/styles.js +2 -2
- package/dist/esm/components/QueryEditor/EditorField.js +2 -2
- package/dist/esm/components/QueryEditor/EditorHeader.js +2 -2
- package/dist/esm/components/QueryEditor/EditorRow.js +2 -2
- package/dist/esm/components/QueryEditor/EditorSwitch.js +2 -2
- package/dist/esm/components/QueryEditor/InputGroup.js +2 -2
- package/dist/esm/components/QueryEditor/Space.js +2 -2
- package/dist/esm/components/QueryEditor/query-editor-raw/RawEditor.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/EditorField.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/EditorRow.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/Preview.js +2 -2
- package/dist/esm/components/QueryEditor/visual-query-builder/SelectRow.js +2 -2
- package/dist/esm/components/SQLEditor/utils/LinkedToken.js +8 -8
- package/dist/esm/datasource/SqlDatasource.js +11 -11
- package/dist/esm/index.d.ts +860 -542
- package/dist/esm/index.js +10 -1
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/node_modules/immutable/dist/immutable.es.js +11 -11
- package/dist/esm/node_modules/immutable/dist/immutable.es.js.map +1 -1
- package/dist/esm/node_modules/react-hook-form/dist/index.esm.js +2798 -0
- package/dist/esm/node_modules/react-hook-form/dist/index.esm.js.map +1 -0
- package/dist/esm/node_modules/rxjs/dist/esm5/internal/util/isFunction.js +2 -2
- package/dist/esm/node_modules/rxjs/dist/esm5/internal/util/isFunction.js.map +1 -1
- package/dist/esm/schema/utils/dsconfig.js +97 -0
- package/dist/esm/schema/utils/dsconfig.js.map +1 -0
- package/dist/esm/schema/utils/llm.js +54 -0
- package/dist/esm/schema/utils/llm.js.map +1 -0
- package/dist/esm/schema/utils/provisioning.js +2 -2
- package/dist/esm/schema/utils/provisioning.js.map +1 -1
- package/package.json +2 -1
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
const ROOT_CONFIG_FIELDS = [
|
|
2
|
+
"name",
|
|
3
|
+
"type",
|
|
4
|
+
"id",
|
|
5
|
+
"uid",
|
|
6
|
+
"access",
|
|
7
|
+
"url",
|
|
8
|
+
"basicAuth",
|
|
9
|
+
"basicAuthUser",
|
|
10
|
+
"user",
|
|
11
|
+
"isDefault",
|
|
12
|
+
"database",
|
|
13
|
+
"withCredentials"
|
|
14
|
+
];
|
|
15
|
+
const buildCreateDatasourcePayload = (input) => {
|
|
16
|
+
const body = { name: input.name, type: input.type, access: "proxy" };
|
|
17
|
+
if (input.jsonData !== void 0) {
|
|
18
|
+
body.jsonData = { ...input.jsonData };
|
|
19
|
+
}
|
|
20
|
+
normalizeDatasourceConfig(body, input, { inferAuthMethod: true });
|
|
21
|
+
return body;
|
|
22
|
+
};
|
|
23
|
+
const buildCloneDatasourcePayload = (source, name) => {
|
|
24
|
+
var _a;
|
|
25
|
+
return { ...source, name, access: (_a = source.access) != null ? _a : "proxy", isDefault: false };
|
|
26
|
+
};
|
|
27
|
+
const buildUpdateDatasourcePayload = (existing, input) => {
|
|
28
|
+
var _a;
|
|
29
|
+
const body = {
|
|
30
|
+
name: existing.name,
|
|
31
|
+
type: existing.type,
|
|
32
|
+
access: existing.access,
|
|
33
|
+
url: existing.url,
|
|
34
|
+
database: existing.database,
|
|
35
|
+
basicAuth: existing.basicAuth,
|
|
36
|
+
basicAuthUser: existing.basicAuthUser,
|
|
37
|
+
isDefault: existing.isDefault,
|
|
38
|
+
user: existing.user,
|
|
39
|
+
withCredentials: existing.withCredentials,
|
|
40
|
+
jsonData: existing.jsonData
|
|
41
|
+
};
|
|
42
|
+
let hasChanges = false;
|
|
43
|
+
const UPDATE_COMPARABLE_FIELDS = ["name", "url", "database", "isDefault", "basicAuth"];
|
|
44
|
+
for (const key of UPDATE_COMPARABLE_FIELDS) {
|
|
45
|
+
if (input[key] !== void 0 && input[key] !== existing[key]) {
|
|
46
|
+
body[key] = input[key];
|
|
47
|
+
hasChanges = true;
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
if (input.jsonData !== void 0) {
|
|
51
|
+
body.jsonData = { ...(_a = existing.jsonData) != null ? _a : {}, ...input.jsonData };
|
|
52
|
+
hasChanges = true;
|
|
53
|
+
hasChanges = normalizeDatasourceConfig(body, input) || hasChanges;
|
|
54
|
+
}
|
|
55
|
+
return { body, hasChanges };
|
|
56
|
+
};
|
|
57
|
+
const normalizeDatasourceConfig = (body, input, options = {}) => {
|
|
58
|
+
const changed = hoistRootConfigFields(body, input);
|
|
59
|
+
if (options.inferAuthMethod) {
|
|
60
|
+
applyInferredAuthMethod(body, input);
|
|
61
|
+
}
|
|
62
|
+
return changed;
|
|
63
|
+
};
|
|
64
|
+
const hoistRootConfigFields = (body, input) => {
|
|
65
|
+
var _a;
|
|
66
|
+
const jsonData = (_a = body.jsonData) != null ? _a : {};
|
|
67
|
+
let changed = false;
|
|
68
|
+
for (const key of ROOT_CONFIG_FIELDS) {
|
|
69
|
+
if (jsonData[key] === void 0) {
|
|
70
|
+
continue;
|
|
71
|
+
}
|
|
72
|
+
if (input[key] === void 0) {
|
|
73
|
+
body[key] = jsonData[key];
|
|
74
|
+
changed = true;
|
|
75
|
+
}
|
|
76
|
+
delete jsonData[key];
|
|
77
|
+
}
|
|
78
|
+
body.jsonData = jsonData;
|
|
79
|
+
return changed;
|
|
80
|
+
};
|
|
81
|
+
const applyInferredAuthMethod = (body, input) => {
|
|
82
|
+
var _a;
|
|
83
|
+
const jsonData = (_a = body.jsonData) != null ? _a : {};
|
|
84
|
+
if (jsonData.authMethod !== void 0) {
|
|
85
|
+
body.jsonData = jsonData;
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
if (jsonData.oauthPassThru === true) {
|
|
89
|
+
jsonData.authMethod = "forward_oauth";
|
|
90
|
+
} else if (body.basicAuth === true || input.basicAuth === true) {
|
|
91
|
+
jsonData.authMethod = "basic";
|
|
92
|
+
}
|
|
93
|
+
body.jsonData = jsonData;
|
|
94
|
+
};
|
|
95
|
+
|
|
96
|
+
export { ROOT_CONFIG_FIELDS, buildCloneDatasourcePayload, buildCreateDatasourcePayload, buildUpdateDatasourcePayload };
|
|
97
|
+
//# sourceMappingURL=dsconfig.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dsconfig.js","sources":["../../../../src/schema/utils/dsconfig.ts"],"sourcesContent":["export const ROOT_CONFIG_FIELDS = [\n 'name',\n 'type',\n 'id',\n 'uid',\n 'access',\n 'url',\n 'basicAuth',\n 'basicAuthUser',\n 'user',\n 'isDefault',\n 'database',\n 'withCredentials',\n] as const;\n\ntype DatasourceConfig = Record<any, any>;\n\nexport const buildCreateDatasourcePayload = (input: DatasourceConfig): DatasourceConfig => {\n const body: DatasourceConfig = { name: input.name, type: input.type, access: 'proxy' };\n if (input.jsonData !== undefined) {\n body.jsonData = { ...(input.jsonData as DatasourceConfig) };\n }\n normalizeDatasourceConfig(body, input, { inferAuthMethod: true });\n return body;\n};\n\nexport const buildCloneDatasourcePayload = (source: DatasourceConfig, name: string): DatasourceConfig => {\n return { ...source, name, access: source.access ?? 'proxy', isDefault: false };\n};\n\nexport const buildUpdateDatasourcePayload = (\n existing: DatasourceConfig,\n input: DatasourceConfig\n): { body: DatasourceConfig; hasChanges: boolean } => {\n const body: DatasourceConfig = {\n name: existing.name,\n type: existing.type,\n access: existing.access,\n url: existing.url,\n database: existing.database,\n basicAuth: existing.basicAuth,\n basicAuthUser: existing.basicAuthUser,\n isDefault: existing.isDefault,\n user: existing.user,\n withCredentials: existing.withCredentials,\n jsonData: existing.jsonData,\n };\n let hasChanges = false;\n const UPDATE_COMPARABLE_FIELDS = ['name', 'url', 'database', 'isDefault', 'basicAuth'] as const;\n for (const key of UPDATE_COMPARABLE_FIELDS) {\n if (input[key] !== undefined && input[key] !== existing[key]) {\n body[key] = input[key];\n hasChanges = true;\n }\n }\n\n if (input.jsonData !== undefined) {\n body.jsonData = { ...((existing.jsonData ?? {}) as DatasourceConfig), ...(input.jsonData as DatasourceConfig) };\n hasChanges = true;\n hasChanges = normalizeDatasourceConfig(body, input) || hasChanges;\n }\n\n return { body, hasChanges };\n};\n\nconst normalizeDatasourceConfig = (\n body: DatasourceConfig,\n input: DatasourceConfig,\n options: { inferAuthMethod?: boolean } = {}\n): boolean => {\n const changed = hoistRootConfigFields(body, input);\n if (options.inferAuthMethod) {\n applyInferredAuthMethod(body, input);\n }\n return changed;\n};\n\nconst hoistRootConfigFields = (body: DatasourceConfig, input: DatasourceConfig): boolean => {\n const jsonData = (body.jsonData as DatasourceConfig | undefined) ?? {};\n let changed = false;\n\n for (const key of ROOT_CONFIG_FIELDS) {\n if (jsonData[key] === undefined) {\n continue;\n }\n\n if (input[key] === undefined) {\n body[key] = jsonData[key];\n changed = true;\n }\n\n delete jsonData[key];\n }\n\n body.jsonData = jsonData;\n return changed;\n};\n\nconst applyInferredAuthMethod = (body: DatasourceConfig, input: DatasourceConfig): void => {\n const jsonData = (body.jsonData as DatasourceConfig | undefined) ?? {};\n\n if (jsonData.authMethod !== undefined) {\n body.jsonData = jsonData;\n return;\n }\n\n if (jsonData.oauthPassThru === true) {\n jsonData.authMethod = 'forward_oauth';\n } else if (body.basicAuth === true || input.basicAuth === true) {\n jsonData.authMethod = 'basic';\n }\n\n body.jsonData = jsonData;\n};\n"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
function generateLLMHint(schema) {
|
|
2
|
+
var _a, _b, _c, _d;
|
|
3
|
+
const hints = [];
|
|
4
|
+
for (const field of schema.fields) {
|
|
5
|
+
if (((_a = field.ui) == null ? void 0 : _a.component) !== "select" || field.target !== "jsonData" || field.kind === "virtual") {
|
|
6
|
+
continue;
|
|
7
|
+
}
|
|
8
|
+
const options = (_c = (_b = field.ui) == null ? void 0 : _b.options) != null ? _c : [];
|
|
9
|
+
const values = options.map((opt) => {
|
|
10
|
+
const isDefault = field.defaultValue != null && String(opt.value) === String(field.defaultValue);
|
|
11
|
+
return isDefault ? `"${opt.value}" (default)` : `"${opt.value}"`;
|
|
12
|
+
}).join(", ");
|
|
13
|
+
if (values) {
|
|
14
|
+
hints.push(`- ${(_d = field.label) != null ? _d : field.key}: jsonData.${field.key} \u2014 values: ${values}`);
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
return hints.join("\n");
|
|
18
|
+
}
|
|
19
|
+
function generateTroubleshootingFields(schema) {
|
|
20
|
+
var _a, _b, _c;
|
|
21
|
+
const result = [];
|
|
22
|
+
for (const field of schema.fields) {
|
|
23
|
+
if (field.kind === "virtual" || field.isItemField) {
|
|
24
|
+
continue;
|
|
25
|
+
}
|
|
26
|
+
const entry = {
|
|
27
|
+
label: (_a = field.label) != null ? _a : field.key,
|
|
28
|
+
key: field.target === "root" ? field.key : `${field.target}.${field.key}`,
|
|
29
|
+
target: (_b = field.target) != null ? _b : "jsonData",
|
|
30
|
+
type: field.valueType,
|
|
31
|
+
required: !!field.required
|
|
32
|
+
};
|
|
33
|
+
if (field.description) {
|
|
34
|
+
entry.description = field.description;
|
|
35
|
+
}
|
|
36
|
+
if (field.defaultValue != null) {
|
|
37
|
+
entry.defaultValue = field.defaultValue;
|
|
38
|
+
}
|
|
39
|
+
if (((_c = field.ui) == null ? void 0 : _c.options) && field.ui.options.length > 0) {
|
|
40
|
+
entry.options = field.ui.options.map((o) => String(o.value));
|
|
41
|
+
}
|
|
42
|
+
if (field.section) {
|
|
43
|
+
entry.section = field.section;
|
|
44
|
+
}
|
|
45
|
+
if (field.dependsOn) {
|
|
46
|
+
entry.dependsOn = field.dependsOn;
|
|
47
|
+
}
|
|
48
|
+
result.push(entry);
|
|
49
|
+
}
|
|
50
|
+
return result;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { generateLLMHint, generateTroubleshootingFields };
|
|
54
|
+
//# sourceMappingURL=llm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"llm.js","sources":["../../../../src/schema/utils/llm.ts"],"sourcesContent":["import type { DatasourceConfigSchema } from '../schema';\n\ntype TroubleShootingContext = {\n label: string;\n key: string;\n target: string;\n type: string;\n required: boolean;\n description?: string;\n defaultValue?: unknown;\n options?: string[];\n section?: string;\n dependsOn?: string;\n};\n\n/**\n * Generate LLM hints for select fields (used when creating datasources).\n */\nexport function generateLLMHint(schema: DatasourceConfigSchema): string {\n const hints: string[] = [];\n for (const field of schema.fields) {\n if (field.ui?.component !== 'select' || field.target !== 'jsonData' || field.kind === 'virtual') {\n continue;\n }\n const options = field.ui?.options ?? [];\n const values = options\n .map((opt) => {\n const isDefault = field.defaultValue != null && String(opt.value) === String(field.defaultValue);\n return isDefault ? `\"${opt.value}\" (default)` : `\"${opt.value}\"`;\n })\n .join(', ');\n if (values) {\n hints.push(`- ${field.label ?? field.key}: jsonData.${field.key} — values: ${values}`);\n }\n }\n return hints.join('\\n');\n}\n\n/**\n * Generate comprehensive structured field data for troubleshooting context.\n * Returns an array of field descriptors the LLM can use to render rich tables.\n */\nexport function generateTroubleshootingFields(schema: DatasourceConfigSchema): TroubleShootingContext[] {\n const result: TroubleShootingContext[] = [];\n for (const field of schema.fields) {\n if (field.kind === 'virtual' || field.isItemField) {\n continue;\n }\n const entry: (typeof result)[0] = {\n label: field.label ?? field.key,\n key: field.target === 'root' ? field.key : `${field.target}.${field.key}`,\n target: field.target ?? 'jsonData',\n type: field.valueType,\n required: !!field.required,\n };\n if (field.description) {\n entry.description = field.description;\n }\n if (field.defaultValue != null) {\n entry.defaultValue = field.defaultValue;\n }\n if (field.ui?.options && field.ui.options.length > 0) {\n entry.options = field.ui.options.map((o) => String(o.value));\n }\n if (field.section) {\n entry.section = field.section;\n }\n if (field.dependsOn) {\n entry.dependsOn = field.dependsOn;\n }\n result.push(entry);\n }\n return result;\n}\n"],"names":[],"mappings":"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"}
|
|
@@ -3,7 +3,7 @@ import yaml from '../../node_modules/js-yaml/dist/js-yaml.js';
|
|
|
3
3
|
const HEADER_ROOT_KEYS = /* @__PURE__ */ new Set(["name", "type", "uid"]);
|
|
4
4
|
const INDENT_FIELD = " ";
|
|
5
5
|
const INDENT_NESTED = " ";
|
|
6
|
-
const ROOT_CONFIG_FIELDS = [
|
|
6
|
+
const ROOT_CONFIG_FIELDS$1 = [
|
|
7
7
|
"name",
|
|
8
8
|
"type",
|
|
9
9
|
"id",
|
|
@@ -175,7 +175,7 @@ const configToYaml = (ds, options = {}) => {
|
|
|
175
175
|
...options
|
|
176
176
|
};
|
|
177
177
|
const root = {};
|
|
178
|
-
for (const key of ROOT_CONFIG_FIELDS) {
|
|
178
|
+
for (const key of ROOT_CONFIG_FIELDS$1) {
|
|
179
179
|
root[key] = (_d = ds[key]) != null ? _d : "";
|
|
180
180
|
}
|
|
181
181
|
const jsonData = (_e = ds.jsonData) != null ? _e : {};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"provisioning.js","sources":["../../../../src/schema/utils/provisioning.ts"],"sourcesContent":["// ============================================================\n// Provisioning YAML generation\n// ============================================================\n\n// @ts-expect-error — js-yaml has no bundled type declarations; used only for scalar serialization\nimport yaml from 'js-yaml';\nimport type { AllowedValuesValidationRule, ConfigField, DatasourceConfigSchema } from '../schema';\n\n// Root keys already emitted in the header (name, type) or handled separately (uid).\nconst HEADER_ROOT_KEYS = new Set(['name', 'type', 'uid']);\n// Indentation for keys directly under a datasource entry (4 spaces)\n// and for keys nested under jsonData/secureJsonData (6 spaces).\nconst INDENT_FIELD = ' ';\nconst INDENT_NESTED = ' ';\n\ntype FieldBuckets = {\n rootFields: ConfigField[];\n jsonDataFields: ConfigField[];\n secureJsonDataFields: ConfigField[];\n};\n\nconst ROOT_CONFIG_FIELDS = [\n 'name',\n 'type',\n 'id',\n 'uid',\n 'access',\n 'url',\n 'basicAuth',\n 'basicAuthUser',\n 'user',\n 'isDefault',\n 'database',\n 'withCredentials',\n] as const;\n\ntype YamlRenderOptions = { jsonDataKeys?: string[]; secureKeys?: string[] };\n\n/** Serialize a scalar value as a safe YAML string using js-yaml. */\nfunction yamlString(value: unknown): string {\n if (value === null || value === undefined) {\n return '\"\"';\n }\n const s = String(value);\n if (s === '') {\n return '\"\"';\n }\n return yaml.dump(s, { lineWidth: -1 }).trimEnd();\n}\n\n/** True if a secret should be emitted as a multiline (block) placeholder. */\nfunction isMultilineSecret(field: ConfigField): boolean {\n return field.target === 'secureJsonData' && (field.ui?.multiline === true || field.ui?.component === 'textarea');\n}\n\n/** True if the field should be excluded from provisioning YAML output. */\nfunction isExcludedFromProvisioning(field: ConfigField): boolean {\n if (field.kind === 'virtual') {\n return true;\n }\n if (field.isItemField) {\n return true;\n }\n // Fields tagged \"managed-by:*\" are auto-set by the wizard UI via effects.\n // Root fields like basicAuth still need to appear in provisioning YAML\n // because they are real storage fields. Only exclude managed jsonData fields.\n if (field.tags?.some((t) => t.startsWith('managed-by:')) && field.target !== 'root') {\n return true;\n }\n // Skip indexedPair storage — these are handled separately (e.g. httpHeaders)\n if (field.storage?.type === 'indexedPair') {\n return true;\n }\n return false;\n}\n\n/** Format a secureJsonData placeholder value. */\nfunction secretPlaceholder(field: ConfigField): string {\n // Block scalar content must be indented deeper than its key (which sits at INDENT_NESTED).\n if (isMultilineSecret(field)) {\n return `|\\n${INDENT_NESTED} xxxxxx`;\n }\n return 'xxxxxx';\n}\n\n/** Default YAML value for a field in template mode. */\nfunction templateValue(field: ConfigField): unknown {\n if (field.defaultValue !== undefined) {\n return field.defaultValue;\n }\n // Use first option value as a sensible default\n if (field.ui?.options && field.ui.options.length > 0) {\n return field.ui.options[0].value;\n }\n switch (field.valueType) {\n case 'string':\n return '';\n case 'number':\n return 0;\n case 'boolean':\n return false;\n case 'array':\n return [];\n case 'object':\n case 'map':\n return {};\n default:\n return '';\n }\n}\n\n/**\n * Format a YAML comment for a field in template mode.\n * Includes label, description, allowed values, and default.\n */\nfunction fieldComment(field: ConfigField, indent: string): string {\n const parts: string[] = [];\n const label = field.label ?? field.key;\n let line = label;\n if (field.required) {\n line += ' (REQUIRED)';\n }\n if (field.description) {\n line += ` — ${field.description}`;\n }\n parts.push(`${indent}# ${line}`);\n\n const options = field.ui?.options;\n if (options && options.length > 0) {\n const vals = options.map((o) => String(o.value)).join(', ');\n parts.push(`${indent}# Allowed values: ${vals}`);\n }\n\n const allowedValuesRule = field.validations?.find(\n (v): v is AllowedValuesValidationRule => v.type === 'allowedValues'\n );\n if (allowedValuesRule && !options) {\n const vals = allowedValuesRule.values.map((v) => String(v)).join(', ');\n parts.push(`${indent}# Allowed values: ${vals}`);\n }\n\n if (field.dependsOn) {\n parts.push(`${indent}# Only when: ${field.dependsOn}`);\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Infer secureJsonData keys from jsonData keys.\n * For example, httpHeaderName1 → httpHeaderValue1 (Grafana's indexedPair convention).\n */\nfunction inferSecureJsonDataKeys(jsonData: Record<string, unknown> | undefined): string[] {\n if (!jsonData) {\n return [];\n }\n const keys: string[] = [];\n for (const key of Object.keys(jsonData)) {\n const match = key.match(/^httpHeaderName(\\d+)$/);\n if (match) {\n keys.push(`httpHeaderValue${match[1]}`);\n }\n }\n return keys;\n}\n\n/** Retrieve a nested value for a jsonData/secureJsonData field from a flat or nested values object. */\nfunction getNestedValue(values: Record<string, unknown>, target: string, field: ConfigField): unknown {\n const nested = values[target];\n if (nested && typeof nested === 'object') {\n return (nested as Record<string, unknown>)[field.key];\n }\n return undefined;\n}\n\n/** Sort schema fields into storage buckets, preserving schema field order. */\nfunction bucketFields(schema: DatasourceConfigSchema): FieldBuckets {\n const rootFields: ConfigField[] = [];\n const jsonDataFields: ConfigField[] = [];\n const secureJsonDataFields: ConfigField[] = [];\n\n for (const field of schema.fields) {\n if (isExcludedFromProvisioning(field)) {\n continue;\n }\n switch (field.target) {\n case 'root':\n rootFields.push(field);\n break;\n case 'jsonData':\n jsonDataFields.push(field);\n break;\n case 'secureJsonData':\n secureJsonDataFields.push(field);\n break;\n }\n }\n\n return { rootFields, jsonDataFields, secureJsonDataFields };\n}\n\n/** Push the shared provisioning header (apiVersion, datasources, name, type). */\nfunction emitHeader(lines: string[], pluginType: string, name: unknown): void {\n lines.push('apiVersion: 1');\n lines.push('');\n lines.push('datasources:');\n lines.push(` - name: ${yamlString(name)}`);\n lines.push(`${INDENT_FIELD}type: ${pluginType}`);\n}\n\n/** Push `key: value` as YAML lines indented under `indent`. Handles scalars, objects, and arrays. */\nfunction pushEntry(lines: string[], indent: string, key: string, val: unknown): void {\n const dumped = yaml.dump({ [key]: val }, { indent: 2, lineWidth: -1, noRefs: true }).trimEnd();\n for (const line of dumped.split('\\n')) {\n lines.push(`${indent}${line}`);\n }\n}\n\nconst configToYaml = (ds: Record<string, unknown>, options: YamlRenderOptions = {}): string => {\n const { jsonDataKeys, secureKeys } = {\n jsonDataKeys: Object.keys((ds.jsonData ?? {}) as Record<string, unknown>).sort(),\n secureKeys: [\n ...new Set([\n ...Object.keys((ds.secureJsonData ?? {}) as Record<string, unknown>),\n ...Object.keys((ds.secureJsonFields ?? {}) as Record<string, boolean>),\n ]),\n ].sort(),\n ...options,\n };\n const root: Record<string, unknown> = {};\n\n for (const key of ROOT_CONFIG_FIELDS) {\n root[key] = ds[key] ?? '';\n }\n\n const jsonData = (ds.jsonData ?? {}) as Record<string, unknown>;\n if (jsonDataKeys.length > 0) {\n const jsonDataYaml: Record<string, unknown> = {};\n for (const key of jsonDataKeys) {\n jsonDataYaml[key] = jsonData[key] ?? '';\n }\n root.jsonData = jsonDataYaml;\n }\n\n if (secureKeys.length > 0) {\n const secureJsonData: Record<string, string> = {};\n for (const key of secureKeys) {\n secureJsonData[key] = '********';\n }\n root.secureJsonData = secureJsonData;\n }\n\n return yaml.dump(root, { lineWidth: -1, sortKeys: false, noRefs: true }).trimEnd();\n};\n\n/**\n * Generate a Grafana provisioning YAML from a dsconfig schema and an existing datasource's\n * values (typically a Grafana API response). Emits only values that are set, omitting schema\n * defaults to keep the output minimal. Comments are off by default.\n */\nfunction exportProvisioningYaml(\n schema: DatasourceConfigSchema,\n values: Record<string, unknown>,\n options?: ProvisioningYamlOptions\n): string {\n const showComments = options?.comments ?? false;\n const { rootFields, jsonDataFields, secureJsonDataFields } = bucketFields(schema);\n\n const lines: string[] = [];\n emitHeader(lines, schema.pluginType, options?.name ?? values.name ?? `my-${schema.pluginType}`);\n\n // Emit uid so the provisioning YAML can be used for idempotent upserts.\n if (values.uid) {\n lines.push(`${INDENT_FIELD}uid: ${yamlString(values.uid)}`);\n }\n\n // Root fields (url, basicAuth, basicAuthUser, database, etc.)\n for (const field of rootFields) {\n if (HEADER_ROOT_KEYS.has(field.key)) {\n continue;\n }\n const val = values[field.key];\n // Skip empty values and false booleans to keep the export clean.\n if (val === undefined || val === null || val === false) {\n continue;\n }\n if (showComments) {\n lines.push(fieldComment(field, INDENT_FIELD));\n }\n pushEntry(lines, INDENT_FIELD, field.key, val);\n }\n\n // jsonData — schema-declared values plus any extra keys present on the datasource.\n const jsonDataValues = values.jsonData as Record<string, unknown> | undefined;\n const hasExtraValues = !!jsonDataValues && Object.keys(jsonDataValues).length > 0;\n if (jsonDataFields.length > 0 || hasExtraValues) {\n lines.push(`${INDENT_FIELD}jsonData:`);\n // Keys owned by the schema are rendered (or intentionally skipped) below; the extra-keys\n // pass must never re-emit them, otherwise default-valued fields would leak back in.\n const schemaKeys = new Set(jsonDataFields.map((f) => f.key));\n\n for (const field of jsonDataFields) {\n const val = getNestedValue(values, 'jsonData', field);\n if (val === undefined || val === null) {\n continue;\n }\n // Skip default-value fields to keep the export minimal.\n if (field.defaultValue !== undefined && val === field.defaultValue) {\n continue;\n }\n if (showComments) {\n lines.push(fieldComment(field, INDENT_NESTED));\n }\n pushEntry(lines, INDENT_NESTED, field.key, val);\n }\n\n // Extra keys not declared in the schema (e.g. httpHeaderName1, plugin-specific keys).\n if (jsonDataValues) {\n for (const [key, val] of Object.entries(jsonDataValues)) {\n if (schemaKeys.has(key) || val === undefined || val === null) {\n continue;\n }\n pushEntry(lines, INDENT_NESTED, key, val);\n }\n }\n }\n\n // secureJsonData — the API reports configured secrets via `secureJsonFields: { key: true }`.\n // Emit only those, plus inferred indexedPair values (e.g. httpHeaderValue1 for httpHeaderName1).\n const secureJsonFields = (values.secureJsonFields ?? {}) as Record<string, boolean>;\n const activeSecureFields = secureJsonDataFields.filter((f) => secureJsonFields[f.key] === true);\n const inferredSecureKeys = inferSecureJsonDataKeys(jsonDataValues);\n\n if (activeSecureFields.length > 0 || inferredSecureKeys.length > 0) {\n lines.push(`${INDENT_FIELD}secureJsonData:`);\n const emitted = new Set<string>();\n for (const field of activeSecureFields) {\n emitted.add(field.key);\n if (showComments) {\n lines.push(fieldComment(field, INDENT_NESTED));\n }\n lines.push(`${INDENT_NESTED}${field.key}: ${secretPlaceholder(field)}`);\n }\n for (const key of inferredSecureKeys) {\n if (emitted.has(key)) {\n continue;\n }\n lines.push(`${INDENT_NESTED}${key}: xxxxxx`);\n }\n }\n\n return lines.join('\\n');\n}\n\ntype ProvisioningYamlOptions = {\n /** Include comments with field descriptions. Default: true for template, false for export. */\n comments?: boolean;\n /** Override the emitted datasource name. */\n name?: string;\n};\n\n/**\n * Generate a Grafana provisioning YAML template from a dsconfig schema.\n * Emits every schema field with sensible defaults and (by default) explanatory comments.\n */\nexport function generateProvisioningTemplate(\n schema: DatasourceConfigSchema,\n options?: ProvisioningYamlOptions\n): string {\n const showComments = options?.comments ?? true;\n const { rootFields, jsonDataFields, secureJsonDataFields } = bucketFields(schema);\n\n const lines: string[] = [];\n emitHeader(lines, schema.pluginType, options?.name ?? `my-${schema.pluginType}`);\n\n // Root fields (url, basicAuth, basicAuthUser, database, etc.)\n for (const field of rootFields) {\n if (HEADER_ROOT_KEYS.has(field.key)) {\n continue;\n }\n const val = templateValue(field);\n if (val === undefined || val === null) {\n continue;\n }\n if (showComments) {\n lines.push(fieldComment(field, INDENT_FIELD));\n }\n pushEntry(lines, INDENT_FIELD, field.key, val);\n }\n\n // jsonData — every schema-declared field with its default value.\n if (jsonDataFields.length > 0) {\n lines.push(`${INDENT_FIELD}jsonData:`);\n for (const field of jsonDataFields) {\n const val = templateValue(field);\n if (val === undefined || val === null) {\n continue;\n }\n if (showComments) {\n lines.push(fieldComment(field, INDENT_NESTED));\n }\n pushEntry(lines, INDENT_NESTED, field.key, val);\n }\n }\n\n // secureJsonData — every schema-declared secret with a placeholder value.\n if (secureJsonDataFields.length > 0) {\n lines.push(`${INDENT_FIELD}secureJsonData:`);\n for (const field of secureJsonDataFields) {\n if (showComments) {\n lines.push(fieldComment(field, INDENT_NESTED));\n }\n lines.push(`${INDENT_NESTED}${field.key}: ${secretPlaceholder(field)}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate provisioning YAML from an existing Grafana datasource API response.\n * If a dsconfig schema is available, uses it for field ordering and comments.\n * If not, generates basic YAML from the raw API response.\n */\nexport function datasourceToProvisioningYaml(\n ds: Record<string, unknown>,\n schema: DatasourceConfigSchema | null\n): string {\n if (schema) {\n return exportProvisioningYaml(schema, ds);\n }\n\n // No schema — generate basic YAML from the raw API response\n const lines: string[] = [];\n lines.push('apiVersion: 1');\n lines.push('');\n lines.push('datasources:');\n lines.push(` - name: ${yamlString(ds.name)}`);\n if (ds.uid) {\n lines.push(` uid: ${yamlString(ds.uid)}`);\n }\n lines.push(` type: ${yamlString(ds.type)}`);\n if (ds.url) {\n lines.push(` url: ${yamlString(ds.url)}`);\n }\n if (ds.database) {\n lines.push(` database: ${yamlString(ds.database)}`);\n }\n if (ds.isDefault) {\n lines.push(' isDefault: true');\n }\n if (ds.basicAuth) {\n lines.push(' basicAuth: true');\n if (ds.basicAuthUser) {\n lines.push(` basicAuthUser: ${yamlString(ds.basicAuthUser)}`);\n }\n }\n\n const jsonData = ds.jsonData as Record<string, unknown> | undefined;\n if (jsonData && Object.keys(jsonData).length > 0) {\n lines.push(`${INDENT_FIELD}jsonData:`);\n for (const [key, val] of Object.entries(jsonData)) {\n pushEntry(lines, INDENT_NESTED, key, val);\n }\n }\n\n // secureJsonData is never returned by the API — emit placeholder comment\n lines.push(' # secureJsonData: (secrets are not exported — add manually)');\n lines.push(' # mySecret: xxxxxx');\n\n return lines.join('\\n');\n}\n\nexport const formatYamlDiff = (existing: Record<string, unknown>, body: Record<string, unknown>): string => {\n const updated = { ...existing, ...body };\n\n const existingJD = (existing.jsonData ?? {}) as Record<string, unknown>;\n const updatedJD = (updated.jsonData ?? {}) as Record<string, unknown>;\n const jsonDataKeys = [...new Set([...Object.keys(existingJD), ...Object.keys(updatedJD)])].sort();\n\n const secureKeys = [\n ...new Set([\n ...Object.keys((existing.secureJsonData ?? {}) as Record<string, unknown>),\n ...Object.keys((existing.secureJsonFields ?? {}) as Record<string, boolean>),\n ...Object.keys((updated.secureJsonData ?? {}) as Record<string, unknown>),\n ...Object.keys((updated.secureJsonFields ?? {}) as Record<string, boolean>),\n ]),\n ].sort();\n\n const currentYaml = configToYaml(existing, { jsonDataKeys, secureKeys });\n const updatedYaml = configToYaml(updated, { jsonDataKeys, secureKeys });\n\n const oldLines = currentYaml.split('\\n');\n const newLines = updatedYaml.split('\\n');\n const maxLen = Math.max(oldLines.length, newLines.length);\n const diffLines: string[] = [];\n\n for (let i = 0; i < maxLen; i++) {\n const oldLine = oldLines[i];\n const newLine = newLines[i];\n if (oldLine === newLine) {\n diffLines.push(` ${oldLine}`);\n continue;\n }\n if (oldLine !== undefined) {\n diffLines.push(`-${oldLine}`);\n }\n if (newLine !== undefined) {\n diffLines.push(`+${newLine}`);\n }\n }\n\n return '```diff\\n' + diffLines.join('\\n') + '\\n```';\n};\n"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"provisioning.js","sources":["../../../../src/schema/utils/provisioning.ts"],"sourcesContent":["// ============================================================\n// Provisioning YAML generation\n// ============================================================\n\n// @ts-expect-error — js-yaml has no bundled type declarations; used only for scalar serialization\nimport yaml from 'js-yaml';\nimport type { AllowedValuesValidationRule, ConfigField, DatasourceConfigSchema } from '../schema';\n\n// Root keys already emitted in the header (name, type) or handled separately (uid).\nconst HEADER_ROOT_KEYS = new Set(['name', 'type', 'uid']);\n// Indentation for keys directly under a datasource entry (4 spaces)\n// and for keys nested under jsonData/secureJsonData (6 spaces).\nconst INDENT_FIELD = ' ';\nconst INDENT_NESTED = ' ';\n\ntype FieldBuckets = {\n rootFields: ConfigField[];\n jsonDataFields: ConfigField[];\n secureJsonDataFields: ConfigField[];\n};\n\nconst ROOT_CONFIG_FIELDS = [\n 'name',\n 'type',\n 'id',\n 'uid',\n 'access',\n 'url',\n 'basicAuth',\n 'basicAuthUser',\n 'user',\n 'isDefault',\n 'database',\n 'withCredentials',\n] as const;\n\ntype YamlRenderOptions = { jsonDataKeys?: string[]; secureKeys?: string[] };\n\n/** Serialize a scalar value as a safe YAML string using js-yaml. */\nfunction yamlString(value: unknown): string {\n if (value === null || value === undefined) {\n return '\"\"';\n }\n const s = String(value);\n if (s === '') {\n return '\"\"';\n }\n return yaml.dump(s, { lineWidth: -1 }).trimEnd();\n}\n\n/** True if a secret should be emitted as a multiline (block) placeholder. */\nfunction isMultilineSecret(field: ConfigField): boolean {\n return field.target === 'secureJsonData' && (field.ui?.multiline === true || field.ui?.component === 'textarea');\n}\n\n/** True if the field should be excluded from provisioning YAML output. */\nfunction isExcludedFromProvisioning(field: ConfigField): boolean {\n if (field.kind === 'virtual') {\n return true;\n }\n if (field.isItemField) {\n return true;\n }\n // Fields tagged \"managed-by:*\" are auto-set by the wizard UI via effects.\n // Root fields like basicAuth still need to appear in provisioning YAML\n // because they are real storage fields. Only exclude managed jsonData fields.\n if (field.tags?.some((t) => t.startsWith('managed-by:')) && field.target !== 'root') {\n return true;\n }\n // Skip indexedPair storage — these are handled separately (e.g. httpHeaders)\n if (field.storage?.type === 'indexedPair') {\n return true;\n }\n return false;\n}\n\n/** Format a secureJsonData placeholder value. */\nfunction secretPlaceholder(field: ConfigField): string {\n // Block scalar content must be indented deeper than its key (which sits at INDENT_NESTED).\n if (isMultilineSecret(field)) {\n return `|\\n${INDENT_NESTED} xxxxxx`;\n }\n return 'xxxxxx';\n}\n\n/** Default YAML value for a field in template mode. */\nfunction templateValue(field: ConfigField): unknown {\n if (field.defaultValue !== undefined) {\n return field.defaultValue;\n }\n // Use first option value as a sensible default\n if (field.ui?.options && field.ui.options.length > 0) {\n return field.ui.options[0].value;\n }\n switch (field.valueType) {\n case 'string':\n return '';\n case 'number':\n return 0;\n case 'boolean':\n return false;\n case 'array':\n return [];\n case 'object':\n case 'map':\n return {};\n default:\n return '';\n }\n}\n\n/**\n * Format a YAML comment for a field in template mode.\n * Includes label, description, allowed values, and default.\n */\nfunction fieldComment(field: ConfigField, indent: string): string {\n const parts: string[] = [];\n const label = field.label ?? field.key;\n let line = label;\n if (field.required) {\n line += ' (REQUIRED)';\n }\n if (field.description) {\n line += ` — ${field.description}`;\n }\n parts.push(`${indent}# ${line}`);\n\n const options = field.ui?.options;\n if (options && options.length > 0) {\n const vals = options.map((o) => String(o.value)).join(', ');\n parts.push(`${indent}# Allowed values: ${vals}`);\n }\n\n const allowedValuesRule = field.validations?.find(\n (v): v is AllowedValuesValidationRule => v.type === 'allowedValues'\n );\n if (allowedValuesRule && !options) {\n const vals = allowedValuesRule.values.map((v) => String(v)).join(', ');\n parts.push(`${indent}# Allowed values: ${vals}`);\n }\n\n if (field.dependsOn) {\n parts.push(`${indent}# Only when: ${field.dependsOn}`);\n }\n\n return parts.join('\\n');\n}\n\n/**\n * Infer secureJsonData keys from jsonData keys.\n * For example, httpHeaderName1 → httpHeaderValue1 (Grafana's indexedPair convention).\n */\nfunction inferSecureJsonDataKeys(jsonData: Record<string, unknown> | undefined): string[] {\n if (!jsonData) {\n return [];\n }\n const keys: string[] = [];\n for (const key of Object.keys(jsonData)) {\n const match = key.match(/^httpHeaderName(\\d+)$/);\n if (match) {\n keys.push(`httpHeaderValue${match[1]}`);\n }\n }\n return keys;\n}\n\n/** Retrieve a nested value for a jsonData/secureJsonData field from a flat or nested values object. */\nfunction getNestedValue(values: Record<string, unknown>, target: string, field: ConfigField): unknown {\n const nested = values[target];\n if (nested && typeof nested === 'object') {\n return (nested as Record<string, unknown>)[field.key];\n }\n return undefined;\n}\n\n/** Sort schema fields into storage buckets, preserving schema field order. */\nfunction bucketFields(schema: DatasourceConfigSchema): FieldBuckets {\n const rootFields: ConfigField[] = [];\n const jsonDataFields: ConfigField[] = [];\n const secureJsonDataFields: ConfigField[] = [];\n\n for (const field of schema.fields) {\n if (isExcludedFromProvisioning(field)) {\n continue;\n }\n switch (field.target) {\n case 'root':\n rootFields.push(field);\n break;\n case 'jsonData':\n jsonDataFields.push(field);\n break;\n case 'secureJsonData':\n secureJsonDataFields.push(field);\n break;\n }\n }\n\n return { rootFields, jsonDataFields, secureJsonDataFields };\n}\n\n/** Push the shared provisioning header (apiVersion, datasources, name, type). */\nfunction emitHeader(lines: string[], pluginType: string, name: unknown): void {\n lines.push('apiVersion: 1');\n lines.push('');\n lines.push('datasources:');\n lines.push(` - name: ${yamlString(name)}`);\n lines.push(`${INDENT_FIELD}type: ${pluginType}`);\n}\n\n/** Push `key: value` as YAML lines indented under `indent`. Handles scalars, objects, and arrays. */\nfunction pushEntry(lines: string[], indent: string, key: string, val: unknown): void {\n const dumped = yaml.dump({ [key]: val }, { indent: 2, lineWidth: -1, noRefs: true }).trimEnd();\n for (const line of dumped.split('\\n')) {\n lines.push(`${indent}${line}`);\n }\n}\n\nconst configToYaml = (ds: Record<string, unknown>, options: YamlRenderOptions = {}): string => {\n const { jsonDataKeys, secureKeys } = {\n jsonDataKeys: Object.keys((ds.jsonData ?? {}) as Record<string, unknown>).sort(),\n secureKeys: [\n ...new Set([\n ...Object.keys((ds.secureJsonData ?? {}) as Record<string, unknown>),\n ...Object.keys((ds.secureJsonFields ?? {}) as Record<string, boolean>),\n ]),\n ].sort(),\n ...options,\n };\n const root: Record<string, unknown> = {};\n\n for (const key of ROOT_CONFIG_FIELDS) {\n root[key] = ds[key] ?? '';\n }\n\n const jsonData = (ds.jsonData ?? {}) as Record<string, unknown>;\n if (jsonDataKeys.length > 0) {\n const jsonDataYaml: Record<string, unknown> = {};\n for (const key of jsonDataKeys) {\n jsonDataYaml[key] = jsonData[key] ?? '';\n }\n root.jsonData = jsonDataYaml;\n }\n\n if (secureKeys.length > 0) {\n const secureJsonData: Record<string, string> = {};\n for (const key of secureKeys) {\n secureJsonData[key] = '********';\n }\n root.secureJsonData = secureJsonData;\n }\n\n return yaml.dump(root, { lineWidth: -1, sortKeys: false, noRefs: true }).trimEnd();\n};\n\n/**\n * Generate a Grafana provisioning YAML from a dsconfig schema and an existing datasource's\n * values (typically a Grafana API response). Emits only values that are set, omitting schema\n * defaults to keep the output minimal. Comments are off by default.\n */\nfunction exportProvisioningYaml(\n schema: DatasourceConfigSchema,\n values: Record<string, unknown>,\n options?: ProvisioningYamlOptions\n): string {\n const showComments = options?.comments ?? false;\n const { rootFields, jsonDataFields, secureJsonDataFields } = bucketFields(schema);\n\n const lines: string[] = [];\n emitHeader(lines, schema.pluginType, options?.name ?? values.name ?? `my-${schema.pluginType}`);\n\n // Emit uid so the provisioning YAML can be used for idempotent upserts.\n if (values.uid) {\n lines.push(`${INDENT_FIELD}uid: ${yamlString(values.uid)}`);\n }\n\n // Root fields (url, basicAuth, basicAuthUser, database, etc.)\n for (const field of rootFields) {\n if (HEADER_ROOT_KEYS.has(field.key)) {\n continue;\n }\n const val = values[field.key];\n // Skip empty values and false booleans to keep the export clean.\n if (val === undefined || val === null || val === false) {\n continue;\n }\n if (showComments) {\n lines.push(fieldComment(field, INDENT_FIELD));\n }\n pushEntry(lines, INDENT_FIELD, field.key, val);\n }\n\n // jsonData — schema-declared values plus any extra keys present on the datasource.\n const jsonDataValues = values.jsonData as Record<string, unknown> | undefined;\n const hasExtraValues = !!jsonDataValues && Object.keys(jsonDataValues).length > 0;\n if (jsonDataFields.length > 0 || hasExtraValues) {\n lines.push(`${INDENT_FIELD}jsonData:`);\n // Keys owned by the schema are rendered (or intentionally skipped) below; the extra-keys\n // pass must never re-emit them, otherwise default-valued fields would leak back in.\n const schemaKeys = new Set(jsonDataFields.map((f) => f.key));\n\n for (const field of jsonDataFields) {\n const val = getNestedValue(values, 'jsonData', field);\n if (val === undefined || val === null) {\n continue;\n }\n // Skip default-value fields to keep the export minimal.\n if (field.defaultValue !== undefined && val === field.defaultValue) {\n continue;\n }\n if (showComments) {\n lines.push(fieldComment(field, INDENT_NESTED));\n }\n pushEntry(lines, INDENT_NESTED, field.key, val);\n }\n\n // Extra keys not declared in the schema (e.g. httpHeaderName1, plugin-specific keys).\n if (jsonDataValues) {\n for (const [key, val] of Object.entries(jsonDataValues)) {\n if (schemaKeys.has(key) || val === undefined || val === null) {\n continue;\n }\n pushEntry(lines, INDENT_NESTED, key, val);\n }\n }\n }\n\n // secureJsonData — the API reports configured secrets via `secureJsonFields: { key: true }`.\n // Emit only those, plus inferred indexedPair values (e.g. httpHeaderValue1 for httpHeaderName1).\n const secureJsonFields = (values.secureJsonFields ?? {}) as Record<string, boolean>;\n const activeSecureFields = secureJsonDataFields.filter((f) => secureJsonFields[f.key] === true);\n const inferredSecureKeys = inferSecureJsonDataKeys(jsonDataValues);\n\n if (activeSecureFields.length > 0 || inferredSecureKeys.length > 0) {\n lines.push(`${INDENT_FIELD}secureJsonData:`);\n const emitted = new Set<string>();\n for (const field of activeSecureFields) {\n emitted.add(field.key);\n if (showComments) {\n lines.push(fieldComment(field, INDENT_NESTED));\n }\n lines.push(`${INDENT_NESTED}${field.key}: ${secretPlaceholder(field)}`);\n }\n for (const key of inferredSecureKeys) {\n if (emitted.has(key)) {\n continue;\n }\n lines.push(`${INDENT_NESTED}${key}: xxxxxx`);\n }\n }\n\n return lines.join('\\n');\n}\n\ntype ProvisioningYamlOptions = {\n /** Include comments with field descriptions. Default: true for template, false for export. */\n comments?: boolean;\n /** Override the emitted datasource name. */\n name?: string;\n};\n\n/**\n * Generate a Grafana provisioning YAML template from a dsconfig schema.\n * Emits every schema field with sensible defaults and (by default) explanatory comments.\n */\nexport function generateProvisioningTemplate(\n schema: DatasourceConfigSchema,\n options?: ProvisioningYamlOptions\n): string {\n const showComments = options?.comments ?? true;\n const { rootFields, jsonDataFields, secureJsonDataFields } = bucketFields(schema);\n\n const lines: string[] = [];\n emitHeader(lines, schema.pluginType, options?.name ?? `my-${schema.pluginType}`);\n\n // Root fields (url, basicAuth, basicAuthUser, database, etc.)\n for (const field of rootFields) {\n if (HEADER_ROOT_KEYS.has(field.key)) {\n continue;\n }\n const val = templateValue(field);\n if (val === undefined || val === null) {\n continue;\n }\n if (showComments) {\n lines.push(fieldComment(field, INDENT_FIELD));\n }\n pushEntry(lines, INDENT_FIELD, field.key, val);\n }\n\n // jsonData — every schema-declared field with its default value.\n if (jsonDataFields.length > 0) {\n lines.push(`${INDENT_FIELD}jsonData:`);\n for (const field of jsonDataFields) {\n const val = templateValue(field);\n if (val === undefined || val === null) {\n continue;\n }\n if (showComments) {\n lines.push(fieldComment(field, INDENT_NESTED));\n }\n pushEntry(lines, INDENT_NESTED, field.key, val);\n }\n }\n\n // secureJsonData — every schema-declared secret with a placeholder value.\n if (secureJsonDataFields.length > 0) {\n lines.push(`${INDENT_FIELD}secureJsonData:`);\n for (const field of secureJsonDataFields) {\n if (showComments) {\n lines.push(fieldComment(field, INDENT_NESTED));\n }\n lines.push(`${INDENT_NESTED}${field.key}: ${secretPlaceholder(field)}`);\n }\n }\n\n return lines.join('\\n');\n}\n\n/**\n * Generate provisioning YAML from an existing Grafana datasource API response.\n * If a dsconfig schema is available, uses it for field ordering and comments.\n * If not, generates basic YAML from the raw API response.\n */\nexport function datasourceToProvisioningYaml(\n ds: Record<string, unknown>,\n schema: DatasourceConfigSchema | null\n): string {\n if (schema) {\n return exportProvisioningYaml(schema, ds);\n }\n\n // No schema — generate basic YAML from the raw API response\n const lines: string[] = [];\n lines.push('apiVersion: 1');\n lines.push('');\n lines.push('datasources:');\n lines.push(` - name: ${yamlString(ds.name)}`);\n if (ds.uid) {\n lines.push(` uid: ${yamlString(ds.uid)}`);\n }\n lines.push(` type: ${yamlString(ds.type)}`);\n if (ds.url) {\n lines.push(` url: ${yamlString(ds.url)}`);\n }\n if (ds.database) {\n lines.push(` database: ${yamlString(ds.database)}`);\n }\n if (ds.isDefault) {\n lines.push(' isDefault: true');\n }\n if (ds.basicAuth) {\n lines.push(' basicAuth: true');\n if (ds.basicAuthUser) {\n lines.push(` basicAuthUser: ${yamlString(ds.basicAuthUser)}`);\n }\n }\n\n const jsonData = ds.jsonData as Record<string, unknown> | undefined;\n if (jsonData && Object.keys(jsonData).length > 0) {\n lines.push(`${INDENT_FIELD}jsonData:`);\n for (const [key, val] of Object.entries(jsonData)) {\n pushEntry(lines, INDENT_NESTED, key, val);\n }\n }\n\n // secureJsonData is never returned by the API — emit placeholder comment\n lines.push(' # secureJsonData: (secrets are not exported — add manually)');\n lines.push(' # mySecret: xxxxxx');\n\n return lines.join('\\n');\n}\n\nexport const formatYamlDiff = (existing: Record<string, unknown>, body: Record<string, unknown>): string => {\n const updated = { ...existing, ...body };\n\n const existingJD = (existing.jsonData ?? {}) as Record<string, unknown>;\n const updatedJD = (updated.jsonData ?? {}) as Record<string, unknown>;\n const jsonDataKeys = [...new Set([...Object.keys(existingJD), ...Object.keys(updatedJD)])].sort();\n\n const secureKeys = [\n ...new Set([\n ...Object.keys((existing.secureJsonData ?? {}) as Record<string, unknown>),\n ...Object.keys((existing.secureJsonFields ?? {}) as Record<string, boolean>),\n ...Object.keys((updated.secureJsonData ?? {}) as Record<string, unknown>),\n ...Object.keys((updated.secureJsonFields ?? {}) as Record<string, boolean>),\n ]),\n ].sort();\n\n const currentYaml = configToYaml(existing, { jsonDataKeys, secureKeys });\n const updatedYaml = configToYaml(updated, { jsonDataKeys, secureKeys });\n\n const oldLines = currentYaml.split('\\n');\n const newLines = updatedYaml.split('\\n');\n const maxLen = Math.max(oldLines.length, newLines.length);\n const diffLines: string[] = [];\n\n for (let i = 0; i < maxLen; i++) {\n const oldLine = oldLines[i];\n const newLine = newLines[i];\n if (oldLine === newLine) {\n diffLines.push(` ${oldLine}`);\n continue;\n }\n if (oldLine !== undefined) {\n diffLines.push(`-${oldLine}`);\n }\n if (newLine !== undefined) {\n diffLines.push(`+${newLine}`);\n }\n }\n\n return '```diff\\n' + diffLines.join('\\n') + '\\n```';\n};\n"],"names":["ROOT_CONFIG_FIELDS"],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@grafana/plugin-ui",
|
|
3
|
-
"version": "0.17.
|
|
3
|
+
"version": "0.17.2",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "git+ssh://git@github.com/grafana/plugin-ui.git"
|
|
@@ -61,6 +61,7 @@
|
|
|
61
61
|
"dependencies": {
|
|
62
62
|
"@emotion/css": "11.13.5",
|
|
63
63
|
"@hello-pangea/dnd": "17.0.0",
|
|
64
|
+
"@marcbachmann/cel-js": "7.6.1",
|
|
64
65
|
"@react-awesome-query-builder/ui": "6.6.15",
|
|
65
66
|
"lodash": "4.18.1",
|
|
66
67
|
"prismjs": "1.30.0",
|