@inlang/sdk 2.1.2 → 2.2.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.
Files changed (146) hide show
  1. package/dist/database/initDb.js +1 -4
  2. package/dist/database/initDb.js.map +1 -1
  3. package/dist/database/initDbAndSchema.test.js +1 -4
  4. package/dist/database/initDbAndSchema.test.js.map +1 -1
  5. package/dist/database/jsonbPlugin.js +1 -4
  6. package/dist/database/jsonbPlugin.js.map +1 -1
  7. package/dist/database/jsonbPlugin.test.js +1 -4
  8. package/dist/database/jsonbPlugin.test.js.map +1 -1
  9. package/dist/database/schema.js +1 -4
  10. package/dist/database/schema.js.map +1 -1
  11. package/dist/helper.js +1 -4
  12. package/dist/helper.js.map +1 -1
  13. package/dist/human-id/human-id.js +1 -4
  14. package/dist/human-id/human-id.js.map +1 -1
  15. package/dist/human-id/words.js +1 -4
  16. package/dist/human-id/words.js.map +1 -1
  17. package/dist/human-id/words.test.js +1 -4
  18. package/dist/human-id/words.test.js.map +1 -1
  19. package/dist/import-export/exportFiles.js +1 -4
  20. package/dist/import-export/exportFiles.js.map +1 -1
  21. package/dist/import-export/importFiles.js +1 -4
  22. package/dist/import-export/importFiles.js.map +1 -1
  23. package/dist/import-export/importFiles.test.js +1 -4
  24. package/dist/import-export/importFiles.test.js.map +1 -1
  25. package/dist/import-export/roundtrip.test.js +1 -4
  26. package/dist/import-export/roundtrip.test.js.map +1 -1
  27. package/dist/import-export/upsertBundleNestedMatchByProperties.js +1 -4
  28. package/dist/import-export/upsertBundleNestedMatchByProperties.js.map +1 -1
  29. package/dist/index.js +1 -4
  30. package/dist/index.js.map +1 -1
  31. package/dist/json-schema/old-v1-message/fromMessageV1.js +1 -4
  32. package/dist/json-schema/old-v1-message/fromMessageV1.js.map +1 -1
  33. package/dist/json-schema/old-v1-message/fromMessageV1.test.js +1 -4
  34. package/dist/json-schema/old-v1-message/fromMessageV1.test.js.map +1 -1
  35. package/dist/json-schema/old-v1-message/schemaV1.js +1 -4
  36. package/dist/json-schema/old-v1-message/schemaV1.js.map +1 -1
  37. package/dist/json-schema/old-v1-message/toMessageV1.js +1 -4
  38. package/dist/json-schema/old-v1-message/toMessageV1.js.map +1 -1
  39. package/dist/json-schema/old-v1-message/toMessageV1.test.js +1 -4
  40. package/dist/json-schema/old-v1-message/toMessageV1.test.js.map +1 -1
  41. package/dist/json-schema/pattern.js +1 -4
  42. package/dist/json-schema/pattern.js.map +1 -1
  43. package/dist/json-schema/settings.js +1 -4
  44. package/dist/json-schema/settings.js.map +1 -1
  45. package/dist/json-schema/settings.test-d.js +1 -4
  46. package/dist/json-schema/settings.test-d.js.map +1 -1
  47. package/dist/json-schema/settings.test.js +1 -4
  48. package/dist/json-schema/settings.test.js.map +1 -1
  49. package/dist/lix/index.js +1 -4
  50. package/dist/lix/index.js.map +1 -1
  51. package/dist/lix-plugin/applyChanges.js +1 -4
  52. package/dist/lix-plugin/applyChanges.js.map +1 -1
  53. package/dist/lix-plugin/applyChanges.test.js +1 -4
  54. package/dist/lix-plugin/applyChanges.test.js.map +1 -1
  55. package/dist/lix-plugin/detectConflicts.js +1 -4
  56. package/dist/lix-plugin/detectConflicts.js.map +1 -1
  57. package/dist/lix-plugin/detectConflicts.test.js +1 -4
  58. package/dist/lix-plugin/detectConflicts.test.js.map +1 -1
  59. package/dist/lix-plugin/inlangLixPluginV1.js +1 -4
  60. package/dist/lix-plugin/inlangLixPluginV1.js.map +1 -1
  61. package/dist/lix-plugin/inlangLixPluginV1.test.js +1 -4
  62. package/dist/lix-plugin/inlangLixPluginV1.test.js.map +1 -1
  63. package/dist/lix-plugin/merge.test.js +1 -4
  64. package/dist/lix-plugin/merge.test.js.map +1 -1
  65. package/dist/lix-plugin/resolveConflictBySelecting.test.js +1 -4
  66. package/dist/lix-plugin/resolveConflictBySelecting.test.js.map +1 -1
  67. package/dist/migrations/v2/createMessageV1.js +1 -4
  68. package/dist/migrations/v2/createMessageV1.js.map +1 -1
  69. package/dist/migrations/v2/withLanguageTagToLocaleMigration.js +1 -4
  70. package/dist/migrations/v2/withLanguageTagToLocaleMigration.js.map +1 -1
  71. package/dist/migrations/v2/withLanguageTagToLocaleMigration.test.js +1 -4
  72. package/dist/migrations/v2/withLanguageTagToLocaleMigration.test.js.map +1 -1
  73. package/dist/plugin/cache.js +1 -4
  74. package/dist/plugin/cache.js.map +1 -1
  75. package/dist/plugin/cache.test.js +1 -4
  76. package/dist/plugin/cache.test.js.map +1 -1
  77. package/dist/plugin/errors.js +1 -4
  78. package/dist/plugin/errors.js.map +1 -1
  79. package/dist/plugin/importPlugins.js +1 -4
  80. package/dist/plugin/importPlugins.js.map +1 -1
  81. package/dist/plugin/importPlugins.test.js +1 -4
  82. package/dist/plugin/importPlugins.test.js.map +1 -1
  83. package/dist/plugin/meta/ideExtension.js +1 -4
  84. package/dist/plugin/meta/ideExtension.js.map +1 -1
  85. package/dist/plugin/schema.js +1 -4
  86. package/dist/plugin/schema.js.map +1 -1
  87. package/dist/project/api.js +1 -4
  88. package/dist/project/api.js.map +1 -1
  89. package/dist/project/loadProject.d.ts.map +1 -1
  90. package/dist/project/loadProject.js +1 -6
  91. package/dist/project/loadProject.js.map +1 -1
  92. package/dist/project/loadProject.test.js +1 -4
  93. package/dist/project/loadProject.test.js.map +1 -1
  94. package/dist/project/loadProjectFromDirectory.js +1 -4
  95. package/dist/project/loadProjectFromDirectory.js.map +1 -1
  96. package/dist/project/loadProjectFromDirectory.test.js +1 -4
  97. package/dist/project/loadProjectFromDirectory.test.js.map +1 -1
  98. package/dist/project/loadProjectInMemory.js +1 -4
  99. package/dist/project/loadProjectInMemory.js.map +1 -1
  100. package/dist/project/loadProjectInMemory.test.js +1 -4
  101. package/dist/project/loadProjectInMemory.test.js.map +1 -1
  102. package/dist/project/maybeCaptureTelemetry.d.ts.map +1 -1
  103. package/dist/project/maybeCaptureTelemetry.js +1 -6
  104. package/dist/project/maybeCaptureTelemetry.js.map +1 -1
  105. package/dist/project/maybeCaptureTelemetry.test.js +1 -4
  106. package/dist/project/maybeCaptureTelemetry.test.js.map +1 -1
  107. package/dist/project/newProject.d.ts.map +1 -1
  108. package/dist/project/newProject.js +1 -6
  109. package/dist/project/newProject.js.map +1 -1
  110. package/dist/project/newProject.test.js +1 -4
  111. package/dist/project/newProject.test.js.map +1 -1
  112. package/dist/project/saveProjectToDirectory.js +1 -4
  113. package/dist/project/saveProjectToDirectory.js.map +1 -1
  114. package/dist/project/saveProjectToDirectory.test.js +1 -4
  115. package/dist/project/saveProjectToDirectory.test.js.map +1 -1
  116. package/dist/query-utilities/index.js +1 -4
  117. package/dist/query-utilities/index.js.map +1 -1
  118. package/dist/query-utilities/insertBundleNested.js +1 -4
  119. package/dist/query-utilities/insertBundleNested.js.map +1 -1
  120. package/dist/query-utilities/selectBundleNested.js +1 -4
  121. package/dist/query-utilities/selectBundleNested.js.map +1 -1
  122. package/dist/query-utilities/updateBundleNested.js +1 -4
  123. package/dist/query-utilities/updateBundleNested.js.map +1 -1
  124. package/dist/query-utilities/upsertBundleNested.js +1 -4
  125. package/dist/query-utilities/upsertBundleNested.js.map +1 -1
  126. package/dist/services/env-variables/index.js +2 -5
  127. package/dist/services/env-variables/index.js.map +1 -1
  128. package/dist/services/telemetry/capture.d.ts.map +1 -1
  129. package/dist/services/telemetry/capture.js +5 -9
  130. package/dist/services/telemetry/capture.js.map +1 -1
  131. package/dist/services/telemetry/capture.test.js +1 -4
  132. package/dist/services/telemetry/capture.test.js.map +1 -1
  133. package/dist/utilities/detectJsonFormatting.js +1 -4
  134. package/dist/utilities/detectJsonFormatting.js.map +1 -1
  135. package/dist/utilities/detectJsonFormatting.test.js +1 -4
  136. package/dist/utilities/detectJsonFormatting.test.js.map +1 -1
  137. package/package.json +5 -9
  138. package/src/project/loadProject.ts +0 -3
  139. package/src/project/maybeCaptureTelemetry.ts +0 -2
  140. package/src/project/newProject.ts +0 -2
  141. package/src/services/telemetry/capture.ts +4 -5
  142. package/dist/services/error-reporting/index.d.ts +0 -15
  143. package/dist/services/error-reporting/index.d.ts.map +0 -1
  144. package/dist/services/error-reporting/index.js +0 -30
  145. package/dist/services/error-reporting/index.js.map +0 -1
  146. package/src/services/error-reporting/index.ts +0 -28
