@inlang/sdk 2.0.0-beta.5 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/services/env-variables/index.js +3 -3
- package/dist/services/env-variables/index.js.map +1 -1
- package/package.json +3 -3
- package/dist/project/state/id$.d.ts +0 -6
- package/dist/project/state/id$.d.ts.map +0 -1
- package/dist/project/state/id$.js +0 -19
- package/dist/project/state/id$.js.map +0 -1
- package/dist/project/state/id$.test.d.ts +0 -2
- package/dist/project/state/id$.test.d.ts.map +0 -1
- package/dist/project/state/id$.test.js +0 -36
- package/dist/project/state/id$.test.js.map +0 -1
- package/dist/project/state/setSettings.d.ts +0 -7
- package/dist/project/state/setSettings.d.ts.map +0 -1
- package/dist/project/state/setSettings.js +0 -16
- package/dist/project/state/setSettings.js.map +0 -1
- package/dist/project/state/setSettings.test.d.ts +0 -2
- package/dist/project/state/setSettings.test.d.ts.map +0 -1
- package/dist/project/state/setSettings.test.js +0 -58
- package/dist/project/state/setSettings.test.js.map +0 -1
- package/dist/project/state/settings$.d.ts +0 -7
- package/dist/project/state/settings$.d.ts.map +0 -1
- package/dist/project/state/settings$.js +0 -21
- package/dist/project/state/settings$.js.map +0 -1
- package/dist/project/state/settings$.test.d.ts +0 -2
- package/dist/project/state/settings$.test.d.ts.map +0 -1
- package/dist/project/state/settings$.test.js +0 -51
- package/dist/project/state/settings$.test.js.map +0 -1
- package/dist/project/state/state.d.ts +0 -58
- package/dist/project/state/state.d.ts.map +0 -1
- package/dist/project/state/state.js +0 -67
- package/dist/project/state/state.js.map +0 -1
- package/dist/project/state/state.test.d.ts +0 -2
- package/dist/project/state/state.test.d.ts.map +0 -1
- package/dist/project/state/state.test.js +0 -103
- package/dist/project/state/state.test.js.map +0 -1
- package/dist/query-utilities/pollQuery.d.ts +0 -14
- package/dist/query-utilities/pollQuery.d.ts.map +0 -1
- package/dist/query-utilities/pollQuery.js +0 -22
- package/dist/query-utilities/pollQuery.js.map +0 -1
- package/dist/query-utilities/pollQuery.test.d.ts +0 -2
- package/dist/query-utilities/pollQuery.test.d.ts.map +0 -1
- package/dist/query-utilities/pollQuery.test.js +0 -67
- package/dist/query-utilities/pollQuery.test.js.map +0 -1
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="
|
|
2
|
+
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="f3e983ce-c068-5854-aaf3-d4facbf432f5")}catch(e){}}();
|
|
3
3
|
export const ENV_VARIABLES = {
|
|
4
4
|
PUBLIC_POSTHOG_TOKEN: "phc_m5yJZCxjOGxF8CJvP5sQ3H0d76xpnLrsmiZHduT4jDz",
|
|
5
5
|
PUBLIC_INLANG_SDK_SENTRY_DSN: "https://c3d92d5d011122e525e9f9b368e0905d@o4504345873285120.ingest.us.sentry.io/4507903389335553",
|
|
6
|
-
SDK_VERSION: "2.0.0
|
|
6
|
+
SDK_VERSION: "2.0.0",
|
|
7
7
|
};
|
|
8
8
|
//# sourceMappingURL=index.js.map
|
|
9
|
-
//# debugId=
|
|
9
|
+
//# debugId=f3e983ce-c068-5854-aaf3-d4facbf432f5
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sources":["services/env-variables/index.ts"],"sourceRoot":"/","sourcesContent":["\nexport const ENV_VARIABLES = {\n PUBLIC_POSTHOG_TOKEN: \"phc_m5yJZCxjOGxF8CJvP5sQ3H0d76xpnLrsmiZHduT4jDz\",\n\tPUBLIC_INLANG_SDK_SENTRY_DSN: \"https://c3d92d5d011122e525e9f9b368e0905d@o4504345873285120.ingest.us.sentry.io/4507903389335553\",\n\tSDK_VERSION: \"2.0.0
|
|
1
|
+
{"version":3,"file":"index.js","sources":["services/env-variables/index.ts"],"sourceRoot":"/","sourcesContent":["\nexport const ENV_VARIABLES = {\n PUBLIC_POSTHOG_TOKEN: \"phc_m5yJZCxjOGxF8CJvP5sQ3H0d76xpnLrsmiZHduT4jDz\",\n\tPUBLIC_INLANG_SDK_SENTRY_DSN: \"https://c3d92d5d011122e525e9f9b368e0905d@o4504345873285120.ingest.us.sentry.io/4507903389335553\",\n\tSDK_VERSION: \"2.0.0\",\n}\n"],"names":[],"mappings":";;AACA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,oBAAoB,EAAE,iDAAiD;IACxE,4BAA4B,EAAE,iGAAiG;IAC/H,WAAW,EAAE,OAAO;CACpB,CAAA","debug_id":"f3e983ce-c068-5854-aaf3-d4facbf432f5"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@inlang/sdk",
|
|
3
|
-
"version": "2.0.0
|
|
3
|
+
"version": "2.0.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"publishConfig": {
|
|
@@ -31,8 +31,8 @@
|
|
|
31
31
|
"@sinclair/typebox": "^0.31.17",
|
|
32
32
|
"kysely": "^0.27.4",
|
|
33
33
|
"uuid": "^10.0.0",
|
|
34
|
-
"
|
|
35
|
-
"
|
|
34
|
+
"sqlite-wasm-kysely": "0.1.1",
|
|
35
|
+
"@lix-js/sdk": "0.3.2"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@eslint/js": "^9.12.0",
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id$.d.ts","sourceRoot":"/","sources":["project/state/id$.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAsB,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AAG3D,wBAAgB,SAAS,CAAC,IAAI,EAAE;IAAE,GAAG,EAAE,GAAG,CAAA;CAAE,GAAG,UAAU,CAAC,MAAM,CAAC,CAgBhE"}
|
|
@@ -1,19 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2e852089-6f85-5528-9e76-daee826f6a0e")}catch(e){}}();
|
|
3
|
-
import {} from "@lix-js/sdk";
|
|
4
|
-
import { filter, map, share } from "rxjs";
|
|
5
|
-
import { pollQuery } from "../../query-utilities/pollQuery.js";
|
|
6
|
-
export function createId$(args) {
|
|
7
|
-
const settings$ = pollQuery(() => args.lix.db
|
|
8
|
-
.selectFrom("file")
|
|
9
|
-
.where("path", "=", "/project_id")
|
|
10
|
-
.selectAll()
|
|
11
|
-
.executeTakeFirst()).pipe(
|
|
12
|
-
// undefined can happen if a project has no id yet
|
|
13
|
-
// the project id will be automatically generated
|
|
14
|
-
// shortly after
|
|
15
|
-
filter((file) => file !== undefined), map((file) => new TextDecoder().decode(file.data)), share());
|
|
16
|
-
return settings$;
|
|
17
|
-
}
|
|
18
|
-
//# sourceMappingURL=id$.js.map
|
|
19
|
-
//# debugId=2e852089-6f85-5528-9e76-daee826f6a0e
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id$.js","sources":["project/state/id$.ts"],"sourceRoot":"/","sourcesContent":["import { type Lix } from \"@lix-js/sdk\";\nimport { filter, map, share, type Observable } from \"rxjs\";\nimport { pollQuery } from \"../../query-utilities/pollQuery.js\";\n\nexport function createId$(args: { lix: Lix }): Observable<string> {\n\tconst settings$ = pollQuery(() =>\n\t\targs.lix.db\n\t\t\t.selectFrom(\"file\")\n\t\t\t.where(\"path\", \"=\", \"/project_id\")\n\t\t\t.selectAll()\n\t\t\t.executeTakeFirst()\n\t).pipe(\n\t\t// undefined can happen if a project has no id yet\n\t\t// the project id will be automatically generated\n\t\t// shortly after\n\t\tfilter((file) => file !== undefined),\n\t\tmap((file) => new TextDecoder().decode(file.data)),\n\t\tshare()\n\t);\n\treturn settings$;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAY,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,KAAK,EAAmB,MAAM,MAAM,CAAC;AAC3D,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAE/D,MAAM,UAAU,SAAS,CAAC,IAAkB;IAC3C,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,EAAE,CAChC,IAAI,CAAC,GAAG,CAAC,EAAE;SACT,UAAU,CAAC,MAAM,CAAC;SAClB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,CAAC;SACjC,SAAS,EAAE;SACX,gBAAgB,EAAE,CACpB,CAAC,IAAI;IACL,kDAAkD;IAClD,iDAAiD;IACjD,gBAAgB;IAChB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,SAAS,CAAC,EACpC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,EAClD,KAAK,EAAE,CACP,CAAC;IACF,OAAO,SAAS,CAAC;AAClB,CAAC","debug_id":"2e852089-6f85-5528-9e76-daee826f6a0e"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id$.test.d.ts","sourceRoot":"/","sources":["project/state/id$.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,36 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="2a79efd3-90f3-5a3b-a3e1-36748848c455")}catch(e){}}();
|
|
3
|
-
import { expect, test } from "vitest";
|
|
4
|
-
import { newLixFile, openLixInMemory } from "@lix-js/sdk";
|
|
5
|
-
import { firstValueFrom } from "rxjs";
|
|
6
|
-
import { createId$ } from "./id$.js";
|
|
7
|
-
test("if the settings file has been updated in lix, the observable should emit the new id", async () => {
|
|
8
|
-
const lix = await openLixInMemory({ blob: await newLixFile() });
|
|
9
|
-
await lix.db
|
|
10
|
-
.insertInto("file")
|
|
11
|
-
.values({
|
|
12
|
-
path: "/project_id",
|
|
13
|
-
data: new TextEncoder().encode("foo-bar"),
|
|
14
|
-
})
|
|
15
|
-
.execute();
|
|
16
|
-
const id$ = createId$({ lix });
|
|
17
|
-
// todo the emitted events are always too high
|
|
18
|
-
// that could be due to polling. not important rn.
|
|
19
|
-
// let emittedEvents = 0;
|
|
20
|
-
// settings$.subscribe(() => {
|
|
21
|
-
// emittedEvents++;
|
|
22
|
-
// });
|
|
23
|
-
const id = await firstValueFrom(id$);
|
|
24
|
-
expect(id).toBe("foo-bar");
|
|
25
|
-
await lix.db
|
|
26
|
-
.updateTable("file")
|
|
27
|
-
.where("file.path", "=", "/project_id")
|
|
28
|
-
.set({
|
|
29
|
-
data: new TextEncoder().encode("foo-bar-box"),
|
|
30
|
-
})
|
|
31
|
-
.execute();
|
|
32
|
-
const id2 = await firstValueFrom(id$);
|
|
33
|
-
expect(id2).toBe("foo-bar-box");
|
|
34
|
-
});
|
|
35
|
-
//# sourceMappingURL=id$.test.js.map
|
|
36
|
-
//# debugId=2a79efd3-90f3-5a3b-a3e1-36748848c455
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"id$.test.js","sources":["project/state/id$.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, test } from \"vitest\";\nimport { newLixFile, openLixInMemory } from \"@lix-js/sdk\";\nimport { firstValueFrom } from \"rxjs\";\nimport { createId$ } from \"./id$.js\";\n\ntest(\"if the settings file has been updated in lix, the observable should emit the new id\", async () => {\n\tconst lix = await openLixInMemory({ blob: await newLixFile() });\n\n\tawait lix.db\n\t\t.insertInto(\"file\")\n\t\t.values({\n\t\t\tpath: \"/project_id\",\n\t\t\tdata: new TextEncoder().encode(\"foo-bar\"),\n\t\t})\n\t\t.execute();\n\n\tconst id$ = createId$({ lix });\n\n\t// todo the emitted events are always too high\n\t// that could be due to polling. not important rn.\n\t// let emittedEvents = 0;\n\t// settings$.subscribe(() => {\n\t// \temittedEvents++;\n\t// });\n\n\tconst id = await firstValueFrom(id$);\n\n\texpect(id).toBe(\"foo-bar\");\n\n\tawait lix.db\n\t\t.updateTable(\"file\")\n\t\t.where(\"file.path\", \"=\", \"/project_id\")\n\t\t.set({\n\t\t\tdata: new TextEncoder().encode(\"foo-bar-box\"),\n\t\t})\n\t\t.execute();\n\n\tconst id2 = await firstValueFrom(id$);\n\texpect(id2).toBe(\"foo-bar-box\");\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAErC,IAAI,CAAC,qFAAqF,EAAE,KAAK,IAAI,EAAE;IACtG,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAEhE,MAAM,GAAG,CAAC,EAAE;SACV,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC;QACP,IAAI,EAAE,aAAa;QACnB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,SAAS,CAAC;KACzC,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAE/B,8CAA8C;IAC9C,kDAAkD;IAClD,yBAAyB;IACzB,8BAA8B;IAC9B,oBAAoB;IACpB,MAAM;IAEN,MAAM,EAAE,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IAErC,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IAE3B,MAAM,GAAG,CAAC,EAAE;SACV,WAAW,CAAC,MAAM,CAAC;SACnB,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,aAAa,CAAC;SACtC,GAAG,CAAC;QACJ,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,aAAa,CAAC;KAC7C,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,GAAG,GAAG,MAAM,cAAc,CAAC,GAAG,CAAC,CAAC;IACtC,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC","debug_id":"2a79efd3-90f3-5a3b-a3e1-36748848c455"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setSettings.d.ts","sourceRoot":"/","sources":["project/state/setSettings.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAErE,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACvC,WAAW,EAAE,eAAe,CAAC;IAC7B,GAAG,EAAE,GAAG,CAAC;CACT,iBAYA"}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="087e5c21-3f26-52fe-a69a-b7cfaf46f820")}catch(e){}}();
|
|
3
|
-
export async function setSettings(args) {
|
|
4
|
-
const cloned = structuredClone(args.newSettings);
|
|
5
|
-
cloned.languageTags = cloned.locales;
|
|
6
|
-
cloned.sourceLanguageTag = cloned.baseLocale;
|
|
7
|
-
await args.lix.db
|
|
8
|
-
.updateTable("file")
|
|
9
|
-
.where("path", "=", "/settings.json")
|
|
10
|
-
.set({
|
|
11
|
-
data: new TextEncoder().encode(JSON.stringify(cloned, undefined, 2)),
|
|
12
|
-
})
|
|
13
|
-
.execute();
|
|
14
|
-
}
|
|
15
|
-
//# sourceMappingURL=setSettings.js.map
|
|
16
|
-
//# debugId=087e5c21-3f26-52fe-a69a-b7cfaf46f820
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setSettings.js","sources":["project/state/setSettings.ts"],"sourceRoot":"/","sourcesContent":["import type { Lix } from \"@lix-js/sdk\";\nimport type { ProjectSettings } from \"../../json-schema/settings.js\";\n\nexport async function setSettings(args: {\n\tnewSettings: ProjectSettings;\n\tlix: Lix;\n}) {\n\tconst cloned = structuredClone(args.newSettings);\n\tcloned.languageTags = cloned.locales;\n\tcloned.sourceLanguageTag = cloned.baseLocale;\n\n\tawait args.lix.db\n\t\t.updateTable(\"file\")\n\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t.set({\n\t\t\tdata: new TextEncoder().encode(JSON.stringify(cloned, undefined, 2)),\n\t\t})\n\t\t.execute();\n}\n"],"names":[],"mappings":";;AAGA,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAGjC;IACA,MAAM,MAAM,GAAG,eAAe,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACjD,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;IACrC,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC;IAE7C,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SACf,WAAW,CAAC,MAAM,CAAC;SACnB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;SACpC,GAAG,CAAC;QACJ,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;KACpE,CAAC;SACD,OAAO,EAAE,CAAC;AACb,CAAC","debug_id":"087e5c21-3f26-52fe-a69a-b7cfaf46f820"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setSettings.test.d.ts","sourceRoot":"/","sources":["project/state/setSettings.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a9d067a0-ded9-515e-b9a6-cce314acb4d3")}catch(e){}}();
|
|
3
|
-
import { expect, test } from "vitest";
|
|
4
|
-
import { newLixFile, openLixInMemory } from "@lix-js/sdk";
|
|
5
|
-
import { ProjectSettings } from "../../json-schema/settings.js";
|
|
6
|
-
import { createProjectState } from "./state.js";
|
|
7
|
-
import { setSettings } from "./setSettings.js";
|
|
8
|
-
test("setSettings an update to baseLocale and locales should update sourceLanguageTag and languageTags", async () => {
|
|
9
|
-
const lix = await openLixInMemory({ blob: await newLixFile() });
|
|
10
|
-
const settings = {
|
|
11
|
-
baseLocale: "en",
|
|
12
|
-
locales: ["en", "fr"],
|
|
13
|
-
};
|
|
14
|
-
await lix.db
|
|
15
|
-
.insertInto("file")
|
|
16
|
-
.values({
|
|
17
|
-
path: "/settings.json",
|
|
18
|
-
data: new TextEncoder().encode(JSON.stringify(settings)),
|
|
19
|
-
})
|
|
20
|
-
.execute();
|
|
21
|
-
await setSettings({ newSettings: settings, lix });
|
|
22
|
-
const settingsFile = await lix.db
|
|
23
|
-
.selectFrom("file")
|
|
24
|
-
.select("data")
|
|
25
|
-
.where("path", "=", "/settings.json")
|
|
26
|
-
.executeTakeFirstOrThrow();
|
|
27
|
-
const updatedSettings = JSON.parse(new TextDecoder().decode(settingsFile.data));
|
|
28
|
-
expect(updatedSettings.baseLocale).toBe("en");
|
|
29
|
-
expect(updatedSettings.sourceLanguageTag).toBe("en");
|
|
30
|
-
expect(updatedSettings.locales).toEqual(["en", "fr"]);
|
|
31
|
-
expect(updatedSettings.languageTags).toEqual(["en", "fr"]);
|
|
32
|
-
});
|
|
33
|
-
test("the settings should be persisted to lix", async () => {
|
|
34
|
-
const lix = await openLixInMemory({ blob: await newLixFile() });
|
|
35
|
-
await lix.db
|
|
36
|
-
.insertInto("file")
|
|
37
|
-
.values({
|
|
38
|
-
path: "/settings.json",
|
|
39
|
-
data: new TextEncoder().encode("{}"),
|
|
40
|
-
})
|
|
41
|
-
.execute();
|
|
42
|
-
const settings = {
|
|
43
|
-
baseLocale: "en",
|
|
44
|
-
locales: ["en", "fr"],
|
|
45
|
-
};
|
|
46
|
-
const state = createProjectState({ settings, lix });
|
|
47
|
-
await state.settings.set(settings);
|
|
48
|
-
const settingsFile = await lix.db
|
|
49
|
-
.selectFrom("file")
|
|
50
|
-
.select("data")
|
|
51
|
-
.where("path", "=", "/settings.json")
|
|
52
|
-
.executeTakeFirstOrThrow();
|
|
53
|
-
const updatedSettingsInLix = JSON.parse(new TextDecoder().decode(settingsFile.data));
|
|
54
|
-
expect(updatedSettingsInLix.baseLocale).toEqual("en");
|
|
55
|
-
expect(updatedSettingsInLix.locales).toEqual(["en", "fr"]);
|
|
56
|
-
});
|
|
57
|
-
//# sourceMappingURL=setSettings.test.js.map
|
|
58
|
-
//# debugId=a9d067a0-ded9-515e-b9a6-cce314acb4d3
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"setSettings.test.js","sources":["project/state/setSettings.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, test } from \"vitest\";\nimport { newLixFile, openLixInMemory } from \"@lix-js/sdk\";\nimport { ProjectSettings } from \"../../json-schema/settings.js\";\nimport { createProjectState } from \"./state.js\";\nimport { setSettings } from \"./setSettings.js\";\n\ntest(\"setSettings an update to baseLocale and locales should update sourceLanguageTag and languageTags\", async () => {\n\tconst lix = await openLixInMemory({ blob: await newLixFile() });\n\n\tconst settings: ProjectSettings = {\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\", \"fr\"],\n\t};\n\n\tawait lix.db\n\t\t.insertInto(\"file\")\n\t\t.values({\n\t\t\tpath: \"/settings.json\",\n\t\t\tdata: new TextEncoder().encode(JSON.stringify(settings)),\n\t\t})\n\t\t.execute();\n\n\tawait setSettings({ newSettings: settings, lix });\n\n\tconst settingsFile = await lix.db\n\t\t.selectFrom(\"file\")\n\t\t.select(\"data\")\n\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t.executeTakeFirstOrThrow();\n\n\tconst updatedSettings = JSON.parse(\n\t\tnew TextDecoder().decode(settingsFile.data)\n\t) as ProjectSettings;\n\n\texpect(updatedSettings.baseLocale).toBe(\"en\");\n\texpect(updatedSettings.sourceLanguageTag).toBe(\"en\");\n\texpect(updatedSettings.locales).toEqual([\"en\", \"fr\"]);\n\texpect(updatedSettings.languageTags).toEqual([\"en\", \"fr\"]);\n});\n\ntest(\"the settings should be persisted to lix\", async () => {\n\tconst lix = await openLixInMemory({ blob: await newLixFile() });\n\n\tawait lix.db\n\t\t.insertInto(\"file\")\n\t\t.values({\n\t\t\tpath: \"/settings.json\",\n\t\t\tdata: new TextEncoder().encode(\"{}\"),\n\t\t})\n\t\t.execute();\n\n\tconst settings: ProjectSettings = {\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\", \"fr\"],\n\t};\n\n\tconst state = createProjectState({ settings, lix });\n\n\tawait state.settings.set(settings);\n\n\tconst settingsFile = await lix.db\n\t\t.selectFrom(\"file\")\n\t\t.select(\"data\")\n\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t.executeTakeFirstOrThrow();\n\n\tconst updatedSettingsInLix = JSON.parse(\n\t\tnew TextDecoder().decode(settingsFile.data)\n\t) as ProjectSettings;\n\n\texpect(updatedSettingsInLix.baseLocale).toEqual(\"en\");\n\texpect(updatedSettingsInLix.locales).toEqual([\"en\", \"fr\"]);\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC1D,OAAO,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,IAAI,CAAC,kGAAkG,EAAE,KAAK,IAAI,EAAE;IACnH,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAEhE,MAAM,QAAQ,GAAoB;QACjC,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;KACrB,CAAC;IAEF,MAAM,GAAG,CAAC,EAAE;SACV,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC;QACP,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;KACxD,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,WAAW,CAAC,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAElD,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,EAAE;SAC/B,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC,MAAM,CAAC;SACd,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;SACpC,uBAAuB,EAAE,CAAC;IAE5B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CACjC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CACxB,CAAC;IAErB,MAAM,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,eAAe,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,CAAC,eAAe,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACtD,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,yCAAyC,EAAE,KAAK,IAAI,EAAE;IAC1D,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAEhE,MAAM,GAAG,CAAC,EAAE;SACV,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC;QACP,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC;KACpC,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,QAAQ,GAAoB;QACjC,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;KACrB,CAAC;IAEF,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;IAEpD,MAAM,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAEnC,MAAM,YAAY,GAAG,MAAM,GAAG,CAAC,EAAE;SAC/B,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC,MAAM,CAAC;SACd,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;SACpC,uBAAuB,EAAE,CAAC;IAE5B,MAAM,oBAAoB,GAAG,IAAI,CAAC,KAAK,CACtC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CACxB,CAAC;IAErB,MAAM,CAAC,oBAAoB,CAAC,UAAU,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IACtD,MAAM,CAAC,oBAAoB,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAC5D,CAAC,CAAC,CAAC","debug_id":"a9d067a0-ded9-515e-b9a6-cce314acb4d3"}
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
import { type Lix } from "@lix-js/sdk";
|
|
2
|
-
import { type Observable } from "rxjs";
|
|
3
|
-
import type { ProjectSettings } from "../../json-schema/settings.js";
|
|
4
|
-
export declare function createSettings$(args: {
|
|
5
|
-
lix: Lix;
|
|
6
|
-
}): Observable<ProjectSettings>;
|
|
7
|
-
//# sourceMappingURL=settings$.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings$.d.ts","sourceRoot":"/","sources":["project/state/settings$.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAc,KAAK,UAAU,EAAE,MAAM,MAAM,CAAC;AACnD,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIrE,wBAAgB,eAAe,CAAC,IAAI,EAAE;IACrC,GAAG,EAAE,GAAG,CAAC;CACT,GAAG,UAAU,CAAC,eAAe,CAAC,CAiB9B"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="760e68b2-ab97-51b8-91b7-59c30e4bd97a")}catch(e){}}();
|
|
3
|
-
import {} from "@lix-js/sdk";
|
|
4
|
-
import { map, share } from "rxjs";
|
|
5
|
-
import { withLanguageTagToLocaleMigration } from "../../migrations/v2/withLanguageTagToLocaleMigration.js";
|
|
6
|
-
import { pollQuery } from "../../query-utilities/pollQuery.js";
|
|
7
|
-
export function createSettings$(args) {
|
|
8
|
-
const settings$ = pollQuery(() => args.lix.db
|
|
9
|
-
.selectFrom("file")
|
|
10
|
-
.where("path", "=", "/settings.json")
|
|
11
|
-
.selectAll()
|
|
12
|
-
.executeTakeFirstOrThrow()).pipe(map((settingsFile) => {
|
|
13
|
-
const decoded = new TextDecoder().decode(settingsFile.data);
|
|
14
|
-
const parsed = JSON.parse(decoded);
|
|
15
|
-
const withMigration = withLanguageTagToLocaleMigration(parsed);
|
|
16
|
-
return withMigration;
|
|
17
|
-
}), share());
|
|
18
|
-
return settings$;
|
|
19
|
-
}
|
|
20
|
-
//# sourceMappingURL=settings$.js.map
|
|
21
|
-
//# debugId=760e68b2-ab97-51b8-91b7-59c30e4bd97a
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings$.js","sources":["project/state/settings$.ts"],"sourceRoot":"/","sourcesContent":["import { type Lix } from \"@lix-js/sdk\";\nimport { map, share, type Observable } from \"rxjs\";\nimport type { ProjectSettings } from \"../../json-schema/settings.js\";\nimport { withLanguageTagToLocaleMigration } from \"../../migrations/v2/withLanguageTagToLocaleMigration.js\";\nimport { pollQuery } from \"../../query-utilities/pollQuery.js\";\n\nexport function createSettings$(args: {\n\tlix: Lix;\n}): Observable<ProjectSettings> {\n\tconst settings$ = pollQuery(() =>\n\t\targs.lix.db\n\t\t\t.selectFrom(\"file\")\n\t\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t\t.selectAll()\n\t\t\t.executeTakeFirstOrThrow()\n\t).pipe(\n\t\tmap((settingsFile) => {\n\t\t\tconst decoded = new TextDecoder().decode(settingsFile.data);\n\t\t\tconst parsed = JSON.parse(decoded);\n\t\t\tconst withMigration = withLanguageTagToLocaleMigration(parsed);\n\t\t\treturn withMigration;\n\t\t}),\n\t\tshare()\n\t);\n\treturn settings$;\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAY,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,GAAG,EAAE,KAAK,EAAmB,MAAM,MAAM,CAAC;AAEnD,OAAO,EAAE,gCAAgC,EAAE,MAAM,yDAAyD,CAAC;AAC3G,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAE/D,MAAM,UAAU,eAAe,CAAC,IAE/B;IACA,MAAM,SAAS,GAAG,SAAS,CAAC,GAAG,EAAE,CAChC,IAAI,CAAC,GAAG,CAAC,EAAE;SACT,UAAU,CAAC,MAAM,CAAC;SAClB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;SACpC,SAAS,EAAE;SACX,uBAAuB,EAAE,CAC3B,CAAC,IAAI,CACL,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QACpB,MAAM,OAAO,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC5D,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;QACnC,MAAM,aAAa,GAAG,gCAAgC,CAAC,MAAM,CAAC,CAAC;QAC/D,OAAO,aAAa,CAAC;IACtB,CAAC,CAAC,EACF,KAAK,EAAE,CACP,CAAC;IACF,OAAO,SAAS,CAAC;AAClB,CAAC","debug_id":"760e68b2-ab97-51b8-91b7-59c30e4bd97a"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings$.test.d.ts","sourceRoot":"/","sources":["project/state/settings$.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="70bfa61d-3c90-54d1-9a59-6e228738d8a6")}catch(e){}}();
|
|
3
|
-
import { expect, test } from "vitest";
|
|
4
|
-
import { createSettings$ } from "./settings$.js";
|
|
5
|
-
import { newLixFile, openLixInMemory } from "@lix-js/sdk";
|
|
6
|
-
import { firstValueFrom } from "rxjs";
|
|
7
|
-
import { withLanguageTagToLocaleMigration } from "../../migrations/v2/withLanguageTagToLocaleMigration.js";
|
|
8
|
-
test("if the settings file has been updated in lix, the observable should emit the new settings", async () => {
|
|
9
|
-
const lix = await openLixInMemory({ blob: await newLixFile() });
|
|
10
|
-
const mockSettings = {
|
|
11
|
-
baseLocale: "en",
|
|
12
|
-
locales: ["en", "de"],
|
|
13
|
-
modules: [],
|
|
14
|
-
};
|
|
15
|
-
await lix.db
|
|
16
|
-
.insertInto("file")
|
|
17
|
-
.values({
|
|
18
|
-
path: "/settings.json",
|
|
19
|
-
data: new TextEncoder().encode(JSON.stringify(mockSettings)),
|
|
20
|
-
})
|
|
21
|
-
.execute();
|
|
22
|
-
const settings$ = createSettings$({ lix });
|
|
23
|
-
// todo the emitted events are always too high
|
|
24
|
-
// that could be due to polling. not important rn.
|
|
25
|
-
// let emittedEvents = 0;
|
|
26
|
-
// settings$.subscribe(() => {
|
|
27
|
-
// emittedEvents++;
|
|
28
|
-
// });
|
|
29
|
-
const settings = await firstValueFrom(settings$);
|
|
30
|
-
expect(settings).toStrictEqual(withLanguageTagToLocaleMigration(mockSettings));
|
|
31
|
-
settings.baseLocale = "mock-locale";
|
|
32
|
-
// mutating a value from the observable should not affect the observable
|
|
33
|
-
const settings2 = await firstValueFrom(settings$);
|
|
34
|
-
expect(settings2.baseLocale).toBe("en");
|
|
35
|
-
await lix.db
|
|
36
|
-
.updateTable("file")
|
|
37
|
-
.where("file.path", "=", "/settings.json")
|
|
38
|
-
.set({
|
|
39
|
-
data: new TextEncoder().encode(JSON.stringify({
|
|
40
|
-
...settings,
|
|
41
|
-
baseLocale: "mock-locale",
|
|
42
|
-
"plugin.mock": "mock",
|
|
43
|
-
})),
|
|
44
|
-
})
|
|
45
|
-
.execute();
|
|
46
|
-
const settings3 = await firstValueFrom(settings$);
|
|
47
|
-
expect(settings3.baseLocale).toBe("mock-locale");
|
|
48
|
-
expect(settings3["plugin.mock"]).toBe("mock");
|
|
49
|
-
});
|
|
50
|
-
//# sourceMappingURL=settings$.test.js.map
|
|
51
|
-
//# debugId=70bfa61d-3c90-54d1-9a59-6e228738d8a6
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"settings$.test.js","sources":["project/state/settings$.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, test } from \"vitest\";\nimport { createSettings$ } from \"./settings$.js\";\nimport { newLixFile, openLixInMemory } from \"@lix-js/sdk\";\nimport type { ProjectSettings } from \"../../json-schema/settings.js\";\nimport { firstValueFrom } from \"rxjs\";\nimport { withLanguageTagToLocaleMigration } from \"../../migrations/v2/withLanguageTagToLocaleMigration.js\";\n\ntest(\"if the settings file has been updated in lix, the observable should emit the new settings\", async () => {\n\tconst lix = await openLixInMemory({ blob: await newLixFile() });\n\n\tconst mockSettings: ProjectSettings = {\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\", \"de\"],\n\t\tmodules: [],\n\t};\n\n\tawait lix.db\n\t\t.insertInto(\"file\")\n\t\t.values({\n\t\t\tpath: \"/settings.json\",\n\t\t\tdata: new TextEncoder().encode(JSON.stringify(mockSettings)),\n\t\t})\n\t\t.execute();\n\n\tconst settings$ = createSettings$({ lix });\n\n\t// todo the emitted events are always too high\n\t// that could be due to polling. not important rn.\n\t// let emittedEvents = 0;\n\t// settings$.subscribe(() => {\n\t// \temittedEvents++;\n\t// });\n\n\tconst settings = await firstValueFrom(settings$);\n\n\texpect(settings).toStrictEqual(\n\t\twithLanguageTagToLocaleMigration(mockSettings)\n\t);\n\n\tsettings.baseLocale = \"mock-locale\";\n\n\t// mutating a value from the observable should not affect the observable\n\tconst settings2 = await firstValueFrom(settings$);\n\texpect(settings2.baseLocale).toBe(\"en\");\n\n\tawait lix.db\n\t\t.updateTable(\"file\")\n\t\t.where(\"file.path\", \"=\", \"/settings.json\")\n\t\t.set({\n\t\t\tdata: new TextEncoder().encode(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\t...settings,\n\t\t\t\t\tbaseLocale: \"mock-locale\",\n\t\t\t\t\t\"plugin.mock\": \"mock\",\n\t\t\t\t})\n\t\t\t),\n\t\t})\n\t\t.execute();\n\n\tconst settings3 = await firstValueFrom(settings$);\n\texpect(settings3.baseLocale).toBe(\"mock-locale\");\n\texpect(settings3[\"plugin.mock\"]).toBe(\"mock\");\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAE1D,OAAO,EAAE,cAAc,EAAE,MAAM,MAAM,CAAC;AACtC,OAAO,EAAE,gCAAgC,EAAE,MAAM,yDAAyD,CAAC;AAE3G,IAAI,CAAC,2FAA2F,EAAE,KAAK,IAAI,EAAE;IAC5G,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAEhE,MAAM,YAAY,GAAoB;QACrC,UAAU,EAAE,IAAI;QAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;QACrB,OAAO,EAAE,EAAE;KACX,CAAC;IAEF,MAAM,GAAG,CAAC,EAAE;SACV,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC;QACP,IAAI,EAAE,gBAAgB;QACtB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC,CAAC;KAC5D,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,SAAS,GAAG,eAAe,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;IAE3C,8CAA8C;IAC9C,kDAAkD;IAClD,yBAAyB;IACzB,8BAA8B;IAC9B,oBAAoB;IACpB,MAAM;IAEN,MAAM,QAAQ,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAEjD,MAAM,CAAC,QAAQ,CAAC,CAAC,aAAa,CAC7B,gCAAgC,CAAC,YAAY,CAAC,CAC9C,CAAC;IAEF,QAAQ,CAAC,UAAU,GAAG,aAAa,CAAC;IAEpC,wEAAwE;IACxE,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAExC,MAAM,GAAG,CAAC,EAAE;SACV,WAAW,CAAC,MAAM,CAAC;SACnB,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,gBAAgB,CAAC;SACzC,GAAG,CAAC;QACJ,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAC7B,IAAI,CAAC,SAAS,CAAC;YACd,GAAG,QAAQ;YACX,UAAU,EAAE,aAAa;YACzB,aAAa,EAAE,MAAM;SACrB,CAAC,CACF;KACD,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,SAAS,CAAC,CAAC;IAClD,MAAM,CAAC,SAAS,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IACjD,MAAM,CAAC,SAAS,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC","debug_id":"70bfa61d-3c90-54d1-9a59-6e228738d8a6"}
|
|
@@ -1,58 +0,0 @@
|
|
|
1
|
-
import type { InlangPlugin } from "../../plugin/schema.js";
|
|
2
|
-
import type { ProjectSettings } from "../../json-schema/settings.js";
|
|
3
|
-
import { type PreprocessPluginBeforeImportFunction } from "../../plugin/importPlugins.js";
|
|
4
|
-
import type { Lix } from "@lix-js/sdk";
|
|
5
|
-
/**
|
|
6
|
-
* State of a project.
|
|
7
|
-
*/
|
|
8
|
-
export type ProjectState = Awaited<ReturnType<typeof createProjectState>>;
|
|
9
|
-
/**
|
|
10
|
-
* The state of a project derived from the settings file in lix.
|
|
11
|
-
*
|
|
12
|
-
* Everything that's not in the database is stored here. Settings,
|
|
13
|
-
* loaded plugins etc. The principal is "everything is derived
|
|
14
|
-
* from the settings file in lix":
|
|
15
|
-
*
|
|
16
|
-
* - the source of truth is the file.
|
|
17
|
-
* - crash resistance: if the state is lost, it can be re-imported.
|
|
18
|
-
* - portable: copy the file, open on another machine = same state.
|
|
19
|
-
*
|
|
20
|
-
* - simple(r) unit testing (provide the settings file observable, done)
|
|
21
|
-
*/
|
|
22
|
-
export declare function createProjectState(args: {
|
|
23
|
-
lix: Lix;
|
|
24
|
-
providePlugins?: InlangPlugin[];
|
|
25
|
-
preprocessPluginBeforeImport?: PreprocessPluginBeforeImportFunction;
|
|
26
|
-
settings: ProjectSettings;
|
|
27
|
-
}): {
|
|
28
|
-
id: {
|
|
29
|
-
get: () => Promise<string>;
|
|
30
|
-
subscribe: {
|
|
31
|
-
(observerOrNext?: Partial<import("rxjs").Observer<string>> | ((value: string) => void) | undefined): import("rxjs").Subscription;
|
|
32
|
-
(next?: ((value: string) => void) | null | undefined, error?: ((error: any) => void) | null, complete?: (() => void) | null): import("rxjs").Subscription;
|
|
33
|
-
};
|
|
34
|
-
};
|
|
35
|
-
settings: {
|
|
36
|
-
get: () => Promise<ProjectSettings>;
|
|
37
|
-
set: (settings: ProjectSettings) => Promise<void>;
|
|
38
|
-
subscribe: {
|
|
39
|
-
(observerOrNext?: Partial<import("rxjs").Observer<ProjectSettings>> | ((value: ProjectSettings) => void) | undefined): import("rxjs").Subscription;
|
|
40
|
-
(next?: ((value: ProjectSettings) => void) | null | undefined, error?: ((error: any) => void) | null, complete?: (() => void) | null): import("rxjs").Subscription;
|
|
41
|
-
};
|
|
42
|
-
};
|
|
43
|
-
errors: {
|
|
44
|
-
get: () => Promise<import("../../index.js").PluginError[]>;
|
|
45
|
-
subscribe: {
|
|
46
|
-
(observerOrNext?: Partial<import("rxjs").Observer<import("../../index.js").PluginError[]>> | ((value: import("../../index.js").PluginError[]) => void) | undefined): import("rxjs").Subscription;
|
|
47
|
-
(next?: ((value: import("../../index.js").PluginError[]) => void) | null | undefined, error?: ((error: any) => void) | null, complete?: (() => void) | null): import("rxjs").Subscription;
|
|
48
|
-
};
|
|
49
|
-
};
|
|
50
|
-
plugins: {
|
|
51
|
-
get: () => Promise<InlangPlugin[]>;
|
|
52
|
-
subscribe: {
|
|
53
|
-
(observerOrNext?: Partial<import("rxjs").Observer<InlangPlugin[]>> | ((value: InlangPlugin[]) => void) | undefined): import("rxjs").Subscription;
|
|
54
|
-
(next?: ((value: InlangPlugin[]) => void) | null | undefined, error?: ((error: any) => void) | null, complete?: (() => void) | null): import("rxjs").Subscription;
|
|
55
|
-
};
|
|
56
|
-
};
|
|
57
|
-
};
|
|
58
|
-
//# sourceMappingURL=state.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.d.ts","sourceRoot":"/","sources":["project/state/state.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAC3D,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AACrE,OAAO,EAEN,KAAK,oCAAoC,EACzC,MAAM,+BAA+B,CAAC;AAEvC,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAIvC;;GAEG;AACH,MAAM,MAAM,YAAY,GAAG,OAAO,CAAC,UAAU,CAAC,OAAO,kBAAkB,CAAC,CAAC,CAAC;AAE1E;;;;;;;;;;;;GAYG;AACH,wBAAgB,kBAAkB,CAAC,IAAI,EAAE;IACxC,GAAG,EAAE,GAAG,CAAC;IACT,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC,4BAA4B,CAAC,EAAE,oCAAoC,CAAC;IACpE,QAAQ,EAAE,eAAe,CAAC;CAC1B;;;;;;;;;;wBAwCkB,eAAe;;;;;;;;;;;;;;;;;;;;EAkBjC"}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="660fd18c-78ff-55da-8256-b408e202d0c8")}catch(e){}}();
|
|
3
|
-
import { firstValueFrom, map, merge, share, switchMap } from "rxjs";
|
|
4
|
-
import { importPlugins, } from "../../plugin/importPlugins.js";
|
|
5
|
-
import { setSettings } from "./setSettings.js";
|
|
6
|
-
import { createSettings$ } from "./settings$.js";
|
|
7
|
-
import { createId$ } from "./id$.js";
|
|
8
|
-
/**
|
|
9
|
-
* The state of a project derived from the settings file in lix.
|
|
10
|
-
*
|
|
11
|
-
* Everything that's not in the database is stored here. Settings,
|
|
12
|
-
* loaded plugins etc. The principal is "everything is derived
|
|
13
|
-
* from the settings file in lix":
|
|
14
|
-
*
|
|
15
|
-
* - the source of truth is the file.
|
|
16
|
-
* - crash resistance: if the state is lost, it can be re-imported.
|
|
17
|
-
* - portable: copy the file, open on another machine = same state.
|
|
18
|
-
*
|
|
19
|
-
* - simple(r) unit testing (provide the settings file observable, done)
|
|
20
|
-
*/
|
|
21
|
-
export function createProjectState(args) {
|
|
22
|
-
const settings$ = createSettings$(args);
|
|
23
|
-
const _importPluginsResult$ = settings$.pipe(
|
|
24
|
-
// distinctUntilChanges is bypassed for whatever reason
|
|
25
|
-
// not important for now if the plugins re-import even if the modules are identical.
|
|
26
|
-
// distinctUntilChanged((prev, curr) => {
|
|
27
|
-
// console.log("distinct called");
|
|
28
|
-
// return true;
|
|
29
|
-
// }),
|
|
30
|
-
switchMap((settings) =>
|
|
31
|
-
// re-import the plugins when the settings change
|
|
32
|
-
importPlugins({
|
|
33
|
-
settings,
|
|
34
|
-
lix: args.lix,
|
|
35
|
-
preprocessPluginBeforeImport: args.preprocessPluginBeforeImport,
|
|
36
|
-
})), share());
|
|
37
|
-
const plugins$ = _importPluginsResult$.pipe(map((result) => [...(args.providePlugins ?? []), ...result.plugins]), share());
|
|
38
|
-
const errors$ = merge(_importPluginsResult$.pipe(map((result) => result.errors))).pipe(share());
|
|
39
|
-
const id$ = createId$({ lix: args.lix });
|
|
40
|
-
return {
|
|
41
|
-
id: {
|
|
42
|
-
get: () => firstValueFrom(id$),
|
|
43
|
-
// bind to keep the context of this
|
|
44
|
-
subscribe: id$.subscribe.bind(id$),
|
|
45
|
-
},
|
|
46
|
-
settings: {
|
|
47
|
-
get: () => firstValueFrom(settings$),
|
|
48
|
-
set: (settings) => setSettings({
|
|
49
|
-
newSettings: settings,
|
|
50
|
-
lix: args.lix,
|
|
51
|
-
}),
|
|
52
|
-
subscribe: settings$.subscribe,
|
|
53
|
-
},
|
|
54
|
-
errors: {
|
|
55
|
-
get: () => firstValueFrom(errors$),
|
|
56
|
-
// bind to keep the context of this
|
|
57
|
-
subscribe: errors$.subscribe.bind(errors$),
|
|
58
|
-
},
|
|
59
|
-
plugins: {
|
|
60
|
-
get: () => firstValueFrom(plugins$),
|
|
61
|
-
// bind to keep the context of this
|
|
62
|
-
subscribe: plugins$.subscribe.bind(plugins$),
|
|
63
|
-
},
|
|
64
|
-
};
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=state.js.map
|
|
67
|
-
//# debugId=660fd18c-78ff-55da-8256-b408e202d0c8
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.js","sources":["project/state/state.ts"],"sourceRoot":"/","sourcesContent":["import { firstValueFrom, map, merge, share, switchMap } from \"rxjs\";\nimport type { InlangPlugin } from \"../../plugin/schema.js\";\nimport type { ProjectSettings } from \"../../json-schema/settings.js\";\nimport {\n\timportPlugins,\n\ttype PreprocessPluginBeforeImportFunction,\n} from \"../../plugin/importPlugins.js\";\nimport { setSettings } from \"./setSettings.js\";\nimport type { Lix } from \"@lix-js/sdk\";\nimport { createSettings$ } from \"./settings$.js\";\nimport { createId$ } from \"./id$.js\";\n\n/**\n * State of a project.\n */\nexport type ProjectState = Awaited<ReturnType<typeof createProjectState>>;\n\n/**\n * The state of a project derived from the settings file in lix.\n *\n * Everything that's not in the database is stored here. Settings,\n * loaded plugins etc. The principal is \"everything is derived\n * from the settings file in lix\":\n *\n * - the source of truth is the file.\n * - crash resistance: if the state is lost, it can be re-imported.\n * - portable: copy the file, open on another machine = same state.\n *\n * - simple(r) unit testing (provide the settings file observable, done)\n */\nexport function createProjectState(args: {\n\tlix: Lix;\n\tprovidePlugins?: InlangPlugin[];\n\tpreprocessPluginBeforeImport?: PreprocessPluginBeforeImportFunction;\n\tsettings: ProjectSettings;\n}) {\n\tconst settings$ = createSettings$(args);\n\n\tconst _importPluginsResult$ = settings$.pipe(\n\t\t// distinctUntilChanges is bypassed for whatever reason\n\t\t// not important for now if the plugins re-import even if the modules are identical.\n\t\t// distinctUntilChanged((prev, curr) => {\n\t\t// \tconsole.log(\"distinct called\");\n\t\t// \treturn true;\n\t\t// }),\n\t\tswitchMap((settings) =>\n\t\t\t// re-import the plugins when the settings change\n\t\t\timportPlugins({\n\t\t\t\tsettings,\n\t\t\t\tlix: args.lix,\n\t\t\t\tpreprocessPluginBeforeImport: args.preprocessPluginBeforeImport,\n\t\t\t})\n\t\t),\n\t\tshare()\n\t);\n\n\tconst plugins$ = _importPluginsResult$.pipe(\n\t\tmap((result) => [...(args.providePlugins ?? []), ...result.plugins]),\n\t\tshare()\n\t);\n\n\tconst errors$ = merge(\n\t\t_importPluginsResult$.pipe(map((result) => result.errors))\n\t).pipe(share());\n\n\tconst id$ = createId$({ lix: args.lix });\n\n\treturn {\n\t\tid: {\n\t\t\tget: () => firstValueFrom(id$),\n\t\t\t// bind to keep the context of this\n\t\t\tsubscribe: id$.subscribe.bind(id$),\n\t\t},\n\t\tsettings: {\n\t\t\tget: () => firstValueFrom(settings$),\n\t\t\tset: (settings: ProjectSettings) =>\n\t\t\t\tsetSettings({\n\t\t\t\t\tnewSettings: settings,\n\t\t\t\t\tlix: args.lix,\n\t\t\t\t}),\n\t\t\tsubscribe: settings$.subscribe,\n\t\t},\n\t\terrors: {\n\t\t\tget: () => firstValueFrom(errors$),\n\t\t\t// bind to keep the context of this\n\t\t\tsubscribe: errors$.subscribe.bind(errors$),\n\t\t},\n\t\tplugins: {\n\t\t\tget: () => firstValueFrom(plugins$),\n\t\t\t// bind to keep the context of this\n\t\t\tsubscribe: plugins$.subscribe.bind(plugins$),\n\t\t},\n\t};\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,cAAc,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,MAAM,MAAM,CAAC;AAGpE,OAAO,EACN,aAAa,GAEb,MAAM,+BAA+B,CAAC;AACvC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAE/C,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,SAAS,EAAE,MAAM,UAAU,CAAC;AAOrC;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,kBAAkB,CAAC,IAKlC;IACA,MAAM,SAAS,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IAExC,MAAM,qBAAqB,GAAG,SAAS,CAAC,IAAI;IAC3C,uDAAuD;IACvD,oFAAoF;IACpF,yCAAyC;IACzC,mCAAmC;IACnC,gBAAgB;IAChB,MAAM;IACN,SAAS,CAAC,CAAC,QAAQ,EAAE,EAAE;IACtB,iDAAiD;IACjD,aAAa,CAAC;QACb,QAAQ;QACR,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,4BAA4B,EAAE,IAAI,CAAC,4BAA4B;KAC/D,CAAC,CACF,EACD,KAAK,EAAE,CACP,CAAC;IAEF,MAAM,QAAQ,GAAG,qBAAqB,CAAC,IAAI,CAC1C,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,GAAG,MAAM,CAAC,OAAO,CAAC,CAAC,EACpE,KAAK,EAAE,CACP,CAAC;IAEF,MAAM,OAAO,GAAG,KAAK,CACpB,qBAAqB,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAC1D,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC;IAEhB,MAAM,GAAG,GAAG,SAAS,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEzC,OAAO;QACN,EAAE,EAAE;YACH,GAAG,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,GAAG,CAAC;YAC9B,mCAAmC;YACnC,SAAS,EAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC;SAClC;QACD,QAAQ,EAAE;YACT,GAAG,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,SAAS,CAAC;YACpC,GAAG,EAAE,CAAC,QAAyB,EAAE,EAAE,CAClC,WAAW,CAAC;gBACX,WAAW,EAAE,QAAQ;gBACrB,GAAG,EAAE,IAAI,CAAC,GAAG;aACb,CAAC;YACH,SAAS,EAAE,SAAS,CAAC,SAAS;SAC9B;QACD,MAAM,EAAE;YACP,GAAG,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,OAAO,CAAC;YAClC,mCAAmC;YACnC,SAAS,EAAE,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,OAAO,CAAC;SAC1C;QACD,OAAO,EAAE;YACR,GAAG,EAAE,GAAG,EAAE,CAAC,cAAc,CAAC,QAAQ,CAAC;YACnC,mCAAmC;YACnC,SAAS,EAAE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,QAAQ,CAAC;SAC5C;KACD,CAAC;AACH,CAAC","debug_id":"660fd18c-78ff-55da-8256-b408e202d0c8"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.test.d.ts","sourceRoot":"/","sources":["project/state/state.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,103 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="3273da9c-b4ab-5b11-a328-4b7846157139")}catch(e){}}();
|
|
3
|
-
import { test, expect, vi } from "vitest";
|
|
4
|
-
import { createProjectState } from "./state.js";
|
|
5
|
-
import { newLixFile, openLixInMemory } from "@lix-js/sdk";
|
|
6
|
-
import { loadProjectInMemory } from "../loadProjectInMemory.js";
|
|
7
|
-
import { newProject } from "../newProject.js";
|
|
8
|
-
test("plugins should be re-imported if the settings have been updated", async () => {
|
|
9
|
-
const mockImportPlugins = vi.hoisted(() => vi.fn().mockImplementation(async (args) => {
|
|
10
|
-
const plugins = args.settings.modules.map((uri) => {
|
|
11
|
-
return { key: uri };
|
|
12
|
-
});
|
|
13
|
-
return { plugins, errors: [] };
|
|
14
|
-
}));
|
|
15
|
-
vi.mock(import("../../plugin/importPlugins.js"), async (importOriginal) => {
|
|
16
|
-
const mod = await importOriginal();
|
|
17
|
-
return {
|
|
18
|
-
...mod,
|
|
19
|
-
importPlugins: mockImportPlugins,
|
|
20
|
-
};
|
|
21
|
-
});
|
|
22
|
-
const lix = await openLixInMemory({ blob: await newLixFile() });
|
|
23
|
-
await lix.db
|
|
24
|
-
.insertInto("file")
|
|
25
|
-
.values({
|
|
26
|
-
path: "/settings.json",
|
|
27
|
-
data: new TextEncoder().encode(JSON.stringify({
|
|
28
|
-
baseLocale: "en",
|
|
29
|
-
locales: ["en"],
|
|
30
|
-
modules: [],
|
|
31
|
-
})),
|
|
32
|
-
})
|
|
33
|
-
.execute();
|
|
34
|
-
const state = createProjectState({
|
|
35
|
-
lix,
|
|
36
|
-
settings: {
|
|
37
|
-
baseLocale: "en",
|
|
38
|
-
locales: ["en"],
|
|
39
|
-
modules: [],
|
|
40
|
-
},
|
|
41
|
-
});
|
|
42
|
-
const plugins1 = await state.plugins.get();
|
|
43
|
-
expect(plugins1).toEqual([]);
|
|
44
|
-
// expect(mockImportPlugins).toHaveBeenCalledTimes(1);
|
|
45
|
-
const settings1 = {
|
|
46
|
-
baseLocale: "en",
|
|
47
|
-
locales: ["en"],
|
|
48
|
-
modules: ["@inlang/plugin-react"],
|
|
49
|
-
};
|
|
50
|
-
await state.settings.set(settings1);
|
|
51
|
-
const plugins2 = await state.plugins.get();
|
|
52
|
-
expect(plugins2).toEqual([{ key: "@inlang/plugin-react" }]);
|
|
53
|
-
await state.settings.set({
|
|
54
|
-
baseLocale: "en",
|
|
55
|
-
locales: ["en"],
|
|
56
|
-
modules: ["@inlang/plugin-react"],
|
|
57
|
-
});
|
|
58
|
-
const plugins3 = await state.plugins.get();
|
|
59
|
-
expect(plugins3).toEqual([{ key: "@inlang/plugin-react" }]);
|
|
60
|
-
// expect(mockImportPlugins).toHaveBeenCalledTimes(2);
|
|
61
|
-
state.settings.set({
|
|
62
|
-
baseLocale: "en",
|
|
63
|
-
locales: ["en"],
|
|
64
|
-
modules: [],
|
|
65
|
-
});
|
|
66
|
-
const plugins4 = await state.plugins.get();
|
|
67
|
-
expect(plugins4).toEqual([]);
|
|
68
|
-
// expect(mockImportPlugins).toHaveBeenCalledTimes(3);
|
|
69
|
-
});
|
|
70
|
-
test("subscribing to plugins should work", async () => {
|
|
71
|
-
// vite hoists the import plugin from the previous test :/
|
|
72
|
-
const project = await loadProjectInMemory({ blob: await newProject() });
|
|
73
|
-
const state = createProjectState({
|
|
74
|
-
lix: project.lix,
|
|
75
|
-
settings: {
|
|
76
|
-
baseLocale: "en",
|
|
77
|
-
locales: ["en"],
|
|
78
|
-
modules: [],
|
|
79
|
-
},
|
|
80
|
-
});
|
|
81
|
-
expect(await state.plugins.get()).toEqual([]);
|
|
82
|
-
let pluginsFromSub = [];
|
|
83
|
-
const sub = state.plugins.subscribe((value) => {
|
|
84
|
-
pluginsFromSub = value;
|
|
85
|
-
});
|
|
86
|
-
await project.lix.db
|
|
87
|
-
.updateTable("file")
|
|
88
|
-
.where("path", "=", "/settings.json")
|
|
89
|
-
.set({
|
|
90
|
-
data: new TextEncoder().encode(JSON.stringify({
|
|
91
|
-
baseLocale: "en",
|
|
92
|
-
locales: ["en"],
|
|
93
|
-
modules: ["broken-module.js"],
|
|
94
|
-
})),
|
|
95
|
-
})
|
|
96
|
-
.execute();
|
|
97
|
-
const plugins = await state.plugins.get();
|
|
98
|
-
expect(plugins.length).toBe(1);
|
|
99
|
-
expect(pluginsFromSub).toStrictEqual(plugins);
|
|
100
|
-
sub.unsubscribe();
|
|
101
|
-
});
|
|
102
|
-
//# sourceMappingURL=state.test.js.map
|
|
103
|
-
//# debugId=3273da9c-b4ab-5b11-a328-4b7846157139
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"state.test.js","sources":["project/state/state.test.ts"],"sourceRoot":"/","sourcesContent":["import { test, expect, vi } from \"vitest\";\nimport { createProjectState } from \"./state.js\";\nimport { newLixFile, openLixInMemory } from \"@lix-js/sdk\";\nimport type { ProjectSettings } from \"../../json-schema/settings.js\";\nimport { loadProjectInMemory } from \"../loadProjectInMemory.js\";\nimport { newProject } from \"../newProject.js\";\nimport type { InlangPlugin } from \"../../plugin/schema.js\";\n\ntest(\"plugins should be re-imported if the settings have been updated\", async () => {\n\tconst mockImportPlugins = vi.hoisted(() =>\n\t\tvi.fn().mockImplementation(async (args) => {\n\t\t\tconst plugins = args.settings.modules.map((uri: any) => {\n\t\t\t\treturn { key: uri };\n\t\t\t});\n\t\t\treturn { plugins, errors: [] };\n\t\t})\n\t);\n\n\tvi.mock(import(\"../../plugin/importPlugins.js\"), async (importOriginal) => {\n\t\tconst mod = await importOriginal();\n\t\treturn {\n\t\t\t...mod,\n\t\t\timportPlugins: mockImportPlugins,\n\t\t};\n\t});\n\n\tconst lix = await openLixInMemory({ blob: await newLixFile() });\n\n\tawait lix.db\n\t\t.insertInto(\"file\")\n\t\t.values({\n\t\t\tpath: \"/settings.json\",\n\t\t\tdata: new TextEncoder().encode(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tbaseLocale: \"en\",\n\t\t\t\t\tlocales: [\"en\"],\n\t\t\t\t\tmodules: [],\n\t\t\t\t} satisfies ProjectSettings)\n\t\t\t),\n\t\t})\n\t\t.execute();\n\n\tconst state = createProjectState({\n\t\tlix,\n\t\tsettings: {\n\t\t\tbaseLocale: \"en\",\n\t\t\tlocales: [\"en\"],\n\t\t\tmodules: [],\n\t\t},\n\t});\n\n\tconst plugins1 = await state.plugins.get();\n\n\texpect(plugins1).toEqual([]);\n\t// expect(mockImportPlugins).toHaveBeenCalledTimes(1);\n\n\tconst settings1 = {\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\"],\n\t\tmodules: [\"@inlang/plugin-react\"],\n\t};\n\n\tawait state.settings.set(settings1);\n\n\tconst plugins2 = await state.plugins.get();\n\texpect(plugins2).toEqual([{ key: \"@inlang/plugin-react\" }]);\n\n\tawait state.settings.set({\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\"],\n\t\tmodules: [\"@inlang/plugin-react\"],\n\t});\n\n\tconst plugins3 = await state.plugins.get();\n\texpect(plugins3).toEqual([{ key: \"@inlang/plugin-react\" }]);\n\t// expect(mockImportPlugins).toHaveBeenCalledTimes(2);\n\n\tstate.settings.set({\n\t\tbaseLocale: \"en\",\n\t\tlocales: [\"en\"],\n\t\tmodules: [],\n\t});\n\n\tconst plugins4 = await state.plugins.get();\n\n\texpect(plugins4).toEqual([]);\n\t// expect(mockImportPlugins).toHaveBeenCalledTimes(3);\n});\n\ntest(\"subscribing to plugins should work\", async () => {\n\t// vite hoists the import plugin from the previous test :/\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tconst state = createProjectState({\n\t\tlix: project.lix,\n\t\tsettings: {\n\t\t\tbaseLocale: \"en\",\n\t\t\tlocales: [\"en\"],\n\t\t\tmodules: [],\n\t\t},\n\t});\n\n\texpect(await state.plugins.get()).toEqual([]);\n\n\tlet pluginsFromSub: readonly InlangPlugin[] = [];\n\tconst sub = state.plugins.subscribe((value) => {\n\t\tpluginsFromSub = value;\n\t});\n\n\tawait project.lix.db\n\t\t.updateTable(\"file\")\n\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t.set({\n\t\t\tdata: new TextEncoder().encode(\n\t\t\t\tJSON.stringify({\n\t\t\t\t\tbaseLocale: \"en\",\n\t\t\t\t\tlocales: [\"en\"],\n\t\t\t\t\tmodules: [\"broken-module.js\"],\n\t\t\t\t})\n\t\t\t),\n\t\t})\n\t\t.execute();\n\n\tconst plugins = await state.plugins.get();\n\texpect(plugins.length).toBe(1);\n\texpect(pluginsFromSub).toStrictEqual(plugins);\n\tsub.unsubscribe();\n});\n"],"names":[],"mappings":"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","debug_id":"3273da9c-b4ab-5b11-a328-4b7846157139"}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Polls a query at a given interval and only emits an
|
|
3
|
-
* event if the result of the query has changed.
|
|
4
|
-
*
|
|
5
|
-
* @example
|
|
6
|
-
* pollQuery(
|
|
7
|
-
* () => db.selectFrom("mock").where("id", "=", "joker").selectAll().execute(),
|
|
8
|
-
* { interval: 100 }
|
|
9
|
-
* ).subscribe((value) => console.log(value));
|
|
10
|
-
*/
|
|
11
|
-
export declare function pollQuery<T>(query: () => Promise<T>, options?: {
|
|
12
|
-
interval?: number;
|
|
13
|
-
}): import("rxjs").Observable<T>;
|
|
14
|
-
//# sourceMappingURL=pollQuery.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pollQuery.d.ts","sourceRoot":"/","sources":["query-utilities/pollQuery.ts"],"names":[],"mappings":"AAEA;;;;;;;;;GASG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAC1B,KAAK,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACvB,OAAO,CAAC,EAAE;IAAE,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,gCAW/B"}
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="a8e7a6a1-507b-5c34-94b9-4ed589f74c73")}catch(e){}}();
|
|
3
|
-
import { distinctUntilChanged, from, switchMap, timer } from "rxjs";
|
|
4
|
-
/**
|
|
5
|
-
* Polls a query at a given interval and only emits an
|
|
6
|
-
* event if the result of the query has changed.
|
|
7
|
-
*
|
|
8
|
-
* @example
|
|
9
|
-
* pollQuery(
|
|
10
|
-
* () => db.selectFrom("mock").where("id", "=", "joker").selectAll().execute(),
|
|
11
|
-
* { interval: 100 }
|
|
12
|
-
* ).subscribe((value) => console.log(value));
|
|
13
|
-
*/
|
|
14
|
-
export function pollQuery(query, options) {
|
|
15
|
-
return timer(0, options?.interval ?? 1000).pipe(switchMap(() => from(query())), distinctUntilChanged(
|
|
16
|
-
// using simplified comparison because a deep equal
|
|
17
|
-
// is not worth the cost (compute, dependency, maintenance)
|
|
18
|
-
// if a false positives slip through it's not a big deal
|
|
19
|
-
(prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)));
|
|
20
|
-
}
|
|
21
|
-
//# sourceMappingURL=pollQuery.js.map
|
|
22
|
-
//# debugId=a8e7a6a1-507b-5c34-94b9-4ed589f74c73
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pollQuery.js","sources":["query-utilities/pollQuery.ts"],"sourceRoot":"/","sourcesContent":["import { distinctUntilChanged, from, switchMap, timer } from \"rxjs\";\n\n/**\n * Polls a query at a given interval and only emits an\n * event if the result of the query has changed.\n *\n * @example\n * pollQuery(\n * \t () => db.selectFrom(\"mock\").where(\"id\", \"=\", \"joker\").selectAll().execute(),\n * { interval: 100 }\n * ).subscribe((value) => console.log(value));\n */\nexport function pollQuery<T>(\n\tquery: () => Promise<T>,\n\toptions?: { interval?: number }\n) {\n\treturn timer(0, options?.interval ?? 1000).pipe(\n\t\tswitchMap(() => from(query())),\n\t\tdistinctUntilChanged(\n\t\t\t// using simplified comparison because a deep equal\n\t\t\t// is not worth the cost (compute, dependency, maintenance)\n\t\t\t// if a false positives slip through it's not a big deal\n\t\t\t(prev, curr) => JSON.stringify(prev) === JSON.stringify(curr)\n\t\t)\n\t);\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,oBAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,MAAM,CAAC;AAEpE;;;;;;;;;GASG;AACH,MAAM,UAAU,SAAS,CACxB,KAAuB,EACvB,OAA+B;IAE/B,OAAO,KAAK,CAAC,CAAC,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI,CAAC,CAAC,IAAI,CAC9C,SAAS,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,EAC9B,oBAAoB;IACnB,mDAAmD;IACnD,2DAA2D;IAC3D,wDAAwD;IACxD,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAC7D,CACD,CAAC;AACH,CAAC","debug_id":"a8e7a6a1-507b-5c34-94b9-4ed589f74c73"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pollQuery.test.d.ts","sourceRoot":"/","sources":["query-utilities/pollQuery.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
!function(){try{var e="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:{},n=(new e.Error).stack;n&&(e._sentryDebugIds=e._sentryDebugIds||{},e._sentryDebugIds[n]="95bcd373-f32e-566b-83ec-71d59b652f92")}catch(e){}}();
|
|
3
|
-
import { test, expect } from "vitest";
|
|
4
|
-
import { createDialect, createInMemoryDatabase } from "sqlite-wasm-kysely";
|
|
5
|
-
import { Kysely } from "kysely";
|
|
6
|
-
import { pollQuery } from "./pollQuery.js";
|
|
7
|
-
import { firstValueFrom } from "rxjs";
|
|
8
|
-
test("it should immediately execute the query irrespective of the interval", async () => {
|
|
9
|
-
const observable = pollQuery(() => Promise.resolve("hello"), {
|
|
10
|
-
interval: 100000,
|
|
11
|
-
});
|
|
12
|
-
const timeBefore = Date.now();
|
|
13
|
-
const value = await firstValueFrom(observable);
|
|
14
|
-
const timeAfter = Date.now();
|
|
15
|
-
expect(value).toBe("hello");
|
|
16
|
-
expect(timeAfter - timeBefore).toBeLessThan(100);
|
|
17
|
-
});
|
|
18
|
-
test("polling should work", async () => {
|
|
19
|
-
const database = await createInMemoryDatabase({});
|
|
20
|
-
const db = new Kysely({
|
|
21
|
-
dialect: createDialect({
|
|
22
|
-
database,
|
|
23
|
-
}),
|
|
24
|
-
});
|
|
25
|
-
await db.schema
|
|
26
|
-
.createTable("mock")
|
|
27
|
-
.addColumn("id", "text")
|
|
28
|
-
.addColumn("path", "text")
|
|
29
|
-
.execute();
|
|
30
|
-
const emittedValues = [];
|
|
31
|
-
const interval = 10;
|
|
32
|
-
const observable = pollQuery(() => db.selectFrom("mock").where("id", "=", "joker").selectAll().execute(), { interval });
|
|
33
|
-
observable.subscribe((value) => emittedValues.push(value));
|
|
34
|
-
expect(emittedValues).lengthOf(0);
|
|
35
|
-
// first Value from should work
|
|
36
|
-
await db.insertInto("mock").values({ id: "joker", path: "batman" }).execute();
|
|
37
|
-
await firstValueFrom(observable);
|
|
38
|
-
expect(emittedValues).lengthOf(1);
|
|
39
|
-
expect(emittedValues.at(-1)).toEqual([{ id: "joker", path: "batman" }]);
|
|
40
|
-
// unrelated query
|
|
41
|
-
await db.insertInto("mock").values({ id: "color", path: "robin" }).execute();
|
|
42
|
-
await new Promise((resolve) => setTimeout(resolve, interval * 2));
|
|
43
|
-
await db
|
|
44
|
-
.updateTable("mock")
|
|
45
|
-
.where("id", "=", "color")
|
|
46
|
-
.set({ path: "barney" })
|
|
47
|
-
.execute();
|
|
48
|
-
// the observable should return the last value if a new subscripton is created.
|
|
49
|
-
// the subscription is simulated with `firstValueFrom`
|
|
50
|
-
const valueInObservable = await firstValueFrom(observable);
|
|
51
|
-
expect(emittedValues).lengthOf(1);
|
|
52
|
-
expect(emittedValues.at(-1)).toEqual([{ id: "joker", path: "batman" }]);
|
|
53
|
-
expect(valueInObservable).toEqual([{ id: "joker", path: "batman" }]);
|
|
54
|
-
// mutating the query of interest, this should trigger the observable
|
|
55
|
-
await db
|
|
56
|
-
.updateTable("mock")
|
|
57
|
-
.where("id", "=", "joker")
|
|
58
|
-
.set({ path: "superman" })
|
|
59
|
-
.execute();
|
|
60
|
-
await new Promise((resolve) => setTimeout(resolve, interval * 2));
|
|
61
|
-
const valueInObservable2 = await firstValueFrom(observable);
|
|
62
|
-
expect(emittedValues).lengthOf(2);
|
|
63
|
-
expect(emittedValues.at(-1)).toEqual([{ id: "joker", path: "superman" }]);
|
|
64
|
-
expect(valueInObservable2).toEqual([{ id: "joker", path: "superman" }]);
|
|
65
|
-
});
|
|
66
|
-
//# sourceMappingURL=pollQuery.test.js.map
|
|
67
|
-
//# debugId=95bcd373-f32e-566b-83ec-71d59b652f92
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pollQuery.test.js","sources":["query-utilities/pollQuery.test.ts"],"sourceRoot":"/","sourcesContent":["import { test, expect } from \"vitest\";\nimport { createDialect, createInMemoryDatabase } from \"sqlite-wasm-kysely\";\nimport { Kysely } from \"kysely\";\nimport { pollQuery } from \"./pollQuery.js\";\nimport { firstValueFrom } from \"rxjs\";\n\ntest(\"it should immediately execute the query irrespective of the interval\", async () => {\n\tconst observable = pollQuery(() => Promise.resolve(\"hello\"), {\n\t\tinterval: 100000,\n\t});\n\n\tconst timeBefore = Date.now();\n\tconst value = await firstValueFrom(observable);\n\tconst timeAfter = Date.now();\n\n\texpect(value).toBe(\"hello\");\n\texpect(timeAfter - timeBefore).toBeLessThan(100);\n});\n\ntest(\"polling should work\", async () => {\n\tconst database = await createInMemoryDatabase({});\n\n\tconst db = new Kysely<{\n\t\tmock: {\n\t\t\tid: string;\n\t\t\tpath: string;\n\t\t};\n\t}>({\n\t\tdialect: createDialect({\n\t\t\tdatabase,\n\t\t}),\n\t});\n\n\tawait db.schema\n\t\t.createTable(\"mock\")\n\t\t.addColumn(\"id\", \"text\")\n\t\t.addColumn(\"path\", \"text\")\n\t\t.execute();\n\n\tconst emittedValues: any[] = [];\n\n\tconst interval = 10;\n\n\tconst observable = pollQuery(\n\t\t() => db.selectFrom(\"mock\").where(\"id\", \"=\", \"joker\").selectAll().execute(),\n\t\t{ interval }\n\t);\n\n\tobservable.subscribe((value) => emittedValues.push(value));\n\n\texpect(emittedValues).lengthOf(0);\n\n\t// first Value from should work\n\tawait db.insertInto(\"mock\").values({ id: \"joker\", path: \"batman\" }).execute();\n\tawait firstValueFrom(observable);\n\texpect(emittedValues).lengthOf(1);\n\texpect(emittedValues.at(-1)).toEqual([{ id: \"joker\", path: \"batman\" }]);\n\n\t// unrelated query\n\tawait db.insertInto(\"mock\").values({ id: \"color\", path: \"robin\" }).execute();\n\tawait new Promise((resolve) => setTimeout(resolve, interval * 2));\n\tawait db\n\t\t.updateTable(\"mock\")\n\t\t.where(\"id\", \"=\", \"color\")\n\t\t.set({ path: \"barney\" })\n\t\t.execute();\n\n\t// the observable should return the last value if a new subscripton is created.\n\t// the subscription is simulated with `firstValueFrom`\n\tconst valueInObservable = await firstValueFrom(observable);\n\texpect(emittedValues).lengthOf(1);\n\texpect(emittedValues.at(-1)).toEqual([{ id: \"joker\", path: \"batman\" }]);\n\texpect(valueInObservable).toEqual([{ id: \"joker\", path: \"batman\" }]);\n\n\t// mutating the query of interest, this should trigger the observable\n\tawait db\n\t\t.updateTable(\"mock\")\n\t\t.where(\"id\", \"=\", \"joker\")\n\t\t.set({ path: \"superman\" })\n\t\t.execute();\n\n\tawait new Promise((resolve) => setTimeout(resolve, interval * 2));\n\tconst valueInObservable2 = await firstValueFrom(observable);\n\n\texpect(emittedValues).lengthOf(2);\n\texpect(emittedValues.at(-1)).toEqual([{ id: \"joker\", path: \"superman\" }]);\n\texpect(valueInObservable2).toEqual([{ id: \"joker\", path: \"superman\" }]);\n});\n"],"names":[],"mappings":"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","debug_id":"95bcd373-f32e-566b-83ec-71d59b652f92"}
|