velocious 1.0.1 → 1.0.3
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/README.md +36 -0
- package/bin/velocious.mjs +8 -0
- package/index.mjs +21 -0
- package/package.json +15 -7
- package/peak_flow.yml +12 -5
- package/spec/cli/commands/db/create-spec.mjs +25 -0
- package/spec/cli/commands/db/migrate-spec.mjs +37 -0
- package/spec/cli/commands/destroy/migration-spec.mjs +15 -0
- package/spec/cli/commands/generate/migration-spec.mjs +18 -0
- package/spec/cli/commands/init-spec.mjs +19 -0
- package/spec/cli/commands/test/test-files-finder-spec.mjs +12 -0
- package/spec/database/connection/drivers/mysql/{query-parser-spec.cjs → query-parser-spec.mjs} +12 -8
- package/spec/database/drivers/mysql/connection-spec.mjs +21 -0
- package/spec/database/record/create-spec.mjs +14 -0
- package/spec/database/record/destroy-spec.mjs +17 -0
- package/spec/database/record/find-spec.mjs +29 -0
- package/spec/database/record/update-spec.mjs +15 -0
- package/spec/dummy/dummy-directory.mjs +11 -0
- package/spec/dummy/index.mjs +63 -0
- package/spec/dummy/src/config/configuration.example.mjs +19 -0
- package/spec/dummy/src/config/configuration.peakflow.mjs +20 -0
- package/spec/dummy/src/{routes.cjs → config/routes.mjs} +3 -2
- package/spec/dummy/src/database/migrations/20230728075328-create-projects.mjs +11 -0
- package/spec/dummy/src/database/migrations/20230728075329-create-tasks.mjs +13 -0
- package/spec/dummy/src/models/task.mjs +4 -0
- package/spec/dummy/src/routes/tasks/controller.mjs +26 -0
- package/spec/http-server/{client-spec.cjs → client-spec.mjs} +7 -10
- package/spec/http-server/{get-spec.cjs → get-spec.mjs} +2 -2
- package/spec/http-server/post-spec.mjs +72 -0
- package/spec/support/jasmine.json +4 -3
- package/src/application.mjs +50 -0
- package/src/cli/base-command.mjs +11 -0
- package/src/cli/commands/db/create.mjs +50 -0
- package/src/cli/commands/db/migrate.mjs +58 -0
- package/src/cli/commands/destroy/migration.mjs +35 -0
- package/src/cli/commands/generate/migration.mjs +36 -0
- package/src/cli/commands/init.mjs +60 -0
- package/src/cli/commands/test/index.mjs +14 -0
- package/src/cli/commands/test/test-files-finder.mjs +99 -0
- package/src/cli/commands/test/test-runner.mjs +19 -0
- package/src/cli/index.mjs +59 -0
- package/src/configuration-resolver.mjs +26 -0
- package/src/configuration.mjs +49 -0
- package/src/{controller.cjs → controller.mjs} +21 -4
- package/src/database/drivers/base.mjs +17 -0
- package/src/database/drivers/index.mjs +5 -0
- package/src/database/drivers/mysql/connect-connection.mjs +12 -0
- package/src/database/drivers/mysql/index.mjs +102 -0
- package/src/database/drivers/mysql/options.mjs +17 -0
- package/src/database/drivers/mysql/query-parser.mjs +25 -0
- package/src/database/drivers/mysql/query.mjs +26 -0
- package/src/database/drivers/mysql/sql/create-database.mjs +4 -0
- package/src/database/drivers/mysql/sql/create-table.mjs +4 -0
- package/src/database/drivers/mysql/sql/delete.mjs +19 -0
- package/src/database/drivers/mysql/sql/insert.mjs +29 -0
- package/src/database/drivers/mysql/sql/update.mjs +31 -0
- package/src/database/drivers/sqlite/options.mjs +17 -0
- package/src/database/drivers/sqlite/query-parser.mjs +25 -0
- package/src/database/drivers/sqlite/sql/create-database.mjs +4 -0
- package/src/database/drivers/sqlite/sql/create-table.mjs +4 -0
- package/src/database/drivers/sqlite/sql/delete.mjs +19 -0
- package/src/database/drivers/sqlite/sql/insert.mjs +29 -0
- package/src/database/drivers/sqlite/sql/update.mjs +31 -0
- package/src/database/drivers/sqlite-expo/index.mjs +100 -0
- package/src/database/drivers/sqlite-expo/query.mjs +9 -0
- package/src/database/handler.mjs +7 -0
- package/src/database/index.mjs +15 -0
- package/src/database/migration/index.mjs +18 -0
- package/src/database/migrator/index.mjs +15 -0
- package/src/database/pool/index.mjs +112 -0
- package/src/database/query/base.mjs +11 -0
- package/src/database/query/create-database-base.mjs +20 -0
- package/src/database/query/create-table-base.mjs +69 -0
- package/src/database/query/delete-base.mjs +9 -0
- package/src/database/query/from-base.mjs +9 -0
- package/src/database/query/from-plain.mjs +10 -0
- package/src/database/query/from-table.mjs +12 -0
- package/src/database/query/index.mjs +144 -0
- package/src/database/query/insert-base.mjs +15 -0
- package/src/database/query/join-base.mjs +9 -0
- package/src/database/query/join-plain.mjs +12 -0
- package/src/database/query/order-base.mjs +9 -0
- package/src/database/query/order-plain.mjs +21 -0
- package/src/database/query/select-base.mjs +9 -0
- package/src/database/query/select-plain.mjs +12 -0
- package/src/database/query/{select-table-and-column.cjs → select-table-and-column.mjs} +4 -4
- package/src/database/query/update-base.mjs +16 -0
- package/src/database/query-parser/{from-parser.cjs → from-parser.mjs} +3 -6
- package/src/database/query-parser/{joins-parser.cjs → joins-parser.mjs} +3 -6
- package/src/database/query-parser/{options.cjs → options.mjs} +13 -2
- package/src/database/query-parser/{select-parser.cjs → select-parser.mjs} +7 -6
- package/src/database/record/index.mjs +187 -0
- package/src/database/record/record-not-found-error.mjs +1 -0
- package/src/database/table-data/index.mjs +83 -0
- package/src/{error-logger.js → error-logger.mjs} +1 -1
- package/src/http-server/client/{index.cjs → index.mjs} +10 -11
- package/src/http-server/client/params-to-object.mjs +68 -0
- package/src/http-server/client/request-buffer/form-data-part.mjs +42 -0
- package/src/http-server/client/request-buffer/header.mjs +7 -0
- package/src/http-server/client/request-buffer/index.mjs +229 -0
- package/src/http-server/client/request-parser.mjs +47 -0
- package/src/http-server/client/{request-runner.cjs → request-runner.mjs} +5 -5
- package/src/http-server/client/request.mjs +15 -0
- package/src/http-server/client/{response.cjs → response.mjs} +1 -1
- package/src/http-server/index.mjs +137 -0
- package/src/http-server/server-client.mjs +47 -0
- package/src/http-server/worker-handler/index.mjs +79 -0
- package/src/http-server/worker-handler/worker-script.mjs +4 -0
- package/src/http-server/worker-handler/worker-thread.mjs +65 -0
- package/src/{logger.cjs → logger.mjs} +2 -2
- package/src/routes/base-route.mjs +34 -0
- package/src/routes/{get-route.cjs → get-route.mjs} +5 -3
- package/src/routes/index.mjs +9 -0
- package/src/routes/{resolver.cjs → resolver.mjs} +17 -9
- package/src/routes/{resource-route.cjs → resource-route.mjs} +9 -5
- package/src/routes/root-route.mjs +6 -0
- package/src/spec/index.mjs +5 -0
- package/src/templates/configuration.mjs +17 -0
- package/src/templates/generate-migration.mjs +11 -0
- package/src/templates/routes.mjs +11 -0
- package/src/utils/file-exists.mjs +13 -0
- package/bin/velocious +0 -14
- package/index.cjs +0 -13
- package/spec/dummy/config/databases.example.json +0 -10
- package/spec/dummy/config/databases.json +0 -0
- package/spec/dummy/config/databases.peakflow.json +0 -11
- package/spec/dummy/index.cjs +0 -40
- package/spec/dummy/src/models/task.cjs +0 -4
- package/spec/dummy/src/routes/tasks/controller.cjs +0 -18
- package/src/application.cjs +0 -36
- package/src/configuration.cjs +0 -14
- package/src/database/connection/drivers/mysql/index.cjs +0 -5
- package/src/database/connection/drivers/mysql/options.cjs +0 -7
- package/src/database/connection/drivers/mysql/query-parser.cjs +0 -26
- package/src/database/connection/index.cjs +0 -2
- package/src/database/handler.cjs +0 -5
- package/src/database/index.cjs +0 -9
- package/src/database/pool/index.cjs +0 -2
- package/src/database/query/from-base.cjs +0 -15
- package/src/database/query/from-plain.cjs +0 -12
- package/src/database/query/from-table.cjs +0 -12
- package/src/database/query/index.cjs +0 -59
- package/src/database/query/join-base.cjs +0 -15
- package/src/database/query/join-plain.cjs +0 -12
- package/src/database/query/select-base.cjs +0 -15
- package/src/database/query/select-plain.cjs +0 -12
- package/src/database/record/index.cjs +0 -5
- package/src/http-server/client/request-parser.cjs +0 -92
- package/src/http-server/client/request.cjs +0 -25
- package/src/http-server/index.cjs +0 -78
- package/src/http-server/worker-handler/index.cjs +0 -78
- package/src/http-server/worker-handler/socket-handler.cjs +0 -35
- package/src/http-server/worker-handler/worker-script.cjs +0 -4
- package/src/http-server/worker-handler/worker-thread.cjs +0 -49
- package/src/routes/base-route.cjs +0 -25
- package/src/routes/index.cjs +0 -9
- package/src/routes/root-route.cjs +0 -4
package/README.md
ADDED
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
# README
|
|
2
|
+
|
|
3
|
+
This is still work in progress.
|
|
4
|
+
|
|
5
|
+
* Concurrent multi threadded web server
|
|
6
|
+
* Database framework ala Rails
|
|
7
|
+
* Database models ala Rails
|
|
8
|
+
* Database models that work almost the same in frontend and backend
|
|
9
|
+
* Migrations ala Rails
|
|
10
|
+
* Controllers and views ala Rails
|
|
11
|
+
|
|
12
|
+
# Setup
|
|
13
|
+
|
|
14
|
+
Make a new NPM project.
|
|
15
|
+
```bash
|
|
16
|
+
mkdir project
|
|
17
|
+
cd project
|
|
18
|
+
npm install velocious
|
|
19
|
+
npx velocious init
|
|
20
|
+
```
|
|
21
|
+
|
|
22
|
+
# Migrations
|
|
23
|
+
|
|
24
|
+
```bash
|
|
25
|
+
npx velocious db:g:migration create_tasks
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
```bash
|
|
29
|
+
npx velocious db:migrate
|
|
30
|
+
```
|
|
31
|
+
|
|
32
|
+
# Testing
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm test
|
|
36
|
+
```
|
package/index.mjs
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import Application from "./src/application.mjs"
|
|
2
|
+
import Cli from "./src/cli/index.mjs"
|
|
3
|
+
import Configuration from "./src/configuration.mjs"
|
|
4
|
+
import Controller from "./src/controller.mjs"
|
|
5
|
+
import Database from "./src/database/index.mjs"
|
|
6
|
+
import DatabasePool from "./src/database/pool/index.mjs"
|
|
7
|
+
import HttpServer from "./src/http-server/index.mjs"
|
|
8
|
+
import Routes from "./src/routes/index.mjs"
|
|
9
|
+
import Spec from "./src/spec/index.mjs"
|
|
10
|
+
|
|
11
|
+
export {
|
|
12
|
+
Application,
|
|
13
|
+
Cli,
|
|
14
|
+
Configuration,
|
|
15
|
+
Controller,
|
|
16
|
+
Database,
|
|
17
|
+
DatabasePool,
|
|
18
|
+
HttpServer,
|
|
19
|
+
Routes,
|
|
20
|
+
Spec
|
|
21
|
+
}
|
package/package.json
CHANGED
|
@@ -1,10 +1,15 @@
|
|
|
1
1
|
{
|
|
2
|
+
"bin": {
|
|
3
|
+
"velocious": "bin/velocious.mjs"
|
|
4
|
+
},
|
|
2
5
|
"name": "velocious",
|
|
3
|
-
"version": "1.0.
|
|
4
|
-
"main": "index.
|
|
6
|
+
"version": "1.0.3",
|
|
7
|
+
"main": "index.mjs",
|
|
5
8
|
"scripts": {
|
|
6
|
-
"test": "jasmine"
|
|
9
|
+
"test": "jasmine",
|
|
10
|
+
"velocious": "asd"
|
|
7
11
|
},
|
|
12
|
+
"type": "module",
|
|
8
13
|
"repository": {
|
|
9
14
|
"type": "git",
|
|
10
15
|
"url": "git+https://github.com/kaspernj/velocious.git"
|
|
@@ -17,13 +22,16 @@
|
|
|
17
22
|
"homepage": "https://github.com/kaspernj/velocious#readme",
|
|
18
23
|
"description": "",
|
|
19
24
|
"devDependencies": {
|
|
20
|
-
"jasmine": "^
|
|
21
|
-
"
|
|
25
|
+
"jasmine": "^5.0.2",
|
|
26
|
+
"mysql": "^2.18.1",
|
|
27
|
+
"node-fetch": "^3.3.1"
|
|
22
28
|
},
|
|
23
29
|
"dependencies": {
|
|
24
|
-
"diggerize": "^1.0.
|
|
30
|
+
"diggerize": "^1.0.5",
|
|
25
31
|
"ejs": "^3.1.6",
|
|
26
32
|
"escape-string-regexp": "^1.0.5",
|
|
27
|
-
"
|
|
33
|
+
"incorporator": "^1.0.2",
|
|
34
|
+
"inflection": "^3.0.0",
|
|
35
|
+
"strftime": "^0.10.2"
|
|
28
36
|
}
|
|
29
37
|
}
|
package/peak_flow.yml
CHANGED
|
@@ -1,17 +1,24 @@
|
|
|
1
|
+
before_install:
|
|
2
|
+
- sudo mkdir -p /etc/apt/keyrings
|
|
3
|
+
- curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg
|
|
4
|
+
- echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list
|
|
5
|
+
- sudo apt-get update
|
|
6
|
+
- sudo apt-get install -y nodejs
|
|
1
7
|
before_script:
|
|
2
|
-
- cp spec/dummy/config/
|
|
8
|
+
- cp spec/dummy/src/config/configuration.peakflow.mjs spec/dummy/src/config/configuration.mjs
|
|
3
9
|
- npm install
|
|
4
|
-
- wait-for-it
|
|
10
|
+
- wait-for-it mariadb:3306
|
|
5
11
|
services:
|
|
6
|
-
|
|
12
|
+
mariadb:
|
|
7
13
|
environment:
|
|
8
14
|
MYSQL_USER: peakflow
|
|
9
15
|
MYSQL_PASSWORD: password
|
|
10
16
|
MYSQL_ROOT_PASSWORD: password
|
|
11
17
|
MYSQL_DATABASE: velocious_test
|
|
12
|
-
image:
|
|
18
|
+
image: mariadb:latest
|
|
13
19
|
expose:
|
|
14
20
|
- 3306
|
|
15
|
-
mem_limit:
|
|
21
|
+
mem_limit: 4096m
|
|
22
|
+
restart_policy: on-failure
|
|
16
23
|
script:
|
|
17
24
|
- npm test
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import Cli from "../../../../src/cli/index.mjs"
|
|
2
|
+
import dummyDirectory from "../../../dummy/dummy-directory.mjs"
|
|
3
|
+
|
|
4
|
+
describe("Cli - Commands - db:create", () => {
|
|
5
|
+
it("generates SQL to create a new database", async () => {
|
|
6
|
+
const cli = new Cli({
|
|
7
|
+
directory: dummyDirectory(),
|
|
8
|
+
processArgs: ["db:create"],
|
|
9
|
+
testing: true
|
|
10
|
+
})
|
|
11
|
+
const result = await cli.execute()
|
|
12
|
+
|
|
13
|
+
expect(result).toEqual(
|
|
14
|
+
[
|
|
15
|
+
{
|
|
16
|
+
databaseName: 'velocious_test',
|
|
17
|
+
sql: 'CREATE DATABASE IF NOT EXISTS velocious_test'
|
|
18
|
+
},
|
|
19
|
+
{
|
|
20
|
+
createSchemaMigrationsTableSql: 'CREATE TABLE IF NOT EXISTS schema_migrations (`version` varchar(255) PRIMARY KEY)'
|
|
21
|
+
}
|
|
22
|
+
]
|
|
23
|
+
)
|
|
24
|
+
})
|
|
25
|
+
})
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import Cli from "../../../../src/cli/index.mjs"
|
|
2
|
+
import dummyDirectory from "../../../dummy/dummy-directory.mjs"
|
|
3
|
+
|
|
4
|
+
describe("Cli - Commands - db:migrate", () => {
|
|
5
|
+
it("runs migrations", async () => {
|
|
6
|
+
const directory = dummyDirectory()
|
|
7
|
+
const cli = new Cli({
|
|
8
|
+
directory,
|
|
9
|
+
processArgs: ["db:migrate"],
|
|
10
|
+
testing: true
|
|
11
|
+
})
|
|
12
|
+
|
|
13
|
+
await cli.loadConfiguration()
|
|
14
|
+
|
|
15
|
+
const db = cli.configuration.getDatabasePool()
|
|
16
|
+
|
|
17
|
+
await db.withConnection(async () => {
|
|
18
|
+
await db.query("DROP TABLE IF EXISTS tasks")
|
|
19
|
+
await db.query("DROP TABLE IF EXISTS projects")
|
|
20
|
+
})
|
|
21
|
+
|
|
22
|
+
await cli.execute()
|
|
23
|
+
|
|
24
|
+
let tablesResult
|
|
25
|
+
|
|
26
|
+
await db.withConnection(async () => {
|
|
27
|
+
tablesResult = await db.query("SHOW TABLES")
|
|
28
|
+
})
|
|
29
|
+
|
|
30
|
+
expect(tablesResult).toEqual(
|
|
31
|
+
[
|
|
32
|
+
{Tables_in_velocious_test: "projects"},
|
|
33
|
+
{Tables_in_velocious_test: "tasks"}
|
|
34
|
+
]
|
|
35
|
+
)
|
|
36
|
+
})
|
|
37
|
+
})
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import Cli from "../../../../src/cli/index.mjs"
|
|
2
|
+
import dummyDirectory from "../../../dummy/dummy-directory.mjs"
|
|
3
|
+
|
|
4
|
+
describe("Cli - destroy - migration", () => {
|
|
5
|
+
it("destroys an existing migration", async () => {
|
|
6
|
+
const cli = new Cli({
|
|
7
|
+
directory: dummyDirectory(),
|
|
8
|
+
processArgs: ["d:migration", "create-tasks"],
|
|
9
|
+
testing: true
|
|
10
|
+
})
|
|
11
|
+
const result = await cli.execute()
|
|
12
|
+
|
|
13
|
+
expect(result.destroyed).toEqual(["create-tasks"])
|
|
14
|
+
})
|
|
15
|
+
})
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import Cli from "../../../../src/cli/index.mjs"
|
|
2
|
+
import dummyDirectory from "../../../dummy/dummy-directory.mjs"
|
|
3
|
+
|
|
4
|
+
describe("Cli - generate - migration", () => {
|
|
5
|
+
it("generates a new migration", async () => {
|
|
6
|
+
const cli = new Cli({
|
|
7
|
+
directory: dummyDirectory(),
|
|
8
|
+
processArgs: ["g:migration", "create-tasks"],
|
|
9
|
+
testing: true
|
|
10
|
+
})
|
|
11
|
+
const result = await cli.execute()
|
|
12
|
+
|
|
13
|
+
expect(result.migrationName).toEqual("create-tasks")
|
|
14
|
+
expect(result.migrationNameCamelized).toEqual("CreateTasks")
|
|
15
|
+
expect(result.migrationNumber).toMatch(/^\d+$/)
|
|
16
|
+
expect(result.migrationPath).toMatch(/-create-tasks\.mjs$/)
|
|
17
|
+
})
|
|
18
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import Cli from "../../../src/cli/index.mjs"
|
|
2
|
+
import dummyDirectory from "../../dummy/dummy-directory.mjs"
|
|
3
|
+
|
|
4
|
+
describe("Cli - Commands - init", () => {
|
|
5
|
+
it("inits files and dirs", async () => {
|
|
6
|
+
const cli = new Cli({
|
|
7
|
+
directory: dummyDirectory(),
|
|
8
|
+
processArgs: ["init"],
|
|
9
|
+
testing: true
|
|
10
|
+
})
|
|
11
|
+
const result = await cli.execute()
|
|
12
|
+
|
|
13
|
+
expect(result.fileMappings.length).toEqual(2)
|
|
14
|
+
expect(result.fileMappings[0].source).toContain("/src/templates/configuration.mjs")
|
|
15
|
+
expect(result.fileMappings[0].target).toContain("/spec/dummy/src/config/configuration.mjs")
|
|
16
|
+
expect(result.fileMappings[1].source).toContain("/src/templates/routes.mjs")
|
|
17
|
+
expect(result.fileMappings[1].target).toContain("/spec/dummy/src/config/routes.mjs")
|
|
18
|
+
})
|
|
19
|
+
})
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import TestFilesFinder from "../../../../src/cli/commands/test/test-files-finder.mjs"
|
|
2
|
+
|
|
3
|
+
describe("Cli - Commands - test - TestFilesFinder", () => {
|
|
4
|
+
it("finds the correct test files", async () => {
|
|
5
|
+
const testFilesFinder = new TestFilesFinder({directory: process.cwd(), processArgs: ["test"]})
|
|
6
|
+
const testFiles = await testFilesFinder.findTestFiles()
|
|
7
|
+
|
|
8
|
+
const sampleTestFilePath = `${process.cwd()}/spec/cli/commands/destroy/migration-spec.mjs`
|
|
9
|
+
|
|
10
|
+
expect(testFiles.includes(sampleTestFilePath)).toBe(true)
|
|
11
|
+
})
|
|
12
|
+
})
|
package/spec/database/connection/drivers/mysql/{query-parser-spec.cjs → query-parser-spec.mjs}
RENAMED
|
@@ -1,13 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
1
|
+
import Database from "../../../../../src/database/index.mjs"
|
|
2
|
+
import MysqlQueryParser from "../../../../../src/database/drivers/mysql/query-parser.mjs"
|
|
3
3
|
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
import FromTable from "../../../../../src/database/query/from-table.mjs"
|
|
5
|
+
import SelectTableAndColumn from "../../../../../src/database/query/select-table-and-column.mjs"
|
|
6
|
+
|
|
7
|
+
import MysqlDriverClass from "../../../../../src/database/drivers/mysql/index.mjs"
|
|
8
|
+
|
|
9
|
+
const mysqlDriver = new MysqlDriverClass()
|
|
6
10
|
|
|
7
11
|
describe("database - connection - drivers - mysql - query parser", () => {
|
|
8
12
|
it("generates sql with selects, joins and orders", () => {
|
|
9
|
-
const handler = new Handler()
|
|
10
|
-
const query = new Query({handler})
|
|
13
|
+
const handler = new Database.Handler()
|
|
14
|
+
const query = new Database.Query({driver: mysqlDriver, handler})
|
|
11
15
|
.select(["tasks.id", "tasks.name"])
|
|
12
16
|
.from("tasks")
|
|
13
17
|
.joins("LEFT JOIN projects ON projects.id = tasks.project_id")
|
|
@@ -18,8 +22,8 @@ describe("database - connection - drivers - mysql - query parser", () => {
|
|
|
18
22
|
})
|
|
19
23
|
|
|
20
24
|
it("generates sql with selects, joins and orders", () => {
|
|
21
|
-
const handler = new Handler()
|
|
22
|
-
const query = new Query({handler})
|
|
25
|
+
const handler = new Database.Handler()
|
|
26
|
+
const query = new Database.Query({driver: mysqlDriver, handler})
|
|
23
27
|
.select([
|
|
24
28
|
new SelectTableAndColumn({tableName: "tasks", columnName: "id"}),
|
|
25
29
|
new SelectTableAndColumn({tableName: "tasks", columnName: "name"})
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import Database from "../../../../src/database/index.mjs"
|
|
2
|
+
import configuration from "../../../dummy/src/config/configuration.mjs"
|
|
3
|
+
import {digg} from "diggerize"
|
|
4
|
+
|
|
5
|
+
const mysqlConfig = digg(configuration, "database", "default", "master")
|
|
6
|
+
const Mysql = Database.Drivers.Mysql
|
|
7
|
+
|
|
8
|
+
describe("Database - Drivers - Mysql - Connection", () => {
|
|
9
|
+
it("connects", async () => {
|
|
10
|
+
const mysql = new Mysql(mysqlConfig)
|
|
11
|
+
|
|
12
|
+
await mysql.connect()
|
|
13
|
+
|
|
14
|
+
const result = await mysql.query("SELECT \"1\" AS test1, \"2\" AS test2")
|
|
15
|
+
|
|
16
|
+
expect(result).toEqual([{
|
|
17
|
+
test1: "1",
|
|
18
|
+
test2: "2"
|
|
19
|
+
}])
|
|
20
|
+
})
|
|
21
|
+
})
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import Dummy from "../../dummy/index.mjs"
|
|
2
|
+
import Task from "../../dummy/src/models/task.mjs"
|
|
3
|
+
|
|
4
|
+
describe("Record - create", () => {
|
|
5
|
+
it("creates a new simple record", async () => {
|
|
6
|
+
await Dummy.run(async () => {
|
|
7
|
+
const task = new Task({name: "Test task"})
|
|
8
|
+
|
|
9
|
+
await task.save()
|
|
10
|
+
|
|
11
|
+
expect(task.id()).not.toBeUndefined()
|
|
12
|
+
})
|
|
13
|
+
})
|
|
14
|
+
})
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import Dummy from "../../dummy/index.mjs"
|
|
2
|
+
import Task from "../../dummy/src/models/task.mjs"
|
|
3
|
+
|
|
4
|
+
describe("Record - destroy", () => {
|
|
5
|
+
it("destroys a record", async () => {
|
|
6
|
+
await Dummy.run(async () => {
|
|
7
|
+
const task = new Task({name: "Test task"})
|
|
8
|
+
|
|
9
|
+
await task.save()
|
|
10
|
+
await task.destroy()
|
|
11
|
+
|
|
12
|
+
const foundTask = await Task.where({id: task.id()}).first()
|
|
13
|
+
|
|
14
|
+
expect(foundTask).toEqual(undefined)
|
|
15
|
+
})
|
|
16
|
+
})
|
|
17
|
+
})
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import Dummy from "../../dummy/index.mjs"
|
|
2
|
+
import RecordNotFoundError from "../../../src/database/record/record-not-found-error.mjs"
|
|
3
|
+
import Task from "../../dummy/src/models/task.mjs"
|
|
4
|
+
|
|
5
|
+
describe("Record - find", () => {
|
|
6
|
+
it("finds an existing record", async () => {
|
|
7
|
+
await Dummy.run(async () => {
|
|
8
|
+
const task = new Task({name: "Test task"})
|
|
9
|
+
|
|
10
|
+
await task.save()
|
|
11
|
+
|
|
12
|
+
const foundTask = await Task.find(task.id())
|
|
13
|
+
|
|
14
|
+
expect(foundTask.readAttribute("name")).toEqual("Test task")
|
|
15
|
+
})
|
|
16
|
+
})
|
|
17
|
+
|
|
18
|
+
it("raises an error when a record isn't found", async () => {
|
|
19
|
+
await Dummy.run(async () => {
|
|
20
|
+
try {
|
|
21
|
+
await Task.find(123)
|
|
22
|
+
throw new Error("Didn't expect to reach this")
|
|
23
|
+
} catch (error) {
|
|
24
|
+
expect(error.message).toEqual("Couldn't find Task with 'id'=123")
|
|
25
|
+
expect(error.constructor.name).toEqual("RecordNotFoundError")
|
|
26
|
+
}
|
|
27
|
+
})
|
|
28
|
+
})
|
|
29
|
+
})
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import Dummy from "../../dummy/index.mjs"
|
|
2
|
+
import Task from "../../dummy/src/models/task.mjs"
|
|
3
|
+
|
|
4
|
+
describe("Record - update", () => {
|
|
5
|
+
it("updates a record", async () => {
|
|
6
|
+
await Dummy.run(async () => {
|
|
7
|
+
const task = new Task({name: "Test task"})
|
|
8
|
+
|
|
9
|
+
await task.save()
|
|
10
|
+
await task.update({name: "Updated name"})
|
|
11
|
+
|
|
12
|
+
expect(task.readAttribute("name")).toEqual("Updated name")
|
|
13
|
+
})
|
|
14
|
+
})
|
|
15
|
+
})
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import Application from "../../src/application.mjs"
|
|
2
|
+
import dummyConfiguration from "./src/config/configuration.mjs"
|
|
3
|
+
|
|
4
|
+
export default class Dummy {
|
|
5
|
+
static current() {
|
|
6
|
+
if (!global.velociousDummy) {
|
|
7
|
+
global.velociousDummy = new Dummy()
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
return global.velociousDummy
|
|
11
|
+
}
|
|
12
|
+
|
|
13
|
+
static async prepare() {
|
|
14
|
+
const db = dummyConfiguration.getDatabasePool()
|
|
15
|
+
|
|
16
|
+
await db.withConnection(async () => {
|
|
17
|
+
await db.query("DROP TABLE IF EXISTS tasks")
|
|
18
|
+
await db.query("CREATE TABLE tasks (id MEDIUMINT NOT NULL AUTO_INCREMENT, name VARCHAR(255), description TEXT, PRIMARY KEY (id))")
|
|
19
|
+
})
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
static async run(callback) {
|
|
23
|
+
await this.current().run(callback)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
async run(callback) {
|
|
27
|
+
await dummyConfiguration.getDatabasePool().withConnection(async () => {
|
|
28
|
+
await this.start()
|
|
29
|
+
|
|
30
|
+
try {
|
|
31
|
+
await Dummy.prepare()
|
|
32
|
+
await callback()
|
|
33
|
+
} finally {
|
|
34
|
+
await this.stop()
|
|
35
|
+
}
|
|
36
|
+
})
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
async start() {
|
|
40
|
+
if (!dummyConfiguration.isDatabasePoolInitialized()) await dummyConfiguration.initializeDatabasePool()
|
|
41
|
+
|
|
42
|
+
this.application = new Application({
|
|
43
|
+
configuration: dummyConfiguration,
|
|
44
|
+
databases: {
|
|
45
|
+
default: {
|
|
46
|
+
host: "mysql",
|
|
47
|
+
username: "user",
|
|
48
|
+
password: ""
|
|
49
|
+
}
|
|
50
|
+
},
|
|
51
|
+
httpServer: {port: 3006}
|
|
52
|
+
})
|
|
53
|
+
|
|
54
|
+
await this.application.initialize()
|
|
55
|
+
await this.application.startHttpServer()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
async stop() {
|
|
59
|
+
if (this.application.isActive()) {
|
|
60
|
+
await this.application.stop()
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import Configuration from "../../../../src/configuration.mjs"
|
|
2
|
+
import dummyDirectory from "../../dummy-directory.mjs"
|
|
3
|
+
|
|
4
|
+
const configuration = new Configuration({
|
|
5
|
+
database: {
|
|
6
|
+
default: {
|
|
7
|
+
master: {
|
|
8
|
+
type: "mysql",
|
|
9
|
+
host: "mariadb",
|
|
10
|
+
username: "username",
|
|
11
|
+
password: "password",
|
|
12
|
+
database: "velocious_test"
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
},
|
|
16
|
+
directory: dummyDirectory()
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
export default configuration
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import Configuration from "../../../../src/configuration.mjs"
|
|
2
|
+
import dummyDirectory from "../../dummy-directory.mjs"
|
|
3
|
+
|
|
4
|
+
const configuration = new Configuration({
|
|
5
|
+
database: {
|
|
6
|
+
default: {
|
|
7
|
+
master: {
|
|
8
|
+
type: "mysql",
|
|
9
|
+
host: "mariadb",
|
|
10
|
+
username: "peakflow",
|
|
11
|
+
password: "password",
|
|
12
|
+
database: "velocious_test",
|
|
13
|
+
useDatabase: "velocious_test"
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
},
|
|
17
|
+
directory: dummyDirectory()
|
|
18
|
+
})
|
|
19
|
+
|
|
20
|
+
export default configuration
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
|
|
1
|
+
import Routes from "../../../../src/routes/index.mjs"
|
|
2
|
+
|
|
2
3
|
const routes = new Routes()
|
|
3
4
|
|
|
4
5
|
routes.draw((route) => {
|
|
@@ -7,4 +8,4 @@ routes.draw((route) => {
|
|
|
7
8
|
})
|
|
8
9
|
})
|
|
9
10
|
|
|
10
|
-
|
|
11
|
+
export default {routes}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import Migration from "../../../../../src/database/migration/index.mjs"
|
|
2
|
+
|
|
3
|
+
export default class CreateProjects extends Migration {
|
|
4
|
+
async change() {
|
|
5
|
+
await this.createTable("projects", (table) => {
|
|
6
|
+
table.bigint("id", {autoIncrement: true, primaryKey: true})
|
|
7
|
+
table.string("name", {maxLength: 100, null: false})
|
|
8
|
+
table.timestamps()
|
|
9
|
+
})
|
|
10
|
+
}
|
|
11
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import Migration from "../../../../../src/database/migration/index.mjs"
|
|
2
|
+
|
|
3
|
+
export default class CreateTasks extends Migration {
|
|
4
|
+
async change() {
|
|
5
|
+
await this.createTable("tasks", (table) => {
|
|
6
|
+
table.bigint("id", {autoIncrement: true, primaryKey: true})
|
|
7
|
+
table.references("project")
|
|
8
|
+
table.string("name")
|
|
9
|
+
table.text("description")
|
|
10
|
+
table.timestamps()
|
|
11
|
+
})
|
|
12
|
+
}
|
|
13
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import Controller from "../../../../../src/controller.mjs"
|
|
2
|
+
import {digg} from "diggerize"
|
|
3
|
+
import Task from "../../models/task.mjs"
|
|
4
|
+
|
|
5
|
+
export default class TasksController extends Controller {
|
|
6
|
+
index() {
|
|
7
|
+
this.viewParams.numbers = [1, 2, 3, 4, 5]
|
|
8
|
+
this.render()
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
async show() {
|
|
12
|
+
const taskId = digg(params, "id")
|
|
13
|
+
const task = await Task.find(taskId)
|
|
14
|
+
|
|
15
|
+
this.viewParams.task = task
|
|
16
|
+
this.render()
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
async create() {
|
|
20
|
+
const task = new Task(this.params().task)
|
|
21
|
+
|
|
22
|
+
await task.save()
|
|
23
|
+
|
|
24
|
+
this.render({json: {status: "success"}})
|
|
25
|
+
}
|
|
26
|
+
}
|
|
@@ -1,17 +1,14 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const path = require("path")
|
|
1
|
+
import Client from "../../src/http-server/client/index.mjs"
|
|
2
|
+
import {digg} from "diggerize"
|
|
3
|
+
import dummyConfiguration from "../dummy/src/config/configuration.mjs"
|
|
5
4
|
|
|
6
5
|
describe("http server - client", () => {
|
|
7
|
-
it("spawns a request for each that it is fed", () => {
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
directory: dummyDirectory
|
|
11
|
-
})
|
|
6
|
+
it("spawns a request for each that it is fed", async () => {
|
|
7
|
+
await dummyConfiguration.initialize()
|
|
8
|
+
|
|
12
9
|
const client = new Client({
|
|
13
10
|
clientCount: 0,
|
|
14
|
-
configuration
|
|
11
|
+
configuration: dummyConfiguration
|
|
15
12
|
})
|
|
16
13
|
|
|
17
14
|
const strings = [
|