@@ -1 +1 @@
1
- {"version":3,"file":"importFiles.js","sources":["import-export/importFiles.ts"],"sourceRoot":"/","sourcesContent":["import type { Kysely } from \"kysely\";\nimport {\n\tPluginDoesNotImplementFunctionError,\n\tPluginMissingError,\n} from \"../plugin/errors.js\";\nimport type { ProjectSettings } from \"../json-schema/settings.js\";\nimport type { InlangDatabaseSchema, NewVariant } from \"../database/schema.js\";\nimport type { InlangPlugin, VariantImport } from \"../plugin/schema.js\";\nimport type { ImportFile } from \"../project/api.js\";\n\nexport async function importFiles(args: {\n\tfiles: ImportFile[];\n\treadonly pluginKey: string;\n\treadonly settings: ProjectSettings;\n\treadonly plugins: readonly InlangPlugin[];\n\treadonly db: Kysely<InlangDatabaseSchema>;\n}) {\n\tconst plugin = args.plugins.find((p) => p.key === args.pluginKey);\n\n\tif (!plugin) throw new PluginMissingError({ plugin: args.pluginKey });\n\n\tif (!plugin.importFiles) {\n\t\tthrow new PluginDoesNotImplementFunctionError({\n\t\t\tplugin: args.pluginKey,\n\t\t\tfunction: \"importFiles\",\n\t\t});\n\t}\n\n\tconst imported = await plugin.importFiles({\n\t\tfiles: args.files,\n\t\tsettings: structuredClone(args.settings),\n\t});\n\n\tawait args.db.transaction().execute(async (trx) => {\n\t\t// upsert every bundle\n\t\tfor (const bundle of imported.bundles) {\n\t\t\tawait trx\n\t\t\t\t.insertInto(\"bundle\")\n\t\t\t\t.values(bundle)\n\t\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(bundle))\n\t\t\t\t.execute();\n\t\t}\n\t\t// upsert every message\n\t\tfor (const message of imported.messages) {\n\t\t\t// match the message by bundle id and locale if\n\t\t\t// no id is provided by the importer\n\t\t\tif (message.id === undefined) {\n\t\t\t\tconst exisingMessage = await trx\n\t\t\t\t\t.selectFrom(\"message\")\n\t\t\t\t\t.where(\"bundleId\", \"=\", message.bundleId)\n\t\t\t\t\t.where(\"locale\", \"=\", message.locale)\n\t\t\t\t\t.select(\"id\")\n\t\t\t\t\t.executeTakeFirst();\n\t\t\t\tmessage.id = exisingMessage?.id;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait trx\n\t\t\t\t\t.insertInto(\"message\")\n\t\t\t\t\t.values(message)\n\t\t\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(message))\n\t\t\t\t\t.execute();\n\t\t\t} catch (e) {\n\t\t\t\t// 787 = SQLITE_CONSTRAINT_FOREIGNKEY\n\t\t\t\t// handle foreign key violation\n\t\t\t\t// e.g. a message references a bundle that doesn't exist\n\t\t\t\t// by creating the bundle\n\t\t\t\tif ((e as any)?.resultCode === 787) {\n\t\t\t\t\tawait trx\n\t\t\t\t\t\t.insertInto(\"bundle\")\n\t\t\t\t\t\t.values({ id: message.bundleId })\n\t\t\t\t\t\t.execute();\n\t\t\t\t\tawait trx.insertInto(\"message\").values(message).execute();\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// upsert every variant\n\t\tfor (const variant of imported.variants) {\n\t\t\t// match the variant by message id and matches if\n\t\t\t// no id is provided by the importer\n\t\t\tif (variant.id === undefined) {\n\t\t\t\tlet existingMessage = await trx\n\t\t\t\t\t.selectFrom(\"message\")\n\t\t\t\t\t.where(\"bundleId\", \"=\", variant.messageBundleId)\n\t\t\t\t\t.where(\"locale\", \"=\", variant.messageLocale)\n\t\t\t\t\t.select(\"id\")\n\t\t\t\t\t.executeTakeFirst();\n\n\t\t\t\t// if the message does not exist, create it\n\t\t\t\tif (existingMessage === undefined) {\n\t\t\t\t\tconst existingBundle = await trx\n\t\t\t\t\t\t.selectFrom(\"bundle\")\n\t\t\t\t\t\t.where(\"id\", \"=\", variant.messageBundleId)\n\t\t\t\t\t\t.select(\"id\")\n\t\t\t\t\t\t.executeTakeFirst();\n\t\t\t\t\t// if the bundle does not exist, create it\n\t\t\t\t\tif (existingBundle === undefined) {\n\t\t\t\t\t\tawait trx\n\t\t\t\t\t\t\t.insertInto(\"bundle\")\n\t\t\t\t\t\t\t.values({ id: variant.messageBundleId })\n\t\t\t\t\t\t\t.execute();\n\t\t\t\t\t}\n\t\t\t\t\t// insert the message\n\t\t\t\t\texistingMessage = await trx\n\t\t\t\t\t\t.insertInto(\"message\")\n\t\t\t\t\t\t.values({\n\t\t\t\t\t\t\tbundleId: variant.messageBundleId,\n\t\t\t\t\t\t\tlocale: variant.messageLocale,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.returningAll()\n\t\t\t\t\t\t.executeTakeFirstOrThrow();\n\t\t\t\t}\n\n\t\t\t\tconst existingVariants = await trx\n\t\t\t\t\t.selectFrom(\"variant\")\n\t\t\t\t\t.where(\"messageId\", \"=\", existingMessage.id)\n\t\t\t\t\t.selectAll()\n\t\t\t\t\t.execute();\n\n\t\t\t\tconst existingVariant = existingVariants.find(\n\t\t\t\t\t(v) => JSON.stringify(v.matches) === JSON.stringify(variant.matches)\n\t\t\t\t);\n\n\t\t\t\t// need to reset typescript's type narrowing\n\t\t\t\t(variant as VariantImport).id = existingVariant?.id;\n\t\t\t\t(variant as VariantImport).messageId = existingMessage.id;\n\t\t\t}\n\t\t\tconst toBeInsertedVariant: NewVariant = {\n\t\t\t\t...variant,\n\t\t\t\t// @ts-expect-error - bundle id is provided by VariantImport but not needed when inserting\n\t\t\t\tmessageBundleId: undefined,\n\t\t\t\tmessageLocale: undefined,\n\t\t\t};\n\t\t\tawait trx\n\t\t\t\t.insertInto(\"variant\")\n\t\t\t\t.values(toBeInsertedVariant)\n\t\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(toBeInsertedVariant))\n\t\t\t\t.execute();\n\t\t}\n\t});\n}\n"],"names":[],"mappings":";;AACA,OAAO,EACN,mCAAmC,EACnC,kBAAkB,GAClB,MAAM,qBAAqB,CAAC;AAM7B,MAAM,CAAC,KAAK,UAAU,WAAW,CAAC,IAMjC;IACA,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC;IAElE,IAAI,CAAC,MAAM;QAAE,MAAM,IAAI,kBAAkB,CAAC,EAAE,MAAM,EAAE,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC;IAEtE,IAAI,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACzB,MAAM,IAAI,mCAAmC,CAAC;YAC7C,MAAM,EAAE,IAAI,CAAC,SAAS;YACtB,QAAQ,EAAE,aAAa;SACvB,CAAC,CAAC;IACJ,CAAC;IAED,MAAM,QAAQ,GAAG,MAAM,MAAM,CAAC,WAAW,CAAC;QACzC,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,QAAQ,EAAE,eAAe,CAAC,IAAI,CAAC,QAAQ,CAAC;KACxC,CAAC,CAAC;IAEH,MAAM,IAAI,CAAC,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QACjD,sBAAsB;QACtB,KAAK,MAAM,MAAM,IAAI,QAAQ,CAAC,OAAO,EAAE,CAAC;YACvC,MAAM,GAAG;iBACP,UAAU,CAAC,QAAQ,CAAC;iBACpB,MAAM,CAAC,MAAM,CAAC;iBACd,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;iBACvD,OAAO,EAAE,CAAC;QACb,CAAC;QACD,uBAAuB;QACvB,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACzC,+CAA+C;YAC/C,oCAAoC;YACpC,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,cAAc,GAAG,MAAM,GAAG;qBAC9B,UAAU,CAAC,SAAS,CAAC;qBACrB,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ,CAAC;qBACxC,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,MAAM,CAAC;qBACpC,MAAM,CAAC,IAAI,CAAC;qBACZ,gBAAgB,EAAE,CAAC;gBACrB,OAAO,CAAC,EAAE,GAAG,cAAc,EAAE,EAAE,CAAC;YACjC,CAAC;YACD,IAAI,CAAC;gBACJ,MAAM,GAAG;qBACP,UAAU,CAAC,SAAS,CAAC;qBACrB,MAAM,CAAC,OAAO,CAAC;qBACf,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC;qBACxD,OAAO,EAAE,CAAC;YACb,CAAC;YAAC,OAAO,CAAC,EAAE,CAAC;gBACZ,qCAAqC;gBACrC,+BAA+B;gBAC/B,wDAAwD;gBACxD,yBAAyB;gBACzB,IAAK,CAAS,EAAE,UAAU,KAAK,GAAG,EAAE,CAAC;oBACpC,MAAM,GAAG;yBACP,UAAU,CAAC,QAAQ,CAAC;yBACpB,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,QAAQ,EAAE,CAAC;yBAChC,OAAO,EAAE,CAAC;oBACZ,MAAM,GAAG,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,CAAC;gBAC3D,CAAC;qBAAM,CAAC;oBACP,MAAM,CAAC,CAAC;gBACT,CAAC;YACF,CAAC;QACF,CAAC;QACD,uBAAuB;QACvB,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;YACzC,iDAAiD;YACjD,oCAAoC;YACpC,IAAI,OAAO,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;gBAC9B,IAAI,eAAe,GAAG,MAAM,GAAG;qBAC7B,UAAU,CAAC,SAAS,CAAC;qBACrB,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,OAAO,CAAC,eAAe,CAAC;qBAC/C,KAAK,CAAC,QAAQ,EAAE,GAAG,EAAE,OAAO,CAAC,aAAa,CAAC;qBAC3C,MAAM,CAAC,IAAI,CAAC;qBACZ,gBAAgB,EAAE,CAAC;gBAErB,2CAA2C;gBAC3C,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;oBACnC,MAAM,cAAc,GAAG,MAAM,GAAG;yBAC9B,UAAU,CAAC,QAAQ,CAAC;yBACpB,KAAK,CAAC,IAAI,EAAE,GAAG,EAAE,OAAO,CAAC,eAAe,CAAC;yBACzC,MAAM,CAAC,IAAI,CAAC;yBACZ,gBAAgB,EAAE,CAAC;oBACrB,0CAA0C;oBAC1C,IAAI,cAAc,KAAK,SAAS,EAAE,CAAC;wBAClC,MAAM,GAAG;6BACP,UAAU,CAAC,QAAQ,CAAC;6BACpB,MAAM,CAAC,EAAE,EAAE,EAAE,OAAO,CAAC,eAAe,EAAE,CAAC;6BACvC,OAAO,EAAE,CAAC;oBACb,CAAC;oBACD,qBAAqB;oBACrB,eAAe,GAAG,MAAM,GAAG;yBACzB,UAAU,CAAC,SAAS,CAAC;yBACrB,MAAM,CAAC;wBACP,QAAQ,EAAE,OAAO,CAAC,eAAe;wBACjC,MAAM,EAAE,OAAO,CAAC,aAAa;qBAC7B,CAAC;yBACD,YAAY,EAAE;yBACd,uBAAuB,EAAE,CAAC;gBAC7B,CAAC;gBAED,MAAM,gBAAgB,GAAG,MAAM,GAAG;qBAChC,UAAU,CAAC,SAAS,CAAC;qBACrB,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,eAAe,CAAC,EAAE,CAAC;qBAC3C,SAAS,EAAE;qBACX,OAAO,EAAE,CAAC;gBAEZ,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CACpE,CAAC;gBAEF,4CAA4C;gBAC3C,OAAyB,CAAC,EAAE,GAAG,eAAe,EAAE,EAAE,CAAC;gBACnD,OAAyB,CAAC,SAAS,GAAG,eAAe,CAAC,EAAE,CAAC;YAC3D,CAAC;YACD,MAAM,mBAAmB,GAAe;gBACvC,GAAG,OAAO;gBACV,0FAA0F;gBAC1F,eAAe,EAAE,SAAS;gBAC1B,aAAa,EAAE,SAAS;aACxB,CAAC;YACF,MAAM,GAAG;iBACP,UAAU,CAAC,SAAS,CAAC;iBACrB,MAAM,CAAC,mBAAmB,CAAC;iBAC3B,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,mBAAmB,CAAC,CAAC;iBACpE,OAAO,EAAE,CAAC;QACb,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC","debug_id":"0180f00c-8bb4-50a0-a603-1c8f0e7bdcd8"}
1
+ {"version":3,"file":"importFiles.js","sourceRoot":"/","sources":["import-export/importFiles.ts"],"names":[],"mappings":"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","sourcesContent":["import type { Kysely } from \"kysely\";\nimport {\n\tPluginDoesNotImplementFunctionError,\n\tPluginMissingError,\n} from \"../plugin/errors.js\";\nimport type { ProjectSettings } from \"../json-schema/settings.js\";\nimport type { InlangDatabaseSchema, NewVariant } from \"../database/schema.js\";\nimport type { InlangPlugin, VariantImport } from \"../plugin/schema.js\";\nimport type { ImportFile } from \"../project/api.js\";\n\nexport async function importFiles(args: {\n\tfiles: ImportFile[];\n\treadonly pluginKey: string;\n\treadonly settings: ProjectSettings;\n\treadonly plugins: readonly InlangPlugin[];\n\treadonly db: Kysely<InlangDatabaseSchema>;\n}) {\n\tconst plugin = args.plugins.find((p) => p.key === args.pluginKey);\n\n\tif (!plugin) throw new PluginMissingError({ plugin: args.pluginKey });\n\n\tif (!plugin.importFiles) {\n\t\tthrow new PluginDoesNotImplementFunctionError({\n\t\t\tplugin: args.pluginKey,\n\t\t\tfunction: \"importFiles\",\n\t\t});\n\t}\n\n\tconst imported = await plugin.importFiles({\n\t\tfiles: args.files,\n\t\tsettings: structuredClone(args.settings),\n\t});\n\n\tawait args.db.transaction().execute(async (trx) => {\n\t\t// upsert every bundle\n\t\tfor (const bundle of imported.bundles) {\n\t\t\tawait trx\n\t\t\t\t.insertInto(\"bundle\")\n\t\t\t\t.values(bundle)\n\t\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(bundle))\n\t\t\t\t.execute();\n\t\t}\n\t\t// upsert every message\n\t\tfor (const message of imported.messages) {\n\t\t\t// match the message by bundle id and locale if\n\t\t\t// no id is provided by the importer\n\t\t\tif (message.id === undefined) {\n\t\t\t\tconst exisingMessage = await trx\n\t\t\t\t\t.selectFrom(\"message\")\n\t\t\t\t\t.where(\"bundleId\", \"=\", message.bundleId)\n\t\t\t\t\t.where(\"locale\", \"=\", message.locale)\n\t\t\t\t\t.select(\"id\")\n\t\t\t\t\t.executeTakeFirst();\n\t\t\t\tmessage.id = exisingMessage?.id;\n\t\t\t}\n\t\t\ttry {\n\t\t\t\tawait trx\n\t\t\t\t\t.insertInto(\"message\")\n\t\t\t\t\t.values(message)\n\t\t\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(message))\n\t\t\t\t\t.execute();\n\t\t\t} catch (e) {\n\t\t\t\t// 787 = SQLITE_CONSTRAINT_FOREIGNKEY\n\t\t\t\t// handle foreign key violation\n\t\t\t\t// e.g. a message references a bundle that doesn't exist\n\t\t\t\t// by creating the bundle\n\t\t\t\tif ((e as any)?.resultCode === 787) {\n\t\t\t\t\tawait trx\n\t\t\t\t\t\t.insertInto(\"bundle\")\n\t\t\t\t\t\t.values({ id: message.bundleId })\n\t\t\t\t\t\t.execute();\n\t\t\t\t\tawait trx.insertInto(\"message\").values(message).execute();\n\t\t\t\t} else {\n\t\t\t\t\tthrow e;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t// upsert every variant\n\t\tfor (const variant of imported.variants) {\n\t\t\t// match the variant by message id and matches if\n\t\t\t// no id is provided by the importer\n\t\t\tif (variant.id === undefined) {\n\t\t\t\tlet existingMessage = await trx\n\t\t\t\t\t.selectFrom(\"message\")\n\t\t\t\t\t.where(\"bundleId\", \"=\", variant.messageBundleId)\n\t\t\t\t\t.where(\"locale\", \"=\", variant.messageLocale)\n\t\t\t\t\t.select(\"id\")\n\t\t\t\t\t.executeTakeFirst();\n\n\t\t\t\t// if the message does not exist, create it\n\t\t\t\tif (existingMessage === undefined) {\n\t\t\t\t\tconst existingBundle = await trx\n\t\t\t\t\t\t.selectFrom(\"bundle\")\n\t\t\t\t\t\t.where(\"id\", \"=\", variant.messageBundleId)\n\t\t\t\t\t\t.select(\"id\")\n\t\t\t\t\t\t.executeTakeFirst();\n\t\t\t\t\t// if the bundle does not exist, create it\n\t\t\t\t\tif (existingBundle === undefined) {\n\t\t\t\t\t\tawait trx\n\t\t\t\t\t\t\t.insertInto(\"bundle\")\n\t\t\t\t\t\t\t.values({ id: variant.messageBundleId })\n\t\t\t\t\t\t\t.execute();\n\t\t\t\t\t}\n\t\t\t\t\t// insert the message\n\t\t\t\t\texistingMessage = await trx\n\t\t\t\t\t\t.insertInto(\"message\")\n\t\t\t\t\t\t.values({\n\t\t\t\t\t\t\tbundleId: variant.messageBundleId,\n\t\t\t\t\t\t\tlocale: variant.messageLocale,\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.returningAll()\n\t\t\t\t\t\t.executeTakeFirstOrThrow();\n\t\t\t\t}\n\n\t\t\t\tconst existingVariants = await trx\n\t\t\t\t\t.selectFrom(\"variant\")\n\t\t\t\t\t.where(\"messageId\", \"=\", existingMessage.id)\n\t\t\t\t\t.selectAll()\n\t\t\t\t\t.execute();\n\n\t\t\t\tconst existingVariant = existingVariants.find(\n\t\t\t\t\t(v) => JSON.stringify(v.matches) === JSON.stringify(variant.matches)\n\t\t\t\t);\n\n\t\t\t\t// need to reset typescript's type narrowing\n\t\t\t\t(variant as VariantImport).id = existingVariant?.id;\n\t\t\t\t(variant as VariantImport).messageId = existingMessage.id;\n\t\t\t}\n\t\t\tconst toBeInsertedVariant: NewVariant = {\n\t\t\t\t...variant,\n\t\t\t\t// @ts-expect-error - bundle id is provided by VariantImport but not needed when inserting\n\t\t\t\tmessageBundleId: undefined,\n\t\t\t\tmessageLocale: undefined,\n\t\t\t};\n\t\t\tawait trx\n\t\t\t\t.insertInto(\"variant\")\n\t\t\t\t.values(toBeInsertedVariant)\n\t\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(toBeInsertedVariant))\n\t\t\t\t.execute();\n\t\t}\n\t});\n}\n"]}
@@ -1,5 +1,3 @@
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]="bb81a82a-cc9b-56b7-804d-8e1de21ceb0b")}catch(e){}}();
3
1
  import { test, expect } from "vitest";
4
2
  import { importFiles } from "./importFiles.js";
5
3
  import { loadProjectInMemory } from "../project/loadProjectInMemory.js";
@@ -175,5 +173,4 @@ test("it should create a message for a variant if the message does not exist to
175
173
  expect(messages[0]?.locale).toBe("en");
176
174
  expect(variants[0]?.messageId).toBe(messages[0]?.id);
177
175
  });
