사용 설명서 > 개발자 문서 > 검증과 올리기
검증 오류 코드와 고치는 법
검증은 번들 구조(manifest·권한·Action)와 client 코드(HTML·CSS·JS)를 모두 확인합니다. 올릴 때 나오는 오류의 code 를 아래 표에서 찾아 고치세요. 코드 오류는 줄·열 위치가 함께 표시됩니다.
| 오류 코드 | 의미와 고치는 법 |
|---|---|
| action_without_permission | Action 이 있는데 그 종류에 필요한 권한이 permissions 에 없다. |
| bundle_too_large | 번들 전체가 1MB를 넘었다. 이미지·큰 데이터를 빼고 코드를 줄인다. |
| client_validator_failed | 검증기 실행에 실패했다. 잠시 후 다시 시도한다(코드 문제가 아닐 수 있다). |
| computed_destructure_not_allowed | 계산된 키로 객체를 분해해 전역·SDK 에 접근할 수 없다. |
| constructor_access_not_allowed | .constructor 로 생성자에 접근할 수 없다. |
| css_escape_not_allowed | CSS 에 우회용 이스케이프 표기를 쓸 수 없다. |
| css_image_set_not_allowed | CSS image-set 을 쓸 수 없다. |
| css_import_not_allowed | CSS 에 @import 를 쓸 수 없다. |
| css_namespace_url_not_allowed | CSS @namespace url 을 쓸 수 없다. |
| css_syntax_error | CSS 구문 오류다. 줄·열 위치를 확인한다. |
| css_too_large | client.css 가 256KB 를 넘었다. |
| css_url_not_allowed | CSS 에 url(...) 을 쓸 수 없다. 이미지는 CSS 배경으로도 불러올 수 없다. |
| document_access_not_allowed | document 를 변수에 담아 쓸 수 없다. document.querySelector(...) 처럼 바로 호출한다. |
| duplicate_action_key | Action key 가 중복됐다. |
| duplicate_event_name | 이벤트 이름이 중복됐다. |
| duplicate_permission | 같은 권한을 두 번 선언했다. |
| duplicate_variable_name | 변수 이름이 중복됐다. |
| dynamic_global_access_not_allowed | 이름을 문자열로 조립해 전역에 접근할 수 없다. |
| dynamic_sdk_api | FC[이름] 같은 동적 접근은 쓸 수 없다. 호출을 직접 쓴다. |
| eval_not_allowed | eval 을 쓸 수 없다. |
| form_binding_without_permission | form_binding 에는 forms.read 또는 forms.submit 권한이 필요하다. |
| function_constructor_not_allowed | new Function() 을 쓸 수 없다. |
| global_object_access_not_allowed | window·parent·top·globalThis·self 같은 전역 객체나 contentWindow 같은 프레임 접근을 쓸 수 없다. DOM 은 document.querySelector 로 직접 접근한다. |
| global_this_access_not_allowed | 최상위에서 this 로 전역 객체에 접근할 수 없다. 화살표 함수나 지역 변수를 쓴다. |
| html_external_url | 외부 주소(http:·https:·// 등)는 쓸 수 없다. 이미지·글꼴·스크립트를 외부에서 불러올 수 없다. |
| html_forbidden_attribute | srcdoc·ping 같은 속성은 쓸 수 없다. |
| html_forbidden_element | script·form·iframe·object·embed·link·base·meta 요소는 쓸 수 없다. 이벤트는 JS 에서 addEventListener 로 연결하고 입력은 form 없이 button type="button" 으로 처리한다. |
| html_inline_handler | onclick 같은 on* 속성은 쓸 수 없다. JS 에서 addEventListener 로 연결한다. |
| html_parse_error | HTML 구문 오류가 있다. |
| html_too_large | client.html 이 256KB 를 넘었다. |
| html_url_not_allowed | src·href 등 URL 속성에는 같은 페이지 앵커(#…)만 쓸 수 있다. 이미지는 JS 로 만든 <img> 의 src 로 넣는다. |
| invalid_actions | manifest.actions 모양이 틀렸다(1~5개, 종류별 필수 키). Action 표를 확인한다. |
| invalid_bundle | 번들이 JSON 객체가 아니거나 최상위 구조가 틀렸다. format_version·manifest·settings·client 네 키만 둔다. |
| invalid_client_files | client 는 html·css·js 세 문자열 키만 가진 객체여야 한다. |
| invalid_event | 이벤트에 name·fields 외의 키가 있거나 모양이 틀렸다. |
| invalid_event_field | 이벤트 필드의 type 은 string·number·boolean 이고 허용된 키(type·required·enum·minimum·maximum)만 쓴다. |
| invalid_event_fields | 이벤트 fields 모양이 틀렸다. { 필드: { type, required } } 로 쓴다. |
| invalid_event_name | 이벤트 이름은 소문자로 시작하고 소문자·숫자·점·밑줄만(최대 64자) 쓴다. |
| invalid_events | manifest.events 는 { name, fields } 배열이어야 한다. |
| invalid_form_binding | manifest.form_binding 모양이 틀렸다. |
| invalid_format_version | format_version 은 정수 1 또는 2 여야 한다. |
| invalid_html | HTML 을 해석하지 못했다. |
| invalid_html_style | HTML 의 style 속성이나 <style> 안에 허용되지 않는 CSS 가 있다. |
| invalid_manifest | manifest 에 필수 키(name·sdk_version·permissions·screens·events·variables)가 빠졌거나 허용되지 않는 키가 있다. |
| invalid_manifest_name | manifest.name 은 비어 있지 않은 문자열이어야 한다. |
| invalid_permissions | manifest.permissions 는 문자열 배열이어야 한다. |
| invalid_screens | manifest.screens 는 { key, label } 배열이어야 한다. |
| invalid_sdk_version | manifest.sdk_version 은 문자열 "1" 이어야 한다. |
| invalid_setting_value | settings 값이 변수의 타입·범위와 맞지 않는다. |
| invalid_settings | settings 는 JSON 객체여야 한다. |
| invalid_state | manifest.state(format_version 2)는 { name, type, default?, persist? } 배열이며 persist 는 false 만 가능하다. |
| invalid_variable | 변수 선언 모양이 틀렸다. { name, type, default } 이고 type 은 text·color·number·boolean·select 다. |
| invalid_variables | manifest.variables 는 배열이어야 한다. |
| js_syntax_error | JavaScript 구문 오류다. 줄·열 위치를 확인한다. |
| js_too_large | client.js 가 256KB 를 넘었다. |
| missing_form_policy | 앱 소유자가 설치 화면에서 허용 Form 을 정해야 한다(번들 문제가 아님). |
| missing_sdk_permission | JS 가 쓰는 FC 호출에 필요한 권한이 manifest.permissions 에 없다. SDK 표의 권한 열을 확인한다. |
| missing_tag_policy | 앱 소유자가 설치 화면에서 허용 태그를 정해야 한다(번들 문제가 아님). |
| optional_sdk_api_not_allowed | FC?.contact?.create 같은 옵셔널 체이닝으로 SDK 를 부를 수 없다. FC.contact.create(...) 로 직접 호출한다. |
| permission_without_action | Action 권한(search.web·ai.generate·webhook.send·image.generate·pdf.generate·upload.file)은 같은 종류의 Action 과 항상 짝이다. |
| readonly_settings | FC.settings 는 읽기 전용이다. 값을 바꾸지 않는다. |
| reflect_access_not_allowed | Reflect.* 로 객체를 조작해 전역·SDK 에 접근할 수 없다. |
| reflection_access_not_allowed | Object.getOwnPropertyDescriptor 같은 리플렉션을 쓸 수 없다. |
| reserved_event_name | contact. · lead. · order. · tag. 로 시작하는 이름은 예약돼 있다. 다른 이름을 쓴다. |
| sdk_alias_not_allowed | FC 를 다른 변수에 담거나 동적으로 접근할 수 없다. FC.contact.create(...) 처럼 직접 호출한다. |
| too_many_event_fields | 이벤트 하나의 필드가 너무 많다. |
| too_many_events | 이벤트는 최대 30개다. |
| unknown_bundle_keys | 최상위에 허용되지 않는 키가 있다. format_version·manifest·settings·client 만 쓴다. |
| unknown_permission | 사용 가능한 권한 어휘에 없는 권한이다. 권한 표를 확인한다. |
| unknown_setting | settings 에 manifest.variables 로 선언하지 않은 키가 있다. 모든 settings 키를 variables 에 선언한다. |
| unsupported_sdk_api | 허용된 SDK 호출이 아니다. SDK 표에 있는 호출만 쓴다. |