@geekmidas/cloud 10.0.0-alpha.9 → 10.0.0-alpha.91
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/README.md +14 -6
- package/dist/index.cjs +3 -3
- package/dist/index.d.cts +1 -1
- package/dist/index.d.mts +1 -1
- package/dist/index.mjs +2 -3
- package/dist/utils/index.cjs +106 -5
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +62 -2
- package/dist/utils/index.d.cts.map +1 -0
- package/dist/utils/index.d.mts +62 -2
- package/dist/utils/index.d.mts.map +1 -0
- package/dist/utils/index.mjs +78 -2
- package/dist/utils/index.mjs.map +1 -0
- package/package.json +9 -8
- package/src/dokploy/Application.ts +52 -5
- package/src/dokploy/__tests__/Application.provider.spec.ts +206 -0
- package/src/sst/__tests__/api.spec.ts +185 -0
- package/src/sst/__tests__/encryption.spec.ts +90 -0
- package/src/sst/__tests__/fromManifest.integration.spec.ts +427 -0
- package/src/sst/__tests__/fromManifest.spec.ts +306 -5
- package/src/sst/__tests__/function.spec.ts +121 -0
- package/src/sst/__tests__/links.spec.ts +209 -0
- package/src/sst/__tests__/surfaces.spec.ts +17 -0
- package/src/sst/__type-tests__/overrides.type-test.ts +152 -0
- package/src/sst/aws/Api.ts +16 -44
- package/src/sst/aws/Cache.ts +4 -4
- package/src/sst/aws/Credential.ts +42 -9
- package/src/sst/aws/Cron.ts +5 -45
- package/src/sst/aws/Database.ts +15 -1
- package/src/sst/aws/DatabaseBootstrap.ts +3 -0
- package/src/sst/aws/Encryption.ts +91 -0
- package/src/sst/aws/ExternalApi.ts +58 -0
- package/src/sst/aws/Function.ts +9 -38
- package/src/sst/aws/Queue.ts +34 -1
- package/src/sst/aws/RestApiSurface.ts +36 -14
- package/src/sst/aws/bootstrap/handler.ts +10 -1
- package/src/sst/fromManifest.ts +261 -44
- package/src/sst/index.ts +6 -1
- package/src/sst/overrides.ts +133 -0
- package/dist/index-B5CZ1xVf.d.cts +0 -64
- package/dist/index-B5CZ1xVf.d.cts.map +0 -1
- package/dist/index-DhHRjduZ.d.mts +0 -64
- package/dist/index-DhHRjduZ.d.mts.map +0 -1
- package/dist/utils-B1a2UuEO.cjs +0 -129
- package/dist/utils-B1a2UuEO.cjs.map +0 -1
- package/dist/utils-DMOXJ27j.mjs +0 -83
- package/dist/utils-DMOXJ27j.mjs.map +0 -1
- package/src/sst/__type-tests__/manifest.type-test.ts +0 -77
|
@@ -0,0 +1,133 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* What a deploy can say about each construct, inferred from the manifest.
|
|
3
|
+
*
|
|
4
|
+
* `fromManifest` used to take `Record<string, Record<string, unknown>>`, so a
|
|
5
|
+
* misspelt id, a prop the component never reads, and a missing VPC all passed
|
|
6
|
+
* the type checker — the first two silently, the last at synth, mid-deploy.
|
|
7
|
+
* The manifest is emitted `as const`, so every id's kind is known statically,
|
|
8
|
+
* and the kind decides what can be overridden:
|
|
9
|
+
*
|
|
10
|
+
* - only the manifest's own ids are keys;
|
|
11
|
+
* - each takes the props its kind's provisioner reads, minus those the
|
|
12
|
+
* declaration already decides (a site's `path`, a file server's `origin`);
|
|
13
|
+
* - what the synth refuses to guess is required — a database's `vpc`, mail's
|
|
14
|
+
* `from`, and, by backend, an ElastiCache `vpc` or a non-SES mail `url`;
|
|
15
|
+
* - a kind with nothing to override takes no key at all.
|
|
16
|
+
*/
|
|
17
|
+
|
|
18
|
+
import type { ConstructManifest, DeclarationKind } from '@geekmidas/manifest';
|
|
19
|
+
import type { CacheProps } from './aws/Cache';
|
|
20
|
+
import type { CredentialProps } from './aws/Credential';
|
|
21
|
+
import type { DatabaseProps } from './aws/Database';
|
|
22
|
+
import type { EncryptionProps } from './aws/Encryption';
|
|
23
|
+
import type { ExternalApiProps } from './aws/ExternalApi';
|
|
24
|
+
import type { FileServerProps } from './aws/FileServer';
|
|
25
|
+
import type { ObjectStorageProps } from './aws/ObjectStorage';
|
|
26
|
+
import type { QueueProps } from './aws/Queue';
|
|
27
|
+
import type { SecretProps } from './aws/Secret';
|
|
28
|
+
import type { StaticSiteProps } from './aws/StaticSite';
|
|
29
|
+
import type { TopicProps } from './aws/Topic';
|
|
30
|
+
|
|
31
|
+
/** The backend choices that are config rather than declaration. */
|
|
32
|
+
export interface ManifestBackends {
|
|
33
|
+
cache?: 'upstash' | 'elasticache' | 'db';
|
|
34
|
+
email?: 'resend' | 'ses' | 'smtp';
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/** The backend a choice resolves to — the provisioner's default when unset. */
|
|
38
|
+
type CacheBackendOf<B extends ManifestBackends> =
|
|
39
|
+
B['cache'] extends NonNullable<ManifestBackends['cache']>
|
|
40
|
+
? B['cache']
|
|
41
|
+
: 'upstash';
|
|
42
|
+
type EmailBackendOf<B extends ManifestBackends> =
|
|
43
|
+
B['email'] extends NonNullable<ManifestBackends['email']>
|
|
44
|
+
? B['email']
|
|
45
|
+
: 'ses';
|
|
46
|
+
|
|
47
|
+
type CacheOverride<Backend> = Backend extends 'elasticache'
|
|
48
|
+
? { vpc: NonNullable<CacheProps['vpc']> }
|
|
49
|
+
: Backend extends 'upstash'
|
|
50
|
+
? { url?: CacheProps['url']; region?: string }
|
|
51
|
+
: never;
|
|
52
|
+
|
|
53
|
+
type EmailOverride<Backend> = {
|
|
54
|
+
/** Every provider rejects an unverified sender, so there is no default. */
|
|
55
|
+
from: $util.Input<string>;
|
|
56
|
+
region?: $util.Input<string>;
|
|
57
|
+
} & (Backend extends 'ses'
|
|
58
|
+
? { url?: $util.Input<string> }
|
|
59
|
+
: // Resend and a relay are accounts somebody created: their URL is theirs.
|
|
60
|
+
{ url: $util.Input<string> });
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* What one declaration takes, by its kind and the backends; `never` for a kind
|
|
64
|
+
* with nothing to override, which drops its id from the keys.
|
|
65
|
+
*/
|
|
66
|
+
export type OverrideFor<D, B extends ManifestBackends = {}> = D extends {
|
|
67
|
+
kind: infer K extends DeclarationKind;
|
|
68
|
+
}
|
|
69
|
+
? K extends 'objects'
|
|
70
|
+
? Partial<ObjectStorageProps>
|
|
71
|
+
: K extends 'file-server'
|
|
72
|
+
? Partial<Omit<FileServerProps, 'origin'>>
|
|
73
|
+
: K extends 'site'
|
|
74
|
+
? Partial<Omit<StaticSiteProps, 'path' | 'variant' | 'environment'>>
|
|
75
|
+
: K extends 'queue'
|
|
76
|
+
? Partial<Omit<QueueProps, 'fifo'>>
|
|
77
|
+
: K extends 'topic'
|
|
78
|
+
? Partial<TopicProps>
|
|
79
|
+
: K extends 'database'
|
|
80
|
+
? Omit<DatabaseProps, 'schema' | 'version'>
|
|
81
|
+
: K extends 'cache'
|
|
82
|
+
? // In a database: same address, one more table, nothing to say.
|
|
83
|
+
D extends { of: string }
|
|
84
|
+
? never
|
|
85
|
+
: CacheOverride<CacheBackendOf<B>>
|
|
86
|
+
: K extends 'email'
|
|
87
|
+
? EmailOverride<EmailBackendOf<B>>
|
|
88
|
+
: K extends 'rest-api'
|
|
89
|
+
? Partial<sst.aws.ApiGatewayV2Args>
|
|
90
|
+
: K extends 'secret'
|
|
91
|
+
? SecretProps
|
|
92
|
+
: K extends 'credential'
|
|
93
|
+
? CredentialProps
|
|
94
|
+
: K extends 'encryption'
|
|
95
|
+
? Partial<EncryptionProps>
|
|
96
|
+
: K extends 'external-api'
|
|
97
|
+
? Omit<ExternalApiProps, 'url'>
|
|
98
|
+
: // Derived databases, compute, mobile apps, OIDC.
|
|
99
|
+
never
|
|
100
|
+
: never;
|
|
101
|
+
|
|
102
|
+
/** Whether `{}` satisfies an override — whether the id can be left out. */
|
|
103
|
+
type IsOptional<T> = {} extends T ? true : false;
|
|
104
|
+
|
|
105
|
+
type Overridable<M, B extends ManifestBackends> = {
|
|
106
|
+
[Id in keyof M]: [OverrideFor<M[Id], B>] extends [never] ? never : Id;
|
|
107
|
+
}[keyof M];
|
|
108
|
+
|
|
109
|
+
type RequiredIds<M, B extends ManifestBackends> = {
|
|
110
|
+
[Id in Overridable<M, B>]: IsOptional<OverrideFor<M[Id], B>> extends true
|
|
111
|
+
? never
|
|
112
|
+
: Id;
|
|
113
|
+
}[Overridable<M, B>];
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* The overrides a manifest accepts, keyed by its own construct ids.
|
|
117
|
+
*
|
|
118
|
+
* A manifest typed only as `ConstructManifest` — ids unknown — falls back to
|
|
119
|
+
* the untyped record, and the provisioners' synth-time checks still apply.
|
|
120
|
+
*/
|
|
121
|
+
export type ManifestOverrides<
|
|
122
|
+
M extends ConstructManifest,
|
|
123
|
+
B extends ManifestBackends = {},
|
|
124
|
+
> = string extends keyof M
|
|
125
|
+
? Record<string, Record<string, unknown>>
|
|
126
|
+
: {
|
|
127
|
+
[Id in RequiredIds<M, B>]: OverrideFor<M[Id], B>;
|
|
128
|
+
} & {
|
|
129
|
+
[Id in Exclude<Overridable<M, B>, RequiredIds<M, B>>]?: OverrideFor<
|
|
130
|
+
M[Id],
|
|
131
|
+
B
|
|
132
|
+
>;
|
|
133
|
+
};
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
//#region src/utils/index.d.ts
|
|
2
|
-
declare function getLocalIpAddress(): string | null;
|
|
3
|
-
declare function environmentCase(name: string): string;
|
|
4
|
-
declare enum ResourceType {
|
|
5
|
-
ApiGatewayV2 = "sst.aws.ApiGatewayV2",
|
|
6
|
-
Postgres = "sst.aws.Postgres",
|
|
7
|
-
Function = "sst.aws.Function",
|
|
8
|
-
ObjectStorage = "sst.aws.Bucket",
|
|
9
|
-
Vpc = "sst.aws.Vpc",
|
|
10
|
-
Secret = "sst.sst.Secret",
|
|
11
|
-
SSTSecret = "sst:sst:Secret",
|
|
12
|
-
SSTFunction = "sst:sst:Function",
|
|
13
|
-
SSTApiGatewayV2 = "sst:aws:ApiGatewayV2",
|
|
14
|
-
SSTPostgres = "sst:aws:Postgres",
|
|
15
|
-
SSTObjectStorage = "sst:aws:Bucket",
|
|
16
|
-
SnsTopic = "sst:aws:SnsTopic",
|
|
17
|
-
}
|
|
18
|
-
declare function buildResourceEnv(record: Record<string, Resource | string>): Record<string, string>;
|
|
19
|
-
/**
|
|
20
|
-
* SST links a resource under one of two spellings — `sst.aws.Bucket` when it
|
|
21
|
-
* comes from the state file, `sst:aws:Bucket` when it comes from the runtime —
|
|
22
|
-
* and `processors` has always handled both. Only the dotted half was admitted
|
|
23
|
-
* here, so the colon half could not be passed to `buildResourceEnv` without a
|
|
24
|
-
* cast, and `SnsTopic` was missing from `Resource` altogether despite being the
|
|
25
|
-
* only thing that produces `*_ARN`.
|
|
26
|
-
*/
|
|
27
|
-
type ApiGatewayV2 = {
|
|
28
|
-
type: ResourceType.ApiGatewayV2 | ResourceType.SSTApiGatewayV2;
|
|
29
|
-
url: string;
|
|
30
|
-
};
|
|
31
|
-
type Postgres = {
|
|
32
|
-
database: string;
|
|
33
|
-
host: string;
|
|
34
|
-
password: string;
|
|
35
|
-
port: number;
|
|
36
|
-
type: ResourceType.Postgres | ResourceType.SSTPostgres;
|
|
37
|
-
username: string;
|
|
38
|
-
};
|
|
39
|
-
type Function = {
|
|
40
|
-
name: string;
|
|
41
|
-
type: ResourceType.Function | ResourceType.SSTFunction;
|
|
42
|
-
};
|
|
43
|
-
type Bucket = {
|
|
44
|
-
name: string;
|
|
45
|
-
type: ResourceType.ObjectStorage | ResourceType.SSTObjectStorage;
|
|
46
|
-
};
|
|
47
|
-
type SnsTopic = {
|
|
48
|
-
arn: string;
|
|
49
|
-
type: ResourceType.SnsTopic;
|
|
50
|
-
};
|
|
51
|
-
type Vpc = {
|
|
52
|
-
bastion: string;
|
|
53
|
-
type: ResourceType.Vpc;
|
|
54
|
-
};
|
|
55
|
-
type Secret = {
|
|
56
|
-
type: ResourceType.Secret | ResourceType.SSTSecret;
|
|
57
|
-
value: string;
|
|
58
|
-
};
|
|
59
|
-
type Resource = ApiGatewayV2 | Postgres | Function | Bucket | SnsTopic | Vpc | Secret;
|
|
60
|
-
type ResourceProcessor<K extends Resource> = (name: string, value: K) => Record<string, string | number>;
|
|
61
|
-
//# sourceMappingURL=index.d.ts.map
|
|
62
|
-
//#endregion
|
|
63
|
-
export { ApiGatewayV2, Bucket, Function, Postgres, Resource, ResourceProcessor, ResourceType, Secret, SnsTopic, Vpc, buildResourceEnv, environmentCase, getLocalIpAddress };
|
|
64
|
-
//# sourceMappingURL=index-B5CZ1xVf.d.cts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-B5CZ1xVf.d.cts","names":[],"sources":["../src/utils/index.ts"],"sourcesContent":[],"mappings":";iBAGgB,iBAAA,CAAA;AAAA,iBAcA,eAAA,CAdiB,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAcjB,aAOJ,YAAA;EAAA,YAAA,GAAY,sBAAA;EA+DR,QAAA,GAAA,kBAAgB;EAAA,QAAA,GAAA,kBAAA;EAAA,aACR,GAAA,gBAAA;EAAQ,GAAvB,GAAA,aAAA;EAAM,MACZ,GAAA,gBAAA;EAAM,SAAA,GAAA,gBAAA;EA0BG,WAAA,GAAA,kBAAY;EAAA,eAAA,GAAA,sBAAA;EAAA,WACjB,GAAA,kBAAa;EAAY,gBAAgB,GAAA,gBAAA;EAAe,QAAA,GAAA,kBAAA;AAI/D;AAAoB,iBAjCJ,gBAAA,CAiCI,MAAA,EAhCX,MAgCW,CAAA,MAAA,EAhCI,QAgCJ,GAAA,MAAA,CAAA,CAAA,EA/BjB,MA+BiB,CAAA,MAAA,EAAA,MAAA,CAAA;;;AAKmC;AAIvD;;;;AAEuD;AAG3C,KAnBA,YAAA,GAmBM;EAAA,IAAA,EAlBX,YAAA,CAAa,YAkBF,GAlBiB,YAAA,CAAa,eAkB9B;EAAA,GAEX,EAAA,MAAA;CAA0B;AAAgC,KAhBrD,QAAA,GAgBqD;EAGrD,QAAA,EAAA,MAAQ;EAKR,IAAA,EAAG,MAAA;EAKH,QAAA,EAAM,MAAA;EAAA,IAAA,EAAA,MAAA;EAAA,IACX,EAzBA,YAAA,CAAa,QAyBA,GAzBW,YAAA,CAAa,WAyBxB;EAAM,QAAG,EAAA,MAAa;AAAS,CAAA;AAIvC,KAzBA,QAAA,GAyBQ;EAAA,IAAA,EAAA,MAAA;EAAA,IACjB,EAxBI,YAAA,CAAa,QAwBjB,GAxB4B,YAAA,CAAa,WAwBzC;CAAY;AAEZ,KAvBS,MAAA,GAuBT;EAAQ,IACR,EAAA,MAAA;EAAM,IACN,EAvBI,YAAA,CAAa,aAuBjB,GAvBiC,YAAA,CAAa,gBAuB9C;CAAQ;AAER,KAtBS,QAAA,GAsBT;EAAM,GAAA,EAAA,MAAA;EAEG,IAAA,EAtBL,YAAA,CAAa,QAsBS;CAAA;AAAW,KAnB5B,GAAA,GAmB4B;EAAQ,OAExC,EAAA,MAAA;EAAC,IACJ,EApBE,YAAA,CAAa,GAoBf;AAAM,CAAA;KAjBC,MAAA;QACL,YAAA,CAAa,SAAS,YAAA,CAAa;;;KAI9B,QAAA,GACT,eACA,WACA,WACA,SACA,WACA,MACA;KAES,4BAA4B,kCAEhC,MACH"}
|
|
@@ -1,64 +0,0 @@
|
|
|
1
|
-
//#region src/utils/index.d.ts
|
|
2
|
-
declare function getLocalIpAddress(): string | null;
|
|
3
|
-
declare function environmentCase(name: string): string;
|
|
4
|
-
declare enum ResourceType {
|
|
5
|
-
ApiGatewayV2 = "sst.aws.ApiGatewayV2",
|
|
6
|
-
Postgres = "sst.aws.Postgres",
|
|
7
|
-
Function = "sst.aws.Function",
|
|
8
|
-
ObjectStorage = "sst.aws.Bucket",
|
|
9
|
-
Vpc = "sst.aws.Vpc",
|
|
10
|
-
Secret = "sst.sst.Secret",
|
|
11
|
-
SSTSecret = "sst:sst:Secret",
|
|
12
|
-
SSTFunction = "sst:sst:Function",
|
|
13
|
-
SSTApiGatewayV2 = "sst:aws:ApiGatewayV2",
|
|
14
|
-
SSTPostgres = "sst:aws:Postgres",
|
|
15
|
-
SSTObjectStorage = "sst:aws:Bucket",
|
|
16
|
-
SnsTopic = "sst:aws:SnsTopic",
|
|
17
|
-
}
|
|
18
|
-
declare function buildResourceEnv(record: Record<string, Resource | string>): Record<string, string>;
|
|
19
|
-
/**
|
|
20
|
-
* SST links a resource under one of two spellings — `sst.aws.Bucket` when it
|
|
21
|
-
* comes from the state file, `sst:aws:Bucket` when it comes from the runtime —
|
|
22
|
-
* and `processors` has always handled both. Only the dotted half was admitted
|
|
23
|
-
* here, so the colon half could not be passed to `buildResourceEnv` without a
|
|
24
|
-
* cast, and `SnsTopic` was missing from `Resource` altogether despite being the
|
|
25
|
-
* only thing that produces `*_ARN`.
|
|
26
|
-
*/
|
|
27
|
-
type ApiGatewayV2 = {
|
|
28
|
-
type: ResourceType.ApiGatewayV2 | ResourceType.SSTApiGatewayV2;
|
|
29
|
-
url: string;
|
|
30
|
-
};
|
|
31
|
-
type Postgres = {
|
|
32
|
-
database: string;
|
|
33
|
-
host: string;
|
|
34
|
-
password: string;
|
|
35
|
-
port: number;
|
|
36
|
-
type: ResourceType.Postgres | ResourceType.SSTPostgres;
|
|
37
|
-
username: string;
|
|
38
|
-
};
|
|
39
|
-
type Function = {
|
|
40
|
-
name: string;
|
|
41
|
-
type: ResourceType.Function | ResourceType.SSTFunction;
|
|
42
|
-
};
|
|
43
|
-
type Bucket = {
|
|
44
|
-
name: string;
|
|
45
|
-
type: ResourceType.ObjectStorage | ResourceType.SSTObjectStorage;
|
|
46
|
-
};
|
|
47
|
-
type SnsTopic = {
|
|
48
|
-
arn: string;
|
|
49
|
-
type: ResourceType.SnsTopic;
|
|
50
|
-
};
|
|
51
|
-
type Vpc = {
|
|
52
|
-
bastion: string;
|
|
53
|
-
type: ResourceType.Vpc;
|
|
54
|
-
};
|
|
55
|
-
type Secret = {
|
|
56
|
-
type: ResourceType.Secret | ResourceType.SSTSecret;
|
|
57
|
-
value: string;
|
|
58
|
-
};
|
|
59
|
-
type Resource = ApiGatewayV2 | Postgres | Function | Bucket | SnsTopic | Vpc | Secret;
|
|
60
|
-
type ResourceProcessor<K extends Resource> = (name: string, value: K) => Record<string, string | number>;
|
|
61
|
-
//# sourceMappingURL=index.d.ts.map
|
|
62
|
-
//#endregion
|
|
63
|
-
export { ApiGatewayV2, Bucket, Function, Postgres, Resource, ResourceProcessor, ResourceType, Secret, SnsTopic, Vpc, buildResourceEnv, environmentCase, getLocalIpAddress };
|
|
64
|
-
//# sourceMappingURL=index-DhHRjduZ.d.mts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"index-DhHRjduZ.d.mts","names":[],"sources":["../src/utils/index.ts"],"sourcesContent":[],"mappings":";iBAGgB,iBAAA,CAAA;AAAA,iBAcA,eAAA,CAdiB,IAAA,EAAA,MAAA,CAAA,EAAA,MAAA;AAcjB,aAOJ,YAAA;EAAA,YAAA,GAAY,sBAAA;EA+DR,QAAA,GAAA,kBAAgB;EAAA,QAAA,GAAA,kBAAA;EAAA,aACR,GAAA,gBAAA;EAAQ,GAAvB,GAAA,aAAA;EAAM,MACZ,GAAA,gBAAA;EAAM,SAAA,GAAA,gBAAA;EA0BG,WAAA,GAAA,kBAAY;EAAA,eAAA,GAAA,sBAAA;EAAA,WACjB,GAAA,kBAAa;EAAY,gBAAgB,GAAA,gBAAA;EAAe,QAAA,GAAA,kBAAA;AAI/D;AAAoB,iBAjCJ,gBAAA,CAiCI,MAAA,EAhCX,MAgCW,CAAA,MAAA,EAhCI,QAgCJ,GAAA,MAAA,CAAA,CAAA,EA/BjB,MA+BiB,CAAA,MAAA,EAAA,MAAA,CAAA;;;AAKmC;AAIvD;;;;AAEuD;AAG3C,KAnBA,YAAA,GAmBM;EAAA,IAAA,EAlBX,YAAA,CAAa,YAkBF,GAlBiB,YAAA,CAAa,eAkB9B;EAAA,GAEX,EAAA,MAAA;CAA0B;AAAgC,KAhBrD,QAAA,GAgBqD;EAGrD,QAAA,EAAA,MAAQ;EAKR,IAAA,EAAG,MAAA;EAKH,QAAA,EAAM,MAAA;EAAA,IAAA,EAAA,MAAA;EAAA,IACX,EAzBA,YAAA,CAAa,QAyBA,GAzBW,YAAA,CAAa,WAyBxB;EAAM,QAAG,EAAA,MAAa;AAAS,CAAA;AAIvC,KAzBA,QAAA,GAyBQ;EAAA,IAAA,EAAA,MAAA;EAAA,IACjB,EAxBI,YAAA,CAAa,QAwBjB,GAxB4B,YAAA,CAAa,WAwBzC;CAAY;AAEZ,KAvBS,MAAA,GAuBT;EAAQ,IACR,EAAA,MAAA;EAAM,IACN,EAvBI,YAAA,CAAa,aAuBjB,GAvBiC,YAAA,CAAa,gBAuB9C;CAAQ;AAER,KAtBS,QAAA,GAsBT;EAAM,GAAA,EAAA,MAAA;EAEG,IAAA,EAtBL,YAAA,CAAa,QAsBS;CAAA;AAAW,KAnB5B,GAAA,GAmB4B;EAAQ,OAExC,EAAA,MAAA;EAAC,IACJ,EApBE,YAAA,CAAa,GAoBf;AAAM,CAAA;KAjBC,MAAA;QACL,YAAA,CAAa,SAAS,YAAA,CAAa;;;KAI9B,QAAA,GACT,eACA,WACA,WACA,SACA,WACA,MACA;KAES,4BAA4B,kCAEhC,MACH"}
|
package/dist/utils-B1a2UuEO.cjs
DELETED
|
@@ -1,129 +0,0 @@
|
|
|
1
|
-
//#region rolldown:runtime
|
|
2
|
-
var __create = Object.create;
|
|
3
|
-
var __defProp = Object.defineProperty;
|
|
4
|
-
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
-
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
-
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
-
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
-
var __copyProps = (to, from, except, desc) => {
|
|
9
|
-
if (from && typeof from === "object" || typeof from === "function") for (var keys = __getOwnPropNames(from), i = 0, n = keys.length, key; i < n; i++) {
|
|
10
|
-
key = keys[i];
|
|
11
|
-
if (!__hasOwnProp.call(to, key) && key !== except) __defProp(to, key, {
|
|
12
|
-
get: ((k) => from[k]).bind(null, key),
|
|
13
|
-
enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable
|
|
14
|
-
});
|
|
15
|
-
}
|
|
16
|
-
return to;
|
|
17
|
-
};
|
|
18
|
-
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", {
|
|
19
|
-
value: mod,
|
|
20
|
-
enumerable: true
|
|
21
|
-
}) : target, mod));
|
|
22
|
-
|
|
23
|
-
//#endregion
|
|
24
|
-
const node_os = __toESM(require("node:os"));
|
|
25
|
-
const lodash_snakecase = __toESM(require("lodash.snakecase"));
|
|
26
|
-
|
|
27
|
-
//#region src/utils/index.ts
|
|
28
|
-
function getLocalIpAddress() {
|
|
29
|
-
const networkInterfaces = node_os.default.networkInterfaces();
|
|
30
|
-
for (const interfaceName in networkInterfaces) {
|
|
31
|
-
const addresses = networkInterfaces[interfaceName] || [];
|
|
32
|
-
for (const addressInfo of addresses) if (addressInfo.family === "IPv4" && !addressInfo.internal) return addressInfo.address;
|
|
33
|
-
}
|
|
34
|
-
return null;
|
|
35
|
-
}
|
|
36
|
-
function environmentCase(name) {
|
|
37
|
-
return (0, lodash_snakecase.default)(name).toUpperCase().replace(/_\d+/g, (r) => {
|
|
38
|
-
return r.replace("_", "");
|
|
39
|
-
});
|
|
40
|
-
}
|
|
41
|
-
let ResourceType = /* @__PURE__ */ function(ResourceType$1) {
|
|
42
|
-
ResourceType$1["ApiGatewayV2"] = "sst.aws.ApiGatewayV2";
|
|
43
|
-
ResourceType$1["Postgres"] = "sst.aws.Postgres";
|
|
44
|
-
ResourceType$1["Function"] = "sst.aws.Function";
|
|
45
|
-
ResourceType$1["ObjectStorage"] = "sst.aws.Bucket";
|
|
46
|
-
ResourceType$1["Vpc"] = "sst.aws.Vpc";
|
|
47
|
-
ResourceType$1["Secret"] = "sst.sst.Secret";
|
|
48
|
-
ResourceType$1["SSTSecret"] = "sst:sst:Secret";
|
|
49
|
-
ResourceType$1["SSTFunction"] = "sst:sst:Function";
|
|
50
|
-
ResourceType$1["SSTApiGatewayV2"] = "sst:aws:ApiGatewayV2";
|
|
51
|
-
ResourceType$1["SSTPostgres"] = "sst:aws:Postgres";
|
|
52
|
-
ResourceType$1["SSTObjectStorage"] = "sst:aws:Bucket";
|
|
53
|
-
ResourceType$1["SnsTopic"] = "sst:aws:SnsTopic";
|
|
54
|
-
return ResourceType$1;
|
|
55
|
-
}({});
|
|
56
|
-
const secret = (name, value) => ({ [environmentCase(name)]: value.value });
|
|
57
|
-
const postgres = (key, value) => {
|
|
58
|
-
const prefix = `${environmentCase(key)}`;
|
|
59
|
-
return {
|
|
60
|
-
[`${prefix}_NAME`]: value.database,
|
|
61
|
-
[`${prefix}_HOST`]: value.host,
|
|
62
|
-
[`${prefix}_PASSWORD`]: value.password,
|
|
63
|
-
[`${prefix}_PORT`]: value.port,
|
|
64
|
-
[`${prefix}_USERNAME`]: value.username
|
|
65
|
-
};
|
|
66
|
-
};
|
|
67
|
-
const bucket = (name, value) => {
|
|
68
|
-
const prefix = `${environmentCase(name)}`;
|
|
69
|
-
return { [`${prefix}_NAME`]: value.name };
|
|
70
|
-
};
|
|
71
|
-
const topic = (name, value) => {
|
|
72
|
-
const prefix = `${environmentCase(name)}`;
|
|
73
|
-
const key = `${prefix}_ARN`;
|
|
74
|
-
return { [key]: value.arn };
|
|
75
|
-
};
|
|
76
|
-
const noop = (_name, _value) => ({});
|
|
77
|
-
const processors = {
|
|
78
|
-
[ResourceType.ApiGatewayV2]: noop,
|
|
79
|
-
[ResourceType.Function]: noop,
|
|
80
|
-
[ResourceType.Vpc]: noop,
|
|
81
|
-
[ResourceType.Secret]: secret,
|
|
82
|
-
[ResourceType.Postgres]: postgres,
|
|
83
|
-
[ResourceType.ObjectStorage]: bucket,
|
|
84
|
-
[ResourceType.SSTSecret]: secret,
|
|
85
|
-
[ResourceType.SSTObjectStorage]: bucket,
|
|
86
|
-
[ResourceType.SSTFunction]: noop,
|
|
87
|
-
[ResourceType.SSTPostgres]: postgres,
|
|
88
|
-
[ResourceType.SSTApiGatewayV2]: noop,
|
|
89
|
-
[ResourceType.SnsTopic]: topic
|
|
90
|
-
};
|
|
91
|
-
function buildResourceEnv(record) {
|
|
92
|
-
const env = {};
|
|
93
|
-
for (const [k, value] of Object.entries(record)) {
|
|
94
|
-
if (typeof value === "string") {
|
|
95
|
-
env[environmentCase(k)] = value;
|
|
96
|
-
continue;
|
|
97
|
-
}
|
|
98
|
-
const processor = processors[value.type];
|
|
99
|
-
if (processor) Object.assign(env, processor(k, value));
|
|
100
|
-
}
|
|
101
|
-
return env;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
//#endregion
|
|
105
|
-
Object.defineProperty(exports, 'ResourceType', {
|
|
106
|
-
enumerable: true,
|
|
107
|
-
get: function () {
|
|
108
|
-
return ResourceType;
|
|
109
|
-
}
|
|
110
|
-
});
|
|
111
|
-
Object.defineProperty(exports, 'buildResourceEnv', {
|
|
112
|
-
enumerable: true,
|
|
113
|
-
get: function () {
|
|
114
|
-
return buildResourceEnv;
|
|
115
|
-
}
|
|
116
|
-
});
|
|
117
|
-
Object.defineProperty(exports, 'environmentCase', {
|
|
118
|
-
enumerable: true,
|
|
119
|
-
get: function () {
|
|
120
|
-
return environmentCase;
|
|
121
|
-
}
|
|
122
|
-
});
|
|
123
|
-
Object.defineProperty(exports, 'getLocalIpAddress', {
|
|
124
|
-
enumerable: true,
|
|
125
|
-
get: function () {
|
|
126
|
-
return getLocalIpAddress;
|
|
127
|
-
}
|
|
128
|
-
});
|
|
129
|
-
//# sourceMappingURL=utils-B1a2UuEO.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils-B1a2UuEO.cjs","names":["name: string","value: Secret","key: string","value: Postgres","value: Bucket","value: SnsTopic","_name: string","_value: any","processors: Record<ResourceType, ResourceProcessor<any>>","record: Record<string, Resource | string>","env: Record<string, string>"],"sources":["../src/utils/index.ts"],"sourcesContent":["import os from 'node:os';\nimport snakecase from 'lodash.snakecase';\n\nexport function getLocalIpAddress() {\n\tconst networkInterfaces = os.networkInterfaces();\n\tfor (const interfaceName in networkInterfaces) {\n\t\tconst addresses = networkInterfaces[interfaceName] || [];\n\t\tfor (const addressInfo of addresses) {\n\t\t\t// Look for an IPv4 address that is not internal (loopback)\n\t\t\tif (addressInfo.family === 'IPv4' && !addressInfo.internal) {\n\t\t\t\treturn addressInfo.address;\n\t\t\t}\n\t\t}\n\t}\n\treturn null; // No suitable IP address found\n}\n\nexport function environmentCase(name: string) {\n\treturn snakecase(name)\n\t\t.toUpperCase()\n\t\t.replace(/_\\d+/g, (r) => {\n\t\t\treturn r.replace('_', '');\n\t\t});\n}\nexport enum ResourceType {\n\tApiGatewayV2 = 'sst.aws.ApiGatewayV2',\n\tPostgres = 'sst.aws.Postgres',\n\tFunction = 'sst.aws.Function',\n\tObjectStorage = 'sst.aws.Bucket',\n\tVpc = 'sst.aws.Vpc',\n\tSecret = 'sst.sst.Secret',\n\tSSTSecret = 'sst:sst:Secret',\n\tSSTFunction = 'sst:sst:Function',\n\tSSTApiGatewayV2 = 'sst:aws:ApiGatewayV2',\n\tSSTPostgres = 'sst:aws:Postgres',\n\tSSTObjectStorage = 'sst:aws:Bucket',\n\tSnsTopic = 'sst:aws:SnsTopic',\n}\n\nconst secret = (name: string, value: Secret) => ({\n\t[environmentCase(name)]: value.value,\n});\nconst postgres = (key: string, value: Postgres) => {\n\tconst prefix = `${environmentCase(key)}`;\n\treturn {\n\t\t[`${prefix}_NAME`]: value.database,\n\t\t[`${prefix}_HOST`]: value.host,\n\t\t[`${prefix}_PASSWORD`]: value.password,\n\t\t[`${prefix}_PORT`]: value.port,\n\t\t[`${prefix}_USERNAME`]: value.username,\n\t};\n};\n\nconst bucket = (name: string, value: Bucket) => {\n\tconst prefix = `${environmentCase(name)}`;\n\treturn {\n\t\t[`${prefix}_NAME`]: value.name,\n\t};\n};\n\nconst topic = (name: string, value: SnsTopic) => {\n\tconst prefix = `${environmentCase(name)}`;\n\tconst key = `${prefix}_ARN`;\n\n\treturn {\n\t\t[key]: value.arn,\n\t};\n};\n\nconst noop = (_name: string, _value: any) => ({});\n\nconst processors: Record<ResourceType, ResourceProcessor<any>> = {\n\t[ResourceType.ApiGatewayV2]: noop,\n\t[ResourceType.Function]: noop,\n\t[ResourceType.Vpc]: noop,\n\t[ResourceType.Secret]: secret,\n\t[ResourceType.Postgres]: postgres,\n\t[ResourceType.ObjectStorage]: bucket,\n\n\t[ResourceType.SSTSecret]: secret,\n\t[ResourceType.SSTObjectStorage]: bucket,\n\t[ResourceType.SSTFunction]: noop,\n\t[ResourceType.SSTPostgres]: postgres,\n\t[ResourceType.SSTApiGatewayV2]: noop,\n\t[ResourceType.SnsTopic]: topic,\n};\n\nexport function buildResourceEnv(\n\trecord: Record<string, Resource | string>,\n): Record<string, string> {\n\tconst env: Record<string, string> = {};\n\tfor (const [k, value] of Object.entries(record)) {\n\t\tif (typeof value === 'string') {\n\t\t\tenv[environmentCase(k)] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst processor = processors[value.type];\n\t\tif (processor) {\n\t\t\tObject.assign(env, processor(k, value));\n\t\t} else {\n\t\t}\n\t}\n\n\treturn env;\n}\n\n/**\n * SST links a resource under one of two spellings — `sst.aws.Bucket` when it\n * comes from the state file, `sst:aws:Bucket` when it comes from the runtime —\n * and `processors` has always handled both. Only the dotted half was admitted\n * here, so the colon half could not be passed to `buildResourceEnv` without a\n * cast, and `SnsTopic` was missing from `Resource` altogether despite being the\n * only thing that produces `*_ARN`.\n */\nexport type ApiGatewayV2 = {\n\ttype: ResourceType.ApiGatewayV2 | ResourceType.SSTApiGatewayV2;\n\turl: string;\n};\n\nexport type Postgres = {\n\tdatabase: string;\n\thost: string;\n\tpassword: string;\n\tport: number;\n\ttype: ResourceType.Postgres | ResourceType.SSTPostgres;\n\tusername: string;\n};\n\nexport type Function = {\n\tname: string;\n\ttype: ResourceType.Function | ResourceType.SSTFunction;\n};\n\nexport type Bucket = {\n\tname: string;\n\ttype: ResourceType.ObjectStorage | ResourceType.SSTObjectStorage;\n};\n\nexport type SnsTopic = {\n\tarn: string;\n\ttype: ResourceType.SnsTopic;\n};\n\nexport type Vpc = {\n\tbastion: string;\n\ttype: ResourceType.Vpc;\n};\n\nexport type Secret = {\n\ttype: ResourceType.Secret | ResourceType.SSTSecret;\n\tvalue: string;\n};\n\nexport type Resource =\n\t| ApiGatewayV2\n\t| Postgres\n\t| Function\n\t| Bucket\n\t| SnsTopic\n\t| Vpc\n\t| Secret;\n\nexport type ResourceProcessor<K extends Resource> = (\n\tname: string,\n\tvalue: K,\n) => Record<string, string | number>;\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;AAGA,SAAgB,oBAAoB;CACnC,MAAM,oBAAoB,gBAAG,mBAAmB;AAChD,MAAK,MAAM,iBAAiB,mBAAmB;EAC9C,MAAM,YAAY,kBAAkB,kBAAkB,CAAE;AACxD,OAAK,MAAM,eAAe,UAEzB,KAAI,YAAY,WAAW,WAAW,YAAY,SACjD,QAAO,YAAY;CAGrB;AACD,QAAO;AACP;AAED,SAAgB,gBAAgBA,MAAc;AAC7C,QAAO,8BAAU,KAAK,CACpB,aAAa,CACb,QAAQ,SAAS,CAAC,MAAM;AACxB,SAAO,EAAE,QAAQ,KAAK,GAAG;CACzB,EAAC;AACH;AACD,IAAY,wDAAL;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AAED,MAAM,SAAS,CAACA,MAAcC,WAAmB,GAC/C,gBAAgB,KAAK,GAAG,MAAM,MAC/B;AACD,MAAM,WAAW,CAACC,KAAaC,UAAoB;CAClD,MAAM,UAAU,EAAE,gBAAgB,IAAI,CAAC;AACvC,QAAO;IACJ,EAAE,OAAO,SAAS,MAAM;IACxB,EAAE,OAAO,SAAS,MAAM;IACxB,EAAE,OAAO,aAAa,MAAM;IAC5B,EAAE,OAAO,SAAS,MAAM;IACxB,EAAE,OAAO,aAAa,MAAM;CAC9B;AACD;AAED,MAAM,SAAS,CAACH,MAAcI,UAAkB;CAC/C,MAAM,UAAU,EAAE,gBAAgB,KAAK,CAAC;AACxC,QAAO,IACJ,EAAE,OAAO,SAAS,MAAM,KAC1B;AACD;AAED,MAAM,QAAQ,CAACJ,MAAcK,UAAoB;CAChD,MAAM,UAAU,EAAE,gBAAgB,KAAK,CAAC;CACxC,MAAM,OAAO,EAAE,OAAO;AAEtB,QAAO,GACL,MAAM,MAAM,IACb;AACD;AAED,MAAM,OAAO,CAACC,OAAeC,YAAiB,CAAE;AAEhD,MAAMC,aAA2D;EAC/D,aAAa,eAAe;EAC5B,aAAa,WAAW;EACxB,aAAa,MAAM;EACnB,aAAa,SAAS;EACtB,aAAa,WAAW;EACxB,aAAa,gBAAgB;EAE7B,aAAa,YAAY;EACzB,aAAa,mBAAmB;EAChC,aAAa,cAAc;EAC3B,aAAa,cAAc;EAC3B,aAAa,kBAAkB;EAC/B,aAAa,WAAW;AACzB;AAED,SAAgB,iBACfC,QACyB;CACzB,MAAMC,MAA8B,CAAE;AACtC,MAAK,MAAM,CAAC,GAAG,MAAM,IAAI,OAAO,QAAQ,OAAO,EAAE;AAChD,aAAW,UAAU,UAAU;AAC9B,OAAI,gBAAgB,EAAE,IAAI;AAC1B;EACA;EAED,MAAM,YAAY,WAAW,MAAM;AACnC,MAAI,UACH,QAAO,OAAO,KAAK,UAAU,GAAG,MAAM,CAAC;CAGxC;AAED,QAAO;AACP"}
|
package/dist/utils-DMOXJ27j.mjs
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
import os from "node:os";
|
|
2
|
-
import snakecase from "lodash.snakecase";
|
|
3
|
-
|
|
4
|
-
//#region src/utils/index.ts
|
|
5
|
-
function getLocalIpAddress() {
|
|
6
|
-
const networkInterfaces = os.networkInterfaces();
|
|
7
|
-
for (const interfaceName in networkInterfaces) {
|
|
8
|
-
const addresses = networkInterfaces[interfaceName] || [];
|
|
9
|
-
for (const addressInfo of addresses) if (addressInfo.family === "IPv4" && !addressInfo.internal) return addressInfo.address;
|
|
10
|
-
}
|
|
11
|
-
return null;
|
|
12
|
-
}
|
|
13
|
-
function environmentCase(name) {
|
|
14
|
-
return snakecase(name).toUpperCase().replace(/_\d+/g, (r) => {
|
|
15
|
-
return r.replace("_", "");
|
|
16
|
-
});
|
|
17
|
-
}
|
|
18
|
-
let ResourceType = /* @__PURE__ */ function(ResourceType$1) {
|
|
19
|
-
ResourceType$1["ApiGatewayV2"] = "sst.aws.ApiGatewayV2";
|
|
20
|
-
ResourceType$1["Postgres"] = "sst.aws.Postgres";
|
|
21
|
-
ResourceType$1["Function"] = "sst.aws.Function";
|
|
22
|
-
ResourceType$1["ObjectStorage"] = "sst.aws.Bucket";
|
|
23
|
-
ResourceType$1["Vpc"] = "sst.aws.Vpc";
|
|
24
|
-
ResourceType$1["Secret"] = "sst.sst.Secret";
|
|
25
|
-
ResourceType$1["SSTSecret"] = "sst:sst:Secret";
|
|
26
|
-
ResourceType$1["SSTFunction"] = "sst:sst:Function";
|
|
27
|
-
ResourceType$1["SSTApiGatewayV2"] = "sst:aws:ApiGatewayV2";
|
|
28
|
-
ResourceType$1["SSTPostgres"] = "sst:aws:Postgres";
|
|
29
|
-
ResourceType$1["SSTObjectStorage"] = "sst:aws:Bucket";
|
|
30
|
-
ResourceType$1["SnsTopic"] = "sst:aws:SnsTopic";
|
|
31
|
-
return ResourceType$1;
|
|
32
|
-
}({});
|
|
33
|
-
const secret = (name, value) => ({ [environmentCase(name)]: value.value });
|
|
34
|
-
const postgres = (key, value) => {
|
|
35
|
-
const prefix = `${environmentCase(key)}`;
|
|
36
|
-
return {
|
|
37
|
-
[`${prefix}_NAME`]: value.database,
|
|
38
|
-
[`${prefix}_HOST`]: value.host,
|
|
39
|
-
[`${prefix}_PASSWORD`]: value.password,
|
|
40
|
-
[`${prefix}_PORT`]: value.port,
|
|
41
|
-
[`${prefix}_USERNAME`]: value.username
|
|
42
|
-
};
|
|
43
|
-
};
|
|
44
|
-
const bucket = (name, value) => {
|
|
45
|
-
const prefix = `${environmentCase(name)}`;
|
|
46
|
-
return { [`${prefix}_NAME`]: value.name };
|
|
47
|
-
};
|
|
48
|
-
const topic = (name, value) => {
|
|
49
|
-
const prefix = `${environmentCase(name)}`;
|
|
50
|
-
const key = `${prefix}_ARN`;
|
|
51
|
-
return { [key]: value.arn };
|
|
52
|
-
};
|
|
53
|
-
const noop = (_name, _value) => ({});
|
|
54
|
-
const processors = {
|
|
55
|
-
[ResourceType.ApiGatewayV2]: noop,
|
|
56
|
-
[ResourceType.Function]: noop,
|
|
57
|
-
[ResourceType.Vpc]: noop,
|
|
58
|
-
[ResourceType.Secret]: secret,
|
|
59
|
-
[ResourceType.Postgres]: postgres,
|
|
60
|
-
[ResourceType.ObjectStorage]: bucket,
|
|
61
|
-
[ResourceType.SSTSecret]: secret,
|
|
62
|
-
[ResourceType.SSTObjectStorage]: bucket,
|
|
63
|
-
[ResourceType.SSTFunction]: noop,
|
|
64
|
-
[ResourceType.SSTPostgres]: postgres,
|
|
65
|
-
[ResourceType.SSTApiGatewayV2]: noop,
|
|
66
|
-
[ResourceType.SnsTopic]: topic
|
|
67
|
-
};
|
|
68
|
-
function buildResourceEnv(record) {
|
|
69
|
-
const env = {};
|
|
70
|
-
for (const [k, value] of Object.entries(record)) {
|
|
71
|
-
if (typeof value === "string") {
|
|
72
|
-
env[environmentCase(k)] = value;
|
|
73
|
-
continue;
|
|
74
|
-
}
|
|
75
|
-
const processor = processors[value.type];
|
|
76
|
-
if (processor) Object.assign(env, processor(k, value));
|
|
77
|
-
}
|
|
78
|
-
return env;
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
//#endregion
|
|
82
|
-
export { ResourceType, buildResourceEnv, environmentCase, getLocalIpAddress };
|
|
83
|
-
//# sourceMappingURL=utils-DMOXJ27j.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"utils-DMOXJ27j.mjs","names":["name: string","value: Secret","key: string","value: Postgres","value: Bucket","value: SnsTopic","_name: string","_value: any","processors: Record<ResourceType, ResourceProcessor<any>>","record: Record<string, Resource | string>","env: Record<string, string>"],"sources":["../src/utils/index.ts"],"sourcesContent":["import os from 'node:os';\nimport snakecase from 'lodash.snakecase';\n\nexport function getLocalIpAddress() {\n\tconst networkInterfaces = os.networkInterfaces();\n\tfor (const interfaceName in networkInterfaces) {\n\t\tconst addresses = networkInterfaces[interfaceName] || [];\n\t\tfor (const addressInfo of addresses) {\n\t\t\t// Look for an IPv4 address that is not internal (loopback)\n\t\t\tif (addressInfo.family === 'IPv4' && !addressInfo.internal) {\n\t\t\t\treturn addressInfo.address;\n\t\t\t}\n\t\t}\n\t}\n\treturn null; // No suitable IP address found\n}\n\nexport function environmentCase(name: string) {\n\treturn snakecase(name)\n\t\t.toUpperCase()\n\t\t.replace(/_\\d+/g, (r) => {\n\t\t\treturn r.replace('_', '');\n\t\t});\n}\nexport enum ResourceType {\n\tApiGatewayV2 = 'sst.aws.ApiGatewayV2',\n\tPostgres = 'sst.aws.Postgres',\n\tFunction = 'sst.aws.Function',\n\tObjectStorage = 'sst.aws.Bucket',\n\tVpc = 'sst.aws.Vpc',\n\tSecret = 'sst.sst.Secret',\n\tSSTSecret = 'sst:sst:Secret',\n\tSSTFunction = 'sst:sst:Function',\n\tSSTApiGatewayV2 = 'sst:aws:ApiGatewayV2',\n\tSSTPostgres = 'sst:aws:Postgres',\n\tSSTObjectStorage = 'sst:aws:Bucket',\n\tSnsTopic = 'sst:aws:SnsTopic',\n}\n\nconst secret = (name: string, value: Secret) => ({\n\t[environmentCase(name)]: value.value,\n});\nconst postgres = (key: string, value: Postgres) => {\n\tconst prefix = `${environmentCase(key)}`;\n\treturn {\n\t\t[`${prefix}_NAME`]: value.database,\n\t\t[`${prefix}_HOST`]: value.host,\n\t\t[`${prefix}_PASSWORD`]: value.password,\n\t\t[`${prefix}_PORT`]: value.port,\n\t\t[`${prefix}_USERNAME`]: value.username,\n\t};\n};\n\nconst bucket = (name: string, value: Bucket) => {\n\tconst prefix = `${environmentCase(name)}`;\n\treturn {\n\t\t[`${prefix}_NAME`]: value.name,\n\t};\n};\n\nconst topic = (name: string, value: SnsTopic) => {\n\tconst prefix = `${environmentCase(name)}`;\n\tconst key = `${prefix}_ARN`;\n\n\treturn {\n\t\t[key]: value.arn,\n\t};\n};\n\nconst noop = (_name: string, _value: any) => ({});\n\nconst processors: Record<ResourceType, ResourceProcessor<any>> = {\n\t[ResourceType.ApiGatewayV2]: noop,\n\t[ResourceType.Function]: noop,\n\t[ResourceType.Vpc]: noop,\n\t[ResourceType.Secret]: secret,\n\t[ResourceType.Postgres]: postgres,\n\t[ResourceType.ObjectStorage]: bucket,\n\n\t[ResourceType.SSTSecret]: secret,\n\t[ResourceType.SSTObjectStorage]: bucket,\n\t[ResourceType.SSTFunction]: noop,\n\t[ResourceType.SSTPostgres]: postgres,\n\t[ResourceType.SSTApiGatewayV2]: noop,\n\t[ResourceType.SnsTopic]: topic,\n};\n\nexport function buildResourceEnv(\n\trecord: Record<string, Resource | string>,\n): Record<string, string> {\n\tconst env: Record<string, string> = {};\n\tfor (const [k, value] of Object.entries(record)) {\n\t\tif (typeof value === 'string') {\n\t\t\tenv[environmentCase(k)] = value;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst processor = processors[value.type];\n\t\tif (processor) {\n\t\t\tObject.assign(env, processor(k, value));\n\t\t} else {\n\t\t}\n\t}\n\n\treturn env;\n}\n\n/**\n * SST links a resource under one of two spellings — `sst.aws.Bucket` when it\n * comes from the state file, `sst:aws:Bucket` when it comes from the runtime —\n * and `processors` has always handled both. Only the dotted half was admitted\n * here, so the colon half could not be passed to `buildResourceEnv` without a\n * cast, and `SnsTopic` was missing from `Resource` altogether despite being the\n * only thing that produces `*_ARN`.\n */\nexport type ApiGatewayV2 = {\n\ttype: ResourceType.ApiGatewayV2 | ResourceType.SSTApiGatewayV2;\n\turl: string;\n};\n\nexport type Postgres = {\n\tdatabase: string;\n\thost: string;\n\tpassword: string;\n\tport: number;\n\ttype: ResourceType.Postgres | ResourceType.SSTPostgres;\n\tusername: string;\n};\n\nexport type Function = {\n\tname: string;\n\ttype: ResourceType.Function | ResourceType.SSTFunction;\n};\n\nexport type Bucket = {\n\tname: string;\n\ttype: ResourceType.ObjectStorage | ResourceType.SSTObjectStorage;\n};\n\nexport type SnsTopic = {\n\tarn: string;\n\ttype: ResourceType.SnsTopic;\n};\n\nexport type Vpc = {\n\tbastion: string;\n\ttype: ResourceType.Vpc;\n};\n\nexport type Secret = {\n\ttype: ResourceType.Secret | ResourceType.SSTSecret;\n\tvalue: string;\n};\n\nexport type Resource =\n\t| ApiGatewayV2\n\t| Postgres\n\t| Function\n\t| Bucket\n\t| SnsTopic\n\t| Vpc\n\t| Secret;\n\nexport type ResourceProcessor<K extends Resource> = (\n\tname: string,\n\tvalue: K,\n) => Record<string, string | number>;\n"],"mappings":";;;;AAGA,SAAgB,oBAAoB;CACnC,MAAM,oBAAoB,GAAG,mBAAmB;AAChD,MAAK,MAAM,iBAAiB,mBAAmB;EAC9C,MAAM,YAAY,kBAAkB,kBAAkB,CAAE;AACxD,OAAK,MAAM,eAAe,UAEzB,KAAI,YAAY,WAAW,WAAW,YAAY,SACjD,QAAO,YAAY;CAGrB;AACD,QAAO;AACP;AAED,SAAgB,gBAAgBA,MAAc;AAC7C,QAAO,UAAU,KAAK,CACpB,aAAa,CACb,QAAQ,SAAS,CAAC,MAAM;AACxB,SAAO,EAAE,QAAQ,KAAK,GAAG;CACzB,EAAC;AACH;AACD,IAAY,wDAAL;AACN;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AACA;AAED,MAAM,SAAS,CAACA,MAAcC,WAAmB,GAC/C,gBAAgB,KAAK,GAAG,MAAM,MAC/B;AACD,MAAM,WAAW,CAACC,KAAaC,UAAoB;CAClD,MAAM,UAAU,EAAE,gBAAgB,IAAI,CAAC;AACvC,QAAO;IACJ,EAAE,OAAO,SAAS,MAAM;IACxB,EAAE,OAAO,SAAS,MAAM;IACxB,EAAE,OAAO,aAAa,MAAM;IAC5B,EAAE,OAAO,SAAS,MAAM;IACxB,EAAE,OAAO,aAAa,MAAM;CAC9B;AACD;AAED,MAAM,SAAS,CAACH,MAAcI,UAAkB;CAC/C,MAAM,UAAU,EAAE,gBAAgB,KAAK,CAAC;AACxC,QAAO,IACJ,EAAE,OAAO,SAAS,MAAM,KAC1B;AACD;AAED,MAAM,QAAQ,CAACJ,MAAcK,UAAoB;CAChD,MAAM,UAAU,EAAE,gBAAgB,KAAK,CAAC;CACxC,MAAM,OAAO,EAAE,OAAO;AAEtB,QAAO,GACL,MAAM,MAAM,IACb;AACD;AAED,MAAM,OAAO,CAACC,OAAeC,YAAiB,CAAE;AAEhD,MAAMC,aAA2D;EAC/D,aAAa,eAAe;EAC5B,aAAa,WAAW;EACxB,aAAa,MAAM;EACnB,aAAa,SAAS;EACtB,aAAa,WAAW;EACxB,aAAa,gBAAgB;EAE7B,aAAa,YAAY;EACzB,aAAa,mBAAmB;EAChC,aAAa,cAAc;EAC3B,aAAa,cAAc;EAC3B,aAAa,kBAAkB;EAC/B,aAAa,WAAW;AACzB;AAED,SAAgB,iBACfC,QACyB;CACzB,MAAMC,MAA8B,CAAE;AACtC,MAAK,MAAM,CAAC,GAAG,MAAM,IAAI,OAAO,QAAQ,OAAO,EAAE;AAChD,aAAW,UAAU,UAAU;AAC9B,OAAI,gBAAgB,EAAE,IAAI;AAC1B;EACA;EAED,MAAM,YAAY,WAAW,MAAM;AACnC,MAAI,UACH,QAAO,OAAO,KAAK,UAAU,GAAG,MAAM,CAAC;CAGxC;AAED,QAAO;AACP"}
|
|
@@ -1,77 +0,0 @@
|
|
|
1
|
-
// Type-level checks that the `fromManifest` integrators accept the unified
|
|
2
|
-
// `gkm build` manifest shape (`export const manifest = { … } as const`) — both
|
|
3
|
-
// the flat and the partitioned `ManifestField` forms. Checked by `ts:check:sst`.
|
|
4
|
-
|
|
5
|
-
import type { Manifest, ManifestField, RouteInfo } from '@geekmidas/manifest';
|
|
6
|
-
import { App } from '../App';
|
|
7
|
-
import { Api } from '../aws/Api';
|
|
8
|
-
import { Cron } from '../aws/Cron';
|
|
9
|
-
import { Function } from '../aws/Function';
|
|
10
|
-
import { type GkmLinkable, ResourceType } from '../Linkable';
|
|
11
|
-
|
|
12
|
-
const stack = new App({
|
|
13
|
-
name: 'a',
|
|
14
|
-
stage: 'dev',
|
|
15
|
-
domain: 'example.com',
|
|
16
|
-
hostedZoneId: 'Z',
|
|
17
|
-
region: 'us-east-1',
|
|
18
|
-
}).stack('api');
|
|
19
|
-
|
|
20
|
-
const db: GkmLinkable = { _id: 'db', _type: ResourceType.Postgres };
|
|
21
|
-
|
|
22
|
-
// Mirrors a generated `manifest/aws.ts` — one object, `as const`.
|
|
23
|
-
const manifest = {
|
|
24
|
-
routes: [
|
|
25
|
-
{
|
|
26
|
-
path: '/users/{id}',
|
|
27
|
-
method: 'GET',
|
|
28
|
-
handler: 'users.handler',
|
|
29
|
-
authorizer: 'none',
|
|
30
|
-
environment: ['DB_HOST'],
|
|
31
|
-
timeout: 30,
|
|
32
|
-
memorySize: 1024,
|
|
33
|
-
},
|
|
34
|
-
],
|
|
35
|
-
functions: [
|
|
36
|
-
{ name: 'worker', handler: 'worker.handler', environment: ['DB_URL'] },
|
|
37
|
-
],
|
|
38
|
-
crons: [
|
|
39
|
-
{ name: 'nightly', handler: 'nightly.handler', schedule: 'rate(1 day)' },
|
|
40
|
-
],
|
|
41
|
-
} as const satisfies Manifest;
|
|
42
|
-
|
|
43
|
-
// Each integrator takes the manifest *field*.
|
|
44
|
-
export const api = Api.fromManifest(stack, 'Api', manifest.routes, {
|
|
45
|
-
links: [db],
|
|
46
|
-
authorizers: { jwt: { issuer: 'https://i', audiences: ['a'] } },
|
|
47
|
-
});
|
|
48
|
-
export const workers = Function.fromManifest(stack, manifest.functions, {
|
|
49
|
-
links: [db],
|
|
50
|
-
});
|
|
51
|
-
export const crons = Cron.fromManifest(stack, manifest.crons, { links: [db] });
|
|
52
|
-
|
|
53
|
-
// The partitioned `ManifestField` form is also accepted.
|
|
54
|
-
const partitionedRoutes = {
|
|
55
|
-
admin: [
|
|
56
|
-
{
|
|
57
|
-
path: '/admin',
|
|
58
|
-
method: 'GET',
|
|
59
|
-
handler: 'admin.handler',
|
|
60
|
-
authorizer: 'iam',
|
|
61
|
-
},
|
|
62
|
-
],
|
|
63
|
-
default: [
|
|
64
|
-
{
|
|
65
|
-
path: '/health',
|
|
66
|
-
method: 'GET',
|
|
67
|
-
handler: 'health.handler',
|
|
68
|
-
authorizer: 'none',
|
|
69
|
-
},
|
|
70
|
-
],
|
|
71
|
-
} satisfies ManifestField<RouteInfo>;
|
|
72
|
-
export const partitionedApi = Api.fromManifest(
|
|
73
|
-
stack,
|
|
74
|
-
'PartApi',
|
|
75
|
-
partitionedRoutes,
|
|
76
|
-
{ links: [db] },
|
|
77
|
-
);
|