178
- //# sourceMappingURL=importFiles.test.js.map
179
- //# debugId=bb81a82a-cc9b-56b7-804d-8e1de21ceb0b
176
+ //# sourceMappingURL=importFiles.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"importFiles.test.js","sources":["import-export/importFiles.test.ts"],"sourceRoot":"/","sourcesContent":["import { test, expect } from \"vitest\";\nimport { importFiles } from \"./importFiles.js\";\nimport { loadProjectInMemory } from \"../project/loadProjectInMemory.js\";\nimport { newProject } from \"../project/newProject.js\";\nimport type { InlangPlugin } from \"../plugin/schema.js\";\n\ntest(\"it should insert a message as is if the id is provided\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [{ id: \"mock-bundle\" }],\n\t\t\tmessages: [{ id: \"alfa23\", bundleId: \"mock-bundle\", locale: \"en\" }],\n\t\t\tvariants: [],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst messages = await project.db.selectFrom(\"message\").selectAll().execute();\n\n\texpect(messages.length).toBe(1);\n\texpect(messages[0]?.id).toBe(\"alfa23\");\n});\n\ntest(\"it should match an existing message if the id is not provided\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.db.insertInto(\"bundle\").values({ id: \"mock-bundle\" }).execute();\n\tawait project.db\n\t\t.insertInto(\"message\")\n\t\t.values({\n\t\t\tid: \"alfa23\",\n\t\t\tbundleId: \"mock-bundle\",\n\t\t\tlocale: \"en\",\n\t\t\tselectors: [],\n\t\t})\n\t\t.execute();\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [],\n\t\t\tmessages: [\n\t\t\t\t{\n\t\t\t\t\tbundleId: \"mock-bundle\",\n\t\t\t\t\tlocale: \"en\",\n\t\t\t\t\tselectors: [{ type: \"variable-reference\", name: \"platform\" }],\n\t\t\t\t},\n\t\t\t],\n\t\t\tvariants: [],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst messages = await project.db.selectFrom(\"message\").selectAll().execute();\n\n\texpect(messages.length).toBe(1);\n\texpect(messages[0]?.id).toBe(\"alfa23\");\n\texpect(messages[0]?.selectors).toStrictEqual([\n\t\t{ type: \"variable-reference\", name: \"platform\" },\n\t]);\n});\n\ntest(\"it should create a bundle for a message if the bundle does not exist to avoid foreign key conflicts and enable partial imports\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [],\n\t\t\tmessages: [{ bundleId: \"non-existent-bundle\", locale: \"en\" }],\n\t\t\tvariants: [],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst bundles = await project.db.selectFrom(\"bundle\").selectAll().execute();\n\n\texpect(bundles.length).toBe(1);\n\texpect(bundles[0]?.id).toBe(\"non-existent-bundle\");\n});\n\ntest(\"it should insert a variant as is if the id is provided\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.db.insertInto(\"bundle\").values({ id: \"mock-bundle\" }).execute();\n\tawait project.db\n\t\t.insertInto(\"message\")\n\t\t.values({\n\t\t\tid: \"mock-message\",\n\t\t\tbundleId: \"mock-bundle\",\n\t\t\tlocale: \"en\",\n\t\t})\n\t\t.execute();\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [],\n\t\t\tmessages: [],\n\t\t\tvariants: [{ id: \"variant-id-23\", messageId: \"mock-message\" }],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst variants = await project.db.selectFrom(\"variant\").selectAll().execute();\n\n\texpect(variants.length).toBe(1);\n\texpect(variants[0]?.id).toBe(\"variant-id-23\");\n});\n\ntest(\"it should match an existing variant if the id is not provided\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.db.insertInto(\"bundle\").values({ id: \"mock-bundle\" }).execute();\n\tawait project.db\n\t\t.insertInto(\"message\")\n\t\t.values({\n\t\t\tid: \"mock-message\",\n\t\t\tbundleId: \"mock-bundle\",\n\t\t\tlocale: \"en\",\n\t\t})\n\t\t.execute();\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [],\n\t\t\tmessages: [],\n\t\t\tvariants: [{ messageBundleId: \"mock-bundle\", messageLocale: \"en\" }],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst variants = await project.db.selectFrom(\"variant\").selectAll().execute();\n\n\texpect(variants.length).toBe(1);\n\texpect(variants[0]?.messageId).toBe(\"mock-message\");\n\texpect(variants[0]?.id).toBeDefined();\n});\n\ntest(\"it should create a message for a variant if the message does not exist to avoid foreign key conflicts and enable partial imports\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.db.insertInto(\"bundle\").values({ id: \"mock-bundle\" }).execute();\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [],\n\t\t\tmessages: [],\n\t\t\tvariants: [{ messageBundleId: \"mock-bundle\", messageLocale: \"en\" }],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst bundles = await project.db.selectFrom(\"bundle\").selectAll().execute();\n\tconst messages = await project.db.selectFrom(\"message\").selectAll().execute();\n\tconst variants = await project.db.selectFrom(\"variant\").selectAll().execute();\n\n\texpect(bundles.length).toBe(1);\n\texpect(messages.length).toBe(1);\n\texpect(variants.length).toBe(1);\n\n\texpect(messages[0]?.bundleId).toBe(\"mock-bundle\");\n\texpect(messages[0]?.locale).toBe(\"en\");\n\texpect(variants[0]?.messageId).toBe(messages[0]?.id);\n});\n"],"names":[],"mappings":"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","debug_id":"bb81a82a-cc9b-56b7-804d-8e1de21ceb0b"}
1
+ {"version":3,"file":"importFiles.test.js","sourceRoot":"/","sources":["import-export/importFiles.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,mBAAmB,EAAE,MAAM,mCAAmC,CAAC;AACxE,OAAO,EAAE,UAAU,EAAE,MAAM,0BAA0B,CAAC;AAGtD,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;IACzE,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,UAAU,GAAiB;QAChC,GAAG,EAAE,MAAM;QACX,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACzB,OAAO,EAAE,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC;YAChC,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,QAAQ,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YACnE,QAAQ,EAAE,EAAE;SACZ,CAAC;KACF,CAAC;IAEF,MAAM,WAAW,CAAC;QACjB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACtD,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,QAAQ,EAAE,EAAS;KACnB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IAE9E,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;AACxC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAChF,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9E,MAAM,OAAO,CAAC,EAAE;SACd,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC;QACP,EAAE,EAAE,QAAQ;QACZ,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,IAAI;QACZ,SAAS,EAAE,EAAE;KACb,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,UAAU,GAAiB;QAChC,GAAG,EAAE,MAAM;QACX,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACzB,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE;gBACT;oBACC,QAAQ,EAAE,aAAa;oBACvB,MAAM,EAAE,IAAI;oBACZ,SAAS,EAAE,CAAC,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE,CAAC;iBAC7D;aACD;YACD,QAAQ,EAAE,EAAE;SACZ,CAAC;KACF,CAAC;IAEF,MAAM,WAAW,CAAC;QACjB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACtD,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,QAAQ,EAAE,EAAS;KACnB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IAE9E,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACvC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,aAAa,CAAC;QAC5C,EAAE,IAAI,EAAE,oBAAoB,EAAE,IAAI,EAAE,UAAU,EAAE;KAChD,CAAC,CAAC;AACJ,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gIAAgI,EAAE,KAAK,IAAI,EAAE;IACjJ,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,UAAU,GAAiB;QAChC,GAAG,EAAE,MAAM;QACX,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACzB,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,CAAC,EAAE,QAAQ,EAAE,qBAAqB,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;YAC7D,QAAQ,EAAE,EAAE;SACZ,CAAC;KACF,CAAC;IAEF,MAAM,WAAW,CAAC;QACjB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACtD,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,QAAQ,EAAE,EAAS;KACnB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IAE5E,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAC/B,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;AACpD,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,wDAAwD,EAAE,KAAK,IAAI,EAAE;IACzE,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9E,MAAM,OAAO,CAAC,EAAE;SACd,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC;QACP,EAAE,EAAE,cAAc;QAClB,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,IAAI;KACZ,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,UAAU,GAAiB;QAChC,GAAG,EAAE,MAAM;QACX,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACzB,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,SAAS,EAAE,cAAc,EAAE,CAAC;SAC9D,CAAC;KACF,CAAC;IAEF,MAAM,WAAW,CAAC;QACjB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACtD,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,QAAQ,EAAE,EAAS;KACnB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IAE9E,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;AAC/C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,+DAA+D,EAAE,KAAK,IAAI,EAAE;IAChF,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAC9E,MAAM,OAAO,CAAC,EAAE;SACd,UAAU,CAAC,SAAS,CAAC;SACrB,MAAM,CAAC;QACP,EAAE,EAAE,cAAc;QAClB,QAAQ,EAAE,aAAa;QACvB,MAAM,EAAE,IAAI;KACZ,CAAC;SACD,OAAO,EAAE,CAAC;IAEZ,MAAM,UAAU,GAAiB;QAChC,GAAG,EAAE,MAAM;QACX,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACzB,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,CAAC,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACnE,CAAC;KACF,CAAC;IAEF,MAAM,WAAW,CAAC;QACjB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACtD,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,QAAQ,EAAE,EAAS;KACnB,CAAC,CAAC;IAEH,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IAE9E,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IAChC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACpD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,WAAW,EAAE,CAAC;AACvC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kIAAkI,EAAE,KAAK,IAAI,EAAE;IACnJ,MAAM,OAAO,GAAG,MAAM,mBAAmB,CAAC,EAAE,IAAI,EAAE,MAAM,UAAU,EAAE,EAAE,CAAC,CAAC;IAExE,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC,OAAO,EAAE,CAAC;IAE9E,MAAM,UAAU,GAAiB;QAChC,GAAG,EAAE,MAAM;QACX,WAAW,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;YACzB,OAAO,EAAE,EAAE;YACX,QAAQ,EAAE,EAAE;YACZ,QAAQ,EAAE,CAAC,EAAE,eAAe,EAAE,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,CAAC;SACnE,CAAC;KACF,CAAC;IAEF,MAAM,WAAW,CAAC;QACjB,EAAE,EAAE,OAAO,CAAC,EAAE;QACd,KAAK,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,UAAU,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QACtD,SAAS,EAAE,MAAM;QACjB,OAAO,EAAE,CAAC,UAAU,CAAC;QACrB,QAAQ,EAAE,EAAS;KACnB,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IAC5E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IAC9E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,SAAS,EAAE,CAAC,OAAO,EAAE,CAAC;IAE9E,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;IAEhC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAClD,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;AACtD,CAAC,CAAC,CAAC","sourcesContent":["import { test, expect } from \"vitest\";\nimport { importFiles } from \"./importFiles.js\";\nimport { loadProjectInMemory } from \"../project/loadProjectInMemory.js\";\nimport { newProject } from \"../project/newProject.js\";\nimport type { InlangPlugin } from \"../plugin/schema.js\";\n\ntest(\"it should insert a message as is if the id is provided\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [{ id: \"mock-bundle\" }],\n\t\t\tmessages: [{ id: \"alfa23\", bundleId: \"mock-bundle\", locale: \"en\" }],\n\t\t\tvariants: [],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst messages = await project.db.selectFrom(\"message\").selectAll().execute();\n\n\texpect(messages.length).toBe(1);\n\texpect(messages[0]?.id).toBe(\"alfa23\");\n});\n\ntest(\"it should match an existing message if the id is not provided\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.db.insertInto(\"bundle\").values({ id: \"mock-bundle\" }).execute();\n\tawait project.db\n\t\t.insertInto(\"message\")\n\t\t.values({\n\t\t\tid: \"alfa23\",\n\t\t\tbundleId: \"mock-bundle\",\n\t\t\tlocale: \"en\",\n\t\t\tselectors: [],\n\t\t})\n\t\t.execute();\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [],\n\t\t\tmessages: [\n\t\t\t\t{\n\t\t\t\t\tbundleId: \"mock-bundle\",\n\t\t\t\t\tlocale: \"en\",\n\t\t\t\t\tselectors: [{ type: \"variable-reference\", name: \"platform\" }],\n\t\t\t\t},\n\t\t\t],\n\t\t\tvariants: [],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst messages = await project.db.selectFrom(\"message\").selectAll().execute();\n\n\texpect(messages.length).toBe(1);\n\texpect(messages[0]?.id).toBe(\"alfa23\");\n\texpect(messages[0]?.selectors).toStrictEqual([\n\t\t{ type: \"variable-reference\", name: \"platform\" },\n\t]);\n});\n\ntest(\"it should create a bundle for a message if the bundle does not exist to avoid foreign key conflicts and enable partial imports\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [],\n\t\t\tmessages: [{ bundleId: \"non-existent-bundle\", locale: \"en\" }],\n\t\t\tvariants: [],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst bundles = await project.db.selectFrom(\"bundle\").selectAll().execute();\n\n\texpect(bundles.length).toBe(1);\n\texpect(bundles[0]?.id).toBe(\"non-existent-bundle\");\n});\n\ntest(\"it should insert a variant as is if the id is provided\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.db.insertInto(\"bundle\").values({ id: \"mock-bundle\" }).execute();\n\tawait project.db\n\t\t.insertInto(\"message\")\n\t\t.values({\n\t\t\tid: \"mock-message\",\n\t\t\tbundleId: \"mock-bundle\",\n\t\t\tlocale: \"en\",\n\t\t})\n\t\t.execute();\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [],\n\t\t\tmessages: [],\n\t\t\tvariants: [{ id: \"variant-id-23\", messageId: \"mock-message\" }],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst variants = await project.db.selectFrom(\"variant\").selectAll().execute();\n\n\texpect(variants.length).toBe(1);\n\texpect(variants[0]?.id).toBe(\"variant-id-23\");\n});\n\ntest(\"it should match an existing variant if the id is not provided\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.db.insertInto(\"bundle\").values({ id: \"mock-bundle\" }).execute();\n\tawait project.db\n\t\t.insertInto(\"message\")\n\t\t.values({\n\t\t\tid: \"mock-message\",\n\t\t\tbundleId: \"mock-bundle\",\n\t\t\tlocale: \"en\",\n\t\t})\n\t\t.execute();\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [],\n\t\t\tmessages: [],\n\t\t\tvariants: [{ messageBundleId: \"mock-bundle\", messageLocale: \"en\" }],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst variants = await project.db.selectFrom(\"variant\").selectAll().execute();\n\n\texpect(variants.length).toBe(1);\n\texpect(variants[0]?.messageId).toBe(\"mock-message\");\n\texpect(variants[0]?.id).toBeDefined();\n});\n\ntest(\"it should create a message for a variant if the message does not exist to avoid foreign key conflicts and enable partial imports\", async () => {\n\tconst project = await loadProjectInMemory({ blob: await newProject() });\n\n\tawait project.db.insertInto(\"bundle\").values({ id: \"mock-bundle\" }).execute();\n\n\tconst mockPlugin: InlangPlugin = {\n\t\tkey: \"mock\",\n\t\timportFiles: async () => ({\n\t\t\tbundles: [],\n\t\t\tmessages: [],\n\t\t\tvariants: [{ messageBundleId: \"mock-bundle\", messageLocale: \"en\" }],\n\t\t}),\n\t};\n\n\tawait importFiles({\n\t\tdb: project.db,\n\t\tfiles: [{ content: new Uint8Array(), locale: \"mock\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPlugin],\n\t\tsettings: {} as any,\n\t});\n\n\tconst bundles = await project.db.selectFrom(\"bundle\").selectAll().execute();\n\tconst messages = await project.db.selectFrom(\"message\").selectAll().execute();\n\tconst variants = await project.db.selectFrom(\"variant\").selectAll().execute();\n\n\texpect(bundles.length).toBe(1);\n\texpect(messages.length).toBe(1);\n\texpect(variants.length).toBe(1);\n\n\texpect(messages[0]?.bundleId).toBe(\"mock-bundle\");\n\texpect(messages[0]?.locale).toBe(\"en\");\n\texpect(variants[0]?.messageId).toBe(messages[0]?.id);\n});\n"]}
@@ -1,5 +1,3 @@
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]="85d51cc0-6320-5fc2-8952-8a92539c132b")}catch(e){}}();
3
1
  import { test, expect } from "vitest";
4
2
  import { loadProjectInMemory } from "../project/loadProjectInMemory.js";
5
3
  import { newProject } from "../project/newProject.js";
@@ -269,5 +267,4 @@ const mockPluginSimple = {
269
267
  };
270
268
  },
271
269
  };
