@form-engine-ts/core 4.8.0 → 5.0.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/dist/index.js CHANGED
@@ -1856,7 +1856,408 @@ var DEFAULT_FIELD_TYPE_DEFINITIONS = [
1856
1856
  }
1857
1857
  ];
1858
1858
 
1859
+ // src/i18n/catalogs/en.ts
1860
+ var EN_MESSAGES = Object.freeze({
1861
+ "builder.formTitle": "Form title",
1862
+ "builder.formDescription": "Form description",
1863
+ "builder.completionMessage": "Completion message",
1864
+ "builder.addQuestion": "Add question",
1865
+ "builder.actions.addField": "Add question",
1866
+ "builder.actions.deleteField": "Delete",
1867
+ "builder.actions.moveUp": "Move up",
1868
+ "builder.actions.moveDown": "Move down",
1869
+ "builder.actions.add": "Add",
1870
+ "builder.actions.delete": "Delete",
1871
+ "builder.actions.edit": "Edit",
1872
+ "builder.actions.settings": "Settings",
1873
+ "builder.actions.translate": "Translate",
1874
+ "builder.actions.close": "Close",
1875
+ "builder.actions.dragHandle": "Reorder",
1876
+ "builder.fields.selectType": "Select field type",
1877
+ "builder.fields.typeText": "Text",
1878
+ "builder.fields.typeTextarea": "Textarea",
1879
+ "builder.fields.typeNumber": "Number",
1880
+ "builder.fields.typeRadio": "Radio",
1881
+ "builder.fields.typeCheckbox": "Checkbox",
1882
+ "builder.fields.typeSelect": "Select",
1883
+ "builder.fields.typeRating": "Rating",
1884
+ "builder.fields.typeMultiSelect": "Multi-select",
1885
+ "builder.fieldType.text": "Text",
1886
+ "builder.fieldType.textarea": "Textarea",
1887
+ "builder.fieldType.number": "Number",
1888
+ "builder.fieldType.radio": "Radio",
1889
+ "builder.fieldType.checkbox": "Checkbox",
1890
+ "builder.fieldType.select": "Select",
1891
+ "builder.fieldType.rating": "Rating",
1892
+ "builder.fieldType.multi-select": "Multi-select",
1893
+ "builder.fieldTypeDescription.text": "A single-line text answer",
1894
+ "builder.fieldTypeDescription.textarea": "A long-form text answer",
1895
+ "builder.fieldTypeDescription.number": "A numeric answer",
1896
+ "builder.fieldTypeDescription.radio": "A single-choice answer",
1897
+ "builder.fieldTypeDescription.checkbox": "A yes/no answer",
1898
+ "builder.fieldTypeDescription.select": "A dropdown choice",
1899
+ "builder.fieldTypeDescription.rating": "A rating scale answer",
1900
+ "builder.fieldTypeDescription.multi-select": "Multiple choices",
1901
+ "builder.fieldCategory.text": "Text",
1902
+ "builder.fieldCategory.choice": "Choice",
1903
+ "builder.fieldCategory.number": "Number",
1904
+ "builder.fieldCategory.advanced": "Advanced",
1905
+ "builder.required": "Required",
1906
+ "builder.options": "Options",
1907
+ "builder.localization.title": "Localization",
1908
+ "builder.localization": "Localization",
1909
+ "builder.localization.addLocale": "Add locale",
1910
+ "builder.localization.selectLocaleToAdd": "Select a locale to add",
1911
+ "builder.localization.defaultLocale": "Default locale",
1912
+ "builder.localization.translateAll": "Translate all text",
1913
+ "builder.localization.noLocalesConfigured": "Translations not configured",
1914
+ "builder.localization.localesConfiguredSummary": "{{count}} locales configured",
1915
+ "builder.localization.allLocalesAdded": "All available locales have been added",
1916
+ "builder.localization.maxLocalesReached": "The maximum number of locales ({{max}}) has been reached",
1917
+ "builder.submissionSettings.title": "Submission settings",
1918
+ "builder.submissionSettings.showConfirmation": "Show confirmation before submit",
1919
+ "builder.submissionSettings.renderMode": "Confirmation display mode",
1920
+ "builder.formBuilder": "Form builder",
1921
+ "builder.basicSettings": "Basic settings",
1922
+ "builder.description": "Description",
1923
+ "builder.moveUp": "Move {{title}} up",
1924
+ "builder.moveDown": "Move {{title}} down",
1925
+ "builder.delete": "Delete {{title}}",
1926
+ "builder.deleteAction": "Delete",
1927
+ "builder.questionTitle": "Question title",
1928
+ "builder.questionTitlePlaceholder": "Example: Tell us what we could improve",
1929
+ "builder.newQuestionTitle": "New question",
1930
+ "builder.type": "Type",
1931
+ "builder.minimum": "Minimum",
1932
+ "builder.maximum": "Maximum",
1933
+ "builder.minimumLength": "Minimum length",
1934
+ "builder.maximumLength": "Maximum length",
1935
+ "builder.pattern": "Pattern",
1936
+ "builder.step": "Step",
1937
+ "builder.optionLabel": "Option label {{index}}",
1938
+ "builder.optionLabelPlaceholder": "Example: Very satisfied",
1939
+ "builder.newOptionLabel": "Option {{index}}",
1940
+ "builder.remove": "Remove",
1941
+ "builder.addOption": "Add option",
1942
+ "builder.displayCondition": "Display condition",
1943
+ "builder.alwaysVisible": "Always visible",
1944
+ "builder.conditionOperator": "Condition operator",
1945
+ "builder.conditionValue": "Condition value",
1946
+ "builder.conditionTrue": "true",
1947
+ "builder.conditionFalse": "false",
1948
+ "builder.pages": "Page manager",
1949
+ "builder.enablePages": "Enable multi-step pages",
1950
+ "builder.addPage": "Add page",
1951
+ "builder.newPage": "New page",
1952
+ "builder.pageTitle": "Page title",
1953
+ "builder.pageDescription": "Page description",
1954
+ "builder.pageQuestion": "Question to move to the new page",
1955
+ "builder.questionPage": "Page",
1956
+ "builder.pageCondition": "Page display condition",
1957
+ "builder.unassigned": "Unassigned",
1958
+ "builder.defaultLocale": "Default locale",
1959
+ "builder.supportedLocales": "Supported locales",
1960
+ "builder.addLocale": "Add locale",
1961
+ "builder.editLocale": "Edit locale",
1962
+ "builder.autoTranslate": "Translate all text",
1963
+ "builder.translating": "Translating\u2026",
1964
+ "builder.translationLocale": "Translation locale",
1965
+ "builder.selectLocale": "Select a locale to edit translations.",
1966
+ "builder.selectLocaleToAdd": "Select a locale to add",
1967
+ "builder.translation": "{{locale}} translation",
1968
+ "builder.translatedFormTitle": "Translated form title",
1969
+ "builder.translatedFormDescription": "Translated form description",
1970
+ "builder.translatedCompletionMessage": "Translated completion message",
1971
+ "builder.translatedQuestionTitle": "Translated question title",
1972
+ "builder.translatedDescription": "Translated description",
1973
+ "builder.translationUnavailable": "Provide an async translation adapter to enable automatic translation.",
1974
+ "builder.operator.equals": "equals",
1975
+ "builder.operator.not_equals": "does not equal",
1976
+ "builder.operator.contains": "contains",
1977
+ "builder.operator.not_empty": "is not empty",
1978
+ "builder.showConfirmationBeforeSubmit": "Show confirmation before submit",
1979
+ "builder.confirmationRenderMode": "Confirmation display mode",
1980
+ "renderer.submitButton": "Submit",
1981
+ "renderer.submittingButton": "Submitting...",
1982
+ "renderer.retryButton": "Retry",
1983
+ "renderer.requiredField": "This field is required.",
1984
+ "renderer.alreadySubmittedTitle": "Already Submitted",
1985
+ "renderer.alreadySubmittedMessage": "Already submitted.",
1986
+ "renderer.serverErrorSummary": "Submission failed. Please check your answers and try again.",
1987
+ "renderer.confirmSensitiveDataTitle": "Sensitive data may be included",
1988
+ "renderer.confirmSensitiveDataMessage": "The following answers may contain personal information. Continue submitting?",
1989
+ "renderer.confirmButton": "Proceed",
1990
+ "renderer.cancelButton": "Cancel",
1991
+ "form.submit": "Submit",
1992
+ "form.submitting": "Submitting...",
1993
+ "form.back": "Back",
1994
+ "form.next": "Next",
1995
+ "form.step": "{{current}} / {{total}}",
1996
+ "form.draftRestored": "Draft restored",
1997
+ "form.submissionBlocked": "Submission blocked because personal information was detected.",
1998
+ "form.confirmSensitiveData": "Sensitive data may be included. Please review before submitting.",
1999
+ "form.confirmSubmission": "Proceed",
2000
+ "form.cancelSubmission": "Cancel",
2001
+ "form.yes": "Yes",
2002
+ "form.no": "No",
2003
+ "form.alreadySubmitted": "Already submitted.",
2004
+ "form.submitAnother": "Submit another response",
2005
+ "validation.required": "This field is required.",
2006
+ "validation.invalidOption": "Select a valid option.",
2007
+ "validation.invalidType": "Enter a valid value.",
2008
+ "validation.max": "Value is too large.",
2009
+ "validation.maxLength": "Value is too long.",
2010
+ "validation.maxSelections": "Select fewer options.",
2011
+ "validation.min": "Value is too small.",
2012
+ "validation.minLength": "Value is too short.",
2013
+ "validation.minSelections": "Select more options.",
2014
+ "validation.pattern": "Value has an invalid format.",
2015
+ "validation.sensitiveData": "Sensitive data may be included.",
2016
+ "validation.step": "Enter a value with the correct step.",
2017
+ "validation.unknownField": "This field is not recognized.",
2018
+ "workspace.title": "Translation workspace",
2019
+ "workspace.status.missing": "Missing",
2020
+ "workspace.status.translated": "Translated",
2021
+ "workspace.status.stale": "Source changed",
2022
+ "workspace.status.manual": "Manual",
2023
+ "workspace.status.manualStale": "Manual / source changed",
2024
+ "workspace.errors.localeNotAllowed": "Locale {{locale}} is not allowed.",
2025
+ "workspace.errors.maxLocalesExceeded": "The maximum number of locales ({{max}}) has been reached.",
2026
+ "workspace.errors.readOnly": "This workspace is read-only.",
2027
+ "workspace.errors.adapterNotConfigured": "A translation adapter is not configured.",
2028
+ "workspace.errors.translationFailed": "Translation failed."
2029
+ });
2030
+
2031
+ // src/i18n/catalogs/ja.ts
2032
+ var JA_MESSAGES = Object.freeze({
2033
+ "builder.formTitle": "\u30D5\u30A9\u30FC\u30E0\u306E\u30BF\u30A4\u30C8\u30EB",
2034
+ "builder.formDescription": "\u30D5\u30A9\u30FC\u30E0\u306E\u8AAC\u660E",
2035
+ "builder.completionMessage": "\u9001\u4FE1\u5B8C\u4E86\u30E1\u30C3\u30BB\u30FC\u30B8",
2036
+ "builder.addQuestion": "\u8CEA\u554F\u3092\u8FFD\u52A0",
2037
+ "builder.actions.addField": "\u8CEA\u554F\u3092\u8FFD\u52A0",
2038
+ "builder.actions.deleteField": "\u524A\u9664",
2039
+ "builder.actions.moveUp": "\u4E0A\u3078\u79FB\u52D5",
2040
+ "builder.actions.moveDown": "\u4E0B\u3078\u79FB\u52D5",
2041
+ "builder.actions.add": "\u8FFD\u52A0",
2042
+ "builder.actions.delete": "\u524A\u9664",
2043
+ "builder.actions.edit": "\u7DE8\u96C6",
2044
+ "builder.actions.settings": "\u8A2D\u5B9A",
2045
+ "builder.actions.translate": "\u7FFB\u8A33",
2046
+ "builder.actions.close": "\u9589\u3058\u308B",
2047
+ "builder.actions.dragHandle": "\u4E26\u3079\u66FF\u3048",
2048
+ "builder.fields.selectType": "\u8CEA\u554F\u5F62\u5F0F\u3092\u9078\u629E",
2049
+ "builder.fields.typeText": "\u4E00\u884C\u30C6\u30AD\u30B9\u30C8",
2050
+ "builder.fields.typeTextarea": "\u9577\u6587\u30C6\u30AD\u30B9\u30C8",
2051
+ "builder.fields.typeNumber": "\u6570\u5024",
2052
+ "builder.fields.typeRadio": "\u5358\u4E00\u9078\u629E (\u30E9\u30B8\u30AA\u30DC\u30BF\u30F3)",
2053
+ "builder.fields.typeCheckbox": "\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9",
2054
+ "builder.fields.typeSelect": "\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3",
2055
+ "builder.fields.typeRating": "\u8A55\u4FA1\u30B9\u30B1\u30FC\u30EB",
2056
+ "builder.fields.typeMultiSelect": "\u8907\u6570\u9078\u629E",
2057
+ "builder.fieldType.text": "\u4E00\u884C\u30C6\u30AD\u30B9\u30C8",
2058
+ "builder.fieldType.textarea": "\u9577\u6587\u30C6\u30AD\u30B9\u30C8",
2059
+ "builder.fieldType.number": "\u6570\u5024",
2060
+ "builder.fieldType.radio": "\u5358\u4E00\u9078\u629E",
2061
+ "builder.fieldType.checkbox": "\u30C1\u30A7\u30C3\u30AF\u30DC\u30C3\u30AF\u30B9",
2062
+ "builder.fieldType.select": "\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3",
2063
+ "builder.fieldType.rating": "\u8A55\u4FA1\u30B9\u30B1\u30FC\u30EB",
2064
+ "builder.fieldType.multi-select": "\u8907\u6570\u9078\u629E",
2065
+ "builder.fieldTypeDescription.text": "\u4E00\u884C\u306E\u56DE\u7B54",
2066
+ "builder.fieldTypeDescription.textarea": "\u9577\u6587\u306E\u56DE\u7B54",
2067
+ "builder.fieldTypeDescription.number": "\u6570\u5024\u306E\u56DE\u7B54",
2068
+ "builder.fieldTypeDescription.radio": "\u5358\u4E00\u9078\u629E\u306E\u56DE\u7B54",
2069
+ "builder.fieldTypeDescription.checkbox": "\u306F\u3044 / \u3044\u3044\u3048\u306E\u56DE\u7B54",
2070
+ "builder.fieldTypeDescription.select": "\u30C9\u30ED\u30C3\u30D7\u30C0\u30A6\u30F3\u5F62\u5F0F\u306E\u56DE\u7B54",
2071
+ "builder.fieldTypeDescription.rating": "\u8A55\u4FA1\u30B9\u30B1\u30FC\u30EB\u306E\u56DE\u7B54",
2072
+ "builder.fieldTypeDescription.multi-select": "\u8907\u6570\u9078\u629E\u306E\u56DE\u7B54",
2073
+ "builder.fieldCategory.text": "\u30C6\u30AD\u30B9\u30C8",
2074
+ "builder.fieldCategory.choice": "\u9078\u629E\u5F0F",
2075
+ "builder.fieldCategory.number": "\u6570\u5024",
2076
+ "builder.fieldCategory.advanced": "\u8A73\u7D30\u8A2D\u5B9A",
2077
+ "builder.required": "\u5FC5\u9808\u9805\u76EE\u306B\u3059\u308B",
2078
+ "builder.options": "\u9078\u629E\u80A2\u4E00\u89A7",
2079
+ "builder.localization.title": "\u591A\u8A00\u8A9E\u8A2D\u5B9A",
2080
+ "builder.localization": "\u591A\u8A00\u8A9E\u8A2D\u5B9A",
2081
+ "builder.localization.addLocale": "\u8A00\u8A9E\u3092\u8FFD\u52A0",
2082
+ "builder.localization.selectLocaleToAdd": "\u8FFD\u52A0\u3059\u308B\u8A00\u8A9E\u3092\u9078\u629E",
2083
+ "builder.localization.defaultLocale": "\u30C7\u30D5\u30A9\u30EB\u30C8\u8A00\u8A9E (\u5143\u8A00\u8A9E)",
2084
+ "builder.localization.translateAll": "\u4E00\u62EC\u81EA\u52D5\u7FFB\u8A33",
2085
+ "builder.localization.noLocalesConfigured": "\u7FFB\u8A33\u8A00\u8A9E\u306F\u307E\u3060\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002",
2086
+ "builder.localization.localesConfiguredSummary": "{{count}}\u8A00\u8A9E\u306E\u7FFB\u8A33\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u3059\u3002",
2087
+ "builder.localization.allLocalesAdded": "\u3059\u3079\u3066\u306E\u5019\u88DC\u8A00\u8A9E\u304C\u8FFD\u52A0\u6E08\u307F\u3067\u3059",
2088
+ "builder.localization.maxLocalesReached": "\u767B\u9332\u53EF\u80FD\u306A\u6700\u5927\u8A00\u8A9E\u6570 ({{max}}) \u306B\u9054\u3057\u307E\u3057\u305F",
2089
+ "builder.submissionSettings.title": "\u9001\u4FE1\u8A2D\u5B9A",
2090
+ "builder.submissionSettings.showConfirmation": "\u9001\u4FE1\u524D\u306B\u56DE\u7B54\u78BA\u8A8D\u753B\u9762\u3092\u8868\u793A\u3059\u308B",
2091
+ "builder.submissionSettings.renderMode": "\u78BA\u8A8D\u753B\u9762\u306E\u8868\u793A\u5F62\u5F0F",
2092
+ "builder.formBuilder": "\u30D5\u30A9\u30FC\u30E0\u30D3\u30EB\u30C0\u30FC",
2093
+ "builder.basicSettings": "\u57FA\u672C\u8A2D\u5B9A",
2094
+ "builder.description": "\u8AAC\u660E",
2095
+ "builder.moveUp": "{{title}}\u3092\u4E0A\u3078\u79FB\u52D5",
2096
+ "builder.moveDown": "{{title}}\u3092\u4E0B\u3078\u79FB\u52D5",
2097
+ "builder.delete": "{{title}}\u3092\u524A\u9664",
2098
+ "builder.deleteAction": "\u524A\u9664",
2099
+ "builder.questionTitle": "\u8CEA\u554F\u6587",
2100
+ "builder.questionTitlePlaceholder": "\u4F8B: \u6539\u5584\u3067\u304D\u308B\u70B9\u3092\u6559\u3048\u3066\u304F\u3060\u3055\u3044",
2101
+ "builder.newQuestionTitle": "\u65B0\u3057\u3044\u8CEA\u554F",
2102
+ "builder.type": "\u5F62\u5F0F",
2103
+ "builder.minimum": "\u6700\u5C0F\u5024",
2104
+ "builder.maximum": "\u6700\u5927\u5024",
2105
+ "builder.minimumLength": "\u6700\u5C0F\u6587\u5B57\u6570",
2106
+ "builder.maximumLength": "\u6700\u5927\u6587\u5B57\u6570",
2107
+ "builder.pattern": "\u5F62\u5F0F\u30D1\u30BF\u30FC\u30F3",
2108
+ "builder.step": "\u523B\u307F\u5E45",
2109
+ "builder.optionLabel": "\u9078\u629E\u80A2 {{index}}",
2110
+ "builder.optionLabelPlaceholder": "\u4F8B: \u3068\u3066\u3082\u6E80\u8DB3",
2111
+ "builder.newOptionLabel": "\u9078\u629E\u80A2 {{index}}",
2112
+ "builder.remove": "\u524A\u9664",
2113
+ "builder.addOption": "\u9078\u629E\u80A2\u3092\u8FFD\u52A0",
2114
+ "builder.displayCondition": "\u8868\u793A\u6761\u4EF6",
2115
+ "builder.alwaysVisible": "\u5E38\u306B\u8868\u793A",
2116
+ "builder.conditionOperator": "\u6761\u4EF6\u6F14\u7B97\u5B50",
2117
+ "builder.conditionValue": "\u6761\u4EF6\u5024",
2118
+ "builder.conditionTrue": "\u306F\u3044",
2119
+ "builder.conditionFalse": "\u3044\u3044\u3048",
2120
+ "builder.pages": "\u30DA\u30FC\u30B8\u7BA1\u7406",
2121
+ "builder.enablePages": "\u8907\u6570\u30DA\u30FC\u30B8\u3092\u6709\u52B9\u306B\u3059\u308B",
2122
+ "builder.addPage": "\u30DA\u30FC\u30B8\u3092\u8FFD\u52A0",
2123
+ "builder.newPage": "\u65B0\u3057\u3044\u30DA\u30FC\u30B8",
2124
+ "builder.pageTitle": "\u30DA\u30FC\u30B8\u30BF\u30A4\u30C8\u30EB",
2125
+ "builder.pageDescription": "\u30DA\u30FC\u30B8\u306E\u8AAC\u660E",
2126
+ "builder.pageQuestion": "\u65B0\u3057\u3044\u30DA\u30FC\u30B8\u3078\u79FB\u52D5\u3059\u308B\u8CEA\u554F",
2127
+ "builder.questionPage": "\u30DA\u30FC\u30B8",
2128
+ "builder.pageCondition": "\u30DA\u30FC\u30B8\u306E\u8868\u793A\u6761\u4EF6",
2129
+ "builder.unassigned": "\u672A\u5272\u308A\u5F53\u3066",
2130
+ "builder.defaultLocale": "\u30C7\u30D5\u30A9\u30EB\u30C8\u8A00\u8A9E",
2131
+ "builder.supportedLocales": "\u5BFE\u5FDC\u8A00\u8A9E",
2132
+ "builder.addLocale": "\u8A00\u8A9E\u3092\u8FFD\u52A0",
2133
+ "builder.editLocale": "\u8A00\u8A9E\u3092\u7DE8\u96C6",
2134
+ "builder.autoTranslate": "\u3059\u3079\u3066\u7FFB\u8A33",
2135
+ "builder.translating": "\u7FFB\u8A33\u4E2D\u2026",
2136
+ "builder.translationLocale": "\u7FFB\u8A33\u8A00\u8A9E",
2137
+ "builder.selectLocale": "\u7FFB\u8A33\u3092\u7DE8\u96C6\u3059\u308B\u8A00\u8A9E\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
2138
+ "builder.selectLocaleToAdd": "\u8FFD\u52A0\u3059\u308B\u8A00\u8A9E\u3092\u9078\u629E",
2139
+ "builder.translation": "{{locale}}\u7FFB\u8A33",
2140
+ "builder.translatedFormTitle": "\u7FFB\u8A33\u5F8C\u306E\u30D5\u30A9\u30FC\u30E0\u30BF\u30A4\u30C8\u30EB",
2141
+ "builder.translatedFormDescription": "\u7FFB\u8A33\u5F8C\u306E\u30D5\u30A9\u30FC\u30E0\u8AAC\u660E",
2142
+ "builder.translatedCompletionMessage": "\u7FFB\u8A33\u5F8C\u306E\u9001\u4FE1\u5B8C\u4E86\u30E1\u30C3\u30BB\u30FC\u30B8",
2143
+ "builder.translatedQuestionTitle": "\u7FFB\u8A33\u5F8C\u306E\u8CEA\u554F\u6587",
2144
+ "builder.translatedDescription": "\u7FFB\u8A33\u5F8C\u306E\u8AAC\u660E",
2145
+ "builder.translationUnavailable": "\u81EA\u52D5\u7FFB\u8A33\u306B\u306F\u975E\u540C\u671F\u7FFB\u8A33\u30A2\u30C0\u30D7\u30BF\u30FC\u3092\u8A2D\u5B9A\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
2146
+ "builder.operator.equals": "\u7B49\u3057\u3044",
2147
+ "builder.operator.not_equals": "\u7B49\u3057\u304F\u306A\u3044",
2148
+ "builder.operator.contains": "\u542B\u3080",
2149
+ "builder.operator.not_empty": "\u7A7A\u3067\u306F\u306A\u3044",
2150
+ "builder.showConfirmationBeforeSubmit": "\u9001\u4FE1\u524D\u306B\u78BA\u8A8D\u753B\u9762\u3092\u8868\u793A\u3059\u308B",
2151
+ "builder.confirmationRenderMode": "\u78BA\u8A8D\u753B\u9762\u306E\u8868\u793A\u5F62\u5F0F",
2152
+ "renderer.submitButton": "\u9001\u4FE1\u3059\u308B",
2153
+ "renderer.submittingButton": "\u9001\u4FE1\u4E2D...",
2154
+ "renderer.retryButton": "\u518D\u9001\u4FE1\u3059\u308B",
2155
+ "renderer.requiredField": "\u3053\u306E\u9805\u76EE\u306F\u5FC5\u9808\u3067\u3059\u3002",
2156
+ "renderer.alreadySubmittedTitle": "\u56DE\u7B54\u6E08\u307F\u3067\u3059",
2157
+ "renderer.alreadySubmittedMessage": "\u3053\u306E\u30A2\u30F3\u30B1\u30FC\u30C8\u306B\u306F\u3059\u3067\u306B\u56DE\u7B54\u3057\u3066\u3044\u307E\u3059\u3002",
2158
+ "renderer.serverErrorSummary": "\u9001\u4FE1\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002\u5185\u5BB9\u3092\u3054\u78BA\u8A8D\u306E\u4E0A\u3001\u518D\u5EA6\u304A\u8A66\u3057\u304F\u3060\u3055\u3044\u3002",
2159
+ "renderer.confirmSensitiveDataTitle": "\u500B\u4EBA\u60C5\u5831\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059",
2160
+ "renderer.confirmSensitiveDataMessage": "\u4EE5\u4E0B\u306E\u9805\u76EE\u306B\u500B\u4EBA\u60C5\u5831\u3068\u307F\u3089\u308C\u308B\u8A18\u8FF0\u304C\u3042\u308A\u307E\u3059\u3002\u3053\u306E\u307E\u307E\u9001\u4FE1\u3057\u3066\u3082\u3088\u308D\u3057\u3044\u3067\u3059\u304B\uFF1F",
2161
+ "renderer.confirmButton": "\u3053\u306E\u307E\u307E\u9001\u4FE1",
2162
+ "renderer.cancelButton": "\u4FEE\u6B63\u3059\u308B",
2163
+ "form.submit": "\u9001\u4FE1\u3059\u308B",
2164
+ "form.submitting": "\u9001\u4FE1\u4E2D...",
2165
+ "form.back": "\u623B\u308B",
2166
+ "form.next": "\u6B21\u3078",
2167
+ "form.step": "{{current}} / {{total}}",
2168
+ "form.draftRestored": "\u4E0B\u66F8\u304D\u3092\u5FA9\u5143\u3057\u307E\u3057\u305F",
2169
+ "form.submissionBlocked": "\u500B\u4EBA\u60C5\u5831\u304C\u691C\u51FA\u3055\u308C\u305F\u305F\u3081\u9001\u4FE1\u3067\u304D\u307E\u305B\u3093\u3002",
2170
+ "form.confirmSensitiveData": "\u500B\u4EBA\u60C5\u5831\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002\u9001\u4FE1\u524D\u306B\u78BA\u8A8D\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
2171
+ "form.confirmSubmission": "\u3053\u306E\u307E\u307E\u9001\u4FE1",
2172
+ "form.cancelSubmission": "\u4FEE\u6B63\u3059\u308B",
2173
+ "form.yes": "\u306F\u3044",
2174
+ "form.no": "\u3044\u3044\u3048",
2175
+ "form.alreadySubmitted": "\u56DE\u7B54\u6E08\u307F\u3067\u3059",
2176
+ "form.submitAnother": "\u5225\u306E\u56DE\u7B54\u3092\u9001\u4FE1",
2177
+ "validation.required": "\u3053\u306E\u9805\u76EE\u306F\u5FC5\u9808\u3067\u3059\u3002",
2178
+ "validation.invalidOption": "\u6709\u52B9\u306A\u9078\u629E\u80A2\u3092\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
2179
+ "validation.invalidType": "\u6709\u52B9\u306A\u5024\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
2180
+ "validation.max": "\u5024\u304C\u5927\u304D\u3059\u304E\u307E\u3059\u3002",
2181
+ "validation.maxLength": "\u5165\u529B\u304C\u9577\u3059\u304E\u307E\u3059\u3002",
2182
+ "validation.maxSelections": "\u9078\u629E\u6570\u3092\u6E1B\u3089\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
2183
+ "validation.min": "\u5024\u304C\u5C0F\u3055\u3059\u304E\u307E\u3059\u3002",
2184
+ "validation.minLength": "\u5165\u529B\u304C\u77ED\u3059\u304E\u307E\u3059\u3002",
2185
+ "validation.minSelections": "\u3055\u3089\u306B\u9078\u629E\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
2186
+ "validation.pattern": "\u5165\u529B\u5F62\u5F0F\u304C\u6B63\u3057\u304F\u3042\u308A\u307E\u305B\u3093\u3002",
2187
+ "validation.sensitiveData": "\u500B\u4EBA\u60C5\u5831\u304C\u542B\u307E\u308C\u3066\u3044\u308B\u53EF\u80FD\u6027\u304C\u3042\u308A\u307E\u3059\u3002",
2188
+ "validation.step": "\u6B63\u3057\u3044\u523B\u307F\u5E45\u306E\u5024\u3092\u5165\u529B\u3057\u3066\u304F\u3060\u3055\u3044\u3002",
2189
+ "validation.unknownField": "\u3053\u306E\u9805\u76EE\u306F\u8A8D\u8B58\u3055\u308C\u307E\u305B\u3093\u3002",
2190
+ "workspace.title": "\u591A\u8A00\u8A9E\u7FFB\u8A33\u30EF\u30FC\u30AF\u30B9\u30DA\u30FC\u30B9",
2191
+ "workspace.status.missing": "\u672A\u7FFB\u8A33",
2192
+ "workspace.status.translated": "\u7FFB\u8A33\u6E08\u307F",
2193
+ "workspace.status.stale": "\u539F\u6587\u66F4\u65B0\u3042\u308A",
2194
+ "workspace.status.manual": "\u624B\u52D5\u7DE8\u96C6\u6E08\u307F",
2195
+ "workspace.status.manualStale": "\u624B\u52D5\u7DE8\u96C6\u6E08\u307F (\u539F\u6587\u66F4\u65B0\u3042\u308A)",
2196
+ "workspace.errors.localeNotAllowed": "\u6307\u5B9A\u3055\u308C\u305F\u8A00\u8A9E\u300C{{locale}}\u300D\u306F\u8A2D\u5B9A\u3067\u304D\u307E\u305B\u3093\u3002",
2197
+ "workspace.errors.maxLocalesExceeded": "\u767B\u9332\u53EF\u80FD\u306A\u6700\u5927\u8A00\u8A9E\u6570 ({{max}}) \u306B\u9054\u3057\u307E\u3057\u305F\u3002",
2198
+ "workspace.errors.readOnly": "\u8AAD\u307F\u53D6\u308A\u5C02\u7528\u30E2\u30FC\u30C9\u306E\u305F\u3081\u5909\u66F4\u3067\u304D\u307E\u305B\u3093\u3002",
2199
+ "workspace.errors.adapterNotConfigured": "\u7FFB\u8A33\u30A2\u30C0\u30D7\u30BF\u30FC\u304C\u8A2D\u5B9A\u3055\u308C\u3066\u3044\u307E\u305B\u3093\u3002",
2200
+ "workspace.errors.translationFailed": "\u7FFB\u8A33\u51E6\u7406\u306B\u5931\u6557\u3057\u307E\u3057\u305F\u3002"
2201
+ });
2202
+
2203
+ // src/i18n/translator.ts
2204
+ function formatTemplate(template, params = {}) {
2205
+ return template.replace(
2206
+ /\{\{?(\w+)\}\}?/gu,
2207
+ (token, name) => Object.hasOwn(params, name) ? String(params[name]) : token
2208
+ );
2209
+ }
2210
+ function defaultCatalog(locale) {
2211
+ return locale.toLowerCase().startsWith("ja") ? JA_MESSAGES : EN_MESSAGES;
2212
+ }
2213
+ var createFormEngineTranslator = (options = {}) => {
2214
+ const { locale = "ja", fallbackLocale = "en", messages = {}, customCatalogs = {}, fallbackTextResolver } = options;
2215
+ const currentCatalog = { ...defaultCatalog(locale), ...customCatalogs[locale], ...messages };
2216
+ const fallbackCatalog = { ...defaultCatalog(fallbackLocale), ...customCatalogs[fallbackLocale] };
2217
+ return (rawKey, params = {}) => {
2218
+ const key = rawKey;
2219
+ const template = currentCatalog[key] ?? fallbackCatalog[key];
2220
+ if (template !== void 0 && template !== "") return formatTemplate(template, params);
2221
+ if (fallbackTextResolver !== void 0) return fallbackTextResolver(key, locale);
2222
+ return "";
2223
+ };
2224
+ };
2225
+
1859
2226
  // src/pagination.ts
