{"version":3,"sources":["../../../../node_modules/babel-plugin-transform-async-to-promises/helpers.js","../../src/constants.ts","../../src/utils.ts","../../src/rschedule.ts","../../src/services/repeat/services/nextRepeat/nextRepeat.service.ts","../../src/services/repeat/services/repeatParser/repeatParser.service.ts","../../src/services/repeat/repeat.service.ts","../../src/services/data/data.state.ts","../../src/services/query/query.state.ts","../../src/services/startup/startup.state.ts","../../src/store.ts","../../src/__fixtures__/markdown.fixtures.ts","../../src/services/parser/parser.service.ts","../../src/services/startup/actions/startup.action.ts","../../src/services/data/data.service.ts","../../src/services/query/selectors/getContexts.selector.ts","../../src/services/query/selectors/isReady.selector.ts","../../src/services/query/selectors/sectionTitles.selector.ts","../../src/services/query/query.service.ts","../../src/services/query/selectors/selectCurrentContexts.selector.ts","../../src/services/query/selectors/selectTasks.selector.ts","../../src/services/query/selectors/selectActionableToday.selector.ts","../../src/services/query/selectors/selectUndatedTasksActionablToday.selector.ts","../../src/services/query/selectors/taskById.selector.ts","../../src/services/query/selectors/taskWithContext.selector.ts","../../src/services/unparser/unparser.service.ts","scenes/LeftMenu/LeftMenu.state.tsx","scenes/Notifications/Notifications.state.ts","scenes/TaskForm/TaskForm.state.ts","services/now/now.state.ts","services/storage/storage.state.ts","store.ts","scenes/AllTasks/scenes/TaskItem/TaskItem.scene.tsx","scenes/EditButton/EditButton.scene.tsx","scenes/SnoozeButton/SnoozeButton.scene.tsx","scenes/AllTasks/scenes/Section/Section.scene.tsx","scenes/AllTasks/AllTasks.scene.tsx","services/notifications/notifications.service.ts","services/storage/storage.service.ts","scenes/Bar/Bar.scene.tsx","scenes/Log/Log.scene.tsx","scenes/TaskForm/TaskForm.scene.tsx","scenes/TaskSingle/components/Actions.component.tsx","scenes/TaskSingle/TaskSingle.scene.tsx","scenes/TaskSingle/components/Data.component.tsx","scenes/Plan/Plan.scene.tsx","scenes/Do/Do.scene.tsx","scenes/Home/Home.scene.tsx","scenes/LeftMenu/LeftMenu.scene.tsx","scenes/Notifications/Notifications.scene.tsx","scenes/Review/scenes/ReviewAll/ReviewAll.scene.tsx","../../src/services/query/selectors/selectTasksByDates.selector.ts","scenes/Review/Review.scene.tsx","scenes/Routes/Routes.scene.tsx","App.tsx","services/storage/actions/push.action.ts","services/mdast/mdast.service.ts","services/storage/actions/writeToGit.action.ts","startup.ts","services/storage/actions/init.action.ts","serviceWorker.ts","index.tsx"],"names":["Symbol","AFTER","BY","EXCLUDED_BY_DEFAULT_CONTEXTS","UNITS","DAYS","MONTHS","MONTHS_TO_NUMBER","jan","feb","mar","apr","may","jun","jul","aug","sep","oct","nov","dec","stringifyDayjs","date","createId","nanoid","removeEmptyProperties","input","Object","value","Array","isEmpty","dayjs","getNextOccurrenceFromRule","rule","start","take","first","second","firstDate","nextDateOfIteration","repeat","startString","result","count","unit","nextDateOfIterationSimple","frequency","byDayOfWeek","nextDateOfIterationWeekly","byDayOfMonth","byMonthOfYear","nextDateOfIterationMonthly","_x","Error","notReachable","nextDateOfIterationAfterToday","startInput","today","todayDayjs","next","leadingNumberRegex","RegExp","startsWith","target","removeFromFront","isDay","isMonth","isDayOfMonth","dayInputToDayOfWeek","monthsInputToMonthOfYear","getRepeatParams","countAndUnit","numbers","matches","strings","R","getLeadingNumbers","days","type","multpleUnits","dates","months","trimmedUnit","isUnit","createNextIteration","task","by","after","nextBy","daysFromAfterUntilBy","_calculateNextByAfterDates","id","baseId","counter","parseInt","_calculateNextTaskId","data","created","finished","getTaskIndex","state","taskIndex","snoozeTask","createAction","daysFromToday","payload","snooze","sectionSlice","createSlice","name","initialState","sections","tasks","initialDataLoadComplete","reducers","setData","action","newSection","newTask","rest","closeTaskWithoutRepeating","unfinishTask","updateTask","addContextsToTask","insertContexts","difference","extraReducers","builder","actions","finishTask","rootState","getRootState","getState","dispatch","nextIteration","insertAtIndex","querySlice","currentContexts","init","prepare","reducer","setCurrentContexts","addContext","c","removeContext","index","empty","nothing","combineReducers","getLocalState","toMdastProcessor","gfm","createIdForSection","section","heading","position","stringifyPosition","processor","listItemToTaskFactory","parentId","isSequential","item","hasOneChild","hasTwoChildren","isTaskListItem","isInlineCode","child","key","context","contexts","getDataFromListItem","contentMarkdown","children","line","trimmedLine","getTextFromListItem","stringify","createIdForTask","isListItemWithCheckedField","isTask","listToTasks","list","_recusrseOverListItems","depth","listItem","taskId","nestedTasks","concat","emptySection","contents","getEmptySection","clone","isSectionEmpty","equals","stripPositionsFromSection","node","removePosition","startup","markdown","stripPositions","root","currentSection","isList","isHeading","sectionsWithIds","parseMdast","text","allTasks","sectionsWithoutTasks","sectionWithoutTasks","tasksWithSectionId","sectionId","dateToHuman","dateType","todayText","isOverdue","isToday","isThisWeek","getContexts","createSelector","output","isReady","getTitleFromSection","sectionTitles","sectionIndex","title","startingDepth","search","recursivelyGetParents","foundIndex","found","foundDepth","isTaskActionableInCurrentContexts","excludeContexts","intersection","matchedExclusions","includeContexts","matchedContexts","isTaskActionableToday","isSnoozed","isBlockedByAfterDate","doesTaskMatchDate","isTaskUndated","selectCurrentContexts","selectTasks","selectActionableTodayFactory","selectUndatedTasksActionableToday","taskById","hasUnfinishedChildren","taskWithContext","getTaskWithParentsRecursively","parents","titles","recursiveTaskToMdast","paragraph","dataContent","a","b","serializeData","childTasks","childListItems","ordered","spread","checked","createMdast","sectionTasks","listItems","slice","isOpen","toggleIsOpen","noticeAdapter","createEntityAdapter","getInitialState","push","notice","time","Math","round","Date","now","flashed","addOne","setFlashed","changes","updateOne","selectAll","getSelectors","editingTaskId","openNew","openEdit","close","nowSlice","taskIds","skipCount","addId","removeId","idIndex","indexOf","splice","length","skip","resetSkip","storageSlice","lastCommitHash","commitsAhead","addCommitsAhead","resetCommitsAhead","setCommitsAhead","setLastCommitHash","domdReducer","LeftMenu","Notifications","TaskForm","storage","store","configureStore","devTools","globalThis","TaskItemActionSet","EditButton","size","variant","useDispatch","Button","onClick","SnoozeButton","className","prompt","makeChildTasksSelector","_state","__domd","filter","Data","classes","useStyles","useSelector","getDomdState","query","dataEntries","entries","style","paddingLeft","map","light","join","constants","classNames","thisWeek","overdue","TaskItem","actionSet","all","selectChildTasks","useMemo","hideOutline","words","split","prios","p1","p2","p3","p4","Paper","elevation","undefined","square","paddingBottom","Typography","Checkbox","color","onChange","event","options","forceInline","review","actionSpacing","makeStyles","theme","createStyles","backgroundColor","orange","red","yellow","green","grey","opacity","fontWeight","fontSize","marginLeft","spacing","makeSectionTasksSelector","SectionHeading","toString","leading","SectionScene","selectSectionTasks","paper","i","padding","AllTasks","getPackageState","page","paddingTop","width","minHeight","bottomActions","marginTop","message","pushRedux","pushError","error","DIR","FILEPATH","path","shouldWipe","window","localStorage","getItem","removeItem","fs","LightningFS","wipe","SetMarkdownResult","setItem","location","reload","onAuth","auth","authJson","JSON","parse","getAuth","confirm","username","password","saveAuth","cancel","addBaseParams","opts","http","dir","author","email","ensureDir","promises","stat","code","mkdir","repo","git","url","ref","singleBranch","mergeConflictFoundAndPushed","MergeNotSupportedError","remoteRef","getMarkdown","filepath","readFile","encoding","KEY","_setMarkdown","commitMessage","writeFile","nochange","newCommitHash","committed","SetMarkdownLock","AsyncLock","setMarkdown","acquire","pushToRemote","limitOne","pLimit","debouncedPush","pDebounce","getLatestCommitHash","log","oid","buildTimeString","timeMs","process","Log","props","open","onClose","messages","buildTime","useCallback","useState","fullMarkdown","setFullMarkdown","Modal","substr","component","d","getHours","getMinutes","formatTimestamp","md","danger","clear","height","left","top","transform","breakpoints","down","isOnlyNumbers","match","isValidDate","isValid","schema","yup","shape","required","test","s","editingTask","isEditMode","hasRepeat","initialValues","done","disabled","validationSchema","onSubmit","values","helpers","reduce","asInt","add","trim","isSubmitting","wrapper","TextField","label","helperText","fullWidth","minWidth","maxWidth","maxHeight","textAlign","keys","flexGrow","hideOnSmall","display","Bar","React","logOpen","setLogOpen","handler","question","n","goAll","history","goReview","goDo","goPlan","no","assertNever","useEffect","mousetrap","bind","unbind","timeoutID","setTimeout","clearTimeout","nowCount","aheadCount","AppBar","Toolbar","IconButton","edge","Link","to","Badge","badgeContent","snoozeDayOptions","TaskSingleActionSet","Actions","showNumbers","setShowNumbers","handleKey","j","k","l","semi","handleDays","bar","daysToolbar","hidden","daysLabel","Grid","container","direction","justify","xs","sm","actionItem","bottom","alignItems","marginRigh","paddingRight","marginRight","marginBottom","DateField","li","liThisWeek","liToday","liOverdue","lineHeight","Parents","reverse","TaskSingle","taskWrapper","do","skipWrapper","buttonWrapper","up","flexDirection","justifyContent","zIndex","borderBottom","Do","nowIds","Home","go","Drawer","anchor","List","listRoot","ListItem","button","ListItemIcon","ListItemText","primary","ListSubheader","enabled","ListItemSecondaryAction","Switch","loadingWrapper","current","setIsOpen","Snackbar","autoHideDuration","anchorOrigin","horizontal","vertical","base","warning","info","lightBlue","success","TaskGroups","TaskLi","Plan","startDate","setStartDate","selectTasksByDates","matchedDates","obj","selectTasksByDatesFactory","from","_","undatedTasks","subtract","day","hasTasks","dayOutput","format","noTasks","ReviewAll","showAll","setShowAll","actionableTodaySelector","remainingTasksList","includes","taskGroups","mapToObj","val","groups","groupBy","undated","Review","dataLoaded","remainingTasks","baseTheme","createMuiTheme","responsiveFontSizes","createBrowserHistory","Loading","CircularProgress","Routes","ThemeProvider","CssBaseline","Container","exact","App","toMarkdownProcessor","unified","use","listItemIndent","mdastToMarkdown","tree","writeToGit","domdState","mdast","response","storageStartup","domdStartup","subscribe","newState","lastState","catch","console","alert","Boolean","hostname","ReactDOM","render","document","getElementById","navigator","serviceWorker","ready","then","registration","unregister"],"mappings":"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","file":"static/js/main.4889c440.chunk.js","sourcesContent":["// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","export const REDUX_ROOT_KEY = '__domd';\n\nexport const TOP_SECTION_ID = 'top';\n\nexport const EVERY = 'every' as const;\nexport const ID = 'id' as const;\nexport const AFTER = 'after' as const;\nexport const BY = 'by' as const;\nexport const REPEAT = 'repeat' as const;\nexport const CREATED = 'created' as const;\nexport const FINISHED = 'finished' as const;\nexport const SNOOZE = 'snooze' as const;\nexport const KEY_VALUE_SEPARATOR = ':' as const;\nexport const TAG_PREFIX = '#' as const;\nexport const CONTEXT_PREFIX = '@' as const;\nexport const PROJECT_PREFIX = '+' as const;\nexport const REPEAT_ID_SEPARATOR = '-' as const;\n\nexport const EXCLUDED_BY_DEFAULT_CONTEXTS = ['someday'];\n\nexport const DATA_KEYS = [\n ID,\n AFTER,\n BY,\n REPEAT,\n CREATED,\n FINISHED,\n SNOOZE,\n] as const;\n\n// Combine this with the key (\"created\", etc) to create a RegExp\nexport const KEY_VAR_REGEX_SUFFIX = `:[\\\\S]+`;\nexport const REGEX_SUFFIX = `[\\\\S]+`;\n\nexport const UNITS = ['month', 'day', 'week', 'year'] as const;\nexport const DAYS = ['mon', 'tue', 'wed', 'thu', 'fri', 'sat', 'sun'] as const;\nexport const MONTHS = [\n 'jan',\n 'feb',\n 'mar',\n 'apr',\n 'may',\n 'jun',\n 'jul',\n 'aug',\n 'sep',\n 'oct',\n 'nov',\n 'dec',\n] as const;\nexport const MONTHS_TO_NUMBER = {\n jan: 1,\n feb: 2,\n mar: 3,\n apr: 4,\n may: 5,\n jun: 6,\n jul: 7,\n aug: 8,\n sep: 9,\n oct: 10,\n nov: 11,\n dec: 12,\n} as const;\n\nexport const ProjectRegex = new RegExp('@[\\\\w]+', 'g');\n\nconst KeyVarRegexSuffix = `:[\\\\S]+`;\n\nexport const RepeatRegex = new RegExp(`${REPEAT}${KeyVarRegexSuffix}`);\n\nexport const AfterRegex = new RegExp(`${AFTER}${KeyVarRegexSuffix}`);\n\nexport const BeforeRegex = new RegExp(`${BY}${KeyVarRegexSuffix}`);\n\nexport const CreatedRegex = new RegExp(`${CREATED}${KeyVarRegexSuffix}`);\n\nexport const LeadingNumberRegex = new RegExp(``);\n","import { InlineCode, ListItem } from 'mdast';\nimport { DATA_KEYS, KEY_VALUE_SEPARATOR } from './constants';\nimport { TaskListItem } from './types';\nimport { Dayjs } from 'dayjs';\nimport { nanoid } from '@reduxjs/toolkit';\n\nexport const identity = (p: T): T => p;\n\nexport const isDataInlineCode = (input: InlineCode): boolean => {\n const [key] = input.value.split(KEY_VALUE_SEPARATOR);\n // NOTE: We need to coerce the type here otherwise .includes() complains\n return DATA_KEYS.includes(key as any);\n};\n\nexport const isListItemWithCheckedField = (item: ListItem): boolean => {\n if (typeof item.checked === 'undefined' || item.checked === null) {\n return false;\n }\n return true;\n};\n\nexport const isTaskListItem = (item: ListItem): item is TaskListItem => {\n // A task may contain exactly 1 child paragraph, and optionally, 1 child list,\n // but absolutely nothing else, even though many other things are valid\n // markdown and mdast\n const hasOneChild = item.children.length === 1;\n const hasTwoChildren = item.children.length === 2;\n\n if (!hasOneChild && !hasTwoChildren) {\n return false;\n }\n\n if (item.children[0].type !== 'paragraph') {\n return false;\n }\n\n if (hasTwoChildren && item.children[1].type !== 'list') {\n return false;\n }\n\n return true;\n};\n\nexport const stringifyDayjs = (date: Dayjs): string => {\n return date.format('YYYY-MM-DD');\n};\n\nexport const createId = () => {\n return nanoid(5);\n};\n\nexport const isEmpty = (value: any): boolean => {\n if (typeof value === 'undefined') {\n return true;\n }\n if (typeof value === 'string') {\n return value.length === 0;\n }\n if (Array.isArray(value)) {\n if (value.length === 0) {\n return true;\n }\n if (value.length === 1 && value[0] === '') {\n return true;\n }\n return false;\n }\n if (value === null) {\n return true;\n }\n return false;\n};\n\n/**\n * Remove empty properties from an object. An empty property is undefined, an\n * empty string, an empty array, or null. But false and 0 are not removed.\n */\nexport const removeEmptyProperties = (input: { [prop: string]: any }) => {\n return Object.fromEntries(\n Object.entries(input).filter(([, value]) => !isEmpty(value))\n );\n};\n","// NOTE: We need to install the utc plugin BEFORE rschedule, otherwise it\n// complains and throws an Error on startup.\nimport dayjs from 'dayjs';\nimport utc from 'dayjs/plugin/utc';\ndayjs.extend(utc);\n\nimport '@rschedule/dayjs-date-adapter/setup';\n\nexport * from '@rschedule/dayjs-date-adapter';\nexport * from '@rschedule/core';\n// NOTE: This is required to somehow fix the exports, otherwise we end up with\n// `import { Rule } from '@rschedule/dayjs-date-adapter'` in the built esm\n// module. Unclear why, this is a hack but seems to work. Rollup maybe.\nexport { Rule } from '@rschedule/core/generators';\nexport * from '@rschedule/core/generators';\n","import dayjs, { Dayjs } from 'dayjs';\nimport { Rule } from '../../../../rschedule';\nimport {\n Repeat,\n RepeatMonthly,\n RepeatSimple,\n RepeatWeekly,\n} from '../../../../types';\nimport { stringifyDayjs } from '../../../../utils';\nimport { AFTER } from '../../../../constants';\n\nconst notReachable = (_x: never): never => {\n throw new Error('Unknown never error. #gqIMjG');\n};\n\nexport const nextDateOfIterationSimple = ({\n repeat,\n start,\n}: {\n repeat: RepeatSimple;\n start: Dayjs;\n}): Dayjs => {\n const { count, unit } = repeat;\n return start.add(count, unit);\n};\n\nexport const getNextOccurrenceFromRule = ({\n rule,\n start,\n}: {\n rule: Rule;\n start: Dayjs;\n}): Dayjs => {\n const [first, second] = rule.occurrences({ take: 2 }).toArray();\n\n const firstDate = first.date;\n // The first date created by the rule might be the same as the `start` date.\n // In that case we did not find the \"next\" iteration.\n if (firstDate.isAfter(start)) {\n return firstDate;\n }\n\n return second.date;\n};\n\nexport const nextDateOfIterationWeekly = ({\n repeat,\n start,\n}: {\n repeat: RepeatWeekly;\n start: Dayjs;\n}): Dayjs => {\n const rule = new Rule({\n frequency: 'WEEKLY',\n byDayOfWeek: repeat.days,\n start,\n });\n return getNextOccurrenceFromRule({ rule, start });\n};\n\nexport const nextDateOfIterationMonthly = ({\n repeat,\n start,\n}: {\n repeat: RepeatMonthly;\n start: Dayjs;\n}): Dayjs => {\n const rule = new Rule({\n frequency: 'YEARLY',\n byDayOfMonth: repeat.dates,\n byMonthOfYear: repeat.months,\n start,\n });\n return getNextOccurrenceFromRule({ rule, start });\n};\n\nexport const nextDateOfIteration = ({\n repeat,\n start: startString,\n}: {\n repeat: Repeat;\n start: string;\n}): string => {\n const start = dayjs(startString);\n\n switch (repeat.type) {\n case 'simple': {\n const result = nextDateOfIterationSimple({ repeat, start });\n return stringifyDayjs(result);\n // return stringifyDayjs(nextDateOfIterationSimple({ repeat, start }));\n }\n case 'weekly': {\n return stringifyDayjs(nextDateOfIterationWeekly({ repeat, start }));\n }\n case 'monthly': {\n return stringifyDayjs(nextDateOfIterationMonthly({ repeat, start }));\n }\n }\n return notReachable(repeat);\n};\n\nexport const nextDateOfIterationAfterToday = ({\n repeat,\n start: startInput,\n today,\n}: {\n repeat: Repeat;\n start: string;\n today: string;\n}): string => {\n const todayDayjs = dayjs(today);\n\n // For repeat \"after x time\", we calculate the date of the next repetition\n // from TODAY, with the assumption that the task has been completed today. The\n // start date may be in the past, and the next repetition is calculated from\n // when the task was completed, not when it was last due.\n const start = repeat.repeat === AFTER ? today : startInput;\n\n let next = nextDateOfIteration({ repeat, start });\n const first = next;\n\n while (!dayjs(next).isAfter(todayDayjs)) {\n next = nextDateOfIteration({ repeat, start: next });\n\n // NOTE: There is a potential to reach an infinite loop here if the returned\n // date is the same as the current date. This was an issue because\n // `nextDateOfIteration()` was not always returning a date which was after\n // its provided `start` date.\n if (next === first) {\n throw new Error('Recursive loop encountered. #l2OWKV');\n }\n }\n\n return next;\n};\n","import * as R from 'remeda';\nimport {\n DAYS,\n UNITS,\n MONTHS,\n AFTER,\n EVERY,\n MONTHS_TO_NUMBER,\n} from '../../../../constants';\nimport { Day, Month, Unit, Repeat } from '../../../../types';\nimport { RuleOption } from '../../../../rschedule';\n\nconst leadingNumberRegex = new RegExp('^[\\\\d,]+');\n\nexport const startsWith = (target: string, input: string): boolean => {\n return input.substr(0, target.length).toLowerCase() === target;\n};\n\nexport const removeFromFront = (target: string, input: string): string => {\n if (!startsWith(target, input)) {\n return input;\n }\n return input.substr(target.length);\n};\n\nexport const getLeadingNumbers = (input: string): number[] => {\n const matches = input.match(leadingNumberRegex);\n\n if (matches === null) {\n return [];\n }\n\n if (matches.index !== 0) {\n throw new Error('Unknown error parsing repeat string #vX5cVc');\n }\n\n if (matches[0].substr(-1) === ',') {\n throw new Error('Error parsing repeat string. Too many commas. #Oew9pV');\n }\n\n const strings = matches[0].split(',');\n\n const numbers = R.map(strings, parseInt);\n\n return numbers;\n};\n\nexport const isDay = (input: string): input is Day => {\n return DAYS.indexOf(input as Day) !== -1;\n};\n\nexport const isMonth = (input: string): input is Month => {\n return MONTHS.indexOf(input as Month) !== -1;\n};\n\nexport const isUnit = (input: string): input is Unit => {\n return UNITS.indexOf(input as Unit) !== -1;\n};\n\nexport const isDayOfMonth = (\n input: number\n): input is RuleOption.ByDayOfMonth => {\n return typeof input === 'number' && input >= -31 && input <= 31;\n};\n\nexport const dayInputToDayOfWeek = (input: Day): RuleOption.ByDayOfWeek => {\n return input.substr(0, 2).toUpperCase() as RuleOption.ByDayOfWeek;\n};\n\nexport const monthsInputToMonthOfYear = (\n input: Month\n): RuleOption.ByMonthOfYear => {\n return MONTHS_TO_NUMBER[input];\n};\n\nexport const getRepeatParams = (input: string): Repeat => {\n const repeat = startsWith(EVERY, input)\n ? EVERY\n : startsWith(AFTER, input)\n ? AFTER\n : null;\n\n if (repeat === null) {\n throw new Error('Invalid repeat string #ITAWtF');\n }\n\n // Strip the leading every or after string\n const countAndUnit = removeFromFront(repeat, input);\n\n const numbers = getLeadingNumbers(countAndUnit);\n\n // NOTE: We convert to lower case here to ensure case insensitivity\n const unit = removeFromFront(numbers.join(','), countAndUnit).toLowerCase();\n\n if (isDay(unit)) {\n if (repeat === AFTER) {\n throw new Error(\n 'Invalid repeat string. Cannot mix after and multiple values. #psuDCi'\n );\n }\n const days = [dayInputToDayOfWeek(unit)];\n const count = numbers.length === 1 ? numbers[0] : 1;\n return {\n type: 'weekly',\n repeat,\n count,\n days,\n };\n }\n\n const multpleUnits = unit.split(',');\n\n if (multpleUnits.length > 1) {\n if (repeat === AFTER) {\n throw new Error(\n 'Invalid repeat string. Cannot mix after and multiple values. #Ah2i8c'\n );\n }\n\n if (multpleUnits.every(isDay)) {\n // TypeScript cannot infer from the `.every()` type predicate\n const days = (multpleUnits as Day[]).map(dayInputToDayOfWeek);\n // NOTE: We default to every 1 week if a number was not specified\n const count = numbers.length === 1 ? numbers[0] : 1;\n return {\n type: 'weekly',\n repeat,\n count,\n days,\n };\n } else if (multpleUnits.every(isMonth)) {\n if (numbers.length === 0) {\n throw new Error('Invalid repeat string. No dates specified. #qBE8YE');\n }\n if (!numbers.every(isDayOfMonth)) {\n throw new Error('Invalid repeat string. Date >31. #hciAdh');\n }\n\n // TypeScript cannot infer from the `.every()` type predicate\n const months = (multpleUnits as Month[]).map(monthsInputToMonthOfYear);\n\n return {\n type: 'monthly',\n repeat,\n // TypeScript cannot infer from the `.every()` type predicate\n dates: numbers as RuleOption.ByDayOfMonth[],\n months,\n };\n } else {\n throw new Error('Invalid repeat string #fJhZTU');\n }\n }\n\n const trimmedUnit = unit.replace(/s$/, '');\n\n if (!isUnit(trimmedUnit)) {\n throw new Error(\n `Invalid repeat string. Invalid unit: ${trimmedUnit}. #fL3bsD`\n );\n }\n\n const [count] = numbers;\n\n return {\n type: 'simple',\n repeat,\n unit: trimmedUnit,\n count,\n };\n};\n","import dayjs from 'dayjs';\nimport { REPEAT_ID_SEPARATOR } from '../../constants';\nimport { Repeat, Task, TaskData } from '../../types';\nimport { createId, stringifyDayjs } from '../../utils';\nimport { nextDateOfIterationAfterToday } from './services/nextRepeat/nextRepeat.service';\nimport { getRepeatParams } from './services/repeatParser/repeatParser.service';\n\nexport { getRepeatParams } from './services/repeatParser/repeatParser.service';\n\n/**\n * Given an id like abc123 create abc123-1, given abc123-1 create abc123-2\n */\nexport const _calculateNextTaskId = (id?: string): string => {\n if (typeof id === 'undefined') {\n return createId();\n }\n const [baseId, counter] = id.split(REPEAT_ID_SEPARATOR);\n if (typeof counter === 'undefined') {\n // NOTE: We start with 1, assuming the naked baseId is the 0 value\n return `${baseId}-1`;\n }\n const asInt = parseInt(counter);\n return `${baseId}-${(asInt + 1).toString()}`;\n};\n\nexport const _calculateNextRepetitionDate = ({\n date,\n today,\n repeat,\n}: {\n date: string;\n today: string;\n repeat: Repeat;\n}): string => {\n console.log(date, today, repeat, '#djXndF');\n return '';\n};\n\nexport const _calculateNextByAfterDates = ({\n by,\n after,\n today,\n repeat,\n}: {\n by?: string;\n after?: string;\n today: string;\n repeat: Repeat;\n}) => {\n // If this task has no BY date, then just extend the AFTER date with the\n // regular repeat logic and we're done.\n if (typeof by === 'undefined') {\n if (typeof after === 'undefined') {\n throw new Error('Unexpected error. #U3GWXo');\n }\n const nextAfter = nextDateOfIterationAfterToday({\n repeat,\n start: after,\n today,\n });\n return { after: nextAfter };\n }\n\n const nextBy = nextDateOfIterationAfterToday({ repeat, start: by, today });\n\n // If there is both a BY and an AFTER date, then having already calculated the\n // value of the next BY date, calculate the next AFTER date. Do that by\n // counting the number of days between the original BY and AFTER dates, and\n // deducting that many days from the new BY date.\n if (typeof after !== 'undefined') {\n const daysFromAfterUntilBy = dayjs(by).diff(after, 'day');\n const nextAfter = stringifyDayjs(\n dayjs(nextBy).subtract(daysFromAfterUntilBy, 'day')\n );\n return { by: nextBy, after: nextAfter };\n }\n\n return { by: nextBy };\n};\n\n/**\n * Given a task that **is finished**, and today's date, return the next\n * repetition of this task.\n */\nexport const createNextIteration = ({\n task,\n today,\n}: {\n task: Task;\n today: string;\n}): Task => {\n if (typeof task.data.repeat === 'undefined') {\n throw new Error('Invalid task given to createNextIteration() #ONv7Lt');\n }\n\n const repeat = getRepeatParams(task.data.repeat);\n\n const dates = _calculateNextByAfterDates({\n by: task.data.by,\n after: task.data.after,\n today,\n repeat,\n });\n\n const id = _calculateNextTaskId(task.data.id);\n\n const data: TaskData = {\n id,\n repeat: task.data.repeat,\n created: stringifyDayjs(dayjs(today)),\n ...dates,\n };\n\n return {\n ...task,\n finished: false,\n id,\n data,\n };\n};\n","import { createAction, createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport dayjs from 'dayjs';\nimport { difference } from 'remeda';\nimport { REDUX_ROOT_KEY } from '../../constants';\nimport { AppThunk, RootState } from '../../store';\nimport { Section, Task } from '../../types';\nimport { removeEmptyProperties, stringifyDayjs } from '../../utils';\nimport { createNextIteration } from '../repeat/repeat.service';\n\nexport const REDUX_KEY = 'data';\n\nconst getState = (state: RootState) => state[REDUX_ROOT_KEY][REDUX_KEY];\n\ntype State = {\n sections: Section[];\n tasks: Task[];\n initialDataLoadComplete: boolean;\n};\nconst initialState: State = {\n sections: [],\n tasks: [],\n initialDataLoadComplete: false,\n};\n\nconst getTaskIndex = (state: State, id: string): number => {\n const taskIndex = state.tasks.findIndex((task) => task.id === id);\n if (typeof taskIndex === 'undefined') {\n throw new Error('Failed to find task by ID #1INCd9');\n }\n return taskIndex;\n};\n\nexport const snoozeTask = createAction(\n 'domd/data/snoozeTask',\n ({ id, daysFromToday }: { id: string; daysFromToday: number }) => {\n return {\n payload: {\n id,\n snooze: stringifyDayjs(dayjs().add(daysFromToday, 'day')),\n },\n };\n }\n);\n\nconst sectionSlice = createSlice({\n name: 'domd/data',\n initialState,\n reducers: {\n setData: (\n state,\n action: PayloadAction<{\n sections: Section[];\n tasks: Task[];\n }>\n ) => {\n state.sections = action.payload.sections;\n state.tasks = action.payload.tasks;\n state.initialDataLoadComplete = true;\n },\n newSection: (\n state,\n action: PayloadAction<{ section: Section; insertAtIndex: number }>\n ) => {\n state.sections.splice(\n action.payload.insertAtIndex,\n 0,\n action.payload.section\n );\n },\n newTask: (\n state,\n action: PayloadAction<{ task: Task; insertAtIndex: number }>\n ) => {\n const { data, ...rest } = action.payload.task;\n const task = { ...rest, data: removeEmptyProperties(data) };\n state.tasks.splice(action.payload.insertAtIndex, 0, task);\n },\n closeTaskWithoutRepeating: (state, action: PayloadAction) => {\n const taskIndex = getTaskIndex(state, action.payload);\n state.tasks[taskIndex].finished = true;\n },\n unfinishTask: (state, action: PayloadAction) => {\n const taskIndex = getTaskIndex(state, action.payload);\n state.tasks[taskIndex].finished = false;\n },\n /**\n * Update a task. Setting any value to an empty string (or empty array)\n * will remove that field.\n */\n updateTask: (\n state,\n action: PayloadAction<{ id: string; changes: Partial> }>\n ) => {\n const taskIndex = getTaskIndex(state, action.payload.id);\n\n const data = removeEmptyProperties({\n ...state.tasks[taskIndex].data,\n ...action.payload.changes.data,\n });\n\n state.tasks[taskIndex] = {\n ...state.tasks[taskIndex],\n ...action.payload.changes,\n data,\n };\n },\n addContextsToTask: (\n state,\n action: PayloadAction<{ id: string; newContexts: string[] }>\n ) => {\n const taskIndex = getTaskIndex(state, action.payload.id);\n const task = state.tasks[taskIndex];\n\n // If there are no existing contexts, just return the new array\n if (typeof task.data.contexts === 'undefined') {\n task.data.contexts = action.payload.newContexts;\n return;\n }\n\n // Find contexts which are new\n const insertContexts = difference(\n action.payload.newContexts,\n task.data.contexts\n );\n\n // If there are no new contexts, do nothing, return\n if (insertContexts.length === 0) {\n return;\n }\n\n task.data.contexts = task.data.contexts.concat(insertContexts);\n },\n },\n extraReducers: (builder) => {\n builder.addCase(snoozeTask, (state, action) => {\n const taskIndex = getTaskIndex(state, action.payload.id);\n state.tasks[taskIndex].data.snooze = action.payload.snooze;\n });\n // .addCase(finishTask, (state, action) => {\n // const taskIndex = getTaskIndex(state, action.payload.id);\n\n // // NOTE: This must happen BEFORE the `.splice()` call as it will\n // // change the index order of the array.\n // state.tasks[taskIndex].finished = true;\n // state.tasks.splice(taskIndex, 0, action.payload.id);\n // });\n },\n});\n\nexport const {\n setData,\n newSection,\n newTask,\n unfinishTask,\n closeTaskWithoutRepeating,\n updateTask,\n addContextsToTask,\n} = sectionSlice.actions;\n\nexport default sectionSlice.reducer;\n\nexport const finishTask = (id: string): AppThunk => async (\n dispatch,\n getRootState\n) => {\n const rootState = getRootState();\n const state = getState(rootState);\n\n const taskIndex = getTaskIndex(state, id);\n const task = state.tasks[taskIndex];\n\n dispatch(closeTaskWithoutRepeating(id));\n\n // If this task has no repetition, then stop here\n if (typeof task.data.repeat === 'undefined') {\n return;\n }\n\n const today = rootState[REDUX_ROOT_KEY].query.today;\n\n const nextIteration = createNextIteration({\n task,\n today,\n });\n\n dispatch(newTask({ task: nextIteration, insertAtIndex: taskIndex }));\n};\n","import { createSlice, PayloadAction } from '@reduxjs/toolkit';\nimport dayjs from 'dayjs';\nimport { stringifyDayjs } from '../../utils';\n\nexport const REDUX_KEY = 'query';\n\ntype State = {\n today: string;\n currentContexts: string[];\n};\nconst initialState: State = {\n today: '',\n currentContexts: [],\n};\n\nconst querySlice = createSlice({\n name: 'domd/query',\n initialState,\n reducers: {\n // [init.type]: (state, action) => {\n // state.today = action.payload.today;\n // },\n init: {\n prepare: () => {\n return {\n payload: {\n today: stringifyDayjs(dayjs()),\n },\n };\n },\n reducer: (state, action: PayloadAction<{ today: string }>) => {\n state.today = action.payload.today;\n },\n },\n setCurrentContexts: (state, action: PayloadAction) => {\n state.currentContexts = action.payload;\n },\n addContext: (state, action: PayloadAction) => {\n if (state.currentContexts.find(c => c === action.payload)) {\n return;\n }\n state.currentContexts.push(action.payload);\n },\n removeContext: (state, action: PayloadAction) => {\n const index = state.currentContexts.findIndex(c => c === action.payload);\n if (index !== -1) {\n state.currentContexts.splice(index, 1);\n }\n },\n },\n});\n\nexport const {\n init,\n setCurrentContexts,\n addContext,\n removeContext,\n} = querySlice.actions;\n\nexport default querySlice.reducer;\n","import { createSlice } from '@reduxjs/toolkit';\n\nexport const REDUX_KEY = 'startup';\n\nconst initialState = {\n empty: true,\n};\n\nconst startupSlice = createSlice({\n name: 'domd/startup',\n initialState,\n reducers: {\n nothing: state => {\n state.empty = true;\n },\n },\n});\n\nexport const { nothing } = startupSlice.actions;\n\nexport default startupSlice.reducer;\n","import {\n Action,\n combineReducers,\n configureStore,\n ThunkAction,\n} from '@reduxjs/toolkit';\nimport devToolsEnhancer, {\n RemoteReduxDevToolsOptions,\n} from 'remote-redux-devtools';\nimport { REDUX_ROOT_KEY } from './constants';\nimport data, { REDUX_KEY as dataKey } from './services/data/data.state';\nimport query, { REDUX_KEY as queryKey } from './services/query/query.state';\nimport startup, {\n REDUX_KEY as startupKey,\n} from './services/startup/startup.state';\n\nexport const reducer = combineReducers({\n [startupKey]: startup,\n [dataKey]: data,\n [queryKey]: query,\n});\n\nexport const createStore = (args?: {\n enableDevTools?: boolean;\n enableRemoteDevTools?: boolean;\n devToolsEnhancerArgs?: RemoteReduxDevToolsOptions;\n}) => {\n const {\n enableDevTools = false,\n enableRemoteDevTools = true,\n devToolsEnhancerArgs = {\n hostname: 'localhost',\n port: 8000,\n realtime: true,\n },\n } = typeof args === 'undefined' ? {} : args;\n\n const enhancers = [];\n if (enableRemoteDevTools) {\n enhancers.push(devToolsEnhancer(devToolsEnhancerArgs));\n }\n\n const store = configureStore({\n reducer: {\n [REDUX_ROOT_KEY]: reducer,\n },\n devTools: enableDevTools,\n enhancers,\n });\n\n return store;\n};\n\nexport type LocalState = ReturnType;\n\n// export type RootState = ReturnType;\nexport type RootState = {\n [REDUX_ROOT_KEY]: LocalState;\n};\nexport type AppThunk = ThunkAction<\n ReturnType,\n RootState,\n unknown,\n Action\n>;\n\n/**\n * Get the state for this package from a top level redux store\n */\nexport const getLocalState = (state: RootState) => state[REDUX_ROOT_KEY];\n","import { Root } from 'mdast';\nimport markdown from 'remark-parse';\nimport stringify from 'remark-stringify';\nimport unified from 'unified';\nimport { Node } from 'unist';\nimport { AFTER, BY, KEY_VALUE_SEPARATOR } from '../constants';\nimport { TaskListItem } from '../types';\n\nexport type NodeWithData = Node & { _data: { [prop: string]: any } };\n\nconst toMdastProcessor = unified().use(markdown, { gfm: true });\nconst toMarkdownProcessor = unified().use(stringify, {\n listItemIndent: '1',\n incrementListMarker: false,\n});\n\nexport const markdownToMdast = (text: string): Root => {\n return toMdastProcessor.parse(text) as Root;\n};\n\nexport const mdastToMarkdown = async (tree: Root): Promise => {\n return toMarkdownProcessor.stringify(tree);\n};\n\nexport const getFirstTaskFromMdast = (root: Root): TaskListItem => {\n return (root as any).children[0].children[0];\n};\n\nexport const yesterday = '2020-02-23';\nexport const today = '2020-02-24';\nexport const tomorrow = '2020-02-25';\nconst data = (key: string, value: string) =>\n `\\`${key}${KEY_VALUE_SEPARATOR}${value}\\``;\n\nexport const taskListOnlyMarkdown = `- [ ] A simple task\n- [ ] A second simple task\n- [ ] One more simple task`;\n\nexport const tasksWithSecondLineMarkdown = `- [ ] A first task \n With a second line of text\n- [ ] A second task without a second line`;\n\nexport const complexTaskListMarkdown = `# First heading\n\n- [ ] A top level task \n ${data(AFTER, yesterday)} ${data(BY, today)} ${data('id', 'abc123')}\n- [ ] A second task \n ${data(AFTER, '2020-01-01')} ${data(BY, tomorrow)}\n\n## Sub heading\n\nSome text under the second heading.\n\n- [ ] Third task \n ${data(AFTER, yesterday)} ${data(BY, tomorrow)}\n- [ ] Fourth task on the list \n ${data(AFTER, '2020-01-01')} ${data(BY, today)}\n - [ ] Nested task first\n - [ ] Second nested task\n\nMore text without a heading.\n\n1. [ ] A sequential task\n1. [ ] A second sequential task\n`;\n\nconst singleTask = markdownToMdast(`- [ ] A single task`);\nexport const taskWithoutData = singleTask.children[0] as TaskListItem;\n\nconst singleTaskWithSecondLine = markdownToMdast(\n `- [ ] A second line task task \\nWith a second line`\n);\nexport const taskWithSecondLine = singleTaskWithSecondLine\n .children[0] as TaskListItem;\n","import stringify from 'fast-json-stable-stringify';\nimport { List, ListItem, Root } from 'mdast';\nimport { isHeading, isInlineCode, isList } from 'mdast-util-is-type';\nimport remarkStringify from 'remark-stringify';\nimport { clone, equals } from 'remeda';\nimport unified from 'unified';\nimport removePosition from 'unist-util-remove-position';\nimport stringifyPosition from 'unist-util-stringify-position';\nimport { KEY_VALUE_SEPARATOR, TOP_SECTION_ID } from '../../constants';\nimport { Section, Task, TaskData, TaskListItem } from '../../types';\nimport { isListItemWithCheckedField, isTaskListItem } from '../../utils';\n\ntype TaskWithoutSectionId = Omit;\n\nexport const createIdForTask = ({\n data,\n contentMarkdown,\n}: {\n data: TaskData;\n contentMarkdown: string;\n}): string => {\n // Best case, get the ID from our data, this is sourced from markdown, and is\n // guaranteed (hopefully) stable\n if (typeof data.id === 'string') {\n return data.id;\n }\n\n // Next best case, build a deterministic ID based on the content of the task\n return stringify({ data, contentMarkdown });\n};\n\nexport const createIdForSection = (section: Omit): string => {\n const { heading } = section;\n\n if (typeof heading === 'undefined') {\n const { position } = section.contents[0] || {};\n if (typeof position === 'undefined') {\n // There should only be one section which has no content and no heading.\n // This would be the very first section if the markdown file begins with a\n // task list.\n return TOP_SECTION_ID;\n }\n return stringifyPosition(position);\n }\n\n const { position } = heading;\n\n if (typeof position === 'undefined') {\n throw new Error('Trying to create ID without position #8wjJcb');\n }\n\n return stringifyPosition(position);\n};\n\nexport const getDataFromListItem = (item: TaskListItem): TaskData => {\n const firstParagraph = item.children[0];\n\n const data = firstParagraph.children.reduce((data, child) => {\n if (isInlineCode(child)) {\n const [key, value] = child.value.split(KEY_VALUE_SEPARATOR);\n\n // If the first character of `key` is a @ then this is a context\n if (key[0] === '@') {\n const context = key.substr(1);\n const { contexts } = data;\n return {\n ...data,\n contexts:\n typeof contexts === 'undefined'\n ? [context]\n : contexts.concat(context),\n };\n }\n\n // If this was not a context, then add this field to the data object\n return { ...data, [key]: value };\n }\n return data;\n }, {});\n\n return data;\n};\n\nconst processor = unified().use(remarkStringify, { gfm: true });\n\n/**\n * Given a `ListItem` that represents a task, get the text content only.\n *\n * This means:\n * - Strip out any of our `key:value` fields\n * - Retain any **formatting**\n * - Do not include the leading \"- [ ]\"\n */\nexport const getTextFromListItem = (item: TaskListItem): string => {\n // For now, we assume there is a singular paragraph as the first child of all\n // lists\n const firstParagraph = item.children[0];\n\n const children = firstParagraph.children.filter(child => {\n if (isInlineCode(child)) {\n return false;\n }\n return true;\n });\n\n const text = processor.stringify({ type: 'paragraph', children });\n\n const output = text\n .split('\\n')\n .map(line => line.trim())\n .filter(trimmedLine => trimmedLine.length > 0)\n // NOTE: We terminate every line with 2 spaces\n .join(' \\n');\n\n return output;\n};\n\nexport const listItemToTaskFactory = ({\n parentId = '',\n isSequential,\n}: {\n parentId?: string;\n isSequential: boolean;\n}) => (item: ListItem): TaskWithoutSectionId => {\n if (!isTaskListItem(item)) {\n throw new Error('Unable to handle non conformat list items. #KqOxgO');\n }\n\n const data = getDataFromListItem(item);\n const contentMarkdown = getTextFromListItem(item);\n const id = createIdForTask({ data, contentMarkdown });\n\n if (!isListItemWithCheckedField(item)) {\n return {\n id,\n parentId,\n finished: true,\n isSequential,\n isTask: false,\n contentMarkdown,\n // NOTE: Do not set any data if this is not a task\n data: {},\n };\n }\n\n return {\n id,\n parentId,\n finished: item.checked || false,\n isSequential,\n isTask: true,\n contentMarkdown,\n data,\n };\n};\n\nexport const _recusrseOverListItems = ({\n list,\n depth,\n parentId,\n}: {\n list: List;\n depth: number;\n parentId: string;\n}): TaskWithoutSectionId[] => {\n const tasks = list.children.flatMap(listItem => {\n const task = listItemToTaskFactory({\n parentId,\n isSequential: list.ordered || false,\n })(listItem);\n\n const taskId = task.id;\n\n const nestedTasks = listItem.children.filter(isList).flatMap(list => {\n return _recusrseOverListItems({\n list,\n depth: depth + 1,\n parentId: taskId,\n });\n });\n\n return [task].concat(nestedTasks);\n });\n\n return tasks;\n};\n\nexport const listToTasks = (list: List) => {\n return _recusrseOverListItems({ list, depth: 0, parentId: '' });\n};\n\ntype SectionWithTasks = Section & {\n tasks: Omit[];\n};\n\ntype SectionWithTasksWithoutId = Omit;\n\nconst emptySection = {\n depth: 0,\n heading: undefined,\n contents: [],\n tasks: [],\n};\nconst getEmptySection = (): SectionWithTasksWithoutId => {\n return clone(emptySection);\n};\n\nconst isSectionEmpty = (section: SectionWithTasksWithoutId): boolean => {\n return equals(section, emptySection);\n};\n\nconst stripPositionsFromSection = (\n section: SectionWithTasks\n): SectionWithTasks => {\n return {\n ...section,\n contents: section.contents.map(node => removePosition(node)),\n heading:\n typeof section.heading === 'undefined'\n ? section.heading\n : removePosition(section.heading),\n };\n};\n\nexport const parseMdast = (\n root: Root,\n { stripPositions = true }: { stripPositions?: boolean } = {}\n): SectionWithTasks[] => {\n const { children } = root;\n /**\n * - Iterate over children\n * - Build a stack of sections\n */\n const sections: SectionWithTasksWithoutId[] = [];\n\n let currentSection: SectionWithTasksWithoutId = getEmptySection();\n\n /**\n * - Iterate over the root's children\n * - Start with an \"empty\" section with the ID \"top\"\n * - When reaching a heading:\n * - Start a new section\n * - Set the heading on the new section\n * - When reaching a list:\n * - Add the tasks to the current section\n * - Start a new section\n */\n\n children.forEach(node => {\n if (!isList(node)) {\n if (isHeading(node)) {\n // Firstly, if there is anything in the current section, save it and\n // start a new section. The heading should always be the first thing we\n // add to a section.\n if (!isSectionEmpty(currentSection)) {\n sections.push(currentSection);\n currentSection = getEmptySection();\n }\n\n // Now that we know the current section is empty, add the heading we\n // just found to it.\n currentSection.heading = node;\n } else {\n // If we reach a node that is not a list, and not a heading, then add it\n // to the currently open section\n currentSection.contents.push(node);\n }\n } else {\n // When we find a list, we always add to the current section and start a\n // new section\n currentSection.tasks = listToTasks(node);\n sections.push(currentSection);\n currentSection = getEmptySection();\n }\n });\n\n if (!isSectionEmpty(currentSection)) {\n sections.push(currentSection);\n }\n\n const sectionsWithIds = sections.map(section => {\n return {\n ...section,\n id: createIdForSection(section),\n };\n });\n\n if (!stripPositions) {\n return sectionsWithIds;\n }\n\n const sectionsWithIdsWithoutPositions = sectionsWithIds.map(\n stripPositionsFromSection\n );\n\n return sectionsWithIdsWithoutPositions;\n};\n","import { AppThunk } from '../../../store';\nimport { Section, Task } from '../../../types';\nimport { markdownToMdast } from '../../../__fixtures__/markdown.fixtures';\nimport { setData } from '../../data/data.state';\nimport { parseMdast } from '../../parser/parser.service';\nimport { init } from '../../query/query.state';\n\nexport const startup = ({\n markdown,\n}: {\n markdown: string;\n}): AppThunk => async dispatch => {\n dispatch(init());\n\n const sections = parseMdast(markdownToMdast(markdown));\n\n const allTasks: Task[] = [];\n const sectionsWithoutTasks: Section[] = [];\n\n sections.forEach(section => {\n const { tasks, ...sectionWithoutTasks } = section;\n sectionsWithoutTasks.push(sectionWithoutTasks);\n const tasksWithSectionId = tasks.map(task => ({\n ...task,\n sectionId: section.id,\n }));\n allTasks.push(...tasksWithSectionId);\n });\n\n dispatch(setData({ sections: sectionsWithoutTasks, tasks: allTasks }));\n};\n","import dayjs from 'dayjs';\nimport { BY } from '../../constants';\nimport { TaskData } from '../../types';\n\nexport const dateToHuman = ({\n date,\n today,\n dateType,\n}: {\n date: string;\n today: string;\n dateType: keyof TaskData;\n}) => {\n const daysFromToday = dayjs(date).diff(dayjs(today), 'day');\n const todayText = daysFromToday === 0 ? 'Today' : `${daysFromToday} days`;\n\n if (dateType === BY) {\n const isOverdue = dateType === BY && daysFromToday <= 0;\n const isToday = dateType === BY && daysFromToday === 0;\n const isThisWeek = name === BY && daysFromToday > 0 && daysFromToday < 7;\n\n return {\n isOverdue,\n isToday,\n isThisWeek,\n todayText,\n daysFromToday,\n };\n }\n\n return {\n isOverdue: false,\n isToday: false,\n isThisWeek: false,\n todayText,\n daysFromToday,\n };\n};\n","import { RootState, getLocalState } from '../../../store';\nimport { createSelector } from '@reduxjs/toolkit';\nimport { EXCLUDED_BY_DEFAULT_CONTEXTS } from '../../../constants';\n\nexport const getContexts = createSelector(\n [\n (rootState: RootState) => getLocalState(rootState).data.tasks,\n (rootState: RootState) => getLocalState(rootState).query.currentContexts,\n ],\n (tasks, currentContexts) => {\n const output = new Set();\n tasks.forEach(task => {\n task.data.contexts?.forEach(context => {\n output.add(context);\n });\n });\n EXCLUDED_BY_DEFAULT_CONTEXTS.forEach(context => {\n output.add(context);\n });\n const allContexts = Array.from(output).sort();\n\n return allContexts.map((context): [string, boolean] => {\n const enabled = currentContexts.includes(context);\n return [context, enabled];\n });\n }\n);\n","import { RootState, getLocalState } from '../../../store';\n\n/**\n * Check all parts of the state to see if all required startup actions have\n * been run.\n */\nexport const isReady = (rootState: RootState) => {\n const state = getLocalState(rootState);\n return state.data.initialDataLoadComplete && state.query.today !== '';\n};\n","import { RootState, getLocalState } from '../../../store';\nimport { Section } from '../../../types';\nimport { Heading } from 'mdast';\n\nconst getTitleFromSection = (section: Section): string => {\n if (typeof section.heading !== 'undefined') {\n const { depth } = section.heading;\n const text = section.heading.children[0].value as string;\n return `${'#'.repeat(depth)} ${text}`;\n }\n\n if (section.contents.length > 0) {\n return section.contents[0].value as string;\n }\n\n return '';\n};\n\nexport const recursivelyGetParents = ({\n search,\n startingDepth,\n}: {\n search: Section[];\n startingDepth: number;\n}): string[] => {\n const foundIndex = search.findIndex(\n section =>\n typeof section.heading !== 'undefined' &&\n section.heading.depth < startingDepth\n );\n\n if (foundIndex === -1) {\n return [];\n }\n\n const found = search[foundIndex];\n const foundDepth = (found.heading as Heading).depth;\n const title = getTitleFromSection(found);\n\n // if (found.heading?.depth === 1) {\n // return [title]\n // }\n\n return [title].concat(\n recursivelyGetParents({\n search: search.slice(foundIndex),\n startingDepth: foundDepth,\n })\n );\n};\n\n/**\n * Given a sectionId, get it, and all its ancestors\n * NOTE: Currently only gets section & parent\n */\nexport const sectionTitles = (\n state: RootState,\n sectionId: string\n): string[] => {\n const sections = getLocalState(state).data.sections;\n\n const sectionIndex = sections.findIndex(section => section.id === sectionId);\n if (sectionIndex === -1) {\n throw new Error('Missing section in recursivelyGetSection #BXMQpO');\n }\n\n const section = sections[sectionIndex];\n\n const title = getTitleFromSection(section);\n\n // If this section is the very first, or it has no heading, or its heading is\n // depth 1, then it has no ancestors, so return now\n if (\n sectionIndex === 0 ||\n typeof section.heading === 'undefined' ||\n section.heading.depth === 1\n ) {\n return [title];\n }\n\n const startingDepth = section.heading.depth;\n\n const search = sections.slice(0, sectionIndex).reverse();\n // .find(\n // section =>\n // typeof section.heading !== 'undefined' &&\n // section.heading.depth < startingDepth\n // );\n\n if (search.length === 0) {\n return [title];\n }\n\n return [title].concat(recursivelyGetParents({ search, startingDepth }));\n};\n","import dayjs from 'dayjs';\nimport { Task } from '../../types';\nimport { intersection, difference } from 'remeda';\nimport { EXCLUDED_BY_DEFAULT_CONTEXTS } from '../../constants';\n\nexport const isTaskUnfinished = (task: Task) => {\n return !task.finished;\n};\n\nexport const isSnoozed = ({\n snooze,\n today,\n}: {\n snooze: string;\n today: string;\n}): boolean => {\n // NOTE: dayjs('').isAfter or isBefore always returns false, passing an empty\n // string to dayjs() generates an invalid date.\n return dayjs(snooze).isAfter(today);\n};\n\nexport const isBlockedByAfterDate = ({\n after,\n today,\n}: {\n after: string;\n today: string;\n}): boolean => {\n return dayjs(after).isAfter(today);\n};\n\nexport const isTaskActionableInCurrentContexts = ({\n contexts,\n currentContexts,\n}: {\n contexts?: string[];\n currentContexts: string[];\n}) => {\n // If the task has no contexts, then it's automatically actionable in all\n if (typeof contexts === 'undefined' || contexts.length === 0) {\n return true;\n }\n\n // Check if any contexts cause this task to be excluded (eg: @someday)\n const excludeContexts = difference(\n EXCLUDED_BY_DEFAULT_CONTEXTS,\n currentContexts\n );\n const matchedExclusions = intersection(excludeContexts, contexts);\n if (matchedExclusions.length > 0) {\n return false;\n }\n\n // After handling exclusions (like @someday), if there are no OTHER contexts\n // in `currentContexts`, then all tasks match, so return true now.\n const includeContexts = difference(\n currentContexts,\n EXCLUDED_BY_DEFAULT_CONTEXTS\n );\n if (includeContexts.length === 0) {\n return true;\n }\n\n // Get all the contexts which are in currentContexts\n const matchedContexts = intersection(contexts, currentContexts);\n if (matchedContexts.length > 0) {\n return true;\n }\n return false;\n};\n\nexport const isTaskActionableToday = ({\n task,\n today,\n currentContexts,\n}: {\n task: Task;\n today: string;\n currentContexts: string[];\n}): boolean => {\n const { data } = task;\n const { contexts, snooze, after } = data;\n\n // A task that has already been completed is never actionable\n if (task.finished) {\n return false;\n }\n\n if (!isTaskActionableInCurrentContexts({ contexts, currentContexts })) {\n return false;\n }\n\n if (task.isSequential) {\n // TODO Figure out how to handle sequential tasks\n // For now, we ignore the isSequential field, and only validate based on\n // other fields\n }\n\n if (typeof snooze === 'string' && snooze.length > 0) {\n if (isSnoozed({ snooze, today })) {\n return false;\n }\n }\n\n if (typeof after === 'string' && after.length > 0) {\n if (isBlockedByAfterDate({ after, today })) {\n return false;\n }\n }\n\n return true;\n};\n\nexport const doesTaskMatchDate = ({\n task,\n date,\n currentContexts,\n}: {\n task: Task;\n date: string;\n currentContexts: string[];\n}) => {\n const { data } = task;\n const { contexts, after, by, snooze } = data;\n\n // A task that has already been completed is never actionable\n if (task.finished) {\n return false;\n }\n\n if (!isTaskActionableInCurrentContexts({ contexts, currentContexts })) {\n return false;\n }\n\n if (task.isSequential) {\n // TODO Figure out how to handle sequential tasks\n // For now, we ignore the isSequential field, and only validate based on\n // other fields\n }\n\n if (typeof by === 'string') {\n // NOTE: String comparison works here, both by and date are strings\n // representing the date, no need for a date library to compare\n if (by === date) {\n return true;\n }\n }\n\n if (typeof snooze === 'string') {\n // NOTE: String comparison works here, both by and date are strings\n // representing the date, no need for a date library to compare\n if (snooze === date) {\n return true;\n }\n // Only check the `after` date if a `snoozze` date does not exist. We assume\n // that a snooze date will always be later than an `after` date.\n } else if (typeof after === 'string') {\n // NOTE: String comparison works here, both by and date are strings\n // representing the date, no need for a date library to compare\n if (after === date) {\n return true;\n }\n }\n\n return false;\n};\n\nexport const isTaskUndated = (task: Task): boolean => {\n const { data } = task;\n if (typeof data.after !== 'undefined') {\n return false;\n }\n if (typeof data.by !== 'undefined') {\n return false;\n }\n return true;\n};\n","import { RootState, getLocalState } from '../../../store';\n\nexport const selectCurrentContexts = (rootState: RootState) =>\n getLocalState(rootState).query.currentContexts;\n","import { getLocalState, RootState } from '../../../store';\nimport { Task } from '../../../types';\n\nexport const isTask = (task: Task) => task.isTask;\n\nexport const selectTasks = (rootState: RootState) => {\n const tasks = getLocalState(rootState).data.tasks;\n\n return tasks.filter(isTask);\n};\n","import { createSelector } from '@reduxjs/toolkit';\nimport { getLocalState, RootState } from '../../../store';\nimport { isTaskActionableToday } from '../query.service';\nimport { selectCurrentContexts } from './selectCurrentContexts.selector';\nimport { selectTasks } from './selectTasks.selector';\n\nexport const selectActionableTodayFactory = () => {\n return createSelector(\n [\n (state: RootState) => getLocalState(state).query.today,\n selectCurrentContexts,\n selectTasks,\n ],\n (today, currentContexts, tasks) => {\n return tasks.filter(task => {\n // If this task has actionable children, then consider it is not\n // \"actionable\" today, the children must be completed first. This is a\n // slightly weird dependency decision, and might need revisited, because\n // after the children are completed, the parent becomes available.\n // TODO Figure out how to handle child / parent tasks\n const { id } = task;\n if (\n typeof tasks.find(\n task => task.parentId === id && task.isTask && !task.finished\n ) !== 'undefined'\n ) {\n return false;\n }\n\n return isTaskActionableToday({\n task,\n today,\n currentContexts,\n });\n });\n }\n );\n};\n","import { createSelector } from '@reduxjs/toolkit';\nimport { isTaskUndated } from '../query.service';\nimport { selectActionableTodayFactory } from './selectActionableToday.selector';\n\nexport const selectUndatedTasksActionableToday = createSelector(\n [selectActionableTodayFactory()],\n (tasks) => {\n return tasks.filter(isTaskUndated);\n }\n);\n","import { RootState, getLocalState } from '../../../store';\n\nexport const taskById = (state: RootState, id: string) => {\n const tasks = getLocalState(state).data.tasks;\n const task = tasks.find(task => task.id === id);\n\n if (typeof task === 'undefined') {\n throw new Error('Tried to find non existent task. #fUNAfb');\n }\n\n const hasUnfinishedChildren =\n typeof tasks.find(\n task => task.parentId === id && task.isTask && !task.finished\n ) !== 'undefined';\n\n return { ...task, hasUnfinishedChildren };\n};\n","import { RootState } from '../../../store';\nimport { sectionTitles } from './sectionTitles.selector';\nimport { taskById } from './taskById.selector';\n\n// Get parents recursively\nconst getTaskWithParentsRecursively = ({\n rootState,\n taskId,\n}: {\n rootState: RootState;\n taskId: string;\n}): ReturnType[] => {\n const task = taskById(rootState, taskId);\n if (task.parentId === '') {\n return [task];\n }\n const parents = getTaskWithParentsRecursively({\n rootState,\n taskId: task.parentId,\n });\n return [task].concat(...parents);\n};\n\nexport const taskWithContext = (rootState: RootState, taskId: string) => {\n const tasks = getTaskWithParentsRecursively({ rootState, taskId });\n const titles = sectionTitles(rootState, tasks[0].sectionId);\n return { tasks, titles };\n};\n","import { Content, ListItem, Paragraph, PhrasingContent, Root } from 'mdast';\nimport markdown from 'remark-parse';\nimport unified from 'unified';\nimport { KEY_VALUE_SEPARATOR } from '../../constants';\nimport { Section, Task, TaskData } from '../../types';\n\nconst toMdastProcessor = unified().use(markdown, { gfm: true });\n\nexport const serializeData = (data: TaskData) => {\n // NOTE: This will have an extra space as the first element\n const children: PhrasingContent[] = Object.entries(data)\n .sort(([a], [b]) => a.localeCompare(b))\n .flatMap(([key, value]) => {\n // If this is the contexts key, then we create one inline code block per\n // context value. The `value` will be an array of strings, not a single\n // string.\n if (key === 'contexts') {\n return (value as string[]).flatMap(context => {\n return [\n { type: 'text', value: ' ' },\n {\n type: 'inlineCode',\n value: `@${context}`,\n },\n ];\n });\n }\n\n return [\n { type: 'text', value: ' ' },\n {\n type: 'inlineCode',\n value: `${key}${KEY_VALUE_SEPARATOR}${value}`,\n },\n ];\n });\n\n // NOTE: This check is necessary because the next `.splice()` will apply\n // whether or not there are any elements in the array. If there is data, we\n // want to return an empty array, and not a break.\n if (children.length === 0) {\n return children;\n }\n\n // Replace the first space with a break instead\n children.splice(0, 1, { type: 'break' });\n\n return children;\n};\n\nexport const recursiveTaskToMdast = ({\n tasks,\n taskId,\n}: {\n tasks: Task[];\n taskId: string;\n}) => {\n const task = tasks.find(task => task.id === taskId);\n if (typeof task === 'undefined') {\n throw new Error(\n 'recursiveTaskToMdast() called with invalid taskId #iuLSAf'\n );\n }\n // NOTE: We only allow 1 child paragraph and 1 child list\n\n const root = toMdastProcessor.parse(task.contentMarkdown) as Root;\n const paragraph = root.children[0] as Paragraph;\n\n const dataContent = serializeData(task.data);\n paragraph.children.push(...dataContent);\n\n const childTasks = tasks.filter(task => task.parentId === taskId);\n const hasChildTasks = childTasks.length > 0;\n\n const children: Content[] = [paragraph];\n\n if (hasChildTasks) {\n const childListItems = childTasks.map(task =>\n recursiveTaskToMdast({ tasks, taskId: task.id })\n );\n children.push({\n type: 'list',\n // NOTE: We assume that if 1 child task is sequential, they must all be,\n // because this list must be an ordered (numbered) list.\n ordered: childTasks[0].isSequential,\n spread: false,\n children: childListItems,\n });\n }\n\n const mdast = {\n type: 'listItem',\n checked: task.isTask ? task.finished : null,\n spread: false,\n children,\n } as ListItem;\n return mdast;\n};\n\nexport const createMdast = ({\n sections,\n tasks,\n}: {\n sections: Section[];\n tasks: Task[];\n}): Root => {\n const children: Content[] = [];\n sections.forEach(section => {\n if (typeof section.heading !== 'undefined') {\n children.push(section.heading);\n }\n children.push(...section.contents);\n\n const sectionTasks = tasks.filter(\n task => task.sectionId === section.id && task.parentId === ''\n );\n\n if (sectionTasks.length === 0) {\n return;\n }\n\n const listItems = sectionTasks.map(task =>\n recursiveTaskToMdast({ tasks, taskId: task.id })\n );\n\n children.push({\n type: 'list',\n spread: false,\n // NOTE: We assume that if 1 child task is sequential, they must all be,\n // because this list must be an ordered (numbered) list.\n ordered: sectionTasks[0].isSequential,\n children: listItems,\n });\n });\n\n return { type: 'root', children };\n};\n","import { createSlice } from \"@reduxjs/toolkit\";\n\nexport const REDUX_KEY = \"LeftMenu\";\n\nconst initialState = {\n isOpen: false,\n};\n\nconst slice = createSlice({\n name: \"app/Routes\",\n initialState,\n reducers: {\n toggleIsOpen: (state) => {\n state.isOpen = !state.isOpen;\n },\n },\n});\n\nexport const { toggleIsOpen } = slice.actions;\n\nexport default slice.reducer;\n","import { createEntityAdapter, createSlice, nanoid } from \"@reduxjs/toolkit\";\nimport { AppState } from \"../../store\";\n\nexport const REDUX_KEY = \"Notifications\";\nconst getLocalState = (state: AppState) => state[REDUX_KEY];\n\nexport type Notice = {\n message: string;\n type: \"error\" | \"warning\" | \"info\" | \"success\";\n};\n\ntype LoggedNotice = {\n id: string;\n notice: Notice;\n time: number;\n flashed: boolean;\n};\n\nconst noticeAdapter = createEntityAdapter();\n\nconst slice = createSlice({\n name: \"app/Notifications\",\n initialState: noticeAdapter.getInitialState(),\n reducers: {\n push: {\n prepare: ({ notice }: { notice: Notice }) => {\n return {\n payload: {\n notice,\n time: Math.round(Date.now() / 1e3),\n flashed: false,\n id: nanoid(),\n },\n };\n },\n reducer: noticeAdapter.addOne,\n },\n setFlashed: {\n prepare: (id) => {\n return { payload: { id, changes: { flashed: true } } };\n },\n reducer: noticeAdapter.updateOne,\n },\n },\n});\n\nexport const { push, setFlashed } = slice.actions;\n\nexport const { selectAll } = noticeAdapter.getSelectors(getLocalState);\n\nexport default slice.reducer;\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\n\nexport const REDUX_KEY = \"TaskForm\";\n\nconst slice = createSlice({\n name: \"app/TaskForm\",\n initialState: {\n isOpen: false,\n editingTaskId: \"\",\n },\n reducers: {\n openNew: (state) => {\n state.isOpen = true;\n state.editingTaskId = \"\";\n },\n openEdit: (state, action: PayloadAction) => {\n state.isOpen = true;\n state.editingTaskId = action.payload;\n },\n close: (state) => {\n state.isOpen = false;\n state.editingTaskId = \"\";\n },\n },\n});\n\nexport const { openNew: open, openNew, openEdit, close } = slice.actions;\n\nexport default slice.reducer;\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\n\nexport const REDUX_KEY = \"now\";\n\ntype State = {\n taskIds: string[];\n skipCount: number;\n};\nconst initialState: State = {\n taskIds: [],\n skipCount: 0,\n};\n\nconst nowSlice = createSlice({\n name: \"app/now\",\n initialState,\n reducers: {\n addId: (state, action: PayloadAction) => {\n state.taskIds.push(action.payload);\n },\n removeId: (state, action: PayloadAction) => {\n const idIndex = state.taskIds.indexOf(action.payload);\n state.taskIds.splice(idIndex, 1);\n if (state.taskIds.length === state.skipCount) {\n state.skipCount = 0;\n }\n },\n skip: (state) => {\n state.skipCount++;\n if (state.taskIds.length === state.skipCount) {\n state.skipCount = 0;\n }\n },\n resetSkip: (state) => {\n state.skipCount = 0;\n },\n },\n});\n\nexport const { addId, removeId, skip, resetSkip } = nowSlice.actions;\n\nexport default nowSlice.reducer;\n","import { createSlice, PayloadAction } from \"@reduxjs/toolkit\";\n\nexport const REDUX_KEY = \"storage\";\n\nconst initialState = {\n lastCommitHash: \"\",\n commitsAhead: 0,\n};\n\nconst storageSlice = createSlice({\n name: \"app/storage\",\n initialState,\n reducers: {\n addCommitsAhead: {\n prepare: (count = 1) => {\n return {\n payload: count,\n };\n },\n reducer: (state, action: PayloadAction) => {\n state.commitsAhead = state.commitsAhead + action.payload;\n },\n },\n resetCommitsAhead: (state) => {\n state.commitsAhead = 0;\n },\n setCommitsAhead: (state, action: PayloadAction) => {\n state.commitsAhead = action.payload;\n },\n setLastCommitHash: (state, action: PayloadAction) => {\n state.lastCommitHash = action.payload;\n },\n },\n});\n\nexport const {\n addCommitsAhead,\n resetCommitsAhead,\n setCommitsAhead,\n setLastCommitHash,\n} = storageSlice.actions;\n\nexport default storageSlice.reducer;\n","import {\n Action,\n combineReducers,\n configureStore,\n ThunkAction,\n} from \"@reduxjs/toolkit\";\nimport { domdReduxKey, reducer as domdReducer } from \"do.md\";\nimport LeftMenu, {\n REDUX_KEY as LeftMenuKey,\n} from \"./scenes/LeftMenu/LeftMenu.state\";\nimport Notifications, {\n REDUX_KEY as NotificationsKey,\n} from \"./scenes/Notifications/Notifications.state\";\nimport TaskForm, {\n REDUX_KEY as TaskFormKey,\n} from \"./scenes/TaskForm/TaskForm.state\";\nimport now, { REDUX_KEY as nowKey } from \"./services/now/now.state\";\nimport storage, {\n REDUX_KEY as storageKey,\n} from \"./services/storage/storage.state\";\n\nconst reducer = combineReducers({\n [domdReduxKey]: domdReducer,\n [LeftMenuKey]: LeftMenu,\n [NotificationsKey]: Notifications,\n [TaskFormKey]: TaskForm,\n [nowKey]: now,\n [storageKey]: storage,\n});\n\nexport type AppState = ReturnType;\n\nconst store = configureStore({\n reducer,\n devTools: true,\n});\n\n// Expose the store to the console, we want to be developer friendly so folks\n// can easily poke about and see what's going on.\n(globalThis as any).store = store;\n\nexport default store;\n\nexport type AppDispatch = typeof store.dispatch;\n\nexport type AppThunk = ThunkAction>;\n","import {\n Button,\n Checkbox,\n createStyles,\n makeStyles,\n Paper,\n Typography,\n} from \"@material-ui/core\";\nimport { green, grey, orange, red, yellow } from \"@material-ui/core/colors\";\nimport { createSelector } from \"@reduxjs/toolkit\";\nimport classNames from \"classnames\";\nimport {\n constants,\n dateToHuman,\n finishTask,\n getPackageState as getDomdState,\n Task,\n unfinishTask,\n} from \"do.md\";\nimport Markdown from \"markdown-to-jsx\";\nimport React, { Fragment, useMemo } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { addId } from \"../../../../services/now/now.state\";\nimport { AppDispatch, AppState } from \"../../../../store\";\nimport EditButton from \"../../../EditButton/EditButton.scene\";\nimport SnoozeButton from \"../../../SnoozeButton/SnoozeButton.scene\";\n\nexport enum TaskItemActionSet {\n all,\n review,\n}\n\nconst makeChildTasksSelector = () =>\n createSelector(\n [\n (_state: AppState, parentId: string) => parentId,\n (state: AppState) => state.__domd.data.tasks,\n ],\n (parentId, tasks) => tasks.filter((task) => task.parentId === parentId)\n );\n\nconst Data = ({ task: { data, finished } }: { task: Task }) => {\n const classes = useStyles();\n const today = useSelector(\n (state: AppState) => getDomdState(state).query.today\n );\n\n const dataEntries = Object.entries(data);\n const hasData = dataEntries.length > 0;\n\n if (!hasData) {\n return null;\n }\n\n return (\n <>\n
\n \n {dataEntries.map(([key, value]) => {\n if (key === \"contexts\") {\n return (\n \n {`@${(value as string[]).join(\n \" @\"\n )}`}{\" \"}\n \n );\n }\n\n if (!finished && (key === constants.BY || key === constants.AFTER)) {\n const { todayText, isOverdue, isThisWeek, isToday } = dateToHuman({\n date: value as string,\n today,\n dateType: key,\n });\n return (\n \n {key === constants.BY ? \"BY\" : constants.AFTER}:{\" \"}\n {value} (\n \n {todayText}\n \n ){\" \"}\n \n );\n }\n\n return (\n \n {key}: {value}{\" \"}\n \n );\n })}\n \n );\n};\n\nconst TaskItem = ({\n task,\n depth = 0,\n actionSet = TaskItemActionSet.all,\n}: {\n task: Task;\n depth?: number;\n actionSet?: TaskItemActionSet;\n}) => {\n const classes = useStyles();\n\n const selectChildTasks = useMemo(makeChildTasksSelector, []);\n const tasks = useSelector((state: AppState) =>\n selectChildTasks(state, task.id)\n );\n const dispatch = useDispatch();\n\n // Show this task wrapped in an outline if it is either not a task, or it is a\n // sequential task\n const hideOutline = !task.isTask || task.isSequential;\n\n const words = task.contentMarkdown.split(\" \");\n const prios = {\n p1: words.indexOf(\"p1\") !== -1,\n p2: words.indexOf(\"p2\") !== -1,\n p3: words.indexOf(\"p3\") !== -1,\n p4: words.indexOf(\"p4\") !== -1,\n };\n\n return (\n \n \n {task.isTask ? (\n {\n if (event.target.checked) {\n dispatch(finishTask(task.id));\n } else {\n dispatch(unfinishTask(task.id));\n }\n }}\n />\n ) : null}\n \n {task.contentMarkdown}\n \n {\" \"}\n {task.isTask && actionSet === TaskItemActionSet.review ? (\n <>\n
\n \n \n ) : null}\n {task.isTask ? : null}\n {task.isTask ? (\n \n ) : null}\n {task.isTask && actionSet === TaskItemActionSet.review ? (\n {\n dispatch(addId(task.id));\n }}\n >\n now\n \n ) : null}\n
\n {tasks.map((task) => (\n \n ))}\n \n );\n};\n\nexport default TaskItem;\n\nconst useStyles = makeStyles((theme) => {\n return createStyles({\n today: {\n backgroundColor: orange[500],\n },\n thisWeek: {\n backgroundColor: orange[100],\n },\n p1: {\n backgroundColor: red[500],\n },\n p2: {\n backgroundColor: yellow[500],\n },\n p3: {\n backgroundColor: green[300],\n },\n p4: {\n backgroundColor: grey[300],\n },\n light: { opacity: 0.6 },\n overdue: {\n color: red[900],\n fontWeight: 700,\n fontSize: \"1.5em\",\n },\n actionSpacing: {\n marginLeft: theme.spacing(4),\n },\n });\n});\n","import { Button } from \"@material-ui/core\";\nimport React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { AppDispatch } from \"../../store\";\nimport { openEdit } from \"../TaskForm/TaskForm.state\";\n\nconst EditButton = ({\n taskId,\n size = \"small\",\n variant = \"outlined\",\n}: {\n taskId: string;\n size?: \"small\" | \"medium\" | \"large\";\n variant?: \"text\" | \"outlined\" | \"contained\";\n}) => {\n const dispatch: AppDispatch = useDispatch();\n\n return (\n {\n dispatch(openEdit(taskId));\n }}\n >\n Edit\n \n );\n};\n\nexport default EditButton;\n","import { Button } from \"@material-ui/core\";\nimport { snoozeTask } from \"do.md\";\nimport React from \"react\";\nimport { useDispatch } from \"react-redux\";\nimport { AppDispatch } from \"../../store\";\n\nconst SnoozeButton = ({\n taskId,\n size = \"small\",\n variant = \"outlined\",\n className,\n}: {\n taskId: string;\n size?: \"small\" | \"medium\" | \"large\";\n variant?: \"text\" | \"outlined\" | \"contained\";\n className?: string;\n}) => {\n const dispatch: AppDispatch = useDispatch();\n\n return (\n {\n const daysFromToday = parseInt(prompt(\"How many days hence?\") || \"0\");\n if (daysFromToday > 0) {\n dispatch(snoozeTask({ id: taskId, daysFromToday }));\n }\n }}\n >\n Snooze\n \n );\n};\n\nexport default SnoozeButton;\n","import { makeStyles, Paper, Typography } from \"@material-ui/core\";\nimport { createSelector } from \"@reduxjs/toolkit\";\nimport { Section } from \"do.md\";\nimport { Heading } from \"mdast\";\nimport toString from \"mdast-util-to-string\";\nimport React, { useMemo } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { AppState } from \"../../../../store\";\nimport TaskItem from \"../TaskItem/TaskItem.scene\";\n\nconst makeSectionTasksSelector = () =>\n createSelector(\n [\n (state: AppState, sectionId: string) => sectionId,\n (state: AppState) => state.__domd.data.tasks,\n ],\n (sectionId, tasks) =>\n tasks.filter(\n (task) => task.parentId === \"\" && task.sectionId === sectionId\n )\n );\n\nconst SectionHeading = ({ heading }: { heading?: Heading }) => {\n if (typeof heading === \"undefined\") {\n return null;\n }\n\n const { depth } = heading;\n\n const text = toString(heading);\n const leading = \"#\".repeat(depth);\n const variant = `h${depth}` as \"h1\" | \"h2\" | \"h3\" | \"h4\" | \"h5\" | \"h6\";\n\n return (\n \n {leading} {text}\n \n );\n};\n\nconst SectionScene = ({ section }: { section: Section }) => {\n const classes = useStyles();\n const selectSectionTasks = useMemo(makeSectionTasksSelector, []);\n const tasks = useSelector((state: AppState) =>\n selectSectionTasks(state, section.id)\n );\n\n return (\n
\n \n {toString(section.contents)}\n\n \n {tasks.map((task, i) => (\n \n ))}\n \n
\n );\n};\n\nexport default SectionScene;\n\nconst useStyles = makeStyles((theme) => {\n return {\n paper: {\n padding: theme.spacing(2),\n },\n };\n});\n","import { makeStyles } from \"@material-ui/core\";\nimport { getPackageState } from \"do.md\";\nimport React from \"react\";\nimport { useSelector } from \"react-redux\";\nimport { AppState } from \"../../store\";\nimport SectionScene from \"./scenes/Section/Section.scene\";\n\nconst AllTasks = () => {\n const classes = useStyles();\n const { sections } = useSelector((state: AppState) => {\n return {\n sections: getPackageState(state).data.sections,\n };\n });\n\n return (\n
\n {sections.map((section) => (\n \n ))}\n
\n );\n};\n\nexport default AllTasks;\n\nconst useStyles = makeStyles((theme) => ({\n page: {\n paddingTop: 20,\n paddingBottom: 100,\n },\n paper: {\n padding: theme.spacing(2),\n },\n date: {\n width: 100,\n },\n markdown: {\n minHeight: \"100vh\",\n },\n bottomActions: {\n marginTop: 100,\n padding: theme.spacing(2),\n },\n}));\n","import {\n Notice,\n push as pushRedux,\n} from \"../../scenes/Notifications/Notifications.state\";\nimport store from \"../../store\";\n\nexport type Message = {\n message: string;\n type: Notice[\"type\"];\n};\n\nexport const push = ({\n message,\n type = \"info\",\n}: {\n message: string;\n type?: Notice[\"type\"];\n}) => {\n if (process.env.NODE_ENV === \"development\") {\n console.log(`${type}::: ${message}`);\n }\n store.dispatch(pushRedux({ notice: { message, type } }));\n};\n\nexport const pushError = ({\n error,\n message,\n}: {\n message: string;\n error: Error;\n}) => {\n push({ message: `${message}: ${error.message}`, type: \"error\" });\n};\n","import * as LightningFS from \"@isomorphic-git/lightning-fs\";\nimport AsyncLock from \"async-lock\";\nimport * as git from \"isomorphic-git\";\nimport http from \"isomorphic-git/http/web\";\nimport pDebounce from \"p-debounce\";\nimport pLimit from \"p-limit\";\nimport * as path from \"path\";\nimport { push, pushError } from \"../notifications/notifications.service\";\n\nconst DIR = \"/domd\";\nconst FILE = \"do.md\";\nconst FILEPATH = path.join(DIR, FILE);\n\nconst AUTH_STORAGE_KEY = \"__auth\";\nconst NAME_KEY = \"name\";\nconst EMAIL_KEY = \"email\";\nconst REPO_KEY = \"repo\";\nconst WIPE_ON_START_KEY = \"__wipeOnStart\";\n\nconst shouldWipe = window.localStorage.getItem(WIPE_ON_START_KEY) === \"true\";\nif (shouldWipe) {\n window.localStorage.removeItem(WIPE_ON_START_KEY);\n}\n\nconst fs = new LightningFS(\"domd\", { wipe: shouldWipe });\n\nif (process.env.NODE_ENV === \"development\") {\n (globalThis as any).fs = fs;\n (globalThis as any).git = git;\n}\n\nexport const wipe = () => {\n window.localStorage.setItem(WIPE_ON_START_KEY, \"true\");\n window.location.reload();\n};\n\nexport const reset = () => {\n if (!window.confirm(\"Are you sure? There is no undo. #hobOXR\")) {\n return;\n }\n if (\n !window.confirm(\"Are you REALLY sure? There REALLY is no undo. #5xnqEH\")\n ) {\n return;\n }\n window.localStorage.clear();\n wipe();\n};\n\nexport const getAuth = ():\n | { username: string; password: string }\n | undefined => {\n const authJson = localStorage.getItem(AUTH_STORAGE_KEY) || undefined;\n if (typeof authJson === \"undefined\") {\n return;\n }\n return JSON.parse(authJson);\n};\n\nexport const saveAuth = (auth: { username: string; password: string }) => {\n localStorage.setItem(AUTH_STORAGE_KEY, JSON.stringify(auth));\n};\n\nconst onAuth = () => {\n const auth = getAuth();\n if (typeof auth !== \"undefined\") {\n return auth;\n }\n\n if (window.confirm(\"Password required. Provide now?\")) {\n const username = window.prompt(\"Username\") || \"\";\n const password = window.prompt(\"Password\") || \"\";\n\n if (username.length > 0 && password.length > 0) {\n const auth = { username, password };\n saveAuth(auth);\n return auth;\n }\n return { cancel: true };\n }\n};\n\nexport const addBaseParams = (\n opts: T\n): T & { fs: typeof fs; http: typeof http; dir: string } => {\n return {\n ...opts,\n fs,\n http,\n dir: DIR,\n author: {\n name: localStorage.getItem(NAME_KEY) || \"\",\n email: localStorage.getItem(EMAIL_KEY) || \"\",\n },\n onAuth,\n };\n};\n\nexport const ensureDir = async (dir: string) => {\n try {\n await fs.promises.stat(dir);\n } catch (e) {\n if (e.code === \"ENOENT\" || e.code === \"ENOTDIR\") {\n try {\n await fs.promises.mkdir(DIR);\n } catch (error) {\n pushError({ message: \"Error creating directory. #aeXYXA\", error });\n throw error;\n }\n } else {\n pushError({\n message: \"Error checking directory exists. #aGmoMT\",\n error: e,\n });\n throw e;\n }\n }\n};\n\nexport const startup = async () => {\n const name = localStorage.getItem(NAME_KEY) || \"\";\n const email = localStorage.getItem(EMAIL_KEY) || \"\";\n const repo = localStorage.getItem(REPO_KEY) || \"\";\n if (name.length === 0 || email.length === 0 || repo.length === 0) {\n const name = window.prompt(\"Set your name for Git commits #8Q2DAI\") || \"\";\n const email = window.prompt(\"Set your email for Git commits #5hOmjM\") || \"\";\n const repo = window.prompt(\"Set your Git Repo #vr2VCA\", \"\") || \"\";\n if (name.length === 0 || email.length === 0 || repo.length === 0) {\n throw new Error(\"Invalid. Reload. #t7aV6R\");\n }\n window.localStorage.setItem(NAME_KEY, name);\n window.localStorage.setItem(EMAIL_KEY, email);\n window.localStorage.setItem(REPO_KEY, repo);\n }\n\n if (false && process.env.NODE_ENV === \"development\") {\n push({ message: \"Skipping git fetch #FI3hkA\", type: \"info\" });\n return;\n }\n\n push({ message: \"Starting git fetch #l16Pys\", type: \"info\" });\n\n await ensureDir(DIR);\n\n // await git.setConfig(\n // addBaseParams({\n // path: \"user.name\",\n // value: \"DoMd Browser\"\n // })\n // );\n // await git.setConfig(\n // addBaseParams({\n // path: \"user.email\",\n // value: \"dummy@domain.tld\"\n // })\n // );\n\n try {\n await git.clone(\n addBaseParams({\n url: localStorage.getItem(REPO_KEY) || \"\",\n ref: \"master\",\n singleBranch: false,\n })\n );\n } catch (error) {\n // Clones might fail if it has already succeeded, so these errors can be\n // swallowed. Surface them to the user just because...\n pushError({\n message: `Git clone error. #SWAnZr`,\n error,\n });\n }\n\n try {\n await git.pull(\n addBaseParams({\n ref: \"master\",\n })\n );\n } catch (error) {\n let mergeConflictFoundAndPushed = false;\n\n if (error instanceof git.Errors.MergeNotSupportedError) {\n push({\n message: \"Caught a merge conflict error while pulling. #Ivv0MR\",\n type: \"error\",\n });\n\n // If we got a merge conflict, we push our local master to a different\n // remote branch. Unfortunately the user will need to resolve this\n // themselves manually.\n try {\n await git.push(\n addBaseParams({\n remoteRef: \"pull-merge-error\",\n })\n );\n\n mergeConflictFoundAndPushed = true;\n\n push({\n message:\n \"There was a merge conflict error. You need to manually merge the pull-merge-error branch into your upstream master and reload.\",\n type: \"warning\",\n });\n } catch (error) {\n pushError({\n message: \"Error during merge conflict push. #fkIt0c\",\n error,\n });\n throw error;\n }\n } else {\n pushError({\n message: \"Git pull error. #62MLop\",\n error,\n });\n }\n\n if (mergeConflictFoundAndPushed) {\n throw new Error(\"MergeConflict\");\n }\n\n // Rethrow so that this process is signalled failed\n throw error;\n }\n\n push({ message: \"Finished git fetch #0zDbhW\", type: \"success\" });\n};\n\nexport const getMarkdown = async (filepath: string = FILEPATH) => {\n try {\n await fs.promises.stat(filepath);\n } catch (error) {\n pushError({ message: \"Error reading file. #5eY1Tt\", error });\n throw error;\n }\n\n return fs.promises.readFile(filepath, { encoding: \"utf8\" });\n};\n\nenum SetMarkdownResult {\n nochange = \"nochange\",\n committed = \"committed\",\n error = \"error\",\n}\n\nexport const _setMarkdown = async ({\n markdown,\n filepath = FILEPATH,\n commitMessage = \"do.md: Adding an update from the web\",\n}: {\n markdown: string;\n filepath?: string;\n commitMessage?: string;\n}): Promise<\n | { result: SetMarkdownResult.error | SetMarkdownResult.nochange }\n | { result: SetMarkdownResult.committed; newCommitHash: string }\n> => {\n try {\n await fs.promises.writeFile(filepath, markdown, { encoding: \"utf8\" });\n } catch (error) {\n pushError({ message: \"Error writing file. #hdHKDu\", error });\n throw error;\n }\n\n try {\n const status = await git.status(\n addBaseParams({\n filepath: FILE,\n })\n );\n\n if (status === \"unmodified\") {\n // push({ message: \"No changes to commit. #rA9DxX\", type: \"info\" });\n return { result: SetMarkdownResult.nochange };\n }\n\n push({ message: \"Starting save to Git #YpHeKm\", type: \"info\" });\n\n await git.add(\n addBaseParams({\n filepath: FILE,\n })\n );\n\n const newCommitHash = await git.commit(\n addBaseParams({\n message: commitMessage,\n })\n );\n\n return { result: SetMarkdownResult.committed, newCommitHash };\n } catch (error) {\n debugger;\n return { result: SetMarkdownResult.error };\n }\n};\n\nconst SetMarkdownLock = new AsyncLock();\nconst SetMarkdownLockKey = \"setMarkdown\" as const;\n\nexport const setMarkdown = async ({\n markdown,\n filepath = FILEPATH,\n commitMessage = \"do.md: Adding an update from the web\",\n}: {\n markdown: string;\n filepath?: string;\n commitMessage?: string;\n}): Promise<\n | { result: SetMarkdownResult.error | SetMarkdownResult.nochange }\n | { result: SetMarkdownResult.committed; newCommitHash: string }\n> => {\n return SetMarkdownLock.acquire(SetMarkdownLockKey, () =>\n _setMarkdown({ markdown, filepath, commitMessage })\n );\n};\n\nexport const pushToRemote = async () => {\n push({ message: \"Starting git push #Ts0MNc\", type: \"info\" });\n\n await git.push(addBaseParams({}));\n\n push({\n message: \"Successfully saved and pushed #AIp4wO\",\n type: \"success\",\n });\n\n return true;\n};\n\nconst limitOne = pLimit(1);\n\nexport const debouncedPush = pDebounce(() => limitOne(pushToRemote), 1e3);\n\nexport const getLatestCommitHash = async () => {\n const log = await git.log(\n addBaseParams({\n depth: 1,\n })\n );\n\n if (log.length === 0) {\n push({\n message: \"There is nothing in the git log. #s80vHL\",\n type: \"warning\",\n });\n return \"\";\n }\n\n return log[0].oid;\n};\n","import {\n AppBar,\n Badge,\n Button,\n createStyles,\n IconButton,\n makeStyles,\n Theme,\n Toolbar,\n Typography,\n} from \"@material-ui/core\";\nimport MenuIcon from \"@material-ui/icons/Menu\";\nimport NotificationsIcon from \"@material-ui/icons/Notifications\";\nimport AddIcon from \"@material-ui/icons/Add\";\nimport { createId, newTask } from \"do.md\";\nimport mousetrap from \"mousetrap\";\nimport React, { useCallback, useEffect } from \"react\";\nimport { useDispatch, useSelector } from \"react-redux\";\nimport { Link } from \"react-router-dom\";\nimport { AppDispatch, AppState } from \"../../store\";\nimport { toggleIsOpen } from \"../LeftMenu/LeftMenu.state\";\nimport Log from \"../Log/Log.scene\";\nimport { history } from \"../Routes/Routes.scene\";\nimport TaskForm from \"../TaskForm/TaskForm.scene\";\nimport { openNew } from \"../TaskForm/TaskForm.state\";\n\nconst STALE_WARNING_TIMEOUT_MS = 10 * 1e3 * 100; // 10 minutes\n\nconst assertNever = (no: never): never => {\n throw new Error(\"assertNever #pcQASS\");\n};\n\nenum KEY {\n c = \"c\",\n n = \"n\",\n question = \"?\",\n goAll = \"g a\",\n goReview = \"g r\",\n goDo = \"g d\",\n goPlan = \"g p\",\n}\nconst keys = Object.values(KEY);\n\nconst Bar: React.FC = (props) => {\n const classes = useStyles();\n const [logOpen, setLogOpen] = React.useState(false);\n\n const dispatch: AppDispatch = useDispatch();\n\n const handler = useCallback(\n (key: KEY) => {\n switch (key) {\n case KEY.question: {\n setLogOpen(true);\n break;\n }\n case KEY.c: {\n dispatch(openNew());\n break;\n }\n case KEY.n: {\n const text = globalThis.prompt(\"Enter task text\");\n if (typeof text === \"string\" && text.length > 0) {\n const id = createId();\n dispatch(\n newTask({\n task: {\n contentMarkdown: text,\n finished: false,\n isSequential: false,\n isTask: true,\n data: { id },\n sectionId: \"top\",\n parentId: \"\",\n id,\n },\n insertAtIndex: 0,\n })\n );\n }\n break;\n }\n case KEY.goAll: {\n history.push(\"/tasks\");\n break;\n }\n case KEY.goReview: {\n history.push(\"/review\");\n break;\n }\n case KEY.goDo: {\n history.push(\"/do\");\n break;\n }\n case KEY.goPlan: {\n history.push(\"/plan\");\n break;\n }\n default: {\n assertNever(key);\n }\n }\n },\n [dispatch]\n );\n\n useEffect(() => {\n mousetrap.bind(keys, (event, key) => {\n handler(key as KEY);\n });\n return () => {\n mousetrap.unbind(keys);\n };\n }, [handler]);\n\n useEffect(() => {\n const timeoutID = globalThis.setTimeout(() => {\n const result = globalThis.confirm(\n \"This window has been open for 10 minutes. Refresh?\"\n );\n if (result) {\n globalThis.location.reload();\n }\n }, STALE_WARNING_TIMEOUT_MS);\n\n return () => {\n globalThis.clearTimeout(timeoutID);\n };\n }, []);\n\n const nowCount = useSelector((state: AppState) => state.now.taskIds.length);\n const aheadCount = useSelector(\n (state: AppState) => state.storage.commitsAhead\n );\n\n return (\n
\n \n \n dispatch(toggleIsOpen())}>\n \n \n \n Do.md\n \n \n \n \n {\n handler(KEY.c);\n }}\n >\n \n \n {\n setLogOpen(true);\n }}\n >\n \n \n \n \n \n \n {\n setLogOpen(false);\n }}\n />\n \n
\n );\n};\n\nconst useStyles = makeStyles((theme: Theme) =>\n createStyles({\n root: {\n flexGrow: 1,\n paddingBottom: 64,\n },\n title: {\n flexGrow: 1,\n },\n hideOnSmall: {\n [theme.breakpoints.down(\"sm\")]: {\n display: \"none\",\n },\n },\n })\n);\n\nexport default Bar;\n","import {\n Button,\n makeStyles,\n Modal,\n Paper,\n Typography,\n} from \"@material-ui/core\";\nimport { red } from \"@material-ui/core/colors\";\nimport React, { useCallback, useState } from \"react\";\nimport { useSelector } from \"react-redux\";\nimport {\n getMarkdown,\n reset,\n wipe,\n} from \"../../services/storage/storage.service\";\nimport { AppState } from \"../../store\";\nimport { selectAll } from \"../Notifications/Notifications.state\";\n\ntype Props = {\n open: boolean;\n onClose: () => void;\n};\n\nconst formatTimestamp = (time: number): string => {\n const d = new Date(time * 1e3);\n return `${d.getHours()}:${d.getMinutes()}`;\n};\n\nconst buildTimeString = () => {\n const timestampString = process.env.REACT_APP_BUILD_TIME;\n if (typeof timestampString === \"undefined\") {\n return \"now\";\n }\n const timeMs = parseInt(timestampString) * 1e3;\n var d = new Date(timeMs);\n return d.toString();\n};\n\nconst Log = (props: Props) => {\n const { open, onClose } = props;\n const classes = useStyles();\n const messages = useSelector(selectAll);\n const lastCommitHash = useSelector(\n (state: AppState) => state.storage.lastCommitHash\n );\n const buildTime = useCallback(buildTimeString, []);\n const [fullMarkdown, setFullMarkdown] = useState(\"\");\n\n return (\n {\n onClose();\n }}\n >\n \n Shortcuts\n \n GLOBAL: n - new task; c - new task form;\n
\n NAV: ga - all task; gr - review; gd - do; gp - plan\n
\n PLAN: j - done; k - now; l - tomorrow; ; - later\n
\n REVIEW: shift+a - show all\n
\n Stats\n
    \n
  • Current local commit: {lastCommitHash.substr(0, 6)}
  • \n
\n\n Log\n
    \n {messages.map(({ notice: { message, type }, time }, i) => (\n \n {formatTimestamp(time)} - {type}: {message}\n \n ))}\n
\n Markdown\n \n {\n const md = await getMarkdown();\n setFullMarkdown(md);\n }}\n >\n Load do.md\n \n \n \n {fullMarkdown === \"\" ? null :