diff --git a/commands/doctor.js b/commands/doctor.js index 94c57bfc1f..3859082364 100644 --- a/commands/doctor.js +++ b/commands/doctor.js @@ -1,7 +1,7 @@ 'use strict'; const fsp = require('fs').promises; -const { writeText, log } = require('@serverless/utils/log'); +const { writeText, log } = require('../lib/utils/serverless-utils/log'); const healthStatusFilename = require('../lib/utils/health-status-filename'); module.exports = async () => { diff --git a/commands/plugin-install.js b/commands/plugin-install.js index 857327d8d9..04eda6b16e 100644 --- a/commands/plugin-install.js +++ b/commands/plugin-install.js @@ -7,8 +7,8 @@ const path = require('path'); const _ = require('lodash'); const isPlainObject = require('type/plain-object/is'); const yaml = require('js-yaml'); -const cloudformationSchema = require('@serverless/utils/cloudformation-schema'); -const { log, progress, style } = require('@serverless/utils/log'); +const cloudformationSchema = require('../lib/utils/serverless-utils/cloudformation-schema'); +const { log, progress, style } = require('../lib/utils/serverless-utils/log'); const ServerlessError = require('../lib/serverless-error'); const yamlAstParser = require('../lib/utils/yaml-ast-parser'); const npmCommandDeferred = require('../lib/utils/npm-command-deferred'); diff --git a/commands/plugin-uninstall.js b/commands/plugin-uninstall.js index 42442da6b2..53d2694341 100644 --- a/commands/plugin-uninstall.js +++ b/commands/plugin-uninstall.js @@ -7,8 +7,8 @@ const path = require('path'); const _ = require('lodash'); const isPlainObject = require('type/plain-object/is'); const yaml = require('js-yaml'); -const cloudformationSchema = require('@serverless/utils/cloudformation-schema'); -const { log, progress, style } = require('@serverless/utils/log'); +const cloudformationSchema = require('../lib/utils/serverless-utils/cloudformation-schema'); +const { log, progress, style } = require('../lib/utils/serverless-utils/log'); const yamlAstParser = require('../lib/utils/yaml-ast-parser'); const npmCommandDeferred = require('../lib/utils/npm-command-deferred'); const { diff --git a/lib/aws/request.js b/lib/aws/request.js index 8bd59eb665..3dd289d951 100644 --- a/lib/aws/request.js +++ b/lib/aws/request.js @@ -5,7 +5,7 @@ const memoize = require('memoizee'); const PromiseQueue = require('promise-queue'); const sdk = require('./sdk-v2'); const ServerlessError = require('../../lib/serverless-error'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../utils/serverless-utils/log'); const HttpsProxyAgent = require('https-proxy-agent'); const url = require('url'); const https = require('https'); diff --git a/lib/classes/cli.js b/lib/classes/cli.js index 0ec3b1b492..72191aa3fa 100644 --- a/lib/classes/cli.js +++ b/lib/classes/cli.js @@ -1,7 +1,7 @@ 'use strict'; const chalk = require('chalk'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../utils/serverless-utils/log'); const resolveCliInput = require('../cli/resolve-input'); const renderHelp = require('../cli/render-help'); diff --git a/lib/classes/config-schema-handler/index.js b/lib/classes/config-schema-handler/index.js index d70cf96ab8..6d455c86f2 100644 --- a/lib/classes/config-schema-handler/index.js +++ b/lib/classes/config-schema-handler/index.js @@ -6,7 +6,7 @@ const schema = require('../../config-schema'); const ServerlessError = require('../../serverless-error'); const normalizeAjvErrors = require('./normalize-ajv-errors'); const resolveAjvValidate = require('./resolve-ajv-validate'); -const { log, style } = require('@serverless/utils/log'); +const { log, style } = require('../../utils/serverless-utils/log'); const FUNCTION_NAME_PATTERN = '^[a-zA-Z0-9-_]+$'; const ERROR_PREFIX = 'Configuration error'; diff --git a/lib/classes/config-schema-handler/resolve-ajv-validate.js b/lib/classes/config-schema-handler/resolve-ajv-validate.js index a5cc8e5845..ab2c8e346c 100644 --- a/lib/classes/config-schema-handler/resolve-ajv-validate.js +++ b/lib/classes/config-schema-handler/resolve-ajv-validate.js @@ -5,7 +5,7 @@ const objectHash = require('object-hash'); const path = require('path'); const os = require('os'); const standaloneCode = require('ajv/dist/standalone').default; -const { log } = require('@serverless/utils/log'); +const { log } = require('../../utils/serverless-utils/log'); const fsp = require('fs').promises; const resolveTmpdir = require('process-utils/tmpdir'); const safeMoveFile = require('../../utils/fs/safe-move-file'); diff --git a/lib/classes/plugin-manager.js b/lib/classes/plugin-manager.js index 0d955e52d8..741ea69def 100644 --- a/lib/classes/plugin-manager.js +++ b/lib/classes/plugin-manager.js @@ -8,7 +8,7 @@ const renderCommandHelp = require('../cli/render-help/command'); const tokenizeException = require('../utils/tokenize-exception'); const getRequire = require('../utils/get-require'); const importModule = require('../utils/require-with-import-fallback'); -const { log, getPluginWriters } = require('@serverless/utils/log'); +const { log, getPluginWriters } = require('../utils/serverless-utils/log'); let hooksIdCounter = 0; let nestTracker = 0; diff --git a/lib/classes/service.js b/lib/classes/service.js index 4e41eaeb27..e78705ae65 100644 --- a/lib/classes/service.js +++ b/lib/classes/service.js @@ -4,7 +4,7 @@ const ServerlessError = require('../serverless-error'); const util = require('util'); const _ = require('lodash'); const semver = require('semver'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../utils/serverless-utils/log'); const resolveCliInput = require('../cli/resolve-input'); // const currentVersion = require('../../package').version; // const isLocallyInstalled = require('../cli/is-locally-installed'); diff --git a/lib/cli/handle-error.js b/lib/cli/handle-error.js index 23850f396b..69ab0af375 100644 --- a/lib/cli/handle-error.js +++ b/lib/cli/handle-error.js @@ -2,7 +2,7 @@ const isObject = require('type/object/is'); const stripAnsi = require('strip-ansi'); -const { style, writeText, log } = require('@serverless/utils/log'); +const { style, writeText, log } = require('../utils/serverless-utils/log'); const slsVersion = require('./../../package').version; const isStandaloneExecutable = require('../utils/is-standalone-executable'); const tokenizeException = require('../utils/tokenize-exception'); diff --git a/lib/cli/render-help/command.js b/lib/cli/render-help/command.js index 58bdbc3fcb..0df873d317 100644 --- a/lib/cli/render-help/command.js +++ b/lib/cli/render-help/command.js @@ -1,6 +1,6 @@ 'use strict'; -const { writeText } = require('@serverless/utils/log'); +const { writeText } = require('../../utils/serverless-utils/log'); const resolveInput = require('../resolve-input'); const renderOptionsHelp = require('./options'); diff --git a/lib/cli/render-help/general.js b/lib/cli/render-help/general.js index 1a052e0470..4ef306e415 100644 --- a/lib/cli/render-help/general.js +++ b/lib/cli/render-help/general.js @@ -1,6 +1,6 @@ 'use strict'; -const { writeText, style } = require('@serverless/utils/log'); +const { writeText, style } = require('../../utils/serverless-utils/log'); const { version } = require('../../../package'); const globalOptions = require('../commands-schema/common-options/global'); const resolveInput = require('../resolve-input'); diff --git a/lib/cli/render-help/generate-command-usage.js b/lib/cli/render-help/generate-command-usage.js index e0f6691286..95492c89e3 100644 --- a/lib/cli/render-help/generate-command-usage.js +++ b/lib/cli/render-help/generate-command-usage.js @@ -1,6 +1,6 @@ 'use strict'; -const { style } = require('@serverless/utils/log'); +const { style } = require('../../utils/serverless-utils/log'); module.exports = (commandName, commandSchema) => { const indentFillLength = 30; diff --git a/lib/cli/render-help/options.js b/lib/cli/render-help/options.js index bd04ce5b4e..101e42c5e5 100644 --- a/lib/cli/render-help/options.js +++ b/lib/cli/render-help/options.js @@ -1,6 +1,6 @@ 'use strict'; -const { writeText, style } = require('@serverless/utils/log'); +const { writeText, style } = require('../../utils/serverless-utils/log'); module.exports = (commandOptions) => { const indentFillLength = 40; diff --git a/lib/cli/render-version.js b/lib/cli/render-version.js index 2ba321c008..6b1983a27e 100644 --- a/lib/cli/render-version.js +++ b/lib/cli/render-version.js @@ -4,7 +4,7 @@ const path = require('path'); const { version } = require('../../package'); const isStandaloneExecutable = require('../utils/is-standalone-executable'); const localServerlessPath = require('./local-serverless-path'); -const { writeText } = require('@serverless/utils/log'); +const { writeText } = require('../utils/serverless-utils/log'); const serverlessPath = path.resolve(__dirname, '../..'); diff --git a/lib/cli/run-compose.js b/lib/cli/run-compose.js index 134c355f30..1cb8b34dd8 100644 --- a/lib/cli/run-compose.js +++ b/lib/cli/run-compose.js @@ -5,7 +5,7 @@ const { createRequire } = require('module'); const path = require('path'); const fsp = require('fs').promises; const spawn = require('child-process-ext/spawn'); -const inquirer = require('@serverless/utils/inquirer'); +const inquirer = require('../utils/serverless-utils/inquirer'); const relativeBinPath = '@osls/compose/bin/serverless-compose'; diff --git a/lib/cli/write-service-outputs.js b/lib/cli/write-service-outputs.js index e960593955..86fc7c2c0d 100644 --- a/lib/cli/write-service-outputs.js +++ b/lib/cli/write-service-outputs.js @@ -1,6 +1,6 @@ 'use strict'; -const { writeText, style } = require('@serverless/utils/log'); +const { writeText, style } = require('../utils/serverless-utils/log'); module.exports = (serviceOutputs) => { for (const [section, entries] of serviceOutputs) { diff --git a/lib/configuration/read.js b/lib/configuration/read.js index cc7fff9e15..eaebd16be4 100644 --- a/lib/configuration/read.js +++ b/lib/configuration/read.js @@ -5,7 +5,7 @@ const isPlainObject = require('type/plain-object/is'); const path = require('path'); const fsp = require('fs').promises; const yaml = require('js-yaml'); -const cloudformationSchema = require('@serverless/utils/cloudformation-schema'); +const cloudformationSchema = require('../utils/serverless-utils/cloudformation-schema'); const ServerlessError = require('../serverless-error'); const readConfigurationFile = async (configurationPath) => { diff --git a/lib/configuration/variables/eventually-report-resolution-errors.js b/lib/configuration/variables/eventually-report-resolution-errors.js index c43da0c0d1..6f722274e1 100644 --- a/lib/configuration/variables/eventually-report-resolution-errors.js +++ b/lib/configuration/variables/eventually-report-resolution-errors.js @@ -1,7 +1,7 @@ 'use strict'; const path = require('path'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../utils/serverless-utils/log'); const ServerlessError = require('../../serverless-error'); const resolveCliInput = require('../../cli/resolve-input'); diff --git a/lib/configuration/variables/sources/file.js b/lib/configuration/variables/sources/file.js index 021d591fb2..684dc21bda 100644 --- a/lib/configuration/variables/sources/file.js +++ b/lib/configuration/variables/sources/file.js @@ -5,7 +5,7 @@ const isPlainFunction = require('type/plain-function/is'); const path = require('path'); const fsp = require('fs').promises; const yaml = require('js-yaml'); -const cloudformationSchema = require('@serverless/utils/cloudformation-schema'); +const cloudformationSchema = require('../../../utils/serverless-utils/cloudformation-schema'); const ServerlessError = require('../../../serverless-error'); const readFile = async (filePath, serviceDir) => { diff --git a/lib/plugins/aws/config-credentials.js b/lib/plugins/aws/config-credentials.js index d26b8b9704..892ef8fa18 100644 --- a/lib/plugins/aws/config-credentials.js +++ b/lib/plugins/aws/config-credentials.js @@ -4,7 +4,7 @@ const os = require('os'); const credentials = require('./utils/credentials'); const ServerlessError = require('../../serverless-error'); const cliCommandsSchema = require('../../cli/commands-schema'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../utils/serverless-utils/log'); class AwsConfigCredentials { constructor(serverless, options) { diff --git a/lib/plugins/aws/custom-resources/index.js b/lib/plugins/aws/custom-resources/index.js index 6f07305572..89005685e0 100644 --- a/lib/plugins/aws/custom-resources/index.js +++ b/lib/plugins/aws/custom-resources/index.js @@ -5,7 +5,7 @@ const path = require('path'); const crypto = require('crypto'); const BbPromise = require('bluebird'); const fse = require('fs-extra'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../utils/serverless-utils/log'); const generateZip = require('./generate-zip'); const ServerlessError = require('../../../serverless-error'); diff --git a/lib/plugins/aws/custom-resources/resources/api-gateway-cloud-watch-role/handler.js b/lib/plugins/aws/custom-resources/resources/api-gateway-cloud-watch-role/handler.js index 9724717667..d2d253392e 100644 --- a/lib/plugins/aws/custom-resources/resources/api-gateway-cloud-watch-role/handler.js +++ b/lib/plugins/aws/custom-resources/resources/api-gateway-cloud-watch-role/handler.js @@ -58,10 +58,7 @@ async function create(event, context) { return (await iam.send(new ListAttachedRolePoliciesCommand({ RoleName: roleName }))) .AttachedPolicies; } catch (error) { - if ( - error.code === 'NoSuchEntity' || - error.message.includes('cannot be found') - ) { + if (error.code === 'NoSuchEntity' || error.message.includes('cannot be found')) { // Role doesn't exist yet, create; await iam.send( new CreateRoleCommand({ diff --git a/lib/plugins/aws/deploy-function.js b/lib/plugins/aws/deploy-function.js index 821ac8b8b2..9fd1cdc0cf 100644 --- a/lib/plugins/aws/deploy-function.js +++ b/lib/plugins/aws/deploy-function.js @@ -8,7 +8,7 @@ const wait = require('timers-ext/promise/sleep'); const validate = require('./lib/validate'); const filesize = require('../../utils/filesize'); const ServerlessError = require('../../serverless-error'); -const { log, style, progress } = require('@serverless/utils/log'); +const { log, style, progress } = require('../../utils/serverless-utils/log'); const mainProgress = progress.get('main'); diff --git a/lib/plugins/aws/deploy-list.js b/lib/plugins/aws/deploy-list.js index 320dfd0e44..6f856ed5ed 100644 --- a/lib/plugins/aws/deploy-list.js +++ b/lib/plugins/aws/deploy-list.js @@ -1,6 +1,6 @@ 'use strict'; -const { log, writeText } = require('@serverless/utils/log'); +const { log, writeText } = require('../../utils/serverless-utils/log'); const validate = require('./lib/validate'); const findAndGroupDeployments = require('./utils/find-and-group-deployments'); const setBucketName = require('./lib/set-bucket-name'); diff --git a/lib/plugins/aws/deploy/index.js b/lib/plugins/aws/deploy/index.js index f87c057b4a..df6bf6e9cc 100644 --- a/lib/plugins/aws/deploy/index.js +++ b/lib/plugins/aws/deploy/index.js @@ -21,7 +21,7 @@ const validateTemplate = require('./lib/validate-template'); const updateStack = require('../lib/update-stack'); const ensureValidBucketExists = require('./lib/ensure-valid-bucket-exists'); const path = require('path'); -const { style, log, progress, writeText } = require('@serverless/utils/log'); +const { style, log, progress, writeText } = require('../../../utils/serverless-utils/log'); const memoize = require('memoizee'); const mainProgress = progress.get('main'); diff --git a/lib/plugins/aws/deploy/lib/check-for-changes.js b/lib/plugins/aws/deploy/lib/check-for-changes.js index 1bb372d25a..c55323ea9b 100644 --- a/lib/plugins/aws/deploy/lib/check-for-changes.js +++ b/lib/plugins/aws/deploy/lib/check-for-changes.js @@ -8,7 +8,7 @@ const BbPromise = require('bluebird'); const _ = require('lodash'); const normalizeFiles = require('../../lib/normalize-files'); const ServerlessError = require('../../../../serverless-error'); -const log = require('@serverless/utils/log').log.get('check-for-changes'); +const log = require('../../../../utils/serverless-utils/log').log.get('check-for-changes'); const fsp = fs.promises; @@ -70,10 +70,13 @@ module.exports = { ); } })(); - const objects = result?.Contents?.filter(({ Key: key }) => - isDeploymentDirToken(key.split('/')[3]) - ); - if (!objects?.length) return []; + const contents = result && result.Contents; + const objects = contents + ? contents.filter(({ Key: key }) => isDeploymentDirToken(key.split('/')[3])) + : []; + if (!objects.length) { + return []; + } const ordered = _.orderBy(objects, ['Key'], ['desc']); diff --git a/lib/plugins/aws/deploy/lib/cleanup-s3-bucket.js b/lib/plugins/aws/deploy/lib/cleanup-s3-bucket.js index df5ed15999..ecc0903306 100644 --- a/lib/plugins/aws/deploy/lib/cleanup-s3-bucket.js +++ b/lib/plugins/aws/deploy/lib/cleanup-s3-bucket.js @@ -4,7 +4,7 @@ const _ = require('lodash'); const findAndGroupDeployments = require('../../utils/find-and-group-deployments'); const getS3ObjectsFromStacks = require('../../utils/get-s3-objects-from-stacks'); const ServerlessError = require('../../../../serverless-error'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../../utils/serverless-utils/log'); module.exports = { async getObjectsToRemove() { diff --git a/lib/plugins/aws/deploy/lib/create-stack.js b/lib/plugins/aws/deploy/lib/create-stack.js index f8a2bcc6e2..075cb1013a 100644 --- a/lib/plugins/aws/deploy/lib/create-stack.js +++ b/lib/plugins/aws/deploy/lib/create-stack.js @@ -1,7 +1,7 @@ 'use strict'; const BbPromise = require('bluebird'); -const { progress, log } = require('@serverless/utils/log'); +const { progress, log } = require('../../../../utils/serverless-utils/log'); const ServerlessError = require('../../../../serverless-error'); const isChangeSetWithoutChanges = require('../../utils/is-change-set-without-changes'); diff --git a/lib/plugins/aws/deploy/lib/ensure-valid-bucket-exists.js b/lib/plugins/aws/deploy/lib/ensure-valid-bucket-exists.js index 525fccdfdc..5d1f33a1b7 100644 --- a/lib/plugins/aws/deploy/lib/ensure-valid-bucket-exists.js +++ b/lib/plugins/aws/deploy/lib/ensure-valid-bucket-exists.js @@ -1,7 +1,7 @@ 'use strict'; const ServerlessError = require('../../../../serverless-error'); -const { log, progress } = require('@serverless/utils/log'); +const { log, progress } = require('../../../../utils/serverless-utils/log'); const jsyaml = require('js-yaml'); const mainProgress = progress.get('main'); diff --git a/lib/plugins/aws/deploy/lib/extended-validate.js b/lib/plugins/aws/deploy/lib/extended-validate.js index c7ca93751c..6a0b97526b 100644 --- a/lib/plugins/aws/deploy/lib/extended-validate.js +++ b/lib/plugins/aws/deploy/lib/extended-validate.js @@ -3,7 +3,7 @@ const path = require('path'); const _ = require('lodash'); const ServerlessError = require('../../../../serverless-error'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../../utils/serverless-utils/log'); module.exports = { async extendedValidate() { diff --git a/lib/plugins/aws/deploy/lib/upload-artifacts.js b/lib/plugins/aws/deploy/lib/upload-artifacts.js index fab5a3ecf9..8b5a4d7dcb 100644 --- a/lib/plugins/aws/deploy/lib/upload-artifacts.js +++ b/lib/plugins/aws/deploy/lib/upload-artifacts.js @@ -10,7 +10,7 @@ const normalizeFiles = require('../../lib/normalize-files'); const getLambdaLayerArtifactPath = require('../../utils/get-lambda-layer-artifact-path'); const ServerlessError = require('../../../../serverless-error'); const setS3UploadEncryptionOptions = require('../../../../aws/set-s3-upload-encryption-options'); -const { progress, log } = require('@serverless/utils/log'); +const { progress, log } = require('../../../../utils/serverless-utils/log'); const MAX_CONCURRENT_ARTIFACTS_UPLOADS = Number(process.env.SLS_MAX_CONCURRENT_ARTIFACTS_UPLOADS) || 3; diff --git a/lib/plugins/aws/info/display.js b/lib/plugins/aws/info/display.js index 37233f27ac..0908c0d66c 100644 --- a/lib/plugins/aws/info/display.js +++ b/lib/plugins/aws/info/display.js @@ -1,6 +1,6 @@ 'use strict'; -const { isVerboseMode, style } = require('@serverless/utils/log'); +const { isVerboseMode, style } = require('../../../utils/serverless-utils/log'); const filesize = require('../../../utils/filesize'); diff --git a/lib/plugins/aws/info/index.js b/lib/plugins/aws/info/index.js index 0b3c1b700c..bd707706e8 100644 --- a/lib/plugins/aws/info/index.js +++ b/lib/plugins/aws/info/index.js @@ -1,13 +1,13 @@ 'use strict'; -const { progress, style } = require('@serverless/utils/log'); +const { progress, style } = require('../../../utils/serverless-utils/log'); const writeServiceOutputs = require('../../../cli/write-service-outputs'); const validate = require('../lib/validate'); const getStackInfo = require('./get-stack-info'); const getResourceCount = require('./get-resource-count'); const getApiKeyValues = require('./get-api-key-values'); const display = require('./display'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../utils/serverless-utils/log'); const mainProgress = progress.get('main'); diff --git a/lib/plugins/aws/invoke-local/index.js b/lib/plugins/aws/invoke-local/index.js index 4070709123..45e6828c45 100644 --- a/lib/plugins/aws/invoke-local/index.js +++ b/lib/plugins/aws/invoke-local/index.js @@ -11,7 +11,7 @@ const stdin = require('get-stdin'); const spawnExt = require('child-process-ext/spawn'); const { spawn } = require('child_process'); const inspect = require('util').inspect; -const download = require('@serverless/utils/download'); +const download = require('../../../utils/serverless-utils/download'); const { ensureDir } = require('fs-extra'); const cachedir = require('cachedir'); const decompress = require('decompress'); @@ -23,7 +23,7 @@ const isStandalone = require('../../../utils/is-standalone-executable'); const ensureArtifact = require('../../../utils/ensure-artifact'); const resolveCfImportValue = require('../utils/resolve-cf-import-value'); const resolveCfRefValue = require('../utils/resolve-cf-ref-value'); -const { writeText, progress, log } = require('@serverless/utils/log'); +const { writeText, progress, log } = require('../../../utils/serverless-utils/log'); const cachePath = path.join(cachedir('serverless'), 'invokeLocal'); diff --git a/lib/plugins/aws/invoke.js b/lib/plugins/aws/invoke.js index 9b5d14c9fd..ec76cc8bd9 100644 --- a/lib/plugins/aws/invoke.js +++ b/lib/plugins/aws/invoke.js @@ -5,7 +5,7 @@ const validate = require('./lib/validate'); const stdin = require('get-stdin'); const formatLambdaLogEvent = require('./utils/format-lambda-log-event'); const ServerlessError = require('../../serverless-error'); -const { writeText, style } = require('@serverless/utils/log'); +const { writeText, style } = require('../../utils/serverless-utils/log'); class AwsInvoke { constructor(serverless, options) { diff --git a/lib/plugins/aws/lib/check-if-ecr-repository-exists.js b/lib/plugins/aws/lib/check-if-ecr-repository-exists.js index 0253a87984..1249822196 100644 --- a/lib/plugins/aws/lib/check-if-ecr-repository-exists.js +++ b/lib/plugins/aws/lib/check-if-ecr-repository-exists.js @@ -1,6 +1,6 @@ 'use strict'; -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../utils/serverless-utils/log'); module.exports = { async checkIfEcrRepositoryExists() { diff --git a/lib/plugins/aws/lib/monitor-stack.js b/lib/plugins/aws/lib/monitor-stack.js index 336e7fd946..970fbcc8d2 100644 --- a/lib/plugins/aws/lib/monitor-stack.js +++ b/lib/plugins/aws/lib/monitor-stack.js @@ -3,7 +3,7 @@ const BbPromise = require('bluebird'); const wait = require('timers-ext/promise/sleep'); const ServerlessError = require('../../../serverless-error'); -const { log, style, progress } = require('@serverless/utils/log'); +const { log, style, progress } = require('../../../utils/serverless-utils/log'); const getMonitoringFrequency = require('../utils/get-monitoring-frequency'); const mainProgress = progress.get('main'); diff --git a/lib/plugins/aws/lib/update-stack.js b/lib/plugins/aws/lib/update-stack.js index c5fcf333e0..0b81f303c3 100644 --- a/lib/plugins/aws/lib/update-stack.js +++ b/lib/plugins/aws/lib/update-stack.js @@ -2,7 +2,7 @@ const BbPromise = require('bluebird'); const getS3EndpointForRegion = require('../utils/get-s3-endpoint-for-region'); -const { log, progress } = require('@serverless/utils/log'); +const { log, progress } = require('../../../utils/serverless-utils/log'); const isChangeSetWithoutChanges = require('../utils/is-change-set-without-changes'); const NO_UPDATE_MESSAGE = 'No updates are to be performed.'; diff --git a/lib/plugins/aws/lib/upload-zip-file.js b/lib/plugins/aws/lib/upload-zip-file.js index 2445ebc57c..ab58a94dd8 100644 --- a/lib/plugins/aws/lib/upload-zip-file.js +++ b/lib/plugins/aws/lib/upload-zip-file.js @@ -3,7 +3,7 @@ const path = require('path'); const fs = require('fs'); const crypto = require('crypto'); -const log = require('@serverless/utils/log').log.get('deploy:upload'); +const log = require('../../../utils/serverless-utils/log').log.get('deploy:upload'); const setS3UploadEncryptionOptions = require('../../../aws/set-s3-upload-encryption-options'); module.exports = { diff --git a/lib/plugins/aws/lib/wait-for-change-set-creation.js b/lib/plugins/aws/lib/wait-for-change-set-creation.js index 499fe40c2c..c761a6ca34 100644 --- a/lib/plugins/aws/lib/wait-for-change-set-creation.js +++ b/lib/plugins/aws/lib/wait-for-change-set-creation.js @@ -3,7 +3,7 @@ const wait = require('timers-ext/promise/sleep'); const ServerlessError = require('../../../serverless-error'); const isChangeSetWithoutChanges = require('../utils/is-change-set-without-changes'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../utils/serverless-utils/log'); const getMonitoringFrequency = require('../utils/get-monitoring-frequency'); module.exports = { diff --git a/lib/plugins/aws/logs.js b/lib/plugins/aws/logs.js index bd56aacf56..bed30acb39 100644 --- a/lib/plugins/aws/logs.js +++ b/lib/plugins/aws/logs.js @@ -4,7 +4,7 @@ const _ = require('lodash'); const dayjs = require('dayjs'); const utc = require('dayjs/plugin/utc'); const wait = require('timers-ext/promise/sleep'); -const { writeText } = require('@serverless/utils/log'); +const { writeText } = require('../../utils/serverless-utils/log'); const validate = require('./lib/validate'); const formatLambdaLogEvent = require('./utils/format-lambda-log-event'); const ServerlessError = require('../../serverless-error'); diff --git a/lib/plugins/aws/metrics.js b/lib/plugins/aws/metrics.js index e0ec7a53b1..1769ca7ef1 100644 --- a/lib/plugins/aws/metrics.js +++ b/lib/plugins/aws/metrics.js @@ -4,7 +4,7 @@ const BbPromise = require('bluebird'); const _ = require('lodash'); const dayjs = require('dayjs'); const validate = require('./lib/validate'); -const { writeText, style } = require('@serverless/utils/log'); +const { writeText, style } = require('../../utils/serverless-utils/log'); const LocalizedFormat = require('dayjs/plugin/localizedFormat'); diff --git a/lib/plugins/aws/package/compile/events/api-gateway/lib/hack/disassociate-usage-plan.js b/lib/plugins/aws/package/compile/events/api-gateway/lib/hack/disassociate-usage-plan.js index ce8a250857..3de954dd80 100644 --- a/lib/plugins/aws/package/compile/events/api-gateway/lib/hack/disassociate-usage-plan.js +++ b/lib/plugins/aws/package/compile/events/api-gateway/lib/hack/disassociate-usage-plan.js @@ -2,7 +2,7 @@ const BbPromise = require('bluebird'); const _ = require('lodash'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../../../../../../utils/serverless-utils/log'); module.exports = { async disassociateUsagePlan() { diff --git a/lib/plugins/aws/package/compile/events/api-gateway/lib/validate.js b/lib/plugins/aws/package/compile/events/api-gateway/lib/validate.js index c29af980b2..d7f579a129 100644 --- a/lib/plugins/aws/package/compile/events/api-gateway/lib/validate.js +++ b/lib/plugins/aws/package/compile/events/api-gateway/lib/validate.js @@ -4,7 +4,7 @@ const _ = require('lodash'); const awsArnRegExs = require('../../../../../utils/arn-regular-expressions'); const resolveLambdaTarget = require('../../../../../utils/resolve-lambda-target'); const ServerlessError = require('../../../../../../../serverless-error'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../../../../../utils/serverless-utils/log'); const NOT_FOUND = -1; const DEFAULT_STATUS_CODES = { diff --git a/lib/plugins/aws/package/compile/events/cloud-front.js b/lib/plugins/aws/package/compile/events/cloud-front.js index 70fc037ce7..3cca84dcb3 100644 --- a/lib/plugins/aws/package/compile/events/cloud-front.js +++ b/lib/plugins/aws/package/compile/events/cloud-front.js @@ -3,7 +3,7 @@ const _ = require('lodash'); const url = require('url'); const ServerlessError = require('../../../../../serverless-error'); -const { log, style } = require('@serverless/utils/log'); +const { log, style } = require('../../../../../utils/serverless-utils/log'); const originLimits = { maxTimeout: 30, maxMemorySize: 10240 }; const viewerLimits = { maxTimeout: 5, maxMemorySize: 128 }; diff --git a/lib/plugins/aws/package/compile/events/http-api.js b/lib/plugins/aws/package/compile/events/http-api.js index 287a2d26f3..197b22e99a 100644 --- a/lib/plugins/aws/package/compile/events/http-api.js +++ b/lib/plugins/aws/package/compile/events/http-api.js @@ -4,7 +4,7 @@ const _ = require('lodash'); const d = require('d'); const memoizee = require('memoizee'); const memoizeeMethods = require('memoizee/methods'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../../../utils/serverless-utils/log'); const ServerlessError = require('../../../../../serverless-error'); const resolveLambdaTarget = require('../../../utils/resolve-lambda-target'); diff --git a/lib/plugins/aws/package/compile/events/schedule.js b/lib/plugins/aws/package/compile/events/schedule.js index 3ccc45b054..0d12b46afe 100644 --- a/lib/plugins/aws/package/compile/events/schedule.js +++ b/lib/plugins/aws/package/compile/events/schedule.js @@ -2,7 +2,7 @@ const ServerlessError = require('../../../../../serverless-error'); const resolveLambdaTarget = require('../../../utils/resolve-lambda-target'); -const { log, style } = require('@serverless/utils/log'); +const { log, style } = require('../../../../../utils/serverless-utils/log'); const rateSyntax = '^rate\\((?:1 (?:minute|hour|day)|(?:1\\d+|[2-9]\\d*) (?:minute|hour|day)s)\\)$'; const cronSyntax = '^cron\\(\\S+ \\S+ \\S+ \\S+ \\S+ \\S+\\)$'; diff --git a/lib/plugins/aws/package/compile/functions.js b/lib/plugins/aws/package/compile/functions.js index 728b9ab72e..c14112f242 100644 --- a/lib/plugins/aws/package/compile/functions.js +++ b/lib/plugins/aws/package/compile/functions.js @@ -10,7 +10,7 @@ const deepSortObjectByKey = require('../../../../utils/deep-sort-object-by-key') const getHashForFilePath = require('../lib/get-hash-for-file-path'); const resolveLambdaTarget = require('../../utils/resolve-lambda-target'); const parseS3URI = require('../../utils/parse-s3-uri'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../../utils/serverless-utils/log'); const defaultCors = { allowedOrigins: ['*'], diff --git a/lib/plugins/aws/package/compile/layers.js b/lib/plugins/aws/package/compile/layers.js index 21053b5cef..1329692367 100644 --- a/lib/plugins/aws/package/compile/layers.js +++ b/lib/plugins/aws/package/compile/layers.js @@ -6,7 +6,7 @@ const _ = require('lodash'); const path = require('path'); const fsAsync = BbPromise.promisifyAll(require('fs')); const getLambdaLayerArtifactPath = require('../../utils/get-lambda-layer-artifact-path'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../../utils/serverless-utils/log'); class AwsCompileLayers { constructor(serverless, options) { diff --git a/lib/plugins/aws/package/index.js b/lib/plugins/aws/package/index.js index b8db0468ac..543c2d28ef 100644 --- a/lib/plugins/aws/package/index.js +++ b/lib/plugins/aws/package/index.js @@ -10,7 +10,7 @@ const saveCompiledTemplate = require('./lib/save-compiled-template'); const mergeIamTemplates = require('./lib/merge-iam-templates'); const addExportNameForOutputs = require('./lib/add-export-name-for-outputs'); const validateTemplate = require('./lib/validate-template'); -const { log, style, progress } = require('@serverless/utils/log'); +const { log, style, progress } = require('../../../utils/serverless-utils/log'); const mainProgress = progress.get('main'); diff --git a/lib/plugins/aws/provider.js b/lib/plugins/aws/provider.js index 2bb29e7018..1e62aa1aed 100644 --- a/lib/plugins/aws/provider.js +++ b/lib/plugins/aws/provider.js @@ -17,7 +17,7 @@ const awsRequest = require('../../aws/request'); const { cfValue } = require('../../utils/aws-schema-get-cf-value'); const reportDeprecatedProperties = require('../../utils/report-deprecated-properties'); const deepSortObjectByKey = require('../../utils/deep-sort-object-by-key'); -const { progress, log } = require('@serverless/utils/log'); +const { progress, log } = require('../../utils/serverless-utils/log'); // AWS SDK v3 infrastructure const AWSClientFactory = require('../../aws/client-factory'); diff --git a/lib/plugins/aws/remove/index.js b/lib/plugins/aws/remove/index.js index bd4ee82ea5..6a3df220c5 100644 --- a/lib/plugins/aws/remove/index.js +++ b/lib/plugins/aws/remove/index.js @@ -7,7 +7,7 @@ const emptyS3Bucket = require('./lib/bucket'); const removeStack = require('./lib/stack'); const removeEcrRepository = require('./lib/ecr'); const checkIfEcrRepositoryExists = require('../lib/check-if-ecr-repository-exists'); -const { log, style, progress } = require('@serverless/utils/log'); +const { log, style, progress } = require('../../../utils/serverless-utils/log'); const mainProgress = progress.get('main'); diff --git a/lib/plugins/aws/remove/lib/bucket.js b/lib/plugins/aws/remove/lib/bucket.js index e6d9a457c4..2b9b9a446a 100644 --- a/lib/plugins/aws/remove/lib/bucket.js +++ b/lib/plugins/aws/remove/lib/bucket.js @@ -1,6 +1,6 @@ 'use strict'; -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../../utils/serverless-utils/log'); const ServerlessError = require('../../../../serverless-error'); module.exports = { diff --git a/lib/plugins/aws/rollback-function.js b/lib/plugins/aws/rollback-function.js index 8040128a59..968e833dc4 100644 --- a/lib/plugins/aws/rollback-function.js +++ b/lib/plugins/aws/rollback-function.js @@ -4,7 +4,7 @@ const BbPromise = require('bluebird'); const ServerlessError = require('../../serverless-error'); const validate = require('./lib/validate'); const fetch = require('node-fetch'); -const { style, log, progress } = require('@serverless/utils/log'); +const { style, log, progress } = require('../../utils/serverless-utils/log'); const mainProgress = progress.get('main'); diff --git a/lib/plugins/aws/rollback.js b/lib/plugins/aws/rollback.js index 3e4ca01af4..ff10bf67b8 100644 --- a/lib/plugins/aws/rollback.js +++ b/lib/plugins/aws/rollback.js @@ -12,7 +12,7 @@ const getCreateStackParams = require('./lib/get-create-stack-params'); const getUpdateStackParams = require('./lib/get-update-stack-params'); const findAndGroupDeployments = require('./utils/find-and-group-deployments'); const ServerlessError = require('../../serverless-error'); -const { style, log, progress } = require('@serverless/utils/log'); +const { style, log, progress } = require('../../utils/serverless-utils/log'); const slsConsoleLog = log.get('console'); diff --git a/lib/plugins/aws/utils/format-lambda-log-event.js b/lib/plugins/aws/utils/format-lambda-log-event.js index f0a64338c0..463faba147 100644 --- a/lib/plugins/aws/utils/format-lambda-log-event.js +++ b/lib/plugins/aws/utils/format-lambda-log-event.js @@ -1,7 +1,7 @@ 'use strict'; const dayjs = require('dayjs'); -const { style } = require('@serverless/utils/log'); +const { style } = require('../../../utils/serverless-utils/log'); module.exports = (msgParam) => { let msg = msgParam; diff --git a/lib/plugins/create/create.js b/lib/plugins/create/create.js index f5d6584243..41298fd973 100644 --- a/lib/plugins/create/create.js +++ b/lib/plugins/create/create.js @@ -12,7 +12,7 @@ const downloadTemplateFromExamples = require('../../utils/download-template-from const renameService = require('../../utils/rename-service').renameService; const copyDirContentsSync = require('../../utils/fs/copy-dir-contents-sync'); const dirExistsSync = require('../../utils/fs/dir-exists-sync'); -const { progress, log, style } = require('@serverless/utils/log'); +const { progress, log, style } = require('../../utils/serverless-utils/log'); const mainProgress = progress.get('main'); diff --git a/lib/plugins/install.js b/lib/plugins/install.js index 1117e7d3cd..edf0494434 100644 --- a/lib/plugins/install.js +++ b/lib/plugins/install.js @@ -2,7 +2,7 @@ const cliCommandsSchema = require('../cli/commands-schema'); const download = require('../utils/download-template-from-repo'); -const { log, progress, style } = require('@serverless/utils/log'); +const { log, progress, style } = require('../utils/serverless-utils/log'); class Install { constructor(serverless, options) { diff --git a/lib/plugins/package/lib/package-service.js b/lib/plugins/package/lib/package-service.js index 4db0073b58..950abcdab9 100644 --- a/lib/plugins/package/lib/package-service.js +++ b/lib/plugins/package/lib/package-service.js @@ -7,7 +7,7 @@ const _ = require('lodash'); const micromatch = require('micromatch'); const ServerlessError = require('../../../serverless-error'); const parseS3URI = require('../../aws/utils/parse-s3-uri'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../utils/serverless-utils/log'); module.exports = { defaultExcludes: [ diff --git a/lib/plugins/package/lib/zip-service.js b/lib/plugins/package/lib/zip-service.js index 94ecfa8c85..debc8ed116 100644 --- a/lib/plugins/package/lib/zip-service.js +++ b/lib/plugins/package/lib/zip-service.js @@ -10,7 +10,7 @@ const childProcess = BbPromise.promisifyAll(require('child_process')); const globby = require('globby'); const _ = require('lodash'); const ServerlessError = require('../../../serverless-error'); -const { log } = require('@serverless/utils/log'); +const { log } = require('../../../utils/serverless-utils/log'); const excludeNodeDevDependenciesMemoized = _.memoize(excludeNodeDevDependencies); diff --git a/lib/plugins/plugin/lib/utils.js b/lib/plugins/plugin/lib/utils.js index ee8d00d543..eef9751fc0 100644 --- a/lib/plugins/plugin/lib/utils.js +++ b/lib/plugins/plugin/lib/utils.js @@ -5,7 +5,7 @@ const BbPromise = require('bluebird'); const HttpsProxyAgent = require('https-proxy-agent'); const url = require('url'); const _ = require('lodash'); -const { log, writeText, style } = require('@serverless/utils/log'); +const { log, writeText, style } = require('../../../utils/serverless-utils/log'); module.exports = { async getPlugins() { diff --git a/lib/plugins/plugin/search.js b/lib/plugins/plugin/search.js index 8da3e893ae..5dbd2309fb 100644 --- a/lib/plugins/plugin/search.js +++ b/lib/plugins/plugin/search.js @@ -1,6 +1,6 @@ 'use strict'; -const { log } = require('@serverless/utils/log'); +const { log } = require('../../utils/serverless-utils/log'); const cliCommandsSchema = require('../../cli/commands-schema'); const pluginUtils = require('./lib/utils'); diff --git a/lib/plugins/print.js b/lib/plugins/print.js index 3d30338a43..5b10aeae23 100644 --- a/lib/plugins/print.js +++ b/lib/plugins/print.js @@ -6,7 +6,7 @@ const jc = require('json-cycle'); const yaml = require('js-yaml'); const ServerlessError = require('../serverless-error'); const cliCommandsSchema = require('../cli/commands-schema'); -const { writeText } = require('@serverless/utils/log'); +const { writeText } = require('../utils/serverless-utils/log'); class Print { constructor(serverless, options) { diff --git a/lib/plugins/standalone.js b/lib/plugins/standalone.js index 79b129ef37..a0f959e141 100644 --- a/lib/plugins/standalone.js +++ b/lib/plugins/standalone.js @@ -8,7 +8,7 @@ const stream = require('stream'); const { promisify } = require('util'); const fse = require('fs-extra'); const fetch = require('node-fetch'); -const { log, progress, style } = require('@serverless/utils/log'); +const { log, progress, style } = require('../utils/serverless-utils/log'); const currentVersion = require('../../package').version; const ServerlessError = require('../serverless-error'); const standaloneUtils = require('../utils/standalone'); diff --git a/lib/utils/download-template-from-examples.js b/lib/utils/download-template-from-examples.js index 224058063a..49077d9aa7 100644 --- a/lib/utils/download-template-from-examples.js +++ b/lib/utils/download-template-from-examples.js @@ -2,7 +2,7 @@ const path = require('path'); const os = require('os'); -const download = require('@serverless/utils/download'); +const download = require('./serverless-utils/download'); const fse = require('fs-extra'); const fsp = require('fs').promises; const untildify = require('untildify'); diff --git a/lib/utils/download-template-from-repo.js b/lib/utils/download-template-from-repo.js index 67353b198b..5757ae210d 100644 --- a/lib/utils/download-template-from-repo.js +++ b/lib/utils/download-template-from-repo.js @@ -3,7 +3,7 @@ const path = require('path'); const os = require('os'); const URL = require('url'); -const download = require('@serverless/utils/download'); +const download = require('./serverless-utils/download'); const BbPromise = require('bluebird'); const fse = require('fs-extra'); const qs = require('querystring'); diff --git a/lib/utils/fs/parse.js b/lib/utils/fs/parse.js index b20d2f77a6..37004e514f 100644 --- a/lib/utils/fs/parse.js +++ b/lib/utils/fs/parse.js @@ -3,7 +3,7 @@ const jc = require('json-cycle'); const yaml = require('js-yaml'); const _ = require('lodash'); -const cloudformationSchema = require('@serverless/utils/cloudformation-schema'); +const cloudformationSchema = require('../serverless-utils/cloudformation-schema'); const loadYaml = (contents, options) => { let data; diff --git a/lib/utils/get-framework-id.js b/lib/utils/get-framework-id.js index f146aa03d2..71b6e47178 100644 --- a/lib/utils/get-framework-id.js +++ b/lib/utils/get-framework-id.js @@ -1,6 +1,6 @@ 'use strict'; -const configUtils = require('@serverless/utils/config'); +const configUtils = require('./serverless-utils/config'); function getFrameworkId() { const config = configUtils.getConfig('getFrameworkId'); diff --git a/lib/utils/log-deprecation.js b/lib/utils/log-deprecation.js index a95f23c08c..e06204913e 100644 --- a/lib/utils/log-deprecation.js +++ b/lib/utils/log-deprecation.js @@ -8,7 +8,7 @@ const _ = require('lodash'); const resolveTmpdir = require('process-utils/tmpdir'); const ServerlessError = require('../serverless-error'); const safeMoveFile = require('./fs/safe-move-file'); -const { style, log } = require('@serverless/utils/log'); +const { style, log } = require('./serverless-utils/log'); const healthStatusFilename = require('./health-status-filename'); const disabledDeprecationCodesByEnv = extractCodes(process.env.SLS_DEPRECATION_DISABLE); diff --git a/lib/utils/npm-package/is-writable.js b/lib/utils/npm-package/is-writable.js index 8fe800cdec..0a97a485cb 100644 --- a/lib/utils/npm-package/is-writable.js +++ b/lib/utils/npm-package/is-writable.js @@ -2,7 +2,7 @@ const path = require('path'); const fsp = require('fs').promises; -const { log } = require('@serverless/utils/log'); +const { log } = require('../serverless-utils/log'); const npmPackageRoot = path.resolve(__dirname, '../../../'); diff --git a/lib/utils/open-browser.js b/lib/utils/open-browser.js index 2d5f638f51..9efffcb722 100644 --- a/lib/utils/open-browser.js +++ b/lib/utils/open-browser.js @@ -2,7 +2,7 @@ const open = require('open'); const isDockerContainer = require('is-docker'); -const { log, style } = require('@serverless/utils/log'); +const { log, style } = require('./serverless-utils/log'); module.exports = function openBrowser(url) { log.notice(); diff --git a/lib/utils/serverless-utils/cloudformation-schema.js b/lib/utils/serverless-utils/cloudformation-schema.js new file mode 100644 index 0000000000..14acf7a1c3 --- /dev/null +++ b/lib/utils/serverless-utils/cloudformation-schema.js @@ -0,0 +1,52 @@ +'use strict'; + +const yaml = require('js-yaml'); +const _ = require('lodash'); + +const functionNames = [ + 'And', + 'Base64', + 'Cidr', + 'Condition', + 'Equals', + 'FindInMap', + 'GetAtt', + 'GetAZs', + 'If', + 'ImportValue', + 'Join', + 'Not', + 'Or', + 'Ref', + 'Select', + 'Split', + 'Sub', +]; + +const yamlType = (name, kind) => { + const functionName = ['Ref', 'Condition'].includes(name) ? name : `Fn::${name}`; + return new yaml.Type(`!${name}`, { + kind, + construct: (data) => { + if (name === 'GetAtt') { + // special GetAtt dot syntax + if (typeof data === 'string') { + const [first, ...tail] = data.split('.'); + data = [first, tail.join('.')]; + } + } + return { [functionName]: data }; + }, + }); +}; + +const createSchema = () => { + const types = _.flatten( + functionNames.map((functionName) => + ['mapping', 'scalar', 'sequence'].map((kind) => yamlType(functionName, kind)) + ) + ); + return yaml.DEFAULT_SCHEMA.extend(types); +}; + +module.exports = createSchema(); diff --git a/lib/utils/serverless-utils/config.js b/lib/utils/serverless-utils/config.js new file mode 100644 index 0000000000..50541205ca --- /dev/null +++ b/lib/utils/serverless-utils/config.js @@ -0,0 +1,223 @@ +'use strict'; + +const p = require('path'); +const os = require('os'); +const fs = require('fs'); + +const _ = require('lodash'); +const writeFileAtomic = require('write-file-atomic'); +const uuid = require('uuid'); +const { log } = require('./log'); + +const logDebug = log.get('config').debug; + +let baseFilename = 'serverless'; +if (process.env.SERVERLESS_PLATFORM_STAGE && process.env.SERVERLESS_PLATFORM_STAGE !== 'prod') { + baseFilename = `serverless${process.env.SERVERLESS_PLATFORM_STAGE.toLowerCase()}`; + baseFilename = baseFilename.trim(); +} +baseFilename = `.${baseFilename}rc`; + +const getLocalConfigPath = () => p.join(process.cwd(), baseFilename); +const getDefaultGlobalConfigPath = () => p.join(os.homedir(), baseFilename); +const getHomeConfigGlobalConfigPath = () => p.join(os.homedir(), '.config', baseFilename); + +const getGlobalConfigPath = () => { + const homeConfigGlobalConfigPath = getHomeConfigGlobalConfigPath(); + const defaultGlobalConfigPath = getDefaultGlobalConfigPath(); + const homeConfigGlobalConfigExists = fs.existsSync(homeConfigGlobalConfigPath); + const defaultGlobalConfigExists = fs.existsSync(defaultGlobalConfigPath); + + if (homeConfigGlobalConfigExists && defaultGlobalConfigExists) { + log.warning(`Found two global configuration files. Using: ${defaultGlobalConfigPath}`); + return defaultGlobalConfigPath; + } + + if (homeConfigGlobalConfigExists) { + return homeConfigGlobalConfigPath; + } + + return defaultGlobalConfigPath; +}; + +function storeConfig(config, configPath) { + config.meta = config.meta || {}; + config.meta.updated_at = Math.round(Date.now() / 1000); + + const jsonConfig = JSON.stringify(config, null, 2); + + try { + writeFileAtomic.sync(configPath, jsonConfig); + } catch (error) { + logDebug( + `Unable to store serverless config: ${configPath} due to ${error.code} error`, + error.stack + ); + return; + } + logDebug('Stored config at %s, auth data %o', configPath, config.auth); +} + +function createDefaultGlobalConfig() { + const defaultConfig = { + userId: null, // currentUserId + frameworkId: uuid.v1(), + trackingDisabled: false, + enterpriseDisabled: false, + meta: { + created_at: Math.round(Date.now() / 1000), // config file creation date + updated_at: null, // config file updated date + }, + }; + storeConfig(defaultConfig, getDefaultGlobalConfigPath()); + return defaultConfig; +} + +function getLocalConfig() { + const localConfigPath = getLocalConfigPath(); + try { + return JSON.parse(fs.readFileSync(localConfigPath)); + } catch (error) { + if (error.code === 'ENOENT') { + return {}; + } + log.warning(`Cannot resolve local config file.\nError: ${error.message}`); + try { + // try/catch to account for very unlikely race condition where file existed + // during readFileSync but no longer exists during rename + const backupServerlessrcPath = `${localConfigPath}.bak`; + fs.renameSync(localConfigPath, backupServerlessrcPath); + log.warning( + `Your previous local config was renamed to ${backupServerlessrcPath} for debugging.` + ); + } catch { + // Ignore + } + } + + return {}; +} + +function getGlobalConfig() { + const globalConfigPath = getGlobalConfigPath(); + try { + return JSON.parse(fs.readFileSync(globalConfigPath)); + } catch (error) { + // If the file does not exist, we want to recreate default global configuration + if (error.code !== 'ENOENT') { + log.warning( + `Cannot resolve global config file: ${globalConfigPath} \nError: ${error.message}` + ); + try { + // try/catch to account for very unlikely race condition where file existed + // during readFileSync but no longer exists during rename + const backupServerlessrcPath = `${globalConfigPath}.bak`; + fs.renameSync(globalConfigPath, backupServerlessrcPath); + log.warning( + `Your previous global config was renamed to ${backupServerlessrcPath} for debugging. ` + + `Default global config will be recreated under ${getDefaultGlobalConfigPath()}` + ); + } catch { + // Ignore + } + } + } + + return createDefaultGlobalConfig(); +} + +function getConfig() { + const localConfig = getLocalConfig(); + logDebug('Retrieve local config, auth data %o', localConfig.auth); + const globalConfig = getGlobalConfig(); + logDebug('Retrieve global config, auth data %o', globalConfig.auth); + return _.merge(globalConfig, localConfig); +} + +function getConfigForUpdate() { + const localConfigPath = getLocalConfigPath(); + const localConfigExists = fs.existsSync(localConfigPath); + if (localConfigExists) { + const result = { + config: getLocalConfig(), + configPath: localConfigPath, + }; + logDebug( + 'Retrieved local config for update at %s, auth data %o', + localConfigPath, + result.config.auth + ); + return result; + } + + const result = { + config: getGlobalConfig(), + configPath: getGlobalConfigPath(), + }; + logDebug( + 'Retrieved global config for update at %s, auth data %o', + localConfigPath, + result.config.auth + ); + return result; +} + +function set(key, value) { + const configForUpdate = getConfigForUpdate(); + let { config } = configForUpdate; + const { configPath } = configForUpdate; + if (key && typeof key === 'string' && typeof value !== 'undefined') { + config = _.set(config, key, value); + } else if (_.isObject(key)) { + config = _.merge(config, key); + } else if (typeof value !== 'undefined') { + config = _.merge(config, value); + } + storeConfig(config, configPath); + return getConfig(); +} + +function deleteValue(key) { + const configForUpdate = getConfigForUpdate(); + let { config } = configForUpdate; + const { configPath } = configForUpdate; + if (key && typeof key === 'string') { + config = _.omit(config, [key]); + } else if (key && Array.isArray(key)) { + config = _.omit(config, key); + } + storeConfig(config, configPath); + return getConfig(); +} + +function get(path) { + const config = getConfig(); + return _.get(config, path); +} + +function getLoggedInUser() { + const config = getConfig(); + if (!config.userId) { + return null; + } + const user = _.get(config, ['users', config.userId, 'dashboard']); + if (!user || !user.username) { + return null; // user is logged out + } + return { + userId: config.userId, + username: user.username, + accessKeys: user.accessKeys, + idToken: user.idToken, + refreshToken: user.refreshToken, + }; +} + +module.exports = { + set, + get, + delete: deleteValue, + getConfig, + getLoggedInUser, + CONFIG_FILE_NAME: baseFilename, +}; diff --git a/lib/utils/serverless-utils/download.js b/lib/utils/serverless-utils/download.js new file mode 100644 index 0000000000..55118b8ee3 --- /dev/null +++ b/lib/utils/serverless-utils/download.js @@ -0,0 +1,118 @@ +// This module is mostly adapted from https://github.com/kevva/download repository + +// License of the original module - https://github.com/kevva/download/blob/master/license + +// MIT License + +// Copyright (c) Kevin Mårtensson (github.com/kevva) + +// Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +// The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +'use strict'; + +const fsp = require('fs').promises; +const path = require('path'); +const { URL } = require('url'); +const contentDisposition = require('content-disposition'); +const archiveType = require('archive-type'); +const decompress = require('decompress'); +const filenamify = require('filenamify'); +const getStream = require('get-stream'); +const got = require('got'); +const makeDir = require('make-dir'); +const pEvent = require('p-event'); +const extName = require('ext-name'); + +const filenameFromPath = (res) => path.basename(new URL(res.requestUrl).pathname); + +const getExtFromMime = (res) => { + const header = res.headers['content-type']; + + if (!header) { + return null; + } + + const exts = extName.mime(header); + + if (exts.length !== 1) { + return null; + } + + return exts[0].ext; +}; + +const getFilename = async (res) => { + const header = res.headers['content-disposition']; + + if (header) { + const parsed = contentDisposition.parse(header); + + if (parsed.parameters && parsed.parameters.filename) { + return parsed.parameters.filename; + } + } + + let filename = filenameFromPath(res); + + if (!path.extname(filename)) { + const ext = getExtFromMime(res); + + if (ext) { + filename = `${filename}.${ext}`; + } + } + + return filename; +}; + +module.exports = (uri, output, opts) => { + if (typeof output === 'object') { + opts = output; + output = null; + } + + opts = Object.assign( + { + https: { + rejectUnauthorized: process.env.npm_config_strict_ssl !== 'false', + }, + responseType: 'buffer', + }, + opts + ); + + const stream = got.stream(uri, opts); + + const promise = pEvent(stream, 'response') + .then((res) => { + const encoding = opts.responseType === 'buffer' ? 'buffer' : opts.encoding; + return Promise.all([getStream(stream, { encoding }), res]); + }) + .then(async (result) => { + const [data, res] = result; + + if (!output) { + return opts.extract && archiveType(data) ? decompress(data, opts) : data; + } + + const filename = opts.filename || filenamify(await getFilename(res, data)); + const outputFilepath = path.join(output, filename); + + if (opts.extract && archiveType(data)) { + return decompress(data, path.dirname(outputFilepath), opts); + } + + return makeDir(path.dirname(outputFilepath)) + .then(() => fsp.writeFile(outputFilepath, data)) + .then(() => data); + }); + + stream.then = promise.then.bind(promise); + stream.catch = promise.catch.bind(promise); + + return stream; +}; diff --git a/lib/utils/serverless-utils/inquirer/index.js b/lib/utils/serverless-utils/inquirer/index.js new file mode 100644 index 0000000000..25f6929638 --- /dev/null +++ b/lib/utils/serverless-utils/inquirer/index.js @@ -0,0 +1,37 @@ +// Customize inquirer style + +'use strict'; + +const { createRequire } = require('module'); +const identity = require('ext/function/identity'); +const requireUncached = require('ncjsm/require-uncached'); +const chalk = require('chalk'); +const { style } = require('../log'); + +const inquirersChalkPath = createRequire(require.resolve('inquirer')).resolve('chalk'); + +module.exports = requireUncached(inquirersChalkPath, () => { + // Ensure distinct chalk instance for inquirer and hack it with altered styles + Object.defineProperties(require(inquirersChalkPath), { + cyan: { + get() { + return chalk.bold; + }, + }, + bold: { + get() { + return identity; + }, + }, + }); + + const BasePrompt = require('inquirer/lib/prompts/base'); + const originalGetQuestion = BasePrompt.prototype.getQuestion; + BasePrompt.prototype.getQuestion = function () { + // Here we want to override the default prefix which is equal to `chalk.green('?')` + this.opt.prefix = style.strong('?'); + return originalGetQuestion.call(this); + }; + + return require('inquirer'); +}); diff --git a/lib/utils/serverless-utils/lib/log-reporters/node/log-reporter.js b/lib/utils/serverless-utils/lib/log-reporters/node/log-reporter.js new file mode 100644 index 0000000000..cf50a19b47 --- /dev/null +++ b/lib/utils/serverless-utils/lib/log-reporters/node/log-reporter.js @@ -0,0 +1,71 @@ +'use strict'; + +const NodeLogReporter = require('log-node/lib/writer'); +const logLevels = require('log/levels'); +const logEmitter = require('log/lib/emitter'); +const colorsSupportLevel = require('supports-color').stderr.level || 0; +const style = require('./style'); + +const WARNING_LEVEL_INDEX = logLevels.indexOf('warning'); +const ERROR_LEVEL_INDEX = logLevels.indexOf('error'); + +class ServerlessLogReporter extends NodeLogReporter { + constructor({ logLevelIndex, debugNamespaces }) { + if (debugNamespaces) { + debugNamespaces = debugNamespaces + .split(',') + .filter(Boolean) + .map((namespace) => `serverless:${namespace}`) + .join(','); + } + super({ + env: { LOG_LEVEL: logLevels[logLevelIndex], LOG_DEBUG: debugNamespaces }, + defaultNamespace: 'serverless', + }); + + // Prevent "Warning:" prefix on deprecation warnings + logEmitter.on('init', ({ logger }) => { + if (logger.namespace === 'serverless:deprecation') { + logger.levelMessagePrefix = null; + } + }); + } + isLoggerEnabled(logger) { + return logger.namespaceTokens[0] === 'serverless' && logger.isEnabled; + } + setupLevelMessageDecorator(levelLogger) { + if (levelLogger.levelIndex === WARNING_LEVEL_INDEX) { + levelLogger.messageContentDecorator = style.warning; + } + } + resolveMessageContent(event) { + super.resolveMessageContent(event); + if (event.logger.levelIndex !== ERROR_LEVEL_INDEX) { + return; + } + const [firstLine, ...otherLines] = event.messageContent.split('\n'); + event.messageContent = `${style.error(firstLine)}${ + otherLines.length ? `\n ${style.aside(otherLines.join('\n '))}` : '' + }`; + } + resolveMessageTimestamp() { + // No log timestamp reporting at this point + } +} + +ServerlessLogReporter.levelPrefixes = { + error: style.error(process.platform !== 'win32' && colorsSupportLevel >= 2 ? '✖' : '×'), + warning: style.warning('Warning:'), +}; + +ServerlessLogReporter.resolveNamespaceMessagePrefix = function (logger) { + if (logger.level !== 'debug') { + return null; + } + if (logger.namespaceTokens.length < 2) { + return null; + } + return `${logger.namespaceTokens.slice(1).join(':')}:`; +}; + +module.exports = (config) => new ServerlessLogReporter(config); diff --git a/lib/utils/serverless-utils/lib/log-reporters/node/progress-reporter.js b/lib/utils/serverless-utils/lib/log-reporters/node/progress-reporter.js new file mode 100644 index 0000000000..3551204122 --- /dev/null +++ b/lib/utils/serverless-utils/lib/log-reporters/node/progress-reporter.js @@ -0,0 +1,71 @@ +'use strict'; + +const _ = require('lodash'); +const getCliProgressFooter = require('cli-progress-footer'); +const { emitter } = require('../../log/get-progress-reporter'); +const { progress, log } = require('../../../log'); +const joinTextTokens = require('../../log/join-text-tokens'); +const style = require('./style'); + +module.exports = ({ logLevelIndex }) => { + const cliProgressFooter = getCliProgressFooter(); + cliProgressFooter.shouldAddProgressAnimationPrefix = true; + cliProgressFooter.progressAnimationPrefixFrames = + cliProgressFooter.progressAnimationPrefixFrames.map((frame) => style.noticeSymbol(frame)); + + let mainProgressTextContent; + let mainProgressIntervalId; + let mainProgressStartTime; + let lastMainEventText; + + let isClosed = false; + progress.clear = () => { + isClosed = true; + clearInterval(mainProgressIntervalId); + cliProgressFooter.updateProgress(); + }; + + const ongoingSubProgress = new Map(); + const repaint = () => { + if (isClosed) { + return; + } + const progressItems = []; + if (mainProgressStartTime) { + progressItems.push( + `${mainProgressTextContent} ${style.aside( + `(${Math.floor((Date.now() - mainProgressStartTime) / 1000)}s)` + )}` + ); + } + progressItems.push(...ongoingSubProgress.values()); + cliProgressFooter.updateProgress(progressItems); + }; + + emitter.on('update', ({ namespace, name, levelIndex, textTokens, options }) => { + if (levelIndex > logLevelIndex) { + return; + } + const textContent = joinTextTokens([textTokens]).slice(0, -1); + if (namespace === 'serverless' && name === 'main') { + // Main progress + // Reflect main events in verbose logs + if (_.get(options, 'isMainEvent') && lastMainEventText !== textContent) { + lastMainEventText = textContent; + log.info(textContent); + } + mainProgressTextContent = textContent; + if (!mainProgressStartTime) { + mainProgressStartTime = Date.now(); + mainProgressIntervalId = setInterval(repaint, 200); + } + } else { + ongoingSubProgress.set(`${namespace}:${name}`, textContent); + } + repaint(); + }); + emitter.on('remove', ({ namespace, name }) => { + ongoingSubProgress.delete(`${namespace}:${name}`); + repaint(); + }); +}; diff --git a/lib/utils/serverless-utils/lib/log-reporters/node/style.js b/lib/utils/serverless-utils/lib/log-reporters/node/style.js new file mode 100644 index 0000000000..6dce8ee8b3 --- /dev/null +++ b/lib/utils/serverless-utils/lib/log-reporters/node/style.js @@ -0,0 +1,39 @@ +'use strict'; + +const d = require('d'); +const autoBind = require('d/auto-bind'); +const identity = require('ext/function/identity'); +const chalk = require('chalk'); +const { level: colorSupportLevel } = require('supports-color'); +const { style, log } = require('../../../log'); +const joinTextTokens = require('../../log/join-text-tokens'); + +const cliStyle = { + aside: colorSupportLevel > 2 ? chalk.rgb(140, 141, 145) : chalk.gray, + error: colorSupportLevel > 2 ? chalk.rgb(253, 87, 80) : chalk.redBright, + link: identity, + linkStrong: chalk.underline, + noticeSymbol: colorSupportLevel > 2 ? chalk.rgb(253, 87, 80) : chalk.redBright, + strong: colorSupportLevel > 2 ? chalk.rgb(253, 87, 80) : chalk.redBright, + title: chalk.underline, + warning: chalk.rgb(255, 165, 0), +}; + +for (const key of Object.keys(style)) { + const decorator = cliStyle[key]; + if (!decorator) { + continue; + } + module.exports[key] = style[key] = (text, ...textTokens) => + decorator(joinTextTokens([text, ...textTokens]).slice(0, -1)); +} + +// Notice level message common message decorators +Object.defineProperties( + log, + autoBind({ + success: d(function (text, ...messageTokens) { + return this.notice(`${cliStyle.noticeSymbol('✔')} ${text}`, ...messageTokens); + }), + }) +); diff --git a/lib/utils/serverless-utils/lib/log/get-output-reporter.js b/lib/utils/serverless-utils/lib/log/get-output-reporter.js new file mode 100644 index 0000000000..068578d159 --- /dev/null +++ b/lib/utils/serverless-utils/lib/log/get-output-reporter.js @@ -0,0 +1,30 @@ +'use strict'; + +const uniGlobal = require('uni-global')('serverless/serverless/202110'); +const memoizee = require('memoizee'); + +const outputEmitter = (() => { + if (!uniGlobal.outputEmitter) uniGlobal.outputEmitter = require('event-emitter')(); + return uniGlobal.outputEmitter; +})(); + +module.exports = memoizee( + (namespace) => { + return { + get: memoizee( + (mode) => + (text, ...textTokens) => { + outputEmitter.emit('write', { + namespace, + mode, + textTokens: [text, ...textTokens], + }); + }, + { primitive: true } + ), + }; + }, + { primitive: true } +); + +module.exports.emitter = outputEmitter; diff --git a/lib/utils/serverless-utils/lib/log/get-progress-reporter.js b/lib/utils/serverless-utils/lib/log/get-progress-reporter.js new file mode 100644 index 0000000000..6c224e5923 --- /dev/null +++ b/lib/utils/serverless-utils/lib/log/get-progress-reporter.js @@ -0,0 +1,74 @@ +'use strict'; + +const ensureString = require('type/string/ensure'); +const isObject = require('type/object/is'); +const createRandomString = require('ext/string/random'); +const uniGlobal = require('uni-global')('serverless/serverless/202110'); +const memoizee = require('memoizee'); +const logLevels = require('log/levels'); + +const progressEmitter = (() => { + if (!uniGlobal.progressEmitter) uniGlobal.progressEmitter = require('event-emitter')(); + return uniGlobal.progressEmitter; +})(); + +module.exports = memoizee( + (namespace) => { + return { + get: memoizee( + (name) => { + name = ensureString(name, { name: 'name' }); + const progress = { + namespace, + name, + remove: () => { + progressEmitter.emit('remove', { namespace, name }); + }, + }; + const levelsMeta = [ + { levelName: 'info', levelIndex: logLevels.indexOf('info') }, + { levelName: 'notice', levelIndex: logLevels.indexOf('notice') }, + ]; + for (const { levelName, levelIndex } of levelsMeta) { + progress[levelName] = (textTokens, options = null) => { + progressEmitter.emit('update', { + namespace, + name, + level: levelName, + levelIndex, + textTokens, + options, + }); + }; + } + progress.update = progress.notice; + return progress; + }, + namespace, + { primitive: true } + ), + create(options = {}) { + if (!isObject(options)) options = {}; + const message = ensureString(options.message, { + isOptional: true, + name: 'options.message', + }); + const name = ensureString(options.name, { + isOptional: true, + name: 'options.name', + }); + if (name && this.get._has(name)) { + throw Object.assign(new Error(`Progress named "${name}" already exists`), { + code: 'PROGRESS_NAME_TAKEN', + }); + } + const progress = this.get(name || `unnamed-${createRandomString({ isUnique: true })}`); + if (message != null) progress.notice(message); + return progress; + }, + }; + }, + { primitive: true } +); + +module.exports.emitter = progressEmitter; diff --git a/lib/utils/serverless-utils/lib/log/join-text-tokens.js b/lib/utils/serverless-utils/lib/log/join-text-tokens.js new file mode 100644 index 0000000000..b6a78c0a5c --- /dev/null +++ b/lib/utils/serverless-utils/lib/log/join-text-tokens.js @@ -0,0 +1,11 @@ +// Dedicated to join text tokens as passed to `writeText` and `progress.update` + +'use strict'; + +const ensureString = require('type/string/ensure'); +const _ = require('lodash'); + +module.exports = (textTokens) => + `${_.flattenDeep(textTokens) + .map((textToken) => ensureString(textToken, { isOptional: true, name: 'textToken' }) || '') + .join('\n')}\n`; diff --git a/lib/utils/serverless-utils/log-reporters/node.js b/lib/utils/serverless-utils/log-reporters/node.js new file mode 100644 index 0000000000..09c6a171e4 --- /dev/null +++ b/lib/utils/serverless-utils/log-reporters/node.js @@ -0,0 +1,60 @@ +'use strict'; + +const uniGlobal = require('uni-global')('serverless/serverless/202110'); + +if (uniGlobal.logLevelIndex != null) { + // An edge case, of log reporter being setup second time for Node.js process + // The only known scenario is `sls --version` being run with global v2 `serverless` + // installation, which falls back to locally installed v2 `serverless` installation + return; +} + +if (process.env.SLS_LOG_LEVEL !== 'debug' && process.argv.includes('--verbose')) { + process.env.SLS_LOG_LEVEL = 'info'; +} + +process.argv.some((flag, index) => { + const namespace = (() => { + if (flag === '--debug') { + return process.argv[index + 1]; + } + if (flag.startsWith('--debug=')) return flag.slice('--debug='.length); + return null; + })(); + if (!namespace) { + return false; + } + if (namespace === '*') process.env.SLS_LOG_LEVEL = 'debug'; + else process.env.SLS_LOG_DEBUG = namespace; + return true; +}); + +const logReporter = require('../lib/log-reporters/node/log-reporter'); +const { emitter: outputEmitter } = require('../lib/log/get-output-reporter'); +const joinTextTokens = require('../lib/log/join-text-tokens'); +const logLevels = require('log/levels'); + +const logLevelIndex = logLevels.includes(process.env.SLS_LOG_LEVEL) + ? logLevels.indexOf(process.env.SLS_LOG_LEVEL) + : logLevels.indexOf('notice'); + +const isInteractive = + (process.stdin.isTTY && process.stdout.isTTY && !process.env.CI) || + process.env.SLS_INTERACTIVE_SETUP_ENABLE; + +// Apply style decorators +require('../lib/log-reporters/node/style'); + +// Event logs +logReporter({ logLevelIndex, debugNamespaces: process.env.SLS_LOG_DEBUG }); +uniGlobal.logLevelIndex = logLevelIndex; + +// Substantial output (not subject to filtering) +outputEmitter.on('write', ({ mode, textTokens }) => { + if (mode === 'text') process.stdout.write(joinTextTokens(textTokens)); +}); + +uniGlobal.logIsInteractive = isInteractive; +if (isInteractive) { + require('../lib/log-reporters/node/progress-reporter')({ logLevelIndex }); +} diff --git a/lib/utils/serverless-utils/log.js b/lib/utils/serverless-utils/log.js new file mode 100644 index 0000000000..63de25ffd9 --- /dev/null +++ b/lib/utils/serverless-utils/log.js @@ -0,0 +1,90 @@ +'use strict'; + +const ensureString = require('type/string/ensure'); +const d = require('d'); +const memoizee = require('memoizee'); +const logLevels = require('log/levels'); +const uniGlobal = require('uni-global')('serverless/serverless/202110'); +const getOutputReporter = require('./lib/log/get-output-reporter'); +const getProgressReporter = require('./lib/log/get-progress-reporter'); + +const log = (() => { + if (!uniGlobal.log) uniGlobal.log = require('log').get('serverless').notice; + return uniGlobal.log; +})(); + +module.exports.log = log; + +if (!log.verbose) { + // Intialize log instance (we do not share one setup over `uniGlobal`) + + // Notice level message common message decorators + Object.defineProperties(log, { + success: d.gs(function () { + return this.notice; + }), + skip: d.gs(function () { + return this.notice; + }), + }); + + Object.defineProperties(log, { + verbose: d.gs(function () { + return this.info; + }), + }); +} + +const defaultLogLevelIndex = logLevels.indexOf('notice'); +Object.defineProperties(module.exports, { + logLevelIndex: d.gs(() => { + return uniGlobal.logLevelIndex == null ? defaultLogLevelIndex : uniGlobal.logLevelIndex; + }), + isVerboseMode: d.gs(() => module.exports.logLevelIndex > defaultLogLevelIndex), + isInteractive: d.gs(() => { + return uniGlobal.logIsInteractive == null ? false : uniGlobal.logIsInteractive; + }), +}); + +module.exports.writeText = getOutputReporter('serverless').get('text'); + +module.exports.progress = getProgressReporter('serverless'); +// Method intended to clear and close indefinitely any progress writing +// Overriden with intended logic in reporter +module.exports.progress.clear = () => {}; + +module.exports.getPluginWriters = memoizee( + (pluginName) => { + pluginName = ensureString(pluginName, { name: 'pluginName' }); + // "log" namespace can contain only [a-z0-9-] chars, therefore we normalize plugin name to + // avoid exceptions + const pluginLog = log.get('plugin').get(pluginName.toLowerCase().replace(/[^a-z0-9-]/g, '-')); + pluginLog.pluginName = pluginName; + return { + log: pluginLog.notice, + writeText: getOutputReporter(`serverless:plugin:${pluginName}`).get('text'), + progress: getProgressReporter(`serverless:plugin:${pluginName}`), + }; + }, + { primitive: true } +); + +const style = { + aside: (text, ...textTokens) => [text, ...textTokens], + error: (text, ...textTokens) => [text, ...textTokens], + link: (text, ...textTokens) => [text, ...textTokens], + linkStrong: (text, ...textTokens) => [text, ...textTokens], + noticeSymbol: (text, ...textTokens) => [text, ...textTokens], + strong: (text, ...textTokens) => [text, ...textTokens], + title: (text, ...textTokens) => [text, ...textTokens], + warning: (text, ...textTokens) => [text, ...textTokens], +}; + +if (uniGlobal.logStyle) { + module.exports.style = uniGlobal.logStyle; + for (const key of Object.keys(style)) { + if (!uniGlobal.logStyle[key]) uniGlobal.logStyle[key] = style[key]; + } +} else { + module.exports.style = uniGlobal.logStyle = style; +} diff --git a/lib/utils/yaml-ast-parser.js b/lib/utils/yaml-ast-parser.js index 1baa2ae59b..9583f4eb1d 100644 --- a/lib/utils/yaml-ast-parser.js +++ b/lib/utils/yaml-ast-parser.js @@ -5,7 +5,7 @@ const BbPromise = require('bluebird'); const fs = BbPromise.promisifyAll(require('fs')); const _ = require('lodash'); const os = require('os'); -const { log } = require('@serverless/utils/log'); +const { log } = require('./serverless-utils/log'); const findKeyChain = (astContent) => { let content = astContent; diff --git a/package.json b/package.json index 0614687a3b..1a76812588 100644 --- a/package.json +++ b/package.json @@ -44,15 +44,16 @@ "@aws-sdk/credential-providers": "^3.975.0", "@aws-sdk/lib-dynamodb": "^3.975.0", "@aws-sdk/lib-storage": "^3.975.0", - "@serverless/utils": "^6.13.1", "ajv": "^8.12.0", "ajv-formats": "^2.1.1", + "archive-type": "^4.0.0", "archiver": "^7.0.1", "aws-sdk": "^2.1693.0", "bluebird": "^3.7.2", "cachedir": "^2.3.0", "chalk": "^4.1.2", "child-process-ext": "^3.0.2", + "content-disposition": "^0.5.4", "ci-info": "^3.9.0", "cli-progress-footer": "^2.3.2", "d": "^1.0.1", @@ -61,25 +62,36 @@ "dotenv": "^16.3.1", "dotenv-expand": "^10.0.0", "essentials": "^1.2.0", + "event-emitter": "^0.3.5", "ext": "^1.7.0", + "ext-name": "^5.0.0", "fastest-levenshtein": "^1.0.16", + "filenamify": "^4.3.0", "filesize": "^10.0.7", "fs-extra": "^10.1.0", "get-stdin": "^8.0.0", + "get-stream": "^6.0.1", "globby": "^11.1.0", + "got": "^11.8.6", "graceful-fs": "^4.2.11", "https-proxy-agent": "^5.0.1", + "inquirer": "^8.2.7", "is-docker": "^2.2.1", "js-yaml": "^4.1.0", "json-cycle": "^1.5.0", "json-refs": "^3.0.15", + "log": "^6.3.1", + "log-node": "^8.0.3", "lodash": "^4.17.21", + "make-dir": "^4.0.0", "memoizee": "^0.4.15", "micromatch": "^4.0.5", "module-alias": "^2.2.3", + "ncjsm": "^4.3.2", "node-fetch": "^2.6.11", "object-hash": "^3.0.0", "open": "^8.4.2", + "p-event": "^4.2.0", "process-utils": "^4.0.0", "promise-queue": "^2.2.5", "punycode": "^2.3.1", @@ -91,8 +103,10 @@ "timers-ext": "^0.1.7", "tsx": "^4.20.3", "type": "^2.7.2", + "uni-global": "^1.0.0", "untildify": "^4.0.0", "uuid": "^9.0.0", + "write-file-atomic": "^4.0.2", "ws": "^7.5.9", "yaml-ast-parser": "0.0.43" }, @@ -108,12 +122,9 @@ "husky": "^4.3.8", "jszip": "^3.10.1", "lint-staged": "^16.2.7", - "log": "^6.3.1", - "log-node": "^8.0.3", "minimist": "^1.2.8", "mocha": "^11.7.5", "mock-require": "^3.0.3", - "ncjsm": "^4.3.2", "p-limit": "^3.1.0", "prettier": "^2.8.8", "proxyquire": "^2.1.3", diff --git a/scripts/serverless.js b/scripts/serverless.js index f39f72095b..28fb4ff239 100755 --- a/scripts/serverless.js +++ b/scripts/serverless.js @@ -9,8 +9,8 @@ require('essentials'); require('graceful-fs').gracefulify(require('fs')); // Setup log writing -require('@serverless/utils/log-reporters/node'); -const { log, progress } = require('@serverless/utils/log'); +require('../lib/utils/serverless-utils/log-reporters/node'); +const { log, progress } = require('../lib/utils/serverless-utils/log'); const processLog = log.get('process'); diff --git a/test/lib/observe-output.js b/test/lib/observe-output.js index 3adb69b15e..3cb7df04a4 100644 --- a/test/lib/observe-output.js +++ b/test/lib/observe-output.js @@ -1,8 +1,10 @@ 'use strict'; const isThenable = require('type/thenable/is'); -const { emitter: outputEmitter } = require('@serverless/utils/lib/log/get-output-reporter'); -const joinTextTokens = require('@serverless/utils/lib/log/join-text-tokens'); +const { + emitter: outputEmitter, +} = require('../../lib/utils/serverless-utils/lib/log/get-output-reporter'); +const joinTextTokens = require('../../lib/utils/serverless-utils/lib/log/join-text-tokens'); module.exports = (callback) => { let output = ''; diff --git a/test/lib/setup-fixtures-engine.js b/test/lib/setup-fixtures-engine.js index d938259d1a..1823a59c52 100644 --- a/test/lib/setup-fixtures-engine.js +++ b/test/lib/setup-fixtures-engine.js @@ -11,7 +11,7 @@ const memoizee = require('memoizee'); const _ = require('lodash'); const log = require('log').get('serverless:test'); const { load: loadYaml, dump: saveYaml } = require('js-yaml'); -const cloudformationSchema = require('@serverless/utils/cloudformation-schema'); +const cloudformationSchema = require('../../lib/utils/serverless-utils/cloudformation-schema'); const provisionTmpDir = require('./provision-tmp-dir'); const isFixtureConfigured = memoizee((fixturePath) => { diff --git a/test/unit/lib/plugins/aws/provider.test.js b/test/unit/lib/plugins/aws/provider.test.js index 1dba40617d..152a6dc17d 100644 --- a/test/unit/lib/plugins/aws/provider.test.js +++ b/test/unit/lib/plugins/aws/provider.test.js @@ -174,7 +174,7 @@ describe('AwsProvider', () => { .noCallThru() .load('../../../../../lib/plugins/aws/provider.js', { '../../aws/request': awsRequestStub, - '@serverless/utils/log': { + '../../utils/serverless-utils/log': { log: { debug: sinon.stub(), }, diff --git a/test/unit/lib/plugins/aws/utils/format-lambda-log-event.test.js b/test/unit/lib/plugins/aws/utils/format-lambda-log-event.test.js index d5b34197d4..ab23e27465 100644 --- a/test/unit/lib/plugins/aws/utils/format-lambda-log-event.test.js +++ b/test/unit/lib/plugins/aws/utils/format-lambda-log-event.test.js @@ -2,7 +2,7 @@ const expect = require('chai').expect; const dayjs = require('dayjs'); -const { style } = require('@serverless/utils/log'); +const { style } = require('../../../../../../lib/utils/serverless-utils/log'); const formatLambdaLogEvent = require('../../../../../../lib/plugins/aws/utils/format-lambda-log-event'); describe('#formatLambdaLogEvent()', () => { diff --git a/test/unit/lib/utils/download-template-from-repo.test.js b/test/unit/lib/utils/download-template-from-repo.test.js index 4a9808e28d..eb53f2f2fc 100644 --- a/test/unit/lib/utils/download-template-from-repo.test.js +++ b/test/unit/lib/utils/download-template-from-repo.test.js @@ -56,7 +56,7 @@ describe('downloadTemplateFromRepo', () => { throw Error('unknown server type'); }, - '@serverless/utils/download': downloadStub, + './serverless-utils/download': downloadStub, 'child-process-ext/spawn': spawnStub, } );