@inlang/sdk 2.0.0-beta.1 → 2.0.0-beta.3

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.
Files changed (37) hide show
  1. package/dist/index.d.ts +0 -2
  2. package/dist/index.d.ts.map +1 -1
  3. package/dist/index.js +2 -4
  4. package/dist/index.js.map +1 -1
  5. package/dist/lix/index.d.ts +2 -0
  6. package/dist/lix/index.d.ts.map +1 -0
  7. package/dist/lix/index.js +5 -0
  8. package/dist/lix/index.js.map +1 -0
  9. package/dist/project/loadProject.d.ts.map +1 -1
  10. package/dist/project/loadProject.js +3 -2
  11. package/dist/project/loadProject.js.map +1 -1
  12. package/dist/project/loadProject.test.js +2 -2
  13. package/dist/project/loadProject.test.js.map +1 -1
  14. package/dist/project/maybeCaptureTelemetry.d.ts +2 -0
  15. package/dist/project/maybeCaptureTelemetry.d.ts.map +1 -1
  16. package/dist/project/maybeCaptureTelemetry.js +7 -2
  17. package/dist/project/maybeCaptureTelemetry.js.map +1 -1
  18. package/dist/project/maybeCaptureTelemetry.test.js +8 -2
  19. package/dist/project/maybeCaptureTelemetry.test.js.map +1 -1
  20. package/dist/services/env-variables/index.d.ts +2 -2
  21. package/dist/services/env-variables/index.js +5 -5
  22. package/dist/services/env-variables/index.js.map +1 -1
  23. package/dist/services/telemetry/capture.d.ts +1 -0
  24. package/dist/services/telemetry/capture.d.ts.map +1 -1
  25. package/dist/services/telemetry/capture.js +5 -6
  26. package/dist/services/telemetry/capture.js.map +1 -1
  27. package/dist/services/telemetry/capture.test.js +4 -2
  28. package/dist/services/telemetry/capture.test.js.map +1 -1
  29. package/package.json +3 -2
  30. package/src/index.ts +0 -2
  31. package/src/lix/index.ts +1 -0
  32. package/src/project/loadProject.test.ts +0 -1
  33. package/src/project/loadProject.ts +1 -0
  34. package/src/project/maybeCaptureTelemetry.test.ts +7 -0
  35. package/src/project/maybeCaptureTelemetry.ts +8 -0
  36. package/src/services/telemetry/capture.test.ts +2 -0
  37. package/src/services/telemetry/capture.ts +5 -4
package/dist/index.d.ts CHANGED
@@ -18,7 +18,5 @@ export type { ImportFile, ExportFile } from "./project/api.js";
18
18
  export type { InlangPlugin, BundleImport, MessageImport, VariantImport, } from "./plugin/schema.js";
19
19
  export type { IdeExtensionConfig } from "./plugin/meta/ideExtension.js";
20
20
  export * from "./database/schema.js";
21
- export * from "@lix-js/sdk";
22
21
  export { createMessageV1 } from "./migrations/v2/createMessageV1.js";
23
- export { v7 as uuidV7 } from "uuid";
24
22
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,EACN,wBAAwB;AACxB;;GAEG;AACH,wBAAwB,IAAI,gCAAgC,GAC5D,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,YAAY,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,GACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,EACN,wBAAwB;AACxB;;GAEG;AACH,wBAAwB,IAAI,gCAAgC,GAC5D,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAC7E,YAAY,EAAE,aAAa,EAAE,MAAM,kBAAkB,CAAC;AACtD,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AACjD,YAAY,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AACjE,YAAY,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAC/D,YAAY,EACX,YAAY,EACZ,YAAY,EACZ,aAAa,EACb,aAAa,GACb,MAAM,oBAAoB,CAAC;AAC5B,YAAY,EAAE,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACxE,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC"}
package/dist/index.js CHANGED
@@ -1,5 +1,5 @@
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]="38386619-c225-5777-b3e6-7b50f41eb3d4")}catch(e){}}();
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]="52176809-8d80-5a47-906d-ab39ab74ae04")}catch(e){}}();
3
3
  export { newProject } from "./project/newProject.js";
4
4
  export { loadProjectInMemory } from "./project/loadProjectInMemory.js";
5
5
  export { loadProjectFromDirectory,
@@ -15,8 +15,6 @@ export * from "./query-utilities/index.js";
15
15
  export * from "./plugin/errors.js";
16
16
  export { humanId } from "./human-id/human-id.js";
17
17
  export * from "./database/schema.js";
18
- export * from "@lix-js/sdk";
19
18
  export { createMessageV1 } from "./migrations/v2/createMessageV1.js";
20
- export { v7 as uuidV7 } from "uuid";
21
19
  //# sourceMappingURL=index.js.map
22
- //# debugId=38386619-c225-5777-b3e6-7b50f41eb3d4
20
+ //# debugId=52176809-8d80-5a47-906d-ab39ab74ae04
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["index.ts"],"sourceRoot":"/","sourcesContent":["export { newProject } from \"./project/newProject.js\";\nexport { loadProjectInMemory } from \"./project/loadProjectInMemory.js\";\n\nexport {\n\tloadProjectFromDirectory,\n\t/**\n\t * @deprecated use `loadProjectFromDirectory()` instead (it's a rename)\n\t */\n\tloadProjectFromDirectory as loadProjectFromDirectoryInMemory,\n} from \"./project/loadProjectFromDirectory.js\";\n\nexport { saveProjectToDirectory } from \"./project/saveProjectToDirectory.js\";\nexport type { InlangProject } from \"./project/api.js\";\nexport * from \"./json-schema/settings.js\";\nexport * from \"./json-schema/pattern.js\";\nexport * from \"./helper.js\";\nexport * from \"./query-utilities/index.js\";\nexport * from \"./plugin/errors.js\";\nexport { humanId } from \"./human-id/human-id.js\";\nexport type { InlangDatabaseSchema } from \"./database/schema.js\";\nexport type { ImportFile, ExportFile } from \"./project/api.js\";\nexport type {\n\tInlangPlugin,\n\tBundleImport,\n\tMessageImport,\n\tVariantImport,\n} from \"./plugin/schema.js\";\nexport type { IdeExtensionConfig } from \"./plugin/meta/ideExtension.js\";\nexport * from \"./database/schema.js\";\nexport * from \"@lix-js/sdk\";\nexport { createMessageV1 } from \"./migrations/v2/createMessageV1.js\";\nexport { v7 as uuidV7 } from \"uuid\";\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,EACN,wBAAwB;AACxB;;GAEG;AACH,wBAAwB,IAAI,gCAAgC,GAC5D,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAE7E,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAUjD,cAAc,sBAAsB,CAAC;AACrC,cAAc,aAAa,CAAC;AAC5B,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC;AACrE,OAAO,EAAE,EAAE,IAAI,MAAM,EAAE,MAAM,MAAM,CAAC","debug_id":"38386619-c225-5777-b3e6-7b50f41eb3d4"}
1
+ {"version":3,"file":"index.js","sources":["index.ts"],"sourceRoot":"/","sourcesContent":["export { newProject } from \"./project/newProject.js\";\nexport { loadProjectInMemory } from \"./project/loadProjectInMemory.js\";\n\nexport {\n\tloadProjectFromDirectory,\n\t/**\n\t * @deprecated use `loadProjectFromDirectory()` instead (it's a rename)\n\t */\n\tloadProjectFromDirectory as loadProjectFromDirectoryInMemory,\n} from \"./project/loadProjectFromDirectory.js\";\n\nexport { saveProjectToDirectory } from \"./project/saveProjectToDirectory.js\";\nexport type { InlangProject } from \"./project/api.js\";\nexport * from \"./json-schema/settings.js\";\nexport * from \"./json-schema/pattern.js\";\nexport * from \"./helper.js\";\nexport * from \"./query-utilities/index.js\";\nexport * from \"./plugin/errors.js\";\nexport { humanId } from \"./human-id/human-id.js\";\nexport type { InlangDatabaseSchema } from \"./database/schema.js\";\nexport type { ImportFile, ExportFile } from \"./project/api.js\";\nexport type {\n\tInlangPlugin,\n\tBundleImport,\n\tMessageImport,\n\tVariantImport,\n} from \"./plugin/schema.js\";\nexport type { IdeExtensionConfig } from \"./plugin/meta/ideExtension.js\";\nexport * from \"./database/schema.js\";\nexport { createMessageV1 } from \"./migrations/v2/createMessageV1.js\";\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,yBAAyB,CAAC;AACrD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kCAAkC,CAAC;AAEvE,OAAO,EACN,wBAAwB;AACxB;;GAEG;AACH,wBAAwB,IAAI,gCAAgC,GAC5D,MAAM,uCAAuC,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qCAAqC,CAAC;AAE7E,cAAc,2BAA2B,CAAC;AAC1C,cAAc,0BAA0B,CAAC;AACzC,cAAc,aAAa,CAAC;AAC5B,cAAc,4BAA4B,CAAC;AAC3C,cAAc,oBAAoB,CAAC;AACnC,OAAO,EAAE,OAAO,EAAE,MAAM,wBAAwB,CAAC;AAUjD,cAAc,sBAAsB,CAAC;AACrC,OAAO,EAAE,eAAe,EAAE,MAAM,oCAAoC,CAAC","debug_id":"52176809-8d80-5a47-906d-ab39ab74ae04"}
@@ -0,0 +1,2 @@
1
+ export * from "@lix-js/sdk";
2
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"/","sources":["lix/index.ts"],"names":[],"mappings":"AAAA,cAAc,aAAa,CAAC"}
@@ -0,0 +1,5 @@
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]="336ae7a2-06c7-52d6-a8f1-83c9d685534e")}catch(e){}}();
3
+ export * from "@lix-js/sdk";
4
+ //# sourceMappingURL=index.js.map
5
+ //# debugId=336ae7a2-06c7-52d6-a8f1-83c9d685534e
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sources":["lix/index.ts"],"sourceRoot":"/","sourcesContent":["export * from \"@lix-js/sdk\";\n"],"names":[],"mappings":";;AAAA,cAAc,aAAa,CAAC","debug_id":"336ae7a2-06c7-52d6-a8f1-83c9d685534e"}
@@ -1 +1 @@
1
- {"version":3,"file":"loadProject.d.ts","sourceRoot":"/","sources":["project/loadProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EAEN,KAAK,oCAAoC,EACzC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ9C;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,GAAG,CAAC;IACT;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC;;;;;;;;;;;OAWG;IACH,4BAA4B,CAAC,EAAE,oCAAoC,CAAC;IACpE;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,aAAa,CAAC,CA6JzB"}
1
+ {"version":3,"file":"loadProject.d.ts","sourceRoot":"/","sources":["project/loadProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,KAAK,OAAO,EAAE,KAAK,GAAG,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAExD,OAAO,EAAE,KAAK,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAGzD,OAAO,EAEN,KAAK,oCAAoC,EACzC,MAAM,4BAA4B,CAAC;AACpC,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAQ9C;;GAEG;AACH,wBAAsB,WAAW,CAAC,IAAI,EAAE;IACvC,MAAM,EAAE,cAAc,CAAC;IACvB,GAAG,EAAE,GAAG,CAAC;IACT;;;;;;;;OAQG;IACH,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB;;;;;;OAMG;IACH,cAAc,CAAC,EAAE,YAAY,EAAE,CAAC;IAChC;;;;;;;;;;;OAWG;IACH,4BAA4B,CAAC,EAAE,oCAAoC,CAAC;IACpE;;;;;;;OAOG;IACH,KAAK,CAAC,EAAE,MAAM,CAAC;CACf,GAAG,OAAO,CAAC,aAAa,CAAC,CA8JzB"}
@@ -1,5 +1,5 @@
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]="1ed739ae-094d-54d9-aca1-5fc545826e24")}catch(e){}}();
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]="ed6fb309-3e32-52c8-87d0-1d450e0d29b9")}catch(e){}}();
3
3
  import { toBlob } from "@lix-js/sdk";
4
4
  import {} from "sqlite-wasm-kysely";
