{"id":15097553,"url":"https://github.com/artpani4/tuner","last_synced_at":"2026-02-10T03:31:46.320Z","repository":{"id":85523282,"uuid":"594232964","full_name":"artpani4/tuner","owner":"artpani4","description":"Service Configurator for Deno","archived":false,"fork":false,"pushed_at":"2024-11-21T09:51:42.000Z","size":233,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-11-09T22:55:39.583Z","etag":null,"topics":["config","configuration","configuration-files","configuration-management","deno","json","ts","typescript","yml"],"latest_commit_sha":null,"homepage":"https://deno.land/x/tuner","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"lgpl-2.1","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/artpani4.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,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2023-01-27T23:03:17.000Z","updated_at":"2024-11-21T09:51:37.000Z","dependencies_parsed_at":null,"dependency_job_id":"b3ee8e5f-6bc7-420e-b47c-7ada09d40b03","html_url":"https://github.com/artpani4/tuner","commit_stats":null,"previous_names":["artpani4/tuner"],"tags_count":36,"template":false,"template_full_name":null,"purl":"pkg:github/artpani4/tuner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artpani4%2Ftuner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artpani4%2Ftuner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artpani4%2Ftuner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artpani4%2Ftuner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/artpani4","download_url":"https://codeload.github.com/artpani4/tuner/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/artpani4%2Ftuner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29289902,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-10T02:32:08.756Z","status":"ssl_error","status_checked_at":"2026-02-10T02:30:31.937Z","response_time":65,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["config","configuration","configuration-files","configuration-management","deno","json","ts","typescript","yml"],"created_at":"2024-09-25T16:23:31.404Z","updated_at":"2026-02-10T03:31:46.306Z","avatar_url":"https://github.com/artpani4.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tuner\n\n[![deno.land/x/tuner](https://shield.deno.dev/x/tuner)](https://deno.land/x/tuner) [![JSR Score](https://jsr.io/badges/@artpani/tuner/score)](https://jsr.io/@artpani/tuner)\n\nTuner - модуль для управления конфигурациями проекта. Данные конфигурации описываются в виде **.ts** файла с экспортируемым объектом, который содержит перечисление _env_ переменных и полей конфига. Конфиги могут образовывать иерархию, наследуясь от родительских и перезаписываясь дочерними.\n\n---\n\n## Оглавление\n\n- [Tuner](#tuner)\n  - [Оглавление](#оглавление)\n  - [Простейший конфиг](#простейший-конфиг)\n  - [Конфиг с описанием env-переменных](#конфиг-с-описанием-env-переменных)\n  - [Объединение конфигов](#объединение-конфигов)\n  - [Опции при загрузке](#опции-при-загрузке)\n  - [🆕 Использование CLI для генерации конфигураций](#-использование-cli-для-генерации-конфигураций)\n\n## Простейший конфиг\n\nМинимально конфиг может быть описан так:\n\n```tsx\n// ./config/myConfig.tuner.ts\nimport Tuner from 'jsr:@artpani/tuner';\n\nexport default Tuner.tune(\n  {\n    data: {\n      field1: 'value1',\n      field2: 100,\n      field3: true,\n      field4: ['минималистично', 'удобно', 'не правда ли?'],\n    },\n  },\n);\n\nexport default myCfg;\nexport type MyCFGType = typeof myCfg;\n```\n\n\u003e Функция _tune_ заботливо подскажет структуру ожидаемого объекта\n\nЗагрузка конфига и использование происходит так:\n\n```tsx\n// ./main.ts\nimport Tuner from 'jsr:@artpani/tuner';\nimport { MyCFGType } from '../config/myConfig.tuner.ts';\nconst cfg = await Tuner.use.loadConfig\u003cMyCFGType\u003e({\n  configDirPath: 'config',\n});\nconsole.log(cfg.data.field2); // 100\n```\n\n__При запуске обязательно наличие _env_ переменной _CONFIG_, ее значение - название файла конфига до _.tuner.ts,__ в данном примере это myConfig._\n\n```bash\nCONFIG=myConfig deno run --allow-all main.ts\n```\n\n## Конфиг с описанием env-переменных\n\nВ Tuner имеется возможность описать типы переменных окружения и поведения при их отсутствии:\n\n- значение по умолчанию\n- завершение процесса\n- генерация исключения\n- вычисление на лету\n\nНапример, так:\n\n```tsx\n// ./config/myConfig.tuner.ts\nimport Tuner from 'jsr:@artpani/tuner';\nexport default Tuner.tune(\n  {\n    env: {\n      // Использовать Значение по умолчанию\n      env1: Tuner.Env.getString.orDefault('defalut value1'),\n      env2: Tuner.Env.getNumber.orDefault(100),\n      env3: Tuner.Env.getBoolean.orDefault(true),\n      // Проигнорировать отсуствие переменной(будет иметь тип значения + undefined)\n      env4: Tuner.Env.getString.orNothing(),\n      env5: Tuner.Env.getNumber.orNothing(),\n      env6: Tuner.Env.getBoolean.orNothing(),\n      // Завершенить процесс\n      env7: Tuner.Env.getString.orExit(\n        'сообщение об ошибке, необязательно',\n      ),\n      env8: Tuner.Env.getNumber.orExit(\n        'выведет в консоль перед выходом',\n      ),\n      env9: Tuner.Env.getBoolean.orExit(),\n      // Сгенерировать исключение\n      env10: Tuner.Env.getString.orThrow(new Error('ошибка')),\n      env11: Tuner.Env.getNumber.orThrow(new Error()),\n      env12: Tuner.Env.getBoolean.orThrow(new Error()),\n      // Вычисленить данных по переданному колбэку\n      //(может быть асинхронным, если данные нужно получить с диска или удаленно, например)\n      env13: Tuner.Env.getString.orCompute(() =\u003e 'computed value1'),\n      env14: Tuner.Env.getNumber.orAsyncCompute(() =\u003e\n        new Promise(() =\u003e 100)\n      ),\n    },\n    data: {\n      field1: 'value1',\n      field2: 100,\n      field3: true,\n      field4: ['минималистично', 'удобно', 'не правда ли?'],\n    },\n  },\n);\n```\n\n\u003e **Разумеется, можно просто указать значение-примитив, вроде env1: 100**\n\n## Объединение конфигов\n\nTuner позволяет “собрать” конфиг, используя другие конфиги, нужно только выстроить из них цепочку:\n\n- Текущий конфиг дополнится всеми полями родительского, при этом сохранит свои значения\n- Текущий конфиг дополнится всеми полями дочернего, при этом совпадающие поля будут переписаны значениями из дочернего конфига\n- Значения-фукнции, используемые для описания env-переменных также подчиняются этим правилам\n\n![Пример наследования](https://artpani.sirv.com/Images/projects/tuner/cascade.png)\n\n\u003e При этом, например, конфигу В необязательно указывать А в качестве родительского.\n\nРеализация:\n\n```tsx\n// config/develop.tuner.ts\nimport Tuner from 'jsr:@artpani/tuner';\nimport { ACfgType } from './a.tuner.ts';\n\nconst developCfg = Tuner.tune({\n  parent: Tuner.Load.local.configDir\u003cACfgType\u003e('a.tuner.ts'),\n  data: {\n    a: 300,\n    b: 301,\n  },\n});\n\nexport default developCfg;\nexport type DevelopCFGType = typeof developCfg;\n\n// config/base.tuner.ts\nimport Tuner from 'jsr:@artpani/tuner';\n\nconst baseCfg = Tuner.tune({\n  data: {\n    a: 400,\n    b: 401,\n    c: 402,\n  },\n});\n\nexport default baseCfg;\nexport type BaseCFGType = typeof baseCfg;\n\n// config/a.tuner.ts\nimport Tuner from 'jsr:@artpani/tuner';\nimport { BaseCFGType } from './base.tuner.ts';\n\nconst aCfg = Tuner.tune({\n  parent: Tuner.Load.local.configDir\u003cBaseCFGType\u003e('base.tuner.ts'),\n  child: Tuner.Load.local.configDir('b.tuner.ts'),\n  data: {\n    b: 200,\n    e: 201,\n  },\n});\n\nexport default aCfg;\nexport type ACfgType = typeof aCfg;\n\n// config/b.tuner.ts\nimport Tuner from 'jsr:@artpani/tuner';\n\nconst bCfg = Tuner.tune({\n  data: {\n    a: 100,\n    d: 101,\n  },\n});\n\nexport default bCfg;\nexport type BCfgType = typeof bCfg;\n\n// main.ts\nimport { DevelopCFGType } from './config/develop.tuner.ts';\nimport Tuner from 'jsr:@artpani/tuner';\n\nconst config = await Tuner.use.loadConfig\u003cDevelopCFGType\u003e({\n  configDirPath: './config',\n});\n\nconsole.log(config.data);\n// { a: 300, b: 301, c: 402, e: 201, d: 101 }\n```\n\n## Опции при загрузке\n\nПри вызове loadConfig, передайте объект с опциями, чтобы настроить процесс загрузки конфигураций:\n\n- _configDirPath_: Путь к директории, содержащей конфигурационные файлы. **По умолчанию это директория (./config)**. Используйте эту опцию, если конфигурационные файлы находятся в другом месте.\n\n## 🆕 Использование CLI для генерации конфигураций\n\nВы можете использовать CLI для генерации конфигурационных файлов прямо из командной строки. Для этого выполните следующую команду:\n\n```bash\ndeno run --allow-all https://raw.githubusercontent.com/artpani4/tuner/main/cli/mod.ts\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartpani4%2Ftuner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fartpani4%2Ftuner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fartpani4%2Ftuner/lists"}