@projectinvicta/nails 2.0.15 → 3.0.0

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 (123) hide show
  1. package/README.md +70 -84
  2. package/bin/test/test_init.sh +33 -0
  3. package/index.ts +11 -0
  4. package/lib/Controller.ts +207 -0
  5. package/lib/Nails.ts +210 -0
  6. package/lib/Router.ts +180 -0
  7. package/lib/{application.js → application.ts} +8 -3
  8. package/lib/config.ts +74 -0
  9. package/package.json +14 -11
  10. package/spec/controller.spec.js +5 -51
  11. package/spec/nails.spec.js +1 -0
  12. package/spec/router.spec.js +5 -5
  13. package/spec/services/integration/config/db.ts +7 -0
  14. package/spec/services/integration/config/service.js +8 -8
  15. package/spec/services/integration/server/controllers/classbased_controller.js +2 -2
  16. package/spec/services/integration/server/controllers/default_json_controller.js +19 -7
  17. package/spec/services/integration/server/controllers/error_controller.js +2 -2
  18. package/spec/services/integration/server/controllers/home_controller.js +6 -28
  19. package/spec/services/integration/server/controllers/json_controller.js +2 -2
  20. package/spec/services/integration/server/controllers/manualrenderasync_controller.js +2 -2
  21. package/spec/services/integration/server/controllers/mjs_controller.mjs +2 -6
  22. package/spec/services/integration/server/controllers/modeltest_controller.js +6 -9
  23. package/spec/services/integration/server/controllers/websocket_controller.js +1 -1
  24. package/spec/services/integration/server/models/dog.js +7 -5
  25. package/spec/services/integration/server/models/owner.js +13 -0
  26. package/spec/services/integration/server.js +3 -4
  27. package/spec/services.integration.spec.js +45 -17
  28. package/templates/default/config/db.ts +13 -0
  29. package/{spec/services/integration_sequelize/config/mimes.js → templates/default/config/mimes.ts} +42 -61
  30. package/templates/default/config/routes.ts +22 -0
  31. package/templates/{config/service.js → default/config/service.ts} +2 -2
  32. package/templates/default/package.json +8 -2
  33. package/templates/default/public/README.xml +68 -85
  34. package/templates/default/server/controllers/home_controller.js +2 -2
  35. package/templates/{server/controllers/home_controller.js → default/server/controllers/users_controller.ts} +29 -34
  36. package/templates/default/server/models/Dog.ts +8 -0
  37. package/templates/default/server/models/User.ts +14 -0
  38. package/templates/default/spec/User.test.js +7 -5
  39. package/templates/default/spec/home_controller.test.js +3 -3
  40. package/index.js +0 -6
  41. package/lib/collection.js +0 -6
  42. package/lib/controller.js +0 -182
  43. package/lib/database_connector.js +0 -12
  44. package/lib/firebase_connector.js +0 -94
  45. package/lib/model_v2.js +0 -24
  46. package/lib/mongoose_connector.js +0 -49
  47. package/lib/mongoose_mem_connector.js +0 -21
  48. package/lib/nails.js +0 -244
  49. package/lib/router.js +0 -202
  50. package/lib/sequelize_connector.js +0 -31
  51. package/lib/server.js +0 -1
  52. package/spec/model_v2.spec.js +0 -75
  53. package/spec/mongodb_connector.util.js +0 -30
  54. package/spec/mongoose_connector.util.js +0 -20
  55. package/spec/sequelize_connector.spec.js +0 -91
  56. package/spec/sequelize_connector.util.js +0 -18
  57. package/spec/services/integration/config/db.js +0 -14
  58. package/spec/services/integration_sequelize/README.md +0 -5
  59. package/spec/services/integration_sequelize/client/css/styles.css +0 -0
  60. package/spec/services/integration_sequelize/client/download.jpg +0 -0
  61. package/spec/services/integration_sequelize/client/favicon.ico +0 -0
  62. package/spec/services/integration_sequelize/client/index.html +0 -9
  63. package/spec/services/integration_sequelize/client/js/client.js +0 -0
  64. package/spec/services/integration_sequelize/client/js/components/app.jsx +0 -15
  65. package/spec/services/integration_sequelize/config/db.js +0 -4
  66. package/spec/services/integration_sequelize/config/routes.js +0 -25
  67. package/spec/services/integration_sequelize/config/service.js +0 -48
  68. package/spec/services/integration_sequelize/config/ssl/certificate.pem +0 -22
  69. package/spec/services/integration_sequelize/config/ssl/csr.csr +0 -17
  70. package/spec/services/integration_sequelize/config/ssl/key.pem +0 -28
  71. package/spec/services/integration_sequelize/config/ssl/private_key.pem +0 -30
  72. package/spec/services/integration_sequelize/config/ssl/public_key.pem +0 -9
  73. package/spec/services/integration_sequelize/package.json +0 -23
  74. package/spec/services/integration_sequelize/server/controllers/default_json_controller.js +0 -21
  75. package/spec/services/integration_sequelize/server/controllers/home_controller.js +0 -39
  76. package/spec/services/integration_sequelize/server/models/dog.js +0 -7
  77. package/spec/services/integration_sequelize/server/models/owner.js +0 -10
  78. package/spec/services/integration_sequelize/server/views/defaultjson/testnojson.ejs +0 -1
  79. package/spec/services/integration_sequelize/server/views/testreact/testreact.ejs +0 -15
  80. package/spec/services/integration_sequelize/server.js +0 -9
  81. package/spec/services.integration_sequelize.spec.js +0 -60
  82. package/templates/bin/promote.sh +0 -20
  83. package/templates/bin/rollout.sh +0 -74
  84. package/templates/bin/server.js +0 -6
  85. package/templates/bin/start.sh +0 -16
  86. package/templates/common/readme_fetcher.js +0 -4
  87. package/templates/config/db.js +0 -19
  88. package/templates/config/mimes.js +0 -59
  89. package/templates/config/routes.js +0 -38
  90. package/templates/config/ssl/certificate.pem +0 -22
  91. package/templates/config/ssl/csr.csr +0 -17
  92. package/templates/config/ssl/key.pem +0 -28
  93. package/templates/config/ssl/private_key.pem +0 -30
  94. package/templates/config/ssl/public_key.pem +0 -9
  95. package/templates/default/config/db.js +0 -19
  96. package/templates/default/config/mimes.js +0 -59
  97. package/templates/default/config/routes.js +0 -38
  98. package/templates/default/config/service.js +0 -45
  99. package/templates/default/server/models/User.js +0 -18
  100. package/templates/package-lock.json +0 -9048
  101. package/templates/package.json +0 -43
  102. package/templates/public/README.xml +0 -332
  103. package/templates/public/css/styles.css +0 -17
  104. package/templates/public/download.jpg +0 -0
  105. package/templates/public/favicon.ico +0 -0
  106. package/templates/public/index.html +0 -9
  107. package/templates/public/js/client.js +0 -1
  108. package/templates/server/models/User.js +0 -18
  109. package/templates/server/views/home/index.ejs +0 -14
  110. package/templates/server/views/partials/javascripts.ejs +0 -1
  111. package/templates/server/views/partials/reactapp.ejs +0 -1
  112. package/templates/server/views/partials/styles.ejs +0 -3
  113. package/templates/spec/User.test.js +0 -20
  114. package/templates/spec/home_controller.test.js +0 -28
  115. package/templates/spec/setupTests.js +0 -0
  116. package/templates/src/AboutPage.jsx +0 -9
  117. package/templates/src/HomePage.jsx +0 -9
  118. package/templates/src/Layout.jsx +0 -78
  119. package/templates/src/ReadmePage.jsx +0 -7
  120. package/templates/src/app.jsx +0 -29
  121. package/templates/src/components/ReadmeLoader.jsx +0 -13
  122. package/templates/src/styles/appstyles.css +0 -3
  123. package/templates/vite.config.ts +0 -42