5
5
  import { initDb } from "../database/initDb.js";
@@ -55,6 +55,7 @@ export async function loadProject(args) {
55
55
  id,
56
56
  settings,
57
57
  plugins,
58
+ lix: args.lix,
58
59
  appId: args.appId,
59
60
  });
60
61
  initErrorReporting({ projectId: id });
@@ -164,4 +165,4 @@ async function maybeMigrateFirstProjectId(args) {
164
165
  }
165
166
  }
166
167
  //# sourceMappingURL=loadProject.js.map
167
- //# debugId=1ed739ae-094d-54d9-aca1-5fc545826e24
168
+ //# debugId=ed6fb309-3e32-52c8-87d0-1d450e0d29b9
@@ -1 +1 @@
1
- {"version":3,"file":"loadProject.js","sources":["project/loadProject.ts"],"sourceRoot":"/","sourcesContent":["import { toBlob, type Account, type Lix } from \"@lix-js/sdk\";\nimport type { InlangPlugin } from \"../plugin/schema.js\";\nimport type { ProjectSettings } from \"../json-schema/settings.js\";\nimport { type SqliteDatabase } from \"sqlite-wasm-kysely\";\nimport { initDb } from \"../database/initDb.js\";\nimport { initHandleSaveToLixOnChange } from \"./initHandleSaveToLixOnChange.js\";\nimport {\n\timportPlugins,\n\ttype PreprocessPluginBeforeImportFunction,\n} from \"../plugin/importPlugins.js\";\nimport type { InlangProject } from \"./api.js\";\nimport { withLanguageTagToLocaleMigration } from \"../migrations/v2/withLanguageTagToLocaleMigration.js\";\nimport { v4 } from \"uuid\";\nimport { initErrorReporting } from \"../services/error-reporting/index.js\";\nimport { maybeCaptureLoadedProject } from \"./maybeCaptureTelemetry.js\";\nimport { importFiles } from \"../import-export/importFiles.js\";\nimport { exportFiles } from \"../import-export/exportFiles.js\";\n\n/**\n * Common load project logic.\n */\nexport async function loadProject(args: {\n\tsqlite: SqliteDatabase;\n\tlix: Lix;\n\t/**\n\t * The account that loaded the project.\n\t *\n\t * Defaults to an anonymous/new account if undefined.\n\t *\n\t * @example\n\t * const account = localStorage.getItem(\"account\")\n\t * const project = await loadProject({ account })\n\t */\n\taccount?: Account;\n\t/**\n\t * Provide plugins to the project.\n\t *\n\t * This is useful for testing or providing plugins that are\n\t * app specific. Keep in mind that provided plugins\n\t * are not shared with other instances.\n\t */\n\tprovidePlugins?: InlangPlugin[];\n\t/**\n\t * Function that preprocesses the plugin before importing it.\n\t *\n\t * The callback can be used to process plugins as needed in the\n\t * environment of the app. For example, Sherlock uses this to convert\n\t * ESM, which all inlang plugins are written in, to CJS which Sherlock\n\t * runs in.\n\t *\n\t * @example\n\t * const project = await loadProject({ preprocessPluginBeforeImport: (moduleText) => convertEsmToCjs(moduleText) })\n\t *\n\t */\n\tpreprocessPluginBeforeImport?: PreprocessPluginBeforeImportFunction;\n\t/**\n\t * The id of the app that is using the SDK.\n\t *\n\t * The is used for telemetry purposes. To derive insights like\n\t * which app is using the SDK, how many projects are loaded, etc.\n\t *\n\t * The app id can be removed at any time in the future\n\t */\n\tappId?: string;\n}): Promise<InlangProject> {\n\tconst db = initDb({ sqlite: args.sqlite });\n\n\tawait maybeMigrateFirstProjectId({ lix: args.lix });\n\n\tconst settingsFile = await args.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 settings = withLanguageTagToLocaleMigration(\n\t\tJSON.parse(new TextDecoder().decode(settingsFile.data)) as ProjectSettings\n\t);\n\n\tconst importedPlugins = await importPlugins({\n\t\tsettings,\n\t\tlix: args.lix,\n\t\tpreprocessPluginBeforeImport: args.preprocessPluginBeforeImport,\n\t});\n\n\tconst plugins = [...(args.providePlugins ?? []), ...importedPlugins.plugins];\n\n\tconst idFile = await args.lix.db\n\t\t.selectFrom(\"file\")\n\t\t.where(\"path\", \"=\", \"/project_id\")\n\t\t.select(\"data\")\n\t\t.executeTakeFirstOrThrow();\n\n\tconst id = new TextDecoder().decode(idFile.data);\n\n\t// const state = createProjectState({\n\t// \t...args,\n\t// \tsettings,\n\t// });\n\n\t// TODO implement garbage collection/a proper queue.\n\t// for the protoype and tests, it seems good enough\n\t// without garbage collection of old promises.\n\tconst pendingSaveToLixPromises: Promise<unknown>[] = [];\n\n\tawait initHandleSaveToLixOnChange({\n\t\tsqlite: args.sqlite,\n\t\tdb,\n\t\tlix: args.lix,\n\t\tpendingPromises: pendingSaveToLixPromises,\n\t});\n\n\t// not awaiting to not block the load time of a project\n\tmaybeCaptureLoadedProject({\n\t\tdb,\n\t\tid,\n\t\tsettings,\n\t\tplugins,\n\t\tappId: args.appId,\n\t});\n\n\tinitErrorReporting({ projectId: id });\n\n\treturn {\n\t\tdb,\n\t\tid: {\n\t\t\tget: async () => {\n\t\t\t\tconst file = await args.lix.db\n\t\t\t\t\t.selectFrom(\"file\")\n\t\t\t\t\t.where(\"path\", \"=\", \"/project_id\")\n\t\t\t\t\t.select(\"file.data\")\n\t\t\t\t\t.executeTakeFirstOrThrow();\n\t\t\t\treturn new TextDecoder().decode(file.data);\n\t\t\t},\n\t\t},\n\t\tsettings: {\n\t\t\tget: async () => {\n\t\t\t\tconst file = await args.lix.db\n\t\t\t\t\t.selectFrom(\"file\")\n\t\t\t\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t\t\t\t.select(\"file.data\")\n\t\t\t\t\t.executeTakeFirstOrThrow();\n\t\t\t\treturn withLanguageTagToLocaleMigration(\n\t\t\t\t\tJSON.parse(new TextDecoder().decode(file.data))\n\t\t\t\t);\n\t\t\t},\n\t\t\tset: async (newSettings) => {\n\t\t\t\tconst cloned = JSON.parse(JSON.stringify(newSettings));\n\t\t\t\tcloned.languageTags = cloned.locales;\n\t\t\t\tcloned.sourceLanguageTag = cloned.baseLocale;\n\n\t\t\t\tawait args.lix.db\n\t\t\t\t\t.updateTable(\"file\")\n\t\t\t\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t\t\t\t.set({\n\t\t\t\t\t\tdata: new TextEncoder().encode(\n\t\t\t\t\t\t\tJSON.stringify(cloned, undefined, 2)\n\t\t\t\t\t\t),\n\t\t\t\t\t})\n\t\t\t\t\t.execute();\n\t\t\t},\n\t\t},\n\t\tplugins: {\n\t\t\tget: async () => plugins,\n\t\t},\n\t\terrors: {\n\t\t\tget: async () => [...importedPlugins.errors],\n\t\t},\n\t\t// errors: state.errors,\n\t\timportFiles: async ({ files, pluginKey }) => {\n\t\t\tconst settingsFile = await args.lix.db\n\t\t\t\t.selectFrom(\"file\")\n\t\t\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t\t\t.select(\"file.data\")\n\t\t\t\t.executeTakeFirstOrThrow();\n\n\t\t\tconst settings = JSON.parse(\n\t\t\t\tnew TextDecoder().decode(settingsFile.data)\n\t\t\t) as ProjectSettings;\n\n\t\t\treturn await importFiles({\n\t\t\t\tfiles,\n\t\t\t\tpluginKey,\n\t\t\t\tsettings,\n\t\t\t\t// TODO don't use global state, might be stale\n\t\t\t\tplugins,\n\t\t\t\tdb,\n\t\t\t});\n\t\t},\n\t\texportFiles: async ({ pluginKey }) => {\n\t\t\tconst settingsFile = await args.lix.db\n\t\t\t\t.selectFrom(\"file\")\n\t\t\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t\t\t.select(\"file.data\")\n\t\t\t\t.executeTakeFirstOrThrow();\n\n\t\t\tconst settings = JSON.parse(\n\t\t\t\tnew TextDecoder().decode(settingsFile.data)\n\t\t\t) as ProjectSettings;\n\n\t\t\treturn (\n\t\t\t\tawait exportFiles({\n\t\t\t\t\tpluginKey,\n\t\t\t\t\tdb,\n\t\t\t\t\tsettings,\n\t\t\t\t\t// TODO don't use global state, might be stale\n\t\t\t\t\tplugins,\n\t\t\t\t})\n\t\t\t).map((output) => ({ ...output, pluginKey }));\n\t\t},\n\t\tclose: async () => {\n\t\t\tawait db.destroy();\n\t\t\tawait args.lix.db.destroy();\n\t\t},\n\t\t_sqlite: args.sqlite,\n\t\ttoBlob: async () => {\n\t\t\tawait Promise.all(pendingSaveToLixPromises);\n\t\t\treturn await toBlob({ lix: args.lix });\n\t\t},\n\t\tlix: args.lix,\n\t};\n}\n\n/**\n * Old leftover migration from v1. Probably not needed anymore.\n *\n * Kept it in just in case.\n */\nasync function maybeMigrateFirstProjectId(args: { lix: Lix }): Promise<void> {\n\tconst firstProjectIdFile = await args.lix.db\n\t\t.selectFrom(\"file\")\n\t\t.select(\"data\")\n\t\t.where(\"path\", \"=\", \"/project_id\")\n\t\t.executeTakeFirst();\n\n\tif (!firstProjectIdFile) {\n\t\tawait args.lix.db\n\t\t\t.insertInto(\"file\")\n\t\t\t.values({\n\t\t\t\tpath: \"/project_id\",\n\t\t\t\tdata: new TextEncoder().encode(v4()),\n\t\t\t})\n\t\t\t.execute();\n\t}\n}\n"],"names":[],"mappings":"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","debug_id":"1ed739ae-094d-54d9-aca1-5fc545826e24"}
1
+ {"version":3,"file":"loadProject.js","sources":["project/loadProject.ts"],"sourceRoot":"/","sourcesContent":["import { toBlob, type Account, type Lix } from \"@lix-js/sdk\";\nimport type { InlangPlugin } from \"../plugin/schema.js\";\nimport type { ProjectSettings } from \"../json-schema/settings.js\";\nimport { type SqliteDatabase } from \"sqlite-wasm-kysely\";\nimport { initDb } from \"../database/initDb.js\";\nimport { initHandleSaveToLixOnChange } from \"./initHandleSaveToLixOnChange.js\";\nimport {\n\timportPlugins,\n\ttype PreprocessPluginBeforeImportFunction,\n} from \"../plugin/importPlugins.js\";\nimport type { InlangProject } from \"./api.js\";\nimport { withLanguageTagToLocaleMigration } from \"../migrations/v2/withLanguageTagToLocaleMigration.js\";\nimport { v4 } from \"uuid\";\nimport { initErrorReporting } from \"../services/error-reporting/index.js\";\nimport { maybeCaptureLoadedProject } from \"./maybeCaptureTelemetry.js\";\nimport { importFiles } from \"../import-export/importFiles.js\";\nimport { exportFiles } from \"../import-export/exportFiles.js\";\n\n/**\n * Common load project logic.\n */\nexport async function loadProject(args: {\n\tsqlite: SqliteDatabase;\n\tlix: Lix;\n\t/**\n\t * The account that loaded the project.\n\t *\n\t * Defaults to an anonymous/new account if undefined.\n\t *\n\t * @example\n\t * const account = localStorage.getItem(\"account\")\n\t * const project = await loadProject({ account })\n\t */\n\taccount?: Account;\n\t/**\n\t * Provide plugins to the project.\n\t *\n\t * This is useful for testing or providing plugins that are\n\t * app specific. Keep in mind that provided plugins\n\t * are not shared with other instances.\n\t */\n\tprovidePlugins?: InlangPlugin[];\n\t/**\n\t * Function that preprocesses the plugin before importing it.\n\t *\n\t * The callback can be used to process plugins as needed in the\n\t * environment of the app. For example, Sherlock uses this to convert\n\t * ESM, which all inlang plugins are written in, to CJS which Sherlock\n\t * runs in.\n\t *\n\t * @example\n\t * const project = await loadProject({ preprocessPluginBeforeImport: (moduleText) => convertEsmToCjs(moduleText) })\n\t *\n\t */\n\tpreprocessPluginBeforeImport?: PreprocessPluginBeforeImportFunction;\n\t/**\n\t * The id of the app that is using the SDK.\n\t *\n\t * The is used for telemetry purposes. To derive insights like\n\t * which app is using the SDK, how many projects are loaded, etc.\n\t *\n\t * The app id can be removed at any time in the future\n\t */\n\tappId?: string;\n}): Promise<InlangProject> {\n\tconst db = initDb({ sqlite: args.sqlite });\n\n\tawait maybeMigrateFirstProjectId({ lix: args.lix });\n\n\tconst settingsFile = await args.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 settings = withLanguageTagToLocaleMigration(\n\t\tJSON.parse(new TextDecoder().decode(settingsFile.data)) as ProjectSettings\n\t);\n\n\tconst importedPlugins = await importPlugins({\n\t\tsettings,\n\t\tlix: args.lix,\n\t\tpreprocessPluginBeforeImport: args.preprocessPluginBeforeImport,\n\t});\n\n\tconst plugins = [...(args.providePlugins ?? []), ...importedPlugins.plugins];\n\n\tconst idFile = await args.lix.db\n\t\t.selectFrom(\"file\")\n\t\t.where(\"path\", \"=\", \"/project_id\")\n\t\t.select(\"data\")\n\t\t.executeTakeFirstOrThrow();\n\n\tconst id = new TextDecoder().decode(idFile.data);\n\n\t// const state = createProjectState({\n\t// \t...args,\n\t// \tsettings,\n\t// });\n\n\t// TODO implement garbage collection/a proper queue.\n\t// for the protoype and tests, it seems good enough\n\t// without garbage collection of old promises.\n\tconst pendingSaveToLixPromises: Promise<unknown>[] = [];\n\n\tawait initHandleSaveToLixOnChange({\n\t\tsqlite: args.sqlite,\n\t\tdb,\n\t\tlix: args.lix,\n\t\tpendingPromises: pendingSaveToLixPromises,\n\t});\n\n\t// not awaiting to not block the load time of a project\n\tmaybeCaptureLoadedProject({\n\t\tdb,\n\t\tid,\n\t\tsettings,\n\t\tplugins,\n\t\tlix: args.lix,\n\t\tappId: args.appId,\n\t});\n\n\tinitErrorReporting({ projectId: id });\n\n\treturn {\n\t\tdb,\n\t\tid: {\n\t\t\tget: async () => {\n\t\t\t\tconst file = await args.lix.db\n\t\t\t\t\t.selectFrom(\"file\")\n\t\t\t\t\t.where(\"path\", \"=\", \"/project_id\")\n\t\t\t\t\t.select(\"file.data\")\n\t\t\t\t\t.executeTakeFirstOrThrow();\n\t\t\t\treturn new TextDecoder().decode(file.data);\n\t\t\t},\n\t\t},\n\t\tsettings: {\n\t\t\tget: async () => {\n\t\t\t\tconst file = await args.lix.db\n\t\t\t\t\t.selectFrom(\"file\")\n\t\t\t\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t\t\t\t.select(\"file.data\")\n\t\t\t\t\t.executeTakeFirstOrThrow();\n\t\t\t\treturn withLanguageTagToLocaleMigration(\n\t\t\t\t\tJSON.parse(new TextDecoder().decode(file.data))\n\t\t\t\t);\n\t\t\t},\n\t\t\tset: async (newSettings) => {\n\t\t\t\tconst cloned = JSON.parse(JSON.stringify(newSettings));\n\t\t\t\tcloned.languageTags = cloned.locales;\n\t\t\t\tcloned.sourceLanguageTag = cloned.baseLocale;\n\n\t\t\t\tawait args.lix.db\n\t\t\t\t\t.updateTable(\"file\")\n\t\t\t\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t\t\t\t.set({\n\t\t\t\t\t\tdata: new TextEncoder().encode(\n\t\t\t\t\t\t\tJSON.stringify(cloned, undefined, 2)\n\t\t\t\t\t\t),\n\t\t\t\t\t})\n\t\t\t\t\t.execute();\n\t\t\t},\n\t\t},\n\t\tplugins: {\n\t\t\tget: async () => plugins,\n\t\t},\n\t\terrors: {\n\t\t\tget: async () => [...importedPlugins.errors],\n\t\t},\n\t\t// errors: state.errors,\n\t\timportFiles: async ({ files, pluginKey }) => {\n\t\t\tconst settingsFile = await args.lix.db\n\t\t\t\t.selectFrom(\"file\")\n\t\t\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t\t\t.select(\"file.data\")\n\t\t\t\t.executeTakeFirstOrThrow();\n\n\t\t\tconst settings = JSON.parse(\n\t\t\t\tnew TextDecoder().decode(settingsFile.data)\n\t\t\t) as ProjectSettings;\n\n\t\t\treturn await importFiles({\n\t\t\t\tfiles,\n\t\t\t\tpluginKey,\n\t\t\t\tsettings,\n\t\t\t\t// TODO don't use global state, might be stale\n\t\t\t\tplugins,\n\t\t\t\tdb,\n\t\t\t});\n\t\t},\n\t\texportFiles: async ({ pluginKey }) => {\n\t\t\tconst settingsFile = await args.lix.db\n\t\t\t\t.selectFrom(\"file\")\n\t\t\t\t.where(\"path\", \"=\", \"/settings.json\")\n\t\t\t\t.select(\"file.data\")\n\t\t\t\t.executeTakeFirstOrThrow();\n\n\t\t\tconst settings = JSON.parse(\n\t\t\t\tnew TextDecoder().decode(settingsFile.data)\n\t\t\t) as ProjectSettings;\n\n\t\t\treturn (\n\t\t\t\tawait exportFiles({\n\t\t\t\t\tpluginKey,\n\t\t\t\t\tdb,\n\t\t\t\t\tsettings,\n\t\t\t\t\t// TODO don't use global state, might be stale\n\t\t\t\t\tplugins,\n\t\t\t\t})\n\t\t\t).map((output) => ({ ...output, pluginKey }));\n\t\t},\n\t\tclose: async () => {\n\t\t\tawait db.destroy();\n\t\t\tawait args.lix.db.destroy();\n\t\t},\n\t\t_sqlite: args.sqlite,\n\t\ttoBlob: async () => {\n\t\t\tawait Promise.all(pendingSaveToLixPromises);\n\t\t\treturn await toBlob({ lix: args.lix });\n\t\t},\n\t\tlix: args.lix,\n\t};\n}\n\n/**\n * Old leftover migration from v1. Probably not needed anymore.\n *\n * Kept it in just in case.\n */\nasync function maybeMigrateFirstProjectId(args: { lix: Lix }): Promise<void> {\n\tconst firstProjectIdFile = await args.lix.db\n\t\t.selectFrom(\"file\")\n\t\t.select(\"data\")\n\t\t.where(\"path\", \"=\", \"/project_id\")\n\t\t.executeTakeFirst();\n\n\tif (!firstProjectIdFile) {\n\t\tawait args.lix.db\n\t\t\t.insertInto(\"file\")\n\t\t\t.values({\n\t\t\t\tpath: \"/project_id\",\n\t\t\t\tdata: new TextEncoder().encode(v4()),\n\t\t\t})\n\t\t\t.execute();\n\t}\n}\n"],"names":[],"mappings":"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","debug_id":"ed6fb309-3e32-52c8-87d0-1d450e0d29b9"}
@@ -1,5 +1,5 @@
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]="cb1a2e49-9c10-5ea7-aae1-8a7e2e7cfc62")}catch(e){}}();
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]="d1aa7d55-973a-5652-b6c6-b87ef78216ef")}catch(e){}}();
3
3
  import { expect, test } from "vitest";