272
- //# sourceMappingURL=roundtrip.test.js.map
273
- //# debugId=85d51cc0-6320-5fc2-8952-8a92539c132b
270
+ //# sourceMappingURL=roundtrip.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"roundtrip.test.js","sources":["import-export/roundtrip.test.ts"],"sourceRoot":"/","sourcesContent":["import { test, expect } from \"vitest\";\nimport type {\n\tBundleImport,\n\tInlangPlugin,\n\tMessageImport,\n\tVariantImport,\n} from \"../plugin/schema.js\";\nimport type { Message } from \"../database/schema.js\";\nimport type { Text } from \"../json-schema/pattern.js\";\nimport { loadProjectInMemory } from \"../project/loadProjectInMemory.js\";\nimport { newProject } from \"../project/newProject.js\";\nimport { importFiles } from \"./importFiles.js\";\nimport { exportFiles } from \"./exportFiles.js\";\n\ntest(\"the file should be identical after a roundtrip if no modifications occured\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t});\n\n\tconst enResource = JSON.stringify({\n\t\thello_world: \"value1\",\n\t});\n\n\tawait importFiles({\n\t\tfiles: [{ content: new TextEncoder().encode(enResource), locale: \"en\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginSimple],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\tconst importedBundles = await project.db\n\t\t.selectFrom(\"bundle\")\n\t\t.selectAll()\n\t\t.execute();\n\tconst importedMessages = await project.db\n\t\t.selectFrom(\"message\")\n\t\t.selectAll()\n\t\t.execute();\n\tconst importedVariants = await project.db\n\t\t.selectFrom(\"variant\")\n\t\t.selectAll()\n\t\t.execute();\n\n\texpect(importedBundles.length).toBe(1);\n\texpect(importedMessages.length).toBe(1);\n\texpect(importedVariants.length).toBe(1);\n\texpect(importedBundles[0]?.id).toBe(\"hello_world\");\n\texpect(importedMessages[0]?.bundleId).toBe(\"hello_world\");\n\texpect(importedVariants[0]?.messageId).toBe(importedMessages[0]?.id);\n\n\tconst exportedFiles = await exportFiles({\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginSimple],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\texpect(exportedFiles.length).toBe(1);\n\texpect(exportedFiles[0]?.name).toBe(\"en.json\");\n\texpect(new TextDecoder().decode(exportedFiles[0]?.content)).toBe(enResource);\n});\n\ntest(\"a variant with an existing match should update the existing variant and not create a new one to enable roundtrips\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t});\n\n\tconst existing = {\n\t\tbundles: [\n\t\t\t{\n\t\t\t\tid: \"mock-bundle-id\",\n\t\t\t\tdeclarations: [],\n\t\t\t},\n\t\t],\n\t\tmessages: [\n\t\t\t{\n\t\t\t\tid: \"mock-message-id\",\n\t\t\t\tlocale: \"en\",\n\t\t\t\tselectors: [],\n\t\t\t\tbundleId: \"mock-bundle-id\",\n\t\t\t},\n\t\t],\n\t\tvariants: [\n\t\t\t{\n\t\t\t\tid: \"mock-variant-id\",\n\t\t\t\tmessageId: \"mock-message-id\",\n\t\t\t\tmatches: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"literal-match\",\n\t\t\t\t\t\tkey: \"color\",\n\t\t\t\t\t\tvalue: \"blue\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tpattern: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\tvalue: \"You have blue eyes.\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n\n\tconst updated = structuredClone(existing);\n\t// @ts-expect-error - we know this is a text pattern\n\tupdated.variants[0].pattern[0].value = \"You have beautiful blue eyes.\";\n\n\tconst enResource = JSON.stringify(updated);\n\n\tawait importFiles({\n\t\tfiles: [{ content: new TextEncoder().encode(enResource), locale: \"en\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginAst],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\tconst bundles = await project.db.selectFrom(\"bundle\").selectAll().execute();\n\tconst messages = await project.db.selectFrom(\"message\").selectAll().execute();\n\tconst variants = await project.db.selectFrom(\"variant\").selectAll().execute();\n\n\texpect(bundles.length).toBe(1);\n\texpect(messages.length).toBe(1);\n\texpect(variants.length).toBe(1);\n\t// @ts-expect-error - we know this is a text pattern\n\texpect(variants[0]?.pattern[0].value).toBe(\"You have beautiful blue eyes.\");\n});\n\ntest(\"if a message for the bundle id and locale already exists, update it. don't create a new message\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t});\n\n\tconst existing: any = {\n\t\tbundles: [{ id: \"mock-bundle-id\", declarations: [] }],\n\t\tmessages: [\n\t\t\t{\n\t\t\t\tid: \"mock-message-id\",\n\t\t\t\tlocale: \"en\",\n\t\t\t\tselectors: [],\n\t\t\t\tbundleId: \"mock-bundle-id\",\n\t\t\t},\n\t\t],\n\t\tvariants: [],\n\t};\n\n\tconst updated = structuredClone(existing);\n\tupdated.messages[0]!.selectors = [\n\t\t{\n\t\t\ttype: \"variable-reference\",\n\t\t\tname: \"variable2\",\n\t\t},\n\t] satisfies Message[\"selectors\"];\n\n\tconst enResource = new TextEncoder().encode(JSON.stringify(updated));\n\n\tawait importFiles({\n\t\tfiles: [{ content: enResource, locale: \"en\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginAst],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\tconst bundles = await project.db.selectFrom(\"bundle\").selectAll().execute();\n\tconst messages = await project.db.selectFrom(\"message\").selectAll().execute();\n\n\texpect(bundles.length).toBe(1);\n\texpect(messages.length).toBe(1);\n\n\texpect(messages[0]?.selectors).toStrictEqual([\n\t\t{\n\t\t\ttype: \"variable-reference\",\n\t\t\tname: \"variable2\",\n\t\t},\n\t]);\n});\n\ntest(\"keys should be ordered alphabetically for .json to minimize git diffs\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t});\n\n\tconst enResource = JSON.stringify({\n\t\ta: \"value1\",\n\t\tb: \"value2\",\n\t\td: \"value4\",\n\t});\n\n\tawait importFiles({\n\t\tfiles: [{ content: new TextEncoder().encode(enResource), locale: \"en\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginSimple],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\tawait project.db.insertInto(\"bundle\").values({ id: \"c\" }).execute();\n\tawait project.db\n\t\t.insertInto(\"message\")\n\t\t.values({ id: \"c-en\", bundleId: \"c\", locale: \"en\" })\n\t\t.execute();\n\tawait project.db\n\t\t.insertInto(\"variant\")\n\t\t.values({ messageId: \"c-en\", pattern: [{ type: \"text\", value: \"value3\" }] })\n\t\t.execute();\n\n\tconst exportedFiles = await exportFiles({\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginSimple],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\texpect(\n\t\tJSON.parse(new TextDecoder().decode(exportedFiles[0]?.content))\n\t).toStrictEqual({\n\t\ta: \"value1\",\n\t\tb: \"value2\",\n\t\tc: \"value3\",\n\t\td: \"value4\",\n\t});\n});\n\nconst mockPluginAst: InlangPlugin = {\n\tkey: \"mock\",\n\texportFiles: async ({ bundles, messages, variants }) => {\n\t\treturn [\n\t\t\t{\n\t\t\t\tlocale: \"every\",\n\t\t\t\tname: \"x.json\",\n\t\t\t\tcontent: new TextEncoder().encode(\n\t\t\t\t\tJSON.stringify({ bundles, messages, variants })\n\t\t\t\t),\n\t\t\t},\n\t\t];\n\t},\n\timportFiles: async ({ files }) => {\n\t\tlet bundles: any[] = [];\n\t\tlet messages: any[] = [];\n\t\tlet variants: any[] = [];\n\t\tfor (const file of files) {\n\t\t\tconst parsed = JSON.parse(new TextDecoder().decode(file.content));\n\t\t\tbundles = [...bundles, ...parsed.bundles];\n\t\t\tmessages = [...messages, ...parsed.messages];\n\t\t\tvariants = [...variants, ...parsed.variants];\n\t\t}\n\t\treturn { bundles, messages, variants };\n\t},\n};\n\n// a simple mock plugin to test roundtrips\n//\n// purposefully not imported a real plugin\n// to keep the interdepenedencies low and\n// increase maintainability\nconst mockPluginSimple: InlangPlugin = {\n\tkey: \"mock\",\n\texportFiles: async ({ messages, variants }) => {\n\t\tconst jsons: any = {};\n\t\tfor (const message of messages) {\n\t\t\tconst key = message.bundleId;\n\t\t\tconst value = (\n\t\t\t\tvariants.find((v) => v.messageId === message.id)?.pattern[0] as Text\n\t\t\t).value;\n\t\t\tif (!jsons[message.locale]) {\n\t\t\t\tjsons[message.locale] = {};\n\t\t\t}\n\t\t\tjsons[message.locale][key] = value;\n\t\t}\n\t\treturn Object.entries(jsons).map(([locale, json]) => ({\n\t\t\tlocale,\n\t\t\tname: locale + \".json\",\n\t\t\tcontent: new TextEncoder().encode(JSON.stringify(json)),\n\t\t}));\n\t},\n\timportFiles: async ({ files }) => {\n\t\tconst bundles: BundleImport[] = [];\n\t\tconst messages: MessageImport[] = [];\n\t\tconst variants: VariantImport[] = [];\n\t\tfor (const file of files) {\n\t\t\tconst parsed = JSON.parse(new TextDecoder().decode(file.content));\n\t\t\tfor (const key in parsed) {\n\t\t\t\tbundles.push({\n\t\t\t\t\tid: key,\n\t\t\t\t\tdeclarations: [],\n\t\t\t\t});\n\t\t\t\tmessages.push({\n\t\t\t\t\tbundleId: key,\n\t\t\t\t\tlocale: file.locale,\n\t\t\t\t\tselectors: [],\n\t\t\t\t});\n\t\t\t\tvariants.push({\n\t\t\t\t\tmessageBundleId: key,\n\t\t\t\t\tmessageLocale: file.locale,\n\t\t\t\t\tmatches: [],\n\t\t\t\t\tpattern: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: parsed[key],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tbundles,\n\t\t\tmessages,\n\t\t\tvariants,\n\t\t};\n\t},\n};\n"],"names":[],"mappings":"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","debug_id":"85d51cc0-6320-5fc2-8952-8a92539c132b"}
1
+ {"version":3,"file":"roundtrip.test.js","sourceRoot":"/","sources":["import-export/roundtrip.test.ts"],"names":[],"mappings":"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","sourcesContent":["import { test, expect } from \"vitest\";\nimport type {\n\tBundleImport,\n\tInlangPlugin,\n\tMessageImport,\n\tVariantImport,\n} from \"../plugin/schema.js\";\nimport type { Message } from \"../database/schema.js\";\nimport type { Text } from \"../json-schema/pattern.js\";\nimport { loadProjectInMemory } from \"../project/loadProjectInMemory.js\";\nimport { newProject } from \"../project/newProject.js\";\nimport { importFiles } from \"./importFiles.js\";\nimport { exportFiles } from \"./exportFiles.js\";\n\ntest(\"the file should be identical after a roundtrip if no modifications occured\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t});\n\n\tconst enResource = JSON.stringify({\n\t\thello_world: \"value1\",\n\t});\n\n\tawait importFiles({\n\t\tfiles: [{ content: new TextEncoder().encode(enResource), locale: \"en\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginSimple],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\tconst importedBundles = await project.db\n\t\t.selectFrom(\"bundle\")\n\t\t.selectAll()\n\t\t.execute();\n\tconst importedMessages = await project.db\n\t\t.selectFrom(\"message\")\n\t\t.selectAll()\n\t\t.execute();\n\tconst importedVariants = await project.db\n\t\t.selectFrom(\"variant\")\n\t\t.selectAll()\n\t\t.execute();\n\n\texpect(importedBundles.length).toBe(1);\n\texpect(importedMessages.length).toBe(1);\n\texpect(importedVariants.length).toBe(1);\n\texpect(importedBundles[0]?.id).toBe(\"hello_world\");\n\texpect(importedMessages[0]?.bundleId).toBe(\"hello_world\");\n\texpect(importedVariants[0]?.messageId).toBe(importedMessages[0]?.id);\n\n\tconst exportedFiles = await exportFiles({\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginSimple],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\texpect(exportedFiles.length).toBe(1);\n\texpect(exportedFiles[0]?.name).toBe(\"en.json\");\n\texpect(new TextDecoder().decode(exportedFiles[0]?.content)).toBe(enResource);\n});\n\ntest(\"a variant with an existing match should update the existing variant and not create a new one to enable roundtrips\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t});\n\n\tconst existing = {\n\t\tbundles: [\n\t\t\t{\n\t\t\t\tid: \"mock-bundle-id\",\n\t\t\t\tdeclarations: [],\n\t\t\t},\n\t\t],\n\t\tmessages: [\n\t\t\t{\n\t\t\t\tid: \"mock-message-id\",\n\t\t\t\tlocale: \"en\",\n\t\t\t\tselectors: [],\n\t\t\t\tbundleId: \"mock-bundle-id\",\n\t\t\t},\n\t\t],\n\t\tvariants: [\n\t\t\t{\n\t\t\t\tid: \"mock-variant-id\",\n\t\t\t\tmessageId: \"mock-message-id\",\n\t\t\t\tmatches: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"literal-match\",\n\t\t\t\t\t\tkey: \"color\",\n\t\t\t\t\t\tvalue: \"blue\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t\tpattern: [\n\t\t\t\t\t{\n\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\tvalue: \"You have blue eyes.\",\n\t\t\t\t\t},\n\t\t\t\t],\n\t\t\t},\n\t\t],\n\t};\n\n\tconst updated = structuredClone(existing);\n\t// @ts-expect-error - we know this is a text pattern\n\tupdated.variants[0].pattern[0].value = \"You have beautiful blue eyes.\";\n\n\tconst enResource = JSON.stringify(updated);\n\n\tawait importFiles({\n\t\tfiles: [{ content: new TextEncoder().encode(enResource), locale: \"en\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginAst],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\tconst bundles = await project.db.selectFrom(\"bundle\").selectAll().execute();\n\tconst messages = await project.db.selectFrom(\"message\").selectAll().execute();\n\tconst variants = await project.db.selectFrom(\"variant\").selectAll().execute();\n\n\texpect(bundles.length).toBe(1);\n\texpect(messages.length).toBe(1);\n\texpect(variants.length).toBe(1);\n\t// @ts-expect-error - we know this is a text pattern\n\texpect(variants[0]?.pattern[0].value).toBe(\"You have beautiful blue eyes.\");\n});\n\ntest(\"if a message for the bundle id and locale already exists, update it. don't create a new message\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t});\n\n\tconst existing: any = {\n\t\tbundles: [{ id: \"mock-bundle-id\", declarations: [] }],\n\t\tmessages: [\n\t\t\t{\n\t\t\t\tid: \"mock-message-id\",\n\t\t\t\tlocale: \"en\",\n\t\t\t\tselectors: [],\n\t\t\t\tbundleId: \"mock-bundle-id\",\n\t\t\t},\n\t\t],\n\t\tvariants: [],\n\t};\n\n\tconst updated = structuredClone(existing);\n\tupdated.messages[0]!.selectors = [\n\t\t{\n\t\t\ttype: \"variable-reference\",\n\t\t\tname: \"variable2\",\n\t\t},\n\t] satisfies Message[\"selectors\"];\n\n\tconst enResource = new TextEncoder().encode(JSON.stringify(updated));\n\n\tawait importFiles({\n\t\tfiles: [{ content: enResource, locale: \"en\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginAst],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\tconst bundles = await project.db.selectFrom(\"bundle\").selectAll().execute();\n\tconst messages = await project.db.selectFrom(\"message\").selectAll().execute();\n\n\texpect(bundles.length).toBe(1);\n\texpect(messages.length).toBe(1);\n\n\texpect(messages[0]?.selectors).toStrictEqual([\n\t\t{\n\t\t\ttype: \"variable-reference\",\n\t\t\tname: \"variable2\",\n\t\t},\n\t]);\n});\n\ntest(\"keys should be ordered alphabetically for .json to minimize git diffs\", async () => {\n\tconst project = await loadProjectInMemory({\n\t\tblob: await newProject(),\n\t});\n\n\tconst enResource = JSON.stringify({\n\t\ta: \"value1\",\n\t\tb: \"value2\",\n\t\td: \"value4\",\n\t});\n\n\tawait importFiles({\n\t\tfiles: [{ content: new TextEncoder().encode(enResource), locale: \"en\" }],\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginSimple],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\tawait project.db.insertInto(\"bundle\").values({ id: \"c\" }).execute();\n\tawait project.db\n\t\t.insertInto(\"message\")\n\t\t.values({ id: \"c-en\", bundleId: \"c\", locale: \"en\" })\n\t\t.execute();\n\tawait project.db\n\t\t.insertInto(\"variant\")\n\t\t.values({ messageId: \"c-en\", pattern: [{ type: \"text\", value: \"value3\" }] })\n\t\t.execute();\n\n\tconst exportedFiles = await exportFiles({\n\t\tpluginKey: \"mock\",\n\t\tplugins: [mockPluginSimple],\n\t\tsettings: await project.settings.get(),\n\t\tdb: project.db,\n\t});\n\n\texpect(\n\t\tJSON.parse(new TextDecoder().decode(exportedFiles[0]?.content))\n\t).toStrictEqual({\n\t\ta: \"value1\",\n\t\tb: \"value2\",\n\t\tc: \"value3\",\n\t\td: \"value4\",\n\t});\n});\n\nconst mockPluginAst: InlangPlugin = {\n\tkey: \"mock\",\n\texportFiles: async ({ bundles, messages, variants }) => {\n\t\treturn [\n\t\t\t{\n\t\t\t\tlocale: \"every\",\n\t\t\t\tname: \"x.json\",\n\t\t\t\tcontent: new TextEncoder().encode(\n\t\t\t\t\tJSON.stringify({ bundles, messages, variants })\n\t\t\t\t),\n\t\t\t},\n\t\t];\n\t},\n\timportFiles: async ({ files }) => {\n\t\tlet bundles: any[] = [];\n\t\tlet messages: any[] = [];\n\t\tlet variants: any[] = [];\n\t\tfor (const file of files) {\n\t\t\tconst parsed = JSON.parse(new TextDecoder().decode(file.content));\n\t\t\tbundles = [...bundles, ...parsed.bundles];\n\t\t\tmessages = [...messages, ...parsed.messages];\n\t\t\tvariants = [...variants, ...parsed.variants];\n\t\t}\n\t\treturn { bundles, messages, variants };\n\t},\n};\n\n// a simple mock plugin to test roundtrips\n//\n// purposefully not imported a real plugin\n// to keep the interdepenedencies low and\n// increase maintainability\nconst mockPluginSimple: InlangPlugin = {\n\tkey: \"mock\",\n\texportFiles: async ({ messages, variants }) => {\n\t\tconst jsons: any = {};\n\t\tfor (const message of messages) {\n\t\t\tconst key = message.bundleId;\n\t\t\tconst value = (\n\t\t\t\tvariants.find((v) => v.messageId === message.id)?.pattern[0] as Text\n\t\t\t).value;\n\t\t\tif (!jsons[message.locale]) {\n\t\t\t\tjsons[message.locale] = {};\n\t\t\t}\n\t\t\tjsons[message.locale][key] = value;\n\t\t}\n\t\treturn Object.entries(jsons).map(([locale, json]) => ({\n\t\t\tlocale,\n\t\t\tname: locale + \".json\",\n\t\t\tcontent: new TextEncoder().encode(JSON.stringify(json)),\n\t\t}));\n\t},\n\timportFiles: async ({ files }) => {\n\t\tconst bundles: BundleImport[] = [];\n\t\tconst messages: MessageImport[] = [];\n\t\tconst variants: VariantImport[] = [];\n\t\tfor (const file of files) {\n\t\t\tconst parsed = JSON.parse(new TextDecoder().decode(file.content));\n\t\t\tfor (const key in parsed) {\n\t\t\t\tbundles.push({\n\t\t\t\t\tid: key,\n\t\t\t\t\tdeclarations: [],\n\t\t\t\t});\n\t\t\t\tmessages.push({\n\t\t\t\t\tbundleId: key,\n\t\t\t\t\tlocale: file.locale,\n\t\t\t\t\tselectors: [],\n\t\t\t\t});\n\t\t\t\tvariants.push({\n\t\t\t\t\tmessageBundleId: key,\n\t\t\t\t\tmessageLocale: file.locale,\n\t\t\t\t\tmatches: [],\n\t\t\t\t\tpattern: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: parsed[key],\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\treturn {\n\t\t\tbundles,\n\t\t\tmessages,\n\t\t\tvariants,\n\t\t};\n\t},\n};\n"]}
@@ -1,5 +1,3 @@
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]="25be5f79-7a2c-56d5-96ad-8cc7fa8103d9")}catch(e){}}();
3
1
  export const upsertBundleNestedMatchByProperties = async (db, bundle) => {
4
2
  if (bundle.id === undefined) {
5
3
  throw new Error("upsert expets a bundle id for matching");
@@ -54,5 +52,4 @@ export const upsertBundleNestedMatchByProperties = async (db, bundle) => {
54
52
  }
55
53
  });
56
54
  };
