{"id":25280271,"url":"https://github.com/nattatorn-dev/moduly","last_synced_at":"2026-04-09T10:37:33.498Z","repository":{"id":57300831,"uuid":"102104694","full_name":"nattatorn-dev/moduly","owner":"nattatorn-dev","description":"Generate sample module with [name] with just one command.","archived":false,"fork":false,"pushed_at":"2017-09-04T07:57:09.000Z","size":4222,"stargazers_count":4,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-05T17:06:18.826Z","etag":null,"topics":["cli","creator","module","react","react-redux"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/nattatorn-dev.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2017-09-01T11:03:07.000Z","updated_at":"2019-12-03T07:19:26.000Z","dependencies_parsed_at":"2022-09-15T19:52:34.180Z","dependency_job_id":null,"html_url":"https://github.com/nattatorn-dev/moduly","commit_stats":null,"previous_names":[],"tags_count":12,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nattatorn-dev%2Fmoduly","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nattatorn-dev%2Fmoduly/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nattatorn-dev%2Fmoduly/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/nattatorn-dev%2Fmoduly/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/nattatorn-dev","download_url":"https://codeload.github.com/nattatorn-dev/moduly/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":238528539,"owners_count":19487459,"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":["cli","creator","module","react","react-redux"],"created_at":"2025-02-12T18:38:59.013Z","updated_at":"2025-10-27T17:30:57.183Z","avatar_url":"https://github.com/nattatorn-dev.png","language":"JavaScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Moduly\nGenerate sample module with [name] with just one command.\n\n```bash\n$ npm install -g moduly\n$ moduly\n```\n\n## Feature\n🦆 [Scaling your Redux App with ducks](https://medium.freecodecamp.org/scaling-your-redux-app-with-ducks-6115955638be)\n\nGenerate a list of files within a directory (duck, feature first) \n\n```bash\n[modulename]\n    ├── actions.js\n    ├── index.js\n    ├── normalize.js\n    ├── reducer.js\n    ├── sagas.js (saga option)\n    ├── selectors.js\n    ├── types.js\n```\n\nwith redux-saga (sagas.js)\n```js\nimport { call, take, put, fork } from 'redux-saga/effects'\n  \nimport { bills } from './actions'\nimport { BILLS_REQUEST } from './types'\nimport normalize from './normalize'\n\nconst fetchApi = () =\u003e {\n  return new Promise( resolve =\u003e {\n    fetch( 'http://some-api-link/' ).then( res =\u003e\n      resolve( res.json() )\n    )\n  } )\n}\n\nfunction* fetchBills() {\n  while ( yield take( BILLS_REQUEST ) ) {\n    try {\n      const response = yield call( fetchApi )\n      const normalized = normalize( response )\n      yield put( bills.success( normalized ) )\n    } catch ( e ) {\n      yield put( bills.failure( e ) )\n    }\n  }\n}\n\nexport default [ fork( fetchBills ) ]\n```\n\nwith redux-thunk (actions.js)\n```js\nconst fetchBills = () =\u003e {\n  return dispatch =\u003e {\n    dispatch( bills.request() )\n    return fetch( 'http://some-api-link/' )\n      .then( res =\u003e ( res.ok ? res.json() : dispatch( bills.failure() ) ) )\n      .then( res =\u003e normalize( res ) )\n      .then( normalized =\u003e dispatch( bills.success( normalized ) ) )\n  }\n}\n```\n\n## Screenshot\n![Screenshot](https://thumbs.gfycat.com/CorruptFlickeringGentoopenguin-size_restricted.gif)\n\n### TODO\n- [x] redux-saga\n- [x] redux-thunk\n- [ ] redux-api-middleware \n- [ ] reselect\n- [ ] immutable\n- [ ] normalize","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnattatorn-dev%2Fmoduly","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fnattatorn-dev%2Fmoduly","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fnattatorn-dev%2Fmoduly/lists"}