mirror of
https://github.com/placeholder-soft/libs.git
synced 2026-06-17 00:31:11 +08:00
feat: parse variable statement
This commit is contained in:
@@ -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();
|
||||
@@ -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",
|
||||
}
|
||||
`;
|
||||
@@ -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: ''",
|
||||
],
|
||||
},
|
||||
],
|
||||
}
|
||||
`;
|
||||
@@ -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);
|
||||
});
|
||||
|
||||
@@ -15,5 +15,5 @@ test('generate typeEnv call usage report', () => {
|
||||
sourceFilePath: kSourceFilePath,
|
||||
options: { tsConfigFilePath: kTsconfigPath },
|
||||
});
|
||||
expect(info.envNames[0]).toBe('bbb');
|
||||
expect(info).toMatchSnapshot();
|
||||
});
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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 = {
|
||||
|
||||
@@ -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) ||
|
||||
|
||||
Reference in New Issue
Block a user