57
- //# sourceMappingURL=upsertBundleNestedMatchByProperties.js.map
58
- //# debugId=25be5f79-7a2c-56d5-96ad-8cc7fa8103d9
55
+ //# sourceMappingURL=upsertBundleNestedMatchByProperties.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"upsertBundleNestedMatchByProperties.js","sources":["import-export/upsertBundleNestedMatchByProperties.ts"],"sourceRoot":"/","sourcesContent":["import type { Kysely } from \"kysely\";\nimport type {\n\tInlangDatabaseSchema,\n\tNewBundleNested,\n} from \"../database/schema.js\";\n\nexport const upsertBundleNestedMatchByProperties = async (\n\tdb: Kysely<InlangDatabaseSchema>,\n\tbundle: NewBundleNested\n): Promise<void> => {\n\tif (bundle.id === undefined) {\n\t\tthrow new Error(\"upsert expets a bundle id for matching\");\n\t}\n\tconst bundleToInsert = { ...bundle, messages: undefined };\n\n\tawait db.transaction().execute(async (trx) => {\n\t\tconst insertedBundle = await trx\n\t\t\t.insertInto(\"bundle\")\n\t\t\t.values(bundleToInsert)\n\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(bundleToInsert))\n\t\t\t.returning(\"id\")\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\tconst existingMessages = await trx\n\t\t\t.selectFrom(\"message\")\n\t\t\t.where(\"bundleId\", \"=\", insertedBundle.id)\n\t\t\t.selectAll()\n\t\t\t.execute();\n\n\t\tfor (const message of bundle.messages) {\n\t\t\t// match by locale\n\t\t\tconst existingMessage = existingMessages.find(\n\t\t\t\t(m) => m.locale === message.locale\n\t\t\t);\n\n\t\t\tconst messageToInsert = {\n\t\t\t\t...message,\n\t\t\t\tid: existingMessage?.id,\n\t\t\t\tbundleId: insertedBundle.id,\n\t\t\t\tvariants: undefined,\n\t\t\t};\n\t\t\tconst insertedMessage = await trx\n\t\t\t\t.insertInto(\"message\")\n\t\t\t\t.values(messageToInsert)\n\t\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(messageToInsert))\n\t\t\t\t.returning(\"id\")\n\t\t\t\t.executeTakeFirstOrThrow();\n\n\t\t\tconst existingVariants = await trx\n\t\t\t\t.selectFrom(\"variant\")\n\t\t\t\t.where(\"messageId\", \"=\", insertedMessage.id)\n\t\t\t\t.selectAll()\n\t\t\t\t.execute();\n\n\t\t\tfor (const variant of message.variants) {\n\t\t\t\t// match by matches\n\t\t\t\tconst existingVariant = existingVariants.find(\n\t\t\t\t\t(v) => JSON.stringify(v.matches) === JSON.stringify(variant.matches)\n\t\t\t\t);\n\n\t\t\t\tconst variantToInsert = {\n\t\t\t\t\t...variant,\n\t\t\t\t\tid: existingVariant?.id,\n\t\t\t\t\tmessageId: insertedMessage.id,\n\t\t\t\t};\n\t\t\t\tawait trx\n\t\t\t\t\t.insertInto(\"variant\")\n\t\t\t\t\t.values(variantToInsert)\n\t\t\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(variantToInsert))\n\t\t\t\t\t.execute();\n\t\t\t}\n\t\t}\n\t});\n};\n"],"names":[],"mappings":";;AAMA,MAAM,CAAC,MAAM,mCAAmC,GAAG,KAAK,EACvD,EAAgC,EAChC,MAAuB,EACP,EAAE;IAClB,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAE1D,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5C,MAAM,cAAc,GAAG,MAAM,GAAG;aAC9B,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,cAAc,CAAC;aACtB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;aAC/D,SAAS,CAAC,IAAI,CAAC;aACf,uBAAuB,EAAE,CAAC;QAE5B,MAAM,gBAAgB,GAAG,MAAM,GAAG;aAChC,UAAU,CAAC,SAAS,CAAC;aACrB,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC;aACzC,SAAS,EAAE;aACX,OAAO,EAAE,CAAC;QAEZ,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvC,kBAAkB;YAClB,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAClC,CAAC;YAEF,MAAM,eAAe,GAAG;gBACvB,GAAG,OAAO;gBACV,EAAE,EAAE,eAAe,EAAE,EAAE;gBACvB,QAAQ,EAAE,cAAc,CAAC,EAAE;gBAC3B,QAAQ,EAAE,SAAS;aACnB,CAAC;YACF,MAAM,eAAe,GAAG,MAAM,GAAG;iBAC/B,UAAU,CAAC,SAAS,CAAC;iBACrB,MAAM,CAAC,eAAe,CAAC;iBACvB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;iBAChE,SAAS,CAAC,IAAI,CAAC;iBACf,uBAAuB,EAAE,CAAC;YAE5B,MAAM,gBAAgB,GAAG,MAAM,GAAG;iBAChC,UAAU,CAAC,SAAS,CAAC;iBACrB,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,eAAe,CAAC,EAAE,CAAC;iBAC3C,SAAS,EAAE;iBACX,OAAO,EAAE,CAAC;YAEZ,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACxC,mBAAmB;gBACnB,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CACpE,CAAC;gBAEF,MAAM,eAAe,GAAG;oBACvB,GAAG,OAAO;oBACV,EAAE,EAAE,eAAe,EAAE,EAAE;oBACvB,SAAS,EAAE,eAAe,CAAC,EAAE;iBAC7B,CAAC;gBACF,MAAM,GAAG;qBACP,UAAU,CAAC,SAAS,CAAC;qBACrB,MAAM,CAAC,eAAe,CAAC;qBACvB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;qBAChE,OAAO,EAAE,CAAC;YACb,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC","debug_id":"25be5f79-7a2c-56d5-96ad-8cc7fa8103d9"}
1
+ {"version":3,"file":"upsertBundleNestedMatchByProperties.js","sourceRoot":"/","sources":["import-export/upsertBundleNestedMatchByProperties.ts"],"names":[],"mappings":"AAMA,MAAM,CAAC,MAAM,mCAAmC,GAAG,KAAK,EACvD,EAAgC,EAChC,MAAuB,EACP,EAAE;IAClB,IAAI,MAAM,CAAC,EAAE,KAAK,SAAS,EAAE,CAAC;QAC7B,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC3D,CAAC;IACD,MAAM,cAAc,GAAG,EAAE,GAAG,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC;IAE1D,MAAM,EAAE,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,EAAE,EAAE;QAC5C,MAAM,cAAc,GAAG,MAAM,GAAG;aAC9B,UAAU,CAAC,QAAQ,CAAC;aACpB,MAAM,CAAC,cAAc,CAAC;aACtB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,cAAc,CAAC,CAAC;aAC/D,SAAS,CAAC,IAAI,CAAC;aACf,uBAAuB,EAAE,CAAC;QAE5B,MAAM,gBAAgB,GAAG,MAAM,GAAG;aAChC,UAAU,CAAC,SAAS,CAAC;aACrB,KAAK,CAAC,UAAU,EAAE,GAAG,EAAE,cAAc,CAAC,EAAE,CAAC;aACzC,SAAS,EAAE;aACX,OAAO,EAAE,CAAC;QAEZ,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACvC,kBAAkB;YAClB,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,OAAO,CAAC,MAAM,CAClC,CAAC;YAEF,MAAM,eAAe,GAAG;gBACvB,GAAG,OAAO;gBACV,EAAE,EAAE,eAAe,EAAE,EAAE;gBACvB,QAAQ,EAAE,cAAc,CAAC,EAAE;gBAC3B,QAAQ,EAAE,SAAS;aACnB,CAAC;YACF,MAAM,eAAe,GAAG,MAAM,GAAG;iBAC/B,UAAU,CAAC,SAAS,CAAC;iBACrB,MAAM,CAAC,eAAe,CAAC;iBACvB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;iBAChE,SAAS,CAAC,IAAI,CAAC;iBACf,uBAAuB,EAAE,CAAC;YAE5B,MAAM,gBAAgB,GAAG,MAAM,GAAG;iBAChC,UAAU,CAAC,SAAS,CAAC;iBACrB,KAAK,CAAC,WAAW,EAAE,GAAG,EAAE,eAAe,CAAC,EAAE,CAAC;iBAC3C,SAAS,EAAE;iBACX,OAAO,EAAE,CAAC;YAEZ,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBACxC,mBAAmB;gBACnB,MAAM,eAAe,GAAG,gBAAgB,CAAC,IAAI,CAC5C,CAAC,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,OAAO,CAAC,OAAO,CAAC,CACpE,CAAC;gBAEF,MAAM,eAAe,GAAG;oBACvB,GAAG,OAAO;oBACV,EAAE,EAAE,eAAe,EAAE,EAAE;oBACvB,SAAS,EAAE,eAAe,CAAC,EAAE;iBAC7B,CAAC;gBACF,MAAM,GAAG;qBACP,UAAU,CAAC,SAAS,CAAC;qBACrB,MAAM,CAAC,eAAe,CAAC;qBACvB,UAAU,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,WAAW,CAAC,eAAe,CAAC,CAAC;qBAChE,OAAO,EAAE,CAAC;YACb,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC,CAAC","sourcesContent":["import type { Kysely } from \"kysely\";\nimport type {\n\tInlangDatabaseSchema,\n\tNewBundleNested,\n} from \"../database/schema.js\";\n\nexport const upsertBundleNestedMatchByProperties = async (\n\tdb: Kysely<InlangDatabaseSchema>,\n\tbundle: NewBundleNested\n): Promise<void> => {\n\tif (bundle.id === undefined) {\n\t\tthrow new Error(\"upsert expets a bundle id for matching\");\n\t}\n\tconst bundleToInsert = { ...bundle, messages: undefined };\n\n\tawait db.transaction().execute(async (trx) => {\n\t\tconst insertedBundle = await trx\n\t\t\t.insertInto(\"bundle\")\n\t\t\t.values(bundleToInsert)\n\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(bundleToInsert))\n\t\t\t.returning(\"id\")\n\t\t\t.executeTakeFirstOrThrow();\n\n\t\tconst existingMessages = await trx\n\t\t\t.selectFrom(\"message\")\n\t\t\t.where(\"bundleId\", \"=\", insertedBundle.id)\n\t\t\t.selectAll()\n\t\t\t.execute();\n\n\t\tfor (const message of bundle.messages) {\n\t\t\t// match by locale\n\t\t\tconst existingMessage = existingMessages.find(\n\t\t\t\t(m) => m.locale === message.locale\n\t\t\t);\n\n\t\t\tconst messageToInsert = {\n\t\t\t\t...message,\n\t\t\t\tid: existingMessage?.id,\n\t\t\t\tbundleId: insertedBundle.id,\n\t\t\t\tvariants: undefined,\n\t\t\t};\n\t\t\tconst insertedMessage = await trx\n\t\t\t\t.insertInto(\"message\")\n\t\t\t\t.values(messageToInsert)\n\t\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(messageToInsert))\n\t\t\t\t.returning(\"id\")\n\t\t\t\t.executeTakeFirstOrThrow();\n\n\t\t\tconst existingVariants = await trx\n\t\t\t\t.selectFrom(\"variant\")\n\t\t\t\t.where(\"messageId\", \"=\", insertedMessage.id)\n\t\t\t\t.selectAll()\n\t\t\t\t.execute();\n\n\t\t\tfor (const variant of message.variants) {\n\t\t\t\t// match by matches\n\t\t\t\tconst existingVariant = existingVariants.find(\n\t\t\t\t\t(v) => JSON.stringify(v.matches) === JSON.stringify(variant.matches)\n\t\t\t\t);\n\n\t\t\t\tconst variantToInsert = {\n\t\t\t\t\t...variant,\n\t\t\t\t\tid: existingVariant?.id,\n\t\t\t\t\tmessageId: insertedMessage.id,\n\t\t\t\t};\n\t\t\t\tawait trx\n\t\t\t\t\t.insertInto(\"variant\")\n\t\t\t\t\t.values(variantToInsert)\n\t\t\t\t\t.onConflict((oc) => oc.column(\"id\").doUpdateSet(variantToInsert))\n\t\t\t\t\t.execute();\n\t\t\t}\n\t\t}\n\t});\n};\n"]}
package/dist/index.js CHANGED
@@ -1,5 +1,3 @@
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]="52176809-8d80-5a47-906d-ab39ab74ae04")}catch(e){}}();
3
1
  export { newProject } from "./project/newProject.js";
4
2
  export { loadProjectInMemory } from "./project/loadProjectInMemory.js";
5
3
  export { loadProjectFromDirectory,
@@ -16,5 +14,4 @@ export * from "./plugin/errors.js";
16
14
  export { humanId } from "./human-id/human-id.js";
17
15
  export * from "./database/schema.js";
18
16
  export { createMessageV1 } from "./migrations/v2/createMessageV1.js";
19
- //# sourceMappingURL=index.js.map
20
- //# debugId=52176809-8d80-5a47-906d-ab39ab74ae04
17
+ //# sourceMappingURL=index.js.map
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 { 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"}
1
+ {"version":3,"file":"index.js","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;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","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"]}
@@ -3,8 +3,6 @@
3
3
  *
4
4
  * @throws If the message cannot be represented in the v1 format
5
5
  */
6
-
7
- !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]="45afe632-0d35-5194-9127-dda10133a680")}catch(e){}}();
8
6
  export function fromMessageV1(messageV1) {
9
7
  const bundleId = messageV1.id;
10
8
  const languages = [
@@ -80,5 +78,4 @@ function fromPatternV1(pattern) {
80
78
  }
81
79
  });
82
80
  }
83
- //# sourceMappingURL=fromMessageV1.js.map
84
- //# debugId=45afe632-0d35-5194-9127-dda10133a680
81
+ //# sourceMappingURL=fromMessageV1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fromMessageV1.js","sources":["json-schema/old-v1-message/fromMessageV1.ts"],"sourceRoot":"/","sourcesContent":["import type {\n\tBundleNested,\n\tMessageNested,\n\tVariant,\n} from \"../../database/schema.js\";\nimport type { Declaration, Pattern } from \"../pattern.js\";\nimport type { MessageV1, PatternV1 } from \"./schemaV1.js\";\n\n/**\n * Converts a MessageV1 into a BundleNested\n *\n * @throws If the message cannot be represented in the v1 format\n */\nexport function fromMessageV1(messageV1: MessageV1): BundleNested {\n\tconst bundleId = messageV1.id;\n\n\tconst languages = [\n\t\t...new Set(messageV1.variants.map((variant) => variant.languageTag)),\n\t];\n\n\tconst declarations = new Set<Declaration>();\n\n\tconst messages: MessageNested[] = languages.map((language): MessageNested => {\n\t\tconst messageId = bundleId + \"_\" + language;\n\t\t//All variants that will be part of this message\n\t\tconst v1Variants = messageV1.variants.filter(\n\t\t\t(variant) => variant.languageTag === language\n\t\t);\n\n\t\t//find all selector names\n\t\tconst selectorNames = new Set<string>();\n\t\tfor (const v1Selector of messageV1.selectors ?? []) {\n\t\t\tselectorNames.add(v1Selector.name);\n\t\t}\n\n\t\t//The set of variables that need to be defined - Certainly includes the selectors\n\t\tconst variableNames = new Set<string>(selectorNames);\n\t\tconst variants: Variant[] = [];\n\t\tlet variantIndex = 1;\n\t\tfor (const v1Variant of v1Variants) {\n\t\t\tfor (const element of v1Variant.pattern) {\n\t\t\t\tif (element.type === \"VariableReference\") {\n\t\t\t\t\tvariableNames.add(element.name);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvariants.push({\n\t\t\t\t// matching was not supported. no problem should arise\n\t\t\t\tmatches: [],\n\t\t\t\tpattern: fromPatternV1(v1Variant.pattern),\n\t\t\t\tid: messageId + \"_\" + variantIndex,\n\t\t\t\tmessageId: messageId,\n\t\t\t});\n\t\t\tvariantIndex += 1;\n\t\t}\n\n\t\t//Create an input declaration for each variable and selector we need\n\t\tfor (const variable of variableNames) {\n\t\t\tdeclarations.add({\n\t\t\t\ttype: \"input-variable\",\n\t\t\t\tname: variable,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tid: messageId,\n\t\t\tbundleId: bundleId,\n\t\t\tlocale: language,\n\t\t\tselectors: [],\n\t\t\tvariants,\n\t\t};\n\t});\n\n\treturn {\n\t\tid: bundleId,\n\t\tdeclarations: [...declarations],\n\t\tmessages,\n\t};\n}\nfunction fromPatternV1(pattern: PatternV1): Pattern {\n\treturn pattern.map((element) => {\n\t\tswitch (element.type) {\n\t\t\tcase \"Text\": {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\tvalue: element.value,\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase \"VariableReference\":\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\targ: {\n\t\t\t\t\t\ttype: \"variable-reference\",\n\t\t\t\t\t\tname: element.name,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t}\n\t});\n}\n"],"names":[],"mappings":"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","debug_id":"45afe632-0d35-5194-9127-dda10133a680"}
1
+ {"version":3,"file":"fromMessageV1.js","sourceRoot":"/","sources":["json-schema/old-v1-message/fromMessageV1.ts"],"names":[],"mappings":"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","sourcesContent":["import type {\n\tBundleNested,\n\tMessageNested,\n\tVariant,\n} from \"../../database/schema.js\";\nimport type { Declaration, Pattern } from \"../pattern.js\";\nimport type { MessageV1, PatternV1 } from \"./schemaV1.js\";\n\n/**\n * Converts a MessageV1 into a BundleNested\n *\n * @throws If the message cannot be represented in the v1 format\n */\nexport function fromMessageV1(messageV1: MessageV1): BundleNested {\n\tconst bundleId = messageV1.id;\n\n\tconst languages = [\n\t\t...new Set(messageV1.variants.map((variant) => variant.languageTag)),\n\t];\n\n\tconst declarations = new Set<Declaration>();\n\n\tconst messages: MessageNested[] = languages.map((language): MessageNested => {\n\t\tconst messageId = bundleId + \"_\" + language;\n\t\t//All variants that will be part of this message\n\t\tconst v1Variants = messageV1.variants.filter(\n\t\t\t(variant) => variant.languageTag === language\n\t\t);\n\n\t\t//find all selector names\n\t\tconst selectorNames = new Set<string>();\n\t\tfor (const v1Selector of messageV1.selectors ?? []) {\n\t\t\tselectorNames.add(v1Selector.name);\n\t\t}\n\n\t\t//The set of variables that need to be defined - Certainly includes the selectors\n\t\tconst variableNames = new Set<string>(selectorNames);\n\t\tconst variants: Variant[] = [];\n\t\tlet variantIndex = 1;\n\t\tfor (const v1Variant of v1Variants) {\n\t\t\tfor (const element of v1Variant.pattern) {\n\t\t\t\tif (element.type === \"VariableReference\") {\n\t\t\t\t\tvariableNames.add(element.name);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvariants.push({\n\t\t\t\t// matching was not supported. no problem should arise\n\t\t\t\tmatches: [],\n\t\t\t\tpattern: fromPatternV1(v1Variant.pattern),\n\t\t\t\tid: messageId + \"_\" + variantIndex,\n\t\t\t\tmessageId: messageId,\n\t\t\t});\n\t\t\tvariantIndex += 1;\n\t\t}\n\n\t\t//Create an input declaration for each variable and selector we need\n\t\tfor (const variable of variableNames) {\n\t\t\tdeclarations.add({\n\t\t\t\ttype: \"input-variable\",\n\t\t\t\tname: variable,\n\t\t\t});\n\t\t}\n\n\t\treturn {\n\t\t\tid: messageId,\n\t\t\tbundleId: bundleId,\n\t\t\tlocale: language,\n\t\t\tselectors: [],\n\t\t\tvariants,\n\t\t};\n\t});\n\n\treturn {\n\t\tid: bundleId,\n\t\tdeclarations: [...declarations],\n\t\tmessages,\n\t};\n}\nfunction fromPatternV1(pattern: PatternV1): Pattern {\n\treturn pattern.map((element) => {\n\t\tswitch (element.type) {\n\t\t\tcase \"Text\": {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"text\",\n\t\t\t\t\tvalue: element.value,\n\t\t\t\t};\n\t\t\t}\n\t\t\tcase \"VariableReference\":\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"expression\",\n\t\t\t\t\targ: {\n\t\t\t\t\t\ttype: \"variable-reference\",\n\t\t\t\t\t\tname: element.name,\n\t\t\t\t\t},\n\t\t\t\t};\n\t\t}\n\t});\n}\n"]}
@@ -1,5 +1,3 @@
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]="eb8602fc-1b9b-5146-bcce-5e077ff9b4eb")}catch(e){}}();
3
1
  import { test, expect } from "vitest";
4
2
  import { fromMessageV1 } from "./fromMessageV1.js";
5
3
  import { Value } from "@sinclair/typebox/value";
@@ -81,5 +79,4 @@ test("fromMessageV1", () => {
81
79
  expect(nestedBundle).toEqual(bundle);
82
80
  });
83
81
  test.todo("with variable references", () => { });
