create-forgeon 0.3.5 → 0.3.6
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.
- package/package.json +1 -1
- package/src/cli/add-help.mjs +1 -0
- package/src/cli/add-options.mjs +6 -0
- package/src/cli/add-options.test.mjs +2 -0
- package/src/modules/dependencies.mjs +31 -0
- package/src/modules/dependencies.test.mjs +207 -5
- package/src/modules/executor.mjs +14 -0
- package/src/modules/executor.test.mjs +719 -14
- package/src/modules/files-access.mjs +437 -0
- package/src/modules/files-image.mjs +531 -0
- package/src/modules/files-local.mjs +221 -0
- package/src/modules/files-quotas.mjs +381 -0
- package/src/modules/files-s3.mjs +266 -0
- package/src/modules/files.mjs +527 -0
- package/src/modules/queue.mjs +410 -0
- package/src/modules/registry.mjs +93 -3
- package/src/run-add-module.mjs +89 -2
- package/templates/module-fragments/files/00_title.md +1 -0
- package/templates/module-fragments/files/10_overview.md +17 -0
- package/templates/module-fragments/files/20_scope.md +13 -0
- package/templates/module-fragments/files/90_status_implemented.md +3 -0
- package/templates/module-fragments/files-access/00_title.md +1 -0
- package/templates/module-fragments/files-access/10_overview.md +9 -0
- package/templates/module-fragments/files-access/20_scope.md +20 -0
- package/templates/module-fragments/files-access/90_status_implemented.md +3 -0
- package/templates/module-fragments/files-image/00_title.md +1 -0
- package/templates/module-fragments/files-image/10_overview.md +10 -0
- package/templates/module-fragments/files-image/20_scope.md +20 -0
- package/templates/module-fragments/files-image/90_status_implemented.md +3 -0
- package/templates/module-fragments/files-local/00_title.md +1 -0
- package/templates/module-fragments/files-local/10_overview.md +9 -0
- package/templates/module-fragments/files-local/20_scope.md +10 -0
- package/templates/module-fragments/files-local/90_status_implemented.md +3 -0
- package/templates/module-fragments/files-quotas/00_title.md +1 -0
- package/templates/module-fragments/files-quotas/10_overview.md +9 -0
- package/templates/module-fragments/files-quotas/20_scope.md +20 -0
- package/templates/module-fragments/files-quotas/90_status_implemented.md +3 -0
- package/templates/module-fragments/files-s3/00_title.md +1 -0
- package/templates/module-fragments/files-s3/10_overview.md +17 -0
- package/templates/module-fragments/files-s3/20_scope.md +11 -0
- package/templates/module-fragments/files-s3/90_status_implemented.md +5 -0
- package/templates/module-fragments/queue/20_scope.md +8 -7
- package/templates/module-fragments/queue/90_status_implemented.md +3 -0
- package/templates/module-presets/files/apps/api/prisma/migrations/20260306_files_file_record/migration.sql +30 -0
- package/templates/module-presets/files/apps/api/prisma/migrations/20260306_files_file_variant/migration.sql +55 -0
- package/templates/module-presets/files/packages/files/package.json +24 -0
- package/templates/module-presets/files/packages/files/src/dto/create-file.dto.ts +30 -0
- package/templates/module-presets/files/packages/files/src/files-config.loader.ts +21 -0
- package/templates/module-presets/files/packages/files/src/files-config.module.ts +12 -0
- package/templates/module-presets/files/packages/files/src/files-config.service.ts +32 -0
- package/templates/module-presets/files/packages/files/src/files-env.schema.ts +30 -0
- package/templates/module-presets/files/packages/files/src/files.controller.ts +89 -0
- package/templates/module-presets/files/packages/files/src/files.service.ts +744 -0
- package/templates/module-presets/files/packages/files/src/files.types.ts +35 -0
- package/templates/module-presets/files/packages/files/src/forgeon-files.module.ts +12 -0
- package/templates/module-presets/files/packages/files/src/index.ts +9 -0
- package/templates/module-presets/files/packages/files/tsconfig.json +9 -0
- package/templates/module-presets/files-access/packages/files-access/package.json +17 -0
- package/templates/module-presets/files-access/packages/files-access/src/files-access.service.ts +59 -0
- package/templates/module-presets/files-access/packages/files-access/src/files-access.subject.ts +45 -0
- package/templates/module-presets/files-access/packages/files-access/src/files-access.types.ts +14 -0
- package/templates/module-presets/files-access/packages/files-access/src/forgeon-files-access.module.ts +8 -0
- package/templates/module-presets/files-access/packages/files-access/src/index.ts +4 -0
- package/templates/module-presets/files-access/packages/files-access/tsconfig.json +9 -0
- package/templates/module-presets/files-image/packages/files-image/package.json +21 -0
- package/templates/module-presets/files-image/packages/files-image/src/files-image-config.loader.ts +32 -0
- package/templates/module-presets/files-image/packages/files-image/src/files-image-config.module.ts +11 -0
- package/templates/module-presets/files-image/packages/files-image/src/files-image-config.service.ts +55 -0
- package/templates/module-presets/files-image/packages/files-image/src/files-image-env.schema.ts +28 -0
- package/templates/module-presets/files-image/packages/files-image/src/files-image.service.ts +420 -0
- package/templates/module-presets/files-image/packages/files-image/src/files-image.types.ts +18 -0
- package/templates/module-presets/files-image/packages/files-image/src/forgeon-files-image.module.ts +10 -0
- package/templates/module-presets/files-image/packages/files-image/src/index.ts +7 -0
- package/templates/module-presets/files-image/packages/files-image/tsconfig.json +9 -0
- package/templates/module-presets/files-local/packages/files-local/package.json +19 -0
- package/templates/module-presets/files-local/packages/files-local/src/files-local-config.loader.ts +13 -0
- package/templates/module-presets/files-local/packages/files-local/src/files-local-config.module.ts +12 -0
- package/templates/module-presets/files-local/packages/files-local/src/files-local-config.service.ts +11 -0
- package/templates/module-presets/files-local/packages/files-local/src/files-local-env.schema.ts +13 -0
- package/templates/module-presets/files-local/packages/files-local/src/index.ts +4 -0
- package/templates/module-presets/files-local/packages/files-local/tsconfig.json +9 -0
- package/templates/module-presets/files-quotas/packages/files-quotas/package.json +20 -0
- package/templates/module-presets/files-quotas/packages/files-quotas/src/files-quotas-config.loader.ts +22 -0
- package/templates/module-presets/files-quotas/packages/files-quotas/src/files-quotas-config.module.ts +11 -0
- package/templates/module-presets/files-quotas/packages/files-quotas/src/files-quotas-config.service.ts +27 -0
- package/templates/module-presets/files-quotas/packages/files-quotas/src/files-quotas-env.schema.ts +15 -0
- package/templates/module-presets/files-quotas/packages/files-quotas/src/files-quotas.service.ts +118 -0
- package/templates/module-presets/files-quotas/packages/files-quotas/src/files-quotas.types.ts +22 -0
- package/templates/module-presets/files-quotas/packages/files-quotas/src/forgeon-files-quotas.module.ts +11 -0
- package/templates/module-presets/files-quotas/packages/files-quotas/src/index.ts +7 -0
- package/templates/module-presets/files-quotas/packages/files-quotas/tsconfig.json +9 -0
- package/templates/module-presets/files-s3/packages/files-s3/package.json +20 -0
- package/templates/module-presets/files-s3/packages/files-s3/src/files-s3-config.loader.ts +57 -0
- package/templates/module-presets/files-s3/packages/files-s3/src/files-s3-config.module.ts +12 -0
- package/templates/module-presets/files-s3/packages/files-s3/src/files-s3-config.service.ts +44 -0
- package/templates/module-presets/files-s3/packages/files-s3/src/files-s3-env.schema.ts +51 -0
- package/templates/module-presets/files-s3/packages/files-s3/src/index.ts +4 -0
- package/templates/module-presets/files-s3/packages/files-s3/tsconfig.json +9 -0
- package/templates/module-presets/queue/packages/queue/package.json +21 -0
- package/templates/module-presets/queue/packages/queue/src/forgeon-queue.module.ts +10 -0
- package/templates/module-presets/queue/packages/queue/src/index.ts +6 -0
- package/templates/module-presets/queue/packages/queue/src/queue-config.loader.ts +24 -0
- package/templates/module-presets/queue/packages/queue/src/queue-config.module.ts +10 -0
- package/templates/module-presets/queue/packages/queue/src/queue-config.service.ts +69 -0
- package/templates/module-presets/queue/packages/queue/src/queue-env.schema.ts +17 -0
- package/templates/module-presets/queue/packages/queue/src/queue.service.ts +88 -0
- package/templates/module-presets/queue/packages/queue/tsconfig.json +9 -0
- package/templates/module-fragments/queue/90_status_planned.md +0 -3
|
@@ -0,0 +1,266 @@
|
|
|
1
|
+
import fs from 'node:fs';
|
|
2
|
+
import path from 'node:path';
|
|
3
|
+
import { copyRecursive, writeJson } from '../utils/fs.mjs';
|
|
4
|
+
import {
|
|
5
|
+
ensureBuildSteps,
|
|
6
|
+
ensureDependency,
|
|
7
|
+
ensureImportLine,
|
|
8
|
+
ensureLineAfter,
|
|
9
|
+
ensureLineBefore,
|
|
10
|
+
ensureLoadItem,
|
|
11
|
+
ensureValidatorSchema,
|
|
12
|
+
upsertEnvLines,
|
|
13
|
+
} from './shared/patch-utils.mjs';
|
|
14
|
+
|
|
15
|
+
function copyFromPreset(packageRoot, targetRoot, relativePath) {
|
|
16
|
+
const source = path.join(packageRoot, 'templates', 'module-presets', 'files-s3', relativePath);
|
|
17
|
+
if (!fs.existsSync(source)) {
|
|
18
|
+
throw new Error(`Missing files-s3 preset template: ${source}`);
|
|
19
|
+
}
|
|
20
|
+
const destination = path.join(targetRoot, relativePath);
|
|
21
|
+
copyRecursive(source, destination);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
function patchApiPackage(targetRoot) {
|
|
25
|
+
const packagePath = path.join(targetRoot, 'apps', 'api', 'package.json');
|
|
26
|
+
if (!fs.existsSync(packagePath)) {
|
|
27
|
+
return;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
const packageJson = JSON.parse(fs.readFileSync(packagePath, 'utf8'));
|
|
31
|
+
ensureDependency(packageJson, '@forgeon/files-s3', 'workspace:*');
|
|
32
|
+
ensureBuildSteps(packageJson, 'predev', ['pnpm --filter @forgeon/files-s3 build']);
|
|
33
|
+
writeJson(packagePath, packageJson);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
function patchAppModule(targetRoot) {
|
|
37
|
+
const filePath = path.join(targetRoot, 'apps', 'api', 'src', 'app.module.ts');
|
|
38
|
+
if (!fs.existsSync(filePath)) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
let content = fs.readFileSync(filePath, 'utf8').replace(/\r\n/g, '\n');
|
|
43
|
+
content = ensureImportLine(
|
|
44
|
+
content,
|
|
45
|
+
"import { filesS3Config, filesS3EnvSchemaZod, FilesS3ConfigModule } from '@forgeon/files-s3';",
|
|
46
|
+
);
|
|
47
|
+
content = ensureLoadItem(content, 'filesS3Config');
|
|
48
|
+
content = ensureValidatorSchema(content, 'filesS3EnvSchemaZod');
|
|
49
|
+
|
|
50
|
+
if (!content.includes(' FilesS3ConfigModule,')) {
|
|
51
|
+
if (content.includes(' ForgeonFilesModule,')) {
|
|
52
|
+
content = ensureLineAfter(content, ' ForgeonFilesModule,', ' FilesS3ConfigModule,');
|
|
53
|
+
} else if (content.includes(' ForgeonI18nModule.register({')) {
|
|
54
|
+
content = ensureLineBefore(content, ' ForgeonI18nModule.register({', ' FilesS3ConfigModule,');
|
|
55
|
+
} else if (content.includes(' DbPrismaModule,')) {
|
|
56
|
+
content = ensureLineAfter(content, ' DbPrismaModule,', ' FilesS3ConfigModule,');
|
|
57
|
+
} else if (content.includes(' ForgeonLoggerModule,')) {
|
|
58
|
+
content = ensureLineAfter(content, ' ForgeonLoggerModule,', ' FilesS3ConfigModule,');
|
|
59
|
+
} else {
|
|
60
|
+
content = ensureLineAfter(content, ' CoreErrorsModule,', ' FilesS3ConfigModule,');
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
fs.writeFileSync(filePath, `${content.trimEnd()}\n`, 'utf8');
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
function patchApiDockerfile(targetRoot) {
|
|
68
|
+
const dockerfilePath = path.join(targetRoot, 'apps', 'api', 'Dockerfile');
|
|
69
|
+
if (!fs.existsSync(dockerfilePath)) {
|
|
70
|
+
return;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
let content = fs.readFileSync(dockerfilePath, 'utf8').replace(/\r\n/g, '\n');
|
|
74
|
+
|
|
75
|
+
const packageAnchors = [
|
|
76
|
+
'COPY packages/files/package.json packages/files/package.json',
|
|
77
|
+
'COPY packages/files-local/package.json packages/files-local/package.json',
|
|
78
|
+
'COPY packages/auth-api/package.json packages/auth-api/package.json',
|
|
79
|
+
'COPY packages/rbac/package.json packages/rbac/package.json',
|
|
80
|
+
'COPY packages/rate-limit/package.json packages/rate-limit/package.json',
|
|
81
|
+
'COPY packages/logger/package.json packages/logger/package.json',
|
|
82
|
+
'COPY packages/swagger/package.json packages/swagger/package.json',
|
|
83
|
+
'COPY packages/i18n/package.json packages/i18n/package.json',
|
|
84
|
+
'COPY packages/db-prisma/package.json packages/db-prisma/package.json',
|
|
85
|
+
'COPY packages/core/package.json packages/core/package.json',
|
|
86
|
+
];
|
|
87
|
+
const packageAnchor = packageAnchors.find((line) => content.includes(line)) ?? packageAnchors.at(-1);
|
|
88
|
+
content = ensureLineAfter(
|
|
89
|
+
content,
|
|
90
|
+
packageAnchor,
|
|
91
|
+
'COPY packages/files-s3/package.json packages/files-s3/package.json',
|
|
92
|
+
);
|
|
93
|
+
|
|
94
|
+
const sourceAnchors = [
|
|
95
|
+
'COPY packages/files packages/files',
|
|
96
|
+
'COPY packages/files-local packages/files-local',
|
|
97
|
+
'COPY packages/auth-api packages/auth-api',
|
|
98
|
+
'COPY packages/rbac packages/rbac',
|
|
99
|
+
'COPY packages/rate-limit packages/rate-limit',
|
|
100
|
+
'COPY packages/logger packages/logger',
|
|
101
|
+
'COPY packages/swagger packages/swagger',
|
|
102
|
+
'COPY packages/i18n packages/i18n',
|
|
103
|
+
'COPY packages/db-prisma packages/db-prisma',
|
|
104
|
+
'COPY packages/core packages/core',
|
|
105
|
+
];
|
|
106
|
+
const sourceAnchor = sourceAnchors.find((line) => content.includes(line)) ?? sourceAnchors.at(-1);
|
|
107
|
+
content = ensureLineAfter(content, sourceAnchor, 'COPY packages/files-s3 packages/files-s3');
|
|
108
|
+
|
|
109
|
+
content = content.replace(/^RUN pnpm --filter @forgeon\/files-s3 build\r?\n?/gm, '');
|
|
110
|
+
const buildAnchor = content.includes('RUN pnpm --filter @forgeon/api prisma:generate')
|
|
111
|
+
? 'RUN pnpm --filter @forgeon/api prisma:generate'
|
|
112
|
+
: 'RUN pnpm --filter @forgeon/api build';
|
|
113
|
+
content = ensureLineBefore(content, buildAnchor, 'RUN pnpm --filter @forgeon/files-s3 build');
|
|
114
|
+
|
|
115
|
+
fs.writeFileSync(dockerfilePath, `${content.trimEnd()}\n`, 'utf8');
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
function patchCompose(targetRoot) {
|
|
119
|
+
const composePath = path.join(targetRoot, 'infra', 'docker', 'compose.yml');
|
|
120
|
+
if (!fs.existsSync(composePath)) {
|
|
121
|
+
return;
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let content = fs.readFileSync(composePath, 'utf8').replace(/\r\n/g, '\n');
|
|
125
|
+
const anchors = [
|
|
126
|
+
' FILES_LOCAL_ROOT: ${FILES_LOCAL_ROOT}',
|
|
127
|
+
' FILES_PUBLIC_BASE_PATH: ${FILES_PUBLIC_BASE_PATH}',
|
|
128
|
+
' FILES_STORAGE_DRIVER: ${FILES_STORAGE_DRIVER}',
|
|
129
|
+
' FILES_ENABLED: ${FILES_ENABLED}',
|
|
130
|
+
' API_PREFIX: ${API_PREFIX}',
|
|
131
|
+
];
|
|
132
|
+
const initialAnchor = anchors.find((line) => content.includes(line)) ?? anchors.at(-1);
|
|
133
|
+
const envLines = [
|
|
134
|
+
' FILES_S3_PROVIDER_PRESET: ${FILES_S3_PROVIDER_PRESET}',
|
|
135
|
+
' FILES_S3_BUCKET: ${FILES_S3_BUCKET}',
|
|
136
|
+
' FILES_S3_REGION: ${FILES_S3_REGION}',
|
|
137
|
+
' FILES_S3_ENDPOINT: ${FILES_S3_ENDPOINT}',
|
|
138
|
+
' FILES_S3_ACCESS_KEY_ID: ${FILES_S3_ACCESS_KEY_ID}',
|
|
139
|
+
' FILES_S3_SECRET_ACCESS_KEY: ${FILES_S3_SECRET_ACCESS_KEY}',
|
|
140
|
+
' FILES_S3_FORCE_PATH_STYLE: ${FILES_S3_FORCE_PATH_STYLE}',
|
|
141
|
+
' FILES_S3_MAX_ATTEMPTS: ${FILES_S3_MAX_ATTEMPTS}',
|
|
142
|
+
];
|
|
143
|
+
let previous = initialAnchor;
|
|
144
|
+
for (const line of envLines) {
|
|
145
|
+
content = ensureLineAfter(content, previous, line);
|
|
146
|
+
previous = line;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
fs.writeFileSync(composePath, `${content.trimEnd()}\n`, 'utf8');
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
function patchReadme(targetRoot) {
|
|
153
|
+
const readmePath = path.join(targetRoot, 'README.md');
|
|
154
|
+
if (!fs.existsSync(readmePath)) {
|
|
155
|
+
return;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
const marker = '## Files S3 Adapter Module';
|
|
159
|
+
let content = fs.readFileSync(readmePath, 'utf8').replace(/\r\n/g, '\n');
|
|
160
|
+
if (content.includes(marker)) {
|
|
161
|
+
return;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
const section = `## Files S3 Adapter Module
|
|
165
|
+
|
|
166
|
+
The files-s3 module provides the \`files-storage-adapter\` capability for S3-compatible object storage.
|
|
167
|
+
|
|
168
|
+
It supports runtime storage for:
|
|
169
|
+
- AWS S3
|
|
170
|
+
- Cloudflare R2
|
|
171
|
+
- MinIO
|
|
172
|
+
- other S3-compatible endpoints
|
|
173
|
+
|
|
174
|
+
Configuration:
|
|
175
|
+
- \`FILES_S3_PROVIDER_PRESET\` (\`minio | r2 | aws | custom\`)
|
|
176
|
+
- \`FILES_S3_BUCKET\`
|
|
177
|
+
- \`FILES_S3_REGION\`
|
|
178
|
+
- \`FILES_S3_ENDPOINT\`
|
|
179
|
+
- \`FILES_S3_ACCESS_KEY_ID\`
|
|
180
|
+
- \`FILES_S3_SECRET_ACCESS_KEY\`
|
|
181
|
+
- \`FILES_S3_FORCE_PATH_STYLE\`
|
|
182
|
+
- \`FILES_S3_MAX_ATTEMPTS\`
|
|
183
|
+
|
|
184
|
+
Preset defaults:
|
|
185
|
+
- \`minio\`: endpoint \`http://localhost:9000\`, region \`auto\`, path-style \`true\`
|
|
186
|
+
- \`aws\`: region \`eu-central-1\` (EU/de), endpoint optional, path-style \`false\`
|
|
187
|
+
- \`r2\`: region \`auto\`, endpoint should be set explicitly, path-style \`false\`
|
|
188
|
+
- \`custom\`: region \`eu-central-1\` (EU/de), endpoint should be set explicitly, path-style \`false\`
|
|
189
|
+
|
|
190
|
+
Environment overrides:
|
|
191
|
+
- Leave \`FILES_S3_REGION\`, \`FILES_S3_ENDPOINT\`, or \`FILES_S3_FORCE_PATH_STYLE\` empty to use preset defaults.
|
|
192
|
+
- Set explicit values when provider-specific tuning is needed.
|
|
193
|
+
|
|
194
|
+
When added before \`files\`, this module sets \`FILES_STORAGE_DRIVER=s3\` in env examples.`;
|
|
195
|
+
|
|
196
|
+
if (content.includes('## Prisma In Docker Start')) {
|
|
197
|
+
content = content.replace('## Prisma In Docker Start', `${section}\n\n## Prisma In Docker Start`);
|
|
198
|
+
} else {
|
|
199
|
+
content = `${content.trimEnd()}\n\n${section}\n`;
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
fs.writeFileSync(readmePath, `${content.trimEnd()}\n`, 'utf8');
|
|
203
|
+
}
|
|
204
|
+
|
|
205
|
+
function setEnvValue(filePath, key, value) {
|
|
206
|
+
let content = '';
|
|
207
|
+
if (fs.existsSync(filePath)) {
|
|
208
|
+
content = fs.readFileSync(filePath, 'utf8').replace(/\r\n/g, '\n');
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
const lines = content.length > 0 ? content.split('\n') : [];
|
|
212
|
+
const keyPrefix = `${key}=`;
|
|
213
|
+
let updated = false;
|
|
214
|
+
const nextLines = lines.map((line) => {
|
|
215
|
+
if (!line.startsWith(keyPrefix)) {
|
|
216
|
+
return line;
|
|
217
|
+
}
|
|
218
|
+
updated = true;
|
|
219
|
+
const currentValue = line.slice(keyPrefix.length);
|
|
220
|
+
if (currentValue === '' || currentValue === 'local') {
|
|
221
|
+
return `${key}=${value}`;
|
|
222
|
+
}
|
|
223
|
+
return line;
|
|
224
|
+
});
|
|
225
|
+
|
|
226
|
+
if (!updated) {
|
|
227
|
+
nextLines.push(`${key}=${value}`);
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
const nextContent = `${nextLines.join('\n').trimEnd()}\n`;
|
|
231
|
+
fs.writeFileSync(filePath, nextContent, 'utf8');
|
|
232
|
+
}
|
|
233
|
+
|
|
234
|
+
export function applyFilesS3Module({ packageRoot, targetRoot }) {
|
|
235
|
+
copyFromPreset(packageRoot, targetRoot, path.join('packages', 'files-s3'));
|
|
236
|
+
|
|
237
|
+
patchApiPackage(targetRoot);
|
|
238
|
+
patchAppModule(targetRoot);
|
|
239
|
+
patchApiDockerfile(targetRoot);
|
|
240
|
+
patchCompose(targetRoot);
|
|
241
|
+
patchReadme(targetRoot);
|
|
242
|
+
|
|
243
|
+
upsertEnvLines(path.join(targetRoot, 'apps', 'api', '.env.example'), [
|
|
244
|
+
'FILES_S3_PROVIDER_PRESET=minio',
|
|
245
|
+
'FILES_S3_BUCKET=forgeon-files',
|
|
246
|
+
'FILES_S3_REGION=',
|
|
247
|
+
'FILES_S3_ENDPOINT=',
|
|
248
|
+
'FILES_S3_ACCESS_KEY_ID=forgeon',
|
|
249
|
+
'FILES_S3_SECRET_ACCESS_KEY=forgeon-secret',
|
|
250
|
+
'FILES_S3_FORCE_PATH_STYLE=',
|
|
251
|
+
'FILES_S3_MAX_ATTEMPTS=3',
|
|
252
|
+
]);
|
|
253
|
+
upsertEnvLines(path.join(targetRoot, 'infra', 'docker', '.env.example'), [
|
|
254
|
+
'FILES_S3_PROVIDER_PRESET=minio',
|
|
255
|
+
'FILES_S3_BUCKET=forgeon-files',
|
|
256
|
+
'FILES_S3_REGION=',
|
|
257
|
+
'FILES_S3_ENDPOINT=',
|
|
258
|
+
'FILES_S3_ACCESS_KEY_ID=forgeon',
|
|
259
|
+
'FILES_S3_SECRET_ACCESS_KEY=forgeon-secret',
|
|
260
|
+
'FILES_S3_FORCE_PATH_STYLE=',
|
|
261
|
+
'FILES_S3_MAX_ATTEMPTS=3',
|
|
262
|
+
]);
|
|
263
|
+
|
|
264
|
+
setEnvValue(path.join(targetRoot, 'apps', 'api', '.env.example'), 'FILES_STORAGE_DRIVER', 's3');
|
|
265
|
+
setEnvValue(path.join(targetRoot, 'infra', 'docker', '.env.example'), 'FILES_STORAGE_DRIVER', 's3');
|
|
266
|
+
}
|