4
4
  import { newProject } from "./newProject.js";
5
5
  import { loadProjectInMemory } from "./loadProjectInMemory.js";
@@ -143,4 +143,4 @@ test("closing a project should not lead to a throw", async () => {
143
143
  await new Promise((resolve) => setTimeout(resolve, 250));
144
144
  });
145
145
  //# sourceMappingURL=loadProject.test.js.map
146
- //# debugId=cb1a2e49-9c10-5ea7-aae1-8a7e2e7cfc62
146
+ //# debugId=d1aa7d55-973a-5652-b6c6-b87ef78216ef
@@ -1 +1 @@
1
- {"version":3,"file":"loadProject.test.js","sources":["project/loadProject.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, test } from \"vitest\";\nimport { newProject } from \"./newProject.js\";\nimport { loadProjectInMemory } from \"./loadProjectInMemory.js\";\nimport { validate } from \"uuid\";\n\ntest(\"it should persist changes of bundles, messages, and variants to lix \", async () => {\n\tconst file1 = await newProject();\n\tconst project1 = await loadProjectInMemory({ blob: file1 });\n\tconst bundle = await project1.db\n\t\t.insertInto(\"bundle\")\n\t\t.defaultValues()\n\t\t.returning(\"id\")\n\t\t.executeTakeFirstOrThrow();\n\n\tconst message = await project1.db\n\t\t.insertInto(\"message\")\n\t\t.values({\n\t\t\tbundleId: bundle.id,\n\t\t\tlocale: \"en\",\n\t\t})\n\t\t.returning(\"id\")\n\t\t.executeTakeFirstOrThrow();\n\n\tawait project1.db\n\t\t.insertInto(\"variant\")\n\t\t.values({\n\t\t\tmessageId: message.id,\n\t\t})\n\t\t.execute();\n\n\tconst file1AfterUpdates = await project1.toBlob();\n\tawait project1.close();\n\n\tconst project2 = await loadProjectInMemory({ blob: file1AfterUpdates });\n\tconst bundles = await project2.db.selectFrom(\"bundle\").select(\"id\").execute();\n\tconst messages = await project2.db\n\t\t.selectFrom(\"message\")\n\t\t.select(\"id\")\n\t\t.execute();\n\tconst variants = await project2.db\n\t\t.selectFrom(\"variant\")\n\t\t.select(\"id\")\n\t\t.execute();\n\texpect(bundles.length).toBe(1);\n\texpect(messages.length).toBe(1);\n\texpect(variants.length).toBe(1);\n});\n\ntest(\"get and set settings\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\tconst settings = await project.settings.get();\n\n\texpect(settings[\"plugin.key\"]).toBeUndefined();\n\n\tconst copied = structuredClone(settings);\n\n\tcopied[\"plugin.key\"] = { test: \"value\" };\n\n\tawait project.settings.set(copied);\n\n\tconst updatedSettings = await project.settings.get();\n\texpect(updatedSettings[\"plugin.key\"]).toEqual({ test: \"value\" });\n});\n\ntest(\"it should set sourceLanguageTag and languageTags if non-existent to make v1 plugins work\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t});\n\tconst settings = await project.settings.get();\n\texpect(settings.baseLocale).toBe(\"en\");\n\texpect(settings.sourceLanguageTag).toBe(\"en\");\n\texpect(settings.languageTags).toEqual([\"en\", \"de\"]);\n\texpect(settings.locales).toEqual([\"en\", \"de\"]);\n});\n\ntest(\"providing plugins should work\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\"],\n\t\t\t\tmodules: [],\n\t\t\t},\n\t\t}),\n\t\tprovidePlugins: [{ key: \"my-provided-plugin\" }],\n\t});\n\n\tconst plugins = await project.plugins.get();\n\tconst errors = await project.errors.get();\n\n\texpect(plugins.length).toBe(1);\n\texpect(plugins[0]?.key).toBe(\"my-provided-plugin\");\n\texpect(errors.length).toBe(0);\n});\n\ntest(\"if a project has no id, it should be generated\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.lix.db\n\t\t.deleteFrom(\"file\")\n\t\t.where(\"path\", \"=\", \"/project_id\")\n\t\t.execute();\n\n\tconst blob = await project.toBlob();\n\n\tconst project2 = await loadProjectInMemory({ blob });\n\n\tconst id = await project2.id.get();\n\n\texpect(id).toBeDefined();\n\texpect(validate(id)).toBe(true);\n});\n\ntest(\"providing an account should work\", async () => {\n\tconst mockAccount = {\n\t\tid: \"mock-account-id\",\n\t\tname: \"peter\",\n\t};\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t\taccount: mockAccount,\n\t});\n\n\tconst activeAccount = await project.lix.db\n\t\t.selectFrom(\"active_account\")\n\t\t.selectAll()\n\t\t.execute();\n\n\texpect(activeAccount).toEqual([mockAccount]);\n});\n\n\n// test(\"subscribing to errors should work\", async () => {\n// \tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n// \texpect(await project.errors.get()).toEqual([]);\n\n// \tlet errorsFromSub: readonly Error[] = [];\n// \tproject.errors.subscribe((value) => {\n// \t\terrorsFromSub = 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: [\"invalid-module.js\"],\n// \t\t\t\t})\n// \t\t\t),\n// \t\t})\n// \t\t.execute();\n\n// \tconst errors = await project.errors.get();\n\n// \texpect(errors.length).toBe(1);\n// \texpect(errorsFromSub.length).toBe(1);\n// \texpect(errorsFromSub).toStrictEqual(errors);\n// });\n\ntest(\"closing a project should not lead to a throw\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.close();\n\n\t// capture async throws\n\tawait new Promise((resolve) => setTimeout(resolve, 250));\n});\n"],"names":[],"mappings":"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","debug_id":"cb1a2e49-9c10-5ea7-aae1-8a7e2e7cfc62"}
1
+ {"version":3,"file":"loadProject.test.js","sources":["project/loadProject.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, test } from \"vitest\";\nimport { newProject } from \"./newProject.js\";\nimport { loadProjectInMemory } from \"./loadProjectInMemory.js\";\nimport { validate } from \"uuid\";\n\ntest(\"it should persist changes of bundles, messages, and variants to lix \", async () => {\n\tconst file1 = await newProject();\n\tconst project1 = await loadProjectInMemory({ blob: file1 });\n\tconst bundle = await project1.db\n\t\t.insertInto(\"bundle\")\n\t\t.defaultValues()\n\t\t.returning(\"id\")\n\t\t.executeTakeFirstOrThrow();\n\n\tconst message = await project1.db\n\t\t.insertInto(\"message\")\n\t\t.values({\n\t\t\tbundleId: bundle.id,\n\t\t\tlocale: \"en\",\n\t\t})\n\t\t.returning(\"id\")\n\t\t.executeTakeFirstOrThrow();\n\n\tawait project1.db\n\t\t.insertInto(\"variant\")\n\t\t.values({\n\t\t\tmessageId: message.id,\n\t\t})\n\t\t.execute();\n\n\tconst file1AfterUpdates = await project1.toBlob();\n\tawait project1.close();\n\n\tconst project2 = await loadProjectInMemory({ blob: file1AfterUpdates });\n\tconst bundles = await project2.db.selectFrom(\"bundle\").select(\"id\").execute();\n\tconst messages = await project2.db\n\t\t.selectFrom(\"message\")\n\t\t.select(\"id\")\n\t\t.execute();\n\tconst variants = await project2.db\n\t\t.selectFrom(\"variant\")\n\t\t.select(\"id\")\n\t\t.execute();\n\texpect(bundles.length).toBe(1);\n\texpect(messages.length).toBe(1);\n\texpect(variants.length).toBe(1);\n});\n\ntest(\"get and set settings\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\tconst settings = await project.settings.get();\n\n\texpect(settings[\"plugin.key\"]).toBeUndefined();\n\n\tconst copied = structuredClone(settings);\n\n\tcopied[\"plugin.key\"] = { test: \"value\" };\n\n\tawait project.settings.set(copied);\n\n\tconst updatedSettings = await project.settings.get();\n\texpect(updatedSettings[\"plugin.key\"]).toEqual({ test: \"value\" });\n});\n\ntest(\"it should set sourceLanguageTag and languageTags if non-existent to make v1 plugins work\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\", \"de\"],\n\t\t\t},\n\t\t}),\n\t});\n\tconst settings = await project.settings.get();\n\texpect(settings.baseLocale).toBe(\"en\");\n\texpect(settings.sourceLanguageTag).toBe(\"en\");\n\texpect(settings.languageTags).toEqual([\"en\", \"de\"]);\n\texpect(settings.locales).toEqual([\"en\", \"de\"]);\n});\n\ntest(\"providing plugins should work\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject({\n\t\t\tsettings: {\n\t\t\t\tbaseLocale: \"en\",\n\t\t\t\tlocales: [\"en\"],\n\t\t\t\tmodules: [],\n\t\t\t},\n\t\t}),\n\t\tprovidePlugins: [{ key: \"my-provided-plugin\" }],\n\t});\n\n\tconst plugins = await project.plugins.get();\n\tconst errors = await project.errors.get();\n\n\texpect(plugins.length).toBe(1);\n\texpect(plugins[0]?.key).toBe(\"my-provided-plugin\");\n\texpect(errors.length).toBe(0);\n});\n\ntest(\"if a project has no id, it should be generated\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.lix.db\n\t\t.deleteFrom(\"file\")\n\t\t.where(\"path\", \"=\", \"/project_id\")\n\t\t.execute();\n\n\tconst blob = await project.toBlob();\n\n\tconst project2 = await loadProjectInMemory({ blob });\n\n\tconst id = await project2.id.get();\n\n\texpect(id).toBeDefined();\n\texpect(validate(id)).toBe(true);\n});\n\ntest(\"providing an account should work\", async () => {\n\tconst mockAccount = {\n\t\tid: \"mock-account-id\",\n\t\tname: \"peter\",\n\t};\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t\taccount: mockAccount,\n\t});\n\n\tconst activeAccount = await project.lix.db\n\t\t.selectFrom(\"active_account\")\n\t\t.selectAll()\n\t\t.execute();\n\n\texpect(activeAccount).toEqual([mockAccount]);\n});\n\n// test(\"subscribing to errors should work\", async () => {\n// \tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n// \texpect(await project.errors.get()).toEqual([]);\n\n// \tlet errorsFromSub: readonly Error[] = [];\n// \tproject.errors.subscribe((value) => {\n// \t\terrorsFromSub = 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: [\"invalid-module.js\"],\n// \t\t\t\t})\n// \t\t\t),\n// \t\t})\n// \t\t.execute();\n\n// \tconst errors = await project.errors.get();\n\n// \texpect(errors.length).toBe(1);\n// \texpect(errorsFromSub.length).toBe(1);\n// \texpect(errorsFromSub).toStrictEqual(errors);\n// });\n\ntest(\"closing a project should not lead to a throw\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.close();\n\n\t// capture async throws\n\tawait new Promise((resolve) => setTimeout(resolve, 250));\n});\n"],"names":[],"mappings":"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","debug_id":"d1aa7d55-973a-5652-b6c6-b87ef78216ef"}
@@ -1,8 +1,10 @@
1
1
  import { Kysely } from "kysely";
