diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.getalltypes.md b/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.getalltypes.md
index 1e0e89767c4e6..c839dd16d9a47 100644
--- a/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.getalltypes.md
+++ b/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.getalltypes.md
@@ -4,7 +4,9 @@
## SavedObjectTypeRegistry.getAllTypes() method
-Return all [types](./kibana-plugin-core-server.savedobjectstype.md) currently registered.
+Return all [types](./kibana-plugin-core-server.savedobjectstype.md) currently registered, including the hidden ones.
+
+To only get the visible types (which is the most common use case), use `getVisibleTypes` instead.
Signature:
diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.getvisibletypes.md b/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.getvisibletypes.md
new file mode 100644
index 0000000000000..a773c6a0a674f
--- /dev/null
+++ b/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.getvisibletypes.md
@@ -0,0 +1,19 @@
+
+
+[Home](./index.md) > [kibana-plugin-core-server](./kibana-plugin-core-server.md) > [SavedObjectTypeRegistry](./kibana-plugin-core-server.savedobjecttyperegistry.md) > [getVisibleTypes](./kibana-plugin-core-server.savedobjecttyperegistry.getvisibletypes.md)
+
+## SavedObjectTypeRegistry.getVisibleTypes() method
+
+Returns all visible [types](./kibana-plugin-core-server.savedobjectstype.md).
+
+A visible type is a type that doesn't explicitly define `hidden=true` during registration.
+
+Signature:
+
+```typescript
+getVisibleTypes(): SavedObjectsType[];
+```
+Returns:
+
+`SavedObjectsType[]`
+
diff --git a/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.md b/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.md
index 69a94e4ad8c88..55ad7ca137de0 100644
--- a/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.md
+++ b/docs/development/core/server/kibana-plugin-core-server.savedobjecttyperegistry.md
@@ -16,10 +16,11 @@ export declare class SavedObjectTypeRegistry
| Method | Modifiers | Description |
| --- | --- | --- |
-| [getAllTypes()](./kibana-plugin-core-server.savedobjecttyperegistry.getalltypes.md) | | Return all [types](./kibana-plugin-core-server.savedobjectstype.md) currently registered. |
+| [getAllTypes()](./kibana-plugin-core-server.savedobjecttyperegistry.getalltypes.md) | | Return all [types](./kibana-plugin-core-server.savedobjectstype.md) currently registered, including the hidden ones.To only get the visible types (which is the most common use case), use getVisibleTypes
instead. |
| [getImportableAndExportableTypes()](./kibana-plugin-core-server.savedobjecttyperegistry.getimportableandexportabletypes.md) | | Return all [types](./kibana-plugin-core-server.savedobjectstype.md) currently registered that are importable/exportable. |
| [getIndex(type)](./kibana-plugin-core-server.savedobjecttyperegistry.getindex.md) | | Returns the indexPattern
property for given type, or undefined
if the type is not registered. |
| [getType(type)](./kibana-plugin-core-server.savedobjecttyperegistry.gettype.md) | | Return the [type](./kibana-plugin-core-server.savedobjectstype.md) definition for given type name. |
+| [getVisibleTypes()](./kibana-plugin-core-server.savedobjecttyperegistry.getvisibletypes.md) | | Returns all visible [types](./kibana-plugin-core-server.savedobjectstype.md).A visible type is a type that doesn't explicitly define hidden=true
during registration. |
| [isHidden(type)](./kibana-plugin-core-server.savedobjecttyperegistry.ishidden.md) | | Returns the hidden
property for given type, or false
if the type is not registered. |
| [isImportableAndExportable(type)](./kibana-plugin-core-server.savedobjecttyperegistry.isimportableandexportable.md) | | Returns the management.importableAndExportable
property for given type, or false
if the type is not registered or does not define a management section. |
| [isMultiNamespace(type)](./kibana-plugin-core-server.savedobjecttyperegistry.ismultinamespace.md) | | Returns whether the type is multi-namespace (shareable); resolves to false
if the type is not registered |
diff --git a/src/core/server/saved_objects/saved_objects_type_registry.mock.ts b/src/core/server/saved_objects/saved_objects_type_registry.mock.ts
index 5636dcadb444e..44490228490cc 100644
--- a/src/core/server/saved_objects/saved_objects_type_registry.mock.ts
+++ b/src/core/server/saved_objects/saved_objects_type_registry.mock.ts
@@ -25,6 +25,7 @@ const createRegistryMock = (): jest.Mocked<
const mock = {
registerType: jest.fn(),
getType: jest.fn(),
+ getVisibleTypes: jest.fn(),
getAllTypes: jest.fn(),
getImportableAndExportableTypes: jest.fn(),
isNamespaceAgnostic: jest.fn(),
@@ -35,6 +36,7 @@ const createRegistryMock = (): jest.Mocked<
isImportableAndExportable: jest.fn(),
};
+ mock.getVisibleTypes.mockReturnValue([]);
mock.getAllTypes.mockReturnValue([]);
mock.getImportableAndExportableTypes.mockReturnValue([]);
mock.getIndex.mockReturnValue('.kibana-test');
diff --git a/src/core/server/saved_objects/saved_objects_type_registry.test.ts b/src/core/server/saved_objects/saved_objects_type_registry.test.ts
index e0f4d6fa28e50..25c94324c8f01 100644
--- a/src/core/server/saved_objects/saved_objects_type_registry.test.ts
+++ b/src/core/server/saved_objects/saved_objects_type_registry.test.ts
@@ -99,10 +99,37 @@ describe('SavedObjectTypeRegistry', () => {
});
});
+ describe('#getVisibleTypes', () => {
+ it('returns only visible registered types', () => {
+ const typeA = createType({ name: 'typeA', hidden: false });
+ const typeB = createType({ name: 'typeB', hidden: true });
+ const typeC = createType({ name: 'typeC', hidden: false });
+ registry.registerType(typeA);
+ registry.registerType(typeB);
+ registry.registerType(typeC);
+
+ const registered = registry.getVisibleTypes();
+ expect(registered.length).toEqual(2);
+ expect(registered).toContainEqual(typeA);
+ expect(registered).toContainEqual(typeC);
+ });
+
+ it('does not mutate the registered types when altering the list', () => {
+ registry.registerType(createType({ name: 'typeA', hidden: false }));
+ registry.registerType(createType({ name: 'typeB', hidden: true }));
+ registry.registerType(createType({ name: 'typeC', hidden: false }));
+
+ const types = registry.getVisibleTypes();
+ types.splice(0, 2);
+
+ expect(registry.getVisibleTypes().length).toEqual(2);
+ });
+ });
+
describe('#getAllTypes', () => {
it('returns all registered types', () => {
const typeA = createType({ name: 'typeA' });
- const typeB = createType({ name: 'typeB' });
+ const typeB = createType({ name: 'typeB', hidden: true });
const typeC = createType({ name: 'typeC' });
registry.registerType(typeA);
registry.registerType(typeB);
diff --git a/src/core/server/saved_objects/saved_objects_type_registry.ts b/src/core/server/saved_objects/saved_objects_type_registry.ts
index 99262d7a31e21..d0035294226ea 100644
--- a/src/core/server/saved_objects/saved_objects_type_registry.ts
+++ b/src/core/server/saved_objects/saved_objects_type_registry.ts
@@ -54,7 +54,18 @@ export class SavedObjectTypeRegistry {
}
/**
- * Return all {@link SavedObjectsType | types} currently registered.
+ * Returns all visible {@link SavedObjectsType | types}.
+ *
+ * A visible type is a type that doesn't explicitly define `hidden=true` during registration.
+ */
+ public getVisibleTypes() {
+ return [...this.types.values()].filter((type) => !this.isHidden(type.name));
+ }
+
+ /**
+ * Return all {@link SavedObjectsType | types} currently registered, including the hidden ones.
+ *
+ * To only get the visible types (which is the most common use case), use `getVisibleTypes` instead.
*/
public getAllTypes() {
return [...this.types.values()];
diff --git a/src/core/server/server.api.md b/src/core/server/server.api.md
index 9cc5a8a386b0b..1cabaa57e519c 100644
--- a/src/core/server/server.api.md
+++ b/src/core/server/server.api.md
@@ -2468,6 +2468,7 @@ export class SavedObjectTypeRegistry {
getImportableAndExportableTypes(): SavedObjectsType[];
getIndex(type: string): string | undefined;
getType(type: string): SavedObjectsType | undefined;
+ getVisibleTypes(): SavedObjectsType[];
isHidden(type: string): boolean;
isImportableAndExportable(type: string): boolean;
isMultiNamespace(type: string): boolean;
diff --git a/src/legacy/server/saved_objects/saved_objects_mixin.js b/src/legacy/server/saved_objects/saved_objects_mixin.js
index 63839b9d0f1d7..185c8807ae8b5 100644
--- a/src/legacy/server/saved_objects/saved_objects_mixin.js
+++ b/src/legacy/server/saved_objects/saved_objects_mixin.js
@@ -34,8 +34,8 @@ export function savedObjectsMixin(kbnServer, server) {
const typeRegistry = kbnServer.newPlatform.start.core.savedObjects.getTypeRegistry();
const mappings = migrator.getActiveMappings();
const allTypes = typeRegistry.getAllTypes().map((t) => t.name);
+ const visibleTypes = typeRegistry.getVisibleTypes().map((t) => t.name);
const schema = new SavedObjectsSchema(convertTypesToLegacySchema(typeRegistry.getAllTypes()));
- const visibleTypes = allTypes.filter((type) => !schema.isHiddenType(type));
server.decorate('server', 'kibanaMigrator', migrator);
diff --git a/x-pack/plugins/features/server/plugin.test.ts b/x-pack/plugins/features/server/plugin.test.ts
index 79fd012337b00..3d85c2e9eb751 100644
--- a/x-pack/plugins/features/server/plugin.test.ts
+++ b/x-pack/plugins/features/server/plugin.test.ts
@@ -10,19 +10,13 @@ const initContext = coreMock.createPluginInitializerContext();
const coreSetup = coreMock.createSetup();
const coreStart = coreMock.createStart();
const typeRegistry = savedObjectsServiceMock.createTypeRegistryMock();
-typeRegistry.getAllTypes.mockReturnValue([
+typeRegistry.getVisibleTypes.mockReturnValue([
{
name: 'foo',
hidden: false,
mappings: { properties: {} },
namespaceType: 'single' as 'single',
},
- {
- name: 'bar',
- hidden: true,
- mappings: { properties: {} },
- namespaceType: 'agnostic' as 'agnostic',
- },
]);
coreStart.savedObjects.getTypeRegistry.mockReturnValue(typeRegistry);
diff --git a/x-pack/plugins/features/server/plugin.ts b/x-pack/plugins/features/server/plugin.ts
index 149c1acfb5086..5783b20eae648 100644
--- a/x-pack/plugins/features/server/plugin.ts
+++ b/x-pack/plugins/features/server/plugin.ts
@@ -80,10 +80,7 @@ export class Plugin {
private registerOssFeatures(savedObjects: SavedObjectsServiceStart) {
const registry = savedObjects.getTypeRegistry();
- const savedObjectTypes = registry
- .getAllTypes()
- .filter((t) => !t.hidden)
- .map((t) => t.name);
+ const savedObjectTypes = registry.getVisibleTypes().map((t) => t.name);
this.logger.debug(
`Registering OSS features with SO types: ${savedObjectTypes.join(', ')}. "includeTimelion": ${