@inlang/sdk 2.4.5 → 2.4.7

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.
@@ -11,5 +11,6 @@ export declare function maybeCaptureLoadedProject(args: {
11
11
  }>>;
12
12
  appId?: string;
13
13
  db: Kysely<InlangDatabaseSchema>;
14
+ forceCapture?: boolean;
14
15
  }): Promise<void>;
15
16
  //# sourceMappingURL=maybeCaptureTelemetry.d.ts.map
@@ -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;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;CACjC,iBAoDA"}
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"}
@@ -5,6 +5,14 @@ export async function maybeCaptureLoadedProject(args) {
5
5
  if (args.settings.telemetry === "off") {
6
6
  return;
7
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
+ }
8
16
  try {
9
17
  const activeAccount = await args.lix.db
10
18
  .selectFrom("active_account")
@@ -1 +1 @@
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,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;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}) {\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}\n}\n"]}
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"]}
@@ -45,6 +45,7 @@ test("it should capture as expected", async () => {
45
45
  await maybeCaptureLoadedProject({
46
46
  id,
47
47
  settings,
48
+ forceCapture: true,
48
49
  plugins,
49
50
  lix: project.lix,
50
51
  appId: "test",
@@ -1 +1 @@
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\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
+ {"version":3,"file":"maybeCaptureTelemetry.test.js","sourceRoot":"/","sources":["project/maybeCaptureTelemetry.test.ts"],"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,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,EAAE;SAClC,UAAU,CAAC,gBAAgB,CAAC;SAC5B,MAAM,CAAC,IAAI,CAAC;SACZ,uBAAuB,EAAE,CAAC;IAE5B,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,YAAY,EAAE,IAAI;QAClB,OAAO;QACP,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,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,SAAS,EAAE,OAAO,CAAC,EAAE;QACrB,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","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 +1 @@
1
- {"version":3,"file":"newProject.d.ts","sourceRoot":"/","sources":["project/newProject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAOlE;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,IAAI,CAAC,EAAE;IACvC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAoDhB;AAED,eAAO,MAAM,sBAAsB;;;;;CAcR,CAAC"}
1
+ {"version":3,"file":"newProject.d.ts","sourceRoot":"/","sources":["project/newProject.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAC;AAOlE;;;;;GAKG;AACH,wBAAsB,UAAU,CAAC,IAAI,CAAC,EAAE;IACvC,QAAQ,CAAC,EAAE,eAAe,CAAC;CAC3B,GAAG,OAAO,CAAC,IAAI,CAAC,CAyDhB;AAED,eAAO,MAAM,sBAAsB;;;;;CAcR,CAAC"}
@@ -14,7 +14,12 @@ export async function newProject(args) {
14
14
  initDb({ sqlite });
15
15
  try {
16
16
  const inlangDbContent = contentFromDatabase(sqlite);
17
- const lix = await openLixInMemory({ blob: await newLixFile() });
17
+ const lix = await openLixInMemory({
18
+ blob: await newLixFile(),
19
+ keyValues: [
20
+ { key: "lix_telemetry", value: args?.settings?.telemetry ?? "on" },
21
+ ],
22
+ });
18
23
  const { value: lixId } = await lix.db
19
24
  .selectFrom("key_value")
20
25
  .select("value")
@@ -1 +1 @@
1
- {"version":3,"file":"newProject.js","sourceRoot":"/","sources":["project/newProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EACN,mBAAmB,EACnB,sBAAsB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAEhC;IACA,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;QAC3C,QAAQ,EAAE,KAAK;KACf,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnB,IAAI,CAAC;QACJ,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;QAEhE,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,EAAE;aACnC,UAAU,CAAC,WAAW,CAAC;aACvB,MAAM,CAAC,OAAO,CAAC;aACf,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC;aAC3B,uBAAuB,EAAE,CAAC;QAE5B,qBAAqB;QACrB,MAAM,GAAG,CAAC,EAAE;aACV,UAAU,CAAC,MAAM,CAAC;aAClB,MAAM,CAAC;YACP;gBACC,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,eAAe;aACrB;YACD;gBACC,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAC7B,IAAI,CAAC,SAAS,CACb,IAAI,EAAE,QAAQ,IAAI,sBAAsB,EACxC,SAAS,EACT,CAAC,CACD,CACD;aACD;YACD;gBACC,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;aACrC;SACD,CAAC;aACD,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,wCAAwC,CAAC,EAAE,EAAE;YACpE,KAAK,EAAE,CAAC;SACR,CAAC,CAAC;QACH,MAAM,KAAK,CAAC;IACb,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,OAAO,EAAE;IACR,uDAAuD;IACvD,+FAA+F;IAC/F,qGAAqG;IACrG,gGAAgG;IAChG,wEAAwE;IACxE,qFAAqF;IACrF,wGAAwG;IACxG,yFAAyF;KACzF;CACyB,CAAC","sourcesContent":["import { newLixFile, openLixInMemory, toBlob } from \"@lix-js/sdk\";\nimport type { ProjectSettings } from \"../json-schema/settings.js\";\nimport {\n\tcontentFromDatabase,\n\tcreateInMemoryDatabase,\n} from \"sqlite-wasm-kysely\";\nimport { initDb } from \"../database/initDb.js\";\n\n/**\n * Creates a new inlang project.\n *\n * The app is responsible for saving the project \"whereever\"\n * e.g. the user's computer, cloud storage, or OPFS in the browser.\n */\nexport async function newProject(args?: {\n\tsettings?: ProjectSettings;\n}): Promise<Blob> {\n\tconst sqlite = await createInMemoryDatabase({\n\t\treadOnly: false,\n\t});\n\tinitDb({ sqlite });\n\n\ttry {\n\t\tconst inlangDbContent = contentFromDatabase(sqlite);\n\n\t\tconst lix = await openLixInMemory({ blob: await newLixFile() });\n\n\t\tconst { value: lixId } = await lix.db\n\t\t\t.selectFrom(\"key_value\")\n\t\t\t.select(\"value\")\n\t\t\t.where(\"key\", \"=\", \"lix_id\")\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\t// write files to lix\n\t\tawait lix.db\n\t\t\t.insertInto(\"file\")\n\t\t\t.values([\n\t\t\t\t{\n\t\t\t\t\tpath: \"/db.sqlite\",\n\t\t\t\t\tdata: inlangDbContent,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpath: \"/settings.json\",\n\t\t\t\t\tdata: new TextEncoder().encode(\n\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\targs?.settings ?? defaultProjectSettings,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t2\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpath: \"/project_id\",\n\t\t\t\t\tdata: new TextEncoder().encode(lixId),\n\t\t\t\t},\n\t\t\t])\n\t\t\t.execute();\n\t\tconst blob = toBlob({ lix });\n\t\tlix.sqlite.close();\n\t\treturn blob;\n\t} catch (e) {\n\t\tconst error = new Error(`Failed to create new inlang project: ${e}`, {\n\t\t\tcause: e,\n\t\t});\n\t\tthrow error;\n\t} finally {\n\t\tsqlite.close();\n\t}\n}\n\nexport const defaultProjectSettings = {\n\t$schema: \"https://inlang.com/schema/project-settings\",\n\tbaseLocale: \"en\",\n\tlocales: [\"en\"],\n\tmodules: [\n\t\t// for instant gratification, we're adding common rules\n\t\t// \"https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-empty-pattern@latest/dist/index.js\",\n\t\t// \"https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-missing-translation@latest/dist/index.js\",\n\t\t// \"https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-without-source@latest/dist/index.js\",\n\t\t// default to the message format plugin because it supports all features\n\t\t// \"https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@latest/dist/index.js\",\n\t\t// the m function matcher should be installed by default in case Sherlock (VS Code extension) is adopted\n\t\t// \"https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@latest/dist/index.js\",\n\t],\n} satisfies ProjectSettings;\n"]}
1
+ {"version":3,"file":"newProject.js","sourceRoot":"/","sources":["project/newProject.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,eAAe,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAElE,OAAO,EACN,mBAAmB,EACnB,sBAAsB,GACtB,MAAM,oBAAoB,CAAC;AAC5B,OAAO,EAAE,MAAM,EAAE,MAAM,uBAAuB,CAAC;AAE/C;;;;;GAKG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAAC,IAEhC;IACA,MAAM,MAAM,GAAG,MAAM,sBAAsB,CAAC;QAC3C,QAAQ,EAAE,KAAK;KACf,CAAC,CAAC;IACH,MAAM,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAEnB,IAAI,CAAC;QACJ,MAAM,eAAe,GAAG,mBAAmB,CAAC,MAAM,CAAC,CAAC;QAEpD,MAAM,GAAG,GAAG,MAAM,eAAe,CAAC;YACjC,IAAI,EAAE,MAAM,UAAU,EAAE;YACxB,SAAS,EAAE;gBACV,EAAE,GAAG,EAAE,eAAe,EAAE,KAAK,EAAE,IAAI,EAAE,QAAQ,EAAE,SAAS,IAAI,IAAI,EAAE;aAClE;SACD,CAAC,CAAC;QAEH,MAAM,EAAE,KAAK,EAAE,KAAK,EAAE,GAAG,MAAM,GAAG,CAAC,EAAE;aACnC,UAAU,CAAC,WAAW,CAAC;aACvB,MAAM,CAAC,OAAO,CAAC;aACf,KAAK,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,CAAC;aAC3B,uBAAuB,EAAE,CAAC;QAE5B,qBAAqB;QACrB,MAAM,GAAG,CAAC,EAAE;aACV,UAAU,CAAC,MAAM,CAAC;aAClB,MAAM,CAAC;YACP;gBACC,IAAI,EAAE,YAAY;gBAClB,IAAI,EAAE,eAAe;aACrB;YACD;gBACC,IAAI,EAAE,gBAAgB;gBACtB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAC7B,IAAI,CAAC,SAAS,CACb,IAAI,EAAE,QAAQ,IAAI,sBAAsB,EACxC,SAAS,EACT,CAAC,CACD,CACD;aACD;YACD;gBACC,IAAI,EAAE,aAAa;gBACnB,IAAI,EAAE,IAAI,WAAW,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC;aACrC;SACD,CAAC;aACD,OAAO,EAAE,CAAC;QACZ,MAAM,IAAI,GAAG,MAAM,CAAC,EAAE,GAAG,EAAE,CAAC,CAAC;QAC7B,GAAG,CAAC,MAAM,CAAC,KAAK,EAAE,CAAC;QACnB,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACZ,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,wCAAwC,CAAC,EAAE,EAAE;YACpE,KAAK,EAAE,CAAC;SACR,CAAC,CAAC;QACH,MAAM,KAAK,CAAC;IACb,CAAC;YAAS,CAAC;QACV,MAAM,CAAC,KAAK,EAAE,CAAC;IAChB,CAAC;AACF,CAAC;AAED,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACrC,OAAO,EAAE,4CAA4C;IACrD,UAAU,EAAE,IAAI;IAChB,OAAO,EAAE,CAAC,IAAI,CAAC;IACf,OAAO,EAAE;IACR,uDAAuD;IACvD,+FAA+F;IAC/F,qGAAqG;IACrG,gGAAgG;IAChG,wEAAwE;IACxE,qFAAqF;IACrF,wGAAwG;IACxG,yFAAyF;KACzF;CACyB,CAAC","sourcesContent":["import { newLixFile, openLixInMemory, toBlob } from \"@lix-js/sdk\";\nimport type { ProjectSettings } from \"../json-schema/settings.js\";\nimport {\n\tcontentFromDatabase,\n\tcreateInMemoryDatabase,\n} from \"sqlite-wasm-kysely\";\nimport { initDb } from \"../database/initDb.js\";\n\n/**\n * Creates a new inlang project.\n *\n * The app is responsible for saving the project \"whereever\"\n * e.g. the user's computer, cloud storage, or OPFS in the browser.\n */\nexport async function newProject(args?: {\n\tsettings?: ProjectSettings;\n}): Promise<Blob> {\n\tconst sqlite = await createInMemoryDatabase({\n\t\treadOnly: false,\n\t});\n\tinitDb({ sqlite });\n\n\ttry {\n\t\tconst inlangDbContent = contentFromDatabase(sqlite);\n\n\t\tconst lix = await openLixInMemory({\n\t\t\tblob: await newLixFile(),\n\t\t\tkeyValues: [\n\t\t\t\t{ key: \"lix_telemetry\", value: args?.settings?.telemetry ?? \"on\" },\n\t\t\t],\n\t\t});\n\n\t\tconst { value: lixId } = await lix.db\n\t\t\t.selectFrom(\"key_value\")\n\t\t\t.select(\"value\")\n\t\t\t.where(\"key\", \"=\", \"lix_id\")\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\t// write files to lix\n\t\tawait lix.db\n\t\t\t.insertInto(\"file\")\n\t\t\t.values([\n\t\t\t\t{\n\t\t\t\t\tpath: \"/db.sqlite\",\n\t\t\t\t\tdata: inlangDbContent,\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpath: \"/settings.json\",\n\t\t\t\t\tdata: new TextEncoder().encode(\n\t\t\t\t\t\tJSON.stringify(\n\t\t\t\t\t\t\targs?.settings ?? defaultProjectSettings,\n\t\t\t\t\t\t\tundefined,\n\t\t\t\t\t\t\t2\n\t\t\t\t\t\t)\n\t\t\t\t\t),\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\tpath: \"/project_id\",\n\t\t\t\t\tdata: new TextEncoder().encode(lixId),\n\t\t\t\t},\n\t\t\t])\n\t\t\t.execute();\n\t\tconst blob = toBlob({ lix });\n\t\tlix.sqlite.close();\n\t\treturn blob;\n\t} catch (e) {\n\t\tconst error = new Error(`Failed to create new inlang project: ${e}`, {\n\t\t\tcause: e,\n\t\t});\n\t\tthrow error;\n\t} finally {\n\t\tsqlite.close();\n\t}\n}\n\nexport const defaultProjectSettings = {\n\t$schema: \"https://inlang.com/schema/project-settings\",\n\tbaseLocale: \"en\",\n\tlocales: [\"en\"],\n\tmodules: [\n\t\t// for instant gratification, we're adding common rules\n\t\t// \"https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-empty-pattern@latest/dist/index.js\",\n\t\t// \"https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-missing-translation@latest/dist/index.js\",\n\t\t// \"https://cdn.jsdelivr.net/npm/@inlang/message-lint-rule-without-source@latest/dist/index.js\",\n\t\t// default to the message format plugin because it supports all features\n\t\t// \"https://cdn.jsdelivr.net/npm/@inlang/plugin-message-format@latest/dist/index.js\",\n\t\t// the m function matcher should be installed by default in case Sherlock (VS Code extension) is adopted\n\t\t// \"https://cdn.jsdelivr.net/npm/@inlang/plugin-m-function-matcher@latest/dist/index.js\",\n\t],\n} satisfies ProjectSettings;\n"]}
@@ -1,6 +1,6 @@
1
1
  export const ENV_VARIABLES = {
2
2
  PUBLIC_POSTHOG_TOKEN: "phc_m5yJZCxjOGxF8CJvP5sQ3H0d76xpnLrsmiZHduT4jDz",
3
3
  PUBLIC_INLANG_SDK_SENTRY_DSN: "https://c3d92d5d011122e525e9f9b368e0905d@o4504345873285120.ingest.us.sentry.io/4507903389335553",
4
- SDK_VERSION: "2.4.5",
4
+ SDK_VERSION: "2.4.7",
5
5
  };
6
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"/","sources":["services/env-variables/index.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,oBAAoB,EAAE,iDAAiD;IACxE,4BAA4B,EAAE,iGAAiG;IAC/H,WAAW,EAAE,OAAO;CACpB,CAAA","sourcesContent":["\nexport const ENV_VARIABLES = {\n PUBLIC_POSTHOG_TOKEN: \"phc_m5yJZCxjOGxF8CJvP5sQ3H0d76xpnLrsmiZHduT4jDz\",\n\tPUBLIC_INLANG_SDK_SENTRY_DSN: \"https://c3d92d5d011122e525e9f9b368e0905d@o4504345873285120.ingest.us.sentry.io/4507903389335553\",\n\tSDK_VERSION: \"2.4.5\",\n}\n"]}
1
+ {"version":3,"file":"index.js","sourceRoot":"/","sources":["services/env-variables/index.ts"],"names":[],"mappings":"AACA,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,oBAAoB,EAAE,iDAAiD;IACxE,4BAA4B,EAAE,iGAAiG;IAC/H,WAAW,EAAE,OAAO;CACpB,CAAA","sourcesContent":["\nexport const ENV_VARIABLES = {\n PUBLIC_POSTHOG_TOKEN: \"phc_m5yJZCxjOGxF8CJvP5sQ3H0d76xpnLrsmiZHduT4jDz\",\n\tPUBLIC_INLANG_SDK_SENTRY_DSN: \"https://c3d92d5d011122e525e9f9b368e0905d@o4504345873285120.ingest.us.sentry.io/4507903389335553\",\n\tSDK_VERSION: \"2.4.7\",\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@inlang/sdk",
3
- "version": "2.4.5",
3
+ "version": "2.4.7",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "publishConfig": {
@@ -30,8 +30,8 @@
30
30
  "@sinclair/typebox": "^0.31.17",
31
31
  "kysely": "^0.27.4",
32
32
  "uuid": "^10.0.0",
33
- "sqlite-wasm-kysely": "0.3.0",
34
- "@lix-js/sdk": "0.4.5"
33
+ "@lix-js/sdk": "0.4.6",
34
+ "sqlite-wasm-kysely": "0.3.0"
35
35
  },
36
36
  "devDependencies": {
37
37
  "@eslint/js": "^9.12.0",
@@ -56,6 +56,7 @@ test("it should capture as expected", async () => {
56
56
  await maybeCaptureLoadedProject({
57
57
  id,
58
58
  settings,
59
+ forceCapture: true,
59
60
  plugins,
60
61
  lix: project.lix,
61
62
  appId: "test",
@@ -12,11 +12,21 @@ export async function maybeCaptureLoadedProject(args: {
12
12
  plugins: Readonly<Array<{ key: string }>>;
13
13
  appId?: string;
14
14
  db: Kysely<InlangDatabaseSchema>;
15
+ forceCapture?: boolean;
15
16
  }) {
16
17
  if (args.settings.telemetry === "off") {
17
18
  return;
18
19
  }
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
+
20
30
  try {
21
31
  const activeAccount = await args.lix.db
22
32
  .selectFrom("active_account")
@@ -23,7 +23,12 @@ export async function newProject(args?: {
23
23
  try {
24
24
  const inlangDbContent = contentFromDatabase(sqlite);
25
25
 
26
- const lix = await openLixInMemory({ blob: await newLixFile() });
26
+ const lix = await openLixInMemory({
27
+ blob: await newLixFile(),
28
+ keyValues: [
29
+ { key: "lix_telemetry", value: args?.settings?.telemetry ?? "on" },
30
+ ],
31
+ });
27
32
 
28
33
  const { value: lixId } = await lix.db
29
34
  .selectFrom("key_value")