2
2
  import type { InlangDatabaseSchema } from "../database/schema.js";
3
3
  import type { ProjectSettings } from "../json-schema/settings.js";
4
+ import type { Lix } from "@lix-js/sdk";
4
5
  export declare function maybeCaptureLoadedProject(args: {
5
6
  id: string;
7
+ lix: Lix;
6
8
  settings: ProjectSettings;
7
9
  plugins: Readonly<Array<{
8
10
  key: string;
@@ -1 +1 @@
1
- {"version":3,"file":"maybeCaptureTelemetry.d.ts","sourceRoot":"/","sources":["project/maybeCaptureTelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAGlE,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAC;CACjC,iBA+CA"}
1
+ {"version":3,"file":"maybeCaptureTelemetry.d.ts","sourceRoot":"/","sources":["project/maybeCaptureTelemetry.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAEhC,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAElE,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAElE,OAAO,KAAK,EAAE,GAAG,EAAE,MAAM,aAAa,CAAC;AAEvC,wBAAsB,yBAAyB,CAAC,IAAI,EAAE;IACrD,EAAE,EAAE,MAAM,CAAC;IACX,GAAG,EAAE,GAAG,CAAC;IACT,QAAQ,EAAE,eAAe,CAAC;IAC1B,OAAO,EAAE,QAAQ,CAAC,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC,CAAC;IAC1C,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,EAAE,EAAE,MAAM,CAAC,oBAAoB,CAAC,CAAC;CACjC,iBAqDA"}
@@ -1,5 +1,5 @@
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]="030222fc-9304-5164-90db-0b9328c67464")}catch(e){}}();
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]="55ec9f86-02cc-595e-9046-4e7388e9f61b")}catch(e){}}();
3
3
  import { Kysely } from "kysely";
4
4
  import { capture } from "../services/telemetry/capture.js";
5
5
  import { ENV_VARIABLES } from "../services/env-variables/index.js";
@@ -9,6 +9,10 @@ export async function maybeCaptureLoadedProject(args) {
9
9
  return;
10
10
  }
