{"id":22202145,"url":"https://github.com/rumkin/singular","last_synced_at":"2025-03-25T00:59:18.280Z","repository":{"id":25170376,"uuid":"28593435","full_name":"rumkin/singular","owner":"rumkin","description":"Nodejs dependency injection","archived":false,"fork":false,"pushed_at":"2019-10-24T03:54:43.000Z","size":107,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-03-03T18:02:28.540Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/singular","language":"JavaScript","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/rumkin.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":"license","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2014-12-29T13:39:58.000Z","updated_at":"2019-10-24T03:54:45.000Z","dependencies_parsed_at":"2022-08-06T03:16:27.989Z","dependency_job_id":null,"html_url":"https://github.com/rumkin/singular","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rumkin%2Fsingular","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rumkin%2Fsingular/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rumkin%2Fsingular/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rumkin%2Fsingular/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rumkin","download_url":"https://codeload.github.com/rumkin/singular/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":245377988,"owners_count":20605377,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","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-12-02T16:12:33.115Z","updated_at":"2025-03-25T00:59:18.249Z","avatar_url":"https://github.com/rumkin.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"Singular is dependency manager for modular applications. Its' modules are\nCommonJS-alike classes.\n\nSingular can load modules in runtime for example WASM modules or mock any module\nin test environment.\n\n## Installation\n\n* Install from NPM:\n\n  ```shell\n  npm i singular\n  ```\n* Inject using unpkg.com:\n\n  ```html\n  \u003cscript src=\"https://unpkg.com/singular@3/dist/singular.js\"\u003e\u003c/script\u003e\n  \u003cscript src=\"https://unpkg.com/singular@3/dist/singular.min.js\"\u003e\u003c/script\u003e\n  ```\n  \u003e ⚠️ Remember about security! Add [subresource integrity](https://developer.mozilla.org/en-US/docs/Web/Security/Subresource_Integrity) (SRI) checksum\n  \u003e from [checksum.txt](https://unpkg.com/singular@3/dist/checksum.txt).\n\n## Example\n\nSingular is made for simple configuration and initialization:\n\n```javascript\nimport Singular from 'singular'\n\nconst singular = new Singular({\n  modules: {\n    mongo: new MongoModule(),\n    sqlite: new SqliteModule(),\n    user: new UserModule({\n      // User module layout requires mongo `db` which is `mongo` in current app\n      db: 'mongo',\n    }),\n    transactions: new TransactionsModule({\n      // Transactions module layout requires sqlite `db` which is `sqlite`\n      // in current app\n      db: 'sqlite',\n    }),\n  },\n})\n```\n\nUsage and API\n===\n\nInstantiate and configure new singular instance.\n\n```javascript\nimport Singular from 'singular'\n\nconst config = {\n  logger: {\n    level: 'INFO',\n  },\n  mongo: {\n    connect: 'mongodb://...'\n  },\n  sql: {\n    type: 'sqlite',\n    dbPath: './db.sqlite',\n  },\n}\n\nconst singular = new Singular({\n  config,\n})\n```\n\nInject dependencies with `start` method.\n\n```javascript\n// Inject logger and log something\nsingular.start()\n.then(({ mongo, sqlite }) =\u003e {\n\n})\n```\n\n### Module Example\n\nDefine module using ES2019 syntax:\n\n```javascript\nclass GreetingModule extends Singular.Module {\n  static deps = {\n    // Logger is required\n    logger: true,\n  }\n\n  static defaults = {\n    name: 'World'\n  }\n\n  async start(config, scope, exports) {\n    const {logger} = scope\n\n    exports.greet = function(name) {\n      logger.log('Hello, %s!', name || config.name)\n    }\n\n    // Or\n\n    return {\n      greet(name = config.name) {\n        logger.log('Hello, %s!', name)\n      },\n    }\n  }\n\n  async stop(config, scope, exports) {\n    // ... Do something to shutdown module gracefully ...\n    // ℹ️ exports here is an entry created by start() call.\n  }\n}\n```\n\n## License\n\nMIT © [Rumkin](https://rumk.in)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frumkin%2Fsingular","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frumkin%2Fsingular","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frumkin%2Fsingular/lists"}