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.
Files changed (157) hide show
  1. package/README.md +36 -0
  2. package/bin/velocious.mjs +8 -0
  3. package/index.mjs +21 -0
  4. package/package.json +15 -7
  5. package/peak_flow.yml +12 -5
  6. package/spec/cli/commands/db/create-spec.mjs +25 -0
  7. package/spec/cli/commands/db/migrate-spec.mjs +37 -0
  8. package/spec/cli/commands/destroy/migration-spec.mjs +15 -0
  9. package/spec/cli/commands/generate/migration-spec.mjs +18 -0
  10. package/spec/cli/commands/init-spec.mjs +19 -0
  11. package/spec/cli/commands/test/test-files-finder-spec.mjs +12 -0
  12. package/spec/database/connection/drivers/mysql/{query-parser-spec.cjs → query-parser-spec.mjs} +12 -8
  13. package/spec/database/drivers/mysql/connection-spec.mjs +21 -0
  14. package/spec/database/record/create-spec.mjs +14 -0
  15. package/spec/database/record/destroy-spec.mjs +17 -0
  16. package/spec/database/record/find-spec.mjs +29 -0
  17. package/spec/database/record/update-spec.mjs +15 -0
  18. package/spec/dummy/dummy-directory.mjs +11 -0
  19. package/spec/dummy/index.mjs +63 -0
  20. package/spec/dummy/src/config/configuration.example.mjs +19 -0
  21. package/spec/dummy/src/config/configuration.peakflow.mjs +20 -0
  22. package/spec/dummy/src/{routes.cjs → config/routes.mjs} +3 -2
  23. package/spec/dummy/src/database/migrations/20230728075328-create-projects.mjs +11 -0
  24. package/spec/dummy/src/database/migrations/20230728075329-create-tasks.mjs +13 -0
  25. package/spec/dummy/src/models/task.mjs +4 -0
  26. package/spec/dummy/src/routes/tasks/controller.mjs +26 -0
  27. package/spec/http-server/{client-spec.cjs → client-spec.mjs} +7 -10
  28. package/spec/http-server/{get-spec.cjs → get-spec.mjs} +2 -2
  29. package/spec/http-server/post-spec.mjs +72 -0
  30. package/spec/support/jasmine.json +4 -3
  31. package/src/application.mjs +50 -0
  32. package/src/cli/base-command.mjs +11 -0
  33. package/src/cli/commands/db/create.mjs +50 -0
  34. package/src/cli/commands/db/migrate.mjs +58 -0
  35. package/src/cli/commands/destroy/migration.mjs +35 -0
  36. package/src/cli/commands/generate/migration.mjs +36 -0
  37. package/src/cli/commands/init.mjs +60 -0
  38. package/src/cli/commands/test/index.mjs +14 -0
  39. package/src/cli/commands/test/test-files-finder.mjs +99 -0
  40. package/src/cli/commands/test/test-runner.mjs +19 -0
  41. package/src/cli/index.mjs +59 -0
  42. package/src/configuration-resolver.mjs +26 -0
  43. package/src/configuration.mjs +49 -0
  44. package/src/{controller.cjs → controller.mjs} +21 -4
  45. package/src/database/drivers/base.mjs +17 -0
  46. package/src/database/drivers/index.mjs +5 -0
  47. package/src/database/drivers/mysql/connect-connection.mjs +12 -0
  48. package/src/database/drivers/mysql/index.mjs +102 -0
  49. package/src/database/drivers/mysql/options.mjs +17 -0
  50. package/src/database/drivers/mysql/query-parser.mjs +25 -0
  51. package/src/database/drivers/mysql/query.mjs +26 -0
  52. package/src/database/drivers/mysql/sql/create-database.mjs +4 -0
  53. package/src/database/drivers/mysql/sql/create-table.mjs +4 -0
  54. package/src/database/drivers/mysql/sql/delete.mjs +19 -0
  55. package/src/database/drivers/mysql/sql/insert.mjs +29 -0
  56. package/src/database/drivers/mysql/sql/update.mjs +31 -0
  57. package/src/database/drivers/sqlite/options.mjs +17 -0
  58. package/src/database/drivers/sqlite/query-parser.mjs +25 -0
  59. package/src/database/drivers/sqlite/sql/create-database.mjs +4 -0
  60. package/src/database/drivers/sqlite/sql/create-table.mjs +4 -0
  61. package/src/database/drivers/sqlite/sql/delete.mjs +19 -0
  62. package/src/database/drivers/sqlite/sql/insert.mjs +29 -0
  63. package/src/database/drivers/sqlite/sql/update.mjs +31 -0
  64. package/src/database/drivers/sqlite-expo/index.mjs +100 -0
  65. package/src/database/drivers/sqlite-expo/query.mjs +9 -0
  66. package/src/database/handler.mjs +7 -0
  67. package/src/database/index.mjs +15 -0
  68. package/src/database/migration/index.mjs +18 -0
  69. package/src/database/migrator/index.mjs +15 -0
  70. package/src/database/pool/index.mjs +112 -0
  71. package/src/database/query/base.mjs +11 -0
  72. package/src/database/query/create-database-base.mjs +20 -0
  73. package/src/database/query/create-table-base.mjs +69 -0
  74. package/src/database/query/delete-base.mjs +9 -0
  75. package/src/database/query/from-base.mjs +9 -0
  76. package/src/database/query/from-plain.mjs +10 -0
  77. package/src/database/query/from-table.mjs +12 -0
  78. package/src/database/query/index.mjs +144 -0
  79. package/src/database/query/insert-base.mjs +15 -0
  80. package/src/database/query/join-base.mjs +9 -0
  81. package/src/database/query/join-plain.mjs +12 -0
  82. package/src/database/query/order-base.mjs +9 -0
  83. package/src/database/query/order-plain.mjs +21 -0
  84. package/src/database/query/select-base.mjs +9 -0
  85. package/src/database/query/select-plain.mjs +12 -0
  86. package/src/database/query/{select-table-and-column.cjs → select-table-and-column.mjs} +4 -4
  87. package/src/database/query/update-base.mjs +16 -0
  88. package/src/database/query-parser/{from-parser.cjs → from-parser.mjs} +3 -6
  89. package/src/database/query-parser/{joins-parser.cjs → joins-parser.mjs} +3 -6
  90. package/src/database/query-parser/{options.cjs → options.mjs} +13 -2
  91. package/src/database/query-parser/{select-parser.cjs → select-parser.mjs} +7 -6
  92. package/src/database/record/index.mjs +187 -0
  93. package/src/database/record/record-not-found-error.mjs +1 -0
  94. package/src/database/table-data/index.mjs +83 -0
  95. package/src/{error-logger.js → error-logger.mjs} +1 -1
  96. package/src/http-server/client/{index.cjs → index.mjs} +10 -11
  97. package/src/http-server/client/params-to-object.mjs +68 -0
  98. package/src/http-server/client/request-buffer/form-data-part.mjs +42 -0
  99. package/src/http-server/client/request-buffer/header.mjs +7 -0
  100. package/src/http-server/client/request-buffer/index.mjs +229 -0
  101. package/src/http-server/client/request-parser.mjs +47 -0
  102. package/src/http-server/client/{request-runner.cjs → request-runner.mjs} +5 -5
  103. package/src/http-server/client/request.mjs +15 -0
  104. package/src/http-server/client/{response.cjs → response.mjs} +1 -1
  105. package/src/http-server/index.mjs +137 -0
  106. package/src/http-server/server-client.mjs +47 -0
  107. package/src/http-server/worker-handler/index.mjs +79 -0
  108. package/src/http-server/worker-handler/worker-script.mjs +4 -0
  109. package/src/http-server/worker-handler/worker-thread.mjs +65 -0
  110. package/src/{logger.cjs → logger.mjs} +2 -2
  111. package/src/routes/base-route.mjs +34 -0
  112. package/src/routes/{get-route.cjs → get-route.mjs} +5 -3
  113. package/src/routes/index.mjs +9 -0
  114. package/src/routes/{resolver.cjs → resolver.mjs} +17 -9
  115. package/src/routes/{resource-route.cjs → resource-route.mjs} +9 -5
  116. package/src/routes/root-route.mjs +6 -0
  117. package/src/spec/index.mjs +5 -0
  118. package/src/templates/configuration.mjs +17 -0
  119. package/src/templates/generate-migration.mjs +11 -0
  120. package/src/templates/routes.mjs +11 -0
  121. package/src/utils/file-exists.mjs +13 -0
  122. package/bin/velocious +0 -14
  123. package/index.cjs +0 -13
  124. package/spec/dummy/config/databases.example.json +0 -10
  125. package/spec/dummy/config/databases.json +0 -0
  126. package/spec/dummy/config/databases.peakflow.json +0 -11
  127. package/spec/dummy/index.cjs +0 -40
  128. package/spec/dummy/src/models/task.cjs +0 -4
  129. package/spec/dummy/src/routes/tasks/controller.cjs +0 -18
  130. package/src/application.cjs +0 -36
  131. package/src/configuration.cjs +0 -14
  132. package/src/database/connection/drivers/mysql/index.cjs +0 -5
  133. package/src/database/connection/drivers/mysql/options.cjs +0 -7
  134. package/src/database/connection/drivers/mysql/query-parser.cjs +0 -26
  135. package/src/database/connection/index.cjs +0 -2
  136. package/src/database/handler.cjs +0 -5
  137. package/src/database/index.cjs +0 -9
  138. package/src/database/pool/index.cjs +0 -2
  139. package/src/database/query/from-base.cjs +0 -15
  140. package/src/database/query/from-plain.cjs +0 -12
  141. package/src/database/query/from-table.cjs +0 -12
  142. package/src/database/query/index.cjs +0 -59
  143. package/src/database/query/join-base.cjs +0 -15
  144. package/src/database/query/join-plain.cjs +0 -12
  145. package/src/database/query/select-base.cjs +0 -15
  146. package/src/database/query/select-plain.cjs +0 -12
  147. package/src/database/record/index.cjs +0 -5
  148. package/src/http-server/client/request-parser.cjs +0 -92
  149. package/src/http-server/client/request.cjs +0 -25
  150. package/src/http-server/index.cjs +0 -78
  151. package/src/http-server/worker-handler/index.cjs +0 -78
  152. package/src/http-server/worker-handler/socket-handler.cjs +0 -35
  153. package/src/http-server/worker-handler/worker-script.cjs +0 -4
  154. package/src/http-server/worker-handler/worker-thread.cjs +0 -49
  155. package/src/routes/base-route.cjs +0 -25
  156. package/src/routes/index.cjs +0 -9
  157. 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
