{"id":13626588,"url":"https://github.com/lemoncloud-io/lemon-engine","last_synced_at":"2025-12-30T21:29:20.327Z","repository":{"id":98765081,"uuid":"163985976","full_name":"lemoncloud-io/lemon-engine","owner":"lemoncloud-io","description":"lemon-engine: auto async node between DynamoDB + Redis + Elasticsearch","archived":false,"fork":false,"pushed_at":"2019-08-19T10:06:39.000Z","size":743,"stargazers_count":4,"open_issues_count":1,"forks_count":2,"subscribers_count":4,"default_branch":"master","last_synced_at":"2025-02-01T01:41:28.447Z","etag":null,"topics":["aws","dynamodb","elasticsearch","lemon-engine","node","nosql","redis","synchronization"],"latest_commit_sha":null,"homepage":"","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/lemoncloud-io.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"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}},"created_at":"2019-01-03T14:51:48.000Z","updated_at":"2024-01-22T07:25:06.000Z","dependencies_parsed_at":"2023-03-16T01:44:33.286Z","dependency_job_id":null,"html_url":"https://github.com/lemoncloud-io/lemon-engine","commit_stats":{"total_commits":193,"total_committers":3,"mean_commits":64.33333333333333,"dds":0.0984455958549223,"last_synced_commit":"9c595bf0f75d02d38ddb016761a2dd05f3c71a14"},"previous_names":[],"tags_count":2,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lemoncloud-io%2Flemon-engine","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lemoncloud-io%2Flemon-engine/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lemoncloud-io%2Flemon-engine/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lemoncloud-io%2Flemon-engine/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lemoncloud-io","download_url":"https://codeload.github.com/lemoncloud-io/lemon-engine/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238431530,"owners_count":19471405,"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":["aws","dynamodb","elasticsearch","lemon-engine","node","nosql","redis","synchronization"],"created_at":"2024-08-01T21:02:24.430Z","updated_at":"2025-10-27T03:30:59.051Z","avatar_url":"https://github.com/lemoncloud-io.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"[![travis](https://travis-ci.org/lemoncloud-io/lemon-engine.svg?branch=master)](https://travis-ci.org/lemoncloud-io/lemon-engine)\n[![codecov](https://codecov.io/gh/lemoncloud-io/lemon-engine/branch/master/graph/badge.svg)](https://codecov.io/gh/lemoncloud-io/lemon-engine)\n[![npm version](https://badge.fury.io/js/lemon-engine.svg)](https://badge.fury.io/js/lemon-engine)\n[![GitHub version](https://badge.fury.io/gh/lemoncloud-io%2Flemon-engine.svg)](https://badge.fury.io/gh/lemoncloud-io%2Flemon-engine)\n\n\n# lemon-engine\n\nAutomatic Node Synchronizer between `DynamoDB` + `Redis` + `Elasticsearch` over `AWS` Cloud.\n\n- **NOTE** 백엔드 서버에 `lemon-backend-api` 별도 실행 필요!\n\n## Overview\n\n- NoSQL (DynamoDB) \u003c-\u003e ElastiSearch \u003c-\u003e Redis 데이터 동기화\n- DynamoDB 업데이트시 -\u003e 업데이트 Stream 수신 -\u003e 변경 데이터 추적 -\u003e ES 와 동기화.\n\n![engine](docs/lemon-arch.png)\n\n## Usage (사용법)\n\n- install with npm `npm install lemon-engine --save`\n\n- create internal Service with data model\n\n```js\nimport engine from 'lemon-engine';\n\n//! create engine in global scope.\nconst $engine = engine(global, { env: process.env });\n\n// deefine properties.\nconst FIELDS = [\n    'id', 'type', 'parent', 'name', ...\n];\nconst ES_FIELDS = FIELDS;\n\n//! config engines (as example)\nconst $model = $engine.createModel(`${name}`, {\n    ID_TYPE         : '#STRING',        // WARN! '#' means no auto-generated id.\n    ID_NEXT         : 0,                // ID Starts\n    FIELDS          : FIELDS,           // Properties\n    DYNA_TABLE      : 'LemonTable',     // DynamoDB Table\n    REDIS_PKEY      : '#TDQ',           // '#' means no use redis, but elastic as cache.\n    ES_INDEX        : 'lemons-v1',      // ES Index Name\n    ES_TYPE         : 'none',           // ES Type Name (deprecated since ES6)\n    ES_FIELDS       : ES_FIELDS,        // ES Fields List.\n    NS_NAME         : name,             // Notify Service Name. (null means no notifications)\n    ES_MASTER       : 1,                // ES Master NODE.\n    ES_VERSION      : 6,                // ES Target Version (6 means 6.x)\n    CLONEABLE       : true,             // Clonable with parent/cloned property.\n    PARENT_IMUT     : false,            // Immutable of parent property (2018.03.15)\n    ES_TIMESERIES   : false,            // As time-Series data, useful when saving time-series.\n    XECURE_KEY      : 'lemon',          // (optional) Encryption Key (use '*' prefix at property name: ver 0.3.22)\n});\n```\n\n- build CRUD common service functions.\n\n```js\n//! search by param\n// ex) { id: 1234 } =\u003e search by `id == 1234`.\nconst do_search = (id, param) =\u003e {\n    _log(NS, `do_search(${id})... param=`, $U.json(param));\n    return $model.do_search(id, param);\n};\n```\n\n\n## Installation (설치법)\n\n- `lemon-backend-api` 백본 서비스 구성\n- configure environment.\n\n\n## 개발 (Development)\n\n- **TODO** refer to [lemon-hello-api](https://github.com/lemoncloud-io/lemon-hello-api)\n\n\n## Deploy (NPM 모듈 배포)\n\n1. `package.json` 의 `version` 정보를 변경\n1. `$ npm run publish` 실행 (단, npm 로그인 필요!)\n1. [lemon-engine](https://www.npmjs.com/package/lemon-engine) 으로 배포됨.\n\n\n## Contribution\n\nPlz, request PR. See [CODE_OF_CONDUCT](CODE_OF_CONDUCT.md)\n\n\n## LICENSE\n\n[MIT](LICENSE)\n\n\n\n----------------\n# VERSION INFO #\n\n| Version   | Description\n|--         |--\n| 2.2.5     | improve http-request of type+id+cmd.\n| 2.2.4     | optimize log in init engine.\n| 2.2.3     | hot-fix type error of `$U.dt()`.\n| 2.2.2     | relay context as `that._ctx` in `on_record_update()`, and use common `BACKBONE_API` env.\n| 2.2.1     | hot-fix error of `$protocol().do_execute()`.\n| 2.2.0     | support enhanced type definitions.\n| 2.1.8     | support `do_read_deep` for direct reading via dynamodb.\n| 2.1.6     | support method `PATCH` in `web-proxy`. required `backbone#2.1.4`.\n| 2.1.5     | custom web-proxy by `_$.createWebProxy()`.\n| 2.1.4     | support relaying headers in `web-proxy`. required `backbone#2.1.3`.\n| 2.1.0     | refactoring to typescript.\n| 2.0.0     | rename to `lemon-engine`, and set to public.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flemoncloud-io%2Flemon-engine","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flemoncloud-io%2Flemon-engine","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flemoncloud-io%2Flemon-engine/lists"}