Repository: serverless/serverless (JavaScript) — Feature

Issue:
Move back from ellipsis character to 3 dots
# This is a Feature Proposal

## Description

Some users use consoles which lack unicode support. We should switch back to 3 dots (instead of the ellipsis character) in our whole codebase.

See https://github.com/serverless/serverless/pull/2561#discussion_r87743346 for more information

#2561



Discussion:

Resolving patch:
diff --git a/docs/providers/aws/cli-reference/rollback.md b/docs/providers/aws/cli-reference/rollback.md
index a0ffa605fb7..33a5e7a041d 100644
--- a/docs/providers/aws/cli-reference/rollback.md
+++ b/docs/providers/aws/cli-reference/rollback.md
@@ -70,8 +70,8 @@ Serverless: - compiled-cloudformation-template.json
 Serverless: - mail-service.zip
 
 $ serverless rollback -t 1476893957131
-Serverless: Updating Stack…
-Serverless: Checking Stack update progress…
+Serverless: Updating Stack...
+Serverless: Checking Stack update progress...
 .....
-Serverless: Stack update finished…
+Serverless: Stack update finished...
 ```
diff --git a/lib/plugins/aws/deploy/lib/cleanupS3Bucket.js b/lib/plugins/aws/deploy/lib/cleanupS3Bucket.js
index 14a279bb61d..55789cd8bea 100644
--- a/lib/plugins/aws/deploy/lib/cleanupS3Bucket.js
+++ b/lib/plugins/aws/deploy/lib/cleanupS3Bucket.js
@@ -35,7 +35,7 @@ module.exports = {
 
   removeObjects(objectsToRemove) {
     if (objectsToRemove && objectsToRemove.length) {
-      this.serverless.cli.log('Removing old service versions…');
+      this.serverless.cli.log('Removing old service versions...');
 
       return this.provider.request('S3',
         'deleteObjects',
diff --git a/lib/plugins/aws/deploy/lib/createStack.js b/lib/plugins/aws/deploy/lib/createStack.js
index eea0bd42840..fbba29968e9 100644
--- a/lib/plugins/aws/deploy/lib/createStack.js
+++ b/lib/plugins/aws/deploy/lib/createStack.js
@@ -6,7 +6,8 @@ const BbPromise = require('bluebird');
 
 module.exports = {
   create() {
-    this.serverless.cli.log('Creating Stack…');
+    // Note: using three dots instead of ellipsis to support non uni-code consoles.
+    this.serverless.cli.log('Creating Stack...');
     const stackName = this.provider.naming.getStackName();
     let stackTags = { STAGE: this.options.stage };
 
diff --git a/lib/plugins/aws/deploy/lib/uploadArtifacts.js b/lib/plugins/aws/deploy/lib/uploadArtifacts.js
index fa200814318..0c833d57f6d 100644
--- a/lib/plugins/aws/deploy/lib/uploadArtifacts.js
+++ b/lib/plugins/aws/deploy/lib/uploadArtifacts.js
@@ -7,7 +7,7 @@ const filesize = require('filesize');
 
 module.exports = {
   uploadCloudFormationFile() {
-    this.serverless.cli.log('Uploading CloudFormation file to S3…');
+    this.serverless.cli.log('Uploading CloudFormation file to S3...');
 
     const body = JSON.stringify(this.serverless.service.provider.compiledCloudFormationTemplate);
 
@@ -52,7 +52,7 @@ module.exports = {
 
   uploadFunctions() {
     if (this.serverless.service.package.individually) {
-      this.serverless.cli.log('Uploading function .zip files to S3…');
+      this.serverless.cli.log('Uploading function .zip files to S3...');
 
       const functionNames = this.serverless.service.getAllFunctions();
       const uploadPromises = functionNames.map(name => {
@@ -64,7 +64,7 @@ module.exports = {
     }
 
     const stats = fs.statSync(this.serverless.service.package.artifact);
-    this.serverless.cli.log(`Uploading service .zip file to S3 (${filesize(stats.size)})…`);
+    this.serverless.cli.log(`Uploading service .zip file to S3 (${filesize(stats.size)})...`);
     return this.uploadZipFile(this.serverless.service.package.artifact);
   },
 
diff --git a/lib/plugins/aws/deployFunction/index.js b/lib/plugins/aws/deployFunction/index.js
index fcb9361c29a..c01bee1236d 100644
--- a/lib/plugins/aws/deployFunction/index.js
+++ b/lib/plugins/aws/deployFunction/index.js
@@ -82,7 +82,7 @@ class AwsDeployFunction {
     // Get function stats
     const stats = fs.statSync(this.options.functionObj.artifact);
     this.serverless.cli.log(
-      `Uploading function: ${this.options.function} (${filesize(stats.size)})…`
+      `Uploading function: ${this.options.function} (${filesize(stats.size)})...`
     );
 
     // Perform upload
diff --git a/lib/plugins/aws/lib/monitorStack.js b/lib/plugins/aws/lib/monitorStack.js
index 5abe556460f..2e636e3c14a 100644
--- a/lib/plugins/aws/lib/monitorStack.js
+++ b/lib/plugins/aws/lib/monitorStack.js
@@ -25,7 +25,7 @@ module.exports = {
     let stackStatus = null;
     let stackLatestError = null;
 
-    this.serverless.cli.log(`Checking Stack ${action} progress…`);
+    this.serverless.cli.log(`Checking Stack ${action} progress...`);
 
     return new BbPromise((resolve, reject) => {
       async.whilst(
@@ -94,7 +94,7 @@ module.exports = {
                 if (action === 'removal' && e.message.endsWith('does not exist')) {
                   // empty console.log for a prettier output
                   if (!this.options.verbose) this.serverless.cli.consoleLog('');
-                  this.serverless.cli.log(`Stack ${action} finished…`);
+                  this.serverless.cli.log(`Stack ${action} finished...`);
                   resolve('DELETE_COMPLETE');
                 } else {
                   reject(new this.serverless.classes.Error(e.message));
@@ -105,7 +105,7 @@ module.exports = {
         () => {
           // empty console.log for a prettier output
           if (!this.options.verbose) this.serverless.cli.consoleLog('');
-          this.serverless.cli.log(`Stack ${action} finished…`);
+          this.serverless.cli.log(`Stack ${action} finished...`);
           resolve(stackStatus);
         });
     });
diff --git a/lib/plugins/aws/lib/updateStack.js b/lib/plugins/aws/lib/updateStack.js
index db04e67403f..e14ecde7577 100644
--- a/lib/plugins/aws/lib/updateStack.js
+++ b/lib/plugins/aws/lib/updateStack.js
@@ -47,7 +47,7 @@ module.exports = {
         this.serverless.service.package.artifactDirectoryName
       }/compiled-cloudformation-template.json`;
 
-    this.serverless.cli.log('Updating Stack…');
+    this.serverless.cli.log('Updating Stack...');
     const stackName = this.provider.naming.getStackName();
     let stackTags = { STAGE: this.options.stage };
 
diff --git a/lib/plugins/aws/remove/lib/bucket.js b/lib/plugins/aws/remove/lib/bucket.js
index c7cf959f523..6cea81803c7 100644
--- a/lib/plugins/aws/remove/lib/bucket.js
+++ b/lib/plugins/aws/remove/lib/bucket.js
@@ -13,7 +13,7 @@ module.exports = {
   listObjects() {
     this.objectsInBucket = [];
 
-    this.serverless.cli.log('Getting all objects in S3 bucket…');
+    this.serverless.cli.log('Getting all objects in S3 bucket...');
     const serviceStage = `${this.serverless.service.service}/${this.options.stage}`;
 
     return this.provider.request('S3', 'listObjectsV2', {
@@ -32,7 +32,7 @@ module.exports = {
   },
 
   deleteObjects() {
-    this.serverless.cli.log('Removing objects in S3 bucket…');
+    this.serverless.cli.log('Removing objects in S3 bucket...');
     if (this.objectsInBucket.length) {
       return this.provider.request('S3', 'deleteObjects', {
         Bucket: this.bucketName,
diff --git a/lib/plugins/aws/remove/lib/stack.js b/lib/plugins/aws/remove/lib/stack.js
index f2c6af65741..243dd4e2ae1 100644
--- a/lib/plugins/aws/remove/lib/stack.js
+++ b/lib/plugins/aws/remove/lib/stack.js
@@ -4,7 +4,7 @@ const BbPromise = require('bluebird');
 
 module.exports = {
   remove() {
-    this.serverless.cli.log('Removing Stack…');
+    this.serverless.cli.log('Removing Stack...');
     const stackName = `${this.serverless.service.service}-${this.options.stage}`;
     const params = {
       StackName: stackName,
diff --git a/lib/plugins/create/create.js b/lib/plugins/create/create.js
index d0e9eac1866..e6984b49e69 100644
--- a/lib/plugins/create/create.js
+++ b/lib/plugins/create/create.js
@@ -53,7 +53,7 @@ class Create {
   }
 
   create() {
-    this.serverless.cli.log('Generating boilerplate…');
+    this.serverless.cli.log('Generating boilerplate...');
     const notPlugin = this.options.template !== 'plugin';
 
     if (validTemplates.indexOf(this.options.template) === -1) {
diff --git a/lib/plugins/install/install.js b/lib/plugins/install/install.js
index f4795e36948..cf50d0d9fd6 100644
--- a/lib/plugins/install/install.js
+++ b/lib/plugins/install/install.js
@@ -74,7 +74,7 @@ class Install {
       throw new this.serverless.classes.Error(errorMessage);
     }
 
-    this.serverless.cli.log(`Downloading and installing "${parsedGitHubUrl.repo}"…`);
+    this.serverless.cli.log(`Downloading and installing "${parsedGitHubUrl.repo}"...`);
     const that = this;
 
     // download service
diff --git a/lib/plugins/package/lib/packageService.js b/lib/plugins/package/lib/packageService.js
index 3454b4702e2..a1253c29516 100644
--- a/lib/plugins/package/lib/packageService.js
+++ b/lib/plugins/package/lib/packageService.js
@@ -35,7 +35,7 @@ module.exports = {
       return BbPromise.resolve();
     }
 
-    this.serverless.cli.log('Packaging service…');
+    this.serverless.cli.log('Packaging service...');
 
     if (this.serverless.service.package.individually) {
       const allFunctions = this.serverless.service.getAllFunctions();


Test patch:
diff --git a/lib/plugins/aws/deploy/tests/uploadArtifacts.js b/lib/plugins/aws/deploy/tests/uploadArtifacts.js
index 6fabf3dd8cb..33fa54de73b 100644
--- a/lib/plugins/aws/deploy/tests/uploadArtifacts.js
+++ b/lib/plugins/aws/deploy/tests/uploadArtifacts.js
@@ -143,7 +143,7 @@ describe('uploadArtifacts', () => {
       sinon.spy(awsDeploy.serverless.cli, 'log');
 
       return awsDeploy.uploadFunctions().then(() => {
-        const expected = 'Uploading service .zip file to S3 (1 KB)…';
+        const expected = 'Uploading service .zip file to S3 (1 KB)...';
         expect(awsDeploy.serverless.cli.log.calledWithExactly(expected)).to.be.equal(true);
 
         fs.statSync.restore();
diff --git a/lib/plugins/aws/deployFunction/tests/index.js b/lib/plugins/aws/deployFunction/tests/index.js
index 250155f0d3a..4a823d878fd 100644
--- a/lib/plugins/aws/deployFunction/tests/index.js
+++ b/lib/plugins/aws/deployFunction/tests/index.js
@@ -194,7 +194,7 @@ describe('AwsDeployFunction', () => {
       sinon.spy(awsDeployFunction.serverless.cli, 'log');
 
       return awsDeployFunction.deployFunction().then(() => {
-        const expected = 'Uploading function: first (1 KB)…';
+        const expected = 'Uploading function: first (1 KB)...';
         expect(awsDeployFunction.serverless.cli.log.calledWithExactly(expected)).to.be.equal(true);
 
         awsDeployFunction.provider.request.restore();