Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release to main move to alpha version (internal testing) #90

Merged
merged 134 commits into from
Dec 30, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
134 commits
Select commit Hold shift + click to select a range
ce6d542
init nammatham v2 start from nammatham v0.4.0
mildronize Mar 3, 2023
c284faa
add example for azure/functions v4
mildronize Mar 3, 2023
f6fac3d
feat: mock api and decorator
mildronize Mar 4, 2023
e989053
remove: unused for azure/function v4
mildronize Mar 4, 2023
7cbe924
remove: unused code
mildronize Mar 5, 2023
a0d5a92
rename all decorator starting with lowercase following decorator stan…
mildronize Mar 7, 2023
30a5ab0
feat: attach controller & function name at method
mildronize Mar 12, 2023
7f45e83
feat: add params decorator & handler
mildronize Mar 12, 2023
a9ed9e7
feat: httpTrigger decoractor support option
mildronize Mar 12, 2023
78bc052
refactor: attachController split DI related
mildronize Mar 12, 2023
4fa4456
refactor: controller boostrap metadata
mildronize Mar 12, 2023
5010ee8
feat: add register az func
mildronize Mar 12, 2023
b946f39
refactor: controller factory to extract DI related from controller
mildronize Mar 12, 2023
900ac59
feat: poc decorator will register azure function triggers
mildronize Mar 12, 2023
b1e6b31
rename: nammatham-invsersify to invsersify
mildronize Mar 12, 2023
24c6bed
refactor: swap package core & inversify
mildronize Mar 12, 2023
431a772
refactor: move controller from core into inversify
mildronize Mar 12, 2023
cfe999a
refactor: boostrap core should not container any DI
mildronize Mar 12, 2023
6b6bf4b
feat: nammathamApp support multiple DI tools
mildronize Mar 12, 2023
61949b2
utils: clean code
mildronize Mar 12, 2023
348ed35
clean: clean code
mildronize Mar 12, 2023
9369419
example: add no dependecy injection example
mildronize Mar 12, 2023
facb364
feat: map params & alias types
mildronize Mar 13, 2023
f3ff45e
feat: add http response helper wrapping around httpResponse from azur…
mildronize Mar 13, 2023
4322098
refactor: Response class
mildronize Mar 13, 2023
a1e8794
feat: add decorator `res` and disable logger decorator
mildronize Mar 13, 2023
56a7c4f
refactor: code to support service using by inversify
mildronize Mar 14, 2023
029f4b6
refactor: method response body, jsonBody,
mildronize Mar 14, 2023
b9c42cd
init: Tsyringe extenstion
mildronize Mar 18, 2023
4d44ccf
misc: upgrade typescript to 5.0
mildronize Mar 18, 2023
ade8470
fix: temp fix inject param type
mildronize Mar 18, 2023
70fea3a
refactor: NewableFunction into Construtor type
mildronize Mar 18, 2023
0375214
misc: add lint package.json
mildronize Mar 18, 2023
d7e4417
Merge branch 'poc-func-v4' into poc-func-v4.tsyringe
mildronize Mar 18, 2023
104be3a
fix: pnpm lock
mildronize Mar 18, 2023
d499c2a
Add Tsyringe Extension for Nammatham (#81)
mildronize Mar 18, 2023
0454dc2
misc: add eslint
mildronize Mar 18, 2023
64cf5e4
refactor: example
mildronize Mar 18, 2023
a7f6000
[example] restructure example project
mildronize Mar 18, 2023
9b2c94a
refactor: Using Pascal Case in all decorators
mildronize Mar 18, 2023
3c88319
misc: remove unsued code
mildronize Mar 18, 2023
952e9c1
feat: add container in top level of FunctionApp
mildronize Mar 19, 2023
7520481
upgrade azure/func to `4.0.0-alpha.12`
mildronize Sep 18, 2023
312d623
poc type-safe api wrapper over azure function
mildronize Sep 18, 2023
ee853ca
poc api
mildronize Sep 19, 2023
a4d66d8
Poc original az func v4
mildronize Sep 20, 2023
a8c3455
poc typesafe api design
mildronize Sep 20, 2023
be91faf
poc interface
mildronize Sep 25, 2023
a8d9dc4
poc: refactor handler function type
mildronize Sep 25, 2023
9156dae
poc generic type passing
mildronize Sep 25, 2023
f0e482e
poc interface v2
mildronize Sep 25, 2023
4036f93
poc interface v3
mildronize Sep 25, 2023
2332c72
refactor
mildronize Sep 25, 2023
77334cf
implement concrete for az func
mildronize Sep 25, 2023
76efef1
test with azure/func
mildronize Sep 25, 2023
1dcd1e8
reuse helper function official lib
mildronize Sep 25, 2023
d540ada
refactor for support type safe
mildronize Sep 26, 2023
b6527d1
feat: support type for output setter params
mildronize Sep 26, 2023
9234dd6
refactor to support multiple type of input * output binding
mildronize Sep 26, 2023
b2f8a09
poc: support type safe helper function
mildronize Sep 26, 2023
d219dcc
fix: fallback type when unsupport binding input & output
mildronize Sep 26, 2023
6082111
remove decorator-based related code
mildronize Sep 26, 2023
5fa0085
move from example into package core
mildronize Oct 13, 2023
c6e67bb
refactor: libs into multiple files
mildronize Oct 13, 2023
8dd271a
update readme
mildronize Oct 13, 2023
96bffe2
Initial Proof of concept functional type safe for Azure Functions nod…
mildronize Oct 13, 2023
4ddcdc9
Merge branch 'v1.x' into next
mildronize Oct 13, 2023
4a771ad
Start next version development (#84)
mildronize Oct 13, 2023
72f851b
update project status
mildronize Oct 13, 2023
e15b8be
update project status
mildronize Oct 13, 2023
1c6e021
update project status again
mildronize Oct 13, 2023
2e73302
clear v1 related info
mildronize Oct 13, 2023
36827fc
misc: add example for basic trigger http get
mildronize Oct 14, 2023
f55637e
feat: make handler to be a function
mildronize Dec 23, 2023
112d412
misc: clean branch
mildronize Dec 24, 2023
f49e83e
Merge branch 'next.issues-86' into next.v2-experiment.clean
mildronize Dec 24, 2023
7979612
fix: package.json for dev build
mildronize Dec 24, 2023
0d3058e
fix: tsconfig.json
mildronize Dec 24, 2023
9714fac
feat: remove `inputs` and `outputs` related (aka. `extraInputs` and `…
mildronize Dec 24, 2023
0147d7c
feat: add nammatham app
mildronize Dec 24, 2023
d17a99d
feat: add signature for add function for nammatham app
mildronize Dec 24, 2023
bd9972c
feat: support dev server
mildronize Dec 24, 2023
fa56566
feat: extract azureFunctions out of core nammathamApp
mildronize Dec 24, 2023
ee47573
refactor: nammatham core into runtime/azure-functions
mildronize Dec 24, 2023
fb1a253
refactor: make azure functions runtime be nested on adapters
mildronize Dec 24, 2023
054abab
refactor: make nammatham core to be runtime
mildronize Dec 24, 2023
180c9a1
refactor: make dev-server into server
mildronize Dec 24, 2023
c689dcc
feat: add devServer
mildronize Dec 24, 2023
656a68a
refactor: some runtime related for azure-functions move to azure-func…
mildronize Dec 24, 2023
1e79d68
refactor: remove azureFunctions related from NammathamApp
mildronize Dec 24, 2023
dae12d9
feat: support multiple runtime adapter
mildronize Dec 24, 2023
bdb81c2
refactor: runtime base related files into `bases` submodule
mildronize Dec 24, 2023
b04365b
misc: no need bindings yet
mildronize Dec 24, 2023
014a55f
feat: add signature of devServer middleware
mildronize Dec 24, 2023
3b94f43
feat: add signature and simple implement of express middleware
mildronize Dec 25, 2023
e86266d
feat: Each `NammathamEndpoint` should extends `NammathamEndpointBase`…
mildronize Dec 25, 2023
3180ddf
feat: use NammathamApp's functions to register in express middleware
mildronize Dec 25, 2023
e56b9af
feat: add `handlerResolver` in NammathamApp
mildronize Dec 25, 2023
44c8970
feat: call invokeHandler from resolveHandler
mildronize Dec 25, 2023
5641b7f
clean up code
mildronize Dec 25, 2023
3139bae
refactor: resolve handler
mildronize Dec 25, 2023
82f82ac
refactor: endpointOption in NammathamEndpoint
mildronize Dec 25, 2023
4987e50
feat: support async/await handler
mildronize Dec 25, 2023
bafc755
feat: create Azure Functions' HttpRequest from Express Request
mildronize Dec 25, 2023
4d9c79c
feat: add all http trigger helper function
mildronize Dec 26, 2023
ebbce81
misc: format
mildronize Dec 26, 2023
d1765aa
feat: add resolveRegisterHandler for nammathamApp
mildronize Dec 26, 2023
d7aebd6
feat: add start nammatham to register the runtime register
mildronize Dec 26, 2023
6f282ac
feat: add log when function is executed (dev server)
mildronize Dec 26, 2023
81c7605
fix: support both promise and non-promise handler on Azure functions
mildronize Dec 26, 2023
f175f93
feat: add pino logger
mildronize Dec 26, 2023
f2634c0
feat: dev server handler error and return 500
mildronize Dec 26, 2023
56d1528
fix: allow method & fix http method calling
mildronize Dec 26, 2023
7944dd2
feat: show all registered functions
mildronize Dec 26, 2023
0aa1dc2
feat: improve logger dx
mildronize Dec 26, 2023
88d06fd
feat: AzureFunction DevServer handle HttpResponse from AzureFunctions…
mildronize Dec 29, 2023
aa76713
refactor: devServer to expressServer
mildronize Dec 30, 2023
9c9c4e2
example: add minimal version examples
mildronize Dec 30, 2023
2061d24
feat: handle dev env manually for expressServer
mildronize Dec 30, 2023
0c55c94
doc: update doc
mildronize Dec 30, 2023
2e37bfa
refactor: the entire project for publish as packages
mildronize Dec 30, 2023
0e48ac5
feat: remove dependencies azure functions of core packages
mildronize Dec 30, 2023
c462cd8
refactor: subdir in core package into each package, i.e. core, azure …
mildronize Dec 30, 2023
220ef74
misc: remove non-used packages
mildronize Dec 30, 2023
4e0dc8c
feat: add release helper scripts for monorepo
mildronize Dec 30, 2023
6a2d9af
feat: make release script bump version in packages
mildronize Dec 30, 2023
03e81bb
feat: release script replaces new version packages in all dependencies
mildronize Dec 30, 2023
392718b
Bump version v2.0.0-alpha.1
mildronize Dec 30, 2023
a1b7764
fix: release order
mildronize Dec 30, 2023
b0756f7
misc: update readme all packages
mildronize Dec 30, 2023
b0af0bd
Bump version v2.0.0-alpha.2
mildronize Dec 30, 2023
c68152d
fix: release scripts
mildronize Dec 30, 2023
f0c8fe6
Bump version v2.0.0-alpha.3
mildronize Dec 30, 2023
15280f0
feat: add preinstall script for local dev
mildronize Dec 30, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .eslintignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
.eslintrc.js
24 changes: 24 additions & 0 deletions .eslintrc.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
module.exports = {
parser: '@typescript-eslint/parser',
plugins: ['@typescript-eslint'],
// https://stackoverflow.com/questions/58510287/parseroptions-project-has-been-set-for-typescript-eslint-parser
overrides: [
{
files: ['*.ts', '*.tsx'], // Your TypeScript files extension

// As mentioned in the comments, you should extend TypeScript plugins here,
// instead of extending them outside the `overrides`.
// If you don't want to extend any rules, you don't need an `extends` attribute.
extends: [
'plugin:@typescript-eslint/recommended',
// 'plugin:@typescript-eslint/recommended-requiring-type-checking',
// 'plugin:@typescript-eslint/strict',
],

parserOptions: {
project: ['./tsconfig.json'], // Specify it only for TypeScript files
},
},
],
root: true,
};
5 changes: 4 additions & 1 deletion .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -131,4 +131,7 @@ dist
inversify-express-utils

.idea
.DS_Store
.DS_Store

.azurite
tmp
262 changes: 58 additions & 204 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,22 @@
</p>

<p align="center">
Azure Function Lightweight frameworks with DI, providing type safe function triggers and bindings
Type-safe Azure Function Library
</p>

<p align="center"><a href="https://github.com/mildronize/nammatham/actions/workflows/test.yml"><img src="https://github.com/mildronize/nammatham/actions/workflows/test.yml/badge.svg" alt="Build &amp; Test"></a> <a href="https://codecov.io/gh/mildronize/nammatham"><img src="https://codecov.io/gh/mildronize/nammatham/branch/main/graph/badge.svg?token=Y7ZMDKFPAN" alt="codecov"></a> <a href="https://www.npmjs.com/package/nammatham"><img src="https://img.shields.io/npm/v/nammatham" alt="npm version"></a> <a href="https://www.npmjs.com/package/nammatham"><img src="https://img.shields.io/npm/dt/nammatham" alt="npm download"></a></p>
<p align="center"><a href="https://www.npmjs.com/package/nammatham"><img src="https://img.shields.io/npm/v/nammatham" alt="npm version"></a> <a href="https://www.npmjs.com/package/nammatham"><img src="https://img.shields.io/npm/dt/nammatham" alt="npm download"></a></p>


> **Nammatham** v1 is stable now (I've currently used in production), due to Nammatham v1 is based on Azure Functions Node.js v3.5.x. Azure will release Azure Functions Node.js v4 in GA (General availability) soon, [See in Roadmap 2023](https://github.com/Azure/azure-functions-nodejs-library/wiki/Roadmap)
>
> **Nammatham** v2 is [currently in development](https://github.com/thaitype/nammatham/issues/77), it will based on Azure Functions Node.js v4. [Tracking issue Nammatham supported with v4](https://github.com/thaitype/nammatham/issues?q=is%3Aissue+is%3Aopen+label%3Afunc-v4)
> Due to Azure Functions Node.js v4 Release GA General availability, **Nammatham** v1 is now maintainance mode.

| Version | Status | Azure Functions Node.js | Branch | Build Status |
| ------- | -------------- | ----------------------- | ------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| v1.x | Maintenance | v3.x | [v1.x][v1.x] | [![Build & Test](https://github.com/thaitype/nammatham/actions/workflows/test.yml/badge.svg)](https://github.com/thaitype/nammatham/actions/workflows/test.yml) [![codecov](https://codecov.io/gh/mildronize/nammatham/branch/main/graph/badge.svg?token=Y7ZMDKFPAN)](https://codecov.io/gh/mildronize/nammatham) |
| v2.x | In Development | v4.x | [next][next] | [Tracking v2 Roadmap](https://github.com/thaitype/nammatham/issues?q=is%3Aissue+is%3Aopen+label%3Afunc-v4) |

[v1.x]: https://github.com/thaitype/nammatham/tree/v1.x
[next]: https://github.com/thaitype/nammatham/tree/next


## Description
Nammatham (นามธรรม 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`
Expand All @@ -22,225 +29,72 @@ Empowering TypeScript on Azure Functions with Nammatham, Azure Open Source Day @
[![](docs/imgs/azure-open-source-day-2023.png)](https://www.youtube.com/watch?v=n6B4-5Lt2h0) (Thai speech, subtitle will added later)
- Slides: https://docs.google.com/presentation/d/1WUIXaUxXaiixZ2bgGCfx-f4Gdrmjl4RfbwKaEfAC6t4/edit?usp=sharing

## Compatibility with Azure Functions
- [Azure Function NodeJs](https://github.com/Azure/azure-functions-nodejs-worker/) : v3.x (`@azure/functions`)
- [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))
- Node.js Versions: 16, 18


## Introduction

**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.

Example:

```ts
import { AuthorizationLevel, BaseFunction, functionName, httpTrigger } from "nammatham";
import { HttpRequest } from "@azure/functions";

@functionName("GetUsers", httpTrigger(AuthorizationLevel.Anonymous, ["get"]))
export class UserFunction extends BaseFunction {

public override execute(req: HttpRequest): void {
const name = req.query.name;
this.res.send(`hello get user with ${name}`);
}
## Minimal Get Started

For dev server, using express.js

```typescript
import { AzureFunctionsAdapter } from "@nammatham/azure-functions";
import { initNammatham } from "@nammatham/core";
import { expressServer } from "@nammatham/express";

const n = initNammatham.create(new AzureFunctionsAdapter());
const func = n.func;
const app = n.app;

const helloFunction = func
.httpGet('hello', {
route: 'hello-world',
})
.handler(async (request, ctx) => {
ctx.context.log('HTTP trigger function processed a request.');
ctx.context.debug(`Http function processed request for url "${request.url}"`);
const name = request.query.get('name') || (await request.text()) || 'world';
return { body: `Hello, ${name}!` };
});

app.addFunctions(helloFunction);
if (process.env.NODE_ENV === 'development') {
app.use(expressServer());
}
app.start();
```

## Features
- Simple Framework, support all functionality with Azure Functions features
- Provide type utiltiy wrapping around `function.json`
- Better project orgnization
- Bindings & Triggers Built-in type support
- Http
- Timer
- Cosmos DB, support both [v2](https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-cosmosdb-v2-trigger?tabs=in-process%2Cfunctionsv2&pivots=programming-language-javascript#configuration) and [v4](https://learn.microsoft.com/en-us/azure/azure-functions/functions-bindings-cosmosdb-v2-trigger?tabs=in-process%2Cextensionv4&pivots=programming-language-javascript#configuration).
- Blob
- Service Bus
- If your binding type isn't in the list, please use [custom type](docs/define-azure-function.md#custom-binding)
- You can see [All available type support](docs/binding-type.md) or create a PR ;).
- 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)
- Build Tool Agnostic, this framework just provide the library. It can work with all TypeScript build tool e.g. tsc, esbuild, etc.

## Installation
You can install nammatham using npm:

```
npm install nammatham inversify reflect-metadata --save
```
Then edit `package.json` like this;

For the [InversifyJS](https://github.com/inversify/InversifyJS#-installation), please refer the documentation for usage.

## Starter Project

- [Basic Nammtham Starter Template](https://github.com/mildronize/nammatham-starter)

## Getting Started

Full examples please, go to [examples](examples) directory

### 1. Basic

This is basic to use partially type support, you can follow steps below:

1. define `startup.ts` (or any name)
```ts
// File: src/startup.ts
import 'reflect-metadata';
import { NammathamApp } from 'nammatham';
import { SampleHttpFunction } from './functions/sample-http.function';

const builder = NammathamApp.createBuilder(__filename);
builder.addFunctions(SampleHttpFunction);
builder.build();

export default builder.getApp();
```

2. Write a function handler, extend with `BaseFunction` we will auto inject Azure Function's Context
```ts
// src/functions/sample-http.function.ts
import { AuthorizationLevel, BaseFunction, functionName, httpTrigger } from 'nammatham';
import { HttpRequest } from '@azure/functions';

@functionName('SampleHttp', httpTrigger(AuthorizationLevel.Anonymous, ['get']))
export class SampleHttpFunction extends BaseFunction {
public override execute(req: HttpRequest): void {
const name = req.query.name;
const message = `hello get user with ${name}`;
this.context.log(message);
this.res.send(message);
}
}
```
3. Add Azure Functions files at root
- `host.json`
- `local.settings.json`
4. Run `ts-node` to generate all Azure Functions
```ts
export nammatham_env=build; ts-node src/startup.ts && tsc
```
5. Start Azure Functions
```
func start
```

### 2. Handle `function.json` config by yourself

This method will support full support type when bindings config is set, for example below:

you can define your own `function.json` in Typescript object (as you can see the variable `bindings`), this will binding type into `this.context.bindings`.

```ts
import { BaseFunction, binding, functionName } from 'nammatham';

const bindings = [
binding.httpTrigger({ name: 'req' as const }), // make string to literal type
binding.http({ name: 'res' as const }), // make string to literal type
] as const;

@functionName('GetUser', ...bindings)
export class UserFunction extends BaseFunction<typeof bindings> {

public override execute() {
const { req } = this.context.bindings;
// ^---- `req` will be type HttpRequest
const name = req.query.name;
this.context.res = {
body: `hello get user with ${name}}`,
};
```json
{
"main": "dist/src/main.js",
"scripts": {
"dev": "cross-env NODE_ENV=development tsx watch src/main.ts"
}
}
```

### 3. Add Services


```ts
// src/startup.ts
import 'reflect-metadata';
import { NammathamApp } from 'nammatham';
import { UserService } from './services/user.services';
import { UserFunction } from './functions/user.function';
Run

const builder = NammathamApp.createBuilder(__filename);
builder.addFunctions(UserFunction);
builder.configureServices(services => {
services.addSingleton(Service);
// services.addScoped(Service);
// services.addTransient(Service);
});
builder.build();

export default builder.getApp();
```

define a function handler

```ts
import { AuthorizationLevel, BaseFunction, functionName, httpTrigger } from 'nammatham';
import { HttpRequest } from '@azure/functions';
import { UserService } from '../services/user.service';
import { inject } from 'inversify';

@functionName('GetUsers', httpTrigger(AuthorizationLevel.Anonymous, ['get']))
export class UserFunction extends BaseFunction {

constructor(@inject(UserService) private userService: UserService){
super();
}

public getUsers(): void {
const { req } = this.context.bindings;
const name = req.query.name;
const message = `hello get user with ${name}, service data: ${this.userService.getData()}`;
this.context.log(message);
this.res.send(message);
}
}
npm run dev
```

service:
The result commandline will show (Dev Server):

```ts
import { injectable } from 'inversify';

@injectable()
export class UserService {
constructor() {}

public getData() {
return `Hey I'm service`;
}
}
```

## Using Inversify API for Binding Services
Start Nammatham, Type-safe Serverless Framework

In some cases, if you want to binding services with [Inversify Container](https://github.com/inversify/InversifyJS/blob/master/wiki/container_api.md) by yourself.
In the startup file, you can simply get the Container from `builder.container` as shown in the example below:
[12:44:14.784] INFO (44575): Using adapter: AzureFunctionsAdapter
[12:44:14.786] INFO (44575): Function "hello" added
[12:44:14.786] INFO (44575): Using middleware: expressServer
[12:44:14.793] INFO (44575): All functions registered
[12:44:14.794] INFO (44575): Dev Server started at http://localhost:3000

```ts
// src/startup.ts
import 'reflect-metadata';
import { NammathamApp } from 'nammatham';
import { UserService } from './services/user.services';
import { UserFunction } from './functions/user.function';
Functions:

const builder = NammathamApp.createBuilder(__filename);
builder.addFunctions(UserFunction);
// Using Inversify Container API
builder.container.bind(Service).toSelf();

builder.build();

export default builder.getApp();
hello: [GET] http://localhost:3000/api/hello-world
```

## Documentation

Please read the [full documentation in the repo](docs)
<!-- ## What's different with Azure Functions v4 (Official Library) -->

## Inspiration
- [Azure Functions .NET](https://learn.microsoft.com/en-us/azure/azure-functions/create-first-function-cli-csharp?tabs=azure-cli%2Cin-process)
Expand Down
13 changes: 0 additions & 13 deletions docs/README.md

This file was deleted.

31 changes: 0 additions & 31 deletions docs/azure-functions/README.md

This file was deleted.

Loading
Loading