@@ -3,7 +3,7 @@
3
3
 
4
4
  import routes from './routes.js';
5
5
  import mimes from './mimes.js';
6
- import db from './db.js';
6
+ import db from './db.ts';
7
7
 
8
8
  var SERVER_ROOT = import.meta.dirname + '/..';
9
9
  var APP_ROOT = SERVER_ROOT + '/server';
@@ -14,13 +14,13 @@ import fs from 'node:fs';
14
14
  const PRIVATE_KEY_FILE = fs.readFileSync(`${import.meta.dirname}/ssl/key.pem`);
15
15
  const CERTIFICATE_FILE = fs.readFileSync(`${import.meta.dirname}/ssl/certificate.pem`);
16
16
 
17
- var config = {
17
+ var service = {
18
18
  APP_ROOT: APP_ROOT,
19
19
  // root directory for delivering static assets
20
20
  PUBLIC_ROOT: SERVER_ROOT + '/client',
21
21
  CONTROLLERS_ROOT: APP_ROOT + '/controllers',
22
22
  VIEWS_ROOT: APP_ROOT + '/views',
23
- //MODELS_ROOT: APP_ROOT + '/models',
23
+ MODELS_ROOT: APP_ROOT + '/models',
24
24
  SERVER_ROOT: SERVER_ROOT,
25
25
 
26
26
  ENABLE_HTTP: true,
@@ -30,10 +30,10 @@ var config = {
30
30
  ASYNC: false,
31
31
 
32
32
  // For HTTPS
33
- ENABLE_HTTPS: true,
34
- SSL_PORT: 3334,
35
- PRIVATE_KEY: PRIVATE_KEY_FILE,
36
- CERTIFICATE: CERTIFICATE_FILE,
33
+ ENABLE_HTTPS: false,
34
+ // SSL_PORT: 3334,
35
+ // PRIVATE_KEY: PRIVATE_KEY_FILE,
36
+ // CERTIFICATE: CERTIFICATE_FILE,
37
37
  };
38
38
 
39
39
  // module.exports.routes = require('./routes.js');
@@ -41,7 +41,7 @@ var config = {
41
41
  // module.exports.db = require('./db.js');
42
42
 
43
43
  export default {
44
- config,
44
+ service,
45
45
  routes,
46
46
  db,
47
47
  mimes,
@@ -1,6 +1,6 @@
1
- import nails from "../../../../../index.js";
1
+ import nails, {Controller} from "../../../../../index.ts";
2
2
  // require("../../../../../index.js").Controller;
3
- export default class ClassbasedController extends nails.Controller {
3
+ export default class ClassbasedController extends Controller {
4
4
  routes = [
5
5
  ["get", "./arbi/trary/testLocalRoutes", {action: 'testLocalRoutes', json: true}],
6
6
  ["get", "arbi00/trary00/testLocalRoutes", {action: 'testLocalRoutes', json: true}],
@@ -1,20 +1,32 @@
1
- import nails from "../../../../../index.js";
1
+ import { Controller } from "../../../../../index.ts";
2
+ import Dog from "../models/dog.js";
3
+ import Owner from "../models/owner.js";
2
4
 
3
- export default class DefaultJsonController extends nails.Controller {
5
+ export default class DefaultJsonController extends Controller {
4
6
  json = true;
5
7
  routes = [
6
8
  ['get', 'arbi/trary/testautoaction'],
7
- ['get', 'arbi/trary/testautojson', {action: 'testautojson'}],
8
- ['get', 'arbi/trary/testjsonoverridden', {action: 'testnojson', json: false}],
9
+ ['get', 'arbi/trary/testautojson', { action: 'testautojson' }],
10
+ ['get', 'arbi/trary/testjsonoverridden', { action: 'testnojson', json: false }],
11
+ ['get', '/listowners'],
12
+ ['get', '/listowneddogs'],
9
13
  ];
10
14
 
11
15
  testautoaction(params, request, response) {
12
- return {json_testautoaction: true};
16
+ return { json_testautoaction: true };
13
17
  }
14
18
 
15
19
  testautojson(params, request, response) {
16
- return {json_testautojson: true};
20
+ return { json_testautojson: true };
17
21
  }
18
22
 
19
- testnojson(params, request, response) {}
23
+ testnojson(params, request, response) { }
24
+
25
+ async listowners(params, request, response) {
26
+ return await Owner.findAll();
27
+ }
28
+
29
+ async listowneddogs(params, request, response) {
30
+ return await Dog.findAll();
31
+ }
20
32
  }
@@ -1,6 +1,6 @@
1
- import nails from "../../../../../index.js";
1
+ import nails, {Controller} from "../../../../../index.ts";
2
2
 
3
- export default class ErrorController extends nails.Controller {
3
+ export default class ErrorController extends Controller {
4
4
  // DO NOT OVERRIDE CONSTRUCTOR
5
5
  index(params, request, response) {
6
6
  response.json({
@@ -1,39 +1,17 @@
1
- export default function HomeController() {
2
- this.index = function(params, request, response) {
1
+ import { Controller } from "../../../../../index.ts";
2
+
3
+ export default class HomeController extends Controller {
4
+ index(params, request, response) {
3
5
  console.log("HOME::INDEX");
4
6
  response.json({
5
7
  home_index: true
6
8
  });
7
9
  };
8
- this.testaction = function(params, request, response) {
10
+ testaction(params, request, response) {
9
11
  response.json({
10
12
  home_testaction: true
11
13
  });
12
14
  }
13
- this.test_ejs = function() {
14
- };
15
- /*
16
- this.public_index = function(params, request, response) {
17
- response.public({path: 'index.html'});
18
- };
19
- this.json = function(params, request, response) {
20
- response.json({test: 'json'});
21
- };
22
- // By setting a method to asynchronous, Nails will wait for an
23
- // explicit response to the client. Otherwise, it will attempt
24
- // to respond with a view immediately after the action terminates.
25
- this.json.async = true;
26
-
27
- this.test_model = function(params, request, response) {
28
- var u = new User();
29
- u.set('created_at', (new Date()).getTime());
30
- u.save();
31
- response.json({new_user_id: u.id.toString()});
32
- };
33
- this.test_id_template = function(params, request, response) {
34
- var varz = {};
35
- varz.id = params.id || "no id set";
36
- response.render('test_id', varz);
15
+ test_ejs() {
37
16
  };
38
- */
39
17
  }
@@ -1,6 +1,6 @@
1
- import nails from "../../../../../index.js";
1
+ import {Controller} from "../../../../../index.ts";
2
2
 
3
- export default class JsonController extends nails.Controller {
3
+ export default class JsonController extends Controller {
4
4
  testparams(params, request, response) {
5
5
  // should just render the params as JSON
6
6
  }
@@ -1,5 +1,5 @@
1
- import nails from "../../../../../index.js";
2
- export default class ManualRenderAsyncController extends nails.Controller {
1
+ import {Controller} from "../../../../../index.ts";
2
+ export default class ManualRenderAsyncController extends Controller {
3
3
  testmanualrenderasync(params, request, response) {
4
4
  return new Promise((resolve, reject) => {
5
5
  response.json({json_testmanualrenderasync: true});
@@ -1,9 +1,5 @@
1
- /*
2
- const Controller =
3
- require("../../../../../index.js").Controller;
4
- */
5
- import nails from "../../../../../index.js";
6
- export default class MjsController extends nails.Controller {
1
+ import {Controller} from "../../../../../index.ts";
2
+ export default class MjsController extends Controller {
7
3
  // DO NOT OVERRIDE CONSTRUCTOR
8
4
  index(params, request, response) {
9
5
  response.json({
@@ -1,18 +1,15 @@
1
- import nails from "../../../../../index.js";
1
+ import nails from "../../../../../index.ts";
2
2
  import Dog from "../models/dog.js";
3
3
 
4
4
  export default class ModeltestController extends nails.Controller {
5
5
  async createdog(params, request, response) {
6
- let dog = new Dog({good: true, name: params.name});
7
- await dog.save();
8
- return dog._id.toString();
6
+ let dog = await Dog.create({good: true, name: params.name});
7
+ console.log("CREATED DOG ID:", dog.id);
8
+ return dog.id.toString();
9
9
  }
10
10
 
11
11
  async getdogbyid(params, request, response) {
12
- let dog = await Dog.findById(params.id);
13
- return {
14
- name: dog.name,
15
- good: dog.good
16
- };
12
+ console.error("DOG ID IS:", params.id);
13
+ return await Dog.findByPk(params.id);
17
14
  }
18
15
  }
@@ -1,4 +1,4 @@
1
- import nails from "../../../../../index.js";
1
+ import nails from "../../../../../index.ts";
2
2
 
3
3
  export default class WebsocketController extends nails.Controller {
4
4
  index(params, ws, request) {
@@ -1,6 +1,8 @@
1
- import nails from '../../../../../index.js';
2
- const dogSchema = {
3
- good: Boolean,
4
- name: String
1
+ import {Model, DataTypes} from '../../../../../index.ts';
2
+
3
+ export const schema = {
4
+ good: DataTypes.BOOLEAN,
5
+ name: DataTypes.STRING,
5
6
  };
6
- export default class Dog extends new nails.Model("Dog", {schema: dogSchema}) {};
7
+
8
+ export default class Dog extends Model {};
@@ -0,0 +1,13 @@
1
+ import {Model} from '../../../../../index.ts';
2
+ import { DataTypes } from 'sequelize';
3
+ import Dog from './dog.js';
4
+
5
+ export const schema = {
6
+ name: DataTypes.STRING,
7
+ };
8
+ export default class Owner extends Model {};
9
+
10
+ export async function defer() {
11
+ Owner.hasMany(Dog);
12
+ await Dog.sync({alter: {drop: false}});
13
+ }
@@ -1,9 +1,8 @@
1
- // var nails = require('../../../index.js');
2
- import nails from '../../../index.js';
1
+ import Nails from '../../../index.ts';
3
2
  import service_config from './config/service.js';
4
3
 
5
4
  // See self-documented config files
6
5
  // var service_config = require('./config/service.js');
7
- // console.log("starting server")
8
- (await nails( service_config )).startServer();
6
+ const nails = new Nails(service_config);
7
+ await nails.startServer();
9
8
  export default nails; // export nails for testing
@@ -7,6 +7,7 @@ import { assert } from 'chai';
7
7
  import WebSocket from 'ws';
8
8
  // const WebSocket = require('ws');
9
9
 
10
+ let nails;
10
11
  var express_app;
11
12
  // const {MongoMemoryServer} = require('mongodb-memory-server');
12
13
  let mongod = null;
@@ -19,7 +20,7 @@ describe("Integration: Sequelize", function () {
19
20
  before(async function () {
20
21
  // this.timeout(30000);
21
22
  try {
22
- var nails = (await import('./services/integration/server.js')).default;
23
+ nails = (await import('./services/integration/server.js')).default;
23
24
  } catch (e) {
24
25
  console.log("could not import server");
25
26
  console.log(e);
@@ -27,6 +28,28 @@ describe("Integration: Sequelize", function () {
27
28
  console.log("got here");
28
29
  express_app = nails.application;
29
30
  });
31
+ describe("/listowners", function () {
32
+ it('should return an empty array if no owners', function (done) {
33
+ request.execute(express_app)
34
+ .get('/listowners')
35
+ .end((err, res) => {
36
+ res.should.have.status(200);
37
+ assert(JSON.parse(res.text).length == 0);
38
+ done();
39
+ });
40
+ })
41
+ })
42
+ describe("/listowneddogs", function () {
43
+ it('should return an empty array if no owned dogs', function (done) {
44
+ request.execute(express_app)
45
+ .get('/listowneddogs')
46
+ .end((err, res) => {
47
+ res.should.have.status(200);
48
+ assert(JSON.parse(res.text).length == 0);
49
+ done();
50
+ });
51
+ })
52
+ })
30
53
  describe("GET /", function () {
31
54
  it('should return the expected JSON from index', function (done) {
32
55
  request.execute(express_app)
@@ -79,7 +102,7 @@ describe("Integration: Sequelize", function () {
79
102
  });
80
103
  });
81
104
  describe("Get /defaultjson/arbi/trary", function () {
82
- it("Should default to json if not present in route options", function(done) {
105
+ it("Should default to json if not present in route options", function (done) {
83
106
  request.execute(express_app)
84
107
  .get('/defaultjson/arbi/trary/testautojson')
85
108
  .end((err, res) => {
@@ -88,7 +111,7 @@ describe("Integration: Sequelize", function () {
88
111
  done();
89
112
  });
90
113
  });
91
- it("Should autoassign the action if not present in route options", function(done) {
114
+ it("Should autoassign the action if not present in route options", function (done) {
92
115
  request.execute(express_app)
93
116
  .get('/defaultjson/arbi/trary/testautoaction')
94
117
  .end((err, res) => {
@@ -97,7 +120,7 @@ describe("Integration: Sequelize", function () {
97
120
  done();
98
121
  });
99
122
  });
100
- it("Should not render json if route options explicitly say not to", function(done) {
123
+ it("Should not render json if route options explicitly say not to", function (done) {
101
124
  request.execute(express_app)
102
125
  .get('/defaultjson/arbi/trary/testjsonoverridden')
103
126
  .end((err, res) => {
@@ -205,17 +228,18 @@ describe("Integration: Sequelize", function () {
205
228
  });
206
229
 
207
230
  describe("GET /json/:action", function () {
231
+ // TODO: Do we really want this behavior?
208
232
  it('should render params if nothing is returned by the action',
209
- function (done) {
210
- request.execute(express_app)
211
- // Route to index action.
212
- .get('/json/testparams?testkey=testvalue')
213
- .end((err, res) => {
214
- res.should.have.status(200);
215
- assert(JSON.parse(res.text).testkey == "testvalue");
216
- done();
217
- });
218
- }
233
+ // function (done) {
234
+ // request.execute(express_app)
235
+ // // Route to index action.
236
+ // .get('/json/testparams?testkey=testvalue')
237
+ // .end((err, res) => {
238
+ // res.should.have.status(200);
239
+ // assert(JSON.parse(res.text).testkey == "testvalue");
240
+ // done();
241
+ // });
242
+ // }
219
243
  );
220
244
  it('should render the returned object as json', function (done) {
221
245
  request.execute(express_app)
@@ -281,12 +305,16 @@ describe("Integration: Sequelize", function () {
281
305
  .get(`/modeltest/createdog?name=${dogName}`)
282
306
  .end((err, res) => {
283
307
  res.should.have.status(200);
284
- dogId = res.text.replaceAll('"', '');
308
+ dogId = res.text.replaceAll("\"", "");
285
309
  request.execute(express_app)
286
310
  .get(`/modeltest/getdogbyid?id=${dogId}`)
287
311
  .end((err, res) => {
288
- assert.equal(
289
- res.text, JSON.stringify({ name: dogName, good: true }));
312
+ const dogOnServer = JSON.parse(res.text);
313
+ assert.equal(dogOnServer.name, dogName);
314
+ assert.isTrue(dogOnServer.good);
315
+ assert.isDefined(dogOnServer.id);
316
+ assert.isDefined(dogOnServer.createdAt);
317
+ assert.isDefined(dogOnServer.updatedAt);
290
318
  done();
291
319
  });
292
320
  });
@@ -0,0 +1,13 @@
1
+ import { type DbConfig } from '@projectinvicta/nails';
2
+
3
+ let DB_ADDRESS = process.env.NAILS_SQLITE_DB_FILE;
4
+ if (!DB_ADDRESS) DB_ADDRESS = 'sqlite://' + import.meta.dirname + '/development.db';
5
+
6
+ const db: DbConfig = {
7
+ /** Sequelize Connector */
8
+ address: process.env.NAILS_RELEASE_STAGE == 'test'
9
+ ? 'sqlite::memory:'
10
+ : DB_ADDRESS,
11
+ };
12
+
13
+ export default db;
@@ -1,61 +1,42 @@
1
- /**
2
- * This file uses file extensions in the request to determine
3
- * the type of an asset and, therefore, where it can be found
4
- * in the file system.
5
- *
6
- * Currently, the supported types are: 'js', 'css', 'html',
7
- * 'img'
8
- * TODO: Add supported types pdf ( or document ), and video
9
- * TODO: move this file into nails. Too annoying for the dev
10
- * to see and they shouldn't need to have to change it
11
- */
12
- /*
13
- var mimes = {
14
- // <ext>: '<type>'
15
- js: 'js',
16
- jpg: 'image',
17
- css: 'css',
18
- html: 'html'
19
- };
20
- */
21
-
22
- var mimes = {
23
- html: {
24
- type: 'page',
25
- contentType: 'text/html'
26
- },
27
- js: {
28
- type: 'script', // the type of the script,
29
- contentType: 'application/javascript' // Header info
30
- },
31
- css: {
32
- type: 'style',
33
- contentType: 'text/css'
34
- },
35
- ico: {
36
- type: 'image',
37
- contentType: 'image/x-icon'
38
- },
39
- jpg: {
40
- type: 'image',
41
- contentType: 'image/jpeg'
42
- },
43
- png: {
44
- type: 'image',
45
- contentType: 'image/png'
46
- },
47
- pdf: {
48
- type: 'document',
49
- contentType: 'application/pdf'
50
- },
51
- xml: {
52
- type: 'data',
53
- contentType: 'text/xml'
54
- },
55
- json: {
56
- type: 'data',
57
- contentType: 'application/json'
58
- }
59
- }
60
-
61
- export default mimes;
1
+ import { type MimesConfig } from '@projectinvicta/nails';
2
+
3
+ const mimes: MimesConfig = {
4
+ html: {
5
+ type: 'page',
6
+ contentType: 'text/html'
7
+ },
8
+ js: {
9
+ type: 'script', // the type of the script,
10
+ contentType: 'application/javascript' // Header info
11
+ },
12
+ css: {
13
+ type: 'style',
14
+ contentType: 'text/css'
15
+ },
16
+ ico: {
17
+ type: 'image',
18
+ contentType: 'image/x-icon'
19
+ },
20
+ jpg: {
21
+ type: 'image',
22
+ contentType: 'image/jpeg'
23
+ },
24
+ png: {
25
+ type: 'image',
26
+ contentType: 'image/png'
27
+ },
28
+ pdf: {
29
+ type: 'document',
30
+ contentType: 'application/pdf'
31
+ },
32
+ xml: {
33
+ type: 'data',
34
+ contentType: 'text/xml'
35
+ },
36
+ json: {
37
+ type: 'data',
38
+ contentType: 'application/json'
39
+ }
40
+ };
41
+
42
+ export default mimes;
@@ -0,0 +1,22 @@
1
+ import { type RoutesConfig } from '@projectinvicta/nails';
2
+
3
+ const routes: RoutesConfig = [
4
+ // Routes the root request to index.html, as well as all other requests to static
5
+ ['get', "/", {controller: 'home'}],
6
+ // Routes all requests starting with /public as static requests to the public folder.
7
+ ['get', '/public', {public: true}],
8
+
9
+ // A test route which routes the first part of pathname to controller and the second to the action
10
+ // ['get', /^\/(\w+)\/(\w+)$/i, {0: 'controller', 1: 'action'}],
11
+
12
+ // Maps the first two parts of the path to controller and action, and the third to the id parameter
13
+ // ['get', "/:controller/:action/:id"],
14
+
15
+ // For all other GET requests, render HomeController#index
16
+ ['get', '/:catchall', {controller: 'home'}],
17
+
18
+ // Defines a WebSocket handler
19
+ // ['ws', "/:controller/:action/:id"]
20
+ ];
21
+
22
+ export default routes;
@@ -13,7 +13,7 @@ import fs from 'node:fs';
13
13
  const PRIVATE_KEY_FILE = fs.readFileSync(`${import.meta.dirname}/ssl/key.pem`);
14
14
  const CERTIFICATE_FILE = fs.readFileSync(`${import.meta.dirname}/ssl/certificate.pem`);
15
15
 
16
- var config = {
16
+ var service = {
17
17
  APP_ROOT: APP_ROOT,
18
18
  // root directory for delivering static assets
19
19
  PUBLIC_ROOT: SERVER_ROOT + '/public',
@@ -38,7 +38,7 @@ var config = {
38
38
  };
39
39
 
40
40
  export default {
41
- config,
41
+ service,
42
42
  routes,
43
43
  mimes,
44
44
  db
@@ -22,17 +22,23 @@
22
22
  "version": "latest"
23
23
  }
24
24
  },
25
+ "imports": {
26
+ "#models/*": "./server/models/*",
27
+ "#common/*": "./common/*",
28
+ "#config/*": "./config/*"
29
+ },
25
30
  "dependencies": {
31
+ "@projectinvicta/nails": "*",
26
32
  "@mui/icons-material": "^7.3.1",
27
33
  "@mui/material": "^7.3.1",
28
34
  "@vitejs/plugin-legacy": "^6.1.1",
29
35
  "@vitejs/plugin-react": "^4.7.0",
30
- "nails-boilerplate": ">=1.1.0",
31
36
  "react": "^19.1.0",
32
37
  "react-dom": "^19.1.0",
33
38
  "react-router-dom": "^7.7.0",
34
39
  "sequelize": "^6.37.7",
35
- "vite": "^6.3.5"
40
+ "vite": "^6.3.5",
41
+ "chai-http": "*"
36
42
  },
37
43
  "devDependencies": {
38
44
  "@emotion/react": "^11.14.0",