@webiny/pulumi-aws 5.42.4-beta.0 → 5.43.0-beta.1
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/apps/api/ApiGraphql.js +2 -2
- package/apps/api/ApiGraphql.js.map +1 -1
- package/apps/api/ApiMigration.js +2 -1
- package/apps/api/ApiMigration.js.map +1 -1
- package/apps/api/ApiOutput.js +2 -1
- package/apps/api/ApiOutput.js.map +1 -1
- package/apps/api/createApiPulumiApp.d.ts +9 -2
- package/apps/api/createApiPulumiApp.js +12 -14
- package/apps/api/createApiPulumiApp.js.map +1 -1
- package/apps/awsUtils.d.ts +1 -1
- package/apps/blueGreen/BlueGreenRouterApiGateway.d.ts +11 -0
- package/apps/blueGreen/BlueGreenRouterApiGateway.js +51 -0
- package/apps/blueGreen/BlueGreenRouterApiGateway.js.map +1 -0
- package/apps/blueGreen/BlueGreenRouterCloudFront.d.ts +17 -0
- package/apps/blueGreen/BlueGreenRouterCloudFront.js +106 -0
- package/apps/blueGreen/BlueGreenRouterCloudFront.js.map +1 -0
- package/apps/blueGreen/BlueGreenRouterCloudFrontStore.d.ts +10 -0
- package/apps/blueGreen/BlueGreenRouterCloudFrontStore.js +27 -0
- package/apps/blueGreen/BlueGreenRouterCloudFrontStore.js.map +1 -0
- package/apps/blueGreen/cloudfront/createCloudFrontDefaultCacheBehaviorPolicies.d.ts +7 -0
- package/apps/blueGreen/cloudfront/createCloudFrontDefaultCacheBehaviorPolicies.js +23 -0
- package/apps/blueGreen/cloudfront/createCloudFrontDefaultCacheBehaviorPolicies.js.map +1 -0
- package/apps/blueGreen/cloudfront/createCloudFrontFunctionDomainMap.d.ts +14 -0
- package/apps/blueGreen/cloudfront/createCloudFrontFunctionDomainMap.js +30 -0
- package/apps/blueGreen/cloudfront/createCloudFrontFunctionDomainMap.js.map +1 -0
- package/apps/blueGreen/cloudfront/createOriginId.d.ts +11 -0
- package/apps/blueGreen/cloudfront/createOriginId.js +18 -0
- package/apps/blueGreen/cloudfront/createOriginId.js.map +1 -0
- package/apps/blueGreen/constants.d.ts +3 -0
- package/apps/blueGreen/constants.js +11 -0
- package/apps/blueGreen/constants.js.map +1 -0
- package/apps/blueGreen/createBlueGreenPulumiApp.d.ts +73 -0
- package/apps/blueGreen/createBlueGreenPulumiApp.js +121 -0
- package/apps/blueGreen/createBlueGreenPulumiApp.js.map +1 -0
- package/apps/blueGreen/domains/attachDomainsToOutput.d.ts +9 -0
- package/apps/blueGreen/domains/attachDomainsToOutput.js +37 -0
- package/apps/blueGreen/domains/attachDomainsToOutput.js.map +1 -0
- package/apps/blueGreen/domains/convertApplicationDomains.d.ts +6 -0
- package/apps/blueGreen/domains/convertApplicationDomains.js +32 -0
- package/apps/blueGreen/domains/convertApplicationDomains.js.map +1 -0
- package/apps/blueGreen/domains/getApplicationDomains.d.ts +20 -0
- package/apps/blueGreen/domains/getApplicationDomains.js +107 -0
- package/apps/blueGreen/domains/getApplicationDomains.js.map +1 -0
- package/apps/blueGreen/domains/resolveDomains.d.ts +6 -0
- package/apps/blueGreen/domains/resolveDomains.js +48 -0
- package/apps/blueGreen/domains/resolveDomains.js.map +1 -0
- package/apps/blueGreen/functions/buildHandlerFunction.d.ts +15 -0
- package/apps/blueGreen/functions/buildHandlerFunction.js +25 -0
- package/apps/blueGreen/functions/buildHandlerFunction.js.map +1 -0
- package/apps/blueGreen/functions/handler.d.ts +1 -0
- package/apps/blueGreen/functions/handler.js +63 -0
- package/apps/blueGreen/functions/handler.js.map +1 -0
- package/apps/blueGreen/types.d.ts +78 -0
- package/apps/blueGreen/types.js +7 -0
- package/apps/blueGreen/types.js.map +1 -0
- package/apps/blueGreen/validation/validateDeployments.d.ts +2 -0
- package/apps/blueGreen/validation/validateDeployments.js +41 -0
- package/apps/blueGreen/validation/validateDeployments.js.map +1 -0
- package/apps/common/CoreOutput.js +3 -1
- package/apps/common/CoreOutput.js.map +1 -1
- package/apps/core/cognitoIdentityProviders/configure.js +2 -1
- package/apps/core/cognitoIdentityProviders/configure.js.map +1 -1
- package/apps/core/createCorePulumiApp.js +28 -6
- package/apps/core/createCorePulumiApp.js.map +1 -1
- package/apps/createAppBucket.js +2 -1
- package/apps/createAppBucket.js.map +1 -1
- package/apps/react/createReactPulumiApp.js +7 -3
- package/apps/react/createReactPulumiApp.js.map +1 -1
- package/apps/syncSystem/SyncSystemDynamo.d.ts +5 -0
- package/apps/syncSystem/SyncSystemDynamo.js +59 -0
- package/apps/syncSystem/SyncSystemDynamo.js.map +1 -0
- package/apps/syncSystem/SyncSystemLambda.d.ts +13 -0
- package/apps/syncSystem/SyncSystemLambda.js +104 -0
- package/apps/syncSystem/SyncSystemLambda.js.map +1 -0
- package/apps/syncSystem/SyncSystemSQS.d.ts +4 -0
- package/apps/syncSystem/SyncSystemSQS.js +40 -0
- package/apps/syncSystem/SyncSystemSQS.js.map +1 -0
- package/apps/syncSystem/addTableItems.d.ts +8 -0
- package/apps/syncSystem/addTableItems.js +59 -0
- package/apps/syncSystem/addTableItems.js.map +1 -0
- package/apps/syncSystem/createSyncSystemPulumiApp.d.ts +66 -0
- package/apps/syncSystem/createSyncSystemPulumiApp.js +63 -0
- package/apps/syncSystem/createSyncSystemPulumiApp.js.map +1 -0
- package/apps/tenantRouter.js +2 -1
- package/apps/tenantRouter.js.map +1 -1
- package/apps/website/WebsitePrerendering.js +1 -1
- package/apps/website/WebsitePrerendering.js.map +1 -1
- package/apps/website/createWebsitePulumiApp.d.ts +1 -1
- package/apps/website/createWebsitePulumiApp.js +6 -2
- package/apps/website/createWebsitePulumiApp.js.map +1 -1
- package/components/tenantRouter/WebsiteTenantRouter.d.ts +1 -0
- package/components/tenantRouter/WebsiteTenantRouter.js +6 -3
- package/components/tenantRouter/WebsiteTenantRouter.js.map +1 -1
- package/enterprise/createCorePulumiApp.d.ts +1 -0
- package/enterprise/createCorePulumiApp.js +10 -0
- package/enterprise/createCorePulumiApp.js.map +1 -1
- package/enterprise/createSyncSystemPulumiApp.d.ts +26 -0
- package/enterprise/createSyncSystemPulumiApp.js +71 -0
- package/enterprise/createSyncSystemPulumiApp.js.map +1 -0
- package/env/awsRegion.d.ts +1 -0
- package/env/awsRegion.js +12 -0
- package/env/awsRegion.js.map +1 -0
- package/env/base.d.ts +15 -0
- package/env/base.js +37 -0
- package/env/base.js.map +1 -0
- package/env/env.d.ts +1 -0
- package/env/env.js +12 -0
- package/env/env.js.map +1 -0
- package/env/projectName.d.ts +1 -0
- package/env/projectName.js +12 -0
- package/env/projectName.js.map +1 -0
- package/env/variant.d.ts +1 -0
- package/env/variant.js +13 -0
- package/env/variant.js.map +1 -0
- package/package.json +21 -18
- package/utils/addServiceManifestTableItem.js +1 -1
- package/utils/addServiceManifestTableItem.js.map +1 -1
- package/utils/dynamodb.d.ts +14 -0
- package/utils/dynamodb.js +36 -0
- package/utils/dynamodb.js.map +1 -0
- package/utils/lambdaEnvVariables.js +1 -2
- package/utils/lambdaEnvVariables.js.map +1 -1
- package/utils/uploadFolderToS3.js +2 -1
- package/utils/uploadFolderToS3.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@webiny/pulumi-aws",
|
|
3
|
-
"version": "5.
|
|
3
|
+
"version": "5.43.0-beta.1",
|
|
4
4
|
"repository": {
|
|
5
5
|
"type": "git",
|
|
6
6
|
"url": "https://github.com/webiny/webiny-js.git"
|
|
@@ -13,27 +13,29 @@
|
|
|
13
13
|
"directory": "dist"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@pulumi/aws": "
|
|
17
|
-
"@pulumi/pulumi": "
|
|
18
|
-
"@pulumi/random": "4.
|
|
19
|
-
"@webiny/aws-sdk": "5.
|
|
20
|
-
"@webiny/cli-plugin-deploy-pulumi": "5.
|
|
21
|
-
"@webiny/pulumi": "5.
|
|
22
|
-
"@webiny/
|
|
16
|
+
"@pulumi/aws": "6.67.0",
|
|
17
|
+
"@pulumi/pulumi": "3.147.0",
|
|
18
|
+
"@pulumi/random": "4.17.0",
|
|
19
|
+
"@webiny/aws-sdk": "5.43.0-beta.1",
|
|
20
|
+
"@webiny/cli-plugin-deploy-pulumi": "5.43.0-beta.1",
|
|
21
|
+
"@webiny/pulumi": "5.43.0-beta.1",
|
|
22
|
+
"@webiny/utils": "5.43.0-beta.1",
|
|
23
|
+
"@webiny/wcp": "5.43.0-beta.1",
|
|
23
24
|
"form-data": "4.0.0",
|
|
24
|
-
"
|
|
25
|
+
"lodash": "4.17.21",
|
|
26
|
+
"node-fetch": "2.6.7",
|
|
27
|
+
"zod": "3.23.8"
|
|
25
28
|
},
|
|
26
29
|
"devDependencies": {
|
|
27
|
-
"@webiny/api-page-builder": "5.
|
|
28
|
-
"@webiny/aws-layers": "5.
|
|
29
|
-
"@webiny/
|
|
30
|
-
"@webiny/
|
|
30
|
+
"@webiny/api-page-builder": "5.43.0-beta.1",
|
|
31
|
+
"@webiny/aws-layers": "5.43.0-beta.1",
|
|
32
|
+
"@webiny/cli": "5.43.0-beta.1",
|
|
33
|
+
"@webiny/feature-flags": "5.43.0-beta.1",
|
|
34
|
+
"@webiny/project-utils": "5.43.0-beta.1",
|
|
31
35
|
"chalk": "4.1.2",
|
|
32
|
-
"lodash": "4.17.21",
|
|
33
36
|
"mime": "3.0.0",
|
|
34
37
|
"rimraf": "6.0.1",
|
|
35
|
-
"
|
|
36
|
-
"typescript": "4.9.5"
|
|
38
|
+
"typescript": "5.3.3"
|
|
37
39
|
},
|
|
38
40
|
"scripts": {
|
|
39
41
|
"build": "node ../cli/bin.js run build",
|
|
@@ -47,9 +49,10 @@
|
|
|
47
49
|
],
|
|
48
50
|
"src": [
|
|
49
51
|
"@aws-sdk/client-dynamodb",
|
|
50
|
-
"@aws-sdk/lib-dynamodb"
|
|
52
|
+
"@aws-sdk/lib-dynamodb",
|
|
53
|
+
"cloudfront"
|
|
51
54
|
]
|
|
52
55
|
}
|
|
53
56
|
},
|
|
54
|
-
"gitHead": "
|
|
57
|
+
"gitHead": "d47a234b09383cb7ab2d9907300b8eaa89aa64d6"
|
|
55
58
|
}
|
|
@@ -17,7 +17,7 @@ const addServiceManifestTableItem = (app, table, manifest) => {
|
|
|
17
17
|
item: pulumi.all(manifest.manifest).apply(res => {
|
|
18
18
|
return pulumi.interpolate`{
|
|
19
19
|
"PK": "SERVICE_MANIFEST#${app.name}#${manifest.name}",
|
|
20
|
-
"SK": "
|
|
20
|
+
"SK": "default",
|
|
21
21
|
"GSI1_PK": "SERVICE_MANIFESTS",
|
|
22
22
|
"GSI1_SK": "${app.name}#${manifest.name}",
|
|
23
23
|
"data": {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["pulumi","_interopRequireWildcard","require","aws","_clientDynamodb","addServiceManifestTableItem","app","table","manifest","rangeKey","apply","res","dynamodb","TableItem","name","tableName","hashKey","item","all","interpolate","
|
|
1
|
+
{"version":3,"names":["pulumi","_interopRequireWildcard","require","aws","_clientDynamodb","addServiceManifestTableItem","app","table","manifest","rangeKey","apply","res","dynamodb","TableItem","name","tableName","hashKey","item","all","interpolate","JSON","stringify","v","marshall","parse","exports"],"sources":["addServiceManifestTableItem.ts"],"sourcesContent":["import * as pulumi from \"@pulumi/pulumi\";\nimport * as aws from \"@pulumi/aws\";\nimport { PulumiApp } from \"@webiny/pulumi\";\nimport { marshall } from \"@webiny/aws-sdk/client-dynamodb\";\n\nexport interface ServiceManifest {\n name: string;\n manifest: Record<string, any>;\n}\n\nexport interface TableDefinition {\n tableName: pulumi.Output<string>;\n hashKey: pulumi.Output<string>;\n rangeKey: pulumi.Output<string | undefined>;\n}\n\nexport const addServiceManifestTableItem = (\n app: PulumiApp,\n table: TableDefinition,\n manifest: ServiceManifest\n) => {\n table.rangeKey.apply(res => {\n new aws.dynamodb.TableItem(manifest.name, {\n tableName: table.tableName,\n hashKey: table.hashKey,\n rangeKey: res,\n item: pulumi\n .all(manifest.manifest)\n .apply(res => {\n return pulumi.interpolate`{\n \"PK\": \"SERVICE_MANIFEST#${app.name}#${manifest.name}\",\n \"SK\": \"default\",\n \"GSI1_PK\": \"SERVICE_MANIFESTS\",\n \"GSI1_SK\": \"${app.name}#${manifest.name}\",\n \"data\": {\n \"name\": \"${manifest.name}\",\n \"manifest\": ${JSON.stringify(res)}\n }\n }`;\n })\n // We're using the native DynamoDB converter to avoid building those nested objects ourselves.\n .apply(v => JSON.stringify(marshall(JSON.parse(v))))\n });\n });\n};\n"],"mappings":";;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AACA,IAAAC,GAAA,GAAAF,uBAAA,CAAAC,OAAA;AAEA,IAAAE,eAAA,GAAAF,OAAA;AAaO,MAAMG,2BAA2B,GAAGA,CACvCC,GAAc,EACdC,KAAsB,EACtBC,QAAyB,KACxB;EACDD,KAAK,CAACE,QAAQ,CAACC,KAAK,CAACC,GAAG,IAAI;IACxB,IAAIR,GAAG,CAACS,QAAQ,CAACC,SAAS,CAACL,QAAQ,CAACM,IAAI,EAAE;MACtCC,SAAS,EAAER,KAAK,CAACQ,SAAS;MAC1BC,OAAO,EAAET,KAAK,CAACS,OAAO;MACtBP,QAAQ,EAAEE,GAAG;MACbM,IAAI,EAAEjB,MAAM,CACPkB,GAAG,CAACV,QAAQ,CAACA,QAAQ,CAAC,CACtBE,KAAK,CAACC,GAAG,IAAI;QACV,OAAOX,MAAM,CAACmB,WAAW;AAC7C,0CAA0Cb,GAAG,CAACQ,IAAI,IAAIN,QAAQ,CAACM,IAAI;AACnE;AACA;AACA,8BAA8BR,GAAG,CAACQ,IAAI,IAAIN,QAAQ,CAACM,IAAI;AACvD;AACA,+BAA+BN,QAAQ,CAACM,IAAI;AAC5C,kCAAkCM,IAAI,CAACC,SAAS,CAACV,GAAG,CAAC;AACrD;AACA,cAAc;MACE,CAAC;MACD;MAAA,CACCD,KAAK,CAACY,CAAC,IAAIF,IAAI,CAACC,SAAS,CAAC,IAAAE,wBAAQ,EAACH,IAAI,CAACI,KAAK,CAACF,CAAC,CAAC,CAAC,CAAC;IAC3D,CAAC,CAAC;EACN,CAAC,CAAC;AACN,CAAC;AAACG,OAAA,CAAApB,2BAAA,GAAAA,2BAAA","ignoreList":[]}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
export interface IDynamoDbConfigAttribute {
|
|
2
|
+
name: string;
|
|
3
|
+
type: "S";
|
|
4
|
+
}
|
|
5
|
+
export interface IDynamoDbConfigGlobalSecondaryIndex {
|
|
6
|
+
name: string;
|
|
7
|
+
hashKey: string;
|
|
8
|
+
rangeKey: string;
|
|
9
|
+
projectionType: "ALL";
|
|
10
|
+
}
|
|
11
|
+
export declare const createDynamoDbGSI: (indexes: string[]) => {
|
|
12
|
+
withAttributes(original: IDynamoDbConfigAttribute[]): IDynamoDbConfigAttribute[];
|
|
13
|
+
withGlobalSecondaryIndexes(original: IDynamoDbConfigGlobalSecondaryIndex[]): IDynamoDbConfigGlobalSecondaryIndex[];
|
|
14
|
+
};
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.createDynamoDbGSI = void 0;
|
|
7
|
+
const createDynamoDbGSI = indexes => {
|
|
8
|
+
return {
|
|
9
|
+
withAttributes(original) {
|
|
10
|
+
return indexes.reduce((collection, name) => {
|
|
11
|
+
collection.push({
|
|
12
|
+
name: `${name}_PK`,
|
|
13
|
+
type: "S"
|
|
14
|
+
}, {
|
|
15
|
+
name: `${name}_SK`,
|
|
16
|
+
type: "S"
|
|
17
|
+
});
|
|
18
|
+
return collection;
|
|
19
|
+
}, original);
|
|
20
|
+
},
|
|
21
|
+
withGlobalSecondaryIndexes(original) {
|
|
22
|
+
return indexes.reduce((collection, name) => {
|
|
23
|
+
original.push({
|
|
24
|
+
name,
|
|
25
|
+
hashKey: `${name}_PK`,
|
|
26
|
+
rangeKey: `${name}_SK`,
|
|
27
|
+
projectionType: "ALL"
|
|
28
|
+
});
|
|
29
|
+
return collection;
|
|
30
|
+
}, original);
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
};
|
|
34
|
+
exports.createDynamoDbGSI = createDynamoDbGSI;
|
|
35
|
+
|
|
36
|
+
//# sourceMappingURL=dynamodb.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"names":["createDynamoDbGSI","indexes","withAttributes","original","reduce","collection","name","push","type","withGlobalSecondaryIndexes","hashKey","rangeKey","projectionType","exports"],"sources":["dynamodb.ts"],"sourcesContent":["export interface IDynamoDbConfigAttribute {\n name: string;\n type: \"S\";\n}\n\nexport interface IDynamoDbConfigGlobalSecondaryIndex {\n name: string;\n hashKey: string;\n rangeKey: string;\n projectionType: \"ALL\";\n}\n\nexport const createDynamoDbGSI = (indexes: string[]) => {\n return {\n withAttributes(original: IDynamoDbConfigAttribute[]): IDynamoDbConfigAttribute[] {\n return indexes.reduce<IDynamoDbConfigAttribute[]>((collection, name) => {\n collection.push(\n {\n name: `${name}_PK`,\n type: \"S\"\n },\n {\n name: `${name}_SK`,\n type: \"S\"\n }\n );\n\n return collection;\n }, original);\n },\n withGlobalSecondaryIndexes(\n original: IDynamoDbConfigGlobalSecondaryIndex[]\n ): IDynamoDbConfigGlobalSecondaryIndex[] {\n return indexes.reduce((collection, name) => {\n original.push({\n name,\n hashKey: `${name}_PK`,\n rangeKey: `${name}_SK`,\n projectionType: \"ALL\"\n });\n return collection;\n }, original);\n }\n };\n};\n"],"mappings":";;;;;;AAYO,MAAMA,iBAAiB,GAAIC,OAAiB,IAAK;EACpD,OAAO;IACHC,cAAcA,CAACC,QAAoC,EAA8B;MAC7E,OAAOF,OAAO,CAACG,MAAM,CAA6B,CAACC,UAAU,EAAEC,IAAI,KAAK;QACpED,UAAU,CAACE,IAAI,CACX;UACID,IAAI,EAAE,GAAGA,IAAI,KAAK;UAClBE,IAAI,EAAE;QACV,CAAC,EACD;UACIF,IAAI,EAAE,GAAGA,IAAI,KAAK;UAClBE,IAAI,EAAE;QACV,CACJ,CAAC;QAED,OAAOH,UAAU;MACrB,CAAC,EAAEF,QAAQ,CAAC;IAChB,CAAC;IACDM,0BAA0BA,CACtBN,QAA+C,EACV;MACrC,OAAOF,OAAO,CAACG,MAAM,CAAC,CAACC,UAAU,EAAEC,IAAI,KAAK;QACxCH,QAAQ,CAACI,IAAI,CAAC;UACVD,IAAI;UACJI,OAAO,EAAE,GAAGJ,IAAI,KAAK;UACrBK,QAAQ,EAAE,GAAGL,IAAI,KAAK;UACtBM,cAAc,EAAE;QACpB,CAAC,CAAC;QACF,OAAOP,UAAU;MACrB,CAAC,EAAEF,QAAQ,CAAC;IAChB;EACJ,CAAC;AACL,CAAC;AAACU,OAAA,CAAAb,iBAAA,GAAAA,iBAAA","ignoreList":[]}
|
|
@@ -13,7 +13,7 @@ let sealEnvVariables = exports.sealEnvVariables = void 0;
|
|
|
13
13
|
const magicPrefixes = ["WEBINY_", "WEBINY_API_", "WCP_", "OKTA_", "AUTH0_"];
|
|
14
14
|
const variablesPromise = new Promise(resolve => {
|
|
15
15
|
exports.sealEnvVariables = sealEnvVariables = () => {
|
|
16
|
-
// Apart from a couple of basic environment variables like
|
|
16
|
+
// Apart from a couple of basic environment variables like DEBUG,
|
|
17
17
|
// we also take into consideration variables that have `WEBINY_` and `WCP_` prefix in their names.
|
|
18
18
|
const baseVariables = Object.keys(process.env).reduce((current, environmentVariableName) => {
|
|
19
19
|
const hasMagicPrefix = magicPrefixes.some(prefix => environmentVariableName.startsWith(prefix));
|
|
@@ -22,7 +22,6 @@ const variablesPromise = new Promise(resolve => {
|
|
|
22
22
|
}
|
|
23
23
|
return current;
|
|
24
24
|
}, {
|
|
25
|
-
// STAGED_ROLLOUTS_VARIANT: app.ctx.variant || "",
|
|
26
25
|
// Among other things, this determines the amount of information we reveal on runtime errors.
|
|
27
26
|
// https://www.webiny.com/docs/how-to-guides/environment-variables/#debug-environment-variable
|
|
28
27
|
DEBUG: String(process.env.DEBUG),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["pulumi","_interopRequireWildcard","require","variablesRegistry","sealEnvVariables","exports","magicPrefixes","variablesPromise","Promise","resolve","baseVariables","Object","keys","process","env","reduce","current","environmentVariableName","hasMagicPrefix","some","prefix","startsWith","undefined","String","DEBUG","PULUMI_APPS","assign","getCommonLambdaEnvVariables","output","setCommonLambdaEnvVariables","variables","withCommonLambdaEnvVariables","app","decorateProgram","program","addHandler"],"sources":["lambdaEnvVariables.ts"],"sourcesContent":["import * as pulumi from \"@pulumi/pulumi\";\nimport { PulumiApp } from \"@webiny/pulumi\";\n\ntype EnvVariables = Record<string, string | pulumi.Output<string>>;\n\nconst variablesRegistry: EnvVariables = {};\n\nexport let sealEnvVariables: () => void;\n\nconst magicPrefixes = [\"WEBINY_\", \"WEBINY_API_\", \"WCP_\", \"OKTA_\", \"AUTH0_\"];\n\nconst variablesPromise = new Promise<EnvVariables>(resolve => {\n sealEnvVariables = () => {\n // Apart from a couple of basic environment variables like
|
|
1
|
+
{"version":3,"names":["pulumi","_interopRequireWildcard","require","variablesRegistry","sealEnvVariables","exports","magicPrefixes","variablesPromise","Promise","resolve","baseVariables","Object","keys","process","env","reduce","current","environmentVariableName","hasMagicPrefix","some","prefix","startsWith","undefined","String","DEBUG","PULUMI_APPS","assign","getCommonLambdaEnvVariables","output","setCommonLambdaEnvVariables","variables","withCommonLambdaEnvVariables","app","decorateProgram","program","addHandler"],"sources":["lambdaEnvVariables.ts"],"sourcesContent":["import * as pulumi from \"@pulumi/pulumi\";\nimport { PulumiApp } from \"@webiny/pulumi\";\n\ntype EnvVariables = Record<string, string | pulumi.Output<string>>;\n\nconst variablesRegistry: EnvVariables = {};\n\nexport let sealEnvVariables: () => void;\n\nconst magicPrefixes = [\"WEBINY_\", \"WEBINY_API_\", \"WCP_\", \"OKTA_\", \"AUTH0_\"];\n\nconst variablesPromise = new Promise<EnvVariables>(resolve => {\n sealEnvVariables = () => {\n // Apart from a couple of basic environment variables like DEBUG,\n // we also take into consideration variables that have `WEBINY_` and `WCP_` prefix in their names.\n const baseVariables = Object.keys(process.env).reduce<EnvVariables>(\n (current, environmentVariableName) => {\n const hasMagicPrefix = magicPrefixes.some(prefix =>\n environmentVariableName.startsWith(prefix)\n );\n\n if (hasMagicPrefix && process.env[environmentVariableName] !== undefined) {\n current[environmentVariableName] = String(process.env[environmentVariableName]);\n }\n return current;\n },\n {\n // Among other things, this determines the amount of information we reveal on runtime errors.\n // https://www.webiny.com/docs/how-to-guides/environment-variables/#debug-environment-variable\n DEBUG: String(process.env.DEBUG),\n // This flag means that Lambda was deployed using the new Pulumi Apps architecture.\n PULUMI_APPS: \"true\"\n }\n );\n\n resolve(Object.assign({}, baseVariables, variablesRegistry));\n };\n});\n\nexport function getCommonLambdaEnvVariables(): pulumi.Output<EnvVariables> {\n return pulumi.output(variablesPromise);\n}\n\nfunction setCommonLambdaEnvVariables(variables: EnvVariables) {\n Object.assign(variablesRegistry, variables);\n}\n\nexport interface SetCommonLambdaEnvVariables {\n (variables: EnvVariables): void;\n}\n\nexport interface WithCommonLambdaEnvVariables {\n /**\n * Set ENV variables that wil be assigned to all Lambda functions in the current Pulumi app.\n */\n setCommonLambdaEnvVariables: SetCommonLambdaEnvVariables;\n}\n\n/**\n * Augment the given app with `setCommonLambdaEnvVariables` functionality.\n * @param {PulumiApp} app\n */\nexport function withCommonLambdaEnvVariables<T extends PulumiApp>(\n app: T\n): T & WithCommonLambdaEnvVariables {\n app.decorateProgram<{ setCommonLambdaEnvVariables: typeof setCommonLambdaEnvVariables }>(\n async (program, app) => {\n const output = await program({\n ...app,\n setCommonLambdaEnvVariables\n });\n\n // Once the program is executed, we need to seal the variables (this will resolve the pulumi.output promise).\n app.addHandler(() => {\n sealEnvVariables();\n });\n\n return output;\n }\n );\n\n // Augment the original PulumiApp.\n return {\n ...app,\n setCommonLambdaEnvVariables\n };\n}\n"],"mappings":";;;;;;;;;AAAA,IAAAA,MAAA,GAAAC,uBAAA,CAAAC,OAAA;AAKA,MAAMC,iBAA+B,GAAG,CAAC,CAAC;AAEnC,IAAIC,gBAA4B,GAAAC,OAAA,CAAAD,gBAAA;AAEvC,MAAME,aAAa,GAAG,CAAC,SAAS,EAAE,aAAa,EAAE,MAAM,EAAE,OAAO,EAAE,QAAQ,CAAC;AAE3E,MAAMC,gBAAgB,GAAG,IAAIC,OAAO,CAAeC,OAAO,IAAI;EAC1DJ,OAAA,CAAAD,gBAAA,GAAAA,gBAAgB,GAAGA,CAAA,KAAM;IACrB;IACA;IACA,MAAMM,aAAa,GAAGC,MAAM,CAACC,IAAI,CAACC,OAAO,CAACC,GAAG,CAAC,CAACC,MAAM,CACjD,CAACC,OAAO,EAAEC,uBAAuB,KAAK;MAClC,MAAMC,cAAc,GAAGZ,aAAa,CAACa,IAAI,CAACC,MAAM,IAC5CH,uBAAuB,CAACI,UAAU,CAACD,MAAM,CAC7C,CAAC;MAED,IAAIF,cAAc,IAAIL,OAAO,CAACC,GAAG,CAACG,uBAAuB,CAAC,KAAKK,SAAS,EAAE;QACtEN,OAAO,CAACC,uBAAuB,CAAC,GAAGM,MAAM,CAACV,OAAO,CAACC,GAAG,CAACG,uBAAuB,CAAC,CAAC;MACnF;MACA,OAAOD,OAAO;IAClB,CAAC,EACD;MACI;MACA;MACAQ,KAAK,EAAED,MAAM,CAACV,OAAO,CAACC,GAAG,CAACU,KAAK,CAAC;MAChC;MACAC,WAAW,EAAE;IACjB,CACJ,CAAC;IAEDhB,OAAO,CAACE,MAAM,CAACe,MAAM,CAAC,CAAC,CAAC,EAAEhB,aAAa,EAAEP,iBAAiB,CAAC,CAAC;EAChE,CAAC;AACL,CAAC,CAAC;AAEK,SAASwB,2BAA2BA,CAAA,EAAgC;EACvE,OAAO3B,MAAM,CAAC4B,MAAM,CAACrB,gBAAgB,CAAC;AAC1C;AAEA,SAASsB,2BAA2BA,CAACC,SAAuB,EAAE;EAC1DnB,MAAM,CAACe,MAAM,CAACvB,iBAAiB,EAAE2B,SAAS,CAAC;AAC/C;AAaA;AACA;AACA;AACA;AACO,SAASC,4BAA4BA,CACxCC,GAAM,EAC0B;EAChCA,GAAG,CAACC,eAAe,CACf,OAAOC,OAAO,EAAEF,GAAG,KAAK;IACpB,MAAMJ,MAAM,GAAG,MAAMM,OAAO,CAAC;MACzB,GAAGF,GAAG;MACNH;IACJ,CAAC,CAAC;;IAEF;IACAG,GAAG,CAACG,UAAU,CAAC,MAAM;MACjB/B,gBAAgB,CAAC,CAAC;IACtB,CAAC,CAAC;IAEF,OAAOwB,MAAM;EACjB,CACJ,CAAC;;EAED;EACA,OAAO;IACH,GAAGI,GAAG;IACNH;EACJ,CAAC;AACL","ignoreList":[]}
|
|
@@ -14,6 +14,7 @@ var _chunk = _interopRequireDefault(require("lodash/chunk"));
|
|
|
14
14
|
var _path = require("path");
|
|
15
15
|
var _crawlDirectory = require("./crawlDirectory");
|
|
16
16
|
var _getPresignedPost = require("./getPresignedPost");
|
|
17
|
+
var _awsRegion = require("../env/awsRegion");
|
|
17
18
|
function getFileChecksum(file) {
|
|
18
19
|
const crypto = require("crypto");
|
|
19
20
|
const hash = crypto.createHash("md5");
|
|
@@ -38,7 +39,7 @@ const uploadFolderToS3 = async ({
|
|
|
38
39
|
cacheControl = "max-age=31536000"
|
|
39
40
|
}) => {
|
|
40
41
|
const s3 = new _clientS.S3Client({
|
|
41
|
-
region:
|
|
42
|
+
region: (0, _awsRegion.getEnvVariableAwsRegion)()
|
|
42
43
|
});
|
|
43
44
|
if (!_fs.default.existsSync(root)) {
|
|
44
45
|
throw new Error("Cannot continue, folder does not exist.");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"names":["_fs","_interopRequireDefault","require","_nodeFetch","_formData","_clientS","_mime","_chunk","_path","_crawlDirectory","_getPresignedPost","getFileChecksum","file","crypto","hash","createHash","Promise","resolve","stream","fs","createReadStream","on","data","update","digest","uploadFolderToS3","path","root","bucket","onFileUploadSuccess","onFileUploadError","onFileUploadSkip","acl","cacheControl","s3","S3Client","region","process","env","AWS_REGION","existsSync","Error","paths","crawlDirectory","push","pathsChunks","chunk","cacheControls","pattern","value","Array","isArray","i","length","promises","j","key","relative","replace","checksum","skipUpload","existingObject","send","HeadObjectCommand","Bucket","Key","Metadata","full","find","item","test","contentType","mime","getType","url","fields","getPresignedPost","undefined","readFileSync","formData","FormData","Object","keys","forEach","append","res","fetch","method","body","status","statusText","text","e","error","all","exports"],"sources":["uploadFolderToS3.ts"],"sourcesContent":["import fs from \"fs\";\nimport fetch from \"node-fetch\";\nimport FormData from \"form-data\";\nimport { S3Client, PresignedPostOptions, HeadObjectCommand } from \"@webiny/aws-sdk/client-s3\";\nimport mime from \"mime\";\nimport chunk from \"lodash/chunk\";\nimport { relative } from \"path\";\nimport { crawlDirectory } from \"./crawlDirectory\";\nimport { getPresignedPost } from \"./getPresignedPost\";\n\nfunction getFileChecksum(file: string): Promise<string> {\n const crypto = require(\"crypto\");\n const hash = crypto.createHash(\"md5\");\n\n return new Promise(resolve => {\n const stream = fs.createReadStream(file);\n stream.on(\"data\", function (data: any) {\n hash.update(data, \"utf8\");\n });\n\n stream.on(\"end\", function () {\n resolve(hash.digest(\"hex\"));\n });\n });\n}\n\nexport interface Paths {\n full: string;\n relative: string;\n}\n\nexport type CacheControls = Array<{\n pattern: RegExp;\n value: string;\n}>;\n\nexport interface UploadFolderToS3Params {\n // Path to the folder that needs to be uploaded.\n path: string;\n\n // Object ACL.\n acl: string;\n\n // A callback that gets called every time a file has been uploaded successfully.\n onFileUploadSuccess: (params: { paths: Paths }) => void;\n\n // A callback that gets called every time a file has not been uploaded successfully.\n onFileUploadError: (params: { paths: Paths; error: Error }) => void;\n\n // A callback that gets called every time a file upload has been skipped.\n onFileUploadSkip: (params: { paths: Paths }) => void;\n\n // Target bucket\n bucket: PresignedPostOptions[\"Bucket\"];\n\n // Cache control to apply to each uploaded file\n cacheControl?: string | CacheControls;\n}\n\nexport const uploadFolderToS3 = async ({\n path: root,\n bucket,\n onFileUploadSuccess,\n onFileUploadError,\n onFileUploadSkip,\n // For backwards compatibility, we need to leave ACL on \"public-read\".\n acl = \"public-read\",\n cacheControl = \"max-age=31536000\"\n}: UploadFolderToS3Params) => {\n const s3 = new S3Client({ region: process.env.AWS_REGION });\n\n if (!fs.existsSync(root)) {\n throw new Error(\"Cannot continue, folder does not exist.\");\n }\n\n const paths: string[] = [];\n\n await crawlDirectory(root, async (path: string) => {\n paths.push(path);\n });\n\n const pathsChunks = chunk(paths, 20);\n\n const cacheControls: CacheControls = [];\n if (typeof cacheControl === \"string\") {\n cacheControls.push({ pattern: /.*/, value: cacheControl });\n } else if (Array.isArray(cacheControls)) {\n cacheControls.push(...cacheControl);\n }\n\n for (let i = 0; i < pathsChunks.length; i++) {\n const chunk = pathsChunks[i];\n\n const promises = [];\n for (let j = 0; j < chunk.length; j++) {\n const path = chunk[j];\n\n promises.push(\n new Promise<void>(async resolve => {\n // We also replace \"\\\" with \"/\", which is a path separator on Windows' CMD or Powershell.\n const key = relative(root, path).replace(/\\\\/g, \"/\");\n try {\n // Get file checksum so that we can check if a file needs to be uploaded or not.\n const checksum = await getFileChecksum(path);\n\n let skipUpload = false;\n try {\n const existingObject = await s3.send(\n new HeadObjectCommand({\n Bucket: bucket,\n Key: key\n })\n );\n\n if (existingObject.Metadata?.checksum === checksum) {\n skipUpload = true;\n }\n } catch {\n // Do nothing.\n }\n\n if (skipUpload) {\n if (typeof onFileUploadSkip === \"function\") {\n await onFileUploadSkip({ paths: { full: path, relative: key } });\n }\n } else {\n const cacheControl = cacheControls.find(item => item.pattern.test(key));\n const contentType = mime.getType(path);\n\n const { url, fields } = await getPresignedPost({\n bucket,\n key,\n acl,\n checksum,\n contentType,\n cacheControl: cacheControl ? cacheControl.value : undefined\n });\n\n const data: Record<string, string | Buffer> = {\n ...fields,\n \"Content-Type\": contentType || \"\",\n \"X-Amz-Meta-Checksum\": checksum,\n file: fs.readFileSync(path)\n };\n\n if (cacheControl) {\n data[\"Cache-Control\"] = cacheControl.value;\n }\n\n const formData = new FormData();\n Object.keys(data).forEach(key => {\n formData.append(key, data[key]);\n });\n\n const res = await fetch(url, {\n method: \"POST\",\n body: formData\n });\n\n if (res.status > 299) {\n throw new Error(`${res.statusText}\\n${await res.text()}`);\n }\n\n if (typeof onFileUploadSuccess === \"function\") {\n await onFileUploadSuccess({ paths: { full: path, relative: key } });\n }\n }\n resolve();\n } catch (e) {\n if (typeof onFileUploadError === \"function\") {\n await onFileUploadError({\n paths: { full: path, relative: key },\n error: e\n });\n }\n resolve();\n }\n })\n );\n }\n\n await Promise.all(promises);\n }\n};\n"],"mappings":"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","ignoreList":[]}
|
|
1
|
+
{"version":3,"names":["_fs","_interopRequireDefault","require","_nodeFetch","_formData","_clientS","_mime","_chunk","_path","_crawlDirectory","_getPresignedPost","_awsRegion","getFileChecksum","file","crypto","hash","createHash","Promise","resolve","stream","fs","createReadStream","on","data","update","digest","uploadFolderToS3","path","root","bucket","onFileUploadSuccess","onFileUploadError","onFileUploadSkip","acl","cacheControl","s3","S3Client","region","getEnvVariableAwsRegion","existsSync","Error","paths","crawlDirectory","push","pathsChunks","chunk","cacheControls","pattern","value","Array","isArray","i","length","promises","j","key","relative","replace","checksum","skipUpload","existingObject","send","HeadObjectCommand","Bucket","Key","Metadata","full","find","item","test","contentType","mime","getType","url","fields","getPresignedPost","undefined","readFileSync","formData","FormData","Object","keys","forEach","append","res","fetch","method","body","status","statusText","text","e","error","all","exports"],"sources":["uploadFolderToS3.ts"],"sourcesContent":["import fs from \"fs\";\nimport fetch from \"node-fetch\";\nimport FormData from \"form-data\";\nimport { S3Client, PresignedPostOptions, HeadObjectCommand } from \"@webiny/aws-sdk/client-s3\";\nimport mime from \"mime\";\nimport chunk from \"lodash/chunk\";\nimport { relative } from \"path\";\nimport { crawlDirectory } from \"./crawlDirectory\";\nimport { getPresignedPost } from \"./getPresignedPost\";\nimport { getEnvVariableAwsRegion } from \"~/env/awsRegion\";\n\nfunction getFileChecksum(file: string): Promise<string> {\n const crypto = require(\"crypto\");\n const hash = crypto.createHash(\"md5\");\n\n return new Promise(resolve => {\n const stream = fs.createReadStream(file);\n stream.on(\"data\", function (data: any) {\n hash.update(data, \"utf8\");\n });\n\n stream.on(\"end\", function () {\n resolve(hash.digest(\"hex\"));\n });\n });\n}\n\nexport interface Paths {\n full: string;\n relative: string;\n}\n\nexport type CacheControls = Array<{\n pattern: RegExp;\n value: string;\n}>;\n\nexport interface UploadFolderToS3Params {\n // Path to the folder that needs to be uploaded.\n path: string;\n\n // Object ACL.\n acl: string;\n\n // A callback that gets called every time a file has been uploaded successfully.\n onFileUploadSuccess: (params: { paths: Paths }) => void;\n\n // A callback that gets called every time a file has not been uploaded successfully.\n onFileUploadError: (params: { paths: Paths; error: Error }) => void;\n\n // A callback that gets called every time a file upload has been skipped.\n onFileUploadSkip: (params: { paths: Paths }) => void;\n\n // Target bucket\n bucket: PresignedPostOptions[\"Bucket\"];\n\n // Cache control to apply to each uploaded file\n cacheControl?: string | CacheControls;\n}\n\nexport const uploadFolderToS3 = async ({\n path: root,\n bucket,\n onFileUploadSuccess,\n onFileUploadError,\n onFileUploadSkip,\n // For backwards compatibility, we need to leave ACL on \"public-read\".\n acl = \"public-read\",\n cacheControl = \"max-age=31536000\"\n}: UploadFolderToS3Params) => {\n const s3 = new S3Client({\n region: getEnvVariableAwsRegion()\n });\n\n if (!fs.existsSync(root)) {\n throw new Error(\"Cannot continue, folder does not exist.\");\n }\n\n const paths: string[] = [];\n\n await crawlDirectory(root, async (path: string) => {\n paths.push(path);\n });\n\n const pathsChunks = chunk(paths, 20);\n\n const cacheControls: CacheControls = [];\n if (typeof cacheControl === \"string\") {\n cacheControls.push({ pattern: /.*/, value: cacheControl });\n } else if (Array.isArray(cacheControls)) {\n cacheControls.push(...cacheControl);\n }\n\n for (let i = 0; i < pathsChunks.length; i++) {\n const chunk = pathsChunks[i];\n\n const promises = [];\n for (let j = 0; j < chunk.length; j++) {\n const path = chunk[j];\n\n promises.push(\n new Promise<void>(async resolve => {\n // We also replace \"\\\" with \"/\", which is a path separator on Windows' CMD or Powershell.\n const key = relative(root, path).replace(/\\\\/g, \"/\");\n try {\n // Get file checksum so that we can check if a file needs to be uploaded or not.\n const checksum = await getFileChecksum(path);\n\n let skipUpload = false;\n try {\n const existingObject = await s3.send(\n new HeadObjectCommand({\n Bucket: bucket,\n Key: key\n })\n );\n\n if (existingObject.Metadata?.checksum === checksum) {\n skipUpload = true;\n }\n } catch {\n // Do nothing.\n }\n\n if (skipUpload) {\n if (typeof onFileUploadSkip === \"function\") {\n await onFileUploadSkip({ paths: { full: path, relative: key } });\n }\n } else {\n const cacheControl = cacheControls.find(item => item.pattern.test(key));\n const contentType = mime.getType(path);\n\n const { url, fields } = await getPresignedPost({\n bucket,\n key,\n acl,\n checksum,\n contentType,\n cacheControl: cacheControl ? cacheControl.value : undefined\n });\n\n const data: Record<string, string | Buffer> = {\n ...fields,\n \"Content-Type\": contentType || \"\",\n \"X-Amz-Meta-Checksum\": checksum,\n file: fs.readFileSync(path)\n };\n\n if (cacheControl) {\n data[\"Cache-Control\"] = cacheControl.value;\n }\n\n const formData = new FormData();\n Object.keys(data).forEach(key => {\n formData.append(key, data[key]);\n });\n\n const res = await fetch(url, {\n method: \"POST\",\n body: formData\n });\n\n if (res.status > 299) {\n throw new Error(`${res.statusText}\\n${await res.text()}`);\n }\n\n if (typeof onFileUploadSuccess === \"function\") {\n await onFileUploadSuccess({ paths: { full: path, relative: key } });\n }\n }\n resolve();\n } catch (e) {\n if (typeof onFileUploadError === \"function\") {\n await onFileUploadError({\n paths: { full: path, relative: key },\n error: e\n });\n }\n resolve();\n }\n })\n );\n }\n\n await Promise.all(promises);\n }\n};\n"],"mappings":"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","ignoreList":[]}
|