{"_id":"@captcha-pro/uniapp-vue","_rev":"3-81e7824042523054b8c02d3b87ccd830","name":"@captcha-pro/uniapp-vue","dist-tags":{"latest":"2.2.0"},"versions":{"2.0.0":{"name":"@captcha-pro/uniapp-vue","version":"2.0.0","keywords":["captcha","uniapp","vue3","slider-captcha","click-captcha"],"author":{"name":"saqqdy","email":"https://github.com/saqqdy"},"license":"MIT","_id":"@captcha-pro/uniapp-vue@2.0.0","maintainers":[{"name":"saqqdy","email":"saqqdy@qq.com"}],"dist":{"shasum":"c69686457dec007dbc0728b4dbaef145cd96d4ee","tarball":"https://registry.npmjs.org/@captcha-pro/uniapp-vue/-/uniapp-vue-2.0.0.tgz","fileCount":37,"integrity":"sha512-svfwr9lKaLUMn/W0bjBrARqwSf+9tAw//xIxZdxUsV35SPzdIvXNEa15t7o6aHXdiZy3C04CmAlt79fTzScVHQ==","signatures":[{"sig":"MEUCIQC3PLHGJMijXgxzwR0of5qvR7wx61ujK+KuyK4eqpd2ngIgA2/ZrJAlrWl7IC5kF+h+AdInHzCOqFj+PrjQPf5MY+I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73970},"main":"dist/index.cjs","type":"module","_from":"file:captcha-pro-uniapp-vue-2.0.0.tgz","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./types":"./dist/types.js","./request":"./dist/request.js","./composables/*":"./dist/composables/*.js","./dist/style.css":"./dist/style.css","./click-captcha.vue":"./src/components/click-captcha.vue","./popup-captcha.vue":"./src/components/popup-captcha.vue","./slider-captcha.vue":"./src/components/slider-captcha.vue"},"scripts":{"test":"echo 'no tests'","build":"vite build -c build/vite.config.ts","clean":"rm-all dist","watch":"vite build -c build/vite.config.ts -w"},"_npmUser":{"name":"saqqdy","email":"saqqdy@qq.com"},"_resolved":"/tmp/236ca532329dcdc24238a292a488ccae/captcha-pro-uniapp-vue-2.0.0.tgz","_integrity":"sha512-svfwr9lKaLUMn/W0bjBrARqwSf+9tAw//xIxZdxUsV35SPzdIvXNEa15t7o6aHXdiZy3C04CmAlt79fTzScVHQ==","_npmVersion":"10.8.2","description":"uni-app + Vue 3 captcha components for captcha-pro (backend-only mode)","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@captcha-pro/mp-shared":"2.0.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"sass":"^1.101.0","vite":"^5.4.19","rm-all":"^1.1.1","typescript":"^5.9.3","@types/node":"^24.13.3"},"peerDependencies":{"vue":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/uniapp-vue_2.0.0_1786288871487_0.1530316406670693","host":"s3://npm-registry-packages-npm-production"}},"2.1.0":{"name":"@captcha-pro/uniapp-vue","version":"2.1.0","keywords":["captcha","uniapp","vue3","slider-captcha","click-captcha"],"author":{"name":"saqqdy","email":"https://github.com/saqqdy"},"license":"MIT","_id":"@captcha-pro/uniapp-vue@2.1.0","maintainers":[{"name":"saqqdy","email":"saqqdy@qq.com"}],"dist":{"shasum":"5c7cf0a6da55da221b935c3874ac16de82e4c9b4","tarball":"https://registry.npmjs.org/@captcha-pro/uniapp-vue/-/uniapp-vue-2.1.0.tgz","fileCount":37,"integrity":"sha512-nG4QY2H3YuIhyOEbfkiWNLkZupjGR+cPS3GdLWmAlLJPd39OFP5TtYV4JTW1gqnzwRUO1bfc8+CD+cYI3BuIUw==","signatures":[{"sig":"MEYCIQDlA1J638PLFKte1t/2WBVwFEtUxgAraye+FD6L+vfAAAIhAJqxLaikcdlla3MCIotQ3NqTPmbT1cnoU6CaXMmWPPJJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":73970},"main":"dist/index.cjs","type":"module","_from":"file:captcha-pro-uniapp-vue-2.1.0.tgz","types":"dist/index.d.ts","module":"dist/index.js","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.js","default":"./dist/index.js","require":"./dist/index.cjs"},"./types":"./dist/types.js","./request":"./dist/request.js","./composables/*":"./dist/composables/*.js","./dist/style.css":"./dist/style.css","./click-captcha.vue":"./src/components/click-captcha.vue","./popup-captcha.vue":"./src/components/popup-captcha.vue","./slider-captcha.vue":"./src/components/slider-captcha.vue"},"scripts":{"test":"echo 'no tests'","build":"vite build -c build/vite.config.ts","clean":"rm-all dist","watch":"vite build -c build/vite.config.ts -w"},"_npmUser":{"name":"saqqdy","email":"saqqdy@qq.com"},"_resolved":"/tmp/330105c4695019ff0e634dbbf71136a3/captcha-pro-uniapp-vue-2.1.0.tgz","_integrity":"sha512-nG4QY2H3YuIhyOEbfkiWNLkZupjGR+cPS3GdLWmAlLJPd39OFP5TtYV4JTW1gqnzwRUO1bfc8+CD+cYI3BuIUw==","_npmVersion":"10.8.2","description":"uni-app + Vue 3 captcha components for captcha-pro (backend-only mode)","directories":{},"_nodeVersion":"20.20.2","dependencies":{"@captcha-pro/mp-shared":"2.1.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org"},"_hasShrinkwrap":false,"devDependencies":{"sass":"^1.101.0","vite":"^5.4.19","rm-all":"^1.1.1","typescript":"^5.9.3","@types/node":"^24.13.3"},"peerDependencies":{"vue":"^3.0.0"},"_npmOperationalInternal":{"tmp":"tmp/uniapp-vue_2.1.0_1786844029978_0.8319942542646368","host":"s3://npm-registry-packages-npm-production"}},"2.2.0":{"name":"@captcha-pro/uniapp-vue","description":"uni-app + Vue 3 captcha components for captcha-pro (backend-only mode)","type":"module","version":"2.2.0","main":"dist/index.cjs","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","require":"./dist/index.cjs","import":"./dist/index.js","default":"./dist/index.js"},"./slider-captcha.vue":"./src/components/slider-captcha.vue","./click-captcha.vue":"./src/components/click-captcha.vue","./popup-captcha.vue":"./src/components/popup-captcha.vue","./composables/*":"./dist/composables/*.js","./request":"./dist/request.js","./types":"./dist/types.js","./dist/style.css":"./dist/style.css"},"dependencies":{"@captcha-pro/mp-shared":"2.2.0"},"devDependencies":{"@types/node":"^24.13.3","rm-all":"^1.1.1","sass":"^1.101.0","typescript":"^5.9.3","vite":"^5.4.19"},"peerDependencies":{"vue":"^3.0.0"},"keywords":["captcha","uniapp","vue3","slider-captcha","click-captcha"],"license":"MIT","author":{"name":"saqqdy","email":"https://github.com/saqqdy"},"publishConfig":{"registry":"https://registry.npmjs.org","access":"public"},"scripts":{"build":"vite build -c build/vite.config.ts","watch":"vite build -c build/vite.config.ts -w","clean":"rm-all dist","test":"echo 'no tests'"},"_id":"@captcha-pro/uniapp-vue@2.2.0","_integrity":"sha512-u1nCQJJJuZ529r07iBoGTeiqEY0NXvxAUwRFRpVL6BLboR7VtkHJZseeBftaKLHevGFqcYD69OE0pZAiguiOAg==","_resolved":"/tmp/078bb28eaff91d15f86b1060d69e571e/captcha-pro-uniapp-vue-2.2.0.tgz","_from":"file:captcha-pro-uniapp-vue-2.2.0.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-u1nCQJJJuZ529r07iBoGTeiqEY0NXvxAUwRFRpVL6BLboR7VtkHJZseeBftaKLHevGFqcYD69OE0pZAiguiOAg==","shasum":"54bd2fecdb6d1d281a959796e1dc8793f25f924b","tarball":"https://registry.npmjs.org/@captcha-pro/uniapp-vue/-/uniapp-vue-2.2.0.tgz","fileCount":37,"unpackedSize":75799,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCHrV7rKUL/nI1//kOZbNcCpIa0RcGTr+yja5miZ5O2twIgTyiIXjuy2fOFWFb+vMW7Dv8CxikUCO8wvKtMplrGN7A="}]},"_npmUser":{"name":"saqqdy","email":"saqqdy@qq.com"},"directories":{},"maintainers":[{"name":"saqqdy","email":"saqqdy@qq.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/uniapp-vue_2.2.0_1786972759258_0.08200640949473392"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-09T15:21:11.221Z","modified":"2026-08-17T13:19:20.323Z","2.0.0":"2026-08-09T15:21:11.655Z","2.1.0":"2026-08-16T01:33:50.129Z","2.2.0":"2026-08-17T13:19:19.425Z"},"author":{"name":"saqqdy","email":"https://github.com/saqqdy"},"license":"MIT","keywords":["captcha","uniapp","vue3","slider-captcha","click-captcha"],"description":"uni-app + Vue 3 captcha components for captcha-pro (backend-only mode)","maintainers":[{"name":"saqqdy","email":"saqqdy@qq.com"}],"readme":"# @captcha-pro/uniapp-vue\n\nuni-app + Vue 3 captcha components for Captcha Pro (backend-only mode).\n\n**[简体中文](./README_CN.md)**\n\n## Installation\n\n```bash\npnpm add @captcha-pro/uniapp-vue\n```\n\n## Important: Backend-Only Mode\n\nThis package only supports backend verification mode. All captcha images are provided by backend API, `backend` configuration is required.\n\n## Usage\n\n### Global Registration\n\n```typescript\nimport { createSSRApp } from 'vue'\nimport CaptchaPro from '@captcha-pro/uniapp-vue'\n\nconst app = createSSRApp(App)\napp.use(CaptchaPro)\n```\n\n### Component Usage\n\n```vue\n<template>\n  <!-- Slider Captcha -->\n  <SliderCaptcha\n    :backend=\"backendConfig\"\n    :width=\"300\"\n    :height=\"170\"\n    @success=\"onSuccess\"\n    @fail=\"onFail\"\n  />\n\n  <!-- Click Captcha -->\n  <ClickCaptcha\n    :backend=\"backendConfig\"\n    :width=\"300\"\n    :height=\"170\"\n    @success=\"onSuccess\"\n  />\n\n  <!-- Popup Captcha -->\n  <PopupCaptcha\n    ref=\"popupRef\"\n    type=\"slider\"\n    :backend=\"backendConfig\"\n    @success=\"onSuccess\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref } from 'vue'\nimport { SliderCaptcha, ClickCaptcha, PopupCaptcha } from '@captcha-pro/uniapp-vue'\n\nconst backendConfig = {\n  getCaptcha: 'https://your-api.com/captcha/get',\n  verify: 'https://your-api.com/captcha/verify',\n  timeout: 10000,\n}\n\nconst popupRef = ref()\nconst onSuccess = () => console.log('Verification passed!')\n\n// Show popup\npopupRef.value?.show()\n</script>\n```\n\n### Using Composables\n\n```vue\n<template>\n  <view ref=\"containerRef\" class=\"captcha-container\" />\n  <view v-if=\"loading\">Loading...</view>\n  <view v-if=\"status === 'success'\" class=\"success\">{{ statusText }}</view>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted } from 'vue'\nimport { useSliderCaptcha } from '@captcha-pro/uniapp-vue/composables'\n\nconst containerRef = ref()\nconst backendConfig = {\n  getCaptcha: 'https://your-api.com/captcha/get',\n  verify: 'https://your-api.com/captcha/verify',\n}\n\nconst {\n  status,\n  statusText,\n  loading,\n  error,\n  init,\n  refresh,\n  destroy\n} = useSliderCaptcha({\n  backend: backendConfig,\n  width: 300,\n  height: 170,\n  onSuccess: () => console.log('Passed!')\n}, containerRef)\n\nonMounted(() => init())\nonUnmounted(() => destroy())\n</script>\n```\n\n## Backend Configuration (Required)\n\n```typescript\ninterface BackendConfig {\n  getCaptcha: string | (params: any) => Promise<any>  // Required\n  verify: string | (data: any) => Promise<any>        // Required\n  headers?: Record<string, string>                     // Optional\n  timeout?: number                                     // Optional, default: 10000\n}\n```\n\nExample with custom functions:\n\n```typescript\nconst backendConfig = {\n  async getCaptcha(params) {\n    const res = await uni.request({\n      url: '/api/captcha/get',\n      data: params,\n    })\n    return res.data\n  },\n  async verify(data) {\n    const res = await uni.request({\n      url: '/api/captcha/verify',\n      data,\n      method: 'POST',\n    })\n    return res.data\n  },\n}\n```\n\n## TypeScript Support\n\nFull TypeScript support with exported types:\n\n```typescript\nimport type {\n  BackendConfig,\n  SliderCaptchaProps,\n  ClickCaptchaProps,\n  PopupCaptchaProps,\n  SliderCaptchaRef,\n  ClickCaptchaRef,\n  PopupCaptchaRef,\n} from '@captcha-pro/uniapp-vue'\n```\n\n## Components\n\n### SliderCaptcha\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| backend | BackendConfig | - | **Required**, backend API config |\n| width | number | 300 | Container width |\n| height | number | 170 | Container height |\n| sliderWidth | number | 42 | Slider piece width |\n| sliderHeight | number | 42 | Slider piece height |\n| showRefresh | boolean | true | Show refresh button |\n| locale | 'zh-CN' \\| 'en-US' | 'zh-CN' | Language |\n\n### ClickCaptcha\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| backend | BackendConfig | - | **Required**, backend API config |\n| width | number | 300 | Container width |\n| height | number | 170 | Container height |\n| showRefresh | boolean | true | Show refresh button |\n\n### PopupCaptcha\n\n| Prop | Type | Default | Description |\n|------|------|---------|-------------|\n| type | 'slider' \\| 'click' | 'slider' | Captcha type |\n| backend | BackendConfig | - | **Required**, backend API config |\n| title | string | '请完成安全验证' | Popup title |\n| maskClosable | boolean | true | Close on mask click |\n| showClose | boolean | true | Show close button |\n| autoClose | boolean | true | Auto close on success |\n| closeDelay | number | 500 | Close delay (ms) |\n\n## Exposed Methods\n\n```vue\n<script setup>\nconst captchaRef = ref()\nconst popupRef = ref()\n\n// SliderCaptcha / ClickCaptcha methods\ncaptchaRef.value?.refresh()\ncaptchaRef.value?.getData()\n\n// PopupCaptcha methods\npopupRef.value?.show()\npopupRef.value?.hide()\npopupRef.value?.isVisible()\n</script>\n```\n\n## Events\n\n| Event | Description | Payload |\n|-------|-------------|---------|\n| success | Verification passed | `{ verifiedAt }` |\n| fail | Verification failed | - |\n| refresh | Refresh clicked | - |\n| error | Loading error | `Error` |\n| open | Popup opened | - |\n| close | Popup closed | - |\n\n## License\n\nMIT","readmeFilename":"README.md"}