11
11
  try {
12
+ const activeAccount = await args.lix.db
13
+ .selectFrom("active_account")
14
+ .select("id")
15
+ .executeTakeFirstOrThrow();
12
16
  const bundles = await args.db
13
17
  .selectFrom("bundle")
14
18
  .select((s) => s.fn.count("id").as("count"))
@@ -24,6 +28,7 @@ export async function maybeCaptureLoadedProject(args) {
24
28
  await capture("SDK loaded project", {
25
29
  projectId: args.id,
26
30
  settings: args.settings,
31
+ accountId: activeAccount.id,
27
32
  properties: {
28
33
  // Insight: Which app is used by the SDK
29
34
  appId: args.appId,
@@ -50,4 +55,4 @@ export async function maybeCaptureLoadedProject(args) {
50
55
  }
51
56
  }
52
57
  //# sourceMappingURL=maybeCaptureTelemetry.js.map
53
- //# debugId=030222fc-9304-5164-90db-0b9328c67464
58
+ //# debugId=55ec9f86-02cc-595e-9046-4e7388e9f61b
@@ -1 +1 @@
1
- {"version":3,"file":"maybeCaptureTelemetry.js","sources":["project/maybeCaptureTelemetry.ts"],"sourceRoot":"/","sourcesContent":["import { Kysely } from \"kysely\";\nimport { capture } from \"../services/telemetry/capture.js\";\nimport type { InlangDatabaseSchema } from \"../database/schema.js\";\nimport { ENV_VARIABLES } from \"../services/env-variables/index.js\";\nimport type { ProjectSettings } from \"../json-schema/settings.js\";\nimport { captureError } from \"../services/error-reporting/index.js\";\n\nexport async function maybeCaptureLoadedProject(args: {\n\tid: string;\n\tsettings: ProjectSettings;\n\tplugins: Readonly<Array<{ key: string }>>;\n\tappId?: string;\n\tdb: Kysely<InlangDatabaseSchema>;\n}) {\n\tif (args.settings.telemetry === \"off\") {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst bundles = await args.db\n\t\t\t.selectFrom(\"bundle\")\n\t\t\t.select((s) => s.fn.count(\"id\").as(\"count\"))\n\t\t\t.executeTakeFirst();\n\t\tconst messages = await args.db\n\t\t\t.selectFrom(\"message\")\n\t\t\t.select((s) => s.fn.count(\"id\").as(\"count\"))\n\t\t\t.executeTakeFirst();\n\t\tconst variants = await args.db\n\t\t\t.selectFrom(\"variant\")\n\t\t\t.select((s) => s.fn.count(\"id\").as(\"count\"))\n\t\t\t.executeTakeFirst();\n\n\t\tawait capture(\"SDK loaded project\", {\n\t\t\tprojectId: args.id,\n\t\t\tsettings: args.settings,\n\t\t\tproperties: {\n\t\t\t\t// Insight: Which app is used by the SDK\n\t\t\t\tappId: args.appId,\n\t\t\t\t// Insight: How many languages are used, etc.\n\t\t\t\tsettings: args.settings,\n\t\t\t\t// Insight on the used plugins (which one's to prioritize)\n\t\t\t\tpluginKeys: args.plugins.map((plugin) => plugin.key),\n\t\t\t\t// Insight: Which version of the SDK is used (can be used to deprecate old versions)\n\t\t\t\tsdkVersion: ENV_VARIABLES.SDK_VERSION,\n\t\t\t\t// Insight: Scale of projects (what project size to optimize for)\n\t\t\t\tnumBundles: bundles?.count,\n\t\t\t\tnumMessages: messages?.count,\n\t\t\t\tnumVariants: variants?.count,\n\t\t\t},\n\t\t});\n\t} catch (e) {\n\t\tif (\n\t\t\te instanceof Error &&\n\t\t\te.message.includes(\"driver has already been destroyed\")\n\t\t) {\n\t\t\t// The project has been closed, nothing to capture\n\t\t\treturn;\n\t\t}\n\t\tcaptureError(e);\n\t}\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAEpE,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAM/C;IACA,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QACvC,OAAO;IACR,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE;aAC3B,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;aAC3C,gBAAgB,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE;aAC5B,UAAU,CAAC,SAAS,CAAC;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;aAC3C,gBAAgB,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE;aAC5B,UAAU,CAAC,SAAS,CAAC;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;aAC3C,gBAAgB,EAAE,CAAC;QAErB,MAAM,OAAO,CAAC,oBAAoB,EAAE;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,UAAU,EAAE;gBACX,wCAAwC;gBACxC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,6CAA6C;gBAC7C,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,0DAA0D;gBAC1D,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;gBACpD,oFAAoF;gBACpF,UAAU,EAAE,aAAa,CAAC,WAAW;gBACrC,iEAAiE;gBACjE,UAAU,EAAE,OAAO,EAAE,KAAK;gBAC1B,WAAW,EAAE,QAAQ,EAAE,KAAK;gBAC5B,WAAW,EAAE,QAAQ,EAAE,KAAK;aAC5B;SACD,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IACC,CAAC,YAAY,KAAK;YAClB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EACtD,CAAC;YACF,kDAAkD;YAClD,OAAO;QACR,CAAC;QACD,YAAY,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC","debug_id":"030222fc-9304-5164-90db-0b9328c67464"}
1
+ {"version":3,"file":"maybeCaptureTelemetry.js","sources":["project/maybeCaptureTelemetry.ts"],"sourceRoot":"/","sourcesContent":["import { Kysely } from \"kysely\";\nimport { capture } from \"../services/telemetry/capture.js\";\nimport type { InlangDatabaseSchema } from \"../database/schema.js\";\nimport { ENV_VARIABLES } from \"../services/env-variables/index.js\";\nimport type { ProjectSettings } from \"../json-schema/settings.js\";\nimport { captureError } from \"../services/error-reporting/index.js\";\nimport type { Lix } from \"@lix-js/sdk\";\n\nexport async function maybeCaptureLoadedProject(args: {\n\tid: string;\n\tlix: Lix;\n\tsettings: ProjectSettings;\n\tplugins: Readonly<Array<{ key: string }>>;\n\tappId?: string;\n\tdb: Kysely<InlangDatabaseSchema>;\n}) {\n\tif (args.settings.telemetry === \"off\") {\n\t\treturn;\n\t}\n\n\ttry {\n\t\tconst activeAccount = await args.lix.db\n\t\t\t.selectFrom(\"active_account\")\n\t\t\t.select(\"id\")\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\tconst bundles = await args.db\n\t\t\t.selectFrom(\"bundle\")\n\t\t\t.select((s) => s.fn.count(\"id\").as(\"count\"))\n\t\t\t.executeTakeFirst();\n\t\tconst messages = await args.db\n\t\t\t.selectFrom(\"message\")\n\t\t\t.select((s) => s.fn.count(\"id\").as(\"count\"))\n\t\t\t.executeTakeFirst();\n\t\tconst variants = await args.db\n\t\t\t.selectFrom(\"variant\")\n\t\t\t.select((s) => s.fn.count(\"id\").as(\"count\"))\n\t\t\t.executeTakeFirst();\n\n\t\tawait capture(\"SDK loaded project\", {\n\t\t\tprojectId: args.id,\n\t\t\tsettings: args.settings,\n\t\t\taccountId: activeAccount.id,\n\t\t\tproperties: {\n\t\t\t\t// Insight: Which app is used by the SDK\n\t\t\t\tappId: args.appId,\n\t\t\t\t// Insight: How many languages are used, etc.\n\t\t\t\tsettings: args.settings,\n\t\t\t\t// Insight on the used plugins (which one's to prioritize)\n\t\t\t\tpluginKeys: args.plugins.map((plugin) => plugin.key),\n\t\t\t\t// Insight: Which version of the SDK is used (can be used to deprecate old versions)\n\t\t\t\tsdkVersion: ENV_VARIABLES.SDK_VERSION,\n\t\t\t\t// Insight: Scale of projects (what project size to optimize for)\n\t\t\t\tnumBundles: bundles?.count,\n\t\t\t\tnumMessages: messages?.count,\n\t\t\t\tnumVariants: variants?.count,\n\t\t\t},\n\t\t});\n\t} catch (e) {\n\t\tif (\n\t\t\te instanceof Error &&\n\t\t\te.message.includes(\"driver has already been destroyed\")\n\t\t) {\n\t\t\t// The project has been closed, nothing to capture\n\t\t\treturn;\n\t\t}\n\t\tcaptureError(e);\n\t}\n}\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAChC,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAE3D,OAAO,EAAE,aAAa,EAAE,MAAM,oCAAoC,CAAC;AAEnE,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAGpE,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAO/C;IACA,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QACvC,OAAO;IACR,CAAC;IAED,IAAI,CAAC;QACJ,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;aACrC,UAAU,CAAC,gBAAgB,CAAC;aAC5B,MAAM,CAAC,IAAI,CAAC;aACZ,uBAAuB,EAAE,CAAC;QAE5B,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,EAAE;aAC3B,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;aAC3C,gBAAgB,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE;aAC5B,UAAU,CAAC,SAAS,CAAC;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;aAC3C,gBAAgB,EAAE,CAAC;QACrB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,EAAE;aAC5B,UAAU,CAAC,SAAS,CAAC;aACrB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;aAC3C,gBAAgB,EAAE,CAAC;QAErB,MAAM,OAAO,CAAC,oBAAoB,EAAE;YACnC,SAAS,EAAE,IAAI,CAAC,EAAE;YAClB,QAAQ,EAAE,IAAI,CAAC,QAAQ;YACvB,SAAS,EAAE,aAAa,CAAC,EAAE;YAC3B,UAAU,EAAE;gBACX,wCAAwC;gBACxC,KAAK,EAAE,IAAI,CAAC,KAAK;gBACjB,6CAA6C;gBAC7C,QAAQ,EAAE,IAAI,CAAC,QAAQ;gBACvB,0DAA0D;gBAC1D,UAAU,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC;gBACpD,oFAAoF;gBACpF,UAAU,EAAE,aAAa,CAAC,WAAW;gBACrC,iEAAiE;gBACjE,UAAU,EAAE,OAAO,EAAE,KAAK;gBAC1B,WAAW,EAAE,QAAQ,EAAE,KAAK;gBAC5B,WAAW,EAAE,QAAQ,EAAE,KAAK;aAC5B;SACD,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,IACC,CAAC,YAAY,KAAK;YAClB,CAAC,CAAC,OAAO,CAAC,QAAQ,CAAC,mCAAmC,CAAC,EACtD,CAAC;YACF,kDAAkD;YAClD,OAAO;QACR,CAAC;QACD,YAAY,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC","debug_id":"55ec9f86-02cc-595e-9046-4e7388e9f61b"}
@@ -1,5 +1,5 @@
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]="939568d0-d760-56e8-a009-2a9efba5eeae")}catch(e){}}();
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]="4ffe5d07-d7e2-5ed5-a722-195e67f62ddf")}catch(e){}}();
3
3
  import { expect, test, vi } from "vitest";
4
4
  import { loadProjectInMemory } from "./loadProjectInMemory.js";
5
5
  import { newProject } from "./newProject.js";