2227
+ async function paginateWithFilter(params) {
2228
+ const { pageSize, cursor, maxScanPages = 5, fetchPage, filterPredicate, encodeCursor } = params;
2229
+ normalizeSubmissionPageSize(pageSize);
2230
+ if (!Number.isSafeInteger(maxScanPages) || maxScanPages < 1) {
2231
+ throw new TypeError("maxScanPages must be a positive safe integer.");
2232
+ }
2233
+ const collected = [];
2234
+ let currentRawCursor = cursor;
2235
+ let totalScannedCount = 0;
2236
+ let scanCount = 0;
2237
+ while (collected.length < pageSize && scanCount < maxScanPages) {
2238
+ scanCount += 1;
2239
+ const fetchLimit = pageSize - collected.length + 1;
2240
+ const { rawItems, rawNextCursor } = await fetchPage(currentRawCursor, fetchLimit);
2241
+ totalScannedCount += rawItems.length;
2242
+ for (const item of rawItems) {
2243
+ if (!filterPredicate(item)) continue;
2244
+ collected.push(item);
2245
+ if (collected.length === pageSize) {
2246
+ const lastItem = collected.at(-1);
2247
+ if (lastItem === void 0) break;
2248
+ return {
2249
+ items: collected,
2250
+ hasMore: rawNextCursor !== void 0,
2251
+ ...rawNextCursor === void 0 ? {} : { nextCursor: encodeCursor(lastItem) },
2252
+ totalScannedCount
2253
+ };
2254
+ }
2255
+ }
2256
+ if (rawItems.length === 0 || rawNextCursor === void 0) break;
2257
+ currentRawCursor = rawNextCursor;
2258
+ }
2259
+ return { items: collected, hasMore: false, totalScannedCount };
2260
+ }
1860
2261
  function asFormResponse2(submission) {
1861
2262
  return {
1862
2263
  responseId: submission.id,
@@ -1905,6 +2306,43 @@ async function* iterateSubmissionPages(adapter, formId, queryOptions = {}, optio
1905
2306
  cursor = nextCursor;
1906
2307
  }
1907
2308
  }
2309
+ function encodeStorageSubmissionCursor(value) {
2310
+ if (value.kind !== "submission" || value.formId.length === 0 || value.submittedAt.length === 0 || value.id.length === 0) {
2311
+ throw new TypeError("Submission cursor values are invalid.");
2312
+ }
2313
+ return encodeBase64Url(new TextEncoder().encode(JSON.stringify(value)));
2314
+ }
2315
+ function decodeStorageSubmissionCursor(cursor) {
2316
+ const parsed = decodeCursorPayload(cursor, "submission cursor payload is invalid.");
2317
+ if (parsed.kind !== "submission" || typeof parsed.formId !== "string" || parsed.formId.length === 0 || typeof parsed.submittedAt !== "string" || parsed.submittedAt.length === 0 || typeof parsed.id !== "string" || parsed.id.length === 0) {
2318
+ throw new TypeError("submission cursor payload is invalid.");
2319
+ }
2320
+ return {
2321
+ kind: "submission",
2322
+ formId: parsed.formId,
2323
+ submittedAt: parsed.submittedAt,
2324
+ id: parsed.id
2325
+ };
2326
+ }
2327
+ function encodeStorageTextAnswerCursor(value) {
2328
+ if (value.kind !== "text_answer" || value.formId.length === 0 || value.fieldId.length === 0 || value.submittedAt.length === 0 || value.submissionId.length === 0) {
2329
+ throw new TypeError("Text answer cursor values are invalid.");
2330
+ }
2331
+ return encodeBase64Url(new TextEncoder().encode(JSON.stringify(value)));
2332
+ }
2333
+ function decodeStorageTextAnswerCursor(cursor) {
2334
+ const parsed = decodeCursorPayload(cursor, "text answer cursor payload is invalid.");
2335
+ if (parsed.kind !== "text_answer" || typeof parsed.formId !== "string" || parsed.formId.length === 0 || typeof parsed.fieldId !== "string" || parsed.fieldId.length === 0 || typeof parsed.submittedAt !== "string" || parsed.submittedAt.length === 0 || typeof parsed.submissionId !== "string" || parsed.submissionId.length === 0) {
2336
+ throw new TypeError("text answer cursor payload is invalid.");
2337
+ }
2338
+ return {
2339
+ kind: "text_answer",
2340
+ formId: parsed.formId,
2341
+ fieldId: parsed.fieldId,
2342
+ submittedAt: parsed.submittedAt,
2343
+ submissionId: parsed.submissionId
2344
+ };
2345
+ }
1908
2346
  var BASE64_ALPHABET = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
1909
2347
  function encodeBase64(bytes) {
1910
2348
  let result = "";
@@ -1935,6 +2373,20 @@ function decodeBase64(value) {
1935
2373
  }
1936
2374
  return new Uint8Array(bytes);
1937
2375
  }
2376
+ function encodeBase64Url(bytes) {
2377
+ return encodeBase64(bytes).replaceAll("+", "-").replaceAll("/", "_").replace(/=+$/u, "");
2378
+ }
2379
+ function decodeCursorPayload(cursor, invalidMessage) {
2380
+ try {
2381
+ const normalized = cursor.replaceAll("-", "+").replaceAll("_", "/").padEnd(Math.ceil(cursor.length / 4) * 4, "=");
2382
+ const parsed = JSON.parse(new TextDecoder("utf-8", { fatal: true }).decode(decodeBase64(normalized)));
2383
+ if (typeof parsed !== "object" || parsed === null || Array.isArray(parsed)) throw new TypeError(invalidMessage);
2384
+ return parsed;
2385
+ } catch (cause) {
2386
+ if (cause instanceof TypeError && cause.message === invalidMessage) throw cause;
2387
+ throw new TypeError("cursor must be a valid Base64URL JSON token.", { cause });
2388
+ }
2389
+ }
1938
2390
  function encodeSubmissionCursor(value) {
1939
2391
  if (value.submittedAt.length === 0 || value.responseId.length === 0) {
1940
2392
  throw new TypeError("Cursor values must not be empty.");
@@ -2172,6 +2624,28 @@ function validatePageAnswers(schema, pageIndex, values) {
2172
2624
  }
2173
2625
  return issues.length === 0 ? { valid: true, issues: [] } : { valid: false, issues };
2174
2626
  }
2627
+ function validateSubmission(schema, submission, options) {
2628
+ const values = submission.values;
2629
+ const answerValidation = validateAnswers(schema, values);
2630
+ const fieldErrors = {};
2631
+ for (const issue2 of answerValidation.issues) {
2632
+ const existing = fieldErrors[issue2.fieldId];
2633
+ fieldErrors[issue2.fieldId] = existing === void 0 ? issue2.messageKey : `${existing}; ${issue2.messageKey}`;
2634
+ }
2635
+ const piiFindings = options?.privacyEngine?.detect(schema, { ...values });
2636
+ if (piiFindings !== void 0) {
2637
+ for (const finding of piiFindings) {
2638
+ const existing = fieldErrors[finding.fieldId];
2639
+ fieldErrors[finding.fieldId] = existing === void 0 ? "validation.sensitiveData" : `${existing}; validation.sensitiveData`;
2640
+ }
2641
+ }
2642
+ return {
2643
+ valid: Object.keys(fieldErrors).length === 0,
2644
+ fieldErrors,
2645
+ formErrors: [],
2646
+ ...piiFindings === void 0 ? {} : { piiFindings }
2647
+ };
2648
+ }
2175
2649
 
2176
2650
  // src/submission.ts
2177
2651
  function cloneValues(values) {
@@ -2179,7 +2653,46 @@ function cloneValues(values) {
2179
2653
  Object.entries(values).map(([key, value]) => [key, Array.isArray(value) ? Object.freeze([...value]) : value])
2180
2654
  );
2181
2655
  }
2182
- function createSubmission(schema, values, options) {
2656
+ function generatedSubmissionId() {
2657
+ return globalThis.crypto?.randomUUID?.() ?? `${Date.now()}-${Math.random().toString(36).slice(2)}`;
2658
+ }
2659
+ function toFormValues(answers) {
2660
+ const values = {};
2661
+ for (const [key, value] of Object.entries(answers)) {
2662
+ if (isFormValue(value)) values[key] = value;
2663
+ }
2664
+ return values;
2665
+ }
2666
+ function isFormValue(value) {
2667
+ return value === void 0 || typeof value === "string" || typeof value === "number" || typeof value === "boolean" || Array.isArray(value) && value.every((item) => typeof item === "string");
2668
+ }
2669
+ function createSubmission(schemaOrInput, values, options) {
2670
+ if ("answers" in schemaOrInput) {
2671
+ const input = schemaOrInput;
2672
+ const id = input.id ?? generatedSubmissionId();
2673
+ if (input.formId.trim().length === 0) throw new TypeError("formId must not be empty.");
2674
+ if (!Number.isSafeInteger(input.formVersion) || input.formVersion < 1) {
2675
+ throw new TypeError("formVersion must be a positive safe integer.");
2676
+ }
2677
+ const submittedAt = input.submittedAt ?? (/* @__PURE__ */ new Date()).toISOString();
2678
+ if (submittedAt.trim().length === 0 || !Number.isFinite(Date.parse(submittedAt))) {
2679
+ throw new TypeError("submittedAt must be a valid date string.");
2680
+ }
2681
+ const answers = Object.freeze({ ...input.answers });
2682
+ return Object.freeze({
2683
+ id,
2684
+ formId: input.formId,
2685
+ formVersion: input.formVersion,
2686
+ locale: "",
2687
+ values: Object.freeze(cloneValues(toFormValues(answers))),
2688
+ answers,
2689
+ metadata: input.metadata,
2690
+ submittedAt,
2691
+ ...input.schemaRevision === void 0 ? {} : { schemaRevision: input.schemaRevision }
2692
+ });
2693
+ }
2694
+ const schema = schemaOrInput;
2695
+ if (values === void 0 || options === void 0) throw new TypeError("values and options are required.");
2183
2696
  assertValidFormSchema(schema);
2184
2697
  if (options.id.trim().length === 0) throw new TypeError("Submission ID must not be empty.");
2185
2698
  if (options.locale.trim().length === 0) throw new TypeError("Submission locale must not be empty.");
@@ -2199,6 +2712,7 @@ function createSubmission(schema, values, options) {
2199
2712
  formVersion: schema.version,
2200
2713
  locale: options.locale,
2201
2714
  values: Object.freeze(cloneValues(visibleValues)),
2715
+ answers: Object.freeze({ ...visibleValues }),
2202
2716
  submittedAt: options.submittedAt,
2203
2717
  ...options.metadata === void 0 ? {} : { metadata: Object.freeze({ ...options.metadata }) },
2204
2718
  ...options.translationMetadata === void 0 ? {} : { translationMetadata: Object.freeze({ ...options.translationMetadata }) }
@@ -3017,9 +3531,49 @@ function assertVersionMutable(status) {
3017
3531
  throw new TypeError(`A ${status} form version is immutable.`, { cause: error });
3018
3532
  }
3019
3533
  }
3534
+ function applyTransitionPlan(plan) {
3535
+ if (plan.schema !== void 0) return plan.schema;
3536
+ if (plan.publishedRecordToSave !== void 0) return plan.publishedRecordToSave.schema;
3537
+ if (plan.draftToCreate !== void 0) return plan.draftToCreate.schema;
3538
+ const archivedSchema = plan.archivedRecordsToSave?.[0]?.schema;
3539
+ if (archivedSchema !== void 0) return archivedSchema;
3540
+ throw new TypeError("A version transition plan must include a target schema.");
3541
+ }
3542
+ async function commitVersionTransition(options) {
3543
+ const { context, beforeTransition, afterTransition, persistAdapter } = options;
3544
+ const { formId, toVersion, expectedRevision, plan } = context;
3545
+ let currentDomainData = context.domainData;
3546
+ try {
3547
+ if (beforeTransition !== void 0) {
3548
+ const hookResult = await beforeTransition(context);
3549
+ if (hookResult !== void 0) currentDomainData = hookResult;
3550
+ }
3551
+ const nextSchema = applyTransitionPlan(plan);
3552
+ const { nextRevision } = await persistAdapter({
3553
+ formId,
3554
+ targetVersion: toVersion,
3555
+ expectedRevision,
3556
+ schema: nextSchema,
3557
+ ...currentDomainData === void 0 ? {} : { domainData: currentDomainData }
3558
+ });
3559
+ if (afterTransition !== void 0) {
3560
+ await afterTransition({
3561
+ ...context,
3562
+ ...currentDomainData === void 0 ? {} : { domainData: currentDomainData },
3563
+ nextRevision
3564
+ });
3565
+ }
3566
+ return { success: true, nextRevision };
3567
+ } catch (cause) {
3568
+ return { success: false, nextRevision: expectedRevision, error: { type: "transition_failed", cause } };
3569
+ }
3570
+ }
3020
3571
  export {
3021
3572
  DEFAULT_FIELD_TYPE_DEFINITIONS,
3573
+ EN_MESSAGES,
3574
+ JA_MESSAGES,
3022
3575
  aggregateResponses,
3576
+ applyTransitionPlan,
3023
3577
  assertValidFormSchema,
3024
3578
  assertVersionMutable,
3025
3579
  calculateChoiceDistribution,
@@ -3030,16 +3584,22 @@ export {
3030
3584
  cloneVersionToDraft,
3031
3585
  collectSchemaLocales,
3032
3586
  collectTranslationSlots,
3587
+ commitVersionTransition,
3033
3588
  computeSourceTextHash,
3034
3589
  createCloneTransitionPlan,
3035
3590
  createDeleteDraftTransitionPlan,
3591
+ createFormEngineTranslator,
3036
3592
  createPublishTransitionPlan,
3037
3593
  createResponseAccumulator,
3038
3594
  createSubmission,
3595
+ decodeStorageSubmissionCursor,
3596
+ decodeStorageTextAnswerCursor,
3039
3597
  decodeSubmissionCursor,
3040
3598
  decodeTextAnswerCursor,
3041
3599
  deleteDraft,
3042
3600
  dispatchWebhook,
3601
+ encodeStorageSubmissionCursor,
3602
+ encodeStorageTextAnswerCursor,
3043
3603
  encodeSubmissionCursor,
3044
3604
  encodeTextAnswerCursor,
3045
3605
  escapeCsvCell,
@@ -3057,6 +3617,7 @@ export {
3057
3617
  migrateSchemaTranslationMetadata,
3058
3618
  normalizeLocale,
3059
3619
  normalizeSubmissionPageSize,
3620
+ paginateWithFilter,
3060
3621
  pipeResponsesToCsvStream,
3061
3622
  populateSchemaTranslations,
3062
3623
  publishDraft,
@@ -3069,5 +3630,6 @@ export {
3069
3630
  validateAnswers,
3070
3631
  validateFormSchema,
3071
3632
  validatePageAnswers,
3072
- validateSchemaStructure
3633
+ validateSchemaStructure,
3634
+ validateSubmission
3073
3635
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@form-engine-ts/core",
3
- "version": "4.8.0",
3
+ "version": "5.0.1",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },