create-carlonicora-app 1.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 (149) hide show
  1. package/LICENSE +675 -0
  2. package/README.md +104 -0
  3. package/bin/cli.js +3 -0
  4. package/dist/cli.d.ts +2 -0
  5. package/dist/cli.d.ts.map +1 -0
  6. package/dist/cli.js +92 -0
  7. package/dist/cli.js.map +1 -0
  8. package/dist/git.d.ts +7 -0
  9. package/dist/git.d.ts.map +1 -0
  10. package/dist/git.js +80 -0
  11. package/dist/git.js.map +1 -0
  12. package/dist/index.d.ts +5 -0
  13. package/dist/index.d.ts.map +1 -0
  14. package/dist/index.js +5 -0
  15. package/dist/index.js.map +1 -0
  16. package/dist/prompts.d.ts +5 -0
  17. package/dist/prompts.d.ts.map +1 -0
  18. package/dist/prompts.js +30 -0
  19. package/dist/prompts.js.map +1 -0
  20. package/dist/replacer.d.ts +9 -0
  21. package/dist/replacer.d.ts.map +1 -0
  22. package/dist/replacer.js +11 -0
  23. package/dist/replacer.js.map +1 -0
  24. package/dist/scaffold.d.ts +3 -0
  25. package/dist/scaffold.d.ts.map +1 -0
  26. package/dist/scaffold.js +79 -0
  27. package/dist/scaffold.js.map +1 -0
  28. package/dist/types/index.d.ts +16 -0
  29. package/dist/types/index.d.ts.map +1 -0
  30. package/dist/types/index.js +2 -0
  31. package/dist/types/index.js.map +1 -0
  32. package/dist/utils/files.d.ts +6 -0
  33. package/dist/utils/files.d.ts.map +1 -0
  34. package/dist/utils/files.js +103 -0
  35. package/dist/utils/files.js.map +1 -0
  36. package/dist/utils/logger.d.ts +12 -0
  37. package/dist/utils/logger.d.ts.map +1 -0
  38. package/dist/utils/logger.js +35 -0
  39. package/dist/utils/logger.js.map +1 -0
  40. package/dist/utils/validation.d.ts +6 -0
  41. package/dist/utils/validation.d.ts.map +1 -0
  42. package/dist/utils/validation.js +63 -0
  43. package/dist/utils/validation.js.map +1 -0
  44. package/package.json +52 -0
  45. package/template/.env.example +159 -0
  46. package/template/.github/workflows/check-library-updates.yml +71 -0
  47. package/template/.github/workflows/dev.yml +63 -0
  48. package/template/.github/workflows/pull-request.yml +55 -0
  49. package/template/.gitmodules +6 -0
  50. package/template/.husky/pre-commit +1 -0
  51. package/template/.husky/pre-push +1 -0
  52. package/template/.prettierignore +1 -0
  53. package/template/.prettierrc +13 -0
  54. package/template/.releaserc +134 -0
  55. package/template/.vscode/settings.json +16 -0
  56. package/template/CHANGELOG.md +0 -0
  57. package/template/CLAUDE.md +34 -0
  58. package/template/DOCKER.md +1591 -0
  59. package/template/Dockerfile +228 -0
  60. package/template/README.md +1 -0
  61. package/template/apps/api/.prettierrc +12 -0
  62. package/template/apps/api/eslint.config.mjs +54 -0
  63. package/template/apps/api/jest.config.js +29 -0
  64. package/template/apps/api/nest-cli.json +15 -0
  65. package/template/apps/api/package.json +155 -0
  66. package/template/apps/api/src/config/config.ts +17 -0
  67. package/template/apps/api/src/config/enums/job.name.ts +6 -0
  68. package/template/apps/api/src/config/enums/queue.id.ts +3 -0
  69. package/template/apps/api/src/config/interfaces/config.interface.ts +3 -0
  70. package/template/apps/api/src/features/features.modules.ts +6 -0
  71. package/template/apps/api/src/i18n/en/notifications.json +3 -0
  72. package/template/apps/api/src/main.ts +23 -0
  73. package/template/apps/api/src/neo4j.migrations/20250901_001.ts +33 -0
  74. package/template/apps/api/src/neo4j.migrations/20250901_002.ts +90 -0
  75. package/template/apps/api/src/neo4j.migrations/20250901_003.ts +57 -0
  76. package/template/apps/api/src/neo4j.migrations/20250901_004.ts +32 -0
  77. package/template/apps/api/src/neo4j.migrations/queries/migration.queries.ts +49 -0
  78. package/template/apps/api/src/types/langchain.d.ts +56 -0
  79. package/template/apps/api/tsconfig.build.json +4 -0
  80. package/template/apps/api/tsconfig.json +38 -0
  81. package/template/apps/web/.swcrc +26 -0
  82. package/template/apps/web/components.json +21 -0
  83. package/template/apps/web/eslint.config.mjs +33 -0
  84. package/template/apps/web/global.d.ts +7 -0
  85. package/template/apps/web/messages/en.json +249 -0
  86. package/template/apps/web/next.config.js +50 -0
  87. package/template/apps/web/package.json +146 -0
  88. package/template/apps/web/playwright.config.ts +86 -0
  89. package/template/apps/web/postcss.config.mjs +5 -0
  90. package/template/apps/web/public/sw.js +32 -0
  91. package/template/apps/web/src/app/[locale]/(admin)/administration/companies/[id]/page.tsx +46 -0
  92. package/template/apps/web/src/app/[locale]/(admin)/administration/companies/page.tsx +23 -0
  93. package/template/apps/web/src/app/[locale]/(admin)/layout.tsx +49 -0
  94. package/template/apps/web/src/app/[locale]/(auth)/activation/[code]/page.tsx +13 -0
  95. package/template/apps/web/src/app/[locale]/(auth)/auth/page.tsx +11 -0
  96. package/template/apps/web/src/app/[locale]/(auth)/invitation/[code]/page.tsx +7 -0
  97. package/template/apps/web/src/app/[locale]/(auth)/layout.tsx +9 -0
  98. package/template/apps/web/src/app/[locale]/(auth)/login/page.tsx +6 -0
  99. package/template/apps/web/src/app/[locale]/(auth)/logout/page.tsx +5 -0
  100. package/template/apps/web/src/app/[locale]/(auth)/register/page.tsx +6 -0
  101. package/template/apps/web/src/app/[locale]/(auth)/reset/[code]/page.tsx +7 -0
  102. package/template/apps/web/src/app/[locale]/(main)/(foundations)/notifications/page.tsx +9 -0
  103. package/template/apps/web/src/app/[locale]/(main)/(foundations)/roles/[id]/page.tsx +23 -0
  104. package/template/apps/web/src/app/[locale]/(main)/(foundations)/roles/page.tsx +12 -0
  105. package/template/apps/web/src/app/[locale]/(main)/(foundations)/users/[id]/error.tsx +14 -0
  106. package/template/apps/web/src/app/[locale]/(main)/(foundations)/users/[id]/loading.tsx +21 -0
  107. package/template/apps/web/src/app/[locale]/(main)/(foundations)/users/[id]/page.tsx +46 -0
  108. package/template/apps/web/src/app/[locale]/(main)/(foundations)/users/page.tsx +17 -0
  109. package/template/apps/web/src/app/[locale]/(main)/error.tsx +62 -0
  110. package/template/apps/web/src/app/[locale]/(main)/layout.tsx +40 -0
  111. package/template/apps/web/src/app/[locale]/(main)/page.tsx +41 -0
  112. package/template/apps/web/src/app/[locale]/layout.tsx +54 -0
  113. package/template/apps/web/src/app/globals.css +256 -0
  114. package/template/apps/web/src/config/BootstrapProvider.tsx +13 -0
  115. package/template/apps/web/src/config/Bootstrapper.ts +77 -0
  116. package/template/apps/web/src/config/env.ts +51 -0
  117. package/template/apps/web/src/config/middleware-env.ts +14 -0
  118. package/template/apps/web/src/enums/feature.ids.ts +3 -0
  119. package/template/apps/web/src/features/common/components/containers/IndexContainer.tsx +11 -0
  120. package/template/apps/web/src/features/common/components/details/LayoutDetails.tsx +33 -0
  121. package/template/apps/web/src/features/common/components/navigations/CommonSidebar.tsx +233 -0
  122. package/template/apps/web/src/features/common/components/navigations/CreationDropDown.tsx +117 -0
  123. package/template/apps/web/src/features/common/components/navigations/UserSidebarFooter.tsx +115 -0
  124. package/template/apps/web/src/features/common/components/navigations/VersionDisplay.tsx +18 -0
  125. package/template/apps/web/src/features/common/contexts/ErrorContext.tsx +62 -0
  126. package/template/apps/web/src/i18n/request.ts +13 -0
  127. package/template/apps/web/src/i18n/routing.ts +9 -0
  128. package/template/apps/web/src/i18n/useDateFnsLocale.ts +15 -0
  129. package/template/apps/web/src/proxy.ts +107 -0
  130. package/template/apps/web/src/server-actions/auth-cookies.ts +134 -0
  131. package/template/apps/web/src/types/modules.d.ts +10 -0
  132. package/template/apps/web/src/utils/metadata.ts +50 -0
  133. package/template/apps/web/src/utils/revalidation.ts +7 -0
  134. package/template/apps/web/tsconfig.json +51 -0
  135. package/template/docker-compose.yml +211 -0
  136. package/template/package.json +72 -0
  137. package/template/packages/nestjs-neo4jsonapi/.gitkeep +0 -0
  138. package/template/packages/nextjs-jsonapi/.gitkeep +0 -0
  139. package/template/packages/shared/package.json +23 -0
  140. package/template/packages/shared/src/const/roles.id.ts +5 -0
  141. package/template/packages/shared/src/const/system.roles.id.ts +4 -0
  142. package/template/packages/shared/src/index.ts +1 -0
  143. package/template/packages/shared/tsconfig.json +10 -0
  144. package/template/packages/shared/tsup.config.ts +16 -0
  145. package/template/pnpm-workspace.yaml +3 -0
  146. package/template/tsconfig.base.json +62 -0
  147. package/template/tsconfig.json +12 -0
  148. package/template/turbo.json +88 -0
  149. package/template/versions.production.json +4 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"files.js","sourceRoot":"","sources":["../../src/utils/files.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,12 @@
1
+ export declare const logger: {
2
+ info: (message: string) => void;
3
+ success: (message: string) => void;
4
+ warn: (message: string) => void;
5
+ error: (message: string) => void;
6
+ title: (message: string) => void;
7
+ step: (step: number, total: number, message: string) => void;
8
+ command: (cmd: string) => void;
9
+ newline: () => void;
10
+ };
11
+ export declare function printSuccessMessage(projectName: string, targetDir: string): void;
12
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,MAAM;oBACD,MAAM;uBACH,MAAM;oBACT,MAAM;qBACL,MAAM;qBAEN,MAAM;iBAEV,MAAM,SAAS,MAAM,WAAW,MAAM;mBAGpC,MAAM;;CAGtB,CAAC;AAEF,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,IAAI,CAsBhF"}
@@ -0,0 +1,35 @@
1
+ import chalk from 'chalk';
2
+ export const logger = {
3
+ info: (message) => console.log(chalk.blue('info'), message),
4
+ success: (message) => console.log(chalk.green('success'), message),
5
+ warn: (message) => console.log(chalk.yellow('warn'), message),
6
+ error: (message) => console.log(chalk.red('error'), message),
7
+ title: (message) => console.log(chalk.bold.cyan(`\n${message}\n`)),
8
+ step: (step, total, message) => console.log(chalk.gray(`[${step}/${total}]`), message),
9
+ command: (cmd) => console.log(chalk.cyan(` ${cmd}`)),
10
+ newline: () => console.log(),
11
+ };
12
+ export function printSuccessMessage(projectName, targetDir) {
13
+ console.log();
14
+ console.log(chalk.green.bold('Success!'), `Created ${chalk.cyan(projectName)} at ${chalk.gray(targetDir)}`);
15
+ console.log();
16
+ console.log('Inside that directory, you can run several commands:');
17
+ console.log();
18
+ console.log(chalk.cyan(' pnpm dev'));
19
+ console.log(' Starts the development server');
20
+ console.log();
21
+ console.log(chalk.cyan(' pnpm build'));
22
+ console.log(' Builds the app for production');
23
+ console.log();
24
+ console.log(chalk.cyan(' pnpm test'));
25
+ console.log(' Runs the test suite');
26
+ console.log();
27
+ console.log('We suggest that you begin by typing:');
28
+ console.log();
29
+ console.log(chalk.cyan(` cd ${projectName}`));
30
+ console.log(chalk.cyan(' cp .env.example .env'));
31
+ console.log(chalk.gray(' # Edit .env with your configuration'));
32
+ console.log(chalk.cyan(' pnpm dev'));
33
+ console.log();
34
+ }
35
+ //# sourceMappingURL=logger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { ValidationResult } from '../types/index.js';
2
+ export declare function validateProjectName(name: string): ValidationResult;
3
+ export declare function toKebabCase(str: string): string;
4
+ export declare function toPascalCase(str: string): string;
5
+ export declare function toCamelCase(str: string): string;
6
+ //# sourceMappingURL=validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAuB1D,wBAAgB,mBAAmB,CAAC,IAAI,EAAE,MAAM,GAAG,gBAAgB,CAgClE;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAK/C;AAED,wBAAgB,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAKhD;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAG/C"}
@@ -0,0 +1,63 @@
1
+ const RESERVED_NAMES = [
2
+ 'node_modules',
3
+ 'favicon.ico',
4
+ 'package',
5
+ 'npm',
6
+ 'test',
7
+ 'tests',
8
+ 'src',
9
+ 'dist',
10
+ 'build',
11
+ 'public',
12
+ 'static',
13
+ 'assets',
14
+ 'app',
15
+ 'api',
16
+ 'web',
17
+ ];
18
+ // Valid npm package name pattern (kebab-case)
19
+ const NPM_NAME_REGEX = /^(?:@[a-z0-9-*~][a-z0-9-*._~]*\/)?[a-z0-9-~][a-z0-9-._~]*$/;
20
+ export function validateProjectName(name) {
21
+ // Must not be empty
22
+ if (!name || name.trim() === '') {
23
+ return { valid: false, message: 'Project name cannot be empty' };
24
+ }
25
+ const trimmedName = name.trim();
26
+ // Must be valid npm package name (kebab-case)
27
+ if (!NPM_NAME_REGEX.test(trimmedName)) {
28
+ return {
29
+ valid: false,
30
+ message: 'Project name must be lowercase, kebab-case (e.g., my-project)',
31
+ };
32
+ }
33
+ // Must not be a reserved name
34
+ if (RESERVED_NAMES.includes(trimmedName.toLowerCase())) {
35
+ return { valid: false, message: `"${trimmedName}" is a reserved name` };
36
+ }
37
+ // Must not start with a dot or underscore
38
+ if (trimmedName.startsWith('.') || trimmedName.startsWith('_')) {
39
+ return { valid: false, message: 'Project name cannot start with a dot or underscore' };
40
+ }
41
+ // Reasonable length limit
42
+ if (trimmedName.length > 100) {
43
+ return { valid: false, message: 'Project name is too long (max 100 characters)' };
44
+ }
45
+ return { valid: true };
46
+ }
47
+ export function toKebabCase(str) {
48
+ return str
49
+ .replace(/([a-z])([A-Z])/g, '$1-$2')
50
+ .replace(/[\s_]+/g, '-')
51
+ .toLowerCase();
52
+ }
53
+ export function toPascalCase(str) {
54
+ return str
55
+ .split(/[-_\s]+/)
56
+ .map((word) => word.charAt(0).toUpperCase() + word.slice(1).toLowerCase())
57
+ .join('');
58
+ }
59
+ export function toCamelCase(str) {
60
+ const pascal = toPascalCase(str);
61
+ return pascal.charAt(0).toLowerCase() + pascal.slice(1);
62
+ }
63
+ //# sourceMappingURL=validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAEA,MAAM,cAAc,GAAG;IACrB,cAAc;IACd,aAAa;IACb,SAAS;IACT,KAAK;IACL,MAAM;IACN,OAAO;IACP,KAAK;IACL,MAAM;IACN,OAAO;IACP,QAAQ;IACR,QAAQ;IACR,QAAQ;IACR,KAAK;IACL,KAAK;IACL,KAAK;CACN,CAAC;AAEF,8CAA8C;AAC9C,MAAM,cAAc,GAAG,4DAA4D,CAAC;AAEpF,MAAM,UAAU,mBAAmB,CAAC,IAAY;IAC9C,oBAAoB;IACpB,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QAChC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,8BAA8B,EAAE,CAAC;IACnE,CAAC;IAED,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEhC,8CAA8C;IAC9C,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,WAAW,CAAC,EAAE,CAAC;QACtC,OAAO;YACL,KAAK,EAAE,KAAK;YACZ,OAAO,EAAE,+DAA+D;SACzE,CAAC;IACJ,CAAC;IAED,8BAA8B;IAC9B,IAAI,cAAc,CAAC,QAAQ,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,EAAE,CAAC;QACvD,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,WAAW,sBAAsB,EAAE,CAAC;IAC1E,CAAC;IAED,0CAA0C;IAC1C,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,WAAW,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QAC/D,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,oDAAoD,EAAE,CAAC;IACzF,CAAC;IAED,0BAA0B;IAC1B,IAAI,WAAW,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAC7B,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,+CAA+C,EAAE,CAAC;IACpF,CAAC;IAED,OAAO,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,OAAO,GAAG;SACP,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC;SACnC,OAAO,CAAC,SAAS,EAAE,GAAG,CAAC;SACvB,WAAW,EAAE,CAAC;AACnB,CAAC;AAED,MAAM,UAAU,YAAY,CAAC,GAAW;IACtC,OAAO,GAAG;SACP,KAAK,CAAC,SAAS,CAAC;SAChB,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;SACzE,IAAI,CAAC,EAAE,CAAC,CAAC;AACd,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,GAAW;IACrC,MAAM,MAAM,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AAC1D,CAAC"}
package/package.json ADDED
@@ -0,0 +1,52 @@
1
+ {
2
+ "name": "create-carlonicora-app",
3
+ "version": "1.0.0",
4
+ "description": "Create a NestJS + Next.js monorepo project with Neo4j and JSON:API",
5
+ "main": "dist/index.js",
6
+ "type": "module",
7
+ "bin": {
8
+ "create-carlonicora-app": "./bin/cli.js"
9
+ },
10
+ "files": [
11
+ "dist",
12
+ "bin",
13
+ "template"
14
+ ],
15
+ "scripts": {
16
+ "build": "tsc",
17
+ "dev": "tsc --watch",
18
+ "sync-template": "node scripts/sync-template.js",
19
+ "prepublishOnly": "npm run build"
20
+ },
21
+ "keywords": [
22
+ "cli",
23
+ "scaffold",
24
+ "nestjs",
25
+ "nextjs",
26
+ "monorepo",
27
+ "template",
28
+ "neo4j",
29
+ "jsonapi"
30
+ ],
31
+ "author": "Carlo Nicora",
32
+ "license": "GPL-3.0",
33
+ "repository": {
34
+ "type": "git",
35
+ "url": "https://github.com/carlonicora/create-carlonicora-app"
36
+ },
37
+ "engines": {
38
+ "node": ">=18.0.0"
39
+ },
40
+ "dependencies": {
41
+ "@inquirer/prompts": "^7.0.0",
42
+ "chalk": "^5.3.0",
43
+ "commander": "^12.0.0",
44
+ "fs-extra": "^11.2.0",
45
+ "ora": "^8.0.0"
46
+ },
47
+ "devDependencies": {
48
+ "@types/fs-extra": "^11.0.4",
49
+ "@types/node": "^22.0.0",
50
+ "typescript": "^5.6.0"
51
+ }
52
+ }
@@ -0,0 +1,159 @@
1
+ # =============================================================================
2
+ # API CONFIGURATION (API)
3
+ # =============================================================================
4
+ API_URL="http://api.{{name}}.test:3950/"
5
+ API_PORT=3950
6
+ API_NODE_OPTIONS="--max-old-space-size=6144"
7
+ WORKER_NODE_OPTIONS="--max-old-space-size=6144"
8
+
9
+ # =============================================================================
10
+ # WEB APP CONFIGURATION (WEB)
11
+ # =============================================================================
12
+ APP_URL="http://{{name}}.test:3951/"
13
+ NEXT_PUBLIC_API_URL="http://api.{{name}}.test:3950/"
14
+ NEXT_PUBLIC_ADDRESS="http://{{name}}.test:3951"
15
+ PORT=3951
16
+ WEB_NODE_OPTIONS="--max-old-space-size=4096"
17
+
18
+ # =============================================================================
19
+ # LOGGING
20
+ # =============================================================================
21
+ CONSOLE_ENABLED=true
22
+
23
+ # =============================================================================
24
+ # DATABASE - NEO4J (API)
25
+ # =============================================================================
26
+ NEO4J_URI=bolt://localhost:7687
27
+ NEO4J_USER=neo4j
28
+ NEO4J_PASSWORD=password
29
+ NEO4J_DATABASE={{name}}
30
+
31
+ # =============================================================================
32
+ # CACHE & QUEUE - REDIS (API)
33
+ # =============================================================================
34
+ REDIS_HOST=localhost
35
+ REDIS_PASSWORD=
36
+ REDIS_PORT=6379
37
+ REDIS_USERNAME=
38
+ REDIS_QUEUE={{name}}
39
+
40
+ # =============================================================================
41
+ # CACHE CONFIGURATION (API)
42
+ # =============================================================================
43
+ CACHE_ENABLED=false
44
+ CACHE_DEFAULT_TTL=600
45
+ CACHE_SKIP_PATTERNS=""
46
+
47
+ # =============================================================================
48
+ # AUTHENTICATION - JWT (API)
49
+ # =============================================================================
50
+ JWT_SECRET="{{name}}_SECRET"
51
+ JWT_EXPIRES_IN="1d"
52
+
53
+ # =============================================================================
54
+ # WEB PUSH - VAPID (API & WEB)
55
+ # =============================================================================
56
+ VAPID_PUBLIC_KEY=""
57
+ VAPID_PRIVATE_KEY=""
58
+ VAPID_EMAIL=""
59
+
60
+ # Web-specific VAPID public key (for client-side use)
61
+ NEXT_PUBLIC_VAPID_PUBLIC_KEY=
62
+
63
+ # =============================================================================
64
+ # EMAIL CONFIGURATION (API)
65
+ # =============================================================================
66
+ EMAIL_PROVIDER=
67
+ EMAIL_API_KEY=
68
+ EMAIL_FROM=
69
+
70
+ # =============================================================================
71
+ # LOGGING - LOKI (API)
72
+ # =============================================================================
73
+ LOKI_ENABLED=true
74
+ LOKI_HOST=http://api.{{name}}.test:3100
75
+ # LOKI_USERNAME=your_username
76
+ # LOKI_PASSWORD=your_password
77
+ LOKI_APP_LABEL={{name}}-api
78
+
79
+ # =============================================================================
80
+ # TRACING - TEMPO (API)
81
+ # =============================================================================
82
+ TEMPO_ENABLED=true
83
+ TEMPO_ENDPOINT=http://localhost:4318/v1/traces
84
+ TEMPO_SERVICE_NAME={{name}}-api
85
+ TEMPO_SERVICE_VERSION=1.0.0
86
+
87
+ # =============================================================================
88
+ # OBJECT STORAGE - S3 / MINIO (API)
89
+ # =============================================================================
90
+ S3_TYPE="minio"
91
+ S3_ENDPOINT="http://minio.{{name}}.test:9000/"
92
+ S3_BUCKET="{{name}}"
93
+ S3_ACCESS_KEY_ID="minioadmin"
94
+ S3_SECRET_ACCESS_KEY="minioadmin"
95
+ S3_REGION=""
96
+
97
+ # =============================================================================
98
+ # RATE LIMITING / THROTTLER (API)
99
+ # =============================================================================
100
+ RATE_LIMIT_ENABLED=true
101
+ RATE_LIMIT_TTL=60000
102
+ RATE_LIMIT_REQUESTS=1000
103
+ IP_RATE_LIMIT_REQUESTS=200
104
+
105
+ # =============================================================================
106
+ # CORS CONFIGURATION (API)
107
+ # =============================================================================
108
+ CORS_ORIGINS=http://{{name}}.test:3951
109
+ CORS_ORIGIN_PATTERNS=
110
+ CORS_CREDENTIALS=true
111
+ CORS_METHODS=GET,HEAD,PUT,PATCH,POST,DELETE,OPTIONS
112
+ CORS_ALLOWED_HEADERS=Content-Type,Authorization,X-Requested-With,x-language,x-companyid
113
+ CORS_MAX_AGE=86400
114
+ CORS_PREFLIGHT_CONTINUE=false
115
+ CORS_OPTIONS_SUCCESS_STATUS=204
116
+ CORS_LOG_VIOLATIONS=false
117
+
118
+ # =============================================================================
119
+ # IMAGE SOURCES (WEB)
120
+ # =============================================================================
121
+ IMAGE_SOURCES=http://localhost:9000,http://host.docker.internal:9000,http://minio.{{name}}.test:9000
122
+
123
+ # =============================================================================
124
+ # AI
125
+ # =============================================================================
126
+ AI_PROVIDER=
127
+ AI_API_KEY=
128
+ AI_MODEL=
129
+ AI_URL=
130
+ AI_REGION=
131
+ AI_SECRET=
132
+ AI_INSTANCE=
133
+ AI_API_VERSION=
134
+ AI_INPUT_COST_PER_1M_TOKENS=0.1
135
+ AI_OUTPUT_COST_PER_1M_TOKENS=0.4
136
+
137
+ # =============================================================================
138
+ # EMBEDDER (API)
139
+ # =============================================================================
140
+ EMBEDDER_PROVIDER=
141
+ EMBEDDER_API_KEY=
142
+ EMBEDDER_MODEL=
143
+ EMBEDDER_URL=
144
+ EMBEDDER_INSTANCE=
145
+ EMBEDDER_API_VERSION=
146
+ EMBEDDER_DIMENSIONS=3072
147
+
148
+ # =============================================================================
149
+ # RATE LIMITER / THROTTLER (API)
150
+ # =============================================================================
151
+ RATE_LIMIT_ENABLED=true
152
+ RATE_LIMIT_TTL=60000
153
+ RATE_LIMIT_REQUESTS=1000
154
+ IP_RATE_LIMIT_REQUESTS=200
155
+
156
+ # =============================================================================
157
+ # GOOGLE API KEYS (API & WEB)
158
+ # =============================================================================
159
+ NEXT_PUBLIC_GOOGLE_MAPS_API_KEY=""
@@ -0,0 +1,71 @@
1
+ name: Check Library Updates
2
+
3
+ on:
4
+ schedule:
5
+ - cron: '0 8 * * *' # Daily at 8 AM UTC
6
+ workflow_dispatch: # Manual trigger
7
+
8
+ permissions:
9
+ contents: write
10
+ pull-requests: write
11
+
12
+ jobs:
13
+ check-updates:
14
+ runs-on: ubuntu-latest
15
+ steps:
16
+ - uses: actions/checkout@v4
17
+
18
+ - uses: actions/setup-node@v4
19
+ with:
20
+ node-version: 22
21
+
22
+ - name: Check for updates
23
+ id: check
24
+ run: |
25
+ # Read current versions
26
+ CURRENT=$(cat versions.production.json)
27
+
28
+ # Check latest versions from npm
29
+ NESTJS_LATEST=$(npm view @carlonicora/nestjs-neo4jsonapi version 2>/dev/null || echo "")
30
+ NEXTJS_LATEST=$(npm view @carlonicora/nextjs-jsonapi version 2>/dev/null || echo "")
31
+
32
+ NESTJS_CURRENT=$(echo "$CURRENT" | jq -r '.["@carlonicora/nestjs-neo4jsonapi"]')
33
+ NEXTJS_CURRENT=$(echo "$CURRENT" | jq -r '.["@carlonicora/nextjs-jsonapi"]')
34
+
35
+ UPDATES=""
36
+
37
+ if [ -n "$NESTJS_LATEST" ] && [ "$NESTJS_LATEST" != "$NESTJS_CURRENT" ]; then
38
+ UPDATES="$UPDATES nestjs-neo4jsonapi:$NESTJS_CURRENT→$NESTJS_LATEST"
39
+ jq --arg v "$NESTJS_LATEST" '.["@carlonicora/nestjs-neo4jsonapi"] = $v' versions.production.json > tmp.json && mv tmp.json versions.production.json
40
+ fi
41
+
42
+ if [ -n "$NEXTJS_LATEST" ] && [ "$NEXTJS_LATEST" != "$NEXTJS_CURRENT" ]; then
43
+ UPDATES="$UPDATES nextjs-jsonapi:$NEXTJS_CURRENT→$NEXTJS_LATEST"
44
+ jq --arg v "$NEXTJS_LATEST" '.["@carlonicora/nextjs-jsonapi"] = $v' versions.production.json > tmp.json && mv tmp.json versions.production.json
45
+ fi
46
+
47
+ if [ -n "$UPDATES" ]; then
48
+ echo "updates=true" >> $GITHUB_OUTPUT
49
+ echo "changes=$UPDATES" >> $GITHUB_OUTPUT
50
+ else
51
+ echo "updates=false" >> $GITHUB_OUTPUT
52
+ fi
53
+
54
+ - name: Create Pull Request
55
+ if: steps.check.outputs.updates == 'true'
56
+ uses: peter-evans/create-pull-request@v6
57
+ with:
58
+ token: ${{ secrets.GITHUB_TOKEN }}
59
+ commit-message: "chore(deps): update library versions"
60
+ title: "chore(deps): update library versions"
61
+ body: |
62
+ Updates detected: ${{ steps.check.outputs.changes }}
63
+
64
+ This PR updates the production library versions in `versions.production.json`.
65
+
66
+ **Review the changelogs before merging:**
67
+ - [nestjs-neo4jsonapi releases](https://github.com/carlonicora/nestjs-neo4jsonapi/releases)
68
+ - [nextjs-jsonapi releases](https://github.com/carlonicora/nextjs-jsonapi/releases)
69
+ branch: deps/library-updates
70
+ base: dev
71
+ delete-branch: true
@@ -0,0 +1,63 @@
1
+ name: Dev
2
+
3
+ on:
4
+ push:
5
+ branches:
6
+ - dev
7
+
8
+ permissions:
9
+ contents: write
10
+
11
+ jobs:
12
+ build:
13
+ runs-on: ubuntu-latest
14
+
15
+ strategy:
16
+ matrix:
17
+ node-version: [22.x]
18
+
19
+ steps:
20
+ - uses: actions/checkout@v4
21
+ with:
22
+ fetch-depth: 0
23
+
24
+ - name: Install pnpm
25
+ uses: pnpm/action-setup@v4
26
+
27
+ - name: Use Node.js 22.x
28
+ uses: actions/setup-node@v4
29
+ with:
30
+ node-version: "22.x"
31
+ cache: "pnpm"
32
+
33
+ - name: Install Dependencies
34
+ run: |
35
+ sed -i '/nestjs-neo4jsonapi/d; /nextjs-jsonapi/d' pnpm-workspace.yaml
36
+ pnpm install --no-frozen-lockfile
37
+
38
+ - name: Create .env file
39
+ run: |
40
+ cat > .env << EOF
41
+ NEXT_PUBLIC_API_URL=http://localhost:3000
42
+ NEXT_PUBLIC_ADDRESS=http://localhost:3001
43
+ NEXT_PUBLIC_VAPID_PUBLIC_KEY=placeholder
44
+ EOF
45
+
46
+ - name: Build shared package
47
+ run: pnpm --filter @{{name}}/shared build
48
+
49
+ - name: Build API
50
+ run: pnpm --filter {{name}}-api build
51
+ env:
52
+ NODE_OPTIONS: --max-old-space-size=4096
53
+
54
+ - name: Build Web
55
+ run: pnpm --filter {{name}}-web build
56
+ env:
57
+ NODE_OPTIONS: --max-old-space-size=4096
58
+
59
+ - name: Create Tag
60
+ env:
61
+ GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
62
+ HUSKY: "0"
63
+ run: pnpm dlx semantic-release
@@ -0,0 +1,55 @@
1
+ name: Pull Request
2
+
3
+ on:
4
+ pull_request:
5
+ types:
6
+ - opened
7
+ - synchronize
8
+
9
+ jobs:
10
+ build:
11
+ runs-on: ubuntu-latest
12
+
13
+ strategy:
14
+ matrix:
15
+ node-version: [22.x]
16
+
17
+ steps:
18
+ - uses: actions/checkout@v4
19
+ with:
20
+ fetch-depth: 0
21
+
22
+ - name: Install pnpm
23
+ uses: pnpm/action-setup@v4
24
+
25
+ - name: Use Node.js 22.x
26
+ uses: actions/setup-node@v4
27
+ with:
28
+ node-version: "22.x"
29
+ cache: "pnpm"
30
+
31
+ - name: Install Dependencies
32
+ run: |
33
+ sed -i '/nestjs-neo4jsonapi/d; /nextjs-jsonapi/d' pnpm-workspace.yaml
34
+ pnpm install --no-frozen-lockfile
35
+
36
+ - name: Create .env file
37
+ run: |
38
+ cat > .env << EOF
39
+ NEXT_PUBLIC_API_URL=http://localhost:3000
40
+ NEXT_PUBLIC_ADDRESS=http://localhost:3001
41
+ NEXT_PUBLIC_VAPID_PUBLIC_KEY=placeholder
42
+ EOF
43
+
44
+ - name: Build shared package
45
+ run: pnpm --filter @{{name}}/shared build
46
+
47
+ - name: Build API
48
+ run: pnpm --filter {{name}}-api build
49
+ env:
50
+ NODE_OPTIONS: --max-old-space-size=4096
51
+
52
+ - name: Build Web
53
+ run: pnpm --filter {{name}}-web build
54
+ env:
55
+ NODE_OPTIONS: --max-old-space-size=4096
@@ -0,0 +1,6 @@
1
+ [submodule "packages/nestjs-neo4jsonapi"]
2
+ path = packages/nestjs-neo4jsonapi
3
+ url = https://github.com/carlonicora/nestjs-neo4jsonapi
4
+ [submodule "packages/nextjs-jsonapi"]
5
+ path = packages/nextjs-jsonapi
6
+ url = https://github.com/carlonicora/nextjs-jsonapi
@@ -0,0 +1 @@
1
+ pnpm lint
@@ -0,0 +1 @@
1
+ pnpm build
@@ -0,0 +1 @@
1
+ node_modules
@@ -0,0 +1,13 @@
1
+ {
2
+ "printWidth": 120,
3
+ "tabWidth": 2,
4
+ "useTabs": false,
5
+ "semi": true,
6
+ "quoteProps": "as-needed",
7
+ "singleQuote": false,
8
+ "trailingComma": "all",
9
+ "bracketSpacing": true,
10
+ "bracketSameLine": false,
11
+ "arrowParens": "always",
12
+ "plugins": ["prettier-plugin-tailwindcss"]
13
+ }