{"id":20129329,"url":"https://github.com/aicore/plugin-registry-backend","last_synced_at":"2026-06-09T15:02:55.187Z","repository":{"id":40646591,"uuid":"464363718","full_name":"aicore/plugin-registry-backend","owner":"aicore","description":"Backend Service for Phoenix and Brackets Plugin Registry","archived":false,"fork":false,"pushed_at":"2026-05-28T19:41:57.000Z","size":214,"stargazers_count":1,"open_issues_count":14,"forks_count":0,"subscribers_count":3,"default_branch":"main","last_synced_at":"2026-05-28T21:20:48.586Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"agpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/aicore.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-02-28T06:24:40.000Z","updated_at":"2024-08-26T19:58:05.000Z","dependencies_parsed_at":"2022-08-09T23:50:55.399Z","dependency_job_id":"ba6bed75-3abb-48fd-bbc8-9293be7b9c25","html_url":"https://github.com/aicore/plugin-registry-backend","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":"aicore/template-nodejs","purl":"pkg:github/aicore/plugin-registry-backend","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aicore%2Fplugin-registry-backend","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aicore%2Fplugin-registry-backend/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aicore%2Fplugin-registry-backend/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aicore%2Fplugin-registry-backend/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/aicore","download_url":"https://codeload.github.com/aicore/plugin-registry-backend/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/aicore%2Fplugin-registry-backend/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34112225,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-09T02:00:06.510Z","response_time":63,"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":[],"created_at":"2024-11-13T20:33:35.666Z","updated_at":"2026-06-09T15:02:55.169Z","avatar_url":"https://github.com/aicore.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# plugin-registry-backend\nPlugin Registry Backend service is a express JS service which supports clients \nlike Brackets Code Editor (https://brackets.io/) and Phoenix Code Editor(https://phoenix.core.ai/)\nby providing all the necessary APIs to render the in-app extension store. \n\n## Code Guardian\n[![\u003capp\u003e build verification](https://github.com/aicore/plugin-registry-backend/actions/workflows/build_verify.yml/badge.svg)](https://github.com/aicore/template-nodejs/actions/workflows/build_verify.yml)\n\n\u003ca href=\"https://sonarcloud.io/summary/new_code?id=aicore_plugin-registry-backend\"\u003e\n  \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=aicore_plugin-registry-backend\u0026metric=alert_status\" alt=\"Sonar code quality check\" /\u003e\n  \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=aicore_plugin-registry-backend\u0026metric=security_rating\" alt=\"Security rating\" /\u003e\n  \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=aicore_plugin-registry-backend\u0026metric=vulnerabilities\" alt=\"vulnerabilities\" /\u003e\n  \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=aicore_plugin-registry-backend\u0026metric=coverage\" alt=\"Code Coverage\" /\u003e\n  \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=aicore_plugin-registry-backend\u0026metric=bugs\" alt=\"Code Bugs\" /\u003e\n  \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=aicore_plugin-registry-backend\u0026metric=reliability_rating\" alt=\"Reliability Rating\" /\u003e\n  \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=aicore_plugin-registry-backend\u0026metric=sqale_rating\" alt=\"Maintainability Rating\" /\u003e\n  \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=aicore_plugin-registry-backend\u0026metric=ncloc\" alt=\"Lines of Code\" /\u003e\n  \u003cimg src=\"https://sonarcloud.io/api/project_badges/measure?project=aicore_plugin-registry-backend\u0026metric=sqale_index\" alt=\"Technical debt\" /\u003e\n\u003c/a\u003e\n\n\n# API Documentation\n\n## SEARCH API\n\nThis API supports text-based search queries (see below for detailed params) on plugin registry. Search API can retrieve plugins(Extensions/Themes) by searching titles, keywords or authornames(by default). We can also search on more fields apart from the previously mentioned by passing it as a param. This API can be a functional entry point for all the UI search-box usecases.\n\n### Parameters\n\n* **Required Parameters**\n\n  * **clientID {String}**: A unique identifier required for authenticating clients\n  * **query {String}**: String containing the text to  be searched\n* **Optional Parameters**\n    \n    * **filters {Object} (Default: Empty)**: Object contaning the fields array and sortBy field. See below e.g\n        \n      * **fields {String Array}**: Array containing additional fields to be searched.\n      * **sortyBy {String}**: Constant value(asc/desc) to sort the results by total number of downloads.\n      E.g,\n      \n      ``` const filter = { fields:['metadata.author.name','metadata.author.email'], sortBy:'desc'}``` \n   *  **resultSize {Integer} (Default: 10)** : SearchResults list size.\n   * **skipIndex {Integer} {Default: 0}**: Integer value required for pagination\n\n### Sample Request\n\n``` curl -d '{\"clientID\":\"your_iD\",\"query\":\"Python\"}' -H \"Content-Type: application/json\" http://localhost:3000/search ```\n\n## getPlugins API\n\nThis API can be used to retrieve plugins by assetType(Extension/Theme) (see below for detailed params) on plugin registry. We can also apply certain keywords as filters to refine our search results. This API can be a functional entry point for loading plugins by default in the UI.r all the UI search-box usecases.\n\n### Parameters\n\n* **Required Parameters**\n\n  * **clientID {String}**: A unique identifier required for authenticating clients\n  * **assetType {String}**: accepted values are 'EXTENSION' or 'THEME'\n* **Optional Parameters**\n    \n    * **filters {Object} (Default: Empty)**: Object contaning the fields array and sortBy field. See below e.g\n        \n      * **keywords {String Array}**: Array containing additional keywords to match.\n      * **sortyBy {String}**: Constant value(asc/desc) to sort the results by total number of downloads.\n      E.g,\n      \n      ``` const filter = { keywords:['HTML','HTML5'], sortBy:'desc'}``` \n   *  **resultSize {Integer} (Default: 10)** : SearchResults list size.\n   * **skipIndex {Integer} {Default: 0}**: Integer value required for pagination\n\n# Commands available\n\n## Building\nSince this is a pure JS template project, build command just runs test with coverage.\n```shell\n\u003e npm install   // do this only once.\n\u003e npm run build\n```\n\n## Linting\nTo lint the files in the project, run the following command:\n```shell\n\u003e npm run lint\n```\nTo Automatically fix lint errors:\n```shell\n\u003e npm run lint:fix\n```\n\n## Testing\nTo run all tests:\n```shell\n\u003e npm run test\n  Hello world Tests\n    ✔ should return Hello World\n    #indexOf()\n      ✔ should return -1 when the value is not present\n```\n\nAdditionally, to run unit/integration tests only, use the commands:\n```shell\n\u003e npm run test:unit\n\u003e npm run test:integ\n```\n\n## Coverage Reports\nTo run all tests with coverage:\n\n```shell\n\u003e npm run cover\n  Hello world Tests\n    ✔ should return Hello World\n    #indexOf()\n      ✔ should return -1 when the value is not present\n\n\n  2 passing (6ms)\n\n----------|---------|----------|---------|---------|-------------------\nFile      | % Stmts | % Branch | % Funcs | % Lines | Uncovered Line #s \n----------|---------|----------|---------|---------|-------------------\nAll files |     100 |      100 |     100 |     100 |                   \n index.js |     100 |      100 |     100 |     100 |                   \n----------|---------|----------|---------|---------|-------------------\n\n=============================== Coverage summary ===============================\nStatements   : 100% ( 5/5 )\nBranches     : 100% ( 2/2 )\nFunctions    : 100% ( 1/1 )\nLines        : 100% ( 5/5 )\n================================================================================\nDetailed unit test coverage report: file:///template-nodejs/coverage-unit/index.html\nDetailed integration test coverage report: file:///template-nodejs/coverage-integration/index.html\n```\nAfter running coverage, detailed reports can be found in the coverage folder listed in the output of coverage command.\nOpen the file in browser to view detailed reports.\n\nTo run unit/integration tests only with coverage\n```shell\n\u003e npm run cover:unit\n\u003e npm run cover:integ\n```\n\nSample coverage report:\n![image](https://user-images.githubusercontent.com/5336369/148687351-6d6c12a2-a232-433d-ab62-2cf5d39c96bd.png)\n\n### Unit and Integration coverage configs\nUnit and integration test coverage settings can be updated by configs `.nycrc.unit.json` and `.nycrc.integration.json`.\n\nSee https://github.com/istanbuljs/nyc for config options.\n\n# Publishing packages to NPM\nTo publish a package to npm, push contents to `npm` branch in \nthis repository. \n\n## Publishing `@aicore/package*`\nIf you are looking to publish to package owned by core.ai, you will need access to the GitHub Organization secret `NPM_TOKEN`.\n\nFor repos managed by [aicore](https://github.com/aicore) org in GitHub, Please contact your Admin to get access to core.ai's NPM tokens.\n\n\n## Publishing to your own npm account\nAlternatively, if you want to publish the package to your own npm account, please follow these docs:\n1. Create an automation access token by following this [link](https://docs.npmjs.com/creating-and-viewing-access-tokens).\n2. Add NPM_TOKEN to your repository secret by following this [link](https://docs.npmjs.com/using-private-packages-in-a-ci-cd-workflow)\n\nTo edit the publishing workflow, please see file: `.github/workflows/npm-publish.yml`\n\n\n# Dependency updates\n  We use Rennovate for dependency updates: https://blog.logrocket.com/renovate-dependency-updates-on-steroids/\n  * By default, dep updates happen on sunday every week.\n  * The status of dependency updates can be viewed here if you have this repo permissions in github: https://app.renovatebot.com/dashboard#github/aicore/template-nodejs\n  * To edit rennovate options, edit the rennovate.json file in root, see https://docs.renovatebot.com/configuration-options/\n  Refer \n  \n# Code Guardian\nSeveral automated workflows that check code integrity are integrated into this template.\nThese include:\n1. GitHub actions that runs build/test/coverage flows when a contributor raises a pull request\n2. [Sonar cloud](https://sonarcloud.io/) integration using `.sonarcloud.properties`\n   1. In sonar cloud, enable Automatic analysis from `Administration\n      Analysis Method` for the first time ![image](https://user-images.githubusercontent.com/5336369/148695840-65585d04-5e59-450b-8794-54ca3c62b9fe.png)\n\n## IDE setup\nSonarLint is currently available as a free plugin for jetbrains, eclipse, vscode and visual studio IDEs.\nUse sonarLint plugin for webstorm or any of the available\nIDEs from this link before raising a pull request: https://www.sonarlint.org/ .\n\nSonarLint static code analysis checker is not yet available as a Brackets\nextension.\n\n## Internals\n### Testing framework: Mocha , assertion style: chai\n See https://mochajs.org/#getting-started on how to write tests\n Use chai for BDD style assertions (expect, should etc..). See move here: https://www.chaijs.com/guide/styles/#expect\n\n### Mocks and spies: sinon\n if you want to mock/spy on fn() for unit tests, use sinon. refer docs: https://sinonjs.org/\n\n### Note on coverage suite used here:\nwe use c8 for coverage https://github.com/bcoe/c8. Its reporting is based on nyc, so detailed docs can be found\n here: https://github.com/istanbuljs/nyc ; We didn't use nyc as it do not yet have ES module support\n see: https://github.com/digitalbazaar/bedrock-test/issues/16 . c8 is drop replacement for nyc coverage reporting tool\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faicore%2Fplugin-registry-backend","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Faicore%2Fplugin-registry-backend","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Faicore%2Fplugin-registry-backend/lists"}