fragment-ts 1.0.30 โ 1.0.32
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/API.md +752 -0
- package/DOCS.md +555 -0
- package/README.md +76 -339
- package/USAGE.md +309 -1306
- package/dist/cli/commands/init.command.js +1 -1
- package/dist/core/container/di-container.d.ts.map +1 -1
- package/dist/core/container/di-container.js +62 -106
- package/dist/core/container/di-container.js.map +1 -1
- package/dist/core/decorators/exception-filter.decorator.d.ts +5 -0
- package/dist/core/decorators/exception-filter.decorator.d.ts.map +1 -0
- package/dist/core/decorators/exception-filter.decorator.js +23 -0
- package/dist/core/decorators/exception-filter.decorator.js.map +1 -0
- package/dist/core/decorators/guard.decorator.d.ts +5 -0
- package/dist/core/decorators/guard.decorator.d.ts.map +1 -0
- package/dist/core/decorators/guard.decorator.js +23 -0
- package/dist/core/decorators/guard.decorator.js.map +1 -0
- package/dist/core/decorators/injection.decorators.d.ts.map +1 -1
- package/dist/core/decorators/injection.decorators.js +5 -0
- package/dist/core/decorators/injection.decorators.js.map +1 -1
- package/dist/core/decorators/interceptor.decorator.d.ts +5 -0
- package/dist/core/decorators/interceptor.decorator.d.ts.map +1 -0
- package/dist/core/decorators/interceptor.decorator.js +23 -0
- package/dist/core/decorators/interceptor.decorator.js.map +1 -0
- package/dist/core/decorators/middleware.decorator.d.ts +8 -0
- package/dist/core/decorators/middleware.decorator.d.ts.map +1 -0
- package/dist/core/decorators/middleware.decorator.js +28 -0
- package/dist/core/decorators/middleware.decorator.js.map +1 -0
- package/dist/core/metadata/metadata-keys.d.ts +1 -0
- package/dist/core/metadata/metadata-keys.d.ts.map +1 -1
- package/dist/core/metadata/metadata-keys.js +1 -0
- package/dist/core/metadata/metadata-keys.js.map +1 -1
- package/dist/core/metadata/metadata-storage.d.ts +20 -4
- package/dist/core/metadata/metadata-storage.d.ts.map +1 -1
- package/dist/core/metadata/metadata-storage.js +94 -14
- package/dist/core/metadata/metadata-storage.js.map +1 -1
- package/dist/web/application.d.ts.map +1 -1
- package/dist/web/application.js +79 -10
- package/dist/web/application.js.map +1 -1
- package/dist/web/interfaces.d.ts +5 -1
- package/dist/web/interfaces.d.ts.map +1 -1
- package/package.json +1 -1
- package/src/cli/commands/init.command.ts +1 -1
- package/src/core/container/di-container.ts +95 -177
- package/src/core/decorators/exception-filter.decorator.ts +20 -0
- package/src/core/decorators/guard.decorator.ts +20 -0
- package/src/core/decorators/injection.decorators.ts +5 -0
- package/src/core/decorators/interceptor.decorator.ts +20 -0
- package/src/core/decorators/middleware.decorator.ts +25 -0
- package/src/core/metadata/metadata-keys.ts +1 -0
- package/src/core/metadata/metadata-storage.ts +128 -24
- package/src/web/application.ts +207 -53
- package/src/web/interfaces.ts +11 -2
package/README.md
CHANGED
|
@@ -1,418 +1,155 @@
|
|
|
1
|
-
|
|
1
|
+
# Fragment TS - A Modern TypeScript Framework
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
[](https://www.npmjs.com/package/fragment-ts)
|
|
4
|
+
[](LICENSE)
|
|
5
|
+
[](http://www.typescriptlang.org/)
|
|
5
6
|
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
## Installation
|
|
9
|
-
|
|
10
|
-
```bash
|
|
11
|
-
npm install -g fragment-ts
|
|
12
|
-
```
|
|
13
|
-
````
|
|
14
|
-
|
|
15
|
-
## Quick Start
|
|
16
|
-
|
|
17
|
-
```bash
|
|
18
|
-
# Create a new project (in current directory)
|
|
19
|
-
fragment init .
|
|
20
|
-
|
|
21
|
-
# Or create a new directory
|
|
22
|
-
fragment init my-app
|
|
23
|
-
cd my-app
|
|
24
|
-
|
|
25
|
-
# Start development server with hot reload
|
|
26
|
-
fragment serve
|
|
27
|
-
|
|
28
|
-
# Build for production
|
|
29
|
-
fragment build
|
|
30
|
-
|
|
31
|
-
# Start production server
|
|
32
|
-
npm start
|
|
33
|
-
```
|
|
7
|
+
Fragment TS is a lightweight, dependency injection-based framework for building scalable TypeScript applications with minimal configuration. Inspired by Spring and NestJS, it provides a clean architecture with powerful decorators for controllers, services, repositories, and more.
|
|
34
8
|
|
|
35
9
|
## Features
|
|
36
10
|
|
|
37
|
-
-
|
|
38
|
-
-
|
|
39
|
-
-
|
|
40
|
-
-
|
|
41
|
-
-
|
|
42
|
-
-
|
|
43
|
-
-
|
|
44
|
-
- ๐ฆ **All-in-One Package** - No complex setup required
|
|
45
|
-
- ๐ **Hot Reload** - Automatic server restart on file changes
|
|
46
|
-
- ๐จ **Code Generation** - CLI tools for rapid development
|
|
47
|
-
|
|
48
|
-
## CLI Commands
|
|
49
|
-
|
|
50
|
-
### Project Management
|
|
51
|
-
|
|
52
|
-
```bash
|
|
53
|
-
fragment init [dir] # Initialize new project (use . for current directory)
|
|
54
|
-
fragment init . --features=auth # Initialize with specific features
|
|
55
|
-
fragment serve # Start development server with hot reload
|
|
56
|
-
fragment serve --port=4000 # Start on custom port
|
|
57
|
-
fragment build # Build for production
|
|
58
|
-
```
|
|
59
|
-
|
|
60
|
-
### Code Generation
|
|
61
|
-
|
|
62
|
-
```bash
|
|
63
|
-
fragment generate controller <name> # Generate controller
|
|
64
|
-
fragment generate service <name> # Generate service with optional repository
|
|
65
|
-
fragment generate entity <name> # Generate TypeORM entity
|
|
66
|
-
fragment generate resource <name> # Generate complete CRUD resource
|
|
67
|
-
fragment generate dto <name> # Generate Data Transfer Object
|
|
68
|
-
fragment generate repository <name> # Generate repository
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
**Examples:**
|
|
72
|
-
|
|
73
|
-
```bash
|
|
74
|
-
fragment generate resource product # Creates controller, service, entity, DTO, repository
|
|
75
|
-
fragment g controller users # Shorthand: g = generate
|
|
76
|
-
```
|
|
11
|
+
- ๐ **Dependency Injection**: Automatic wiring of components with `@Autowired` and other decorators
|
|
12
|
+
- ๐ฎ **REST Controllers**: Define routes with familiar decorators like `@Get()`, `@Post()`
|
|
13
|
+
- ๐พ **TypeORM Integration**: Seamless repository pattern with `@InjectRepository`
|
|
14
|
+
- โ๏ธ **Modular Architecture**: Organize code into services, controllers, and repositories
|
|
15
|
+
- ๐ง **Auto-configuration**: Smart component scanning and registration
|
|
16
|
+
- ๐งช **Testable Design**: Easily mock dependencies for unit testing
|
|
17
|
+
- ๐ฆ **Production Ready**: Works with compiled JavaScript and TypeScript source
|
|
77
18
|
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
```bash
|
|
81
|
-
fragment migrate # Run all pending migrations
|
|
82
|
-
fragment migrate:create <name> # Create a new migration
|
|
83
|
-
fragment migrate:run # Run migrations
|
|
84
|
-
fragment migrate:revert # Revert last migration
|
|
85
|
-
fragment migrate:refresh # Drop all and re-run migrations
|
|
86
|
-
fragment migrate:status # Show migration status
|
|
87
|
-
fragment schema:sync # Sync database schema (dev only)
|
|
88
|
-
fragment schema:drop # Drop all database tables
|
|
89
|
-
fragment seed # Run database seeds
|
|
90
|
-
fragment seed:create <name> # Create a new seed file
|
|
91
|
-
```
|
|
92
|
-
|
|
93
|
-
### Diagnostics & Debugging
|
|
19
|
+
## Installation
|
|
94
20
|
|
|
95
21
|
```bash
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
fragment beans # List all registered beans
|
|
100
|
-
fragment beans --tree # Show beans as tree structure
|
|
101
|
-
fragment info # Show application information
|
|
102
|
-
fragment config # Show current configuration
|
|
103
|
-
fragment version # Show Fragment version
|
|
22
|
+
npm install fragment-ts reflect-metadata typeorm mysql2
|
|
23
|
+
# or
|
|
24
|
+
yarn add fragment-ts reflect-metadata typeorm mysql2
|
|
104
25
|
```
|
|
105
26
|
|
|
106
|
-
##
|
|
107
|
-
|
|
108
|
-
```
|
|
109
|
-
my-app/
|
|
110
|
-
โโโ src/
|
|
111
|
-
โ โโโ controllers/ # HTTP controllers
|
|
112
|
-
โ โโโ services/ # Business logic
|
|
113
|
-
โ โโโ repositories/ # Data access layer
|
|
114
|
-
โ โโโ entities/ # TypeORM entities
|
|
115
|
-
โ โโโ dto/ # Data transfer objects
|
|
116
|
-
โ โโโ middlewares/ # Express middlewares
|
|
117
|
-
โ โโโ config/ # Configuration files
|
|
118
|
-
โ โโโ main.ts # Application entry point
|
|
119
|
-
โโโ dist/ # Compiled JavaScript (after build)
|
|
120
|
-
โโโ test/ # Test files
|
|
121
|
-
โโโ fragment.json # Fragment configuration
|
|
122
|
-
โโโ tsconfig.json # TypeScript configuration
|
|
123
|
-
โโโ package.json
|
|
124
|
-
```
|
|
125
|
-
|
|
126
|
-
## Basic Example
|
|
27
|
+
## Quick Start
|
|
127
28
|
|
|
128
|
-
###
|
|
29
|
+
### 1. Create your application entry point:
|
|
129
30
|
|
|
130
31
|
```typescript
|
|
131
|
-
// src/
|
|
32
|
+
// src/app.ts
|
|
132
33
|
import 'reflect-metadata';
|
|
133
|
-
import { FragmentApplication,
|
|
34
|
+
import { FragmentApplication, DIContainer } from 'fragment-ts';
|
|
134
35
|
|
|
135
36
|
@FragmentApplication({
|
|
136
37
|
port: 3000,
|
|
137
38
|
autoScan: true
|
|
138
39
|
})
|
|
139
|
-
class Application {
|
|
40
|
+
export class Application {
|
|
41
|
+
constructor() {
|
|
42
|
+
console.log('Application starting...');
|
|
43
|
+
}
|
|
44
|
+
}
|
|
140
45
|
|
|
141
46
|
async function bootstrap() {
|
|
142
47
|
const app = new FragmentWebApplication();
|
|
143
48
|
await app.bootstrap(Application);
|
|
144
49
|
}
|
|
145
50
|
|
|
146
|
-
bootstrap();
|
|
51
|
+
bootstrap().catch(console.error);
|
|
147
52
|
```
|
|
148
53
|
|
|
149
|
-
###
|
|
54
|
+
### 2. Create a controller:
|
|
150
55
|
|
|
151
56
|
```typescript
|
|
152
|
-
// src/controllers/
|
|
153
|
-
import { Controller, Get,
|
|
154
|
-
import { UserService } from
|
|
57
|
+
// src/controllers/user.controller.ts
|
|
58
|
+
import { Controller, Get, Autowired } from 'fragment-ts';
|
|
59
|
+
import { UserService } from '../services/user.service';
|
|
155
60
|
|
|
156
|
-
@Controller(
|
|
61
|
+
@Controller('/users')
|
|
157
62
|
export class UserController {
|
|
158
|
-
|
|
63
|
+
@Autowired()
|
|
64
|
+
private userService!: UserService;
|
|
159
65
|
|
|
160
66
|
@Get()
|
|
161
67
|
async findAll() {
|
|
162
68
|
return this.userService.findAll();
|
|
163
69
|
}
|
|
164
|
-
|
|
165
|
-
@Get("/:id")
|
|
166
|
-
async findOne(@Param("id") id: string) {
|
|
167
|
-
return this.userService.findOne(id);
|
|
168
|
-
}
|
|
169
|
-
|
|
170
|
-
@Post()
|
|
171
|
-
async create(@Body() body: any) {
|
|
172
|
-
return this.userService.create(body);
|
|
173
|
-
}
|
|
174
|
-
|
|
175
|
-
@Put("/:id")
|
|
176
|
-
async update(@Param("id") id: string, @Body() body: any) {
|
|
177
|
-
return this.userService.update(id, body);
|
|
178
|
-
}
|
|
179
|
-
|
|
180
|
-
@Delete("/:id")
|
|
181
|
-
async delete(@Param("id") id: string) {
|
|
182
|
-
return this.userService.delete(id);
|
|
183
|
-
}
|
|
184
70
|
}
|
|
185
71
|
```
|
|
186
72
|
|
|
187
|
-
###
|
|
73
|
+
### 3. Create a service:
|
|
188
74
|
|
|
189
75
|
```typescript
|
|
190
76
|
// src/services/user.service.ts
|
|
191
|
-
import { Service } from
|
|
192
|
-
import { UserRepository } from
|
|
77
|
+
import { Service, Autowired } from 'fragment-ts';
|
|
78
|
+
import { UserRepository } from '../repositories/user.repository';
|
|
193
79
|
|
|
194
80
|
@Service()
|
|
195
81
|
export class UserService {
|
|
196
|
-
|
|
197
|
-
|
|
82
|
+
@Autowired()
|
|
83
|
+
private userRepository!: UserRepository;
|
|
84
|
+
|
|
198
85
|
async findAll() {
|
|
199
86
|
return this.userRepository.findAll();
|
|
200
87
|
}
|
|
201
|
-
|
|
202
|
-
async findOne(id: string) {
|
|
203
|
-
return this.userRepository.findById(parseInt(id));
|
|
204
|
-
}
|
|
205
|
-
|
|
206
|
-
async create(data: any) {
|
|
207
|
-
return this.userRepository.create(data);
|
|
208
|
-
}
|
|
209
|
-
|
|
210
|
-
async update(id: string, data: any) {
|
|
211
|
-
return this.userRepository.update(parseInt(id), data);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
async delete(id: string) {
|
|
215
|
-
return this.userRepository.delete(parseInt(id));
|
|
216
|
-
}
|
|
217
88
|
}
|
|
218
89
|
```
|
|
219
90
|
|
|
220
|
-
|
|
91
|
+
### 4. Create a repository:
|
|
221
92
|
|
|
222
93
|
```typescript
|
|
223
|
-
|
|
224
|
-
import {
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
});
|
|
236
|
-
return { token };
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
@Post("/register")
|
|
240
|
-
async register(@Body() body: any) {
|
|
241
|
-
const hashedPassword = await AuthModule.hashPassword(body.password);
|
|
242
|
-
// Save user...
|
|
243
|
-
return { message: "User registered successfully" };
|
|
94
|
+
// src/repositories/user.repository.ts
|
|
95
|
+
import { Repository, InjectRepository } from 'fragment-ts';
|
|
96
|
+
import { User } from '../entities/user.entity';
|
|
97
|
+
import { Repository as TypeOrmRepository } from 'typeorm';
|
|
98
|
+
|
|
99
|
+
@Repository()
|
|
100
|
+
export class UserRepository {
|
|
101
|
+
@InjectRepository(User)
|
|
102
|
+
private repo!: TypeOrmRepository<User>;
|
|
103
|
+
|
|
104
|
+
async findAll() {
|
|
105
|
+
return this.repo.find();
|
|
244
106
|
}
|
|
245
107
|
}
|
|
246
108
|
```
|
|
247
109
|
|
|
248
|
-
|
|
110
|
+
### 5. Configure TypeORM:
|
|
249
111
|
|
|
250
112
|
```typescript
|
|
251
|
-
|
|
252
|
-
import { AIModule } from "fragment-ts";
|
|
253
|
-
|
|
254
|
-
@Service()
|
|
255
|
-
export class ChatService {
|
|
256
|
-
private aiModule: AIModule;
|
|
257
|
-
|
|
258
|
-
constructor() {
|
|
259
|
-
this.aiModule = new AIModule({
|
|
260
|
-
openaiKey: process.env.OPENAI_API_KEY,
|
|
261
|
-
});
|
|
262
|
-
}
|
|
263
|
-
|
|
264
|
-
async chat(message: string) {
|
|
265
|
-
return this.aiModule.complete([
|
|
266
|
-
{ role: "system", content: "You are a helpful assistant." },
|
|
267
|
-
{ role: "user", content: message },
|
|
268
|
-
]);
|
|
269
|
-
}
|
|
270
|
-
}
|
|
271
|
-
```
|
|
272
|
-
|
|
273
|
-
## Configuration
|
|
274
|
-
|
|
275
|
-
### fragment.json
|
|
276
|
-
|
|
277
|
-
```json
|
|
113
|
+
// fragment.json
|
|
278
114
|
{
|
|
279
|
-
"
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
"
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
"username": "${DB_USERNAME}",
|
|
288
|
-
"password": "${DB_PASSWORD}",
|
|
289
|
-
"database": "${DB_NAME}",
|
|
290
|
-
"synchronize": false,
|
|
291
|
-
"logging": false,
|
|
292
|
-
"entities": ["dist/**/*.entity.js"],
|
|
293
|
-
"migrations": ["dist/migrations/**/*.js"]
|
|
294
|
-
}
|
|
115
|
+
"type": "mysql",
|
|
116
|
+
"host": "localhost",
|
|
117
|
+
"port": 3306,
|
|
118
|
+
"username": "root",
|
|
119
|
+
"password": "password",
|
|
120
|
+
"database": "my_db",
|
|
121
|
+
"entities": ["dist/entities/**/*.js"],
|
|
122
|
+
"synchronize": true
|
|
295
123
|
}
|
|
296
|
-
|
|
297
|
-
```
|
|
298
|
-
|
|
299
|
-
### Environment Variables
|
|
300
|
-
|
|
301
|
-
```env
|
|
302
|
-
NODE_ENV=development
|
|
303
|
-
PORT=3000
|
|
304
|
-
JWT_SECRET=${JWT_SECRET}
|
|
305
|
-
DATABASE_URL=postgresql://${DB_USERNAME}:${DB_PASSWORD}@${DB_HOST}:${DB_PORT}/${DB_NAME}
|
|
306
|
-
DB_HOST=localhost
|
|
307
|
-
DB_PORT=5432
|
|
308
|
-
DB_USERNAME=postgres
|
|
309
|
-
DB_PASSWORD=password
|
|
310
|
-
DB_NAME=myapp
|
|
311
|
-
OPENAI_API_KEY=${OPENAI_API_KEY}
|
|
312
124
|
```
|
|
313
125
|
|
|
314
|
-
##
|
|
126
|
+
## Running the Application
|
|
315
127
|
|
|
316
128
|
```bash
|
|
317
|
-
#
|
|
318
|
-
|
|
319
|
-
cd my-api
|
|
129
|
+
# Development (TypeScript)
|
|
130
|
+
npx ts-node src/app.ts
|
|
320
131
|
|
|
321
|
-
#
|
|
322
|
-
fragment generate resource user
|
|
323
|
-
fragment generate resource product
|
|
324
|
-
|
|
325
|
-
# 3. Create and run migrations
|
|
326
|
-
fragment migrate:create InitialSchema
|
|
327
|
-
fragment migrate:run
|
|
328
|
-
|
|
329
|
-
# 4. Start development server
|
|
330
|
-
fragment serve
|
|
331
|
-
|
|
332
|
-
# 5. List routes to verify
|
|
333
|
-
fragment routes
|
|
334
|
-
|
|
335
|
-
# 6. Build for production
|
|
336
|
-
fragment build
|
|
337
|
-
|
|
338
|
-
# 7. Start production server
|
|
132
|
+
# Production (compiled JavaScript)
|
|
339
133
|
npm start
|
|
340
134
|
```
|
|
341
135
|
|
|
342
|
-
##
|
|
343
|
-
|
|
344
|
-
```typescript
|
|
345
|
-
// test/user.spec.ts
|
|
346
|
-
import { describe, it, expect } from "fragment-ts";
|
|
347
|
-
|
|
348
|
-
describe("UserService", () => {
|
|
349
|
-
it("should create a user", async () => {
|
|
350
|
-
const user = await userService.create({
|
|
351
|
-
email: "test@example.com",
|
|
352
|
-
name: "Test User",
|
|
353
|
-
});
|
|
354
|
-
|
|
355
|
-
expect(user.email).toBe("test@example.com");
|
|
356
|
-
});
|
|
357
|
-
});
|
|
358
|
-
```
|
|
359
|
-
|
|
360
|
-
```bash
|
|
361
|
-
# Run tests
|
|
362
|
-
fragment test
|
|
363
|
-
```
|
|
364
|
-
|
|
365
|
-
## Production Deployment
|
|
136
|
+
## Configuration
|
|
366
137
|
|
|
367
|
-
|
|
138
|
+
Fragment automatically detects whether you're running in development (TypeScript) or production (compiled JavaScript) mode:
|
|
368
139
|
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
WORKDIR /app
|
|
372
|
-
COPY package*.json ./
|
|
373
|
-
RUN npm ci --only=production
|
|
374
|
-
COPY . .
|
|
375
|
-
RUN npm run build
|
|
376
|
-
EXPOSE 3000
|
|
377
|
-
CMD ["npm", "start"]
|
|
378
|
-
```
|
|
140
|
+
- **Development Mode**: Scans `src/` directory for `.ts` files
|
|
141
|
+
- **Production Mode**: Scans `dist/` directory for `.js` files
|
|
379
142
|
|
|
143
|
+
You can explicitly set the mode with the environment variable:
|
|
380
144
|
```bash
|
|
381
|
-
|
|
382
|
-
docker run -p 3000:3000 my-app
|
|
145
|
+
FRAGMENT_DEV_MODE=true node dist/app.js
|
|
383
146
|
```
|
|
384
147
|
|
|
385
|
-
##
|
|
386
|
-
|
|
387
|
-
Check out the [examples](./examples) directory for complete working applications:
|
|
388
|
-
|
|
389
|
-
- REST API
|
|
390
|
-
- Authentication System
|
|
391
|
-
- AI Chat Application
|
|
392
|
-
- E-commerce Backend
|
|
393
|
-
|
|
394
|
-
## Documentation
|
|
395
|
-
|
|
396
|
-
For comprehensive guides and API reference, visit:
|
|
397
|
-
|
|
398
|
-
- **Full Documentation**: [https://fragment.digitwhale.com](https://fragment.digitwhale.com)
|
|
399
|
-
- **Use Cases & Examples**: [USECASES.md](./USECASES.md)
|
|
400
|
-
- **API Reference**: [https://fragment.digitwhale.com/api](https://fragment.digitwhale.com/api)
|
|
401
|
-
|
|
402
|
-
## Community
|
|
148
|
+
## Support
|
|
403
149
|
|
|
404
|
-
|
|
405
|
-
- **Discord**: [https://discord.gg/fragment](https://discord.gg/fragment)
|
|
406
|
-
- **Twitter**: [@FragmentJS](https://twitter.com/FragmentJS)
|
|
407
|
-
|
|
408
|
-
## Contributing
|
|
409
|
-
|
|
410
|
-
We welcome contributions! See [CONTRIBUTING.md](./CONTRIBUTING.md) for guidelines.
|
|
150
|
+
For issues and feature requests, please [open an issue](https://github.com/yourusername/fragment-ts/issues).
|
|
411
151
|
|
|
412
152
|
## License
|
|
413
153
|
|
|
414
|
-
MIT ยฉ
|
|
415
|
-
|
|
416
|
-
```
|
|
417
|
-
|
|
418
|
-
```
|
|
154
|
+
MIT ยฉ [Your Name]
|
|
155
|
+
```
|