How can I access option value passed by serverless cli in serverless.ts?

While I using serverless framework using serverless.ts for setting, I got a question.

I can pass the value on serverless cli like this

serverless offline --stage prod

In serverless.yml, we can access this value by ${self:provider.stage} But I cannot access it on serverless.ts. Of course, I know it can replaced to constant variable and don't pass the value on cli. But I worder that I can never access passed value on serverless.ts. Is there any way???

Solution 1:

TL;DR: my workaround was to use the function exported in serverless/lib/utils/resolveCliInput.

I'm not sure if I understood you correctly, but if your question is how to access the values passed to serverless CLI from within serverless.(ts|js) then I have a workaround.

I had this problem and I couldn't find any solution for it after googling for some time, so I started to dig in the serverless source code. I've noticed this file serverless/lib/utils/resolveCliInput that exports a single function that resolves input arguments.

To be honest, I don't know whether we can rely on this function in future versions of the framework (I've tested with version 2.8.0), but here is a working code example:

import resolveCliInput from 'serverless/lib/utils/resolveCliInput';
const { commands, options } = resolveCliInput(process.argv.slice(2));
const stage = options.s ?? options.stage ?? 'dev';

Of course we can use some library for parsing process.argv such as commander or even parse the args in our code.