@insureco/cli 0.1.1 → 0.1.4

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 (84) hide show
  1. package/dist/commands/git.d.ts +30 -0
  2. package/dist/commands/git.d.ts.map +1 -0
  3. package/dist/commands/git.js +300 -0
  4. package/dist/commands/git.js.map +1 -0
  5. package/dist/commands/oauth.d.ts +33 -0
  6. package/dist/commands/oauth.d.ts.map +1 -0
  7. package/dist/commands/oauth.js +181 -0
  8. package/dist/commands/oauth.js.map +1 -0
  9. package/dist/commands/user.d.ts +13 -0
  10. package/dist/commands/user.d.ts.map +1 -0
  11. package/dist/commands/user.js +96 -0
  12. package/dist/commands/user.js.map +1 -0
  13. package/dist/index.js +142 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/lib/bio.d.ts +13 -0
  16. package/dist/lib/bio.d.ts.map +1 -0
  17. package/dist/lib/bio.js +53 -0
  18. package/dist/lib/bio.js.map +1 -0
  19. package/dist/lib/builder.d.ts +17 -1
  20. package/dist/lib/builder.d.ts.map +1 -1
  21. package/dist/lib/builder.js +53 -2
  22. package/dist/lib/builder.js.map +1 -1
  23. package/dist/lib/config.js +1 -1
  24. package/dist/lib/config.js.map +1 -1
  25. package/dist/lib/forgejo.d.ts +149 -0
  26. package/dist/lib/forgejo.d.ts.map +1 -0
  27. package/dist/lib/forgejo.js +137 -0
  28. package/dist/lib/forgejo.js.map +1 -0
  29. package/dist/templates/api/.env.example +15 -0
  30. package/dist/templates/api/Dockerfile +45 -0
  31. package/dist/templates/api/README.md +85 -0
  32. package/dist/templates/api/catalog-info.yaml +51 -0
  33. package/dist/templates/api/helm/{{name}}/Chart.yaml +9 -0
  34. package/dist/templates/api/helm/{{name}}/templates/deployment.yaml +68 -0
  35. package/dist/templates/api/helm/{{name}}/templates/service.yaml +17 -0
  36. package/dist/templates/api/helm/{{name}}/values.yaml +55 -0
  37. package/dist/templates/api/package.json +33 -0
  38. package/dist/templates/api/src/index.ts +61 -0
  39. package/dist/templates/api/src/routes/example.ts +162 -0
  40. package/dist/templates/api/tsconfig.json +18 -0
  41. package/dist/templates/crosspod/README.md +87 -0
  42. package/dist/templates/crosspod/service-a/Dockerfile +27 -0
  43. package/dist/templates/crosspod/service-a/catalog-info.yaml +54 -0
  44. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/Chart.yaml +6 -0
  45. package/dist/templates/crosspod/service-a/helm/{{name}}-service-a/values.yaml +35 -0
  46. package/dist/templates/crosspod/service-a/package.json +29 -0
  47. package/dist/templates/crosspod/service-a/src/index.ts +89 -0
  48. package/dist/templates/crosspod/service-a/tsconfig.json +14 -0
  49. package/dist/templates/crosspod/service-b/Dockerfile +27 -0
  50. package/dist/templates/crosspod/service-b/catalog-info.yaml +27 -0
  51. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/Chart.yaml +6 -0
  52. package/dist/templates/crosspod/service-b/helm/{{name}}-service-b/values.yaml +38 -0
  53. package/dist/templates/crosspod/service-b/package.json +26 -0
  54. package/dist/templates/crosspod/service-b/src/index.ts +143 -0
  55. package/dist/templates/crosspod/service-b/tsconfig.json +14 -0
  56. package/dist/templates/nextjs/.env.example +11 -0
  57. package/dist/templates/nextjs/Dockerfile +51 -0
  58. package/dist/templates/nextjs/README.md +87 -0
  59. package/dist/templates/nextjs/catalog-info.yaml +16 -0
  60. package/dist/templates/nextjs/helm/{{name}}/Chart.yaml +9 -0
  61. package/dist/templates/nextjs/helm/{{name}}/templates/deployment.yaml +68 -0
  62. package/dist/templates/nextjs/helm/{{name}}/templates/service.yaml +17 -0
  63. package/dist/templates/nextjs/helm/{{name}}/values.yaml +51 -0
  64. package/dist/templates/nextjs/next.config.js +23 -0
  65. package/dist/templates/nextjs/package.json +29 -0
  66. package/dist/templates/nextjs/public/.gitkeep +0 -0
  67. package/dist/templates/nextjs/src/app/api/example/route.ts +63 -0
  68. package/dist/templates/nextjs/src/app/api/health/route.ts +10 -0
  69. package/dist/templates/nextjs/src/app/layout.tsx +18 -0
  70. package/dist/templates/nextjs/src/app/page.tsx +49 -0
  71. package/dist/templates/nextjs/tsconfig.json +26 -0
  72. package/dist/templates/worker/.env.example +13 -0
  73. package/dist/templates/worker/Dockerfile +26 -0
  74. package/dist/templates/worker/README.md +106 -0
  75. package/dist/templates/worker/catalog-info.yaml +19 -0
  76. package/dist/templates/worker/helm/{{name}}/Chart.yaml +9 -0
  77. package/dist/templates/worker/helm/{{name}}/templates/deployment.yaml +64 -0
  78. package/dist/templates/worker/helm/{{name}}/values.yaml +55 -0
  79. package/dist/templates/worker/package.json +26 -0
  80. package/dist/templates/worker/src/index.ts +185 -0
  81. package/dist/templates/worker/tsconfig.json +14 -0
  82. package/dist/types/index.d.ts +77 -0
  83. package/dist/types/index.d.ts.map +1 -1
  84. package/package.json +3 -2