84
- //# sourceMappingURL=fromMessageV1.test.js.map
85
- //# debugId=eb8602fc-1b9b-5146-bcce-5e077ff9b4eb
82
+ //# sourceMappingURL=fromMessageV1.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fromMessageV1.test.js","sources":["json-schema/old-v1-message/fromMessageV1.test.ts"],"sourceRoot":"/","sourcesContent":["import { test, expect } from \"vitest\";\nimport { fromMessageV1 } from \"./fromMessageV1.js\";\nimport { Value } from \"@sinclair/typebox/value\";\nimport { MessageV1 } from \"./schemaV1.js\";\nimport type { BundleNested } from \"../../database/schema.js\";\n\nconst messageV1: MessageV1 = {\n\tid: \"hello_world\",\n\talias: {},\n\tvariants: [\n\t\t{\n\t\t\tlanguageTag: \"en\",\n\t\t\tmatch: [],\n\t\t\tpattern: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"Text\",\n\t\t\t\t\tvalue: \"Hello World!\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tlanguageTag: \"de\",\n\t\t\tmatch: [],\n\t\t\tpattern: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"Text\",\n\t\t\t\t\tvalue: \"Hallo Welt!\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n\tselectors: [],\n};\n\nconst bundle: BundleNested = {\n\tid: \"hello_world\",\n\tdeclarations: [],\n\tmessages: [\n\t\t{\n\t\t\tbundleId: \"hello_world\",\n\t\t\tid: \"hello_world\" + \"_en\",\n\t\t\tlocale: \"en\",\n\t\t\tselectors: [],\n\t\t\tvariants: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hello_world\" + \"_en_1\",\n\t\t\t\t\tmatches: [],\n\t\t\t\t\tmessageId: \"hello_world\" + \"_en\",\n\t\t\t\t\tpattern: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: \"Hello World!\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tbundleId: \"hello_world\",\n\t\t\tid: \"hello_world\" + \"_de\",\n\t\t\tlocale: \"de\",\n\t\t\tselectors: [],\n\t\t\tvariants: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hello_world\" + \"_de_1\",\n\t\t\t\t\tmatches: [],\n\t\t\t\t\tmessageId: \"hello_world\" + \"_de\",\n\t\t\t\t\tpattern: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: \"Hallo Welt!\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n};\n\ntest(\"fromMessageV1\", () => {\n\texpect(Value.Check(MessageV1, messageV1)).toBe(true);\n\tconst nestedBundle: unknown = fromMessageV1(messageV1);\n\n\texpect(nestedBundle).toEqual(bundle);\n});\n\ntest.todo(\"with variable references\", () => {});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,SAAS,GAAc;IAC5B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE;QACT;YACC,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,cAAc;iBACrB;aACD;SACD;QACD;YACC,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,aAAa;iBACpB;aACD;SACD;KACD;IACD,SAAS,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,MAAM,GAAiB;IAC5B,EAAE,EAAE,aAAa;IACjB,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE;QACT;YACC,QAAQ,EAAE,aAAa;YACvB,EAAE,EAAE,aAAa,GAAG,KAAK;YACzB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,aAAa,GAAG,OAAO;oBAC3B,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,aAAa,GAAG,KAAK;oBAChC,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,cAAc;yBACrB;qBACD;iBACD;aACD;SACD;QACD;YACC,QAAQ,EAAE,aAAa;YACvB,EAAE,EAAE,aAAa,GAAG,KAAK;YACzB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,aAAa,GAAG,OAAO;oBAC3B,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,aAAa,GAAG,KAAK;oBAChC,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,aAAa;yBACpB;qBACD;iBACD;aACD;SACD;KACD;CACD,CAAC;AAEF,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;IAC1B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,YAAY,GAAY,aAAa,CAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC","debug_id":"eb8602fc-1b9b-5146-bcce-5e077ff9b4eb"}
1
+ {"version":3,"file":"fromMessageV1.test.js","sourceRoot":"/","sources":["json-schema/old-v1-message/fromMessageV1.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AACnD,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,MAAM,SAAS,GAAc;IAC5B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE;QACT;YACC,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,cAAc;iBACrB;aACD;SACD;QACD;YACC,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,aAAa;iBACpB;aACD;SACD;KACD;IACD,SAAS,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,MAAM,GAAiB;IAC5B,EAAE,EAAE,aAAa;IACjB,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE;QACT;YACC,QAAQ,EAAE,aAAa;YACvB,EAAE,EAAE,aAAa,GAAG,KAAK;YACzB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,aAAa,GAAG,OAAO;oBAC3B,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,aAAa,GAAG,KAAK;oBAChC,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,cAAc;yBACrB;qBACD;iBACD;aACD;SACD;QACD;YACC,QAAQ,EAAE,aAAa;YACvB,EAAE,EAAE,aAAa,GAAG,KAAK;YACzB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,aAAa,GAAG,OAAO;oBAC3B,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,aAAa,GAAG,KAAK;oBAChC,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,aAAa;yBACpB;qBACD;iBACD;aACD;SACD;KACD;CACD,CAAC;AAEF,IAAI,CAAC,eAAe,EAAE,GAAG,EAAE;IAC1B,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACrD,MAAM,YAAY,GAAY,aAAa,CAAC,SAAS,CAAC,CAAC;IAEvD,MAAM,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;AACtC,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC","sourcesContent":["import { test, expect } from \"vitest\";\nimport { fromMessageV1 } from \"./fromMessageV1.js\";\nimport { Value } from \"@sinclair/typebox/value\";\nimport { MessageV1 } from \"./schemaV1.js\";\nimport type { BundleNested } from \"../../database/schema.js\";\n\nconst messageV1: MessageV1 = {\n\tid: \"hello_world\",\n\talias: {},\n\tvariants: [\n\t\t{\n\t\t\tlanguageTag: \"en\",\n\t\t\tmatch: [],\n\t\t\tpattern: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"Text\",\n\t\t\t\t\tvalue: \"Hello World!\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tlanguageTag: \"de\",\n\t\t\tmatch: [],\n\t\t\tpattern: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"Text\",\n\t\t\t\t\tvalue: \"Hallo Welt!\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n\tselectors: [],\n};\n\nconst bundle: BundleNested = {\n\tid: \"hello_world\",\n\tdeclarations: [],\n\tmessages: [\n\t\t{\n\t\t\tbundleId: \"hello_world\",\n\t\t\tid: \"hello_world\" + \"_en\",\n\t\t\tlocale: \"en\",\n\t\t\tselectors: [],\n\t\t\tvariants: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hello_world\" + \"_en_1\",\n\t\t\t\t\tmatches: [],\n\t\t\t\t\tmessageId: \"hello_world\" + \"_en\",\n\t\t\t\t\tpattern: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: \"Hello World!\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tbundleId: \"hello_world\",\n\t\t\tid: \"hello_world\" + \"_de\",\n\t\t\tlocale: \"de\",\n\t\t\tselectors: [],\n\t\t\tvariants: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hello_world\" + \"_de_1\",\n\t\t\t\t\tmatches: [],\n\t\t\t\t\tmessageId: \"hello_world\" + \"_de\",\n\t\t\t\t\tpattern: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: \"Hallo Welt!\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n};\n\ntest(\"fromMessageV1\", () => {\n\texpect(Value.Check(MessageV1, messageV1)).toBe(true);\n\tconst nestedBundle: unknown = fromMessageV1(messageV1);\n\n\texpect(nestedBundle).toEqual(bundle);\n});\n\ntest.todo(\"with variable references\", () => {});\n"]}
@@ -1,5 +1,3 @@
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]="32eef17c-b0b8-5d95-95c4-3b6339e01eb9")}catch(e){}}();
3
1
  import { Type } from "@sinclair/typebox";
4
2
  export const TextV1 = Type.Object({
5
3
  type: Type.Literal("Text"),
@@ -31,5 +29,4 @@ export const MessageV1 = Type.Object({
31
29
  selectors: Type.Array(ExpressionV1),
32
30
  variants: Type.Array(VariantV1),
33
31
  });
34
- //# sourceMappingURL=schemaV1.js.map
35
- //# debugId=32eef17c-b0b8-5d95-95c4-3b6339e01eb9
32
+ //# sourceMappingURL=schemaV1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"schemaV1.js","sources":["json-schema/old-v1-message/schemaV1.ts"],"sourceRoot":"/","sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\n/**\n * A (text) element that is translatable and rendered to the UI.\n */\nexport type TextV1 = Static<typeof TextV1>;\nexport const TextV1 = Type.Object({\n\ttype: Type.Literal(\"Text\"),\n\tvalue: Type.String(),\n});\n\nexport type VariableReferenceV1 = Static<typeof VariableReferenceV1>;\nexport const VariableReferenceV1 = Type.Object({\n\ttype: Type.Literal(\"VariableReference\"),\n\tname: Type.String(),\n});\n\n/**\n * An expression is a reference to a variable or a function.\n *\n * Think of expressions as elements that are rendered to a\n * text value during runtime.\n */\nexport type ExpressionV1 = Static<typeof ExpressionV1>;\nexport const ExpressionV1 = Type.Union([VariableReferenceV1]);\n\n// export type FunctionReference = {\n// \ttype: \"function\"\n// \tname: string\n// \toperand?: Text | VariableReference\n// \toptions?: Option[]\n// }\n\n/**\n * A pattern is a sequence of elements that comprise\n * a message that is rendered to the UI.\n */\nexport type PatternV1 = Static<typeof PatternV1>;\nexport const PatternV1 = Type.Array(Type.Union([TextV1, ExpressionV1]));\n\n/**\n * A variant contains a pattern that is rendered to the UI.\n */\nexport type VariantV1 = Static<typeof VariantV1>;\nexport const VariantV1 = Type.Object({\n\tlanguageTag: Type.String(),\n\t/**\n\t * The number of keys in each variant match MUST equal the number of expressions in the selectors.\n\t *\n\t * Inspired by: https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#pattern-selection\n\t */\n\t// a match can always only be string-based because a string is what is rendered to the UI\n\tmatch: Type.Array(Type.String()),\n\tpattern: PatternV1,\n});\n\nexport type MessageV1 = Static<typeof MessageV1>;\nexport const MessageV1 = Type.Object({\n\tid: Type.String(),\n\talias: Type.Record(Type.String(), Type.String()),\n\t/**\n\t * The order in which the selectors are placed determines the precedence of patterns.\n\t */\n\tselectors: Type.Array(ExpressionV1),\n\tvariants: Type.Array(VariantV1),\n});\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAMtD,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC1B,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACvC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC;AASH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAc9D,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAMxE,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE;IAC1B;;;;OAIG;IACH,yFAAyF;IACzF,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChC,OAAO,EAAE,SAAS;CAClB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAChD;;OAEG;IACH,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;IACnC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;CAC/B,CAAC,CAAC","debug_id":"32eef17c-b0b8-5d95-95c4-3b6339e01eb9"}
1
+ {"version":3,"file":"schemaV1.js","sourceRoot":"/","sources":["json-schema/old-v1-message/schemaV1.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAMtD,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC1B,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,mBAAmB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC9C,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,mBAAmB,CAAC;IACvC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC;AASH,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAAC,CAAC,CAAC;AAc9D,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAMxE,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,WAAW,EAAE,IAAI,CAAC,MAAM,EAAE;IAC1B;;;;OAIG;IACH,yFAAyF;IACzF,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC;IAChC,OAAO,EAAE,SAAS;CAClB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,SAAS,GAAG,IAAI,CAAC,MAAM,CAAC;IACpC,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;IACjB,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;IAChD;;OAEG;IACH,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC;IACnC,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC,SAAS,CAAC;CAC/B,CAAC,CAAC","sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\n/**\n * A (text) element that is translatable and rendered to the UI.\n */\nexport type TextV1 = Static<typeof TextV1>;\nexport const TextV1 = Type.Object({\n\ttype: Type.Literal(\"Text\"),\n\tvalue: Type.String(),\n});\n\nexport type VariableReferenceV1 = Static<typeof VariableReferenceV1>;\nexport const VariableReferenceV1 = Type.Object({\n\ttype: Type.Literal(\"VariableReference\"),\n\tname: Type.String(),\n});\n\n/**\n * An expression is a reference to a variable or a function.\n *\n * Think of expressions as elements that are rendered to a\n * text value during runtime.\n */\nexport type ExpressionV1 = Static<typeof ExpressionV1>;\nexport const ExpressionV1 = Type.Union([VariableReferenceV1]);\n\n// export type FunctionReference = {\n// \ttype: \"function\"\n// \tname: string\n// \toperand?: Text | VariableReference\n// \toptions?: Option[]\n// }\n\n/**\n * A pattern is a sequence of elements that comprise\n * a message that is rendered to the UI.\n */\nexport type PatternV1 = Static<typeof PatternV1>;\nexport const PatternV1 = Type.Array(Type.Union([TextV1, ExpressionV1]));\n\n/**\n * A variant contains a pattern that is rendered to the UI.\n */\nexport type VariantV1 = Static<typeof VariantV1>;\nexport const VariantV1 = Type.Object({\n\tlanguageTag: Type.String(),\n\t/**\n\t * The number of keys in each variant match MUST equal the number of expressions in the selectors.\n\t *\n\t * Inspired by: https://github.com/unicode-org/message-format-wg/blob/main/spec/formatting.md#pattern-selection\n\t */\n\t// a match can always only be string-based because a string is what is rendered to the UI\n\tmatch: Type.Array(Type.String()),\n\tpattern: PatternV1,\n});\n\nexport type MessageV1 = Static<typeof MessageV1>;\nexport const MessageV1 = Type.Object({\n\tid: Type.String(),\n\talias: Type.Record(Type.String(), Type.String()),\n\t/**\n\t * The order in which the selectors are placed determines the precedence of patterns.\n\t */\n\tselectors: Type.Array(ExpressionV1),\n\tvariants: Type.Array(VariantV1),\n});\n"]}
@@ -3,8 +3,6 @@
3
3
  *
4
4
  * @throws If the message cannot be represented in the v1 format
5
5
  */
6
-
7
- !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]="6cd368f0-2032-5124-8afa-4a9cc69a1451")}catch(e){}}();
8
6
  export function toMessageV1(bundle) {
9
7
  const variants = [];
10
8
  const selectorNames = new Set();
@@ -63,5 +61,4 @@ function toV1Pattern(pattern) {
63
61
  }
64
62
  });
65
63
  }
66
- //# sourceMappingURL=toMessageV1.js.map
67
- //# debugId=6cd368f0-2032-5124-8afa-4a9cc69a1451
64
+ //# sourceMappingURL=toMessageV1.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toMessageV1.js","sources":["json-schema/old-v1-message/toMessageV1.ts"],"sourceRoot":"/","sourcesContent":["import type { BundleNested } from \"../../database/schema.js\";\nimport type { Pattern } from \"../pattern.js\";\nimport type {\n\tExpressionV1,\n\tMessageV1,\n\tPatternV1,\n\tVariantV1,\n} from \"./schemaV1.js\";\n\n/**\n * Converts a BundleNested into a legacy format.\n *\n * @throws If the message cannot be represented in the v1 format\n */\nexport function toMessageV1(bundle: BundleNested): MessageV1 {\n\tconst variants: VariantV1[] = [];\n\tconst selectorNames = new Set<string>();\n\n\tfor (const message of bundle.messages) {\n\t\t// collect all selector names\n\t\tfor (const selector of message.selectors.map((s) => ({\n\t\t\ttype: \"variable-reference\",\n\t\t\tname: s.name,\n\t\t}))) {\n\t\t\tselectorNames.add(selector.name);\n\t\t}\n\n\t\t// collect all variants\n\t\tfor (const variant of message.variants) {\n\t\t\tvariants.push({\n\t\t\t\tlanguageTag: message.locale,\n\t\t\t\tmatch: [],\n\t\t\t\tpattern: toV1Pattern(variant.pattern),\n\t\t\t});\n\t\t}\n\t}\n\n\tconst selectors: ExpressionV1[] = [...selectorNames].map((name) => ({\n\t\ttype: \"VariableReference\",\n\t\tname,\n\t}));\n\n\treturn {\n\t\tid: bundle.id,\n\t\talias: {},\n\t\tvariants,\n\t\tselectors,\n\t};\n}\n\n/**\n * @throws If the pattern cannot be represented in the v1 format\n */\nfunction toV1Pattern(pattern: Pattern): PatternV1 {\n\treturn pattern.map((element) => {\n\t\tswitch (element.type) {\n\t\t\tcase \"text\": {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"Text\",\n\t\t\t\t\tvalue: element.value,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"expression\": {\n\t\t\t\tif (element.arg.type === \"variable-reference\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"VariableReference\",\n\t\t\t\t\t\tname: element.arg.name,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Unsupported expression argument type`);\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthrow new Error(`Unsupported pattern element type`);\n\t\t\t}\n\t\t}\n\t});\n}\n"],"names":[],"mappings":"AASA;;;;GAIG;;;AACH,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC/C,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,6BAA6B;QAC7B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;SACZ,CAAC,CAAC,EAAE,CAAC;YACL,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,uBAAuB;QACvB,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC;gBACb,WAAW,EAAE,OAAO,CAAC,MAAM;gBAC3B,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;aACrC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,MAAM,SAAS,GAAmB,CAAC,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,EAAE,mBAAmB;QACzB,IAAI;KACJ,CAAC,CAAC,CAAC;IAEJ,OAAO;QACN,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,EAAE;QACT,QAAQ;QACR,SAAS;KACT,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,OAAgB;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACb,OAAO;oBACN,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,OAAO,CAAC,KAAK;iBACpB,CAAC;YACH,CAAC;YAED,KAAK,YAAY,CAAC,CAAC,CAAC;gBACnB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;oBAC/C,OAAO;wBACN,IAAI,EAAE,mBAAmB;wBACzB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;qBACtB,CAAC;gBACH,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACzD,CAAC;YAED,OAAO,CAAC,CAAC,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACrD,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC","debug_id":"6cd368f0-2032-5124-8afa-4a9cc69a1451"}
1
+ {"version":3,"file":"toMessageV1.js","sourceRoot":"/","sources":["json-schema/old-v1-message/toMessageV1.ts"],"names":[],"mappings":"AASA;;;;GAIG;AACH,MAAM,UAAU,WAAW,CAAC,MAAoB;IAC/C,MAAM,QAAQ,GAAgB,EAAE,CAAC;IACjC,MAAM,aAAa,GAAG,IAAI,GAAG,EAAU,CAAC;IAExC,KAAK,MAAM,OAAO,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACvC,6BAA6B;QAC7B,KAAK,MAAM,QAAQ,IAAI,OAAO,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACpD,IAAI,EAAE,oBAAoB;YAC1B,IAAI,EAAE,CAAC,CAAC,IAAI;SACZ,CAAC,CAAC,EAAE,CAAC;YACL,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAClC,CAAC;QAED,uBAAuB;QACvB,KAAK,MAAM,OAAO,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;YACxC,QAAQ,CAAC,IAAI,CAAC;gBACb,WAAW,EAAE,OAAO,CAAC,MAAM;gBAC3B,KAAK,EAAE,EAAE;gBACT,OAAO,EAAE,WAAW,CAAC,OAAO,CAAC,OAAO,CAAC;aACrC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC;IAED,MAAM,SAAS,GAAmB,CAAC,GAAG,aAAa,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACnE,IAAI,EAAE,mBAAmB;QACzB,IAAI;KACJ,CAAC,CAAC,CAAC;IAEJ,OAAO;QACN,EAAE,EAAE,MAAM,CAAC,EAAE;QACb,KAAK,EAAE,EAAE;QACT,QAAQ;QACR,SAAS;KACT,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,WAAW,CAAC,OAAgB;IACpC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;QAC9B,QAAQ,OAAO,CAAC,IAAI,EAAE,CAAC;YACtB,KAAK,MAAM,CAAC,CAAC,CAAC;gBACb,OAAO;oBACN,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,OAAO,CAAC,KAAK;iBACpB,CAAC;YACH,CAAC;YAED,KAAK,YAAY,CAAC,CAAC,CAAC;gBACnB,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,KAAK,oBAAoB,EAAE,CAAC;oBAC/C,OAAO;wBACN,IAAI,EAAE,mBAAmB;wBACzB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;qBACtB,CAAC;gBACH,CAAC;gBACD,MAAM,IAAI,KAAK,CAAC,sCAAsC,CAAC,CAAC;YACzD,CAAC;YAED,OAAO,CAAC,CAAC,CAAC;gBACT,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;YACrD,CAAC;QACF,CAAC;IACF,CAAC,CAAC,CAAC;AACJ,CAAC","sourcesContent":["import type { BundleNested } from \"../../database/schema.js\";\nimport type { Pattern } from \"../pattern.js\";\nimport type {\n\tExpressionV1,\n\tMessageV1,\n\tPatternV1,\n\tVariantV1,\n} from \"./schemaV1.js\";\n\n/**\n * Converts a BundleNested into a legacy format.\n *\n * @throws If the message cannot be represented in the v1 format\n */\nexport function toMessageV1(bundle: BundleNested): MessageV1 {\n\tconst variants: VariantV1[] = [];\n\tconst selectorNames = new Set<string>();\n\n\tfor (const message of bundle.messages) {\n\t\t// collect all selector names\n\t\tfor (const selector of message.selectors.map((s) => ({\n\t\t\ttype: \"variable-reference\",\n\t\t\tname: s.name,\n\t\t}))) {\n\t\t\tselectorNames.add(selector.name);\n\t\t}\n\n\t\t// collect all variants\n\t\tfor (const variant of message.variants) {\n\t\t\tvariants.push({\n\t\t\t\tlanguageTag: message.locale,\n\t\t\t\tmatch: [],\n\t\t\t\tpattern: toV1Pattern(variant.pattern),\n\t\t\t});\n\t\t}\n\t}\n\n\tconst selectors: ExpressionV1[] = [...selectorNames].map((name) => ({\n\t\ttype: \"VariableReference\",\n\t\tname,\n\t}));\n\n\treturn {\n\t\tid: bundle.id,\n\t\talias: {},\n\t\tvariants,\n\t\tselectors,\n\t};\n}\n\n/**\n * @throws If the pattern cannot be represented in the v1 format\n */\nfunction toV1Pattern(pattern: Pattern): PatternV1 {\n\treturn pattern.map((element) => {\n\t\tswitch (element.type) {\n\t\t\tcase \"text\": {\n\t\t\t\treturn {\n\t\t\t\t\ttype: \"Text\",\n\t\t\t\t\tvalue: element.value,\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tcase \"expression\": {\n\t\t\t\tif (element.arg.type === \"variable-reference\") {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttype: \"VariableReference\",\n\t\t\t\t\t\tname: element.arg.name,\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t\tthrow new Error(`Unsupported expression argument type`);\n\t\t\t}\n\n\t\t\tdefault: {\n\t\t\t\tthrow new Error(`Unsupported pattern element type`);\n\t\t\t}\n\t\t}\n\t});\n}\n"]}
@@ -1,5 +1,3 @@
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]="97d820e6-661c-53cd-9da4-388f6ef31af5")}catch(e){}}();
3
1
  import { test, expect } from "vitest";