@@ -22,6 +22,10 @@ test("it should capture as expected", async () => {
22
22
  const project = await loadProjectInMemory({
23
23
  blob: await newProject(),
24
24
  });
25
+ const account = await project.lix.db
26
+ .selectFrom("active_account")
27
+ .select("id")
28
+ .executeTakeFirstOrThrow();
25
29
  const bundle = await project.db
26
30
  .insertInto("bundle")
27
31
  .defaultValues()
@@ -44,12 +48,14 @@ test("it should capture as expected", async () => {
44
48
  id,
45
49
  settings,
46
50
  plugins,
51
+ lix: project.lix,
47
52
  appId: "test",
48
53
  db: project.db,
49
54
  });
50
55
  expect(capture).toHaveBeenCalledWith("SDK loaded project", {
51
56
  projectId: await project.id.get(),
52
57
  settings: await project.settings.get(),
58
+ accountId: account.id,
53
59
  properties: {
54
60
  appId: "test",
55
61
  settings: await project.settings.get(),
@@ -62,4 +68,4 @@ test("it should capture as expected", async () => {
62
68
  });
63
69
  });
64
70
  //# sourceMappingURL=maybeCaptureTelemetry.test.js.map
65
- //# debugId=939568d0-d760-56e8-a009-2a9efba5eeae
71
+ //# debugId=4ffe5d07-d7e2-5ed5-a722-195e67f62ddf
@@ -1 +1 @@
1
- {"version":3,"file":"maybeCaptureTelemetry.test.js","sources":["project/maybeCaptureTelemetry.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, test, vi } from \"vitest\";\nimport { loadProjectInMemory } from \"./loadProjectInMemory.js\";\nimport { newProject } from \"./newProject.js\";\nimport { maybeCaptureLoadedProject } from \"./maybeCaptureTelemetry.js\";\nimport { capture } from \"../services/telemetry/capture.js\";\n\ntest(\"it should capture as expected\", async () => {\n\tvi.mock(\"../services/telemetry/capture.js\", async () => {\n\t\treturn {\n\t\t\tcapture: vi.fn(() => Promise.resolve()),\n\t\t};\n\t});\n\n\tvi.mock(\"../services/env-variables/index\", async () => {\n\t\treturn {\n\t\t\tENV_VARIABLES: {\n\t\t\t\tPUBLIC_POSTHOG_TOKEN: \"mock-defined\",\n\t\t\t\tSDK_VERSION: \"1.0.0-mock\",\n\t\t\t},\n\t\t};\n\t});\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t});\n\n\tconst bundle = await project.db\n\t\t.insertInto(\"bundle\")\n\t\t.defaultValues()\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n\n\tconst message = await project.db\n\t\t.insertInto(\"message\")\n\t\t.values({ bundleId: bundle.id, locale: \"en\" })\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n\n\tawait project.db\n\t\t.insertInto(\"variant\")\n\t\t.values({ messageId: message.id })\n\t\t.returningAll()\n\t\t.executeTakeFirst();\n\n\tconst settings = await project.settings.get();\n\n\tconst id = await project.id.get();\n\n\tconst plugins = await project.plugins.get();\n\n\tawait maybeCaptureLoadedProject({\n\t\tid,\n\t\tsettings,\n\t\tplugins,\n\t\tappId: \"test\",\n\t\tdb: project.db,\n\t});\n\n\texpect(capture).toHaveBeenCalledWith(\"SDK loaded project\", {\n\t\tprojectId: await project.id.get(),\n\t\tsettings: await project.settings.get(),\n\t\tproperties: {\n\t\t\tappId: \"test\",\n\t\t\tsettings: await project.settings.get(),\n\t\t\tpluginKeys: [],\n\t\t\tsdkVersion: \"1.0.0-mock\",\n\t\t\tnumBundles: 1,\n\t\t\tnumMessages: 1,\n\t\t\tnumVariants: 1,\n\t\t},\n\t});\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,OAAO,EAAE,MAAM,kCAAkC,CAAC;AAE3D,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;IAChD,EAAE,CAAC,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;QACtD,OAAO;YACN,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;SACvC,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,IAAI,CAAC,iCAAiC,EAAE,KAAK,IAAI,EAAE;QACrD,OAAO;YACN,aAAa,EAAE;gBACd,oBAAoB,EAAE,cAAc;gBACpC,WAAW,EAAE,YAAY;aACzB;SACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACzC,IAAI,EAAE,MAAM,UAAU,EAAE;KACxB,CAAC,CAAC;IAEH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,EAAE;SAC7B,UAAU,CAAC,QAAQ,CAAC;SACpB,aAAa,EAAE;SACf,YAAY,EAAE;SACd,uBAAuB,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE;SAC9B,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC,EAAE,QAAQ,EAAE,MAAM,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;SAC7C,YAAY,EAAE;SACd,uBAAuB,EAAE,CAAC;IAE5B,MAAM,OAAO,CAAC,EAAE;SACd,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC,EAAE,SAAS,EAAE,OAAO,CAAC,EAAE,EAAE,CAAC;SACjC,YAAY,EAAE;SACd,gBAAgB,EAAE,CAAC;IAErB,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IAE9C,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IAElC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAE5C,MAAM,yBAAyB,CAAC;QAC/B,EAAE;QACF,QAAQ;QACR,OAAO;QACP,KAAK,EAAE,MAAM;QACb,EAAE,EAAE,OAAO,CAAC,EAAE;KACd,CAAC,CAAC;IAEH,MAAM,CAAC,OAAO,CAAC,CAAC,oBAAoB,CAAC,oBAAoB,EAAE;QAC1D,SAAS,EAAE,MAAM,OAAO,CAAC,EAAE,CAAC,GAAG,EAAE;QACjC,QAAQ,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;QACtC,UAAU,EAAE;YACX,KAAK,EAAE,MAAM;YACb,QAAQ,EAAE,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE;YACtC,UAAU,EAAE,EAAE;YACd,UAAU,EAAE,YAAY;YACxB,UAAU,EAAE,CAAC;YACb,WAAW,EAAE,CAAC;YACd,WAAW,EAAE,CAAC;SACd;KACD,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC","debug_id":"939568d0-d760-56e8-a009-2a9efba5eeae"}
1
+ {"version":3,"file":"maybeCaptureTelemetry.test.js","sources":["project/maybeCaptureTelemetry.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, test, vi } from \"vitest\";\nimport { loadProjectInMemory } from \"./loadProjectInMemory.js\";\nimport { newProject } from \"./newProject.js\";\nimport { maybeCaptureLoadedProject } from \"./maybeCaptureTelemetry.js\";\nimport { capture } from \"../services/telemetry/capture.js\";\n\ntest(\"it should capture as expected\", async () => {\n\tvi.mock(\"../services/telemetry/capture.js\", async () => {\n\t\treturn {\n\t\t\tcapture: vi.fn(() => Promise.resolve()),\n\t\t};\n\t});\n\n\tvi.mock(\"../services/env-variables/index\", async () => {\n\t\treturn {\n\t\t\tENV_VARIABLES: {\n\t\t\t\tPUBLIC_POSTHOG_TOKEN: \"mock-defined\",\n\t\t\t\tSDK_VERSION: \"1.0.0-mock\",\n\t\t\t},\n\t\t};\n\t});\n\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t});\n\n\tconst account = await project.lix.db\n\t\t.selectFrom(\"active_account\")\n\t\t.select(\"id\")\n\t\t.executeTakeFirstOrThrow();\n\n\tconst bundle = await project.db\n\t\t.insertInto(\"bundle\")\n\t\t.defaultValues()\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n\n\tconst message = await project.db\n\t\t.insertInto(\"message\")\n\t\t.values({ bundleId: bundle.id, locale: \"en\" })\n\t\t.returningAll()\n\t\t.executeTakeFirstOrThrow();\n\n\tawait project.db\n\t\t.insertInto(\"variant\")\n\t\t.values({ messageId: message.id })\n\t\t.returningAll()\n\t\t.executeTakeFirst();\n\n\tconst settings = await project.settings.get();\n\n\tconst id = await project.id.get();\n\n\tconst plugins = await project.plugins.get();\n\n\tawait maybeCaptureLoadedProject({\n\t\tid,\n\t\tsettings,\n\t\tplugins,\n\t\tlix: project.lix,\n\t\tappId: \"test\",\n\t\tdb: project.db,\n\t});\n\n\texpect(capture).toHaveBeenCalledWith(\"SDK loaded project\", {\n\t\tprojectId: await project.id.get(),\n\t\tsettings: await project.settings.get(),\n\t\taccountId: account.id,\n\t\tproperties: {\n\t\t\tappId: \"test\",\n\t\t\tsettings: await project.settings.get(),\n\t\t\tpluginKeys: [],\n\t\t\tsdkVersion: \"1.0.0-mock\",\n\t\t\tnumBundles: 1,\n\t\t\tnumMessages: 1,\n\t\t\tnumVariants: 1,\n\t\t},\n\t});\n});\n"],"names":[],"mappings":"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","debug_id":"4ffe5d07-d7e2-5ed5-a722-195e67f62ddf"}
@@ -1,6 +1,6 @@
1
1
  export declare const ENV_VARIABLES: {
2
- PUBLIC_POSTHOG_TOKEN: string;
3
- PUBLIC_INLANG_SDK_SENTRY_DSN: string;
2
+ PUBLIC_POSTHOG_TOKEN: undefined;
3
+ PUBLIC_INLANG_SDK_SENTRY_DSN: undefined;
4
4
  SDK_VERSION: string;
5
5
  };
6
6
  //# sourceMappingURL=index.d.ts.map
@@ -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]="01d118e7-fc4d-568b-9c38-fe16c6205e68")}catch(e){}}();
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]="4c5878d7-cb19-5bc9-a5bf-6c0a8c175c63")}catch(e){}}();
3
3
  export const ENV_VARIABLES = {
4
- PUBLIC_POSTHOG_TOKEN: "phc_m5yJZCxjOGxF8CJvP5sQ3H0d76xpnLrsmiZHduT4jDz",
5
- PUBLIC_INLANG_SDK_SENTRY_DSN: "https://c3d92d5d011122e525e9f9b368e0905d@o4504345873285120.ingest.us.sentry.io/4507903389335553",
6
- SDK_VERSION: "2.0.0-beta.1",
4
+ PUBLIC_POSTHOG_TOKEN: undefined,
5
+ PUBLIC_INLANG_SDK_SENTRY_DSN: undefined,
6
+ SDK_VERSION: "2.0.0-beta.3",
7
7
  };
8
8
  //# sourceMappingURL=index.js.map
9
- //# debugId=01d118e7-fc4d-568b-9c38-fe16c6205e68
9
+ //# debugId=4c5878d7-cb19-5bc9-a5bf-6c0a8c175c63
@@ -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-beta.1\",\n}\n"],"names":[],"mappings":";;AACA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,oBAAoB,EAAE,iDAAiD;IACxE,4BAA4B,EAAE,iGAAiG;IAC/H,WAAW,EAAE,cAAc;CAC3B,CAAA","debug_id":"01d118e7-fc4d-568b-9c38-fe16c6205e68"}
1
+ {"version":3,"file":"index.js","sources":["services/env-variables/index.ts"],"sourceRoot":"/","sourcesContent":["\nexport const ENV_VARIABLES = {\n PUBLIC_POSTHOG_TOKEN: undefined,\n\tPUBLIC_INLANG_SDK_SENTRY_DSN: undefined,\n\tSDK_VERSION: \"2.0.0-beta.3\",\n}\n"],"names":[],"mappings":";;AACA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,oBAAoB,EAAE,SAAS;IAChC,4BAA4B,EAAE,SAAS;IACvC,WAAW,EAAE,cAAc;CAC3B,CAAA","debug_id":"4c5878d7-cb19-5bc9-a5bf-6c0a8c175c63"}
@@ -13,6 +13,7 @@ type TelemetryEvent = "SDK loaded project";
13
13
  */
14
14
  export declare const capture: (event: TelemetryEvent, args: {
15
15
  projectId: string;
16
+ accountId: string;
16
17
  /**
17
18
  * Please use snake_case for property names.
18
19
  */
@@ -1 +1 @@
1
- {"version":3,"file":"capture.d.ts","sourceRoot":"/","sources":["services/telemetry/capture.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIrE;;;;;GAKG;AACH,KAAK,cAAc,GAAG,oBAAoB,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,OAAO,UACZ,cAAc,QACf;IACL,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;CAC7C,kBA8BD,CAAC"}
1
+ {"version":3,"file":"capture.d.ts","sourceRoot":"/","sources":["services/telemetry/capture.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,+BAA+B,CAAC;AAIrE;;;;;GAKG;AACH,KAAK,cAAc,GAAG,oBAAoB,CAAC;AAE3C;;;;GAIG;AACH,eAAO,MAAM,OAAO,UACZ,cAAc,QACf;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB;;OAEG;IACH,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAChC,QAAQ,EAAE,IAAI,CAAC,eAAe,EAAE,WAAW,CAAC,CAAC;CAC7C,kBA8BD,CAAC"}
@@ -1,6 +1,6 @@
1
1
  // import { ENV_VARIABLES } from "../env-variables/index.js";
2
2
 
3
- !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]="3d2d44b5-11ee-58a1-a149-a7ba84972a7f")}catch(e){}}();
3
+ !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]="4a83d392-5cb6-5c43-9098-5708dd6509bb")}catch(e){}}();
4
4
  import { ENV_VARIABLES } from "../env-variables/index.js";
5
5
  import { captureError } from "../error-reporting/index.js";
