From 04475226afac02e26f26ed6f0724862774dacc77 Mon Sep 17 00:00:00 2001 From: Samuel Stroschein <35429197+samuelstroschein@users.noreply.github.com> Date: Sat, 21 Dec 2024 18:38:39 -0500 Subject: [PATCH 1/3] salaries demo first step --- .../src/helper/demo-lix-file/cap-table.csv | 11 -- .../src/helper/demo-lix-file/demo-lix-file.ts | 132 ++++++++++++++++++ .../src/helper/demo-lix-file/demoLixFile.ts | 50 ------- .../helper/demo-lix-file/email-newsletter.csv | 4 - .../src/helper/demo-lix-file/salaries.csv | 61 ++++++++ packages/lix-file-manager/src/state.ts | 2 +- 6 files changed, 194 insertions(+), 66 deletions(-) delete mode 100644 packages/lix-file-manager/src/helper/demo-lix-file/cap-table.csv create mode 100644 packages/lix-file-manager/src/helper/demo-lix-file/demo-lix-file.ts delete mode 100644 packages/lix-file-manager/src/helper/demo-lix-file/demoLixFile.ts delete mode 100644 packages/lix-file-manager/src/helper/demo-lix-file/email-newsletter.csv create mode 100644 packages/lix-file-manager/src/helper/demo-lix-file/salaries.csv diff --git a/packages/lix-file-manager/src/helper/demo-lix-file/cap-table.csv b/packages/lix-file-manager/src/helper/demo-lix-file/cap-table.csv deleted file mode 100644 index cf2ca6338c..0000000000 --- a/packages/lix-file-manager/src/helper/demo-lix-file/cap-table.csv +++ /dev/null @@ -1,11 +0,0 @@ -Stakeholder,Share class,Outstanding,Outstading ownership ,Fully diluted,Fully diluted ownership ,total cash raised -Kalle Svensson ,Common,"6,000,000",60.000000%,"6,000,000",50.0000%,US$ 60.00 -Max Mustermann,Common,"4,000,000",40.000000%,"4,000,000",30.0000%,US$ 40.00 -John Smith,Common,9321,0.9321%,9321,0.9321%,US$ 0.04 -Joe Bloggs ,Common,2132,0.2132%,2132,0.2132%,- -Juan Pablo Fernández ,Common,12311,1.2311%,12311,1.2311%,- -Irene Corchado Resmella,Stock Option & Grant Plan,0,0.000000%,4213,0.4213%, -Jason Williams Venture Capital,Convertibles,0,0.000000%,0,0.0000%,"US$ 500,000.00" -Techno Capital,Convertibles,0,0.000000%,0,0.0000%,"US$ 1500,000.00" -Fresh Money Capital,Convertibles,0,0.000000%,0,0.0000%,"US$ 300,000.00" -Jane Doe ,-,0,0.000000%,0,0.0000%,- \ No newline at end of file diff --git a/packages/lix-file-manager/src/helper/demo-lix-file/demo-lix-file.ts b/packages/lix-file-manager/src/helper/demo-lix-file/demo-lix-file.ts new file mode 100644 index 0000000000..1790ed8748 --- /dev/null +++ b/packages/lix-file-manager/src/helper/demo-lix-file/demo-lix-file.ts @@ -0,0 +1,132 @@ +import { + createAccount, + createChangeSet, + createDiscussion, + fileQueueSettled, + Label, + Lix, + newLixFile, + openLixInMemory, + switchAccount, + toBlob, +} from "@lix-js/sdk"; +import { plugin as csvPlugin } from "@lix-js/plugin-csv"; +import minimalCsv from "./minimal.csv?raw"; +import salariesCsv from "./salaries.csv?raw"; + +export async function lixCsvDemoFile(): Promise<{ blob: Blob; id: string }> { + const lix = await openLixInMemory({ + blob: await newLixFile(), + providePlugins: [csvPlugin], + }); + + const id = await lix.db + .selectFrom("key_value") + .where("key", "=", "lix_id") + .select("value") + .executeTakeFirstOrThrow(); + + // if (import.meta.env.PROD) { + console.log("creating demo salaries csv"); + await demoSalariesCsv(lix); + // } else { + // New files get minimal demo csv for development purposes + // await lix.db + // .insertInto("file") + // .values({ + // path: "/minimal.csv", + // data: new TextEncoder().encode(minimalCsv), + // metadata: { + // unique_column: "email", + // }, + // }) + // .execute(); + // } + + await fileQueueSettled({ lix }); + return { blob: await toBlob({ lix }), id: id.value }; +} + +async function demoSalariesCsv(lix: Lix): Promise { + debugger; + + const anna = await createAccount({ + lix, + name: "Anna", + }); + const otto = await createAccount({ + lix, + name: "Otto", + }); + const peter = await createAccount({ + lix, + name: "Peter", + }); + + const confirmedLabel = await lix.db + .selectFrom("label") + .where("name", "=", "confirmed") + .selectAll() + .executeTakeFirstOrThrow(); + + const rows = salariesCsv.split("\n"); + + await switchAccount({ lix, to: [anna] }); + + // inserting the first 20 rows of the csv (+ header) + const file = await lix.db + .insertInto("file") + .values({ + path: "/salaries.csv", + data: new TextEncoder().encode(rows.slice(0, 21).join("\n")), + metadata: { + unique_column: "Name", + }, + }) + .returning("id") + .executeTakeFirstOrThrow(); + + // anna is confirming the initial salaries + await confirmChanges({ + lix, + file, + confirmedLabel, + comment: "Initial salaries", + }); + + console.log("inserting demo change"); +} + +async function confirmChanges(args: { + lix: Lix; + file: { id: string }; + confirmedLabel: Label; + comment: string; +}) { + await fileQueueSettled({ lix: args.lix }); + + const changes = await args.lix.db + .selectFrom("change") + .selectAll() + .where("file_id", "=", args.file.id) + .execute(); + + const changeSet = await createChangeSet({ + lix: args.lix, + changes, + }); + + await createDiscussion({ + changeSet, + lix: args.lix, + firstComment: { content: "Initial salaries" }, + }); + + await args.lix.db + .insertInto("change_set_label") + .values({ + change_set_id: changeSet.id, + label_id: args.confirmedLabel.id, + }) + .execute(); +} diff --git a/packages/lix-file-manager/src/helper/demo-lix-file/demoLixFile.ts b/packages/lix-file-manager/src/helper/demo-lix-file/demoLixFile.ts deleted file mode 100644 index 6c737dfcad..0000000000 --- a/packages/lix-file-manager/src/helper/demo-lix-file/demoLixFile.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { - fileQueueSettled, - newLixFile, - openLixInMemory, - toBlob, -} from "@lix-js/sdk"; -import { plugin as csvPlugin } from "@lix-js/plugin-csv"; -import emailNewsletterCsv from "./email-newsletter.csv?raw"; -import minimalCsv from "./minimal.csv?raw"; - -export async function lixCsvDemoFile(): Promise<{ blob: Blob; id: string }> { - const lix = await openLixInMemory({ - blob: await newLixFile(), - providePlugins: [csvPlugin], - }); - - const id = await lix.db - .selectFrom("key_value") - .where("key", "=", "lix_id") - .select("value") - .executeTakeFirstOrThrow(); - - if (import.meta.env.PROD) { - await lix.db - .insertInto("file") - .values({ - path: "/email-newsletter.csv", - data: new TextEncoder().encode(emailNewsletterCsv), - metadata: { - unique_column: "email", - }, - }) - .execute(); - } else { - // New files get minimal demo csv for development purposes - await lix.db - .insertInto("file") - .values({ - path: "/minimal.csv", - data: new TextEncoder().encode(minimalCsv), - metadata: { - unique_column: "email", - }, - }) - .execute(); - } - - await fileQueueSettled({ lix }); - return { blob: await toBlob({ lix }), id: id.value }; -} diff --git a/packages/lix-file-manager/src/helper/demo-lix-file/email-newsletter.csv b/packages/lix-file-manager/src/helper/demo-lix-file/email-newsletter.csv deleted file mode 100644 index fafd8b0fb7..0000000000 --- a/packages/lix-file-manager/src/helper/demo-lix-file/email-newsletter.csv +++ /dev/null @@ -1,4 +0,0 @@ -email;First name;Last name -rachel@demo.com;Rachel;Booker -peter.n@moon.mail;Peter;Newman -anna@post.de;Anna;Jakob \ No newline at end of file diff --git a/packages/lix-file-manager/src/helper/demo-lix-file/salaries.csv b/packages/lix-file-manager/src/helper/demo-lix-file/salaries.csv new file mode 100644 index 0000000000..602c83b86d --- /dev/null +++ b/packages/lix-file-manager/src/helper/demo-lix-file/salaries.csv @@ -0,0 +1,61 @@ +Name,Position,Department,Salary +John Doe,Software Engineer,Engineering,90000 +Jane Smith,Product Manager,Product,95000 +Alice Johnson,Data Scientist,Data,100000 +Bob Brown,Designer,Design,85000 +Charlie Davis,Marketing Specialist,Marketing,70000 +Emily Wilson,HR Manager,HR,75000 +Frank Miller,Sales Manager,Sales,80000 +Grace Lee,Customer Support,Support,60000 +Henry Clark,DevOps Engineer,Engineering,95000 +Ivy Lewis,QA Engineer,Engineering,85000 +Jack Walker,Software Engineer,Engineering,92000 +Karen Hall,Product Manager,Product,97000 +Larry Young,Data Scientist,Data,102000 +Megan King,Designer,Design,87000 +Nathan Scott,Marketing Specialist,Marketing,72000 +Olivia Green,HR Manager,HR,77000 +Paul Adams,Sales Manager,Sales,82000 +Quincy Baker,Customer Support,Support,62000 +Rachel Carter,DevOps Engineer,Engineering,97000 +Steve Evans,QA Engineer,Engineering,87000 +Tina Foster,Software Engineer,Engineering,94000 +Uma Harris,Product Manager,Product,99000 +Victor James,Data Scientist,Data,104000 +Wendy Kelly,Designer,Design,89000 +Xander Lopez,Marketing Specialist,Marketing,74000 +Yvonne Martinez,HR Manager,HR,79000 +Zachary Nelson,Sales Manager,Sales,84000 +Amy Ortiz,Customer Support,Support,64000 +Brian Perez,DevOps Engineer,Engineering,99000 +Cathy Quinn,QA Engineer,Engineering,89000 +David Roberts,Software Engineer,Engineering,96000 +Ella Sanchez,Product Manager,Product,101000 +Fred Thompson,Data Scientist,Data,106000 +Gina Underwood,Designer,Design,91000 +Hank Vance,Marketing Specialist,Marketing,76000 +Isla White,HR Manager,HR,81000 +Jake Xiong,Sales Manager,Sales,86000 +Kara Young,Customer Support,Support,66000 +Leo Zimmerman,DevOps Engineer,Engineering,101000 +Mia Allen,QA Engineer,Engineering,91000 +Noah Baker,Software Engineer,Engineering,98000 +Olivia Clark,Product Manager,Product,103000 +Peter Davis,Data Scientist,Data,108000 +Quinn Evans,Designer,Design,93000 +Riley Foster,Marketing Specialist,Marketing,78000 +Sophia Green,HR Manager,HR,83000 +Thomas Harris,Sales Manager,Sales,88000 +Ursula Johnson,Customer Support,Support,68000 +Victor King,DevOps Engineer,Engineering,103000 +Walter Meyer,QA Engineer,Engineering,93000 +Xenia Neumann,Software Engineer,Engineering,100000 +Yannick Otto,Product Manager,Product,105000 +Zoe Peters,Data Scientist,Data,110000 +Anton Richter,Designer,Design,95000 +Bettina Schmidt,Marketing Specialist,Marketing,80000 +Clara Teichmann,HR Manager,HR,85000 +Dieter Ulrich,Sales Manager,Sales,90000 +Eva Vogel,Customer Support,Support,70000 +Felix Weber,DevOps Engineer,Engineering,105000 +Greta Xander,QA Engineer,Engineering,95000 diff --git a/packages/lix-file-manager/src/state.ts b/packages/lix-file-manager/src/state.ts index d47e6f13d0..5379524150 100644 --- a/packages/lix-file-manager/src/state.ts +++ b/packages/lix-file-manager/src/state.ts @@ -8,7 +8,7 @@ import { import { atom } from "jotai"; import { plugin as csvPlugin } from "@lix-js/plugin-csv"; import { getOriginPrivateDirectory } from "native-file-system-adapter"; -import { lixCsvDemoFile } from "./helper/demo-lix-file/demoLixFile.ts"; +import { lixCsvDemoFile } from "./helper/demo-lix-file/demo-lix-file.ts"; import { saveLixToOpfs } from "./helper/saveLixToOpfs.ts"; export const fileIdSearchParamsAtom = atom((get) => { From 4906e016bc0eb1b9ac2acfc0d4717c73eda649bc Mon Sep 17 00:00:00 2001 From: Samuel Stroschein <35429197+samuelstroschein@users.noreply.github.com> Date: Sat, 21 Dec 2024 20:22:51 -0500 Subject: [PATCH 2/3] add salary example --- .../src/helper/demo-lix-file/demo-lix-file.ts | 189 +++++++++++++++--- .../src/helper/demo-lix-file/salaries.csv | 61 ------ 2 files changed, 161 insertions(+), 89 deletions(-) delete mode 100644 packages/lix-file-manager/src/helper/demo-lix-file/salaries.csv diff --git a/packages/lix-file-manager/src/helper/demo-lix-file/demo-lix-file.ts b/packages/lix-file-manager/src/helper/demo-lix-file/demo-lix-file.ts index 1790ed8748..850a052c04 100644 --- a/packages/lix-file-manager/src/helper/demo-lix-file/demo-lix-file.ts +++ b/packages/lix-file-manager/src/helper/demo-lix-file/demo-lix-file.ts @@ -1,6 +1,8 @@ import { + changeHasLabel, createAccount, createChangeSet, + createComment, createDiscussion, fileQueueSettled, Label, @@ -11,8 +13,6 @@ import { toBlob, } from "@lix-js/sdk"; import { plugin as csvPlugin } from "@lix-js/plugin-csv"; -import minimalCsv from "./minimal.csv?raw"; -import salariesCsv from "./salaries.csv?raw"; export async function lixCsvDemoFile(): Promise<{ blob: Blob; id: string }> { const lix = await openLixInMemory({ @@ -26,30 +26,13 @@ export async function lixCsvDemoFile(): Promise<{ blob: Blob; id: string }> { .select("value") .executeTakeFirstOrThrow(); - // if (import.meta.env.PROD) { - console.log("creating demo salaries csv"); await demoSalariesCsv(lix); - // } else { - // New files get minimal demo csv for development purposes - // await lix.db - // .insertInto("file") - // .values({ - // path: "/minimal.csv", - // data: new TextEncoder().encode(minimalCsv), - // metadata: { - // unique_column: "email", - // }, - // }) - // .execute(); - // } await fileQueueSettled({ lix }); return { blob: await toBlob({ lix }), id: id.value }; } async function demoSalariesCsv(lix: Lix): Promise { - debugger; - const anna = await createAccount({ lix, name: "Anna", @@ -63,22 +46,32 @@ async function demoSalariesCsv(lix: Lix): Promise { name: "Peter", }); + const rows = [ + "Name,Position,Department,Salary", + "John Doe,Software Engineer,Engineering,90000", + "Jane Smith,Product Manager,Product,95000", + "Alice Johnson,Data Scientist,Data,100000", + "Bob Brown,Designer,Design,85000", + "Charlie Davis,Marketing Specialist,Marketing,70000", + "Emily Wilson,HR Manager,HR,75000", + "Frank Miller,Sales Manager,Sales,80000", + "Grace Lee,Customer Support,Support,60000", + "Henry Clark,DevOps Engineer,Engineering,95000", + ]; + const confirmedLabel = await lix.db .selectFrom("label") .where("name", "=", "confirmed") .selectAll() .executeTakeFirstOrThrow(); - const rows = salariesCsv.split("\n"); - await switchAccount({ lix, to: [anna] }); - // inserting the first 20 rows of the csv (+ header) const file = await lix.db .insertInto("file") .values({ path: "/salaries.csv", - data: new TextEncoder().encode(rows.slice(0, 21).join("\n")), + data: new TextEncoder().encode(rows.join("\n")), metadata: { unique_column: "Name", }, @@ -87,39 +80,177 @@ async function demoSalariesCsv(lix: Lix): Promise { .executeTakeFirstOrThrow(); // anna is confirming the initial salaries - await confirmChanges({ + await createAndConfimChanges({ lix, file, + rows, + timestamp: "2022-03-11 14:53:00.000", confirmedLabel, comment: "Initial salaries", }); - console.log("inserting demo change"); + // Otto increases the salary of Charlie Davis + await switchAccount({ lix, to: [otto] }); + + rows[5] = "Charlie Davis,Marketing Specialist,Marketing,74000"; + + await createAndConfimChanges({ + lix, + file, + rows, + timestamp: "2022-04-14 19:53:00.000", + confirmedLabel, + comment: "Increased Charlie Davis salary", + }); + + // Peter promotes Alice Johnson + await switchAccount({ lix, to: [peter] }); + + rows[2] = "Alice Johnson,Senior Data Scientist,Data,110000"; + + await createAndConfimChanges({ + lix, + file, + rows, + timestamp: "2022-05-11 14:53:00.000", + confirmedLabel, + comment: "Promoted Alice Johnson to Senior Data Scientist", + }); + + // Peter hires a new employee + rows.push("Klaus Kleber,Intern,HR,40000"); + + const { discussion } = await createAndConfimChanges({ + lix, + file, + rows, + timestamp: "2022-05-13 14:53:00.000", + confirmedLabel, + comment: "Hired Klaus Kleber", + }); + + // Anna thinks the salary is too low of Klaus Kleber + await switchAccount({ lix, to: [anna] }); + + const annasComment = await createComment({ + lix, + parentComment: discussion.firstComment, + content: "I think the salary is too low. Adjust to 45000?", + }); + + // Otto agrees with Anna + await switchAccount({ lix, to: [otto] }); + + const ottosComment = await createComment({ + lix, + parentComment: annasComment, + content: "I agree. Adjust to 45000.", + }); + + // Peter agrees with Anna and Otto + await switchAccount({ lix, to: [peter] }); + + await createComment({ + lix, + parentComment: ottosComment, + content: "Aye from me as well", + }); + + // Anna adjusts the salary + await switchAccount({ lix, to: [anna] }); + + rows[10] = "Klaus Kleber,Intern,HR,45000"; + + await createAndConfimChanges({ + lix, + file, + rows, + timestamp: "2022-05-14 11:42:00.000", + confirmedLabel, + comment: "Increased Klaus Kleber salary", + }); + + // Peter promotes Klaus Kleber + + await switchAccount({ lix, to: [peter] }); + + rows[10] = "Klaus Kleber,Junior HR Manager,HR,60000"; + + await createAndConfimChanges({ + lix, + file, + rows, + timestamp: "2023-01-01 10:45:00.000", + confirmedLabel, + comment: "Hired Klaus Kleber after intern period", + }); + + // Anna updates the salary bands + + await switchAccount({ lix, to: [anna] }); + + // skip header row + for (const row of rows.slice(1)) { + const [name, position, department, salary] = row.split(","); + const salaryInt = parseInt(salary); + rows[rows.indexOf(row)] = + `${name},${position},${department},${(salaryInt * 1.1).toFixed(0)}`; + } + + await createAndConfimChanges({ + lix, + file, + rows, + timestamp: "2023-02-01 10:45:00.000", + confirmedLabel, + comment: "Updated salary bands", + }); } -async function confirmChanges(args: { +async function createAndConfimChanges(args: { lix: Lix; file: { id: string }; + rows: string[]; + timestamp: string; confirmedLabel: Label; comment: string; }) { + await args.lix.db + .updateTable("file") + .set({ + data: new TextEncoder().encode(args.rows.join("\n")), + }) + .where("id", "=", args.file.id) + .execute(); + await fileQueueSettled({ lix: args.lix }); const changes = await args.lix.db .selectFrom("change") .selectAll() + // don't copy changes that are already confirmed + .where((eb) => eb.not(changeHasLabel("confirmed"))) .where("file_id", "=", args.file.id) .execute(); + // set the time + for (const change of changes) { + await args.lix.db + .updateTable("change") + .set({ created_at: args.timestamp }) + .where("id", "=", change.id) + .execute(); + } + const changeSet = await createChangeSet({ lix: args.lix, changes, }); - await createDiscussion({ + const discussion = await createDiscussion({ changeSet, lix: args.lix, - firstComment: { content: "Initial salaries" }, + firstComment: { content: args.comment }, }); await args.lix.db @@ -129,4 +260,6 @@ async function confirmChanges(args: { label_id: args.confirmedLabel.id, }) .execute(); + + return { discussion }; } diff --git a/packages/lix-file-manager/src/helper/demo-lix-file/salaries.csv b/packages/lix-file-manager/src/helper/demo-lix-file/salaries.csv deleted file mode 100644 index 602c83b86d..0000000000 --- a/packages/lix-file-manager/src/helper/demo-lix-file/salaries.csv +++ /dev/null @@ -1,61 +0,0 @@ -Name,Position,Department,Salary -John Doe,Software Engineer,Engineering,90000 -Jane Smith,Product Manager,Product,95000 -Alice Johnson,Data Scientist,Data,100000 -Bob Brown,Designer,Design,85000 -Charlie Davis,Marketing Specialist,Marketing,70000 -Emily Wilson,HR Manager,HR,75000 -Frank Miller,Sales Manager,Sales,80000 -Grace Lee,Customer Support,Support,60000 -Henry Clark,DevOps Engineer,Engineering,95000 -Ivy Lewis,QA Engineer,Engineering,85000 -Jack Walker,Software Engineer,Engineering,92000 -Karen Hall,Product Manager,Product,97000 -Larry Young,Data Scientist,Data,102000 -Megan King,Designer,Design,87000 -Nathan Scott,Marketing Specialist,Marketing,72000 -Olivia Green,HR Manager,HR,77000 -Paul Adams,Sales Manager,Sales,82000 -Quincy Baker,Customer Support,Support,62000 -Rachel Carter,DevOps Engineer,Engineering,97000 -Steve Evans,QA Engineer,Engineering,87000 -Tina Foster,Software Engineer,Engineering,94000 -Uma Harris,Product Manager,Product,99000 -Victor James,Data Scientist,Data,104000 -Wendy Kelly,Designer,Design,89000 -Xander Lopez,Marketing Specialist,Marketing,74000 -Yvonne Martinez,HR Manager,HR,79000 -Zachary Nelson,Sales Manager,Sales,84000 -Amy Ortiz,Customer Support,Support,64000 -Brian Perez,DevOps Engineer,Engineering,99000 -Cathy Quinn,QA Engineer,Engineering,89000 -David Roberts,Software Engineer,Engineering,96000 -Ella Sanchez,Product Manager,Product,101000 -Fred Thompson,Data Scientist,Data,106000 -Gina Underwood,Designer,Design,91000 -Hank Vance,Marketing Specialist,Marketing,76000 -Isla White,HR Manager,HR,81000 -Jake Xiong,Sales Manager,Sales,86000 -Kara Young,Customer Support,Support,66000 -Leo Zimmerman,DevOps Engineer,Engineering,101000 -Mia Allen,QA Engineer,Engineering,91000 -Noah Baker,Software Engineer,Engineering,98000 -Olivia Clark,Product Manager,Product,103000 -Peter Davis,Data Scientist,Data,108000 -Quinn Evans,Designer,Design,93000 -Riley Foster,Marketing Specialist,Marketing,78000 -Sophia Green,HR Manager,HR,83000 -Thomas Harris,Sales Manager,Sales,88000 -Ursula Johnson,Customer Support,Support,68000 -Victor King,DevOps Engineer,Engineering,103000 -Walter Meyer,QA Engineer,Engineering,93000 -Xenia Neumann,Software Engineer,Engineering,100000 -Yannick Otto,Product Manager,Product,105000 -Zoe Peters,Data Scientist,Data,110000 -Anton Richter,Designer,Design,95000 -Bettina Schmidt,Marketing Specialist,Marketing,80000 -Clara Teichmann,HR Manager,HR,85000 -Dieter Ulrich,Sales Manager,Sales,90000 -Eva Vogel,Customer Support,Support,70000 -Felix Weber,DevOps Engineer,Engineering,105000 -Greta Xander,QA Engineer,Engineering,95000 From be92eb85efe891cd0743cdab20abbb5e0b29e4d4 Mon Sep 17 00:00:00 2001 From: Samuel Stroschein <35429197+samuelstroschein@users.noreply.github.com> Date: Sat, 21 Dec 2024 20:23:25 -0500 Subject: [PATCH 3/3] add changeset --- .changeset/chilly-falcons-rhyme.md | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 .changeset/chilly-falcons-rhyme.md diff --git a/.changeset/chilly-falcons-rhyme.md b/.changeset/chilly-falcons-rhyme.md new file mode 100644 index 0000000000..3db4740925 --- /dev/null +++ b/.changeset/chilly-falcons-rhyme.md @@ -0,0 +1,5 @@ +--- +"lix-file-manager": patch +--- + +replaces newsletter example with salary example that has changes