4
2
  import { toMessageV1 } from "./toMessageV1.js";
5
3
  import { Value } from "@sinclair/typebox/value";
@@ -81,5 +79,4 @@ const bundle = {
81
79
  },
82
80
  ],
83
81
  };
84
- //# sourceMappingURL=toMessageV1.test.js.map
85
- //# debugId=97d820e6-661c-53cd-9da4-388f6ef31af5
82
+ //# sourceMappingURL=toMessageV1.test.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toMessageV1.test.js","sources":["json-schema/old-v1-message/toMessageV1.test.ts"],"sourceRoot":"/","sourcesContent":["import { test, expect } from \"vitest\";\nimport { toMessageV1 } from \"./toMessageV1.js\";\nimport { Value } from \"@sinclair/typebox/value\";\nimport { MessageV1 } from \"./schemaV1.js\";\nimport type { BundleNested } from \"../../database/schema.js\";\n\ntest(\"toMessageV1\", () => {\n\tconst message: unknown = toMessageV1(bundle);\n\texpect(Value.Check(MessageV1, message)).toBe(true);\n\n\texpect(message).toStrictEqual(messageV1);\n});\n\ntest.todo(\"with variable references\", () => {});\n\nconst messageV1: MessageV1 = {\n\tid: \"hello_world\",\n\talias: {},\n\tvariants: [\n\t\t{\n\t\t\tlanguageTag: \"en\",\n\t\t\tmatch: [],\n\t\t\tpattern: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"Text\",\n\t\t\t\t\tvalue: \"Hello World!\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tlanguageTag: \"de\",\n\t\t\tmatch: [],\n\t\t\tpattern: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"Text\",\n\t\t\t\t\tvalue: \"Hallo Welt!\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n\tselectors: [],\n};\n\nconst bundle: BundleNested = {\n\tid: \"hello_world\",\n\tdeclarations: [],\n\tmessages: [\n\t\t{\n\t\t\tbundleId: \"hello_world\",\n\t\t\tid: \"hello_world\" + \"_en\",\n\t\t\tlocale: \"en\",\n\t\t\tselectors: [],\n\t\t\tvariants: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hello_world\" + \"_en_1\",\n\t\t\t\t\tmatches: [],\n\t\t\t\t\tmessageId: \"hello_world\" + \"_en\",\n\t\t\t\t\tpattern: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: \"Hello World!\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tbundleId: \"hello_world\",\n\t\t\tid: \"hello_world\" + \"_de\",\n\t\t\tlocale: \"de\",\n\t\t\tselectors: [],\n\t\t\tvariants: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hello_world\" + \"_de_1\",\n\t\t\t\t\tmatches: [],\n\t\t\t\t\tmessageId: \"hello_world\" + \"_de\",\n\t\t\t\t\tpattern: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: \"Hallo Welt!\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n};\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;IACxB,MAAM,OAAO,GAAY,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAEhD,MAAM,SAAS,GAAc;IAC5B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE;QACT;YACC,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,cAAc;iBACrB;aACD;SACD;QACD;YACC,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,aAAa;iBACpB;aACD;SACD;KACD;IACD,SAAS,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,MAAM,GAAiB;IAC5B,EAAE,EAAE,aAAa;IACjB,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE;QACT;YACC,QAAQ,EAAE,aAAa;YACvB,EAAE,EAAE,aAAa,GAAG,KAAK;YACzB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,aAAa,GAAG,OAAO;oBAC3B,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,aAAa,GAAG,KAAK;oBAChC,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,cAAc;yBACrB;qBACD;iBACD;aACD;SACD;QACD;YACC,QAAQ,EAAE,aAAa;YACvB,EAAE,EAAE,aAAa,GAAG,KAAK;YACzB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,aAAa,GAAG,OAAO;oBAC3B,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,aAAa,GAAG,KAAK;oBAChC,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,aAAa;yBACpB;qBACD;iBACD;aACD;SACD;KACD;CACD,CAAC","debug_id":"97d820e6-661c-53cd-9da4-388f6ef31af5"}
1
+ {"version":3,"file":"toMessageV1.test.js","sourceRoot":"/","sources":["json-schema/old-v1-message/toMessageV1.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AACtC,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,KAAK,EAAE,MAAM,yBAAyB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,eAAe,CAAC;AAG1C,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE;IACxB,MAAM,OAAO,GAAY,WAAW,CAAC,MAAM,CAAC,CAAC;IAC7C,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAEnD,MAAM,CAAC,OAAO,CAAC,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;AAC1C,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,IAAI,CAAC,0BAA0B,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAEhD,MAAM,SAAS,GAAc;IAC5B,EAAE,EAAE,aAAa;IACjB,KAAK,EAAE,EAAE;IACT,QAAQ,EAAE;QACT;YACC,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,cAAc;iBACrB;aACD;SACD;QACD;YACC,WAAW,EAAE,IAAI;YACjB,KAAK,EAAE,EAAE;YACT,OAAO,EAAE;gBACR;oBACC,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,aAAa;iBACpB;aACD;SACD;KACD;IACD,SAAS,EAAE,EAAE;CACb,CAAC;AAEF,MAAM,MAAM,GAAiB;IAC5B,EAAE,EAAE,aAAa;IACjB,YAAY,EAAE,EAAE;IAChB,QAAQ,EAAE;QACT;YACC,QAAQ,EAAE,aAAa;YACvB,EAAE,EAAE,aAAa,GAAG,KAAK;YACzB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,aAAa,GAAG,OAAO;oBAC3B,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,aAAa,GAAG,KAAK;oBAChC,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,cAAc;yBACrB;qBACD;iBACD;aACD;SACD;QACD;YACC,QAAQ,EAAE,aAAa;YACvB,EAAE,EAAE,aAAa,GAAG,KAAK;YACzB,MAAM,EAAE,IAAI;YACZ,SAAS,EAAE,EAAE;YACb,QAAQ,EAAE;gBACT;oBACC,EAAE,EAAE,aAAa,GAAG,OAAO;oBAC3B,OAAO,EAAE,EAAE;oBACX,SAAS,EAAE,aAAa,GAAG,KAAK;oBAChC,OAAO,EAAE;wBACR;4BACC,IAAI,EAAE,MAAM;4BACZ,KAAK,EAAE,aAAa;yBACpB;qBACD;iBACD;aACD;SACD;KACD;CACD,CAAC","sourcesContent":["import { test, expect } from \"vitest\";\nimport { toMessageV1 } from \"./toMessageV1.js\";\nimport { Value } from \"@sinclair/typebox/value\";\nimport { MessageV1 } from \"./schemaV1.js\";\nimport type { BundleNested } from \"../../database/schema.js\";\n\ntest(\"toMessageV1\", () => {\n\tconst message: unknown = toMessageV1(bundle);\n\texpect(Value.Check(MessageV1, message)).toBe(true);\n\n\texpect(message).toStrictEqual(messageV1);\n});\n\ntest.todo(\"with variable references\", () => {});\n\nconst messageV1: MessageV1 = {\n\tid: \"hello_world\",\n\talias: {},\n\tvariants: [\n\t\t{\n\t\t\tlanguageTag: \"en\",\n\t\t\tmatch: [],\n\t\t\tpattern: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"Text\",\n\t\t\t\t\tvalue: \"Hello World!\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tlanguageTag: \"de\",\n\t\t\tmatch: [],\n\t\t\tpattern: [\n\t\t\t\t{\n\t\t\t\t\ttype: \"Text\",\n\t\t\t\t\tvalue: \"Hallo Welt!\",\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n\tselectors: [],\n};\n\nconst bundle: BundleNested = {\n\tid: \"hello_world\",\n\tdeclarations: [],\n\tmessages: [\n\t\t{\n\t\t\tbundleId: \"hello_world\",\n\t\t\tid: \"hello_world\" + \"_en\",\n\t\t\tlocale: \"en\",\n\t\t\tselectors: [],\n\t\t\tvariants: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hello_world\" + \"_en_1\",\n\t\t\t\t\tmatches: [],\n\t\t\t\t\tmessageId: \"hello_world\" + \"_en\",\n\t\t\t\t\tpattern: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: \"Hello World!\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t\t{\n\t\t\tbundleId: \"hello_world\",\n\t\t\tid: \"hello_world\" + \"_de\",\n\t\t\tlocale: \"de\",\n\t\t\tselectors: [],\n\t\t\tvariants: [\n\t\t\t\t{\n\t\t\t\t\tid: \"hello_world\" + \"_de_1\",\n\t\t\t\t\tmatches: [],\n\t\t\t\t\tmessageId: \"hello_world\" + \"_de\",\n\t\t\t\t\tpattern: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\ttype: \"text\",\n\t\t\t\t\t\t\tvalue: \"Hallo Welt!\",\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t},\n\t\t\t],\n\t\t},\n\t],\n};\n"]}
@@ -1,5 +1,3 @@
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]="6542d5f0-d71b-57d4-86b6-b8ff2c81f2db")}catch(e){}}();
3
1
  import { Type } from "@sinclair/typebox";
4
2
  export const VariableReference = Type.Object({
5
3
  type: Type.Literal("variable-reference"),
@@ -39,5 +37,4 @@ export const InputVariable = Type.Object({
39
37
  });
40
38
  export const Declaration = Type.Union([InputVariable, LocalVariable]);
41
39
  export const Pattern = Type.Array(Type.Union([Text, Expression]));
42
- //# sourceMappingURL=pattern.js.map
43
- //# debugId=6542d5f0-d71b-57d4-86b6-b8ff2c81f2db
40
+ //# sourceMappingURL=pattern.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"pattern.js","sources":["json-schema/pattern.ts"],"sourceRoot":"/","sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport type VariableReference = Static<typeof VariableReference>;\nexport const VariableReference = Type.Object({\n\ttype: Type.Literal(\"variable-reference\"),\n\tname: Type.String(),\n});\n\nexport type Literal = Static<typeof Literal>;\nexport const Literal = Type.Object({\n\ttype: Type.Literal(\"literal\"),\n\tvalue: Type.String(),\n});\n\nexport type Option = Static<typeof Option>;\nexport const Option = Type.Object({\n\tname: Type.String(),\n\tvalue: Type.Union([Literal, VariableReference]),\n});\n\nexport type FunctionReference = Static<typeof FunctionReference>;\nexport const FunctionReference = Type.Object({\n\ttype: Type.Literal(\"function-reference\"),\n\tname: Type.String(),\n\toptions: Type.Array(Option),\n});\n\nexport type Expression = Static<typeof Expression>;\nexport const Expression = Type.Object({\n\ttype: Type.Literal(\"expression\"),\n\targ: Type.Union([VariableReference, Literal]),\n\tannotation: Type.Optional(FunctionReference),\n});\n\nexport type Text = Static<typeof Text>;\nexport const Text = Type.Object({\n\ttype: Type.Literal(\"text\"),\n\tvalue: Type.String(),\n});\n\nexport type LocalVariable = Static<typeof VariableReference>;\nexport const LocalVariable = Type.Object({\n\ttype: Type.Literal(\"local-variable\"),\n\tname: Type.String(),\n\tvalue: Expression,\n});\n\nexport type InputVariable = Static<typeof InputVariable>;\nexport const InputVariable = Type.Object({\n\ttype: Type.Literal(\"input-variable\"),\n\tname: Type.String(),\n\tannotation: Type.Optional(FunctionReference),\n});\n\nexport type Declaration = Static<typeof Declaration>;\nexport const Declaration = Type.Union([InputVariable, LocalVariable]);\n\nexport type Pattern = Static<typeof Pattern>;\nexport const Pattern = Type.Array(Type.Union([Text, Expression]));\n"],"names":[],"mappings":";;AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAGtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACxC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAC7B,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;CAC/C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACxC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;CAC3B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IAChC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAC7C,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CAC5C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC1B,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACpC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,UAAU;CACjB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACpC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;IACnB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CAC5C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;AAGtE,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC","debug_id":"6542d5f0-d71b-57d4-86b6-b8ff2c81f2db"}
1
+ {"version":3,"file":"pattern.js","sourceRoot":"/","sources":["json-schema/pattern.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAe,MAAM,mBAAmB,CAAC;AAGtD,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACxC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;CACnB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC;IAClC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;IAC7B,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,iBAAiB,CAAC,CAAC;CAC/C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,iBAAiB,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5C,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,oBAAoB,CAAC;IACxC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;IACnB,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC;CAC3B,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC,MAAM,CAAC;IACrC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;IAChC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;IAC7C,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CAC5C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/B,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC;IAC1B,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;CACpB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACpC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;IACnB,KAAK,EAAE,UAAU;CACjB,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAC,MAAM,CAAC;IACxC,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,CAAC;IACpC,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE;IACnB,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,iBAAiB,CAAC;CAC5C,CAAC,CAAC;AAGH,MAAM,CAAC,MAAM,WAAW,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,aAAa,EAAE,aAAa,CAAC,CAAC,CAAC;AAGtE,MAAM,CAAC,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,CAAC","sourcesContent":["import { Type, type Static } from \"@sinclair/typebox\";\n\nexport type VariableReference = Static<typeof VariableReference>;\nexport const VariableReference = Type.Object({\n\ttype: Type.Literal(\"variable-reference\"),\n\tname: Type.String(),\n});\n\nexport type Literal = Static<typeof Literal>;\nexport const Literal = Type.Object({\n\ttype: Type.Literal(\"literal\"),\n\tvalue: Type.String(),\n});\n\nexport type Option = Static<typeof Option>;\nexport const Option = Type.Object({\n\tname: Type.String(),\n\tvalue: Type.Union([Literal, VariableReference]),\n});\n\nexport type FunctionReference = Static<typeof FunctionReference>;\nexport const FunctionReference = Type.Object({\n\ttype: Type.Literal(\"function-reference\"),\n\tname: Type.String(),\n\toptions: Type.Array(Option),\n});\n\nexport type Expression = Static<typeof Expression>;\nexport const Expression = Type.Object({\n\ttype: Type.Literal(\"expression\"),\n\targ: Type.Union([VariableReference, Literal]),\n\tannotation: Type.Optional(FunctionReference),\n});\n\nexport type Text = Static<typeof Text>;\nexport const Text = Type.Object({\n\ttype: Type.Literal(\"text\"),\n\tvalue: Type.String(),\n});\n\nexport type LocalVariable = Static<typeof VariableReference>;\nexport const LocalVariable = Type.Object({\n\ttype: Type.Literal(\"local-variable\"),\n\tname: Type.String(),\n\tvalue: Expression,\n});\n\nexport type InputVariable = Static<typeof InputVariable>;\nexport const InputVariable = Type.Object({\n\ttype: Type.Literal(\"input-variable\"),\n\tname: Type.String(),\n\tannotation: Type.Optional(FunctionReference),\n});\n\nexport type Declaration = Static<typeof Declaration>;\nexport const Declaration = Type.Union([InputVariable, LocalVariable]);\n\nexport type Pattern = Static<typeof Pattern>;\nexport const Pattern = Type.Array(Type.Union([Text, Expression]));\n"]}
@@ -1,5 +1,3 @@
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]="8d3ca569-3c10-501d-8ae0-6d6ba486ecf5")}catch(e){}}();
3
1
  import { Type } from "@sinclair/typebox";
