Skip to content

Commit

Permalink
refactor: remove getters (#20)
Browse files Browse the repository at this point in the history
  • Loading branch information
privatenumber committed Nov 1, 2022
1 parent c9d57ad commit 584bc5d
Show file tree
Hide file tree
Showing 2 changed files with 58 additions and 40 deletions.
9 changes: 5 additions & 4 deletions src/type-flag.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,10 +4,11 @@ import type {
TypeFlag,
} from './types';
import {
hasOwn,
createRegistry,
normalizeBoolean,
applyParser,
hasOwn,
finalizeFlags,
} from './utils';
import {
argvIterator,
Expand Down Expand Up @@ -42,15 +43,15 @@ export const typeFlag = <Schemas extends Flags>(
} = {},
) => {
const { ignoreUnknown } = options;
const [flagRegistry, flags] = createRegistry(schemas);
const flagRegistry = createRegistry(schemas);
const unknownFlags: ParsedFlags['unknownFlags'] = {};
const _ = [] as unknown as ParsedFlags['_'];
_[DOUBLE_DASH] = [];

argvIterator(argv, {
onFlag(name, explicitValue, index) {
if (hasOwn(flagRegistry, name)) {
const [parser, values] = flagRegistry[name];
const [values, parser] = flagRegistry[name];
const flagValue = normalizeBoolean(parser, explicitValue);
const getFollowingValue = (value?: string | boolean) => {
values.push(
Expand Down Expand Up @@ -87,7 +88,7 @@ export const typeFlag = <Schemas extends Flags>(

type Result = TypeFlag<Schemas>;
return {
flags,
flags: finalizeFlags(schemas, flagRegistry),
unknownFlags,
_,
} as {
Expand Down
89 changes: 53 additions & 36 deletions src/utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,15 +61,6 @@ export const applyParser = (
return typeFunction(value);
};

type FlagParsingData = [
parser: TypeFunction,
values: unknown[],
];

type FlagRegistry = {
[flagName: string]: FlagParsingData;
};

const reservedCharactersPattern = /[\s.:=]/;

const validateFlagName = (
Expand All @@ -91,18 +82,31 @@ const validateFlagName = (
}
};

type FlagParsingData = [
values: unknown[],
parser: TypeFunction,
isArray: boolean,
schema: FlagTypeOrSchema,
];

type FlagRegistry = {
[flagName: string]: FlagParsingData;
};

export const createRegistry = (
schemas: Flags,
) => {
const registry: FlagRegistry = {};
const flags: Record<string, unknown> = {};

const setFlag = (name: string, value: any) => {
if (hasOwn(registry, name)) {
throw new Error(`Duplicate flags named ${stringify(name)}`);
const setFlag = (
flagName: string,
data: FlagParsingData,
) => {
if (hasOwn(registry, flagName)) {
throw new Error(`Duplicate flags named ${stringify(flagName)}`);
}

registry[name] = value;
registry[flagName] = data;
};

for (const flagName in schemas) {
Expand All @@ -112,27 +116,11 @@ export const createRegistry = (
validateFlagName(flagName);

const schema = schemas[flagName];
const [parser, isArray] = parseFlagType(schema);
const values: unknown[] = [];
const flagData = [parser, values];

Object.defineProperty(flags, flagName, {
enumerable: true,
get() {
if (
values.length === 0
&& 'default' in schema
) {
let { default: defaultValue } = schema;
if (typeof defaultValue === 'function') {
defaultValue = defaultValue();
}
return defaultValue;
}

return isArray ? values : values.pop();
},
});
const flagData: FlagParsingData = [
[],
...parseFlagType(schema),
schema,
];

setFlag(flagName, flagData);

Expand All @@ -157,5 +145,34 @@ export const createRegistry = (
}
}

return [registry, flags] as const;
return registry;
};

export const finalizeFlags = (
schemas: Flags,
registry: FlagRegistry,
) => {
const flags: Record<string, unknown> = {};

for (const flagName in schemas) {
if (!hasOwn(schemas, flagName)) {
continue;
}

const [values, , isArray, schema] = registry[flagName];
if (
values.length === 0
&& 'default' in schema
) {
let { default: defaultValue } = schema;
if (typeof defaultValue === 'function') {
defaultValue = defaultValue();
}
flags[flagName] = defaultValue;
} else {
flags[flagName] = isArray ? values : values.pop();
}
}

return flags;
};

0 comments on commit 584bc5d

Please sign in to comment.