@sundaysf/cli-v2 1.0.1 → 1.0.5

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 (191) hide show
  1. package/README.md +178 -178
  2. package/dist/README.md +178 -178
  3. package/dist/bin/generators/class.js.map +1 -1
  4. package/dist/bin/generators/postman.js.map +1 -1
  5. package/dist/bin/index.js +1 -1
  6. package/dist/bin/index.js.map +1 -1
  7. package/dist/templates/backend/.claude/agents/knex-table-implementer.md +113 -113
  8. package/dist/templates/backend/.claude/agents/sundays-backend-builder.md +70 -70
  9. package/dist/templates/backend/.claude/settings.local.json +13 -13
  10. package/dist/templates/backend/.env.example +13 -13
  11. package/dist/templates/backend/.prettierignore +2 -2
  12. package/dist/templates/backend/.prettierrc +9 -9
  13. package/dist/templates/backend/.sundaysrc +7 -0
  14. package/dist/templates/backend/CLAUDE.md +348 -348
  15. package/dist/templates/backend/Dockerfile +14 -14
  16. package/dist/templates/backend/README.md +18 -18
  17. package/dist/templates/backend/eslint.config.js +20 -20
  18. package/dist/templates/backend/src/app.ts +34 -34
  19. package/dist/templates/backend/src/common/config/origins/origins.config.ts +11 -11
  20. package/dist/templates/backend/src/common/utils/environment.resolver.ts +3 -3
  21. package/dist/templates/backend/src/common/utils/version.resolver.ts +4 -4
  22. package/dist/templates/backend/src/controllers/health/health.controller.ts +23 -23
  23. package/dist/templates/backend/src/middlewares/error/error.middleware.ts +21 -21
  24. package/dist/templates/backend/src/routes/health/health.router.ts +16 -16
  25. package/dist/templates/backend/src/routes/index.ts +57 -57
  26. package/dist/templates/backend/src/server.ts +16 -16
  27. package/dist/templates/backend/src/types.d.ts +10 -10
  28. package/dist/templates/backend/tsconfig.json +16 -16
  29. package/dist/templates/backend-db-sql/.claude/agents/knex-table-implementer.md +114 -114
  30. package/dist/templates/backend-db-sql/.claude/agents/sundays-backend-builder.md +70 -70
  31. package/dist/templates/backend-db-sql/.claude/settings.local.json +19 -19
  32. package/dist/templates/backend-db-sql/.env.example +13 -13
  33. package/dist/templates/backend-db-sql/.prettierignore +2 -2
  34. package/dist/templates/backend-db-sql/.prettierrc +9 -9
  35. package/dist/templates/backend-db-sql/.sundaysrc +7 -0
  36. package/dist/templates/backend-db-sql/CLAUDE.md +374 -374
  37. package/dist/templates/backend-db-sql/Dockerfile +17 -17
  38. package/dist/templates/backend-db-sql/README.md +34 -34
  39. package/dist/templates/backend-db-sql/db/knexfile.ts +33 -33
  40. package/dist/templates/backend-db-sql/db/migrations/001_create_sundays_package_version.ts +12 -12
  41. package/dist/templates/backend-db-sql/db/seeds/001_sundays_package_version_seed.ts +10 -10
  42. package/dist/templates/backend-db-sql/db/src/KnexConnection.ts +74 -74
  43. package/dist/templates/backend-db-sql/db/src/d.types.ts +18 -18
  44. package/dist/templates/backend-db-sql/db/src/dao/sundays-package-version/sundays-package-version.dao.ts +71 -71
  45. package/dist/templates/backend-db-sql/db/src/index.ts +9 -9
  46. package/dist/templates/backend-db-sql/db/src/interfaces/sundays-package-version/sundays-package-version.interfaces.ts +6 -6
  47. package/dist/templates/backend-db-sql/db/tsconfig.json +16 -16
  48. package/dist/templates/backend-db-sql/eslint.config.js +20 -20
  49. package/dist/templates/backend-db-sql/src/app.ts +34 -34
  50. package/dist/templates/backend-db-sql/src/common/config/origins/origins.config.ts +11 -11
  51. package/dist/templates/backend-db-sql/src/common/utils/environment.resolver.ts +3 -3
  52. package/dist/templates/backend-db-sql/src/common/utils/version.resolver.ts +4 -4
  53. package/dist/templates/backend-db-sql/src/controllers/health/health.controller.ts +23 -23
  54. package/dist/templates/backend-db-sql/src/middlewares/error/error.middleware.ts +21 -21
  55. package/dist/templates/backend-db-sql/src/routes/health/health.router.ts +16 -16
  56. package/dist/templates/backend-db-sql/src/routes/index.ts +57 -57
  57. package/dist/templates/backend-db-sql/src/server.ts +18 -18
  58. package/dist/templates/backend-db-sql/src/types.d.ts +10 -10
  59. package/dist/templates/backend-db-sql/tsconfig.json +16 -16
  60. package/dist/templates/backend-embedded-db-sql/.claude/agents/knex-table-implementer.md +116 -0
  61. package/dist/templates/backend-embedded-db-sql/.claude/agents/sundays-backend-builder.md +70 -0
  62. package/dist/templates/backend-embedded-db-sql/.claude/settings.local.json +18 -0
  63. package/dist/templates/backend-embedded-db-sql/.env.example +14 -0
  64. package/dist/templates/backend-embedded-db-sql/.prettierignore +3 -0
  65. package/dist/templates/backend-embedded-db-sql/.prettierrc +9 -0
  66. package/dist/templates/backend-embedded-db-sql/.sundaysrc +7 -0
  67. package/dist/templates/backend-embedded-db-sql/CLAUDE.md +371 -0
  68. package/dist/templates/backend-embedded-db-sql/Dockerfile +14 -0
  69. package/dist/templates/backend-embedded-db-sql/README.md +32 -0
  70. package/dist/templates/backend-embedded-db-sql/eslint.config.js +20 -0
  71. package/dist/templates/backend-embedded-db-sql/knexfile.ts +37 -0
  72. package/dist/templates/backend-embedded-db-sql/migrations/.gitkeep +0 -0
  73. package/dist/templates/backend-embedded-db-sql/migrations/001_create_sundays_package_version.ts +13 -0
  74. package/dist/templates/backend-embedded-db-sql/seeds/001_sundays_package_version_seed.ts +11 -0
  75. package/dist/templates/backend-embedded-db-sql/src/app.ts +35 -0
  76. package/dist/templates/backend-embedded-db-sql/src/common/config/origins/origins.config.ts +11 -0
  77. package/dist/templates/backend-embedded-db-sql/src/common/utils/environment.resolver.ts +4 -0
  78. package/dist/templates/backend-embedded-db-sql/src/common/utils/version.resolver.ts +5 -0
  79. package/dist/templates/backend-embedded-db-sql/src/controllers/health/health.controller.ts +24 -0
  80. package/dist/templates/backend-embedded-db-sql/src/db/KnexConnection.ts +74 -0
  81. package/dist/templates/backend-embedded-db-sql/src/db/d.types.ts +18 -0
  82. package/dist/templates/backend-embedded-db-sql/src/db/dao/sundays-package-version/sundays-package-version.dao.ts +71 -0
  83. package/dist/templates/backend-embedded-db-sql/src/db/index.ts +9 -0
  84. package/dist/templates/backend-embedded-db-sql/src/db/interfaces/sundays-package-version/sundays-package-version.interfaces.ts +6 -0
  85. package/dist/templates/backend-embedded-db-sql/src/middlewares/error/error.middleware.ts +21 -0
  86. package/dist/templates/backend-embedded-db-sql/src/routes/health/health.router.ts +17 -0
  87. package/dist/templates/backend-embedded-db-sql/src/routes/index.ts +57 -0
  88. package/dist/templates/backend-embedded-db-sql/src/server.ts +18 -0
  89. package/dist/templates/backend-embedded-db-sql/src/types.d.ts +10 -0
  90. package/dist/templates/backend-embedded-db-sql/tsconfig.json +16 -0
  91. package/dist/templates/db-sql/.claude/agents/knex-table-implementer.md +113 -113
  92. package/dist/templates/db-sql/.claude/agents/sundays-backend-builder.md +70 -70
  93. package/dist/templates/db-sql/.claude/settings.local.json +10 -10
  94. package/dist/templates/db-sql/.env.example +8 -8
  95. package/dist/templates/db-sql/CLAUDE.md +105 -105
  96. package/dist/templates/db-sql/knexfile.ts +33 -33
  97. package/dist/templates/db-sql/migrations/001_create_sundays_package_version.ts +12 -12
  98. package/dist/templates/db-sql/seeds/001_sundays_package_version_seed.ts +10 -10
  99. package/dist/templates/db-sql/src/KnexConnection.ts +74 -74
  100. package/dist/templates/db-sql/src/d.types.ts +18 -18
  101. package/dist/templates/db-sql/src/dao/sundays-package-version/sundays-package-version.dao.ts +71 -71
  102. package/dist/templates/db-sql/src/index.ts +9 -9
  103. package/dist/templates/db-sql/src/interfaces/sundays-package-version/sundays-package-version.interfaces.ts +6 -6
  104. package/dist/templates/db-sql/tsconfig.json +16 -16
  105. package/dist/templates/frontend-nextjs/.sundaysrc +7 -0
  106. package/dist/templates/frontend-nextjs/app/globals.css +125 -0
  107. package/dist/templates/frontend-nextjs/app/layout.tsx +45 -0
  108. package/dist/templates/frontend-nextjs/app/page.tsx +5 -0
  109. package/dist/templates/frontend-nextjs/components/project-generator.tsx +558 -0
  110. package/dist/templates/frontend-nextjs/components/theme-provider.tsx +11 -0
  111. package/dist/templates/frontend-nextjs/components/ui/accordion.tsx +66 -0
  112. package/dist/templates/frontend-nextjs/components/ui/alert-dialog.tsx +157 -0
  113. package/dist/templates/frontend-nextjs/components/ui/alert.tsx +66 -0
  114. package/dist/templates/frontend-nextjs/components/ui/aspect-ratio.tsx +11 -0
  115. package/dist/templates/frontend-nextjs/components/ui/avatar.tsx +53 -0
  116. package/dist/templates/frontend-nextjs/components/ui/badge.tsx +46 -0
  117. package/dist/templates/frontend-nextjs/components/ui/breadcrumb.tsx +109 -0
  118. package/dist/templates/frontend-nextjs/components/ui/button-group.tsx +83 -0
  119. package/dist/templates/frontend-nextjs/components/ui/button.tsx +60 -0
  120. package/dist/templates/frontend-nextjs/components/ui/calendar.tsx +213 -0
  121. package/dist/templates/frontend-nextjs/components/ui/card.tsx +92 -0
  122. package/dist/templates/frontend-nextjs/components/ui/carousel.tsx +241 -0
  123. package/dist/templates/frontend-nextjs/components/ui/chart.tsx +353 -0
  124. package/dist/templates/frontend-nextjs/components/ui/checkbox.tsx +32 -0
  125. package/dist/templates/frontend-nextjs/components/ui/collapsible.tsx +33 -0
  126. package/dist/templates/frontend-nextjs/components/ui/command.tsx +184 -0
  127. package/dist/templates/frontend-nextjs/components/ui/context-menu.tsx +252 -0
  128. package/dist/templates/frontend-nextjs/components/ui/dialog.tsx +143 -0
  129. package/dist/templates/frontend-nextjs/components/ui/drawer.tsx +135 -0
  130. package/dist/templates/frontend-nextjs/components/ui/dropdown-menu.tsx +257 -0
  131. package/dist/templates/frontend-nextjs/components/ui/empty.tsx +104 -0
  132. package/dist/templates/frontend-nextjs/components/ui/field.tsx +244 -0
  133. package/dist/templates/frontend-nextjs/components/ui/form.tsx +167 -0
  134. package/dist/templates/frontend-nextjs/components/ui/hover-card.tsx +44 -0
  135. package/dist/templates/frontend-nextjs/components/ui/input-group.tsx +169 -0
  136. package/dist/templates/frontend-nextjs/components/ui/input-otp.tsx +77 -0
  137. package/dist/templates/frontend-nextjs/components/ui/input.tsx +21 -0
  138. package/dist/templates/frontend-nextjs/components/ui/item.tsx +193 -0
  139. package/dist/templates/frontend-nextjs/components/ui/kbd.tsx +28 -0
  140. package/dist/templates/frontend-nextjs/components/ui/label.tsx +24 -0
  141. package/dist/templates/frontend-nextjs/components/ui/menubar.tsx +276 -0
  142. package/dist/templates/frontend-nextjs/components/ui/navigation-menu.tsx +166 -0
  143. package/dist/templates/frontend-nextjs/components/ui/pagination.tsx +127 -0
  144. package/dist/templates/frontend-nextjs/components/ui/popover.tsx +48 -0
  145. package/dist/templates/frontend-nextjs/components/ui/progress.tsx +31 -0
  146. package/dist/templates/frontend-nextjs/components/ui/radio-group.tsx +45 -0
  147. package/dist/templates/frontend-nextjs/components/ui/resizable.tsx +56 -0
  148. package/dist/templates/frontend-nextjs/components/ui/scroll-area.tsx +58 -0
  149. package/dist/templates/frontend-nextjs/components/ui/select.tsx +185 -0
  150. package/dist/templates/frontend-nextjs/components/ui/separator.tsx +28 -0
  151. package/dist/templates/frontend-nextjs/components/ui/sheet.tsx +139 -0
  152. package/dist/templates/frontend-nextjs/components/ui/sidebar.tsx +726 -0
  153. package/dist/templates/frontend-nextjs/components/ui/skeleton.tsx +13 -0
  154. package/dist/templates/frontend-nextjs/components/ui/slider.tsx +63 -0
  155. package/dist/templates/frontend-nextjs/components/ui/sonner.tsx +25 -0
  156. package/dist/templates/frontend-nextjs/components/ui/spinner.tsx +16 -0
  157. package/dist/templates/frontend-nextjs/components/ui/switch.tsx +31 -0
  158. package/dist/templates/frontend-nextjs/components/ui/table.tsx +116 -0
  159. package/dist/templates/frontend-nextjs/components/ui/tabs.tsx +66 -0
  160. package/dist/templates/frontend-nextjs/components/ui/textarea.tsx +18 -0
  161. package/dist/templates/frontend-nextjs/components/ui/toast.tsx +129 -0
  162. package/dist/templates/frontend-nextjs/components/ui/toaster.tsx +35 -0
  163. package/dist/templates/frontend-nextjs/components/ui/toggle-group.tsx +73 -0
  164. package/dist/templates/frontend-nextjs/components/ui/toggle.tsx +47 -0
  165. package/dist/templates/frontend-nextjs/components/ui/tooltip.tsx +61 -0
  166. package/dist/templates/frontend-nextjs/components/ui/use-mobile.tsx +19 -0
  167. package/dist/templates/frontend-nextjs/components/ui/use-toast.ts +191 -0
  168. package/dist/templates/frontend-nextjs/components.json +21 -0
  169. package/dist/templates/frontend-nextjs/hooks/use-mobile.ts +19 -0
  170. package/dist/templates/frontend-nextjs/hooks/use-toast.ts +191 -0
  171. package/dist/templates/frontend-nextjs/lib/utils.ts +6 -0
  172. package/dist/templates/frontend-nextjs/next.config.mjs +11 -0
  173. package/dist/templates/frontend-nextjs/postcss.config.mjs +8 -0
  174. package/dist/templates/frontend-nextjs/public/apple-icon.png +0 -0
  175. package/dist/templates/frontend-nextjs/public/icon-dark-32x32.png +0 -0
  176. package/dist/templates/frontend-nextjs/public/icon-light-32x32.png +0 -0
  177. package/dist/templates/frontend-nextjs/public/icon.svg +26 -0
  178. package/dist/templates/frontend-nextjs/public/placeholder-logo.png +0 -0
  179. package/dist/templates/frontend-nextjs/public/placeholder-logo.svg +1 -0
  180. package/dist/templates/frontend-nextjs/public/placeholder-user.jpg +0 -0
  181. package/dist/templates/frontend-nextjs/public/placeholder.jpg +0 -0
  182. package/dist/templates/frontend-nextjs/public/placeholder.svg +1 -0
  183. package/dist/templates/frontend-nextjs/styles/globals.css +125 -0
  184. package/dist/templates/frontend-nextjs/tsconfig.json +27 -0
  185. package/dist/templates/module/.claude/agents/knex-table-implementer.md +113 -113
  186. package/dist/templates/module/.claude/agents/sundays-backend-builder.md +70 -70
  187. package/dist/templates/module/.claude/settings.local.json +10 -10
  188. package/dist/templates/module/CLAUDE.md +158 -158
  189. package/dist/templates/module/src/index.ts +9 -9
  190. package/dist/templates/module/tsconfig.json +19 -19
  191. package/package.json +40 -40
