{"id":15492128,"url":"https://github.com/imjuni/jin-frame","last_synced_at":"2026-04-27T05:01:25.526Z","repository":{"id":38320713,"uuid":"267999719","full_name":"imjuni/jin-frame","owner":"imjuni","description":"A reusable, declarative, type-safe, and extendable HTTP request library.","archived":false,"fork":false,"pushed_at":"2026-04-26T01:07:52.000Z","size":9840,"stargazers_count":4,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-04-26T03:12:26.707Z","etag":null,"topics":["axios","client","declarative","http","http-client","http-clients","resusable","type-safe"],"latest_commit_sha":null,"homepage":"https://imjuni.github.io/jin-frame/","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/imjuni.png","metadata":{"files":{"readme":"README.ko.md","changelog":"CHANGED.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":"ROADMAP.ko.md","authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":"AGENTS.md","dco":null,"cla":null}},"created_at":"2020-05-30T03:08:40.000Z","updated_at":"2025-10-01T16:46:10.000Z","dependencies_parsed_at":"2023-11-19T04:27:07.550Z","dependency_job_id":"a8c39f20-f42b-4c11-b97f-ce40c7836d7a","html_url":"https://github.com/imjuni/jin-frame","commit_stats":{"total_commits":78,"total_committers":1,"mean_commits":78.0,"dds":0.0,"last_synced_commit":"b29461070ea3a1b35fd4afde511f5f7c343809c8"},"previous_names":[],"tags_count":33,"template":false,"template_full_name":null,"purl":"pkg:github/imjuni/jin-frame","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imjuni%2Fjin-frame","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imjuni%2Fjin-frame/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imjuni%2Fjin-frame/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imjuni%2Fjin-frame/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/imjuni","download_url":"https://codeload.github.com/imjuni/jin-frame/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/imjuni%2Fjin-frame/sbom","scorecard":{"id":282989,"data":{"date":"2025-08-11","repo":{"name":"github.com/imjuni/jin-frame","commit":"7c86887ca1ba9379b328d810a40a229d2bd014e3"},"scorecard":{"version":"v5.2.1-40-gf6ed084d","commit":"f6ed084d17c9236477efd66e5b258b9d4cc7b389"},"score":3.1,"checks":[{"name":"Code-Review","score":0,"reason":"Found 0/27 approved changesets -- score normalized to 0","details":null,"documentation":{"short":"Determines if the project requires human code review before pull requests (aka merge requests) are merged.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#code-review"}},{"name":"Maintained","score":6,"reason":"8 commit(s) and 0 issue activity found in the last 90 days -- score normalized to 6","details":null,"documentation":{"short":"Determines if the project is \"actively maintained\".","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#maintained"}},{"name":"Dangerous-Workflow","score":10,"reason":"no dangerous workflow patterns detected","details":null,"documentation":{"short":"Determines if the project's GitHub Action workflows avoid dangerous patterns.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#dangerous-workflow"}},{"name":"Packaging","score":-1,"reason":"packaging workflow not detected","details":["Warn: no GitHub/GitLab publishing workflow detected."],"documentation":{"short":"Determines if the project is published as a package that others can easily download, install, easily update, and uninstall.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#packaging"}},{"name":"Token-Permissions","score":0,"reason":"detected GitHub workflow tokens with excessive permissions","details":["Warn: no topLevel permission defined: .github/workflows/ci.yml:1","Info: no jobLevel write permissions found"],"documentation":{"short":"Determines if the project's workflows follow the principle of least privilege.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#token-permissions"}},{"name":"Binary-Artifacts","score":10,"reason":"no binaries found in the repo","details":null,"documentation":{"short":"Determines if the project has generated executable (binary) artifacts in the source repository.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#binary-artifacts"}},{"name":"Pinned-Dependencies","score":0,"reason":"dependency not pinned by hash detected -- score normalized to 0","details":["Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:23: update your workflow using https://app.stepsecurity.io/secureworkflow/imjuni/jin-frame/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:24: update your workflow using https://app.stepsecurity.io/secureworkflow/imjuni/jin-frame/ci.yml/master?enable=pin","Warn: GitHub-owned GitHubAction not pinned by hash: .github/workflows/ci.yml:28: update your workflow using https://app.stepsecurity.io/secureworkflow/imjuni/jin-frame/ci.yml/master?enable=pin","Warn: third-party GitHubAction not pinned by hash: .github/workflows/ci.yml:35: update your workflow using https://app.stepsecurity.io/secureworkflow/imjuni/jin-frame/ci.yml/master?enable=pin","Info:   0 out of   2 GitHub-owned GitHubAction dependencies pinned","Info:   0 out of   2 third-party GitHubAction dependencies pinned"],"documentation":{"short":"Determines if the project has declared and pinned the dependencies of its build process.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#pinned-dependencies"}},{"name":"CII-Best-Practices","score":0,"reason":"no effort to earn an OpenSSF best practices badge detected","details":null,"documentation":{"short":"Determines if the project has an OpenSSF (formerly CII) Best Practices Badge.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#cii-best-practices"}},{"name":"Security-Policy","score":0,"reason":"security policy file not detected","details":["Warn: no security policy file detected","Warn: no security file to analyze","Warn: no security file to analyze","Warn: no security file to analyze"],"documentation":{"short":"Determines if the project has published a security policy.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#security-policy"}},{"name":"License","score":10,"reason":"license file detected","details":["Info: project has a license file: LICENSE:0","Info: FSF or OSI recognized license: MIT License: LICENSE:0"],"documentation":{"short":"Determines if the project has defined a license.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#license"}},{"name":"Fuzzing","score":0,"reason":"project is not fuzzed","details":["Warn: no fuzzer integrations found"],"documentation":{"short":"Determines if the project uses fuzzing.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#fuzzing"}},{"name":"Signed-Releases","score":-1,"reason":"no releases found","details":null,"documentation":{"short":"Determines if the project cryptographically signs release artifacts.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#signed-releases"}},{"name":"Branch-Protection","score":0,"reason":"branch protection not enabled on development/release branches","details":["Warn: branch protection not enabled for branch 'master'"],"documentation":{"short":"Determines if the default and release branches are protected with GitHub's branch protection settings.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#branch-protection"}},{"name":"SAST","score":0,"reason":"SAST tool is not run on all commits -- score normalized to 0","details":["Warn: 0 commits out of 30 are checked with a SAST tool"],"documentation":{"short":"Determines if the project uses static code analysis.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#sast"}},{"name":"Vulnerabilities","score":0,"reason":"23 existing vulnerabilities detected","details":["Warn: Project is vulnerable to: GHSA-968p-4wvh-cqc8","Warn: Project is vulnerable to: GHSA-v6h2-p8h4-qcjw","Warn: Project is vulnerable to: GHSA-grv7-fg5c-xmjg","Warn: Project is vulnerable to: GHSA-3xgq-45jj-v275","Warn: Project is vulnerable to: GHSA-67mh-4wv8-2f99","Warn: Project is vulnerable to: GHSA-jchw-25xp-jwwc","Warn: Project is vulnerable to: GHSA-cxjh-pqwp-8mfp","Warn: Project is vulnerable to: GHSA-fjxv-7rqg-78g4","Warn: Project is vulnerable to: GHSA-952p-6rrq-rcjv","Warn: Project is vulnerable to: GHSA-mwcw-c2x4-8c55","Warn: Project is vulnerable to: GHSA-gcx4-mw62-g8wm","Warn: Project is vulnerable to: GHSA-52f5-9888-hmc6","Warn: Project is vulnerable to: GHSA-92r3-m2mg-pj97","Warn: Project is vulnerable to: GHSA-c24v-8rfc-w8vw","Warn: Project is vulnerable to: GHSA-8jhw-289h-jh2g","Warn: Project is vulnerable to: GHSA-64vr-g452-qvp3","Warn: Project is vulnerable to: GHSA-9cwx-2883-4wfx","Warn: Project is vulnerable to: GHSA-vg6x-rcgg-rjx6","Warn: Project is vulnerable to: GHSA-x574-m823-4x7w","Warn: Project is vulnerable to: GHSA-4r4m-qw57-chr8","Warn: Project is vulnerable to: GHSA-xcj6-pq6g-qj4x","Warn: Project is vulnerable to: GHSA-356w-63v5-8wf4","Warn: Project is vulnerable to: GHSA-859w-5945-r5v3"],"documentation":{"short":"Determines if the project has open, known unfixed vulnerabilities.","url":"https://github.com/ossf/scorecard/blob/f6ed084d17c9236477efd66e5b258b9d4cc7b389/docs/checks.md#vulnerabilities"}}]},"last_synced_at":"2025-08-17T16:24:56.117Z","repository_id":38320713,"created_at":"2025-08-17T16:24:56.117Z","updated_at":"2025-08-17T16:24:56.117Z"},"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32323215,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-26T23:26:28.701Z","status":"online","status_checked_at":"2026-04-27T02:00:06.769Z","response_time":128,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["axios","client","declarative","http","http-client","http-clients","resusable","type-safe"],"created_at":"2024-10-02T07:58:56.855Z","updated_at":"2026-04-27T05:01:25.384Z","avatar_url":"https://github.com/imjuni.png","language":"TypeScript","readme":"# jin-frame\r\n\r\n![ts](https://flat.badgen.net/badge/Built%20With/TypeScript/blue)\r\n[![Download Status](https://img.shields.io/npm/dw/jin-frame.svg?style=flat-square)](https://npmcharts.com/compare/jin-frame?minimal=true)\r\n[![Github Star](https://img.shields.io/github/stars/imjuni/jin-frame.svg?style=flat-square)](https://github.com/imjuni/jin-frame)\r\n[![Github Issues](https://img.shields.io/github/issues-raw/imjuni/jin-frame.svg?style=flat-square)](https://github.com/imjuni/jin-frame/issues)\r\n[![NPM version](https://img.shields.io/npm/v/jin-frame.svg?style=flat-square)](https://www.npmjs.com/package/jin-frame)\r\n[![License](https://img.shields.io/npm/l/jin-frame.svg?style=flat-square)](https://github.com/imjuni/jin-frame/blob/master/LICENSE)\r\n[![ci](https://github.com/imjuni/jin-frame/actions/workflows/ci.yml/badge.svg?style=flat-square)](https://github.com/imjuni/jin-frame/actions/workflows/ci.yml)\r\n[![codecov](https://codecov.io/gh/imjuni/jin-frame/branch/master/graph/badge.svg?style=flat-square\u0026token=R7R2PdJcS9)](https://codecov.io/gh/imjuni/jin-frame)\r\n[![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)\r\n\r\n\u003cp align=\"center\"\u003e\r\n   \u003cimg src=\"assets/jin-frame-brand.png\" alt=\"brand\" width=\"400\"/\u003e\r\n\u003c/p\u003e\r\n\r\njin-frame은 TypeScript 데코레이터와 클래스를 사용한 API 프레임워크로 API 요청을 선언적으로 작성할 수 있게 도와줍니다. 이렇게 작성한 API 요청은 재사용 가능하며 OOP 상속 구조를 사용하여 확장할 수 있습니다. 또한 Axios를 사용하여 안정성과 호환성을 확보하면서 hook, retry, mocking 등 실무에 필요한 다양한 기능을 제공합니다.\r\n\r\n## Why jin-frame?\r\n\r\n1. 선언적 API 정의\r\n   - 클래스와 데코레이터를 사용하여 URL, Querystring, Path Parameter, Body, Header를 직관적으로 정의할 수 있습니다\r\n1. 타입 안정성\r\n   - TypeScript 타입 시스템을 사용하며, 타입 불일치를 컴파일 단계에서 검출합니다.\r\n1. Retry, Hook, File Upload, Mocking 지원\r\n   - Retry, Hook, File Upload, Mocking 등 실무에 필요한 기능을 제공합니다.\r\n1. Axios 에코 시스템 활용\r\n1. Path Parameter 지원\r\n   - `example.com/:id` 와 같이 URL을 통한 Path Paramter 치환을 지원합니다.\r\n\r\n## Table of Contents \u003c!-- omit in toc --\u003e\r\n\r\n- [Why jin-frame?](#why-jin-frame)\r\n- [Comparison of direct usage and jin-frame](#comparison-of-direct-usage-and-jin-frame)\r\n- [Requirements](#requirements)\r\n- [Install](#install)\r\n- [Useage](#useage)\r\n\r\n## Comparison of direct usage and jin-frame\r\n\r\n| Direct usage                        | Jin-Frame                                  |\r\n| ----------------------------------- | ------------------------------------------ |\r\n| ![axios](assets/axios-usage.png)    | ![jin-frame](assets/jinframe-usage.png)    |\r\n| [axios svg](assets/axios-usage.svg) | [jin-frame svg](assets/jinframe-usage.svg) |\r\n\r\n## Requirements\r\n\r\n1. TypeScript\r\n1. Decorator\r\n   - enable experimentalDecorators, emitDecoratorMetadata option in `tsconfig.json`\r\n\r\n```jsonc\r\n{\r\n  \"extends\": \"@tsconfig/node20/tsconfig.json\",\r\n  \"compilerOptions\": {\r\n    // enable experimentalDecorators, emitDecoratorMetadata for using decorator\r\n    \"experimentalDecorators\": true,\r\n    \"emitDecoratorMetadata\": true,\r\n  },\r\n}\r\n```\r\n\r\n## Install\r\n\r\n```sh\r\nnpm install jin-frame --save\r\n```\r\n\r\n```sh\r\nyarn add jin-frame --save\r\n```\r\n\r\n```sh\r\npnpm add jin-frame --save\r\n```\r\n\r\n## Useage\r\n\r\n```ts\r\nimport { Post, Param, Body, Header, Query } from 'jin-frame';\r\n\r\n@Post({ host: 'http://some.api.google.com', path: '/jinframe/:passing' })\r\nclass TestPostQuery extends JinFrame {\r\n  @Param()\r\n  public declare readonly passing: string;\r\n\r\n  @Body({ replaceAt: 'test.hello.marvel.name' })\r\n  public declare readonly name: string;\r\n\r\n  @Header({ replaceAt: 'test.hello.marvel.skill' })\r\n  public declare readonly skill: string;\r\n\r\n  @Body({ replaceAt: 'test.hello.marvel.gender' })\r\n  public declare readonly gender: string;\r\n}\r\n```\r\n\r\n이 클래스는 다음과 같은 axios 요청을 생성합니다.\r\n\r\n```js\r\n{\r\n  timeout: 2000,\r\n  headers: { test: { hello: { marvel: { skill: 'beam' } } }, 'Content-Type': 'application/json' },\r\n  method: 'POST',\r\n  data: { test: { hello: { marvel: { name: 'ironman', gender: 'male' } } } },\r\n  transformRequest: undefined,\r\n  url: 'http://some.api.yanolja.com/jinframe/pass',\r\n  validateStatus: () =\u003e true\r\n}\r\n```\r\n\r\n이 객체를 여러 번 생성하더라도 JinFrame은 실수를 하지 않고 언제나 올바른 객체를 생성할 것입니다. 실행하는 과정도 단순합니다. axios를 사용하기 때문에 브라우저에서도 잘 동작합니다.\r\n\r\n```ts\r\nconst query = new TestPostQuery('ironman', 'beam');\r\nconst requester = query.create();\r\n\r\nconst res = await requester();\r\n```\r\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimjuni%2Fjin-frame","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fimjuni%2Fjin-frame","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fimjuni%2Fjin-frame/lists"}