From 99d425c935c7f54130f0b5aacb91e157ac0ec0f6 Mon Sep 17 00:00:00 2001
From: Jeremy Fiel <jeremy.fiel@adp.com>
Date: Thu, 17 Oct 2024 16:29:36 -0400
Subject: [PATCH] feat: add typings and interfaces for Overlay Specification
 v1.0.0

* updated references to use defined NodeTypes.
* update `any` to `unknown`
* run prettier
* rebase latest changes from main
* refactor to match #1898 type definitions

related #1246
---
 .changeset/stale-starfishes-rule.md      |  6 ++++
 packages/cli/src/__tests__/utils.test.ts |  1 +
 packages/core/src/types/overlay.ts       | 40 ++++++++++++++++++++++++
 packages/core/src/typings/overlay.ts     | 19 +++++++++++
 4 files changed, 66 insertions(+)
 create mode 100644 .changeset/stale-starfishes-rule.md
 create mode 100644 packages/core/src/types/overlay.ts
 create mode 100644 packages/core/src/typings/overlay.ts

diff --git a/.changeset/stale-starfishes-rule.md b/.changeset/stale-starfishes-rule.md
new file mode 100644
index 0000000000..d7de485264
--- /dev/null
+++ b/.changeset/stale-starfishes-rule.md
@@ -0,0 +1,6 @@
+---
+"@redocly/openapi-core": minor
+"@redocly/cli": minor
+---
+
+Added typings and interfaces for Overlay Specification v1.0.0.
diff --git a/packages/cli/src/__tests__/utils.test.ts b/packages/cli/src/__tests__/utils.test.ts
index 68ee11ab7a..3402333b10 100644
--- a/packages/cli/src/__tests__/utils.test.ts
+++ b/packages/cli/src/__tests__/utils.test.ts
@@ -502,6 +502,7 @@ describe('checkIfRulesetExist', () => {
       async2: {},
       async3: {},
       arazzo1: {},
+      overlay1: {},
     };
     expect(() => checkIfRulesetExist(rules)).toThrowError(
       '⚠️ No rules were configured. Learn how to configure rules: https://redocly.com/docs/cli/rules/'
diff --git a/packages/core/src/types/overlay.ts b/packages/core/src/types/overlay.ts
new file mode 100644
index 0000000000..559d4d024a
--- /dev/null
+++ b/packages/core/src/types/overlay.ts
@@ -0,0 +1,40 @@
+import { type NodeType, listOf } from '.';
+
+const Root: NodeType = {
+  properties: {
+    overlay: { type: 'string' },
+    info: 'Info',
+    extends: { type: 'string' },
+    actions: 'Actions',
+  },
+  required: ['overlay', 'info', 'actions'],
+  extensionsPrefix: 'x-',
+};
+
+const Info: NodeType = {
+  properties: {
+    title: { type: 'string' },
+    version: { type: 'string' },
+  },
+  required: ['title', 'version'],
+  extensionsPrefix: 'x-',
+};
+
+const Actions: NodeType = listOf('Action');
+const Action: NodeType = {
+  properties: {
+    target: { type: 'string' },
+    description: { type: 'string' },
+    update: {}, // any
+    remove: { type: 'boolean' },
+  },
+  required: ['target'],
+  extensionsPrefix: 'x-',
+};
+
+export const Overlay1Types: Record<string, NodeType> = {
+  Root,
+  Info,
+  Actions,
+  Action,
+};
diff --git a/packages/core/src/typings/overlay.ts b/packages/core/src/typings/overlay.ts
new file mode 100644
index 0000000000..a529a51378
--- /dev/null
+++ b/packages/core/src/typings/overlay.ts
@@ -0,0 +1,19 @@
+export interface InfoObject {
+  title: string;
+  version: string;
+}
+
+export interface ActionObject {
+  target: string;
+  description?: string;
+  update?: unknown;
+  remove?: boolean;
+}
+export interface Overlay1Definition {
+  overlay: '1.0.0';
+  info: InfoObject;
+  extends?: string;
+  actions: ActionObject[];
+}
+
+export const VERSION_PATTERN = /^1\.0\.\d+(-.+)?$/;