@@ -1,17 +1,17 @@
1
- FROM node:22-alpine AS builder
2
- WORKDIR /var/api
3
- COPY package*.json ./
4
- RUN npm ci
5
- COPY . .
6
- RUN npm run build
7
- RUN npm run db:build
8
-
9
- FROM node:22-alpine
10
- WORKDIR /var/api
11
- COPY package*.json ./
12
- RUN npm ci --omit=dev
13
- COPY --from=builder /var/api/dist ./dist
14
- COPY --from=builder /var/api/db/dist ./db/dist
15
- COPY --from=builder /var/api/db/package.json ./db/package.json
16
- EXPOSE 3098
17
- CMD ["node", "dist/server.js"]
1
+ FROM node:22-alpine AS builder
2
+ WORKDIR /var/api
3
+ COPY package*.json ./
4
+ RUN npm ci
5
+ COPY . .
6
+ RUN npm run build
7
+ RUN npm run db:build
8
+
9
+ FROM node:22-alpine
10
+ WORKDIR /var/api
11
+ COPY package*.json ./
12
+ RUN npm ci --omit=dev
13
+ COPY --from=builder /var/api/dist ./dist
14
+ COPY --from=builder /var/api/db/dist ./db/dist
15
+ COPY --from=builder /var/api/db/package.json ./db/package.json
16
+ EXPOSE 3098
17
+ CMD ["node", "dist/server.js"]
@@ -1,34 +1,34 @@
1
- # Sundays Framework Project
2
-
3
- This directory contains the starter backend with embedded database module generated by the CLI.
4
-
5
- ## Quick start
6
-
7
- 1. Install dependencies:
8
- ```
9
- npm install
10
- ```
11
- 2. Copy `.env.example` to `.env` and set your environment variables (especially the `SQL_*` database variables).
12
- 3. Run database migrations:
13
- ```
14
- npm run migrate:deploy
15
- ```
16
- 4. Start the development server:
17
- ```
18
- npm run start:dev
19
- ```
20
-
21
- The server will run on the port specified in your `.env` file.
22
-
23
- ## Database module
24
-
25
- The `db/` directory contains an independently publishable Knex.js database module. It can be used as part of this backend or published separately as an npm package.
26
-
27
- ### Database commands
28
-
29
- - `npm run migrate:create` - Create a new migration
30
- - `npm run migrate:deploy` - Run pending migrations
31
- - `npm run seed:create` - Create a new seed file
32
- - `npm run seed:run` - Run seed files
33
- - `npm run db:build` - Compile the database module
34
- - `npm run db:publish` - Publish the database module to npm
1
+ # Sundays Framework Project
2
+
3
+ This directory contains the starter backend with embedded database module generated by the CLI.
4
+
5
+ ## Quick start
6
+
7
+ 1. Install dependencies:
8
+ ```
9
+ npm install
10
+ ```
11
+ 2. Copy `.env.example` to `.env` and set your environment variables (especially the `SQL_*` database variables).
12
+ 3. Run database migrations:
13
+ ```
14
+ npm run migrate:deploy
15
+ ```
16
+ 4. Start the development server:
17
+ ```
18
+ npm run start:dev
19
+ ```
20
+
21
+ The server will run on the port specified in your `.env` file.
22
+
23
+ ## Database module
24
+
25
+ The `db/` directory contains an independently publishable Knex.js database module. It can be used as part of this backend or published separately as an npm package.
26
+
27
+ ### Database commands
28
+
29
+ - `npm run migrate:create` - Create a new migration
30
+ - `npm run migrate:deploy` - Run pending migrations
31
+ - `npm run seed:create` - Create a new seed file
32
+ - `npm run seed:run` - Run seed files
33
+ - `npm run db:build` - Compile the database module
34
+ - `npm run db:publish` - Publish the database module to npm
@@ -1,33 +1,33 @@
1
- import type { Knex } from "knex";
2
- import dotenv from "dotenv";
3
- dotenv.config();
4
-
5
- const isLocalhost = process.env.SQL_HOST === 'localhost' || process.env.SQL_HOST === '127.0.0.1';
6
- const rejectUnauthorized = process.env.SQL_REJECT_UNAUTHORIZED !== 'false';
7
-
8
- const sharedConfig: Knex.Config = {
9
- client: "postgresql",
10
- connection: {
11
- database: process.env.SQL_DB_NAME,
12
- user: process.env.SQL_USER,
13
- password: process.env.SQL_PASSWORD,
14
- host: process.env.SQL_HOST,
15
- port: process.env.SQL_PORT ? +process.env.SQL_PORT : 5432,
16
- ssl: isLocalhost ? false : { rejectUnauthorized },
17
- },
18
- pool: {
19
- min: 2,
20
- max: 10,
21
- },
22
- migrations: {
23
- tableName: "knex_migrations",
24
- },
25
- };
26
-
27
- const config: { [key: string]: Knex.Config } = {
28
- development: sharedConfig,
29
- staging: sharedConfig,
30
- production: sharedConfig,
31
- };
32
-
33
- export default config;
1
+ import type { Knex } from "knex";
2
+ import dotenv from "dotenv";
3
+ dotenv.config();
4
+
5
+ const isLocalhost = process.env.SQL_HOST === 'localhost' || process.env.SQL_HOST === '127.0.0.1';
6
+ const rejectUnauthorized = process.env.SQL_REJECT_UNAUTHORIZED !== 'false';
7
+
8
+ const sharedConfig: Knex.Config = {
9
+ client: "postgresql",
10
+ connection: {
11
+ database: process.env.SQL_DB_NAME,
12
+ user: process.env.SQL_USER,
13
+ password: process.env.SQL_PASSWORD,
14
+ host: process.env.SQL_HOST,
15
+ port: process.env.SQL_PORT ? +process.env.SQL_PORT : 5432,
16
+ ssl: isLocalhost ? false : { rejectUnauthorized },
17
+ },
18
+ pool: {
19
+ min: 2,
20
+ max: 10,
21
+ },
22
+ migrations: {
23
+ tableName: "knex_migrations",
24
+ },
25
+ };
26
+
27
+ const config: { [key: string]: Knex.Config } = {
28
+ development: sharedConfig,
29
+ staging: sharedConfig,
30
+ production: sharedConfig,
31
+ };
32
+
33
+ export default config;
@@ -1,13 +1,13 @@
1
- import type { Knex } from "knex";
2
-
3
- export async function up(knex: Knex): Promise<void> {
4
- await knex.schema.createTable("sundays_package_version", (table) => {
5
- table.increments("id").primary();
6
- table.string("versionName").notNullable();
7
- table.timestamps(true, true); // created_at, updated_at
8
- });
9
- }
10
-
11
- export async function down(knex: Knex): Promise<void> {
12
- await knex.schema.dropTableIfExists("sundays_package_version");
1
+ import type { Knex } from "knex";
2
+
3
+ export async function up(knex: Knex): Promise<void> {
4
+ await knex.schema.createTable("sundays_package_version", (table) => {
5
+ table.increments("id").primary();
6
+ table.string("versionName").notNullable();
7
+ table.timestamps(true, true); // created_at, updated_at
8
+ });
9
+ }
10
+
11
+ export async function down(knex: Knex): Promise<void> {
12
+ await knex.schema.dropTableIfExists("sundays_package_version");
13
13
  }
@@ -1,11 +1,11 @@
1
- import { Knex } from "knex";
2
-
3
- export async function seed(knex: Knex): Promise<void> {
4
- // Deletes ALL existing entries
5
- await knex("sundays_package_version").del();
6
-
7
- // Inserts seed entries
8
- await knex("sundays_package_version").insert([
9
- { versionName: "1.0.0" }
10
- ]);
1
+ import { Knex } from "knex";
2
+
3
+ export async function seed(knex: Knex): Promise<void> {
4
+ // Deletes ALL existing entries
5
+ await knex("sundays_package_version").del();
6
+
7
+ // Inserts seed entries
8
+ await knex("sundays_package_version").insert([
9
+ { versionName: "1.0.0" }
10
+ ]);
11
11
  }
@@ -1,74 +1,74 @@
1
- import { knex, Knex } from 'knex';
2
-
3
- class KnexManager {
4
- private static knexInstance: Knex<any, unknown[]> | null = null;
5
-
6
- /**
7
- * Open a new connection. Reuse the already existing one if there's any.
8
- */
9
- static async connect(
10
- config?: Knex.Config,
11
- connections?: number
12
- ): Promise<Knex<any, unknown[]>> {
13
- if (!KnexManager.knexInstance) {
14
- const isLocalhost = process.env.SQL_HOST === 'localhost' || process.env.SQL_HOST === '127.0.0.1';
15
- const rejectUnauthorized = process.env.SQL_REJECT_UNAUTHORIZED !== 'false';
16
- const defaultConfig = {
17
- client: 'pg',
18
- connection: {
19
- host: process.env.SQL_HOST,
20
- user: process.env.SQL_USER,
21
- password: process.env.SQL_PASSWORD,
22
- database: process.env.SQL_DB_NAME,
23
- port: Number(process.env.SQL_PORT) || 5432,
24
- ssl: isLocalhost ? false : { rejectUnauthorized },
25
- },
26
- pool: {
27
- min: 1,
28
- max: connections || 15,
29
- idleTimeoutMillis: 20000,
30
- acquireTimeoutMillis: 30000,
31
- },
32
- migrations: {
33
- tableName: 'knex_migrations',
34
- },
35
- };
36
- KnexManager.knexInstance = knex(config || defaultConfig);
37
- try {
38
- await KnexManager.knexInstance.raw('SELECT 1');
39
- console.info(`Knex connection established`);
40
- } catch (error) {
41
- console.error(`Failed to establish Knex connection:`, error);
42
- KnexManager.knexInstance = null;
43
- throw error;
44
- }
45
- }
46
-
47
- return KnexManager.knexInstance;
48
- }
49
-
50
- /**
51
- * Returns the active connection.
52
- */
53
- static getConnection(): Knex<any, unknown[]> {
54
- if (!KnexManager.knexInstance) {
55
- throw new Error(
56
- 'Knex connection has not been established. Call connect() first.'
57
- );
58
- }
59
- return KnexManager.knexInstance;
60
- }
61
-
62
- /**
63
- * Closes the connection and destroys the instance.
64
- */
65
- static async disconnect(): Promise<void> {
66
- if (KnexManager.knexInstance) {
67
- await KnexManager.knexInstance.destroy();
68
- KnexManager.knexInstance = null;
69
- console.info(`Knex connection closed`);
70
- }
71
- }
72
- }
73
-
74
- export default KnexManager;
1
+ import { knex, Knex } from 'knex';
2
+
3
+ class KnexManager {
4
+ private static knexInstance: Knex<any, unknown[]> | null = null;
5
+
6
+ /**
7
+ * Open a new connection. Reuse the already existing one if there's any.
8
+ */
9
+ static async connect(
10
+ config?: Knex.Config,
11
+ connections?: number
12
+ ): Promise<Knex<any, unknown[]>> {
13
+ if (!KnexManager.knexInstance) {
14
+ const isLocalhost = process.env.SQL_HOST === 'localhost' || process.env.SQL_HOST === '127.0.0.1';
15
+ const rejectUnauthorized = process.env.SQL_REJECT_UNAUTHORIZED !== 'false';
16
+ const defaultConfig = {
17
+ client: 'pg',
18
+ connection: {
19
+ host: process.env.SQL_HOST,
20
+ user: process.env.SQL_USER,
21
+ password: process.env.SQL_PASSWORD,
22
+ database: process.env.SQL_DB_NAME,
23
+ port: Number(process.env.SQL_PORT) || 5432,
24
+ ssl: isLocalhost ? false : { rejectUnauthorized },
25
+ },
26
+ pool: {
27
+ min: 1,
28
+ max: connections || 15,
29
+ idleTimeoutMillis: 20000,
30
+ acquireTimeoutMillis: 30000,
31
+ },
32
+ migrations: {
33
+ tableName: 'knex_migrations',
34
+ },
35
+ };
36
+ KnexManager.knexInstance = knex(config || defaultConfig);
37
+ try {
38
+ await KnexManager.knexInstance.raw('SELECT 1');
39
+ console.info(`Knex connection established`);
40
+ } catch (error) {
41
+ console.error(`Failed to establish Knex connection:`, error);
42
+ KnexManager.knexInstance = null;
43
+ throw error;
44
+ }
45
+ }
46
+
47
+ return KnexManager.knexInstance;
48
+ }
49
+
50
+ /**
51
+ * Returns the active connection.
52
+ */
53
+ static getConnection(): Knex<any, unknown[]> {
54
+ if (!KnexManager.knexInstance) {
55
+ throw new Error(
56
+ 'Knex connection has not been established. Call connect() first.'
57
+ );
58
+ }
59
+ return KnexManager.knexInstance;
60
+ }
61
+
62
+ /**
63
+ * Closes the connection and destroys the instance.
64
+ */
65
+ static async disconnect(): Promise<void> {
66
+ if (KnexManager.knexInstance) {
67
+ await KnexManager.knexInstance.destroy();
68
+ KnexManager.knexInstance = null;
69
+ console.info(`Knex connection closed`);
70
+ }
71
+ }
72
+ }
73
+
74
+ export default KnexManager;
@@ -1,18 +1,18 @@
1
- export interface IBaseDAO<T> {
2
- create(item: T): Promise<T>;
3
- getById(id: number): Promise<T | null>;
4
- getByUuid(uuid: string): Promise<T | null>;
5
- update(id: number, item: Partial<T>): Promise<T | null>;
6
- delete(id: number): Promise<boolean>;
7
- getAll(page: number, limit: number): Promise<IDataPaginator<T>>;
8
- }
9
-
10
- export interface IDataPaginator<T> {
11
- success: boolean;
12
- data: T[];
13
- page: number;
14
- limit: number;
15
- count: number;
16
- totalCount: number;
17
- totalPages: number;
18
- }
1
+ export interface IBaseDAO<T> {
2
+ create(item: T): Promise<T>;
3
+ getById(id: number): Promise<T | null>;
4
+ getByUuid(uuid: string): Promise<T | null>;
5
+ update(id: number, item: Partial<T>): Promise<T | null>;
6
+ delete(id: number): Promise<boolean>;
7
+ getAll(page: number, limit: number): Promise<IDataPaginator<T>>;
8
+ }
9
+
10
+ export interface IDataPaginator<T> {
11
+ success: boolean;
12
+ data: T[];
13
+ page: number;
14
+ limit: number;
15
+ count: number;
16
+ totalCount: number;
17
+ totalPages: number;
18
+ }
@@ -1,71 +1,71 @@
1
- import { Knex } from "knex";
2
- import { IBaseDAO, IDataPaginator } from "../../d.types";
3
- import { ISundaysPackageVersion } from "../../interfaces/sundays-package-version/sundays-package-version.interfaces";
4
- import KnexManager from "../../KnexConnection";
5
-
6
- export class SundaysPackageVersionDAO implements IBaseDAO<ISundaysPackageVersion> {
7
- private _knex: Knex<any, unknown[]> = KnexManager.getConnection();
8
-
9
- async create(item: ISundaysPackageVersion): Promise<ISundaysPackageVersion> {
10
- const [created] = await this._knex("sundays_package_version").insert(item).returning("*");
11
- return created;
12
- }
13
-
14
- async getById(id: number): Promise<ISundaysPackageVersion | null> {
15
- const result = await this._knex("sundays_package_version")
16
- .select("*")
17
- .where("id", id)
18
- .first();
19
- return result || null;
20
- }
21
-
22
- async getByUuid(uuid: string): Promise<ISundaysPackageVersion | null> {
23
- const result = await this._knex("sundays_package_version")
24
- .select("*")
25
- .where("uuid", uuid)
26
- .first();
27
- return result || null;
28
- }
29
-
30
- async update(id: number, item: Partial<ISundaysPackageVersion>): Promise<ISundaysPackageVersion | null> {
31
- const [updated] = await this._knex("sundays_package_version")
32
- .where({ id })
33
- .update(item)
34
- .returning("*");
35
- return updated || null;
36
- }
37
-
38
- async delete(id: number): Promise<boolean> {
39
- const result = await this._knex("sundays_package_version").where({ id }).del();
40
- return result > 0;
41
- }
42
-
43
- async getAll(page: number, limit: number): Promise<IDataPaginator<ISundaysPackageVersion>> {
44
- const safeLimit = Math.max(limit, 1);
45
- const offset = (page - 1) * safeLimit;
46
-
47
- const query = this._knex("sundays_package_version").select("*");
48
-
49
- const [countResult] = await query.clone().clearSelect().count("* as count");
50
- const totalCount = +countResult.count;
51
- const data = await query.clone().limit(safeLimit).offset(offset).orderBy("id", "desc");
52
-
53
- return {
54
- success: true,
55
- data,
56
- page,
57
- limit: safeLimit,
58
- count: data.length,
59
- totalCount,
60
- totalPages: Math.ceil(totalCount / safeLimit),
61
- };
62
- }
63
-
64
- async getLatestVersion(): Promise<ISundaysPackageVersion | null> {
65
- const result = await this._knex("sundays_package_version")
66
- .select("*")
67
- .orderBy("id", "desc")
68
- .first();
69
- return result || null;
70
- }
71
- }
1
+ import { Knex } from "knex";
2
+ import { IBaseDAO, IDataPaginator } from "../../d.types";
3
+ import { ISundaysPackageVersion } from "../../interfaces/sundays-package-version/sundays-package-version.interfaces";
4
+ import KnexManager from "../../KnexConnection";
5
+
6
+ export class SundaysPackageVersionDAO implements IBaseDAO<ISundaysPackageVersion> {
7
+ private _knex: Knex<any, unknown[]> = KnexManager.getConnection();
8
+
9
+ async create(item: ISundaysPackageVersion): Promise<ISundaysPackageVersion> {
10
+ const [created] = await this._knex("sundays_package_version").insert(item).returning("*");
11
+ return created;
12
+ }
13
+
14
+ async getById(id: number): Promise<ISundaysPackageVersion | null> {
15
+ const result = await this._knex("sundays_package_version")
16
+ .select("*")
17
+ .where("id", id)
18
+ .first();
19
+ return result || null;
20
+ }
21
+
22
+ async getByUuid(uuid: string): Promise<ISundaysPackageVersion | null> {
23
+ const result = await this._knex("sundays_package_version")
24
+ .select("*")
25
+ .where("uuid", uuid)
26
+ .first();
27
+ return result || null;
28
+ }
29
+
30
+ async update(id: number, item: Partial<ISundaysPackageVersion>): Promise<ISundaysPackageVersion | null> {
31
+ const [updated] = await this._knex("sundays_package_version")
32
+ .where({ id })
33
+ .update(item)
34
+ .returning("*");
35
+ return updated || null;
36
+ }
37
+
38
+ async delete(id: number): Promise<boolean> {
39
+ const result = await this._knex("sundays_package_version").where({ id }).del();
40
+ return result > 0;
41
+ }
42
+
43
+ async getAll(page: number, limit: number): Promise<IDataPaginator<ISundaysPackageVersion>> {
44
+ const safeLimit = Math.max(limit, 1);
45
+ const offset = (page - 1) * safeLimit;
46
+
47
+ const query = this._knex("sundays_package_version").select("*");
48
+
49
+ const [countResult] = await query.clone().clearSelect().count("* as count");
50
+ const totalCount = +countResult.count;
51
+ const data = await query.clone().limit(safeLimit).offset(offset).orderBy("id", "desc");
52
+
53
+ return {
54
+ success: true,
55
+ data,
56
+ page,
57
+ limit: safeLimit,
58
+ count: data.length,
59
+ totalCount,
60
+ totalPages: Math.ceil(totalCount / safeLimit),
61
+ };
62
+ }
63
+
64
+ async getLatestVersion(): Promise<ISundaysPackageVersion | null> {
65
+ const result = await this._knex("sundays_package_version")
66
+ .select("*")
67
+ .orderBy("id", "desc")
68
+ .first();
69
+ return result || null;
70
+ }
71
+ }
@@ -1,9 +1,9 @@
1
- // DAOs
2
- export { SundaysPackageVersionDAO } from "./dao/sundays-package-version/sundays-package-version.dao";
3
-
4
- // Interfaces
5
- export { IDataPaginator } from "./d.types";
6
- export { ISundaysPackageVersion } from "./interfaces/sundays-package-version/sundays-package-version.interfaces";
7
-
8
- import KnexManager from './KnexConnection';
9
- export { KnexManager };
1
+ // DAOs
2
+ export { SundaysPackageVersionDAO } from "./dao/sundays-package-version/sundays-package-version.dao";
3
+
4
+ // Interfaces
5
+ export { IDataPaginator } from "./d.types";
6
+ export { ISundaysPackageVersion } from "./interfaces/sundays-package-version/sundays-package-version.interfaces";
7
+
8
+ import KnexManager from './KnexConnection';
9
+ export { KnexManager };
@@ -1,6 +1,6 @@
1
- export interface ISundaysPackageVersion {
2
- id: number;
3
- versionName: string;
4
- createdAt: string;
5
- updatedAt: string;
6
- }
1
+ export interface ISundaysPackageVersion {
2
+ id: number;
3
+ versionName: string;
4
+ createdAt: string;
5
+ updatedAt: string;
6
+ }
@@ -1,16 +1,16 @@
1
- {
2
- "compilerOptions": {
3
- "module": "CommonJS",
4
- "target": "ES2022",
5
- "sourceMap": true,
6
- "esModuleInterop": true,
7
- "strict": true,
8
- "declaration": true,
9
- "rootDir": "./src",
10
- "outDir": "./dist",
11
- "skipLibCheck": true,
12
- "forceConsistentCasingInFileNames": true
13
- },
14
- "include": ["src/**/*"],
15
- "exclude": ["node_modules", "dist"]
16
- }
1
+ {
2
+ "compilerOptions": {
3
+ "module": "CommonJS",
4
+ "target": "ES2022",
5
+ "sourceMap": true,
6
+ "esModuleInterop": true,
7
+ "strict": true,
8
+ "declaration": true,
9
+ "rootDir": "./src",
10
+ "outDir": "./dist",
11
+ "skipLibCheck": true,
12
+ "forceConsistentCasingInFileNames": true
13
+ },
14
+ "include": ["src/**/*"],
15
+ "exclude": ["node_modules", "dist"]
16
+ }
@@ -1,20 +1,20 @@
1
- const eslint = require('@eslint/js');
2
- const tseslint = require('typescript-eslint');
3
-
4
- module.exports = tseslint.config(
5
- eslint.configs.recommended,
6
- ...tseslint.configs.recommended,
7
- {
8
- languageOptions: {
9
- parserOptions: {
10
- project: './tsconfig.json',
11
- },
12
- },
13
- rules: {},
14
- },
15
- {
16
- ignores: ['dist/', 'node_modules/'],
17
- }
18
- );
19
-
20
- //# sourceMappingURL=eslint.config.js.map
1
+ const eslint = require('@eslint/js');
2
+ const tseslint = require('typescript-eslint');
3
+
4
+ module.exports = tseslint.config(
5
+ eslint.configs.recommended,
6
+ ...tseslint.configs.recommended,
7
+ {
8
+ languageOptions: {
9
+ parserOptions: {
10
+ project: './tsconfig.json',
11
+ },
12
+ },
13
+ rules: {},
14
+ },
15
+ {
16
+ ignores: ['dist/', 'node_modules/'],
17
+ }
18
+ );
19
+
20
+ //# sourceMappingURL=eslint.config.js.map