6
6
  /**
@@ -21,8 +21,7 @@ export const capture = async (event, args) => {
21
21
  body: JSON.stringify({
22
22
  api_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,
23
23
  event,
24
- // id is "unknown" because no user information is available
25
- distinct_id: "unknown",
24
+ distinct_id: args.accountId,
26
25
  properties: {
27
26
  $groups: { project: args.projectId },
28
27
  ...args.properties,
@@ -31,6 +30,7 @@ export const capture = async (event, args) => {
31
30
  });
32
31
  await identifyProject({
33
32
  projectId: args.projectId,
33
+ accountId: args.accountId,
34
34
  // using the id for now as a name but can be changed in the future
35
35
  // we need at least one property to make a project visible in the dashboar
36
36
  properties: { name: args.projectId },
@@ -57,8 +57,7 @@ const identifyProject = async (args) => {
57
57
  body: JSON.stringify({
58
58
  api_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,
59
59
  event: "$groupidentify",
60
- // id is "unknown" because no user information is available
61
- distinct_id: "unknown",
60
+ distinct_id: args.accountId,
62
61
  properties: {
63
62
  $group_type: "project",
64
63
  $group_key: args.projectId,
@@ -74,4 +73,4 @@ const identifyProject = async (args) => {
74
73
  }
75
74
  };
76
75
  //# sourceMappingURL=capture.js.map
77
- //# debugId=3d2d44b5-11ee-58a1-a149-a7ba84972a7f
76
+ //# debugId=4a83d392-5cb6-5c43-9098-5708dd6509bb
@@ -1 +1 @@
1
- {"version":3,"file":"capture.js","sources":["services/telemetry/capture.ts"],"sourceRoot":"/","sourcesContent":["// import { ENV_VARIABLES } from \"../env-variables/index.js\";\n\nimport type { ProjectSettings } from \"../../json-schema/settings.js\";\nimport { ENV_VARIABLES } from \"../env-variables/index.js\";\nimport { captureError } from \"../error-reporting/index.js\";\n\n/**\n * List of telemetry events for typesafety.\n *\n * - prefix with `SDK` to avoid collisions with other apps\n * - use past tense to indicate that the event is completed\n */\ntype TelemetryEvent = \"SDK loaded project\";\n\n/**\n * Capture an event.\n *\n * - manually calling the PostHog API because the SDKs were not platform angostic (and generally bloated)\n */\nexport const capture = async (\n\tevent: TelemetryEvent,\n\targs: {\n\t\tprojectId: string;\n\t\t/**\n\t\t * Please use snake_case for property names.\n\t\t */\n\t\tproperties: Record<string, any>;\n\t\tsettings: Pick<ProjectSettings, \"telemetry\">;\n\t}\n) => {\n\tif (args.settings.telemetry === \"off\") {\n\t\treturn;\n\t} else if (ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN === undefined) {\n\t\treturn;\n\t}\n\ttry {\n\t\tawait fetch(\"https://eu.posthog.com/capture/\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tapi_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,\n\t\t\t\tevent,\n\t\t\t\t// id is \"unknown\" because no user information is available\n\t\t\t\tdistinct_id: \"unknown\",\n\t\t\t\tproperties: {\n\t\t\t\t\t$groups: { project: args.projectId },\n\t\t\t\t\t...args.properties,\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\t\tawait identifyProject({\n\t\t\tprojectId: args.projectId,\n\t\t\t// using the id for now as a name but can be changed in the future\n\t\t\t// we need at least one property to make a project visible in the dashboar\n\t\t\tproperties: { name: args.projectId },\n\t\t});\n\t} catch (e) {\n\t\tcaptureError(e);\n\t}\n};\n\n/**\n * Identifying a project is needed.\n *\n * Otherwise, the project will not be visible in the PostHog dashboard.\n */\nconst identifyProject = async (args: {\n\tprojectId: string;\n\t/**\n\t * Please use snake_case for property names.\n\t */\n\tproperties: Record<string, any>;\n}) => {\n\t// do not send events if the token is not set\n\t// (assuming this eases testing)\n\tif (ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN === undefined) {\n\t\treturn;\n\t}\n\ttry {\n\t\tawait fetch(\"https://eu.posthog.com/capture/\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tapi_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,\n\t\t\t\tevent: \"$groupidentify\",\n\t\t\t\t// id is \"unknown\" because no user information is available\n\t\t\t\tdistinct_id: \"unknown\",\n\t\t\t\tproperties: {\n\t\t\t\t\t$group_type: \"project\",\n\t\t\t\t\t$group_key: args.projectId,\n\t\t\t\t\t$group_set: {\n\t\t\t\t\t\t...args.properties,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\t} catch (e) {\n\t\tcaptureError(e);\n\t}\n};\n"],"names":[],"mappings":"AAAA,6DAA6D;;;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAU3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC3B,KAAqB,EACrB,IAOC,EACA,EAAE;IACH,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QACvC,OAAO;IACR,CAAC;SAAM,IAAI,aAAa,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO;IACR,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC,iCAAiC,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,OAAO,EAAE,aAAa,CAAC,oBAAoB;gBAC3C,KAAK;gBACL,2DAA2D;gBAC3D,WAAW,EAAE,SAAS;gBACtB,UAAU,EAAE;oBACX,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE;oBACpC,GAAG,IAAI,CAAC,UAAU;iBAClB;aACD,CAAC;SACF,CAAC,CAAC;QACH,MAAM,eAAe,CAAC;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,kEAAkE;YAClE,0EAA0E;YAC1E,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE;SACpC,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,YAAY,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,eAAe,GAAG,KAAK,EAAE,IAM9B,EAAE,EAAE;IACJ,6CAA6C;IAC7C,gCAAgC;IAChC,IAAI,aAAa,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO;IACR,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC,iCAAiC,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,OAAO,EAAE,aAAa,CAAC,oBAAoB;gBAC3C,KAAK,EAAE,gBAAgB;gBACvB,2DAA2D;gBAC3D,WAAW,EAAE,SAAS;gBACtB,UAAU,EAAE;oBACX,WAAW,EAAE,SAAS;oBACtB,UAAU,EAAE,IAAI,CAAC,SAAS;oBAC1B,UAAU,EAAE;wBACX,GAAG,IAAI,CAAC,UAAU;qBAClB;iBACD;aACD,CAAC;SACF,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,YAAY,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC,CAAC","debug_id":"3d2d44b5-11ee-58a1-a149-a7ba84972a7f"}
1
+ {"version":3,"file":"capture.js","sources":["services/telemetry/capture.ts"],"sourceRoot":"/","sourcesContent":["// import { ENV_VARIABLES } from \"../env-variables/index.js\";\n\nimport type { ProjectSettings } from \"../../json-schema/settings.js\";\nimport { ENV_VARIABLES } from \"../env-variables/index.js\";\nimport { captureError } from \"../error-reporting/index.js\";\n\n/**\n * List of telemetry events for typesafety.\n *\n * - prefix with `SDK` to avoid collisions with other apps\n * - use past tense to indicate that the event is completed\n */\ntype TelemetryEvent = \"SDK loaded project\";\n\n/**\n * Capture an event.\n *\n * - manually calling the PostHog API because the SDKs were not platform angostic (and generally bloated)\n */\nexport const capture = async (\n\tevent: TelemetryEvent,\n\targs: {\n\t\tprojectId: string;\n\t\taccountId: string;\n\t\t/**\n\t\t * Please use snake_case for property names.\n\t\t */\n\t\tproperties: Record<string, any>;\n\t\tsettings: Pick<ProjectSettings, \"telemetry\">;\n\t}\n) => {\n\tif (args.settings.telemetry === \"off\") {\n\t\treturn;\n\t} else if (ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN === undefined) {\n\t\treturn;\n\t}\n\ttry {\n\t\tawait fetch(\"https://eu.posthog.com/capture/\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tapi_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,\n\t\t\t\tevent,\n\t\t\t\tdistinct_id: args.accountId,\n\t\t\t\tproperties: {\n\t\t\t\t\t$groups: { project: args.projectId },\n\t\t\t\t\t...args.properties,\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\t\tawait identifyProject({\n\t\t\tprojectId: args.projectId,\n\t\t\taccountId: args.accountId,\n\t\t\t// using the id for now as a name but can be changed in the future\n\t\t\t// we need at least one property to make a project visible in the dashboar\n\t\t\tproperties: { name: args.projectId },\n\t\t});\n\t} catch (e) {\n\t\tcaptureError(e);\n\t}\n};\n\n/**\n * Identifying a project is needed.\n *\n * Otherwise, the project will not be visible in the PostHog dashboard.\n */\nconst identifyProject = async (args: {\n\tprojectId: string;\n\taccountId: string;\n\t/**\n\t * Please use snake_case for property names.\n\t */\n\tproperties: Record<string, any>;\n}) => {\n\t// do not send events if the token is not set\n\t// (assuming this eases testing)\n\tif (ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN === undefined) {\n\t\treturn;\n\t}\n\ttry {\n\t\tawait fetch(\"https://eu.posthog.com/capture/\", {\n\t\t\tmethod: \"POST\",\n\t\t\tbody: JSON.stringify({\n\t\t\t\tapi_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,\n\t\t\t\tevent: \"$groupidentify\",\n\t\t\t\tdistinct_id: args.accountId,\n\t\t\t\tproperties: {\n\t\t\t\t\t$group_type: \"project\",\n\t\t\t\t\t$group_key: args.projectId,\n\t\t\t\t\t$group_set: {\n\t\t\t\t\t\t...args.properties,\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t}),\n\t\t});\n\t} catch (e) {\n\t\tcaptureError(e);\n\t}\n};\n"],"names":[],"mappings":"AAAA,6DAA6D;;;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAU3D;;;;GAIG;AACH,MAAM,CAAC,MAAM,OAAO,GAAG,KAAK,EAC3B,KAAqB,EACrB,IAQC,EACA,EAAE;IACH,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QACvC,OAAO;IACR,CAAC;SAAM,IAAI,aAAa,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QAC7D,OAAO;IACR,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC,iCAAiC,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,OAAO,EAAE,aAAa,CAAC,oBAAoB;gBAC3C,KAAK;gBACL,WAAW,EAAE,IAAI,CAAC,SAAS;gBAC3B,UAAU,EAAE;oBACX,OAAO,EAAE,EAAE,OAAO,EAAE,IAAI,CAAC,SAAS,EAAE;oBACpC,GAAG,IAAI,CAAC,UAAU;iBAClB;aACD,CAAC;SACF,CAAC,CAAC;QACH,MAAM,eAAe,CAAC;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,kEAAkE;YAClE,0EAA0E;YAC1E,UAAU,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,SAAS,EAAE;SACpC,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,YAAY,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC,CAAC;AAEF;;;;GAIG;AACH,MAAM,eAAe,GAAG,KAAK,EAAE,IAO9B,EAAE,EAAE;IACJ,6CAA6C;IAC7C,gCAAgC;IAChC,IAAI,aAAa,CAAC,oBAAoB,KAAK,SAAS,EAAE,CAAC;QACtD,OAAO;IACR,CAAC;IACD,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC,iCAAiC,EAAE;YAC9C,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACpB,OAAO,EAAE,aAAa,CAAC,oBAAoB;gBAC3C,KAAK,EAAE,gBAAgB;gBACvB,WAAW,EAAE,IAAI,CAAC,SAAS;gBAC3B,UAAU,EAAE;oBACX,WAAW,EAAE,SAAS;oBACtB,UAAU,EAAE,IAAI,CAAC,SAAS;oBAC1B,UAAU,EAAE;wBACX,GAAG,IAAI,CAAC,UAAU;qBAClB;iBACD;aACD,CAAC;SACF,CAAC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,YAAY,CAAC,CAAC,CAAC,CAAC;IACjB,CAAC;AACF,CAAC,CAAC","debug_id":"4a83d392-5cb6-5c43-9098-5708dd6509bb"}
@@ -1,5 +1,5 @@
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]="3a6af819-b584-5ae0-981d-cad30e23714b")}catch(e){}}();
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]="31b14236-b29d-51f6-a0ad-e9b7dd806439")}catch(e){}}();
3
3
  import { expect, test, vi } from "vitest";
4
4
  import { capture } from "./capture.js";
