fragment-ts 1.0.20 ā 1.0.22
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/dist/cli/commands/init.command.d.ts +1 -0
- package/dist/cli/commands/init.command.d.ts.map +1 -1
- package/dist/cli/commands/init.command.js +56 -30
- package/dist/cli/commands/init.command.js.map +1 -1
- package/dist/cli/commands/test.command.d.ts.map +1 -1
- package/dist/cli/commands/test.command.js +42 -75
- package/dist/cli/commands/test.command.js.map +1 -1
- package/examples/blog-api/package-lock.json +190 -6
- package/examples/blog-api/package.json +6 -3
- package/examples/blog-api/src/services/app.service.ts +2 -2
- package/examples/blog-api/src/test/app.spec.ts +23 -0
- package/package.json +1 -1
- package/src/cli/commands/init.command.ts +61 -31
- package/src/cli/commands/test.command.ts +57 -79
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,qBAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;WAe1B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;mBAsF/C,wBAAwB;
|
|
1
|
+
{"version":3,"file":"init.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/init.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAQpC,qBAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;WAe1B,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC;mBAsF/C,wBAAwB;mBA6CxB,iBAAiB;mBA8FjB,gBAAgB;mBA+BhB,yBAAyB;mBAoBzB,sBAAsB;mBAmBtB,qBAAqB;mBA2BrB,iBAAiB;mBA+CjB,mBAAmB;CA8BzC"}
|
|
@@ -81,7 +81,7 @@ class InitCommand {
|
|
|
81
81
|
name: "features",
|
|
82
82
|
message: "Select features:",
|
|
83
83
|
choices: [
|
|
84
|
-
{ name: "Authentication", value: "auth", checked:
|
|
84
|
+
{ name: "Authentication", value: "auth", checked: false },
|
|
85
85
|
{ name: "Database (TypeORM)", value: "database", checked: true },
|
|
86
86
|
{ name: "AI Integration", value: "ai", checked: false },
|
|
87
87
|
{ name: "Testing", value: "testing", checked: true },
|
|
@@ -146,7 +146,7 @@ class InitCommand {
|
|
|
146
146
|
dirs.push("src/seeds");
|
|
147
147
|
}
|
|
148
148
|
if (config.features.includes("testing")) {
|
|
149
|
-
dirs.push("test");
|
|
149
|
+
dirs.push("src/test"); // moved test inside src
|
|
150
150
|
}
|
|
151
151
|
for (const dir of dirs) {
|
|
152
152
|
await fs.ensureDir(path.join(projectPath, dir));
|
|
@@ -160,6 +160,9 @@ class InitCommand {
|
|
|
160
160
|
if (config.features.includes("auth")) {
|
|
161
161
|
await this.generateAuthFiles(projectPath);
|
|
162
162
|
}
|
|
163
|
+
if (config.features.includes("testing")) {
|
|
164
|
+
await this.generateDefaultTest(projectPath);
|
|
165
|
+
}
|
|
163
166
|
}
|
|
164
167
|
static async createConfigFiles(projectPath, projectName, features) {
|
|
165
168
|
const packageJson = {
|
|
@@ -177,7 +180,7 @@ class InitCommand {
|
|
|
177
180
|
"migrate:revert": "fragment migrate:revert",
|
|
178
181
|
},
|
|
179
182
|
dependencies: {
|
|
180
|
-
"fragment-ts": "^1.0.
|
|
183
|
+
"fragment-ts": "^1.0.22",
|
|
181
184
|
"reflect-metadata": "^0.1.13",
|
|
182
185
|
},
|
|
183
186
|
devDependencies: {
|
|
@@ -211,7 +214,6 @@ class InitCommand {
|
|
|
211
214
|
});
|
|
212
215
|
const fragmentConfig = {};
|
|
213
216
|
if (features.includes("database")) {
|
|
214
|
-
// Default SQLite config with env interpolation
|
|
215
217
|
const isProd = process.env.NODE_ENV === "production";
|
|
216
218
|
fragmentConfig.database = {
|
|
217
219
|
type: "sqlite",
|
|
@@ -225,43 +227,39 @@ class InitCommand {
|
|
|
225
227
|
subscribers: [],
|
|
226
228
|
};
|
|
227
229
|
}
|
|
228
|
-
// Write fragment.json
|
|
229
230
|
await fs.writeJSON(path.join(projectPath, "fragment.json"), fragmentConfig, { spaces: 2 });
|
|
230
|
-
// .env file with defaults
|
|
231
231
|
const envContent = `NODE_ENV=development
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
232
|
+
PORT=3000
|
|
233
|
+
JWT_SECRET=${process.env.JWT_SECRET ?? "your-secret-key-change-this"}
|
|
234
|
+
${features.includes("database") ? "DATABASE_FILE=database.sqlite" : ""}
|
|
235
|
+
`;
|
|
236
236
|
await fs.writeFile(path.join(projectPath, ".env"), envContent);
|
|
237
|
-
// .gitignore
|
|
238
237
|
await fs.writeFile(path.join(projectPath, ".gitignore"), "node_modules/\ndist/\n.env\n*.sqlite\n");
|
|
239
238
|
}
|
|
240
|
-
// In the generateMainFile method, update to:
|
|
241
239
|
static async generateMainFile(projectPath, config) {
|
|
242
240
|
const content = `import 'reflect-metadata';
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
241
|
+
import { FragmentApplication } from 'fragment-ts';
|
|
242
|
+
import { FragmentWebApplication } from 'fragment-ts';
|
|
243
|
+
import { AppController } from './controllers/app.controller';
|
|
246
244
|
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
}
|
|
245
|
+
@FragmentApplication({
|
|
246
|
+
port: 3000,
|
|
247
|
+
autoScan: true
|
|
248
|
+
})
|
|
249
|
+
class Application {
|
|
250
|
+
constructor() {
|
|
251
|
+
console.log('Fragment application initialized');
|
|
255
252
|
}
|
|
253
|
+
}
|
|
256
254
|
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
255
|
+
async function bootstrap() {
|
|
256
|
+
console.log('Starting Fragment application...');
|
|
257
|
+
const app = new FragmentWebApplication();
|
|
258
|
+
await app.bootstrap(Application);
|
|
259
|
+
}
|
|
262
260
|
|
|
263
|
-
|
|
264
|
-
|
|
261
|
+
bootstrap().catch(console.error);
|
|
262
|
+
`;
|
|
265
263
|
await fs.writeFile(path.join(projectPath, "src", "main.ts"), content);
|
|
266
264
|
}
|
|
267
265
|
static async generateExampleController(projectPath) {
|
|
@@ -347,6 +345,34 @@ export class AuthService {
|
|
|
347
345
|
await fs.writeFile(path.join(projectPath, "src", "controllers", "auth.controller.ts"), controllerContent);
|
|
348
346
|
await fs.writeFile(path.join(projectPath, "src", "services", "auth.service.ts"), serviceContent);
|
|
349
347
|
}
|
|
348
|
+
static async generateDefaultTest(projectPath) {
|
|
349
|
+
const testContent = `import { AppService } from '../services/app.service';
|
|
350
|
+
import { DIContainer } from 'fragment-ts';
|
|
351
|
+
|
|
352
|
+
describe('AppService', () => {
|
|
353
|
+
let service: AppService;
|
|
354
|
+
let container: DIContainer;
|
|
355
|
+
|
|
356
|
+
beforeEach(() => {
|
|
357
|
+
container = DIContainer.getInstance();
|
|
358
|
+
container.reset();
|
|
359
|
+
service = container.resolve(AppService);
|
|
360
|
+
});
|
|
361
|
+
|
|
362
|
+
it('should return welcome message', () => {
|
|
363
|
+
const message = service.getMessage();
|
|
364
|
+
|
|
365
|
+
expect(message).toBe('Welcome to Fragment Framework!');
|
|
366
|
+
expect(message).toBeTruthy();
|
|
367
|
+
expect(message).toContain('Fragment');
|
|
368
|
+
// expect(message).toHaveLength(28);
|
|
369
|
+
});
|
|
370
|
+
});
|
|
371
|
+
`;
|
|
372
|
+
const testDir = path.join(projectPath, "src", "test");
|
|
373
|
+
await fs.ensureDir(testDir);
|
|
374
|
+
await fs.writeFile(path.join(testDir, "app.spec.ts"), testContent);
|
|
375
|
+
}
|
|
350
376
|
}
|
|
351
377
|
exports.InitCommand = InitCommand;
|
|
352
378
|
//# sourceMappingURL=init.command.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../../src/cli/commands/init.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,6CAA+B;AAC/B,2CAA6B;AAC7B,wDAAgC;AAChC,8CAAsB;AACtB,kDAA0B;AAC1B,iDAAyC;AAEzC,MAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC9B,OAAO;aACJ,OAAO,CAAC,kBAAkB,CAAC;aAC3B,WAAW,CAAC,mCAAmC,CAAC;aAChD,MAAM,CAAC,2BAA2B,EAAE,kBAAkB,EAAE,KAAK,CAAC;aAC9D,MAAM,CACL,2BAA2B,EAC3B,uCAAuC,CACxC;aACA,MAAM,CAAC,gBAAgB,EAAE,kBAAkB,CAAC;aAC5C,MAAM,CAAC,KAAK,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE;YACnC,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,IAAI,GAAG,EAAE,OAAO,CAAC,CAAC;QACvD,CAAC,CAAC,CAAC;IACP,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,SAAiB,EAAE,OAAY;QAClD,MAAM,OAAO,GAAG,IAAA,aAAG,GAAE,CAAC;QAEtB,IAAI,CAAC;YACH,MAAM,WAAW,GAAG,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,SAAS,CAAC,CAAC;YAC3D,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,WAAW,CAAC,CAAC;YAE/C,OAAO,CAAC,KAAK,CAAC,+BAA+B,CAAC,CAAC;YAC/C,MAAM,EAAE,CAAC,SAAS,CAAC,WAAW,CAAC,CAAC;YAChC,OAAO,CAAC,OAAO,EAAE,CAAC;YAElB,MAAM,OAAO,GAAG,MAAM,kBAAQ,CAAC,MAAM,CAAC;gBACpC;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,eAAe;oBACxB,OAAO,EAAE,WAAW;iBACrB;gBACD;oBACE,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,aAAa;oBACnB,OAAO,EAAE,sBAAsB;oBAC/B,OAAO,EAAE,8BAA8B;iBACxC;gBACD;oBACE,IAAI,EAAE,UAAU;oBAChB,IAAI,EAAE,UAAU;oBAChB,OAAO,EAAE,kBAAkB;oBAC3B,OAAO,EAAE;wBACP,EAAE,IAAI,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"init.command.js","sourceRoot":"","sources":["../../../src/cli/commands/init.command.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/test.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;
|
|
1
|
+
{"version":3,"file":"test.command.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/test.command.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAOpC,qBAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI;mBAkBlB,QAAQ;IAkJ7B,OAAO,CAAC,MAAM,CAAC,oBAAoB;CA6GpC"}
|
|
@@ -41,6 +41,7 @@ const chalk_1 = __importDefault(require("chalk"));
|
|
|
41
41
|
const path = __importStar(require("path"));
|
|
42
42
|
const child_process_1 = require("child_process");
|
|
43
43
|
const fs = __importStar(require("fs"));
|
|
44
|
+
const chokidar_1 = __importDefault(require("chokidar"));
|
|
44
45
|
class TestCommand {
|
|
45
46
|
static register(program) {
|
|
46
47
|
program
|
|
@@ -122,52 +123,45 @@ class TestCommand {
|
|
|
122
123
|
const scriptPath = path.join(cwd, ".fragment-test-runner.js");
|
|
123
124
|
try {
|
|
124
125
|
fs.writeFileSync(scriptPath, scriptContent);
|
|
125
|
-
// Make the script executable
|
|
126
126
|
fs.chmodSync(scriptPath, "755");
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
TS_NODE_TRANSPILE_ONLY: "true",
|
|
131
|
-
NODE_ENV: "test",
|
|
132
|
-
// Only set TS_NODE_PROJECT if tsconfig exists
|
|
133
|
-
...(hasTsConfig && useTypeScript
|
|
134
|
-
? { TS_NODE_PROJECT: tsConfigPath }
|
|
135
|
-
: {}),
|
|
136
|
-
// Handle color output
|
|
137
|
-
FORCE_COLOR: options.color === false ? "0" : "1",
|
|
138
|
-
};
|
|
139
|
-
// Add --watch support
|
|
127
|
+
// -----------------------
|
|
128
|
+
// Watch / Coverage / Single Run
|
|
129
|
+
// -----------------------
|
|
140
130
|
if (options.watch) {
|
|
141
|
-
console.log(chalk_1.default.
|
|
131
|
+
console.log(chalk_1.default.green("\nš Watch mode enabled. Listening for changes...\n"));
|
|
132
|
+
const watcher = chokidar_1.default.watch(`${basePath}/**/*.spec.${useTypeScript ? "ts" : "js"}`, {
|
|
133
|
+
ignoreInitial: true,
|
|
134
|
+
});
|
|
135
|
+
const runTests = () => {
|
|
136
|
+
const proc = (0, child_process_1.spawn)("node", [scriptPath], { stdio: "inherit" });
|
|
137
|
+
proc.on("close", (code) => {
|
|
138
|
+
if (code !== 0)
|
|
139
|
+
console.log(chalk_1.default.red(`Test run exited with code ${code}`));
|
|
140
|
+
});
|
|
141
|
+
};
|
|
142
|
+
runTests(); // Initial run
|
|
143
|
+
watcher.on("all", (event, pathChanged) => {
|
|
144
|
+
console.log(chalk_1.default.blue(`\nš File changed (${event}): ${pathChanged}`));
|
|
145
|
+
runTests();
|
|
146
|
+
});
|
|
142
147
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
148
|
+
else if (options.coverage) {
|
|
149
|
+
console.log(chalk_1.default.green("\nš Coverage enabled. Running tests with coverage...\n"));
|
|
150
|
+
const proc = (0, child_process_1.spawn)("npx", ["c8", "--reporter=lcov", "--reporter=text", "node", scriptPath], { stdio: "inherit" });
|
|
151
|
+
proc.on("close", (code) => process.exit(code || 0));
|
|
152
|
+
proc.on("error", (err) => {
|
|
153
|
+
console.error(chalk_1.default.red("Failed to run coverage:"), err);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
});
|
|
156
|
+
}
|
|
157
|
+
else {
|
|
158
|
+
const proc = (0, child_process_1.spawn)("node", [scriptPath], { stdio: "inherit" });
|
|
159
|
+
proc.on("close", (code) => process.exit(code || 0));
|
|
160
|
+
proc.on("error", (err) => {
|
|
161
|
+
console.error(chalk_1.default.red("Failed to run tests:"), err);
|
|
162
|
+
process.exit(1);
|
|
163
|
+
});
|
|
146
164
|
}
|
|
147
|
-
const proc = (0, child_process_1.spawn)("node", nodeArgs, {
|
|
148
|
-
cwd,
|
|
149
|
-
stdio: "inherit",
|
|
150
|
-
env,
|
|
151
|
-
});
|
|
152
|
-
proc.on("close", (code) => {
|
|
153
|
-
try {
|
|
154
|
-
fs.unlinkSync(scriptPath);
|
|
155
|
-
}
|
|
156
|
-
catch (e) {
|
|
157
|
-
// Ignore cleanup errors
|
|
158
|
-
}
|
|
159
|
-
process.exit(code || 0);
|
|
160
|
-
});
|
|
161
|
-
proc.on("error", (error) => {
|
|
162
|
-
console.error(chalk_1.default.red("Failed to run tests:"), error);
|
|
163
|
-
try {
|
|
164
|
-
fs.unlinkSync(scriptPath);
|
|
165
|
-
}
|
|
166
|
-
catch (e) {
|
|
167
|
-
// Ignore cleanup errors
|
|
168
|
-
}
|
|
169
|
-
process.exit(1);
|
|
170
|
-
});
|
|
171
165
|
}
|
|
172
166
|
catch (error) {
|
|
173
167
|
console.error(chalk_1.default.red("Failed to create test runner:"), error.message);
|
|
@@ -176,14 +170,11 @@ class TestCommand {
|
|
|
176
170
|
}
|
|
177
171
|
static generateRunnerScript(options) {
|
|
178
172
|
const { useTypeScript, basePath, pattern, hasTsConfig, tsConfigPath, noColor, } = options;
|
|
179
|
-
|
|
180
|
-
// This assumes the test runner is installed as a dependency
|
|
181
|
-
let runnerImportPath = "fragment-ts/testing";
|
|
182
|
-
// Try to find the local test runner first for development
|
|
173
|
+
let runnerImportPath = "fragment-ts";
|
|
183
174
|
const possiblePaths = [
|
|
184
175
|
path.join(process.cwd(), "node_modules", "fragment-ts", "testing"),
|
|
185
176
|
path.join(process.cwd(), "node_modules", "fragment-ts", "dist", "testing"),
|
|
186
|
-
path.join(__dirname, "..", "..", "testing"),
|
|
177
|
+
path.join(__dirname, "..", "..", "testing"),
|
|
187
178
|
];
|
|
188
179
|
let resolvedRunnerPath = runnerImportPath;
|
|
189
180
|
for (const testPath of possiblePaths) {
|
|
@@ -198,11 +189,9 @@ class TestCommand {
|
|
|
198
189
|
${useTypeScript ? "require('ts-node/register/transpile-only');" : ""}
|
|
199
190
|
require('reflect-metadata');
|
|
200
191
|
|
|
201
|
-
// Set environment
|
|
202
192
|
process.env.NODE_ENV = 'test';
|
|
203
193
|
${noColor ? "process.env.FORCE_COLOR = '0';" : "process.env.FORCE_COLOR = '1';"}
|
|
204
194
|
|
|
205
|
-
// Set up TypeScript config if available
|
|
206
195
|
${hasTsConfig && useTypeScript
|
|
207
196
|
? `
|
|
208
197
|
try {
|
|
@@ -217,17 +206,13 @@ try {
|
|
|
217
206
|
skipLibCheck: true
|
|
218
207
|
}
|
|
219
208
|
});
|
|
220
|
-
} catch (error) {
|
|
221
|
-
// Ignore, ts-node might not be available
|
|
222
|
-
}`
|
|
209
|
+
} catch (error) {}`
|
|
223
210
|
: ""}
|
|
224
211
|
|
|
225
212
|
let testRunner;
|
|
226
213
|
try {
|
|
227
|
-
// Try to import the test runner
|
|
228
214
|
const testModule = require('${resolvedRunnerPath}');
|
|
229
215
|
|
|
230
|
-
// Handle different export patterns
|
|
231
216
|
if (testModule.getTestRunner) {
|
|
232
217
|
testRunner = testModule.getTestRunner();
|
|
233
218
|
} else if (testModule.TestRunner) {
|
|
@@ -235,7 +220,6 @@ try {
|
|
|
235
220
|
} else if (testModule.default && testModule.default.getTestRunner) {
|
|
236
221
|
testRunner = testModule.default.getTestRunner();
|
|
237
222
|
} else {
|
|
238
|
-
// Fallback to creating a new instance
|
|
239
223
|
testRunner = testModule;
|
|
240
224
|
}
|
|
241
225
|
} catch (error) {
|
|
@@ -247,35 +231,18 @@ try {
|
|
|
247
231
|
async function runTests() {
|
|
248
232
|
try {
|
|
249
233
|
console.log('Looking for test files...');
|
|
250
|
-
|
|
251
|
-
// Load test files with the runner
|
|
252
234
|
await testRunner.loadTestFiles('${basePath}/${pattern}');
|
|
253
|
-
|
|
254
|
-
// Run tests
|
|
255
235
|
await testRunner.run();
|
|
256
236
|
} catch (error) {
|
|
257
237
|
console.error('\\nā Error running tests:', error.message);
|
|
258
|
-
|
|
259
|
-
if (error.stack && process.env.DEBUG) {
|
|
260
|
-
console.error(error.stack);
|
|
261
|
-
}
|
|
262
|
-
|
|
238
|
+
if (error.stack && process.env.DEBUG) console.error(error.stack);
|
|
263
239
|
process.exit(1);
|
|
264
240
|
}
|
|
265
241
|
}
|
|
266
242
|
|
|
267
|
-
|
|
268
|
-
process.on('
|
|
269
|
-
console.log('\\n\\nTest run interrupted');
|
|
270
|
-
process.exit(130);
|
|
271
|
-
});
|
|
272
|
-
|
|
273
|
-
process.on('SIGTERM', () => {
|
|
274
|
-
console.log('\\n\\nTest run terminated');
|
|
275
|
-
process.exit(143);
|
|
276
|
-
});
|
|
243
|
+
process.on('SIGINT', () => { console.log('\\n\\nTest run interrupted'); process.exit(130); });
|
|
244
|
+
process.on('SIGTERM', () => { console.log('\\n\\nTest run terminated'); process.exit(143); });
|
|
277
245
|
|
|
278
|
-
// Run the tests
|
|
279
246
|
runTests().catch(error => {
|
|
280
247
|
console.error('Unhandled error:', error);
|
|
281
248
|
process.exit(1);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"test.command.js","sourceRoot":"","sources":["../../../src/cli/commands/test.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,kDAA0B;AAC1B,2CAA6B;AAC7B,iDAAsC;AACtC,uCAAyB;
|
|
1
|
+
{"version":3,"file":"test.command.js","sourceRoot":"","sources":["../../../src/cli/commands/test.command.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,kDAA0B;AAC1B,2CAA6B;AAC7B,iDAAsC;AACtC,uCAAyB;AACzB,wDAAgC;AAEhC,MAAa,WAAW;IACtB,MAAM,CAAC,QAAQ,CAAC,OAAgB;QAC9B,OAAO;aACJ,OAAO,CAAC,MAAM,CAAC;aACf,WAAW,CAAC,WAAW,CAAC;aACxB,MAAM,CAAC,SAAS,EAAE,yBAAyB,CAAC;aAC5C,MAAM,CACL,qBAAqB,EACrB,sDAAsD,EACtD,MAAM,CACP;aACA,MAAM,CAAC,qBAAqB,EAAE,mBAAmB,EAAE,cAAc,CAAC;aAClE,MAAM,CAAC,YAAY,EAAE,0BAA0B,CAAC;aAChD,MAAM,CAAC,YAAY,EAAE,wBAAwB,CAAC;aAC9C,MAAM,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE;YACxB,MAAM,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;QAC/B,CAAC,CAAC,CAAC;IACP,CAAC;IAEO,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,OAAY;QACxC,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC,CAAC;QAE5D,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC1B,MAAM,SAAS,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC,CAAC;QACvD,MAAM,OAAO,GAAG,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC;QAEtD,IAAI,aAAsB,CAAC;QAC3B,IAAI,IAAY,CAAC;QACjB,IAAI,QAAgB,CAAC;QACrB,IAAI,OAAe,CAAC;QAEpB,IAAI,OAAO,CAAC,GAAG,KAAK,KAAK,EAAE,CAAC;YAC1B,IAAI,CAAC,SAAS,EAAE,CAAC;gBACf,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,yDAAyD,CAAC,CACrE,CAAC;gBACF,OAAO;YACT,CAAC;YACD,aAAa,GAAG,IAAI,CAAC;YACrB,IAAI,GAAG,oBAAoB,CAAC;YAC5B,QAAQ,GAAG,KAAK,CAAC;YACjB,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC;QAC9C,CAAC;aAAM,IAAI,OAAO,CAAC,GAAG,KAAK,MAAM,EAAE,CAAC;YAClC,IAAI,CAAC,OAAO,EAAE,CAAC;gBACb,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CACP,8EAA8E,CAC/E,CACF,CAAC;gBACF,OAAO;YACT,CAAC;YACD,aAAa,GAAG,KAAK,CAAC;YACtB,IAAI,GAAG,oBAAoB,CAAC;YAC5B,QAAQ,GAAG,MAAM,CAAC;YAClB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,cAAc,CAAC;QACtE,CAAC;aAAM,CAAC;YACN,cAAc;YACd,IAAI,SAAS,EAAE,CAAC;gBACd,aAAa,GAAG,IAAI,CAAC;gBACrB,IAAI,GAAG,kCAAkC,CAAC;gBAC1C,QAAQ,GAAG,KAAK,CAAC;gBACjB,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,cAAc,CAAC;YAC9C,CAAC;iBAAM,IAAI,OAAO,EAAE,CAAC;gBACnB,aAAa,GAAG,KAAK,CAAC;gBACtB,IAAI,GAAG,kCAAkC,CAAC;gBAC1C,QAAQ,GAAG,MAAM,CAAC;gBAClB,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC,IAAI,cAAc,CAAC;YACtE,CAAC;iBAAM,CAAC;gBACN,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,GAAG,CAAC,sDAAsD,CAAC,CAClE,CAAC;gBACF,OAAO;YACT,CAAC;QACH,CAAC;QAED,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,YAAY,IAAI,EAAE,CAAC,CAAC,CAAC;QAC5C,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,IAAI,CAAC,eAAe,QAAQ,IAAI,OAAO,EAAE,CAAC,CAAC,CAAC;QAE9D,uDAAuD;QACvD,MAAM,YAAY,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,eAAe,CAAC,CAAC;QACrD,MAAM,WAAW,GAAG,EAAE,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QAEhD,iEAAiE;QACjE,MAAM,aAAa,GAAG,IAAI,CAAC,oBAAoB,CAAC;YAC9C,aAAa;YACb,QAAQ;YACR,OAAO;YACP,WAAW;YACX,YAAY;YACZ,SAAS,EAAE,OAAO,CAAC,KAAK;YACxB,QAAQ,EAAE,OAAO,CAAC,QAAQ;YAC1B,OAAO,EAAE,OAAO,CAAC,KAAK,KAAK,KAAK;SACjC,CAAC,CAAC;QAEH,MAAM,UAAU,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,0BAA0B,CAAC,CAAC;QAE9D,IAAI,CAAC;YACH,EAAE,CAAC,aAAa,CAAC,UAAU,EAAE,aAAa,CAAC,CAAC;YAC5C,EAAE,CAAC,SAAS,CAAC,UAAU,EAAE,KAAK,CAAC,CAAC;YAEhC,0BAA0B;YAC1B,gCAAgC;YAChC,0BAA0B;YAC1B,IAAI,OAAO,CAAC,KAAK,EAAE,CAAC;gBAClB,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CAAC,qDAAqD,CAAC,CACnE,CAAC;gBAEF,MAAM,OAAO,GAAG,kBAAQ,CAAC,KAAK,CAC5B,GAAG,QAAQ,cAAc,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,EACtD;oBACE,aAAa,EAAE,IAAI;iBACpB,CACF,CAAC;gBAEF,MAAM,QAAQ,GAAG,GAAG,EAAE;oBACpB,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;oBAE/D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;wBACxB,IAAI,IAAI,KAAK,CAAC;4BACZ,OAAO,CAAC,GAAG,CAAC,eAAK,CAAC,GAAG,CAAC,6BAA6B,IAAI,EAAE,CAAC,CAAC,CAAC;oBAChE,CAAC,CAAC,CAAC;gBACL,CAAC,CAAC;gBAEF,QAAQ,EAAE,CAAC,CAAC,cAAc;gBAE1B,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,EAAE;oBACvC,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,IAAI,CAAC,sBAAsB,KAAK,MAAM,WAAW,EAAE,CAAC,CAC3D,CAAC;oBACF,QAAQ,EAAE,CAAC;gBACb,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,IAAI,OAAO,CAAC,QAAQ,EAAE,CAAC;gBAC5B,OAAO,CAAC,GAAG,CACT,eAAK,CAAC,KAAK,CACT,yDAAyD,CAC1D,CACF,CAAC;gBAEF,MAAM,IAAI,GAAG,IAAA,qBAAK,EAChB,KAAK,EACL,CAAC,IAAI,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,MAAM,EAAE,UAAU,CAAC,EAChE,EAAE,KAAK,EAAE,SAAS,EAAE,CACrB,CAAC;gBAEF,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBACvB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,yBAAyB,CAAC,EAAE,GAAG,CAAC,CAAC;oBACzD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;YACL,CAAC;iBAAM,CAAC;gBACN,MAAM,IAAI,GAAG,IAAA,qBAAK,EAAC,MAAM,EAAE,CAAC,UAAU,CAAC,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;gBAE/D,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,CAAC;gBACpD,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;oBACvB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,sBAAsB,CAAC,EAAE,GAAG,CAAC,CAAC;oBACtD,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAClB,CAAC,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAAC,OAAO,KAAU,EAAE,CAAC;YACpB,OAAO,CAAC,KAAK,CAAC,eAAK,CAAC,GAAG,CAAC,+BAA+B,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;YACzE,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAClB,CAAC;IACH,CAAC;IAEO,MAAM,CAAC,oBAAoB,CAAC,OASnC;QACC,MAAM,EACJ,aAAa,EACb,QAAQ,EACR,OAAO,EACP,WAAW,EACX,YAAY,EACZ,OAAO,GACR,GAAG,OAAO,CAAC;QAEZ,IAAI,gBAAgB,GAAG,aAAa,CAAC;QAErC,MAAM,aAAa,GAAG;YACpB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,cAAc,EAAE,aAAa,EAAE,SAAS,CAAC;YAClE,IAAI,CAAC,IAAI,CACP,OAAO,CAAC,GAAG,EAAE,EACb,cAAc,EACd,aAAa,EACb,MAAM,EACN,SAAS,CACV;YACD,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,SAAS,CAAC;SAC5C,CAAC;QAEF,IAAI,kBAAkB,GAAG,gBAAgB,CAAC;QAC1C,KAAK,MAAM,QAAQ,IAAI,aAAa,EAAE,CAAC;YACrC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,GAAG,KAAK,CAAC,IAAI,EAAE,CAAC,UAAU,CAAC,QAAQ,GAAG,KAAK,CAAC,EAAE,CAAC;gBACvE,kBAAkB,GAAG,QAAQ,CAAC;gBAC9B,MAAM;YACR,CAAC;QACH,CAAC;QAED,OAAO;;;EAGT,aAAa,CAAC,CAAC,CAAC,6CAA6C,CAAC,CAAC,CAAC,EAAE;;;;EAIlE,OAAO,CAAC,CAAC,CAAC,gCAAgC,CAAC,CAAC,CAAC,gCAAgC;;EAG7E,WAAW,IAAI,aAAa;YAC1B,CAAC,CAAC;;;;gBAIU,YAAY;;;;;;;;;mBAST;YACf,CAAC,CAAC,EACN;;;;gCAIgC,kBAAkB;;;;;;;;;;;;;;;;;;;;sCAoBZ,QAAQ,IAAI,OAAO;;;;;;;;;;;;;;;;CAgBxD,CAAC;IACA,CAAC;CACF;AAlRD,kCAkRC"}
|
|
@@ -8,11 +8,14 @@
|
|
|
8
8
|
"name": "blog-api",
|
|
9
9
|
"version": "1.0.0",
|
|
10
10
|
"dependencies": {
|
|
11
|
-
"fragment-ts": "^1.0.
|
|
11
|
+
"fragment-ts": "^1.0.21",
|
|
12
|
+
"mysql2": "^3.16.0",
|
|
12
13
|
"reflect-metadata": "^0.1.13"
|
|
13
14
|
},
|
|
14
15
|
"devDependencies": {
|
|
15
16
|
"@types/node": "^20.10.5",
|
|
17
|
+
"ts-node": "^10.9.2",
|
|
18
|
+
"tsconfig-paths": "^4.2.0",
|
|
16
19
|
"typescript": "^5.3.3"
|
|
17
20
|
}
|
|
18
21
|
},
|
|
@@ -20,6 +23,7 @@
|
|
|
20
23
|
"version": "0.8.1",
|
|
21
24
|
"resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz",
|
|
22
25
|
"integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==",
|
|
26
|
+
"devOptional": true,
|
|
23
27
|
"license": "MIT",
|
|
24
28
|
"dependencies": {
|
|
25
29
|
"@jridgewell/trace-mapping": "0.3.9"
|
|
@@ -174,6 +178,7 @@
|
|
|
174
178
|
"version": "3.1.2",
|
|
175
179
|
"resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz",
|
|
176
180
|
"integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==",
|
|
181
|
+
"devOptional": true,
|
|
177
182
|
"license": "MIT",
|
|
178
183
|
"engines": {
|
|
179
184
|
"node": ">=6.0.0"
|
|
@@ -183,12 +188,14 @@
|
|
|
183
188
|
"version": "1.5.5",
|
|
184
189
|
"resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz",
|
|
185
190
|
"integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==",
|
|
191
|
+
"devOptional": true,
|
|
186
192
|
"license": "MIT"
|
|
187
193
|
},
|
|
188
194
|
"node_modules/@jridgewell/trace-mapping": {
|
|
189
195
|
"version": "0.3.9",
|
|
190
196
|
"resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz",
|
|
191
197
|
"integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==",
|
|
198
|
+
"devOptional": true,
|
|
192
199
|
"license": "MIT",
|
|
193
200
|
"dependencies": {
|
|
194
201
|
"@jridgewell/resolve-uri": "^3.0.3",
|
|
@@ -215,24 +222,28 @@
|
|
|
215
222
|
"version": "1.0.12",
|
|
216
223
|
"resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.12.tgz",
|
|
217
224
|
"integrity": "sha512-UCYBaeFvM11aU2y3YPZ//O5Rhj+xKyzy7mvcIoAjASbigy8mHMryP5cK7dgjlz2hWxh1g5pLw084E0a/wlUSFQ==",
|
|
225
|
+
"devOptional": true,
|
|
218
226
|
"license": "MIT"
|
|
219
227
|
},
|
|
220
228
|
"node_modules/@tsconfig/node12": {
|
|
221
229
|
"version": "1.0.11",
|
|
222
230
|
"resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz",
|
|
223
231
|
"integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==",
|
|
232
|
+
"devOptional": true,
|
|
224
233
|
"license": "MIT"
|
|
225
234
|
},
|
|
226
235
|
"node_modules/@tsconfig/node14": {
|
|
227
236
|
"version": "1.0.3",
|
|
228
237
|
"resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz",
|
|
229
238
|
"integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==",
|
|
239
|
+
"devOptional": true,
|
|
230
240
|
"license": "MIT"
|
|
231
241
|
},
|
|
232
242
|
"node_modules/@tsconfig/node16": {
|
|
233
243
|
"version": "1.0.4",
|
|
234
244
|
"resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz",
|
|
235
245
|
"integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==",
|
|
246
|
+
"devOptional": true,
|
|
236
247
|
"license": "MIT"
|
|
237
248
|
},
|
|
238
249
|
"node_modules/@types/node": {
|
|
@@ -298,6 +309,7 @@
|
|
|
298
309
|
"version": "8.15.0",
|
|
299
310
|
"resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz",
|
|
300
311
|
"integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==",
|
|
312
|
+
"devOptional": true,
|
|
301
313
|
"license": "MIT",
|
|
302
314
|
"bin": {
|
|
303
315
|
"acorn": "bin/acorn"
|
|
@@ -310,6 +322,7 @@
|
|
|
310
322
|
"version": "8.3.4",
|
|
311
323
|
"resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz",
|
|
312
324
|
"integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==",
|
|
325
|
+
"devOptional": true,
|
|
313
326
|
"license": "MIT",
|
|
314
327
|
"dependencies": {
|
|
315
328
|
"acorn": "^8.11.0"
|
|
@@ -404,6 +417,7 @@
|
|
|
404
417
|
"version": "4.1.3",
|
|
405
418
|
"resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz",
|
|
406
419
|
"integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==",
|
|
420
|
+
"devOptional": true,
|
|
407
421
|
"license": "MIT"
|
|
408
422
|
},
|
|
409
423
|
"node_modules/array-flatten": {
|
|
@@ -439,6 +453,15 @@
|
|
|
439
453
|
"url": "https://github.com/sponsors/ljharb"
|
|
440
454
|
}
|
|
441
455
|
},
|
|
456
|
+
"node_modules/aws-ssl-profiles": {
|
|
457
|
+
"version": "1.1.2",
|
|
458
|
+
"resolved": "https://registry.npmjs.org/aws-ssl-profiles/-/aws-ssl-profiles-1.1.2.tgz",
|
|
459
|
+
"integrity": "sha512-NZKeq9AfyQvEeNlN0zSYAaWrmBffJh3IELMZfRpJVWgrpEbtEpnjvzqBPf+mxoI287JohRDoa+/nsfqqiZmF6g==",
|
|
460
|
+
"license": "MIT",
|
|
461
|
+
"engines": {
|
|
462
|
+
"node": ">= 6.0.0"
|
|
463
|
+
}
|
|
464
|
+
},
|
|
442
465
|
"node_modules/axios": {
|
|
443
466
|
"version": "1.13.2",
|
|
444
467
|
"resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz",
|
|
@@ -894,6 +917,7 @@
|
|
|
894
917
|
"version": "1.1.1",
|
|
895
918
|
"resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz",
|
|
896
919
|
"integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==",
|
|
920
|
+
"devOptional": true,
|
|
897
921
|
"license": "MIT"
|
|
898
922
|
},
|
|
899
923
|
"node_modules/cross-spawn": {
|
|
@@ -977,6 +1001,15 @@
|
|
|
977
1001
|
"node": ">=0.4.0"
|
|
978
1002
|
}
|
|
979
1003
|
},
|
|
1004
|
+
"node_modules/denque": {
|
|
1005
|
+
"version": "2.1.0",
|
|
1006
|
+
"resolved": "https://registry.npmjs.org/denque/-/denque-2.1.0.tgz",
|
|
1007
|
+
"integrity": "sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==",
|
|
1008
|
+
"license": "Apache-2.0",
|
|
1009
|
+
"engines": {
|
|
1010
|
+
"node": ">=0.10"
|
|
1011
|
+
}
|
|
1012
|
+
},
|
|
980
1013
|
"node_modules/depd": {
|
|
981
1014
|
"version": "2.0.0",
|
|
982
1015
|
"resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz",
|
|
@@ -1000,6 +1033,7 @@
|
|
|
1000
1033
|
"version": "4.0.2",
|
|
1001
1034
|
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz",
|
|
1002
1035
|
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
|
|
1036
|
+
"devOptional": true,
|
|
1003
1037
|
"license": "BSD-3-Clause",
|
|
1004
1038
|
"engines": {
|
|
1005
1039
|
"node": ">=0.3.1"
|
|
@@ -1392,9 +1426,9 @@
|
|
|
1392
1426
|
}
|
|
1393
1427
|
},
|
|
1394
1428
|
"node_modules/fragment-ts": {
|
|
1395
|
-
"version": "1.0.
|
|
1396
|
-
"resolved": "https://registry.npmjs.org/fragment-ts/-/fragment-ts-1.0.
|
|
1397
|
-
"integrity": "sha512-
|
|
1429
|
+
"version": "1.0.21",
|
|
1430
|
+
"resolved": "https://registry.npmjs.org/fragment-ts/-/fragment-ts-1.0.21.tgz",
|
|
1431
|
+
"integrity": "sha512-RrKnnwCYmNzc0Ihp7Ik8sswAXbJvcZSEtLWl+RW/rXBW856Xj88blNP6OsB93bD9v4EeMz8a680e5lZZOwG25g==",
|
|
1398
1432
|
"license": "MIT",
|
|
1399
1433
|
"dependencies": {
|
|
1400
1434
|
"axios": "^1.6.2",
|
|
@@ -1406,7 +1440,7 @@
|
|
|
1406
1440
|
"commander": "^11.1.0",
|
|
1407
1441
|
"compression": "^1.7.4",
|
|
1408
1442
|
"cors": "^2.8.5",
|
|
1409
|
-
"dotenv": "^16.
|
|
1443
|
+
"dotenv": "^16.6.1",
|
|
1410
1444
|
"ejs": "^3.1.9",
|
|
1411
1445
|
"express": "^4.18.2",
|
|
1412
1446
|
"express-rate-limit": "^7.1.5",
|
|
@@ -1419,7 +1453,6 @@
|
|
|
1419
1453
|
"openai": "^4.20.1",
|
|
1420
1454
|
"ora": "^5.4.1",
|
|
1421
1455
|
"reflect-metadata": "^0.1.13",
|
|
1422
|
-
"ts-node": "^10.9.2",
|
|
1423
1456
|
"typeorm": "^0.3.17"
|
|
1424
1457
|
},
|
|
1425
1458
|
"bin": {
|
|
@@ -1476,6 +1509,15 @@
|
|
|
1476
1509
|
"url": "https://github.com/sponsors/ljharb"
|
|
1477
1510
|
}
|
|
1478
1511
|
},
|
|
1512
|
+
"node_modules/generate-function": {
|
|
1513
|
+
"version": "2.3.1",
|
|
1514
|
+
"resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.3.1.tgz",
|
|
1515
|
+
"integrity": "sha512-eeB5GfMNeevm/GRYq20ShmsaGcmI81kIX2K9XQx5miC8KdHaC6Jm0qQ8ZNeGOi7wYB8OsdxKs+Y2oVuTFuVwKQ==",
|
|
1516
|
+
"license": "MIT",
|
|
1517
|
+
"dependencies": {
|
|
1518
|
+
"is-property": "^1.0.2"
|
|
1519
|
+
}
|
|
1520
|
+
},
|
|
1479
1521
|
"node_modules/get-caller-file": {
|
|
1480
1522
|
"version": "2.0.5",
|
|
1481
1523
|
"resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
|
|
@@ -1812,6 +1854,12 @@
|
|
|
1812
1854
|
"node": ">=0.12.0"
|
|
1813
1855
|
}
|
|
1814
1856
|
},
|
|
1857
|
+
"node_modules/is-property": {
|
|
1858
|
+
"version": "1.0.2",
|
|
1859
|
+
"resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz",
|
|
1860
|
+
"integrity": "sha512-Ks/IoX00TtClbGQr4TWXemAnktAQvYB7HzcCxDGqEZU6oCmb2INHuOoKxbtR+HFkmYWBKv/dOZtGRiAjDhj92g==",
|
|
1861
|
+
"license": "MIT"
|
|
1862
|
+
},
|
|
1815
1863
|
"node_modules/is-typed-array": {
|
|
1816
1864
|
"version": "1.1.15",
|
|
1817
1865
|
"resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz",
|
|
@@ -1883,6 +1931,19 @@
|
|
|
1883
1931
|
"node": ">=10"
|
|
1884
1932
|
}
|
|
1885
1933
|
},
|
|
1934
|
+
"node_modules/json5": {
|
|
1935
|
+
"version": "2.2.3",
|
|
1936
|
+
"resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz",
|
|
1937
|
+
"integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==",
|
|
1938
|
+
"dev": true,
|
|
1939
|
+
"license": "MIT",
|
|
1940
|
+
"bin": {
|
|
1941
|
+
"json5": "lib/cli.js"
|
|
1942
|
+
},
|
|
1943
|
+
"engines": {
|
|
1944
|
+
"node": ">=6"
|
|
1945
|
+
}
|
|
1946
|
+
},
|
|
1886
1947
|
"node_modules/jsonfile": {
|
|
1887
1948
|
"version": "6.2.0",
|
|
1888
1949
|
"resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.2.0.tgz",
|
|
@@ -2008,16 +2069,38 @@
|
|
|
2008
2069
|
"url": "https://github.com/sponsors/sindresorhus"
|
|
2009
2070
|
}
|
|
2010
2071
|
},
|
|
2072
|
+
"node_modules/long": {
|
|
2073
|
+
"version": "5.3.2",
|
|
2074
|
+
"resolved": "https://registry.npmjs.org/long/-/long-5.3.2.tgz",
|
|
2075
|
+
"integrity": "sha512-mNAgZ1GmyNhD7AuqnTG3/VQ26o760+ZYBPKjPvugO8+nLbYfX6TVpJPseBvopbdY+qpZ/lKUnmEc1LeZYS3QAA==",
|
|
2076
|
+
"license": "Apache-2.0"
|
|
2077
|
+
},
|
|
2011
2078
|
"node_modules/lru-cache": {
|
|
2012
2079
|
"version": "10.4.3",
|
|
2013
2080
|
"resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz",
|
|
2014
2081
|
"integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==",
|
|
2015
2082
|
"license": "ISC"
|
|
2016
2083
|
},
|
|
2084
|
+
"node_modules/lru.min": {
|
|
2085
|
+
"version": "1.1.3",
|
|
2086
|
+
"resolved": "https://registry.npmjs.org/lru.min/-/lru.min-1.1.3.tgz",
|
|
2087
|
+
"integrity": "sha512-Lkk/vx6ak3rYkRR0Nhu4lFUT2VDnQSxBe8Hbl7f36358p6ow8Bnvr8lrLt98H8J1aGxfhbX4Fs5tYg2+FTwr5Q==",
|
|
2088
|
+
"license": "MIT",
|
|
2089
|
+
"engines": {
|
|
2090
|
+
"bun": ">=1.0.0",
|
|
2091
|
+
"deno": ">=1.30.0",
|
|
2092
|
+
"node": ">=8.0.0"
|
|
2093
|
+
},
|
|
2094
|
+
"funding": {
|
|
2095
|
+
"type": "github",
|
|
2096
|
+
"url": "https://github.com/sponsors/wellwelwel"
|
|
2097
|
+
}
|
|
2098
|
+
},
|
|
2017
2099
|
"node_modules/make-error": {
|
|
2018
2100
|
"version": "1.3.6",
|
|
2019
2101
|
"resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz",
|
|
2020
2102
|
"integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==",
|
|
2103
|
+
"devOptional": true,
|
|
2021
2104
|
"license": "ISC"
|
|
2022
2105
|
},
|
|
2023
2106
|
"node_modules/math-intrinsics": {
|
|
@@ -2122,6 +2205,16 @@
|
|
|
2122
2205
|
"url": "https://github.com/sponsors/isaacs"
|
|
2123
2206
|
}
|
|
2124
2207
|
},
|
|
2208
|
+
"node_modules/minimist": {
|
|
2209
|
+
"version": "1.2.8",
|
|
2210
|
+
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
|
|
2211
|
+
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==",
|
|
2212
|
+
"dev": true,
|
|
2213
|
+
"license": "MIT",
|
|
2214
|
+
"funding": {
|
|
2215
|
+
"url": "https://github.com/sponsors/ljharb"
|
|
2216
|
+
}
|
|
2217
|
+
},
|
|
2125
2218
|
"node_modules/minipass": {
|
|
2126
2219
|
"version": "7.1.2",
|
|
2127
2220
|
"resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz",
|
|
@@ -2146,6 +2239,54 @@
|
|
|
2146
2239
|
"node": "^14.17.0 || ^16.13.0 || >=18.0.0"
|
|
2147
2240
|
}
|
|
2148
2241
|
},
|
|
2242
|
+
"node_modules/mysql2": {
|
|
2243
|
+
"version": "3.16.0",
|
|
2244
|
+
"resolved": "https://registry.npmjs.org/mysql2/-/mysql2-3.16.0.tgz",
|
|
2245
|
+
"integrity": "sha512-AEGW7QLLSuSnjCS4pk3EIqOmogegmze9h8EyrndavUQnIUcfkVal/sK7QznE+a3bc6rzPbAiui9Jcb+96tPwYA==",
|
|
2246
|
+
"license": "MIT",
|
|
2247
|
+
"dependencies": {
|
|
2248
|
+
"aws-ssl-profiles": "^1.1.1",
|
|
2249
|
+
"denque": "^2.1.0",
|
|
2250
|
+
"generate-function": "^2.3.1",
|
|
2251
|
+
"iconv-lite": "^0.7.0",
|
|
2252
|
+
"long": "^5.2.1",
|
|
2253
|
+
"lru.min": "^1.0.0",
|
|
2254
|
+
"named-placeholders": "^1.1.3",
|
|
2255
|
+
"seq-queue": "^0.0.5",
|
|
2256
|
+
"sqlstring": "^2.3.2"
|
|
2257
|
+
},
|
|
2258
|
+
"engines": {
|
|
2259
|
+
"node": ">= 8.0"
|
|
2260
|
+
}
|
|
2261
|
+
},
|
|
2262
|
+
"node_modules/mysql2/node_modules/iconv-lite": {
|
|
2263
|
+
"version": "0.7.1",
|
|
2264
|
+
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz",
|
|
2265
|
+
"integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==",
|
|
2266
|
+
"license": "MIT",
|
|
2267
|
+
"dependencies": {
|
|
2268
|
+
"safer-buffer": ">= 2.1.2 < 3.0.0"
|
|
2269
|
+
},
|
|
2270
|
+
"engines": {
|
|
2271
|
+
"node": ">=0.10.0"
|
|
2272
|
+
},
|
|
2273
|
+
"funding": {
|
|
2274
|
+
"type": "opencollective",
|
|
2275
|
+
"url": "https://opencollective.com/express"
|
|
2276
|
+
}
|
|
2277
|
+
},
|
|
2278
|
+
"node_modules/named-placeholders": {
|
|
2279
|
+
"version": "1.1.6",
|
|
2280
|
+
"resolved": "https://registry.npmjs.org/named-placeholders/-/named-placeholders-1.1.6.tgz",
|
|
2281
|
+
"integrity": "sha512-Tz09sEL2EEuv5fFowm419c1+a/jSMiBjI9gHxVLrVdbUkkNUUfjsVYs9pVZu5oCon/kmRh9TfLEObFtkVxmY0w==",
|
|
2282
|
+
"license": "MIT",
|
|
2283
|
+
"dependencies": {
|
|
2284
|
+
"lru.min": "^1.1.0"
|
|
2285
|
+
},
|
|
2286
|
+
"engines": {
|
|
2287
|
+
"node": ">=8.0.0"
|
|
2288
|
+
}
|
|
2289
|
+
},
|
|
2149
2290
|
"node_modules/negotiator": {
|
|
2150
2291
|
"version": "0.6.4",
|
|
2151
2292
|
"resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.4.tgz",
|
|
@@ -2606,6 +2747,11 @@
|
|
|
2606
2747
|
"integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==",
|
|
2607
2748
|
"license": "MIT"
|
|
2608
2749
|
},
|
|
2750
|
+
"node_modules/seq-queue": {
|
|
2751
|
+
"version": "0.0.5",
|
|
2752
|
+
"resolved": "https://registry.npmjs.org/seq-queue/-/seq-queue-0.0.5.tgz",
|
|
2753
|
+
"integrity": "sha512-hr3Wtp/GZIc/6DAGPDcV4/9WoZhjrkXsi5B/07QgX8tsdc6ilr7BFM6PM6rbdAX1kFSDYeZGLipIZZKyQP0O5Q=="
|
|
2754
|
+
},
|
|
2609
2755
|
"node_modules/serve-static": {
|
|
2610
2756
|
"version": "1.16.3",
|
|
2611
2757
|
"resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.3.tgz",
|
|
@@ -2785,6 +2931,15 @@
|
|
|
2785
2931
|
"node": ">=14"
|
|
2786
2932
|
}
|
|
2787
2933
|
},
|
|
2934
|
+
"node_modules/sqlstring": {
|
|
2935
|
+
"version": "2.3.3",
|
|
2936
|
+
"resolved": "https://registry.npmjs.org/sqlstring/-/sqlstring-2.3.3.tgz",
|
|
2937
|
+
"integrity": "sha512-qC9iz2FlN7DQl3+wjwn3802RTyjCx7sDvfQEXchwa6CWOx07/WVfh91gBmQ9fahw8snwGEWU3xGzOt4tFyHLxg==",
|
|
2938
|
+
"license": "MIT",
|
|
2939
|
+
"engines": {
|
|
2940
|
+
"node": ">= 0.6"
|
|
2941
|
+
}
|
|
2942
|
+
},
|
|
2788
2943
|
"node_modules/statuses": {
|
|
2789
2944
|
"version": "2.0.2",
|
|
2790
2945
|
"resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz",
|
|
@@ -2857,6 +3012,16 @@
|
|
|
2857
3012
|
"node": ">=8"
|
|
2858
3013
|
}
|
|
2859
3014
|
},
|
|
3015
|
+
"node_modules/strip-bom": {
|
|
3016
|
+
"version": "3.0.0",
|
|
3017
|
+
"resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz",
|
|
3018
|
+
"integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==",
|
|
3019
|
+
"dev": true,
|
|
3020
|
+
"license": "MIT",
|
|
3021
|
+
"engines": {
|
|
3022
|
+
"node": ">=4"
|
|
3023
|
+
}
|
|
3024
|
+
},
|
|
2860
3025
|
"node_modules/supports-color": {
|
|
2861
3026
|
"version": "7.2.0",
|
|
2862
3027
|
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz",
|
|
@@ -2914,6 +3079,7 @@
|
|
|
2914
3079
|
"version": "10.9.2",
|
|
2915
3080
|
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz",
|
|
2916
3081
|
"integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==",
|
|
3082
|
+
"devOptional": true,
|
|
2917
3083
|
"license": "MIT",
|
|
2918
3084
|
"dependencies": {
|
|
2919
3085
|
"@cspotcode/source-map-support": "^0.8.0",
|
|
@@ -2953,6 +3119,21 @@
|
|
|
2953
3119
|
}
|
|
2954
3120
|
}
|
|
2955
3121
|
},
|
|
3122
|
+
"node_modules/tsconfig-paths": {
|
|
3123
|
+
"version": "4.2.0",
|
|
3124
|
+
"resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz",
|
|
3125
|
+
"integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==",
|
|
3126
|
+
"dev": true,
|
|
3127
|
+
"license": "MIT",
|
|
3128
|
+
"dependencies": {
|
|
3129
|
+
"json5": "^2.2.2",
|
|
3130
|
+
"minimist": "^1.2.6",
|
|
3131
|
+
"strip-bom": "^3.0.0"
|
|
3132
|
+
},
|
|
3133
|
+
"engines": {
|
|
3134
|
+
"node": ">=6"
|
|
3135
|
+
}
|
|
3136
|
+
},
|
|
2956
3137
|
"node_modules/tslib": {
|
|
2957
3138
|
"version": "2.8.1",
|
|
2958
3139
|
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz",
|
|
@@ -3157,6 +3338,7 @@
|
|
|
3157
3338
|
"version": "5.9.3",
|
|
3158
3339
|
"resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz",
|
|
3159
3340
|
"integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==",
|
|
3341
|
+
"devOptional": true,
|
|
3160
3342
|
"license": "Apache-2.0",
|
|
3161
3343
|
"bin": {
|
|
3162
3344
|
"tsc": "bin/tsc",
|
|
@@ -3222,6 +3404,7 @@
|
|
|
3222
3404
|
"version": "3.0.1",
|
|
3223
3405
|
"resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz",
|
|
3224
3406
|
"integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==",
|
|
3407
|
+
"devOptional": true,
|
|
3225
3408
|
"license": "MIT"
|
|
3226
3409
|
},
|
|
3227
3410
|
"node_modules/validator": {
|
|
@@ -3384,6 +3567,7 @@
|
|
|
3384
3567
|
"version": "3.1.1",
|
|
3385
3568
|
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz",
|
|
3386
3569
|
"integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==",
|
|
3570
|
+
"devOptional": true,
|
|
3387
3571
|
"license": "MIT",
|
|
3388
3572
|
"engines": {
|
|
3389
3573
|
"node": ">=6"
|
|
@@ -9,11 +9,14 @@
|
|
|
9
9
|
"test": "fragment test"
|
|
10
10
|
},
|
|
11
11
|
"dependencies": {
|
|
12
|
-
"fragment-ts": "^1.0.
|
|
12
|
+
"fragment-ts": "^1.0.21",
|
|
13
|
+
"mysql2": "^3.16.0",
|
|
13
14
|
"reflect-metadata": "^0.1.13"
|
|
14
15
|
},
|
|
15
16
|
"devDependencies": {
|
|
16
|
-
"
|
|
17
|
-
"
|
|
17
|
+
"@types/node": "^20.10.5",
|
|
18
|
+
"ts-node": "^10.9.2",
|
|
19
|
+
"tsconfig-paths": "^4.2.0",
|
|
20
|
+
"typescript": "^5.3.3"
|
|
18
21
|
}
|
|
19
22
|
}
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import "reflect-metadata";
|
|
2
|
+
import { describe, it, beforeEach, expect, DIContainer } from "fragment-ts";
|
|
3
|
+
import { AppService } from "../services/app.service";
|
|
4
|
+
|
|
5
|
+
describe("AppService", () => {
|
|
6
|
+
let service: AppService;
|
|
7
|
+
let container: DIContainer;
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
container = DIContainer.getInstance();
|
|
11
|
+
container.reset();
|
|
12
|
+
service = container.resolve(AppService);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it("should return welcome message", () => {
|
|
16
|
+
const message = service.getMessage();
|
|
17
|
+
|
|
18
|
+
expect(message).toBe("Welcome to Fragment Framework!");
|
|
19
|
+
expect(message).toBeTruthy();
|
|
20
|
+
expect(message).toContain("Fragment");
|
|
21
|
+
// expect(message).toHaveLength(28);
|
|
22
|
+
});
|
|
23
|
+
});
|
package/package.json
CHANGED
|
@@ -51,7 +51,7 @@ export class InitCommand {
|
|
|
51
51
|
name: "features",
|
|
52
52
|
message: "Select features:",
|
|
53
53
|
choices: [
|
|
54
|
-
{ name: "Authentication", value: "auth", checked:
|
|
54
|
+
{ name: "Authentication", value: "auth", checked: false },
|
|
55
55
|
{ name: "Database (TypeORM)", value: "database", checked: true },
|
|
56
56
|
{ name: "AI Integration", value: "ai", checked: false },
|
|
57
57
|
{ name: "Testing", value: "testing", checked: true },
|
|
@@ -129,7 +129,7 @@ export class InitCommand {
|
|
|
129
129
|
}
|
|
130
130
|
|
|
131
131
|
if (config.features.includes("testing")) {
|
|
132
|
-
dirs.push("test");
|
|
132
|
+
dirs.push("src/test"); // moved test inside src
|
|
133
133
|
}
|
|
134
134
|
|
|
135
135
|
for (const dir of dirs) {
|
|
@@ -147,6 +147,10 @@ export class InitCommand {
|
|
|
147
147
|
if (config.features.includes("auth")) {
|
|
148
148
|
await this.generateAuthFiles(projectPath);
|
|
149
149
|
}
|
|
150
|
+
|
|
151
|
+
if (config.features.includes("testing")) {
|
|
152
|
+
await this.generateDefaultTest(projectPath);
|
|
153
|
+
}
|
|
150
154
|
}
|
|
151
155
|
|
|
152
156
|
private static async createConfigFiles(
|
|
@@ -169,7 +173,7 @@ export class InitCommand {
|
|
|
169
173
|
"migrate:revert": "fragment migrate:revert",
|
|
170
174
|
},
|
|
171
175
|
dependencies: {
|
|
172
|
-
"fragment-ts": "^1.0.
|
|
176
|
+
"fragment-ts": "^1.0.22",
|
|
173
177
|
"reflect-metadata": "^0.1.13",
|
|
174
178
|
},
|
|
175
179
|
devDependencies: {
|
|
@@ -208,7 +212,6 @@ export class InitCommand {
|
|
|
208
212
|
const fragmentConfig: any = {};
|
|
209
213
|
|
|
210
214
|
if (features.includes("database")) {
|
|
211
|
-
// Default SQLite config with env interpolation
|
|
212
215
|
const isProd = process.env.NODE_ENV === "production";
|
|
213
216
|
|
|
214
217
|
fragmentConfig.database = {
|
|
@@ -224,57 +227,53 @@ export class InitCommand {
|
|
|
224
227
|
};
|
|
225
228
|
}
|
|
226
229
|
|
|
227
|
-
// Write fragment.json
|
|
228
230
|
await fs.writeJSON(
|
|
229
231
|
path.join(projectPath, "fragment.json"),
|
|
230
232
|
fragmentConfig,
|
|
231
233
|
{ spaces: 2 },
|
|
232
234
|
);
|
|
233
235
|
|
|
234
|
-
// .env file with defaults
|
|
235
236
|
const envContent = `NODE_ENV=development
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
237
|
+
PORT=3000
|
|
238
|
+
JWT_SECRET=${process.env.JWT_SECRET ?? "your-secret-key-change-this"}
|
|
239
|
+
${features.includes("database") ? "DATABASE_FILE=database.sqlite" : ""}
|
|
240
|
+
`;
|
|
240
241
|
|
|
241
242
|
await fs.writeFile(path.join(projectPath, ".env"), envContent);
|
|
242
243
|
|
|
243
|
-
// .gitignore
|
|
244
244
|
await fs.writeFile(
|
|
245
245
|
path.join(projectPath, ".gitignore"),
|
|
246
246
|
"node_modules/\ndist/\n.env\n*.sqlite\n",
|
|
247
247
|
);
|
|
248
248
|
}
|
|
249
249
|
|
|
250
|
-
// In the generateMainFile method, update to:
|
|
251
250
|
private static async generateMainFile(
|
|
252
251
|
projectPath: string,
|
|
253
252
|
config: any,
|
|
254
253
|
): Promise<void> {
|
|
255
254
|
const content = `import 'reflect-metadata';
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
}
|
|
255
|
+
import { FragmentApplication } from 'fragment-ts';
|
|
256
|
+
import { FragmentWebApplication } from 'fragment-ts';
|
|
257
|
+
import { AppController } from './controllers/app.controller';
|
|
258
|
+
|
|
259
|
+
@FragmentApplication({
|
|
260
|
+
port: 3000,
|
|
261
|
+
autoScan: true
|
|
262
|
+
})
|
|
263
|
+
class Application {
|
|
264
|
+
constructor() {
|
|
265
|
+
console.log('Fragment application initialized');
|
|
268
266
|
}
|
|
267
|
+
}
|
|
269
268
|
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
269
|
+
async function bootstrap() {
|
|
270
|
+
console.log('Starting Fragment application...');
|
|
271
|
+
const app = new FragmentWebApplication();
|
|
272
|
+
await app.bootstrap(Application);
|
|
273
|
+
}
|
|
275
274
|
|
|
276
|
-
|
|
277
|
-
|
|
275
|
+
bootstrap().catch(console.error);
|
|
276
|
+
`;
|
|
278
277
|
|
|
279
278
|
await fs.writeFile(path.join(projectPath, "src", "main.ts"), content);
|
|
280
279
|
}
|
|
@@ -391,4 +390,35 @@ export class AuthService {
|
|
|
391
390
|
serviceContent,
|
|
392
391
|
);
|
|
393
392
|
}
|
|
393
|
+
|
|
394
|
+
private static async generateDefaultTest(projectPath: string) {
|
|
395
|
+
const testContent = `import { AppService } from '../services/app.service';
|
|
396
|
+
import { DIContainer } from 'fragment-ts';
|
|
397
|
+
|
|
398
|
+
describe('AppService', () => {
|
|
399
|
+
let service: AppService;
|
|
400
|
+
let container: DIContainer;
|
|
401
|
+
|
|
402
|
+
beforeEach(() => {
|
|
403
|
+
container = DIContainer.getInstance();
|
|
404
|
+
container.reset();
|
|
405
|
+
service = container.resolve(AppService);
|
|
406
|
+
});
|
|
407
|
+
|
|
408
|
+
it('should return welcome message', () => {
|
|
409
|
+
const message = service.getMessage();
|
|
410
|
+
|
|
411
|
+
expect(message).toBe('Welcome to Fragment Framework!');
|
|
412
|
+
expect(message).toBeTruthy();
|
|
413
|
+
expect(message).toContain('Fragment');
|
|
414
|
+
// expect(message).toHaveLength(28);
|
|
415
|
+
});
|
|
416
|
+
});
|
|
417
|
+
`;
|
|
418
|
+
|
|
419
|
+
const testDir = path.join(projectPath, "src", "test");
|
|
420
|
+
await fs.ensureDir(testDir);
|
|
421
|
+
|
|
422
|
+
await fs.writeFile(path.join(testDir, "app.spec.ts"), testContent);
|
|
423
|
+
}
|
|
394
424
|
}
|
|
@@ -3,6 +3,7 @@ import chalk from "chalk";
|
|
|
3
3
|
import * as path from "path";
|
|
4
4
|
import { spawn } from "child_process";
|
|
5
5
|
import * as fs from "fs";
|
|
6
|
+
import chokidar from "chokidar";
|
|
6
7
|
|
|
7
8
|
export class TestCommand {
|
|
8
9
|
static register(program: Command): void {
|
|
@@ -102,63 +103,67 @@ export class TestCommand {
|
|
|
102
103
|
|
|
103
104
|
try {
|
|
104
105
|
fs.writeFileSync(scriptPath, scriptContent);
|
|
105
|
-
|
|
106
|
-
// Make the script executable
|
|
107
106
|
fs.chmodSync(scriptPath, "755");
|
|
108
107
|
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
TS_NODE_TRANSPILE_ONLY: "true",
|
|
113
|
-
NODE_ENV: "test",
|
|
114
|
-
// Only set TS_NODE_PROJECT if tsconfig exists
|
|
115
|
-
...(hasTsConfig && useTypeScript
|
|
116
|
-
? { TS_NODE_PROJECT: tsConfigPath }
|
|
117
|
-
: {}),
|
|
118
|
-
// Handle color output
|
|
119
|
-
FORCE_COLOR: options.color === false ? "0" : "1",
|
|
120
|
-
};
|
|
121
|
-
|
|
122
|
-
// Add --watch support
|
|
108
|
+
// -----------------------
|
|
109
|
+
// Watch / Coverage / Single Run
|
|
110
|
+
// -----------------------
|
|
123
111
|
if (options.watch) {
|
|
124
112
|
console.log(
|
|
125
|
-
chalk.
|
|
126
|
-
"\nā ļø Watch mode is not yet implemented. Running once.\n",
|
|
127
|
-
),
|
|
113
|
+
chalk.green("\nš Watch mode enabled. Listening for changes...\n"),
|
|
128
114
|
);
|
|
129
|
-
}
|
|
130
115
|
|
|
131
|
-
|
|
132
|
-
|
|
116
|
+
const watcher = chokidar.watch(
|
|
117
|
+
`${basePath}/**/*.spec.${useTypeScript ? "ts" : "js"}`,
|
|
118
|
+
{
|
|
119
|
+
ignoreInitial: true,
|
|
120
|
+
},
|
|
121
|
+
);
|
|
122
|
+
|
|
123
|
+
const runTests = () => {
|
|
124
|
+
const proc = spawn("node", [scriptPath], { stdio: "inherit" });
|
|
125
|
+
|
|
126
|
+
proc.on("close", (code) => {
|
|
127
|
+
if (code !== 0)
|
|
128
|
+
console.log(chalk.red(`Test run exited with code ${code}`));
|
|
129
|
+
});
|
|
130
|
+
};
|
|
131
|
+
|
|
132
|
+
runTests(); // Initial run
|
|
133
|
+
|
|
134
|
+
watcher.on("all", (event, pathChanged) => {
|
|
135
|
+
console.log(
|
|
136
|
+
chalk.blue(`\nš File changed (${event}): ${pathChanged}`),
|
|
137
|
+
);
|
|
138
|
+
runTests();
|
|
139
|
+
});
|
|
140
|
+
} else if (options.coverage) {
|
|
133
141
|
console.log(
|
|
134
|
-
chalk.
|
|
142
|
+
chalk.green(
|
|
143
|
+
"\nš Coverage enabled. Running tests with coverage...\n",
|
|
144
|
+
),
|
|
135
145
|
);
|
|
136
|
-
}
|
|
137
146
|
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
147
|
+
const proc = spawn(
|
|
148
|
+
"npx",
|
|
149
|
+
["c8", "--reporter=lcov", "--reporter=text", "node", scriptPath],
|
|
150
|
+
{ stdio: "inherit" },
|
|
151
|
+
);
|
|
143
152
|
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
});
|
|
153
|
+
proc.on("close", (code) => process.exit(code || 0));
|
|
154
|
+
proc.on("error", (err) => {
|
|
155
|
+
console.error(chalk.red("Failed to run coverage:"), err);
|
|
156
|
+
process.exit(1);
|
|
157
|
+
});
|
|
158
|
+
} else {
|
|
159
|
+
const proc = spawn("node", [scriptPath], { stdio: "inherit" });
|
|
152
160
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
}
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
process.exit(1);
|
|
161
|
-
});
|
|
161
|
+
proc.on("close", (code) => process.exit(code || 0));
|
|
162
|
+
proc.on("error", (err) => {
|
|
163
|
+
console.error(chalk.red("Failed to run tests:"), err);
|
|
164
|
+
process.exit(1);
|
|
165
|
+
});
|
|
166
|
+
}
|
|
162
167
|
} catch (error: any) {
|
|
163
168
|
console.error(chalk.red("Failed to create test runner:"), error.message);
|
|
164
169
|
process.exit(1);
|
|
@@ -184,11 +189,8 @@ export class TestCommand {
|
|
|
184
189
|
noColor,
|
|
185
190
|
} = options;
|
|
186
191
|
|
|
187
|
-
|
|
188
|
-
// This assumes the test runner is installed as a dependency
|
|
189
|
-
let runnerImportPath = "fragment-ts/testing";
|
|
192
|
+
let runnerImportPath = "fragment-ts";
|
|
190
193
|
|
|
191
|
-
// Try to find the local test runner first for development
|
|
192
194
|
const possiblePaths = [
|
|
193
195
|
path.join(process.cwd(), "node_modules", "fragment-ts", "testing"),
|
|
194
196
|
path.join(
|
|
@@ -198,7 +200,7 @@ export class TestCommand {
|
|
|
198
200
|
"dist",
|
|
199
201
|
"testing",
|
|
200
202
|
),
|
|
201
|
-
path.join(__dirname, "..", "..", "testing"),
|
|
203
|
+
path.join(__dirname, "..", "..", "testing"),
|
|
202
204
|
];
|
|
203
205
|
|
|
204
206
|
let resolvedRunnerPath = runnerImportPath;
|
|
@@ -215,11 +217,9 @@ export class TestCommand {
|
|
|
215
217
|
${useTypeScript ? "require('ts-node/register/transpile-only');" : ""}
|
|
216
218
|
require('reflect-metadata');
|
|
217
219
|
|
|
218
|
-
// Set environment
|
|
219
220
|
process.env.NODE_ENV = 'test';
|
|
220
221
|
${noColor ? "process.env.FORCE_COLOR = '0';" : "process.env.FORCE_COLOR = '1';"}
|
|
221
222
|
|
|
222
|
-
// Set up TypeScript config if available
|
|
223
223
|
${
|
|
224
224
|
hasTsConfig && useTypeScript
|
|
225
225
|
? `
|
|
@@ -235,18 +235,14 @@ try {
|
|
|
235
235
|
skipLibCheck: true
|
|
236
236
|
}
|
|
237
237
|
});
|
|
238
|
-
} catch (error) {
|
|
239
|
-
// Ignore, ts-node might not be available
|
|
240
|
-
}`
|
|
238
|
+
} catch (error) {}`
|
|
241
239
|
: ""
|
|
242
240
|
}
|
|
243
241
|
|
|
244
242
|
let testRunner;
|
|
245
243
|
try {
|
|
246
|
-
// Try to import the test runner
|
|
247
244
|
const testModule = require('${resolvedRunnerPath}');
|
|
248
245
|
|
|
249
|
-
// Handle different export patterns
|
|
250
246
|
if (testModule.getTestRunner) {
|
|
251
247
|
testRunner = testModule.getTestRunner();
|
|
252
248
|
} else if (testModule.TestRunner) {
|
|
@@ -254,7 +250,6 @@ try {
|
|
|
254
250
|
} else if (testModule.default && testModule.default.getTestRunner) {
|
|
255
251
|
testRunner = testModule.default.getTestRunner();
|
|
256
252
|
} else {
|
|
257
|
-
// Fallback to creating a new instance
|
|
258
253
|
testRunner = testModule;
|
|
259
254
|
}
|
|
260
255
|
} catch (error) {
|
|
@@ -266,35 +261,18 @@ try {
|
|
|
266
261
|
async function runTests() {
|
|
267
262
|
try {
|
|
268
263
|
console.log('Looking for test files...');
|
|
269
|
-
|
|
270
|
-
// Load test files with the runner
|
|
271
264
|
await testRunner.loadTestFiles('${basePath}/${pattern}');
|
|
272
|
-
|
|
273
|
-
// Run tests
|
|
274
265
|
await testRunner.run();
|
|
275
266
|
} catch (error) {
|
|
276
267
|
console.error('\\nā Error running tests:', error.message);
|
|
277
|
-
|
|
278
|
-
if (error.stack && process.env.DEBUG) {
|
|
279
|
-
console.error(error.stack);
|
|
280
|
-
}
|
|
281
|
-
|
|
268
|
+
if (error.stack && process.env.DEBUG) console.error(error.stack);
|
|
282
269
|
process.exit(1);
|
|
283
270
|
}
|
|
284
271
|
}
|
|
285
272
|
|
|
286
|
-
|
|
287
|
-
process.on('
|
|
288
|
-
console.log('\\n\\nTest run interrupted');
|
|
289
|
-
process.exit(130);
|
|
290
|
-
});
|
|
291
|
-
|
|
292
|
-
process.on('SIGTERM', () => {
|
|
293
|
-
console.log('\\n\\nTest run terminated');
|
|
294
|
-
process.exit(143);
|
|
295
|
-
});
|
|
273
|
+
process.on('SIGINT', () => { console.log('\\n\\nTest run interrupted'); process.exit(130); });
|
|
274
|
+
process.on('SIGTERM', () => { console.log('\\n\\nTest run terminated'); process.exit(143); });
|
|
296
275
|
|
|
297
|
-
// Run the tests
|
|
298
276
|
runTests().catch(error => {
|
|
299
277
|
console.error('Unhandled error:', error);
|
|
300
278
|
process.exit(1);
|