@perses-dev/plugin-system 0.55.0-beta.10 → 0.55.0-beta.12
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/components/MultiQueryEditor/MultiQueryEditor.d.ts.map +1 -1
- package/dist/components/MultiQueryEditor/MultiQueryEditor.js +16 -1
- package/dist/components/MultiQueryEditor/MultiQueryEditor.js.map +1 -1
- package/dist/components/PanelSpecEditor/PanelSpecEditor.d.ts.map +1 -1
- package/dist/components/PanelSpecEditor/PanelSpecEditor.js +4 -1
- package/dist/components/PanelSpecEditor/PanelSpecEditor.js.map +1 -1
- package/dist/components/PluginEditor/plugin-editor-api.d.ts +7 -1
- package/dist/components/PluginEditor/plugin-editor-api.d.ts.map +1 -1
- package/dist/components/PluginEditor/plugin-editor-api.js +6 -1
- package/dist/components/PluginEditor/plugin-editor-api.js.map +1 -1
- package/dist/components/PluginKindSelect/PluginKindSelect.d.ts +14 -0
- package/dist/components/PluginKindSelect/PluginKindSelect.d.ts.map +1 -1
- package/dist/components/PluginKindSelect/PluginKindSelect.js +187 -23
- package/dist/components/PluginKindSelect/PluginKindSelect.js.map +1 -1
- package/dist/components/PluginRegistry/PluginRegistry.d.ts.map +1 -1
- package/dist/components/PluginRegistry/PluginRegistry.js +67 -4
- package/dist/components/PluginRegistry/PluginRegistry.js.map +1 -1
- package/dist/components/PluginRegistry/plugin-indexes.d.ts +1 -0
- package/dist/components/PluginRegistry/plugin-indexes.d.ts.map +1 -1
- package/dist/components/PluginRegistry/plugin-indexes.js +6 -1
- package/dist/components/PluginRegistry/plugin-indexes.js.map +1 -1
- package/dist/components/PluginSpecEditor/PluginSpecEditor.d.ts.map +1 -1
- package/dist/components/PluginSpecEditor/PluginSpecEditor.js +6 -2
- package/dist/components/PluginSpecEditor/PluginSpecEditor.js.map +1 -1
- package/dist/components/Variables/variable-model.d.ts.map +1 -1
- package/dist/components/Variables/variable-model.js +7 -2
- package/dist/components/Variables/variable-model.js.map +1 -1
- package/dist/model/plugins.d.ts +11 -0
- package/dist/model/plugins.d.ts.map +1 -1
- package/dist/model/plugins.js.map +1 -1
- package/dist/remote/PluginRuntime.js +10 -10
- package/dist/remote/PluginRuntime.js.map +1 -1
- package/dist/runtime/TimeRangeProvider/TimeRangeProviders.d.ts +3 -1
- package/dist/runtime/TimeRangeProvider/TimeRangeProviders.d.ts.map +1 -1
- package/dist/runtime/TimeRangeProvider/TimeRangeProviders.js +2 -2
- package/dist/runtime/TimeRangeProvider/TimeRangeProviders.js.map +1 -1
- package/dist/runtime/alerts-queries.d.ts.map +1 -1
- package/dist/runtime/alerts-queries.js +6 -2
- package/dist/runtime/alerts-queries.js.map +1 -1
- package/dist/runtime/annotations.d.ts.map +1 -1
- package/dist/runtime/annotations.js +10 -3
- package/dist/runtime/annotations.js.map +1 -1
- package/dist/runtime/log-queries.d.ts.map +1 -1
- package/dist/runtime/log-queries.js +3 -1
- package/dist/runtime/log-queries.js.map +1 -1
- package/dist/runtime/plugin-registry.d.ts +22 -8
- package/dist/runtime/plugin-registry.d.ts.map +1 -1
- package/dist/runtime/plugin-registry.js +52 -16
- package/dist/runtime/plugin-registry.js.map +1 -1
- package/dist/runtime/profile-queries.d.ts.map +1 -1
- package/dist/runtime/profile-queries.js +3 -1
- package/dist/runtime/profile-queries.js.map +1 -1
- package/dist/runtime/silences-queries.d.ts.map +1 -1
- package/dist/runtime/silences-queries.js +6 -2
- package/dist/runtime/silences-queries.js.map +1 -1
- package/dist/runtime/time-series-queries.d.ts.map +1 -1
- package/dist/runtime/time-series-queries.js +10 -3
- package/dist/runtime/time-series-queries.js.map +1 -1
- package/dist/runtime/trace-queries.d.ts.map +1 -1
- package/dist/runtime/trace-queries.js +6 -2
- package/dist/runtime/trace-queries.js.map +1 -1
- package/dist/runtime/variables.d.ts +6 -0
- package/dist/runtime/variables.d.ts.map +1 -1
- package/dist/runtime/variables.js +17 -1
- package/dist/runtime/variables.js.map +1 -1
- package/dist/utils/index.d.ts +1 -0
- package/dist/utils/index.d.ts.map +1 -1
- package/dist/utils/index.js +1 -0
- package/dist/utils/index.js.map +1 -1
- package/dist/utils/plugin-versions.d.ts +18 -0
- package/dist/utils/plugin-versions.d.ts.map +1 -0
- package/dist/utils/plugin-versions.js +52 -0
- package/dist/utils/plugin-versions.js.map +1 -0
- package/package.json +5 -4
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/PluginKindSelect/PluginKindSelect.tsx"],"sourcesContent":["// Copyright The Perses Authors\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\nimport type { TextFieldProps } from '@mui/material';\nimport { MenuItem, TextField } from '@mui/material';\nimport type { ReactElement } from 'react';\nimport { forwardRef, useCallback, useMemo } from 'react';\n\nimport type { PluginType } from '../../model';\nimport { useListPluginMetadata } from '../../runtime';\nimport type { PluginEditorSelection } from '../PluginEditor';\n\nexport interface PluginKindSelectProps extends Omit<TextFieldProps, 'value' | 'onChange' | 'children'> {\n filteredQueryPlugins?: string[];\n pluginTypes: PluginType[];\n value?: PluginEditorSelection;\n onChange?: (s: PluginEditorSelection) => void;\n}\n\n/**\n * Displays a MUI Select input for selecting a plugin's kind from a list of all the available plugins of some specific\n * plugin types. (e.g. \"Show a list of all the Panel plugins\", or \"Show a list of all the Variable plugins\", or \"Show\n * a list of all the TimeSeriesQuery, TraceQuery, ProfileQuery, and LogQuery plugins\").\n * The value of the select is the kind of the plugin, but you can also listen to the `onPluginTypeChange` event to know\n * when the user changes the plugin type (it fires at start for the default value.)\n */\nexport const PluginKindSelect = forwardRef((props: PluginKindSelectProps, ref): ReactElement => {\n const { pluginTypes, value: propValue, onChange, filteredQueryPlugins, ...others } = props;\n const { data, isLoading } = useListPluginMetadata(pluginTypes);\n\n const sortedData = useMemo(() => {\n if (filteredQueryPlugins?.length) {\n return data\n ?.filter((i) => filteredQueryPlugins.includes(i.spec.name))\n ?.toSorted((a, b) => a.spec.display.name.localeCompare(b.spec.display.name));\n }\n\n return data?.toSorted((a, b) => a.spec.display.name.localeCompare(b.spec.display.name));\n }, [data, filteredQueryPlugins]);\n\n // Pass an empty value while options are still loading so MUI doesn't complain about us using an \"out of range\" value\n const value = !propValue || isLoading ? '' : selectionToOptionValue(propValue);\n\n const handleChange = (event: { target: { value: string } }): void => {\n onChange?.(optionValueToSelection(event.target.value));\n };\n\n const renderValue = useCallback(\n (selected: unknown) => {\n if (selected === '') {\n return '';\n }\n const selectedValue = optionValueToSelection(selected as string);\n return sortedData?.find((v) => v.kind === selectedValue.type && v.spec.name === selectedValue.kind)?.spec.display\n .name;\n },\n [sortedData],\n );\n\n // TODO: Does this need a loading indicator of some kind?\n return (\n <TextField\n select\n inputRef={ref}\n {...others}\n value={value}\n aria-label={value}\n onChange={handleChange}\n SelectProps={{ renderValue }}\n data-testid=\"plugin-kind-select\"\n >\n {isLoading && <MenuItem value=\"\">Loading...</MenuItem>}\n {sortedData?.map((metadata) => (\n <MenuItem\n data-testid=\"option\"\n key={metadata.kind + metadata.spec.name}\n value={selectionToOptionValue({ type: metadata.kind, kind: metadata.spec.name })}\n >\n {metadata.spec.display.name}\n </MenuItem>\n ))}\n </TextField>\n );\n});\nPluginKindSelect.displayName = 'PluginKindSelect';\n\n// Delimiter used to stringify/parse option values\nconst OPTION_VALUE_DELIMITER = '_____';\n\n/**\n * Given a PluginEditorSelection,\n * returns a string value like `{type}_____{kind}` that can be used as a Select input value.\n * @param selector\n */\nfunction selectionToOptionValue(selector: PluginEditorSelection): string {\n return [selector.type, selector.kind].join(OPTION_VALUE_DELIMITER);\n}\n\n/**\n * Given an option value name like `{type}_____{kind}`,\n * returns a PluginEditorSelection to be used by the query data model.\n * @param optionValue\n */\nfunction optionValueToSelection(optionValue: string): PluginEditorSelection {\n const words = optionValue.split(OPTION_VALUE_DELIMITER);\n const type = words[0] as PluginType | undefined;\n const kind = words[1];\n if (type === undefined || kind === undefined) {\n throw new Error('Invalid optionValue string');\n }\n return {\n type,\n kind,\n };\n}\n"],"names":["MenuItem","TextField","forwardRef","useCallback","useMemo","useListPluginMetadata","PluginKindSelect","props","ref","pluginTypes","value","propValue","onChange","filteredQueryPlugins","others","data","isLoading","sortedData","length","filter","i","includes","spec","name","toSorted","a","b","display","localeCompare","selectionToOptionValue","handleChange","event","optionValueToSelection","target","renderValue","selected","selectedValue","find","v","kind","type","select","inputRef","aria-label","SelectProps","data-testid","map","metadata","displayName","OPTION_VALUE_DELIMITER","selector","join","optionValue","words","split","undefined","Error"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/PluginKindSelect/PluginKindSelect.tsx"],"sourcesContent":["// Copyright The Perses Authors\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\nimport type { TextFieldProps } from '@mui/material';\nimport { MenuItem, TextField } from '@mui/material';\nimport type { PluginDefinitionMetadata } from '@perses-dev/spec';\nimport type { ReactElement } from 'react';\nimport { forwardRef, useCallback, useMemo } from 'react';\n\nimport type { PluginMetadataWithModule, PluginType } from '../../model';\nimport { useListPluginMetadata } from '../../runtime';\nimport { comparePluginVersions } from '../../utils';\nimport type { PluginEditorSelection } from '../PluginEditor';\n\nexport interface PluginKindSelectProps extends Omit<TextFieldProps, 'value' | 'onChange' | 'children'> {\n filteredQueryPlugins?: string[];\n pluginTypes: PluginType[];\n value?: PluginEditorSelection;\n onChange?: (s: PluginEditorSelection) => void;\n /**\n * When true, a plugin that has more than one version available is listed with a `<display name> - Latest` option and\n * once per version, labeled `<display name> - <version>`. Selecting a specific version sets `metadata.version` on the\n * selection so it can be persisted on the definition, while selecting Latest leaves the version unpinned. A plugin\n * with a single available version is listed without a version, so it keeps resolving to the latest one. Defaults to\n * false.\n */\n enableVersionSelection?: boolean;\n /**\n * When true, a plugin that is available in more than one registry is listed once per registry, labeled\n * `<display name> (<registry>)`. Selecting such an option sets `metadata.registry` on the selection. A plugin\n * available in a single registry is listed without it. Defaults to false.\n */\n enableRegistrySelection?: boolean;\n}\n\n/** A plugin kind grouped with all of the variants it is installed under. */\ninterface PluginKindGroup {\n type: PluginType;\n kind: string;\n displayName: string;\n /** Available variants, sorted from the newest version to the oldest. */\n variants: PluginDefinitionMetadata[];\n hasMultipleVersions: boolean;\n hasMultipleRegistries: boolean;\n}\n\n/** A selectable entry of the select input. */\ninterface PluginKindOption {\n selection: PluginEditorSelection;\n label: string;\n /** Stringified `selection`, used as the MUI Select option value. */\n value: string;\n}\n\nfunction getVariant(metadata: PluginMetadataWithModule): PluginDefinitionMetadata {\n return {\n version: metadata.metadata?.version ?? metadata.module?.version,\n registry: metadata.metadata?.registry ?? metadata.module?.registry,\n };\n}\n\nfunction getVariantKey(variant: PluginDefinitionMetadata): string {\n return `${variant.version ?? ''}:${variant.registry ?? ''}`;\n}\n\n/**\n * Build the selectable entries of a plugin kind. A version (resp. registry) is only part of the entries when the caller\n * enabled its selection *and* the plugin is actually installed in more than one version (resp. registry): there is\n * nothing to pick otherwise, and leaving it out keeps the definition floating on the latest version.\n */\nfunction getGroupOptions(\n group: PluginKindGroup,\n enableVersionSelection: boolean,\n enableRegistrySelection: boolean,\n): PluginKindOption[] {\n const showVersion = enableVersionSelection && group.hasMultipleVersions;\n const showRegistry = enableRegistrySelection && group.hasMultipleRegistries;\n\n if (!showVersion && !showRegistry) {\n const selection: PluginEditorSelection = { type: group.type, kind: group.kind };\n return [{ selection, label: group.displayName, value: selectionToOptionValue(selection) }];\n }\n\n const options: PluginKindOption[] = [];\n const seen = new Set<string>();\n if (showVersion) {\n const selection: PluginEditorSelection = { type: group.type, kind: group.kind };\n options.push({\n selection,\n label: `${group.displayName} - Latest`,\n value: selectionToOptionValue(selection),\n });\n seen.add(getVariantKey({}));\n }\n for (const variant of group.variants) {\n const version = showVersion ? variant.version : undefined;\n const registry = showRegistry ? variant.registry : undefined;\n const metadata: PluginDefinitionMetadata = {\n ...(version ? { version } : {}),\n ...(registry ? { registry } : {}),\n };\n // Variants that only differ on a field we don't display collapse into a single entry.\n const key = getVariantKey({ version, registry });\n if (seen.has(key)) {\n continue;\n }\n seen.add(key);\n\n const selection: PluginEditorSelection = {\n type: group.type,\n kind: group.kind,\n ...(version || registry ? { metadata } : {}),\n };\n const label = `${group.displayName}${version ? ` - ${version}` : ''}${registry ? ` (${registry})` : ''}`;\n options.push({ selection, label, value: selectionToOptionValue(selection) });\n }\n return options;\n}\n\n/**\n * Displays a MUI Select input for selecting a plugin's kind from a list of all the available plugins of some specific\n * plugin types. (e.g. \"Show a list of all the Panel plugins\", or \"Show a list of all the Variable plugins\", or \"Show\n * a list of all the TimeSeriesQuery, TraceQuery, ProfileQuery, and LogQuery plugins\").\n * The value of the select is the kind of the plugin, but you can also listen to the `onPluginTypeChange` event to know\n * when the user changes the plugin type (it fires at start for the default value.)\n */\nexport const PluginKindSelect = forwardRef((props: PluginKindSelectProps, ref): ReactElement => {\n const {\n pluginTypes,\n value: propValue,\n onChange,\n filteredQueryPlugins,\n enableVersionSelection = false,\n enableRegistrySelection = false,\n ...others\n } = props;\n const { data, isLoading } = useListPluginMetadata(pluginTypes);\n\n const sortedData = useMemo(() => {\n const filtered = filteredQueryPlugins?.length\n ? data?.filter((i) => filteredQueryPlugins.includes(i.spec.name))\n : data;\n return filtered?.toSorted((a, b) => a.spec.display.name.localeCompare(b.spec.display.name));\n }, [data, filteredQueryPlugins]);\n\n // Group the metadata by plugin kind, collecting all the variants each one is installed under (newest version first).\n const kindGroups = useMemo<PluginKindGroup[]>(() => {\n const groups = new Map<string, PluginKindGroup>();\n for (const metadata of sortedData ?? []) {\n const key = `${metadata.kind}:${metadata.spec.name}`;\n let group = groups.get(key);\n if (group === undefined) {\n group = {\n type: metadata.kind,\n kind: metadata.spec.name,\n displayName: metadata.spec.display.name,\n variants: [],\n hasMultipleVersions: false,\n hasMultipleRegistries: false,\n };\n groups.set(key, group);\n }\n const variant = getVariant(metadata);\n if (!group.variants.some((existing) => getVariantKey(existing) === getVariantKey(variant))) {\n group.variants.push(variant);\n }\n }\n for (const group of groups.values()) {\n group.variants = group.variants.toSorted((a, b) => comparePluginVersions(b.version ?? '', a.version ?? ''));\n group.hasMultipleVersions = new Set(group.variants.map((v) => v.version ?? '')).size > 1;\n group.hasMultipleRegistries = new Set(group.variants.map((v) => v.registry ?? '')).size > 1;\n }\n return [...groups.values()];\n }, [sortedData]);\n\n const options = useMemo(\n () => kindGroups.flatMap((group) => getGroupOptions(group, enableVersionSelection, enableRegistrySelection)),\n [kindGroups, enableVersionSelection, enableRegistrySelection],\n );\n\n const labelsByValue = useMemo(() => new Map(options.map((option) => [option.value, option.label])), [options]);\n\n // Pass an empty value while options are still loading so MUI doesn't complain about us using an \"out of range\" value\n const value = useMemo(() => {\n if (!propValue || isLoading) {\n return '';\n }\n const optionValue = selectionToOptionValue(propValue);\n if (labelsByValue.has(optionValue)) {\n return optionValue;\n }\n // The definition is not pinned (or is pinned to something we don't list): fall back to the first entry of that\n // plugin kind, which is the one that will actually be used, so the Select has a matching value.\n const fallback = options.find(\n (option) => option.selection.type === propValue.type && option.selection.kind === propValue.kind,\n );\n return fallback?.value ?? optionValue;\n }, [propValue, isLoading, labelsByValue, options]);\n\n const handleChange = (event: { target: { value: string } }): void => {\n onChange?.(optionValueToSelection(event.target.value));\n };\n\n const renderValue = useCallback(\n (selected: unknown) => {\n if (selected === '') {\n return '';\n }\n const optionValue = selected as string;\n const label = labelsByValue.get(optionValue);\n if (label !== undefined) {\n return label;\n }\n const selectedValue = optionValueToSelection(optionValue);\n return kindGroups.find((group) => group.type === selectedValue.type && group.kind === selectedValue.kind)\n ?.displayName;\n },\n [labelsByValue, kindGroups],\n );\n\n // TODO: Does this need a loading indicator of some kind?\n return (\n <TextField\n select\n inputRef={ref}\n {...others}\n value={value}\n aria-label={value}\n onChange={handleChange}\n SelectProps={{ renderValue }}\n data-testid=\"plugin-kind-select\"\n >\n {isLoading && <MenuItem value=\"\">Loading...</MenuItem>}\n {options.map((option) => (\n <MenuItem data-testid=\"option\" key={option.value} value={option.value}>\n {option.label}\n </MenuItem>\n ))}\n </TextField>\n );\n});\nPluginKindSelect.displayName = 'PluginKindSelect';\n\n// Delimiter used to stringify/parse option values\nconst OPTION_VALUE_DELIMITER = '_____';\n\n/**\n * Given a PluginEditorSelection, returns a string value like `{type}_____{kind}` that can be used as a Select input\n * value. A pinned version and/or registry is appended as `{type}_____{kind}_____{version}_____{registry}`, with empty\n * segments for the parts that are not pinned.\n * @param selector\n */\nfunction selectionToOptionValue(selector: PluginEditorSelection): string {\n const { version, registry } = selector.metadata ?? {};\n const parts = [selector.type, selector.kind];\n if (version || registry) {\n parts.push(version ?? '');\n }\n if (registry) {\n parts.push(registry);\n }\n return parts.join(OPTION_VALUE_DELIMITER);\n}\n\n/**\n * Given an option value name like `{type}_____{kind}` or `{type}_____{kind}_____{version}_____{registry}`, returns a\n * PluginEditorSelection to be used by the query data model.\n * @param optionValue\n */\nfunction optionValueToSelection(optionValue: string): PluginEditorSelection {\n const words = optionValue.split(OPTION_VALUE_DELIMITER);\n const type = words[0] as PluginType | undefined;\n const kind = words[1];\n const version = words[2];\n const registry = words[3];\n if (type === undefined || kind === undefined) {\n throw new Error('Invalid optionValue string');\n }\n const metadata: PluginDefinitionMetadata = {\n ...(version ? { version } : {}),\n ...(registry ? { registry } : {}),\n };\n return {\n type,\n kind,\n ...(version || registry ? { metadata } : {}),\n };\n}\n"],"names":["MenuItem","TextField","forwardRef","useCallback","useMemo","useListPluginMetadata","comparePluginVersions","getVariant","metadata","version","module","registry","getVariantKey","variant","getGroupOptions","group","enableVersionSelection","enableRegistrySelection","showVersion","hasMultipleVersions","showRegistry","hasMultipleRegistries","selection","type","kind","label","displayName","value","selectionToOptionValue","options","seen","Set","push","add","variants","undefined","key","has","PluginKindSelect","props","ref","pluginTypes","propValue","onChange","filteredQueryPlugins","others","data","isLoading","sortedData","filtered","length","filter","i","includes","spec","name","toSorted","a","b","display","localeCompare","kindGroups","groups","Map","get","set","some","existing","values","map","v","size","flatMap","labelsByValue","option","optionValue","fallback","find","handleChange","event","optionValueToSelection","target","renderValue","selected","selectedValue","select","inputRef","aria-label","SelectProps","data-testid","OPTION_VALUE_DELIMITER","selector","parts","join","words","split","Error"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluginRegistry.d.ts","sourceRoot":"","sources":["../../../src/components/PluginRegistry/PluginRegistry.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGrD,OAAO,KAAK,EAKV,YAAY,EACZ,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAOrB,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;
|
|
1
|
+
{"version":3,"file":"PluginRegistry.d.ts","sourceRoot":"","sources":["../../../src/components/PluginRegistry/PluginRegistry.tsx"],"names":[],"mappings":"AAcA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAGrD,OAAO,KAAK,EAKV,YAAY,EACZ,kBAAkB,EACnB,MAAM,aAAa,CAAC;AAOrB,MAAM,WAAW,mBAAmB;IAClC,YAAY,EAAE,YAAY,CAAC;IAC3B,kBAAkB,CAAC,EAAE,kBAAkB,CAAC;IACxC,QAAQ,CAAC,EAAE,SAAS,CAAC;CACtB;AA2CD;;;GAGG;AACH,wBAAgB,cAAc,CAAC,KAAK,EAAE,mBAAmB,GAAG,YAAY,CA4FvE"}
|
|
@@ -13,9 +13,44 @@
|
|
|
13
13
|
import { jsx as _jsx } from "react/jsx-runtime";
|
|
14
14
|
import { useRef, useCallback, useMemo } from "react";
|
|
15
15
|
import { PluginRegistryContext } from "../../runtime/index.js";
|
|
16
|
-
import { useEvent } from "../../utils/index.js";
|
|
16
|
+
import { comparePluginVersions, useEvent } from "../../utils/index.js";
|
|
17
17
|
import { resolvePluginKeys } from "./getPluginSearchHelper.js";
|
|
18
18
|
import { usePluginIndexes } from "./plugin-indexes.js";
|
|
19
|
+
/**
|
|
20
|
+
* Returns the indexed key of a plugin served by a local dev server for the given plugin type and kind, if any.
|
|
21
|
+
* Keys are `${kind}:${name}:${registry}:${version}`, so we match on the `kind:name:` prefix.
|
|
22
|
+
*/ function findDevPluginKey(devPluginKeys, kind, name) {
|
|
23
|
+
const prefix = `${kind}:${name}:`;
|
|
24
|
+
for (const key of devPluginKeys){
|
|
25
|
+
if (key.startsWith(prefix)) {
|
|
26
|
+
return key;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
return undefined;
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Returns the indexed keys (`${kind}:${name}:${registry}:${version}`) matching *every* field supplied in the query.
|
|
33
|
+
* `kind` and `name` are always compared; `registry` and `version` are only compared when they are set, so a
|
|
34
|
+
* version-only pin matches whatever registry the plugin happens to be installed under, and a registry-only pin never
|
|
35
|
+
* leaks into another registry. Results are ordered from the newest version to the oldest.
|
|
36
|
+
*/ function findMatchingPluginKeys(allKeys, query) {
|
|
37
|
+
const { kind, name, registry, version } = query;
|
|
38
|
+
const prefix = `${kind}:${name}:`;
|
|
39
|
+
const matches = [];
|
|
40
|
+
for (const key of allKeys){
|
|
41
|
+
if (!key.startsWith(prefix)) continue;
|
|
42
|
+
const parts = key.split(':');
|
|
43
|
+
if (parts.length !== 4) continue;
|
|
44
|
+
const [, , keyRegistry, keyVersion] = parts;
|
|
45
|
+
if (registry !== undefined && keyRegistry !== registry) continue;
|
|
46
|
+
if (version !== undefined && keyVersion !== version) continue;
|
|
47
|
+
matches.push({
|
|
48
|
+
key,
|
|
49
|
+
version: keyVersion ?? ''
|
|
50
|
+
});
|
|
51
|
+
}
|
|
52
|
+
return matches.toSorted((a, b)=>comparePluginVersions(b.version, a.version)).map((match)=>match.key);
|
|
53
|
+
}
|
|
19
54
|
/**
|
|
20
55
|
* PluginRegistryContext provider that keeps track of all available plugins and provides an API for getting them or
|
|
21
56
|
* querying the metadata about them.
|
|
@@ -38,8 +73,26 @@ import { usePluginIndexes } from "./plugin-indexes.js";
|
|
|
38
73
|
});
|
|
39
74
|
const getPlugin = useCallback(async (compoundKeyObj)=>{
|
|
40
75
|
const pluginIndexes = await getPluginIndexes();
|
|
41
|
-
const { kind, name } = compoundKeyObj;
|
|
42
|
-
const
|
|
76
|
+
const { kind, name, version, registry } = compoundKeyObj;
|
|
77
|
+
const allKeys = pluginIndexes.pluginResourcesByNameKindRegistryVersion.keys();
|
|
78
|
+
let candidateKeys;
|
|
79
|
+
if (version || registry) {
|
|
80
|
+
// A pin is an exact constraint: only the plugins matching every supplied field are acceptable, and we never
|
|
81
|
+
// silently fall back to another version or another registry.
|
|
82
|
+
candidateKeys = findMatchingPluginKeys(allKeys, compoundKeyObj);
|
|
83
|
+
} else {
|
|
84
|
+
candidateKeys = resolvePluginKeys(allKeys, compoundKeyObj);
|
|
85
|
+
// Nothing pinned: a plugin served by a local dev server (`percli plugin start`) wins over installed archives,
|
|
86
|
+
// whatever their versions. Otherwise a dev plugin whose package version is lower than an installed archive would
|
|
87
|
+
// never be used, which defeats the purpose of running it in dev.
|
|
88
|
+
const devKey = findDevPluginKey(pluginIndexes.devPluginKeys, kind, name);
|
|
89
|
+
if (devKey) {
|
|
90
|
+
candidateKeys = [
|
|
91
|
+
devKey,
|
|
92
|
+
...candidateKeys.filter((key)=>key !== devKey)
|
|
93
|
+
];
|
|
94
|
+
}
|
|
95
|
+
}
|
|
43
96
|
for (const resourceKey of candidateKeys){
|
|
44
97
|
const resource = pluginIndexes.pluginResourcesByNameKindRegistryVersion.get(resourceKey);
|
|
45
98
|
if (!resource) continue;
|
|
@@ -51,13 +104,23 @@ import { usePluginIndexes } from "./plugin-indexes.js";
|
|
|
51
104
|
const versionlessPlugin = pluginModule?.[name];
|
|
52
105
|
if (versionlessPlugin) return versionlessPlugin;
|
|
53
106
|
}
|
|
54
|
-
|
|
107
|
+
const pins = [
|
|
108
|
+
version ? `version '${version}'` : undefined,
|
|
109
|
+
registry ? `registry '${registry}'` : undefined
|
|
110
|
+
].filter((pin)=>pin !== undefined);
|
|
111
|
+
throw new Error(pins.length > 0 ? `A ${name} plugin for kind '${kind}' with ${pins.join(' and ')} is not installed` : `A ${name} plugin for kind '${kind}' is not installed`);
|
|
55
112
|
}, [
|
|
56
113
|
getPluginIndexes,
|
|
57
114
|
loadPluginModule
|
|
58
115
|
]);
|
|
59
116
|
const listPluginMetadata = useCallback(async (pluginTypes)=>{
|
|
60
117
|
const pluginIndexes = await getPluginIndexes();
|
|
118
|
+
if (pluginTypes === undefined) {
|
|
119
|
+
// No filter: return the metadata of every installed plugin, whatever its type.
|
|
120
|
+
return [
|
|
121
|
+
...pluginIndexes.pluginMetadataByKind.values()
|
|
122
|
+
].flat();
|
|
123
|
+
}
|
|
61
124
|
return pluginTypes.flatMap((type)=>pluginIndexes.pluginMetadataByKind.get(type) ?? []);
|
|
62
125
|
}, [
|
|
63
126
|
getPluginIndexes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/PluginRegistry/PluginRegistry.tsx"],"sourcesContent":["// Copyright The Perses Authors\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\nimport type { UnknownSpec } from '@perses-dev/spec';\nimport type { ReactNode, ReactElement } from 'react';\nimport { useRef, useCallback, useMemo } from 'react';\n\nimport type {\n PluginModuleResource,\n PluginType,\n PluginImplementation,\n Plugin,\n PluginLoader,\n DefaultPluginKinds,\n} from '../../model';\nimport { PluginRegistryContext } from '../../runtime';\nimport { useEvent } from '../../utils';\nimport { resolvePluginKeys } from './getPluginSearchHelper';\nimport type { PluginCompoundKey } from './plugin-indexes';\nimport { usePluginIndexes } from './plugin-indexes';\n\nexport interface PluginRegistryProps {\n pluginLoader: PluginLoader;\n defaultPluginKinds?: DefaultPluginKinds;\n children?: ReactNode;\n}\n\n/**\n * PluginRegistryContext provider that keeps track of all available plugins and provides an API for getting them or\n * querying the metadata about them.\n */\nexport function PluginRegistry(props: PluginRegistryProps): ReactElement {\n const {\n pluginLoader: { getInstalledPlugins, importPluginModule },\n children,\n defaultPluginKinds,\n } = props;\n\n const getPluginIndexes = usePluginIndexes(getInstalledPlugins);\n\n // De-dupe calls to import plugin modules\n const importCache = useRef(new Map<PluginModuleResource, Promise<unknown>>());\n\n // Do useEvent here since this accesses the importPluginModule prop and we want a stable reference to it for the\n // callback below\n const loadPluginModule = useEvent((resource: PluginModuleResource) => {\n let request = importCache.current.get(resource);\n if (request === undefined) {\n request = importPluginModule(resource);\n importCache.current.set(resource, request);\n\n // Remove failed requests from the cache so they can potentially be retried\n request.catch(() => importCache.current.delete(resource));\n }\n return request;\n });\n\n const getPlugin = useCallback(\n async <T extends PluginType>(compoundKeyObj: PluginCompoundKey<T>): Promise<PluginImplementation<T>> => {\n const pluginIndexes = await getPluginIndexes();\n const { kind, name } = compoundKeyObj;\n\n const candidateKeys = resolvePluginKeys(\n pluginIndexes.pluginResourcesByNameKindRegistryVersion.keys(),\n compoundKeyObj,\n );\n\n for (const resourceKey of candidateKeys) {\n const resource = pluginIndexes.pluginResourcesByNameKindRegistryVersion.get(resourceKey);\n if (!resource) continue;\n\n const pluginModule = (await loadPluginModule(resource)) as Record<string, Plugin<UnknownSpec>>;\n // Try to get the plugin implementation from the module using the versioned export first\n const plugin = pluginModule?.[resourceKey];\n if (plugin) return plugin as PluginImplementation<T>;\n // If the plugin module doesn't have a versioned export, fallback to the plugin name\n const versionlessPlugin = pluginModule?.[name];\n if (versionlessPlugin) return versionlessPlugin as PluginImplementation<T>;\n }\n\n throw new Error(`A ${name} plugin for kind '${kind}' is not installed`);\n },\n [getPluginIndexes, loadPluginModule],\n );\n\n const listPluginMetadata = useCallback(\n async (pluginTypes: PluginType[]) => {\n const pluginIndexes = await getPluginIndexes();\n return pluginTypes.flatMap((type) => pluginIndexes.pluginMetadataByKind.get(type) ?? []);\n },\n [getPluginIndexes],\n );\n\n // Create the registry's context value and render\n const context = useMemo(\n () => ({ getPlugin, listPluginMetadata, defaultPluginKinds }),\n [getPlugin, listPluginMetadata, defaultPluginKinds],\n );\n return <PluginRegistryContext.Provider value={context}>{children}</PluginRegistryContext.Provider>;\n}\n"],"names":["useRef","useCallback","useMemo","PluginRegistryContext","useEvent","resolvePluginKeys","usePluginIndexes","PluginRegistry","props","pluginLoader","getInstalledPlugins","importPluginModule","children","defaultPluginKinds","getPluginIndexes","importCache","Map","loadPluginModule","resource","request","current","get","undefined","set","catch","delete","getPlugin","compoundKeyObj","pluginIndexes","kind","name","candidateKeys","pluginResourcesByNameKindRegistryVersion","keys","resourceKey","pluginModule","plugin","versionlessPlugin","Error","listPluginMetadata","pluginTypes","flatMap","type","pluginMetadataByKind","context","Provider","value"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;;AAIjC,SAASA,MAAM,EAAEC,WAAW,EAAEC,OAAO,QAAQ,QAAQ;AAUrD,SAASC,qBAAqB,QAAQ,yBAAgB;AACtD,SAASC,QAAQ,QAAQ,uBAAc;AACvC,SAASC,iBAAiB,QAAQ,6BAA0B;AAE5D,SAASC,gBAAgB,QAAQ,sBAAmB;AAQpD;;;CAGC,GACD,OAAO,SAASC,eAAeC,KAA0B;IACvD,MAAM,EACJC,cAAc,EAAEC,mBAAmB,EAAEC,kBAAkB,EAAE,EACzDC,QAAQ,EACRC,kBAAkB,EACnB,GAAGL;IAEJ,MAAMM,mBAAmBR,iBAAiBI;IAE1C,yCAAyC;IACzC,MAAMK,cAAcf,OAAO,IAAIgB;IAE/B,gHAAgH;IAChH,iBAAiB;IACjB,MAAMC,mBAAmBb,SAAS,CAACc;QACjC,IAAIC,UAAUJ,YAAYK,OAAO,CAACC,GAAG,CAACH;QACtC,IAAIC,YAAYG,WAAW;YACzBH,UAAUR,mBAAmBO;YAC7BH,YAAYK,OAAO,CAACG,GAAG,CAACL,UAAUC;YAElC,2EAA2E;YAC3EA,QAAQK,KAAK,CAAC,IAAMT,YAAYK,OAAO,CAACK,MAAM,CAACP;QACjD;QACA,OAAOC;IACT;IAEA,MAAMO,YAAYzB,YAChB,OAA6B0B;QAC3B,MAAMC,gBAAgB,MAAMd;QAC5B,MAAM,EAAEe,IAAI,EAAEC,IAAI,EAAE,GAAGH;QAEvB,MAAMI,gBAAgB1B,kBACpBuB,cAAcI,wCAAwC,CAACC,IAAI,IAC3DN;QAGF,KAAK,MAAMO,eAAeH,cAAe;YACvC,MAAMb,WAAWU,cAAcI,wCAAwC,CAACX,GAAG,CAACa;YAC5E,IAAI,CAAChB,UAAU;YAEf,MAAMiB,eAAgB,MAAMlB,iBAAiBC;YAC7C,wFAAwF;YACxF,MAAMkB,SAASD,cAAc,CAACD,YAAY;YAC1C,IAAIE,QAAQ,OAAOA;YACnB,oFAAoF;YACpF,MAAMC,oBAAoBF,cAAc,CAACL,KAAK;YAC9C,IAAIO,mBAAmB,OAAOA;QAChC;QAEA,MAAM,IAAIC,MAAM,CAAC,EAAE,EAAER,KAAK,kBAAkB,EAAED,KAAK,kBAAkB,CAAC;IACxE,GACA;QAACf;QAAkBG;KAAiB;IAGtC,MAAMsB,qBAAqBtC,YACzB,OAAOuC;QACL,MAAMZ,gBAAgB,MAAMd;QAC5B,OAAO0B,YAAYC,OAAO,CAAC,CAACC,OAASd,cAAce,oBAAoB,CAACtB,GAAG,CAACqB,SAAS,EAAE;IACzF,GACA;QAAC5B;KAAiB;IAGpB,iDAAiD;IACjD,MAAM8B,UAAU1C,QACd,IAAO,CAAA;YAAEwB;YAAWa;YAAoB1B;QAAmB,CAAA,GAC3D;QAACa;QAAWa;QAAoB1B;KAAmB;IAErD,qBAAO,KAACV,sBAAsB0C,QAAQ;QAACC,OAAOF;kBAAUhC;;AAC1D"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/PluginRegistry/PluginRegistry.tsx"],"sourcesContent":["// Copyright The Perses Authors\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\nimport type { UnknownSpec } from '@perses-dev/spec';\nimport type { ReactNode, ReactElement } from 'react';\nimport { useRef, useCallback, useMemo } from 'react';\n\nimport type {\n PluginModuleResource,\n PluginType,\n PluginImplementation,\n Plugin,\n PluginLoader,\n DefaultPluginKinds,\n} from '../../model';\nimport { PluginRegistryContext } from '../../runtime';\nimport { comparePluginVersions, useEvent } from '../../utils';\nimport { resolvePluginKeys } from './getPluginSearchHelper';\nimport type { PluginCompoundKey } from './plugin-indexes';\nimport { usePluginIndexes } from './plugin-indexes';\n\nexport interface PluginRegistryProps {\n pluginLoader: PluginLoader;\n defaultPluginKinds?: DefaultPluginKinds;\n children?: ReactNode;\n}\n\n/**\n * Returns the indexed key of a plugin served by a local dev server for the given plugin type and kind, if any.\n * Keys are `${kind}:${name}:${registry}:${version}`, so we match on the `kind:name:` prefix.\n */\nfunction findDevPluginKey(devPluginKeys: Set<string>, kind: string, name: string): string | undefined {\n const prefix = `${kind}:${name}:`;\n for (const key of devPluginKeys) {\n if (key.startsWith(prefix)) {\n return key;\n }\n }\n return undefined;\n}\n\n/**\n * Returns the indexed keys (`${kind}:${name}:${registry}:${version}`) matching *every* field supplied in the query.\n * `kind` and `name` are always compared; `registry` and `version` are only compared when they are set, so a\n * version-only pin matches whatever registry the plugin happens to be installed under, and a registry-only pin never\n * leaks into another registry. Results are ordered from the newest version to the oldest.\n */\nfunction findMatchingPluginKeys<T extends PluginType>(\n allKeys: Iterable<string>,\n query: PluginCompoundKey<T>,\n): string[] {\n const { kind, name, registry, version } = query;\n const prefix = `${kind}:${name}:`;\n const matches: Array<{ key: string; version: string }> = [];\n\n for (const key of allKeys) {\n if (!key.startsWith(prefix)) continue;\n const parts = key.split(':');\n if (parts.length !== 4) continue;\n const [, , keyRegistry, keyVersion] = parts;\n if (registry !== undefined && keyRegistry !== registry) continue;\n if (version !== undefined && keyVersion !== version) continue;\n matches.push({ key, version: keyVersion ?? '' });\n }\n\n return matches.toSorted((a, b) => comparePluginVersions(b.version, a.version)).map((match) => match.key);\n}\n\n/**\n * PluginRegistryContext provider that keeps track of all available plugins and provides an API for getting them or\n * querying the metadata about them.\n */\nexport function PluginRegistry(props: PluginRegistryProps): ReactElement {\n const {\n pluginLoader: { getInstalledPlugins, importPluginModule },\n children,\n defaultPluginKinds,\n } = props;\n\n const getPluginIndexes = usePluginIndexes(getInstalledPlugins);\n\n // De-dupe calls to import plugin modules\n const importCache = useRef(new Map<PluginModuleResource, Promise<unknown>>());\n\n // Do useEvent here since this accesses the importPluginModule prop and we want a stable reference to it for the\n // callback below\n const loadPluginModule = useEvent((resource: PluginModuleResource) => {\n let request = importCache.current.get(resource);\n if (request === undefined) {\n request = importPluginModule(resource);\n importCache.current.set(resource, request);\n\n // Remove failed requests from the cache so they can potentially be retried\n request.catch(() => importCache.current.delete(resource));\n }\n return request;\n });\n\n const getPlugin = useCallback(\n async <T extends PluginType>(compoundKeyObj: PluginCompoundKey<T>): Promise<PluginImplementation<T>> => {\n const pluginIndexes = await getPluginIndexes();\n const { kind, name, version, registry } = compoundKeyObj;\n const allKeys = pluginIndexes.pluginResourcesByNameKindRegistryVersion.keys();\n\n let candidateKeys: string[];\n if (version || registry) {\n // A pin is an exact constraint: only the plugins matching every supplied field are acceptable, and we never\n // silently fall back to another version or another registry.\n candidateKeys = findMatchingPluginKeys(allKeys, compoundKeyObj);\n } else {\n candidateKeys = resolvePluginKeys(allKeys, compoundKeyObj);\n // Nothing pinned: a plugin served by a local dev server (`percli plugin start`) wins over installed archives,\n // whatever their versions. Otherwise a dev plugin whose package version is lower than an installed archive would\n // never be used, which defeats the purpose of running it in dev.\n const devKey = findDevPluginKey(pluginIndexes.devPluginKeys, kind, name);\n if (devKey) {\n candidateKeys = [devKey, ...candidateKeys.filter((key) => key !== devKey)];\n }\n }\n\n for (const resourceKey of candidateKeys) {\n const resource = pluginIndexes.pluginResourcesByNameKindRegistryVersion.get(resourceKey);\n if (!resource) continue;\n\n const pluginModule = (await loadPluginModule(resource)) as Record<string, Plugin<UnknownSpec>>;\n // Try to get the plugin implementation from the module using the versioned export first\n const plugin = pluginModule?.[resourceKey];\n if (plugin) return plugin as PluginImplementation<T>;\n // If the plugin module doesn't have a versioned export, fallback to the plugin name\n const versionlessPlugin = pluginModule?.[name];\n if (versionlessPlugin) return versionlessPlugin as PluginImplementation<T>;\n }\n\n const pins = [\n version ? `version '${version}'` : undefined,\n registry ? `registry '${registry}'` : undefined,\n ].filter((pin) => pin !== undefined);\n throw new Error(\n pins.length > 0\n ? `A ${name} plugin for kind '${kind}' with ${pins.join(' and ')} is not installed`\n : `A ${name} plugin for kind '${kind}' is not installed`,\n );\n },\n [getPluginIndexes, loadPluginModule],\n );\n\n const listPluginMetadata = useCallback(\n async (pluginTypes?: PluginType[]) => {\n const pluginIndexes = await getPluginIndexes();\n if (pluginTypes === undefined) {\n // No filter: return the metadata of every installed plugin, whatever its type.\n return [...pluginIndexes.pluginMetadataByKind.values()].flat();\n }\n return pluginTypes.flatMap((type) => pluginIndexes.pluginMetadataByKind.get(type) ?? []);\n },\n [getPluginIndexes],\n );\n\n // Create the registry's context value and render\n const context = useMemo(\n () => ({ getPlugin, listPluginMetadata, defaultPluginKinds }),\n [getPlugin, listPluginMetadata, defaultPluginKinds],\n );\n return <PluginRegistryContext.Provider value={context}>{children}</PluginRegistryContext.Provider>;\n}\n"],"names":["useRef","useCallback","useMemo","PluginRegistryContext","comparePluginVersions","useEvent","resolvePluginKeys","usePluginIndexes","findDevPluginKey","devPluginKeys","kind","name","prefix","key","startsWith","undefined","findMatchingPluginKeys","allKeys","query","registry","version","matches","parts","split","length","keyRegistry","keyVersion","push","toSorted","a","b","map","match","PluginRegistry","props","pluginLoader","getInstalledPlugins","importPluginModule","children","defaultPluginKinds","getPluginIndexes","importCache","Map","loadPluginModule","resource","request","current","get","set","catch","delete","getPlugin","compoundKeyObj","pluginIndexes","pluginResourcesByNameKindRegistryVersion","keys","candidateKeys","devKey","filter","resourceKey","pluginModule","plugin","versionlessPlugin","pins","pin","Error","join","listPluginMetadata","pluginTypes","pluginMetadataByKind","values","flat","flatMap","type","context","Provider","value"],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export { getPluginModuleCompoundKey };
|
|
|
5
5
|
export interface PluginIndexes {
|
|
6
6
|
pluginResourcesByNameKindRegistryVersion: Map<string, PluginModuleResource>;
|
|
7
7
|
pluginMetadataByKind: Map<PluginType, PluginMetadataWithModule[]>;
|
|
8
|
+
devPluginKeys: Set<string>;
|
|
8
9
|
}
|
|
9
10
|
/**
|
|
10
11
|
* Returns an async callback for getting indexes of the installed plugin data.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugin-indexes.d.ts","sourceRoot":"","sources":["../../../src/components/PluginRegistry/plugin-indexes.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAGzD,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAEtC,MAAM,WAAW,aAAa;IAE5B,wCAAwC,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAE5E,oBAAoB,EAAE,GAAG,CAAC,UAAU,EAAE,wBAAwB,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"plugin-indexes.d.ts","sourceRoot":"","sources":["../../../src/components/PluginRegistry/plugin-indexes.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,YAAY,EACZ,wBAAwB,EACxB,oBAAoB,EACpB,UAAU,EACV,iBAAiB,EAClB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC;AAGzD,YAAY,EAAE,iBAAiB,EAAE,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,CAAC;AAEtC,MAAM,WAAW,aAAa;IAE5B,wCAAwC,EAAE,GAAG,CAAC,MAAM,EAAE,oBAAoB,CAAC,CAAC;IAE5E,oBAAoB,EAAE,GAAG,CAAC,UAAU,EAAE,wBAAwB,EAAE,CAAC,CAAC;IAElE,aAAa,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,mBAAmB,EAAE,YAAY,CAAC,qBAAqB,CAAC,GACvD,MAAM,OAAO,CAAC,aAAa,CAAC,CAgE9B"}
|
|
@@ -24,6 +24,7 @@ export { getPluginModuleCompoundKey };
|
|
|
24
24
|
// Create the two indexes from the installed plugins
|
|
25
25
|
const pluginResourcesByNameKindRegistryVersion = new Map();
|
|
26
26
|
const pluginMetadataByKind = new Map();
|
|
27
|
+
const devPluginKeys = new Set();
|
|
27
28
|
for (const resource of installedPlugins){
|
|
28
29
|
const { metadata: { version, registry } } = resource;
|
|
29
30
|
for (const pluginMetadata of resource.spec.plugins){
|
|
@@ -38,6 +39,9 @@ export { getPluginModuleCompoundKey };
|
|
|
38
39
|
console.warn(`Got more than one ${kind} plugin for kind ${name}, registry '${registry || 'undefined'}', and version '${version || 'undefined'}'`);
|
|
39
40
|
}
|
|
40
41
|
pluginResourcesByNameKindRegistryVersion.set(key, resource);
|
|
42
|
+
if (resource.status?.inDev) {
|
|
43
|
+
devPluginKeys.add(key);
|
|
44
|
+
}
|
|
41
45
|
// Index the metadata by plugin type
|
|
42
46
|
let list = pluginMetadataByKind.get(kind);
|
|
43
47
|
if (list === undefined) {
|
|
@@ -52,7 +56,8 @@ export { getPluginModuleCompoundKey };
|
|
|
52
56
|
}
|
|
53
57
|
return {
|
|
54
58
|
pluginResourcesByNameKindRegistryVersion,
|
|
55
|
-
pluginMetadataByKind
|
|
59
|
+
pluginMetadataByKind,
|
|
60
|
+
devPluginKeys
|
|
56
61
|
};
|
|
57
62
|
});
|
|
58
63
|
// De-dupe creating plugin indexes (i.e. requests to get installed plugins)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/PluginRegistry/plugin-indexes.ts"],"sourcesContent":["// Copyright The Perses Authors\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\nimport { useCallback, useRef } from 'react';\n\nimport type {\n PluginLoader,\n PluginMetadataWithModule,\n PluginModuleResource,\n PluginType,\n PluginCompoundKey,\n} from '../../model';\nimport { getPluginModuleCompoundKey } from '../../model';\nimport { useEvent } from '../../utils';\n\nexport type { PluginCompoundKey };\nexport { getPluginModuleCompoundKey };\n\nexport interface PluginIndexes {\n // Plugin resources by plugin type, kind, registry, and version\n pluginResourcesByNameKindRegistryVersion: Map<string, PluginModuleResource>;\n // Plugin metadata by plugin type\n pluginMetadataByKind: Map<PluginType, PluginMetadataWithModule[]>;\n}\n\n/**\n * Returns an async callback for getting indexes of the installed plugin data.\n */\nexport function usePluginIndexes(\n getInstalledPlugins: PluginLoader['getInstalledPlugins'],\n): () => Promise<PluginIndexes> {\n // Creates indexes from the installed plugins data (does useEvent because this accesses the getInstalledPlugins prop\n // and we want a stable reference for the callback below)\n const createPluginIndexes = useEvent(async (): Promise<PluginIndexes> => {\n const installedPlugins = await getInstalledPlugins();\n\n // Create the two indexes from the installed plugins\n const pluginResourcesByNameKindRegistryVersion = new Map<string, PluginModuleResource>();\n const pluginMetadataByKind = new Map<PluginType, PluginMetadataWithModule[]>();\n\n for (const resource of installedPlugins) {\n const {\n metadata: { version, registry },\n } = resource;\n for (const pluginMetadata of resource.spec.plugins) {\n const {\n kind,\n spec: { name },\n } = pluginMetadata;\n\n const key = getPluginModuleCompoundKey({ kind, name, registry, version });\n if (pluginResourcesByNameKindRegistryVersion.has(key)) {\n console.warn(\n `Got more than one ${kind} plugin for kind ${name}, registry '${registry || 'undefined'}', and version '${version || 'undefined'}'`,\n );\n }\n pluginResourcesByNameKindRegistryVersion.set(key, resource);\n\n // Index the metadata by plugin type\n let list = pluginMetadataByKind.get(kind);\n if (list === undefined) {\n list = [];\n pluginMetadataByKind.set(kind, list);\n }\n list.push({ ...pluginMetadata, module: resource.metadata });\n }\n }\n\n return {\n pluginResourcesByNameKindRegistryVersion,\n pluginMetadataByKind,\n };\n });\n\n // De-dupe creating plugin indexes (i.e. requests to get installed plugins)\n const pluginIndexesCache = useRef<Promise<PluginIndexes> | undefined>(undefined);\n const getPluginIndexes = useCallback(() => {\n let request = pluginIndexesCache.current;\n if (request === undefined) {\n request = createPluginIndexes();\n pluginIndexesCache.current = request;\n\n // Remove failed requests from the cache so they can potentially be retried\n request.catch(() => (pluginIndexesCache.current = undefined));\n }\n return request;\n }, [createPluginIndexes]);\n\n return getPluginIndexes;\n}\n"],"names":["useCallback","useRef","getPluginModuleCompoundKey","useEvent","usePluginIndexes","getInstalledPlugins","createPluginIndexes","installedPlugins","pluginResourcesByNameKindRegistryVersion","Map","pluginMetadataByKind","resource","metadata","version","registry","pluginMetadata","spec","plugins","kind","name","key","has","console","warn","set","list","get","undefined","push","module","pluginIndexesCache","getPluginIndexes","request","current","catch"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,WAAW,EAAEC,MAAM,QAAQ,QAAQ;AAS5C,SAASC,0BAA0B,QAAQ,uBAAc;AACzD,SAASC,QAAQ,QAAQ,uBAAc;AAGvC,SAASD,0BAA0B,GAAG;
|
|
1
|
+
{"version":3,"sources":["../../../src/components/PluginRegistry/plugin-indexes.ts"],"sourcesContent":["// Copyright The Perses Authors\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\nimport { useCallback, useRef } from 'react';\n\nimport type {\n PluginLoader,\n PluginMetadataWithModule,\n PluginModuleResource,\n PluginType,\n PluginCompoundKey,\n} from '../../model';\nimport { getPluginModuleCompoundKey } from '../../model';\nimport { useEvent } from '../../utils';\n\nexport type { PluginCompoundKey };\nexport { getPluginModuleCompoundKey };\n\nexport interface PluginIndexes {\n // Plugin resources by plugin type, kind, registry, and version\n pluginResourcesByNameKindRegistryVersion: Map<string, PluginModuleResource>;\n // Plugin metadata by plugin type\n pluginMetadataByKind: Map<PluginType, PluginMetadataWithModule[]>;\n // Subset of the keys above that are served by a local dev server (`percli plugin start`)\n devPluginKeys: Set<string>;\n}\n\n/**\n * Returns an async callback for getting indexes of the installed plugin data.\n */\nexport function usePluginIndexes(\n getInstalledPlugins: PluginLoader['getInstalledPlugins'],\n): () => Promise<PluginIndexes> {\n // Creates indexes from the installed plugins data (does useEvent because this accesses the getInstalledPlugins prop\n // and we want a stable reference for the callback below)\n const createPluginIndexes = useEvent(async (): Promise<PluginIndexes> => {\n const installedPlugins = await getInstalledPlugins();\n\n // Create the two indexes from the installed plugins\n const pluginResourcesByNameKindRegistryVersion = new Map<string, PluginModuleResource>();\n const pluginMetadataByKind = new Map<PluginType, PluginMetadataWithModule[]>();\n const devPluginKeys = new Set<string>();\n\n for (const resource of installedPlugins) {\n const {\n metadata: { version, registry },\n } = resource;\n for (const pluginMetadata of resource.spec.plugins) {\n const {\n kind,\n spec: { name },\n } = pluginMetadata;\n\n const key = getPluginModuleCompoundKey({ kind, name, registry, version });\n if (pluginResourcesByNameKindRegistryVersion.has(key)) {\n console.warn(\n `Got more than one ${kind} plugin for kind ${name}, registry '${registry || 'undefined'}', and version '${version || 'undefined'}'`,\n );\n }\n pluginResourcesByNameKindRegistryVersion.set(key, resource);\n if (resource.status?.inDev) {\n devPluginKeys.add(key);\n }\n\n // Index the metadata by plugin type\n let list = pluginMetadataByKind.get(kind);\n if (list === undefined) {\n list = [];\n pluginMetadataByKind.set(kind, list);\n }\n list.push({ ...pluginMetadata, module: resource.metadata });\n }\n }\n\n return {\n pluginResourcesByNameKindRegistryVersion,\n pluginMetadataByKind,\n devPluginKeys,\n };\n });\n\n // De-dupe creating plugin indexes (i.e. requests to get installed plugins)\n const pluginIndexesCache = useRef<Promise<PluginIndexes> | undefined>(undefined);\n const getPluginIndexes = useCallback(() => {\n let request = pluginIndexesCache.current;\n if (request === undefined) {\n request = createPluginIndexes();\n pluginIndexesCache.current = request;\n\n // Remove failed requests from the cache so they can potentially be retried\n request.catch(() => (pluginIndexesCache.current = undefined));\n }\n return request;\n }, [createPluginIndexes]);\n\n return getPluginIndexes;\n}\n"],"names":["useCallback","useRef","getPluginModuleCompoundKey","useEvent","usePluginIndexes","getInstalledPlugins","createPluginIndexes","installedPlugins","pluginResourcesByNameKindRegistryVersion","Map","pluginMetadataByKind","devPluginKeys","Set","resource","metadata","version","registry","pluginMetadata","spec","plugins","kind","name","key","has","console","warn","set","status","inDev","add","list","get","undefined","push","module","pluginIndexesCache","getPluginIndexes","request","current","catch"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,WAAW,EAAEC,MAAM,QAAQ,QAAQ;AAS5C,SAASC,0BAA0B,QAAQ,uBAAc;AACzD,SAASC,QAAQ,QAAQ,uBAAc;AAGvC,SAASD,0BAA0B,GAAG;AAWtC;;CAEC,GACD,OAAO,SAASE,iBACdC,mBAAwD;IAExD,oHAAoH;IACpH,yDAAyD;IACzD,MAAMC,sBAAsBH,SAAS;QACnC,MAAMI,mBAAmB,MAAMF;QAE/B,oDAAoD;QACpD,MAAMG,2CAA2C,IAAIC;QACrD,MAAMC,uBAAuB,IAAID;QACjC,MAAME,gBAAgB,IAAIC;QAE1B,KAAK,MAAMC,YAAYN,iBAAkB;YACvC,MAAM,EACJO,UAAU,EAAEC,OAAO,EAAEC,QAAQ,EAAE,EAChC,GAAGH;YACJ,KAAK,MAAMI,kBAAkBJ,SAASK,IAAI,CAACC,OAAO,CAAE;gBAClD,MAAM,EACJC,IAAI,EACJF,MAAM,EAAEG,IAAI,EAAE,EACf,GAAGJ;gBAEJ,MAAMK,MAAMpB,2BAA2B;oBAAEkB;oBAAMC;oBAAML;oBAAUD;gBAAQ;gBACvE,IAAIP,yCAAyCe,GAAG,CAACD,MAAM;oBACrDE,QAAQC,IAAI,CACV,CAAC,kBAAkB,EAAEL,KAAK,iBAAiB,EAAEC,KAAK,YAAY,EAAEL,YAAY,YAAY,gBAAgB,EAAED,WAAW,YAAY,CAAC,CAAC;gBAEvI;gBACAP,yCAAyCkB,GAAG,CAACJ,KAAKT;gBAClD,IAAIA,SAASc,MAAM,EAAEC,OAAO;oBAC1BjB,cAAckB,GAAG,CAACP;gBACpB;gBAEA,oCAAoC;gBACpC,IAAIQ,OAAOpB,qBAAqBqB,GAAG,CAACX;gBACpC,IAAIU,SAASE,WAAW;oBACtBF,OAAO,EAAE;oBACTpB,qBAAqBgB,GAAG,CAACN,MAAMU;gBACjC;gBACAA,KAAKG,IAAI,CAAC;oBAAE,GAAGhB,cAAc;oBAAEiB,QAAQrB,SAASC,QAAQ;gBAAC;YAC3D;QACF;QAEA,OAAO;YACLN;YACAE;YACAC;QACF;IACF;IAEA,2EAA2E;IAC3E,MAAMwB,qBAAqBlC,OAA2C+B;IACtE,MAAMI,mBAAmBpC,YAAY;QACnC,IAAIqC,UAAUF,mBAAmBG,OAAO;QACxC,IAAID,YAAYL,WAAW;YACzBK,UAAU/B;YACV6B,mBAAmBG,OAAO,GAAGD;YAE7B,2EAA2E;YAC3EA,QAAQE,KAAK,CAAC,IAAOJ,mBAAmBG,OAAO,GAAGN;QACpD;QACA,OAAOK;IACT,GAAG;QAAC/B;KAAoB;IAExB,OAAO8B;AACT"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PluginSpecEditor.d.ts","sourceRoot":"","sources":["../../../src/components/PluginSpecEditor/PluginSpecEditor.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAoB,kBAAkB,EAAsB,MAAM,aAAa,CAAC;AAE5F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG7D,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB,CAAC,WAAW,CAAC;IAC5E,eAAe,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnF;AASD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,
|
|
1
|
+
{"version":3,"file":"PluginSpecEditor.d.ts","sourceRoot":"","sources":["../../../src/components/PluginSpecEditor/PluginSpecEditor.tsx"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AACpE,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAE1C,OAAO,KAAK,EAAoB,kBAAkB,EAAsB,MAAM,aAAa,CAAC;AAE5F,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AAG7D,MAAM,WAAW,qBAAsB,SAAQ,kBAAkB,CAAC,WAAW,CAAC;IAC5E,eAAe,EAAE,qBAAqB,CAAC;IACvC,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,cAAc,CAAC,EAAE,CAAC,IAAI,EAAE,cAAc,EAAE,eAAe,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;CACnF;AASD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,qBAAqB,GAAG,YAAY,GAAG,IAAI,CAmDlF"}
|
|
@@ -19,8 +19,12 @@ function isDatasourcePlugin(pluginType, plugin) {
|
|
|
19
19
|
return pluginType === 'Datasource' && 'createClient' in plugin;
|
|
20
20
|
}
|
|
21
21
|
export function PluginSpecEditor(props) {
|
|
22
|
-
const { pluginSelection: { type: pluginType, kind: pluginKind }, value, testConnection, ...others } = props;
|
|
23
|
-
|
|
22
|
+
const { pluginSelection: { type: pluginType, kind: pluginKind, metadata: pluginMetadata }, value, testConnection, ...others } = props;
|
|
23
|
+
// Edit the exact implementation the definition is pinned to, so the options editor matches the saved spec schema.
|
|
24
|
+
const { data: plugin, isLoading, error } = usePlugin(pluginType, pluginKind, {
|
|
25
|
+
version: pluginMetadata?.version,
|
|
26
|
+
registry: pluginMetadata?.registry
|
|
27
|
+
});
|
|
24
28
|
if (error) {
|
|
25
29
|
return /*#__PURE__*/ _jsx(ErrorAlert, {
|
|
26
30
|
error: error
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/PluginSpecEditor/PluginSpecEditor.tsx"],"sourcesContent":["// Copyright The Perses Authors\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\nimport { CircularProgress, Stack } from '@mui/material';\nimport { ErrorAlert } from '@perses-dev/components';\nimport type { DatasourceSpec, UnknownSpec } from '@perses-dev/spec';\nimport type { ReactElement } from 'react';\n\nimport type { DatasourcePlugin, OptionsEditorProps, Plugin, PluginType } from '../../model';\nimport { usePlugin } from '../../runtime';\nimport type { PluginEditorSelection } from '../PluginEditor';\nimport { DatasourceSpecEditor } from './DatasourceSpecEditor';\n\nexport interface PluginSpecEditorProps extends OptionsEditorProps<UnknownSpec> {\n pluginSelection: PluginEditorSelection;\n isEditor?: boolean;\n testConnection?: (spec: DatasourceSpec, healthCheckPath: string) => Promise<void>;\n}\n\nfunction isDatasourcePlugin(\n pluginType: PluginType,\n plugin: Plugin<UnknownSpec>,\n): plugin is DatasourcePlugin<UnknownSpec> {\n return pluginType === 'Datasource' && 'createClient' in plugin;\n}\n\nexport function PluginSpecEditor(props: PluginSpecEditorProps): ReactElement | null {\n const {\n pluginSelection: { type: pluginType, kind: pluginKind },\n value,\n testConnection,\n ...others\n } = props;\n const {
|
|
1
|
+
{"version":3,"sources":["../../../src/components/PluginSpecEditor/PluginSpecEditor.tsx"],"sourcesContent":["// Copyright The Perses Authors\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\nimport { CircularProgress, Stack } from '@mui/material';\nimport { ErrorAlert } from '@perses-dev/components';\nimport type { DatasourceSpec, UnknownSpec } from '@perses-dev/spec';\nimport type { ReactElement } from 'react';\n\nimport type { DatasourcePlugin, OptionsEditorProps, Plugin, PluginType } from '../../model';\nimport { usePlugin } from '../../runtime';\nimport type { PluginEditorSelection } from '../PluginEditor';\nimport { DatasourceSpecEditor } from './DatasourceSpecEditor';\n\nexport interface PluginSpecEditorProps extends OptionsEditorProps<UnknownSpec> {\n pluginSelection: PluginEditorSelection;\n isEditor?: boolean;\n testConnection?: (spec: DatasourceSpec, healthCheckPath: string) => Promise<void>;\n}\n\nfunction isDatasourcePlugin(\n pluginType: PluginType,\n plugin: Plugin<UnknownSpec>,\n): plugin is DatasourcePlugin<UnknownSpec> {\n return pluginType === 'Datasource' && 'createClient' in plugin;\n}\n\nexport function PluginSpecEditor(props: PluginSpecEditorProps): ReactElement | null {\n const {\n pluginSelection: { type: pluginType, kind: pluginKind, metadata: pluginMetadata },\n value,\n testConnection,\n ...others\n } = props;\n // Edit the exact implementation the definition is pinned to, so the options editor matches the saved spec schema.\n const {\n data: plugin,\n isLoading,\n error,\n } = usePlugin(pluginType, pluginKind, {\n version: pluginMetadata?.version,\n registry: pluginMetadata?.registry,\n });\n\n if (error) {\n return <ErrorAlert error={error} />;\n }\n\n if (isLoading) {\n return (\n <Stack width=\"100%\" sx={{ alignItems: 'center', justifyContent: 'center' }}>\n <CircularProgress />\n </Stack>\n );\n }\n\n if (!plugin) {\n throw new Error(`Missing implementation for ${pluginType} plugin with kind '${pluginKind}'`);\n }\n\n if (pluginType === 'Panel') {\n throw new Error('This editor should not be used for panel type. Please use Panel Spec Editor instead.');\n }\n\n if (isDatasourcePlugin(pluginType, plugin)) {\n return (\n <DatasourceSpecEditor\n plugin={plugin}\n pluginKind={pluginKind}\n value={value}\n testConnection={testConnection}\n {...others}\n />\n );\n }\n\n const { OptionsEditorComponent } = plugin;\n return OptionsEditorComponent ? <OptionsEditorComponent {...others} value={value} /> : null;\n}\n"],"names":["CircularProgress","Stack","ErrorAlert","usePlugin","DatasourceSpecEditor","isDatasourcePlugin","pluginType","plugin","PluginSpecEditor","props","pluginSelection","type","kind","pluginKind","metadata","pluginMetadata","value","testConnection","others","data","isLoading","error","version","registry","width","sx","alignItems","justifyContent","Error","OptionsEditorComponent"],"mappings":";AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAEjC,SAASA,gBAAgB,EAAEC,KAAK,QAAQ,gBAAgB;AACxD,SAASC,UAAU,QAAQ,yBAAyB;AAKpD,SAASC,SAAS,QAAQ,yBAAgB;AAE1C,SAASC,oBAAoB,QAAQ,4BAAyB;AAQ9D,SAASC,mBACPC,UAAsB,EACtBC,MAA2B;IAE3B,OAAOD,eAAe,gBAAgB,kBAAkBC;AAC1D;AAEA,OAAO,SAASC,iBAAiBC,KAA4B;IAC3D,MAAM,EACJC,iBAAiB,EAAEC,MAAML,UAAU,EAAEM,MAAMC,UAAU,EAAEC,UAAUC,cAAc,EAAE,EACjFC,KAAK,EACLC,cAAc,EACd,GAAGC,QACJ,GAAGT;IACJ,kHAAkH;IAClH,MAAM,EACJU,MAAMZ,MAAM,EACZa,SAAS,EACTC,KAAK,EACN,GAAGlB,UAAUG,YAAYO,YAAY;QACpCS,SAASP,gBAAgBO;QACzBC,UAAUR,gBAAgBQ;IAC5B;IAEA,IAAIF,OAAO;QACT,qBAAO,KAACnB;YAAWmB,OAAOA;;IAC5B;IAEA,IAAID,WAAW;QACb,qBACE,KAACnB;YAAMuB,OAAM;YAAOC,IAAI;gBAAEC,YAAY;gBAAUC,gBAAgB;YAAS;sBACvE,cAAA,KAAC3B;;IAGP;IAEA,IAAI,CAACO,QAAQ;QACX,MAAM,IAAIqB,MAAM,CAAC,2BAA2B,EAAEtB,WAAW,mBAAmB,EAAEO,WAAW,CAAC,CAAC;IAC7F;IAEA,IAAIP,eAAe,SAAS;QAC1B,MAAM,IAAIsB,MAAM;IAClB;IAEA,IAAIvB,mBAAmBC,YAAYC,SAAS;QAC1C,qBACE,KAACH;YACCG,QAAQA;YACRM,YAAYA;YACZG,OAAOA;YACPC,gBAAgBA;YACf,GAAGC,MAAM;;IAGhB;IAEA,MAAM,EAAEW,sBAAsB,EAAE,GAAGtB;IACnC,OAAOsB,uCAAyB,KAACA;QAAwB,GAAGX,MAAM;QAAEF,OAAOA;SAAY;AACzF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"variable-model.d.ts","sourceRoot":"","sources":["../../../src/components/Variables/variable-model.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAClG,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI7E,OAAO,KAAK,EAA6B,cAAc,EAAkB,MAAM,aAAa,CAAC;AAC7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,cAAc,EAAE,CAqBnG;AAgDD,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,sBAAsB,GAAG,cAAc,CAAC,cAAc,EAAE,CAAC,
|
|
1
|
+
{"version":3,"file":"variable-model.d.ts","sourceRoot":"","sources":["../../../src/components/Variables/variable-model.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,sBAAsB,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AAClG,OAAO,KAAK,EAAmB,cAAc,EAAE,MAAM,uBAAuB,CAAC;AAI7E,OAAO,KAAK,EAA6B,cAAc,EAAkB,MAAM,aAAa,CAAC;AAC7F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AAGtD,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,cAAc,EAAE,EAAE,cAAc,EAAE,MAAM,GAAG,cAAc,EAAE,CAqBnG;AAgDD,wBAAgB,2BAA2B,CAAC,UAAU,EAAE,sBAAsB,GAAG,cAAc,CAAC,cAAc,EAAE,CAAC,CAgBhH;AAcD;;;GAGG;AACH,wBAAgB,4BAA4B,CAAC,mBAAmB,EAAE,kBAAkB,EAAE,GAAG;IACvF,qBAAqB,EAAE,MAAM,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC;IACrD,SAAS,EAAE,OAAO,CAAC;CACpB,CAyEA;AAED;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,CAAC,EAAE,gBAAgB,GAAG,MAAM,CAIhE;AAED,eAAO,MAAM,cAAc;aACvB,KAAK,EAAE,MAAM;aAAE,IAAI,EAAE,cAAc;;aACnC,KAAK,EAAE,MAAM;aAAE,IAAI,EAAE,cAAc;EAC7B,CAAC"}
|
|
@@ -79,7 +79,10 @@ function resolveDependsOnVariables(variablePlugin, variablePluginCtx, definition
|
|
|
79
79
|
return [];
|
|
80
80
|
}
|
|
81
81
|
export function useListVariablePluginValues(definition) {
|
|
82
|
-
const { data: variablePlugin } = usePlugin('Variable', definition.spec.plugin.kind
|
|
82
|
+
const { data: variablePlugin } = usePlugin('Variable', definition.spec.plugin.kind, {
|
|
83
|
+
version: definition.spec.plugin.metadata?.version,
|
|
84
|
+
registry: definition.spec.plugin.metadata?.registry
|
|
85
|
+
});
|
|
83
86
|
const variablePluginCtx = useVariablePluginContext();
|
|
84
87
|
const dependsOnVariables = resolveDependsOnVariables(variablePlugin, variablePluginCtx, definition);
|
|
85
88
|
const dependentVariables = useAllVariableValues(dependsOnVariables);
|
|
@@ -112,7 +115,9 @@ function resolveDefaultValue(definition, options) {
|
|
|
112
115
|
variableDefinitions
|
|
113
116
|
]);
|
|
114
117
|
const pluginResults = usePlugins('Variable', listVariables.map((d)=>({
|
|
115
|
-
kind: d.spec.plugin.kind
|
|
118
|
+
kind: d.spec.plugin.kind,
|
|
119
|
+
version: d.spec.plugin.metadata?.version,
|
|
120
|
+
registry: d.spec.plugin.metadata?.registry
|
|
116
121
|
})));
|
|
117
122
|
// Resolved variable state. Updated by onFetched when queries resolve.
|
|
118
123
|
// Needed because of dependencies between variables that require multiple rounds of fetching.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/components/Variables/variable-model.ts"],"sourcesContent":["// Copyright The Perses Authors\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\nimport type { ListVariableDefinition, VariableDefinition, VariableValue } from '@perses-dev/spec';\nimport type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport { useQueries, useQuery } from '@tanstack/react-query';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { GetVariableOptionsContext, VariableOption, VariablePlugin } from '../../model';\nimport type { VariableStateMap } from '../../runtime';\nimport { useAllVariableValues, useDatasourceStore, usePlugin, usePlugins, useTimeRange } from '../../runtime';\n\nexport function filterVariableList(data: VariableOption[], capturedRegexp: RegExp): VariableOption[] {\n const result: VariableOption[] = [];\n const filteredSet = new Set<string>();\n for (const variableValue of data) {\n const matches = variableValue.value.matchAll(capturedRegexp);\n let concat = '';\n for (const match of matches) {\n for (let i = 1; i < match.length; i++) {\n const m = match[i];\n if (m !== undefined) {\n concat = `${concat}${m}`;\n }\n }\n }\n if (concat !== '' && !filteredSet.has(concat)) {\n // like that we are avoiding to have duplicating variable value\n filteredSet.add(concat);\n result.push({ label: variableValue.label, value: concat });\n }\n }\n return result;\n}\n\nfunction useVariablePluginContext(): GetVariableOptionsContext {\n const datasourceStore = useDatasourceStore();\n const allVariables = useAllVariableValues();\n const { absoluteTimeRange: timeRange } = useTimeRange();\n\n return { timeRange, datasourceStore, variables: allVariables };\n}\n\nconst getVariableQueryConfig = (\n definition: ListVariableDefinition,\n variablePluginCtx: GetVariableOptionsContext,\n variablePlugin: VariablePlugin | undefined,\n enabled: boolean,\n onFetched?: (name: string, options: VariableOption[], definition: ListVariableDefinition) => void,\n): UseQueryOptions<VariableOption[]> => {\n const capturingRegexp =\n definition.spec.capturingRegexp !== undefined ? new RegExp(definition.spec.capturingRegexp, 'g') : undefined;\n const variablesValueKey = getVariableValuesKey(variablePluginCtx.variables);\n return {\n queryKey: ['variable', definition, variablePluginCtx.timeRange, variablesValueKey],\n queryFn: async ({ signal }): Promise<VariableOption[]> => {\n const resp = await variablePlugin?.getVariableOptions(definition.spec.plugin.spec, variablePluginCtx, signal);\n if (!resp?.data?.length) {\n onFetched?.(definition.spec.name, [], definition);\n return [];\n }\n const options = capturingRegexp ? filterVariableList(resp.data, capturingRegexp) : resp.data;\n onFetched?.(definition.spec.name, options, definition);\n return options;\n },\n enabled,\n };\n};\n\nfunction resolveDependsOnVariables(\n variablePlugin: VariablePlugin | undefined,\n variablePluginCtx: GetVariableOptionsContext,\n definition: ListVariableDefinition,\n): string[] {\n if (variablePlugin?.dependsOn) {\n const dependencies = variablePlugin.dependsOn(definition.spec.plugin.spec, variablePluginCtx);\n return dependencies.variables ? dependencies.variables.filter((v) => v !== definition.spec.name) : []; // Exclude self variable to avoid circular dependency and default to empty array to avoid deadlock\n }\n return [];\n}\n\nexport function useListVariablePluginValues(definition: ListVariableDefinition): UseQueryResult<VariableOption[]> {\n const { data: variablePlugin } = usePlugin('Variable', definition.spec.plugin.kind);\n\n const variablePluginCtx = useVariablePluginContext();\n\n const dependsOnVariables = resolveDependsOnVariables(variablePlugin, variablePluginCtx, definition);\n\n const dependentVariables = useAllVariableValues(dependsOnVariables);\n const waitToLoad = dependsOnVariables.some((v) => dependentVariables[v]?.loading);\n\n const ctx = { ...variablePluginCtx, variables: dependentVariables };\n\n return useQuery(getVariableQueryConfig(definition, ctx, variablePlugin, !!variablePlugin && !waitToLoad));\n}\n\nfunction resolveDefaultValue(definition: ListVariableDefinition, options: VariableOption[]): VariableValue {\n const { defaultValue, allowMultiple } = definition.spec;\n if (defaultValue !== undefined && defaultValue !== null) {\n return defaultValue;\n }\n if (options[0]?.value) {\n const first = options[0].value;\n return allowMultiple ? [first] : first;\n }\n return allowMultiple ? [] : '';\n}\n\n/**\n * Resolves initial values for all ListVariable definitions by fetching their options in dependency order.\n * Returns a map of variable names to their resolved default values, merging with any already-provided outer variables.\n */\nexport function useResolveListVariableValues(variableDefinitions: VariableDefinition[]): {\n initialVariableValues: Record<string, VariableValue>;\n isLoading: boolean;\n} {\n const { timeRange, datasourceStore, variables: outerVariableValues } = useVariablePluginContext();\n\n const listVariables = useMemo(\n () => variableDefinitions.filter((v): v is ListVariableDefinition => v.kind === 'ListVariable'),\n [variableDefinitions],\n );\n\n const pluginResults = usePlugins(\n 'Variable',\n listVariables.map((d) => ({ kind: d.spec.plugin.kind })),\n );\n\n // Resolved variable state. Updated by onFetched when queries resolve.\n // Needed because of dependencies between variables that require multiple rounds of fetching.\n const [resolvedVariables, setResolvedVariables] = useState<VariableStateMap>({});\n\n const allVariables = useMemo(() => {\n return { ...outerVariableValues, ...resolvedVariables };\n }, [outerVariableValues, resolvedVariables]);\n\n const onFetched = useCallback((name: string, options: VariableOption[], definition: ListVariableDefinition) => {\n setResolvedVariables((prev) => ({\n ...prev,\n [name]: { value: resolveDefaultValue(definition, options), loading: false, options },\n }));\n }, []);\n\n const queryResults = useQueries({\n queries: listVariables.map((definition, index) => {\n const plugin = pluginResults[index]?.data;\n const isPluginLoading = pluginResults[index]?.isLoading ?? true;\n\n const dependsOn = resolveDependsOnVariables(\n plugin,\n { timeRange, datasourceStore, variables: allVariables },\n definition,\n );\n\n const hasPendingDeps = dependsOn.some(\n (v) =>\n (resolvedVariables[v] === undefined && listVariables.some((lv) => lv.spec.name === v)) ||\n allVariables[v]?.loading,\n );\n\n const dependentVariables: VariableStateMap = {};\n for (const v of dependsOn) {\n const state = allVariables[v];\n if (state) {\n dependentVariables[v] = state;\n }\n }\n\n const ctx = { timeRange, datasourceStore, variables: dependentVariables };\n return getVariableQueryConfig(definition, ctx, plugin, !hasPendingDeps && !isPluginLoading, onFetched);\n }),\n });\n\n const initialVariableValues: Record<string, VariableValue> = useMemo(\n () =>\n Object.fromEntries(\n Object.entries(allVariables)\n .filter(([, state]) => state?.value !== undefined)\n .map(([name, state]) => [name, state!.value]),\n ),\n [allVariables],\n );\n\n return { initialVariableValues, isLoading: queryResults.some((r) => r.isLoading) };\n}\n\n/**\n * Returns a serialized string of the current state of variable values.\n */\nexport function getVariableValuesKey(v: VariableStateMap): string {\n return Object.values(v)\n .map((v) => JSON.stringify(v.value))\n .join(',');\n}\n\nexport const VARIABLE_TYPES = [\n { label: 'List', kind: 'ListVariable' },\n { label: 'Text', kind: 'TextVariable' },\n] as const;\n"],"names":["useQueries","useQuery","useCallback","useMemo","useState","useAllVariableValues","useDatasourceStore","usePlugin","usePlugins","useTimeRange","filterVariableList","data","capturedRegexp","result","filteredSet","Set","variableValue","matches","value","matchAll","concat","match","i","length","m","undefined","has","add","push","label","useVariablePluginContext","datasourceStore","allVariables","absoluteTimeRange","timeRange","variables","getVariableQueryConfig","definition","variablePluginCtx","variablePlugin","enabled","onFetched","capturingRegexp","spec","RegExp","variablesValueKey","getVariableValuesKey","queryKey","queryFn","signal","resp","getVariableOptions","plugin","name","options","resolveDependsOnVariables","dependsOn","dependencies","filter","v","useListVariablePluginValues","kind","dependsOnVariables","dependentVariables","waitToLoad","some","loading","ctx","resolveDefaultValue","defaultValue","allowMultiple","first","useResolveListVariableValues","variableDefinitions","outerVariableValues","listVariables","pluginResults","map","d","resolvedVariables","setResolvedVariables","prev","queryResults","queries","index","isPluginLoading","isLoading","hasPendingDeps","lv","state","initialVariableValues","Object","fromEntries","entries","r","values","JSON","stringify","join","VARIABLE_TYPES"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAIjC,SAASA,UAAU,EAAEC,QAAQ,QAAQ,wBAAwB;AAC7D,SAASC,WAAW,EAAEC,OAAO,EAAEC,QAAQ,QAAQ,QAAQ;AAIvD,SAASC,oBAAoB,EAAEC,kBAAkB,EAAEC,SAAS,EAAEC,UAAU,EAAEC,YAAY,QAAQ,yBAAgB;AAE9G,OAAO,SAASC,mBAAmBC,IAAsB,EAAEC,cAAsB;IAC/E,MAAMC,SAA2B,EAAE;IACnC,MAAMC,cAAc,IAAIC;IACxB,KAAK,MAAMC,iBAAiBL,KAAM;QAChC,MAAMM,UAAUD,cAAcE,KAAK,CAACC,QAAQ,CAACP;QAC7C,IAAIQ,SAAS;QACb,KAAK,MAAMC,SAASJ,QAAS;YAC3B,IAAK,IAAIK,IAAI,GAAGA,IAAID,MAAME,MAAM,EAAED,IAAK;gBACrC,MAAME,IAAIH,KAAK,CAACC,EAAE;gBAClB,IAAIE,MAAMC,WAAW;oBACnBL,SAAS,GAAGA,SAASI,GAAG;gBAC1B;YACF;QACF;QACA,IAAIJ,WAAW,MAAM,CAACN,YAAYY,GAAG,CAACN,SAAS;YAC7C,+DAA+D;YAC/DN,YAAYa,GAAG,CAACP;YAChBP,OAAOe,IAAI,CAAC;gBAAEC,OAAOb,cAAca,KAAK;gBAAEX,OAAOE;YAAO;QAC1D;IACF;IACA,OAAOP;AACT;AAEA,SAASiB;IACP,MAAMC,kBAAkBzB;IACxB,MAAM0B,eAAe3B;IACrB,MAAM,EAAE4B,mBAAmBC,SAAS,EAAE,GAAGzB;IAEzC,OAAO;QAAEyB;QAAWH;QAAiBI,WAAWH;IAAa;AAC/D;AAEA,MAAMI,yBAAyB,CAC7BC,YACAC,mBACAC,gBACAC,SACAC;IAEA,MAAMC,kBACJL,WAAWM,IAAI,CAACD,eAAe,KAAKjB,YAAY,IAAImB,OAAOP,WAAWM,IAAI,CAACD,eAAe,EAAE,OAAOjB;IACrG,MAAMoB,oBAAoBC,qBAAqBR,kBAAkBH,SAAS;IAC1E,OAAO;QACLY,UAAU;YAAC;YAAYV;YAAYC,kBAAkBJ,SAAS;YAAEW;SAAkB;QAClFG,SAAS,OAAO,EAAEC,MAAM,EAAE;YACxB,MAAMC,OAAO,MAAMX,gBAAgBY,mBAAmBd,WAAWM,IAAI,CAACS,MAAM,CAACT,IAAI,EAAEL,mBAAmBW;YACtG,IAAI,CAACC,MAAMvC,MAAMY,QAAQ;gBACvBkB,YAAYJ,WAAWM,IAAI,CAACU,IAAI,EAAE,EAAE,EAAEhB;gBACtC,OAAO,EAAE;YACX;YACA,MAAMiB,UAAUZ,kBAAkBhC,mBAAmBwC,KAAKvC,IAAI,EAAE+B,mBAAmBQ,KAAKvC,IAAI;YAC5F8B,YAAYJ,WAAWM,IAAI,CAACU,IAAI,EAAEC,SAASjB;YAC3C,OAAOiB;QACT;QACAd;IACF;AACF;AAEA,SAASe,0BACPhB,cAA0C,EAC1CD,iBAA4C,EAC5CD,UAAkC;IAElC,IAAIE,gBAAgBiB,WAAW;QAC7B,MAAMC,eAAelB,eAAeiB,SAAS,CAACnB,WAAWM,IAAI,CAACS,MAAM,CAACT,IAAI,EAAEL;QAC3E,OAAOmB,aAAatB,SAAS,GAAGsB,aAAatB,SAAS,CAACuB,MAAM,CAAC,CAACC,IAAMA,MAAMtB,WAAWM,IAAI,CAACU,IAAI,IAAI,EAAE,EAAE,kGAAkG;IAC3M;IACA,OAAO,EAAE;AACX;AAEA,OAAO,SAASO,4BAA4BvB,UAAkC;IAC5E,MAAM,EAAE1B,MAAM4B,cAAc,EAAE,GAAGhC,UAAU,YAAY8B,WAAWM,IAAI,CAACS,MAAM,CAACS,IAAI;IAElF,MAAMvB,oBAAoBR;IAE1B,MAAMgC,qBAAqBP,0BAA0BhB,gBAAgBD,mBAAmBD;IAExF,MAAM0B,qBAAqB1D,qBAAqByD;IAChD,MAAME,aAAaF,mBAAmBG,IAAI,CAAC,CAACN,IAAMI,kBAAkB,CAACJ,EAAE,EAAEO;IAEzE,MAAMC,MAAM;QAAE,GAAG7B,iBAAiB;QAAEH,WAAW4B;IAAmB;IAElE,OAAO9D,SAASmC,uBAAuBC,YAAY8B,KAAK5B,gBAAgB,CAAC,CAACA,kBAAkB,CAACyB;AAC/F;AAEA,SAASI,oBAAoB/B,UAAkC,EAAEiB,OAAyB;IACxF,MAAM,EAAEe,YAAY,EAAEC,aAAa,EAAE,GAAGjC,WAAWM,IAAI;IACvD,IAAI0B,iBAAiB5C,aAAa4C,iBAAiB,MAAM;QACvD,OAAOA;IACT;IACA,IAAIf,OAAO,CAAC,EAAE,EAAEpC,OAAO;QACrB,MAAMqD,QAAQjB,OAAO,CAAC,EAAE,CAACpC,KAAK;QAC9B,OAAOoD,gBAAgB;YAACC;SAAM,GAAGA;IACnC;IACA,OAAOD,gBAAgB,EAAE,GAAG;AAC9B;AAEA;;;CAGC,GACD,OAAO,SAASE,6BAA6BC,mBAAyC;IAIpF,MAAM,EAAEvC,SAAS,EAAEH,eAAe,EAAEI,WAAWuC,mBAAmB,EAAE,GAAG5C;IAEvE,MAAM6C,gBAAgBxE,QACpB,IAAMsE,oBAAoBf,MAAM,CAAC,CAACC,IAAmCA,EAAEE,IAAI,KAAK,iBAChF;QAACY;KAAoB;IAGvB,MAAMG,gBAAgBpE,WACpB,YACAmE,cAAcE,GAAG,CAAC,CAACC,IAAO,CAAA;YAAEjB,MAAMiB,EAAEnC,IAAI,CAACS,MAAM,CAACS,IAAI;QAAC,CAAA;IAGvD,sEAAsE;IACtE,6FAA6F;IAC7F,MAAM,CAACkB,mBAAmBC,qBAAqB,GAAG5E,SAA2B,CAAC;IAE9E,MAAM4B,eAAe7B,QAAQ;QAC3B,OAAO;YAAE,GAAGuE,mBAAmB;YAAE,GAAGK,iBAAiB;QAAC;IACxD,GAAG;QAACL;QAAqBK;KAAkB;IAE3C,MAAMtC,YAAYvC,YAAY,CAACmD,MAAcC,SAA2BjB;QACtE2C,qBAAqB,CAACC,OAAU,CAAA;gBAC9B,GAAGA,IAAI;gBACP,CAAC5B,KAAK,EAAE;oBAAEnC,OAAOkD,oBAAoB/B,YAAYiB;oBAAUY,SAAS;oBAAOZ;gBAAQ;YACrF,CAAA;IACF,GAAG,EAAE;IAEL,MAAM4B,eAAelF,WAAW;QAC9BmF,SAASR,cAAcE,GAAG,CAAC,CAACxC,YAAY+C;YACtC,MAAMhC,SAASwB,aAAa,CAACQ,MAAM,EAAEzE;YACrC,MAAM0E,kBAAkBT,aAAa,CAACQ,MAAM,EAAEE,aAAa;YAE3D,MAAM9B,YAAYD,0BAChBH,QACA;gBAAElB;gBAAWH;gBAAiBI,WAAWH;YAAa,GACtDK;YAGF,MAAMkD,iBAAiB/B,UAAUS,IAAI,CACnC,CAACN,IACC,AAACoB,iBAAiB,CAACpB,EAAE,KAAKlC,aAAakD,cAAcV,IAAI,CAAC,CAACuB,KAAOA,GAAG7C,IAAI,CAACU,IAAI,KAAKM,MACnF3B,YAAY,CAAC2B,EAAE,EAAEO;YAGrB,MAAMH,qBAAuC,CAAC;YAC9C,KAAK,MAAMJ,KAAKH,UAAW;gBACzB,MAAMiC,QAAQzD,YAAY,CAAC2B,EAAE;gBAC7B,IAAI8B,OAAO;oBACT1B,kBAAkB,CAACJ,EAAE,GAAG8B;gBAC1B;YACF;YAEA,MAAMtB,MAAM;gBAAEjC;gBAAWH;gBAAiBI,WAAW4B;YAAmB;YACxE,OAAO3B,uBAAuBC,YAAY8B,KAAKf,QAAQ,CAACmC,kBAAkB,CAACF,iBAAiB5C;QAC9F;IACF;IAEA,MAAMiD,wBAAuDvF,QAC3D,IACEwF,OAAOC,WAAW,CAChBD,OAAOE,OAAO,CAAC7D,cACZ0B,MAAM,CAAC,CAAC,GAAG+B,MAAM,GAAKA,OAAOvE,UAAUO,WACvCoD,GAAG,CAAC,CAAC,CAACxB,MAAMoC,MAAM,GAAK;gBAACpC;gBAAMoC,MAAOvE,KAAK;aAAC,IAElD;QAACc;KAAa;IAGhB,OAAO;QAAE0D;QAAuBJ,WAAWJ,aAAajB,IAAI,CAAC,CAAC6B,IAAMA,EAAER,SAAS;IAAE;AACnF;AAEA;;CAEC,GACD,OAAO,SAASxC,qBAAqBa,CAAmB;IACtD,OAAOgC,OAAOI,MAAM,CAACpC,GAClBkB,GAAG,CAAC,CAAClB,IAAMqC,KAAKC,SAAS,CAACtC,EAAEzC,KAAK,GACjCgF,IAAI,CAAC;AACV;AAEA,OAAO,MAAMC,iBAAiB;IAC5B;QAAEtE,OAAO;QAAQgC,MAAM;IAAe;IACtC;QAAEhC,OAAO;QAAQgC,MAAM;IAAe;CACvC,CAAU"}
|
|
1
|
+
{"version":3,"sources":["../../../src/components/Variables/variable-model.ts"],"sourcesContent":["// Copyright The Perses Authors\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\nimport type { ListVariableDefinition, VariableDefinition, VariableValue } from '@perses-dev/spec';\nimport type { UseQueryOptions, UseQueryResult } from '@tanstack/react-query';\nimport { useQueries, useQuery } from '@tanstack/react-query';\nimport { useCallback, useMemo, useState } from 'react';\n\nimport type { GetVariableOptionsContext, VariableOption, VariablePlugin } from '../../model';\nimport type { VariableStateMap } from '../../runtime';\nimport { useAllVariableValues, useDatasourceStore, usePlugin, usePlugins, useTimeRange } from '../../runtime';\n\nexport function filterVariableList(data: VariableOption[], capturedRegexp: RegExp): VariableOption[] {\n const result: VariableOption[] = [];\n const filteredSet = new Set<string>();\n for (const variableValue of data) {\n const matches = variableValue.value.matchAll(capturedRegexp);\n let concat = '';\n for (const match of matches) {\n for (let i = 1; i < match.length; i++) {\n const m = match[i];\n if (m !== undefined) {\n concat = `${concat}${m}`;\n }\n }\n }\n if (concat !== '' && !filteredSet.has(concat)) {\n // like that we are avoiding to have duplicating variable value\n filteredSet.add(concat);\n result.push({ label: variableValue.label, value: concat });\n }\n }\n return result;\n}\n\nfunction useVariablePluginContext(): GetVariableOptionsContext {\n const datasourceStore = useDatasourceStore();\n const allVariables = useAllVariableValues();\n const { absoluteTimeRange: timeRange } = useTimeRange();\n\n return { timeRange, datasourceStore, variables: allVariables };\n}\n\nconst getVariableQueryConfig = (\n definition: ListVariableDefinition,\n variablePluginCtx: GetVariableOptionsContext,\n variablePlugin: VariablePlugin | undefined,\n enabled: boolean,\n onFetched?: (name: string, options: VariableOption[], definition: ListVariableDefinition) => void,\n): UseQueryOptions<VariableOption[]> => {\n const capturingRegexp =\n definition.spec.capturingRegexp !== undefined ? new RegExp(definition.spec.capturingRegexp, 'g') : undefined;\n const variablesValueKey = getVariableValuesKey(variablePluginCtx.variables);\n return {\n queryKey: ['variable', definition, variablePluginCtx.timeRange, variablesValueKey],\n queryFn: async ({ signal }): Promise<VariableOption[]> => {\n const resp = await variablePlugin?.getVariableOptions(definition.spec.plugin.spec, variablePluginCtx, signal);\n if (!resp?.data?.length) {\n onFetched?.(definition.spec.name, [], definition);\n return [];\n }\n const options = capturingRegexp ? filterVariableList(resp.data, capturingRegexp) : resp.data;\n onFetched?.(definition.spec.name, options, definition);\n return options;\n },\n enabled,\n };\n};\n\nfunction resolveDependsOnVariables(\n variablePlugin: VariablePlugin | undefined,\n variablePluginCtx: GetVariableOptionsContext,\n definition: ListVariableDefinition,\n): string[] {\n if (variablePlugin?.dependsOn) {\n const dependencies = variablePlugin.dependsOn(definition.spec.plugin.spec, variablePluginCtx);\n return dependencies.variables ? dependencies.variables.filter((v) => v !== definition.spec.name) : []; // Exclude self variable to avoid circular dependency and default to empty array to avoid deadlock\n }\n return [];\n}\n\nexport function useListVariablePluginValues(definition: ListVariableDefinition): UseQueryResult<VariableOption[]> {\n const { data: variablePlugin } = usePlugin('Variable', definition.spec.plugin.kind, {\n version: definition.spec.plugin.metadata?.version,\n registry: definition.spec.plugin.metadata?.registry,\n });\n\n const variablePluginCtx = useVariablePluginContext();\n\n const dependsOnVariables = resolveDependsOnVariables(variablePlugin, variablePluginCtx, definition);\n\n const dependentVariables = useAllVariableValues(dependsOnVariables);\n const waitToLoad = dependsOnVariables.some((v) => dependentVariables[v]?.loading);\n\n const ctx = { ...variablePluginCtx, variables: dependentVariables };\n\n return useQuery(getVariableQueryConfig(definition, ctx, variablePlugin, !!variablePlugin && !waitToLoad));\n}\n\nfunction resolveDefaultValue(definition: ListVariableDefinition, options: VariableOption[]): VariableValue {\n const { defaultValue, allowMultiple } = definition.spec;\n if (defaultValue !== undefined && defaultValue !== null) {\n return defaultValue;\n }\n if (options[0]?.value) {\n const first = options[0].value;\n return allowMultiple ? [first] : first;\n }\n return allowMultiple ? [] : '';\n}\n\n/**\n * Resolves initial values for all ListVariable definitions by fetching their options in dependency order.\n * Returns a map of variable names to their resolved default values, merging with any already-provided outer variables.\n */\nexport function useResolveListVariableValues(variableDefinitions: VariableDefinition[]): {\n initialVariableValues: Record<string, VariableValue>;\n isLoading: boolean;\n} {\n const { timeRange, datasourceStore, variables: outerVariableValues } = useVariablePluginContext();\n\n const listVariables = useMemo(\n () => variableDefinitions.filter((v): v is ListVariableDefinition => v.kind === 'ListVariable'),\n [variableDefinitions],\n );\n\n const pluginResults = usePlugins(\n 'Variable',\n listVariables.map((d) => ({\n kind: d.spec.plugin.kind,\n version: d.spec.plugin.metadata?.version,\n registry: d.spec.plugin.metadata?.registry,\n })),\n );\n\n // Resolved variable state. Updated by onFetched when queries resolve.\n // Needed because of dependencies between variables that require multiple rounds of fetching.\n const [resolvedVariables, setResolvedVariables] = useState<VariableStateMap>({});\n\n const allVariables = useMemo(() => {\n return { ...outerVariableValues, ...resolvedVariables };\n }, [outerVariableValues, resolvedVariables]);\n\n const onFetched = useCallback((name: string, options: VariableOption[], definition: ListVariableDefinition) => {\n setResolvedVariables((prev) => ({\n ...prev,\n [name]: { value: resolveDefaultValue(definition, options), loading: false, options },\n }));\n }, []);\n\n const queryResults = useQueries({\n queries: listVariables.map((definition, index) => {\n const plugin = pluginResults[index]?.data;\n const isPluginLoading = pluginResults[index]?.isLoading ?? true;\n\n const dependsOn = resolveDependsOnVariables(\n plugin,\n { timeRange, datasourceStore, variables: allVariables },\n definition,\n );\n\n const hasPendingDeps = dependsOn.some(\n (v) =>\n (resolvedVariables[v] === undefined && listVariables.some((lv) => lv.spec.name === v)) ||\n allVariables[v]?.loading,\n );\n\n const dependentVariables: VariableStateMap = {};\n for (const v of dependsOn) {\n const state = allVariables[v];\n if (state) {\n dependentVariables[v] = state;\n }\n }\n\n const ctx = { timeRange, datasourceStore, variables: dependentVariables };\n return getVariableQueryConfig(definition, ctx, plugin, !hasPendingDeps && !isPluginLoading, onFetched);\n }),\n });\n\n const initialVariableValues: Record<string, VariableValue> = useMemo(\n () =>\n Object.fromEntries(\n Object.entries(allVariables)\n .filter(([, state]) => state?.value !== undefined)\n .map(([name, state]) => [name, state!.value]),\n ),\n [allVariables],\n );\n\n return { initialVariableValues, isLoading: queryResults.some((r) => r.isLoading) };\n}\n\n/**\n * Returns a serialized string of the current state of variable values.\n */\nexport function getVariableValuesKey(v: VariableStateMap): string {\n return Object.values(v)\n .map((v) => JSON.stringify(v.value))\n .join(',');\n}\n\nexport const VARIABLE_TYPES = [\n { label: 'List', kind: 'ListVariable' },\n { label: 'Text', kind: 'TextVariable' },\n] as const;\n"],"names":["useQueries","useQuery","useCallback","useMemo","useState","useAllVariableValues","useDatasourceStore","usePlugin","usePlugins","useTimeRange","filterVariableList","data","capturedRegexp","result","filteredSet","Set","variableValue","matches","value","matchAll","concat","match","i","length","m","undefined","has","add","push","label","useVariablePluginContext","datasourceStore","allVariables","absoluteTimeRange","timeRange","variables","getVariableQueryConfig","definition","variablePluginCtx","variablePlugin","enabled","onFetched","capturingRegexp","spec","RegExp","variablesValueKey","getVariableValuesKey","queryKey","queryFn","signal","resp","getVariableOptions","plugin","name","options","resolveDependsOnVariables","dependsOn","dependencies","filter","v","useListVariablePluginValues","kind","version","metadata","registry","dependsOnVariables","dependentVariables","waitToLoad","some","loading","ctx","resolveDefaultValue","defaultValue","allowMultiple","first","useResolveListVariableValues","variableDefinitions","outerVariableValues","listVariables","pluginResults","map","d","resolvedVariables","setResolvedVariables","prev","queryResults","queries","index","isPluginLoading","isLoading","hasPendingDeps","lv","state","initialVariableValues","Object","fromEntries","entries","r","values","JSON","stringify","join","VARIABLE_TYPES"],"mappings":"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"}
|
package/dist/model/plugins.d.ts
CHANGED
|
@@ -43,12 +43,23 @@ export interface PluginModuleMetadata {
|
|
|
43
43
|
version: string;
|
|
44
44
|
registry?: string;
|
|
45
45
|
}
|
|
46
|
+
/**
|
|
47
|
+
* Status of a module/package that contains plugins, as reported by the Perses server.
|
|
48
|
+
*/
|
|
49
|
+
export interface PluginModuleStatus {
|
|
50
|
+
isLoaded?: boolean;
|
|
51
|
+
/**
|
|
52
|
+
* True when the module is served by a local dev server (`percli plugin start`) instead of an installed archive.
|
|
53
|
+
*/
|
|
54
|
+
inDev?: boolean;
|
|
55
|
+
}
|
|
46
56
|
/**
|
|
47
57
|
* Information about a module/package that contains plugins.
|
|
48
58
|
*/
|
|
49
59
|
export interface PluginModuleResource {
|
|
50
60
|
kind: 'PluginModule';
|
|
51
61
|
metadata: PluginModuleMetadata;
|
|
62
|
+
status?: PluginModuleStatus;
|
|
52
63
|
spec: PluginModuleSpec;
|
|
53
64
|
}
|
|
54
65
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/model/plugins.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEpD,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,WAAW,CAAC;AAC/C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACtD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AACpD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAC5C,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,eAAe,CAAC;AAC5C,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAElD,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,cAAc,EAAE,CAAC;CAC3B;AAED,MAAM,WAAW,wBAAyB,SAAQ,cAAc;IAC9D,MAAM,EAAE,oBAAoB,CAAC;CAC9B;AAED;;GAEG;AACH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,UAAU,CAAC;IACjB,QAAQ,CAAC,EAAE;QACT,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,CAAC;IACF,IAAI,EAAE;QACJ,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,EAAE;YACP,IAAI,EAAE,MAAM,CAAC;YACb,WAAW,CAAC,EAAE,MAAM,CAAC;SACtB,CAAC;KACH,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,IAAI,EAAE,cAAc,CAAC;IACrB,QAAQ,EAAE,oBAAoB,CAAC;IAC/B,IAAI,EAAE,gBAAgB,CAAC;CACxB;AAED;;;GAGG;AACH,MAAM,MAAM,UAAU,GAAG;KAEtB,CAAC,IAAI,MAAM,gBAAgB,GAAG,gBAAgB,CAAC,CAAC,CAAC,SAAS,MAAM,CAAC,WAAW,CAAC,GAAG,CAAC,GAAG,KAAK;CAC3F,CAAC,MAAM,gBAAgB,CAAC,CAAC;AAE1B;;;GAGG;AACH,MAAM,WAAW,gBAAgB;IAC/B,QAAQ,EAAE,cAAc,CAAC;IACzB,UAAU,EAAE,gBAAgB,CAAC;IAC7B,KAAK,EAAE,WAAW,CAAC;IACnB,eAAe,EAAE,qBAAqB,CAAC;IACvC,UAAU,EAAE,gBAAgB,CAAC;IAC7B,YAAY,EAAE,kBAAkB,CAAC;IACjC,QAAQ,EAAE,cAAc,CAAC;IACzB,WAAW,EAAE,iBAAiB,CAAC;IAC/B,aAAa,EAAE,mBAAmB,CAAC;IACnC,SAAS,EAAE,eAAe,CAAC;IAC3B,UAAU,EAAE,gBAAgB,CAAC;IAC7B,OAAO,EAAE,aAAa,CAAC;CACxB;AAED;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAAC,IAAI,SAAS,UAAU,IAAI,gBAAgB,CAAC,IAAI,CAAC,CAAC;AAEnF;;GAEG;AACH,KAAK,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,CAAC;AACvD,MAAM,MAAM,kBAAkB,GAAG,QAAQ,CAAC,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC,GAAG,IAAI,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;AAEvH,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,UAAU,IAAI;IACpD,IAAI,EAAE,CAAC,CAAC;IACR,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,CAAC;AAEF,wBAAgB,0BAA0B,CAAC,WAAW,EAAE;IACtD,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB,GAAG,MAAM,CAGT"}
|
|
1
|
+
{"version":3,"file":"plugins.d.ts","sourceRoot":"","sources":["../../src/model/plugins.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/model/plugins.ts"],"sourcesContent":["// Copyright The Perses Authors\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\nimport type { UnknownSpec } from '@perses-dev/spec';\n\nimport type { AlertsQueryPlugin } from './alerts-queries';\nimport type { AnnotationPlugin } from './annotations';\nimport type { DatasourcePlugin } from './datasource';\nimport type { ExplorePlugin } from './explore';\nimport type { JsonQueryPlugin } from './json-queries';\nimport type { LogQueryPlugin } from './log-queries';\nimport type { PanelPlugin } from './panels';\nimport type { Plugin } from './plugin-base';\nimport type { ProfileQueryPlugin } from './profile-queries';\nimport type { SilencesQueryPlugin } from './silences-queries';\nimport type { TimeSeriesQueryPlugin } from './time-series-queries';\nimport type { TraceQueryPlugin } from './trace-queries';\nimport type { VariablePlugin } from './variables';\n\nexport interface PluginModuleSpec {\n plugins: PluginMetadata[];\n}\n\nexport interface PluginMetadataWithModule extends PluginMetadata {\n module: PluginModuleMetadata;\n}\n\n/**\n * Metadata about an individual plugin that's part of a PluginModule.\n */\nexport interface PluginMetadata {\n kind: PluginType;\n metadata?: {\n version?: string;\n registry?: string;\n };\n spec: {\n name: string;\n display: {\n name: string;\n description?: string;\n };\n };\n}\n\n/**\n * Metadata about a module/package that contains plugins.\n */\nexport interface PluginModuleMetadata {\n name: string;\n version: string;\n registry?: string;\n}\n\n/**\n * Information about a module/package that contains plugins.\n */\nexport interface PluginModuleResource {\n kind: 'PluginModule';\n metadata: PluginModuleMetadata;\n spec: PluginModuleSpec;\n}\n\n/**\n * All supported plugin types. A plugin's implementation must extend from `Plugin<UnknownSpec>` to be considered a valid\n * `PluginType`.\n */\nexport type PluginType = {\n // Filter out implementations on SupportedPlugins that don't extend `Plugin<UnknownSpec>`\n [K in keyof SupportedPlugins]: SupportedPlugins[K] extends Plugin<UnknownSpec> ? K : never;\n}[keyof SupportedPlugins];\n\n/**\n * Map of plugin type key/string -> implementation type. Use Typescript module augmentation to extend the plugin system\n * with new plugin types.\n */\nexport interface SupportedPlugins {\n Variable: VariablePlugin;\n Annotation: AnnotationPlugin;\n Panel: PanelPlugin;\n TimeSeriesQuery: TimeSeriesQueryPlugin;\n TraceQuery: TraceQueryPlugin;\n ProfileQuery: ProfileQueryPlugin;\n LogQuery: LogQueryPlugin;\n AlertsQuery: AlertsQueryPlugin;\n SilencesQuery: SilencesQueryPlugin;\n JsonQuery: JsonQueryPlugin;\n Datasource: DatasourcePlugin;\n Explore: ExplorePlugin;\n}\n\n/**\n * The implementation for a given plugin type.\n */\nexport type PluginImplementation<Type extends PluginType> = SupportedPlugins[Type];\n\n/**\n * Default plugin kinds by plugin type.\n */\ntype PluginKinds = Partial<Record<PluginType, string>>;\nexport type DefaultPluginKinds = Required<Pick<PluginKinds, 'TimeSeriesQuery'>> & Omit<PluginKinds, 'TimeSeriesQuery'>;\n\nexport type PluginCompoundKey<T extends PluginType> = {\n kind: T;\n name: string;\n registry?: string;\n version?: string;\n};\n\nexport function getPluginModuleCompoundKey(compoundKey: {\n kind: string;\n name: string;\n registry?: string;\n version?: string;\n}): string {\n const { kind, name, registry, version } = compoundKey;\n return `${kind}:${name}:${registry ?? ''}:${version ?? ''}`;\n}\n"],"names":["getPluginModuleCompoundKey","compoundKey","kind","name","registry","version"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;
|
|
1
|
+
{"version":3,"sources":["../../src/model/plugins.ts"],"sourcesContent":["// Copyright The Perses Authors\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\nimport type { UnknownSpec } from '@perses-dev/spec';\n\nimport type { AlertsQueryPlugin } from './alerts-queries';\nimport type { AnnotationPlugin } from './annotations';\nimport type { DatasourcePlugin } from './datasource';\nimport type { ExplorePlugin } from './explore';\nimport type { JsonQueryPlugin } from './json-queries';\nimport type { LogQueryPlugin } from './log-queries';\nimport type { PanelPlugin } from './panels';\nimport type { Plugin } from './plugin-base';\nimport type { ProfileQueryPlugin } from './profile-queries';\nimport type { SilencesQueryPlugin } from './silences-queries';\nimport type { TimeSeriesQueryPlugin } from './time-series-queries';\nimport type { TraceQueryPlugin } from './trace-queries';\nimport type { VariablePlugin } from './variables';\n\nexport interface PluginModuleSpec {\n plugins: PluginMetadata[];\n}\n\nexport interface PluginMetadataWithModule extends PluginMetadata {\n module: PluginModuleMetadata;\n}\n\n/**\n * Metadata about an individual plugin that's part of a PluginModule.\n */\nexport interface PluginMetadata {\n kind: PluginType;\n metadata?: {\n version?: string;\n registry?: string;\n };\n spec: {\n name: string;\n display: {\n name: string;\n description?: string;\n };\n };\n}\n\n/**\n * Metadata about a module/package that contains plugins.\n */\nexport interface PluginModuleMetadata {\n name: string;\n version: string;\n registry?: string;\n}\n\n/**\n * Status of a module/package that contains plugins, as reported by the Perses server.\n */\nexport interface PluginModuleStatus {\n isLoaded?: boolean;\n /**\n * True when the module is served by a local dev server (`percli plugin start`) instead of an installed archive.\n */\n inDev?: boolean;\n}\n\n/**\n * Information about a module/package that contains plugins.\n */\nexport interface PluginModuleResource {\n kind: 'PluginModule';\n metadata: PluginModuleMetadata;\n status?: PluginModuleStatus;\n spec: PluginModuleSpec;\n}\n\n/**\n * All supported plugin types. A plugin's implementation must extend from `Plugin<UnknownSpec>` to be considered a valid\n * `PluginType`.\n */\nexport type PluginType = {\n // Filter out implementations on SupportedPlugins that don't extend `Plugin<UnknownSpec>`\n [K in keyof SupportedPlugins]: SupportedPlugins[K] extends Plugin<UnknownSpec> ? K : never;\n}[keyof SupportedPlugins];\n\n/**\n * Map of plugin type key/string -> implementation type. Use Typescript module augmentation to extend the plugin system\n * with new plugin types.\n */\nexport interface SupportedPlugins {\n Variable: VariablePlugin;\n Annotation: AnnotationPlugin;\n Panel: PanelPlugin;\n TimeSeriesQuery: TimeSeriesQueryPlugin;\n TraceQuery: TraceQueryPlugin;\n ProfileQuery: ProfileQueryPlugin;\n LogQuery: LogQueryPlugin;\n AlertsQuery: AlertsQueryPlugin;\n SilencesQuery: SilencesQueryPlugin;\n JsonQuery: JsonQueryPlugin;\n Datasource: DatasourcePlugin;\n Explore: ExplorePlugin;\n}\n\n/**\n * The implementation for a given plugin type.\n */\nexport type PluginImplementation<Type extends PluginType> = SupportedPlugins[Type];\n\n/**\n * Default plugin kinds by plugin type.\n */\ntype PluginKinds = Partial<Record<PluginType, string>>;\nexport type DefaultPluginKinds = Required<Pick<PluginKinds, 'TimeSeriesQuery'>> & Omit<PluginKinds, 'TimeSeriesQuery'>;\n\nexport type PluginCompoundKey<T extends PluginType> = {\n kind: T;\n name: string;\n registry?: string;\n version?: string;\n};\n\nexport function getPluginModuleCompoundKey(compoundKey: {\n kind: string;\n name: string;\n registry?: string;\n version?: string;\n}): string {\n const { kind, name, registry, version } = compoundKey;\n return `${kind}:${name}:${registry ?? ''}:${version ?? ''}`;\n}\n"],"names":["getPluginModuleCompoundKey","compoundKey","kind","name","registry","version"],"mappings":"AAAA,+BAA+B;AAC/B,kEAAkE;AAClE,mEAAmE;AACnE,0CAA0C;AAC1C,EAAE;AACF,6CAA6C;AAC7C,EAAE;AACF,sEAAsE;AACtE,oEAAoE;AACpE,2EAA2E;AAC3E,sEAAsE;AACtE,iCAAiC;AAwHjC,OAAO,SAASA,2BAA2BC,WAK1C;IACC,MAAM,EAAEC,IAAI,EAAEC,IAAI,EAAEC,QAAQ,EAAEC,OAAO,EAAE,GAAGJ;IAC1C,OAAO,GAAGC,KAAK,CAAC,EAAEC,KAAK,CAAC,EAAEC,YAAY,GAAG,CAAC,EAAEC,WAAW,IAAI;AAC7D"}
|
|
@@ -112,43 +112,43 @@ const getPluginRuntime = ()=>{
|
|
|
112
112
|
}
|
|
113
113
|
},
|
|
114
114
|
'@perses-dev/client': {
|
|
115
|
-
version: '0.55.0-beta.
|
|
115
|
+
version: '0.55.0-beta.12',
|
|
116
116
|
lib: ()=>getHostSharedModule('@perses-dev/client'),
|
|
117
117
|
shareConfig: {
|
|
118
118
|
singleton: true,
|
|
119
|
-
requiredVersion: '^0.55.0-beta.
|
|
119
|
+
requiredVersion: '^0.55.0-beta.12'
|
|
120
120
|
}
|
|
121
121
|
},
|
|
122
122
|
'@perses-dev/components': {
|
|
123
|
-
version: '0.55.0-beta.
|
|
123
|
+
version: '0.55.0-beta.12',
|
|
124
124
|
lib: ()=>getHostSharedModule('@perses-dev/components'),
|
|
125
125
|
shareConfig: {
|
|
126
126
|
singleton: true,
|
|
127
|
-
requiredVersion: '^0.55.0-beta.
|
|
127
|
+
requiredVersion: '^0.55.0-beta.12'
|
|
128
128
|
}
|
|
129
129
|
},
|
|
130
130
|
'@perses-dev/plugin-system': {
|
|
131
|
-
version: '0.55.0-beta.
|
|
131
|
+
version: '0.55.0-beta.12',
|
|
132
132
|
lib: ()=>getHostSharedModule('@perses-dev/plugin-system'),
|
|
133
133
|
shareConfig: {
|
|
134
134
|
singleton: true,
|
|
135
|
-
requiredVersion: '^0.55.0-beta.
|
|
135
|
+
requiredVersion: '^0.55.0-beta.12'
|
|
136
136
|
}
|
|
137
137
|
},
|
|
138
138
|
'@perses-dev/explore': {
|
|
139
|
-
version: '0.55.0-beta.
|
|
139
|
+
version: '0.55.0-beta.12',
|
|
140
140
|
lib: ()=>getHostSharedModule('@perses-dev/explore'),
|
|
141
141
|
shareConfig: {
|
|
142
142
|
singleton: true,
|
|
143
|
-
requiredVersion: '^0.55.0-beta.
|
|
143
|
+
requiredVersion: '^0.55.0-beta.12'
|
|
144
144
|
}
|
|
145
145
|
},
|
|
146
146
|
'@perses-dev/dashboards': {
|
|
147
|
-
version: '0.55.0-beta.
|
|
147
|
+
version: '0.55.0-beta.12',
|
|
148
148
|
lib: ()=>getHostSharedModule('@perses-dev/dashboards'),
|
|
149
149
|
shareConfig: {
|
|
150
150
|
singleton: true,
|
|
151
|
-
requiredVersion: '^0.55.0-beta.
|
|
151
|
+
requiredVersion: '^0.55.0-beta.12'
|
|
152
152
|
}
|
|
153
153
|
},
|
|
154
154
|
// Below are the shared modules that are used by the plugins and are loaded asynchronously on demand using get rather than lib.
|