Skip to content
This repository has been archived by the owner on Jul 25, 2018. It is now read-only.

Commit

Permalink
feat(path): no regression from npm-ramda
Browse files Browse the repository at this point in the history
  • Loading branch information
ikatyang committed Aug 6, 2017
1 parent c6ea915 commit c5ea9ed
Show file tree
Hide file tree
Showing 7 changed files with 82 additions and 4 deletions.
2 changes: 1 addition & 1 deletion snapshots/path.ts
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,5 @@ R_path(path, object);

// @dts-jest:pass -> any
R_path(['a', 'b', 'c'])(a_1_b_2_c_3);
// @dts-jest:pass -> any
// @dts-jest:pass -> 1 | 2 | 3
R_path(['a', 'b', 'c'], a_1_b_2_c_3);
2 changes: 1 addition & 1 deletion snapshots/ramda-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2127,7 +2127,7 @@ import * as R from '../ramda/dist/index';

// @dts-jest:group path
(() => {
// @dts-jest:pass -> any
// @dts-jest:pass -> number
R.path(['a', 'b'], { a: { b: 2 } }); //=> 2
// @dts-jest:pass -> any
R.path(['a', 'b'])({ a: { b: 2 } }); //=> 2
Expand Down
38 changes: 38 additions & 0 deletions tasks/mixins/path.d.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
// tslint:disable:prettier naming-convention

// in-based
declare function path<T1 extends string, T2 extends string, TResult>(path: [T1, T2], obj: {[K1 in T1]: {[K2 in T2]: TResult}}): TResult;
declare function path<T1 extends string, T2 extends string, T3 extends string, TResult>(path: [T1, T2, T3], obj: {[K1 in T1]: {[K2 in T2]: {[K3 in T3]: TResult}}}): TResult;
declare function path<T1 extends string, T2 extends string, T3 extends string, T4 extends string, TResult>(path: [T1, T2, T3, T4], obj: {[K1 in T1]: {[K2 in T2]: {[K3 in T3]: {[K4 in T4]: TResult}}}}): TResult;
declare function path<T1 extends string, T2 extends string, T3 extends string, T4 extends string, T5 extends string, TResult>(path: [T1, T2, T3, T4, T5], obj: {[K1 in T1]: {[K2 in T2]: {[K3 in T3]: {[K4 in T4]: {[K5 in T5]: TResult}}}}}): TResult;
declare function path<T1 extends string, T2 extends string, T3 extends string, T4 extends string, T5 extends string, T6 extends string, TResult>(path: [T1, T2, T3, T4, T5, T6], obj: {[K1 in T1]: {[K2 in T2]: {[K3 in T3]: {[K4 in T4]: {[K5 in T5]: {[K6 in T6]: TResult}}}}}}): TResult;
declare function path<T1 extends string, T2 extends string, T3 extends string, T4 extends string, T5 extends string, T6 extends string, T7 extends string, TResult>(path: [T1, T2, T3, T4, T5, T6, T7], obj: {[K1 in T1]: {[K2 in T2]: {[K3 in T3]: {[K4 in T4]: {[K5 in T5]: {[K6 in T6]: {[K7 in T7]: TResult}}}}}}}): TResult;
declare function path<T1 extends string, T2 extends string, T3 extends string, T4 extends string, T5 extends string, T6 extends string, T7 extends string, T8 extends string, TResult>(path: [T1, T2, T3, T4, T5, T6, T7, T8], obj: {[K1 in T1]: {[K2 in T2]: {[K3 in T3]: {[K4 in T4]: {[K5 in T5]: {[K6 in T6]: {[K7 in T7]: {[K8 in T8]: TResult}}}}}}}}): TResult;
declare function path<T1 extends string, T2 extends string, T3 extends string, T4 extends string, T5 extends string, T6 extends string, T7 extends string, T8 extends string, T9 extends string, TResult>(path: [T1, T2, T3, T4, T5, T6, T7, T8, T9], obj: {[K1 in T1]: {[K2 in T2]: {[K3 in T3]: {[K4 in T4]: {[K5 in T5]: {[K6 in T6]: {[K7 in T7]: {[K8 in T8]: {[K9 in T9]: TResult}}}}}}}}}): TResult;

// Record-based
declare function path<K1 extends string, K2 extends string, TResult>(path: [K1, K2], obj: Record<K1,Record<K2,TResult>>): TResult;
declare function path<K1 extends string, K2 extends string, K3 extends string, TResult>(path: [K1, K2, K3], obj: Record<K1,Record<K2,Record<K3,TResult>>>): TResult;
declare function path<K1 extends string, K2 extends string, K3 extends string, K4 extends string, TResult>(path: [K1, K2, K3, K4], obj: Record<K1,Record<K2,Record<K3,Record<K4,TResult>>>>): TResult;
declare function path<K1 extends string, K2 extends string, K3 extends string, K4 extends string, K5 extends string, TResult>(path: [K1, K2, K3, K4, K5], obj: Record<K1,Record<K2,Record<K3,Record<K4,Record<K5,TResult>>>>>): TResult;
declare function path<K1 extends string, K2 extends string, K3 extends string, K4 extends string, K5 extends string, K6 extends string, TResult>(path: [K1, K2, K3, K4, K5, K6], obj: Record<K1,Record<K2,Record<K3,Record<K4,Record<K5,Record<K6,TResult>>>>>>): TResult;
declare function path<K1 extends string, K2 extends string, K3 extends string, K4 extends string, K5 extends string, K6 extends string, K7 extends string, TResult>(path: [K1, K2, K3, K4, K5, K6, K7], obj: Record<K1,Record<K2,Record<K3,Record<K4,Record<K5,Record<K6,Record<K7,TResult>>>>>>>): TResult;
declare function path<K1 extends string, K2 extends string, K3 extends string, K4 extends string, K5 extends string, K6 extends string, K7 extends string, K8 extends string, TResult>(path: [K1, K2, K3, K4, K5, K6, K7, K8], obj: Record<K1,Record<K2,Record<K3,Record<K4,Record<K5,Record<K6,Record<K7,Record<K8,TResult>>>>>>>>): TResult;
declare function path<K1 extends string, K2 extends string, K3 extends string, K4 extends string, K5 extends string, K6 extends string, K7 extends string, K8 extends string, K9 extends string, TResult>(path: [K1, K2, K3, K4, K5, K6, K7, K8, K9], obj: Record<K1,Record<K2,Record<K3,Record<K4,Record<K5,Record<K6,Record<K7,Record<K8,Record<K9,TResult>>>>>>>>>): TResult;

// for each path length list all combinations of objects and homogeneous arrays... tuples not supported yet.

declare function path<T1 extends string, TResult>(path: [T1], obj: {[K1 in T1]: TResult}): TResult;
declare function path<T1 extends number, TResult>(path: [T1], obj: TResult[]): TResult;
declare function path<T1 extends string, T2 extends string, TResult>(path: [T1, T2], obj: {[K1 in T1]: {[K2 in T2]: TResult}}): TResult;
declare function path<T1 extends string, T2 extends number, TResult>(path: [T1, T2], obj: {[K1 in T1]: TResult[]}): TResult;
declare function path<T1 extends number, T2 extends string, TResult>(path: [T1, T2], obj: {[K2 in T2]: TResult}[]): TResult;
declare function path<T1 extends number, T2 extends number, TResult>(path: [T1, T2], obj: TResult[][]): TResult;
declare function path<T1 extends string, T2 extends string, T3 extends string, TResult>(path: [T1, T2, T3], obj: {[K1 in T1]: {[K2 in T2]: {[K3 in T3]: TResult}}}): TResult;
declare function path<T1 extends string, T2 extends string, T3 extends number, TResult>(path: [T1, T2, T3], obj: {[K1 in T1]: {[K2 in T2]: TResult[]}}): TResult;
declare function path<T1 extends string, T2 extends number, T3 extends string, TResult>(path: [T1, T2, T3], obj: {[K1 in T1]: {[K3 in T3]: TResult}[]}): TResult;
declare function path<T1 extends string, T2 extends number, T3 extends number, TResult>(path: [T1, T2, T3], obj: {[K1 in T1]: TResult[][]}): TResult;
declare function path<T1 extends number, T2 extends string, T3 extends string, TResult>(path: [T1, T2, T3], obj: {[K2 in T2]: {[K3 in T3]: TResult}}[]): TResult;
declare function path<T1 extends number, T2 extends string, T3 extends number, TResult>(path: [T1, T2, T3], obj: {[K2 in T2]: TResult[]}[]): TResult;
declare function path<T1 extends number, T2 extends number, T3 extends string, TResult>(path: [T1, T2, T3], obj: {[K3 in T3]: TResult}[][]): TResult;
declare function path<T1 extends number, T2 extends number, T3 extends number, TResult>(path: [T1, T2, T3], obj: TResult[][][]): TResult;
24 changes: 24 additions & 0 deletions tasks/utils/bind-mixin.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import * as dts from 'dts-element';

export const bind_mixin = (
members: dts.ITopLevelMember[],
function_types: dts.IFunctionType[],
) => {
const main_type_declaration = members.find(
dts.is_type_declaration,
) as dts.ITypeDeclaration;

const type = main_type_declaration.type as dts.IObjectType;
type.members!.splice(
1,
0,
...function_types.map(function_type =>
dts.create_object_member({
owned: dts.create_function_declaration({
name: undefined,
type: function_type,
}),
}),
),
);
};
16 changes: 16 additions & 0 deletions tasks/utils/generate-file-content.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
placeholder_name_abbr,
} from '../../templates/utils/constants';
import { bind_jsdoc } from './bind-jsdoc';
import { bind_mixin } from './bind-mixin';
import { placeholder, selectable } from './constants';

export function generate_file_content(filename: string) {
Expand Down Expand Up @@ -40,6 +41,21 @@ function get_top_level_members(filename: string): dts.ITopLevelMember[] {
bind_member_jsdoc_and_add_export_equal();
}

if (function_name === 'path') {
bind_mixin(
members,
dts
.parse(
fs.readFileSync(
path.resolve(__dirname, '../mixins/path.d.ts'),
'utf8',
),
)
.members.filter(dts.is_function_declaration)
.map(function_declaration => function_declaration.type!),
);
}

return members;

function bind_member_jsdoc_and_add_export_equal() {
Expand Down
2 changes: 1 addition & 1 deletion tests/__snapshots__/path.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

exports[`R_path(['a', 'b', 'c'])(a_1_b_2_c_3) 1`] = `"any"`;

exports[`R_path(['a', 'b', 'c'], a_1_b_2_c_3) 1`] = `"any"`;
exports[`R_path(['a', 'b', 'c'], a_1_b_2_c_3) 1`] = `"1 | 2 | 3"`;

exports[`R_path(path) 1`] = `"(object: {}) => any"`;

Expand Down
2 changes: 1 addition & 1 deletion tests/__snapshots__/ramda-tests.ts.snap
Original file line number Diff line number Diff line change
Expand Up @@ -995,7 +995,7 @@ exports[`partition R.partition(R.contains('s'), { a: 'sss', b: 'ttt', foo: 'bars
exports[`path R.path(['a', 'b'])({ a: { b: 2 } }) 1`] = `"any"`;
exports[`path R.path(['a', 'b'], { a: { b: 2 } }) 1`] = `"any"`;
exports[`path R.path(['a', 'b'], { a: { b: 2 } }) 1`] = `"number"`;
exports[`pathEq R.filter<User>(isFamous, users) 1`] = `"User[]"`;
Expand Down

0 comments on commit c5ea9ed

Please sign in to comment.