From 0433fe5c2c06443874f18f7641222296e112f5c6 Mon Sep 17 00:00:00 2001
From: Joshua Creek <8179928+jcreek@users.noreply.github.com>
Date: Thu, 5 Mar 2026 18:32:45 +0000
Subject: [PATCH] feat(*): Enable loading the file and creating a PR in Azure
Devops
---
README.md | 214 +-
index.html | 13 -
package.json | 50 +-
.../tech-radar-editor-backend/package.json | 35 +
.../tech-radar-editor-backend/src/index.ts | 1 +
.../tech-radar-editor-backend/src/plugin.ts | 22 +
.../tech-radar-editor-backend/src/router.ts | 242 +
.../tech-radar-editor-backend/src/types.ts | 20 +
.../tech-radar-editor-backend-1.0.0.tgz | Bin 0 -> 17693 bytes
.../tech-radar-editor-backend/tsconfig.json | 10 +
.../tech-radar-editor-backstage/package.json | 37 +
.../src/TechRadarEditorPage.tsx | 263 +
.../tech-radar-editor-backstage/src/index.ts | 1 +
.../tech-radar-editor-backstage-1.0.0.tgz | Bin 0 -> 17464 bytes
.../tech-radar-editor-backstage/tsconfig.json | 12 +
packages/tech-radar-editor/index.html | 23 +
packages/tech-radar-editor/package.json | 50 +
.../tech-radar-editor/postcss.config.js | 0
.../tech-radar-editor/public}/vite.svg | 0
.../src}/TechRadarEditor.svelte | 168 +-
.../tech-radar-editor/src}/assets/svelte.svg | 0
packages/tech-radar-editor/src/main.ts | 3 +
packages/tech-radar-editor/src/types.ts | 40 +
.../tech-radar-editor/src}/vite-env.d.ts | 0
.../tech-radar-editor/svelte.config.js | 0
.../tech-radar-editor/tailwind.config.cjs | 0
.../tech-radar-editor-1.2.0.tgz | Bin 0 -> 40497 bytes
.../tech-radar-editor/tsconfig.build.json | 0
.../tech-radar-editor/tsconfig.json | 0
.../tech-radar-editor/tsconfig.node.json | 0
.../tech-radar-editor/vite.config.ts | 0
pnpm-lock.yaml | 5056 +++++++++++++++--
pnpm-workspace.yaml | 2 +
src/main.ts | 1 -
tsconfig.base.json | 16 +
35 files changed, 5503 insertions(+), 776 deletions(-)
delete mode 100644 index.html
create mode 100644 packages/tech-radar-editor-backend/package.json
create mode 100644 packages/tech-radar-editor-backend/src/index.ts
create mode 100644 packages/tech-radar-editor-backend/src/plugin.ts
create mode 100644 packages/tech-radar-editor-backend/src/router.ts
create mode 100644 packages/tech-radar-editor-backend/src/types.ts
create mode 100644 packages/tech-radar-editor-backend/tech-radar-editor-backend-1.0.0.tgz
create mode 100644 packages/tech-radar-editor-backend/tsconfig.json
create mode 100644 packages/tech-radar-editor-backstage/package.json
create mode 100644 packages/tech-radar-editor-backstage/src/TechRadarEditorPage.tsx
create mode 100644 packages/tech-radar-editor-backstage/src/index.ts
create mode 100644 packages/tech-radar-editor-backstage/tech-radar-editor-backstage-1.0.0.tgz
create mode 100644 packages/tech-radar-editor-backstage/tsconfig.json
create mode 100644 packages/tech-radar-editor/index.html
create mode 100644 packages/tech-radar-editor/package.json
rename postcss.config.js => packages/tech-radar-editor/postcss.config.js (100%)
rename {public => packages/tech-radar-editor/public}/vite.svg (100%)
rename {src => packages/tech-radar-editor/src}/TechRadarEditor.svelte (76%)
rename {src => packages/tech-radar-editor/src}/assets/svelte.svg (100%)
create mode 100644 packages/tech-radar-editor/src/main.ts
create mode 100644 packages/tech-radar-editor/src/types.ts
rename {src => packages/tech-radar-editor/src}/vite-env.d.ts (100%)
rename svelte.config.js => packages/tech-radar-editor/svelte.config.js (100%)
rename tailwind.config.cjs => packages/tech-radar-editor/tailwind.config.cjs (100%)
create mode 100644 packages/tech-radar-editor/tech-radar-editor-1.2.0.tgz
rename tsconfig.build.json => packages/tech-radar-editor/tsconfig.build.json (100%)
rename tsconfig.json => packages/tech-radar-editor/tsconfig.json (100%)
rename tsconfig.node.json => packages/tech-radar-editor/tsconfig.node.json (100%)
rename vite.config.ts => packages/tech-radar-editor/vite.config.ts (100%)
create mode 100644 pnpm-workspace.yaml
delete mode 100644 src/main.ts
create mode 100644 tsconfig.base.json
diff --git a/README.md b/README.md
index 80469f1..4131fbc 100644
--- a/README.md
+++ b/README.md
@@ -19,109 +19,59 @@ Zalando has a fantastic description [on their website](https://opensource.zaland
It serves and scales well for teams and companies of all sizes that want to have alignment across dozens of technologies and visualize it in a simple way.
+## Packages
+
+This is a monorepo containing three packages:
+
+| Package | Description |
+|---------|-------------|
+| [`tech-radar-editor`](./packages/tech-radar-editor) | The core web component (``) |
+| [`tech-radar-editor-backend`](./packages/tech-radar-editor-backend) | Backstage backend plugin for Azure DevOps integration |
+| [`tech-radar-editor-backstage`](./packages/tech-radar-editor-backstage) | Backstage frontend wrapper component |
+
## Include the Component in Spotify Backstage
-### Install
+### Quick Start
-For either simple or advanced installations, you'll need to add the dependency using Yarn:
-
-From your Backstage root directory:
+1. Install packages:
```bash
-yarn --cwd packages/app add tech-radar-editor
+# From your Backstage root directory
+yarn --cwd packages/app add tech-radar-editor-backstage
+yarn --cwd packages/backend add tech-radar-editor-backend
```
-### Configuration
-
-Modify your app routes to include the Router component exported from the tech radar, for example:
-
-```tsx
-// In packages/app/src/App.tsx
-import 'tech-radar-editor';
-
-const routes = (
-
- {/* ...other routes */}
- }
- />
-```
-
-#### How to Use This Component in Backstage with a Config-Based URL
-
-##### Configure the URL in app-config.yaml
-
-In your Backstage `app-config.yaml`, add a config key for the editor’s JSON URL. For example:
+2. Add config to `app-config.yaml`:
```yaml
-techRadar:
- url: "https://example.org/path/to/tech-radar.json"
+techRadarEditor:
+ organization: my-org
+ project: my-project
+ repository: my-repo
+ filePath: /tech-radar.json # optional, defaults to /tech-radar.json
+ targetBranch: main # optional, defaults to main
```
-Adjust the key and value to suit your environment.
+3. Register the backend plugin in `packages/backend/src/index.ts`:
-##### Set up the type for the config value
-
-In your `package.json`, add:
-
-```json
-{
- // ...
- "files": [
- // ...
- "config.d.ts"
- ],
- "configSchema": "config.d.ts"
-}
+```ts
+backend.add(import('tech-radar-editor-backend'));
```
-You'll need to create a type definition for the config value in your Backstage app. In your `config.d.ts` file, add:
-
-````ts
-export interface Config {
- techRadar: {
- /**
- * Frontend URL
- * @visibility frontend
- */
- url: string;
- };
-}
-```
-
-##### Create a small React wrapper in your Backstage app
-
-Somewhere in your Backstage app (for example, in `App.tsx` or in a separate `TechRadarEditorWrapper.tsx` file), create a tiny wrapper component to read the config and pass that URL to the `` web component as an attribute:
+4. Add the route in your `packages/app/src/App.tsx`:
```tsx
-import React from "react";
-import { useApi, configApiRef } from "@backstage/core-plugin-api";
+import { TechRadarEditorPage } from 'tech-radar-editor-backstage';
-// Import the custom element so that React recognizes
-import "tech-radar-editor";
-
-export const TechRadarEditorWrapper = () => {
- const configApi = useApi(configApiRef);
- const dataUrl = configApi.getOptionalString("techRadar.url") ?? "";
-
- return ;
-};
-````
-
-##### Add a route for your Tech Radar Editor
-
-In your Backstage `App.tsx` (or wherever you define your routes), import that wrapper and point a route to it:
-
-```tsx
-} />
+// In your routes:
+} />
```
-Now when you visit `/tech-radar-editor`, the `` component will automatically fetch the JSON from your configured URL.
+That's it! The editor will fetch data from your Azure DevOps repository and allow users to submit changes as pull requests.
-## Consume the Component in Plain JavaScript
+## Use the Web Component Standalone
-Include the component in an HTML file:
+### In Plain HTML
```html
@@ -137,64 +87,76 @@ Include the component in an HTML file: