@onivoro/onix 20.5.24 → 20.5.26
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +1 -1
- package/src/executors/deploy-s3-sync/executor.js +9 -2
- package/src/executors/deploy-s3-sync/executor.js.map +1 -1
- package/src/executors/deploy-s3-sync/schema.d.ts +1 -0
- package/src/executors/deploy-s3-sync/schema.json +4 -0
- package/src/functions/get-content-type.function.d.ts +1 -1
- package/src/functions/get-content-type.function.js +1 -0
- package/src/functions/get-content-type.function.js.map +1 -1
- package/src/functions/invalidate-cloud-front.function.d.ts +2 -0
- package/src/functions/invalidate-cloud-front.function.js +21 -0
- package/src/functions/invalidate-cloud-front.function.js.map +1 -0
- package/src/functions/s3-sync-directory.function.d.ts +2 -1
- package/src/functions/s3-sync-directory.function.js +28 -1
- package/src/functions/s3-sync-directory.function.js.map +1 -1
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
package/package.json
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
"use strict";
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
const tslib_1 = require("tslib");
|
|
4
|
+
const devkit_1 = require("@nx/devkit");
|
|
4
5
|
const extract_project_build_outputs_function_1 = require("../../functions/extract-project-build-outputs.function");
|
|
5
6
|
const pmx_function_1 = require("../../functions/pmx.function");
|
|
6
7
|
const executor_factory_function_1 = require("../../functions/executor-factory.function");
|
|
@@ -8,9 +9,10 @@ const path_1 = require("path");
|
|
|
8
9
|
const client_s3_1 = require("@aws-sdk/client-s3");
|
|
9
10
|
const resolve_aws_credentials_function_1 = require("../../functions/resolve-aws-credentials.function");
|
|
10
11
|
const s3_sync_directory_function_1 = require("../../functions/s3-sync-directory.function");
|
|
11
|
-
const
|
|
12
|
+
const client_cloudfront_1 = require("@aws-sdk/client-cloudfront");
|
|
13
|
+
const invalidate_cloud_front_function_1 = require("../../functions/invalidate-cloud-front.function");
|
|
12
14
|
exports.default = (0, executor_factory_function_1.executorFactory)((options, context) => tslib_1.__awaiter(void 0, void 0, void 0, function* () {
|
|
13
|
-
const { region, bucket, omitAcl, profile, localDirectory } = options;
|
|
15
|
+
const { region, bucket, omitAcl, profile, localDirectory, cloudFrontId } = options;
|
|
14
16
|
const [projectOutput] = (0, extract_project_build_outputs_function_1.extractProjectBuildOutputs)(context, context.projectName);
|
|
15
17
|
const app = context.projectName;
|
|
16
18
|
(0, pmx_function_1.pmxSpawn)(context, `nx build ${app}`);
|
|
@@ -18,5 +20,10 @@ exports.default = (0, executor_factory_function_1.executorFactory)((options, con
|
|
|
18
20
|
const ACL = omitAcl ? undefined : 'public-read';
|
|
19
21
|
const s3Client = new client_s3_1.S3Client({ region, credentials: yield (0, resolve_aws_credentials_function_1.resolveAwsCredentials)(profile) });
|
|
20
22
|
yield (0, s3_sync_directory_function_1.s3SyncDirectory)({ s3Client, bucket, localDirectory: resolvedLocalDirectory, ACL });
|
|
23
|
+
if (cloudFrontId) {
|
|
24
|
+
const cloudfrontClient = new client_cloudfront_1.CloudFrontClient({ region, credentials: yield (0, resolve_aws_credentials_function_1.resolveAwsCredentials)(profile) });
|
|
25
|
+
yield (0, invalidate_cloud_front_function_1.invalidateCloudFront)(cloudfrontClient, cloudFrontId);
|
|
26
|
+
devkit_1.logger.info(`Invalidated CloudFront distribution ${cloudFrontId}`);
|
|
27
|
+
}
|
|
21
28
|
}));
|
|
22
29
|
//# sourceMappingURL=executor.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../onix/src/executors/deploy-s3-sync/executor.ts"],"names":[],"mappings":";;;
|
|
1
|
+
{"version":3,"file":"executor.js","sourceRoot":"","sources":["../../../../../onix/src/executors/deploy-s3-sync/executor.ts"],"names":[],"mappings":";;;AAAA,uCAAqD;AAErD,mHAAoG;AACpG,+DAAwD;AACxD,yFAA4E;AAC5E,+BAA+B;AAC/B,kDAA8C;AAC9C,uGAAyF;AACzF,2FAA6E;AAC7E,kEAA6D;AAC7D,qGAAuF;AAEvF,kBAAe,IAAA,2CAAe,EAAC,CAC7B,OAAuB,EACvB,OAAwB,EACxB,EAAE;IACF,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,GAAG,OAAO,CAAC;IACnF,MAAM,CAAC,aAAa,CAAC,GAAG,IAAA,mEAA0B,EAAC,OAAO,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;IAEjF,MAAM,GAAG,GAAG,OAAO,CAAC,WAAW,CAAC;IAEhC,IAAA,uBAAQ,EAAC,OAAO,EAAE,YAAY,GAAG,EAAE,CAAC,CAAC;IAErC,MAAM,sBAAsB,GAAG,IAAA,cAAO,EAAC,aAAa,EAAE,cAAc,CAAC,CAAC;IAEtE,MAAM,GAAG,GAAG,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,aAAa,CAAC;IAEhD,MAAM,QAAQ,GAAG,IAAI,oBAAQ,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,IAAA,wDAAqB,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;IAE7F,MAAM,IAAA,4CAAe,EAAC,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,EAAE,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC;IAEzF,IAAI,YAAY,EAAE,CAAC;QACjB,MAAM,gBAAgB,GAAG,IAAI,oCAAgB,CAAC,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,IAAA,wDAAqB,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QAC7G,MAAM,IAAA,sDAAoB,EAAC,gBAAgB,EAAE,YAAY,CAAC,CAAC;QAC3D,eAAM,CAAC,IAAI,CAAC,uCAAuC,YAAY,EAAE,CAAC,CAAC;IACrE,CAAC;AACH,CAAC,CAAA,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export declare function getContentType(filename: string): "text/plain" | "text/html" | "text/css" | "application/javascript" | "application/json" | "image/png" | "image/jpeg" | "application/pdf" | "application/octet-stream";
|
|
1
|
+
export declare function getContentType(filename: string): "text/plain" | "text/html" | "text/css" | "image/svg+xml" | "application/javascript" | "application/json" | "image/png" | "image/jpeg" | "application/pdf" | "application/octet-stream";
|
|
@@ -8,6 +8,7 @@ function getContentType(filename) {
|
|
|
8
8
|
case '.txt': return 'text/plain';
|
|
9
9
|
case '.html': return 'text/html';
|
|
10
10
|
case '.css': return 'text/css';
|
|
11
|
+
case '.svg': return 'image/svg+xml';
|
|
11
12
|
case '.js': return 'application/javascript';
|
|
12
13
|
case '.json': return 'application/json';
|
|
13
14
|
case '.png': return 'image/png';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"get-content-type.function.js","sourceRoot":"","sources":["../../../../onix/src/functions/get-content-type.function.ts"],"names":[],"mappings":";;AAEA,
|
|
1
|
+
{"version":3,"file":"get-content-type.function.js","sourceRoot":"","sources":["../../../../onix/src/functions/get-content-type.function.ts"],"names":[],"mappings":";;AAEA,wCAeC;AAjBD,+BAA+B;AAE/B,SAAgB,cAAc,CAAC,QAAgB;IAC3C,MAAM,GAAG,GAAG,IAAA,cAAO,EAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;IAC5C,QAAQ,GAAG,EAAE,CAAC;QACV,KAAK,MAAM,CAAC,CAAC,OAAO,YAAY,CAAC;QACjC,KAAK,OAAO,CAAC,CAAC,OAAO,WAAW,CAAC;QACjC,KAAK,MAAM,CAAC,CAAC,OAAO,UAAU,CAAC;QAC/B,KAAK,MAAM,CAAC,CAAC,OAAO,eAAe,CAAC;QACpC,KAAK,KAAK,CAAC,CAAC,OAAO,wBAAwB,CAAC;QAC5C,KAAK,OAAO,CAAC,CAAC,OAAO,kBAAkB,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,OAAO,WAAW,CAAC;QAChC,KAAK,MAAM,CAAC;QACZ,KAAK,OAAO,CAAC,CAAC,OAAO,YAAY,CAAC;QAClC,KAAK,MAAM,CAAC,CAAC,OAAO,iBAAiB,CAAC;QACtC,OAAO,CAAC,CAAC,OAAO,0BAA0B,CAAC;IAC/C,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.invalidateCloudFront = invalidateCloudFront;
|
|
4
|
+
const tslib_1 = require("tslib");
|
|
5
|
+
const client_cloudfront_1 = require("@aws-sdk/client-cloudfront");
|
|
6
|
+
function invalidateCloudFront(cloudfront_1, distributionId_1) {
|
|
7
|
+
return tslib_1.__awaiter(this, arguments, void 0, function* (cloudfront, distributionId, paths = ['*']) {
|
|
8
|
+
const command = new client_cloudfront_1.CreateInvalidationCommand({
|
|
9
|
+
DistributionId: distributionId,
|
|
10
|
+
InvalidationBatch: {
|
|
11
|
+
CallerReference: `${Date.now()}`,
|
|
12
|
+
Paths: {
|
|
13
|
+
Quantity: paths.length,
|
|
14
|
+
Items: paths
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
});
|
|
18
|
+
return yield cloudfront.send(command);
|
|
19
|
+
});
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=invalidate-cloud-front.function.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"invalidate-cloud-front.function.js","sourceRoot":"","sources":["../../../../onix/src/functions/invalidate-cloud-front.function.ts"],"names":[],"mappings":";;AAEA,oDAaC;;AAfD,kEAAyF;AAEzF,SAAsB,oBAAoB;iEAAC,UAA4B,EAAE,cAAsB,EAAE,QAAkB,CAAC,GAAG,CAAC;QACpH,MAAM,OAAO,GAAG,IAAI,6CAAyB,CAAC;YAC1C,cAAc,EAAE,cAAc;YAC9B,iBAAiB,EAAE;gBACf,eAAe,EAAE,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE;gBAChC,KAAK,EAAE;oBACH,QAAQ,EAAE,KAAK,CAAC,MAAM;oBACtB,KAAK,EAAE,KAAK;iBACf;aACJ;SACJ,CAAC,CAAC;QAEH,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC1C,CAAC;CAAA"}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { ObjectCannedACL, S3Client } from '@aws-sdk/client-s3';
|
|
2
|
-
export declare function s3SyncDirectory({ s3Client, bucket, localDirectory, s3Prefix, ACL }: {
|
|
2
|
+
export declare function s3SyncDirectory({ s3Client, bucket, localDirectory, s3Prefix, ACL, emptyDirectory }: {
|
|
3
3
|
s3Client: S3Client;
|
|
4
4
|
bucket: string;
|
|
5
5
|
localDirectory: string;
|
|
6
6
|
s3Prefix?: string;
|
|
7
7
|
ACL?: ObjectCannedACL;
|
|
8
|
+
emptyDirectory?: boolean;
|
|
8
9
|
}): Promise<void>;
|
|
@@ -8,7 +8,34 @@ const promises_1 = require("fs/promises");
|
|
|
8
8
|
const path_1 = require("path");
|
|
9
9
|
const get_content_type_function_1 = require("./get-content-type.function");
|
|
10
10
|
function s3SyncDirectory(_a) {
|
|
11
|
-
return tslib_1.__awaiter(this, arguments, void 0, function* ({ s3Client, bucket, localDirectory, s3Prefix = '', ACL }) {
|
|
11
|
+
return tslib_1.__awaiter(this, arguments, void 0, function* ({ s3Client, bucket, localDirectory, s3Prefix = '', ACL, emptyDirectory = false }) {
|
|
12
|
+
if (emptyDirectory) {
|
|
13
|
+
devkit_1.logger.info(`Emptying directory s3://${bucket}/${s3Prefix}`);
|
|
14
|
+
const listCommand = new client_s3_1.ListObjectsV2Command({
|
|
15
|
+
Bucket: bucket,
|
|
16
|
+
Prefix: s3Prefix
|
|
17
|
+
});
|
|
18
|
+
let isTruncated = true;
|
|
19
|
+
let continuationToken;
|
|
20
|
+
while (isTruncated) {
|
|
21
|
+
const listResponse = yield s3Client.send(listCommand);
|
|
22
|
+
if (listResponse.Contents && listResponse.Contents.length > 0) {
|
|
23
|
+
const deleteCommand = new client_s3_1.DeleteObjectsCommand({
|
|
24
|
+
Bucket: bucket,
|
|
25
|
+
Delete: {
|
|
26
|
+
Objects: listResponse.Contents.map(({ Key }) => ({ Key }))
|
|
27
|
+
}
|
|
28
|
+
});
|
|
29
|
+
yield s3Client.send(deleteCommand);
|
|
30
|
+
devkit_1.logger.info(`Deleted ${listResponse.Contents.length} objects`);
|
|
31
|
+
}
|
|
32
|
+
isTruncated = !!listResponse.IsTruncated;
|
|
33
|
+
continuationToken = listResponse.NextContinuationToken;
|
|
34
|
+
if (continuationToken) {
|
|
35
|
+
listCommand.input.ContinuationToken = continuationToken;
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
}
|
|
12
39
|
function walk(dir) {
|
|
13
40
|
return tslib_1.__awaiter(this, void 0, void 0, function* () {
|
|
14
41
|
const entries = yield (0, promises_1.readdir)(dir, { withFileTypes: true });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"s3-sync-directory.function.js","sourceRoot":"","sources":["../../../../onix/src/functions/s3-sync-directory.function.ts"],"names":[],"mappings":";;AAMA,
|
|
1
|
+
{"version":3,"file":"s3-sync-directory.function.js","sourceRoot":"","sources":["../../../../onix/src/functions/s3-sync-directory.function.ts"],"names":[],"mappings":"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"}
|
package/src/index.d.ts
CHANGED
|
@@ -9,6 +9,7 @@ export * from './functions/extract-project-build-outputs.function';
|
|
|
9
9
|
export * from './functions/extract-project-configuration.function';
|
|
10
10
|
export * from './functions/get-asset-list-from-directory.function';
|
|
11
11
|
export * from './functions/get-index-html-content.function';
|
|
12
|
+
export * from './functions/invalidate-cloud-front.function';
|
|
12
13
|
export * from './functions/load-env-file.function';
|
|
13
14
|
export * from './functions/normalize-output-path.function';
|
|
14
15
|
export * from './functions/pm.function';
|
package/src/index.js
CHANGED
|
@@ -12,6 +12,7 @@ tslib_1.__exportStar(require("./functions/extract-project-build-outputs.function
|
|
|
12
12
|
tslib_1.__exportStar(require("./functions/extract-project-configuration.function"), exports);
|
|
13
13
|
tslib_1.__exportStar(require("./functions/get-asset-list-from-directory.function"), exports);
|
|
14
14
|
tslib_1.__exportStar(require("./functions/get-index-html-content.function"), exports);
|
|
15
|
+
tslib_1.__exportStar(require("./functions/invalidate-cloud-front.function"), exports);
|
|
15
16
|
tslib_1.__exportStar(require("./functions/load-env-file.function"), exports);
|
|
16
17
|
tslib_1.__exportStar(require("./functions/normalize-output-path.function"), exports);
|
|
17
18
|
tslib_1.__exportStar(require("./functions/pm.function"), exports);
|
package/src/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../onix/src/index.ts"],"names":[],"mappings":";;;AAAA,oEAA0C;AAC1C,wEAA8C;AAC9C,sEAA4C;AAE5C,mEAAyC;AAEzC,2DAAiC;AAEjC,6EAAmD;AACnD,gFAAsD;AACtD,6FAAmE;AACnE,6FAAmE;AACnE,6FAAmE;AACnE,sFAA4D;AAC5D,6EAAmD;AACnD,qFAA2D;AAC3D,kEAAwC;AACxC,mEAAyC;AACzC,uFAA6D;AAC7D,mFAAyD;AACzD,iFAAuD;AACvD,2EAAiD;AACjD,sFAA4D;AAE5D,iFAAuD;AACvD,kFAAwD;AACxD,gFAAsD;AACtD,iFAAuD;AACvD,kFAAwD;AACxD,kFAAwD;AACxD,sFAA4D;AAE5D,uFAA6D;AAC7D,gFAAsD"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../onix/src/index.ts"],"names":[],"mappings":";;;AAAA,oEAA0C;AAC1C,wEAA8C;AAC9C,sEAA4C;AAE5C,mEAAyC;AAEzC,2DAAiC;AAEjC,6EAAmD;AACnD,gFAAsD;AACtD,6FAAmE;AACnE,6FAAmE;AACnE,6FAAmE;AACnE,sFAA4D;AAC5D,sFAA4D;AAC5D,6EAAmD;AACnD,qFAA2D;AAC3D,kEAAwC;AACxC,mEAAyC;AACzC,uFAA6D;AAC7D,mFAAyD;AACzD,iFAAuD;AACvD,2EAAiD;AACjD,sFAA4D;AAE5D,iFAAuD;AACvD,kFAAwD;AACxD,gFAAsD;AACtD,iFAAuD;AACvD,kFAAwD;AACxD,kFAAwD;AACxD,sFAA4D;AAE5D,uFAA6D;AAC7D,gFAAsD"}
|