feat: parse variable statement

This commit is contained in:
loveyoubaby5120
2023-02-16 21:05:53 +08:00
parent fa70deb275
commit 0861dd721d
8 changed files with 301 additions and 34 deletions

View File

@@ -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();

View File

@@ -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",
}
`;

View File

@@ -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: ''",
],
},
],
}
`;

View File

@@ -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);
});

View File

@@ -15,5 +15,5 @@ test('generate typeEnv call usage report', () => {
sourceFilePath: kSourceFilePath,
options: { tsConfigFilePath: kTsconfigPath },
});
expect(info.envNames[0]).toBe('bbb');
expect(info).toMatchSnapshot();
});

View File

@@ -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;
}

View File

@@ -5,12 +5,14 @@ import {
ProjectOptions,
SourceFile,
ts,
VariableStatement,
} from 'ts-morph';
export type TSource =
| SourceFile
| Block
| ExpressionStatement
| VariableStatement
| CallExpression<ts.CallExpression>;
export type TParseParameters = {

View File

@@ -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) ||