{"id":24563792,"url":"https://github.com/mildronize/nammatham-talk-demo","last_synced_at":"2025-03-17T00:25:08.240Z","repository":{"id":229935078,"uuid":"618659276","full_name":"mildronize/nammatham-talk-demo","owner":"mildronize","description":"Nammatham Demo Talks, Azure Open source Day","archived":false,"fork":false,"pushed_at":"2023-03-25T06:58:30.000Z","size":102,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-01-23T10:15:42.831Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"http://nammatham.com/","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/mildronize.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}},"created_at":"2023-03-25T01:12:58.000Z","updated_at":"2023-03-25T02:00:58.000Z","dependencies_parsed_at":"2024-03-27T02:43:31.530Z","dependency_job_id":"ba4db340-4959-44ff-8c1d-26be72e2bdc4","html_url":"https://github.com/mildronize/nammatham-talk-demo","commit_stats":null,"previous_names":["mildronize/nammatham-talk-demo"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mildronize%2Fnammatham-talk-demo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mildronize%2Fnammatham-talk-demo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mildronize%2Fnammatham-talk-demo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mildronize%2Fnammatham-talk-demo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mildronize","download_url":"https://codeload.github.com/mildronize/nammatham-talk-demo/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":243951833,"owners_count":20373803,"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":"2025-01-23T10:15:47.958Z","updated_at":"2025-03-17T00:25:08.209Z","avatar_url":"https://github.com/mildronize.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"http://thadaw.com/\" target=\"blank\"\u003e\u003cimg src=\"https://i.ibb.co/QmTh7x4/Nammatham-Logo-v2.png\" width=\"120\" alt=\"Nammatham Logo\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\nAzure Function Lightweight frameworks with DI, providing type safe function triggers and bindings\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\u003ca href=\"https://github.com/mildronize/nammatham/actions/workflows/test.yml\"\u003e\u003cimg src=\"https://github.com/mildronize/nammatham/actions/workflows/test.yml/badge.svg\" alt=\"Build \u0026amp; Test\"\u003e\u003c/a\u003e \u003ca href=\"https://codecov.io/gh/mildronize/nammatham\"\u003e\u003cimg src=\"https://codecov.io/gh/mildronize/nammatham/branch/main/graph/badge.svg?token=Y7ZMDKFPAN\" alt=\"codecov\"\u003e\u003c/a\u003e \u003ca href=\"https://www.npmjs.com/package/nammatham\"\u003e\u003cimg src=\"https://img.shields.io/npm/v/nammatham\" alt=\"npm version\"\u003e\u003c/a\u003e \u003ca href=\"https://www.npmjs.com/package/nammatham\"\u003e\u003cimg src=\"https://img.shields.io/npm/dt/nammatham\" alt=\"npm download\"\u003e\u003c/a\u003e\u003c/p\u003e\n\n\n## Description\nNammatham (นามธรรม in Thai, pronounced `/naam ma tham/`, means **abstract** in Thai) is Azure Function Nodejs Lightweight framework with Dependency Injection. Provide type safety wrapping `function.json`\n\n\n## Compatibility with Azure Functions\n- [Azure Function NodeJs](https://github.com/Azure/azure-functions-nodejs-worker/) : v3.x (`@azure/functions`)\n- [Runtime Version](https://docs.microsoft.com/azure/azure-functions/functions-versions): 4 ([Source Code](https://github.dev/Azure/azure-functions-host/tree/release/4.x))\n- Node.js Versions: 16, 18\n\n\n## Introduction\n\n**Nammatham** is a framework that allows you to use Azure Functions with TypeScript and decorators. It provides pre-defined JSON binding objects and utility functions, such as `httpTrigger`, to make it easier to create Azure Functions.\n\nExample:\n\n```ts\nimport { AuthorizationLevel, BaseFunction, functionName, httpTrigger } from \"nammatham\";\nimport { HttpRequest } from \"@azure/functions\";\n\n@functionName(\"GetUsers\", httpTrigger(AuthorizationLevel.Anonymous, [\"get\"]))\nexport class UserFunction extends BaseFunction {\n\n  public override execute(req: HttpRequest): void {\n    const name = req.query.name;  \n    this.res.send(`hello get user with ${name}`);\n  }\n}\n```\n\n## Features\n- Simple Framework, support all functionality with Azure Functions features\n- Provide type utiltiy wrapping around `function.json`\n- Better project orgnization\n- Bindings \u0026 Triggers Built-in type support\n  - Http\n  - Timer\n  - Cosmos DB, support both [v2](https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-cosmosdb-v2-trigger?tabs=in-process%2Cfunctionsv2\u0026pivots=programming-language-javascript#configuration) and [v4](https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-cosmosdb-v2-trigger?tabs=in-process%2Cextensionv4\u0026pivots=programming-language-javascript#configuration).\n  - Blob\n  - Service Bus\n  - If your binding type isn't in the list, please use [custom type](docs/define-azure-function.md#custom-binding)\n  - You can see [All available type support](docs/binding-type.md) or create a PR ;).\n- Support TypeScript and [InversifyJS](https://github.com/inversify/Inversify) as the [Most Popular Inversion of Control Container and Dependency Injection Approach](https://npmtrends.com/awilix-vs-bottlejs-vs-inversify-vs-node-dependency-injection-vs-tsyringe-vs-typedi-vs-typescript-ioc) \n- Build Tool Agnostic, this framework just provide the library. It can work with all TypeScript build tool e.g. tsc, esbuild, etc.\n\n## Installation\nYou can install nammatham using npm:\n\n```\nnpm install nammatham inversify reflect-metadata --save\n```\n\nFor the [InversifyJS](https://github.com/inversify/InversifyJS#-installation), please refer the documentation for usage.\n\n## Starter Project\n\n- [Basic Nammtham Starter Template](https://github.com/mildronize/nammatham-starter)\n\n## Getting Started\n\nFull examples please, go to [examples](examples) directory\n\n### 1. Basic\n\nThis is basic to use partially type support, you can follow steps below:\n\n1. define `startup.ts` (or any name)\n    ```ts\n    // File: src/startup.ts\n    import 'reflect-metadata';\n    import { NammathamApp } from 'nammatham';\n    import { SampleHttpFunction } from './functions/sample-http.function';\n\n    const builder = NammathamApp.createBuilder(__filename);\n    builder.addFunctions(SampleHttpFunction);\n    builder.build();\n\n    export default builder.getApp();\n    ```\n   \n2. Write a function handler, extend with `BaseFunction` we will auto inject Azure Function's Context\n    ```ts\n    // src/functions/sample-http.function.ts\n    import { AuthorizationLevel, BaseFunction, functionName, httpTrigger } from 'nammatham';\n    import { HttpRequest } from '@azure/functions';\n\n    @functionName('SampleHttp', httpTrigger(AuthorizationLevel.Anonymous, ['get']))\n    export class SampleHttpFunction extends BaseFunction {\n      public override execute(req: HttpRequest): void {\n        const name = req.query.name;\n        const message = `hello get user with ${name}`;\n        this.context.log(message);\n        this.res.send(message);\n      }\n    }\n    ```\n3. Add Azure Functions files at root\n    - `host.json`\n    - `local.settings.json`\n4. Run `ts-node` to generate all Azure Functions \n    ```ts\n    export nammatham_env=build; ts-node src/startup.ts \u0026\u0026 tsc\n    ```\n5. Start Azure Functions\n    ```\n    func start\n    ```\n\n### 2. Handle `function.json` config by yourself\n\nThis method will support full support type when bindings config is set, for example below:\n\nyou can define your own `function.json` in Typescript object (as you can see the variable `bindings`), this will binding type into `this.context.bindings`.\n\n```ts\nimport { BaseFunction, binding, functionName } from 'nammatham';\n\nconst bindings = [\n  binding.httpTrigger({ name: 'req' as const }), // make string to literal type\n  binding.http({ name: 'res' as const }), // make string to literal type\n] as const;\n\n@functionName('GetUser', ...bindings)\nexport class UserFunction extends BaseFunction\u003ctypeof bindings\u003e {\n\n  public override execute() {\n    const { req } = this.context.bindings;\n    //       ^---- `req` will be type HttpRequest\n    const name = req.query.name;\n    this.context.res = {\n      body: `hello get user with ${name}}`,\n    };\n  }\n}\n```\n\n### 3. Add Services\n\n\n```ts\n// src/startup.ts\nimport 'reflect-metadata';\nimport { NammathamApp } from 'nammatham';\nimport { UserService } from './services/user.services';\nimport { UserFunction } from './functions/user.function';\n\nconst builder = NammathamApp.createBuilder(__filename);\nbuilder.addFunctions(UserFunction);\nbuilder.configureServices(services =\u003e {\n  services.addSingleton(Service);\n  // services.addScoped(Service);\n  // services.addTransient(Service);\n});\nbuilder.build();\n\nexport default builder.getApp();\n```\n\ndefine a function handler\n\n```ts\nimport { AuthorizationLevel, BaseFunction, functionName, httpTrigger } from 'nammatham';\nimport { HttpRequest } from '@azure/functions';\nimport { UserService } from '../services/user.service';\nimport { inject } from 'inversify';\n\n@functionName('GetUsers', httpTrigger(AuthorizationLevel.Anonymous, ['get']))\nexport class UserFunction extends BaseFunction {\n\n  constructor(@inject(UserService) private userService: UserService){\n    super();\n  }\n  \n  public getUsers(): void {\n    const { req } = this.context.bindings;\n    const name = req.query.name;\n    const message = `hello get user with ${name}, service data: ${this.userService.getData()}`;\n    this.context.log(message);\n    this.res.send(message);\n  }\n}\n```\n\nservice:\n\n```ts\nimport { injectable } from 'inversify';\n\n@injectable()\nexport class UserService {\n  constructor() {}\n\n  public getData() {\n    return `Hey I'm service`;\n  }\n}\n```\n\n## Using Inversify API for Binding Services\n\nIn some cases, if you want to binding services with [Inversify Container](https://github.com/inversify/InversifyJS/blob/master/wiki/container_api.md) by yourself.\nIn the startup file, you can simply get the Container from `builder.container` as shown in the example below:\n\n```ts\n// src/startup.ts\nimport 'reflect-metadata';\nimport { NammathamApp } from 'nammatham';\nimport { UserService } from './services/user.services';\nimport { UserFunction } from './functions/user.function';\n\nconst builder = NammathamApp.createBuilder(__filename);\nbuilder.addFunctions(UserFunction);\n// Using Inversify Container API\nbuilder.container.bind(Service).toSelf();\n\nbuilder.build();\n\nexport default builder.getApp();\n```\n\n## Documentation\n\nPlease read the [full documentation in the repo](docs)\n\n## Inspiration \n- [Azure Functions .NET](https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-cli-csharp?tabs=azure-cli%2Cin-process)\n- [inversify-express-utils](https://github.com/inversify/inversify-express-utils) - We use inversify as a Dependency Injection Tool.\n- [Nestjs](https://nestjs.com/)\n- [typestack/routing-controllers](https://github.com/typestack/routing-controllers)\n- [azure-middleware](https://github.com/emanuelcasco/azure-middleware) - Azure Functions Middleware Libray\n\n## Author\n- Thada Wangthammang, Software Engineer, Thailand","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmildronize%2Fnammatham-talk-demo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmildronize%2Fnammatham-talk-demo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmildronize%2Fnammatham-talk-demo/lists"}