From 589860ec27f7fbe2cb96e5266737850a6c2c5ead Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Mon, 24 Jun 2024 15:26:53 +0200 Subject: [PATCH 01/13] feat: add plugin to backend index.ts Signed-off-by: Alper Altay --- .../lib/new/factories/backendPlugin.test.ts | 88 ++++++++++++++++++- .../src/lib/new/factories/backendPlugin.ts | 34 +++++++ 2 files changed, 119 insertions(+), 3 deletions(-) diff --git a/packages/cli/src/lib/new/factories/backendPlugin.test.ts b/packages/cli/src/lib/new/factories/backendPlugin.test.ts index c5930592a3..c6196d8690 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.test.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.test.ts @@ -26,13 +26,19 @@ import { import { backendPlugin } from './backendPlugin'; import { createMockDirectory } from '@backstage/backend-test-utils'; +const backendIndexTsContent = ` +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); + +backend.start(); +`; + describe('backendPlugin factory', () => { const mockDir = createMockDirectory(); beforeEach(() => { - mockPaths({ - targetRoot: mockDir.path, - }); + mockPaths({ targetRoot: mockDir.path }); }); afterEach(() => { @@ -44,6 +50,9 @@ describe('backendPlugin factory', () => { packages: { backend: { 'package.json': JSON.stringify({}), + src: { + 'index.ts': backendIndexTsContent, + }, }, }, plugins: {}, @@ -89,6 +98,7 @@ describe('backendPlugin factory', () => { 'Installing:', `moving plugins${sep}test-backend`, 'backend adding dependency', + 'backend adding import and plugin', ]); await expect( @@ -99,6 +109,78 @@ describe('backendPlugin factory', () => { }, }); + await expect( + fs.readFile(mockDir.resolve('packages/backend/src/index.ts'), 'utf8'), + ).resolves.toBe(` +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); + +backend.add(import("backstage-plugin-test-backend")); +backend.start(); +`); + + expect(Task.forCommand).toHaveBeenCalledTimes(2); + expect(Task.forCommand).toHaveBeenCalledWith('yarn install', { + cwd: mockDir.resolve('plugins/test-backend'), + optional: true, + }); + expect(Task.forCommand).toHaveBeenCalledWith('yarn lint --fix', { + cwd: mockDir.resolve('plugins/test-backend'), + optional: true, + }); + }); + + it('should create a backend plugin with more options and codeowners', async () => { + mockDir.setContent({ + CODEOWNERS: '', + packages: { + backend: { + 'package.json': JSON.stringify({}), + src: { + 'index.ts': backendIndexTsContent, + }, + }, + }, + plugins: {}, + }); + + const options = await FactoryRegistry.populateOptions(backendPlugin, { + id: 'test', + owner: '@test-user', + }); + + const [, mockStream] = createMockOutputStream(); + jest.spyOn(process, 'stderr', 'get').mockReturnValue(mockStream); + jest.spyOn(Task, 'forCommand').mockResolvedValue(); + + await backendPlugin.create(options, { + scope: 'internal', + private: true, + isMonoRepo: true, + defaultVersion: '1.0.0', + markAsModified: () => {}, + createTemporaryDirectory: () => fs.mkdtemp('test'), + }); + + await expect( + fs.readJson(mockDir.resolve('packages/backend/package.json')), + ).resolves.toEqual({ + dependencies: { + '@internal/backstage-plugin-test-backend': '^1.0.0', + }, + }); + + await expect( + fs.readFile(mockDir.resolve('packages/backend/src/index.ts'), 'utf8'), + ).resolves.toBe(` +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); + +backend.add(import("@internal/backstage-plugin-test-backend")); +backend.start();`); + expect(Task.forCommand).toHaveBeenCalledTimes(2); expect(Task.forCommand).toHaveBeenCalledWith('yarn install', { cwd: mockDir.resolve('plugins/test-backend'), diff --git a/packages/cli/src/lib/new/factories/backendPlugin.ts b/packages/cli/src/lib/new/factories/backendPlugin.ts index 09ea98fbe7..06bc6bd366 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.ts @@ -78,6 +78,40 @@ export const backendPlugin = createFactory({ }, ); }); + + await Task.forItem('backend', 'adding import and plugin', async () => { + const backendFilePath = paths.resolveTargetRoot( + 'packages/backend/src/index.ts', + ); + if (!(await fs.pathExists(backendFilePath))) { + return; + } + const content = await fs.readFile(backendFilePath, 'utf8'); + const revLines = content.split('\n').reverse(); + + const lastImportIndex = revLines.findIndex(line => + line.match(/ from ("|').*("|')/), + ); + const lastBackendAddIndex = revLines.findIndex(line => + line.match(/backend.add/), + ); + + const backendAddLine = `backend.add(import("${name}"));`; + + if (lastImportIndex !== -1 && lastBackendAddIndex !== -1) { + if (!content.includes(backendAddLine)) { + const [indentation] = + revLines[lastBackendAddIndex + 1].match(/^\s*/) ?? []; + revLines.splice( + lastBackendAddIndex + 1, + 0, + indentation + backendAddLine, + ); + } + const newContent = revLines.reverse().join('\n'); + await fs.writeFile(backendFilePath, newContent, 'utf8'); + } + }); } if (options.owner) { From 4baac0c5a54cdc9ee1bfe1a16fd75743d38855e9 Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Mon, 24 Jun 2024 15:30:13 +0200 Subject: [PATCH 02/13] feat: changeset Signed-off-by: Alper Altay --- .changeset/silent-lobsters-tease.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/silent-lobsters-tease.md diff --git a/.changeset/silent-lobsters-tease.md b/.changeset/silent-lobsters-tease.md new file mode 100644 index 0000000000..e116818b7c --- /dev/null +++ b/.changeset/silent-lobsters-tease.md @@ -0,0 +1,5 @@ +--- +'@backstage/cli': patch +--- + +The backendPlugin factory now includes a step for automatically adding the new backend plugin to the `index.ts` file of the backend. From e09456b71141085d2f00971bf9d12cecc0bd9a33 Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Mon, 24 Jun 2024 15:32:05 +0200 Subject: [PATCH 03/13] chore: remove "import" Signed-off-by: Alper Altay --- packages/cli/src/lib/new/factories/backendPlugin.test.ts | 2 +- packages/cli/src/lib/new/factories/backendPlugin.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/cli/src/lib/new/factories/backendPlugin.test.ts b/packages/cli/src/lib/new/factories/backendPlugin.test.ts index c6196d8690..98d0fcba21 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.test.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.test.ts @@ -98,7 +98,7 @@ describe('backendPlugin factory', () => { 'Installing:', `moving plugins${sep}test-backend`, 'backend adding dependency', - 'backend adding import and plugin', + 'backend adding plugin', ]); await expect( diff --git a/packages/cli/src/lib/new/factories/backendPlugin.ts b/packages/cli/src/lib/new/factories/backendPlugin.ts index 06bc6bd366..39d6af39a2 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.ts @@ -79,7 +79,7 @@ export const backendPlugin = createFactory({ ); }); - await Task.forItem('backend', 'adding import and plugin', async () => { + await Task.forItem('backend', 'adding plugin', async () => { const backendFilePath = paths.resolveTargetRoot( 'packages/backend/src/index.ts', ); From f6581944cc17da9780c01d36c2c3166212bc67bd Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Mon, 24 Jun 2024 17:23:28 +0200 Subject: [PATCH 04/13] feat: adjust the test Signed-off-by: Alper Altay --- .../lib/new/factories/backendPlugin.test.ts | 29 ++++++++++--------- .../src/lib/new/factories/backendPlugin.ts | 27 ++++++----------- 2 files changed, 24 insertions(+), 32 deletions(-) diff --git a/packages/cli/src/lib/new/factories/backendPlugin.test.ts b/packages/cli/src/lib/new/factories/backendPlugin.test.ts index 98d0fcba21..425e0c5bd5 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.test.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.test.ts @@ -27,10 +27,10 @@ import { backendPlugin } from './backendPlugin'; import { createMockDirectory } from '@backstage/backend-test-utils'; const backendIndexTsContent = ` -import { createBackend } from '@backstage/backend-defaults'; - -const backend = createBackend(); - +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); + backend.start(); `; @@ -112,11 +112,11 @@ describe('backendPlugin factory', () => { await expect( fs.readFile(mockDir.resolve('packages/backend/src/index.ts'), 'utf8'), ).resolves.toBe(` -import { createBackend } from '@backstage/backend-defaults'; +import { createBackend } from '@backstage/backend-defaults'; -const backend = createBackend(); - -backend.add(import("backstage-plugin-test-backend")); +const backend = createBackend(); + +backend.add(import('backstage-plugin-test-backend')); backend.start(); `); @@ -174,12 +174,13 @@ backend.start(); await expect( fs.readFile(mockDir.resolve('packages/backend/src/index.ts'), 'utf8'), ).resolves.toBe(` -import { createBackend } from '@backstage/backend-defaults'; - -const backend = createBackend(); - -backend.add(import("@internal/backstage-plugin-test-backend")); -backend.start();`); +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); + +backend.add(import('@internal/backstage-plugin-test-backend')); +backend.start(); +`); expect(Task.forCommand).toHaveBeenCalledTimes(2); expect(Task.forCommand).toHaveBeenCalledWith('yarn install', { diff --git a/packages/cli/src/lib/new/factories/backendPlugin.ts b/packages/cli/src/lib/new/factories/backendPlugin.ts index 39d6af39a2..5848a72047 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.ts @@ -86,29 +86,20 @@ export const backendPlugin = createFactory({ if (!(await fs.pathExists(backendFilePath))) { return; } + const content = await fs.readFile(backendFilePath, 'utf8'); - const revLines = content.split('\n').reverse(); + const lines = content.split('\n'); + const backendAddLine = `backend.add(import('${name}'));`; - const lastImportIndex = revLines.findIndex(line => - line.match(/ from ("|').*("|')/), - ); - const lastBackendAddIndex = revLines.findIndex(line => - line.match(/backend.add/), + const backendStartIndex = lines.findIndex(line => + line.match(/backend.start/), ); - const backendAddLine = `backend.add(import("${name}"));`; + if (backendStartIndex !== -1) { + const [indentation] = lines[backendStartIndex].match(/^\s*/) ?? []; + lines.splice(backendStartIndex, 0, indentation + backendAddLine); - if (lastImportIndex !== -1 && lastBackendAddIndex !== -1) { - if (!content.includes(backendAddLine)) { - const [indentation] = - revLines[lastBackendAddIndex + 1].match(/^\s*/) ?? []; - revLines.splice( - lastBackendAddIndex + 1, - 0, - indentation + backendAddLine, - ); - } - const newContent = revLines.reverse().join('\n'); + const newContent = lines.join('\n'); await fs.writeFile(backendFilePath, newContent, 'utf8'); } }); From 23fc071b000e960a82f2e5904434c45952b97d8c Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Mon, 24 Jun 2024 17:31:34 +0200 Subject: [PATCH 05/13] feat: auto add modules to index.ts Signed-off-by: Alper Altay --- .../lib/new/factories/backendModule.test.ts | 23 +++++++++++++++++ .../src/lib/new/factories/backendModule.ts | 25 +++++++++++++++++++ 2 files changed, 48 insertions(+) diff --git a/packages/cli/src/lib/new/factories/backendModule.test.ts b/packages/cli/src/lib/new/factories/backendModule.test.ts index 78ef5f96bb..2d6a4c9c83 100644 --- a/packages/cli/src/lib/new/factories/backendModule.test.ts +++ b/packages/cli/src/lib/new/factories/backendModule.test.ts @@ -26,6 +26,14 @@ import { import { backendModule } from './backendModule'; import { createMockDirectory } from '@backstage/backend-test-utils'; +const backendIndexTsContent = ` +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); + +backend.start(); +`; + describe('backendModule factory', () => { const mockDir = createMockDirectory(); @@ -44,6 +52,9 @@ describe('backendModule factory', () => { packages: { backend: { 'package.json': JSON.stringify({}), + src: { + 'index.ts': backendIndexTsContent, + }, }, }, plugins: {}, @@ -86,8 +97,20 @@ describe('backendModule factory', () => { 'Installing:', `moving plugins${sep}test-backend-module-tester-two`, 'backend adding dependency', + 'backend adding module', ]); + await expect( + fs.readFile(mockDir.resolve('packages/backend/src/index.ts'), 'utf8'), + ).resolves.toBe(` +import { createBackend } from '@backstage/backend-defaults'; + +const backend = createBackend(); + +backend.add(import('backstage-plugin-test-backend-module-tester-two')); +backend.start(); +`); + await expect( fs.readJson(mockDir.resolve('packages/backend/package.json')), ).resolves.toEqual({ diff --git a/packages/cli/src/lib/new/factories/backendModule.ts b/packages/cli/src/lib/new/factories/backendModule.ts index 698146a229..e0c56b34ae 100644 --- a/packages/cli/src/lib/new/factories/backendModule.ts +++ b/packages/cli/src/lib/new/factories/backendModule.ts @@ -91,6 +91,31 @@ export const backendModule = createFactory({ }); } + await Task.forItem('backend', 'adding module', async () => { + const backendFilePath = paths.resolveTargetRoot( + 'packages/backend/src/index.ts', + ); + if (!(await fs.pathExists(backendFilePath))) { + return; + } + + const content = await fs.readFile(backendFilePath, 'utf8'); + const lines = content.split('\n'); + const backendAddLine = `backend.add(import('${name}'));`; + + const backendStartIndex = lines.findIndex(line => + line.match(/backend.start/), + ); + + if (backendStartIndex !== -1) { + const [indentation] = lines[backendStartIndex].match(/^\s*/) ?? []; + lines.splice(backendStartIndex, 0, indentation + backendAddLine); + + const newContent = lines.join('\n'); + await fs.writeFile(backendFilePath, newContent, 'utf8'); + } + }); + if (options.owner) { await addCodeownersEntry(`/plugins/${dirName}`, options.owner); } From 983d616d678e34e836be0cfbe0d7a92cab4eff4a Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Mon, 24 Jun 2024 17:32:39 +0200 Subject: [PATCH 06/13] feat: changeset Signed-off-by: Alper Altay --- .changeset/silent-lobsters-tease.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/silent-lobsters-tease.md b/.changeset/silent-lobsters-tease.md index e116818b7c..61a965236c 100644 --- a/.changeset/silent-lobsters-tease.md +++ b/.changeset/silent-lobsters-tease.md @@ -2,4 +2,4 @@ '@backstage/cli': patch --- -The backendPlugin factory now includes a step for automatically adding the new backend plugin to the `index.ts` file of the backend. +The backendPlugin and backendModule factory now includes a step for automatically adding the new backend plugin/module to the `index.ts` file of the backend. From 812afee13103aa1789b5a10c107950e9f49d4b02 Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Mon, 24 Jun 2024 17:35:14 +0200 Subject: [PATCH 07/13] feat: simplify test Signed-off-by: Alper Altay --- .../lib/new/factories/backendPlugin.test.ts | 66 +------------------ 1 file changed, 3 insertions(+), 63 deletions(-) diff --git a/packages/cli/src/lib/new/factories/backendPlugin.test.ts b/packages/cli/src/lib/new/factories/backendPlugin.test.ts index 425e0c5bd5..f6eeb8cf33 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.test.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.test.ts @@ -38,7 +38,9 @@ describe('backendPlugin factory', () => { const mockDir = createMockDirectory(); beforeEach(() => { - mockPaths({ targetRoot: mockDir.path }); + mockPaths({ + targetRoot: mockDir.path, + }); }); afterEach(() => { @@ -118,68 +120,6 @@ const backend = createBackend(); backend.add(import('backstage-plugin-test-backend')); backend.start(); -`); - - expect(Task.forCommand).toHaveBeenCalledTimes(2); - expect(Task.forCommand).toHaveBeenCalledWith('yarn install', { - cwd: mockDir.resolve('plugins/test-backend'), - optional: true, - }); - expect(Task.forCommand).toHaveBeenCalledWith('yarn lint --fix', { - cwd: mockDir.resolve('plugins/test-backend'), - optional: true, - }); - }); - - it('should create a backend plugin with more options and codeowners', async () => { - mockDir.setContent({ - CODEOWNERS: '', - packages: { - backend: { - 'package.json': JSON.stringify({}), - src: { - 'index.ts': backendIndexTsContent, - }, - }, - }, - plugins: {}, - }); - - const options = await FactoryRegistry.populateOptions(backendPlugin, { - id: 'test', - owner: '@test-user', - }); - - const [, mockStream] = createMockOutputStream(); - jest.spyOn(process, 'stderr', 'get').mockReturnValue(mockStream); - jest.spyOn(Task, 'forCommand').mockResolvedValue(); - - await backendPlugin.create(options, { - scope: 'internal', - private: true, - isMonoRepo: true, - defaultVersion: '1.0.0', - markAsModified: () => {}, - createTemporaryDirectory: () => fs.mkdtemp('test'), - }); - - await expect( - fs.readJson(mockDir.resolve('packages/backend/package.json')), - ).resolves.toEqual({ - dependencies: { - '@internal/backstage-plugin-test-backend': '^1.0.0', - }, - }); - - await expect( - fs.readFile(mockDir.resolve('packages/backend/src/index.ts'), 'utf8'), - ).resolves.toBe(` -import { createBackend } from '@backstage/backend-defaults'; - -const backend = createBackend(); - -backend.add(import('@internal/backstage-plugin-test-backend')); -backend.start(); `); expect(Task.forCommand).toHaveBeenCalledTimes(2); From 42227da4acd71ec360c0eb96bbd9aa077d2e83e4 Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Mon, 24 Jun 2024 17:55:48 +0200 Subject: [PATCH 08/13] chore: spelling Signed-off-by: Alper Altay --- .changeset/silent-lobsters-tease.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.changeset/silent-lobsters-tease.md b/.changeset/silent-lobsters-tease.md index 61a965236c..2dea26d8ff 100644 --- a/.changeset/silent-lobsters-tease.md +++ b/.changeset/silent-lobsters-tease.md @@ -2,4 +2,4 @@ '@backstage/cli': patch --- -The backendPlugin and backendModule factory now includes a step for automatically adding the new backend plugin/module to the `index.ts` file of the backend. +The `backendPlugin` and `backendModule` factory now includes a step for automatically adding the new backend plugin/module to the `index.ts` file of the backend. From a936761afefd680e87b8f04b3e96764ffdd0bb4a Mon Sep 17 00:00:00 2001 From: Alper Altay <43654387+alper98@users.noreply.github.com> Date: Tue, 25 Jun 2024 12:26:51 +0200 Subject: [PATCH 09/13] Update packages/cli/src/lib/new/factories/backendPlugin.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: Alper Altay <43654387+alper98@users.noreply.github.com> --- packages/cli/src/lib/new/factories/backendPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/lib/new/factories/backendPlugin.ts b/packages/cli/src/lib/new/factories/backendPlugin.ts index 5848a72047..e1bfac5eb8 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.ts @@ -97,7 +97,7 @@ export const backendPlugin = createFactory({ if (backendStartIndex !== -1) { const [indentation] = lines[backendStartIndex].match(/^\s*/) ?? []; - lines.splice(backendStartIndex, 0, indentation + backendAddLine); + lines.splice(backendStartIndex, 0, `${indentation}${backendAddLine}`); const newContent = lines.join('\n'); await fs.writeFile(backendFilePath, newContent, 'utf8'); From 1e88954016fb4e27cdd32b86b2918077cac2d20c Mon Sep 17 00:00:00 2001 From: Alper Altay <43654387+alper98@users.noreply.github.com> Date: Tue, 25 Jun 2024 12:27:10 +0200 Subject: [PATCH 10/13] Update packages/cli/src/lib/new/factories/backendPlugin.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Fredrik Adelöw Signed-off-by: Alper Altay <43654387+alper98@users.noreply.github.com> --- packages/cli/src/lib/new/factories/backendPlugin.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/cli/src/lib/new/factories/backendPlugin.ts b/packages/cli/src/lib/new/factories/backendPlugin.ts index e1bfac5eb8..c5cd043132 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.ts @@ -96,7 +96,7 @@ export const backendPlugin = createFactory({ ); if (backendStartIndex !== -1) { - const [indentation] = lines[backendStartIndex].match(/^\s*/) ?? []; + const [indentation] = lines[backendStartIndex].match(/^\s*/)!; lines.splice(backendStartIndex, 0, `${indentation}${backendAddLine}`); const newContent = lines.join('\n'); From e053c105f4a27fa29b76aea11a2a209c38664f49 Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Tue, 25 Jun 2024 12:38:10 +0200 Subject: [PATCH 11/13] chore: breaking out into function Signed-off-by: Alper Altay --- .../src/lib/new/factories/backendModule.ts | 28 +++------------- .../src/lib/new/factories/backendPlugin.ts | 28 +++------------- packages/cli/src/lib/tasks.ts | 32 +++++++++++++++++++ 3 files changed, 40 insertions(+), 48 deletions(-) diff --git a/packages/cli/src/lib/new/factories/backendModule.ts b/packages/cli/src/lib/new/factories/backendModule.ts index e0c56b34ae..8cfa7f1e00 100644 --- a/packages/cli/src/lib/new/factories/backendModule.ts +++ b/packages/cli/src/lib/new/factories/backendModule.ts @@ -20,7 +20,7 @@ import camelCase from 'lodash/camelCase'; import { paths } from '../../paths'; import { addCodeownersEntry, getCodeownersFilePath } from '../../codeowners'; import { CreateContext, createFactory } from '../types'; -import { addPackageDependency, Task } from '../../tasks'; +import { addPackageDependency, addToBackend, Task } from '../../tasks'; import { moduleIdIdPrompt, ownerPrompt, @@ -91,29 +91,9 @@ export const backendModule = createFactory({ }); } - await Task.forItem('backend', 'adding module', async () => { - const backendFilePath = paths.resolveTargetRoot( - 'packages/backend/src/index.ts', - ); - if (!(await fs.pathExists(backendFilePath))) { - return; - } - - const content = await fs.readFile(backendFilePath, 'utf8'); - const lines = content.split('\n'); - const backendAddLine = `backend.add(import('${name}'));`; - - const backendStartIndex = lines.findIndex(line => - line.match(/backend.start/), - ); - - if (backendStartIndex !== -1) { - const [indentation] = lines[backendStartIndex].match(/^\s*/) ?? []; - lines.splice(backendStartIndex, 0, indentation + backendAddLine); - - const newContent = lines.join('\n'); - await fs.writeFile(backendFilePath, newContent, 'utf8'); - } + await addToBackend(name, { + defaultVersion: ctx.defaultVersion, + type: 'module', }); if (options.owner) { diff --git a/packages/cli/src/lib/new/factories/backendPlugin.ts b/packages/cli/src/lib/new/factories/backendPlugin.ts index c5cd043132..d7bf33b033 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.ts @@ -20,7 +20,7 @@ import camelCase from 'lodash/camelCase'; import { paths } from '../../paths'; import { addCodeownersEntry, getCodeownersFilePath } from '../../codeowners'; import { CreateContext, createFactory } from '../types'; -import { addPackageDependency, Task } from '../../tasks'; +import { addPackageDependency, addToBackend, Task } from '../../tasks'; import { ownerPrompt, pluginIdPrompt } from './common/prompts'; import { executePluginPackageTemplate } from './common/tasks'; import { resolvePackageName } from './common/util'; @@ -79,29 +79,9 @@ export const backendPlugin = createFactory({ ); }); - await Task.forItem('backend', 'adding plugin', async () => { - const backendFilePath = paths.resolveTargetRoot( - 'packages/backend/src/index.ts', - ); - if (!(await fs.pathExists(backendFilePath))) { - return; - } - - const content = await fs.readFile(backendFilePath, 'utf8'); - const lines = content.split('\n'); - const backendAddLine = `backend.add(import('${name}'));`; - - const backendStartIndex = lines.findIndex(line => - line.match(/backend.start/), - ); - - if (backendStartIndex !== -1) { - const [indentation] = lines[backendStartIndex].match(/^\s*/)!; - lines.splice(backendStartIndex, 0, `${indentation}${backendAddLine}`); - - const newContent = lines.join('\n'); - await fs.writeFile(backendFilePath, newContent, 'utf8'); - } + await addToBackend(name, { + defaultVersion: ctx.defaultVersion, + type: 'plugin', }); } diff --git a/packages/cli/src/lib/tasks.ts b/packages/cli/src/lib/tasks.ts index 851f962c62..84362d7856 100644 --- a/packages/cli/src/lib/tasks.ts +++ b/packages/cli/src/lib/tasks.ts @@ -196,3 +196,35 @@ export async function addPackageDependency( throw new Error(`Failed to add package dependencies, ${error}`); } } + +export async function addToBackend( + name: string, + ctx: { defaultVersion: string; type: 'plugin' | 'module' }, +) { + if (await fs.pathExists(paths.resolveTargetRoot('packages/backend'))) { + await Task.forItem('backend', `adding ${ctx.type}`, async () => { + const backendFilePath = paths.resolveTargetRoot( + 'packages/backend/src/index.ts', + ); + if (!(await fs.pathExists(backendFilePath))) { + return; + } + + const content = await fs.readFile(backendFilePath, 'utf8'); + const lines = content.split('\n'); + const backendAddLine = `backend.add(import('${name}'));`; + + const backendStartIndex = lines.findIndex(line => + line.match(/backend.start/), + ); + + if (backendStartIndex !== -1) { + const [indentation] = lines[backendStartIndex].match(/^\s*/)!; + lines.splice(backendStartIndex, 0, `${indentation}${backendAddLine}`); + + const newContent = lines.join('\n'); + await fs.writeFile(backendFilePath, newContent, 'utf8'); + } + }); + } +} From f812183f6cf19f1f4a2a1f204304d84e7f539e90 Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Tue, 25 Jun 2024 12:41:53 +0200 Subject: [PATCH 12/13] chore: remove defaultversion Signed-off-by: Alper Altay --- packages/cli/src/lib/new/factories/backendModule.ts | 5 +---- packages/cli/src/lib/new/factories/backendPlugin.ts | 5 +---- packages/cli/src/lib/tasks.ts | 8 +++----- 3 files changed, 5 insertions(+), 13 deletions(-) diff --git a/packages/cli/src/lib/new/factories/backendModule.ts b/packages/cli/src/lib/new/factories/backendModule.ts index 8cfa7f1e00..2ace64e165 100644 --- a/packages/cli/src/lib/new/factories/backendModule.ts +++ b/packages/cli/src/lib/new/factories/backendModule.ts @@ -91,10 +91,7 @@ export const backendModule = createFactory({ }); } - await addToBackend(name, { - defaultVersion: ctx.defaultVersion, - type: 'module', - }); + await addToBackend(name, 'module'); if (options.owner) { await addCodeownersEntry(`/plugins/${dirName}`, options.owner); diff --git a/packages/cli/src/lib/new/factories/backendPlugin.ts b/packages/cli/src/lib/new/factories/backendPlugin.ts index d7bf33b033..8671ef9952 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.ts @@ -79,10 +79,7 @@ export const backendPlugin = createFactory({ ); }); - await addToBackend(name, { - defaultVersion: ctx.defaultVersion, - type: 'plugin', - }); + await addToBackend(name, 'plugin'); } if (options.owner) { diff --git a/packages/cli/src/lib/tasks.ts b/packages/cli/src/lib/tasks.ts index 84362d7856..11cf53bf4f 100644 --- a/packages/cli/src/lib/tasks.ts +++ b/packages/cli/src/lib/tasks.ts @@ -23,6 +23,7 @@ import { basename, dirname } from 'path'; import recursive from 'recursive-readdir'; import { exec as execCb } from 'child_process'; import { assertError } from '@backstage/errors'; +import { paths } from './paths'; const exec = promisify(execCb); @@ -197,12 +198,9 @@ export async function addPackageDependency( } } -export async function addToBackend( - name: string, - ctx: { defaultVersion: string; type: 'plugin' | 'module' }, -) { +export async function addToBackend(name: string, type: 'plugin' | 'module') { if (await fs.pathExists(paths.resolveTargetRoot('packages/backend'))) { - await Task.forItem('backend', `adding ${ctx.type}`, async () => { + await Task.forItem('backend', `adding ${type}`, async () => { const backendFilePath = paths.resolveTargetRoot( 'packages/backend/src/index.ts', ); From 9572fe40dff9adcc953a1e4a3573d45c3919f308 Mon Sep 17 00:00:00 2001 From: Alper Altay Date: Tue, 25 Jun 2024 12:45:58 +0200 Subject: [PATCH 13/13] chore: options instead of positional args Signed-off-by: Alper Altay --- packages/cli/src/lib/new/factories/backendModule.ts | 4 +++- packages/cli/src/lib/new/factories/backendPlugin.ts | 4 +++- packages/cli/src/lib/tasks.ts | 9 +++++++-- 3 files changed, 13 insertions(+), 4 deletions(-) diff --git a/packages/cli/src/lib/new/factories/backendModule.ts b/packages/cli/src/lib/new/factories/backendModule.ts index 2ace64e165..67860b812e 100644 --- a/packages/cli/src/lib/new/factories/backendModule.ts +++ b/packages/cli/src/lib/new/factories/backendModule.ts @@ -91,7 +91,9 @@ export const backendModule = createFactory({ }); } - await addToBackend(name, 'module'); + await addToBackend(name, { + type: 'module', + }); if (options.owner) { await addCodeownersEntry(`/plugins/${dirName}`, options.owner); diff --git a/packages/cli/src/lib/new/factories/backendPlugin.ts b/packages/cli/src/lib/new/factories/backendPlugin.ts index 8671ef9952..fc77896461 100644 --- a/packages/cli/src/lib/new/factories/backendPlugin.ts +++ b/packages/cli/src/lib/new/factories/backendPlugin.ts @@ -79,7 +79,9 @@ export const backendPlugin = createFactory({ ); }); - await addToBackend(name, 'plugin'); + await addToBackend(name, { + type: 'plugin', + }); } if (options.owner) { diff --git a/packages/cli/src/lib/tasks.ts b/packages/cli/src/lib/tasks.ts index 11cf53bf4f..ffff2892fb 100644 --- a/packages/cli/src/lib/tasks.ts +++ b/packages/cli/src/lib/tasks.ts @@ -198,9 +198,14 @@ export async function addPackageDependency( } } -export async function addToBackend(name: string, type: 'plugin' | 'module') { +export async function addToBackend( + name: string, + options: { + type: 'plugin' | 'module'; + }, +) { if (await fs.pathExists(paths.resolveTargetRoot('packages/backend'))) { - await Task.forItem('backend', `adding ${type}`, async () => { + await Task.forItem('backend', `adding ${options.type}`, async () => { const backendFilePath = paths.resolveTargetRoot( 'packages/backend/src/index.ts', );