diff --git a/packages/typed-env-cli/src/lib/__fixtures__/assignment-typed-env.ts b/packages/typed-env-cli/src/lib/__fixtures__/assignment-typed-env.ts new file mode 100644 index 0000000..f7d2da9 --- /dev/null +++ b/packages/typed-env-cli/src/lib/__fixtures__/assignment-typed-env.ts @@ -0,0 +1,10 @@ +import { typedEnv } from '@placeholdersoft/typed-env'; + + +typedEnv('aaa').required().default('222').toString() +const aaa = typedEnv('eee').default('222').toString(); + +typedEnv('ccc') + .required() + .default('222') + .toString(); diff --git a/packages/typed-env-cli/src/lib/__tests__/__snapshots__/generate-env.test.ts.snap b/packages/typed-env-cli/src/lib/__tests__/__snapshots__/generate-env.test.ts.snap new file mode 100644 index 0000000..8b149fb --- /dev/null +++ b/packages/typed-env-cli/src/lib/__tests__/__snapshots__/generate-env.test.ts.snap @@ -0,0 +1,38 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`assignment generate env 1`] = ` +Array [ + "aaa=", + "ccc=", + "eee=", +] +`; + +exports[`assignment generate env name 1`] = ` +Object { + "aaa": "aaa", + "ccc": "ccc", + "eee": "eee", +} +`; + +exports[`call chaining generate env 1`] = ` +Array [ + "// default=['111','222','333']", + "bbb='111'", + "// default=['111','222','333']", + "ccc='111'", + "ddd=", + "// default=['']", + "eee=", +] +`; + +exports[`call chaining generate env name 1`] = ` +Object { + "bbb": "bbb", + "ccc": "ccc", + "ddd": "ddd", + "eee": "eee", +} +`; diff --git a/packages/typed-env-cli/src/lib/__tests__/__snapshots__/generate-typed-env-call-usage-report.test.ts.snap b/packages/typed-env-cli/src/lib/__tests__/__snapshots__/generate-typed-env-call-usage-report.test.ts.snap new file mode 100644 index 0000000..d4159c1 --- /dev/null +++ b/packages/typed-env-cli/src/lib/__tests__/__snapshots__/generate-typed-env-call-usage-report.test.ts.snap @@ -0,0 +1,169 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`generate typeEnv call usage report 1`] = ` +Object { + "data": Object { + "bbb": Object { + "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L3#S54": Object { + "default": "'111'", + "required": true, + "type": "number", + }, + "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L4#S109": Object { + "default": "'222'", + "required": true, + "type": "number", + }, + "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L5#S163": Object { + "default": "'333'", + "required": true, + "type": "number", + }, + "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L6#S217": Object { + "default": "'333'", + "required": true, + "type": "string", + }, + }, + "ccc": Object { + "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L10#S380": Object { + "default": "'333'", + "required": true, + "type": "number", + }, + "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L11#S434": Object { + "default": "'333'", + "required": true, + "type": "string", + }, + "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L8#S271": Object { + "default": "'111'", + "required": true, + "type": "number", + }, + "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L9#S326": Object { + "default": "'222'", + "required": true, + "type": "number", + }, + }, + "ddd": Object { + "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L13#S488": Object { + "required": false, + "type": "string", + }, + }, + "eee": Object { + "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L15#S506": Object { + "default": "''", + "required": false, + "type": "string", + }, + }, + }, + "envNames": Array [ + "bbb", + "ccc", + "ddd", + "eee", + ], + "exceptionReport": Array [ + Object { + "envKey": "bbb", + "errors": Array [ + "envKey: bbb has different types: number,string", + ], + "line": Array [ + Object { + "errors": undefined, + "path": "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L3#S54", + }, + Object { + "errors": undefined, + "path": "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L4#S109", + }, + Object { + "errors": undefined, + "path": "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L5#S163", + }, + Object { + "errors": undefined, + "path": "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L6#S217", + }, + ], + "types": Array [ + "number", + "string", + ], + "warnings": Array [ + "envKey: bbb has different default value: '111','222','333'", + ], + }, + Object { + "envKey": "ccc", + "errors": Array [ + "envKey: ccc has different types: number,string", + ], + "line": Array [ + Object { + "errors": undefined, + "path": "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L8#S271", + }, + Object { + "errors": undefined, + "path": "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L9#S326", + }, + Object { + "errors": undefined, + "path": "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L10#S380", + }, + Object { + "errors": undefined, + "path": "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L11#S434", + }, + ], + "types": Array [ + "number", + "string", + ], + "warnings": Array [ + "envKey: ccc has different default value: '111','222','333'", + ], + }, + Object { + "envKey": "ddd", + "errors": Array [ + "envKey: ddd has different types: string", + ], + "line": Array [ + Object { + "errors": undefined, + "path": "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L13#S488", + }, + ], + "types": Array [ + "string", + ], + "warnings": Array [], + }, + Object { + "envKey": "eee", + "errors": Array [ + "envKey: eee has different types: string", + ], + "line": Array [ + Object { + "errors": undefined, + "path": "/Users/pankai/projects/company/PlaceholderSoft/libs/packages/typed-env-cli/src/lib/__fixtures__/usage-typed-env.ts#L15#S506", + }, + ], + "types": Array [ + "string", + ], + "warnings": Array [ + "envKey: eee has different default value: ''", + ], + }, + ], +} +`; diff --git a/packages/typed-env-cli/src/lib/__tests__/generate-env.test.ts b/packages/typed-env-cli/src/lib/__tests__/generate-env.test.ts index fead524..c4cf4fe 100644 --- a/packages/typed-env-cli/src/lib/__tests__/generate-env.test.ts +++ b/packages/typed-env-cli/src/lib/__tests__/generate-env.test.ts @@ -1,32 +1,66 @@ -import { existsSync } from 'fs'; import path from 'path'; -import { generateEnv, generateEnvName } from '../generate-env'; +import { + generateEnvByTypedEnv, + generateEnvNameByTypedEnv, +} from '../generate-env'; -const kSourceFilePath = path.resolve( - __dirname, - '../__fixtures__/usage-typed-env.ts' -); -const kTsconfigPath = path.resolve( - __dirname, - '../__fixtures__/tsconfig.t.json' -); +describe('call chaining', () => { + const kSourceFilePath = path.resolve( + __dirname, + '../__fixtures__/usage-typed-env.ts' + ); + const kTsconfigPath = path.resolve( + __dirname, + '../__fixtures__/tsconfig.t.json' + ); -test('generate env name', () => { - const envNames = generateEnvName({ - sourceFilePath: kSourceFilePath, - options: { - tsConfigFilePath: kTsconfigPath, - }, + test('generate env name', () => { + const envNames = generateEnvNameByTypedEnv({ + sourceFilePath: kSourceFilePath, + options: { + tsConfigFilePath: kTsconfigPath, + }, + }); + expect(envNames).toMatchSnapshot(); + }); + + test('generate env', () => { + const env = generateEnvByTypedEnv({ + sourceFilePath: kSourceFilePath, + options: { + tsConfigFilePath: kTsconfigPath, + }, + }); + expect(env).toMatchSnapshot(); }); - console.log(envNames); }); -test('generate env', () => { - const env = generateEnv({ - sourceFilePath: kSourceFilePath, - options: { - tsConfigFilePath: kTsconfigPath, - }, +describe('assignment', () => { + const kSourceFilePath = path.resolve( + __dirname, + '../__fixtures__/assignment-typed-env.ts' + ); + const kTsconfigPath = path.resolve( + __dirname, + '../__fixtures__/tsconfig.t.json' + ); + test('generate env name', () => { + const envNames = generateEnvNameByTypedEnv({ + sourceFilePath: kSourceFilePath, + options: { + tsConfigFilePath: kTsconfigPath, + }, + }); + expect(envNames).toMatchSnapshot(); + }); + + test('generate env', () => { + const env = generateEnvByTypedEnv({ + sourceFilePath: kSourceFilePath, + options: { + tsConfigFilePath: kTsconfigPath, + }, + }); + expect(env).toMatchSnapshot(); }); - console.log(env); }); diff --git a/packages/typed-env-cli/src/lib/__tests__/generate-typed-env-call-usage-report.test.ts b/packages/typed-env-cli/src/lib/__tests__/generate-typed-env-call-usage-report.test.ts index be90358..4a0673b 100644 --- a/packages/typed-env-cli/src/lib/__tests__/generate-typed-env-call-usage-report.test.ts +++ b/packages/typed-env-cli/src/lib/__tests__/generate-typed-env-call-usage-report.test.ts @@ -15,5 +15,5 @@ test('generate typeEnv call usage report', () => { sourceFilePath: kSourceFilePath, options: { tsConfigFilePath: kTsconfigPath }, }); - expect(info.envNames[0]).toBe('bbb'); + expect(info).toMatchSnapshot(); }); diff --git a/packages/typed-env-cli/src/lib/function-call/get-args/statement.ts b/packages/typed-env-cli/src/lib/function-call/get-args/statement.ts index 971eb4c..7c3fe72 100644 --- a/packages/typed-env-cli/src/lib/function-call/get-args/statement.ts +++ b/packages/typed-env-cli/src/lib/function-call/get-args/statement.ts @@ -23,5 +23,19 @@ export function getCallUsageArgsFromStatement( result && argsInfo.push(result); } + const variableStatements = source.getDescendantsOfKind( + SyntaxKind.VariableStatement + ); + + for (const es of variableStatements) { + const result = getArgsFromCall({ + source: es, + filePath, + chainCallFuncNames, + }); + + result && argsInfo.push(result); + } + return argsInfo; } diff --git a/packages/typed-env-cli/src/lib/function-call/types.ts b/packages/typed-env-cli/src/lib/function-call/types.ts index 66cbc11..0d36d70 100644 --- a/packages/typed-env-cli/src/lib/function-call/types.ts +++ b/packages/typed-env-cli/src/lib/function-call/types.ts @@ -5,12 +5,14 @@ import { ProjectOptions, SourceFile, ts, + VariableStatement, } from 'ts-morph'; export type TSource = | SourceFile | Block | ExpressionStatement + | VariableStatement | CallExpression; export type TParseParameters = { diff --git a/packages/typed-env-cli/src/lib/generate-typed-env-call-usage-report.ts b/packages/typed-env-cli/src/lib/generate-typed-env-call-usage-report.ts index 49f867d..32f022f 100644 --- a/packages/typed-env-cli/src/lib/generate-typed-env-call-usage-report.ts +++ b/packages/typed-env-cli/src/lib/generate-typed-env-call-usage-report.ts @@ -11,7 +11,7 @@ type TResult = { }; type TFunCallArg = { - [secretKey in string]: { [path in string]: TResult }; + [envKey in string]: { [path in string]: TResult }; }; export type Report = { sourceFilePath: string; options?: ProjectOptions }; @@ -64,7 +64,7 @@ const exceptionReport = (data: TFunCallArg) => { ); if (types.length > 0) { - errors.push(`secretKey: ${r} has different types: ${types.join(',')}`); + errors.push(`envKey: ${r} has different types: ${types.join(',')}`); } const defaultValue = uniqBy( @@ -74,7 +74,7 @@ const exceptionReport = (data: TFunCallArg) => { if (defaultValue.length > 0) { warnings.push( - `secretKey: ${r} has different default value: ${defaultValue.join( + `envKey: ${r} has different default value: ${defaultValue.join( ',' )}` ); @@ -92,7 +92,7 @@ const exceptionReport = (data: TFunCallArg) => { } return { - secretKey: r, + envKey: r, types, line, errors, @@ -113,7 +113,7 @@ const parseEnvInfo = (result: TParseParameters[][]) => { return acc; } - const secret = acc[value.secretKey]; + const secret = acc[value.envKey]; if (secret) { if (secret[value.path] == null) { @@ -124,7 +124,7 @@ const parseEnvInfo = (result: TParseParameters[][]) => { }; } } else { - acc[value.secretKey] = { + acc[value.envKey] = { [value.path]: { required: value.required, type: value.type, @@ -157,14 +157,14 @@ const parseCallChaining = (args: TParseParameters[]) => { ["''", '""'].includes(typeEnvInfo.args[0]) ) { // console.warn( - // `not support secretKey is not \"\" or '' in ${typeEnvInfo.path}` + // `not support envKey is not \"\" or '' in ${typeEnvInfo.path}` // ); return; } // Remove the front and back quotation marks of the string - const secretKey: string = typeEnvInfo.args[0].substring( + const envKey: string = typeEnvInfo.args[0].substring( 1, typeEnvInfo.args[0].length - 1 ); @@ -201,7 +201,7 @@ const parseCallChaining = (args: TParseParameters[]) => { } return { - secretKey, + envKey, path: typeEnvInfo.path, required: (optionalInfoIndex === -1 && requiredInfoIndex !== -1) ||