@futdevpro/fsm-dynamo 1.15.18 → 1.15.20
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/.cursor/rules/__assistant_guide.mdc +30 -30
- package/.cursor/rules/_ag_backend-structure.mdc +85 -85
- package/.cursor/rules/_ag_backend.mdc +16 -16
- package/.cursor/rules/_ag_frontend-structure.mdc +86 -86
- package/.cursor/rules/_ag_frontend.mdc +39 -39
- package/.cursor/rules/_ag_import-rules.mdc +44 -44
- package/.cursor/rules/_ag_naming.mdc +115 -115
- package/.cursor/rules/_ag_should-be.mdc +6 -6
- package/.cursor/rules/ai_development_guide.md +60 -60
- package/.cursor/rules/cursor-rules.md +160 -160
- package/.cursor/rules/default-command.mdc +464 -464
- package/.cursor/rules/error_code_pattern.md +39 -39
- package/.cursor/rules/saved rule mcp server use.md +15 -15
- package/.dynamo/pipeline.cicd.config.json +128 -128
- package/.github/workflows/main.yml +433 -433
- package/.vscode/settings.json +11 -11
- package/LICENSE +21 -21
- package/__documentations/2026-06-01-fr047-fc-foundation.md +48 -0
- package/build/_models/data-models/errors.data-model.d.ts +43 -0
- package/build/_models/data-models/errors.data-model.d.ts.map +1 -1
- package/build/_models/data-models/errors.data-model.js +30 -0
- package/build/_models/data-models/errors.data-model.js.map +1 -1
- package/build/_modules/socket/_models/sck-socket-event.control-model.js +1 -1
- package/eslint.config.js +4 -4
- package/nodemon.json +22 -22
- package/package.json +11 -11
- package/scripts/crypto/CRYPTO-STABILITY-SOLUTION.md +196 -196
- package/scripts/crypto/README.md +113 -113
- package/scripts/crypto/demo-crypto-stability.js +120 -120
- package/scripts/crypto/stress-test-crypto.js +379 -379
- package/scripts/run-coverage-tests.js +24 -24
- package/spec/support/helpers/ts-node-helper.js +9 -9
- package/spec/support/jasmine.coverage.json +23 -23
- package/spec/support/jasmine.json +24 -24
- package/src/_collections/constants/data-sizes.const.ts +40 -40
- package/src/_collections/constants/error-defaults.const.ts +20 -20
- package/src/_collections/constants/global-settings.const.ts +24 -24
- package/src/_collections/constants/numbers.const.ts +40 -40
- package/src/_collections/constants/times.const.ts +45 -45
- package/src/_collections/utils/array.util.spec.ts +306 -306
- package/src/_collections/utils/array.util.ts +813 -813
- package/src/_collections/utils/async.util.spec.ts +354 -354
- package/src/_collections/utils/async.util.ts +197 -197
- package/src/_collections/utils/data.util.spec.ts +345 -345
- package/src/_collections/utils/data.util.ts +226 -226
- package/src/_collections/utils/json-error-helper.util.spec.ts +521 -521
- package/src/_collections/utils/json-error-helper.util.ts +301 -301
- package/src/_collections/utils/log.util.spec.ts +975 -975
- package/src/_collections/utils/log.util.ts +665 -665
- package/src/_collections/utils/math/box-bounds.spec.ts +73 -73
- package/src/_collections/utils/math/box-bounds.util.ts +183 -183
- package/src/_collections/utils/math/math.util.spec.ts +94 -94
- package/src/_collections/utils/math/math.util.ts +141 -141
- package/src/_collections/utils/math/random.util.spec.ts +82 -82
- package/src/_collections/utils/math/random.util.ts +139 -139
- package/src/_collections/utils/math/trigonometry.util.spec.ts +57 -57
- package/src/_collections/utils/math/trigonometry.util.ts +102 -102
- package/src/_collections/utils/math/vector2.util.spec.ts +94 -94
- package/src/_collections/utils/math/vector2.util.ts +653 -653
- package/src/_collections/utils/object.util.spec.ts +646 -646
- package/src/_collections/utils/regex/password-regex.util.spec.ts +51 -51
- package/src/_collections/utils/regex/password-regex.util.ts +65 -65
- package/src/_collections/utils/regex/regex.util.spec.ts +42 -42
- package/src/_collections/utils/regex/regex.util.ts +6 -6
- package/src/_collections/utils/regex/username-regex.util.spec.ts +61 -61
- package/src/_collections/utils/regex/username-regex.util.ts +35 -35
- package/src/_collections/utils/round-list.util.spec.ts +79 -79
- package/src/_collections/utils/round-list.util.ts +162 -162
- package/src/_collections/utils/stack.util.spec.ts +372 -372
- package/src/_collections/utils/stack.util.ts +164 -164
- package/src/_collections/utils/string-case.util.spec.ts +441 -441
- package/src/_collections/utils/string-case.util.ts +362 -362
- package/src/_collections/utils/string.util.spec.ts +975 -975
- package/src/_collections/utils/string.util.ts +449 -449
- package/src/_collections/utils/time.util.spec.ts +50 -50
- package/src/_collections/utils/time.util.ts +481 -481
- package/src/_collections/utils/type-cloning-facility.util.spec.ts +51 -51
- package/src/_collections/utils/type-cloning-facility.util.ts +168 -168
- package/src/_collections/utils/utilities.util.spec.ts +201 -201
- package/src/_collections/utils/utilities.util.ts +68 -68
- package/src/_collections/utils/uuid.util.spec.ts +30 -30
- package/src/_collections/utils/uuid.util.ts +50 -50
- package/src/_enums/basic-property-type.enum.ts +20 -20
- package/src/_enums/data-model-type.enum.ts +29 -29
- package/src/_enums/environment-flag.enum.ts +28 -28
- package/src/_enums/error-level.enum.ts +28 -28
- package/src/_enums/http/http-call-type.enum.ts +43 -43
- package/src/_enums/http/http-event-type.enum.ts +40 -40
- package/src/_enums/http/http-response-type.enum.ts +18 -18
- package/src/_enums/log-style.enum.ts +44 -44
- package/src/_enums/server-connection-status.enum.ts +6 -6
- package/src/_enums/time/day-of-week.enum.ts +55 -55
- package/src/_enums/time/month.enum.ts +25 -25
- package/src/_enums/time/relative-date.enum.ts +24 -24
- package/src/_models/control-models/data-model-params.control-model.spec.ts +85 -85
- package/src/_models/control-models/data-model-params.control-model.ts +300 -300
- package/src/_models/control-models/data-property-params.control-model.spec.ts +93 -93
- package/src/_models/control-models/data-property-params.control-model.ts +201 -201
- package/src/_models/control-models/error.control-model.spec.ts +912 -912
- package/src/_models/control-models/error.control-model.ts +1215 -1215
- package/src/_models/control-models/http/http-error-response.control-model.spec.ts +116 -116
- package/src/_models/control-models/http/http-error-response.control-model.ts +52 -52
- package/src/_models/control-models/http/http-headers.control-model.spec.ts +25 -25
- package/src/_models/control-models/http/http-headers.control-model.ts +124 -124
- package/src/_models/control-models/http/http-response.model-base.spec.ts +46 -46
- package/src/_models/control-models/http/http-response.model-base.ts +57 -57
- package/src/_models/control-models/poll.control-model.spec.ts +63 -63
- package/src/_models/control-models/poll.control-model.ts +151 -151
- package/src/_models/control-models/range-value.control-model.spec.ts +187 -187
- package/src/_models/control-models/range-value.control-model.ts +289 -289
- package/src/_models/control-models/server-status.control-model.spec.ts +66 -66
- package/src/_models/control-models/server-status.control-model.ts +85 -85
- package/src/_models/control-models/service-endpoint-settings-base.control-model.spec.ts +145 -145
- package/src/_models/control-models/service-endpoint-settings-base.control-model.ts +186 -186
- package/src/_models/data-models/errors.data-model.spec.ts +71 -71
- package/src/_models/data-models/errors.data-model.ts +148 -91
- package/src/_models/data-models/metadata.data-model.spec.ts +184 -184
- package/src/_models/data-models/metadata.data-model.ts +128 -128
- package/src/_models/interfaces/box-bounds.interface.ts +7 -7
- package/src/_models/interfaces/environment/global-log-settings.interface.ts +86 -86
- package/src/_models/interfaces/environment/global-settings.interface.ts +47 -47
- package/src/_models/interfaces/error-defaults.interface.ts +11 -11
- package/src/_models/interfaces/paged.interface.ts +12 -12
- package/src/_models/interfaces/random-weight.interface.ts +7 -7
- package/src/_models/interfaces/route-settings.interface.ts +15 -15
- package/src/_models/interfaces/search-query.interface.ts +23 -23
- package/src/_models/interfaces/search-result.interface.ts +5 -5
- package/src/_models/interfaces/server-error-statistics.interface.ts +24 -24
- package/src/_models/interfaces/vector2.interface.ts +20 -20
- package/src/_models/types/db-filter.type.ts +110 -110
- package/src/_models/types/db-sort.type.ts +4 -4
- package/src/_models/types/ds-filter.type.ts +68 -68
- package/src/_models/types/ds-sort.type.ts +21 -21
- package/src/_modules/ai/_collections/ai-model-ref.util.ts +88 -88
- package/src/_modules/ai/_collections/ai-model-registry.util.spec.ts +37 -37
- package/src/_modules/ai/_collections/ai-model-registry.util.ts +30 -30
- package/src/_modules/ai/_enums/ai-message-role.enum.ts +7 -7
- package/src/_modules/ai/_enums/ai-model-type.enum.ts +7 -7
- package/src/_modules/ai/_enums/ai-provider.enum.ts +7 -7
- package/src/_modules/ai/_models/ai-call-settings.interface.ts +84 -84
- package/src/_modules/ai/_models/ai-embedding-request.interface.ts +20 -20
- package/src/_modules/ai/_models/ai-embedding-response.interface.ts +26 -26
- package/src/_modules/ai/_models/ai-llm-request.interface.ts +24 -24
- package/src/_modules/ai/_models/ai-llm-response.interface.ts +30 -30
- package/src/_modules/ai/_models/ai-message.interface.ts +12 -12
- package/src/_modules/ai/_models/ai-model-capabilities.interface.ts +35 -35
- package/src/_modules/ai/_models/ai-model-info.interface.ts +63 -63
- package/src/_modules/ai/_models/ai-model-settings-schema.interface.ts +52 -52
- package/src/_modules/ai/_models/ai-provider-capabilities.interface.ts +28 -28
- package/src/_modules/ai/_models/ai-settings.interface.ts +17 -17
- package/src/_modules/ai/_models/ai-tool-call.interface.ts +18 -18
- package/src/_modules/ai/_models/ai-tool-handler.type.ts +11 -11
- package/src/_modules/ai/_models/ai-tool-result.interface.ts +16 -16
- package/src/_modules/ai/_models/ai-tool.interface.ts +16 -16
- package/src/_modules/ai/_models/ai-user-provider-config.control-model.ts +29 -29
- package/src/_modules/ai/_modules/anthropic/_collections/aai-models.const.ts +81 -81
- package/src/_modules/ai/_modules/anthropic/_enums/aai-model.enum.ts +19 -19
- package/src/_modules/ai/_modules/anthropic/_models/aai-call-settings.control-model.spec.ts +28 -28
- package/src/_modules/ai/_modules/anthropic/_models/aai-call-settings.control-model.ts +23 -23
- package/src/_modules/ai/_modules/anthropic/_models/aai-client-options.interface.ts +10 -10
- package/src/_modules/ai/_modules/anthropic/_models/aai-settings.control-model.spec.ts +22 -22
- package/src/_modules/ai/_modules/anthropic/_models/aai-settings.control-model.ts +27 -27
- package/src/_modules/ai/_modules/anthropic/_models/aai-user-provider-config.control-model.ts +20 -20
- package/src/_modules/ai/_modules/anthropic/index.ts +14 -14
- package/src/_modules/ai/_modules/document-ai/_models/dai-embedding-info.interface.ts +12 -12
- package/src/_modules/ai/_modules/document-ai/_models/dai-vector-search-params.interface.ts +22 -22
- package/src/_modules/ai/_modules/document-ai/index.ts +4 -4
- package/src/_modules/ai/_modules/fdp-ai/_collections/fdpai-models.const.ts +34 -34
- package/src/_modules/ai/_modules/fdp-ai/_enums/fdpai-model.enum.ts +6 -6
- package/src/_modules/ai/_modules/fdp-ai/_models/fdpai-call-settings.control-model.ts +19 -19
- package/src/_modules/ai/_modules/fdp-ai/_models/fdpai-client-options.interface.ts +11 -11
- package/src/_modules/ai/_modules/fdp-ai/_models/fdpai-settings.control-model.ts +24 -24
- package/src/_modules/ai/_modules/fdp-ai/_models/fdpai-user-provider-config.control-model.ts +20 -20
- package/src/_modules/ai/_modules/fdp-ai/index.ts +11 -11
- package/src/_modules/ai/_modules/google-ai/_collections/gai-models.const.ts +99 -99
- package/src/_modules/ai/_modules/google-ai/_enums/gai-model.enum.ts +16 -16
- package/src/_modules/ai/_modules/google-ai/_models/gai-call-settings.control-model.spec.ts +28 -28
- package/src/_modules/ai/_modules/google-ai/_models/gai-call-settings.control-model.ts +21 -21
- package/src/_modules/ai/_modules/google-ai/_models/gai-client-options.interface.ts +8 -8
- package/src/_modules/ai/_modules/google-ai/_models/gai-settings.control-model.spec.ts +22 -22
- package/src/_modules/ai/_modules/google-ai/_models/gai-settings.control-model.ts +25 -25
- package/src/_modules/ai/_modules/google-ai/_models/gai-user-provider-config.control-model.ts +20 -20
- package/src/_modules/ai/_modules/google-ai/index.ts +14 -14
- package/src/_modules/ai/_modules/local-ai/_collections/lai-models.const.ts +53 -53
- package/src/_modules/ai/_modules/local-ai/_enums/lai-model.enum.ts +6 -6
- package/src/_modules/ai/_modules/local-ai/_models/lai-call-settings.control-model.spec.ts +28 -28
- package/src/_modules/ai/_modules/local-ai/_models/lai-call-settings.control-model.ts +18 -18
- package/src/_modules/ai/_modules/local-ai/_models/lai-client-options.interface.ts +9 -9
- package/src/_modules/ai/_modules/local-ai/_models/lai-settings.control-model.spec.ts +22 -22
- package/src/_modules/ai/_modules/local-ai/_models/lai-settings.control-model.ts +23 -23
- package/src/_modules/ai/_modules/local-ai/index.ts +14 -14
- package/src/_modules/ai/_modules/open-ai/_collections/oai-embedding-model-dimensions.const.ts +7 -7
- package/src/_modules/ai/_modules/open-ai/_collections/oai-models.const.ts +252 -252
- package/src/_modules/ai/_modules/open-ai/_enums/oai-model.enum.ts +179 -179
- package/src/_modules/ai/_modules/open-ai/_models/oai-call-settings.control-model.spec.ts +28 -28
- package/src/_modules/ai/_modules/open-ai/_models/oai-call-settings.control-model.ts +21 -21
- package/src/_modules/ai/_modules/open-ai/_models/oai-client-options.interface.ts +81 -81
- package/src/_modules/ai/_modules/open-ai/_models/oai-embedding-info.interface.ts +13 -13
- package/src/_modules/ai/_modules/open-ai/_models/oai-settings.control-model.spec.ts +22 -22
- package/src/_modules/ai/_modules/open-ai/_models/oai-settings.control-model.ts +25 -25
- package/src/_modules/ai/_modules/open-ai/_models/oai-user-provider-config.control-model.ts +21 -21
- package/src/_modules/ai/_modules/open-ai/index.ts +28 -28
- package/src/_modules/ai/index.ts +27 -27
- package/src/_modules/ci-tools/_enums/cit-ci-result-code.enum.ts +11 -11
- package/src/_modules/ci-tools/_enums/cit-ci-step-result-code.enum.ts +9 -9
- package/src/_modules/ci-tools/_models/cit-ci-result-info.data-models.spec.ts +58 -58
- package/src/_modules/ci-tools/_models/cit-ci-result-info.data-models.ts +77 -77
- package/src/_modules/ci-tools/_models/cit-ci-step-result.interface.ts +12 -12
- package/src/_modules/ci-tools/index.ts +8 -8
- package/src/_modules/crypto/_collections/crypto.util.simple.spec.ts +512 -512
- package/src/_modules/crypto/index.ts +13 -13
- package/src/_modules/custom-data/_collections/cud-module-settings.const.ts +21 -21
- package/src/_modules/custom-data/_models/cud.data-model.spec.ts +38 -38
- package/src/_modules/custom-data/_models/cud.data-model.ts +39 -39
- package/src/_modules/custom-data/index.ts +10 -10
- package/src/_modules/data-handler/_models/data-handler-settings.control-model.spec.ts +110 -110
- package/src/_modules/data-handler/_models/data-handler-settings.control-model.ts +110 -110
- package/src/_modules/data-handler/_models/data-handler.control-model.spec.ts +445 -445
- package/src/_modules/data-handler/_models/data-handler.control-model.ts +459 -459
- package/src/_modules/data-handler/_models/data-list-handler.control-model.spec.ts +263 -263
- package/src/_modules/data-handler/_models/data-list-handler.control-model.ts +252 -252
- package/src/_modules/data-handler/_models/data-search-handler.control-model.spec.ts +417 -417
- package/src/_modules/data-handler/_models/data-search-handler.control-model.ts +390 -390
- package/src/_modules/data-handler/_models/list-collector-data-handler.control-model.spec.ts +374 -374
- package/src/_modules/data-handler/_models/list-collector-data-handler.control-model.ts +274 -274
- package/src/_modules/data-handler/index.ts +6 -6
- package/src/_modules/location/_collections/assets/country-codes-ISO-3166.json +3239 -3239
- package/src/_modules/location/_collections/assets/country-divisions-ISO-3166-all-list.json +19035 -19035
- package/src/_modules/location/_collections/assets/country-divisions-ISO-3166.json +4993 -4993
- package/src/_modules/location/_collections/assets/country-phone-codes.json +1203 -1203
- package/src/_modules/location/_collections/assets/country-subdivisions/afghanistan.json +137 -137
- package/src/_modules/location/_collections/assets/country-subdivisions/albania.json +49 -49
- package/src/_modules/location/_collections/assets/country-subdivisions/algeria.json +193 -193
- package/src/_modules/location/_collections/assets/country-subdivisions/andorra.json +29 -29
- package/src/_modules/location/_collections/assets/country-subdivisions/angola.json +73 -73
- package/src/_modules/location/_collections/assets/country-subdivisions/antigua-and-barbuda.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/argentina.json +97 -97
- package/src/_modules/location/_collections/assets/country-subdivisions/armenia.json +45 -45
- package/src/_modules/location/_collections/assets/country-subdivisions/australia.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/austria.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/azerbaijan.json +5 -5
- package/src/_modules/location/_collections/assets/country-subdivisions/bahamas.json +125 -125
- package/src/_modules/location/_collections/assets/country-subdivisions/bahrain.json +21 -21
- package/src/_modules/location/_collections/assets/country-subdivisions/bangladesh.json +29 -29
- package/src/_modules/location/_collections/assets/country-subdivisions/barbados.json +45 -45
- package/src/_modules/location/_collections/assets/country-subdivisions/belarus.json +29 -29
- package/src/_modules/location/_collections/assets/country-subdivisions/belgium.json +13 -13
- package/src/_modules/location/_collections/assets/country-subdivisions/belize.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/benin.json +49 -49
- package/src/_modules/location/_collections/assets/country-subdivisions/bhutan.json +81 -81
- package/src/_modules/location/_collections/assets/country-subdivisions/bolivia.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/bosnia-and-herzegovina.json +13 -13
- package/src/_modules/location/_collections/assets/country-subdivisions/botswana.json +65 -65
- package/src/_modules/location/_collections/assets/country-subdivisions/brazil.json +109 -109
- package/src/_modules/location/_collections/assets/country-subdivisions/brunei-darussalam.json +17 -17
- package/src/_modules/location/_collections/assets/country-subdivisions/bulgaria.json +113 -113
- package/src/_modules/location/_collections/assets/country-subdivisions/burkina-faso.json +53 -53
- package/src/_modules/location/_collections/assets/country-subdivisions/burundi.json +69 -69
- package/src/_modules/location/_collections/assets/country-subdivisions/cambodia.json +97 -97
- package/src/_modules/location/_collections/assets/country-subdivisions/cameroon.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/canada.json +79 -79
- package/src/_modules/location/_collections/assets/country-subdivisions/cape-verde.json +9 -9
- package/src/_modules/location/_collections/assets/country-subdivisions/central-african-republic.json +69 -69
- package/src/_modules/location/_collections/assets/country-subdivisions/chad.json +89 -89
- package/src/_modules/location/_collections/assets/country-subdivisions/chile.json +61 -61
- package/src/_modules/location/_collections/assets/country-subdivisions/china.json +205 -205
- package/src/_modules/location/_collections/assets/country-subdivisions/colombia.json +133 -133
- package/src/_modules/location/_collections/assets/country-subdivisions/comoros.json +13 -13
- package/src/_modules/location/_collections/assets/country-subdivisions/congo-the-democratic-republic-of-the.json +45 -45
- package/src/_modules/location/_collections/assets/country-subdivisions/congo.json +49 -49
- package/src/_modules/location/_collections/assets/country-subdivisions/costa-rica.json +29 -29
- package/src/_modules/location/_collections/assets/country-subdivisions/cote-d-ivoire-republic-of.json +77 -77
- package/src/_modules/location/_collections/assets/country-subdivisions/croatia.json +85 -85
- package/src/_modules/location/_collections/assets/country-subdivisions/cuba.json +65 -65
- package/src/_modules/location/_collections/assets/country-subdivisions/cyprus.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/czech-republic.json +57 -57
- package/src/_modules/location/_collections/assets/country-subdivisions/denmark.json +21 -21
- package/src/_modules/location/_collections/assets/country-subdivisions/djibouti.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/dominica.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/dominican-republic.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/ecuador.json +97 -97
- package/src/_modules/location/_collections/assets/country-subdivisions/egypt.json +117 -117
- package/src/_modules/location/_collections/assets/country-subdivisions/el-salvador.json +57 -57
- package/src/_modules/location/_collections/assets/country-subdivisions/equatorial-guinea.json +9 -9
- package/src/_modules/location/_collections/assets/country-subdivisions/eritrea.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/estonia.json +61 -61
- package/src/_modules/location/_collections/assets/country-subdivisions/ethiopia.json +45 -45
- package/src/_modules/location/_collections/assets/country-subdivisions/fiji.json +21 -21
- package/src/_modules/location/_collections/assets/country-subdivisions/finland.json +77 -77
- package/src/_modules/location/_collections/assets/country-subdivisions/france.json +133 -133
- package/src/_modules/location/_collections/assets/country-subdivisions/gabon.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/gambia.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/georgia.json +49 -49
- package/src/_modules/location/_collections/assets/country-subdivisions/germany.json +65 -65
- package/src/_modules/location/_collections/assets/country-subdivisions/ghana.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/greece.json +53 -53
- package/src/_modules/location/_collections/assets/country-subdivisions/greenland.json +17 -17
- package/src/_modules/location/_collections/assets/country-subdivisions/grenada.json +29 -29
- package/src/_modules/location/_collections/assets/country-subdivisions/guatemala.json +89 -89
- package/src/_modules/location/_collections/assets/country-subdivisions/guinea-bissau.json +13 -13
- package/src/_modules/location/_collections/assets/country-subdivisions/guinea.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/guyana.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/haiti.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/honduras.json +73 -73
- package/src/_modules/location/_collections/assets/country-subdivisions/hong-kong.json +4 -4
- package/src/_modules/location/_collections/assets/country-subdivisions/hungary.json +173 -173
- package/src/_modules/location/_collections/assets/country-subdivisions/iceland.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/india.json +181 -181
- package/src/_modules/location/_collections/assets/country-subdivisions/indonesia.json +29 -29
- package/src/_modules/location/_collections/assets/country-subdivisions/iran-islamic-republic-of.json +125 -125
- package/src/_modules/location/_collections/assets/country-subdivisions/iraq.json +73 -73
- package/src/_modules/location/_collections/assets/country-subdivisions/ireland.json +17 -17
- package/src/_modules/location/_collections/assets/country-subdivisions/israel.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/italy.json +81 -81
- package/src/_modules/location/_collections/assets/country-subdivisions/jamaica.json +57 -57
- package/src/_modules/location/_collections/assets/country-subdivisions/japan.json +189 -189
- package/src/_modules/location/_collections/assets/country-subdivisions/jordan.json +49 -49
- package/src/_modules/location/_collections/assets/country-subdivisions/kazakhstan.json +65 -65
- package/src/_modules/location/_collections/assets/country-subdivisions/kenya.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/kiribati.json +13 -13
- package/src/_modules/location/_collections/assets/country-subdivisions/korea-democratic-people-s-republic-of.json +45 -45
- package/src/_modules/location/_collections/assets/country-subdivisions/korea-republic-of.json +69 -69
- package/src/_modules/location/_collections/assets/country-subdivisions/kuwait.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/kyrgyzstan.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/lao-people-s-democratic-republic.json +73 -73
- package/src/_modules/location/_collections/assets/country-subdivisions/latvia.json +477 -477
- package/src/_modules/location/_collections/assets/country-subdivisions/lebanon.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/lesotho.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/liberia.json +61 -61
- package/src/_modules/location/_collections/assets/country-subdivisions/libyan-arab-jamahiriya.json +89 -89
- package/src/_modules/location/_collections/assets/country-subdivisions/liechtenstein.json +45 -45
- package/src/_modules/location/_collections/assets/country-subdivisions/lithuania.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/luxembourg.json +13 -13
- package/src/_modules/location/_collections/assets/country-subdivisions/macedonia-the-former-yugoslav-republic-of.json +337 -337
- package/src/_modules/location/_collections/assets/country-subdivisions/madagascar.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/malawi.json +13 -13
- package/src/_modules/location/_collections/assets/country-subdivisions/malaysia.json +81 -81
- package/src/_modules/location/_collections/assets/country-subdivisions/maldives.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/mali.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/malta.json +273 -273
- package/src/_modules/location/_collections/assets/country-subdivisions/marshall-islands.json +9 -9
- package/src/_modules/location/_collections/assets/country-subdivisions/mauritania.json +53 -53
- package/src/_modules/location/_collections/assets/country-subdivisions/mauritius.json +69 -69
- package/src/_modules/location/_collections/assets/country-subdivisions/mexico.json +161 -161
- package/src/_modules/location/_collections/assets/country-subdivisions/micronesia-federated-states-of.json +17 -17
- package/src/_modules/location/_collections/assets/country-subdivisions/moldova-republic-of.json +149 -149
- package/src/_modules/location/_collections/assets/country-subdivisions/monaco.json +69 -69
- package/src/_modules/location/_collections/assets/country-subdivisions/mongolia.json +89 -89
- package/src/_modules/location/_collections/assets/country-subdivisions/montenegro.json +93 -93
- package/src/_modules/location/_collections/assets/country-subdivisions/morocco.json +65 -65
- package/src/_modules/location/_collections/assets/country-subdivisions/mozambique.json +45 -45
- package/src/_modules/location/_collections/assets/country-subdivisions/myanmar.json +57 -57
- package/src/_modules/location/_collections/assets/country-subdivisions/namibia.json +57 -57
- package/src/_modules/location/_collections/assets/country-subdivisions/nauru.json +57 -57
- package/src/_modules/location/_collections/assets/country-subdivisions/nepal.json +21 -21
- package/src/_modules/location/_collections/assets/country-subdivisions/netherlands.json +91 -91
- package/src/_modules/location/_collections/assets/country-subdivisions/new-zealand.json +111 -111
- package/src/_modules/location/_collections/assets/country-subdivisions/nicaragua.json +69 -69
- package/src/_modules/location/_collections/assets/country-subdivisions/niger.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/nigeria.json +149 -149
- package/src/_modules/location/_collections/assets/country-subdivisions/norway.json +85 -85
- package/src/_modules/location/_collections/assets/country-subdivisions/oman.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/pakistan.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/palau.json +65 -65
- package/src/_modules/location/_collections/assets/country-subdivisions/palestinian-territory-occupied.json +65 -65
- package/src/_modules/location/_collections/assets/country-subdivisions/panama.json +53 -53
- package/src/_modules/location/_collections/assets/country-subdivisions/papua-new-guinea.json +81 -81
- package/src/_modules/location/_collections/assets/country-subdivisions/paraguay.json +73 -73
- package/src/_modules/location/_collections/assets/country-subdivisions/peru.json +105 -105
- package/src/_modules/location/_collections/assets/country-subdivisions/philippines.json +69 -69
- package/src/_modules/location/_collections/assets/country-subdivisions/poland.json +65 -65
- package/src/_modules/location/_collections/assets/country-subdivisions/portugal.json +81 -81
- package/src/_modules/location/_collections/assets/country-subdivisions/qatar.json +29 -29
- package/src/_modules/location/_collections/assets/country-subdivisions/romania.json +169 -169
- package/src/_modules/location/_collections/assets/country-subdivisions/russian-federation.json +499 -499
- package/src/_modules/location/_collections/assets/country-subdivisions/rwanda.json +21 -21
- package/src/_modules/location/_collections/assets/country-subdivisions/saint-helena-ascension-and-tristan-da-cunha.json +13 -13
- package/src/_modules/location/_collections/assets/country-subdivisions/saint-kitts-and-nevis.json +9 -9
- package/src/_modules/location/_collections/assets/country-subdivisions/saint-lucia.json +45 -45
- package/src/_modules/location/_collections/assets/country-subdivisions/saint-vincent-and-the-grenadines.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/samoa.json +45 -45
- package/src/_modules/location/_collections/assets/country-subdivisions/san-marino.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/sao-tome-and-principe.json +9 -9
- package/src/_modules/location/_collections/assets/country-subdivisions/saudi-arabia.json +53 -53
- package/src/_modules/location/_collections/assets/country-subdivisions/senegal.json +57 -57
- package/src/_modules/location/_collections/assets/country-subdivisions/serbia.json +9 -9
- package/src/_modules/location/_collections/assets/country-subdivisions/seychelles.json +101 -101
- package/src/_modules/location/_collections/assets/country-subdivisions/sierra-leone.json +17 -17
- package/src/_modules/location/_collections/assets/country-subdivisions/singapore.json +21 -21
- package/src/_modules/location/_collections/assets/country-subdivisions/slovakia.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/slovenia.json +841 -841
- package/src/_modules/location/_collections/assets/country-subdivisions/solomon-islands.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/somalia.json +73 -73
- package/src/_modules/location/_collections/assets/country-subdivisions/south-africa.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/south-sudan.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/spain.json +346 -346
- package/src/_modules/location/_collections/assets/country-subdivisions/sri-lanka.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/sudan.json +69 -69
- package/src/_modules/location/_collections/assets/country-subdivisions/suriname.json +41 -41
- package/src/_modules/location/_collections/assets/country-subdivisions/swaziland.json +17 -17
- package/src/_modules/location/_collections/assets/country-subdivisions/sweden.json +85 -85
- package/src/_modules/location/_collections/assets/country-subdivisions/switzerland.json +105 -105
- package/src/_modules/location/_collections/assets/country-subdivisions/syrian-arab-republic.json +57 -57
- package/src/_modules/location/_collections/assets/country-subdivisions/taiwan-province-of-china.json +93 -93
- package/src/_modules/location/_collections/assets/country-subdivisions/tajikistan.json +17 -17
- package/src/_modules/location/_collections/assets/country-subdivisions/tanzania-united-republic-of.json +105 -105
- package/src/_modules/location/_collections/assets/country-subdivisions/thailand.json +313 -313
- package/src/_modules/location/_collections/assets/country-subdivisions/timor-leste.json +53 -53
- package/src/_modules/location/_collections/assets/country-subdivisions/togo.json +21 -21
- package/src/_modules/location/_collections/assets/country-subdivisions/tonga.json +21 -21
- package/src/_modules/location/_collections/assets/country-subdivisions/trinidad-and-tobago.json +65 -65
- package/src/_modules/location/_collections/assets/country-subdivisions/tunisia.json +97 -97
- package/src/_modules/location/_collections/assets/country-subdivisions/turkey.json +325 -325
- package/src/_modules/location/_collections/assets/country-subdivisions/turkmenistan.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/tuvalu.json +33 -33
- package/src/_modules/location/_collections/assets/country-subdivisions/uganda.json +17 -17
- package/src/_modules/location/_collections/assets/country-subdivisions/ukraine.json +109 -109
- package/src/_modules/location/_collections/assets/country-subdivisions/united-arab-emirates.json +29 -29
- package/src/_modules/location/_collections/assets/country-subdivisions/united-kingdom.json +1196 -1196
- package/src/_modules/location/_collections/assets/country-subdivisions/united-states-minor-outlying-islands.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/united-states.json +286 -286
- package/src/_modules/location/_collections/assets/country-subdivisions/uruguay.json +77 -77
- package/src/_modules/location/_collections/assets/country-subdivisions/uzbekistan.json +57 -57
- package/src/_modules/location/_collections/assets/country-subdivisions/vanuatu.json +25 -25
- package/src/_modules/location/_collections/assets/country-subdivisions/venezuela.json +101 -101
- package/src/_modules/location/_collections/assets/country-subdivisions/viet-nam.json +257 -257
- package/src/_modules/location/_collections/assets/country-subdivisions/yemen.json +85 -85
- package/src/_modules/location/_collections/assets/country-subdivisions/zambia.json +37 -37
- package/src/_modules/location/_collections/assets/country-subdivisions/zimbabwe.json +41 -41
- package/src/_modules/location/_collections/loc-country-divisions.const.ts +10 -10
- package/src/_modules/location/_collections/loc-country-isos.const.ts +8 -8
- package/src/_modules/location/_collections/loc-regions.util.spec.ts +61 -61
- package/src/_modules/location/_collections/loc-regions.util.ts +137 -137
- package/src/_modules/location/_collections/loc.util.spec.ts +52 -52
- package/src/_modules/location/_collections/loc.util.ts +74 -74
- package/src/_modules/location/_enums/loc-region.enum.ts +14 -14
- package/src/_modules/location/_enums/loc-sub-region.enum.ts +31 -31
- package/src/_modules/location/_enums/loc-subdivision-region-type.enum.ts +47 -47
- package/src/_modules/location/_models/loc-coordinates.interface.ts +7 -7
- package/src/_modules/location/_models/loc-country-division.interface.ts +8 -8
- package/src/_modules/location/_models/loc-country-iso.interface.ts +23 -23
- package/src/_modules/location/_models/loc-country-phone-code.interface.ts +9 -9
- package/src/_modules/location/_models/loc-division-collection.interface.ts +12 -12
- package/src/_modules/location/_models/loc-division-region-data.interface.ts +9 -9
- package/src/_modules/location/_models/loc-geo-ip-location.interface.ts +27 -27
- package/src/_modules/location/index.ts +22 -22
- package/src/_modules/messaging/README.md +279 -279
- package/src/_modules/messaging/_collections/msg-module-settings.const.ts +46 -46
- package/src/_modules/messaging/_enums/msg-attachment-type.enum.ts +26 -26
- package/src/_modules/messaging/_enums/msg-delivery-status.enum.ts +17 -17
- package/src/_modules/messaging/_enums/msg-event-key.enum.ts +31 -31
- package/src/_modules/messaging/_enums/msg-participant-role.enum.ts +20 -20
- package/src/_modules/messaging/_enums/msg-provider-type.enum.ts +7 -7
- package/src/_modules/messaging/_enums/msg-type.enum.ts +23 -23
- package/src/_modules/messaging/_models/msg-attachment.interface.ts +46 -46
- package/src/_modules/messaging/_models/msg-conversation.data-model.spec.ts +69 -69
- package/src/_modules/messaging/_models/msg-conversation.data-model.ts +96 -96
- package/src/_modules/messaging/_models/msg-mention.interface.ts +29 -29
- package/src/_modules/messaging/_models/msg-message.data-model.spec.ts +79 -79
- package/src/_modules/messaging/_models/msg-message.data-model.ts +127 -127
- package/src/_modules/messaging/_models/msg-participant.interface.ts +46 -46
- package/src/_modules/messaging/_models/msg-reaction.interface.ts +20 -20
- package/src/_modules/messaging/_models/msg-thread-info.interface.ts +35 -35
- package/src/_modules/messaging/_modules/agent/_enums/agt-process-step-type.enum.ts +35 -35
- package/src/_modules/messaging/_modules/agent/_enums/agt-tool-status.enum.ts +23 -23
- package/src/_modules/messaging/_modules/agent/_models/agt-process-step.interface.ts +55 -55
- package/src/_modules/messaging/_modules/agent/_models/agt-reasoning-info.interface.ts +26 -26
- package/src/_modules/messaging/_modules/agent/_models/agt-tool-usage.interface.ts +37 -37
- package/src/_modules/messaging/_modules/agent/index.ts +8 -8
- package/src/_modules/messaging/index.ts +28 -28
- package/src/_modules/pipe/_collections/pip-transforms.const.ts +42 -42
- package/src/_modules/pipe/_collections/utils/pip-country-pipe.util.spec.ts +47 -47
- package/src/_modules/pipe/_collections/utils/pip-country-pipe.util.ts +41 -41
- package/src/_modules/pipe/_collections/utils/pip-custom-pipe.util.spec.ts +39 -39
- package/src/_modules/pipe/_collections/utils/pip-custom-pipe.util.ts +30 -30
- package/src/_modules/pipe/_collections/utils/pip-division-pipe.util.spec.ts +41 -41
- package/src/_modules/pipe/_collections/utils/pip-division-pipe.util.ts +36 -36
- package/src/_modules/pipe/_collections/utils/pip-json-pipe.util.spec.ts +62 -62
- package/src/_modules/pipe/_collections/utils/pip-json-pipe.util.ts +17 -17
- package/src/_modules/pipe/_collections/utils/pip-list-pipe.util.spec.ts +34 -34
- package/src/_modules/pipe/_collections/utils/pip-list-pipe.util.ts +25 -25
- package/src/_modules/pipe/_collections/utils/pip-multi-pipe-pipe.util.spec.ts +67 -67
- package/src/_modules/pipe/_collections/utils/pip-multi-pipe-pipe.util.ts +226 -226
- package/src/_modules/pipe/_collections/utils/pip-obj-key-pipe.util.spec.ts +28 -28
- package/src/_modules/pipe/_collections/utils/pip-obj-key-pipe.util.ts +21 -21
- package/src/_modules/pipe/_collections/utils/pip-range-pipe.util.spec.ts +59 -59
- package/src/_modules/pipe/_collections/utils/pip-range-pipe.util.ts +106 -106
- package/src/_modules/pipe/_collections/utils/pip-region-pipe.util.spec.ts +31 -31
- package/src/_modules/pipe/_collections/utils/pip-region-pipe.util.ts +35 -35
- package/src/_modules/pipe/_collections/utils/pip-replace-pipe.util.spec.ts +44 -44
- package/src/_modules/pipe/_collections/utils/pip-replace-pipe.util.ts +23 -23
- package/src/_modules/pipe/_collections/utils/pip-slider-pipe.util.spec.ts +21 -21
- package/src/_modules/pipe/_collections/utils/pip-slider-pipe.util.ts +33 -33
- package/src/_modules/pipe/_collections/utils/pip-smart-replace-pipe.util.spec.ts +62 -62
- package/src/_modules/pipe/_collections/utils/pip-smart-replace-pipe.util.ts +80 -80
- package/src/_modules/pipe/_enums/pip-range-pipe-setting.enum.ts +15 -15
- package/src/_modules/pipe/_enums/pip.enum.ts +65 -65
- package/src/_modules/pipe/_models/pip-multi-pipe-settings.type.ts +8 -8
- package/src/_modules/pipe/_models/pip-transforms.interface.ts +30 -30
- package/src/_modules/pipe/index.ts +30 -30
- package/src/_modules/socket/_enums/sck-event-key.enum.ts +21 -21
- package/src/_modules/socket/_models/sck-client-params.control-model.spec.ts +67 -67
- package/src/_modules/socket/_models/sck-client-params.control-model.ts +50 -50
- package/src/_modules/socket/_models/sck-socket-event.control-model.spec.ts +66 -66
- package/src/_modules/socket/_models/sck-socket-event.control-model.ts +172 -172
- package/src/_modules/socket/_services/sck-client.service-base.spec.ts +99 -99
- package/src/_modules/socket/_services/sck-client.service-base.ts +353 -353
- package/src/_modules/socket/index.ts +14 -14
- package/src/_modules/test/_collections/tst-module-settings.const.ts +67 -67
- package/src/_modules/test/index.ts +5 -5
- package/src/_modules/usage/_collections/usg-module-settings.const.ts +33 -33
- package/src/_modules/usage/_models/usg-action.control-model.spec.ts +27 -27
- package/src/_modules/usage/_models/usg-action.control-model.ts +28 -28
- package/src/_modules/usage/_models/usg-daily-usage-data.control-model.spec.ts +36 -36
- package/src/_modules/usage/_models/usg-daily-usage-data.control-model.ts +35 -35
- package/src/_modules/usage/_models/usg-data.control-model.spec.ts +41 -41
- package/src/_modules/usage/_models/usg-data.control-model.ts +35 -35
- package/src/_modules/usage/_models/usg-session.data-model.spec.ts +97 -97
- package/src/_modules/usage/_models/usg-session.data-model.ts +72 -72
- package/src/_modules/usage/index.ts +11 -11
- package/src/index.ts +102 -102
- package/tsconfig.app.json +12 -12
- package/tsconfig.json +31 -31
- package/tsconfig.test.json +16 -16
- package/tslint.json +153 -153
- package/pipeline.cicd.config.json +0 -128
|
@@ -1,302 +1,302 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* JSON Error Handling Helper Utilities
|
|
3
|
-
* Provides enhanced error handling for JSON parsing operations
|
|
4
|
-
*
|
|
5
|
-
* @author FutDevPro
|
|
6
|
-
* @version 1.0.0
|
|
7
|
-
*/
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Interface for line information extracted from JSON parsing errors
|
|
11
|
-
*/
|
|
12
|
-
export interface JsonErrorLineInfo {
|
|
13
|
-
/** The line number where the error occurred */
|
|
14
|
-
lineNumber: number;
|
|
15
|
-
/** Array of context lines around the error (typically ±5 lines) */
|
|
16
|
-
contextLines: string[];
|
|
17
|
-
/** The character position within the line where the error occurred */
|
|
18
|
-
characterPosition: number;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
/**
|
|
22
|
-
* Helper class for JSON error handling and enhanced parsing
|
|
23
|
-
*/
|
|
24
|
-
export class DyFM_JsonErrorHelper {
|
|
25
|
-
|
|
26
|
-
/**
|
|
27
|
-
* Extracts line information from JSON parsing error messages
|
|
28
|
-
* Parses error messages like "Expected property name or '}' in JSON at position 10"
|
|
29
|
-
* and returns the problematic line with surrounding context
|
|
30
|
-
*
|
|
31
|
-
* @param errorMessage - The JSON parsing error message
|
|
32
|
-
* @param jsonInput - The original JSON input string
|
|
33
|
-
* @param contextLines - Number of context lines to show before and after the error (default: 5)
|
|
34
|
-
* @returns Object containing line number, context lines, and character position, or null if parsing fails
|
|
35
|
-
*
|
|
36
|
-
* @example
|
|
37
|
-
* ```ts
|
|
38
|
-
* const lineInfo = DyFM_JsonErrorHelper.extractLineInfoFromJsonError('Expected property name or "}" in JSON at position 10', '{"name": "John", "age": 30}', 5);
|
|
39
|
-
* console.log(lineInfo); // { lineNumber: 1, contextLines: [ '{"name": "John", "age": 30}' ], characterPosition: 10 }
|
|
40
|
-
* ```
|
|
41
|
-
*/
|
|
42
|
-
static extractLineInfoFromJsonError(
|
|
43
|
-
errorMessage: string,
|
|
44
|
-
jsonInput: string,
|
|
45
|
-
contextLines: number = 5
|
|
46
|
-
): JsonErrorLineInfo | null {
|
|
47
|
-
try {
|
|
48
|
-
// Extract position from various error message formats
|
|
49
|
-
let positionMatch = errorMessage.match(/at position (\d+)/);
|
|
50
|
-
if (!positionMatch) {
|
|
51
|
-
// Handle "Unexpected end of JSON input at position 17" format
|
|
52
|
-
positionMatch = errorMessage.match(/Unexpected end of JSON input at position (\d+)/);
|
|
53
|
-
}
|
|
54
|
-
if (!positionMatch) {
|
|
55
|
-
// Handle "Unexpected token" format which might include position
|
|
56
|
-
positionMatch = errorMessage.match(/position (\d+)/);
|
|
57
|
-
}
|
|
58
|
-
|
|
59
|
-
if (!positionMatch) {
|
|
60
|
-
// For "Unexpected token" errors without explicit position, try to find it from the token
|
|
61
|
-
const tokenMatch = errorMessage.match(/Unexpected token '(.)'|Unexpected token (.)/);
|
|
62
|
-
if (tokenMatch && jsonInput.includes('\n')) {
|
|
63
|
-
const token = tokenMatch[1] || tokenMatch[2];
|
|
64
|
-
if (token) {
|
|
65
|
-
// Find the first occurrence of this token (this is a simple heuristic)
|
|
66
|
-
const tokenPosition = jsonInput.indexOf(token);
|
|
67
|
-
if (tokenPosition !== -1) {
|
|
68
|
-
return this.createLineInfoFromPosition(jsonInput, tokenPosition, contextLines);
|
|
69
|
-
}
|
|
70
|
-
}
|
|
71
|
-
}
|
|
72
|
-
return null;
|
|
73
|
-
}
|
|
74
|
-
|
|
75
|
-
const position = parseInt(positionMatch[1], 10);
|
|
76
|
-
if (isNaN(position) || position < 0) {
|
|
77
|
-
return null;
|
|
78
|
-
}
|
|
79
|
-
|
|
80
|
-
// For end-of-input errors, position might be at or beyond the string length
|
|
81
|
-
// Allow position to be equal to jsonInput.length for end-of-input cases
|
|
82
|
-
if (position > jsonInput.length) {
|
|
83
|
-
return null;
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
return this.createLineInfoFromPosition(jsonInput, position, contextLines);
|
|
87
|
-
} catch (error) {
|
|
88
|
-
// If we can't parse the error, return null to fall back to simple preview
|
|
89
|
-
return null;
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
/**
|
|
94
|
-
* Helper method to create line info from a character position
|
|
95
|
-
* @param jsonInput - The original JSON input string
|
|
96
|
-
* @param position - The character position where the error occurred
|
|
97
|
-
* @param contextLines - Number of context lines to show before and after the error (default: 5)
|
|
98
|
-
* @returns Object containing line number, context lines, and character position
|
|
99
|
-
*
|
|
100
|
-
* @example
|
|
101
|
-
* ```ts
|
|
102
|
-
* const lineInfo = DyFM_JsonErrorHelper.createLineInfoFromPosition('{"name": "John", "age": 30}', 10, 5);
|
|
103
|
-
* console.log(lineInfo); // { lineNumber: 1, contextLines: [ '{"name": "John", "age": 30}' ], characterPosition: 10 }
|
|
104
|
-
* ```
|
|
105
|
-
*/
|
|
106
|
-
private static createLineInfoFromPosition(
|
|
107
|
-
jsonInput: string,
|
|
108
|
-
position: number,
|
|
109
|
-
contextLines: number
|
|
110
|
-
): JsonErrorLineInfo {
|
|
111
|
-
// Handle undefined or invalid input
|
|
112
|
-
if (!jsonInput || typeof jsonInput !== 'string') {
|
|
113
|
-
return {
|
|
114
|
-
lineNumber: 1,
|
|
115
|
-
contextLines: ['(invalid or empty input)'],
|
|
116
|
-
characterPosition: 0
|
|
117
|
-
};
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
// Split input into lines to find the line number
|
|
121
|
-
const lines = jsonInput.split('\n');
|
|
122
|
-
let currentPosition = 0;
|
|
123
|
-
let lineNumber = 1;
|
|
124
|
-
let characterPosition = 0;
|
|
125
|
-
|
|
126
|
-
for (let i = 0; i < lines.length; i++) {
|
|
127
|
-
const lineLength = lines[i].length;
|
|
128
|
-
if (currentPosition + lineLength >= position) {
|
|
129
|
-
lineNumber = i + 1;
|
|
130
|
-
characterPosition = position - currentPosition;
|
|
131
|
-
break;
|
|
132
|
-
}
|
|
133
|
-
currentPosition += lineLength + 1; // +1 for newline character
|
|
134
|
-
}
|
|
135
|
-
|
|
136
|
-
// If we didn't find the line in the loop, it's at the end
|
|
137
|
-
if (characterPosition === 0 && lineNumber === 1) {
|
|
138
|
-
lineNumber = lines.length;
|
|
139
|
-
characterPosition = position - currentPosition;
|
|
140
|
-
}
|
|
141
|
-
|
|
142
|
-
// Ensure character position is not negative
|
|
143
|
-
if (characterPosition < 0) {
|
|
144
|
-
characterPosition = 0;
|
|
145
|
-
}
|
|
146
|
-
|
|
147
|
-
// Ensure line number is within bounds
|
|
148
|
-
if (lineNumber > lines.length) {
|
|
149
|
-
lineNumber = lines.length;
|
|
150
|
-
}
|
|
151
|
-
|
|
152
|
-
// Get surrounding context (±contextLines)
|
|
153
|
-
const contextStart = Math.max(0, lineNumber - contextLines - 1);
|
|
154
|
-
const contextEnd = Math.min(lines.length, lineNumber + contextLines);
|
|
155
|
-
const contextLinesArray = lines.slice(contextStart, contextEnd);
|
|
156
|
-
|
|
157
|
-
return {
|
|
158
|
-
lineNumber,
|
|
159
|
-
contextLines: contextLinesArray,
|
|
160
|
-
characterPosition
|
|
161
|
-
};
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
/**
|
|
165
|
-
* Formats JSON error information for logging
|
|
166
|
-
* Creates a formatted string showing the error location and context
|
|
167
|
-
*
|
|
168
|
-
* @param lineInfo - The line information extracted from the error
|
|
169
|
-
* @param errorMessage - The original error message
|
|
170
|
-
* @returns Formatted error string for logging
|
|
171
|
-
*
|
|
172
|
-
* @example
|
|
173
|
-
* ```ts
|
|
174
|
-
* const logLines = DyFM_JsonErrorHelper.formatJsonErrorForLogging({ lineNumber: 1, contextLines: [ '{"name": "John", "age": 30}' ], characterPosition: 10 }, 'Expected property name or "}" in JSON at position 10');
|
|
175
|
-
* console.log(logLines); // [ 'JSON parsing failed: Expected property name or "}" in JSON at position 10', 'Error at line 1, character 10:', 'Context (1 lines):', ' 1: {"name": "John", "age": 30}' ]
|
|
176
|
-
* ```
|
|
177
|
-
*/
|
|
178
|
-
static formatJsonErrorForLogging(
|
|
179
|
-
lineInfo: JsonErrorLineInfo,
|
|
180
|
-
errorMessage: string
|
|
181
|
-
): string[] {
|
|
182
|
-
const logLines: string[] = [];
|
|
183
|
-
|
|
184
|
-
logLines.push(`JSON parsing failed: ${errorMessage}`);
|
|
185
|
-
logLines.push(`Error at line ${lineInfo.lineNumber}, character ${lineInfo.characterPosition}:`);
|
|
186
|
-
logLines.push(`Context (${lineInfo.contextLines.length} lines):`);
|
|
187
|
-
|
|
188
|
-
// Calculate the starting line number for context
|
|
189
|
-
const contextStartLine = Math.max(1, lineInfo.lineNumber - Math.floor(lineInfo.contextLines.length / 2));
|
|
190
|
-
|
|
191
|
-
lineInfo.contextLines.forEach((line, index) => {
|
|
192
|
-
const lineNum = contextStartLine + index;
|
|
193
|
-
const marker = lineNum === lineInfo.lineNumber ? '>>> ' : ' ';
|
|
194
|
-
const lineContent = line || '(empty line)';
|
|
195
|
-
logLines.push(`${marker}${lineNum.toString().padStart(3)}: ${lineContent}`);
|
|
196
|
-
});
|
|
197
|
-
|
|
198
|
-
return logLines;
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
/**
|
|
202
|
-
* Enhanced JSON.parse with detailed error reporting
|
|
203
|
-
* Wraps JSON.parse with enhanced error handling that shows line context
|
|
204
|
-
*
|
|
205
|
-
* @param jsonString - The JSON string to parse
|
|
206
|
-
* @param reviver - Optional reviver function for JSON.parse
|
|
207
|
-
* @param contextLines - Number of context lines to show in error (default: 5)
|
|
208
|
-
* @returns Parsed JSON object
|
|
209
|
-
* @throws Error with detailed line information if parsing fails
|
|
210
|
-
*
|
|
211
|
-
* @example
|
|
212
|
-
* ```ts
|
|
213
|
-
* const json = '{"name": "John", "age": 30}';
|
|
214
|
-
* const result = DyFM_JsonErrorHelper.parseJsonWithEnhancedError(json);
|
|
215
|
-
* console.log(result); // { name: 'John', age: 30 }
|
|
216
|
-
* ```
|
|
217
|
-
*/
|
|
218
|
-
static parseJsonWithEnhancedError(
|
|
219
|
-
jsonString: string,
|
|
220
|
-
reviver?: (key: string, value: any) => any,
|
|
221
|
-
contextLines: number = 2
|
|
222
|
-
): any {
|
|
223
|
-
// Prevent infinite recursion and handle invalid input
|
|
224
|
-
if (!jsonString || typeof jsonString !== 'string') {
|
|
225
|
-
throw new Error(`Invalid JSON input: expected string, got ${typeof jsonString}`);
|
|
226
|
-
}
|
|
227
|
-
|
|
228
|
-
try {
|
|
229
|
-
return JSON.parse(jsonString, reviver);
|
|
230
|
-
} catch (error) {
|
|
231
|
-
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
232
|
-
const originalJsonString = jsonString;
|
|
233
|
-
|
|
234
|
-
// First try to extract line info from the original JSON
|
|
235
|
-
let lineInfo = this.extractLineInfoFromJsonError(errorMessage, originalJsonString, contextLines);
|
|
236
|
-
|
|
237
|
-
// If no line info was found and the JSON is on a single line, try formatting it
|
|
238
|
-
if (!lineInfo && !originalJsonString.includes('\n')) {
|
|
239
|
-
try {
|
|
240
|
-
const formattedJson = this.formatJsonForBetterErrors(originalJsonString);
|
|
241
|
-
|
|
242
|
-
// Try parsing the formatted JSON to get a new error with position info
|
|
243
|
-
try {
|
|
244
|
-
JSON.parse(formattedJson, reviver);
|
|
245
|
-
} catch (formattedError) {
|
|
246
|
-
const formattedErrorMessage = formattedError instanceof Error ? formattedError.message : String(formattedError);
|
|
247
|
-
lineInfo = this.extractLineInfoFromJsonError(formattedErrorMessage, formattedJson, contextLines);
|
|
248
|
-
}
|
|
249
|
-
} catch (formatError) {
|
|
250
|
-
// If formatting fails, skip enhanced error reporting
|
|
251
|
-
lineInfo = null;
|
|
252
|
-
}
|
|
253
|
-
}
|
|
254
|
-
|
|
255
|
-
if (lineInfo) {
|
|
256
|
-
const formattedError = this.formatJsonErrorForLogging(lineInfo, errorMessage);
|
|
257
|
-
|
|
258
|
-
throw new Error(`JSON parsing failed:\n${formattedError.join('\n')}`);
|
|
259
|
-
} else {
|
|
260
|
-
// Fallback to simple error if we can't extract line info
|
|
261
|
-
throw new Error(`JSON parsing failed: ${errorMessage}`);
|
|
262
|
-
}
|
|
263
|
-
}
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
/**
|
|
267
|
-
* Formats single-line JSON with line breaks for better error reporting
|
|
268
|
-
* @param jsonString - The JSON string to format
|
|
269
|
-
* @returns The formatted JSON string
|
|
270
|
-
*
|
|
271
|
-
* @example
|
|
272
|
-
* ```ts
|
|
273
|
-
* const json = '{"name": "John", "age": 30, "city": "New York"}';
|
|
274
|
-
* const result = DyFM_JsonErrorHelper.formatJsonForBetterErrors(json);
|
|
275
|
-
* console.log(result); // '{\n "name": "John",\n "age": 30,\n "city": "New York"\n}'
|
|
276
|
-
* ```
|
|
277
|
-
*/
|
|
278
|
-
private static formatJsonForBetterErrors(jsonString: string): string {
|
|
279
|
-
if (!jsonString || typeof jsonString !== 'string') {
|
|
280
|
-
return jsonString || '';
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
return jsonString
|
|
284
|
-
.replace(/,/g, ',\n ')
|
|
285
|
-
.replace(/{/g, '{\n ')
|
|
286
|
-
.replace(/}/g, '\n}')
|
|
287
|
-
.replace(/\[/g, '[\n ')
|
|
288
|
-
.replace(/\]/g, '\n]')
|
|
289
|
-
.replace(/\n\s*\n/g, '\n') // Remove double newlines
|
|
290
|
-
.replace(/^\s+|\s+$/gm, function(match: string, offset: number, string: string): string {
|
|
291
|
-
// Trim but preserve indentation structure
|
|
292
|
-
if (!string || typeof string !== 'string') {
|
|
293
|
-
return match;
|
|
294
|
-
}
|
|
295
|
-
const lines: string[] = string.slice(0, offset).split('\n');
|
|
296
|
-
const depth: number = (string.slice(0, offset).match(/{|\[/g) || []).length -
|
|
297
|
-
(string.slice(0, offset).match(/}|\]/g) || []).length;
|
|
298
|
-
|
|
299
|
-
return ' '.repeat(Math.max(0, depth));
|
|
300
|
-
});
|
|
301
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* JSON Error Handling Helper Utilities
|
|
3
|
+
* Provides enhanced error handling for JSON parsing operations
|
|
4
|
+
*
|
|
5
|
+
* @author FutDevPro
|
|
6
|
+
* @version 1.0.0
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Interface for line information extracted from JSON parsing errors
|
|
11
|
+
*/
|
|
12
|
+
export interface JsonErrorLineInfo {
|
|
13
|
+
/** The line number where the error occurred */
|
|
14
|
+
lineNumber: number;
|
|
15
|
+
/** Array of context lines around the error (typically ±5 lines) */
|
|
16
|
+
contextLines: string[];
|
|
17
|
+
/** The character position within the line where the error occurred */
|
|
18
|
+
characterPosition: number;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Helper class for JSON error handling and enhanced parsing
|
|
23
|
+
*/
|
|
24
|
+
export class DyFM_JsonErrorHelper {
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Extracts line information from JSON parsing error messages
|
|
28
|
+
* Parses error messages like "Expected property name or '}' in JSON at position 10"
|
|
29
|
+
* and returns the problematic line with surrounding context
|
|
30
|
+
*
|
|
31
|
+
* @param errorMessage - The JSON parsing error message
|
|
32
|
+
* @param jsonInput - The original JSON input string
|
|
33
|
+
* @param contextLines - Number of context lines to show before and after the error (default: 5)
|
|
34
|
+
* @returns Object containing line number, context lines, and character position, or null if parsing fails
|
|
35
|
+
*
|
|
36
|
+
* @example
|
|
37
|
+
* ```ts
|
|
38
|
+
* const lineInfo = DyFM_JsonErrorHelper.extractLineInfoFromJsonError('Expected property name or "}" in JSON at position 10', '{"name": "John", "age": 30}', 5);
|
|
39
|
+
* console.log(lineInfo); // { lineNumber: 1, contextLines: [ '{"name": "John", "age": 30}' ], characterPosition: 10 }
|
|
40
|
+
* ```
|
|
41
|
+
*/
|
|
42
|
+
static extractLineInfoFromJsonError(
|
|
43
|
+
errorMessage: string,
|
|
44
|
+
jsonInput: string,
|
|
45
|
+
contextLines: number = 5
|
|
46
|
+
): JsonErrorLineInfo | null {
|
|
47
|
+
try {
|
|
48
|
+
// Extract position from various error message formats
|
|
49
|
+
let positionMatch = errorMessage.match(/at position (\d+)/);
|
|
50
|
+
if (!positionMatch) {
|
|
51
|
+
// Handle "Unexpected end of JSON input at position 17" format
|
|
52
|
+
positionMatch = errorMessage.match(/Unexpected end of JSON input at position (\d+)/);
|
|
53
|
+
}
|
|
54
|
+
if (!positionMatch) {
|
|
55
|
+
// Handle "Unexpected token" format which might include position
|
|
56
|
+
positionMatch = errorMessage.match(/position (\d+)/);
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
if (!positionMatch) {
|
|
60
|
+
// For "Unexpected token" errors without explicit position, try to find it from the token
|
|
61
|
+
const tokenMatch = errorMessage.match(/Unexpected token '(.)'|Unexpected token (.)/);
|
|
62
|
+
if (tokenMatch && jsonInput.includes('\n')) {
|
|
63
|
+
const token = tokenMatch[1] || tokenMatch[2];
|
|
64
|
+
if (token) {
|
|
65
|
+
// Find the first occurrence of this token (this is a simple heuristic)
|
|
66
|
+
const tokenPosition = jsonInput.indexOf(token);
|
|
67
|
+
if (tokenPosition !== -1) {
|
|
68
|
+
return this.createLineInfoFromPosition(jsonInput, tokenPosition, contextLines);
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
return null;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
const position = parseInt(positionMatch[1], 10);
|
|
76
|
+
if (isNaN(position) || position < 0) {
|
|
77
|
+
return null;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
// For end-of-input errors, position might be at or beyond the string length
|
|
81
|
+
// Allow position to be equal to jsonInput.length for end-of-input cases
|
|
82
|
+
if (position > jsonInput.length) {
|
|
83
|
+
return null;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return this.createLineInfoFromPosition(jsonInput, position, contextLines);
|
|
87
|
+
} catch (error) {
|
|
88
|
+
// If we can't parse the error, return null to fall back to simple preview
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Helper method to create line info from a character position
|
|
95
|
+
* @param jsonInput - The original JSON input string
|
|
96
|
+
* @param position - The character position where the error occurred
|
|
97
|
+
* @param contextLines - Number of context lines to show before and after the error (default: 5)
|
|
98
|
+
* @returns Object containing line number, context lines, and character position
|
|
99
|
+
*
|
|
100
|
+
* @example
|
|
101
|
+
* ```ts
|
|
102
|
+
* const lineInfo = DyFM_JsonErrorHelper.createLineInfoFromPosition('{"name": "John", "age": 30}', 10, 5);
|
|
103
|
+
* console.log(lineInfo); // { lineNumber: 1, contextLines: [ '{"name": "John", "age": 30}' ], characterPosition: 10 }
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
private static createLineInfoFromPosition(
|
|
107
|
+
jsonInput: string,
|
|
108
|
+
position: number,
|
|
109
|
+
contextLines: number
|
|
110
|
+
): JsonErrorLineInfo {
|
|
111
|
+
// Handle undefined or invalid input
|
|
112
|
+
if (!jsonInput || typeof jsonInput !== 'string') {
|
|
113
|
+
return {
|
|
114
|
+
lineNumber: 1,
|
|
115
|
+
contextLines: ['(invalid or empty input)'],
|
|
116
|
+
characterPosition: 0
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Split input into lines to find the line number
|
|
121
|
+
const lines = jsonInput.split('\n');
|
|
122
|
+
let currentPosition = 0;
|
|
123
|
+
let lineNumber = 1;
|
|
124
|
+
let characterPosition = 0;
|
|
125
|
+
|
|
126
|
+
for (let i = 0; i < lines.length; i++) {
|
|
127
|
+
const lineLength = lines[i].length;
|
|
128
|
+
if (currentPosition + lineLength >= position) {
|
|
129
|
+
lineNumber = i + 1;
|
|
130
|
+
characterPosition = position - currentPosition;
|
|
131
|
+
break;
|
|
132
|
+
}
|
|
133
|
+
currentPosition += lineLength + 1; // +1 for newline character
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
// If we didn't find the line in the loop, it's at the end
|
|
137
|
+
if (characterPosition === 0 && lineNumber === 1) {
|
|
138
|
+
lineNumber = lines.length;
|
|
139
|
+
characterPosition = position - currentPosition;
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
// Ensure character position is not negative
|
|
143
|
+
if (characterPosition < 0) {
|
|
144
|
+
characterPosition = 0;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
// Ensure line number is within bounds
|
|
148
|
+
if (lineNumber > lines.length) {
|
|
149
|
+
lineNumber = lines.length;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// Get surrounding context (±contextLines)
|
|
153
|
+
const contextStart = Math.max(0, lineNumber - contextLines - 1);
|
|
154
|
+
const contextEnd = Math.min(lines.length, lineNumber + contextLines);
|
|
155
|
+
const contextLinesArray = lines.slice(contextStart, contextEnd);
|
|
156
|
+
|
|
157
|
+
return {
|
|
158
|
+
lineNumber,
|
|
159
|
+
contextLines: contextLinesArray,
|
|
160
|
+
characterPosition
|
|
161
|
+
};
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
/**
|
|
165
|
+
* Formats JSON error information for logging
|
|
166
|
+
* Creates a formatted string showing the error location and context
|
|
167
|
+
*
|
|
168
|
+
* @param lineInfo - The line information extracted from the error
|
|
169
|
+
* @param errorMessage - The original error message
|
|
170
|
+
* @returns Formatted error string for logging
|
|
171
|
+
*
|
|
172
|
+
* @example
|
|
173
|
+
* ```ts
|
|
174
|
+
* const logLines = DyFM_JsonErrorHelper.formatJsonErrorForLogging({ lineNumber: 1, contextLines: [ '{"name": "John", "age": 30}' ], characterPosition: 10 }, 'Expected property name or "}" in JSON at position 10');
|
|
175
|
+
* console.log(logLines); // [ 'JSON parsing failed: Expected property name or "}" in JSON at position 10', 'Error at line 1, character 10:', 'Context (1 lines):', ' 1: {"name": "John", "age": 30}' ]
|
|
176
|
+
* ```
|
|
177
|
+
*/
|
|
178
|
+
static formatJsonErrorForLogging(
|
|
179
|
+
lineInfo: JsonErrorLineInfo,
|
|
180
|
+
errorMessage: string
|
|
181
|
+
): string[] {
|
|
182
|
+
const logLines: string[] = [];
|
|
183
|
+
|
|
184
|
+
logLines.push(`JSON parsing failed: ${errorMessage}`);
|
|
185
|
+
logLines.push(`Error at line ${lineInfo.lineNumber}, character ${lineInfo.characterPosition}:`);
|
|
186
|
+
logLines.push(`Context (${lineInfo.contextLines.length} lines):`);
|
|
187
|
+
|
|
188
|
+
// Calculate the starting line number for context
|
|
189
|
+
const contextStartLine = Math.max(1, lineInfo.lineNumber - Math.floor(lineInfo.contextLines.length / 2));
|
|
190
|
+
|
|
191
|
+
lineInfo.contextLines.forEach((line, index) => {
|
|
192
|
+
const lineNum = contextStartLine + index;
|
|
193
|
+
const marker = lineNum === lineInfo.lineNumber ? '>>> ' : ' ';
|
|
194
|
+
const lineContent = line || '(empty line)';
|
|
195
|
+
logLines.push(`${marker}${lineNum.toString().padStart(3)}: ${lineContent}`);
|
|
196
|
+
});
|
|
197
|
+
|
|
198
|
+
return logLines;
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
/**
|
|
202
|
+
* Enhanced JSON.parse with detailed error reporting
|
|
203
|
+
* Wraps JSON.parse with enhanced error handling that shows line context
|
|
204
|
+
*
|
|
205
|
+
* @param jsonString - The JSON string to parse
|
|
206
|
+
* @param reviver - Optional reviver function for JSON.parse
|
|
207
|
+
* @param contextLines - Number of context lines to show in error (default: 5)
|
|
208
|
+
* @returns Parsed JSON object
|
|
209
|
+
* @throws Error with detailed line information if parsing fails
|
|
210
|
+
*
|
|
211
|
+
* @example
|
|
212
|
+
* ```ts
|
|
213
|
+
* const json = '{"name": "John", "age": 30}';
|
|
214
|
+
* const result = DyFM_JsonErrorHelper.parseJsonWithEnhancedError(json);
|
|
215
|
+
* console.log(result); // { name: 'John', age: 30 }
|
|
216
|
+
* ```
|
|
217
|
+
*/
|
|
218
|
+
static parseJsonWithEnhancedError(
|
|
219
|
+
jsonString: string,
|
|
220
|
+
reviver?: (key: string, value: any) => any,
|
|
221
|
+
contextLines: number = 2
|
|
222
|
+
): any {
|
|
223
|
+
// Prevent infinite recursion and handle invalid input
|
|
224
|
+
if (!jsonString || typeof jsonString !== 'string') {
|
|
225
|
+
throw new Error(`Invalid JSON input: expected string, got ${typeof jsonString}`);
|
|
226
|
+
}
|
|
227
|
+
|
|
228
|
+
try {
|
|
229
|
+
return JSON.parse(jsonString, reviver);
|
|
230
|
+
} catch (error) {
|
|
231
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
232
|
+
const originalJsonString = jsonString;
|
|
233
|
+
|
|
234
|
+
// First try to extract line info from the original JSON
|
|
235
|
+
let lineInfo = this.extractLineInfoFromJsonError(errorMessage, originalJsonString, contextLines);
|
|
236
|
+
|
|
237
|
+
// If no line info was found and the JSON is on a single line, try formatting it
|
|
238
|
+
if (!lineInfo && !originalJsonString.includes('\n')) {
|
|
239
|
+
try {
|
|
240
|
+
const formattedJson = this.formatJsonForBetterErrors(originalJsonString);
|
|
241
|
+
|
|
242
|
+
// Try parsing the formatted JSON to get a new error with position info
|
|
243
|
+
try {
|
|
244
|
+
JSON.parse(formattedJson, reviver);
|
|
245
|
+
} catch (formattedError) {
|
|
246
|
+
const formattedErrorMessage = formattedError instanceof Error ? formattedError.message : String(formattedError);
|
|
247
|
+
lineInfo = this.extractLineInfoFromJsonError(formattedErrorMessage, formattedJson, contextLines);
|
|
248
|
+
}
|
|
249
|
+
} catch (formatError) {
|
|
250
|
+
// If formatting fails, skip enhanced error reporting
|
|
251
|
+
lineInfo = null;
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
if (lineInfo) {
|
|
256
|
+
const formattedError = this.formatJsonErrorForLogging(lineInfo, errorMessage);
|
|
257
|
+
|
|
258
|
+
throw new Error(`JSON parsing failed:\n${formattedError.join('\n')}`);
|
|
259
|
+
} else {
|
|
260
|
+
// Fallback to simple error if we can't extract line info
|
|
261
|
+
throw new Error(`JSON parsing failed: ${errorMessage}`);
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Formats single-line JSON with line breaks for better error reporting
|
|
268
|
+
* @param jsonString - The JSON string to format
|
|
269
|
+
* @returns The formatted JSON string
|
|
270
|
+
*
|
|
271
|
+
* @example
|
|
272
|
+
* ```ts
|
|
273
|
+
* const json = '{"name": "John", "age": 30, "city": "New York"}';
|
|
274
|
+
* const result = DyFM_JsonErrorHelper.formatJsonForBetterErrors(json);
|
|
275
|
+
* console.log(result); // '{\n "name": "John",\n "age": 30,\n "city": "New York"\n}'
|
|
276
|
+
* ```
|
|
277
|
+
*/
|
|
278
|
+
private static formatJsonForBetterErrors(jsonString: string): string {
|
|
279
|
+
if (!jsonString || typeof jsonString !== 'string') {
|
|
280
|
+
return jsonString || '';
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
return jsonString
|
|
284
|
+
.replace(/,/g, ',\n ')
|
|
285
|
+
.replace(/{/g, '{\n ')
|
|
286
|
+
.replace(/}/g, '\n}')
|
|
287
|
+
.replace(/\[/g, '[\n ')
|
|
288
|
+
.replace(/\]/g, '\n]')
|
|
289
|
+
.replace(/\n\s*\n/g, '\n') // Remove double newlines
|
|
290
|
+
.replace(/^\s+|\s+$/gm, function(match: string, offset: number, string: string): string {
|
|
291
|
+
// Trim but preserve indentation structure
|
|
292
|
+
if (!string || typeof string !== 'string') {
|
|
293
|
+
return match;
|
|
294
|
+
}
|
|
295
|
+
const lines: string[] = string.slice(0, offset).split('\n');
|
|
296
|
+
const depth: number = (string.slice(0, offset).match(/{|\[/g) || []).length -
|
|
297
|
+
(string.slice(0, offset).match(/}|\]/g) || []).length;
|
|
298
|
+
|
|
299
|
+
return ' '.repeat(Math.max(0, depth));
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
302
|
}
|