@@ -0,0 +1,149 @@
1
+ export interface ForgejoRepository {
2
+ id: number;
3
+ name: string;
4
+ full_name: string;
5
+ description: string;
6
+ html_url: string;
7
+ ssh_url: string;
8
+ clone_url: string;
9
+ private: boolean;
10
+ owner: ForgejoUser | ForgejoOrganization;
11
+ default_branch: string;
12
+ created_at: string;
13
+ updated_at: string;
14
+ }
15
+ export interface ForgejoUser {
16
+ id: number;
17
+ login: string;
18
+ full_name: string;
19
+ email: string;
20
+ avatar_url: string;
21
+ is_admin: boolean;
22
+ }
23
+ export interface ForgejoOrganization {
24
+ id: number;
25
+ name: string;
26
+ full_name: string;
27
+ avatar_url: string;
28
+ description: string;
29
+ visibility: string;
30
+ }
31
+ export interface ForgejoWebhook {
32
+ id: number;
33
+ type: string;
34
+ url: string;
35
+ active: boolean;
36
+ events: string[];
37
+ created_at: string;
38
+ }
39
+ export interface ForgejoCreateRepoRequest {
40
+ name: string;
41
+ description?: string;
42
+ private?: boolean;
43
+ auto_init?: boolean;
44
+ default_branch?: string;
45
+ }
46
+ export interface ForgejoCreateWebhookRequest {
47
+ type: 'forgejo' | 'gitea' | 'gogs' | 'slack' | 'discord' | 'dingtalk' | 'telegram' | 'msteams' | 'feishu' | 'matrix' | 'wechatwork' | 'packagist';
48
+ config: {
49
+ url: string;
50
+ content_type: 'json' | 'form';
51
+ secret?: string;
52
+ };
53
+ events: string[];
54
+ active: boolean;
55
+ }
56
+ export interface ForgejoSSHKey {
57
+ id: number;
58
+ title: string;
59
+ key: string;
60
+ created_at: string;
61
+ }
62
+ declare const FORGEJO_URL = "https://git.insureco.io";
63
+ declare const FORGEJO_ORG = "insureco";
64
+ export declare class ForgejoClient {
65
+ private baseUrl;
66
+ private token;
67
+ constructor(url: string, token: string);
68
+ static create(): Promise<ForgejoClient>;
69
+ static saveCredentials(url: string, token: string): void;
70
+ static hasCredentials(): boolean;
71
+ static clearCredentials(): void;
72
+ private request;
73
+ getCurrentUser(): Promise<{
74
+ success: boolean;
75
+ data?: ForgejoUser;
76
+ error?: {
77
+ message: string;
78
+ };
79
+ }>;
80
+ listRepos(): Promise<{
81
+ success: boolean;
82
+ data?: ForgejoRepository[];
83
+ error?: {
84
+ message: string;
85
+ };
86
+ }>;
87
+ getRepo(name: string): Promise<{
88
+ success: boolean;
89
+ data?: ForgejoRepository;
90
+ error?: {
91
+ message: string;
92
+ };
93
+ }>;
94
+ createRepo(data: ForgejoCreateRepoRequest): Promise<{
95
+ success: boolean;
96
+ data?: ForgejoRepository;
97
+ error?: {
98
+ message: string;
99
+ };
100
+ }>;
101
+ deleteRepo(name: string): Promise<{
102
+ success: boolean;
103
+ error?: {
104
+ message: string;
105
+ };
106
+ }>;
107
+ listWebhooks(repoName: string): Promise<{
108
+ success: boolean;
109
+ data?: ForgejoWebhook[];
110
+ error?: {
111
+ message: string;
112
+ };
113
+ }>;
114
+ createWebhook(repoName: string, data: ForgejoCreateWebhookRequest): Promise<{
115
+ success: boolean;
116
+ data?: ForgejoWebhook;
117
+ error?: {
118
+ message: string;
119
+ };
120
+ }>;
121
+ deleteWebhook(repoName: string, webhookId: number): Promise<{
122
+ success: boolean;
123
+ error?: {
124
+ message: string;
125
+ };
126
+ }>;
127
+ listSSHKeys(): Promise<{
128
+ success: boolean;
129
+ data?: ForgejoSSHKey[];
130
+ error?: {
131
+ message: string;
132
+ };
133
+ }>;
134
+ addSSHKey(title: string, key: string): Promise<{
135
+ success: boolean;
136
+ data?: ForgejoSSHKey;
137
+ error?: {
138
+ message: string;
139
+ };
140
+ }>;
141
+ deleteSSHKey(keyId: number): Promise<{
142
+ success: boolean;
143
+ error?: {
144
+ message: string;
145
+ };
146
+ }>;
147
+ }
148
+ export { FORGEJO_URL, FORGEJO_ORG };
149
+ //# sourceMappingURL=forgejo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgejo.d.ts","sourceRoot":"","sources":["../../src/lib/forgejo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,137 @@
1
+ import { homedir } from 'node:os';
2
+ import { join } from 'node:path';
3
+ import { existsSync, readFileSync, writeFileSync, mkdirSync } from 'node:fs';
4
+ const FORGEJO_URL = 'https://git.insureco.io';
5
+ const FORGEJO_ORG = 'insureco';
6
+ const CONFIG_DIR = join(homedir(), '.iec');
7
+ const CREDENTIALS_FILE = join(CONFIG_DIR, 'forgejo-credentials.json');
8
+ function loadCredentials() {
9
+ if (!existsSync(CREDENTIALS_FILE)) {
10
+ return null;
11
+ }
12
+ try {
13
+ const data = readFileSync(CREDENTIALS_FILE, 'utf-8');
14
+ return JSON.parse(data);
15
+ }
16
+ catch {
17
+ return null;
18
+ }
19
+ }
20
+ function saveCredentials(credentials) {
21
+ if (!existsSync(CONFIG_DIR)) {
22
+ mkdirSync(CONFIG_DIR, { recursive: true });
23
+ }
24
+ writeFileSync(CREDENTIALS_FILE, JSON.stringify(credentials, null, 2), { mode: 0o600 });
25
+ }
26
+ export class ForgejoClient {
27
+ baseUrl;
28
+ token;
29
+ constructor(url, token) {
30
+ this.baseUrl = url.replace(/\/$/, '');
31
+ this.token = token;
32
+ }
33
+ static async create() {
34
+ const creds = loadCredentials();
35
+ if (!creds) {
36
+ throw new Error('Not authenticated with Forgejo. Run: iec git login');
37
+ }
38
+ return new ForgejoClient(creds.url, creds.token);
39
+ }
40
+ static saveCredentials(url, token) {
41
+ saveCredentials({ url, token });
42
+ }
43
+ static hasCredentials() {
44
+ return loadCredentials() !== null;
45
+ }
46
+ static clearCredentials() {
47
+ if (existsSync(CREDENTIALS_FILE)) {
48
+ const { unlinkSync } = require('node:fs');
49
+ unlinkSync(CREDENTIALS_FILE);
50
+ }
51
+ }
52
+ async request(method, path, body) {
53
+ const url = `${this.baseUrl}/api/v1${path}`;
54
+ const headers = {
55
+ 'Authorization': `token ${this.token}`,
56
+ 'Accept': 'application/json',
57
+ };
58
+ if (body) {
59
+ headers['Content-Type'] = 'application/json';
60
+ }
61
+ try {
62
+ const response = await fetch(url, {
63
+ method,
64
+ headers,
65
+ body: body ? JSON.stringify(body) : undefined,
66
+ });
67
+ if (!response.ok) {
68
+ const text = await response.text();
69
+ let errorMessage = `HTTP ${response.status}`;
70
+ try {
71
+ const errorJson = JSON.parse(text);
72
+ errorMessage = errorJson.message || errorMessage;
73
+ }
74
+ catch {
75
+ errorMessage = text || errorMessage;
76
+ }
77
+ return { success: false, error: { message: errorMessage } };
78
+ }
79
+ // Handle 204 No Content
80
+ if (response.status === 204) {
81
+ return { success: true };
82
+ }
83
+ const data = (await response.json());
84
+ return { success: true, data };
85
+ }
86
+ catch (error) {
87
+ return {
88
+ success: false,
89
+ error: { message: error instanceof Error ? error.message : 'Unknown error' },
90
+ };
91
+ }
92
+ }
93
+ // User operations
94
+ async getCurrentUser() {
95
+ return this.request('GET', '/user');
96
+ }
97
+ // Repository operations
98
+ async listRepos() {
99
+ return this.request('GET', `/orgs/${FORGEJO_ORG}/repos`);
100
+ }
101
+ async getRepo(name) {
102
+ return this.request('GET', `/repos/${FORGEJO_ORG}/${name}`);
103
+ }
104
+ async createRepo(data) {
105
+ return this.request('POST', `/orgs/${FORGEJO_ORG}/repos`, {
106
+ ...data,
107
+ private: data.private ?? true,
108
+ auto_init: data.auto_init ?? true,
109
+ default_branch: data.default_branch ?? 'main',
110
+ });
111
+ }
112
+ async deleteRepo(name) {
113
+ return this.request('DELETE', `/repos/${FORGEJO_ORG}/${name}`);
114
+ }
115
+ // Webhook operations
116
+ async listWebhooks(repoName) {
117
+ return this.request('GET', `/repos/${FORGEJO_ORG}/${repoName}/hooks`);
118
+ }
119
+ async createWebhook(repoName, data) {
120
+ return this.request('POST', `/repos/${FORGEJO_ORG}/${repoName}/hooks`, data);
121
+ }
122
+ async deleteWebhook(repoName, webhookId) {
123
+ return this.request('DELETE', `/repos/${FORGEJO_ORG}/${repoName}/hooks/${webhookId}`);
124
+ }
125
+ // SSH Key operations
126
+ async listSSHKeys() {
127
+ return this.request('GET', '/user/keys');
128
+ }
129
+ async addSSHKey(title, key) {
130
+ return this.request('POST', '/user/keys', { title, key });
131
+ }
132
+ async deleteSSHKey(keyId) {
133
+ return this.request('DELETE', `/user/keys/${keyId}`);
134
+ }
135
+ }
136
+ export { FORGEJO_URL, FORGEJO_ORG };
137
+ //# sourceMappingURL=forgejo.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"forgejo.js","sourceRoot":"","sources":["../../src/lib/forgejo.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,15 @@
1
+ # Server Configuration
2
+ PORT=3000
3
+ NODE_ENV=development
4
+
5
+ # Database (if needed)
6
+ # DATABASE_URL=mongodb://localhost:27017/{{name}}
7
+
8
+ # Redis (if needed)
9
+ # REDIS_URL=redis://localhost:6379
10
+
11
+ # External Services
12
+ # API_KEY=your-api-key-here
13
+
14
+ # Logging
15
+ LOG_LEVEL=info
@@ -0,0 +1,45 @@
1
+ FROM node:22-alpine AS builder
2
+
3
+ WORKDIR /app
4
+
5
+ # Copy package files
6
+ COPY package*.json ./
7
+
8
+ # Install dependencies
9
+ RUN npm ci
10
+
11
+ # Copy source code
12
+ COPY . .
13
+
14
+ # Build TypeScript
15
+ RUN npm run build
16
+
17
+ # Production stage
18
+ FROM node:22-alpine
19
+
20
+ WORKDIR /app
21
+
22
+ # Copy package files and install production deps only
23
+ COPY package*.json ./
24
+ RUN npm ci --production && npm cache clean --force
25
+
26
+ # Copy built application
27
+ COPY --from=builder /app/dist ./dist
28
+
29
+ # Set environment
30
+ ENV NODE_ENV=production
31
+ ENV PORT=3000
32
+
33
+ # Create non-root user
34
+ RUN addgroup -g 1001 -S nodejs && \
35
+ adduser -S nodejs -u 1001 && \
36
+ chown -R nodejs:nodejs /app
37
+
38
+ USER nodejs
39
+
40
+ EXPOSE 3000
41
+
42
+ HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
43
+ CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
44
+
45
+ CMD ["node", "dist/index.js"]
@@ -0,0 +1,85 @@
1
+ # {{name}}
2
+
3
+ {{description}}
4
+
5
+ ## Getting Started
6
+
7
+ ### Prerequisites
8
+
9
+ - Node.js 20+
10
+ - npm or pnpm
11
+
12
+ ### Installation
13
+
14
+ ```bash
15
+ npm install
16
+ ```
17
+
18
+ ### Development
19
+
20
+ ```bash
21
+ npm run dev
22
+ ```
23
+
24
+ The server will start on http://localhost:3000
25
+
26
+ ### Production Build
27
+
28
+ ```bash
29
+ npm run build
30
+ npm start
31
+ ```
32
+
33
+ ## API Endpoints
34
+
35
+ ### Health Check
36
+
37
+ ```
38
+ GET /health
39
+ ```
40
+
41
+ Returns service health status.
42
+
43
+ ### Items API
44
+
45
+ ```
46
+ GET /api/items # List all items
47
+ GET /api/items/:id # Get single item
48
+ POST /api/items # Create item
49
+ PUT /api/items/:id # Update item
50
+ DELETE /api/items/:id # Delete item
51
+ ```
52
+
53
+ ## Deployment
54
+
55
+ ### Using iec-cli
56
+
57
+ ```bash
58
+ # Link repository for auto-deploy
59
+ iec link
60
+
61
+ # Manual deploy to sandbox
62
+ iec deploy
63
+
64
+ # Deploy to production
65
+ iec deploy --prod
66
+ ```
67
+
68
+ ### Environment Variables
69
+
70
+ See `.env.example` for available configuration options.
71
+
72
+ ## Project Structure
73
+
74
+ ```
75
+ {{name}}/
76
+ ├── src/
77
+ │ ├── index.ts # Application entry point
78
+ │ └── routes/
79
+ │ └── example.ts # Example CRUD routes
80
+ ├── helm/
81
+ │ └── {{name}}/ # Kubernetes Helm chart
82
+ ├── Dockerfile
83
+ ├── catalog-info.yaml # Backstage service catalog
84
+ └── package.json
85
+ ```
@@ -0,0 +1,51 @@
1
+ apiVersion: backstage.io/v1alpha1
2
+ kind: Component
3
+ metadata:
4
+ name: {{name}}
5
+ description: {{description}}
6
+ tags:
7
+ - tawa
8
+ - api
9
+ - express
10
+ annotations:
11
+ insureco.io/framework: express
12
+ insureco.io/language: typescript
13
+ spec:
14
+ type: service
15
+ lifecycle: experimental
16
+ owner: team-platform
17
+ providesApis:
18
+ - {{name}}-api
19
+ ---
20
+ apiVersion: backstage.io/v1alpha1
21
+ kind: API
22
+ metadata:
23
+ name: {{name}}-api
24
+ description: REST API for {{name}}
25
+ spec:
26
+ type: openapi
27
+ lifecycle: experimental
28
+ owner: team-platform
29
+ definition: |
30
+ openapi: 3.0.0
31
+ info:
32
+ title: {{name}} API
33
+ version: 1.0.0
34
+ paths:
35
+ /health:
36
+ get:
37
+ summary: Health check
38
+ responses:
39
+ '200':
40
+ description: Service is healthy
41
+ /api/items:
42
+ get:
43
+ summary: List items
44
+ responses:
45
+ '200':
46
+ description: List of items
47
+ post:
48
+ summary: Create item
49
+ responses:
50
+ '201':
51
+ description: Item created
@@ -0,0 +1,9 @@
1
+ apiVersion: v2
2
+ name: {{name}}
3
+ description: Helm chart for {{name}}
4
+ type: application
5
+ version: 0.1.0
6
+ appVersion: "0.1.0"
7
+ maintainers:
8
+ - name: team-platform
9
+ email: platform@insureco.io
@@ -0,0 +1,68 @@
1
+ apiVersion: apps/v1
2
+ kind: Deployment
3
+ metadata:
4
+ name: {{ .Release.Name }}
5
+ labels:
6
+ app: {{ .Release.Name }}
7
+ app.kubernetes.io/name: {{ .Release.Name }}
8
+ app.kubernetes.io/instance: {{ .Release.Name }}
9
+ spec:
10
+ replicas: {{ .Values.replicaCount }}
11
+ selector:
12
+ matchLabels:
13
+ app: {{ .Release.Name }}
14
+ template:
15
+ metadata:
16
+ labels:
17
+ app: {{ .Release.Name }}
18
+ app.kubernetes.io/name: {{ .Release.Name }}
19
+ app.kubernetes.io/instance: {{ .Release.Name }}
20
+ spec:
21
+ {{- with .Values.imagePullSecrets }}
22
+ imagePullSecrets:
23
+ {{- toYaml . | nindent 8 }}
24
+ {{- end }}
25
+ containers:
26
+ - name: {{ .Chart.Name }}
27
+ image: "{{ .Values.image.repository }}:{{ .Values.image.tag }}"
28
+ imagePullPolicy: {{ .Values.image.pullPolicy }}
29
+ ports:
30
+ - name: http
31
+ containerPort: {{ .Values.service.port }}
32
+ protocol: TCP
33
+ envFrom:
34
+ - configMapRef:
35
+ name: {{ .Release.Name }}-config
36
+ optional: true
37
+ - secretRef:
38
+ name: {{ .Release.Name }}-secrets
39
+ optional: true
40
+ {{- with .Values.env }}
41
+ env:
42
+ {{- range $key, $value := . }}
43
+ - name: {{ $key }}
44
+ value: {{ $value | quote }}
45
+ {{- end }}
46
+ {{- end }}
47
+ {{- with .Values.livenessProbe }}
48
+ livenessProbe:
49
+ {{- toYaml . | nindent 12 }}
50
+ {{- end }}
51
+ {{- with .Values.readinessProbe }}
52
+ readinessProbe:
53
+ {{- toYaml . | nindent 12 }}
54
+ {{- end }}
55
+ resources:
56
+ {{- toYaml .Values.resources | nindent 12 }}
57
+ {{- with .Values.nodeSelector }}
58
+ nodeSelector:
59
+ {{- toYaml . | nindent 8 }}
60
+ {{- end }}
61
+ {{- with .Values.affinity }}
62
+ affinity:
63
+ {{- toYaml . | nindent 8 }}
64
+ {{- end }}
65
+ {{- with .Values.tolerations }}
66
+ tolerations:
67
+ {{- toYaml . | nindent 8 }}
68
+ {{- end }}
@@ -0,0 +1,17 @@
1
+ apiVersion: v1
2
+ kind: Service
3
+ metadata:
4
+ name: {{ .Release.Name }}
5
+ labels:
6
+ app: {{ .Release.Name }}
7
+ app.kubernetes.io/name: {{ .Release.Name }}
8
+ app.kubernetes.io/instance: {{ .Release.Name }}
9
+ spec:
10
+ type: {{ .Values.service.type }}
11
+ ports:
12
+ - port: {{ .Values.service.port }}
13
+ targetPort: http
14
+ protocol: TCP
15
+ name: http
16
+ selector:
17
+ app: {{ .Release.Name }}
@@ -0,0 +1,55 @@
1
+ replicaCount: 1
2
+
3
+ image:
4
+ repository: registry.digitalocean.com/insureco/{{name}}
5
+ tag: latest
6
+ pullPolicy: IfNotPresent
7
+
8
+ imagePullSecrets:
9
+ - name: do-registry
10
+
11
+ service:
12
+ type: ClusterIP
13
+ port: 3000
14
+
15
+ resources:
16
+ limits:
17
+ cpu: 500m
18
+ memory: 512Mi
19
+ requests:
20
+ cpu: 100m
21
+ memory: 128Mi
22
+
23
+ autoscaling:
24
+ enabled: false
25
+ minReplicas: 1
26
+ maxReplicas: 5
27
+ targetCPUUtilizationPercentage: 80
28
+
29
+ nodeSelector: {}
30
+
31
+ tolerations: []
32
+
33
+ affinity: {}
34
+
35
+ env: {}
36
+ # Example:
37
+ # DATABASE_URL: mongodb://mongodb:27017/{{name}}
38
+
39
+ secrets: {}
40
+ # Example:
41
+ # API_KEY: secret-value
42
+
43
+ livenessProbe:
44
+ httpGet:
45
+ path: /health
46
+ port: 3000
47
+ initialDelaySeconds: 10
48
+ periodSeconds: 10
49
+
50
+ readinessProbe:
51
+ httpGet:
52
+ path: /health
53
+ port: 3000
54
+ initialDelaySeconds: 5
55
+ periodSeconds: 5
@@ -0,0 +1,33 @@
1
+ {
2
+ "name": "{{name}}",
3
+ "version": "0.1.0",
4
+ "description": "{{description}}",
5
+ "type": "module",
6
+ "scripts": {
7
+ "build": "tsc",
8
+ "dev": "tsx watch src/index.ts",
9
+ "start": "node dist/index.js",
10
+ "lint": "eslint src --ext .ts",
11
+ "typecheck": "tsc --noEmit",
12
+ "test": "vitest run",
13
+ "test:watch": "vitest"
14
+ },
15
+ "dependencies": {
16
+ "express": "^4.21.0",
17
+ "cors": "^2.8.5",
18
+ "helmet": "^8.0.0",
19
+ "zod": "^3.24.0"
20
+ },
21
+ "devDependencies": {
22
+ "@types/cors": "^2.8.17",
23
+ "@types/express": "^5.0.0",
24
+ "@types/node": "^22.0.0",
25
+ "eslint": "^9.0.0",
26
+ "tsx": "^4.0.0",
27
+ "typescript": "^5.7.0",
28
+ "vitest": "^2.0.0"
29
+ },
30
+ "engines": {
31
+ "node": ">=20.0.0"
32
+ }
33
+ }