Skip to content

Commit

Permalink
refactor: removed $options functionality
Browse files Browse the repository at this point in the history
BREAKING CHANGE: any $options code will no longer work
closes #80
  • Loading branch information
Jack Ellis authored and jackmellis committed Sep 25, 2020
1 parent 9939102 commit e357aaa
Show file tree
Hide file tree
Showing 9 changed files with 9 additions and 70 deletions.
2 changes: 2 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ Change Log
- you can now pass an `opts` parameter when registering a factory i.e. `.factory<A>(fn, { lifecycle: 'none' })`
- you can now pass an `opts` parameter when resolving i.e. `.resolve<A>({ optional: true })`
- `resolveWith` now has a nicer syntax for ts inference: `.resolveWith<Foo, Dep1, Dep2>([ 'val1', 'val2' ])`. The original syntax i.e. `.resolveWith({ dep1: 'val1' })` is still valid.
- removed the built-in dependency `$options`. You can no longer do `.resolve({ foo: 'someValue' })`

#### Breaking Changes
- if you attempt to resolve a global like `Window` without registering it first, rather than throw an error, you will now get the global variable
Expand All @@ -18,6 +19,7 @@ Change Log
- you can no longer mix ts and js modes i.e. you cannot do `.factory<A>([ 'b' ], fn)`
- `Lifecycle` is now a type rather than an enum
- wrapping a name in `__` will no longer make it optional, you must explicitly pass the optional flag
- `$options` functionality has been removed

### 3.5.1
- building with webpack was giving warnings about `require` being used which meant it couldn't make optimizations
Expand Down
37 changes: 1 addition & 36 deletions src/__tests__/resolve.test.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
/* eslint-disable no-invalid-this */
import anyTest, { TestInterface } from 'ava';
import fs from 'fs';
import base, { JpexInstance, Options } from '..';
import base, { JpexInstance } from '..';

