@inlang/sdk 2.6.2 → 2.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/json-schema/old-v1-message/toMessageV1.js +5 -0
- package/dist/json-schema/old-v1-message/toMessageV1.js.map +1 -1
- package/dist/json-schema/old-v1-message/toMessageV1.test.js +41 -0
- package/dist/json-schema/old-v1-message/toMessageV1.test.js.map +1 -1
- package/dist/json-schema/pattern.d.ts +134 -0
- package/dist/json-schema/pattern.d.ts.map +1 -1
- package/dist/json-schema/pattern.js +23 -1
- package/dist/json-schema/pattern.js.map +1 -1
- package/dist/json-schema/settings.d.ts +0 -1
- package/dist/json-schema/settings.d.ts.map +1 -1
- package/dist/json-schema/settings.js +0 -5
- package/dist/json-schema/settings.js.map +1 -1
- package/dist/project/loadProject.d.ts +0 -9
- package/dist/project/loadProject.d.ts.map +1 -1
- package/dist/project/loadProject.js +0 -16
- package/dist/project/loadProject.js.map +1 -1
- package/dist/project/loadProjectFromDirectory.d.ts.map +1 -1
- package/dist/project/loadProjectFromDirectory.js +1 -1
- package/dist/project/loadProjectFromDirectory.js.map +1 -1
- package/dist/project/newProject.d.ts.map +1 -1
- package/dist/project/newProject.js +1 -6
- package/dist/project/newProject.js.map +1 -1
- package/dist/project/newProject.test.js +12 -0
- package/dist/project/newProject.test.js.map +1 -1
- package/dist/query-utilities/selectBundleNested.d.ts +60 -0
- package/dist/query-utilities/selectBundleNested.d.ts.map +1 -1
- package/dist/services/env-variables/index.d.ts +0 -1
- package/dist/services/env-variables/index.d.ts.map +1 -1
- package/dist/services/env-variables/index.js +1 -2
- package/dist/services/env-variables/index.js.map +1 -1
- package/package.json +1 -1
- package/src/json-schema/old-v1-message/toMessageV1.test.ts +45 -0
- package/src/json-schema/old-v1-message/toMessageV1.ts +8 -0
- package/src/json-schema/pattern.ts +33 -1
- package/src/json-schema/settings.ts +0 -10
- package/src/project/loadProject.ts +0 -28
- package/src/project/loadProjectFromDirectory.ts +1 -6
- package/src/project/newProject.test.ts +16 -0
- package/src/project/newProject.ts +1 -6
- package/src/services/env-variables/createIndexFile.js +0 -1
- package/src/services/env-variables/index.d.ts +0 -1
- package/dist/project/maybeCaptureTelemetry.d.ts +0 -16
- package/dist/project/maybeCaptureTelemetry.d.ts.map +0 -1
- package/dist/project/maybeCaptureTelemetry.js +0 -61
- package/dist/project/maybeCaptureTelemetry.js.map +0 -1
- package/dist/project/maybeCaptureTelemetry.test.d.ts +0 -2
- package/dist/project/maybeCaptureTelemetry.test.d.ts.map +0 -1
- package/dist/project/maybeCaptureTelemetry.test.js +0 -69
- package/dist/project/maybeCaptureTelemetry.test.js.map +0 -1
- package/dist/services/telemetry/capture.d.ts +0 -24
- package/dist/services/telemetry/capture.d.ts.map +0 -1
- package/dist/services/telemetry/capture.js +0 -72
- package/dist/services/telemetry/capture.js.map +0 -1
- package/dist/services/telemetry/capture.test.d.ts +0 -2
- package/dist/services/telemetry/capture.test.d.ts.map +0 -1
- package/dist/services/telemetry/capture.test.js +0 -43
- package/dist/services/telemetry/capture.test.js.map +0 -1
- package/src/project/maybeCaptureTelemetry.test.ts +0 -80
- package/src/project/maybeCaptureTelemetry.ts +0 -77
- package/src/services/telemetry/capture.test.ts +0 -50
- package/src/services/telemetry/capture.ts +0 -98
|
@@ -42,3 +42,19 @@ test("it should have the lix id as project id", async () => {
|
|
|
42
42
|
expect(projectId).toBeDefined();
|
|
43
43
|
expect(projectId).toBe(lixId);
|
|
44
44
|
});
|
|
45
|
+
|
|
46
|
+
test("it should not persist the removed SDK metadata key during project creation", async () => {
|
|
47
|
+
const project = await loadProjectInMemory({
|
|
48
|
+
blob: await newProject(),
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
const removedSdkKey = ["lix", "tele" + "metry"].join("_");
|
|
52
|
+
|
|
53
|
+
const removedKey = await project.lix.db
|
|
54
|
+
.selectFrom("key_value")
|
|
55
|
+
.select("value")
|
|
56
|
+
.where("key", "=", removedSdkKey)
|
|
57
|
+
.executeTakeFirst();
|
|
58
|
+
|
|
59
|
+
expect(removedKey).toBeUndefined();
|
|
60
|
+
});
|
|
@@ -23,12 +23,7 @@ export async function newProject(args?: {
|
|
|
23
23
|
try {
|
|
24
24
|
const inlangDbContent = contentFromDatabase(sqlite);
|
|
25
25
|
|
|
26
|
-
const lix = await openLixInMemory({
|
|
27
|
-
blob: await newLixFile(),
|
|
28
|
-
keyValues: [
|
|
29
|
-
{ key: "lix_telemetry", value: args?.settings?.telemetry ?? "on" },
|
|
30
|
-
],
|
|
31
|
-
});
|
|
26
|
+
const lix = await openLixInMemory({ blob: await newLixFile() });
|
|
32
27
|
|
|
33
28
|
const { value: lixId } = await lix.db
|
|
34
29
|
.selectFrom("key_value")
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { Kysely } from "kysely";
|
|
2
|
-
import type { InlangDatabaseSchema } from "../database/schema.js";
|
|
3
|
-
import type { ProjectSettings } from "../json-schema/settings.js";
|
|
4
|
-
import type { Lix } from "@lix-js/sdk";
|
|
5
|
-
export declare function maybeCaptureLoadedProject(args: {
|
|
6
|
-
id: string;
|
|
7
|
-
lix: Lix;
|
|
8
|
-
settings: ProjectSettings;
|
|
9
|
-
plugins: Readonly<Array<{
|
|
10
|
-
key: string;
|
|
11
|
-
}>>;
|
|
12
|
-
appId?: string;
|
|
13
|
-
db: Kysely<InlangDatabaseSchema>;
|
|
14
|
-
forceCapture?: boolean;
|
|
15
|
-
}): Promise<void>;
|
|
16
|
-
//# sourceMappingURL=maybeCaptureTelemetry.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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;AAClE,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;IACjC,YAAY,CAAC,EAAE,OAAO,CAAC;CACvB,iBA6DA"}
|
|
@@ -1,61 +0,0 @@
|
|
|
1
|
-
import { Kysely } from "kysely";
|
|
2
|
-
import { capture } from "../services/telemetry/capture.js";
|
|
3
|
-
import { ENV_VARIABLES } from "../services/env-variables/index.js";
|
|
4
|
-
export async function maybeCaptureLoadedProject(args) {
|
|
5
|
-
if (args.settings.telemetry === "off") {
|
|
6
|
-
return;
|
|
7
|
-
}
|
|
8
|
-
// --- SAMPLING ---
|
|
9
|
-
// randomly sample 10% of projects
|
|
10
|
-
// to reduce the number of telemetry events.
|
|
11
|
-
//
|
|
12
|
-
// 10% is chosen out of a gut feeling
|
|
13
|
-
if (args.forceCapture !== true && Math.random() > 0.1) {
|
|
14
|
-
return;
|
|
15
|
-
}
|
|
16
|
-
try {
|
|
17
|
-
const activeAccount = await args.lix.db
|
|
18
|
-
.selectFrom("active_account")
|
|
19
|
-
.select("id")
|
|
20
|
-
.executeTakeFirstOrThrow();
|
|
21
|
-
const bundles = await args.db
|
|
22
|
-
.selectFrom("bundle")
|
|
23
|
-
.select((s) => s.fn.count("id").as("count"))
|
|
24
|
-
.executeTakeFirst();
|
|
25
|
-
const messages = await args.db
|
|
26
|
-
.selectFrom("message")
|
|
27
|
-
.select((s) => s.fn.count("id").as("count"))
|
|
28
|
-
.executeTakeFirst();
|
|
29
|
-
const variants = await args.db
|
|
30
|
-
.selectFrom("variant")
|
|
31
|
-
.select((s) => s.fn.count("id").as("count"))
|
|
32
|
-
.executeTakeFirst();
|
|
33
|
-
await capture("SDK loaded project", {
|
|
34
|
-
projectId: args.id,
|
|
35
|
-
settings: args.settings,
|
|
36
|
-
accountId: activeAccount.id,
|
|
37
|
-
properties: {
|
|
38
|
-
// Insight: Which app is used by the SDK
|
|
39
|
-
appId: args.appId,
|
|
40
|
-
// Insight: How many languages are used, etc.
|
|
41
|
-
settings: args.settings,
|
|
42
|
-
// Insight on the used plugins (which one's to prioritize)
|
|
43
|
-
pluginKeys: args.plugins.map((plugin) => plugin.key),
|
|
44
|
-
// Insight: Which version of the SDK is used (can be used to deprecate old versions)
|
|
45
|
-
sdkVersion: ENV_VARIABLES.SDK_VERSION,
|
|
46
|
-
// Insight: Scale of projects (what project size to optimize for)
|
|
47
|
-
numBundles: bundles?.count,
|
|
48
|
-
numMessages: messages?.count,
|
|
49
|
-
numVariants: variants?.count,
|
|
50
|
-
},
|
|
51
|
-
});
|
|
52
|
-
}
|
|
53
|
-
catch (e) {
|
|
54
|
-
if (e instanceof Error &&
|
|
55
|
-
e.message.includes("driver has already been destroyed")) {
|
|
56
|
-
// The project has been closed, nothing to capture
|
|
57
|
-
return;
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
//# sourceMappingURL=maybeCaptureTelemetry.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"maybeCaptureTelemetry.js","sourceRoot":"/","sources":["project/maybeCaptureTelemetry.ts"],"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;AAInE,MAAM,CAAC,KAAK,UAAU,yBAAyB,CAAC,IAQ/C;IACA,IAAI,IAAI,CAAC,QAAQ,CAAC,SAAS,KAAK,KAAK,EAAE,CAAC;QACvC,OAAO;IACR,CAAC;IAED,mBAAmB;IACnB,kCAAkC;IAClC,4CAA4C;IAC5C,EAAE;IACF,qCAAqC;IACrC,IAAI,IAAI,CAAC,YAAY,KAAK,IAAI,IAAI,IAAI,CAAC,MAAM,EAAE,GAAG,GAAG,EAAE,CAAC;QACvD,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;IACF,CAAC;AACF,CAAC","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 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\tforceCapture?: boolean;\n}) {\n\tif (args.settings.telemetry === \"off\") {\n\t\treturn;\n\t}\n\n\t// --- SAMPLING ---\n\t// randomly sample 10% of projects\n\t// to reduce the number of telemetry events.\n\t//\n\t// 10% is chosen out of a gut feeling\n\tif (args.forceCapture !== true && Math.random() > 0.1) {\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}\n}\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"maybeCaptureTelemetry.test.d.ts","sourceRoot":"/","sources":["project/maybeCaptureTelemetry.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,69 +0,0 @@
|
|
|
1
|
-
import { expect, test, vi } from "vitest";
|
|
2
|
-
import { loadProjectInMemory } from "./loadProjectInMemory.js";
|
|
3
|
-
import { newProject } from "./newProject.js";
|
|
4
|
-
import { maybeCaptureLoadedProject } from "./maybeCaptureTelemetry.js";
|
|
5
|
-
import { capture } from "../services/telemetry/capture.js";
|
|
6
|
-
test("it should capture as expected", async () => {
|
|
7
|
-
vi.mock("../services/telemetry/capture.js", async () => {
|
|
8
|
-
return {
|
|
9
|
-
capture: vi.fn(() => Promise.resolve()),
|
|
10
|
-
};
|
|
11
|
-
});
|
|
12
|
-
vi.mock("../services/env-variables/index", async () => {
|
|
13
|
-
return {
|
|
14
|
-
ENV_VARIABLES: {
|
|
15
|
-
PUBLIC_POSTHOG_TOKEN: "mock-defined",
|
|
16
|
-
SDK_VERSION: "1.0.0-mock",
|
|
17
|
-
},
|
|
18
|
-
};
|
|
19
|
-
});
|
|
20
|
-
const project = await loadProjectInMemory({
|
|
21
|
-
blob: await newProject(),
|
|
22
|
-
});
|
|
23
|
-
const account = await project.lix.db
|
|
24
|
-
.selectFrom("active_account")
|
|
25
|
-
.select("id")
|
|
26
|
-
.executeTakeFirstOrThrow();
|
|
27
|
-
const bundle = await project.db
|
|
28
|
-
.insertInto("bundle")
|
|
29
|
-
.defaultValues()
|
|
30
|
-
.returningAll()
|
|
31
|
-
.executeTakeFirstOrThrow();
|
|
32
|
-
const message = await project.db
|
|
33
|
-
.insertInto("message")
|
|
34
|
-
.values({ bundleId: bundle.id, locale: "en" })
|
|
35
|
-
.returningAll()
|
|
36
|
-
.executeTakeFirstOrThrow();
|
|
37
|
-
await project.db
|
|
38
|
-
.insertInto("variant")
|
|
39
|
-
.values({ messageId: message.id })
|
|
40
|
-
.returningAll()
|
|
41
|
-
.executeTakeFirst();
|
|
42
|
-
const settings = await project.settings.get();
|
|
43
|
-
const id = await project.id.get();
|
|
44
|
-
const plugins = await project.plugins.get();
|
|
45
|
-
await maybeCaptureLoadedProject({
|
|
46
|
-
id,
|
|
47
|
-
settings,
|
|
48
|
-
forceCapture: true,
|
|
49
|
-
plugins,
|
|
50
|
-
lix: project.lix,
|
|
51
|
-
appId: "test",
|
|
52
|
-
db: project.db,
|
|
53
|
-
});
|
|
54
|
-
expect(capture).toHaveBeenCalledWith("SDK loaded project", {
|
|
55
|
-
projectId: await project.id.get(),
|
|
56
|
-
settings: await project.settings.get(),
|
|
57
|
-
accountId: account.id,
|
|
58
|
-
properties: {
|
|
59
|
-
appId: "test",
|
|
60
|
-
settings: await project.settings.get(),
|
|
61
|
-
pluginKeys: [],
|
|
62
|
-
sdkVersion: "1.0.0-mock",
|
|
63
|
-
numBundles: 1,
|
|
64
|
-
numMessages: 1,
|
|
65
|
-
numVariants: 1,
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
//# sourceMappingURL=maybeCaptureTelemetry.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"maybeCaptureTelemetry.test.js","sourceRoot":"/","sources":["project/maybeCaptureTelemetry.test.ts"],"names":[],"mappings":"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","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\tforceCapture: true,\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"]}
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
import type { ProjectSettings } from "../../json-schema/settings.js";
|
|
2
|
-
/**
|
|
3
|
-
* List of telemetry events for typesafety.
|
|
4
|
-
*
|
|
5
|
-
* - prefix with `SDK` to avoid collisions with other apps
|
|
6
|
-
* - use past tense to indicate that the event is completed
|
|
7
|
-
*/
|
|
8
|
-
type TelemetryEvent = "SDK loaded project";
|
|
9
|
-
/**
|
|
10
|
-
* Capture an event.
|
|
11
|
-
*
|
|
12
|
-
* - manually calling the PostHog API because the SDKs were not platform angostic (and generally bloated)
|
|
13
|
-
*/
|
|
14
|
-
export declare const capture: (event: TelemetryEvent, args: {
|
|
15
|
-
projectId: string;
|
|
16
|
-
accountId: string;
|
|
17
|
-
/**
|
|
18
|
-
* Please use snake_case for property names.
|
|
19
|
-
*/
|
|
20
|
-
properties: Record<string, any>;
|
|
21
|
-
settings: Pick<ProjectSettings, "telemetry">;
|
|
22
|
-
}) => Promise<void>;
|
|
23
|
-
export {};
|
|
24
|
-
//# sourceMappingURL=capture.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
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;AAGrE;;;;;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,72 +0,0 @@
|
|
|
1
|
-
// import { ENV_VARIABLES } from "../env-variables/index.js";
|
|
2
|
-
import { ENV_VARIABLES } from "../env-variables/index.js";
|
|
3
|
-
/**
|
|
4
|
-
* Capture an event.
|
|
5
|
-
*
|
|
6
|
-
* - manually calling the PostHog API because the SDKs were not platform angostic (and generally bloated)
|
|
7
|
-
*/
|
|
8
|
-
export const capture = async (event, args) => {
|
|
9
|
-
if (args.settings.telemetry === "off") {
|
|
10
|
-
return;
|
|
11
|
-
}
|
|
12
|
-
else if (ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN === undefined) {
|
|
13
|
-
return;
|
|
14
|
-
}
|
|
15
|
-
try {
|
|
16
|
-
await fetch("https://eu.posthog.com/capture/", {
|
|
17
|
-
method: "POST",
|
|
18
|
-
body: JSON.stringify({
|
|
19
|
-
api_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,
|
|
20
|
-
event,
|
|
21
|
-
distinct_id: args.accountId,
|
|
22
|
-
properties: {
|
|
23
|
-
$groups: { project: args.projectId },
|
|
24
|
-
...args.properties,
|
|
25
|
-
},
|
|
26
|
-
}),
|
|
27
|
-
});
|
|
28
|
-
await identifyProject({
|
|
29
|
-
projectId: args.projectId,
|
|
30
|
-
accountId: args.accountId,
|
|
31
|
-
// using the id for now as a name but can be changed in the future
|
|
32
|
-
// we need at least one property to make a project visible in the dashboar
|
|
33
|
-
properties: { name: args.projectId },
|
|
34
|
-
});
|
|
35
|
-
}
|
|
36
|
-
catch {
|
|
37
|
-
// do nothing
|
|
38
|
-
}
|
|
39
|
-
};
|
|
40
|
-
/**
|
|
41
|
-
* Identifying a project is needed.
|
|
42
|
-
*
|
|
43
|
-
* Otherwise, the project will not be visible in the PostHog dashboard.
|
|
44
|
-
*/
|
|
45
|
-
const identifyProject = async (args) => {
|
|
46
|
-
// do not send events if the token is not set
|
|
47
|
-
// (assuming this eases testing)
|
|
48
|
-
if (ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN === undefined) {
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
try {
|
|
52
|
-
await fetch("https://eu.posthog.com/capture/", {
|
|
53
|
-
method: "POST",
|
|
54
|
-
body: JSON.stringify({
|
|
55
|
-
api_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,
|
|
56
|
-
event: "$groupidentify",
|
|
57
|
-
distinct_id: args.accountId,
|
|
58
|
-
properties: {
|
|
59
|
-
$group_type: "project",
|
|
60
|
-
$group_key: args.projectId,
|
|
61
|
-
$group_set: {
|
|
62
|
-
...args.properties,
|
|
63
|
-
},
|
|
64
|
-
},
|
|
65
|
-
}),
|
|
66
|
-
});
|
|
67
|
-
}
|
|
68
|
-
catch {
|
|
69
|
-
// do nothing
|
|
70
|
-
}
|
|
71
|
-
};
|
|
72
|
-
//# sourceMappingURL=capture.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"capture.js","sourceRoot":"/","sources":["services/telemetry/capture.ts"],"names":[],"mappings":"AAAA,6DAA6D;AAG7D,OAAO,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC;AAU1D;;;;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,MAAM,CAAC;QACR,aAAa;IACd,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,MAAM,CAAC;QACR,aAAa;IACd,CAAC;AACF,CAAC,CAAC","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\";\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 {\n\t\t// do nothing\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 {\n\t\t// do nothing\n\t}\n};\n"]}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"capture.test.d.ts","sourceRoot":"/","sources":["services/telemetry/capture.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
import { expect, test, vi } from "vitest";
|
|
2
|
-
import { capture } from "./capture.js";
|
|
3
|
-
test("it should not capture if telemetry is off", async () => {
|
|
4
|
-
// @ts-expect-error - global.fetch is not defined
|
|
5
|
-
global.fetch = vi.fn(() => Promise.resolve());
|
|
6
|
-
vi.mock("../env-variables/index.js", async () => {
|
|
7
|
-
return {
|
|
8
|
-
ENV_VARIABLES: {
|
|
9
|
-
PUBLIC_POSTHOG_TOKEN: "mock-defined",
|
|
10
|
-
},
|
|
11
|
-
};
|
|
12
|
-
});
|
|
13
|
-
await capture("SDK loaded project", {
|
|
14
|
-
projectId: "test",
|
|
15
|
-
accountId: "test",
|
|
16
|
-
settings: {
|
|
17
|
-
telemetry: "off",
|
|
18
|
-
},
|
|
19
|
-
properties: {},
|
|
20
|
-
});
|
|
21
|
-
expect(global.fetch).not.toHaveBeenCalled();
|
|
22
|
-
});
|
|
23
|
-
test("it should not capture if telemetry is NOT off", async () => {
|
|
24
|
-
// @ts-expect-error - global.fetch is not defined
|
|
25
|
-
global.fetch = vi.fn(() => Promise.resolve());
|
|
26
|
-
vi.mock("../env-variables/index.js", async () => {
|
|
27
|
-
return {
|
|
28
|
-
ENV_VARIABLES: {
|
|
29
|
-
PUBLIC_POSTHOG_TOKEN: "mock-defined",
|
|
30
|
-
},
|
|
31
|
-
};
|
|
32
|
-
});
|
|
33
|
-
await capture("SDK loaded project", {
|
|
34
|
-
projectId: "test",
|
|
35
|
-
accountId: "test",
|
|
36
|
-
settings: {
|
|
37
|
-
telemetry: undefined,
|
|
38
|
-
},
|
|
39
|
-
properties: {},
|
|
40
|
-
});
|
|
41
|
-
expect(global.fetch).toHaveBeenCalled();
|
|
42
|
-
});
|
|
43
|
-
//# sourceMappingURL=capture.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"capture.test.js","sourceRoot":"/","sources":["services/telemetry/capture.test.ts"],"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","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"]}
|
|
@@ -1,80 +0,0 @@
|
|
|
1
|
-
import { expect, test, vi } from "vitest";
|
|
2
|
-
import { loadProjectInMemory } from "./loadProjectInMemory.js";
|
|
3
|
-
import { newProject } from "./newProject.js";
|
|
4
|
-
import { maybeCaptureLoadedProject } from "./maybeCaptureTelemetry.js";
|
|
5
|
-
import { capture } from "../services/telemetry/capture.js";
|
|
6
|
-
|
|
7
|
-
test("it should capture as expected", async () => {
|
|
8
|
-
vi.mock("../services/telemetry/capture.js", async () => {
|
|
9
|
-
return {
|
|
10
|
-
capture: vi.fn(() => Promise.resolve()),
|
|
11
|
-
};
|
|
12
|
-
});
|
|
13
|
-
|
|
14
|
-
vi.mock("../services/env-variables/index", async () => {
|
|
15
|
-
return {
|
|
16
|
-
ENV_VARIABLES: {
|
|
17
|
-
PUBLIC_POSTHOG_TOKEN: "mock-defined",
|
|
18
|
-
SDK_VERSION: "1.0.0-mock",
|
|
19
|
-
},
|
|
20
|
-
};
|
|
21
|
-
});
|
|
22
|
-
|
|
23
|
-
const project = await loadProjectInMemory({
|
|
24
|
-
blob: await newProject(),
|
|
25
|
-
});
|
|
26
|
-
|
|
27
|
-
const account = await project.lix.db
|
|
28
|
-
.selectFrom("active_account")
|
|
29
|
-
.select("id")
|
|
30
|
-
.executeTakeFirstOrThrow();
|
|
31
|
-
|
|
32
|
-
const bundle = await project.db
|
|
33
|
-
.insertInto("bundle")
|
|
34
|
-
.defaultValues()
|
|
35
|
-
.returningAll()
|
|
36
|
-
.executeTakeFirstOrThrow();
|
|
37
|
-
|
|
38
|
-
const message = await project.db
|
|
39
|
-
.insertInto("message")
|
|
40
|
-
.values({ bundleId: bundle.id, locale: "en" })
|
|
41
|
-
.returningAll()
|
|
42
|
-
.executeTakeFirstOrThrow();
|
|
43
|
-
|
|
44
|
-
await project.db
|
|
45
|
-
.insertInto("variant")
|
|
46
|
-
.values({ messageId: message.id })
|
|
47
|
-
.returningAll()
|
|
48
|
-
.executeTakeFirst();
|
|
49
|
-
|
|
50
|
-
const settings = await project.settings.get();
|
|
51
|
-
|
|
52
|
-
const id = await project.id.get();
|
|
53
|
-
|
|
54
|
-
const plugins = await project.plugins.get();
|
|
55
|
-
|
|
56
|
-
await maybeCaptureLoadedProject({
|
|
57
|
-
id,
|
|
58
|
-
settings,
|
|
59
|
-
forceCapture: true,
|
|
60
|
-
plugins,
|
|
61
|
-
lix: project.lix,
|
|
62
|
-
appId: "test",
|
|
63
|
-
db: project.db,
|
|
64
|
-
});
|
|
65
|
-
|
|
66
|
-
expect(capture).toHaveBeenCalledWith("SDK loaded project", {
|
|
67
|
-
projectId: await project.id.get(),
|
|
68
|
-
settings: await project.settings.get(),
|
|
69
|
-
accountId: account.id,
|
|
70
|
-
properties: {
|
|
71
|
-
appId: "test",
|
|
72
|
-
settings: await project.settings.get(),
|
|
73
|
-
pluginKeys: [],
|
|
74
|
-
sdkVersion: "1.0.0-mock",
|
|
75
|
-
numBundles: 1,
|
|
76
|
-
numMessages: 1,
|
|
77
|
-
numVariants: 1,
|
|
78
|
-
},
|
|
79
|
-
});
|
|
80
|
-
});
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
import { Kysely } from "kysely";
|
|
2
|
-
import { capture } from "../services/telemetry/capture.js";
|
|
3
|
-
import type { InlangDatabaseSchema } from "../database/schema.js";
|
|
4
|
-
import { ENV_VARIABLES } from "../services/env-variables/index.js";
|
|
5
|
-
import type { ProjectSettings } from "../json-schema/settings.js";
|
|
6
|
-
import type { Lix } from "@lix-js/sdk";
|
|
7
|
-
|
|
8
|
-
export async function maybeCaptureLoadedProject(args: {
|
|
9
|
-
id: string;
|
|
10
|
-
lix: Lix;
|
|
11
|
-
settings: ProjectSettings;
|
|
12
|
-
plugins: Readonly<Array<{ key: string }>>;
|
|
13
|
-
appId?: string;
|
|
14
|
-
db: Kysely<InlangDatabaseSchema>;
|
|
15
|
-
forceCapture?: boolean;
|
|
16
|
-
}) {
|
|
17
|
-
if (args.settings.telemetry === "off") {
|
|
18
|
-
return;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
// --- SAMPLING ---
|
|
22
|
-
// randomly sample 10% of projects
|
|
23
|
-
// to reduce the number of telemetry events.
|
|
24
|
-
//
|
|
25
|
-
// 10% is chosen out of a gut feeling
|
|
26
|
-
if (args.forceCapture !== true && Math.random() > 0.1) {
|
|
27
|
-
return;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
try {
|
|
31
|
-
const activeAccount = await args.lix.db
|
|
32
|
-
.selectFrom("active_account")
|
|
33
|
-
.select("id")
|
|
34
|
-
.executeTakeFirstOrThrow();
|
|
35
|
-
|
|
36
|
-
const bundles = await args.db
|
|
37
|
-
.selectFrom("bundle")
|
|
38
|
-
.select((s) => s.fn.count("id").as("count"))
|
|
39
|
-
.executeTakeFirst();
|
|
40
|
-
const messages = await args.db
|
|
41
|
-
.selectFrom("message")
|
|
42
|
-
.select((s) => s.fn.count("id").as("count"))
|
|
43
|
-
.executeTakeFirst();
|
|
44
|
-
const variants = await args.db
|
|
45
|
-
.selectFrom("variant")
|
|
46
|
-
.select((s) => s.fn.count("id").as("count"))
|
|
47
|
-
.executeTakeFirst();
|
|
48
|
-
|
|
49
|
-
await capture("SDK loaded project", {
|
|
50
|
-
projectId: args.id,
|
|
51
|
-
settings: args.settings,
|
|
52
|
-
accountId: activeAccount.id,
|
|
53
|
-
properties: {
|
|
54
|
-
// Insight: Which app is used by the SDK
|
|
55
|
-
appId: args.appId,
|
|
56
|
-
// Insight: How many languages are used, etc.
|
|
57
|
-
settings: args.settings,
|
|
58
|
-
// Insight on the used plugins (which one's to prioritize)
|
|
59
|
-
pluginKeys: args.plugins.map((plugin) => plugin.key),
|
|
60
|
-
// Insight: Which version of the SDK is used (can be used to deprecate old versions)
|
|
61
|
-
sdkVersion: ENV_VARIABLES.SDK_VERSION,
|
|
62
|
-
// Insight: Scale of projects (what project size to optimize for)
|
|
63
|
-
numBundles: bundles?.count,
|
|
64
|
-
numMessages: messages?.count,
|
|
65
|
-
numVariants: variants?.count,
|
|
66
|
-
},
|
|
67
|
-
});
|
|
68
|
-
} catch (e) {
|
|
69
|
-
if (
|
|
70
|
-
e instanceof Error &&
|
|
71
|
-
e.message.includes("driver has already been destroyed")
|
|
72
|
-
) {
|
|
73
|
-
// The project has been closed, nothing to capture
|
|
74
|
-
return;
|
|
75
|
-
}
|
|
76
|
-
}
|
|
77
|
-
}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
import { expect, test, vi } from "vitest";
|
|
2
|
-
import { capture } from "./capture.js";
|
|
3
|
-
|
|
4
|
-
test("it should not capture if telemetry is off", async () => {
|
|
5
|
-
// @ts-expect-error - global.fetch is not defined
|
|
6
|
-
global.fetch = vi.fn(() => Promise.resolve());
|
|
7
|
-
|
|
8
|
-
vi.mock("../env-variables/index.js", async () => {
|
|
9
|
-
return {
|
|
10
|
-
ENV_VARIABLES: {
|
|
11
|
-
PUBLIC_POSTHOG_TOKEN: "mock-defined",
|
|
12
|
-
},
|
|
13
|
-
};
|
|
14
|
-
});
|
|
15
|
-
|
|
16
|
-
await capture("SDK loaded project", {
|
|
17
|
-
projectId: "test",
|
|
18
|
-
accountId: "test",
|
|
19
|
-
settings: {
|
|
20
|
-
telemetry: "off",
|
|
21
|
-
},
|
|
22
|
-
properties: {},
|
|
23
|
-
});
|
|
24
|
-
|
|
25
|
-
expect(global.fetch).not.toHaveBeenCalled();
|
|
26
|
-
});
|
|
27
|
-
|
|
28
|
-
test("it should not capture if telemetry is NOT off", async () => {
|
|
29
|
-
// @ts-expect-error - global.fetch is not defined
|
|
30
|
-
global.fetch = vi.fn(() => Promise.resolve());
|
|
31
|
-
|
|
32
|
-
vi.mock("../env-variables/index.js", async () => {
|
|
33
|
-
return {
|
|
34
|
-
ENV_VARIABLES: {
|
|
35
|
-
PUBLIC_POSTHOG_TOKEN: "mock-defined",
|
|
36
|
-
},
|
|
37
|
-
};
|
|
38
|
-
});
|
|
39
|
-
|
|
40
|
-
await capture("SDK loaded project", {
|
|
41
|
-
projectId: "test",
|
|
42
|
-
accountId: "test",
|
|
43
|
-
settings: {
|
|
44
|
-
telemetry: undefined,
|
|
45
|
-
},
|
|
46
|
-
properties: {},
|
|
47
|
-
});
|
|
48
|
-
|
|
49
|
-
expect(global.fetch).toHaveBeenCalled();
|
|
50
|
-
});
|