@mono-labs/cli 0.0.238 → 0.0.243
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/bin/mono.js +1 -1
- package/dist/index.js +32 -51
- package/dist/lib/app.js +52 -0
- package/dist/lib/commands/build-process/boot.js +12 -0
- package/dist/lib/commands/build-process/cliFactory.js +145 -0
- package/dist/lib/commands/build-process/dataLayer.js +56 -0
- package/dist/lib/commands/build-process/index.js +11 -0
- package/dist/lib/commands/build-process/readEnv.js +34 -0
- package/dist/lib/commands/build-process/runMonoCommand.js +84 -0
- package/dist/lib/commands/build-process/runners/processManager.js +45 -0
- package/dist/lib/commands/build-process/runners/runBackground.js +46 -0
- package/dist/lib/commands/build-process/runners/runForeground.js +52 -0
- package/dist/lib/commands/build-process/test.js +32 -0
- package/dist/lib/commands/build-process/testflag.js +4 -0
- package/dist/lib/commands/build-process/validators.js +17 -0
- package/dist/lib/commands/loadFromRoot.js +53 -0
- package/dist/lib/commands/prune/index.js +10 -0
- package/dist/lib/commands/prune/prune.js +49 -0
- package/dist/lib/config.js +6 -0
- package/dist/lib/filterUnwantedEnvVars.js +88 -0
- package/dist/lib/generateNewEnvList.js +17 -0
- package/dist/lib/index.js +49 -0
- package/dist/src/cdk/cdk.js +6 -0
- package/dist/src/cdk/index.js +17 -0
- package/dist/{expo.js → src/expo.js} +18 -34
- package/dist/src/index.js +56 -0
- package/dist/src/merge-env.js +25 -0
- package/dist/{project → src/project}/build-mono-readme.js +11 -20
- package/dist/{project → src/project}/generate-readme.js +6 -13
- package/dist/{project → src/project}/index.js +4 -12
- package/dist/{stack.js → src/stack.js} +2 -2
- package/dist/src/tools.js +38 -0
- package/dist/types/index.d.ts +50 -9
- package/dist/types/lib/app.d.ts +3 -0
- package/dist/types/lib/commands/build-process/boot.d.ts +8 -0
- package/dist/types/lib/commands/build-process/cliFactory.d.ts +32 -0
- package/dist/types/lib/commands/build-process/dataLayer.d.ts +7 -0
- package/dist/types/lib/commands/build-process/readEnv.d.ts +1 -0
- package/dist/types/lib/commands/build-process/runMonoCommand.d.ts +10 -0
- package/dist/types/lib/commands/build-process/runners/processManager.d.ts +5 -0
- package/dist/types/lib/commands/build-process/runners/runBackground.d.ts +2 -0
- package/dist/types/lib/commands/build-process/runners/runForeground.d.ts +6 -0
- package/dist/types/lib/commands/build-process/test.d.ts +1 -0
- package/dist/types/lib/commands/build-process/testflag.d.ts +1 -0
- package/dist/types/lib/commands/build-process/validators.d.ts +1 -0
- package/dist/types/lib/commands/loadFromRoot.d.ts +7 -0
- package/dist/types/lib/commands/prune/prune.d.ts +1 -0
- package/dist/types/lib/config.d.ts +2 -0
- package/dist/types/lib/filterUnwantedEnvVars.d.ts +2 -0
- package/dist/types/lib/generateNewEnvList.d.ts +1 -0
- package/dist/types/lib/index.d.ts +2 -0
- package/dist/types/src/cdk/cdk.d.ts +1 -0
- package/dist/types/src/cdk/index.d.ts +1 -0
- package/dist/types/src/expo.d.ts +4 -0
- package/dist/types/src/index.d.ts +15 -0
- package/dist/types/src/project/build-mono-readme.d.ts +1 -0
- package/dist/types/src/project/generate-readme.d.ts +1 -0
- package/dist/types/{project → src/project}/index.d.ts +1 -1
- package/dist/types/src/project/merge-env.d.ts +1 -0
- package/dist/types/src/tools.d.ts +3 -0
- package/lib/app.ts +58 -0
- package/lib/commands/build-process/boot.ts +21 -0
- package/lib/commands/build-process/cliFactory.ts +219 -0
- package/lib/commands/build-process/dataLayer.ts +61 -0
- package/lib/commands/build-process/index.ts +14 -0
- package/lib/commands/build-process/readEnv.ts +37 -0
- package/lib/commands/build-process/runMonoCommand.ts +97 -0
- package/lib/commands/build-process/runners/processManager.ts +42 -0
- package/lib/commands/build-process/runners/runBackground.ts +56 -0
- package/lib/commands/build-process/runners/runForeground.ts +59 -0
- package/lib/commands/build-process/test.ts +42 -0
- package/lib/commands/build-process/testflag.ts +1 -0
- package/lib/commands/build-process/validators.ts +16 -0
- package/lib/commands/loadFromRoot.ts +51 -0
- package/lib/commands/prune/index.ts +9 -0
- package/lib/commands/prune/prune.ts +50 -0
- package/lib/filterUnwantedEnvVars.ts +95 -0
- package/lib/generateNewEnvList.ts +17 -0
- package/lib/index.ts +59 -0
- package/package.json +100 -84
- package/src/cdk/cdk.ts +1 -0
- package/src/cdk/index.ts +1 -0
- package/src/expo-files/filterUnwantedEnvVars.ts +141 -144
- package/src/expo.ts +116 -0
- package/src/index.ts +39 -42
- package/src/merge-env.ts +24 -0
- package/src/project/build-mono-readme.ts +460 -514
- package/src/project/generate-readme.ts +259 -284
- package/src/project/index.ts +134 -144
- package/src/stack.ts +54 -55
- package/src/tools.ts +39 -0
- package/dist/cdk/index.js +0 -55
- package/dist/project/merge-env.js +0 -31
- package/dist/tools.js +0 -35
- package/dist/types/cdk/index.d.ts +0 -2
- package/dist/types/expo.d.ts +0 -3
- package/dist/types/merge-env.d.ts +0 -1
- package/dist/types/tools.d.ts +0 -1
- package/lib/app.js +0 -49
- package/lib/commands/build-process/boot.js +0 -15
- package/lib/commands/build-process/cliFactory.js +0 -163
- package/lib/commands/build-process/dataLayer.js +0 -59
- package/lib/commands/build-process/index.js +0 -13
- package/lib/commands/build-process/readEnv.js +0 -37
- package/lib/commands/build-process/runMonoCommand.js +0 -102
- package/lib/commands/build-process/runners/processManager.js +0 -38
- package/lib/commands/build-process/runners/runBackground.js +0 -60
- package/lib/commands/build-process/runners/runForeground.js +0 -60
- package/lib/commands/build-process/test.js +0 -50
- package/lib/commands/build-process/testflag.js +0 -1
- package/lib/commands/build-process/validators.js +0 -17
- package/lib/commands/generate/generateSeed.js +0 -223
- package/lib/commands/generate/index.js +0 -30
- package/lib/commands/loadFromRoot.js +0 -55
- package/lib/commands/prune/index.js +0 -12
- package/lib/commands/prune/prune.js +0 -50
- package/lib/commands/seed/import.js +0 -30
- package/lib/commands/seed/index.js +0 -12
- package/lib/commands/submit/index.js +0 -38
- package/lib/commands/update/eas.js +0 -39
- package/lib/commands/update/index.js +0 -87
- package/lib/filterUnwantedEnvVars.js +0 -123
- package/lib/generateNewEnvList.js +0 -14
- package/lib/index.js +0 -58
- package/src/cdk/cdk.d.ts +0 -7
- package/src/cdk/index.js +0 -59
- package/src/expo.d.ts +0 -11
- package/src/expo.js +0 -133
- package/src/merge-env.js +0 -32
- package/src/tools.d.ts +0 -4
- package/src/tools.js +0 -36
- package/types.d.ts +0 -83
- /package/dist/{expo-files → src/expo-files}/filterUnwantedEnvVars.js +0 -0
- /package/dist/{loadFromRoot.js → src/loadFromRoot.js} +0 -0
- /package/dist/{project → src/project}/build-readme.js +0 -0
- /package/dist/{project → src/project}/generate-docs.js +0 -0
- /package/dist/{merge-env.js → src/project/merge-env.js} +0 -0
- /package/dist/types/{project/build-mono-readme.d.ts → lib/commands/build-process/index.d.ts} +0 -0
- /package/dist/types/{project/generate-readme.d.ts → lib/commands/prune/index.d.ts} +0 -0
- /package/dist/types/{expo-files → src/expo-files}/filterUnwantedEnvVars.d.ts +0 -0
- /package/dist/types/{loadFromRoot.d.ts → src/loadFromRoot.d.ts} +0 -0
- /package/dist/types/{project → src}/merge-env.d.ts +0 -0
- /package/dist/types/{project → src/project}/build-readme.d.ts +0 -0
- /package/dist/types/{project → src/project}/generate-docs.d.ts +0 -0
- /package/dist/types/{stack.d.ts → src/stack.d.ts} +0 -0
- /package/lib/{config.js → config.ts} +0 -0
package/src/project/index.ts
CHANGED
|
@@ -1,64 +1,65 @@
|
|
|
1
|
-
import fs from 'node:fs'
|
|
2
|
-
import path from 'node:path'
|
|
1
|
+
import fs from 'node:fs'
|
|
2
|
+
import path from 'node:path'
|
|
3
3
|
|
|
4
4
|
/* ──────────────────────────────────────────────────────────
|
|
5
5
|
* Types
|
|
6
6
|
* ────────────────────────────────────────────────────────── */
|
|
7
7
|
|
|
8
8
|
type WorkspaceDetectResult = {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
}
|
|
9
|
+
cwd: string
|
|
10
|
+
workspaceRoot: string | null
|
|
11
|
+
isWorkspaceRoot: boolean
|
|
12
|
+
configDir: string
|
|
13
|
+
configPath: string
|
|
14
|
+
}
|
|
15
15
|
|
|
16
16
|
type DefaultAppConfig = {
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
}
|
|
17
|
+
appleAppId?: string
|
|
18
|
+
androidAppId?: string
|
|
19
|
+
appName?: string
|
|
20
|
+
easProjectId?: string
|
|
21
|
+
appScheme?: string
|
|
22
|
+
}
|
|
23
23
|
|
|
24
24
|
type DefaultDeployConfig = {
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
}
|
|
25
|
+
baseDomain?: string
|
|
26
|
+
webSubdomain?: string
|
|
27
|
+
apiSubdomain?: string
|
|
28
|
+
defaultKeyPair?: string
|
|
29
|
+
regions: string[]
|
|
30
|
+
ec2User: string
|
|
31
|
+
warehouseRegion: string
|
|
32
|
+
dbInstanceType: string
|
|
33
|
+
appInstanceType: string
|
|
34
|
+
}
|
|
35
35
|
|
|
36
36
|
const requiredSystemDefaults = {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
}
|
|
37
|
+
ec2User: 'ec2-user',
|
|
38
|
+
regions: ['us-east-1'],
|
|
39
|
+
warehouseRegion: 'us-east-1',
|
|
40
|
+
dbInstanceType: 't3.micro',
|
|
41
|
+
appInstanceType: 't3.large',
|
|
42
|
+
}
|
|
43
43
|
|
|
44
44
|
type ConfigTypeMap = {
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
}
|
|
45
|
+
app: DefaultAppConfig
|
|
46
|
+
deployment: DefaultDeployConfig
|
|
47
|
+
}
|
|
48
48
|
|
|
49
49
|
/**
|
|
50
50
|
* If TType is a known key, use the mapped type.
|
|
51
51
|
* Otherwise use TCustom (default = unknown).
|
|
52
52
|
*/
|
|
53
|
-
type ResolveConfig<TType extends string, TCustom = unknown> =
|
|
54
|
-
|
|
53
|
+
type ResolveConfig<TType extends string, TCustom = unknown> = TType extends keyof ConfigTypeMap
|
|
54
|
+
? ConfigTypeMap[TType]
|
|
55
|
+
: TCustom
|
|
55
56
|
|
|
56
57
|
/* ──────────────────────────────────────────────────────────
|
|
57
58
|
* Environment helpers
|
|
58
59
|
* ────────────────────────────────────────────────────────── */
|
|
59
60
|
|
|
60
61
|
function isLambdaRuntime(): boolean {
|
|
61
|
-
|
|
62
|
+
return !!process.env.AWS_LAMBDA_FUNCTION_NAME
|
|
62
63
|
}
|
|
63
64
|
|
|
64
65
|
/* ──────────────────────────────────────────────────────────
|
|
@@ -66,57 +67,51 @@ function isLambdaRuntime(): boolean {
|
|
|
66
67
|
* ────────────────────────────────────────────────────────── */
|
|
67
68
|
|
|
68
69
|
function detectWorkspaceAndConfigPath(
|
|
69
|
-
|
|
70
|
-
|
|
70
|
+
startDir: string,
|
|
71
|
+
configFileName: string
|
|
71
72
|
): WorkspaceDetectResult {
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
cwd,
|
|
115
|
-
workspaceRoot: null,
|
|
116
|
-
isWorkspaceRoot: false,
|
|
117
|
-
configDir: cwd,
|
|
118
|
-
configPath: path.join(cwd, configFileName),
|
|
119
|
-
};
|
|
73
|
+
const cwd = path.resolve(startDir)
|
|
74
|
+
|
|
75
|
+
const isWorkspaceRootDir = (dir: string): boolean => {
|
|
76
|
+
const pkgPath = path.join(dir, 'package.json')
|
|
77
|
+
if (fs.existsSync(pkgPath)) {
|
|
78
|
+
try {
|
|
79
|
+
const pkg = JSON.parse(fs.readFileSync(pkgPath, 'utf8'))
|
|
80
|
+
if (pkg?.workspaces) return true
|
|
81
|
+
} catch {
|
|
82
|
+
// ignore
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const markers = ['pnpm-workspace.yaml', 'lerna.json', 'turbo.json', 'nx.json', '.git']
|
|
87
|
+
|
|
88
|
+
return markers.some((m) => fs.existsSync(path.join(dir, m)))
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
let dir = cwd
|
|
92
|
+
while (true) {
|
|
93
|
+
if (isWorkspaceRootDir(dir)) {
|
|
94
|
+
return {
|
|
95
|
+
cwd,
|
|
96
|
+
workspaceRoot: dir,
|
|
97
|
+
isWorkspaceRoot: dir === cwd,
|
|
98
|
+
configDir: dir,
|
|
99
|
+
configPath: path.join(dir, configFileName),
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const parent = path.dirname(dir)
|
|
104
|
+
if (parent === dir) break
|
|
105
|
+
dir = parent
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
return {
|
|
109
|
+
cwd,
|
|
110
|
+
workspaceRoot: null,
|
|
111
|
+
isWorkspaceRoot: false,
|
|
112
|
+
configDir: cwd,
|
|
113
|
+
configPath: path.join(cwd, configFileName),
|
|
114
|
+
}
|
|
120
115
|
}
|
|
121
116
|
|
|
122
117
|
/* ──────────────────────────────────────────────────────────
|
|
@@ -124,13 +119,13 @@ function detectWorkspaceAndConfigPath(
|
|
|
124
119
|
* ────────────────────────────────────────────────────────── */
|
|
125
120
|
|
|
126
121
|
function loadConfigFromBundle(fileName: string): unknown | null {
|
|
127
|
-
|
|
122
|
+
const bundledPath = path.join(__dirname, fileName)
|
|
128
123
|
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
124
|
+
if (fs.existsSync(bundledPath)) {
|
|
125
|
+
return JSON.parse(fs.readFileSync(bundledPath, 'utf8'))
|
|
126
|
+
}
|
|
132
127
|
|
|
133
|
-
|
|
128
|
+
return null
|
|
134
129
|
}
|
|
135
130
|
|
|
136
131
|
/* ──────────────────────────────────────────────────────────
|
|
@@ -138,60 +133,55 @@ function loadConfigFromBundle(fileName: string): unknown | null {
|
|
|
138
133
|
* ────────────────────────────────────────────────────────── */
|
|
139
134
|
|
|
140
135
|
export function loadAppConfig<TCustom = unknown, TType extends string = 'app'>(
|
|
141
|
-
|
|
142
|
-
|
|
136
|
+
configType: TType = 'app' as TType,
|
|
137
|
+
startDir: string = process.cwd()
|
|
143
138
|
): { config: ResolveConfig<TType, TCustom>; meta: WorkspaceDetectResult } {
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
|
|
192
|
-
return { config, meta };
|
|
139
|
+
const fileName = `mono.${configType}.json`
|
|
140
|
+
|
|
141
|
+
// ✅ 1. Lambda runtime: load bundled config if present
|
|
142
|
+
if (isLambdaRuntime()) {
|
|
143
|
+
const bundled = loadConfigFromBundle(fileName)
|
|
144
|
+
|
|
145
|
+
if (bundled) {
|
|
146
|
+
return {
|
|
147
|
+
config: bundled as ResolveConfig<TType, TCustom>,
|
|
148
|
+
meta: {
|
|
149
|
+
cwd: __dirname,
|
|
150
|
+
workspaceRoot: null,
|
|
151
|
+
isWorkspaceRoot: false,
|
|
152
|
+
configDir: __dirname,
|
|
153
|
+
configPath: path.join(__dirname, fileName),
|
|
154
|
+
},
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
// ✅ 2. CLI / local dev: workspace discovery
|
|
160
|
+
const meta = detectWorkspaceAndConfigPath(startDir, fileName)
|
|
161
|
+
|
|
162
|
+
if (!fs.existsSync(meta.configPath)) {
|
|
163
|
+
const where = meta.workspaceRoot ? `workspace root: ${meta.workspaceRoot}` : `cwd: ${meta.cwd}`
|
|
164
|
+
|
|
165
|
+
throw new Error(`Could not find ${fileName} at ${meta.configPath} (detected from ${where}).`)
|
|
166
|
+
}
|
|
167
|
+
|
|
168
|
+
const raw = fs.readFileSync(meta.configPath, 'utf8')
|
|
169
|
+
const config = JSON.parse(raw) as ResolveConfig<TType, TCustom>
|
|
170
|
+
|
|
171
|
+
// ✅ Apply required system defaults
|
|
172
|
+
if (typeof config === 'object' && config !== null) {
|
|
173
|
+
for (const key of Object.keys(requiredSystemDefaults)) {
|
|
174
|
+
// @ts-ignore: index signature
|
|
175
|
+
if (config[key] === undefined || config[key] === null) {
|
|
176
|
+
// @ts-ignore: index signature
|
|
177
|
+
config[key] = requiredSystemDefaults[key]
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
return { config, meta }
|
|
193
183
|
}
|
|
194
184
|
|
|
195
|
-
export const loadProjectConfig = loadAppConfig
|
|
185
|
+
export const loadProjectConfig = loadAppConfig
|
|
196
186
|
|
|
197
|
-
export { loadMergedEnv } from './merge-env
|
|
187
|
+
export { loadMergedEnv } from './merge-env'
|
package/src/stack.ts
CHANGED
|
@@ -1,74 +1,73 @@
|
|
|
1
|
-
import * as cdk from 'aws-cdk-lib'
|
|
2
|
-
import { Construct } from 'constructs'
|
|
3
|
-
import { loadMergedEnv } from './project/merge-env
|
|
1
|
+
import * as cdk from 'aws-cdk-lib'
|
|
2
|
+
import { Construct } from 'constructs'
|
|
3
|
+
import { loadMergedEnv } from './project/merge-env'
|
|
4
4
|
|
|
5
|
-
loadMergedEnv()
|
|
5
|
+
loadMergedEnv()
|
|
6
6
|
//cdk deploy --context owner=cody --context region=us-west-1
|
|
7
7
|
|
|
8
|
-
const dev = 'dev'
|
|
8
|
+
const dev = 'dev'
|
|
9
9
|
export interface ICustomStack extends cdk.Stack {
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
10
|
+
ownerName: string
|
|
11
|
+
region: string
|
|
12
|
+
enableNATGateway: boolean
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export interface CustomStackProps extends cdk.StackProps {
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
16
|
+
ownerName?: string
|
|
17
|
+
region?: string
|
|
18
|
+
enableNATGateway?: boolean
|
|
19
|
+
domainName?: string
|
|
20
20
|
}
|
|
21
21
|
|
|
22
22
|
export abstract class CustomStack extends cdk.Stack {
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
public ownerName: string
|
|
24
|
+
public region: string
|
|
25
|
+
public domainName?: string
|
|
26
|
+
protected enableNATGateway: boolean = false
|
|
27
27
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
};
|
|
28
|
+
constructor(scope: Construct, id: string, props: CustomStackProps = {}) {
|
|
29
|
+
// 🔑 Resolve account + region BEFORE super()
|
|
30
|
+
const resolvedEnv: cdk.Environment | undefined = {
|
|
31
|
+
account: props.env?.account ?? process.env.AWS_ACCOUNT ?? cdk.Aws.ACCOUNT_ID, // final fallback (lazy token)
|
|
32
|
+
region: props.env?.region ?? process.env.AWS_REGION ?? 'us-east-2',
|
|
33
|
+
}
|
|
35
34
|
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
35
|
+
super(scope, id, {
|
|
36
|
+
...props,
|
|
37
|
+
env: resolvedEnv,
|
|
38
|
+
})
|
|
40
39
|
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
40
|
+
// ✅ Now it’s safe to read these
|
|
41
|
+
this.ownerName = props.ownerName ?? 'dev'
|
|
42
|
+
this.domainName = props.domainName
|
|
43
|
+
this.region = resolvedEnv.region!
|
|
44
|
+
this.enableNATGateway = props.enableNATGateway ?? false
|
|
45
|
+
}
|
|
47
46
|
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
47
|
+
public initializeStackConfig(): void {
|
|
48
|
+
// Context overrides (deploy-time flags)
|
|
49
|
+
const ctxOwner = this.node.tryGetContext('owner') || dev
|
|
50
|
+
const ctxRegion = this.node.tryGetContext('region') || 'us-east-2'
|
|
51
|
+
const ctxNat = this.node.tryGetContext('enableNATGateway')
|
|
53
52
|
|
|
54
|
-
|
|
55
|
-
|
|
53
|
+
if (ctxOwner) this.ownerName = ctxOwner
|
|
54
|
+
if (ctxRegion) this.region = ctxRegion
|
|
56
55
|
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
56
|
+
// NAT logic
|
|
57
|
+
if (ctxNat !== undefined) {
|
|
58
|
+
this.enableNATGateway = ctxNat === 'true'
|
|
59
|
+
}
|
|
61
60
|
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
61
|
+
// Production default
|
|
62
|
+
if (this.ownerName === 'prod' || this.ownerName === 'production') {
|
|
63
|
+
this.enableNATGateway = ctxNat !== 'false'
|
|
64
|
+
}
|
|
66
65
|
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
66
|
+
console.log('[Stack Config]', {
|
|
67
|
+
owner: this.ownerName,
|
|
68
|
+
region: this.region,
|
|
69
|
+
account: this.account,
|
|
70
|
+
natGateway: this.enableNATGateway,
|
|
71
|
+
})
|
|
72
|
+
}
|
|
74
73
|
}
|
package/src/tools.ts
ADDED
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { ExpoConfig, AppJSONConfig } from 'expo/config'
|
|
2
|
+
|
|
3
|
+
export function replaceTokens(input: string, tokens: Record<string, string>): string {
|
|
4
|
+
return input.replace(/\$\{([^}]+)\}|\$([A-Z0-9_]+)/g, (_m, k1, k2) => {
|
|
5
|
+
const key = (k1 || k2) as string
|
|
6
|
+
const val = tokens[key]
|
|
7
|
+
return val == null ? '' : String(val)
|
|
8
|
+
})
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
function filterEnvByPrefix(env: NodeJS.ProcessEnv, prefix: string): Record<string, string> {
|
|
12
|
+
const filtered: Record<string, string> = {}
|
|
13
|
+
for (const [key, value] of Object.entries(env)) {
|
|
14
|
+
if (key.startsWith(prefix) && typeof value === 'string') {
|
|
15
|
+
filtered[key] = value
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
return filtered
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function setUpConfig(config: AppJSONConfig): ExpoConfig {
|
|
22
|
+
const { extra = {}, ...other } = (config.expo ?? {}) as any
|
|
23
|
+
const router = extra['router'] ? { origin: false, ...extra['router'] } : { origin: false }
|
|
24
|
+
|
|
25
|
+
return {
|
|
26
|
+
...(config as any),
|
|
27
|
+
expo: {
|
|
28
|
+
...other,
|
|
29
|
+
extra: {
|
|
30
|
+
...filterEnvByPrefix(process.env, 'NEXT_PUBLIC_'),
|
|
31
|
+
eas: {
|
|
32
|
+
projectId: process.env.EAS_PROJECT_ID,
|
|
33
|
+
},
|
|
34
|
+
router,
|
|
35
|
+
...extra,
|
|
36
|
+
},
|
|
37
|
+
},
|
|
38
|
+
} as ExpoConfig
|
|
39
|
+
}
|
package/dist/cdk/index.js
DELETED
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.replaceTokens = replaceTokens;
|
|
4
|
-
exports.setUpConfig = setUpConfig;
|
|
5
|
-
function replaceTokens(str, env) {
|
|
6
|
-
if (typeof str !== 'string')
|
|
7
|
-
return str;
|
|
8
|
-
return str.replace(/\$\{([^}]+)\}|\$([A-Z0-9_]+)/g, (m, k1, k2) => {
|
|
9
|
-
const k = k1 || k2;
|
|
10
|
-
// existing data layer takes priority (guarded in case not defined)
|
|
11
|
-
if (typeof hasData === 'function' && hasData(k)) {
|
|
12
|
-
const val = typeof getData === 'function' ? getData(k) : undefined;
|
|
13
|
-
return val == null ? '' : String(val);
|
|
14
|
-
}
|
|
15
|
-
// environment variables
|
|
16
|
-
if (env && Object.prototype.hasOwnProperty.call(env, k)) {
|
|
17
|
-
const val = env[k];
|
|
18
|
-
return val == null ? '' : String(val);
|
|
19
|
-
}
|
|
20
|
-
// fallback
|
|
21
|
-
return '';
|
|
22
|
-
});
|
|
23
|
-
}
|
|
24
|
-
function filterEnvByPrefix(env, prefix) {
|
|
25
|
-
const filtered = {};
|
|
26
|
-
for (const key in env) {
|
|
27
|
-
if (key.startsWith(prefix)) {
|
|
28
|
-
filtered[key] = env[key];
|
|
29
|
-
}
|
|
30
|
-
}
|
|
31
|
-
return filtered;
|
|
32
|
-
}
|
|
33
|
-
function setUpConfig(config) {
|
|
34
|
-
const { extra = {}, ...other } = config.expo || {};
|
|
35
|
-
const router = extra['router'] ?
|
|
36
|
-
{ origin: false, ...extra['router'] }
|
|
37
|
-
: {
|
|
38
|
-
origin: false,
|
|
39
|
-
};
|
|
40
|
-
const appConfig = {
|
|
41
|
-
...config,
|
|
42
|
-
expo: {
|
|
43
|
-
...other,
|
|
44
|
-
extra: {
|
|
45
|
-
...filterEnvByPrefix(process.env, 'NEXT_PUBLIC_'),
|
|
46
|
-
eas: {
|
|
47
|
-
projectId: process.env.EAS_PROJECT_ID,
|
|
48
|
-
},
|
|
49
|
-
router,
|
|
50
|
-
...extra,
|
|
51
|
-
},
|
|
52
|
-
},
|
|
53
|
-
};
|
|
54
|
-
return appConfig;
|
|
55
|
-
}
|
|
@@ -1,31 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
-
exports.loadMergedEnv = loadMergedEnv;
|
|
7
|
-
const fs_1 = __importDefault(require("fs"));
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
|
-
const dotenv_1 = __importDefault(require("dotenv"));
|
|
10
|
-
function loadMergedEnv() {
|
|
11
|
-
const ENV_PATH = path_1.default.resolve(process.cwd(), '.env');
|
|
12
|
-
const ENV_LOCAL_PATH = path_1.default.resolve(process.cwd(), '.env.local');
|
|
13
|
-
// Load base .env
|
|
14
|
-
const base = fs_1.default.existsSync(ENV_PATH) ? dotenv_1.default.parse(fs_1.default.readFileSync(ENV_PATH)) : {};
|
|
15
|
-
// Load overrides .env.local
|
|
16
|
-
const local = fs_1.default.existsSync(ENV_LOCAL_PATH) ?
|
|
17
|
-
dotenv_1.default.parse(fs_1.default.readFileSync(ENV_LOCAL_PATH))
|
|
18
|
-
: {};
|
|
19
|
-
// Merge: local overrides base
|
|
20
|
-
const merged = {
|
|
21
|
-
...base,
|
|
22
|
-
...local,
|
|
23
|
-
};
|
|
24
|
-
// Inject into process.env (do NOT overwrite existing real env vars)
|
|
25
|
-
for (const [key, value] of Object.entries(merged)) {
|
|
26
|
-
if (process.env[key] === undefined) {
|
|
27
|
-
process.env[key] = value;
|
|
28
|
-
}
|
|
29
|
-
}
|
|
30
|
-
return process.env;
|
|
31
|
-
}
|
package/dist/tools.js
DELETED
|
@@ -1,35 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.setUpConfig = setUpConfig;
|
|
4
|
-
function filterEnvByPrefix(env, prefix) {
|
|
5
|
-
const filtered = {};
|
|
6
|
-
for (const key in env) {
|
|
7
|
-
if (key.startsWith(prefix)) {
|
|
8
|
-
filtered[key] = env[key];
|
|
9
|
-
}
|
|
10
|
-
}
|
|
11
|
-
return filtered;
|
|
12
|
-
}
|
|
13
|
-
function setUpConfig(config) {
|
|
14
|
-
const { extra = {}, ...other } = config.expo || {};
|
|
15
|
-
const router = extra['router'] ?
|
|
16
|
-
{ origin: false, ...extra['router'] }
|
|
17
|
-
: {
|
|
18
|
-
origin: false,
|
|
19
|
-
};
|
|
20
|
-
const appConfig = {
|
|
21
|
-
...config,
|
|
22
|
-
expo: {
|
|
23
|
-
...other,
|
|
24
|
-
extra: {
|
|
25
|
-
...filterEnvByPrefix(process.env, 'NEXT_PUBLIC_'),
|
|
26
|
-
eas: {
|
|
27
|
-
projectId: process.env.EAS_PROJECT_ID,
|
|
28
|
-
},
|
|
29
|
-
router,
|
|
30
|
-
...extra,
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
return appConfig;
|
|
35
|
-
}
|
package/dist/types/expo.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function loadMergedEnv(): NodeJS.ProcessEnv;
|
package/dist/types/tools.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export function setUpConfig(config: any): any;
|