const test: TestInterface<{
jpex: JpexInstance,
Expand Down Expand Up @@ -63,41 +63,6 @@ test('resolves named dependencies', (t) => {
t.is(result, 'pop');
});

test('resolves object dependencies', (t) => {
const { jpex } = t.context;

jpex.factory('A', [ '$options' ], ($options) => {
return $options;
});
jpex.factory('B', [{ A: 'abc' }], (a) => {
return a;
});
const result = jpex.resolve('B');

t.is(result, 'abc');
});

test('resolves object depndencies (inferred)', (t) => {
const { jpex } = t.context;

type A = string;
type B = string;
jpex.factory<A>(($options: Options<string>) => $options);
jpex.factory(
'B',
[
{
[jpex.infer<A>()]: 'abc',
},
],
(a: A) => a
);

const result = jpex.resolve('B');

t.is(result, 'abc');
});

test('throws if dependency does not exist', (t) => {
const { jpex } = t.context;

Expand Down
2 changes: 1 addition & 1 deletion src/built-ins/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ export default (jpex: JpexInstance) => {
this: JpexInstance,
$namedParameters: NamedParameters,
) {
return (name: Dependency | Dependency[], opts?: ResolveOpts) => {
return (name: Dependency, opts?: ResolveOpts) => {
return resolve(
this, // eslint-disable-line no-invalid-this
name,
Expand Down
2 changes: 0 additions & 2 deletions src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ import { resolve as registerResolveFactory } from './built-ins';
import type {
JpexInstance,
SetupConfig,
Options,
NamedParameters,
Resolve,
Lifecycle,
Expand All @@ -21,7 +20,6 @@ export type {
Lifecycle,
JpexInstance,
SetupConfig,
Options,
NamedParameters,
Resolve,
};
Expand Down
2 changes: 0 additions & 2 deletions src/resolver/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ export const resolve = (
jpex,
name,
void 0,
void 0,
opts,
[],
);
Expand All @@ -36,7 +35,6 @@ export const resolveDependencies = (
jpex,
definition,
void 0,
void 0,
opts,
[],
);
Expand Down
29 changes: 3 additions & 26 deletions src/resolver/resolve.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@ import {
JpexInstance,
Dependency,
Definition,
Options,
NamedParameters,
ResolveOpts,
} from '../types';
Expand All @@ -12,23 +11,16 @@ import {
} from './utils';
import {
hasOwn,
isObject,
getLast,
} from '../utils';

export const resolveOne = <R extends any>(
jpex: JpexInstance,
name: Dependency,
localOptions: any,
namedParameters: NamedParameters,
opts: ResolveOpts,
stack: string[],
): R => {
if (isObject(name)) {
console.warn('jpex: $options style has been deprecated and will be removed in v4.0.0');
const key = Object.keys(name)[0];
return resolveOne(jpex, key, name[key], namedParameters, opts, stack);
}
if (!namedParameters) {
namedParameters = opts?.with ?? {};
}
Expand All @@ -42,10 +34,6 @@ export const resolveOne = <R extends any>(

// Special keys
switch (name) {
case '$options':
case jpex.infer<Options>():
console.warn('jpex: $options style has been deprecated and will be removed in v4.0.0');
return localOptions;
case '$namedParameters':
case jpex.infer<NamedParameters>():
// @ts-ignore
Expand All @@ -58,7 +46,7 @@ export const resolveOne = <R extends any>(
if (stack.indexOf(name) > -1) {
if (getLast(stack) === name) {
if (jpex.$$parent?.$$factories[name]) {
return resolveOne(jpex.$$parent, name, localOptions, namedParameters, opts, []);
return resolveOne(jpex.$$parent, name, namedParameters, opts, []);
}
}
throw new Error(`Recursive loop for dependency ${name} encountered`);
Expand All @@ -83,7 +71,7 @@ export const resolveOne = <R extends any>(

if (factory.dependencies?.length) {
// eslint-disable-next-line no-use-before-define
args = resolveMany(jpex, factory, namedParameters, localOptions, opts, stack.concat(name));
args = resolveMany(jpex, factory, namedParameters, opts, stack.concat(name));
}

// Invoke the factory
Expand All @@ -98,7 +86,6 @@ export const resolveMany = <R extends any[]>(
jpex: JpexInstance,
definition: Definition,
namedParameters: { [key: string]: any },
globalOptions: any,
opts: ResolveOpts,
stack: string[],
): R => {
Expand All @@ -114,17 +101,7 @@ export const resolveMany = <R extends any[]>(
const dependencies: Dependency[] = [].concat(definition.dependencies);

const values = dependencies.reduce((value: Dependency[], dependency): Dependency[] => {
if (isObject(dependency)) {
console.warn('jpex: $options style has been deprecated and will be removed in v4.0.0');
const keys = Object.keys(dependency);
const x = keys.reduce((value, key) => {
const options = dependency[key];
const y = resolveOne(jpex, key, options, namedParameters, opts, stack);
return value.concat(y);
}, []);
return value.concat(x);
}
const x = resolveOne(jpex, dependency, globalOptions, namedParameters, opts, stack);
const x = resolveOne<any>(jpex, dependency, namedParameters, opts, stack);
return value.concat([ x ]);
}, [] as Dependency[]);

Expand Down
2 changes: 0 additions & 2 deletions src/types/BuiltIns.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,3 @@ export type Resolve = <T = any>(
name: Dependency | Dependency[],
opts?: ResolveOpts,
) => T;

export type Options<T = any> = T;
2 changes: 1 addition & 1 deletion src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ export interface SetupConfig {
globals?: boolean,
}

export type Dependency = string | { [key: string]: any };
export type Dependency = string;

export interface Definition {
dependencies?: Dependency[],
Expand Down
1 change: 1 addition & 0 deletions tsconfig.json
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
"emitDecoratorMetadata": true
},
"include": [
"src",
"@types"
]
}

0 comments on commit e357aaa

Please # to comment.