5
5
  test("it should not capture if telemetry is off", async () => {
@@ -14,6 +14,7 @@ test("it should not capture if telemetry is off", async () => {
14
14
  });
15
15
  await capture("SDK loaded project", {
16
16
  projectId: "test",
17
+ accountId: "test",
17
18
  settings: {
18
19
  telemetry: "off",
19
20
  },
@@ -33,6 +34,7 @@ test("it should not capture if telemetry is NOT off", async () => {
33
34
  });
34
35
  await capture("SDK loaded project", {
35
36
  projectId: "test",
37
+ accountId: "test",
36
38
  settings: {
37
39
  telemetry: undefined,
38
40
  },
@@ -41,4 +43,4 @@ test("it should not capture if telemetry is NOT off", async () => {
41
43
  expect(global.fetch).toHaveBeenCalled();
42
44
  });
43
45
  //# sourceMappingURL=capture.test.js.map
44
- //# debugId=3a6af819-b584-5ae0-981d-cad30e23714b
46
+ //# debugId=31b14236-b29d-51f6-a0ad-e9b7dd806439
@@ -1 +1 @@
1
- {"version":3,"file":"capture.test.js","sources":["services/telemetry/capture.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, test, vi } from \"vitest\";\nimport { capture } from \"./capture.js\";\n\ntest(\"it should not capture if telemetry is off\", async () => {\n\t// @ts-expect-error - global.fetch is not defined\n\tglobal.fetch = vi.fn(() => Promise.resolve());\n\n\tvi.mock(\"../env-variables/index.js\", async () => {\n\t\treturn {\n\t\t\tENV_VARIABLES: {\n\t\t\t\tPUBLIC_POSTHOG_TOKEN: \"mock-defined\",\n\t\t\t},\n\t\t};\n\t});\n\n\tawait capture(\"SDK loaded project\", {\n\t\tprojectId: \"test\",\n\t\tsettings: {\n\t\t\ttelemetry: \"off\",\n\t\t},\n\t\tproperties: {},\n\t});\n\n\texpect(global.fetch).not.toHaveBeenCalled();\n});\n\ntest(\"it should not capture if telemetry is NOT off\", async () => {\n\t// @ts-expect-error - global.fetch is not defined\n\tglobal.fetch = vi.fn(() => Promise.resolve());\n\n\tvi.mock(\"../env-variables/index.js\", async () => {\n\t\treturn {\n\t\t\tENV_VARIABLES: {\n\t\t\t\tPUBLIC_POSTHOG_TOKEN: \"mock-defined\",\n\t\t\t},\n\t\t};\n\t});\n\n\tawait capture(\"SDK loaded project\", {\n\t\tprojectId: \"test\",\n\t\tsettings: {\n\t\t\ttelemetry: undefined,\n\t\t},\n\t\tproperties: {},\n\t});\n\n\texpect(global.fetch).toHaveBeenCalled();\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;IAC5D,iDAAiD;IACjD,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAE9C,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QAC/C,OAAO;YACN,aAAa,EAAE;gBACd,oBAAoB,EAAE,cAAc;aACpC;SACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,oBAAoB,EAAE;QACnC,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE;YACT,SAAS,EAAE,KAAK;SAChB;QACD,UAAU,EAAE,EAAE;KACd,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;IAChE,iDAAiD;IACjD,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAE9C,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QAC/C,OAAO;YACN,aAAa,EAAE;gBACd,oBAAoB,EAAE,cAAc;aACpC;SACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,oBAAoB,EAAE;QACnC,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE;YACT,SAAS,EAAE,SAAS;SACpB;QACD,UAAU,EAAE,EAAE;KACd,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAC;AACzC,CAAC,CAAC,CAAC","debug_id":"3a6af819-b584-5ae0-981d-cad30e23714b"}
1
+ {"version":3,"file":"capture.test.js","sources":["services/telemetry/capture.test.ts"],"sourceRoot":"/","sourcesContent":["import { expect, test, vi } from \"vitest\";\nimport { capture } from \"./capture.js\";\n\ntest(\"it should not capture if telemetry is off\", async () => {\n\t// @ts-expect-error - global.fetch is not defined\n\tglobal.fetch = vi.fn(() => Promise.resolve());\n\n\tvi.mock(\"../env-variables/index.js\", async () => {\n\t\treturn {\n\t\t\tENV_VARIABLES: {\n\t\t\t\tPUBLIC_POSTHOG_TOKEN: \"mock-defined\",\n\t\t\t},\n\t\t};\n\t});\n\n\tawait capture(\"SDK loaded project\", {\n\t\tprojectId: \"test\",\n\t\taccountId: \"test\",\n\t\tsettings: {\n\t\t\ttelemetry: \"off\",\n\t\t},\n\t\tproperties: {},\n\t});\n\n\texpect(global.fetch).not.toHaveBeenCalled();\n});\n\ntest(\"it should not capture if telemetry is NOT off\", async () => {\n\t// @ts-expect-error - global.fetch is not defined\n\tglobal.fetch = vi.fn(() => Promise.resolve());\n\n\tvi.mock(\"../env-variables/index.js\", async () => {\n\t\treturn {\n\t\t\tENV_VARIABLES: {\n\t\t\t\tPUBLIC_POSTHOG_TOKEN: \"mock-defined\",\n\t\t\t},\n\t\t};\n\t});\n\n\tawait capture(\"SDK loaded project\", {\n\t\tprojectId: \"test\",\n\t\taccountId: \"test\",\n\t\tsettings: {\n\t\t\ttelemetry: undefined,\n\t\t},\n\t\tproperties: {},\n\t});\n\n\texpect(global.fetch).toHaveBeenCalled();\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,MAAM,QAAQ,CAAC;AAC1C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,IAAI,CAAC,2CAA2C,EAAE,KAAK,IAAI,EAAE;IAC5D,iDAAiD;IACjD,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAE9C,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QAC/C,OAAO;YACN,aAAa,EAAE;gBACd,oBAAoB,EAAE,cAAc;aACpC;SACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,oBAAoB,EAAE;QACnC,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE;YACT,SAAS,EAAE,KAAK;SAChB;QACD,UAAU,EAAE,EAAE;KACd,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,gBAAgB,EAAE,CAAC;AAC7C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+CAA+C,EAAE,KAAK,IAAI,EAAE;IAChE,iDAAiD;IACjD,MAAM,CAAC,KAAK,GAAG,EAAE,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC,CAAC;IAE9C,EAAE,CAAC,IAAI,CAAC,2BAA2B,EAAE,KAAK,IAAI,EAAE;QAC/C,OAAO;YACN,aAAa,EAAE;gBACd,oBAAoB,EAAE,cAAc;aACpC;SACD,CAAC;IACH,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,CAAC,oBAAoB,EAAE;QACnC,SAAS,EAAE,MAAM;QACjB,SAAS,EAAE,MAAM;QACjB,QAAQ,EAAE;YACT,SAAS,EAAE,SAAS;SACpB;QACD,UAAU,EAAE,EAAE;KACd,CAAC,CAAC;IAEH,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,gBAAgB,EAAE,CAAC;AACzC,CAAC,CAAC,CAAC","debug_id":"31b14236-b29d-51f6-a0ad-e9b7dd806439"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inlang/sdk",
3
- "version": "2.0.0-beta.1",
3
+ "version": "2.0.0-beta.3",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -14,6 +14,7 @@
14
14
  },
15
15
  "exports": {
16
16
  ".": "./dist/index.js",
17
+ "./lix": "./dist/lix/index.js",
17
18
  "./settings-schema": "./src/json-schema/settings.ts"
18
19
  },
19
20
  "files": [
@@ -30,7 +31,7 @@
30
31
  "@sinclair/typebox": "^0.31.17",
31
32
  "kysely": "^0.27.4",
32
33
  "uuid": "^10.0.0",
33
- "@lix-js/sdk": "0.2.0",
34
+ "@lix-js/sdk": "0.3.0",
34
35
  "sqlite-wasm-kysely": "0.1.1"
35
36
  },
36
37
  "devDependencies": {
package/src/index.ts CHANGED
@@ -27,6 +27,4 @@ export type {
27
27
  } from "./plugin/schema.js";
28
28
  export type { IdeExtensionConfig } from "./plugin/meta/ideExtension.js";
29
29
  export * from "./database/schema.js";
30
- export * from "@lix-js/sdk";
31
30
  export { createMessageV1 } from "./migrations/v2/createMessageV1.js";
32
- export { v7 as uuidV7 } from "uuid";
@@ -0,0 +1 @@
1
+ export * from "@lix-js/sdk";
@@ -135,7 +135,6 @@ test("providing an account should work", async () => {
135
135
  expect(activeAccount).toEqual([mockAccount]);
136
136
  });
137
137
 
138
-
139
138
  // test("subscribing to errors should work", async () => {
140
139
  // const project = await loadProjectInMemory({ blob: await newProject() });
141
140
 
@@ -116,6 +116,7 @@ export async function loadProject(args: {
116
116
  id,
117
117
  settings,
118
118
  plugins,
119
+ lix: args.lix,
119
120
  appId: args.appId,
120
121
  });
121
122
 
@@ -24,6 +24,11 @@ test("it should capture as expected", async () => {
24
24
  blob: await newProject(),
25
25
  });
26
26
 
27
+ const account = await project.lix.db
28
+ .selectFrom("active_account")
29
+ .select("id")
30
+ .executeTakeFirstOrThrow();
31
+
27
32
  const bundle = await project.db
28
33
  .insertInto("bundle")
29
34
  .defaultValues()
@@ -52,6 +57,7 @@ test("it should capture as expected", async () => {
52
57
  id,
53
58
  settings,
54
59
  plugins,
60
+ lix: project.lix,
55
61
  appId: "test",
56
62
  db: project.db,
57
63
  });
@@ -59,6 +65,7 @@ test("it should capture as expected", async () => {
59
65
  expect(capture).toHaveBeenCalledWith("SDK loaded project", {
60
66
  projectId: await project.id.get(),
61
67
  settings: await project.settings.get(),
68
+ accountId: account.id,
62
69
  properties: {
63
70
  appId: "test",
64
71
  settings: await project.settings.get(),
@@ -4,9 +4,11 @@ import type { InlangDatabaseSchema } from "../database/schema.js";
4
4
  import { ENV_VARIABLES } from "../services/env-variables/index.js";
5
5
  import type { ProjectSettings } from "../json-schema/settings.js";
6
6
  import { captureError } from "../services/error-reporting/index.js";
7
+ import type { Lix } from "@lix-js/sdk";
7
8
 
8
9
  export async function maybeCaptureLoadedProject(args: {
9
10
  id: string;
11
+ lix: Lix;
10
12
  settings: ProjectSettings;
11
13
  plugins: Readonly<Array<{ key: string }>>;
12
14
  appId?: string;
@@ -17,6 +19,11 @@ export async function maybeCaptureLoadedProject(args: {
17
19
  }
18
20
 
19
21
  try {
22
+ const activeAccount = await args.lix.db
23
+ .selectFrom("active_account")
24
+ .select("id")
25
+ .executeTakeFirstOrThrow();
26
+
20
27
  const bundles = await args.db
21
28
  .selectFrom("bundle")
22
29
  .select((s) => s.fn.count("id").as("count"))
@@ -33,6 +40,7 @@ export async function maybeCaptureLoadedProject(args: {
33
40
  await capture("SDK loaded project", {
34
41
  projectId: args.id,
35
42
  settings: args.settings,
43
+ accountId: activeAccount.id,
36
44
  properties: {
37
45
  // Insight: Which app is used by the SDK
38
46
  appId: args.appId,
@@ -15,6 +15,7 @@ test("it should not capture if telemetry is off", async () => {
15
15
 
16
16
  await capture("SDK loaded project", {
17
17
  projectId: "test",
18
+ accountId: "test",
18
19
  settings: {
19
20
  telemetry: "off",
20
21
  },
@@ -38,6 +39,7 @@ test("it should not capture if telemetry is NOT off", async () => {
38
39
 
39
40
  await capture("SDK loaded project", {
40
41
  projectId: "test",
42
+ accountId: "test",
41
43
  settings: {
42
44
  telemetry: undefined,
43
45
  },
@@ -21,6 +21,7 @@ export const capture = async (
21
21
  event: TelemetryEvent,
22
22
  args: {
23
23
  projectId: string;
24
+ accountId: string;
24
25
  /**
25
26
  * Please use snake_case for property names.
26
27
  */
@@ -39,8 +40,7 @@ export const capture = async (
39
40
  body: JSON.stringify({
40
41
  api_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,
41
42
  event,
42
- // id is "unknown" because no user information is available
43
- distinct_id: "unknown",
43
+ distinct_id: args.accountId,
44
44
  properties: {
45
45
  $groups: { project: args.projectId },
46
46
  ...args.properties,
@@ -49,6 +49,7 @@ export const capture = async (
49
49
  });
50
50
  await identifyProject({
51
51
  projectId: args.projectId,
52
+ accountId: args.accountId,
52
53
  // using the id for now as a name but can be changed in the future
53
54
  // we need at least one property to make a project visible in the dashboar
54
55
  properties: { name: args.projectId },
@@ -65,6 +66,7 @@ export const capture = async (
65
66
  */
66
67
  const identifyProject = async (args: {
67
68
  projectId: string;
69
+ accountId: string;
68
70
  /**
69
71
  * Please use snake_case for property names.
70
72
  */
@@ -81,8 +83,7 @@ const identifyProject = async (args: {
81
83
  body: JSON.stringify({
82
84
  api_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,
83
85
  event: "$groupidentify",
84
- // id is "unknown" because no user information is available
85
- distinct_id: "unknown",
86
+ distinct_id: args.accountId,
86
87
  properties: {
87
88
  $group_type: "project",
88
89
  $group_key: args.projectId,