+ ```
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/node
2
+
3
+ import Cli from "../src/cli/index.mjs"
4
+
5
+ const processArgs = process.argv.slice(2)
6
+ const cli = new Cli({processArgs})
7
+
8
+ cli.execute()
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.1",
4
- "main": "index.cjs",
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": "^4.0.2",
21
- "node-fetch": "^2.6.1"
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.3",
30
+ "diggerize": "^1.0.5",
25
31
  "ejs": "^3.1.6",
26
32
  "escape-string-regexp": "^1.0.5",
27
- "inflection": "^1.13.2"
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/databases.peakflow.json spec/dummy/config/databases.json
8
+ - cp spec/dummy/src/config/configuration.peakflow.mjs spec/dummy/src/config/configuration.mjs
3
9
  - npm install
4
- - wait-for-it mysql:3306
10
+ - wait-for-it mariadb:3306
5
11
  services:
6
- mysql:
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: mysql:8.0.22
18
+ image: mariadb:latest
13
19
  expose:
14
20
  - 3306
15
- mem_limit: 2048m
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
+ })
@@ -1,13 +1,17 @@
1
- const {Database: {Handler, Query}} = require("../../../../../index.cjs")
2
- const MysqlQueryParser = require("../../../../../src/database/connection/drivers/mysql/query-parser.cjs")
1
+ import Database from "../../../../../src/database/index.mjs"
2
+ import MysqlQueryParser from "../../../../../src/database/drivers/mysql/query-parser.mjs"
3
3
 
4
- const FromTable = require("../../../../../src/database/query/from-table.cjs")
5
- const SelectTableAndColumn = require("../../../../../src/database/query/select-table-and-column.cjs")
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,11 @@
1
+ import {dirname} from "path"
2
+ import {fileURLToPath} from "url"
3
+
4
+ const dummyDirectory = () => {
5
+ const __filename = fileURLToPath(import.meta.url)
6
+ const __dirname = dirname(__filename)
7
+
8
+ return __dirname
9
+ }
10
+
11
+ export default dummyDirectory
@@ -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
- const Routes = require("../../../src/routes/index.cjs")
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
- module.exports = {routes}
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,4 @@
1
+ import Database from "../../../../src/database/index.mjs"
2
+
3
+ export default class Task extends Database.Record {
4
+ }
@@ -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
- const Client = require("../../src/http-server/client/index.cjs")
2
- const Configuration = require("../../src/configuration.cjs")
3
- const {digg} = require("diggerize")
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
- const dummyDirectory = path.join(__dirname, "../dummy")
9
- const configuration = new Configuration({
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 = [
@@ -1,5 +1,5 @@
1
- const fetch = require("node-fetch")
2
- const Dummy = require("../dummy/index.cjs")
1
+ import fetch from "node-fetch"
2
+ import Dummy from "../dummy/index.mjs"
3
3
 
4
4
  describe("HttpServer", () => {
5
5
  it("handles get requests", async () => {