Skip to content

Commit 285b730

Browse files
feat(API): Name exported package entities by slug and id (#37656)
Co-authored-by: Cursor <cursoragent@cursor.com>
1 parent 325feb3 commit 285b730

26 files changed

Lines changed: 821 additions & 604 deletions

packages/cli/src/modules/n8n-packages/__tests__/export-folder.integration.test.ts

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -243,7 +243,7 @@ describe('folder package export', () => {
243243
const { manifest, entries } = await readExport(stream);
244244

245245
const childEntry = manifest.workflows!.find(({ id }) => id === externalChild.id);
246-
expect(childEntry?.target).toBe('workflows/external-child');
246+
expect(childEntry?.target).toBe(`workflows/external-child-${externalChild.id}`);
247247
expect(entries.find((e) => e.name === `${childEntry!.target}/workflow.json`)).toBeDefined();
248248
expect(manifest.requirements?.workflows).toEqual([
249249
{ id: externalChild.id, name: externalChild.name, usedByWorkflows: [parent.id] },
@@ -317,7 +317,7 @@ describe('folder package export', () => {
317317
expect(folderShell(entries, grandchildEntry.target).parentFolderId).toBe(child.id);
318318
});
319319

320-
it('disambiguates same-named sibling folders by creation order', async () => {
320+
it('gives same-named sibling folders their own targets', async () => {
321321
const owner = await createOwner();
322322
const project = await createTeamProject('Project A', owner);
323323
const older = await createFolder(project, {
@@ -338,9 +338,9 @@ describe('folder package export', () => {
338338

339339
const olderTarget = manifest.folders!.find((f) => f.id === older.id)!.target;
340340
const newerTarget = manifest.folders!.find((f) => f.id === newer.id)!.target;
341-
// Oldest keeps the bare slug; the allocator suffixes the newer one.
342-
expect(olderTarget).toBe('folders/inprogress');
343-
expect(newerTarget).toBe('folders/inprogress-2');
341+
// Each keeps its own id, so neither target depends on which was created first.
342+
expect(olderTarget).toBe(`folders/inprogress-${older.id}`);
343+
expect(newerTarget).toBe(`folders/inprogress-${newer.id}`);
344344
});
345345

346346
it('re-roots an exported folder whose parent is left out of the export', async () => {
@@ -507,7 +507,7 @@ describe('folder package export — with contained workflows', () => {
507507
{
508508
id: variable.id,
509509
name: 'API_URL',
510-
target: 'variables/apiurl',
510+
target: `variables/apiurl-${variable.id}`,
511511
},
512512
]);
513513
expect(manifest.requirements).toEqual({
@@ -602,8 +602,7 @@ describe('folder package export — with contained workflows', () => {
602602
const subfolderTarget = manifest.folders!.find((f) => f.id === subfolder.id)!.target;
603603
const workflowTarget = manifest.workflows!.find((w) => w.id === workflow.id)!.target;
604604

605-
// The subfolder is suffixed; the workflow stays under the parent's container.
606-
expect(subfolderTarget).toMatch(/\/workflows-2$/);
605+
expect(subfolderTarget).toMatch(new RegExp(`/workflows-${subfolder.id}$`));
607606
expect(workflowTarget.startsWith(`${subfolderTarget}/`)).toBe(false);
608607
});
609608

packages/cli/src/modules/n8n-packages/__tests__/export-project-to-directory.integration.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,9 @@ describe('exportPackageToDirectory', () => {
5959
const manifest = await readJson('manifest.json');
6060
expect(manifest).toMatchObject({ packageFormatVersion: FORMAT_VERSION });
6161
expect(manifest.projects).toEqual([
62-
{ id: project.id, name: 'Alpha Project', target: 'projects/alpha-project' },
62+
{ id: project.id, name: 'Alpha Project', target: `projects/alpha-project-${project.id}` },
6363
]);
64-
expect(await readJson('projects/alpha-project/project.json')).toEqual({
64+
expect(await readJson(`projects/alpha-project-${project.id}/project.json`)).toEqual({
6565
id: project.id,
6666
name: 'Alpha Project',
6767
});
@@ -81,8 +81,8 @@ describe('exportPackageToDirectory', () => {
8181

8282
const manifest = await readJson('manifest.json');
8383
expect(manifest.projects).toEqual([
84-
{ id: alpha.id, name: 'Alpha Project', target: 'projects/alpha-project' },
85-
{ id: beta.id, name: 'Beta Project', target: 'projects/beta-project' },
84+
{ id: alpha.id, name: 'Alpha Project', target: `projects/alpha-project-${alpha.id}` },
85+
{ id: beta.id, name: 'Beta Project', target: `projects/beta-project-${beta.id}` },
8686
]);
8787
expect(await readdir(targetDir)).toEqual(expect.arrayContaining(['manifest.json', 'projects']));
8888
expect(result.counts.workflows).toBe(2);

packages/cli/src/modules/n8n-packages/__tests__/export-project.integration.test.ts

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -127,8 +127,16 @@ describe('project package export', () => {
127127
expect(manifest.projects).toHaveLength(2);
128128
expect(manifest.projects).toEqual(
129129
expect.arrayContaining([
130-
{ id: firstProject.id, name: 'Alpha Project', target: 'projects/alpha-project' },
131-
{ id: secondProject.id, name: 'Beta Project', target: 'projects/beta-project' },
130+
{
131+
id: firstProject.id,
132+
name: 'Alpha Project',
133+
target: `projects/alpha-project-${firstProject.id}`,
134+
},
135+
{
136+
id: secondProject.id,
137+
name: 'Beta Project',
138+
target: `projects/beta-project-${secondProject.id}`,
139+
},
132140
]),
133141
);
134142

0 commit comments

Comments
 (0)