@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.
- package/dist/index.d.ts +0 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -4
- package/dist/index.js.map +1 -1
- package/dist/lix/index.d.ts +2 -0
- package/dist/lix/index.d.ts.map +1 -0
- package/dist/lix/index.js +5 -0
- package/dist/lix/index.js.map +1 -0
- package/dist/project/loadProject.d.ts.map +1 -1
- package/dist/project/loadProject.js +3 -2
- package/dist/project/loadProject.js.map +1 -1
- package/dist/project/loadProject.test.js +2 -2
- package/dist/project/loadProject.test.js.map +1 -1
- package/dist/project/maybeCaptureTelemetry.d.ts +2 -0
- package/dist/project/maybeCaptureTelemetry.d.ts.map +1 -1
- package/dist/project/maybeCaptureTelemetry.js +7 -2
- package/dist/project/maybeCaptureTelemetry.js.map +1 -1
- package/dist/project/maybeCaptureTelemetry.test.js +8 -2
- package/dist/project/maybeCaptureTelemetry.test.js.map +1 -1
- package/dist/services/env-variables/index.d.ts +2 -2
- package/dist/services/env-variables/index.js +5 -5
- package/dist/services/env-variables/index.js.map +1 -1
- package/dist/services/telemetry/capture.d.ts +1 -0
- package/dist/services/telemetry/capture.d.ts.map +1 -1
- package/dist/services/telemetry/capture.js +5 -6
- package/dist/services/telemetry/capture.js.map +1 -1
- package/dist/services/telemetry/capture.test.js +4 -2
- package/dist/services/telemetry/capture.test.js.map +1 -1
- package/package.json +3 -2
- package/src/index.ts +0 -2
- package/src/lix/index.ts +1 -0
- package/src/project/loadProject.test.ts +0 -1
- package/src/project/loadProject.ts +1 -0
- package/src/project/maybeCaptureTelemetry.test.ts +7 -0
- package/src/project/maybeCaptureTelemetry.ts +8 -0
- package/src/services/telemetry/capture.test.ts +2 -0
- 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
|
package/dist/index.d.ts.map
CHANGED
|
@@ -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,
|
|
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]="
|
|
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=
|
|
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
|
|
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 @@
|
|
|
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,
|
|
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]="
|
|
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=
|
|
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":";;AAAA,OAAO,EAAE,MAAM,EAA0B,MAAM,aAAa,CAAC;AAG7D,OAAO,EAAuB,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAC/C,OAAO,EAAE,2BAA2B,EAAE,MAAM,kCAAkC,CAAC;AAC/E,OAAO,EACN,aAAa,GAEb,MAAM,4BAA4B,CAAC;AAEpC,OAAO,EAAE,gCAAgC,EAAE,MAAM,sDAAsD,CAAC;AACxG,OAAO,EAAE,EAAE,EAAE,MAAM,MAAM,CAAC;AAC1B,OAAO,EAAE,kBAAkB,EAAE,MAAM,sCAAsC,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,4BAA4B,CAAC;AACvE,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAC9D,OAAO,EAAE,WAAW,EAAE,MAAM,iCAAiC,CAAC;AAE9D;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IA2CjC;IACA,MAAM,EAAE,GAAG,MAAM,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC;IAE3C,MAAM,0BAA0B,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;IAEpD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SACpC,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC,MAAM,CAAC;SACd,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;SACpC,uBAAuB,EAAE,CAAC;IAE5B,MAAM,QAAQ,GAAG,gCAAgC,CAChD,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CAAoB,CAC1E,CAAC;IAEF,MAAM,eAAe,GAAG,MAAM,aAAa,CAAC;QAC3C,QAAQ;QACR,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,4BAA4B,EAAE,IAAI,CAAC,4BAA4B;KAC/D,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,IAAI,CAAC,cAAc,IAAI,EAAE,CAAC,EAAE,GAAG,eAAe,CAAC,OAAO,CAAC,CAAC;IAE7E,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SAC9B,UAAU,CAAC,MAAM,CAAC;SAClB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,CAAC;SACjC,MAAM,CAAC,MAAM,CAAC;SACd,uBAAuB,EAAE,CAAC;IAE5B,MAAM,EAAE,GAAG,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC;IAEjD,qCAAqC;IACrC,YAAY;IACZ,aAAa;IACb,MAAM;IAEN,oDAAoD;IACpD,wDAAwD;IACxD,mDAAmD;IACnD,MAAM,wBAAwB,GAAuB,EAAE,CAAC;IAExD,MAAM,2BAA2B,CAAC;QACjC,MAAM,EAAE,IAAI,CAAC,MAAM;QACnB,EAAE;QACF,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,eAAe,EAAE,wBAAwB;KACzC,CAAC,CAAC;IAEH,uDAAuD;IACvD,yBAAyB,CAAC;QACzB,EAAE;QACF,EAAE;QACF,QAAQ;QACR,OAAO;QACP,KAAK,EAAE,IAAI,CAAC,KAAK;KACjB,CAAC,CAAC;IAEH,kBAAkB,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;IAEtC,OAAO;QACN,EAAE;QACF,EAAE,EAAE;YACH,GAAG,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;qBAC5B,UAAU,CAAC,MAAM,CAAC;qBAClB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,CAAC;qBACjC,MAAM,CAAC,WAAW,CAAC;qBACnB,uBAAuB,EAAE,CAAC;gBAC5B,OAAO,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAC5C,CAAC;SACD;QACD,QAAQ,EAAE;YACT,GAAG,EAAE,KAAK,IAAI,EAAE;gBACf,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;qBAC5B,UAAU,CAAC,MAAM,CAAC;qBAClB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;qBACpC,MAAM,CAAC,WAAW,CAAC;qBACnB,uBAAuB,EAAE,CAAC;gBAC5B,OAAO,gCAAgC,CACtC,IAAI,CAAC,KAAK,CAAC,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAC/C,CAAC;YACH,CAAC;YACD,GAAG,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;gBAC1B,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC,CAAC;gBACvD,MAAM,CAAC,YAAY,GAAG,MAAM,CAAC,OAAO,CAAC;gBACrC,MAAM,CAAC,iBAAiB,GAAG,MAAM,CAAC,UAAU,CAAC;gBAE7C,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;qBACf,WAAW,CAAC,MAAM,CAAC;qBACnB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;qBACpC,GAAG,CAAC;oBACJ,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAC7B,IAAI,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CACpC;iBACD,CAAC;qBACD,OAAO,EAAE,CAAC;YACb,CAAC;SACD;QACD,OAAO,EAAE;YACR,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,OAAO;SACxB;QACD,MAAM,EAAE;YACP,GAAG,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,GAAG,eAAe,CAAC,MAAM,CAAC;SAC5C;QACD,wBAAwB;QACxB,WAAW,EAAE,KAAK,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE,EAAE;YAC3C,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;iBACpC,UAAU,CAAC,MAAM,CAAC;iBAClB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;iBACpC,MAAM,CAAC,WAAW,CAAC;iBACnB,uBAAuB,EAAE,CAAC;YAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAC1B,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CACxB,CAAC;YAErB,OAAO,MAAM,WAAW,CAAC;gBACxB,KAAK;gBACL,SAAS;gBACT,QAAQ;gBACR,8CAA8C;gBAC9C,OAAO;gBACP,EAAE;aACF,CAAC,CAAC;QACJ,CAAC;QACD,WAAW,EAAE,KAAK,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE;YACpC,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;iBACpC,UAAU,CAAC,MAAM,CAAC;iBAClB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,gBAAgB,CAAC;iBACpC,MAAM,CAAC,WAAW,CAAC;iBACnB,uBAAuB,EAAE,CAAC;YAE5B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAC1B,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC,CACxB,CAAC;YAErB,OAAO,CACN,MAAM,WAAW,CAAC;gBACjB,SAAS;gBACT,EAAE;gBACF,QAAQ;gBACR,8CAA8C;gBAC9C,OAAO;aACP,CAAC,CACF,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC/C,CAAC;QACD,KAAK,EAAE,KAAK,IAAI,EAAE;YACjB,MAAM,EAAE,CAAC,OAAO,EAAE,CAAC;YACnB,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC;QAC7B,CAAC;QACD,OAAO,EAAE,IAAI,CAAC,MAAM;QACpB,MAAM,EAAE,KAAK,IAAI,EAAE;YAClB,MAAM,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,CAAC;YAC5C,OAAO,MAAM,MAAM,CAAC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;QACxC,CAAC;QACD,GAAG,EAAE,IAAI,CAAC,GAAG;KACb,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,KAAK,UAAU,0BAA0B,CAAC,IAAkB;IAC3D,MAAM,kBAAkB,GAAG,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;SAC1C,UAAU,CAAC,MAAM,CAAC;SAClB,MAAM,CAAC,MAAM,CAAC;SACd,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,CAAC;SACjC,gBAAgB,EAAE,CAAC;IAErB,IAAI,CAAC,kBAAkB,EAAE,CAAC;QACzB,MAAM,IAAI,CAAC,GAAG,CAAC,EAAE;aACf,UAAU,CAAC,MAAM,CAAC;aAClB,MAAM,CAAC;YACP,IAAI,EAAE,aAAa;YACnB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;SACpC,CAAC;aACD,OAAO,EAAE,CAAC;IACb,CAAC;AACF,CAAC","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]="
|
|
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=
|
|
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":";;AAAA,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,0BAA0B,CAAC;AAC/D,OAAO,EAAE,QAAQ,EAAE,MAAM,MAAM,CAAC;AAEhC,IAAI,CAAC,sEAAsE,EAAE,KAAK,IAAI,EAAE;IACvF,MAAM,KAAK,GAAG,MAAM,UAAU,EAAE,CAAC;IACjC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;IAC5D,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,EAAE;SAC9B,UAAU,CAAC,QAAQ,CAAC;SACpB,aAAa,EAAE;SACf,SAAS,CAAC,IAAI,CAAC;SACf,uBAAuB,EAAE,CAAC;IAE5B,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,EAAE;SAC/B,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC;QACP,QAAQ,EAAE,MAAM,CAAC,EAAE;QACnB,MAAM,EAAE,IAAI;KACZ,CAAC;SACD,SAAS,CAAC,IAAI,CAAC;SACf,uBAAuB,EAAE,CAAC;IAE5B,MAAM,QAAQ,CAAC,EAAE;SACf,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC;QACP,SAAS,EAAE,OAAO,CAAC,EAAE;KACrB,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,iBAAiB,GAAG,MAAM,QAAQ,CAAC,MAAM,EAAE,CAAC;IAClD,MAAM,QAAQ,CAAC,KAAK,EAAE,CAAC;IAEvB,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,iBAAiB,EAAE,CAAC,CAAC;IACxE,MAAM,OAAO,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,EAAE;SAChC,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC,IAAI,CAAC;SACZ,OAAO,EAAE,CAAC;IACZ,MAAM,QAAQ,GAAG,MAAM,QAAQ,CAAC,EAAE;SAChC,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC,IAAI,CAAC;SACZ,OAAO,EAAE,CAAC;IACZ,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE;IACvC,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IACxE,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IAE9C,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IAE/C,MAAM,MAAM,GAAG,eAAe,CAAC,QAAQ,CAAC,CAAC;IAEzC,MAAM,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC;IAEzC,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;IAEnC,MAAM,eAAe,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IACrD,MAAM,CAAC,eAAe,CAAC,YAAY,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;AAClE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,0FAA0F,EAAE,KAAK,IAAI,EAAE;IAC3G,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACzC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC;aACrB;SACD,CAAC;KACF,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;IAC9C,MAAM,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,QAAQ,CAAC,iBAAiB,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC9C,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IACpD,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;AAChD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+BAA+B,EAAE,KAAK,IAAI,EAAE;IAChD,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACzC,IAAI,EAAE,MAAM,UAAU,CAAC;YACtB,QAAQ,EAAE;gBACT,UAAU,EAAE,IAAI;gBAChB,OAAO,EAAE,CAAC,IAAI,CAAC;gBACf,OAAO,EAAE,EAAE;aACX;SACD,CAAC;QACF,cAAc,EAAE,CAAC,EAAE,GAAG,EAAE,oBAAoB,EAAE,CAAC;KAC/C,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC;IAC5C,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC;IAE1C,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,IAAI,CAAC,oBAAoB,CAAC,CAAC;IACnD,MAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;AAC/B,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gDAAgD,EAAE,KAAK,IAAI,EAAE;IACjE,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE;SAClB,UAAU,CAAC,MAAM,CAAC;SAClB,KAAK,CAAC,MAAM,EAAE,GAAG,EAAE,aAAa,CAAC;SACjC,OAAO,EAAE,CAAC;IAEZ,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,MAAM,EAAE,CAAC;IAEpC,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IAErD,MAAM,EAAE,GAAG,MAAM,QAAQ,CAAC,EAAE,CAAC,GAAG,EAAE,CAAC;IAEnC,MAAM,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;IACzB,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACjC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kCAAkC,EAAE,KAAK,IAAI,EAAE;IACnD,MAAM,WAAW,GAAG;QACnB,EAAE,EAAE,iBAAiB;QACrB,IAAI,EAAE,OAAO;KACb,CAAC;IAEF,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC;QACzC,IAAI,EAAE,MAAM,UAAU,EAAE;QACxB,OAAO,EAAE,WAAW;KACpB,CAAC,CAAC;IAEH,MAAM,aAAa,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE;SACxC,UAAU,CAAC,gBAAgB,CAAC;SAC5B,SAAS,EAAE;SACX,OAAO,EAAE,CAAC;IAEZ,MAAM,CAAC,aAAa,CAAC,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC;AAC9C,CAAC,CAAC,CAAC;AAEH,0DAA0D;AAC1D,4EAA4E;AAE5E,mDAAmD;AAEnD,6CAA6C;AAC7C,yCAAyC;AACzC,2BAA2B;AAC3B,OAAO;AAEP,wBAAwB;AACxB,yBAAyB;AACzB,0CAA0C;AAC1C,WAAW;AACX,qCAAqC;AACrC,uBAAuB;AACvB,yBAAyB;AACzB,wBAAwB;AACxB,uCAAuC;AACvC,SAAS;AACT,QAAQ;AACR,OAAO;AACP,gBAAgB;AAEhB,8CAA8C;AAE9C,kCAAkC;AAClC,yCAAyC;AACzC,gDAAgD;AAChD,MAAM;AAEN,IAAI,CAAC,8CAA8C,EAAE,KAAK,IAAI,EAAE;IAC/D,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,OAAO,CAAC,KAAK,EAAE,CAAC;IAEtB,uBAAuB;IACvB,MAAM,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC,CAAC;AAC1D,CAAC,CAAC,CAAC","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;
|
|
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]="
|
|
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=
|
|
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;
|
|
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]="
|
|
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=
|
|
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":"
|
|
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,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]="4c5878d7-cb19-5bc9-a5bf-6c0a8c175c63")}catch(e){}}();
|
|
3
3
|
export const ENV_VARIABLES = {
|
|
4
|
-
PUBLIC_POSTHOG_TOKEN:
|
|
5
|
-
PUBLIC_INLANG_SDK_SENTRY_DSN:
|
|
6
|
-
SDK_VERSION: "2.0.0-beta.
|
|
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=
|
|
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:
|
|
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"}
|
|
@@ -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]="
|
|
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
|
-
|
|
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
|
-
|
|
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=
|
|
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\
|
|
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]="
|
|
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=
|
|
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":"
|
|
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.
|
|
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.
|
|
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";
|
package/src/lix/index.ts
ADDED
|
@@ -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
|
|
|
@@ -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
|
-
|
|
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
|
-
|
|
85
|
-
distinct_id: "unknown",
|
|
86
|
+
distinct_id: args.accountId,
|
|
86
87
|
properties: {
|
|
87
88
|
$group_type: "project",
|
|
88
89
|
$group_key: args.projectId,
|