4
2
  const SDKSettings = Type.Object({
5
3
  // TODO SDK-v2 SETTINGS do we need to generate a settings v2 schema?
@@ -69,5 +67,4 @@ const SDKSettings = Type.Object({
69
67
  */
70
68
  });
71
69
  export const ProjectSettings = SDKSettings;
72
- //# sourceMappingURL=settings.js.map
73
- //# debugId=8d3ca569-3c10-501d-8ae0-6d6ba486ecf5
70
+ //# sourceMappingURL=settings.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"settings.js","sources":["json-schema/settings.ts"],"sourceRoot":"/","sourcesContent":["import { type Static, Type } from \"@sinclair/typebox\";\n\nconst SDKSettings = Type.Object({\n\t// TODO SDK-v2 SETTINGS do we need to generate a settings v2 schema?\n\t$schema: Type.Optional(\n\t\tType.Literal(\"https://inlang.com/schema/project-settings\")\n\t),\n\tbaseLocale: Type.String({\n\t\ttitle: \"Base locale\",\n\t\tdescription:\n\t\t\t\"The base locale of the project. We recommend BCP-47 language tags.\",\n\t}),\n\tlocales: Type.Array(Type.String(), {\n\t\tuniqueItems: true,\n\t\ttitle: \"Project Locales\",\n\t\tdescription:\n\t\t\t\"Set the locales that are available in your project. All locales needs to be a valid BCP-47 language tag. Needs to include the base locale tag.\",\n\t}),\n\t// exits for backwards compatibility\n\t// remove in SDK-v3\n\tsourceLanguageTag: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Use baseLocale instead if all your inlang apps that you are using are on the inlang SDK V2. Otherwise, leave this property in.\",\n\t\t\tdeprecated: true,\n\t\t})\n\t),\n\t// exits for backwards compatibility\n\t// remove in SDK-v3\n\tlanguageTags: Type.Optional(\n\t\tType.Array(Type.String(), {\n\t\t\tuniqueItems: true,\n\t\t\tdeprecated: true,\n\t\t\tdescription:\n\t\t\t\t\"Use baseLocale instead if all your inlang apps that you are using are on the inlang SDK V2. Otherwise, leave this property in.\",\n\t\t})\n\t),\n\t/**\n\t * The modules to load.\n\t *\n\t * @example\n\t * modules: [\n\t * \t \"https://cdn.jsdelivr.net/npm/@inlang/plugin-i18next@3/dist/index.js\",\n\t * \t \"https://cdn.jsdelivr.net/npm/@inlang/plugin-csv@1/dist/index.js\",\n\t * ]\n\t */\n\tmodules: Type.Optional(\n\t\tType.Array(\n\t\t\tType.Intersect([\n\t\t\t\tType.String({\n\t\t\t\t\tdescription: \"The module must be a valid URI according to RFC 3986.\",\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t\"(?:[A-Za-z][A-Za-z0-9+.-]*:/{2})?(?:(?:[A-Za-z0-9-._~]|%[A-Fa-f0-9]{2})+(?::([A-Za-z0-9-._~]?|[%][A-Fa-f0-9]{2})+)?@)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\\\.){1,126}[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?::[0-9]+)?(?:/(?:[A-Za-z0-9-._~]|%[A-Fa-f0-9]{2})*)*(?:\\\\?(?:[A-Za-z0-9-._~]+(?:=(?:[A-Za-z0-9-._~+]|%[A-Fa-f0-9]{2})+)?)(?:&|;[A-Za-z0-9-._~]+(?:=(?:[A-Za-z0-9-._~+]|%[A-Fa-f0-9]{2})+)?)*)?\",\n\t\t\t\t}),\n\t\t\t\tType.String({\n\t\t\t\t\tdescription: \"The module must end with `.js`.\",\n\t\t\t\t\tpattern: \".*\\\\.js$\",\n\t\t\t\t}),\n\t\t\t]),\n\t\t\t{\n\t\t\t\tuniqueItems: true,\n\t\t\t\tdescription:\n\t\t\t\t\t\"The modules to load. Must be a valid URI but can be relative.\",\n\t\t\t\texamples: [\n\t\t\t\t\t\"https://cdn.jsdelivr.net/npm/@inlang/plugin-i18next@3/dist/index.js\",\n\t\t\t\t\t\"https://cdn.jsdelivr.net/npm/@inlang/plugin-csv@1/dist/index.js\",\n\t\t\t\t\t\"./local-testing-plugin.js\",\n\t\t\t\t],\n\t\t\t}\n\t\t)\n\t),\n\ttelemetry: Type.Optional(\n\t\tType.Union(\n\t\t\t[\n\t\t\t\tType.Literal(\"off\", {\n\t\t\t\t\tdescription: \"No telemetry events \",\n\t\t\t\t}),\n\t\t\t],\n\t\t\t{ description: \"If not set, defaults to all\" }\n\t\t)\n\t),\n\texperimental: Type.Optional(\n\t\tType.Record(Type.String(), Type.Literal(true), {\n\t\t\ttitle: \"Experimental settings\",\n\t\t\tdescription:\n\t\t\t\t\"Experimental settings that are used for product development.\",\n\t\t})\n\t),\n\t/**\n\t * plugin.*: JSONObject\n\t *\n\t * The plugin settings are validated when importing plugins\n\t */\n});\n\nexport type ProjectSettings = Omit<\n\tStatic<typeof ProjectSettings>,\n\t\"languageTags\" | \"sourceLanguageTag\"\n> & {\n\t/** @deprecated Use `baseLocale` */\n\tsourceLanguageTag?: string;\n\t/** @deprecated Use `locales` */\n\tlanguageTags?: string[];\n\t/** @deprecated This will soon be replaced by `Lix Validation Rules` */\n\tmessageLintRuleLevels?: Record<string, \"error\" | \"warning\">;\n} & Record<string, any>;\nexport const ProjectSettings = SDKSettings;\n"],"names":[],"mappings":";;AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/B,oEAAoE;IACpE,OAAO,EAAE,IAAI,CAAC,QAAQ,CACrB,IAAI,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAC1D;IACD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;QACvB,KAAK,EAAE,aAAa;QACpB,WAAW,EACV,oEAAoE;KACrE,CAAC;IACF,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;QAClC,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACV,gJAAgJ;KACjJ,CAAC;IACF,oCAAoC;IACpC,mBAAmB;IACnB,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAC/B,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EACV,gIAAgI;QACjI,UAAU,EAAE,IAAI;KAChB,CAAC,CACF;IACD,oCAAoC;IACpC,mBAAmB;IACnB,YAAY,EAAE,IAAI,CAAC,QAAQ,CAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;QACzB,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,WAAW,EACV,gIAAgI;KACjI,CAAC,CACF;IACD;;;;;;;;OAQG;IACH,OAAO,EAAE,IAAI,CAAC,QAAQ,CACrB,IAAI,CAAC,KAAK,CACT,IAAI,CAAC,SAAS,CAAC;QACd,IAAI,CAAC,MAAM,CAAC;YACX,WAAW,EAAE,uDAAuD;YACpE,OAAO,EACN,sZAAsZ;SACvZ,CAAC;QACF,IAAI,CAAC,MAAM,CAAC;YACX,WAAW,EAAE,iCAAiC;YAC9C,OAAO,EAAE,UAAU;SACnB,CAAC;KACF,CAAC,EACF;QACC,WAAW,EAAE,IAAI;QACjB,WAAW,EACV,+DAA+D;QAChE,QAAQ,EAAE;YACT,qEAAqE;YACrE,iEAAiE;YACjE,2BAA2B;SAC3B;KACD,CACD,CACD;IACD,SAAS,EAAE,IAAI,CAAC,QAAQ,CACvB,IAAI,CAAC,KAAK,CACT;QACC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;YACnB,WAAW,EAAE,sBAAsB;SACnC,CAAC;KACF,EACD,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAC9C,CACD;IACD,YAAY,EAAE,IAAI,CAAC,QAAQ,CAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC9C,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACV,8DAA8D;KAC/D,CAAC,CACF;IACD;;;;OAIG;CACH,CAAC,CAAC;AAaH,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC","debug_id":"8d3ca569-3c10-501d-8ae0-6d6ba486ecf5"}
1
+ {"version":3,"file":"settings.js","sourceRoot":"/","sources":["json-schema/settings.ts"],"names":[],"mappings":"AAAA,OAAO,EAAe,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAEtD,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;IAC/B,oEAAoE;IACpE,OAAO,EAAE,IAAI,CAAC,QAAQ,CACrB,IAAI,CAAC,OAAO,CAAC,4CAA4C,CAAC,CAC1D;IACD,UAAU,EAAE,IAAI,CAAC,MAAM,CAAC;QACvB,KAAK,EAAE,aAAa;QACpB,WAAW,EACV,oEAAoE;KACrE,CAAC;IACF,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;QAClC,WAAW,EAAE,IAAI;QACjB,KAAK,EAAE,iBAAiB;QACxB,WAAW,EACV,gJAAgJ;KACjJ,CAAC;IACF,oCAAoC;IACpC,mBAAmB;IACnB,iBAAiB,EAAE,IAAI,CAAC,QAAQ,CAC/B,IAAI,CAAC,MAAM,CAAC;QACX,WAAW,EACV,gIAAgI;QACjI,UAAU,EAAE,IAAI;KAChB,CAAC,CACF;IACD,oCAAoC;IACpC,mBAAmB;IACnB,YAAY,EAAE,IAAI,CAAC,QAAQ,CAC1B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE;QACzB,WAAW,EAAE,IAAI;QACjB,UAAU,EAAE,IAAI;QAChB,WAAW,EACV,gIAAgI;KACjI,CAAC,CACF;IACD;;;;;;;;OAQG;IACH,OAAO,EAAE,IAAI,CAAC,QAAQ,CACrB,IAAI,CAAC,KAAK,CACT,IAAI,CAAC,SAAS,CAAC;QACd,IAAI,CAAC,MAAM,CAAC;YACX,WAAW,EAAE,uDAAuD;YACpE,OAAO,EACN,sZAAsZ;SACvZ,CAAC;QACF,IAAI,CAAC,MAAM,CAAC;YACX,WAAW,EAAE,iCAAiC;YAC9C,OAAO,EAAE,UAAU;SACnB,CAAC;KACF,CAAC,EACF;QACC,WAAW,EAAE,IAAI;QACjB,WAAW,EACV,+DAA+D;QAChE,QAAQ,EAAE;YACT,qEAAqE;YACrE,iEAAiE;YACjE,2BAA2B;SAC3B;KACD,CACD,CACD;IACD,SAAS,EAAE,IAAI,CAAC,QAAQ,CACvB,IAAI,CAAC,KAAK,CACT;QACC,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE;YACnB,WAAW,EAAE,sBAAsB;SACnC,CAAC;KACF,EACD,EAAE,WAAW,EAAE,6BAA6B,EAAE,CAC9C,CACD;IACD,YAAY,EAAE,IAAI,CAAC,QAAQ,CAC1B,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE;QAC9C,KAAK,EAAE,uBAAuB;QAC9B,WAAW,EACV,8DAA8D;KAC/D,CAAC,CACF;IACD;;;;OAIG;CACH,CAAC,CAAC;AAaH,MAAM,CAAC,MAAM,eAAe,GAAG,WAAW,CAAC","sourcesContent":["import { type Static, Type } from \"@sinclair/typebox\";\n\nconst SDKSettings = Type.Object({\n\t// TODO SDK-v2 SETTINGS do we need to generate a settings v2 schema?\n\t$schema: Type.Optional(\n\t\tType.Literal(\"https://inlang.com/schema/project-settings\")\n\t),\n\tbaseLocale: Type.String({\n\t\ttitle: \"Base locale\",\n\t\tdescription:\n\t\t\t\"The base locale of the project. We recommend BCP-47 language tags.\",\n\t}),\n\tlocales: Type.Array(Type.String(), {\n\t\tuniqueItems: true,\n\t\ttitle: \"Project Locales\",\n\t\tdescription:\n\t\t\t\"Set the locales that are available in your project. All locales needs to be a valid BCP-47 language tag. Needs to include the base locale tag.\",\n\t}),\n\t// exits for backwards compatibility\n\t// remove in SDK-v3\n\tsourceLanguageTag: Type.Optional(\n\t\tType.String({\n\t\t\tdescription:\n\t\t\t\t\"Use baseLocale instead if all your inlang apps that you are using are on the inlang SDK V2. Otherwise, leave this property in.\",\n\t\t\tdeprecated: true,\n\t\t})\n\t),\n\t// exits for backwards compatibility\n\t// remove in SDK-v3\n\tlanguageTags: Type.Optional(\n\t\tType.Array(Type.String(), {\n\t\t\tuniqueItems: true,\n\t\t\tdeprecated: true,\n\t\t\tdescription:\n\t\t\t\t\"Use baseLocale instead if all your inlang apps that you are using are on the inlang SDK V2. Otherwise, leave this property in.\",\n\t\t})\n\t),\n\t/**\n\t * The modules to load.\n\t *\n\t * @example\n\t * modules: [\n\t * \t \"https://cdn.jsdelivr.net/npm/@inlang/plugin-i18next@3/dist/index.js\",\n\t * \t \"https://cdn.jsdelivr.net/npm/@inlang/plugin-csv@1/dist/index.js\",\n\t * ]\n\t */\n\tmodules: Type.Optional(\n\t\tType.Array(\n\t\t\tType.Intersect([\n\t\t\t\tType.String({\n\t\t\t\t\tdescription: \"The module must be a valid URI according to RFC 3986.\",\n\t\t\t\t\tpattern:\n\t\t\t\t\t\t\"(?:[A-Za-z][A-Za-z0-9+.-]*:/{2})?(?:(?:[A-Za-z0-9-._~]|%[A-Fa-f0-9]{2})+(?::([A-Za-z0-9-._~]?|[%][A-Fa-f0-9]{2})+)?@)?(?:[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?\\\\.){1,126}[A-Za-z0-9](?:[A-Za-z0-9-]*[A-Za-z0-9])?(?::[0-9]+)?(?:/(?:[A-Za-z0-9-._~]|%[A-Fa-f0-9]{2})*)*(?:\\\\?(?:[A-Za-z0-9-._~]+(?:=(?:[A-Za-z0-9-._~+]|%[A-Fa-f0-9]{2})+)?)(?:&|;[A-Za-z0-9-._~]+(?:=(?:[A-Za-z0-9-._~+]|%[A-Fa-f0-9]{2})+)?)*)?\",\n\t\t\t\t}),\n\t\t\t\tType.String({\n\t\t\t\t\tdescription: \"The module must end with `.js`.\",\n\t\t\t\t\tpattern: \".*\\\\.js$\",\n\t\t\t\t}),\n\t\t\t]),\n\t\t\t{\n\t\t\t\tuniqueItems: true,\n\t\t\t\tdescription:\n\t\t\t\t\t\"The modules to load. Must be a valid URI but can be relative.\",\n\t\t\t\texamples: [\n\t\t\t\t\t\"https://cdn.jsdelivr.net/npm/@inlang/plugin-i18next@3/dist/index.js\",\n\t\t\t\t\t\"https://cdn.jsdelivr.net/npm/@inlang/plugin-csv@1/dist/index.js\",\n\t\t\t\t\t\"./local-testing-plugin.js\",\n\t\t\t\t],\n\t\t\t}\n\t\t)\n\t),\n\ttelemetry: Type.Optional(\n\t\tType.Union(\n\t\t\t[\n\t\t\t\tType.Literal(\"off\", {\n\t\t\t\t\tdescription: \"No telemetry events \",\n\t\t\t\t}),\n\t\t\t],\n\t\t\t{ description: \"If not set, defaults to all\" }\n\t\t)\n\t),\n\texperimental: Type.Optional(\n\t\tType.Record(Type.String(), Type.Literal(true), {\n\t\t\ttitle: \"Experimental settings\",\n\t\t\tdescription:\n\t\t\t\t\"Experimental settings that are used for product development.\",\n\t\t})\n\t),\n\t/**\n\t * plugin.*: JSONObject\n\t *\n\t * The plugin settings are validated when importing plugins\n\t */\n});\n\nexport type ProjectSettings = Omit<\n\tStatic<typeof ProjectSettings>,\n\t\"languageTags\" | \"sourceLanguageTag\"\n> & {\n\t/** @deprecated Use `baseLocale` */\n\tsourceLanguageTag?: string;\n\t/** @deprecated Use `locales` */\n\tlanguageTags?: string[];\n\t/** @deprecated This will soon be replaced by `Lix Validation Rules` */\n\tmessageLintRuleLevels?: Record<string, \"error\" | \"warning\">;\n} & Record<string, any>;\nexport const ProjectSettings = SDKSettings;\n"]}
@@ -1,5 +1,3 @@
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]="18d5d5fa-d82c-541b-a967-918a95a3c9b2")}catch(e){}}();
3
1
  import { ProjectSettings } from "./settings.js";
4
2
  const settings = {};
5
3
  // language tag and locale should be optional
@@ -16,5 +14,4 @@ settings["plugin.mock"] = {
16
14
  moreNested: {},
17
15
  },
18
16
  };
19
- //# sourceMappingURL=settings.test-d.js.map
20
- //# debugId=18d5d5fa-d82c-541b-a967-918a95a3c9b2
17
+ //# sourceMappingURL=settings.test-d.js.map