@inlang/sdk 0.36.3 → 2.0.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +1 -1
- package/dist/database/initDb.d.ts +7 -0
- package/dist/database/initDb.d.ts.map +1 -0
- package/dist/database/initDb.js +36 -0
- package/dist/database/initDb.js.map +1 -0
- package/dist/database/initDbAndSchema.test.d.ts +2 -0
- package/dist/database/initDbAndSchema.test.d.ts.map +1 -0
- package/dist/database/initDbAndSchema.test.js +110 -0
- package/dist/database/initDbAndSchema.test.js.map +1 -0
- package/dist/database/jsonbPlugin.d.ts +20 -0
- package/dist/database/jsonbPlugin.d.ts.map +1 -0
- package/dist/database/jsonbPlugin.js +183 -0
- package/dist/database/jsonbPlugin.js.map +1 -0
- package/dist/database/jsonbPlugin.test.d.ts +2 -0
- package/dist/database/jsonbPlugin.test.d.ts.map +1 -0
- package/dist/database/jsonbPlugin.test.js +119 -0
- package/dist/database/jsonbPlugin.test.js.map +1 -0
- package/dist/database/schema.d.ts +74 -0
- package/dist/database/schema.d.ts.map +1 -0
- package/dist/database/schema.js +45 -0
- package/dist/database/schema.js.map +1 -0
- package/dist/helper.d.ts +71 -0
- package/dist/helper.d.ts.map +1 -0
- package/dist/helper.js +91 -0
- package/dist/helper.js.map +1 -0
- package/dist/human-id/human-id.d.ts +3 -0
- package/dist/human-id/human-id.d.ts.map +1 -0
- package/dist/human-id/human-id.js +12 -0
- package/dist/human-id/human-id.js.map +1 -0
- package/dist/human-id/words.d.ts.map +1 -0
- package/dist/{storage/human-id → human-id}/words.js +4 -0
- package/dist/human-id/words.js.map +1 -0
- package/dist/human-id/words.test.d.ts.map +1 -0
- package/dist/{storage/human-id → human-id}/words.test.js +4 -0
- package/dist/human-id/words.test.js.map +1 -0
- package/dist/import-export/exportFiles.d.ts +11 -0
- package/dist/import-export/exportFiles.d.ts.map +1 -0
- package/dist/import-export/exportFiles.js +26 -0
- package/dist/import-export/exportFiles.js.map +1 -0
- package/dist/import-export/importFiles.d.ts +13 -0
- package/dist/import-export/importFiles.d.ts.map +1 -0
- package/dist/import-export/importFiles.js +124 -0
- package/dist/import-export/importFiles.js.map +1 -0
- package/dist/import-export/importFiles.test.d.ts +2 -0
- package/dist/import-export/importFiles.test.d.ts.map +1 -0
- package/dist/import-export/importFiles.test.js +179 -0
- package/dist/import-export/importFiles.test.js.map +1 -0
- package/dist/import-export/roundtrip.test.d.ts +2 -0
- package/dist/import-export/roundtrip.test.d.ts.map +1 -0
- package/dist/import-export/roundtrip.test.js +273 -0
- package/dist/import-export/roundtrip.test.js.map +1 -0
- package/dist/import-export/upsertBundleNestedMatchByProperties.d.ts +4 -0
- package/dist/import-export/upsertBundleNestedMatchByProperties.d.ts.map +1 -0
- package/dist/import-export/upsertBundleNestedMatchByProperties.js +58 -0
- package/dist/import-export/upsertBundleNestedMatchByProperties.js.map +1 -0
- package/dist/index.d.ts +21 -18
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +20 -17
- package/dist/index.js.map +1 -0
- package/dist/json-schema/old-v1-message/fromMessageV1.d.ts +9 -0
- package/dist/json-schema/old-v1-message/fromMessageV1.d.ts.map +1 -0
- package/dist/json-schema/old-v1-message/fromMessageV1.js +84 -0
- package/dist/json-schema/old-v1-message/fromMessageV1.js.map +1 -0
- package/dist/json-schema/old-v1-message/fromMessageV1.test.d.ts +2 -0
- package/dist/json-schema/old-v1-message/fromMessageV1.test.d.ts.map +1 -0
- package/dist/json-schema/old-v1-message/fromMessageV1.test.js +85 -0
- package/dist/json-schema/old-v1-message/fromMessageV1.test.js.map +1 -0
- package/dist/json-schema/old-v1-message/schemaV1.d.ts +86 -0
- package/dist/json-schema/old-v1-message/schemaV1.d.ts.map +1 -0
- package/dist/json-schema/old-v1-message/schemaV1.js +35 -0
- package/dist/json-schema/old-v1-message/schemaV1.js.map +1 -0
- package/dist/json-schema/old-v1-message/toMessageV1.d.ts +9 -0
- package/dist/json-schema/old-v1-message/toMessageV1.d.ts.map +1 -0
- package/dist/json-schema/old-v1-message/toMessageV1.js +67 -0
- package/dist/json-schema/old-v1-message/toMessageV1.js.map +1 -0
- package/dist/json-schema/old-v1-message/toMessageV1.test.d.ts +2 -0
- package/dist/json-schema/old-v1-message/toMessageV1.test.d.ts.map +1 -0
- package/dist/json-schema/old-v1-message/toMessageV1.test.js +85 -0
- package/dist/json-schema/old-v1-message/toMessageV1.test.js.map +1 -0
- package/dist/json-schema/pattern.d.ts +190 -0
- package/dist/json-schema/pattern.d.ts.map +1 -0
- package/dist/json-schema/pattern.js +43 -0
- package/dist/json-schema/pattern.js.map +1 -0
- package/dist/json-schema/settings.d.ts +31 -0
- package/dist/json-schema/settings.d.ts.map +1 -0
- package/dist/json-schema/settings.js +96 -0
- package/dist/json-schema/settings.js.map +1 -0
- package/dist/json-schema/settings.test-d.d.ts +2 -0
- package/dist/json-schema/settings.test-d.d.ts.map +1 -0
- package/dist/json-schema/settings.test-d.js +20 -0
- package/dist/json-schema/settings.test-d.js.map +1 -0
- package/dist/lix-plugin/applyChanges.d.ts +3 -0
- package/dist/lix-plugin/applyChanges.d.ts.map +1 -0
- package/dist/lix-plugin/applyChanges.js +127 -0
- package/dist/lix-plugin/applyChanges.js.map +1 -0
- package/dist/lix-plugin/applyChanges.test.d.ts +2 -0
- package/dist/lix-plugin/applyChanges.test.d.ts.map +1 -0
- package/dist/lix-plugin/applyChanges.test.js +135 -0
- package/dist/lix-plugin/applyChanges.test.js.map +1 -0
- package/dist/lix-plugin/detectConflicts.d.ts +3 -0
- package/dist/lix-plugin/detectConflicts.d.ts.map +1 -0
- package/dist/lix-plugin/detectConflicts.js +47 -0
- package/dist/lix-plugin/detectConflicts.js.map +1 -0
- package/dist/lix-plugin/detectConflicts.test.d.ts +2 -0
- package/dist/lix-plugin/detectConflicts.test.d.ts.map +1 -0
- package/dist/lix-plugin/detectConflicts.test.js +251 -0
- package/dist/lix-plugin/detectConflicts.test.js.map +1 -0
- package/dist/lix-plugin/inlangLixPluginV1.d.ts +8 -0
- package/dist/lix-plugin/inlangLixPluginV1.d.ts.map +1 -0
- package/dist/lix-plugin/inlangLixPluginV1.js +109 -0
- package/dist/lix-plugin/inlangLixPluginV1.js.map +1 -0
- package/dist/lix-plugin/inlangLixPluginV1.test.d.ts +2 -0
- package/dist/lix-plugin/inlangLixPluginV1.test.d.ts.map +1 -0
- package/dist/lix-plugin/inlangLixPluginV1.test.js +418 -0
- package/dist/lix-plugin/inlangLixPluginV1.test.js.map +1 -0
- package/dist/lix-plugin/merge.test.d.ts +2 -0
- package/dist/lix-plugin/merge.test.d.ts.map +1 -0
- package/dist/lix-plugin/merge.test.js +120 -0
- package/dist/lix-plugin/merge.test.js.map +1 -0
- package/dist/lix-plugin/resolveConflictBySelecting.test.d.ts +2 -0
- package/dist/lix-plugin/resolveConflictBySelecting.test.d.ts.map +1 -0
- package/dist/lix-plugin/resolveConflictBySelecting.test.js +176 -0
- package/dist/lix-plugin/resolveConflictBySelecting.test.js.map +1 -0
- package/dist/migrations/v2/createMessageV1.d.ts +28 -0
- package/dist/migrations/v2/createMessageV1.d.ts.map +1 -0
- package/dist/migrations/v2/createMessageV1.js +31 -0
- package/dist/migrations/v2/createMessageV1.js.map +1 -0
- package/dist/migrations/v2/withLanguageTagToLocaleMigration.d.ts +9 -0
- package/dist/migrations/v2/withLanguageTagToLocaleMigration.d.ts.map +1 -0
- package/dist/migrations/v2/withLanguageTagToLocaleMigration.js +31 -0
- package/dist/migrations/v2/withLanguageTagToLocaleMigration.js.map +1 -0
- package/dist/migrations/v2/withLanguageTagToLocaleMigration.test.d.ts +2 -0
- package/dist/migrations/v2/withLanguageTagToLocaleMigration.test.d.ts.map +1 -0
- package/dist/migrations/v2/withLanguageTagToLocaleMigration.test.js +45 -0
- package/dist/migrations/v2/withLanguageTagToLocaleMigration.test.js.map +1 -0
- package/dist/plugin/cache.d.ts +6 -0
- package/dist/plugin/cache.d.ts.map +1 -0
- package/dist/plugin/cache.js +59 -0
- package/dist/plugin/cache.js.map +1 -0
- package/dist/plugin/cache.test.d.ts +2 -0
- package/dist/plugin/cache.test.d.ts.map +1 -0
- package/dist/plugin/cache.test.js +61 -0
- package/dist/plugin/cache.test.js.map +1 -0
- package/dist/plugin/errors.d.ts +41 -0
- package/dist/plugin/errors.d.ts.map +1 -0
- package/dist/plugin/errors.js +48 -0
- package/dist/plugin/errors.js.map +1 -0
- package/dist/plugin/importPlugins.d.ts +19 -0
- package/dist/plugin/importPlugins.d.ts.map +1 -0
- package/dist/plugin/importPlugins.js +43 -0
- package/dist/plugin/importPlugins.js.map +1 -0
- package/dist/plugin/importPlugins.test.d.ts +2 -0
- package/dist/plugin/importPlugins.test.d.ts.map +1 -0
- package/dist/plugin/importPlugins.test.js +95 -0
- package/dist/plugin/importPlugins.test.js.map +1 -0
- package/dist/plugin/meta/ideExtension.d.ts +54 -0
- package/dist/plugin/meta/ideExtension.d.ts.map +1 -0
- package/dist/plugin/meta/ideExtension.js +5 -0
- package/dist/plugin/meta/ideExtension.js.map +1 -0
- package/dist/plugin/schema.d.ts +152 -0
- package/dist/plugin/schema.d.ts.map +1 -0
- package/dist/plugin/schema.js +5 -0
- package/dist/plugin/schema.js.map +1 -0
- package/dist/project/api.d.ts +74 -0
- package/dist/project/api.d.ts.map +1 -0
- package/dist/project/api.js +5 -0
- package/dist/project/api.js.map +1 -0
- package/dist/project/initHandleSaveToLixOnChange.d.ts +14 -0
- package/dist/project/initHandleSaveToLixOnChange.d.ts.map +1 -0
- package/dist/project/initHandleSaveToLixOnChange.js +87 -0
- package/dist/project/initHandleSaveToLixOnChange.js.map +1 -0
- package/dist/project/loadProject.d.ts +53 -0
- package/dist/project/loadProject.d.ts.map +1 -0
- package/dist/project/loadProject.js +167 -0
- package/dist/project/loadProject.js.map +1 -0
- package/dist/project/loadProject.test.d.ts.map +1 -0
- package/dist/project/loadProject.test.js +146 -0
- package/dist/project/loadProject.test.js.map +1 -0
- package/dist/project/loadProjectFromDirectory.d.ts +77 -0
- package/dist/project/loadProjectFromDirectory.d.ts.map +1 -0
- package/dist/project/loadProjectFromDirectory.js +584 -0
- package/dist/project/loadProjectFromDirectory.js.map +1 -0
- package/dist/project/loadProjectFromDirectory.test.d.ts +2 -0
- package/dist/project/loadProjectFromDirectory.test.d.ts.map +1 -0
- package/dist/project/loadProjectFromDirectory.test.js +663 -0
- package/dist/project/loadProjectFromDirectory.test.js.map +1 -0
- package/dist/project/loadProjectInMemory.d.ts +8 -0
- package/dist/project/loadProjectInMemory.d.ts.map +1 -0
- package/dist/project/loadProjectInMemory.js +32 -0
- package/dist/project/loadProjectInMemory.js.map +1 -0
- package/dist/project/loadProjectInMemory.test.d.ts +2 -0
- package/dist/project/loadProjectInMemory.test.d.ts.map +1 -0
- package/dist/project/loadProjectInMemory.test.js +27 -0
- package/dist/project/loadProjectInMemory.test.js.map +1 -0
- package/dist/project/maybeCaptureTelemetry.d.ts +13 -0
- package/dist/project/maybeCaptureTelemetry.d.ts.map +1 -0
- package/dist/project/maybeCaptureTelemetry.js +53 -0
- package/dist/project/maybeCaptureTelemetry.js.map +1 -0
- package/dist/project/maybeCaptureTelemetry.test.d.ts +2 -0
- package/dist/project/maybeCaptureTelemetry.test.d.ts.map +1 -0
- package/dist/project/maybeCaptureTelemetry.test.js +65 -0
- package/dist/project/maybeCaptureTelemetry.test.js.map +1 -0
- package/dist/project/newProject.d.ts +17 -0
- package/dist/project/newProject.d.ts.map +1 -0
- package/dist/project/newProject.js +71 -0
- package/dist/project/newProject.js.map +1 -0
- package/dist/project/newProject.test.d.ts +2 -0
- package/dist/project/newProject.test.d.ts.map +1 -0
- package/dist/project/newProject.test.js +37 -0
- package/dist/project/newProject.test.js.map +1 -0
- package/dist/project/saveProjectToDirectory.d.ts +8 -0
- package/dist/project/saveProjectToDirectory.d.ts.map +1 -0
- package/dist/project/saveProjectToDirectory.js +86 -0
- package/dist/project/saveProjectToDirectory.js.map +1 -0
- package/dist/project/saveProjectToDirectory.test.d.ts +2 -0
- package/dist/project/saveProjectToDirectory.test.d.ts.map +1 -0
- package/dist/project/saveProjectToDirectory.test.js +245 -0
- package/dist/project/saveProjectToDirectory.test.js.map +1 -0
- package/dist/project/state/id$.d.ts +6 -0
- package/dist/project/state/id$.d.ts.map +1 -0
- package/dist/project/state/id$.js +19 -0
- package/dist/project/state/id$.js.map +1 -0
- package/dist/project/state/id$.test.d.ts +2 -0
- package/dist/project/state/id$.test.d.ts.map +1 -0
- package/dist/project/state/id$.test.js +36 -0
- package/dist/project/state/id$.test.js.map +1 -0
- package/dist/project/state/setSettings.d.ts +7 -0
- package/dist/project/state/setSettings.d.ts.map +1 -0
- package/dist/project/state/setSettings.js +16 -0
- package/dist/project/state/setSettings.js.map +1 -0
- package/dist/project/state/setSettings.test.d.ts +2 -0
- package/dist/project/state/setSettings.test.d.ts.map +1 -0
- package/dist/project/state/setSettings.test.js +58 -0
- package/dist/project/state/setSettings.test.js.map +1 -0
- package/dist/project/state/settings$.d.ts +7 -0
- package/dist/project/state/settings$.d.ts.map +1 -0
- package/dist/project/state/settings$.js +21 -0
- package/dist/project/state/settings$.js.map +1 -0
- package/dist/project/state/settings$.test.d.ts +2 -0
- package/dist/project/state/settings$.test.d.ts.map +1 -0
- package/dist/project/state/settings$.test.js +51 -0
- package/dist/project/state/settings$.test.js.map +1 -0
- package/dist/project/state/state.d.ts +58 -0
- package/dist/project/state/state.d.ts.map +1 -0
- package/dist/project/state/state.js +67 -0
- package/dist/project/state/state.js.map +1 -0
- package/dist/project/state/state.test.d.ts +2 -0
- package/dist/project/state/state.test.d.ts.map +1 -0
- package/dist/project/state/state.test.js +103 -0
- package/dist/project/state/state.test.js.map +1 -0
- package/dist/query-utilities/index.d.ts +5 -0
- package/dist/query-utilities/index.d.ts.map +1 -0
- package/dist/query-utilities/index.js +8 -0
- package/dist/query-utilities/index.js.map +1 -0
- package/dist/query-utilities/insertBundleNested.d.ts +4 -0
- package/dist/query-utilities/insertBundleNested.d.ts.map +1 -0
- package/dist/query-utilities/insertBundleNested.js +39 -0
- package/dist/query-utilities/insertBundleNested.js.map +1 -0
- package/dist/query-utilities/pollQuery.d.ts +14 -0
- package/dist/query-utilities/pollQuery.d.ts.map +1 -0
- package/dist/query-utilities/pollQuery.js +22 -0
- package/dist/query-utilities/pollQuery.js.map +1 -0
- package/dist/query-utilities/pollQuery.test.d.ts +2 -0
- package/dist/query-utilities/pollQuery.test.d.ts.map +1 -0
- package/dist/query-utilities/pollQuery.test.js +67 -0
- package/dist/query-utilities/pollQuery.test.js.map +1 -0
- package/dist/query-utilities/selectBundleNested.d.ts +107 -0
- package/dist/query-utilities/selectBundleNested.d.ts.map +1 -0
- package/dist/query-utilities/selectBundleNested.js +43 -0
- package/dist/query-utilities/selectBundleNested.js.map +1 -0
- package/dist/query-utilities/updateBundleNested.d.ts +12 -0
- package/dist/query-utilities/updateBundleNested.d.ts.map +1 -0
- package/dist/query-utilities/updateBundleNested.js +25 -0
- package/dist/query-utilities/updateBundleNested.js.map +1 -0
- package/dist/query-utilities/upsertBundleNested.d.ts +4 -0
- package/dist/query-utilities/upsertBundleNested.d.ts.map +1 -0
- package/dist/query-utilities/upsertBundleNested.js +50 -0
- package/dist/query-utilities/upsertBundleNested.js.map +1 -0
- package/dist/services/env-variables/index.d.ts +6 -0
- package/dist/services/env-variables/index.d.ts.map +1 -0
- package/dist/services/env-variables/index.js +9 -0
- package/dist/services/env-variables/index.js.map +1 -0
- package/dist/services/error-reporting/index.d.ts +15 -0
- package/dist/services/error-reporting/index.d.ts.map +1 -0
- package/dist/services/error-reporting/index.js +30 -0
- package/dist/services/error-reporting/index.js.map +1 -0
- package/dist/{telemetry → services/telemetry}/capture.d.ts +4 -2
- package/dist/services/telemetry/capture.d.ts.map +1 -0
- package/dist/services/telemetry/capture.js +77 -0
- package/dist/services/telemetry/capture.js.map +1 -0
- package/dist/services/telemetry/capture.test.d.ts +2 -0
- package/dist/services/telemetry/capture.test.d.ts.map +1 -0
- package/dist/services/telemetry/capture.test.js +44 -0
- package/dist/services/telemetry/capture.test.js.map +1 -0
- package/dist/utilities/detectJsonFormatting.d.ts +11 -0
- package/dist/utilities/detectJsonFormatting.d.ts.map +1 -0
- package/dist/utilities/detectJsonFormatting.js +83 -0
- package/dist/utilities/detectJsonFormatting.js.map +1 -0
- package/dist/utilities/detectJsonFormatting.test.d.ts +2 -0
- package/dist/utilities/detectJsonFormatting.test.d.ts.map +1 -0
- package/dist/utilities/detectJsonFormatting.test.js +33 -0
- package/dist/utilities/detectJsonFormatting.test.js.map +1 -0
- package/package.json +32 -40
- package/src/database/initDb.ts +34 -0
- package/src/database/initDbAndSchema.test.ts +125 -0
- package/src/database/jsonbPlugin.test.ts +154 -0
- package/src/database/jsonbPlugin.ts +215 -0
- package/src/database/schema.ts +127 -0
- package/src/helper.ts +113 -0
- package/src/human-id/human-id.ts +14 -0
- package/src/{storage/human-id → human-id}/words.test.ts +14 -14
- package/src/{storage/human-id → human-id}/words.ts +4 -4
- package/src/import-export/exportFiles.ts +36 -0
- package/src/import-export/importFiles.test.ts +211 -0
- package/src/import-export/importFiles.ts +142 -0
- package/src/import-export/roundtrip.test.ts +313 -0
- package/src/import-export/upsertBundleNestedMatchByProperties.ts +74 -0
- package/src/index.ts +29 -37
- package/src/json-schema/old-v1-message/README.md +1 -0
- package/src/json-schema/old-v1-message/fromMessageV1.test.ts +87 -0
- package/src/json-schema/old-v1-message/fromMessageV1.ts +99 -0
- package/src/json-schema/old-v1-message/schemaV1.ts +66 -0
- package/src/json-schema/old-v1-message/toMessageV1.test.ts +87 -0
- package/src/json-schema/old-v1-message/toMessageV1.ts +79 -0
- package/src/json-schema/pattern.ts +59 -0
- package/src/json-schema/settings.test-d.ts +21 -0
- package/src/json-schema/settings.ts +138 -0
- package/src/lix-plugin/applyChanges.test.ts +150 -0
- package/src/lix-plugin/applyChanges.ts +171 -0
- package/src/lix-plugin/detectConflicts.test.ts +286 -0
- package/src/lix-plugin/detectConflicts.ts +62 -0
- package/src/lix-plugin/inlangLixPluginV1.test.ts +439 -0
- package/src/lix-plugin/inlangLixPluginV1.ts +132 -0
- package/src/lix-plugin/merge.test.ts +133 -0
- package/src/lix-plugin/resolveConflictBySelecting.test.ts +188 -0
- package/src/migrations/v2/createMessageV1.ts +37 -0
- package/src/migrations/v2/withLanguageTagToLocaleMigration.test.ts +51 -0
- package/src/migrations/v2/withLanguageTagToLocaleMigration.ts +31 -0
- package/src/plugin/cache.test.ts +83 -0
- package/src/plugin/cache.ts +79 -0
- package/src/plugin/errors.ts +67 -0
- package/src/plugin/importPlugins.test.ts +107 -0
- package/src/plugin/importPlugins.ts +60 -0
- package/src/plugin/meta/ideExtension.ts +56 -0
- package/src/plugin/schema.ts +165 -0
- package/src/project/api.ts +77 -0
- package/src/project/initHandleSaveToLixOnChange.ts +93 -0
- package/src/project/loadProject.test.ts +177 -0
- package/src/project/loadProject.ts +245 -0
- package/src/project/loadProjectFromDirectory.test.ts +854 -0
- package/src/project/loadProjectFromDirectory.ts +752 -0
- package/src/project/loadProjectInMemory.test.ts +29 -0
- package/src/project/loadProjectInMemory.ts +36 -0
- package/src/project/maybeCaptureTelemetry.test.ts +72 -0
- package/src/project/maybeCaptureTelemetry.ts +61 -0
- package/src/project/newProject.test.ts +36 -0
- package/src/project/newProject.ts +78 -0
- package/src/project/saveProjectToDirectory.test.ts +310 -0
- package/src/project/saveProjectToDirectory.ts +100 -0
- package/src/query-utilities/index.ts +4 -0
- package/src/query-utilities/insertBundleNested.ts +46 -0
- package/src/query-utilities/selectBundleNested.ts +46 -0
- package/src/query-utilities/updateBundleNested.ts +35 -0
- package/src/query-utilities/upsertBundleNested.ts +61 -0
- package/src/services/env-variables/createIndexFile.js +40 -0
- package/src/{env-variables → services/env-variables}/index.d.ts +8 -5
- package/src/services/error-reporting/index.ts +28 -0
- package/src/services/telemetry/capture.test.ts +48 -0
- package/src/services/telemetry/capture.ts +98 -0
- package/src/utilities/detectJsonFormatting.test.ts +38 -0
- package/src/utilities/detectJsonFormatting.ts +109 -0
- package/dist/adapter/solidAdapter.d.ts +0 -33
- package/dist/adapter/solidAdapter.d.ts.map +0 -1
- package/dist/adapter/solidAdapter.js +0 -40
- package/dist/adapter/solidAdapter.test.d.ts +0 -2
- package/dist/adapter/solidAdapter.test.d.ts.map +0 -1
- package/dist/adapter/solidAdapter.test.js +0 -356
- package/dist/api.d.ts +0 -113
- package/dist/api.d.ts.map +0 -1
- package/dist/api.js +0 -1
- package/dist/api.test-d.d.ts +0 -2
- package/dist/api.test-d.d.ts.map +0 -1
- package/dist/api.test-d.js +0 -4
- package/dist/createMessageLintReportsQuery.d.ts +0 -12
- package/dist/createMessageLintReportsQuery.d.ts.map +0 -1
- package/dist/createMessageLintReportsQuery.js +0 -176
- package/dist/createMessagesQuery.d.ts +0 -19
- package/dist/createMessagesQuery.d.ts.map +0 -1
- package/dist/createMessagesQuery.js +0 -451
- package/dist/createMessagesQuery.test.d.ts +0 -2
- package/dist/createMessagesQuery.test.d.ts.map +0 -1
- package/dist/createMessagesQuery.test.js +0 -402
- package/dist/createNewProject.d.ts +0 -12
- package/dist/createNewProject.d.ts.map +0 -1
- package/dist/createNewProject.js +0 -38
- package/dist/createNewProject.test.d.ts +0 -2
- package/dist/createNewProject.test.d.ts.map +0 -1
- package/dist/createNewProject.test.js +0 -91
- package/dist/createNodeishFsWithAbsolutePaths.d.ts +0 -12
- package/dist/createNodeishFsWithAbsolutePaths.d.ts.map +0 -1
- package/dist/createNodeishFsWithAbsolutePaths.js +0 -38
- package/dist/createNodeishFsWithAbsolutePaths.test.d.ts +0 -2
- package/dist/createNodeishFsWithAbsolutePaths.test.d.ts.map +0 -1
- package/dist/createNodeishFsWithAbsolutePaths.test.js +0 -44
- package/dist/createNodeishFsWithWatcher.d.ts +0 -14
- package/dist/createNodeishFsWithWatcher.d.ts.map +0 -1
- package/dist/createNodeishFsWithWatcher.js +0 -75
- package/dist/createNodeishFsWithWatcher.test.d.ts +0 -2
- package/dist/createNodeishFsWithWatcher.test.d.ts.map +0 -1
- package/dist/createNodeishFsWithWatcher.test.js +0 -38
- package/dist/defaultProjectSettings.d.ts +0 -14
- package/dist/defaultProjectSettings.d.ts.map +0 -1
- package/dist/defaultProjectSettings.js +0 -22
- package/dist/env-variables/index.d.ts +0 -4
- package/dist/env-variables/index.d.ts.map +0 -1
- package/dist/env-variables/index.js +0 -3
- package/dist/errors.d.ts +0 -48
- package/dist/errors.d.ts.map +0 -1
- package/dist/errors.js +0 -62
- package/dist/lint/index.d.ts +0 -3
- package/dist/lint/index.d.ts.map +0 -1
- package/dist/lint/index.js +0 -2
- package/dist/lint/message/errors.d.ts +0 -7
- package/dist/lint/message/errors.d.ts.map +0 -1
- package/dist/lint/message/errors.js +0 -9
- package/dist/lint/message/lintMessages.d.ts +0 -13
- package/dist/lint/message/lintMessages.d.ts.map +0 -1
- package/dist/lint/message/lintMessages.js +0 -12
- package/dist/lint/message/lintMessages.test.d.ts +0 -2
- package/dist/lint/message/lintMessages.test.d.ts.map +0 -1
- package/dist/lint/message/lintMessages.test.js +0 -107
- package/dist/lint/message/lintSingleMessage.d.ts +0 -19
- package/dist/lint/message/lintSingleMessage.d.ts.map +0 -1
- package/dist/lint/message/lintSingleMessage.js +0 -38
- package/dist/lint/message/lintSingleMessage.test.d.ts +0 -2
- package/dist/lint/message/lintSingleMessage.test.d.ts.map +0 -1
- package/dist/lint/message/lintSingleMessage.test.js +0 -161
- package/dist/listProjects.d.ts +0 -5
- package/dist/listProjects.d.ts.map +0 -1
- package/dist/listProjects.js +0 -38
- package/dist/listProjects.test.d.ts +0 -2
- package/dist/listProjects.test.d.ts.map +0 -1
- package/dist/listProjects.test.js +0 -72
- package/dist/loadProject.d.ts +0 -19
- package/dist/loadProject.d.ts.map +0 -1
- package/dist/loadProject.js +0 -343
- package/dist/loadProject.test.d.ts.map +0 -1
- package/dist/loadProject.test.js +0 -975
- package/dist/messages/errors.d.ts +0 -13
- package/dist/messages/errors.d.ts.map +0 -1
- package/dist/messages/errors.js +0 -18
- package/dist/messages/index.d.ts +0 -3
- package/dist/messages/index.d.ts.map +0 -1
- package/dist/messages/index.js +0 -2
- package/dist/messages/variant.d.ts +0 -46
- package/dist/messages/variant.d.ts.map +0 -1
- package/dist/messages/variant.js +0 -176
- package/dist/messages/variant.test.d.ts +0 -2
- package/dist/messages/variant.test.d.ts.map +0 -1
- package/dist/messages/variant.test.js +0 -439
- package/dist/migrations/maybeAddModuleCache.d.ts +0 -6
- package/dist/migrations/maybeAddModuleCache.d.ts.map +0 -1
- package/dist/migrations/maybeAddModuleCache.js +0 -62
- package/dist/migrations/maybeCreateFirstProjectId.d.ts +0 -16
- package/dist/migrations/maybeCreateFirstProjectId.d.ts.map +0 -1
- package/dist/migrations/maybeCreateFirstProjectId.js +0 -46
- package/dist/migrations/maybeCreateFirstProjectId.test.d.ts +0 -2
- package/dist/migrations/maybeCreateFirstProjectId.test.d.ts.map +0 -1
- package/dist/migrations/maybeCreateFirstProjectId.test.js +0 -24
- package/dist/migrations/migrateToDirectory.d.ts +0 -10
- package/dist/migrations/migrateToDirectory.d.ts.map +0 -1
- package/dist/migrations/migrateToDirectory.js +0 -48
- package/dist/migrations/migrateToDirectory.test.d.ts +0 -2
- package/dist/migrations/migrateToDirectory.test.d.ts.map +0 -1
- package/dist/migrations/migrateToDirectory.test.js +0 -48
- package/dist/parseConfig.d.ts +0 -8
- package/dist/parseConfig.d.ts.map +0 -1
- package/dist/parseConfig.js +0 -26
- package/dist/persistence/batchedIO.d.ts +0 -11
- package/dist/persistence/batchedIO.d.ts.map +0 -1
- package/dist/persistence/batchedIO.js +0 -49
- package/dist/persistence/batchedIO.test.d.ts +0 -2
- package/dist/persistence/batchedIO.test.d.ts.map +0 -1
- package/dist/persistence/batchedIO.test.js +0 -56
- package/dist/persistence/filelock/acquireFileLock.d.ts +0 -3
- package/dist/persistence/filelock/acquireFileLock.d.ts.map +0 -1
- package/dist/persistence/filelock/acquireFileLock.js +0 -111
- package/dist/persistence/filelock/releaseLock.d.ts +0 -3
- package/dist/persistence/filelock/releaseLock.d.ts.map +0 -1
- package/dist/persistence/filelock/releaseLock.js +0 -24
- package/dist/persistence/store.d.ts +0 -107
- package/dist/persistence/store.d.ts.map +0 -1
- package/dist/persistence/store.js +0 -99
- package/dist/persistence/store.test.d.ts +0 -2
- package/dist/persistence/store.test.d.ts.map +0 -1
- package/dist/persistence/store.test.js +0 -79
- package/dist/persistence/storeApi.d.ts +0 -22
- package/dist/persistence/storeApi.d.ts.map +0 -1
- package/dist/persistence/storeApi.js +0 -1
- package/dist/reactivity/map.d.ts +0 -67
- package/dist/reactivity/map.d.ts.map +0 -1
- package/dist/reactivity/map.js +0 -143
- package/dist/reactivity/solid.d.ts +0 -14
- package/dist/reactivity/solid.d.ts.map +0 -1
- package/dist/reactivity/solid.js +0 -15
- package/dist/reactivity/solid.test.d.ts +0 -2
- package/dist/reactivity/solid.test.d.ts.map +0 -1
- package/dist/reactivity/solid.test.js +0 -189
- package/dist/reactivity/trigger.d.ts +0 -11
- package/dist/reactivity/trigger.d.ts.map +0 -1
- package/dist/reactivity/trigger.js +0 -46
- package/dist/resolve-modules/cache.d.ts +0 -6
- package/dist/resolve-modules/cache.d.ts.map +0 -1
- package/dist/resolve-modules/cache.js +0 -58
- package/dist/resolve-modules/errors.d.ts +0 -41
- package/dist/resolve-modules/errors.d.ts.map +0 -1
- package/dist/resolve-modules/errors.js +0 -45
- package/dist/resolve-modules/import.d.ts +0 -19
- package/dist/resolve-modules/import.d.ts.map +0 -1
- package/dist/resolve-modules/import.js +0 -102
- package/dist/resolve-modules/import.test.d.ts +0 -2
- package/dist/resolve-modules/import.test.d.ts.map +0 -1
- package/dist/resolve-modules/import.test.js +0 -47
- package/dist/resolve-modules/index.d.ts +0 -3
- package/dist/resolve-modules/index.d.ts.map +0 -1
- package/dist/resolve-modules/index.js +0 -2
- package/dist/resolve-modules/message-lint-rules/errors.d.ts +0 -9
- package/dist/resolve-modules/message-lint-rules/errors.d.ts.map +0 -1
- package/dist/resolve-modules/message-lint-rules/errors.js +0 -6
- package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.d.ts +0 -9
- package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.d.ts.map +0 -1
- package/dist/resolve-modules/message-lint-rules/resolveMessageLintRules.js +0 -24
- package/dist/resolve-modules/plugins/errors.d.ts +0 -33
- package/dist/resolve-modules/plugins/errors.d.ts.map +0 -1
- package/dist/resolve-modules/plugins/errors.js +0 -38
- package/dist/resolve-modules/plugins/resolvePlugins.d.ts +0 -3
- package/dist/resolve-modules/plugins/resolvePlugins.d.ts.map +0 -1
- package/dist/resolve-modules/plugins/resolvePlugins.js +0 -92
- package/dist/resolve-modules/plugins/resolvePlugins.test.d.ts +0 -2
- package/dist/resolve-modules/plugins/resolvePlugins.test.d.ts.map +0 -1
- package/dist/resolve-modules/plugins/resolvePlugins.test.js +0 -252
- package/dist/resolve-modules/plugins/types.d.ts +0 -57
- package/dist/resolve-modules/plugins/types.d.ts.map +0 -1
- package/dist/resolve-modules/plugins/types.js +0 -1
- package/dist/resolve-modules/plugins/types.test.d.ts +0 -2
- package/dist/resolve-modules/plugins/types.test.d.ts.map +0 -1
- package/dist/resolve-modules/plugins/types.test.js +0 -45
- package/dist/resolve-modules/resolveModules.d.ts +0 -3
- package/dist/resolve-modules/resolveModules.d.ts.map +0 -1
- package/dist/resolve-modules/resolveModules.js +0 -80
- package/dist/resolve-modules/resolveModules.test.d.ts +0 -2
- package/dist/resolve-modules/resolveModules.test.d.ts.map +0 -1
- package/dist/resolve-modules/resolveModules.test.js +0 -185
- package/dist/resolve-modules/types.d.ts +0 -63
- package/dist/resolve-modules/types.d.ts.map +0 -1
- package/dist/resolve-modules/types.js +0 -1
- package/dist/resolve-modules/validateModuleSettings.test.d.ts +0 -2
- package/dist/resolve-modules/validateModuleSettings.test.d.ts.map +0 -1
- package/dist/resolve-modules/validateModuleSettings.test.js +0 -71
- package/dist/resolve-modules/validatedModuleSettings.d.ts +0 -7
- package/dist/resolve-modules/validatedModuleSettings.d.ts.map +0 -1
- package/dist/resolve-modules/validatedModuleSettings.js +0 -11
- package/dist/storage/helper.d.ts +0 -11
- package/dist/storage/helper.d.ts.map +0 -1
- package/dist/storage/helper.js +0 -63
- package/dist/storage/helpers.test.d.ts +0 -2
- package/dist/storage/helpers.test.d.ts.map +0 -1
- package/dist/storage/helpers.test.js +0 -84
- package/dist/storage/human-id/human-readable-id.d.ts +0 -3
- package/dist/storage/human-id/human-readable-id.d.ts.map +0 -1
- package/dist/storage/human-id/human-readable-id.js +0 -20
- package/dist/storage/human-id/words.d.ts.map +0 -1
- package/dist/storage/human-id/words.test.d.ts.map +0 -1
- package/dist/telemetry/capture.d.ts.map +0 -1
- package/dist/telemetry/capture.js +0 -39
- package/dist/telemetry/groupIdentify.d.ts +0 -13
- package/dist/telemetry/groupIdentify.d.ts.map +0 -1
- package/dist/telemetry/groupIdentify.js +0 -35
- package/dist/test-utilities/createMessage.d.ts +0 -18
- package/dist/test-utilities/createMessage.d.ts.map +0 -1
- package/dist/test-utilities/createMessage.js +0 -17
- package/dist/test-utilities/createMessage.test.d.ts +0 -2
- package/dist/test-utilities/createMessage.test.d.ts.map +0 -1
- package/dist/test-utilities/createMessage.test.js +0 -106
- package/dist/test-utilities/index.d.ts +0 -3
- package/dist/test-utilities/index.d.ts.map +0 -1
- package/dist/test-utilities/index.js +0 -2
- package/dist/test-utilities/sleep.d.ts +0 -4
- package/dist/test-utilities/sleep.d.ts.map +0 -1
- package/dist/test-utilities/sleep.js +0 -9
- package/dist/v2/helper.d.ts +0 -43
- package/dist/v2/helper.d.ts.map +0 -1
- package/dist/v2/helper.js +0 -75
- package/dist/v2/helper.test.d.ts +0 -2
- package/dist/v2/helper.test.d.ts.map +0 -1
- package/dist/v2/helper.test.js +0 -92
- package/dist/v2/index.d.ts +0 -4
- package/dist/v2/index.d.ts.map +0 -1
- package/dist/v2/index.js +0 -2
- package/dist/v2/mocks/index.d.ts +0 -3
- package/dist/v2/mocks/index.d.ts.map +0 -1
- package/dist/v2/mocks/index.js +0 -2
- package/dist/v2/mocks/multipleMatcher/bundle.d.ts +0 -3
- package/dist/v2/mocks/multipleMatcher/bundle.d.ts.map +0 -1
- package/dist/v2/mocks/multipleMatcher/bundle.js +0 -194
- package/dist/v2/mocks/multipleMatcher/bundle.test.d.ts +0 -2
- package/dist/v2/mocks/multipleMatcher/bundle.test.d.ts.map +0 -1
- package/dist/v2/mocks/multipleMatcher/bundle.test.js +0 -10
- package/dist/v2/mocks/plural/bundle.d.ts +0 -3
- package/dist/v2/mocks/plural/bundle.d.ts.map +0 -1
- package/dist/v2/mocks/plural/bundle.js +0 -162
- package/dist/v2/mocks/plural/bundle.test.d.ts +0 -2
- package/dist/v2/mocks/plural/bundle.test.d.ts.map +0 -1
- package/dist/v2/mocks/plural/bundle.test.js +0 -15
- package/dist/v2/shim.d.ts +0 -12
- package/dist/v2/shim.d.ts.map +0 -1
- package/dist/v2/shim.js +0 -151
- package/dist/v2/shim.test.d.ts +0 -2
- package/dist/v2/shim.test.d.ts.map +0 -1
- package/dist/v2/shim.test.js +0 -49
- package/dist/v2/stubQueryApi.d.ts +0 -9
- package/dist/v2/stubQueryApi.d.ts.map +0 -1
- package/dist/v2/stubQueryApi.js +0 -38
- package/dist/v2/types.d.ts +0 -521
- package/dist/v2/types.d.ts.map +0 -1
- package/dist/v2/types.js +0 -78
- package/dist/validateProjectPath.d.ts +0 -17
- package/dist/validateProjectPath.d.ts.map +0 -1
- package/dist/validateProjectPath.js +0 -31
- package/dist/validateProjectPath.test.d.ts +0 -2
- package/dist/validateProjectPath.test.d.ts.map +0 -1
- package/dist/validateProjectPath.test.js +0 -40
- package/dist/versionedInterfaces.d.ts +0 -8
- package/dist/versionedInterfaces.d.ts.map +0 -1
- package/dist/versionedInterfaces.js +0 -8
- package/src/adapter/solidAdapter.test.ts +0 -472
- package/src/adapter/solidAdapter.ts +0 -79
- package/src/api.test-d.ts +0 -8
- package/src/api.ts +0 -116
- package/src/createMessageLintReportsQuery.ts +0 -225
- package/src/createMessagesQuery.test.ts +0 -538
- package/src/createMessagesQuery.ts +0 -635
- package/src/createNewProject.test.ts +0 -105
- package/src/createNewProject.ts +0 -46
- package/src/createNodeishFsWithAbsolutePaths.test.ts +0 -55
- package/src/createNodeishFsWithAbsolutePaths.ts +0 -52
- package/src/createNodeishFsWithWatcher.test.ts +0 -50
- package/src/createNodeishFsWithWatcher.ts +0 -85
- package/src/defaultProjectSettings.ts +0 -26
- package/src/env-variables/.prettierignore +0 -1
- package/src/env-variables/createIndexFile.js +0 -28
- package/src/errors.ts +0 -84
- package/src/lint/index.ts +0 -2
- package/src/lint/message/errors.ts +0 -9
- package/src/lint/message/lintMessages.test.ts +0 -126
- package/src/lint/message/lintMessages.ts +0 -25
- package/src/lint/message/lintSingleMessage.test.ts +0 -191
- package/src/lint/message/lintSingleMessage.ts +0 -57
- package/src/listProjects.test.ts +0 -91
- package/src/listProjects.ts +0 -48
- package/src/loadProject.test.ts +0 -1173
- package/src/loadProject.ts +0 -460
- package/src/messages/errors.ts +0 -25
- package/src/messages/index.ts +0 -2
- package/src/messages/variant.test.ts +0 -511
- package/src/messages/variant.ts +0 -247
- package/src/migrations/maybeAddModuleCache.ts +0 -68
- package/src/migrations/maybeCreateFirstProjectId.test.ts +0 -31
- package/src/migrations/maybeCreateFirstProjectId.ts +0 -51
- package/src/migrations/migrateToDirectory.test.ts +0 -54
- package/src/migrations/migrateToDirectory.ts +0 -62
- package/src/parseConfig.ts +0 -35
- package/src/persistence/batchedIO.test.ts +0 -63
- package/src/persistence/batchedIO.ts +0 -64
- package/src/persistence/filelock/acquireFileLock.ts +0 -129
- package/src/persistence/filelock/releaseLock.ts +0 -29
- package/src/persistence/store.test.ts +0 -102
- package/src/persistence/store.ts +0 -119
- package/src/persistence/storeApi.ts +0 -19
- package/src/reactivity/map.ts +0 -135
- package/src/reactivity/solid.test.ts +0 -222
- package/src/reactivity/solid.ts +0 -42
- package/src/reactivity/trigger.ts +0 -46
- package/src/resolve-modules/cache.ts +0 -89
- package/src/resolve-modules/errors.ts +0 -69
- package/src/resolve-modules/import.test.ts +0 -62
- package/src/resolve-modules/import.ts +0 -133
- package/src/resolve-modules/index.ts +0 -2
- package/src/resolve-modules/message-lint-rules/errors.ts +0 -9
- package/src/resolve-modules/message-lint-rules/resolveMessageLintRules.ts +0 -27
- package/src/resolve-modules/plugins/errors.ts +0 -56
- package/src/resolve-modules/plugins/resolvePlugins.test.ts +0 -301
- package/src/resolve-modules/plugins/resolvePlugins.ts +0 -129
- package/src/resolve-modules/plugins/types.test.ts +0 -53
- package/src/resolve-modules/plugins/types.ts +0 -76
- package/src/resolve-modules/resolveModules.test.ts +0 -224
- package/src/resolve-modules/resolveModules.ts +0 -113
- package/src/resolve-modules/types.ts +0 -72
- package/src/resolve-modules/validateModuleSettings.test.ts +0 -85
- package/src/resolve-modules/validatedModuleSettings.ts +0 -19
- package/src/storage/helper.ts +0 -74
- package/src/storage/helpers.test.ts +0 -95
- package/src/storage/human-id/human-readable-id.ts +0 -27
- package/src/telemetry/capture.ts +0 -49
- package/src/telemetry/groupIdentify.ts +0 -41
- package/src/test-utilities/createMessage.test.ts +0 -118
- package/src/test-utilities/createMessage.ts +0 -21
- package/src/test-utilities/index.ts +0 -2
- package/src/test-utilities/sleep.ts +0 -11
- package/src/v2/helper.test.ts +0 -95
- package/src/v2/helper.ts +0 -98
- package/src/v2/index.ts +0 -3
- package/src/v2/mocks/index.ts +0 -2
- package/src/v2/mocks/multipleMatcher/bundle.test.ts +0 -11
- package/src/v2/mocks/multipleMatcher/bundle.ts +0 -196
- package/src/v2/mocks/plural/bundle.test.ts +0 -18
- package/src/v2/mocks/plural/bundle.ts +0 -164
- package/src/v2/shim.test.ts +0 -56
- package/src/v2/shim.ts +0 -173
- package/src/v2/stubQueryApi.ts +0 -43
- package/src/v2/types.ts +0 -159
- package/src/validateProjectPath.test.ts +0 -50
- package/src/validateProjectPath.ts +0 -38
- package/src/versionedInterfaces.ts +0 -9
- /package/dist/{storage/human-id → human-id}/words.d.ts +0 -0
- /package/dist/{storage/human-id → human-id}/words.test.d.ts +0 -0
- /package/dist/{loadProject.test.d.ts → project/loadProject.test.d.ts} +0 -0
|
@@ -0,0 +1,100 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-imports */
|
|
2
|
+
import type fs from "node:fs/promises";
|
|
3
|
+
import type { InlangProject } from "./api.js";
|
|
4
|
+
import path from "node:path";
|
|
5
|
+
import { toMessageV1 } from "../json-schema/old-v1-message/toMessageV1.js";
|
|
6
|
+
import {
|
|
7
|
+
absolutePathFromProject,
|
|
8
|
+
withAbsolutePaths,
|
|
9
|
+
} from "./loadProjectFromDirectory.js";
|
|
10
|
+
import { detectJsonFormatting } from "../utilities/detectJsonFormatting.js";
|
|
11
|
+
import { selectBundleNested } from "../query-utilities/selectBundleNested.js";
|
|
12
|
+
|
|
13
|
+
export async function saveProjectToDirectory(args: {
|
|
14
|
+
fs: typeof fs;
|
|
15
|
+
project: InlangProject;
|
|
16
|
+
path: string;
|
|
17
|
+
}): Promise<void> {
|
|
18
|
+
if (args.path.endsWith(".inlang") === false) {
|
|
19
|
+
throw new Error("The path must end with .inlang");
|
|
20
|
+
}
|
|
21
|
+
const files = await args.project.lix.db
|
|
22
|
+
.selectFrom("file")
|
|
23
|
+
.selectAll()
|
|
24
|
+
.execute();
|
|
25
|
+
|
|
26
|
+
// write all files to the directory
|
|
27
|
+
for (const file of files) {
|
|
28
|
+
if (file.path.endsWith("db.sqlite")) {
|
|
29
|
+
continue;
|
|
30
|
+
}
|
|
31
|
+
const p = path.join(args.path, file.path);
|
|
32
|
+
await args.fs.mkdir(path.dirname(p), { recursive: true });
|
|
33
|
+
await args.fs.writeFile(p, new Uint8Array(file.data));
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// run exporters
|
|
37
|
+
const plugins = await args.project.plugins.get();
|
|
38
|
+
const settings = await args.project.settings.get();
|
|
39
|
+
|
|
40
|
+
for (const plugin of plugins) {
|
|
41
|
+
// old legacy remove with v3
|
|
42
|
+
if (plugin.saveMessages) {
|
|
43
|
+
// in-efficient re-qeuery but it's a legacy function that will be removed.
|
|
44
|
+
// the effort of adjusting the code to not re-query is not worth it.
|
|
45
|
+
const bundlesNested = await selectBundleNested(args.project.db).execute();
|
|
46
|
+
await plugin.saveMessages({
|
|
47
|
+
messages: bundlesNested.map((b) => toMessageV1(b)),
|
|
48
|
+
// @ts-expect-error - legacy
|
|
49
|
+
nodeishFs: withAbsolutePaths(args.fs, args.path),
|
|
50
|
+
settings,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
if (plugin.exportFiles) {
|
|
55
|
+
const bundles = await args.project.db
|
|
56
|
+
.selectFrom("bundle")
|
|
57
|
+
.selectAll()
|
|
58
|
+
.execute();
|
|
59
|
+
const messages = await args.project.db
|
|
60
|
+
.selectFrom("message")
|
|
61
|
+
.selectAll()
|
|
62
|
+
.execute();
|
|
63
|
+
const variants = await args.project.db
|
|
64
|
+
.selectFrom("variant")
|
|
65
|
+
.selectAll()
|
|
66
|
+
.execute();
|
|
67
|
+
const files = await plugin.exportFiles({
|
|
68
|
+
bundles,
|
|
69
|
+
messages,
|
|
70
|
+
variants,
|
|
71
|
+
settings,
|
|
72
|
+
});
|
|
73
|
+
for (const file of files) {
|
|
74
|
+
const p = absolutePathFromProject(args.path, file.name);
|
|
75
|
+
const dirname = path.dirname(p);
|
|
76
|
+
if ((await args.fs.stat(dirname)).isDirectory() === false) {
|
|
77
|
+
await args.fs.mkdir(dirname, { recursive: true });
|
|
78
|
+
}
|
|
79
|
+
if (p.endsWith(".json")) {
|
|
80
|
+
try {
|
|
81
|
+
const existing = await args.fs.readFile(p, "utf-8");
|
|
82
|
+
const stringify = detectJsonFormatting(existing);
|
|
83
|
+
await args.fs.writeFile(
|
|
84
|
+
p,
|
|
85
|
+
new TextEncoder().encode(
|
|
86
|
+
stringify(JSON.parse(new TextDecoder().decode(file.content)))
|
|
87
|
+
)
|
|
88
|
+
);
|
|
89
|
+
} catch {
|
|
90
|
+
// write the file to disk (json doesn't exist yet)
|
|
91
|
+
// yeah ugly duplication of write file but it works.
|
|
92
|
+
await args.fs.writeFile(p, new Uint8Array(file.content));
|
|
93
|
+
}
|
|
94
|
+
} else {
|
|
95
|
+
await args.fs.writeFile(p, new Uint8Array(file.content));
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
import type {
|
|
3
|
+
InlangDatabaseSchema,
|
|
4
|
+
NewBundleNested,
|
|
5
|
+
} from "../database/schema.js";
|
|
6
|
+
|
|
7
|
+
export const insertBundleNested = async (
|
|
8
|
+
db: Kysely<InlangDatabaseSchema>,
|
|
9
|
+
bundle: NewBundleNested
|
|
10
|
+
): Promise<void> => {
|
|
11
|
+
await db.transaction().execute(async (trx) => {
|
|
12
|
+
const insertedBundle = await trx
|
|
13
|
+
.insertInto("bundle")
|
|
14
|
+
.values({
|
|
15
|
+
id: bundle.id,
|
|
16
|
+
declarations: bundle.declarations,
|
|
17
|
+
})
|
|
18
|
+
.returning("id")
|
|
19
|
+
.executeTakeFirstOrThrow();
|
|
20
|
+
|
|
21
|
+
for (const message of bundle.messages) {
|
|
22
|
+
const insertedMessage = await trx
|
|
23
|
+
.insertInto("message")
|
|
24
|
+
.values({
|
|
25
|
+
id: message.id,
|
|
26
|
+
bundleId: insertedBundle.id,
|
|
27
|
+
locale: message.locale,
|
|
28
|
+
selectors: message.selectors,
|
|
29
|
+
})
|
|
30
|
+
.returning("id")
|
|
31
|
+
.executeTakeFirstOrThrow();
|
|
32
|
+
|
|
33
|
+
for (const variant of message.variants) {
|
|
34
|
+
await trx
|
|
35
|
+
.insertInto("variant")
|
|
36
|
+
.values({
|
|
37
|
+
id: variant.id,
|
|
38
|
+
messageId: insertedMessage.id,
|
|
39
|
+
matches: variant.matches,
|
|
40
|
+
pattern: variant.pattern,
|
|
41
|
+
})
|
|
42
|
+
.execute();
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
import { jsonArrayFrom } from "kysely/helpers/sqlite";
|
|
3
|
+
import type { InlangDatabaseSchema } from "../database/schema.js";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Select bundles with nested messages and variants.
|
|
7
|
+
*
|
|
8
|
+
* `{ bundle, messages: [{ message, variants: [{ variant }] }] }`
|
|
9
|
+
*
|
|
10
|
+
* @example
|
|
11
|
+
* // getting one bundle where id is 123
|
|
12
|
+
* await selectBundleNested(db)
|
|
13
|
+
* .where("bundle.id", "=", "123")
|
|
14
|
+
* .executeTakeFirst()
|
|
15
|
+
*
|
|
16
|
+
* // getting all bundles
|
|
17
|
+
* await selectBundleNested(db)
|
|
18
|
+
* .execute()
|
|
19
|
+
*/
|
|
20
|
+
export const selectBundleNested = (db: Kysely<InlangDatabaseSchema>) => {
|
|
21
|
+
return db.selectFrom("bundle").select((eb) => [
|
|
22
|
+
// select all columns from bundle
|
|
23
|
+
"id",
|
|
24
|
+
"declarations",
|
|
25
|
+
// select all columns from messages as "messages"
|
|
26
|
+
jsonArrayFrom(
|
|
27
|
+
eb
|
|
28
|
+
.selectFrom("message")
|
|
29
|
+
.select((eb) => [
|
|
30
|
+
// select all columns from message
|
|
31
|
+
"id",
|
|
32
|
+
"bundleId",
|
|
33
|
+
"locale",
|
|
34
|
+
"selectors",
|
|
35
|
+
// select all columns from variants as "variants"
|
|
36
|
+
jsonArrayFrom(
|
|
37
|
+
eb
|
|
38
|
+
.selectFrom("variant")
|
|
39
|
+
.select(["id", "messageId", "matches", "pattern"])
|
|
40
|
+
.whereRef("variant.messageId", "=", "message.id")
|
|
41
|
+
).as("variants"),
|
|
42
|
+
])
|
|
43
|
+
.whereRef("message.bundleId", "=", "bundle.id")
|
|
44
|
+
).as("messages"),
|
|
45
|
+
]);
|
|
46
|
+
};
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
import type {
|
|
3
|
+
BundleNestedUpdate,
|
|
4
|
+
InlangDatabaseSchema,
|
|
5
|
+
} from "../database/schema.js";
|
|
6
|
+
|
|
7
|
+
export const updateBundleNested = async (
|
|
8
|
+
db: Kysely<InlangDatabaseSchema>,
|
|
9
|
+
bundle: BundleNestedUpdate & {
|
|
10
|
+
id: string;
|
|
11
|
+
messages: { id: string; variants: { id: string }[] }[];
|
|
12
|
+
}
|
|
13
|
+
): Promise<void> => {
|
|
14
|
+
await db
|
|
15
|
+
.updateTable("bundle")
|
|
16
|
+
.set(bundle)
|
|
17
|
+
.where("id", "=", bundle.id)
|
|
18
|
+
.execute();
|
|
19
|
+
|
|
20
|
+
for (const message of bundle.messages) {
|
|
21
|
+
await db
|
|
22
|
+
.updateTable("message")
|
|
23
|
+
.set(message)
|
|
24
|
+
.where("id", "=", message.id)
|
|
25
|
+
.execute();
|
|
26
|
+
|
|
27
|
+
for (const variant of message.variants) {
|
|
28
|
+
await db
|
|
29
|
+
.updateTable("variant")
|
|
30
|
+
.set(variant)
|
|
31
|
+
.where("id", "=", variant.id)
|
|
32
|
+
.execute();
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
};
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import type { Kysely } from "kysely";
|
|
2
|
+
import type {
|
|
3
|
+
InlangDatabaseSchema,
|
|
4
|
+
NewBundleNested,
|
|
5
|
+
} from "../database/schema.js";
|
|
6
|
+
|
|
7
|
+
export const upsertBundleNested = async (
|
|
8
|
+
db: Kysely<InlangDatabaseSchema>,
|
|
9
|
+
bundle: NewBundleNested
|
|
10
|
+
): Promise<void> => {
|
|
11
|
+
await db.transaction().execute(async (trx) => {
|
|
12
|
+
const insertedBundle = await trx
|
|
13
|
+
.insertInto("bundle")
|
|
14
|
+
.values({
|
|
15
|
+
id: bundle.id,
|
|
16
|
+
declarations: bundle.declarations,
|
|
17
|
+
})
|
|
18
|
+
.returning("id")
|
|
19
|
+
.onConflict((oc) =>
|
|
20
|
+
oc.column("id").doUpdateSet({
|
|
21
|
+
...bundle,
|
|
22
|
+
// @ts-expect-error - undefined
|
|
23
|
+
messages: undefined,
|
|
24
|
+
})
|
|
25
|
+
)
|
|
26
|
+
.executeTakeFirstOrThrow();
|
|
27
|
+
|
|
28
|
+
for (const message of bundle.messages) {
|
|
29
|
+
const insertedMessage = await trx
|
|
30
|
+
.insertInto("message")
|
|
31
|
+
.values({
|
|
32
|
+
id: message.id,
|
|
33
|
+
bundleId: insertedBundle.id,
|
|
34
|
+
locale: message.locale,
|
|
35
|
+
selectors: message.selectors,
|
|
36
|
+
})
|
|
37
|
+
.onConflict((oc) =>
|
|
38
|
+
oc.column("id").doUpdateSet({
|
|
39
|
+
...message,
|
|
40
|
+
// @ts-expect-error - undefined
|
|
41
|
+
variants: undefined,
|
|
42
|
+
})
|
|
43
|
+
)
|
|
44
|
+
.returning("id")
|
|
45
|
+
.executeTakeFirstOrThrow();
|
|
46
|
+
|
|
47
|
+
for (const variant of message.variants) {
|
|
48
|
+
await trx
|
|
49
|
+
.insertInto("variant")
|
|
50
|
+
.values({
|
|
51
|
+
id: variant.id,
|
|
52
|
+
messageId: insertedMessage.id,
|
|
53
|
+
matches: variant.matches,
|
|
54
|
+
pattern: variant.pattern,
|
|
55
|
+
})
|
|
56
|
+
.onConflict((oc) => oc.column("id").doUpdateSet(variant))
|
|
57
|
+
.execute();
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
});
|
|
61
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/* eslint-disable no-restricted-imports */
|
|
2
|
+
/* eslint-disable no-undef */
|
|
3
|
+
/**
|
|
4
|
+
* This script writes public environment variables
|
|
5
|
+
* to an importable env file.
|
|
6
|
+
*
|
|
7
|
+
* - The SDK must bundle this file with the rest of the SDK
|
|
8
|
+
* - This scripts avoids the need for a bundler
|
|
9
|
+
* - Must be ran before building the SDK
|
|
10
|
+
*/
|
|
11
|
+
|
|
12
|
+
import fs from "node:fs/promises";
|
|
13
|
+
import url from "node:url";
|
|
14
|
+
import path from "node:path";
|
|
15
|
+
|
|
16
|
+
const dirname = path.dirname(url.fileURLToPath(import.meta.url));
|
|
17
|
+
|
|
18
|
+
const packageJson = JSON.parse(
|
|
19
|
+
await fs.readFile(path.resolve(dirname, "../../../package.json"), "utf-8")
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
await fs.writeFile(
|
|
23
|
+
dirname + "/index.ts",
|
|
24
|
+
`
|
|
25
|
+
export const ENV_VARIABLES = {
|
|
26
|
+
PUBLIC_POSTHOG_TOKEN: ${ifDefined(process.env.PUBLIC_POSTHOG_TOKEN)},
|
|
27
|
+
PUBLIC_INLANG_SDK_SENTRY_DSN: ${ifDefined(
|
|
28
|
+
process.env.PUBLIC_INLANG_SDK_SENTRY_DSN
|
|
29
|
+
)},
|
|
30
|
+
SDK_VERSION: ${ifDefined(packageJson.version)},
|
|
31
|
+
}
|
|
32
|
+
`
|
|
33
|
+
);
|
|
34
|
+
|
|
35
|
+
// eslint-disable-next-line no-console
|
|
36
|
+
// console.log("✅ Created env variable index file.");
|
|
37
|
+
|
|
38
|
+
function ifDefined(value) {
|
|
39
|
+
return value ? `"${value}"` : undefined;
|
|
40
|
+
}
|
|
@@ -5,9 +5,12 @@
|
|
|
5
5
|
|
|
6
6
|
/**
|
|
7
7
|
* Env variables that are available at runtime.
|
|
8
|
-
*
|
|
9
|
-
* - assume that each env variable might be undefined (to ease development/contributions)
|
|
10
8
|
*/
|
|
11
|
-
export declare const ENV_VARIABLES:
|
|
12
|
-
PUBLIC_POSTHOG_TOKEN
|
|
13
|
-
|
|
9
|
+
export declare const ENV_VARIABLES: {
|
|
10
|
+
PUBLIC_POSTHOG_TOKEN?: string;
|
|
11
|
+
PUBLIC_INLANG_SDK_SENTRY_DSN?: string;
|
|
12
|
+
/**
|
|
13
|
+
* As defined in the package.json
|
|
14
|
+
*/
|
|
15
|
+
SDK_VERSION: string;
|
|
16
|
+
};
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { init, setUser, captureException } from "@sentry/browser";
|
|
2
|
+
import { ENV_VARIABLES } from "../env-variables/index.js";
|
|
3
|
+
|
|
4
|
+
export function initErrorReporting(args: { projectId: string }) {
|
|
5
|
+
if (ENV_VARIABLES.PUBLIC_INLANG_SDK_SENTRY_DSN) {
|
|
6
|
+
// in order to receive alerts like "if more than 100 "users" are effected, notify the team"
|
|
7
|
+
// the user id is set to the project id
|
|
8
|
+
setUser({ id: args.projectId });
|
|
9
|
+
init({
|
|
10
|
+
dsn: ENV_VARIABLES.PUBLIC_INLANG_SDK_SENTRY_DSN,
|
|
11
|
+
release: ENV_VARIABLES.SDK_VERSION,
|
|
12
|
+
});
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
/**
|
|
17
|
+
* Capture an error.
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* try {
|
|
21
|
+
* throw new Error("Something went wrong");
|
|
22
|
+
* } catch (error) {
|
|
23
|
+
* captureError(error);
|
|
24
|
+
* }
|
|
25
|
+
*/
|
|
26
|
+
export function captureError(error: Error | any) {
|
|
27
|
+
return captureException(error);
|
|
28
|
+
}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import { expect, test, vi } from "vitest";
|
|
2
|
+
import { capture } from "./capture.js";
|
|
3
|
+
|
|
4
|
+
test("it should not capture if telemetry is off", async () => {
|
|
5
|
+
// @ts-expect-error - global.fetch is not defined
|
|
6
|
+
global.fetch = vi.fn(() => Promise.resolve());
|
|
7
|
+
|
|
8
|
+
vi.mock("../env-variables/index.js", async () => {
|
|
9
|
+
return {
|
|
10
|
+
ENV_VARIABLES: {
|
|
11
|
+
PUBLIC_POSTHOG_TOKEN: "mock-defined",
|
|
12
|
+
},
|
|
13
|
+
};
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
await capture("SDK loaded project", {
|
|
17
|
+
projectId: "test",
|
|
18
|
+
settings: {
|
|
19
|
+
telemetry: "off",
|
|
20
|
+
},
|
|
21
|
+
properties: {},
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
expect(global.fetch).not.toHaveBeenCalled();
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
test("it should not capture if telemetry is NOT off", async () => {
|
|
28
|
+
// @ts-expect-error - global.fetch is not defined
|
|
29
|
+
global.fetch = vi.fn(() => Promise.resolve());
|
|
30
|
+
|
|
31
|
+
vi.mock("../env-variables/index.js", async () => {
|
|
32
|
+
return {
|
|
33
|
+
ENV_VARIABLES: {
|
|
34
|
+
PUBLIC_POSTHOG_TOKEN: "mock-defined",
|
|
35
|
+
},
|
|
36
|
+
};
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
await capture("SDK loaded project", {
|
|
40
|
+
projectId: "test",
|
|
41
|
+
settings: {
|
|
42
|
+
telemetry: undefined,
|
|
43
|
+
},
|
|
44
|
+
properties: {},
|
|
45
|
+
});
|
|
46
|
+
|
|
47
|
+
expect(global.fetch).toHaveBeenCalled();
|
|
48
|
+
});
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
// import { ENV_VARIABLES } from "../env-variables/index.js";
|
|
2
|
+
|
|
3
|
+
import type { ProjectSettings } from "../../json-schema/settings.js";
|
|
4
|
+
import { ENV_VARIABLES } from "../env-variables/index.js";
|
|
5
|
+
import { captureError } from "../error-reporting/index.js";
|
|
6
|
+
|
|
7
|
+
/**
|
|
8
|
+
* List of telemetry events for typesafety.
|
|
9
|
+
*
|
|
10
|
+
* - prefix with `SDK` to avoid collisions with other apps
|
|
11
|
+
* - use past tense to indicate that the event is completed
|
|
12
|
+
*/
|
|
13
|
+
type TelemetryEvent = "SDK loaded project";
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Capture an event.
|
|
17
|
+
*
|
|
18
|
+
* - manually calling the PostHog API because the SDKs were not platform angostic (and generally bloated)
|
|
19
|
+
*/
|
|
20
|
+
export const capture = async (
|
|
21
|
+
event: TelemetryEvent,
|
|
22
|
+
args: {
|
|
23
|
+
projectId: string;
|
|
24
|
+
/**
|
|
25
|
+
* Please use snake_case for property names.
|
|
26
|
+
*/
|
|
27
|
+
properties: Record<string, any>;
|
|
28
|
+
settings: Pick<ProjectSettings, "telemetry">;
|
|
29
|
+
}
|
|
30
|
+
) => {
|
|
31
|
+
if (args.settings.telemetry === "off") {
|
|
32
|
+
return;
|
|
33
|
+
} else if (ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN === undefined) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
try {
|
|
37
|
+
await fetch("https://eu.posthog.com/capture/", {
|
|
38
|
+
method: "POST",
|
|
39
|
+
body: JSON.stringify({
|
|
40
|
+
api_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,
|
|
41
|
+
event,
|
|
42
|
+
// id is "unknown" because no user information is available
|
|
43
|
+
distinct_id: "unknown",
|
|
44
|
+
properties: {
|
|
45
|
+
$groups: { project: args.projectId },
|
|
46
|
+
...args.properties,
|
|
47
|
+
},
|
|
48
|
+
}),
|
|
49
|
+
});
|
|
50
|
+
await identifyProject({
|
|
51
|
+
projectId: args.projectId,
|
|
52
|
+
// using the id for now as a name but can be changed in the future
|
|
53
|
+
// we need at least one property to make a project visible in the dashboar
|
|
54
|
+
properties: { name: args.projectId },
|
|
55
|
+
});
|
|
56
|
+
} catch (e) {
|
|
57
|
+
captureError(e);
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
/**
|
|
62
|
+
* Identifying a project is needed.
|
|
63
|
+
*
|
|
64
|
+
* Otherwise, the project will not be visible in the PostHog dashboard.
|
|
65
|
+
*/
|
|
66
|
+
const identifyProject = async (args: {
|
|
67
|
+
projectId: string;
|
|
68
|
+
/**
|
|
69
|
+
* Please use snake_case for property names.
|
|
70
|
+
*/
|
|
71
|
+
properties: Record<string, any>;
|
|
72
|
+
}) => {
|
|
73
|
+
// do not send events if the token is not set
|
|
74
|
+
// (assuming this eases testing)
|
|
75
|
+
if (ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN === undefined) {
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
try {
|
|
79
|
+
await fetch("https://eu.posthog.com/capture/", {
|
|
80
|
+
method: "POST",
|
|
81
|
+
body: JSON.stringify({
|
|
82
|
+
api_key: ENV_VARIABLES.PUBLIC_POSTHOG_TOKEN,
|
|
83
|
+
event: "$groupidentify",
|
|
84
|
+
// id is "unknown" because no user information is available
|
|
85
|
+
distinct_id: "unknown",
|
|
86
|
+
properties: {
|
|
87
|
+
$group_type: "project",
|
|
88
|
+
$group_key: args.projectId,
|
|
89
|
+
$group_set: {
|
|
90
|
+
...args.properties,
|
|
91
|
+
},
|
|
92
|
+
},
|
|
93
|
+
}),
|
|
94
|
+
});
|
|
95
|
+
} catch (e) {
|
|
96
|
+
captureError(e);
|
|
97
|
+
}
|
|
98
|
+
};
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { expect, it } from "vitest";
|
|
2
|
+
import { detectJsonFormatting } from "./detectJsonFormatting.js";
|
|
3
|
+
|
|
4
|
+
it("should detect spacing", () => {
|
|
5
|
+
// test all possible spacings
|
|
6
|
+
for (const value of [1, 2, 3, 4, 6, 8, "\t"]) {
|
|
7
|
+
const spacing = value === "\t" ? "\t" : " ".repeat(value as number);
|
|
8
|
+
const objectWithSpacing = `{\n${spacing}"test": "test"\n}`;
|
|
9
|
+
|
|
10
|
+
const serialize = detectJsonFormatting(objectWithSpacing);
|
|
11
|
+
expect(serialize(JSON.parse(objectWithSpacing))).toBe(objectWithSpacing);
|
|
12
|
+
}
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("should detect spacing if the json is an array", () => {
|
|
16
|
+
// testing with one element only because dynamic generation of
|
|
17
|
+
// arrays with different spacings is too complex
|
|
18
|
+
const objectWithSpacing = `[\n\t"test",\n\t"test"\n]`;
|
|
19
|
+
|
|
20
|
+
const serialize = detectJsonFormatting(objectWithSpacing);
|
|
21
|
+
expect(serialize(JSON.parse(objectWithSpacing))).toBe(objectWithSpacing);
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("should detect new lines correctly", () => {
|
|
25
|
+
const withNewLine = `{"test":"test"}\n`;
|
|
26
|
+
const withoutNewLine = `{"test":"test"}`;
|
|
27
|
+
const withNewLineAndSpacing = `{\n\t"test": "test"\n}`;
|
|
28
|
+
|
|
29
|
+
const serialize1 = detectJsonFormatting(withNewLine);
|
|
30
|
+
const serialize2 = detectJsonFormatting(withoutNewLine);
|
|
31
|
+
const serialize3 = detectJsonFormatting(withNewLineAndSpacing);
|
|
32
|
+
|
|
33
|
+
expect(serialize1(JSON.parse(withNewLine))).toBe(withNewLine);
|
|
34
|
+
expect(serialize2(JSON.parse(withoutNewLine))).toBe(withoutNewLine);
|
|
35
|
+
expect(serialize3(JSON.parse(withNewLineAndSpacing))).toBe(
|
|
36
|
+
withNewLineAndSpacing
|
|
37
|
+
);
|
|
38
|
+
});
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Detects the formatting of a JSON file and returns a function
|
|
3
|
+
* that can be used to stringify JSON with the same formatting.
|
|
4
|
+
*
|
|
5
|
+
* @example
|
|
6
|
+
* const file = await fs.readFile("./messages.json", { encoding: "utf-8" })
|
|
7
|
+
* const stringify = detectJsonFormatting(file)
|
|
8
|
+
* const newFile = stringify(json)
|
|
9
|
+
*/
|
|
10
|
+
export const detectJsonFormatting = (
|
|
11
|
+
file: string
|
|
12
|
+
): ((
|
|
13
|
+
value: Parameters<typeof JSON.stringify>[0],
|
|
14
|
+
replacer?: Parameters<typeof JSON.stringify>[1]
|
|
15
|
+
// space is provided by the function
|
|
16
|
+
) => string) => {
|
|
17
|
+
const endsWithNewLine = file.endsWith("\n");
|
|
18
|
+
const spacing = guessJsonIndent(file);
|
|
19
|
+
|
|
20
|
+
return (value, replacer) =>
|
|
21
|
+
JSON.stringify(value, replacer, spacing as any) +
|
|
22
|
+
(endsWithNewLine ? "\n" : "");
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* vendored from https://github.com/ehmicky/guess-json-indent
|
|
27
|
+
*/
|
|
28
|
+
// Guess the indentation of a JSON string
|
|
29
|
+
const guessJsonIndent = (jsonString: string) => {
|
|
30
|
+
const firstIndex = skipWhitespaces(jsonString, 0);
|
|
31
|
+
|
|
32
|
+
if (
|
|
33
|
+
firstIndex === undefined ||
|
|
34
|
+
!isJsonObjectOrArray(jsonString[firstIndex])
|
|
35
|
+
) {
|
|
36
|
+
return;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const secondIndex = skipWhitespaces(jsonString, firstIndex + 1);
|
|
40
|
+
|
|
41
|
+
if (secondIndex === undefined) {
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
return getIndent(jsonString, firstIndex, secondIndex);
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Whitespaces are ignored before|between|after tokens in JSON.
|
|
49
|
+
// Uses imperative logic for performance.
|
|
50
|
+
const skipWhitespaces = (jsonString: string | any[], startIndex: number) => {
|
|
51
|
+
for (let index = startIndex; index < jsonString.length; index += 1) {
|
|
52
|
+
const character = jsonString[index];
|
|
53
|
+
|
|
54
|
+
if (!isJsonWhitespace(character)) {
|
|
55
|
+
return index;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
return;
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
// JSON defines only those are valid whitespaces
|
|
62
|
+
const isJsonWhitespace = (character: string) =>
|
|
63
|
+
character === " " ||
|
|
64
|
+
character === "\t" ||
|
|
65
|
+
character === "\n" ||
|
|
66
|
+
character === "\r";
|
|
67
|
+
|
|
68
|
+
// If the top-level value is another type than an object or an array, there is
|
|
69
|
+
// no possible indentation
|
|
70
|
+
const isJsonObjectOrArray = (character: string | undefined) =>
|
|
71
|
+
character === "{" || character === "[";
|
|
72
|
+
|
|
73
|
+
// Uses imperative logic for performance
|
|
74
|
+
// @ts-expect-error - not all code paths return a value
|
|
75
|
+
const getIndent = (
|
|
76
|
+
jsonString: string | any[],
|
|
77
|
+
firstIndex: number,
|
|
78
|
+
secondIndex: number
|
|
79
|
+
) => {
|
|
80
|
+
let indent;
|
|
81
|
+
|
|
82
|
+
for (let index = secondIndex - 1; index > firstIndex; index -= 1) {
|
|
83
|
+
const character = jsonString[index];
|
|
84
|
+
|
|
85
|
+
if (character === "\r") {
|
|
86
|
+
return;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
if (character === "\n") {
|
|
90
|
+
return normalizeIndent(indent);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
if (indent === undefined) {
|
|
94
|
+
indent = character;
|
|
95
|
+
} else if (indent[0] === character) {
|
|
96
|
+
indent += character;
|
|
97
|
+
} else {
|
|
98
|
+
return;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
};
|
|
102
|
+
|
|
103
|
+
const normalizeIndent = (indent: string | any[] | undefined) => {
|
|
104
|
+
if (indent === undefined) {
|
|
105
|
+
return 0;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return indent[0] === " " ? indent.length : indent;
|
|
109
|
+
};
|