From a0f1b0ea9c159de9bf8aa605ff006d7bba7cb099 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 23 Mar 2020 00:24:02 -0400 Subject: [PATCH 01/16] Make Form._lines public and remove the accessor. --- src/core/Form.test.ts | 18 +++++++++--------- src/core/Form.ts | 14 +++++--------- src/core/Line.test.ts | 28 ++++++++++++++-------------- src/core/TaxReturn.test.ts | 10 +++++----- src/core/Trace.test.ts | 4 ++-- src/fed2019/Form1040.ts | 8 ++++---- src/fed2019/Form1099B.ts | 4 ++-- src/fed2019/Form1099DIV.ts | 4 ++-- src/fed2019/Form1099INT.ts | 4 ++-- src/fed2019/Form1099R.ts | 4 ++-- src/fed2019/Form1116.ts | 4 ++-- src/fed2019/Form8606.ts | 4 ++-- src/fed2019/Form8949.ts | 4 ++-- src/fed2019/Form8959.ts | 4 ++-- src/fed2019/Form8960.ts | 4 ++-- src/fed2019/Form8995.ts | 4 ++-- src/fed2019/Schedule1.ts | 8 ++++---- src/fed2019/Schedule2.ts | 4 ++-- src/fed2019/Schedule3.ts | 4 ++-- src/fed2019/ScheduleD.ts | 8 ++++---- src/fed2019/W2.ts | 4 ++-- 21 files changed, 73 insertions(+), 77 deletions(-) diff --git a/src/core/Form.test.ts b/src/core/Form.test.ts index 41677fd..8098759 100644 --- a/src/core/Form.test.ts +++ b/src/core/Form.test.ts @@ -16,10 +16,10 @@ class TestTaxReturn extends TaxReturn { test('add and get line', () => { const l = new ComputedLine(() => 42); - class TestForm extends Form { + class TestForm extends Form { readonly name = 'Test Form'; - protected readonly _lines = { '1': l }; + readonly lines = { '1': l }; }; const f = new TestForm(); @@ -27,9 +27,9 @@ test('add and get line', () => { }); test('get non-existent line', () => { - class TestForm extends Form { + class TestForm extends Form { readonly name = 'Test'; - protected readonly _lines = {}; + readonly lines = {}; }; const f = new TestForm(); @@ -48,7 +48,7 @@ test('input', () => { class TestForm extends Form { readonly name = '1040'; - protected readonly _lines = null; + readonly lines = null; }; const f = new TestForm({ filingStatus: 'S', money: 100.0 }); @@ -56,10 +56,10 @@ test('input', () => { }); test('get value', () => { - class TestForm extends Form { + class TestForm extends Form { readonly name = 'Form'; - protected readonly _lines = { + readonly lines = { line: new ComputedLine(() => 42), }; }; @@ -80,11 +80,11 @@ test('get value', () => { test('form types', () => { class FormA extends Form { readonly name = 'A'; - protected readonly _lines = {}; + readonly lines = {}; }; class FormB extends Form { readonly name = 'B'; - protected readonly _lines = {}; + readonly lines = {}; }; expect(isFormT(new FormA(), FormA)).toBe(true); diff --git a/src/core/Form.ts b/src/core/Form.ts index b8c16e8..c713f17 100644 --- a/src/core/Form.ts +++ b/src/core/Form.ts @@ -13,23 +13,19 @@ export default abstract class Form }, I = unknown> { abstract readonly name: string; - protected abstract readonly _lines: L; + abstract readonly lines: L; readonly supportsMultipleCopies: boolean = false; private readonly _input?: I; - // Avoid using this; prefer the getLine() helpers declared below. This - // is only exposed for propagating line type information. - get lines(): L { return this._lines; } - constructor(input?: I) { this._input = input; } init() { - for (const id in this._lines) { - let l = this._lines[id]; + for (const id in this.lines) { + let l = this.lines[id]; l._id = id; l.form = this; } @@ -40,9 +36,9 @@ export default abstract class Form }, } getLine(id: K): L[K] { - if (!(id in this._lines)) + if (!(id in this.lines)) throw new NotFoundError(`Form ${this.name} does not have line ${id}`); - return this._lines[id]; + return this.lines[id]; } getValue(tr: TaxReturn, id: K): ReturnType { diff --git a/src/core/Line.test.ts b/src/core/Line.test.ts index 98b4171..27ec6a3 100644 --- a/src/core/Line.test.ts +++ b/src/core/Line.test.ts @@ -39,9 +39,9 @@ test('computed line', () => { }); test('reference line', () => { - class TestForm extends Form { + class TestForm extends Form { readonly name = 'Form 1'; - protected readonly _lines = { + readonly lines = { '6b': new ConstantLine(12.34), 's': new ConstantLine('abc'), }; @@ -65,15 +65,15 @@ test('reference line', () => { }); test('self reference line', () => { - class OtherForm extends Form { + class OtherForm extends Form { readonly name = 'Form A'; - protected readonly _lines = { + readonly lines = { '6c': new ConstantLine(55) }; }; - class TestForm extends Form { + class TestForm extends Form { readonly name = 'Form 1'; - protected readonly _lines = { + readonly lines = { 'a': new ConstantLine(100.2), 'b': new ReferenceLine(OtherForm, '6c'), 'c': new ReferenceLine((TestForm as unknown) as FormClass>, 'b'), @@ -97,9 +97,9 @@ test('input line', () => { key: string; key2?: string; } - class TestForm extends Form { + class TestForm extends Form { readonly name = 'F1'; - protected readonly _lines = { + readonly lines = { '1': new InputLine('key'), '2': new InputLine('key2'), '3': new InputLine('key2', undefined, 'FALLBACK') @@ -119,16 +119,16 @@ test('input line', () => { }); test('line stack', () => { - class FormZ extends Form { + class FormZ extends Form { readonly name = 'Z'; - protected readonly _lines = { + readonly lines = { '3': new InputLine('input') } }; - class FormZ2 extends Form { + class FormZ2 extends Form { readonly name = 'Z-2'; - protected readonly _lines = { + readonly lines = { '2c': new ComputedLine((tr: TaxReturn): any => { return tr.getForm(FormZ).getLine('3').value(tr) * 0.2; }) @@ -144,10 +144,10 @@ test('line stack', () => { }); test('accumulator line', () => { - class TestForm extends Form { + class TestForm extends Form { readonly name = 'Form B'; readonly supportsMultipleCopies = true; - protected readonly _lines = { + readonly lines = { g: new ConstantLine(100.25) }; }; diff --git a/src/core/TaxReturn.test.ts b/src/core/TaxReturn.test.ts index 497a8b4..4da4fcb 100644 --- a/src/core/TaxReturn.test.ts +++ b/src/core/TaxReturn.test.ts @@ -61,7 +61,7 @@ test('get non-existent person', () => { test('single-copy forms', () => { class TestForm extends Form { readonly name = 'Test Form'; - protected readonly _lines = null; + readonly lines = null; }; const tr = new TestTaxReturn(); @@ -76,7 +76,7 @@ test('multiple-copy forms', () => { class TestForm extends Form { readonly name = 'Test Form'; readonly supportsMultipleCopies = true; - protected readonly _lines = null; + readonly lines = null; }; const tr = new TestTaxReturn(); @@ -99,7 +99,7 @@ test('multiple-copy forms', () => { test('get non-existent form', () => { class TestForm extends Form { readonly name = 'Test Form'; - protected readonly _lines = null; + readonly lines = null; } const tr = new TestTaxReturn(); expect(() => tr.getForm(TestForm)).toThrow(NotFoundError); @@ -107,14 +107,14 @@ test('get non-existent form', () => { expect(tr.findForms(TestForm)).toEqual([]); }); -class PerPersonForm extends Form { +class PerPersonForm extends Form { private _person?: Person; readonly name = 'Per Person'; readonly supportsMultipleCopies = true; - protected readonly _lines = {}; + readonly lines = {}; constructor(person?: Person) { super(undefined); diff --git a/src/core/Trace.test.ts b/src/core/Trace.test.ts index 3f49fde..1bdf55b 100644 --- a/src/core/Trace.test.ts +++ b/src/core/Trace.test.ts @@ -19,10 +19,10 @@ interface Input { value: number; }; -class TestForm extends Form { +class TestForm extends Form { readonly name = 'TF'; - readonly _lines = { + readonly lines = { 'i1': new InputLine('name'), 'i2': new InputLine('value'), 'c1': new ComputedLine((tr): string => { diff --git a/src/fed2019/Form1040.ts b/src/fed2019/Form1040.ts index ab6f59e..584a823 100644 --- a/src/fed2019/Form1040.ts +++ b/src/fed2019/Form1040.ts @@ -30,10 +30,10 @@ export interface Form1040Input { filingStatus: FilingStatus; }; -export default class Form1040 extends Form { +export default class Form1040 extends Form { readonly name = '1040'; - protected readonly _lines = { + readonly lines = { '1': new AccumulatorLine(W2, '1', 'Wages, salaries, tips, etc.'), '2a': new ComputedLine((tr): number => { const value = (new AccumulatorLine(Form1099INT, '8')).value(tr) + @@ -247,10 +247,10 @@ export function computeTax(income: number, filingStatus: FilingStatus): number { return ((income - bracketStart) * bracket[1]) + bracket[2]; }; -export class QDCGTaxWorksheet extends Form { +export class QDCGTaxWorksheet extends Form { readonly name = 'QDCG Tax Worksheet'; - protected readonly _lines = { + readonly lines = { '1': new ReferenceLine(Form1040, '11b', 'Taxable income'), '2': new ReferenceLine(Form1040, '3a', 'Qualified dividends'), '3': new ComputedLine((tr): number => { diff --git a/src/fed2019/Form1099B.ts b/src/fed2019/Form1099B.ts index 816cfef..67a41a3 100644 --- a/src/fed2019/Form1099B.ts +++ b/src/fed2019/Form1099B.ts @@ -36,14 +36,14 @@ export interface Form1099BInput { class Input extends InputLine {}; -export default class Form1099B extends Form { +export default class Form1099B extends Form { readonly name = '1099-B'; readonly supportsMultipleCopies = true; person() { return this.getInput('payee'); } - protected readonly _lines = { + readonly lines = { 'payer': new Input('payer'), 'recipient': new Input('payee'), 'shortTermBasisReported': new Input('shortTermBasisReported'), diff --git a/src/fed2019/Form1099DIV.ts b/src/fed2019/Form1099DIV.ts index f9561a1..dc00476 100644 --- a/src/fed2019/Form1099DIV.ts +++ b/src/fed2019/Form1099DIV.ts @@ -29,14 +29,14 @@ export interface Form1099DIVInput { class Input extends InputLine {}; -export default class Form1099DIV extends Form { +export default class Form1099DIV extends Form { readonly name = '1099-DIV'; readonly supportsMultipleCopies = true; person() { return this.getInput('payee'); } - protected readonly _lines = { + readonly lines = { 'payer': new Input('payer'), 'recipient': new Input('payee'), '1a': new Input('ordinaryDividends', undefined, 0), diff --git a/src/fed2019/Form1099INT.ts b/src/fed2019/Form1099INT.ts index e339031..adf4823 100644 --- a/src/fed2019/Form1099INT.ts +++ b/src/fed2019/Form1099INT.ts @@ -26,14 +26,14 @@ export interface Form1099INTInput { class Input extends InputLine {}; -export default class Form1099INT extends Form { +export default class Form1099INT extends Form { readonly name = '1099-INT'; readonly supportsMultipleCopies = true; person() { return this.getInput('payee'); } - protected readonly _lines = { + readonly lines = { 'payer': new Input('payer'), 'recipient': new Input('payee'), '1': new Input('interest'), diff --git a/src/fed2019/Form1099R.ts b/src/fed2019/Form1099R.ts index c30bb5a..744741a 100644 --- a/src/fed2019/Form1099R.ts +++ b/src/fed2019/Form1099R.ts @@ -54,14 +54,14 @@ export interface Form1099RInput { class Input extends InputLine {}; -export default class Form1099R extends Form { +export default class Form1099R extends Form { readonly name = '1099-R'; readonly supportsMultipleCopies = true; person() { return this.getInput('payee'); } - protected readonly _lines = { + readonly lines = { 'payer': new Input('payer'), 'recipeint': new Input('payee'), '1': new Input('grossDistribution'), diff --git a/src/fed2019/Form1116.ts b/src/fed2019/Form1116.ts index 0b9253f..bbec8fb 100644 --- a/src/fed2019/Form1116.ts +++ b/src/fed2019/Form1116.ts @@ -34,10 +34,10 @@ export interface Form1116Input { class Input extends InputLine {}; -export default class Form1116 extends Form { +export default class Form1116 extends Form { readonly name = '1116'; - protected readonly _lines = { + readonly lines = { 'category': new ComputedLine((tr: TaxReturn): ForeignIncomeCategory => { const input = this.getInput('incomeCategory'); if (input != ForeignIncomeCategory.C) diff --git a/src/fed2019/Form8606.ts b/src/fed2019/Form8606.ts index 4ce135a..38c9fe9 100644 --- a/src/fed2019/Form8606.ts +++ b/src/fed2019/Form8606.ts @@ -20,14 +20,14 @@ export interface Form8606Input { class Input extends InputLine {}; -export default class Form8606 extends Form { +export default class Form8606 extends Form { readonly name = '8606'; readonly supportsMultipleCopies = true; person() { return this.getInput('person'); } - protected readonly _lines = { + readonly lines = { 'person': new Input('person'), // Part 1 diff --git a/src/fed2019/Form8949.ts b/src/fed2019/Form8949.ts index 814d4e7..51bd291 100644 --- a/src/fed2019/Form8949.ts +++ b/src/fed2019/Form8949.ts @@ -76,12 +76,12 @@ class Form8949Line extends Line { } }; -export default class Form8949 extends Form { +export default class Form8949 extends Form { readonly name = '8949'; readonly supportsMultipleCopies = true; - protected readonly _lines = { + readonly lines = { 'boxA': new Form8949Line(Form8949Box.A), 'boxB': new Form8949Line(Form8949Box.B), 'boxC': new Form8949Line(Form8949Box.C), diff --git a/src/fed2019/Form8959.ts b/src/fed2019/Form8959.ts index 83b439b..844261f 100644 --- a/src/fed2019/Form8959.ts +++ b/src/fed2019/Form8959.ts @@ -10,10 +10,10 @@ import { clampToZero } from '../core/Math'; import Form1040, { FilingStatus } from './Form1040'; import W2 from './W2'; -export default class Form8959 extends Form { +export default class Form8959 extends Form { readonly name = '8959'; - protected readonly _lines = { + readonly lines = { '1': new AccumulatorLine(W2, '5', 'Medicare wages'), // 2 is not supported (Unreported tips from Form 4137) // 3 is not supported (Wages from Form 8919) diff --git a/src/fed2019/Form8960.ts b/src/fed2019/Form8960.ts index 46f45a8..a871e82 100644 --- a/src/fed2019/Form8960.ts +++ b/src/fed2019/Form8960.ts @@ -10,10 +10,10 @@ import { clampToZero, undefinedToZero } from '../core/Math'; import Form1040, { FilingStatus } from './Form1040'; import Schedule1 from './Schedule1'; -export default class Form8960 extends Form { +export default class Form8960 extends Form { readonly name = '8960'; - protected readonly _lines = { + readonly lines = { // Part 1 // Section 6013 elections not supported. '1': new ReferenceLine(Form1040, '2b', 'Taxable interest'), diff --git a/src/fed2019/Form8995.ts b/src/fed2019/Form8995.ts index ad94894..677f9e2 100644 --- a/src/fed2019/Form8995.ts +++ b/src/fed2019/Form8995.ts @@ -18,11 +18,11 @@ export interface Form8995REITInput { // Dividends from REITs get preferential tax treatment, but the form used to // calculate that differs based off taxable income amounts. But the QBI // computation for RETIs is the same. This just models the REIT portion. -export default class Form8995REIT extends Form { +export default class Form8995REIT extends Form { readonly name = '8995 REIT'; // This uses line numbers from 8995-A. - protected readonly _lines = { + readonly lines = { // 1-26 not supported '27': new ComputedLine(() => 0, 'Total qualified business income component'), // Not supported. '28': new AccumulatorLine(Form1099DIV, '5', 'Qualified REIT dividends'), diff --git a/src/fed2019/Schedule1.ts b/src/fed2019/Schedule1.ts index 7cea3e8..ef6707c 100644 --- a/src/fed2019/Schedule1.ts +++ b/src/fed2019/Schedule1.ts @@ -58,10 +58,10 @@ class Input extends InputLine } }; -export default class Schedule1 extends Form { +export default class Schedule1 extends Form { readonly name = 'Schedule 1'; - readonly _lines = { + readonly lines = { // Part 1 '1': new ComputedLine((tr): number => { if (this.hasInput('stateAndLocalTaxableRefunds')) @@ -150,10 +150,10 @@ export interface SALTWorksheetInput { prevYearFilingStatus?: FilingStatus; }; -export class SALTWorksheet extends Form { +export class SALTWorksheet extends Form { readonly name = 'SALT Refund Worksheet'; - protected readonly _lines = { + readonly lines = { '1': new ComputedLine((tr): number => { const refunds = tr.findForm(Schedule1).getInput('stateAndLocalTaxableRefunds'); const prevYear = this.getInput('prevYearSalt'); diff --git a/src/fed2019/Schedule2.ts b/src/fed2019/Schedule2.ts index 3ea8c8f..eb9899c 100644 --- a/src/fed2019/Schedule2.ts +++ b/src/fed2019/Schedule2.ts @@ -13,10 +13,10 @@ import Form1099INT from './Form1099INT'; import Form8959 from './Form8959'; import Form8960 from './Form8960'; -export default class Schedule2 extends Form { +export default class Schedule2 extends Form { readonly name = 'Schedule 2'; - protected readonly _lines = { + readonly lines = { '1': new ComputedLine((tr): number => { // TODO - this is just using Taxable Income, rather than AMT-limited // income diff --git a/src/fed2019/Schedule3.ts b/src/fed2019/Schedule3.ts index d683560..98da58c 100644 --- a/src/fed2019/Schedule3.ts +++ b/src/fed2019/Schedule3.ts @@ -17,10 +17,10 @@ export interface Schedule3Input { estimatedTaxPayments?: number; }; -export default class Schedule3 extends Form { +export default class Schedule3 extends Form { readonly name = 'Schedule 3'; - readonly _lines = { + readonly lines = { // Part 1 '1': new ComputedLine((tr): number => { const f1040 = tr.getForm(Form1040); diff --git a/src/fed2019/ScheduleD.ts b/src/fed2019/ScheduleD.ts index 17fd11a..08264c1 100644 --- a/src/fed2019/ScheduleD.ts +++ b/src/fed2019/ScheduleD.ts @@ -12,10 +12,10 @@ import Form8949, { Form8949Box } from './Form8949'; import Form1099DIV from './Form1099DIV'; import Form1040, { FilingStatus, QDCGTaxWorksheet, computeTax } from './Form1040'; -export default class ScheduleD extends Form { +export default class ScheduleD extends Form { readonly name = 'Schedule D'; - protected readonly _lines = { + readonly lines = { // 1a not supported (Totals for all short-term transactions reported on Form 1099-B for which basis was reported to the IRS and for which you have no adjustments) // 4 is not supported (Short-term gain from Form 6252 and short-term gain or (loss) from Forms 4684, 6781, and 8824) // 5 is not supported (Net short-term gain or (loss) from partnerships, S corporations, estates, and trusts from Schedule(s) K-1) @@ -89,10 +89,10 @@ export default class ScheduleD extends Form { }; }; -export class ScheduleDTaxWorksheet extends Form { +export class ScheduleDTaxWorksheet extends Form { readonly name = 'Schedule D Tax Worksheet'; - protected readonly _lines = { + readonly lines = { '1': new ReferenceLine(Form1040, '11b'), '2': new ReferenceLine(Form1040, '3a'), // TODO 3 - form 4952 diff --git a/src/fed2019/W2.ts b/src/fed2019/W2.ts index 2bac4d4..a0f7fff 100644 --- a/src/fed2019/W2.ts +++ b/src/fed2019/W2.ts @@ -37,7 +37,7 @@ export interface W2Input { class Input extends InputLine {}; -export default class W2 extends Form { +export default class W2 extends Form { readonly name = 'W-2'; readonly supportsMultipleCopies = true; @@ -46,7 +46,7 @@ export default class W2 extends Form { return this.getInput('employee'); } - protected readonly _lines = { + readonly lines = { 'c': new Input('employer', 'Employer name'), 'e': new Input('employee', 'Emplyee name'), '1': new Input('wages', 'Wages, tips, other compensation'), -- 2.22.5 From 2d99360a5d6795217dbc5339fcb536579ee7fe1c Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 23 Mar 2020 01:36:29 -0400 Subject: [PATCH 02/16] Add UnsupportedLine, to formalize a comment convention that exists in fed2019. Also adds sumFormLines() to simplify a common operation. --- src/core/Line.ts | 19 +++++++++++++ src/fed2019/Form1040.ts | 45 +++++++++++++++---------------- src/fed2019/Form1116.ts | 32 +++++++++++----------- src/fed2019/Form8606.ts | 5 ++-- src/fed2019/Form8959.ts | 14 +++++----- src/fed2019/Form8960.ts | 29 ++++++++------------ src/fed2019/Form8995.ts | 6 ++--- src/fed2019/Schedule2.ts | 20 +++++++------- src/fed2019/Schedule3.ts | 36 ++++++++++++------------- src/fed2019/ScheduleD.ts | 58 +++++++++++++++++----------------------- 10 files changed, 128 insertions(+), 136 deletions(-) diff --git a/src/core/Line.ts b/src/core/Line.ts index 300192c..8995bee 100644 --- a/src/core/Line.ts +++ b/src/core/Line.ts @@ -122,8 +122,27 @@ export class AccumulatorLine, } }; +export class UnsupportedLine extends Line { + constructor(description?: string) { + super(description || 'Unsupported'); + } + + value(tr): number { + // Unsupported lines are deliberately omitted from Trace. + return 0; + } +}; + export function sumLineOfForms, L extends keyof F['lines']>( tr: TaxReturn, forms: F[], line: L): number { const reducer = (acc: number, curr: F) => acc + curr.getValue(tr, line); return forms.reduce(reducer, 0); } + +export function sumFormLines, L extends keyof F['lines']>( + tr: TaxReturn, form: F, lines: L[]): number { + let value = 0; + for (const line of lines) + value += form.getValue(tr, line); + return value; +} diff --git a/src/fed2019/Form1040.ts b/src/fed2019/Form1040.ts index 584a823..4a8b2d0 100644 --- a/src/fed2019/Form1040.ts +++ b/src/fed2019/Form1040.ts @@ -4,9 +4,9 @@ // SPDX-License-Identifier: GPL-3.0-only import { Form, TaxReturn } from '../core'; -import { Line, AccumulatorLine, ComputedLine, ReferenceLine, sumLineOfForms } from '../core/Line'; +import { Line, AccumulatorLine, ComputedLine, ReferenceLine, UnsupportedLine, sumFormLines, sumLineOfForms } from '../core/Line'; import { UnsupportedFeatureError } from '../core/Errors'; -import { clampToZero, reduceBySum } from '../core/Math'; +import { clampToZero, reduceBySum, undefinedToZero } from '../core/Math'; import Form8606 from './Form8606'; import Form8959 from './Form8959'; @@ -54,10 +54,11 @@ export default class Form1040 extends Form { '4b': new ComputedLine((tr): number => { const f8606s = tr.findForms(Form8606); return sumLineOfForms(tr, f8606s, '15c') + sumLineOfForms(tr, f8606s, '18'); - }, 'IRA distributions, taxadble amount'), - '4d': new ComputedLine(() => 0), - // 4c and 4d are not supported - // 5a and 5b are not supported + }, 'IRA distributions, taxable amount'), + '4c': new UnsupportedLine('Pensions and annuities'), + '4d': new UnsupportedLine('Pensions and annuities, taxable amount'), + '5a': new UnsupportedLine('Social security benefits'), + '5b': new UnsupportedLine('Social security benefits, taxable amount'), '6': new ComputedLine((tr): number => { const schedD = tr.findForm(ScheduleD); if (!schedD) @@ -71,16 +72,7 @@ export default class Form1040 extends Form { '7a': new ReferenceLine(Schedule1, '9', 'Other income from Schedule 1', 0), '7b': new ComputedLine((tr): number => { - let income = 0; - income += this.getValue(tr, '1'); - income += this.getValue(tr, '2b'); - income += this.getValue(tr, '3b'); - income += this.getValue(tr, '4b'); - income += this.getValue(tr, '4d'); - //income += this.getValue(tr, '5b'); - income += this.getValue(tr, '6'); - income += this.getValue(tr, '7a'); - return income; + return sumFormLines(tr, this, ['1', '2b', '3b', '4b', '4d', '5b', '6', '7a']); }, 'Total income'), '8a': new ReferenceLine(Schedule1, '22', 'Adjustments to income', 0), @@ -142,9 +134,15 @@ export default class Form1040 extends Form { return this.getValue(tr, '12a') + tr.getForm(Schedule2).getValue(tr, '3'); }, 'Additional tax'), - // Not supported: 13a - child tax credit + '13a': new UnsupportedLine('Child tax credit'), - '13b': new ReferenceLine(Schedule3, '7', 'Additional credits', 0), + '13b': new ComputedLine((tr): number => { + let value = this.getValue(tr, '13a'); + const sched3 = tr.findForm(Schedule3); + if (sched3) + value += undefinedToZero(sched3.getValue(tr, '7')); + return value; + }, 'Additional credits'), '14': new ComputedLine((tr): number => { return clampToZero(this.getValue(tr, '12b') - this.getValue(tr, '13b')); @@ -174,13 +172,12 @@ export default class Form1040 extends Form { return reduceBySum(withholding) + additionalMedicare; }, 'Federal income tax withheld'), - // 18a not supported - Earned income credit (EIC) - // 18b not supported - Additional child tax credit. Attach Schedule 8812 - // 18c not supported - American opportunity credit from Form 8863, line 8 + '18a': new UnsupportedLine('Earned income credit (EIC)'), + '18b': new UnsupportedLine('Additional child tax credit. Attach Schedule 8812'), + '18c': new UnsupportedLine('American opportunity credit from Form 8863, line 8'), '18d': new ReferenceLine(Schedule3, '14', undefined, 0), '18e': new ComputedLine((tr): number => { - // Should include 18a-18c. - return this.getValue(tr, '18d'); + return sumFormLines(tr, this, ['18a', '18b', '18c', '18d']); }), '19': new ComputedLine((tr): number => { @@ -260,7 +257,7 @@ export class QDCGTaxWorksheet extends Form { return tr.getForm(Form1040).getValue(tr, '6'); }), '4': new ComputedLine((tr): number => this.getValue(tr, '2') + this.getValue(tr, '3')), - '5': new ComputedLine(() => 0), // Not supported - Form 4952/4g (nvestment interest expense deduction) + '5': new UnsupportedLine('Form 4952@4g (Investment interest expense deduction)'), '6': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '4') - this.getValue(tr, '5'))), '7': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '1') - this.getValue(tr, '6'))), '8': new ComputedLine((tr): number => { diff --git a/src/fed2019/Form1116.ts b/src/fed2019/Form1116.ts index bbec8fb..61cc81b 100644 --- a/src/fed2019/Form1116.ts +++ b/src/fed2019/Form1116.ts @@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-only import { Form, Person, TaxReturn } from '../core'; -import { ComputedLine, InputLine, ReferenceLine } from '../core/Line'; +import { ComputedLine, InputLine, ReferenceLine, UnsupportedLine, sumFormLines } from '../core/Line'; import { UnsupportedFeatureError } from '../core/Errors'; import { reduceBySum } from '../core/Math'; @@ -47,9 +47,9 @@ export default class Form1116 extends Form { 'i': new Input('posessionName'), '1a': new Input('grossForeignIncome'), // 1b not supported - services as an employee. - // 2 not supported - Expenses definitely related to the income + '2': new UnsupportedLine('Expenses definitely related to the income'), '3a': new ReferenceLine(Form1040, '9', 'Deductions'), - '3b': new ComputedLine(() => 0, 'Other deductions'), // Not supported + '3b': new UnsupportedLine('Other deductions'), '3c': new ComputedLine((tr): number => { return this.getValue(tr, '3a') + this.getValue(tr, '3b'); }), @@ -75,28 +75,28 @@ export default class Form1116 extends Form { '3g': new ComputedLine((tr): number => { return this.getValue(tr, '3c') * this.getValue(tr, '3f'); }), - // 4 not supported - Pro rata share of interest expense + '4a': new UnsupportedLine('Home mortgage interest'), + '4b': new UnsupportedLine('Other interest expense'), '5': new Input('lossesFromForeignSources', undefined, 0), '6': new ComputedLine((tr): number => { - // Should include 2, 4a, 4b. - return this.getValue(tr, '3g') + this.getValue(tr, '5'); + return sumFormLines(tr, this, ['2', '3g', '4a', '4b', '5']); }), '7': new ComputedLine((tr): number => this.getValue(tr, '1a') - this.getValue(tr, '6')), // Skip the complicated Part II matrix and just use the input value. '8': new Input('totalForeignTaxesPaidOrAccrued'), '9': new ReferenceLine(Form1116 as any, '8'), - // 10 not supported - Carryback or carryover - '11': new ComputedLine((tr): number => this.getValue(tr, '9') /* + this.getValue(tr, '10') */), - // 12 not supported - Reduction in foreign taxes - // 13 not supported - Taxes reclassified under high tax kickout + '10': new UnsupportedLine('Carryback or carryover'), + '11': new ComputedLine((tr): number => this.getValue(tr, '9') + this.getValue(tr, '10')), + '12': new UnsupportedLine('Reduction in foreign taxes'), + '13': new UnsupportedLine('Taxes reclassified under high tax kickout'), '14': new ComputedLine((tr): number => { - return this.getValue(tr, '11') /*+ + return this.getValue(tr, '11') + this.getValue(tr, '12') + - this.getValue(tr, '13')*/; + this.getValue(tr, '13'); }), '15': new ReferenceLine(Form1116 as any, '7'), - // 16 not supported - Adjustments to line 15 - '17': new ComputedLine((tr): number => this.getValue(tr, '15') /* + this.getValue(tr, '16') */), + '16': new UnsupportedLine('Adjustments to line 15'), + '17': new ComputedLine((tr): number => this.getValue(tr, '15') + this.getValue(tr, '16')), // TODO - This does not handle necessary adjustments. '18': new ReferenceLine(Form1040, '11b'), '19': new ComputedLine((tr): number => this.getValue(tr, '17') / this.getValue(tr, '18')), @@ -111,7 +111,7 @@ export default class Form1116 extends Form { '22': new ComputedLine((tr): number => Math.min(this.getValue(tr, '14'), this.getValue(tr, '21'))), // 23-30 not supported (other category F1116) '31': new ReferenceLine(Form1116 as any, '22'), - // 32 not supported - Reduction of credit for international boycott operations - '33': new ComputedLine((tr): number => this.getValue(tr, '31') /* - this.getValue(tr, '32')*/), + '32': new UnsupportedLine('Reduction of credit for international boycott operations'), + '33': new ComputedLine((tr): number => this.getValue(tr, '31') - this.getValue(tr, '32')), }; }; diff --git a/src/fed2019/Form8606.ts b/src/fed2019/Form8606.ts index 38c9fe9..7d8d4b5 100644 --- a/src/fed2019/Form8606.ts +++ b/src/fed2019/Form8606.ts @@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-only import { Form, Person, TaxReturn } from '../core'; -import { Line, AccumulatorLine, ComputedLine, InputLine, ReferenceLine } from '../core/Line'; +import { Line, AccumulatorLine, ComputedLine, InputLine, ReferenceLine, UnsupportedLine } from '../core/Line'; import { clampToZero, undefinedToZero } from '../core/Math'; export interface Form8606Input { @@ -55,8 +55,7 @@ export default class Form8606 extends Form { return l3 - this.getValue(tr, '13'); }, 'Total basis in Traditional IRAs'), '15a': new ComputedLine((tr): number => this.getValue(tr, '7') - this.getValue(tr, '12')), - '15b': new ComputedLine((): number => 0, 'Amount attributable to qualified disaster distributions'), - // 15b not supported - amount on line 15a attributable + '15b': new UnsupportedLine('Amount attributable to qualified disaster distributions'), '15c': new ComputedLine((tr): number => this.getValue(tr, '15a') - this.getValue(tr, '15b'), 'Taxable amount'), // Part 2 diff --git a/src/fed2019/Form8959.ts b/src/fed2019/Form8959.ts index 844261f..a4ebc9f 100644 --- a/src/fed2019/Form8959.ts +++ b/src/fed2019/Form8959.ts @@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-only import { Form, TaxReturn } from '../core'; -import { Line, AccumulatorLine, ComputedLine, ReferenceLine } from '../core/Line'; +import { Line, AccumulatorLine, ComputedLine, ReferenceLine, UnsupportedLine, sumFormLines } from '../core/Line'; import { clampToZero } from '../core/Math'; import Form1040, { FilingStatus } from './Form1040'; @@ -15,11 +15,10 @@ export default class Form8959 extends Form { readonly lines = { '1': new AccumulatorLine(W2, '5', 'Medicare wages'), - // 2 is not supported (Unreported tips from Form 4137) - // 3 is not supported (Wages from Form 8919) + '2': new UnsupportedLine('Unreported tips from Form 4137'), + '3': new UnsupportedLine('Wages from Form 8919'), '4': new ComputedLine((tr): number => { - // Should include 2-3. - return this.getValue(tr, '1'); + return sumFormLines(tr, this, ['1', '2', '3']); }), '5': new ComputedLine((tr): number => { return Form8959.filingStatusLimit(tr.getForm(Form1040).filingStatus); @@ -46,10 +45,9 @@ export default class Form8959 extends Form { '22': new ComputedLine((tr): number => { return clampToZero(this.getValue(tr, '19') - this.getValue(tr, '21')); }, 'Additional Medicare withholding on Medicare wages'), - // 23 is not supported (Additional Medicare Tax withholding on railroad retirement (RRTA) compensation) + '23': new UnsupportedLine('Additional Medicare Tax withholding on railroad retirement (RRTA) compensation'), '24': new ComputedLine((tr): number => { - // Should include 23. - return this.getValue(tr, '22'); + return this.getValue(tr, '22') + this.getValue(tr, '23'); }), }; diff --git a/src/fed2019/Form8960.ts b/src/fed2019/Form8960.ts index a871e82..724303e 100644 --- a/src/fed2019/Form8960.ts +++ b/src/fed2019/Form8960.ts @@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-only import { Form, TaxReturn } from '../core'; -import { ComputedLine, ReferenceLine } from '../core/Line'; +import { ComputedLine, ReferenceLine, UnsupportedLine, sumFormLines } from '../core/Line'; import { clampToZero, undefinedToZero } from '../core/Math'; import Form1040, { FilingStatus } from './Form1040'; @@ -18,30 +18,23 @@ export default class Form8960 extends Form { // Section 6013 elections not supported. '1': new ReferenceLine(Form1040, '2b', 'Taxable interest'), '2': new ReferenceLine(Form1040, '3b', 'Ordinary dividends'), - // 3 not supported - Annuities - // 4a not supported - Rental real estate, royalties, partnerships, S corporations, trusts, etc - // 4b not supported - Adjustment for net income or loss derived in the ordinary course of a nonsection 1411 trade or business - // 4c not supported - 4a+4b + '3': new UnsupportedLine('Annuities'), + '4a': new UnsupportedLine('Rental real estate, royalties, partnerships, S corporations, trusts, etc'), + '4b': new UnsupportedLine('Adjustment for net income or loss derived in the ordinary course of a nonsection 1411 trade or business'), + '4c': new ComputedLine((tr): number => this.getValue(tr, '4a') + this.getValue(tr, '4b')), '5a': new ComputedLine((tr): number => { return (new ReferenceLine(Form1040, '6')).value(tr) + undefinedToZero(new ReferenceLine(Schedule1, '4', undefined, 0).value(tr)); }, 'Net gain or loss'), - // 5b not supported - Net gain or loss from disposition of property that is not subject to net investment income tax - // 5c not supported - Adjustment from disposition of partnership interest or S corporation stock + '5b': new UnsupportedLine('Net gain or loss from disposition of property that is not subject to net investment income tax'), + '5c': new UnsupportedLine('Adjustment from disposition of partnership interest or S corporation stock'), '5d': new ComputedLine((tr): number => { - // Should include 5b-5c. - return this.getValue(tr, '5a'); + return sumFormLines(tr, this, ['5a', '5b', '5c']); }), - // 6 not supported - Adjustments to investment income for certain CFCs and PFICs - // 7 not supported - Other modifications to investment income + '6': new UnsupportedLine('Adjustments to investment income for certain CFCs and PFICs'), + '7': new UnsupportedLine('Other modifications to investment income'), '8': new ComputedLine((tr): number => { - return this.getValue(tr, '1') + - this.getValue(tr, '2') + - /*this.getValue(tr, '3') + - this.getValue(tr, '4c') +*/ - this.getValue(tr, '5d') /*+ - this.getValue(tr, '6') + - this.getValue(tr, '7')*/; + return sumFormLines(tr, this, ['1', '2', '3', '4c', '5d', '6', '7']); }), // Part 2 diff --git a/src/fed2019/Form8995.ts b/src/fed2019/Form8995.ts index 677f9e2..52bcbb9 100644 --- a/src/fed2019/Form8995.ts +++ b/src/fed2019/Form8995.ts @@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-only import { Form, Person, TaxReturn } from '../core'; -import { AccumulatorLine, ComputedLine, InputLine } from '../core/Line'; +import { AccumulatorLine, ComputedLine, InputLine, UnsupportedLine } from '../core/Line'; import { clampToZero } from '../core/Math'; import Form1040 from './Form1040'; @@ -24,7 +24,7 @@ export default class Form8995REIT extends Form { // This uses line numbers from 8995-A. readonly lines = { // 1-26 not supported - '27': new ComputedLine(() => 0, 'Total qualified business income component'), // Not supported. + '27': new UnsupportedLine('Total qualified business income component'), '28': new AccumulatorLine(Form1099DIV, '5', 'Qualified REIT dividends'), '29': new InputLine('qualifiedReitDividendCarryforward', undefined, 0), '30': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '28') + this.getValue(tr, '29'))), @@ -53,7 +53,7 @@ export default class Form8995REIT extends Form { '35': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '33') - this.getValue(tr, '34'))), '36': new ComputedLine((tr): number => this.getValue(tr, '35') * 0.20, 'Income limitation'), '37': new ComputedLine((tr): number => Math.min(this.getValue(tr, '32'), this.getValue(tr, '36'))), - '38': new ComputedLine(() => 0, 'DPAD under section 199A(g) allocated from an agricultural or horticultural cooperative'), // Not supported, + '38': new UnsupportedLine('DPAD under section 199A(g) allocated from an agricultural or horticultural cooperative'), '39': new ComputedLine((tr): number => this.getValue(tr, '37') + this.getValue(tr, '38')), '40': new ComputedLine((tr): number => Math.min(0, this.getValue(tr, '28') + this.getValue(tr, '29')), 'Total qualified REIT dividends and PTP loss carryforward.'), }; diff --git a/src/fed2019/Schedule2.ts b/src/fed2019/Schedule2.ts index eb9899c..b2a2d51 100644 --- a/src/fed2019/Schedule2.ts +++ b/src/fed2019/Schedule2.ts @@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-only import { Form, TaxReturn } from '../core'; -import { ComputedLine } from '../core/Line'; +import { ComputedLine, UnsupportedLine, sumFormLines } from '../core/Line'; import { UnsupportedFeatureError } from '../core/Errors'; import Form1040, { FilingStatus } from './Form1040'; @@ -35,16 +35,15 @@ export default class Schedule2 extends Form { } throw new UnsupportedFeatureError('The AMT is not supported'); }, 'AMT'), - '2': new ComputedLine(() => 0, 'Excess advance premium tax credit repayment'), // Not supported. + '2': new UnsupportedLine('Excess advance premium tax credit repayment'), '3': new ComputedLine((tr): number => { - // Should include line 2. - return this.getValue(tr, '1'); + return this.getValue(tr, '1') + this.getValue(tr, '2'); }), - // 4 is not supported (Self-employment tax.) - // 5 is not supported (Unreported social security and Medicare tax from) - // 6 is not supported (Additional tax on IRAs, other qualified retirement plans, and other tax-favored accounts) - // 7 is not supported (Household employment taxes.) + '4': new UnsupportedLine('Self-employment tax.'), + '5': new UnsupportedLine('Unreported social security and Medicare tax from'), + '6': new UnsupportedLine('Additional tax on IRAs, other qualified retirement plans, and other tax-favored accounts'), + '7': new UnsupportedLine('Household employment taxes.'), '8': new ComputedLine((tr): number => { const f1040 = tr.getForm(Form1040); const wages = f1040.getLine('1').value(tr); @@ -65,11 +64,10 @@ export default class Schedule2 extends Form { return value; }), - // 9 is not supported (Section 965 net tax liability installment from Form 965-A) + '9': new UnsupportedLine('Section 965 net tax liability installment from Form 965-A'), '10': new ComputedLine((tr): number => { - // Should be lines 4 - 8. - return this.getValue(tr, '8'); + return sumFormLines(tr, this, ['4', '5', '6', '7', '8']); }) }; }; diff --git a/src/fed2019/Schedule3.ts b/src/fed2019/Schedule3.ts index 98da58c..0557288 100644 --- a/src/fed2019/Schedule3.ts +++ b/src/fed2019/Schedule3.ts @@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-only import { Form, TaxReturn } from '../core'; -import { AccumulatorLine, ComputedLine, InputLine, ReferenceLine } from '../core/Line'; +import { AccumulatorLine, ComputedLine, InputLine, ReferenceLine, UnsupportedLine, sumFormLines } from '../core/Line'; import { NotFoundError, UnsupportedFeatureError } from '../core/Errors'; import Form1040, { FilingStatus } from './Form1040'; @@ -35,31 +35,29 @@ export default class Schedule3 extends Form } return tr.getForm(Form1116).getValue(tr, '33'); }, 'Foreign tax credit'), - // 2 not supported - Credit for child and dependent care expenses. Attach Form 2441 - // 3 not supported - Education credits from Form 8863, line 19 - // 4 not supported - Retirement savings contributions credit. Attach Form 8880 - // 5 not supported - Residential energy credits. Attach Form 5695 - // 6a not supported - Form 3800 - // 6b not supported - Form 8801 - // 6c not supported - Other nonrefundable credits + '2': new UnsupportedLine('Credit for child and dependent care expenses. Attach Form 2441'), + '3': new UnsupportedLine('Education credits from Form 8863, line 19'), + '4': new UnsupportedLine('Retirement savings contributions credit. Attach Form 8880'), + '5': new UnsupportedLine('Residential energy credits. Attach Form 5695'), + '6a': new UnsupportedLine('Form 3800'), + '6b': new UnsupportedLine('Form 8801'), + '6c': new UnsupportedLine('Other nonrefundable credits'), '7': new ComputedLine((tr): number => { - // Should include 2-6. - return this.getValue(tr, '1'); + return sumFormLines(tr, this, ['1', '2', '3', '4', '5', '6a', '6b', '6c']); }), // Part 2 '8': new InputLine('estimatedTaxPayments'), - // 9 not supported - Net premium tax credit. Attach Form 8962 - // 10 not supported - Amount paid with request for extension to file (see instructions) - // 11 not supported - Excess social security and tier 1 RRTA tax withheld - // 12 not supported - Credit for federal tax on fuels. Attach Form 4136 - // 13a not supported - Form 2439 + '9': new UnsupportedLine('Net premium tax credit. Attach Form 8962'), + '10': new UnsupportedLine('Amount paid with request for extension to file (see instructions)'), + '11': new UnsupportedLine('Excess social security and tier 1 RRTA tax withheld'), + '12': new UnsupportedLine('Credit for federal tax on fuels. Attach Form 4136'), + '13a': new UnsupportedLine('Form 2439'), // 13b is reserved - // 13c not supported - Form 8885 - // 13d not supported - Other refundable credits + '13c': new UnsupportedLine('Form 8885'), + '13d': new UnsupportedLine('Other refundable credits'), '14': new ComputedLine((tr): number => { - // Should include 9-13. - return this.getValue(tr, '8'); + return sumFormLines(tr, this, ['8', '9', '10', '11', '12', '13a', '13c', '13d']); }), }; }; diff --git a/src/fed2019/ScheduleD.ts b/src/fed2019/ScheduleD.ts index 08264c1..0925dc9 100644 --- a/src/fed2019/ScheduleD.ts +++ b/src/fed2019/ScheduleD.ts @@ -4,7 +4,7 @@ // SPDX-License-Identifier: GPL-3.0-only import { Form, Person, TaxReturn } from '../core'; -import { Line, AccumulatorLine, ComputedLine, ReferenceLine, sumLineOfForms } from '../core/Line'; +import { Line, AccumulatorLine, ComputedLine, ReferenceLine, UnsupportedLine, sumFormLines, sumLineOfForms } from '../core/Line'; import { clampToZero } from '../core/Math'; import { NotFoundError, UnsupportedFeatureError } from '../core/Errors'; @@ -17,35 +17,34 @@ export default class ScheduleD extends Form { readonly lines = { // 1a not supported (Totals for all short-term transactions reported on Form 1099-B for which basis was reported to the IRS and for which you have no adjustments) - // 4 is not supported (Short-term gain from Form 6252 and short-term gain or (loss) from Forms 4684, 6781, and 8824) - // 5 is not supported (Net short-term gain or (loss) from partnerships, S corporations, estates, and trusts from Schedule(s) K-1) - // 6 is not supported (Short-term capital loss carryover. Enter the amount, if any, from line 8 of your Capital Loss Carryover Worksheet in the instructions) + '4': new UnsupportedLine(), // Short-term gain from Form 6252 and short-term gain or (loss) from Forms 4684, 6781, and 8824 + '5': new UnsupportedLine(), // Net short-term gain or (loss) from partnerships, S corporations, estates, and trusts from Schedule(s) K-1 + '6': new UnsupportedLine(), // Short-term capital loss carryover. Enter the amount, if any, from line 8 of your Capital Loss Carryover Worksheet in the instructions '7': new ComputedLine((tr): number => { // 1-3 are computed by Form8949. - // 4-6 should be included. + let value = sumFormLines(tr, this, ['4', '5', '6']); const f8949 = tr.getForm(Form8949); - return f8949.getValue(tr, 'boxA').gainOrLoss + - f8949.getValue(tr, 'boxB').gainOrLoss + - f8949.getValue(tr, 'boxC').gainOrLoss; + value += f8949.getValue(tr, 'boxA').gainOrLoss; + value += f8949.getValue(tr, 'boxB').gainOrLoss; + value += f8949.getValue(tr, 'boxC').gainOrLoss; + return value; }, 'Net short-term capital gain or loss'), // 8a is not supported. - // 11 is not supported (Gain from Form 4797, Part I; long-term gain from Forms 2439 and 6252; and long-term gain or (loss) from Forms 4684, 6781, and 8824) - // 12 is not supported (Net long-term gain or (loss) from partnerships, S corporations, estates, and trusts from Schedule(s) K-1) - + '11': new UnsupportedLine(), // Gain from Form 4797, Part I; long-term gain from Forms 2439 and 6252; and long-term gain or (loss) from Forms 4684, 6781, and 8824 + '12': new UnsupportedLine(), // Net long-term gain or (loss) from partnerships, S corporations, estates, and trusts from Schedule(s) K-1 '13': new AccumulatorLine(Form1099DIV, '2a', 'Capital gain distributions'), - - // 14 is not supported (Long-term capital loss carryover. Enter the amount, if any, from line 13 of your Capital Loss Carryover Worksheet in the instructions) + '14': new UnsupportedLine('Long-term capital loss carryover'), '15': new ComputedLine((tr): number => { - // 11-14 should be included. + let value = sumFormLines(tr, this, ['11', '12', '13', '14']); const f8949 = tr.getForm(Form8949); - return f8949.getValue(tr, 'boxD').gainOrLoss + - f8949.getValue(tr, 'boxE').gainOrLoss + - f8949.getValue(tr, 'boxF').gainOrLoss + - this.getValue(tr, '13'); + value += f8949.getValue(tr, 'boxD').gainOrLoss; + value += f8949.getValue(tr, 'boxE').gainOrLoss; + value += f8949.getValue(tr, 'boxF').gainOrLoss; + return value; }, 'Net long-term capital gain or loss'), '16': new ComputedLine((tr): number => { @@ -61,12 +60,9 @@ export default class ScheduleD extends Form { // If no, goto 22. }, 'Both ST and LT are gains'), - '18': new ComputedLine((tr): number | undefined => { - // Not supported - only for gains on Qualified Small Business Stock or collectibles. - return 0; - }, '28% Rate Gain Worksheet Value'), + '18': new UnsupportedLine('28% Rate Gain Worksheet Value (Qualified Small Business Stock or collectibles.)'), - '19': new ComputedLine(() => undefined, 'Unrecaptured Section 1250 Gain Worksheet'), // Not supported. + '19': new UnsupportedLine('Unrecaptured Section 1250 Gain Worksheet'), '20': new ComputedLine((tr): boolean | undefined => { const l18 = this.getValue(tr, '18'); @@ -95,8 +91,8 @@ export class ScheduleDTaxWorksheet extends Form readonly lines = { '1': new ReferenceLine(Form1040, '11b'), '2': new ReferenceLine(Form1040, '3a'), - // TODO 3 - form 4952 - // TODO 4 - 4952 + '3': new UnsupportedLine('Form 4952@4g'), + '4': new UnsupportedLine('Form 4952@4e'), '5': new ComputedLine((tr): number => 0), '6': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '2') - this.getValue(tr, '5'))), '7': new ComputedLine((tr): number => { @@ -104,8 +100,7 @@ export class ScheduleDTaxWorksheet extends Form return Math.min(schedD.getValue(tr, '15'), schedD.getValue(tr, '16')); }), '8': new ComputedLine((tr): number => { - return 0; - // return Math.min(this.getValue(tr, '3'), this.getValue(tr, '4')); + return Math.min(this.getValue(tr, '3'), this.getValue(tr, '4')); }), '9': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '7') - this.getValue(tr, '8'))), '10': new ComputedLine((tr): number => this.getValue(tr, '6') + this.getValue(tr, '9')), @@ -167,8 +162,7 @@ export class ScheduleDTaxWorksheet extends Form '34': new ComputedLine((tr): number => this.getValue(tr, '33') * 0.20), '35': new ComputedLine((tr): number => { const schedD = tr.getForm(ScheduleD); - // TODO - line 19 is not supported. - return Math.min(this.getValue(tr, '9'), Infinity); //schedD.getValue(tr, '19')); + return Math.min(this.getValue(tr, '9'), schedD.getValue(tr, '19')); }), '36': new ComputedLine((tr): number => this.getValue(tr, '10') + this.getValue(tr, '21')), '37': new ReferenceLine(ScheduleDTaxWorksheet as any, '1'), @@ -196,11 +190,7 @@ export class ScheduleDTaxWorksheet extends Form return computeTax(income, tr.getForm(Form1040).filingStatus); }), '45': new ComputedLine((tr): number => { - return this.getValue(tr, '31') + - this.getValue(tr, '34') + - this.getValue(tr, '40') + - this.getValue(tr, '43') + - this.getValue(tr, '44'); + return sumFormLines(tr, this, ['31', '34', '40', '43', '44']); }), '46': new ComputedLine((tr): number => { const income = this.getValue(tr, '1'); -- 2.22.5 From 09411dcf40b1c7d957054b228cc88cef6063cc9c Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 23 Mar 2020 08:18:57 -0400 Subject: [PATCH 03/16] Include examples/ in the package. --- package.json | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 71f498c..ca095fc 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,7 @@ "name": "ustaxlib", "version": "1.0.0", "description": "A library for modeling individual US tax returns.", + "repository": "https://github.com/rsesek/ustaxlib", "scripts": { "dev": "jest --watch", "test": "jest", @@ -16,7 +17,8 @@ }, "files": [ "dist/**/*", - "src/**/*" + "src/**/*", + "examples/**/*" ], "devDependencies": { "@types/jest": "^25.1.2", -- 2.22.5 From cf03bd2cb05d74295e0598943597a3efe345c426 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 23 Mar 2020 08:21:33 -0400 Subject: [PATCH 04/16] Version 1.0.1 was fast... --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index ca095fc..5ca9093 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ustaxlib", - "version": "1.0.0", + "version": "1.0.1", "description": "A library for modeling individual US tax returns.", "repository": "https://github.com/rsesek/ustaxlib", "scripts": { -- 2.22.5 From a649bfb5937b360e605e8782fa36643462b635fb Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 23 Mar 2020 08:51:04 -0400 Subject: [PATCH 05/16] Only publish the dist/ folder. --- build.sh | 5 +++++ package.json | 6 +++--- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/build.sh b/build.sh index c8d5a53..e251b72 100755 --- a/build.sh +++ b/build.sh @@ -17,6 +17,11 @@ tsc # Drop tests from the compiled output. find $OUTDIR -type f -name '*.test.*' -exec rm {} + +cp -r examples $OUTDIR +cp README.md $OUTDIR +cp LICENSE.txt $OUTDIR + # "Preprocess" the dist package.json. cp ./package.json $OUTDIR sed -i '' -e s@\"dist/@\"@ $OUTDIR/package.json +sed -i '' -e 's@"prepare": ".*",@@' $OUTDIR/package.json diff --git a/package.json b/package.json index 5ca9093..e5b6d18 100644 --- a/package.json +++ b/package.json @@ -1,14 +1,14 @@ { "name": "ustaxlib", - "version": "1.0.1", + "version": "1.0.2", "description": "A library for modeling individual US tax returns.", "repository": "https://github.com/rsesek/ustaxlib", "scripts": { + "prepare": "./build.sh", "dev": "jest --watch", "test": "jest", "check": "tsc --noEmit", - "debug": "node --inspect-brk --stack-trace-limit=1000 node_modules/.bin/jest --coverage=false", - "prepare": "./build.sh" + "debug": "node --inspect-brk --stack-trace-limit=1000 node_modules/.bin/jest --coverage=false" }, "author": "Robert Sesek", "license": "GPL-3.0-only", -- 2.22.5 From 0ed4b572c0bb69e7a32bc4bd7a8f3eb211b225bb Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 23 Mar 2020 18:39:13 -0400 Subject: [PATCH 06/16] Update the README with working instructions. --- README.md | 10 ++++++---- doc/changes.md | 10 ++++++++++ 2 files changed, 16 insertions(+), 4 deletions(-) create mode 100644 doc/changes.md diff --git a/README.md b/README.md index 6940232..d71c8ea 100644 --- a/README.md +++ b/README.md @@ -42,11 +42,11 @@ To start using the software, create a new, private NPM project, and install the dependencies. This will also install the HTML viewer. Then copy an example file and run the viewer with it. - npm init - # answer questions + mkdir taxes && cd taxes + echo '{"private":true}' > package.json npm i ts-node typescript ustaxlib ustaxviewer cp node_modules/ustaxlib/examples/fed2019.ts . - npx ustaxviewer-ts fed2019.ts + npx ustaxviewer fed2019.ts ## Contributing @@ -66,7 +66,9 @@ liability throughout the year, or to learn about the US tax system. ### Should I use this to file my own tax returns? Please, heck no. There are guaranteed to be bugs in this software. The models do not support every -and situation. This software is provided with no warranty. +situation, and many more complex parts of forms are not implemented. This software is provided with +no warranty. There is no wizard/interview system; it is expected that you use the instructions on +[the IRS website](https://www.irs.gov) to set up and input data into the forms. ### How well does it work? diff --git a/doc/changes.md b/doc/changes.md new file mode 100644 index 0000000..2ce883a --- /dev/null +++ b/doc/changes.md @@ -0,0 +1,10 @@ +# ustaxlib Change Log + +## 1.0.2 +- Only publish the dist/ folder. + +## 1.0.1 +- Include examples in the NPM package. + +## 1.0.0 +Initial release. -- 2.22.5 From 12391d89735b1677f147d536b6077eacf6a87df1 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 23 Mar 2020 18:53:25 -0400 Subject: [PATCH 07/16] Add a helper script to publish the NPM package. --- build.sh | 1 - doc/dev.md | 9 +++++++++ package.json | 3 +-- 3 files changed, 10 insertions(+), 3 deletions(-) create mode 100644 doc/dev.md diff --git a/build.sh b/build.sh index e251b72..6349158 100755 --- a/build.sh +++ b/build.sh @@ -24,4 +24,3 @@ cp LICENSE.txt $OUTDIR # "Preprocess" the dist package.json. cp ./package.json $OUTDIR sed -i '' -e s@\"dist/@\"@ $OUTDIR/package.json -sed -i '' -e 's@"prepare": ".*",@@' $OUTDIR/package.json diff --git a/doc/dev.md b/doc/dev.md new file mode 100644 index 0000000..be22b40 --- /dev/null +++ b/doc/dev.md @@ -0,0 +1,9 @@ +# Developer Workflows + +## Publishing Releases + +Only the dist/ directory, containing the compiled TypeScript files are put into the NPM package. The +`build.sh` script copies non-`tsc`-processed files, and does some processing of the `package.json`. +To publish a new release, just run: + + npm run npm-publish diff --git a/package.json b/package.json index e5b6d18..5f66075 100644 --- a/package.json +++ b/package.json @@ -4,10 +4,9 @@ "description": "A library for modeling individual US tax returns.", "repository": "https://github.com/rsesek/ustaxlib", "scripts": { - "prepare": "./build.sh", + "npm-publish": "./build.sh && npm publish dist", "dev": "jest --watch", "test": "jest", - "check": "tsc --noEmit", "debug": "node --inspect-brk --stack-trace-limit=1000 node_modules/.bin/jest --coverage=false" }, "author": "Robert Sesek", -- 2.22.5 From 956a0659bac3500b955995da43d82f96ecb08d6b Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sat, 28 Mar 2020 13:07:29 -0400 Subject: [PATCH 08/16] Add ci.yml file to setup GitHub actions. --- .github/workflows/ci.yml | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 .github/workflows/ci.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..31e23ba --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,17 @@ +name: CI + +on: + push: + branches: [ master ] + pull_request: + branches: [ master ] + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1.1.0 + - run: npm install + - run: ./build.sh + - run: npm test -- 2.22.5 From 64cf5e0688c9e0be8dde699f125ebe721e964a1e Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sat, 28 Mar 2020 13:13:33 -0400 Subject: [PATCH 09/16] Get sed invocation to hopefully work with GNU sed. --- build.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/build.sh b/build.sh index 6349158..d2a7115 100755 --- a/build.sh +++ b/build.sh @@ -23,4 +23,4 @@ cp LICENSE.txt $OUTDIR # "Preprocess" the dist package.json. cp ./package.json $OUTDIR -sed -i '' -e s@\"dist/@\"@ $OUTDIR/package.json +sed -i='' -e s@\"dist/@\"@ $OUTDIR/package.json -- 2.22.5 From 786015905e1db76cbe876268a3ea406966142ad7 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sat, 28 Mar 2020 13:16:57 -0400 Subject: [PATCH 10/16] Add status badges to README. --- README.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/README.md b/README.md index d71c8ea..c0ffb40 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,8 @@ # ustaxlib +![CI](https://github.com/rsesek/ustaxlib/workflows/CI/badge.svg?branch=master) +[![npm version](https://badge.fury.io/js/ustaxlib.svg)](https://badge.fury.io/js/ustaxlib) + This project provides modules for modeling the US tax system for individuals. The `ustaxlib/core` module provides a generic framework for defining tax return forms. And peer modules like `ustaxlib/fed2019` provide forms for specific revisions/years of tax returns. -- 2.22.5 From a70f7ced6a8287c1c1aa68b93deaf2acd295627b Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Sat, 28 Mar 2020 17:19:30 +0000 Subject: [PATCH 11/16] Bump acorn from 6.4.0 to 6.4.1 Bumps [acorn](https://github.com/acornjs/acorn) from 6.4.0 to 6.4.1. - [Release notes](https://github.com/acornjs/acorn/releases) - [Commits](https://github.com/acornjs/acorn/compare/6.4.0...6.4.1) Signed-off-by: dependabot[bot] --- package-lock.json | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/package-lock.json b/package-lock.json index fe1e4f0..2de93d5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "ustaxlib", - "version": "0.1.0", + "version": "1.0.2", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -575,9 +575,9 @@ "dev": true }, "acorn": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.0.tgz", - "integrity": "sha512-kL5CuoXA/dgxlBbVrflsflzQ3PAas7RYZB52NOm/6839iVYJgKMJ3cQJD+t2i5+qFa8h3MDpEOJiS64E8JLnSQ==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz", + "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==", "dev": true }, "acorn-globals": { @@ -591,9 +591,9 @@ }, "dependencies": { "acorn": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.0.tgz", - "integrity": "sha512-gac8OEcQ2Li1dxIEWGZzsp2BitJxwkwcOm0zHAJLcPJaVvm58FRnk6RkuLRpU1EujipU2ZFODv2P9DLMfnV8mw==", + "version": "6.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz", + "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==", "dev": true } } -- 2.22.5 From 1337c93dcfb11addfddece7ac37163eb1fdb161b Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sat, 28 Mar 2020 13:31:09 -0400 Subject: [PATCH 12/16] Upgrade all dependencies. --- package-lock.json | 1259 +++++++++++++++++++++------------------------ package.json | 8 +- 2 files changed, 583 insertions(+), 684 deletions(-) diff --git a/package-lock.json b/package-lock.json index 2de93d5..d7b38ab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,28 +14,35 @@ } }, "@babel/core": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.8.4.tgz", - "integrity": "sha512-0LiLrB2PwrVI+a2/IEskBopDYSd8BCb3rOvH7D5tzoWd696TBEduBvuLVm4Nx6rltrLZqvI3MCalB2K2aVzQjA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.9.0.tgz", + "integrity": "sha512-kWc7L0fw1xwvI0zi8OKVBuxRVefwGOrKSQMvrQ3dW+bIIavBY3/NpXmpjMy7bQnLgwgzWQZ8TlM57YHpHNHz4w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", - "@babel/helpers": "^7.8.4", - "@babel/parser": "^7.8.4", - "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/generator": "^7.9.0", + "@babel/helper-module-transforms": "^7.9.0", + "@babel/helpers": "^7.9.0", + "@babel/parser": "^7.9.0", + "@babel/template": "^7.8.6", + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0", "convert-source-map": "^1.7.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.1", - "json5": "^2.1.0", + "json5": "^2.1.2", "lodash": "^4.17.13", "resolve": "^1.3.2", "semver": "^5.4.1", "source-map": "^0.5.0" }, "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", @@ -45,12 +52,12 @@ } }, "@babel/generator": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.8.4.tgz", - "integrity": "sha512-PwhclGdRpNAf3IxZb0YVuITPZmmrXz9zf6fH8lT4XbrmfQKr6ryBzhv593P5C6poJRciFCL/eHGW2NuGrgEyxA==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.4.tgz", + "integrity": "sha512-rjP8ahaDy/ouhrvCoU1E5mqaitWrxwuNGU+dy1EpaoK48jZay4MdkskKGIMHLZNewg8sAsqpGSREJwP0zH3YQA==", "dev": true, "requires": { - "@babel/types": "^7.8.3", + "@babel/types": "^7.9.0", "jsesc": "^2.5.1", "lodash": "^4.17.13", "source-map": "^0.5.0" @@ -84,12 +91,76 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-member-expression-to-functions": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz", + "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-imports": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz", + "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, + "@babel/helper-module-transforms": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz", + "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==", + "dev": true, + "requires": { + "@babel/helper-module-imports": "^7.8.3", + "@babel/helper-replace-supers": "^7.8.6", + "@babel/helper-simple-access": "^7.8.3", + "@babel/helper-split-export-declaration": "^7.8.3", + "@babel/template": "^7.8.6", + "@babel/types": "^7.9.0", + "lodash": "^4.17.13" + } + }, + "@babel/helper-optimise-call-expression": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz", + "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==", + "dev": true, + "requires": { + "@babel/types": "^7.8.3" + } + }, "@babel/helper-plugin-utils": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz", "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==", "dev": true }, + "@babel/helper-replace-supers": { + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz", + "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==", + "dev": true, + "requires": { + "@babel/helper-member-expression-to-functions": "^7.8.3", + "@babel/helper-optimise-call-expression": "^7.8.3", + "@babel/traverse": "^7.8.6", + "@babel/types": "^7.8.6" + } + }, + "@babel/helper-simple-access": { + "version": "7.8.3", + "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz", + "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==", + "dev": true, + "requires": { + "@babel/template": "^7.8.3", + "@babel/types": "^7.8.3" + } + }, "@babel/helper-split-export-declaration": { "version": "7.8.3", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz", @@ -99,25 +170,31 @@ "@babel/types": "^7.8.3" } }, + "@babel/helper-validator-identifier": { + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.0.tgz", + "integrity": "sha512-6G8bQKjOh+of4PV/ThDm/rRqlU7+IGoJuofpagU5GlEl29Vv0RGqqt86ZGRV8ZuSOY3o+8yXl5y782SMcG7SHw==", + "dev": true + }, "@babel/helpers": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.8.4.tgz", - "integrity": "sha512-VPbe7wcQ4chu4TDQjimHv/5tj73qz88o12EPkO2ValS2QiQS/1F2SsjyIGNnAD0vF/nZS6Cf9i+vW6HIlnaR8w==", + "version": "7.9.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz", + "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==", "dev": true, "requires": { "@babel/template": "^7.8.3", - "@babel/traverse": "^7.8.4", - "@babel/types": "^7.8.3" + "@babel/traverse": "^7.9.0", + "@babel/types": "^7.9.0" } }, "@babel/highlight": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.8.3.tgz", - "integrity": "sha512-PX4y5xQUvy0fnEVHrYOarRPXVWafSjTW9T0Hab8gVIawpl2Sj0ORyrygANq+KjcNlSSTw0YCLSNA8OyZ1I4yEg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz", + "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==", "dev": true, "requires": { + "@babel/helper-validator-identifier": "^7.9.0", "chalk": "^2.0.0", - "esutils": "^2.0.2", "js-tokens": "^4.0.0" }, "dependencies": { @@ -174,9 +251,9 @@ } }, "@babel/parser": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.8.4.tgz", - "integrity": "sha512-0fKu/QqildpXmPVaRBoXOlyBb3MC+J0A66x97qEfLOMkn3u6nfY5esWogQwi/K0BjASYy4DbnsEWnpNL6qT5Mw==", + "version": "7.9.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz", + "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==", "dev": true }, "@babel/plugin-syntax-bigint": { @@ -198,40 +275,40 @@ } }, "@babel/template": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.3.tgz", - "integrity": "sha512-04m87AcQgAFdvuoyiQ2kgELr2tV8B4fP/xJAVUL3Yb3bkNdMedD3d0rlSQr3PegP0cms3eHjl1F7PWlvWbU8FQ==", + "version": "7.8.6", + "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz", + "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/parser": "^7.8.3", - "@babel/types": "^7.8.3" + "@babel/parser": "^7.8.6", + "@babel/types": "^7.8.6" } }, "@babel/traverse": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.8.4.tgz", - "integrity": "sha512-NGLJPZwnVEyBPLI+bl9y9aSnxMhsKz42so7ApAv9D+b4vAFPpY013FTS9LdKxcABoIYFU52HcYga1pPlx454mg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.0.tgz", + "integrity": "sha512-jAZQj0+kn4WTHO5dUZkZKhbFrqZE7K5LAQ5JysMnmvGij+wOdr+8lWqPeW0BcF4wFwrEXXtdGO7wcV6YPJcf3w==", "dev": true, "requires": { "@babel/code-frame": "^7.8.3", - "@babel/generator": "^7.8.4", + "@babel/generator": "^7.9.0", "@babel/helper-function-name": "^7.8.3", "@babel/helper-split-export-declaration": "^7.8.3", - "@babel/parser": "^7.8.4", - "@babel/types": "^7.8.3", + "@babel/parser": "^7.9.0", + "@babel/types": "^7.9.0", "debug": "^4.1.0", "globals": "^11.1.0", "lodash": "^4.17.13" } }, "@babel/types": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.8.3.tgz", - "integrity": "sha512-jBD+G8+LWpMBBWvVcdr4QysjUE4mU/syrhN17o1u3gx0/WzJB1kwiVZAXRtWbsIPOwW8pF/YJV5+nmetPzepXg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.0.tgz", + "integrity": "sha512-BS9JKfXkzzJl8RluW4JGknzpiUV7ZrvTayM6yfqLTVBEnFtyowVIOu6rqxRd5cVO6yGoWf4T8u8dgK9oB+GCng==", "dev": true, "requires": { - "esutils": "^2.0.2", + "@babel/helper-validator-identifier": "^7.9.0", "lodash": "^4.17.13", "to-fast-properties": "^2.0.0" } @@ -250,14 +327,6 @@ "requires": { "exec-sh": "^0.3.2", "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } } }, "@istanbuljs/load-nyc-config": { @@ -279,89 +348,88 @@ "dev": true }, "@jest/console": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.1.0.tgz", - "integrity": "sha512-3P1DpqAMK/L07ag/Y9/Jup5iDEG9P4pRAuZiMQnU0JB3UOvCyYCjCoxr7sIA80SeyUCUKrr24fKAxVpmBgQonA==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@jest/console/-/console-25.2.3.tgz", + "integrity": "sha512-k+37B1aSvOt9tKHWbZZSOy1jdgzesB0bj96igCVUG1nAH1W5EoUfgc5EXbBVU08KSLvkVdWopLXaO3xfVGlxtQ==", "dev": true, "requires": { - "@jest/source-map": "^25.1.0", + "@jest/source-map": "^25.2.1", "chalk": "^3.0.0", - "jest-util": "^25.1.0", + "jest-util": "^25.2.3", "slash": "^3.0.0" } }, "@jest/core": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.1.0.tgz", - "integrity": "sha512-iz05+NmwCmZRzMXvMo6KFipW7nzhbpEawrKrkkdJzgytavPse0biEnCNr2wRlyCsp3SmKaEY+SGv7YWYQnIdig==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@jest/core/-/core-25.2.3.tgz", + "integrity": "sha512-Ifz3aEkGvZhwijLMmWa7sloZVEMdxpzjFv3CKHv3eRYRShTN8no6DmyvvxaZBjLalOlRalJ7HDgc733J48tSuw==", "dev": true, "requires": { - "@jest/console": "^25.1.0", - "@jest/reporters": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/console": "^25.2.3", + "@jest/reporters": "^25.2.3", + "@jest/test-result": "^25.2.3", + "@jest/transform": "^25.2.3", + "@jest/types": "^25.2.3", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.3", - "jest-changed-files": "^25.1.0", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-resolve-dependencies": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "jest-watcher": "^25.1.0", + "jest-changed-files": "^25.2.3", + "jest-config": "^25.2.3", + "jest-haste-map": "^25.2.3", + "jest-message-util": "^25.2.3", + "jest-regex-util": "^25.2.1", + "jest-resolve": "^25.2.3", + "jest-resolve-dependencies": "^25.2.3", + "jest-runner": "^25.2.3", + "jest-runtime": "^25.2.3", + "jest-snapshot": "^25.2.3", + "jest-util": "^25.2.3", + "jest-validate": "^25.2.3", + "jest-watcher": "^25.2.3", "micromatch": "^4.0.2", "p-each-series": "^2.1.0", - "realpath-native": "^1.1.0", + "realpath-native": "^2.0.0", "rimraf": "^3.0.0", "slash": "^3.0.0", "strip-ansi": "^6.0.0" } }, "@jest/environment": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.1.0.tgz", - "integrity": "sha512-cTpUtsjU4cum53VqBDlcW0E4KbQF03Cn0jckGPW/5rrE9tb+porD3+hhLtHAwhthsqfyF+bizyodTlsRA++sHg==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-25.2.3.tgz", + "integrity": "sha512-zRypAMQnNo8rD0rCbI9+5xf+Lu+uvunKZNBcIWjb3lTATSomKbgYO+GYewGDYn7pf+30XCNBc6SH1rnBUN1ioA==", "dev": true, "requires": { - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0" + "@jest/fake-timers": "^25.2.3", + "@jest/types": "^25.2.3", + "jest-mock": "^25.2.3" } }, "@jest/fake-timers": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.1.0.tgz", - "integrity": "sha512-Eu3dysBzSAO1lD7cylZd/CVKdZZ1/43SF35iYBNV1Lvvn2Undp3Grwsv8PrzvbLhqwRzDd4zxrY4gsiHc+wygQ==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-25.2.3.tgz", + "integrity": "sha512-B6Qxm86fl613MV8egfvh1mRTMu23hMNdOUjzPhKl/4Nm5cceHz6nwLn0nP0sJXI/ue1vu71aLbtkgVBCgc2hYA==", "dev": true, "requires": { - "@jest/types": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", + "@jest/types": "^25.2.3", + "jest-message-util": "^25.2.3", + "jest-mock": "^25.2.3", + "jest-util": "^25.2.3", "lolex": "^5.0.0" } }, "@jest/reporters": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.1.0.tgz", - "integrity": "sha512-ORLT7hq2acJQa8N+NKfs68ZtHFnJPxsGqmofxW7v7urVhzJvpKZG9M7FAcgh9Ee1ZbCteMrirHA3m5JfBtAaDg==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-25.2.3.tgz", + "integrity": "sha512-S0Zca5e7tTfGgxGRvBh6hktNdOBzqc6HthPzYHPRFYVW81SyzCqHTaNZydtDIVehb9s6NlyYZpcF/I2vco+lNw==", "dev": true, "requires": { "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/console": "^25.2.3", + "@jest/test-result": "^25.2.3", + "@jest/transform": "^25.2.3", + "@jest/types": "^25.2.3", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", @@ -371,11 +439,10 @@ "istanbul-lib-report": "^3.0.0", "istanbul-lib-source-maps": "^4.0.0", "istanbul-reports": "^3.0.0", - "jest-haste-map": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", + "jest-haste-map": "^25.2.3", + "jest-resolve": "^25.2.3", + "jest-util": "^25.2.3", + "jest-worker": "^25.2.1", "node-notifier": "^6.0.0", "slash": "^3.0.0", "source-map": "^0.6.0", @@ -385,9 +452,9 @@ } }, "@jest/source-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.1.0.tgz", - "integrity": "sha512-ohf2iKT0xnLWcIUhL6U6QN+CwFWf9XnrM2a6ybL9NXxJjgYijjLSitkYHIdzkd8wFliH73qj/+epIpTiWjRtAA==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-25.2.1.tgz", + "integrity": "sha512-PgScGJm1U27+9Te/cxP4oUFqJ2PX6NhBL2a6unQ7yafCgs8k02c0LSyjSIx/ao0AwcAdCczfAPDf5lJ7zoB/7A==", "dev": true, "requires": { "callsites": "^3.0.0", @@ -396,58 +463,58 @@ } }, "@jest/test-result": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.1.0.tgz", - "integrity": "sha512-FZzSo36h++U93vNWZ0KgvlNuZ9pnDnztvaM7P/UcTx87aPDotG18bXifkf1Ji44B7k/eIatmMzkBapnAzjkJkg==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-25.2.3.tgz", + "integrity": "sha512-cNYidqERTcT+xqZZ5FPSvji7Bd2YYq9M/VJCEUmgTVRFZRPOPSu65crEzQJ4czcDChEJ9ovzZ65r3UBlajnh3w==", "dev": true, "requires": { - "@jest/console": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/console": "^25.2.3", + "@jest/transform": "^25.2.3", + "@jest/types": "^25.2.3", "@types/istanbul-lib-coverage": "^2.0.0", "collect-v8-coverage": "^1.0.0" } }, "@jest/test-sequencer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.1.0.tgz", - "integrity": "sha512-WgZLRgVr2b4l/7ED1J1RJQBOharxS11EFhmwDqknpknE0Pm87HLZVS2Asuuw+HQdfQvm2aXL2FvvBLxOD1D0iw==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-25.2.3.tgz", + "integrity": "sha512-trHwV/wCrxWyZyNyNBUQExsaHyBVQxJwH3butpEcR+KBJPfaTUxtpXaxfs38IXXAhH68J4kPZgAaRRfkFTLunA==", "dev": true, "requires": { - "@jest/test-result": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-runner": "^25.1.0", - "jest-runtime": "^25.1.0" + "@jest/test-result": "^25.2.3", + "jest-haste-map": "^25.2.3", + "jest-runner": "^25.2.3", + "jest-runtime": "^25.2.3" } }, "@jest/transform": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.1.0.tgz", - "integrity": "sha512-4ktrQ2TPREVeM+KxB4zskAT84SnmG1vaz4S+51aTefyqn3zocZUnliLLm5Fsl85I3p/kFPN4CRp1RElIfXGegQ==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-25.2.3.tgz", + "integrity": "sha512-w1nfAuYP4OAiEDprFkE/2iwU86jL/hK3j1ylMcYOA3my5VOHqX0oeBcBxS2fUKWse2V4izuO2jqes0yNTDMlzw==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.3", "babel-plugin-istanbul": "^6.0.0", "chalk": "^3.0.0", "convert-source-map": "^1.4.0", "fast-json-stable-stringify": "^2.0.0", "graceful-fs": "^4.2.3", - "jest-haste-map": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-util": "^25.1.0", + "jest-haste-map": "^25.2.3", + "jest-regex-util": "^25.2.1", + "jest-util": "^25.2.3", "micromatch": "^4.0.2", "pirates": "^4.0.1", - "realpath-native": "^1.1.0", + "realpath-native": "^2.0.0", "slash": "^3.0.0", "source-map": "^0.6.1", "write-file-atomic": "^3.0.0" } }, "@jest/types": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.1.0.tgz", - "integrity": "sha512-VpOtt7tCrgvamWZh1reVsGADujKigBUFTi19mlRjqEGsE8qH4r3s+skY33dNdXOwyZIvuftZ5tqdF1IgsMejMA==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/@jest/types/-/types-25.2.3.tgz", + "integrity": "sha512-6oLQwO9mKif3Uph3RX5J1i3S7X7xtDHWBaaaoeKw8hOzV6YUd0qDcYcHZ6QXMHDIzSr7zzrEa51o2Ovlj6AtKQ==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.0", @@ -457,18 +524,18 @@ } }, "@sinonjs/commons": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.0.tgz", - "integrity": "sha512-qbk9AP+cZUsKdW1GJsBpxPKFmCJ0T8swwzVje3qFd+AkQb74Q/tiuzrdfFg8AD2g5HH/XbE/I8Uc1KYHVYWfhg==", + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-1.7.1.tgz", + "integrity": "sha512-Debi3Baff1Qu1Unc3mjJ96MgpbwTn43S1+9yJ0llWygPwDNu2aaWBD6yc9y/Z8XDRNhx7U+u2UDg2OGQXkclUQ==", "dev": true, "requires": { "type-detect": "4.0.8" } }, "@types/babel__core": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.4.tgz", - "integrity": "sha512-c/5MuRz5HM4aizqL5ViYfW4iEnmfPcfbH4Xa6GgLT21dMc1NGeNnuS6egHheOmP+kCJ9CAzC4pv4SDCWTnRkbg==", + "version": "7.1.6", + "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.1.6.tgz", + "integrity": "sha512-tTnhWszAqvXnhW7m5jQU9PomXSiKXk2sFxpahXvI20SZKu9ylPi8WtIxueZ6ehDWikPT0jeFujMj3X4ZHuf3Tg==", "dev": true, "requires": { "@babel/parser": "^7.1.0", @@ -498,9 +565,9 @@ } }, "@types/babel__traverse": { - "version": "7.0.8", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.8.tgz", - "integrity": "sha512-yGeB2dHEdvxjP0y4UbRtQaSkXJ9649fYCmIdRoul5kfAoGCwxuCbMhag0k3RPfnuh9kPGm8x89btcfDEXdVWGw==", + "version": "7.0.9", + "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.0.9.tgz", + "integrity": "sha512-jEFQ8L1tuvPjOI8lnpaf73oCJe+aoxL6ygqSy6c8LcW98zaC+4mzWuQIRCEvKeCOu+lbqdXcg4Uqmm1S8AP1tw==", "dev": true, "requires": { "@babel/types": "^7.3.0" @@ -538,15 +605,21 @@ } }, "@types/jest": { - "version": "25.1.2", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.2.tgz", - "integrity": "sha512-EsPIgEsonlXmYV7GzUqcvORsSS9Gqxw/OvkGwHfAdpjduNRxMlhsav0O5Kb0zijc/eXSO/uW6SJt9nwull8AUQ==", + "version": "25.1.4", + "resolved": "https://registry.npmjs.org/@types/jest/-/jest-25.1.4.tgz", + "integrity": "sha512-QDDY2uNAhCV7TMCITrxz+MRk1EizcsevzfeS6LykIlq2V1E5oO4wXG8V2ZEd9w7Snxeeagk46YbMgZ8ESHx3sw==", "dev": true, "requires": { "jest-diff": "^25.1.0", "pretty-format": "^25.1.0" } }, + "@types/prettier": { + "version": "1.19.1", + "resolved": "https://registry.npmjs.org/@types/prettier/-/prettier-1.19.1.tgz", + "integrity": "sha512-5qOlnZscTn4xxM5MeGXAMOsIOIKIbh9e85zJWfBRVPlRMEVawzoPhINYbRGkBZCI8LxvBe7tJCdWiarA99OZfQ==", + "dev": true + }, "@types/stack-utils": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-1.0.1.tgz", @@ -554,9 +627,9 @@ "dev": true }, "@types/yargs": { - "version": "15.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.3.tgz", - "integrity": "sha512-XCMQRK6kfpNBixHLyHUsGmXrpEmFFxzMrcnSXFMziHd8CoNJo8l16FkHyQq4x+xbM7E2XL83/O78OD8u+iZTdQ==", + "version": "15.0.4", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-15.0.4.tgz", + "integrity": "sha512-9T1auFmbPZoxHz0enUFlUuKRy3it01R+hlggyVUMtnCTQRunsQYifnSGb8hET4Xo8yiC0o0r1paW3ud5+rbURg==", "dev": true, "requires": { "@types/yargs-parser": "*" @@ -605,9 +678,9 @@ "dev": true }, "ajv": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.11.0.tgz", - "integrity": "sha512-nCprB/0syFYy9fVYU1ox1l2KN8S9I+tziH8D4zdZuLT3N6RMlGSGt5FSTpAiHB/Whv8Qs1cWHma1aMKZyaHRKA==", + "version": "6.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.0.tgz", + "integrity": "sha512-D6gFiFA0RRLyUbvijN74DWAjXSFxWKaWP7mldxkVhyhAV3+SWA9HEJPHQ2c9soIeTFJqcSdFDGFgdqs1iUU2Hw==", "dev": true, "requires": { "fast-deep-equal": "^3.1.1", @@ -617,12 +690,12 @@ } }, "ansi-escapes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.0.tgz", - "integrity": "sha512-EiYhwo0v255HUL6eDyuLrXEkTi7WwVCLAw+SeOQ7M7qdun1z1pum4DEm/nuqIVbPvi9RPPc9k9LbyBv6H0DwVg==", + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.1.tgz", + "integrity": "sha512-JWF7ocqNrp8u9oqpgV+wH5ftbt+cfvv+PTjOvKLT3AdYly/LmORARfEVT1iyjwN+4MqE5UmVKoAdIBqeoCHgLA==", "dev": true, "requires": { - "type-fest": "^0.8.1" + "type-fest": "^0.11.0" } }, "ansi-regex": { @@ -742,16 +815,16 @@ "dev": true }, "babel-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.1.0.tgz", - "integrity": "sha512-tz0VxUhhOE2y+g8R2oFrO/2VtVjA1lkJeavlhExuRBg3LdNJY9gwQ+Vcvqt9+cqy71MCTJhewvTB7Qtnnr9SWg==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-25.2.3.tgz", + "integrity": "sha512-03JjvEwuDrEz/A45K8oggAv+Vqay0xcOdNTJxYFxiuZvB5vlHKo1iZg9Pi5vQTHhNCKpGLb7L/jvUUafyh9j7g==", "dev": true, "requires": { - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/transform": "^25.2.3", + "@jest/types": "^25.2.3", "@types/babel__core": "^7.1.0", "babel-plugin-istanbul": "^6.0.0", - "babel-preset-jest": "^25.1.0", + "babel-preset-jest": "^25.2.1", "chalk": "^3.0.0", "slash": "^3.0.0" } @@ -770,23 +843,23 @@ } }, "babel-plugin-jest-hoist": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.1.0.tgz", - "integrity": "sha512-oIsopO41vW4YFZ9yNYoLQATnnN46lp+MZ6H4VvPKFkcc2/fkl3CfE/NZZSmnEIEsJRmJAgkVEK0R7Zbl50CpTw==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-25.2.1.tgz", + "integrity": "sha512-HysbCQfJhxLlyxDbKcB2ucGYV0LjqK4h6dBoI3RtFuOxTiTWK6XGZMsHb0tGh8iJdV4hC6Z2GCHzVvDeh9i0lQ==", "dev": true, "requires": { "@types/babel__traverse": "^7.0.6" } }, "babel-preset-jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.1.0.tgz", - "integrity": "sha512-eCGn64olaqwUMaugXsTtGAM2I0QTahjEtnRu0ql8Ie+gDWAc1N6wqN0k2NilnyTunM69Pad7gJY7LOtwLimoFQ==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-25.2.1.tgz", + "integrity": "sha512-zXHJBM5iR8oEO4cvdF83AQqqJf3tJrXy3x8nfu2Nlqvn4cneg4Ca8M7cQvC5S9BzDDy1O0tZ9iXru9J6E3ym+A==", "dev": true, "requires": { "@babel/plugin-syntax-bigint": "^7.0.0", "@babel/plugin-syntax-object-rest-spread": "^7.0.0", - "babel-plugin-jest-hoist": "^25.1.0" + "babel-plugin-jest-hoist": "^25.2.1" } }, "balanced-match": { @@ -879,9 +952,9 @@ } }, "browser-process-hrtime": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-0.1.3.tgz", - "integrity": "sha512-bRFnI4NnjO6cnyLmOV/7PVoDEMJChlcfN0z4s1YMBY989/SvlfMI1lgCnkFUs53e9gQF+w7qu7XdllSTiSl8Aw==", + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==", "dev": true }, "browser-resolve": { @@ -1109,6 +1182,23 @@ "semver": "^5.5.0", "shebang-command": "^1.2.0", "which": "^1.2.9" + }, + "dependencies": { + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "dev": true + }, + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "dev": true, + "requires": { + "isexe": "^2.0.0" + } + } } }, "cssom": { @@ -1181,14 +1271,11 @@ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", "dev": true }, - "define-properties": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz", - "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==", - "dev": true, - "requires": { - "object-keys": "^1.0.12" - } + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "dev": true }, "define-property": { "version": "2.0.2", @@ -1244,9 +1331,9 @@ "dev": true }, "diff-sequences": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.1.0.tgz", - "integrity": "sha512-nFIfVk5B/NStCsJ+zaPO4vYuLjlzQ6uFvPxzYyHlejNZ/UGa7G/n7peOXVrVNvRuyfstt+mZQYGpjxg9Z6N8Kw==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/diff-sequences/-/diff-sequences-25.2.1.tgz", + "integrity": "sha512-foe7dXnGlSh3jR1ovJmdv+77VQj98eKCHHwJPbZ2eEf0fHwKbkZicpPxEch9smZ+n2dnF6QFwkOQdLq9hpeJUg==", "dev": true }, "domexception": { @@ -1283,36 +1370,6 @@ "once": "^1.4.0" } }, - "es-abstract": { - "version": "1.17.4", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.4.tgz", - "integrity": "sha512-Ae3um/gb8F0mui/jPL+QiqmglkUsaQf7FwBEHYIFkztkneosu9imhqHpBzQ3h1vit8t5iQ74t6PEVvphBZiuiQ==", - "dev": true, - "requires": { - "es-to-primitive": "^1.2.1", - "function-bind": "^1.1.1", - "has": "^1.0.3", - "has-symbols": "^1.0.1", - "is-callable": "^1.1.5", - "is-regex": "^1.0.5", - "object-inspect": "^1.7.0", - "object-keys": "^1.1.1", - "object.assign": "^4.1.0", - "string.prototype.trimleft": "^2.1.1", - "string.prototype.trimright": "^2.1.1" - } - }, - "es-to-primitive": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz", - "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==", - "dev": true, - "requires": { - "is-callable": "^1.1.4", - "is-date-object": "^1.0.1", - "is-symbol": "^1.0.2" - } - }, "escape-string-regexp": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", @@ -1428,17 +1485,17 @@ } }, "expect": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/expect/-/expect-25.1.0.tgz", - "integrity": "sha512-wqHzuoapQkhc3OKPlrpetsfueuEiMf3iWh0R8+duCu9PIjXoP7HgD5aeypwTnXUAjC8aMsiVDaWwlbJ1RlQ38g==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/expect/-/expect-25.2.3.tgz", + "integrity": "sha512-kil4jFRFAK2ySyCyXPqYrphc3EiiKKFd9BthrkKAyHcqr1B84xFTuj5kO8zL+eHRRjT2jQsOPExO0+1Q/fuUXg==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.3", "ansi-styles": "^4.0.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-regex-util": "^25.1.0" + "jest-get-type": "^25.2.1", + "jest-matcher-utils": "^25.2.3", + "jest-message-util": "^25.2.3", + "jest-regex-util": "^25.2.1" } }, "extend": { @@ -1630,12 +1687,6 @@ "dev": true, "optional": true }, - "function-bind": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", - "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", - "dev": true - }, "gensync": { "version": "1.0.0-beta.1", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.1.tgz", @@ -1721,27 +1772,12 @@ "har-schema": "^2.0.0" } }, - "has": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz", - "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", - "dev": true, - "requires": { - "function-bind": "^1.1.1" - } - }, "has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", "dev": true }, - "has-symbols": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz", - "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==", - "dev": true - }, "has-value": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", @@ -1804,9 +1840,9 @@ } }, "html-escaper": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.0.tgz", - "integrity": "sha512-a4u9BeERWGu/S8JiWEAQcdrg9v4QArtP9keViQjGMdff20fBdd8waotXaNmODqBe6uZ3Nafi7K/ho4gCQHV3Ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", + "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", "dev": true }, "http-signature": { @@ -1899,12 +1935,6 @@ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", "dev": true }, - "is-callable": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz", - "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==", - "dev": true - }, "is-ci": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/is-ci/-/is-ci-2.0.0.tgz", @@ -1934,12 +1964,6 @@ } } }, - "is-date-object": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz", - "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==", - "dev": true - }, "is-descriptor": { "version": "0.1.6", "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", @@ -1992,30 +2016,12 @@ "isobject": "^3.0.1" } }, - "is-regex": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz", - "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==", - "dev": true, - "requires": { - "has": "^1.0.3" - } - }, "is-stream": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=", "dev": true }, - "is-symbol": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz", - "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==", - "dev": true, - "requires": { - "has-symbols": "^1.0.1" - } - }, "is-typedarray": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", @@ -2078,14 +2084,6 @@ "@istanbuljs/schema": "^0.1.2", "istanbul-lib-coverage": "^3.0.0", "semver": "^6.3.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "istanbul-lib-report": { @@ -2111,9 +2109,9 @@ } }, "istanbul-reports": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.0.tgz", - "integrity": "sha512-2osTcC8zcOSUkImzN2EWQta3Vdi4WjjKw99P2yWx5mLnigAM0Rd5uYFn1cf2i/Ois45GkNjaoTqc5CxgMSX80A==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.0.1.tgz", + "integrity": "sha512-Vm9xwCiQ8t2cNNnckyeAV0UdxKpcQUz4nMxsBvIu8n2kmPSiyb5uaF/8LpmKr+yqL/MdOXaX2Nmdo4Qyxium9Q==", "dev": true, "requires": { "html-escaper": "^2.0.0", @@ -2121,46 +2119,46 @@ } }, "jest": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest/-/jest-25.1.0.tgz", - "integrity": "sha512-FV6jEruneBhokkt9MQk0WUFoNTwnF76CLXtwNMfsc0um0TlB/LG2yxUd0KqaFjEJ9laQmVWQWS0sG/t2GsuI0w==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest/-/jest-25.2.3.tgz", + "integrity": "sha512-UbUmyGeZt0/sCIj/zsWOY0qFfQsx2qEFIZp0iEj8yVH6qASfR22fJOf12gFuSPsdSufam+llZBB0MdXWCg6EEQ==", "dev": true, "requires": { - "@jest/core": "^25.1.0", + "@jest/core": "^25.2.3", "import-local": "^3.0.2", - "jest-cli": "^25.1.0" + "jest-cli": "^25.2.3" }, "dependencies": { "jest-cli": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.1.0.tgz", - "integrity": "sha512-p+aOfczzzKdo3AsLJlhs8J5EW6ffVidfSZZxXedJ0mHPBOln1DccqFmGCoO8JWd4xRycfmwy1eoQkMsF8oekPg==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-25.2.3.tgz", + "integrity": "sha512-T7G0TOkFj0wr33ki5xoq3bxkKC+liwJfjV9SmYIKBozwh91W4YjL1o1dgVCUTB1+sKJa/DiAY0p+eXYE6v2RGw==", "dev": true, "requires": { - "@jest/core": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/core": "^25.2.3", + "@jest/test-result": "^25.2.3", + "@jest/types": "^25.2.3", "chalk": "^3.0.0", "exit": "^0.1.2", "import-local": "^3.0.2", "is-ci": "^2.0.0", - "jest-config": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", + "jest-config": "^25.2.3", + "jest-util": "^25.2.3", + "jest-validate": "^25.2.3", "prompts": "^2.0.1", - "realpath-native": "^1.1.0", - "yargs": "^15.0.0" + "realpath-native": "^2.0.0", + "yargs": "^15.3.1" } } } }, "jest-changed-files": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.1.0.tgz", - "integrity": "sha512-bdL1aHjIVy3HaBO3eEQeemGttsq1BDlHgWcOjEOIAcga7OOEGWHD2WSu8HhL7I1F0mFFyci8VKU4tRNk+qtwDA==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-25.2.3.tgz", + "integrity": "sha512-EFxy94dvvbqRB36ezIPLKJ4fDIC+jAdNs8i8uTwFpaXd6H3LVc3ova1lNS4ZPWk09OCR2vq5kSdSQgar7zMORg==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.3", "execa": "^3.2.0", "throat": "^5.0.0" }, @@ -2244,185 +2242,179 @@ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", "dev": true - }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } } } }, "jest-config": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.1.0.tgz", - "integrity": "sha512-tLmsg4SZ5H7tuhBC5bOja0HEblM0coS3Wy5LTCb2C8ZV6eWLewHyK+3qSq9Bi29zmWQ7ojdCd3pxpx4l4d2uGw==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-25.2.3.tgz", + "integrity": "sha512-UpTNxN8DgmLLCXFizGuvwIw+ZAPB0T3jbKaFEkzJdGqhSsQrVrk1lxhZNamaVIpWirM2ptYmqwUzvoobGCEkiQ==", "dev": true, "requires": { "@babel/core": "^7.1.0", - "@jest/test-sequencer": "^25.1.0", - "@jest/types": "^25.1.0", - "babel-jest": "^25.1.0", + "@jest/test-sequencer": "^25.2.3", + "@jest/types": "^25.2.3", + "babel-jest": "^25.2.3", "chalk": "^3.0.0", + "deepmerge": "^4.2.2", "glob": "^7.1.1", - "jest-environment-jsdom": "^25.1.0", - "jest-environment-node": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", + "jest-environment-jsdom": "^25.2.3", + "jest-environment-node": "^25.2.3", + "jest-get-type": "^25.2.1", + "jest-jasmine2": "^25.2.3", + "jest-regex-util": "^25.2.1", + "jest-resolve": "^25.2.3", + "jest-util": "^25.2.3", + "jest-validate": "^25.2.3", "micromatch": "^4.0.2", - "pretty-format": "^25.1.0", - "realpath-native": "^1.1.0" + "pretty-format": "^25.2.3", + "realpath-native": "^2.0.0" } }, "jest-diff": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.1.0.tgz", - "integrity": "sha512-nepXgajT+h017APJTreSieh4zCqnSHEJ1iT8HDlewu630lSJ4Kjjr9KNzm+kzGwwcpsDE6Snx1GJGzzsefaEHw==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-25.2.3.tgz", + "integrity": "sha512-VtZ6LAQtaQpFsmEzps15dQc5ELbJxy4L2DOSo2Ev411TUEtnJPkAMD7JneVypeMJQ1y3hgxN9Ao13n15FAnavg==", "dev": true, "requires": { "chalk": "^3.0.0", - "diff-sequences": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "diff-sequences": "^25.2.1", + "jest-get-type": "^25.2.1", + "pretty-format": "^25.2.3" } }, "jest-docblock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.1.0.tgz", - "integrity": "sha512-370P/mh1wzoef6hUKiaMcsPtIapY25suP6JqM70V9RJvdKLrV4GaGbfUseUVk4FZJw4oTZ1qSCJNdrClKt5JQA==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-25.2.3.tgz", + "integrity": "sha512-d3/tmjLLrH5fpRGmIm3oFa3vOaD/IjPxtXVOrfujpfJ9y1tCDB1x/tvunmdOVAyF03/xeMwburl6ITbiQT1mVA==", "dev": true, "requires": { "detect-newline": "^3.0.0" } }, "jest-each": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.1.0.tgz", - "integrity": "sha512-R9EL8xWzoPySJ5wa0DXFTj7NrzKpRD40Jy+zQDp3Qr/2QmevJgkN9GqioCGtAJ2bW9P/MQRznQHQQhoeAyra7A==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-25.2.3.tgz", + "integrity": "sha512-RTlmCjsBDK2c9T5oO4MqccA3/5Y8BUtiEy7OOQik1iyCgdnNdHbI0pNEpyapZPBG0nlvZ4mIu7aY6zNUvLraAQ==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.3", "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0" + "jest-get-type": "^25.2.1", + "jest-util": "^25.2.3", + "pretty-format": "^25.2.3" } }, "jest-environment-jsdom": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.1.0.tgz", - "integrity": "sha512-ILb4wdrwPAOHX6W82GGDUiaXSSOE274ciuov0lztOIymTChKFtC02ddyicRRCdZlB5YSrv3vzr1Z5xjpEe1OHQ==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-environment-jsdom/-/jest-environment-jsdom-25.2.3.tgz", + "integrity": "sha512-TLg7nizxIYJafz6tOBAVSmO5Ekswf6Cf3Soseov+mgonXfdYi1I0OZlHlZMJb2fGyXem2ndYFCLrMkwcWPKAnQ==", "dev": true, "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0", - "jsdom": "^15.1.1" + "@jest/environment": "^25.2.3", + "@jest/fake-timers": "^25.2.3", + "@jest/types": "^25.2.3", + "jest-mock": "^25.2.3", + "jest-util": "^25.2.3", + "jsdom": "^15.2.1" } }, "jest-environment-node": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.1.0.tgz", - "integrity": "sha512-U9kFWTtAPvhgYY5upnH9rq8qZkj6mYLup5l1caAjjx9uNnkLHN2xgZy5mo4SyLdmrh/EtB9UPpKFShvfQHD0Iw==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-25.2.3.tgz", + "integrity": "sha512-Tu/wlGXfoLtBR4Ym+isz58z3TJkMYX4VnFTkrsxaTGYAxNLN7ArCwL51Ki0WrMd89v+pbCLDj/hDjrb4a2sOrw==", "dev": true, "requires": { - "@jest/environment": "^25.1.0", - "@jest/fake-timers": "^25.1.0", - "@jest/types": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-util": "^25.1.0" + "@jest/environment": "^25.2.3", + "@jest/fake-timers": "^25.2.3", + "@jest/types": "^25.2.3", + "jest-mock": "^25.2.3", + "jest-util": "^25.2.3", + "semver": "^6.3.0" } }, "jest-get-type": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.1.0.tgz", - "integrity": "sha512-yWkBnT+5tMr8ANB6V+OjmrIJufHtCAqI5ic2H40v+tRqxDmE0PGnIiTyvRWFOMtmVHYpwRqyazDbTnhpjsGvLw==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/jest-get-type/-/jest-get-type-25.2.1.tgz", + "integrity": "sha512-EYjTiqcDTCRJDcSNKbLTwn/LcDPEE7ITk8yRMNAOjEsN6yp+Uu+V1gx4djwnuj/DvWg0YGmqaBqPVGsPxlvE7w==", "dev": true }, "jest-haste-map": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.1.0.tgz", - "integrity": "sha512-/2oYINIdnQZAqyWSn1GTku571aAfs8NxzSErGek65Iu5o8JYb+113bZysRMcC/pjE5v9w0Yz+ldbj9NxrFyPyw==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-25.2.3.tgz", + "integrity": "sha512-pAP22OHtPr4qgZlJJFks2LLgoQUr4XtM1a+F5UaPIZNiCRnePA0hM3L7aiJ0gzwiNIYwMTfKRwG/S1L28J3A3A==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.3", "anymatch": "^3.0.3", "fb-watchman": "^2.0.0", "fsevents": "^2.1.2", "graceful-fs": "^4.2.3", - "jest-serializer": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", + "jest-serializer": "^25.2.1", + "jest-util": "^25.2.3", + "jest-worker": "^25.2.1", "micromatch": "^4.0.2", "sane": "^4.0.3", - "walker": "^1.0.7" + "walker": "^1.0.7", + "which": "^2.0.2" } }, "jest-jasmine2": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.1.0.tgz", - "integrity": "sha512-GdncRq7jJ7sNIQ+dnXvpKO2MyP6j3naNK41DTTjEAhLEdpImaDA9zSAZwDhijjSF/D7cf4O5fdyUApGBZleaEg==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-jasmine2/-/jest-jasmine2-25.2.3.tgz", + "integrity": "sha512-x9PEGPFdnkSwJj1UG4QxG9JxFdyP8fuJ/UfKXd/eSpK8w9x7MP3VaQDuPQF0UQhCT0YeOITEPkQyqS+ptt0suA==", "dev": true, "requires": { "@babel/traverse": "^7.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/environment": "^25.2.3", + "@jest/source-map": "^25.2.1", + "@jest/test-result": "^25.2.3", + "@jest/types": "^25.2.3", "chalk": "^3.0.0", "co": "^4.6.0", - "expect": "^25.1.0", + "expect": "^25.2.3", "is-generator-fn": "^2.0.0", - "jest-each": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "pretty-format": "^25.1.0", + "jest-each": "^25.2.3", + "jest-matcher-utils": "^25.2.3", + "jest-message-util": "^25.2.3", + "jest-runtime": "^25.2.3", + "jest-snapshot": "^25.2.3", + "jest-util": "^25.2.3", + "pretty-format": "^25.2.3", "throat": "^5.0.0" } }, "jest-leak-detector": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.1.0.tgz", - "integrity": "sha512-3xRI264dnhGaMHRvkFyEKpDeaRzcEBhyNrOG5oT8xPxOyUAblIAQnpiR3QXu4wDor47MDTiHbiFcbypdLcLW5w==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-25.2.3.tgz", + "integrity": "sha512-yblCMPE7NJKl7778Cf/73yyFWAas5St0iiEBwq7RDyaz6Xd4WPFnPz2j7yDb/Qce71A1IbDoLADlcwD8zT74Aw==", "dev": true, "requires": { - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "jest-get-type": "^25.2.1", + "pretty-format": "^25.2.3" } }, "jest-matcher-utils": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.1.0.tgz", - "integrity": "sha512-KGOAFcSFbclXIFE7bS4C53iYobKI20ZWleAdAFun4W1Wz1Kkej8Ng6RRbhL8leaEvIOjGXhGf/a1JjO8bkxIWQ==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-25.2.3.tgz", + "integrity": "sha512-ZmiXiwQRVM9MoKjGMP5YsGGk2Th5ncyRxfXKz5AKsmU8m43kgNZirckVzaP61MlSa9LKmXbevdYqVp1ZKAw2Rw==", "dev": true, "requires": { "chalk": "^3.0.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "pretty-format": "^25.1.0" + "jest-diff": "^25.2.3", + "jest-get-type": "^25.2.1", + "pretty-format": "^25.2.3" } }, "jest-message-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.1.0.tgz", - "integrity": "sha512-Nr/Iwar2COfN22aCqX0kCVbXgn8IBm9nWf4xwGr5Olv/KZh0CZ32RKgZWMVDXGdOahicM10/fgjdimGNX/ttCQ==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-25.2.3.tgz", + "integrity": "sha512-DcyDmdO5LVIeS0ngRvd7rk701XL60dAakUeQJ1tQRby27fyLYXD+V0nqVaC194W7fIlohjVQOZPHmKXIjn+Byw==", "dev": true, "requires": { "@babel/code-frame": "^7.0.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/test-result": "^25.2.3", + "@jest/types": "^25.2.3", "@types/stack-utils": "^1.0.1", "chalk": "^3.0.0", "micromatch": "^4.0.2", @@ -2431,12 +2423,12 @@ } }, "jest-mock": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.1.0.tgz", - "integrity": "sha512-28/u0sqS+42vIfcd1mlcg4ZVDmSUYuNvImP4X2lX5hRMLW+CN0BeiKVD4p+ujKKbSPKd3rg/zuhCF+QBLJ4vag==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-25.2.3.tgz", + "integrity": "sha512-xlf+pyY0j47zoCs8zGGOGfWyxxLximE8YFOfEK8s4FruR8DtM/UjNj61um+iDuMAFEBDe1bhCXkqiKoCmWjJzg==", "dev": true, "requires": { - "@jest/types": "^25.1.0" + "@jest/types": "^25.2.3" } }, "jest-pnp-resolver": { @@ -2446,174 +2438,168 @@ "dev": true }, "jest-regex-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.1.0.tgz", - "integrity": "sha512-9lShaDmDpqwg+xAd73zHydKrBbbrIi08Kk9YryBEBybQFg/lBWR/2BDjjiSE7KIppM9C5+c03XiDaZ+m4Pgs1w==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-25.2.1.tgz", + "integrity": "sha512-wroFVJw62LdqTdkL508ZLV82FrJJWVJMIuYG7q4Uunl1WAPTf4ftPKrqqfec4SvOIlvRZUdEX2TFpWR356YG/w==", "dev": true }, "jest-resolve": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.1.0.tgz", - "integrity": "sha512-XkBQaU1SRCHj2Evz2Lu4Czs+uIgJXWypfO57L7JYccmAXv4slXA6hzNblmcRmf7P3cQ1mE7fL3ABV6jAwk4foQ==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-25.2.3.tgz", + "integrity": "sha512-1vZMsvM/DBH258PnpUNSXIgtzpYz+vCVCj9+fcy4akZl4oKbD+9hZSlfe9RIDpU0Fc28ozHQrmwX3EqFRRIHGg==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.3", "browser-resolve": "^1.11.3", "chalk": "^3.0.0", "jest-pnp-resolver": "^1.2.1", - "realpath-native": "^1.1.0" + "realpath-native": "^2.0.0", + "resolve": "^1.15.1" } }, "jest-resolve-dependencies": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.1.0.tgz", - "integrity": "sha512-Cu/Je38GSsccNy4I2vL12ZnBlD170x2Oh1devzuM9TLH5rrnLW1x51lN8kpZLYTvzx9j+77Y5pqBaTqfdzVzrw==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-25.2.3.tgz", + "integrity": "sha512-mcWlvjXLlNzgdE9EQxHuaeWICNxozanim87EfyvPwTY0ryWusFZbgF6F8u3E0syJ4FFSooEm0lQ6fgYcnPGAFw==", "dev": true, "requires": { - "@jest/types": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-snapshot": "^25.1.0" + "@jest/types": "^25.2.3", + "jest-regex-util": "^25.2.1", + "jest-snapshot": "^25.2.3" } }, "jest-runner": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.1.0.tgz", - "integrity": "sha512-su3O5fy0ehwgt+e8Wy7A8CaxxAOCMzL4gUBftSs0Ip32S0epxyZPDov9Znvkl1nhVOJNf4UwAsnqfc3plfQH9w==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-25.2.3.tgz", + "integrity": "sha512-E+u2Zm2TmtTOFEbKs5jllLiV2fwiX77cYc08RdyYZNe/s06wQT3P47aV6a8Rv61L7E2Is7OmozLd0KI/DITRpg==", "dev": true, "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/console": "^25.2.3", + "@jest/environment": "^25.2.3", + "@jest/test-result": "^25.2.3", + "@jest/types": "^25.2.3", "chalk": "^3.0.0", "exit": "^0.1.2", "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-docblock": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-jasmine2": "^25.1.0", - "jest-leak-detector": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-runtime": "^25.1.0", - "jest-util": "^25.1.0", - "jest-worker": "^25.1.0", + "jest-config": "^25.2.3", + "jest-docblock": "^25.2.3", + "jest-haste-map": "^25.2.3", + "jest-jasmine2": "^25.2.3", + "jest-leak-detector": "^25.2.3", + "jest-message-util": "^25.2.3", + "jest-resolve": "^25.2.3", + "jest-runtime": "^25.2.3", + "jest-util": "^25.2.3", + "jest-worker": "^25.2.1", "source-map-support": "^0.5.6", "throat": "^5.0.0" } }, "jest-runtime": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.1.0.tgz", - "integrity": "sha512-mpPYYEdbExKBIBB16ryF6FLZTc1Rbk9Nx0ryIpIMiDDkOeGa0jQOKVI/QeGvVGlunKKm62ywcioeFVzIbK03bA==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-25.2.3.tgz", + "integrity": "sha512-PZRFeUVF08N24v2G73SDF0b0VpLG7cRNOJ3ggj5TnArBVHkkrWzM3z7txB9OupWu7OO8bH/jFogk6sSjnHLFXQ==", "dev": true, "requires": { - "@jest/console": "^25.1.0", - "@jest/environment": "^25.1.0", - "@jest/source-map": "^25.1.0", - "@jest/test-result": "^25.1.0", - "@jest/transform": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/console": "^25.2.3", + "@jest/environment": "^25.2.3", + "@jest/source-map": "^25.2.1", + "@jest/test-result": "^25.2.3", + "@jest/transform": "^25.2.3", + "@jest/types": "^25.2.3", "@types/yargs": "^15.0.0", "chalk": "^3.0.0", "collect-v8-coverage": "^1.0.0", "exit": "^0.1.2", "glob": "^7.1.3", "graceful-fs": "^4.2.3", - "jest-config": "^25.1.0", - "jest-haste-map": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-mock": "^25.1.0", - "jest-regex-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "jest-snapshot": "^25.1.0", - "jest-util": "^25.1.0", - "jest-validate": "^25.1.0", - "realpath-native": "^1.1.0", + "jest-config": "^25.2.3", + "jest-haste-map": "^25.2.3", + "jest-message-util": "^25.2.3", + "jest-mock": "^25.2.3", + "jest-regex-util": "^25.2.1", + "jest-resolve": "^25.2.3", + "jest-snapshot": "^25.2.3", + "jest-util": "^25.2.3", + "jest-validate": "^25.2.3", + "realpath-native": "^2.0.0", "slash": "^3.0.0", "strip-bom": "^4.0.0", - "yargs": "^15.0.0" + "yargs": "^15.3.1" } }, "jest-serializer": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.1.0.tgz", - "integrity": "sha512-20Wkq5j7o84kssBwvyuJ7Xhn7hdPeTXndnwIblKDR2/sy1SUm6rWWiG9kSCgJPIfkDScJCIsTtOKdlzfIHOfKA==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/jest-serializer/-/jest-serializer-25.2.1.tgz", + "integrity": "sha512-fibDi7M5ffx6c/P66IkvR4FKkjG5ldePAK1WlbNoaU4GZmIAkS9Le/frAwRUFEX0KdnisSPWf+b1RC5jU7EYJQ==", "dev": true }, "jest-snapshot": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.1.0.tgz", - "integrity": "sha512-xZ73dFYN8b/+X2hKLXz4VpBZGIAn7muD/DAg+pXtDzDGw3iIV10jM7WiHqhCcpDZfGiKEj7/2HXAEPtHTj0P2A==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-25.2.3.tgz", + "integrity": "sha512-HlFVbE6vOZ541mtkwjuAe0rfx9EWhB+QXXneLNOP/s3LlHxGQtX7WFXY5OiH4CkAnCc6BpzLNYS9nfINNRb4Zg==", "dev": true, "requires": { "@babel/types": "^7.0.0", - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.3", + "@types/prettier": "^1.19.0", "chalk": "^3.0.0", - "expect": "^25.1.0", - "jest-diff": "^25.1.0", - "jest-get-type": "^25.1.0", - "jest-matcher-utils": "^25.1.0", - "jest-message-util": "^25.1.0", - "jest-resolve": "^25.1.0", - "mkdirp": "^0.5.1", + "expect": "^25.2.3", + "jest-diff": "^25.2.3", + "jest-get-type": "^25.2.1", + "jest-matcher-utils": "^25.2.3", + "jest-message-util": "^25.2.3", + "jest-resolve": "^25.2.3", + "make-dir": "^3.0.0", "natural-compare": "^1.4.0", - "pretty-format": "^25.1.0", - "semver": "^7.1.1" - }, - "dependencies": { - "semver": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.1.3.tgz", - "integrity": "sha512-ekM0zfiA9SCBlsKa2X1hxyxiI4L3B6EbVJkkdgQXnSEEaHlGdvyodMruTiulSRWMMB4NeIuYNMC9rTKTz97GxA==", - "dev": true - } + "pretty-format": "^25.2.3", + "semver": "^6.3.0" } }, "jest-util": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.1.0.tgz", - "integrity": "sha512-7did6pLQ++87Qsj26Fs/TIwZMUFBXQ+4XXSodRNy3luch2DnRXsSnmpVtxxQ0Yd6WTipGpbhh2IFP1mq6/fQGw==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-25.2.3.tgz", + "integrity": "sha512-7tWiMICVSo9lNoObFtqLt9Ezt5exdFlWs5fLe1G4XLY2lEbZc814cw9t4YHScqBkWMfzth8ASHKlYBxiX2rdCw==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.3", "chalk": "^3.0.0", "is-ci": "^2.0.0", - "mkdirp": "^0.5.1" + "make-dir": "^3.0.0" } }, "jest-validate": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.1.0.tgz", - "integrity": "sha512-kGbZq1f02/zVO2+t1KQGSVoCTERc5XeObLwITqC6BTRH3Adv7NZdYqCpKIZLUgpLXf2yISzQ465qOZpul8abXA==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-25.2.3.tgz", + "integrity": "sha512-GObn91jzU0B0Bv4cusAwjP6vnWy78hJUM8MOSz7keRfnac/ZhQWIsUjvk01IfeXNTemCwgR57EtdjQMzFZGREg==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.3", "camelcase": "^5.3.1", "chalk": "^3.0.0", - "jest-get-type": "^25.1.0", + "jest-get-type": "^25.2.1", "leven": "^3.1.0", - "pretty-format": "^25.1.0" + "pretty-format": "^25.2.3" } }, "jest-watcher": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.1.0.tgz", - "integrity": "sha512-Q9eZ7pyaIr6xfU24OeTg4z1fUqBF/4MP6J801lyQfg7CsnZ/TCzAPvCfckKdL5dlBBEKBeHV0AdyjFZ5eWj4ig==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-25.2.3.tgz", + "integrity": "sha512-F6ERbdvJk8nbaRon9lLQVl4kp+vToCCHmy+uWW5QQ8/8/g2jkrZKJQnlQINrYQp0ewg31Bztkhs4nxsZMx6wDg==", "dev": true, "requires": { - "@jest/test-result": "^25.1.0", - "@jest/types": "^25.1.0", + "@jest/test-result": "^25.2.3", + "@jest/types": "^25.2.3", "ansi-escapes": "^4.2.1", "chalk": "^3.0.0", - "jest-util": "^25.1.0", + "jest-util": "^25.2.3", "string-length": "^3.1.0" } }, "jest-worker": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.1.0.tgz", - "integrity": "sha512-ZHhHtlxOWSxCoNOKHGbiLzXnl42ga9CxDr27H36Qn+15pQZd3R/F24jrmjDelw9j/iHUIWMWs08/u2QN50HHOg==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-25.2.1.tgz", + "integrity": "sha512-IHnpekk8H/hCUbBlfeaPZzU6v75bqwJp3n4dUrQuQOAgOneI4tx3jV2o8pvlXnDfcRsfkFIUD//HWXpCmR+evQ==", "dev": true, "requires": { "merge-stream": "^2.0.0", @@ -2701,20 +2687,12 @@ "dev": true }, "json5": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.1.tgz", - "integrity": "sha512-l+3HXD0GEI3huGq1njuqtzYK8OYJyXMkOLtQ53pjWh89tvWS2h6l+1zMkYWqlb57+SiQodKZyvMEFb2X+KrFhQ==", + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.2.tgz", + "integrity": "sha512-MoUOQ4WdiN3yxhm7NEVJSJrieAo5hNSLQ5sj05OTRHPL9HOBy8u4Bu88jsC1jvqAdN+E1bJmsUcZH+1HQxliqQ==", "dev": true, "requires": { - "minimist": "^1.2.0" - }, - "dependencies": { - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - } + "minimist": "^1.2.5" } }, "jsprim": { @@ -2800,20 +2778,12 @@ "dev": true, "requires": { "semver": "^6.0.0" - }, - "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true - } } }, "make-error": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.5.tgz", - "integrity": "sha512-c3sIjNUow0+8swNwVpqoH4YCShKNFkMaw6oH1mNS2haDZQqkeZFlHS3dhoeEbKKmJB4vXpJucU6oH75aDYeE9g==", + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", "dev": true }, "makeerror": { @@ -2887,9 +2857,9 @@ } }, "minimist": { - "version": "0.0.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", - "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==", "dev": true }, "mixin-deep": { @@ -2914,12 +2884,12 @@ } }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.4", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.4.tgz", + "integrity": "sha512-iG9AK/dJLtJ0XNgTuDbSyNS3zECqDlAhnQW4CsNxBG3LQJBbHmRX1egw39DmtOdCAqY+dKXV+sgPgilNWUKMVw==", "dev": true, "requires": { - "minimist": "0.0.8" + "minimist": "^1.2.5" } }, "ms": { @@ -2985,12 +2955,15 @@ "which": "^1.3.1" }, "dependencies": { - "semver": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "which": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", + "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", "dev": true, - "optional": true + "optional": true, + "requires": { + "isexe": "^2.0.0" + } } } }, @@ -3052,18 +3025,6 @@ } } }, - "object-inspect": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz", - "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==", - "dev": true - }, - "object-keys": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz", - "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==", - "dev": true - }, "object-visit": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", @@ -3073,28 +3034,6 @@ "isobject": "^3.0.0" } }, - "object.assign": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz", - "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==", - "dev": true, - "requires": { - "define-properties": "^1.1.2", - "function-bind": "^1.1.1", - "has-symbols": "^1.0.0", - "object-keys": "^1.0.11" - } - }, - "object.getownpropertydescriptors": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz", - "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.0-next.1" - } - }, "object.pick": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", @@ -3215,9 +3154,9 @@ "dev": true }, "picomatch": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.1.tgz", - "integrity": "sha512-ISBaA8xQNmwELC7eOjqFKMESB2VIqt4PPDD0nsS95b/9dZXvVKOlz9keMSnoGGKcOHXfTvDD6WMaRoSc9UuhRA==", + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.2.2.tgz", + "integrity": "sha512-q0M/9eZHzmr0AulXyPwNfZjtwZ/RBZlbN3K3CErVrk50T2ASYI7Bye0EvekFY3IP1Nt2DHu0re+V2ZHIpMkuWg==", "dev": true }, "pirates": { @@ -3257,21 +3196,21 @@ "dev": true }, "pretty-format": { - "version": "25.1.0", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.1.0.tgz", - "integrity": "sha512-46zLRSGLd02Rp+Lhad9zzuNZ+swunitn8zIpfD2B4OPCRLXbM87RJT2aBLBWYOznNUML/2l/ReMyWNC80PJBUQ==", + "version": "25.2.3", + "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-25.2.3.tgz", + "integrity": "sha512-IP4+5UOAVGoyqC/DiomOeHBUKN6q00gfyT2qpAsRH64tgOKB2yF7FHJXC18OCiU0/YFierACup/zdCOWw0F/0w==", "dev": true, "requires": { - "@jest/types": "^25.1.0", + "@jest/types": "^25.2.3", "ansi-regex": "^5.0.0", "ansi-styles": "^4.0.0", "react-is": "^16.12.0" } }, "prompts": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.1.tgz", - "integrity": "sha512-qIP2lQyCwYbdzcqHIUi2HAxiWixhoM9OdLCWf8txXsapC/X9YdsCoeyRIXE/GP+Q0J37Q7+XN/MFqbUa7IzXNA==", + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/prompts/-/prompts-2.3.2.tgz", + "integrity": "sha512-Q06uKs2CkNYVID0VqwfAl9mipo99zkBv/n2JtWY89Yxa3ZabWSrs0e2KTudKVa3peLUvYXMefDqIleLPVUBZMA==", "dev": true, "requires": { "kleur": "^3.0.3", @@ -3279,9 +3218,9 @@ } }, "psl": { - "version": "1.7.0", - "resolved": "https://registry.npmjs.org/psl/-/psl-1.7.0.tgz", - "integrity": "sha512-5NsSEDv8zY70ScRnOTn7bK7eanl2MvFrOrS/R6x+dBt5g1ghnj9Zv90kO8GwT8gxcu2ANyFprnFYB85IogIJOQ==", + "version": "1.8.0", + "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==", "dev": true }, "pump": { @@ -3307,19 +3246,16 @@ "dev": true }, "react-is": { - "version": "16.12.0", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.12.0.tgz", - "integrity": "sha512-rPCkf/mWBtKc97aLL9/txD8DZdemK0vkA3JMLShjlJB3Pj3s+lpf1KaBzMfQrAmhMQB0n1cU/SUGgKKBCe837Q==", + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", "dev": true }, "realpath-native": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-1.1.0.tgz", - "integrity": "sha512-wlgPA6cCIIg9gKz0fgAPjnzh4yR/LnXovwuo9hvyGvx3h8nX4+/iLZplfUWasXpqD8BdnGnP5njOFjkUwPzvjA==", - "dev": true, - "requires": { - "util.promisify": "^1.0.0" - } + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/realpath-native/-/realpath-native-2.0.0.tgz", + "integrity": "sha512-v1SEYUOXXdbBZK8ZuNgO4TBjamPsiSgcFr0aP+tEKpQZK8vooEUqV6nm6Cv502mX4NF2EfsnVqtNAHG+/6Ur1Q==", + "dev": true }, "regex-not": { "version": "1.0.2", @@ -3625,12 +3561,6 @@ "to-regex": "^3.0.2" } }, - "minimist": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", - "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", - "dev": true - }, "normalize-path": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", @@ -3662,9 +3592,9 @@ } }, "semver": { - "version": "5.7.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", - "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", "dev": true }, "set-blocking": { @@ -3719,15 +3649,15 @@ "optional": true }, "signal-exit": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", - "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz", + "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==", "dev": true }, "sisteransi": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.4.tgz", - "integrity": "sha512-/ekMoM4NJ59ivGSfKapeG+FWtrmWvA1p6FBZwXrqojw90vJu8lBmrTxCMuBCydKtkaUe2zt4PlxeTKpjwMbyig==", + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz", + "integrity": "sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==", "dev": true }, "slash": { @@ -4002,26 +3932,6 @@ "strip-ansi": "^6.0.0" } }, - "string.prototype.trimleft": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.1.tgz", - "integrity": "sha512-iu2AGd3PuP5Rp7x2kEZCrB2Nf41ehzh+goo8TV7z8/XDBbsvc6HQIlUl9RjkZ4oyrW1XM5UwlGl1oVEaDjg6Ag==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, - "string.prototype.trimright": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.1.tgz", - "integrity": "sha512-qFvWL3/+QIgZXVmJBfpHmxLB7xsUXz6HsUmP8+5dRaC3Q7oKUv9Vo6aMCRZC1smrtyECFsIT30PqBJ1gTjAs+g==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "function-bind": "^1.1.1" - } - }, "strip-ansi": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", @@ -4175,9 +4085,9 @@ } }, "ts-jest": { - "version": "25.2.0", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.2.0.tgz", - "integrity": "sha512-VaRdb0da46eorLfuHEFf0G3d+jeREcV+Wb/SvW71S4y9Oe8SHWU+m1WY/3RaMknrBsnvmVH0/rRjT8dkgeffNQ==", + "version": "25.2.1", + "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-25.2.1.tgz", + "integrity": "sha512-TnntkEEjuXq/Gxpw7xToarmHbAafgCaAzOpnajnFC6jI7oo1trMzAHA04eWpc3MhV6+yvhE8uUBAmN+teRJh0A==", "dev": true, "requires": { "bs-logger": "0.x", @@ -4189,22 +4099,23 @@ "mkdirp": "0.x", "resolve": "1.x", "semver": "^5.5", - "yargs-parser": "10.x" + "yargs-parser": "^16.1.0" }, "dependencies": { - "camelcase": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", - "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "semver": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz", + "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==", "dev": true }, "yargs-parser": { - "version": "10.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz", - "integrity": "sha512-VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==", + "version": "16.1.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", + "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", "dev": true, "requires": { - "camelcase": "^4.1.0" + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" } } } @@ -4240,9 +4151,9 @@ "dev": true }, "type-fest": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz", - "integrity": "sha512-4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==", + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.11.0.tgz", + "integrity": "sha512-OdjXJxnCN1AvyLSzeKIgXTXxV+99ZuXl3Hpo9XpJAv9MBcHrrJOQ5kV7ypXOuQie+AmWG25hLbiKdwYTifzcfQ==", "dev": true }, "typedarray-to-buffer": { @@ -4255,9 +4166,9 @@ } }, "typescript": { - "version": "3.8.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.2.tgz", - "integrity": "sha512-EgOVgL/4xfVrCMbhYKUQTdF37SQn4Iw73H5BgCrF1Abdun7Kwy/QZsE/ssAy0y4LxBbvua3PIbFsbRczWWnDdQ==" + "version": "3.8.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-3.8.3.tgz", + "integrity": "sha512-MYlEfn5VrLNsgudQTVJeNaQFUAI7DkhnOjdpAp4T+ku1TfQClewlbSuTVHiA+8skNBgaf02TL/kLOvig4y3G8w==" }, "union-value": { "version": "1.0.1", @@ -4332,18 +4243,6 @@ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==", "dev": true }, - "util.promisify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz", - "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==", - "dev": true, - "requires": { - "define-properties": "^1.1.3", - "es-abstract": "^1.17.2", - "has-symbols": "^1.0.1", - "object.getownpropertydescriptors": "^2.1.0" - } - }, "uuid": { "version": "3.4.0", "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz", @@ -4351,9 +4250,9 @@ "dev": true }, "v8-to-istanbul": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.2.tgz", - "integrity": "sha512-G9R+Hpw0ITAmPSr47lSlc5A1uekSYzXxTMlFxso2xoffwo4jQnzbv1p9yXIinO8UMZKfAFewaCHwWvnH4Jb4Ug==", + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-4.1.3.tgz", + "integrity": "sha512-sAjOC+Kki6aJVbUOXJbcR0MnbfjvBzwKZazEJymA2IX49uoOdEdk+4fBq5cXgYgiyKtAyrrJNtBZdOeDIF+Fng==", "dev": true, "requires": { "@types/istanbul-lib-coverage": "^2.0.1", @@ -4381,12 +4280,12 @@ } }, "w3c-hr-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.1.tgz", - "integrity": "sha1-gqwr/2PZUOqeMYmlimViX+3xkEU=", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "dev": true, "requires": { - "browser-process-hrtime": "^0.1.2" + "browser-process-hrtime": "^1.0.0" } }, "w3c-xmlserializer": { @@ -4442,9 +4341,9 @@ } }, "which": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", - "integrity": "sha512-HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "dev": true, "requires": { "isexe": "^2.0.0" @@ -4480,9 +4379,9 @@ "dev": true }, "write-file-atomic": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.1.tgz", - "integrity": "sha512-JPStrIyyVJ6oCSz/691fAjFtefZ6q+fP6tm+OS4Qw6o+TGQxNp1ziY2PgS+X/m0V8OWhZiO/m4xSj+Pr4RrZvw==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-3.0.3.tgz", + "integrity": "sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==", "dev": true, "requires": { "imurmurhash": "^0.1.4", @@ -4492,9 +4391,9 @@ } }, "ws": { - "version": "7.2.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.1.tgz", - "integrity": "sha512-sucePNSafamSKoOqoNfBd8V0StlkzJKL2ZAhGQinCfNQ+oacw+Pk7lcdAElecBF2VkLNZRiIb5Oi1Q5lVUVt2A==", + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/ws/-/ws-7.2.3.tgz", + "integrity": "sha512-HTDl9G9hbkNDk98naoR/cHDws7+EyYMOdL1BmjsZXRUjf7d+MficC4B7HLUPlSiho0vg+CWKrGIt/VJBd1xunQ==", "dev": true }, "xml-name-validator": { @@ -4516,9 +4415,9 @@ "dev": true }, "yargs": { - "version": "15.1.0", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.1.0.tgz", - "integrity": "sha512-T39FNN1b6hCW4SOIk1XyTOWxtXdcen0t+XYrysQmChzSipvhBO8Bj0nK1ozAasdk24dNWuMZvr4k24nz+8HHLg==", + "version": "15.3.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-15.3.1.tgz", + "integrity": "sha512-92O1HWEjw27sBfgmXiixJWT5hRBp2eobqXicLtPBIDBhYB+1HpwZlXmbW2luivBJHBzki+7VyCLRtAkScbTBQA==", "dev": true, "requires": { "cliui": "^6.0.0", @@ -4531,13 +4430,13 @@ "string-width": "^4.2.0", "which-module": "^2.0.0", "y18n": "^4.0.0", - "yargs-parser": "^16.1.0" + "yargs-parser": "^18.1.1" } }, "yargs-parser": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-16.1.0.tgz", - "integrity": "sha512-H/V41UNZQPkUMIT5h5hiwg4QKIY1RPvoBV4XcjUbRM8Bk2oKqqyZ0DIEbTFZB0XjbtSPG8SAa/0DxCQmiRgzKg==", + "version": "18.1.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-18.1.2.tgz", + "integrity": "sha512-hlIPNR3IzC1YuL1c2UwwDKpXlNFBqD1Fswwh1khz5+d8Cq/8yc/Mn0i+rQXduu8hcrFKvO7Eryk+09NecTQAAQ==", "dev": true, "requires": { "camelcase": "^5.0.0", diff --git a/package.json b/package.json index 5f66075..465c040 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,7 @@ "author": "Robert Sesek", "license": "GPL-3.0-only", "dependencies": { - "typescript": "^3.8.2" + "typescript": "^3.8.3" }, "files": [ "dist/**/*", @@ -20,8 +20,8 @@ "examples/**/*" ], "devDependencies": { - "@types/jest": "^25.1.2", - "jest": "^25.1.0", - "ts-jest": "^25.2.0" + "@types/jest": "^25.1.4", + "jest": "^25.2.3", + "ts-jest": "^25.2.1" } } -- 2.22.5 From 58acf45ad333abfbe829f1ae4932321f8dd0d3f5 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Sat, 28 Mar 2020 13:40:30 -0400 Subject: [PATCH 13/16] Sed inplace is not great across GNU vs BSD... --- build.sh | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/build.sh b/build.sh index d2a7115..8d7d254 100755 --- a/build.sh +++ b/build.sh @@ -23,4 +23,5 @@ cp LICENSE.txt $OUTDIR # "Preprocess" the dist package.json. cp ./package.json $OUTDIR -sed -i='' -e s@\"dist/@\"@ $OUTDIR/package.json +sed -i.bak -e s@\"dist/@\"@ $OUTDIR/package.json +rm $OUTDIR/package.json.bak -- 2.22.5 From 872185653403854c516b00a26d0b9909ec23e8f1 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 13 Jul 2020 10:50:04 -0400 Subject: [PATCH 14/16] Add Form 6251. It could probably use a test, but the AMT is super annoying. --- src/fed2019/Form1099INT.ts | 2 +- src/fed2019/Form6251.ts | 208 +++++++++++++++++++++++++++++++++++++ src/fed2019/README.md | 1 + src/fed2019/Schedule2.ts | 21 +--- src/fed2019/index.ts | 1 + 5 files changed, 216 insertions(+), 17 deletions(-) create mode 100644 src/fed2019/Form6251.ts diff --git a/src/fed2019/Form1099INT.ts b/src/fed2019/Form1099INT.ts index adf4823..b038f99 100644 --- a/src/fed2019/Form1099INT.ts +++ b/src/fed2019/Form1099INT.ts @@ -44,7 +44,7 @@ export default class Form1099INT extends Form +// This program is free software licensed under the GNU General Public License, +// version 3.0. The full text of the license can be found in LICENSE.txt. +// SPDX-License-Identifier: GPL-3.0-only + +import { Form, TaxReturn } from '../core'; +import { AccumulatorLine, ComputedLine, ReferenceLine, UnsupportedLine, sumFormLines } from '../core/Line'; +import { clampToZero } from '../core/Math'; + +import Form1040, { QDCGTaxWorksheet, FilingStatus } from './Form1040'; +import Form1099INT from './Form1099INT'; +import Schedule1 from './Schedule1'; +import Schedule2 from './Schedule2'; +import Schedule3 from './Schedule3'; +import ScheduleD, { ScheduleDTaxWorksheet } from './ScheduleD'; + +export default class Form6251 extends Form { + readonly name = '6251'; + + readonly lines = { + // Part I + '1': new ComputedLine((tr): number => { + const f1040 = tr.getForm(Form1040); + const l11b = f1040.getValue(tr, '11b'); + if (l11b > 0) + return l11b; + return f1040.getValue(tr, '8b') - f1040.getValue(tr, '9') - f1040.getValue(tr, '10'); + }), + '2a': new ComputedLine((tr): number => { + // Not supported: Schedule A, line 7. + return tr.getForm(Form1040).getValue(tr, '9'); + }), + '2b': new ReferenceLine(Schedule1, '1', 'Tax refund', 0), // Not supported - line 8 SALT. + '2c': new UnsupportedLine('Investment interest expense'), + '2d': new UnsupportedLine('Depletion'), + '2e': new UnsupportedLine('Net operating loss deduction'), + '2f': new UnsupportedLine('Alternative tax net operating loss deduction'), + '2g': new AccumulatorLine(Form1099INT, '9', 'Interest from specified private activity bonds exempt from the regular tax'), + '2h': new UnsupportedLine('Qualified small business stock'), + '2i': new UnsupportedLine('Exercise of incentive stock options'), + '2j': new UnsupportedLine('Estates and trusts (amount from Schedule K-1 (Form 1041), box 12, code A)'), + '2k': new UnsupportedLine('Disposition of property'), + '2l': new UnsupportedLine('Depreciation on assets placed in service after 1986'), + '2m': new UnsupportedLine('Passive activities'), + '2n': new UnsupportedLine('Loss limitations'), + '2o': new UnsupportedLine('Circulation costs'), + '2p': new UnsupportedLine('Long-term contracts'), + '2q': new UnsupportedLine('Mining costs'), + '2r': new UnsupportedLine('Research and experimental costs'), + '2s': new UnsupportedLine('Income from certain installment sales before January 1, 1987'), + '2t': new UnsupportedLine('Intangible drilling costs preference'), + '3': new UnsupportedLine('Other adjustments'), + '4': new ComputedLine((tr): number => { + return sumFormLines(tr, this, ['1', '2a', '2b', '2c', '2d', '2e', '2f', '2g', '2h', '2i', '2j', '2k', '2l', '2m', '2n', '2o', '2p', '2q', '2r', '2s', '2t', '3']); + }, 'Alternative minimum taxable income'), + + // Part II + '5': new ComputedLine((tr): number => { + // [ threshold, exemption ] + const exemptions = { + [FilingStatus.Single]: [ 510300, 71700 ], + [FilingStatus.MarriedFilingJoint]: [ 1020600, 111700 ], + [FilingStatus.MarriedFilingSeparate]: [ 510300, 55850 ], + }; + const exemption = exemptions[tr.getForm(Form1040).filingStatus]; + + const l4 = this.getValue(tr, '4'); + if (l4 < exemption[0]) + return exemption[1]; + + // Exemption worksheet: + const wl1 = exemption[1]; + const wl2 = l4; + const wl3 = exemption[0]; + const wl4 = clampToZero(wl2 - wl3); + const wl5 = wl4 * 0.25; + const wl6 = clampToZero(wl1 - wl5); + return wl6; + }), + '6': new ComputedLine((tr): number => { + return clampToZero(this.getValue(tr, '4') - this.getValue(tr, '5')); + }), + '7': new ComputedLine((tr): number => { + // Not supported - Form 2555. + // Not supported - Form1040 directly reporting cap gains on line 6. + + const f1040 = tr.getForm(Form1040); + + let part3 = f1040.getValue(tr, '3a') > 0; + + const schedD = tr.findForm(ScheduleD); + if (schedD) { + const flag = schedD.getValue(tr, '15') > 0 && schedD.getValue(tr, '16') > 0; + part3 = part3 || flag; + } + + if (part3) + return this.getValue(tr, '40'); + + return computeAmtTax(f1040.filingStatus, this.getValue(tr, '6')); + }), + '8': new ReferenceLine(Schedule3, '1', 'Alternative minimum tax foreign tax credit'), // Not supported - AMT FTC recalculation + '9': new ComputedLine((tr): number => { + return this.getValue(tr, '7') - this.getValue(tr, '8'); + }, 'Tentative minimum tax'), + '10': new ComputedLine((tr): number => { + let value = tr.getForm(Form1040).getValue(tr, '12a'); + const sched2 = tr.findForm(Schedule2); + if (sched2) { + value += sched2.getValue(tr, '2'); + } + // Not supported - subtracting Schedule3@1 for the AMT FTC. + return value; + }), + '11': new ComputedLine((tr): number => { + return clampToZero(this.getValue(tr, '9') - this.getValue(tr, '10')); + }, 'AMT'), + + // Part III + '12': new ReferenceLine(Form6251 as any, '6'), + '13': new ComputedLine((tr): number => { + const schedDTW = tr.findForm(ScheduleDTaxWorksheet); + if (schedDTW) + return schedDTW.getValue(tr, '13'); + + const qdcgtw = tr.getForm(QDCGTaxWorksheet); + return qdcgtw.getValue(tr, '6'); + }), + '14': new ReferenceLine(ScheduleD, '19', undefined, 0), + '15': new ComputedLine((tr): number => { + const value = this.getValue(tr, '13') + this.getValue(tr, '14'); + const schedDTW = tr.findForm(ScheduleDTaxWorksheet); + if (schedDTW) + return Math.min(value, schedDTW.getValue(tr, '10')); + + return value; + }), + '16': new ComputedLine((tr): number => Math.min(this.getValue(tr, '12'), this.getValue(tr, '15'))), + '17': new ComputedLine((tr): number => this.getValue(tr, '12') - this.getValue(tr, '16')), + '18': new ComputedLine((tr): number => { + const fs = tr.getForm(Form1040).filingStatus; + return computeAmtTax(fs, this.getValue(tr, '17')); + }), + '19': new ComputedLine((tr): number => { + switch (tr.getForm(Form1040).filingStatus) { + case FilingStatus.Single: + case FilingStatus.MarriedFilingSeparate: + return 39375; + case FilingStatus.MarriedFilingJoint: + return 78750; + } + }), + '20': new ComputedLine((tr): number => { + const schedDTW = tr.findForm(ScheduleDTaxWorksheet); + if (schedDTW) + return clampToZero(schedDTW.getValue(tr, '14')); + + const qdcgtw = tr.getForm(QDCGTaxWorksheet); + return clampToZero(qdcgtw.getValue(tr, '7')); + }), + '21': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '19') - this.getValue(tr, '20'))), + '22': new ComputedLine((tr): number => Math.min(this.getValue(tr, '12'), this.getValue(tr, '13'))), + '23': new ComputedLine((tr): number => Math.min(this.getValue(tr, '21'), this.getValue(tr, '22'))), + '24': new ComputedLine((tr): number => this.getValue(tr, '22') - this.getValue(tr, '23')), + '25': new ComputedLine((tr): number => { + switch (tr.getForm(Form1040).filingStatus) { + case FilingStatus.Single: return 434550; + case FilingStatus.MarriedFilingSeparate: return 244425; + case FilingStatus.MarriedFilingJoint: return 488850; + } + }), + '26': new ReferenceLine(Form6251 as any, '21'), + '27': new ComputedLine((tr): number => { + const schedDTW = tr.findForm(ScheduleDTaxWorksheet); + if (schedDTW) + return clampToZero(schedDTW.getValue(tr, '21')); + + const qdcgtw = tr.getForm(QDCGTaxWorksheet); + return clampToZero(qdcgtw.getValue(tr, '7')); + }), + '28': new ComputedLine((tr): number => this.getValue(tr, '26') + this.getValue(tr, '27')), + '29': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '25') - this.getValue(tr, '28'))), + '30': new ComputedLine((tr): number => Math.min(this.getValue(tr, '24'), this.getValue(tr, '29'))), + '31': new ComputedLine((tr): number => this.getValue(tr, '30') * 0.15), + '32': new ComputedLine((tr): number => this.getValue(tr, '23') + this.getValue(tr, '30')), + '33': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '22') - this.getValue(tr, '32'))), + '34': new ComputedLine((tr): number => this.getValue(tr, '33') * 0.20), + '35': new ComputedLine((tr): number => this.getValue(tr, '17') + this.getValue(tr, '32') + this.getValue(tr, '33')), + '36': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '12') - this.getValue(tr, '35'))), + '37': new ComputedLine((tr): number => this.getValue(tr, '36') * 0.25), + '38': new ComputedLine((tr): number => sumFormLines(tr, this, ['18', '31', '34', '37'])), + '39': new ComputedLine((tr): number => { + const fs = tr.getForm(Form1040).filingStatus; + return computeAmtTax(fs, this.getValue(tr, '12')); + }), + '40': new ComputedLine((tr): number => Math.min(this.getValue(tr, '38'), this.getValue(tr, '39'))), + }; +}; + +function computeAmtTax(filingStatus, amount) { + const mfs = filingStatus = FilingStatus.MarriedFilingSeparate; + const limit = mfs ? 97400 : 194800; + const sub = mfs ? 1948 : 3896; + + if (amount < limit) + return amount * 0.26; + return (amount * 0.28) - sub; +} diff --git a/src/fed2019/README.md b/src/fed2019/README.md index d29ece4..b0a46ff 100644 --- a/src/fed2019/README.md +++ b/src/fed2019/README.md @@ -26,6 +26,7 @@ The following forms are at least partially supported: - **Form 1099-INT:** Interest income - **Form 1099-R:** Retirement account distributions - **Form 1116:** Foreign tax credit +- **Form 6251:** Alternative Minimum Tax _without Form 1116 and Schedule D recalculation_ - **Form 8606:** Nondeductible IRAs - **Form 8949:** Sales and dispositions of capital assets - **Form 8959:** Additional medicare tax diff --git a/src/fed2019/Schedule2.ts b/src/fed2019/Schedule2.ts index b2a2d51..87e2819 100644 --- a/src/fed2019/Schedule2.ts +++ b/src/fed2019/Schedule2.ts @@ -10,6 +10,7 @@ import { UnsupportedFeatureError } from '../core/Errors'; import Form1040, { FilingStatus } from './Form1040'; import Form1099DIV from './Form1099DIV'; import Form1099INT from './Form1099INT'; +import Form6251 from './Form6251'; import Form8959 from './Form8959'; import Form8960 from './Form8960'; @@ -18,22 +19,10 @@ export default class Schedule2 extends Form { readonly lines = { '1': new ComputedLine((tr): number => { - // TODO - this is just using Taxable Income, rather than AMT-limited - // income - const f1040 = tr.getForm(Form1040); - const taxableIncome = f1040.getValue(tr, '11b'); - switch (f1040.filingStatus) { - case FilingStatus.Single: - if (taxableIncome < 510300) - return 0; - case FilingStatus.MarriedFilingJoint: - if (taxableIncome < 1020600) - return 0; - case FilingStatus.MarriedFilingSeparate: - if (taxableIncome < 510300) - return 0; - } - throw new UnsupportedFeatureError('The AMT is not supported'); + const f6251 = tr.findForm(Form6251); + if (f6251) + return f6251.getValue(tr, '11'); + return 0; }, 'AMT'), '2': new UnsupportedLine('Excess advance premium tax credit repayment'), '3': new ComputedLine((tr): number => { diff --git a/src/fed2019/index.ts b/src/fed2019/index.ts index 1f9f7bb..152a588 100644 --- a/src/fed2019/index.ts +++ b/src/fed2019/index.ts @@ -9,6 +9,7 @@ export { default as Form1099DIV } from './Form1099DIV'; export { default as Form1099INT } from './Form1099INT'; export { default as Form1099R } from './Form1099R'; export { default as Form1116 } from './Form1116'; +export { default as Form6251 } from './Form6251'; export { default as Form8606 } from './Form8606'; export { default as Form8949 } from './Form8949'; export { default as Form8959 } from './Form8959'; -- 2.22.5 From 595c47fabbcec4e614e6ea4c8f24621afd9ab5c9 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 13 Jul 2020 16:28:41 -0400 Subject: [PATCH 15/16] Add Schedule A for itemized deductions. --- src/fed2019/Form1040.test.ts | 28 +++++++ src/fed2019/Form1040.ts | 17 +++- src/fed2019/README.md | 1 + src/fed2019/ScheduleA.test.ts | 142 ++++++++++++++++++++++++++++++++++ src/fed2019/ScheduleA.ts | 81 +++++++++++++++++++ src/fed2019/index.ts | 1 + 6 files changed, 266 insertions(+), 4 deletions(-) create mode 100644 src/fed2019/ScheduleA.test.ts create mode 100644 src/fed2019/ScheduleA.ts diff --git a/src/fed2019/Form1040.test.ts b/src/fed2019/Form1040.test.ts index 109b74f..152dd6c 100644 --- a/src/fed2019/Form1040.test.ts +++ b/src/fed2019/Form1040.test.ts @@ -12,6 +12,7 @@ import Form1099INT from './Form1099INT'; import Form1099B from './Form1099B'; import Form1099R, { Box7Code } from './Form1099R'; import Schedule2 from './Schedule2'; +import ScheduleA from './ScheduleA'; import ScheduleD, { ScheduleDTaxWorksheet } from './ScheduleD'; import Form8606 from './Form8606'; import Form8959 from './Form8959'; @@ -206,3 +207,30 @@ test('backdoor and megabackdoor roth', () => { expect(f.getValue(tr, '4a')).toBe(6000); expect(f.getValue(tr, '4b')).toBe(0); }); + +test('itemized deductions', () => { + const tr = new TaxReturn(); + const f = new Form1040({ + filingStatus: FilingStatus.MarriedFilingJoint + }); + tr.addForm(f); + tr.addForm(new ScheduleA({ + charitableGiftsCashOrCheck: 26000 + })); + + expect(f.getValue(tr, '9')).toBe(26000); +}); + +test('itemized deductions, forced', () => { + const tr = new TaxReturn(); + const f = new Form1040({ + filingStatus: FilingStatus.MarriedFilingJoint + }); + tr.addForm(f); + tr.addForm(new ScheduleA({ + stateAndLocalIncomeAndSalesTaxes: 10000, + forceItemize: true + })); + + expect(f.getValue(tr, '9')).toBe(10000); +}); diff --git a/src/fed2019/Form1040.ts b/src/fed2019/Form1040.ts index 4a8b2d0..579e8eb 100644 --- a/src/fed2019/Form1040.ts +++ b/src/fed2019/Form1040.ts @@ -18,6 +18,7 @@ import W2 from './W2'; import Schedule1 from './Schedule1'; import Schedule2 from './Schedule2'; import Schedule3 from './Schedule3'; +import ScheduleA from './ScheduleA'; import ScheduleD, { ScheduleDTaxWorksheet } from './ScheduleD'; export enum FilingStatus { @@ -81,14 +82,22 @@ export default class Form1040 extends Form { return this.getValue(tr, '7b') - this.getValue(tr, '8a'); }, 'Adjusted gross income'), - '9': new ComputedLine((): number => { - // TODO - Itemized deductions. + '9': new ComputedLine((tr): number => { + let deduction = 0; + const schedA = tr.findForm(ScheduleA); + if (schedA) { + deduction = schedA.getValue(tr, '17'); + if (schedA.getValue(tr, '18')) { + return deduction; + } + } + switch (this.filingStatus) { case FilingStatus.Single: case FilingStatus.MarriedFilingSeparate: - return 12200; + return Math.max(deduction, 12200); case FilingStatus.MarriedFilingJoint: - return 24400; + return Math.max(deduction, 24400); } }, 'Deduction'), diff --git a/src/fed2019/README.md b/src/fed2019/README.md index b0a46ff..01c186c 100644 --- a/src/fed2019/README.md +++ b/src/fed2019/README.md @@ -20,6 +20,7 @@ The following forms are at least partially supported: - **Schedule 3:** Additional credits and payments - **Schedule B:** _This form is not directly modeled, and instead the computations are done on 1040._ +- **Schedule A:** Itemized deductions - **Schedule D:** Capital gains and losses - **Form 1099-B:** Proceeds from broker transactions - **Form 1099-DIV:** Dividend income diff --git a/src/fed2019/ScheduleA.test.ts b/src/fed2019/ScheduleA.test.ts new file mode 100644 index 0000000..53ad2d5 --- /dev/null +++ b/src/fed2019/ScheduleA.test.ts @@ -0,0 +1,142 @@ +// Copyright 2020 Blue Static +// This program is free software licensed under the GNU General Public License, +// version 3.0. The full text of the license can be found in LICENSE.txt. +// SPDX-License-Identifier: GPL-3.0-only + +import { Person } from '../core'; +import { UnsupportedFeatureError } from '../core/Errors'; + +import Form1040, { FilingStatus } from './Form1040'; +import ScheduleA from './ScheduleA'; +import TaxReturn from './TaxReturn'; +import W2 from './W2'; + +test('medical and dental expenses, limited', () => { + const p = Person.self('A'); + const tr = new TaxReturn(); + tr.addPerson(p); + tr.addForm(new W2({ + employee: p, + employer: 'E', + wages: 3000, + })); + tr.addForm(new Form1040({ + filingStatus: FilingStatus.Single + })); + + const f = new ScheduleA({ + medicalAndDentalExpenses: 250, + }); + tr.addForm(f); + + expect(f.getValue(tr, '2')).toBe(3000); + expect(f.getValue(tr, '4')).toBe(25); + expect(f.getValue(tr, '17')).toBe(25); +}); + +test('medical and dental expenses, excluded', () => { + const p = Person.self('A'); + const tr = new TaxReturn(); + tr.addPerson(p); + tr.addForm(new Form1040({ + filingStatus: FilingStatus.Single + })); + tr.addForm(new W2({ + employee: p, + employer: 'E', + wages: 300000, + })); + + const f = new ScheduleA({ + medicalAndDentalExpenses: 250, + }); + tr.addForm(f); + + expect(tr.getForm(Form1040).getValue(tr, '7b')).toBe(300000); + expect(f.getValue(tr, '2')).toBe(300000); + expect(f.getValue(tr, '4')).toBe(0); +}); + +test('state and local taxes, un-limited', () => { + const tr = new TaxReturn(); + tr.addForm(new Form1040({ + filingStatus: FilingStatus.MarriedFilingJoint + })); + + const f = new ScheduleA({ + stateAndLocalIncomeAndSalesTaxes: 3000, + stateAndLocalRealEstateTaxes: 475, + stateAndLocalPropertyTaxes: 225, + }); + tr.addForm(f); + + expect(f.getValue(tr, '5d')).toBe(3700); + expect(f.getValue(tr, '5e')).toBe(3700); + expect(f.getValue(tr, '17')).toBe(3700); +}); + +test('state and local taxes, limited', () => { + const tr = new TaxReturn(); + tr.addForm(new Form1040({ + filingStatus: FilingStatus.MarriedFilingJoint + })); + + const f = new ScheduleA({ + stateAndLocalIncomeAndSalesTaxes: 21124, + }); + tr.addForm(f); + + expect(f.getValue(tr, '5d')).toBe(21124); + expect(f.getValue(tr, '5e')).toBe(10000); + expect(f.getValue(tr, '17')).toBe(10000); +}); + +test('charitable gifts', () => { + const tr = new TaxReturn(); + tr.addForm(new Form1040({ + filingStatus: FilingStatus.MarriedFilingJoint + })); + + const f = new ScheduleA({ + charitableGiftsCashOrCheck: 3000, + charitableGiftsOther: 100, + charitableCarryOver: 22, + }); + tr.addForm(f); + + expect(f.getValue(tr, '14')).toBe(3122); + expect(f.getValue(tr, '17')).toBe(3122); +}); + +test('all inputs', () => { + const p = Person.self('A'); + const tr = new TaxReturn(); + tr.addPerson(p); + tr.addForm(new W2({ + employee: p, + employer: 'E', + wages: 3000, + })); + tr.addForm(new Form1040({ + filingStatus: FilingStatus.Single + })); + + const f = new ScheduleA({ + medicalAndDentalExpenses: 250, + stateAndLocalIncomeAndSalesTaxes: 1000, + stateAndLocalRealEstateTaxes: 1000, + stateAndLocalPropertyTaxes: 1000, + otherTaxes: 1000, + unreportedMortgageInterest: 1000, + unreportedMortagePoints: 1000, + mortgageInsurancePremiums: 1000, + investmentInterest: 1000, + charitableGiftsCashOrCheck: 1000, + charitableGiftsOther: 1000, + charitableCarryOver: 1000, + casualtyAndTheftLosses: 1000, + }); + tr.addForm(f); + + expect(f.getValue(tr, '17')).toBe(12025); +}); diff --git a/src/fed2019/ScheduleA.ts b/src/fed2019/ScheduleA.ts new file mode 100644 index 0000000..8331a62 --- /dev/null +++ b/src/fed2019/ScheduleA.ts @@ -0,0 +1,81 @@ +// Copyright 2020 Blue Static +// This program is free software licensed under the GNU General Public License, +// version 3.0. The full text of the license can be found in LICENSE.txt. +// SPDX-License-Identifier: GPL-3.0-only + +import { Form } from '../core'; +import { ComputedLine, InputLine, ReferenceLine, UnsupportedLine, sumFormLines } from '../core/Line'; +import { clampToZero } from '../core/Math'; + +import Form1040, { FilingStatus } from './Form1040'; + +export interface ScheduleAInput { + medicalAndDentalExpenses?: number; + + stateAndLocalIncomeAndSalesTaxes?: number; + stateAndLocalRealEstateTaxes?: number; + stateAndLocalPropertyTaxes?: number; + otherTaxes?: number; + + // This form does not apply the mortgage interest limitations. + unreportedMortgageInterest?: number; + unreportedMortagePoints?: number; + mortgageInsurancePremiums?: number; + investmentInterest?: number; + + charitableGiftsCashOrCheck?: number; + charitableGiftsOther?: number; + charitableCarryOver?: number; + + casualtyAndTheftLosses?: number; + + forceItemize?: boolean; +}; + +class Input extends InputLine {}; + +export default class ScheduleA extends Form { + readonly name = 'Schedule A'; + + readonly lines = { + // Medical and dental expenses + '1': new Input('medicalAndDentalExpenses', 'Medical and dental expenses', 0), + '2': new ReferenceLine(Form1040, '8b'), + '3': new ComputedLine((tr): number => this.getValue(tr, '2') * 0.075), + '4': new ComputedLine((tr): number => clampToZero(this.getValue(tr, '1') - this.getValue(tr, '3'))), + + // Taxes you paid + '5a': new Input('stateAndLocalIncomeAndSalesTaxes', 'State and local income taxes or general sales taxes', 0), + '5b': new Input('stateAndLocalRealEstateTaxes', 'State and local real estate taxes', 0), + '5c': new Input('stateAndLocalPropertyTaxes', 'State and local personal property taxes', 0), + '5d': new ComputedLine((tr): number => sumFormLines(tr, this, ['5a', '5b', '5c'])), + '5e': new ComputedLine((tr): number => { + const fs = tr.getForm(Form1040).filingStatus; + const limit = fs == FilingStatus.MarriedFilingSeparate ? 5000 : 10000; + return Math.min(this.getValue(tr, '5d'), limit); + }), + '6': new Input('otherTaxes', 'Other taxes', 0), + '7': new ComputedLine((tr): number => sumFormLines(tr, this, ['5e', '6'])), + + // Interest you paid + // TODO - Form 1098 + '8a': new UnsupportedLine('Home mortgage interest and points'), + '8b': new Input('unreportedMortgageInterest', 'Home mortgage interest not reported on Form 1098', 0), + '8c': new Input('unreportedMortagePoints', 'Points not reported on Form 1098', 0), + '8d': new Input('mortgageInsurancePremiums', 'Mortgage insurance premiums', 0), + '8e': new ComputedLine((tr): number => sumFormLines(tr, this, ['8a', '8b', '8c', '8d'])), + '9': new Input('investmentInterest', 'Investment interest', 0), + '10': new ComputedLine((tr): number => sumFormLines(tr, this, ['8e', '9'])), + + // Gifts to charity + '11': new Input('charitableGiftsCashOrCheck', 'Gifts by cash or check', 0), + '12': new Input('charitableGiftsOther', 'Other than by cash or check', 0), + '13': new Input('charitableCarryOver', 'Carryover from prior year', 0), + '14': new ComputedLine((tr): number => sumFormLines(tr, this, ['11', '12', '13'])), + + '15': new Input('casualtyAndTheftLosses', 'Casualty and theft loss(es)', 0), + + '17': new ComputedLine((tr): number => sumFormLines(tr, this, ['4', '7', '10', '14', '15'])), + '18': new Input('forceItemize', 'Itemize even if less than standard deduction', false), + }; +}; diff --git a/src/fed2019/index.ts b/src/fed2019/index.ts index 152a588..78e3b75 100644 --- a/src/fed2019/index.ts +++ b/src/fed2019/index.ts @@ -18,6 +18,7 @@ export { default as Form8995REIT } from './Form8995'; export { default as Schedule1 } from './Schedule1'; export { default as Schedule2 } from './Schedule2'; export { default as Schedule3 } from './Schedule3'; +export { default as ScheduleA } from './ScheduleA'; export { default as ScheduleD } from './ScheduleD'; export { default as TaxReturn } from './TaxReturn'; export { default as W2 } from './W2'; -- 2.22.5 From f3cfb9ee1b475c03d2360a0a6e41ec0983fda798 Mon Sep 17 00:00:00 2001 From: Robert Sesek Date: Mon, 13 Jul 2020 16:47:22 -0400 Subject: [PATCH 16/16] Version 1.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 465c040..c3a9709 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ustaxlib", - "version": "1.0.2", + "version": "1.1.0", "description": "A library for modeling individual US tax returns.", "repository": "https://github.com/rsesek/ustaxlib", "scripts": { -- 2.22.5