initial commit

main
Yorick van Pelt 2023-04-18 18:14:53 +02:00
commit 0554eaa05f
Signed by: yorick
GPG Key ID: A36E70F9DC014A15
10 changed files with 1477 additions and 0 deletions

6
.gitignore vendored Normal file
View File

@ -0,0 +1,6 @@
/toggl-api
/credentials
/lib/
/marvin/
/marvin-*/
/node_modules

20
package.json Normal file
View File

@ -0,0 +1,20 @@
{
"name": "timesync",
"version": "1.0.0",
"main": "index.js",
"license": "MIT",
"type": "module",
"dependencies": {
"@tsconfig/node18": "^1.0.2",
"@types/luxon": "^3.3.0",
"@types/node": "^18.15.11",
"@types/pouchdb": "^6.4.0",
"@types/pouchdb-find": "^7.3.0",
"luxon": "^3.3.0",
"node-fetch": "2",
"pouchdb": "^8.0.1",
"pouchdb-find": "^8.0.1",
"typescript": "^5.0.4",
"xdg-basedir": "^5.1.0"
}
}

208
src/Marvin.ts Normal file
View File

@ -0,0 +1,208 @@
import { readFileSync } from "node:fs"
import { DateTime, Interval, Duration } from "luxon"
import { inspect } from "node:util"
import { DurationUtil } from "./util.js"
import PouchDB from "pouchdb"
import pouchdb_find from "pouchdb-find"
PouchDB.plugin(pouchdb_find)
import type * as Marvin_types from "./marvin-types.js"
import type InspectOptions from "node:util"
interface Credentials {
apiToken: string
fullAccessToken: string
syncServer: string
syncDatabase: string
syncUser: string
syncPassword: string
}
export class Marvin {
credentials: Credentials
remote: PouchDB.Database
db: PouchDB.Database
synced: Promise<PouchDB.Find.CreateIndexResponse<{}>>
root: Taskset
constructor(credentials: Credentials=Marvin.parseCredentials(), dbName = "marvin") {
const c = credentials
let u = new URL(c.syncServer)
Object.assign(u, {
username: c.syncUser,
password: c.syncPassword,
pathname: "/" + c.syncDatabase
})
this.credentials = credentials
this.remote = new PouchDB(u.href)
this.db = new PouchDB(dbName)
this.synced = new Promise((resolve, reject) => {
console.log("syncing..")
this.remote.replicate.to(this.db)
.on('complete', resolve)
.on('error', reject)
}).then(() => {
return this.db.createIndex({
index: {
fields: ["db", "parentId"]
}
})
})
this.synced.then(() => {
console.log("sync complete!")
})
this.root = new Taskset(this, 'root', null)
}
async api(url: string, data: any=null) {
const response = await fetch("https://serv.amazingmarvin.com/api/" + url, {
method: data ? "POST" : "GET",
body: data ? JSON.stringify(data) : null,
headers: {
"X-API-Token": this.credentials.apiToken,
'Content-Type': 'application/json',
"Accept": "application/json"
// todo: full access token
}
})
if (response.ok) {
if (response.headers.get('content-type')?.startsWith("application/json")) {
return response.json()
}
return response.text()
} else {
throw [response.status, await response.text()]
}
}
async test() {
// todo: throw?
return (await this.api("test", {})) == "OK"
}
trackedItem() {
// todo: wrap in Task?
return this.api("trackedItem")
}
todayItems() {
return this.api("todayItems")
}
dueItems() {
return this.api("dueItems")
}
categories() {
return this.api("categories")
}
labels() {
return this.api("labels")
}
me() {
return this.api("me")
}
trackInfo(taskIds: string[]) {
return this.api("tracks", { taskIds })
}
static parseCredentials(fileContents = readFileSync("credentials", "utf8")): Credentials {
const res: Record<string, string> = {}
for(const line of fileContents.split('\n')) {
if (line.startsWith('# ') || !line) continue
const [k,v] = line.split(': ', 2)
res[k] = v
}
return res as unknown as Credentials
}
}
type Tuple<T, N extends number> = N extends N ? number extends N ? T[] : _TupleOf<T, N, []> : never;
type _TupleOf<T, N extends number, R extends unknown[]> = R['length'] extends N ? R : _TupleOf<T, N, [T, ...R]>;
function chunk<A, N extends number>(xs: A[], n: N): Array<Tuple<A, N>> {
if ((xs.length % n) != 0) console.error("wrong chunk length")
const res = new Array(xs.length / n)
for(let i = 0; i < xs.length; i += n) {
res[i/n] = xs.slice(i, i+n)
}
return res
}
function toInterval([start, end]: [number, number]): Interval {
return Interval.fromDateTimes(DateTime.fromMillis(start), DateTime.fromMillis(end))
}
class Task {
_task: Marvin_types.Task
title: string
day: string
dueDate: string | null
done: boolean
doneAt: DateTime | null
createdAt: DateTime
times: Interval[]
constructor(task: Marvin_types.Task) {
this._task = task
this.title = task.title
this.day = task.day
this.dueDate = task.dueDate
this.done = !!task.done
this.doneAt = task.doneAt ? DateTime.fromMillis(task.doneAt) : null
this.createdAt = DateTime.fromMillis(task.createdAt)
this.times = task.times ? chunk<number, 2>(task.times, 2).map(toInterval) : []
}
timesInInterval(interval: Interval): Interval[] {
return this.times.map(time => time.intersection(interval)).filter(x => x !== null) as Interval[]
}
timeSpentOn(interval: Interval): Duration {
return DurationUtil.sum(this.timesInInterval(interval).map(x => x.toDuration()))
}
[inspect.custom](_depth: number, _opts: InspectOptions.InspectOptions) {
return {
title: this.title,
day: this.day,
dueDate: this.dueDate,
done: this.done,
doneAt: this.doneAt ? this.doneAt.toISO() : null,
createdAt: this.createdAt.toISO(),
times: this.times
}
}
}
class Taskset {
marv: Marvin
_id: string
constructor(marv: Marvin, _id: string, rest: Marvin_types.DBEntry | null) {
this.marv = marv
this._id = _id
Object.assign(this, {marv, _id}, rest)
}
async category(n: string): Promise<Taskset> {
await this.marv.synced
const d = await this.marv.db.find({
selector: {
db: "Categories",
title: n,
parentId: this._id
}
})
if (d && d.docs) return new Taskset(this.marv, d.docs[0]._id, d.docs[0] as unknown as Marvin_types.DBEntry)
throw new Error("category not found")
}
async tasks(): Promise<Task[]> {
await this.marv.synced
const d = await this.marv.db.find({
selector: {
db: "Tasks",
parentId: this._id
},
})
if (d) {
return d.docs.map(x => new Task(x as unknown as Marvin_types.Task))
}
return []
}
async tasksOverlapping(interval: Interval): Promise<Task[]> {
const tasks = await this.tasks()
return tasks.filter(task =>
task.times.some(x => x.overlaps(interval))
)
}
}

100
src/Toggl.ts Normal file
View File

@ -0,0 +1,100 @@
import { readFileSync } from "node:fs"
import { Buffer } from "node:buffer"
import type * as Toggl_types from "./toggl-types.js"
function base64_encode(str: string): string {
return Buffer.from(str).toString("base64")
}
export namespace API {
export namespace Request.GET {
export interface Me {
with_related_data?: boolean
}
export interface Workspaces {
since?: number
}
export interface TimeEntries {
since?: number;
before?: string;
start_date?: string;
end_date?: string;
};
}
export namespace Request.POST {
export interface TimeEntry extends Toggl_types.TimeEntryBase {
created_with: string;
start_date?: string;
tag_action?: 'add' | 'delete';
}
}
export namespace Response {
export type Workspaces = Toggl_types.Workspace[]
}
}
import Req = API.Request
import Res = API.Response
export class Toggl {
api_token: string
constructor(api_token=readFileSync("toggl-api", "utf8").trim()) {
this.api_token = api_token
}
async parseResponse(response: Awaited<ReturnType<typeof fetch>>) {
if (response.ok) {
if (response.headers.get('content-type')?.startsWith("application/json")) {
return response.json()
}
return response.text()
} else {
throw [response.status, await response.text()]
}
}
get(url: string, query: any={}) {
return fetch(`https://api.track.toggl.com/api/v9/${url}?${new URLSearchParams(query)}`, {
method: "GET",
headers: {
"Content-Type": "application/json",
"Authorization": `Basic ${base64_encode(this.api_token + ":api_token")}`
},
}).then(resp => this.parseResponse(resp))
}
async post(url: string, body: any={}) {
return fetch(`https://api.track.toggl.com/api/v9/${url}`, {
method: "POST",
body: JSON.stringify(body),
headers: {
"Content-Type": "application/json",
"Authorization": `Basic ${base64_encode(this.api_token + ":api_token")}`
},
}).then(resp => this.parseResponse(resp))
}
async me(query:API.Request.GET.Me={}): Promise<Toggl_types.Me> {
return this.get("me", query)
}
async workspaces(query: Req.GET.Workspaces={}): Promise<Workspace[]> {
const ws = (await this.get("me/workspaces", query)) as Res.Workspaces
return ws.map(x => new Workspace(this, x))
}
async time_entries(query: Req.GET.TimeEntries={}): Promise<Toggl_types.TimeEntry[]> {
return this.get("me/time_entries", query)
}
async post_time_entry(workspace_id: number, query: Omit<Req.POST.TimeEntry, "workspace_id">): Promise<Toggl_types.TimeEntry> {
const q2: Req.POST.TimeEntry = Object.assign({ workspace_id }, query)
return this.post("workspaces/" + workspace_id + "/time_entries", q2)
}
}
export class Workspace {
toggl: Toggl
workspace: Toggl_types.Workspace
constructor(t: Toggl, w: Toggl_types.Workspace) {
this.toggl = t
this.workspace = w
}
async post_time_entry(query: Omit<Req.POST.TimeEntry, "workspace_id">): Promise<Toggl_types.TimeEntry> {
const workspace_id = this.workspace.id
const q2: Req.POST.TimeEntry = Object.assign({ workspace_id }, query)
return this.toggl.post("workspaces/" + workspace_id + "/time_entries", q2)
}
}

118
src/index.ts Normal file
View File

@ -0,0 +1,118 @@
import { Toggl, Workspace } from "./Toggl.js"
import { DateTime, Interval, Settings as LuxonSettings } from "luxon"
import { Marvin } from "./Marvin.js"
import { xdgData, xdgConfig } from 'xdg-basedir';
import { mkdir, readFile } from 'node:fs/promises'
import { dirname } from 'node:path'
LuxonSettings.throwOnInvalid = true;
declare module 'luxon' {
interface TSSettings {
throwOnInvalid: true;
}
}
type Configuration = {
toggl: string,
marvin: string,
marvinDB: string
};
async function inferConfig(): Promise<Configuration> {
let files: Configuration
if (!xdgData || !xdgConfig) {
console.warn("xdg_data or xdg_config dir not found, defaulting to cwd")
files = {
toggl: process.cwd() + "toggl-api",
marvin: process.cwd() + "marvin-credentials",
marvinDB: process.cwd() + "db/"
}
} else {
files = {
toggl: xdgConfig + "/marvin-timesync/toggl-api",
marvin: xdgConfig + "/marvin-timesync/marvin-credentials",
marvinDB: xdgData + "/marvin-timesync/db/"
}
}
await Promise.all([
mkdir(dirname(files.toggl), { recursive: true} ),
mkdir(dirname(files.marvin), { recursive: true} ),
mkdir(files.marvinDB, { recursive: true } )
])
return {
toggl: (await readFile(files.toggl, 'utf8')).trim(),
marvin: (await readFile(files.marvin, 'utf8')).trim(),
marvinDB: files.marvinDB
}
}
function dateToInterval(d: string = "today"): Interval {
const now = DateTime.local()
let retDate
if (d == "today") {
retDate = now.startOf('day')
} else if (d == "yesterday") {
retDate = now.startOf('day').minus({ days: 1 })
} else {
retDate = DateTime.fromISO(d)
}
return Interval.fromDateTimes(retDate.startOf('day'), retDate.endOf('day'))
}
function toRFC3339(d: DateTime): string {
return d.set({ millisecond: 0 }).toUTC().toISO()
}
interface TogglTE {
description: string,
start: string,
stop: string
}
async function apply_tasks_for_range(workspace: Workspace, interval: Interval, wanted_tes: TogglTE[]) {
const existing_tes = await workspace.toggl.time_entries({
start_date: toRFC3339(interval.start),
end_date: toRFC3339(interval.end),
})
const existing_by_start: Map<number, typeof existing_tes[0]> = new Map()
for (const existing of existing_tes)
existing_by_start.set(DateTime.fromISO(existing.start).toMillis(), existing)
for (const wanted of wanted_tes) {
const matched = existing_by_start.get(DateTime.fromISO(wanted.start).toMillis())
if (matched) {
if (matched.description === wanted.description) {
console.log("matched", wanted.description)
continue
} else {
console.log("unmatched!", wanted, matched)
continue
}
}
console.log("posting", wanted)
await workspace.post_time_entry(Object.assign({ created_with: "marvin-timesync" }, wanted))
}
}
void (async function () {
const config = await inferConfig()
const interval = dateToInterval(process.argv.length > 2 ? process.argv[2] : 'today')
const marvin = new Marvin(Marvin.parseCredentials(config.marvin), config.marvinDB + "marvin")
const tasks = await (marvin.root.category('Datakami').then(datakami => datakami.tasksOverlapping(interval)))
const toggl = new Toggl(config.toggl)
const workspaces = await toggl.workspaces()
if (workspaces.length !== 1) throw new Error("not sure which workspace to use")
const res_tasks: TogglTE[] = []
for (const task of tasks)
for (const task_interval of task.timesInInterval(interval))
res_tasks.push({
description: `${task.title}`,
start: toRFC3339(task_interval.start),
stop: toRFC3339(task_interval.end)
})
await apply_tasks_for_range(workspaces[0], interval, res_tasks)
})()

121
src/marvin-types.ts Normal file
View File

@ -0,0 +1,121 @@
export interface Task {
_id: string;
createdAt: number;
updatedAt: number;
workedOnAt: number;
title: string;
parentId: string;
dueDate: string | null;
startDate: string | null;
endDate: string | null;
day: string;
firstScheduled: string;
plannedWeek: string;
plannedMonth: string;
sprintId: string | null;
rank: number;
masterRank: number;
done: boolean;
completedAt: number | null;
duration: number;
times: number[];
firstTracked: number;
doneAt: number;
isReward: boolean;
isStarred: boolean;
isFrogged: boolean;
isPinned: boolean;
pinId: string;
recurring: boolean;
recurringTaskId: string;
echo: boolean;
echoId: string;
link: string;
subtasks: { [id: string]: Subtask };
colorBar: string | null;
labelIds: string[];
timeEstimate: number;
note: string;
email: string;
dailySection: string;
bonusSection: string;
customSection: string;
timeBlockSection: string;
dependsOn: { [id: string]: boolean };
backburner: boolean;
reviewDate: string;
itemSnoozeTime: number;
permaSnoozeTime: string;
calId: string;
calURL: string;
etag: string;
calData: string;
generatedAt: number;
echoedAt: number;
deletedAt: number;
restoredAt: number;
onboard: boolean;
imported: boolean;
marvinPoints: number;
mpNotes: string[];
rewardPoints: number;
rewardId: number;
taskTime: string;
reminderOffset: number;
reminderTime: string;
snooze: number;
autoSnooze: number;
g_in_GOALID: boolean;
g_sec_GOALID: string;
g_rank_GOALID: number;
remindAt: string;
reminder: {
time: string;
diff: number;
};
}
export interface Subtask {
_id: string;
title: string;
done: boolean;
rank: number;
timeEstimate: number;
}
interface Category {
_id: string;
title: string; // The category/project's title, like "Work".
type: "project" | "category";
updatedAt: number; // Date.now() when updated. This includes adding a task.
workedOnAt: number; // Date.now() when last worked on. That means completing a task within it.
parentId: string; // ID of parent project or category, or "unassigned" or "root".
rank: number; // Sort rank within parent.
dayRank: number; // Sort rank within day.
day: string | null | undefined; // Schedule date or null/undefined. Only projects can be scheduled. This might also be "unassigned", so check for both. See https://github.com/amazingmarvin/MarvinAPI/issues/11
firstScheduled: string | "unassigned"; // Which day the project was first assigned to, formatted as "YYYY-MM-DD" or "unassigned" if it was never scheduled yet. Used to calculate how many !!! in procrastination strategy.
dueDate: string; // Date when project is due, formatted as "YYYY-MM-DD".
labelIds: string[]; // The IDs of labels assigned to the Project. Any labelId that doesn't correspond to an existing label in strategySettings.labels should be ignored.
timeEstimate: number; // How long the user thinks the project will take, in ms. When shown in Marvin this is added to the child tasks' time estimates.
startDate: string; // When this task can be started, formatted as "YYYY-MM-DD".
endDate: string; // When this task should be completed (soft deadline), formatted as "YYYY-MM-DD".
plannedWeek: string; // Which week the task is planned for. Date of the Monday of the week (Mon-Sun) "YYYY-MM-DD"
plannedMonth: string; // Which month the task is planned for. "YYYY-MM"
sprintId: string; // The project's sprint. Not used yet.
done: boolean; // Whether the project has been marked as done.
doneDate: string | undefined; // If done, then this was the date the project/subproject (previously called milestone) was finished.
priority: "low" | "mid" | "high"; // Project only: one of "low", "mid", or "high". Used when priorities strategy is enabled. Why not isStarred like tasks? These used to be different strategies.
color: string; // Color chosen by clicking icon in master list "#222222" (rrggbb).
icon: string; // Icon chosen by clicking icon in master list.
note: string; // note for "notes" strategy.
recurring: boolean; // True if it's a recurring project.
recurringTaskId: string; // ID of RecurringTask creator.
echo: boolean; // True if created by RecurringTask with type="echo".
isFrogged: boolean; // True if this project has been frogged for eatThatFrog. 1=normal, 2=baby, 3=monster.
reviewDate: string; // Date when user wants to review a project.
marvinPoints: number; // How many kudos you got for this project. Always 500.
mpNotes: string[]; // Notes on how Marvin awarded you kudos when you completed the project. Always ["PROJECT"].
}
export type DBEntry = Task | Category

187
src/toggl-types.ts Normal file
View File

@ -0,0 +1,187 @@
namespace models {
export type CardDetails = unknown;
export type ContactDetail = unknown;
export type PaymentDetail = unknown;
export type Period = unknown;
export type RecurringPeriod = unknown;
export type RecurringProjectParameters = unknown;
}
export type Subscription = {
auto_renew: boolean;
card_details: models.CardDetails;
company_id: number;
contact_detail: models.ContactDetail;
created_at: string;
currency: string;
customer_id: number;
deleted_at: string;
last_pricing_plan_id: number;
organization_id: number;
payment_details: models.PaymentDetail;
pricing_plan_id: number;
renewal_at: string;
subscription_id: number;
subscription_period: models.Period;
workspace_id: number;
};
export type TimeEntryConstraints = {
description_present: boolean;
project_present: boolean;
tag_present: boolean;
task_present: boolean;
time_entry_constraints_enabled: boolean;
};
export type CsvUpload = {
at: string;
log_id: number;
};
export type Workspace = {
admin: boolean;
api_token: string;
at: string;
business_ws: boolean;
csv_upload: CsvUpload;
default_currency: string;
default_hourly_rate: number;
ical_enabled: boolean;
ical_url: string;
id: number;
logo_url: string;
name: string;
only_admins_may_create_projects: boolean;
only_admins_may_create_tags: boolean;
only_admins_see_billable_rates: boolean;
only_admins_see_team_dashboard: boolean;
organization_id: number;
premium: boolean;
profile: number;
projects_billable_by_default: boolean;
rate_last_updated: string;
reports_collapse: boolean;
rounding: number;
rounding_minutes: number;
server_deleted_at: string;
subscription: Subscription;
suspended_at: string;
te_constraints: TimeEntryConstraints;
};
type Clients = {
archived: boolean;
at: string;
id: number;
name: string;
server_deleted_at: string | null;
wid: number;
};
type Projects = {
active: boolean;
actual_hours: number | null;
at: string;
auto_estimates: boolean | null;
billable: boolean | null;
cid: number;
client_id: number | null;
color: string;
created_at: string;
currency: string | null;
current_period: models.RecurringPeriod;
end_date: string;
estimated_hours: number | null;
first_time_entry: string;
fixed_fee: number;
id: number;
is_private: boolean;
name: string;
rate: number;
rate_last_updated: string | null;
recurring: boolean;
recurring_parameters: models.RecurringProjectParameters[];
server_deleted_at: string | null;
start_date: string;
template: boolean | null;
wid: number;
workspace_id: number;
};
type Tags = {
at: string;
deleted_at: string;
id: number;
name: string;
workspace_id: number;
};
type Tasks = {
active: boolean;
at: string;
estimated_seconds: number | null;
id: number;
name: string;
project_id: number;
recurring: boolean;
server_deleted_at: string | null;
tracked_seconds: number;
user_id: number | null;
workspace_id: number;
};
type Options = {
additionalProperties: object;
};
export interface TimeEntryBase {
billable?: boolean;
description?: string | null;
duration?: number;
duronly?: boolean; // Deprecated
pid?: number; // Legacy field
project_id?: number | null;
start: string;
stop?: string | null;
tag_ids?: number[] | null;
tags?: string[] | null;
task_id?: number | null;
tid?: number; // Legacy field
uid?: number; // Legacy field
user_id?: number;
wid?: number; // Legacy field
workspace_id: number;
}
export interface TimeEntry extends TimeEntryBase {
at: string;
duronly: true; // For GET requests, always true
id: number;
server_deleted_at: string | null;
}
export type Me = {
api_token: string;
at: string;
beginning_of_week: number;
clients: Clients[] | null;
country_id: number;
created_at: string;
default_workspace_id: number;
email: string;
fullname: string;
has_password: boolean;
id: number;
image_url: string;
intercom_hash: string | null;
oauth_providers: string[];
openid_email: string;
openid_enabled: boolean;
options: Options | null;
password_hash: string;
projects: Projects[] | null;
tags: Tags[] | null;
tasks: Tasks[] | null;
time_entries: TimeEntry[] | null;
timezone: string;
updated_at: string;
workspaces: Workspace[];
};

7
src/util.ts Normal file
View File

@ -0,0 +1,7 @@
import { Duration } from "luxon"
export namespace DurationUtil {
export const zero = Duration.fromMillis(0)
export function sum(durs: Duration[]): Duration {
return durs.reduce((p: Duration, c: Duration) => p.plus(c), zero)
}
}

10
tsconfig.json Normal file
View File

@ -0,0 +1,10 @@
{
"extends": "@tsconfig/node18/tsconfig.json",
"compilerOptions": {
"noImplicitAny": true,
"module": "ES2020",
"moduleResolution": "nodenext",
"outDir": "lib/"
},
"includes": ["src/*.ts"],
}

700
yarn.lock Normal file
View File

@ -0,0 +1,700 @@
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
# yarn lockfile v1
"@tsconfig/node18@^1.0.2":
version "1.0.2"
resolved "https://registry.yarnpkg.com/@tsconfig/node18/-/node18-1.0.2.tgz#d0a465fbb5ae50813ad6d91542f71a6d34a5f08c"
integrity sha512-4//KMPpqhtqw4g25Zh27ELuMD+vgcidW4VLozYWtRn8VXJEiRPm7GqrVNFwBiL3rM9/3k0a07X5NpI78DvTpfQ==
"@types/debug@*":
version "4.1.7"
resolved "https://registry.yarnpkg.com/@types/debug/-/debug-4.1.7.tgz#7cc0ea761509124709b8b2d1090d8f6c17aadb82"
integrity sha512-9AonUzyTjXXhEOa0DnqpzZi6VHlqKMswga9EXjpXnnqxwLtdvPPtlO8evrI5D9S6asFRCQ6v+wpiUKbw+vKqyg==
dependencies:
"@types/ms" "*"
"@types/luxon@^3.3.0":
version "3.3.0"
resolved "https://registry.yarnpkg.com/@types/luxon/-/luxon-3.3.0.tgz#a61043a62c0a72696c73a0a305c544c96501e006"
integrity sha512-uKRI5QORDnrGFYgcdAVnHvEIvEZ8noTpP/Bg+HeUzZghwinDlIS87DEenV5r1YoOF9G4x600YsUXLWZ19rmTmg==
"@types/ms@*":
version "0.7.31"
resolved "https://registry.yarnpkg.com/@types/ms/-/ms-0.7.31.tgz#31b7ca6407128a3d2bbc27fe2d21b345397f6197"
integrity sha512-iiUgKzV9AuaEkZqkOLDIvlQiL6ltuZd9tGcW3gwpnX8JbuiuhFlEGmmFXEXkN50Cvq7Os88IY2v0dkDqXYWVgA==
"@types/node@^18.15.11":
version "18.15.11"
resolved "https://registry.yarnpkg.com/@types/node/-/node-18.15.11.tgz#b3b790f09cb1696cffcec605de025b088fa4225f"
integrity sha512-E5Kwq2n4SbMzQOn6wnmBjuK9ouqlURrcZDVfbo9ftDDTFt3nk7ZKK4GMOzoYgnpQJKcxwQw+lGaBvvlMo0qN/Q==
"@types/pouchdb-adapter-cordova-sqlite@*":
version "1.0.1"
resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-cordova-sqlite/-/pouchdb-adapter-cordova-sqlite-1.0.1.tgz#49e5ee6df7cc0c23196fcb340f43a560e74eb1d6"
integrity sha512-nqlXpW1ho3KBg1mUQvZgH2755y3z/rw4UA7ZJCPMRTHofxGMY8izRVw5rHBL4/7P615or0J2udpRYxgkT3D02g==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-adapter-fruitdown@*":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-fruitdown/-/pouchdb-adapter-fruitdown-6.1.3.tgz#9b140ad9645cc56068728acf08ec19ac0046658e"
integrity sha512-Wz1Z1JLOW1hgmFQjqnSkmyyfH7by/iWb4abKn684WMvQfmxx6BxKJpJ4+eulkVPQzzgMMSgU1MpnQOm9FgRkbw==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-adapter-http@*":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-http/-/pouchdb-adapter-http-6.1.3.tgz#6e592d5f48deb6274a21ddac1498dd308096bcf3"
integrity sha512-9Z4TLbF/KJWy/D2sWRPBA+RNU0odQimfdvlDX+EY7rGcd3aVoH8qjD/X0Xcd/0dfBH5pKrNIMFFQgW/TylRCmA==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-adapter-idb@*":
version "6.1.4"
resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-idb/-/pouchdb-adapter-idb-6.1.4.tgz#cb9a18864585d600820cd325f007614c5c3989cd"
integrity sha512-KIAXbkF4uYUz0ZwfNEFLtEkK44mEWopAsD76UhucH92XnJloBysav+TjI4FFfYQyTjoW3S1s6V+Z14CUJZ0F6w==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-adapter-leveldb@*":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-leveldb/-/pouchdb-adapter-leveldb-6.1.3.tgz#17c7e75d75b992050bca15991e97fba575c61bb3"
integrity sha512-ex8NFqQGFwEpFi7AaZ5YofmuemfZNsL3nTFZBUCAKYMBkazQij1pe2ILLStSvJr0XS0qxgXjCEW19T5Wqiiskg==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-adapter-localstorage@*":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-localstorage/-/pouchdb-adapter-localstorage-6.1.3.tgz#0dde02ba6b9d6073a295a20196563942ba9a54bd"
integrity sha512-oor040tye1KKiGLWYtIy7rRT7C2yoyX3Tf6elEJRpjOA7Ja/H8lKc4LaSh9ATbptIcES6MRqZDxtp7ly9hsW3Q==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-adapter-memory@*":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-memory/-/pouchdb-adapter-memory-6.1.3.tgz#9eabdbc890fcf58960ee8b68b8685f837e75c844"
integrity sha512-gVbsIMzDzgZYThFVT4eVNsmuZwVm/4jDxP1sjlgc3qtDIxbtBhGgyNfcskwwz9Zu5Lv1avkDsIWvcxQhnvRlHg==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-adapter-node-websql@*":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-node-websql/-/pouchdb-adapter-node-websql-6.1.3.tgz#aa18bc68af8cf509acd12c400010dcd5fab2243d"
integrity sha512-F/P+os6Jsa7CgHtH64+Z0HfwIcj0hIRB5z8gNhF7L7dxPWoAfkopK5H2gydrP3sQrlGyN4WInF+UJW/Zu1+FKg==
dependencies:
"@types/pouchdb-adapter-websql" "*"
"@types/pouchdb-core" "*"
"@types/pouchdb-adapter-websql@*":
version "6.1.4"
resolved "https://registry.yarnpkg.com/@types/pouchdb-adapter-websql/-/pouchdb-adapter-websql-6.1.4.tgz#359fbe42ccac0ac90b492ddb8c32fafd0aa96d79"
integrity sha512-zMJQCtXC40hBsIDRn0GhmpeGMK0f9l/OGWfLguvczROzxxcOD7REI+e6SEmX7gJKw5JuMvlfuHzkQwjmvSJbtg==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-browser@*":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@types/pouchdb-browser/-/pouchdb-browser-6.1.3.tgz#8f33d6ef58d6817d1f6d36979148a1c7f63244d8"
integrity sha512-EdYowrWxW9SWBMX/rux2eq7dbHi5Zeyzz+FF/IAsgQKnUxgeCO5VO2j4zTzos0SDyJvAQU+EYRc11r7xGn5tvA==
dependencies:
"@types/pouchdb-adapter-http" "*"
"@types/pouchdb-adapter-idb" "*"
"@types/pouchdb-adapter-websql" "*"
"@types/pouchdb-core" "*"
"@types/pouchdb-mapreduce" "*"
"@types/pouchdb-replication" "*"
"@types/pouchdb-core@*":
version "7.0.11"
resolved "https://registry.yarnpkg.com/@types/pouchdb-core/-/pouchdb-core-7.0.11.tgz#8fad7a16889dafab765415430a491eb50a54f564"
integrity sha512-KTKj0Taf8pLTj8eW3qBtCd1Fh+/yhEyVo6/1czTN46MnseobdmnqgXtzaKgHMbuLouh+SHK1vM++aMPaG1qTTA==
dependencies:
"@types/debug" "*"
"@types/pouchdb-find" "*"
"@types/pouchdb-find@*", "@types/pouchdb-find@^7.3.0":
version "7.3.0"
resolved "https://registry.yarnpkg.com/@types/pouchdb-find/-/pouchdb-find-7.3.0.tgz#b917030e9f4bf6e56bf8c3b9fe4b2a25e989009a"
integrity sha512-sFPli5tBjGX9UfXioik1jUzPdcN84eV82n0lmEFuoPepWqkLjQcyri0eOa++HYOaNPyMDhKFBqEALEZivK2dRg==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-http@*":
version "6.1.3"
resolved "https://registry.yarnpkg.com/@types/pouchdb-http/-/pouchdb-http-6.1.3.tgz#09576c0d409da1f8dee34ec5b768415e2472ea52"
integrity sha512-0e9E5SqNOyPl/3FnEIbENssB4FlJsNYuOy131nxrZk36S+y1R/6qO7ZVRypWpGTqBWSuVd7gCsq2UDwO/285+w==
dependencies:
"@types/pouchdb-adapter-http" "*"
"@types/pouchdb-core" "*"
"@types/pouchdb-mapreduce@*":
version "6.1.7"
resolved "https://registry.yarnpkg.com/@types/pouchdb-mapreduce/-/pouchdb-mapreduce-6.1.7.tgz#9ab32d1e0f234f1bf6d1e4c5d7e216e9e23ac0a3"
integrity sha512-WzBwm7tmO9QhfRzVaWT4v6JQSS/fG2OoUDrWrhX87rPe2Pn6laPvdK5li6myNRxCoI/l5e8Jd+oYBAFnaiFucA==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-node@*":
version "6.1.4"
resolved "https://registry.yarnpkg.com/@types/pouchdb-node/-/pouchdb-node-6.1.4.tgz#5214c0169fcfd2237d373380bbd65a934feb5dfb"
integrity sha512-wnTCH8X1JOPpNOfVhz8HW0AvmdHh6pt40MuRj0jQnK7QEHsHS79WujsKTKSOF8QXtPwpvCNSsI7ut7H7tfxxJQ==
dependencies:
"@types/pouchdb-adapter-http" "*"
"@types/pouchdb-adapter-leveldb" "*"
"@types/pouchdb-core" "*"
"@types/pouchdb-mapreduce" "*"
"@types/pouchdb-replication" "*"
"@types/pouchdb-replication@*":
version "6.4.4"
resolved "https://registry.yarnpkg.com/@types/pouchdb-replication/-/pouchdb-replication-6.4.4.tgz#743406c90f13a988fa3e346ea74ce40acd170d00"
integrity sha512-BsE5LKpjJK4iAf6Fx5kyrMw+33V+Ip7uWldUnU2BYrrvtR+MLD22dcImm7DZN1st2wPPb91i0XEnQzvP0w1C/Q==
dependencies:
"@types/pouchdb-core" "*"
"@types/pouchdb-find" "*"
"@types/pouchdb@^6.4.0":
version "6.4.0"
resolved "https://registry.yarnpkg.com/@types/pouchdb/-/pouchdb-6.4.0.tgz#f9c41ca64b23029f9bf2eb4bf6956e6431cb79f8"
integrity sha512-eGCpX+NXhd5VLJuJMzwe3L79fa9+IDTrAG3CPaf4s/31PD56hOrhDJTSmRELSXuiqXr6+OHzzP0PldSaWsFt7w==
dependencies:
"@types/pouchdb-adapter-cordova-sqlite" "*"
"@types/pouchdb-adapter-fruitdown" "*"
"@types/pouchdb-adapter-http" "*"
"@types/pouchdb-adapter-idb" "*"
"@types/pouchdb-adapter-leveldb" "*"
"@types/pouchdb-adapter-localstorage" "*"
"@types/pouchdb-adapter-memory" "*"
"@types/pouchdb-adapter-node-websql" "*"
"@types/pouchdb-adapter-websql" "*"
"@types/pouchdb-browser" "*"
"@types/pouchdb-core" "*"
"@types/pouchdb-http" "*"
"@types/pouchdb-mapreduce" "*"
"@types/pouchdb-node" "*"
"@types/pouchdb-replication" "*"
abort-controller@3.0.0:
version "3.0.0"
resolved "https://registry.yarnpkg.com/abort-controller/-/abort-controller-3.0.0.tgz#eaf54d53b62bae4138e809ca225c8439a6efb392"
integrity sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==
dependencies:
event-target-shim "^5.0.0"
abstract-leveldown@^6.2.1:
version "6.3.0"
resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.3.0.tgz#d25221d1e6612f820c35963ba4bd739928f6026a"
integrity sha512-TU5nlYgta8YrBMNpc9FwQzRbiXsj49gsALsXadbGHt9CROPzX5fB0rWDR5mtdpOOKa5XqRFpbj1QroPAoPzVjQ==
dependencies:
buffer "^5.5.0"
immediate "^3.2.3"
level-concat-iterator "~2.0.0"
level-supports "~1.0.0"
xtend "~4.0.0"
abstract-leveldown@~6.2.1, abstract-leveldown@~6.2.3:
version "6.2.3"
resolved "https://registry.yarnpkg.com/abstract-leveldown/-/abstract-leveldown-6.2.3.tgz#036543d87e3710f2528e47040bc3261b77a9a8eb"
integrity sha512-BsLm5vFMRUrrLeCcRc+G0t2qOaTzpoJQLOubq2XM72eNpjF5UdU5o/5NvlNhx95XHcAvcl8OMXr4mlg/fRgUXQ==
dependencies:
buffer "^5.5.0"
immediate "^3.2.3"
level-concat-iterator "~2.0.0"
level-supports "~1.0.0"
xtend "~4.0.0"
base64-js@^1.3.1:
version "1.5.1"
resolved "https://registry.yarnpkg.com/base64-js/-/base64-js-1.5.1.tgz#1b1b440160a5bf7ad40b650f095963481903930a"
integrity sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==
buffer-from@1.1.2:
version "1.1.2"
resolved "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.2.tgz#2b146a6fd72e80b4f55d255f35ed59a3a9a41bd5"
integrity sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==
buffer@^5.5.0, buffer@^5.6.0:
version "5.7.1"
resolved "https://registry.yarnpkg.com/buffer/-/buffer-5.7.1.tgz#ba62e7c13133053582197160851a8f648e99eed0"
integrity sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==
dependencies:
base64-js "^1.3.1"
ieee754 "^1.1.13"
clone-buffer@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/clone-buffer/-/clone-buffer-1.0.0.tgz#e3e25b207ac4e701af721e2cb5a16792cac3dc58"
integrity sha512-KLLTJWrvwIP+OPfMn0x2PheDEP20RPUcGXj/ERegTgdmPEZylALQldygiqrPPu8P45uNuPs7ckmReLY6v/iA5g==
core-util-is@~1.0.0:
version "1.0.3"
resolved "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.3.tgz#a6042d3634c2b27e9328f837b965fac83808db85"
integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==
deferred-leveldown@~5.3.0:
version "5.3.0"
resolved "https://registry.yarnpkg.com/deferred-leveldown/-/deferred-leveldown-5.3.0.tgz#27a997ad95408b61161aa69bd489b86c71b78058"
integrity sha512-a59VOT+oDy7vtAbLRCZwWgxu2BaCfd5Hk7wxJd48ei7I+nsg8Orlb9CLG0PMZienk9BSUKgeAqkO2+Lw+1+Ukw==
dependencies:
abstract-leveldown "~6.2.1"
inherits "^2.0.3"
double-ended-queue@2.1.0-0:
version "2.1.0-0"
resolved "https://registry.yarnpkg.com/double-ended-queue/-/double-ended-queue-2.1.0-0.tgz#103d3527fd31528f40188130c841efdd78264e5c"
integrity sha512-+BNfZ+deCo8hMNpDqDnvT+c0XpJ5cUa6mqYq89bho2Ifze4URTqRkcwR399hWoTrTkbZ/XJYDgP6rc7pRgffEQ==
encoding-down@^6.3.0:
version "6.3.0"
resolved "https://registry.yarnpkg.com/encoding-down/-/encoding-down-6.3.0.tgz#b1c4eb0e1728c146ecaef8e32963c549e76d082b"
integrity sha512-QKrV0iKR6MZVJV08QY0wp1e7vF6QbhnbQhb07bwpEyuz4uZiZgPlEGdkCROuFkUwdxlFaiPIhjyarH1ee/3vhw==
dependencies:
abstract-leveldown "^6.2.1"
inherits "^2.0.3"
level-codec "^9.0.0"
level-errors "^2.0.0"
end-stream@~0.1.0:
version "0.1.0"
resolved "https://registry.yarnpkg.com/end-stream/-/end-stream-0.1.0.tgz#32003f3f438a2b0143168137f8fa6e9866c81ed5"
integrity sha512-Brl10T8kYnc75IepKizW6Y9liyW8ikz1B7n/xoHrJxoVSSjoqPn30sb7XVFfQERK4QfUMYRGs9dhWwtt2eu6uA==
dependencies:
write-stream "~0.4.3"
errno@~0.1.1:
version "0.1.8"
resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.8.tgz#8bb3e9c7d463be4976ff888f76b4809ebc2e811f"
integrity sha512-dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==
dependencies:
prr "~1.0.1"
event-target-shim@^5.0.0:
version "5.0.1"
resolved "https://registry.yarnpkg.com/event-target-shim/-/event-target-shim-5.0.1.tgz#5d4d3ebdf9583d63a5333ce2deb7480ab2b05789"
integrity sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==
fetch-cookie@0.11.0:
version "0.11.0"
resolved "https://registry.yarnpkg.com/fetch-cookie/-/fetch-cookie-0.11.0.tgz#e046d2abadd0ded5804ce7e2cae06d4331c15407"
integrity sha512-BQm7iZLFhMWFy5CZ/162sAGjBfdNWb7a8LEqqnzsHFhxT/X/SVj/z2t2nu3aJvjlbQkrAlTUApplPRjWyH4mhA==
dependencies:
tough-cookie "^2.3.3 || ^3.0.1 || ^4.0.0"
ieee754@^1.1.13:
version "1.2.1"
resolved "https://registry.yarnpkg.com/ieee754/-/ieee754-1.2.1.tgz#8eb7a10a63fff25d15a57b001586d177d1b0d352"
integrity sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==
immediate@3.3.0, immediate@^3.2.3:
version "3.3.0"
resolved "https://registry.yarnpkg.com/immediate/-/immediate-3.3.0.tgz#1aef225517836bcdf7f2a2de2600c79ff0269266"
integrity sha512-HR7EVodfFUdQCTIeySw+WDRFJlPcLOJbXfwwZ7Oom6tjsvZ3bOkCDJHehQC3nxJrv7+f9XecwazynjU8e4Vw3Q==
inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1:
version "2.0.4"
resolved "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz#0fa2c64f932917c3433a0ded55363aae37416b7c"
integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==
isarray@0.0.1:
version "0.0.1"
resolved "https://registry.yarnpkg.com/isarray/-/isarray-0.0.1.tgz#8a18acfca9a8f4177e09abfc6038939b05d1eedf"
integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==
level-codec@9.0.2, level-codec@^9.0.0:
version "9.0.2"
resolved "https://registry.yarnpkg.com/level-codec/-/level-codec-9.0.2.tgz#fd60df8c64786a80d44e63423096ffead63d8cbc"
integrity sha512-UyIwNb1lJBChJnGfjmO0OR+ezh2iVu1Kas3nvBS/BzGnx79dv6g7unpKIDNPMhfdTEGoc7mC8uAu51XEtX+FHQ==
dependencies:
buffer "^5.6.0"
level-concat-iterator@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/level-concat-iterator/-/level-concat-iterator-2.0.1.tgz#1d1009cf108340252cb38c51f9727311193e6263"
integrity sha512-OTKKOqeav2QWcERMJR7IS9CUo1sHnke2C0gkSmcR7QuEtFNLLzHQAvnMw8ykvEcv0Qtkg0p7FOwP1v9e5Smdcw==
level-errors@^2.0.0, level-errors@~2.0.0:
version "2.0.1"
resolved "https://registry.yarnpkg.com/level-errors/-/level-errors-2.0.1.tgz#2132a677bf4e679ce029f517c2f17432800c05c8"
integrity sha512-UVprBJXite4gPS+3VznfgDSU8PTRuVX0NXwoWW50KLxd2yw4Y1t2JUR5In1itQnudZqRMT9DlAM3Q//9NCjCFw==
dependencies:
errno "~0.1.1"
level-iterator-stream@~4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/level-iterator-stream/-/level-iterator-stream-4.0.2.tgz#7ceba69b713b0d7e22fcc0d1f128ccdc8a24f79c"
integrity sha512-ZSthfEqzGSOMWoUGhTXdX9jv26d32XJuHz/5YnuHZzH6wldfWMOVwI9TBtKcya4BKTyTt3XVA0A3cF3q5CY30Q==
dependencies:
inherits "^2.0.4"
readable-stream "^3.4.0"
xtend "^4.0.2"
level-js@^5.0.0:
version "5.0.2"
resolved "https://registry.yarnpkg.com/level-js/-/level-js-5.0.2.tgz#5e280b8f93abd9ef3a305b13faf0b5397c969b55"
integrity sha512-SnBIDo2pdO5VXh02ZmtAyPP6/+6YTJg2ibLtl9C34pWvmtMEmRTWpra+qO/hifkUtBTOtfx6S9vLDjBsBK4gRg==
dependencies:
abstract-leveldown "~6.2.3"
buffer "^5.5.0"
inherits "^2.0.3"
ltgt "^2.1.2"
level-packager@^5.1.0:
version "5.1.1"
resolved "https://registry.yarnpkg.com/level-packager/-/level-packager-5.1.1.tgz#323ec842d6babe7336f70299c14df2e329c18939"
integrity sha512-HMwMaQPlTC1IlcwT3+swhqf/NUO+ZhXVz6TY1zZIIZlIR0YSn8GtAAWmIvKjNY16ZkEg/JcpAuQskxsXqC0yOQ==
dependencies:
encoding-down "^6.3.0"
levelup "^4.3.2"
level-supports@~1.0.0:
version "1.0.1"
resolved "https://registry.yarnpkg.com/level-supports/-/level-supports-1.0.1.tgz#2f530a596834c7301622521988e2c36bb77d122d"
integrity sha512-rXM7GYnW8gsl1vedTJIbzOrRv85c/2uCMpiiCzO2fndd06U/kUXEEU9evYn4zFggBOg36IsBW8LzqIpETwwQzg==
dependencies:
xtend "^4.0.2"
level-write-stream@1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/level-write-stream/-/level-write-stream-1.0.0.tgz#3f7fbb679a55137c0feb303dee766e12ee13c1dc"
integrity sha512-bBNKOEOMl8msO+uIM9YX/gUO6ckokZ/4pCwTm/lwvs46x6Xs8Zy0sn3Vh37eDqse4mhy4fOMIb/JsSM2nyQFtw==
dependencies:
end-stream "~0.1.0"
level@6.0.1:
version "6.0.1"
resolved "https://registry.yarnpkg.com/level/-/level-6.0.1.tgz#dc34c5edb81846a6de5079eac15706334b0d7cd6"
integrity sha512-psRSqJZCsC/irNhfHzrVZbmPYXDcEYhA5TVNwr+V92jF44rbf86hqGp8fiT702FyiArScYIlPSBTDUASCVNSpw==
dependencies:
level-js "^5.0.0"
level-packager "^5.1.0"
leveldown "^5.4.0"
leveldown@5.6.0, leveldown@^5.4.0:
version "5.6.0"
resolved "https://registry.yarnpkg.com/leveldown/-/leveldown-5.6.0.tgz#16ba937bb2991c6094e13ac5a6898ee66d3eee98"
integrity sha512-iB8O/7Db9lPaITU1aA2txU/cBEXAt4vWwKQRrrWuS6XDgbP4QZGj9BL2aNbwb002atoQ/lIotJkfyzz+ygQnUQ==
dependencies:
abstract-leveldown "~6.2.1"
napi-macros "~2.0.0"
node-gyp-build "~4.1.0"
levelup@4.4.0, levelup@^4.3.2:
version "4.4.0"
resolved "https://registry.yarnpkg.com/levelup/-/levelup-4.4.0.tgz#f89da3a228c38deb49c48f88a70fb71f01cafed6"
integrity sha512-94++VFO3qN95cM/d6eBXvd894oJE0w3cInq9USsyQzzoJxmiYzPAocNcuGCPGGjoXqDVJcr3C1jzt1TSjyaiLQ==
dependencies:
deferred-leveldown "~5.3.0"
level-errors "~2.0.0"
level-iterator-stream "~4.0.0"
level-supports "~1.0.0"
xtend "~4.0.0"
ltgt@2.2.1, ltgt@^2.1.2:
version "2.2.1"
resolved "https://registry.yarnpkg.com/ltgt/-/ltgt-2.2.1.tgz#f35ca91c493f7b73da0e07495304f17b31f87ee5"
integrity sha512-AI2r85+4MquTw9ZYqabu4nMwy9Oftlfa/e/52t9IjtfG+mGBbTNdAoZ3RQKLHR6r0wQnwZnPIEh/Ya6XTWAKNA==
luxon@^3.3.0:
version "3.3.0"
resolved "https://registry.yarnpkg.com/luxon/-/luxon-3.3.0.tgz#d73ab5b5d2b49a461c47cedbc7e73309b4805b48"
integrity sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==
napi-macros@~2.0.0:
version "2.0.0"
resolved "https://registry.yarnpkg.com/napi-macros/-/napi-macros-2.0.0.tgz#2b6bae421e7b96eb687aa6c77a7858640670001b"
integrity sha512-A0xLykHtARfueITVDernsAWdtIMbOJgKgcluwENp3AlsKN/PloyO10HtmoqnFAQAcxPkgZN7wdfPfEd0zNGxbg==
node-fetch@2:
version "2.6.9"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.9.tgz#7c7f744b5cc6eb5fd404e0c7a9fec630a55657e6"
integrity sha512-DJm/CJkZkRjKKj4Zi4BsKVZh3ValV5IR5s7LVZnW+6YMh0W1BfNA8XSs6DLMGYlId5F3KnA70uu2qepcR08Qqg==
dependencies:
whatwg-url "^5.0.0"
node-fetch@2.6.7:
version "2.6.7"
resolved "https://registry.yarnpkg.com/node-fetch/-/node-fetch-2.6.7.tgz#24de9fba827e3b4ae44dc8b20256a379160052ad"
integrity sha512-ZjMPFEfVx5j+y2yF35Kzx5sF7kDzxuDj6ziH4FFbOp87zKDZNx8yExJIb05OGF4Nlt9IHFIMBkRl41VdvcNdbQ==
dependencies:
whatwg-url "^5.0.0"
node-gyp-build@~4.1.0:
version "4.1.1"
resolved "https://registry.yarnpkg.com/node-gyp-build/-/node-gyp-build-4.1.1.tgz#d7270b5d86717068d114cc57fff352f96d745feb"
integrity sha512-dSq1xmcPDKPZ2EED2S6zw/b9NKsqzXRE6dVr8TVQnI3FJOTteUMuqF3Qqs6LZg+mLGYJWqQzMbIjMtJqTv87nQ==
pouchdb-abstract-mapreduce@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-abstract-mapreduce/-/pouchdb-abstract-mapreduce-8.0.1.tgz#f45aa1424fdd272a76ceb5722a53b38c10a0ca81"
integrity sha512-BxJRHdfiC8gID8h4DPS0Xy6wsa2VBHRHMv9hsm0BhGTWTqS4k8ivItVSeU2dMoXiTBYp+7SerYmovUQNGSX1GA==
dependencies:
pouchdb-binary-utils "8.0.1"
pouchdb-collate "8.0.1"
pouchdb-collections "8.0.1"
pouchdb-errors "8.0.1"
pouchdb-fetch "8.0.1"
pouchdb-mapreduce-utils "8.0.1"
pouchdb-md5 "8.0.1"
pouchdb-utils "8.0.1"
pouchdb-binary-utils@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-binary-utils/-/pouchdb-binary-utils-8.0.1.tgz#aa77248b9c0ad2a68f75f8f7cf2b594fe3dbd559"
integrity sha512-WsuR/S0aoUlcA0Alt99czkXsfuXWcrYXAcvGiTW02zawVXOafCnb/qHjA09TUaV0oy5HeHmYaNnDckoOUqspeA==
dependencies:
buffer-from "1.1.2"
pouchdb-collate@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-collate/-/pouchdb-collate-8.0.1.tgz#14b6ad9330d2831fd8ef135de680060366502a1b"
integrity sha512-DTuNz1UJjBTGZMUlWS1klSE1rPsmHy8IIDie3MFH1ZTz/C+SwGgGwkiAyUDv/n00D18EMLgXq5mu+r7L6K1BwQ==
pouchdb-collections@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-collections/-/pouchdb-collections-8.0.1.tgz#d6a31ab3a917fa5da49d46a804c04761a0e19655"
integrity sha512-TlkQ2GGHJApJgL0b7bJMQcwX6eMfVenLeoK9mqHfC2fJssui+HWJJ5LYKHOWan11SeB90BQVFbO6rHN6CJQeDg==
pouchdb-errors@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-errors/-/pouchdb-errors-8.0.1.tgz#d57afd57e07490d8d0b4ef19c10bfc85dbf27ae5"
integrity sha512-H+ZsQxcG/JV3Tn29gnM6c9+lRPCN91ZYOkoIICsLjVRYgOTzN1AvNUD/G5JCB+81aI/u3fxZec0LEaZh6g6NHA==
pouchdb-fetch@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-fetch/-/pouchdb-fetch-8.0.1.tgz#30a27a45eb24c20f346a04d906ba82bca5a3a525"
integrity sha512-Px5HLT8MxqTujc8bpPRKoouznDTJa9XBGqCbhl95q6rhjWRfwZEvXjV92z0B5BALAM6D6avMyG0DjuNfUWnMuA==
dependencies:
abort-controller "3.0.0"
fetch-cookie "0.11.0"
node-fetch "2.6.7"
pouchdb-find@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-find/-/pouchdb-find-8.0.1.tgz#aa96efce482add3a9258e64531a807d082b7848c"
integrity sha512-i5criYXMOXlbeRrCrXonqaOY+xiMiOyTLybqvtX/NkUsiD4BxJxkq5AxdSlHdJ9703nWJ0k6S+5C8VrpEj8tsQ==
dependencies:
pouchdb-abstract-mapreduce "8.0.1"
pouchdb-collate "8.0.1"
pouchdb-errors "8.0.1"
pouchdb-fetch "8.0.1"
pouchdb-md5 "8.0.1"
pouchdb-selector-core "8.0.1"
pouchdb-utils "8.0.1"
pouchdb-mapreduce-utils@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-mapreduce-utils/-/pouchdb-mapreduce-utils-8.0.1.tgz#a8acb1542aaf63a007b60f7a281dbbb94b49fcab"
integrity sha512-asZcFLy1DA3oe5CeXIRCpfVrBHaHRvSb3Tc/LPD1dZDDtpEkeCuXGtJm+praN0jl41jTBEm0uMdD/YI0J5ZFXw==
dependencies:
pouchdb-collections "8.0.1"
pouchdb-utils "8.0.1"
pouchdb-md5@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-md5/-/pouchdb-md5-8.0.1.tgz#5a3df4939102423727e0594c2a9bb91b82a444ed"
integrity sha512-shVcs/K/iilrcAhDEERpLIrGm/cnDVsXiocOzs7kycJEuBqYnLD9nj58VwWDcum26wfa8T9cznvEGE1jlYVNPQ==
dependencies:
pouchdb-binary-utils "8.0.1"
spark-md5 "3.0.2"
pouchdb-selector-core@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-selector-core/-/pouchdb-selector-core-8.0.1.tgz#d52119b79bd34b69c27f4596dbb9e16373bbd92e"
integrity sha512-dHWsnR+mLGyfVld1vSHJI1xKTwS1xk1G2dggjfXfUrLehI+wysjTUOwiSNytyPzG6DpT+o86wyUpwzPwsDCLBw==
dependencies:
pouchdb-collate "8.0.1"
pouchdb-utils "8.0.1"
pouchdb-utils@8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb-utils/-/pouchdb-utils-8.0.1.tgz#3fb0c9fe00f52e4d8404278a609f277c1c155b70"
integrity sha512-pWgxdk9EHVWJmjQoEvTe+ZlPXyjcuQ/vgLITN+RjGwcYhoQYUE1M0PksQd2dUP3V8lGS4+wrg9lEM/qSJPYcpw==
dependencies:
clone-buffer "1.0.0"
immediate "3.3.0"
pouchdb-collections "8.0.1"
pouchdb-errors "8.0.1"
pouchdb-md5 "8.0.1"
uuid "8.3.2"
pouchdb@^8.0.1:
version "8.0.1"
resolved "https://registry.yarnpkg.com/pouchdb/-/pouchdb-8.0.1.tgz#78aef57b0d58abe5e4a4581a3332c0c220e20dbd"
integrity sha512-xp5S83JOQn2NAL0ZQ5CU+DI26V9/YrYuVtkXnbGEIDrYiFfj5A8gAcfbxefXb/9O+Qn4n5RaT/19+8UBSZ42sw==
dependencies:
abort-controller "3.0.0"
buffer-from "1.1.2"
clone-buffer "1.0.0"
double-ended-queue "2.1.0-0"
fetch-cookie "0.11.0"
immediate "3.3.0"
level "6.0.1"
level-codec "9.0.2"
level-write-stream "1.0.0"
leveldown "5.6.0"
levelup "4.4.0"
ltgt "2.2.1"
node-fetch "2.6.7"
readable-stream "1.1.14"
spark-md5 "3.0.2"
through2 "3.0.2"
uuid "8.3.2"
vuvuzela "1.0.3"
prr@~1.0.1:
version "1.0.1"
resolved "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz#d3fc114ba06995a45ec6893f484ceb1d78f5f476"
integrity sha512-yPw4Sng1gWghHQWj0B3ZggWUm4qVbPwPFcRG8KyxiU7J2OHFSoEHKS+EZ3fv5l1t9CyCiop6l/ZYeWbrgoQejw==
psl@^1.1.33:
version "1.9.0"
resolved "https://registry.yarnpkg.com/psl/-/psl-1.9.0.tgz#d0df2a137f00794565fcaf3b2c00cd09f8d5a5a7"
integrity sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==
punycode@^2.1.1:
version "2.3.0"
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.3.0.tgz#f67fa67c94da8f4d0cfff981aee4118064199b8f"
integrity sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==
querystringify@^2.1.1:
version "2.2.0"
resolved "https://registry.yarnpkg.com/querystringify/-/querystringify-2.2.0.tgz#3345941b4153cb9d082d8eee4cda2016a9aef7f6"
integrity sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==
readable-stream@1.1.14:
version "1.1.14"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-1.1.14.tgz#7cf4c54ef648e3813084c636dd2079e166c081d9"
integrity sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==
dependencies:
core-util-is "~1.0.0"
inherits "~2.0.1"
isarray "0.0.1"
string_decoder "~0.10.x"
"readable-stream@2 || 3", readable-stream@^3.4.0:
version "3.6.2"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.2.tgz#56a9b36ea965c00c5a93ef31eb111a0f11056967"
integrity sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==
dependencies:
inherits "^2.0.3"
string_decoder "^1.1.1"
util-deprecate "^1.0.1"
readable-stream@~0.0.2:
version "0.0.4"
resolved "https://registry.yarnpkg.com/readable-stream/-/readable-stream-0.0.4.tgz#f32d76e3fb863344a548d79923007173665b3b8d"
integrity sha512-azrivNydKRYt7zwLV5wWUK7YzKTWs3q87xSmY6DlHapPrCvaT6ZrukvM5erV+yCSSPmZT8zkSdttOHQpWWm9zw==
requires-port@^1.0.0:
version "1.0.0"
resolved "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz#925d2601d39ac485e091cf0da5c6e694dc3dcaff"
integrity sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==
safe-buffer@~5.2.0:
version "5.2.1"
resolved "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz#1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6"
integrity sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==
spark-md5@3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/spark-md5/-/spark-md5-3.0.2.tgz#7952c4a30784347abcee73268e473b9c0167e3fc"
integrity sha512-wcFzz9cDfbuqe0FZzfi2or1sgyIrsDwmPwfZC4hiNidPdPINjeUwNfv5kldczoEAcjl9Y1L3SM7Uz2PUEQzxQw==
string_decoder@^1.1.1:
version "1.3.0"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz#42f114594a46cf1a8e30b0a84f56c78c3edac21e"
integrity sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==
dependencies:
safe-buffer "~5.2.0"
string_decoder@~0.10.x:
version "0.10.31"
resolved "https://registry.yarnpkg.com/string_decoder/-/string_decoder-0.10.31.tgz#62e203bc41766c6c28c9fc84301dab1c5310fa94"
integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==
through2@3.0.2:
version "3.0.2"
resolved "https://registry.yarnpkg.com/through2/-/through2-3.0.2.tgz#99f88931cfc761ec7678b41d5d7336b5b6a07bf4"
integrity sha512-enaDQ4MUyP2W6ZyT6EsMzqBPZaM/avg8iuo+l2d3QCs0J+6RaqkHV/2/lOwDTueBHeJ/2LG9lrLW3d5rWPucuQ==
dependencies:
inherits "^2.0.4"
readable-stream "2 || 3"
"tough-cookie@^2.3.3 || ^3.0.1 || ^4.0.0":
version "4.1.2"
resolved "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-4.1.2.tgz#e53e84b85f24e0b65dd526f46628db6c85f6b874"
integrity sha512-G9fqXWoYFZgTc2z8Q5zaHy/vJMjm+WV0AkAeHxVCQiEB1b+dGvWzFW6QV07cY5jQ5gRkeid2qIkzkxUnmoQZUQ==
dependencies:
psl "^1.1.33"
punycode "^2.1.1"
universalify "^0.2.0"
url-parse "^1.5.3"
tr46@~0.0.3:
version "0.0.3"
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
typescript@^5.0.4:
version "5.0.4"
resolved "https://registry.yarnpkg.com/typescript/-/typescript-5.0.4.tgz#b217fd20119bd61a94d4011274e0ab369058da3b"
integrity sha512-cW9T5W9xY37cc+jfEnaUvX91foxtHkza3Nw3wkoF4sSlKn0MONdkdEndig/qPBWXNkmplh3NzayQzCiHM4/hqw==
universalify@^0.2.0:
version "0.2.0"
resolved "https://registry.yarnpkg.com/universalify/-/universalify-0.2.0.tgz#6451760566fa857534745ab1dde952d1b1761be0"
integrity sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==
url-parse@^1.5.3:
version "1.5.10"
resolved "https://registry.yarnpkg.com/url-parse/-/url-parse-1.5.10.tgz#9d3c2f736c1d75dd3bd2be507dcc111f1e2ea9c1"
integrity sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==
dependencies:
querystringify "^2.1.1"
requires-port "^1.0.0"
util-deprecate@^1.0.1:
version "1.0.2"
resolved "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz#450d4dc9fa70de732762fbd2d4a28981419a0ccf"
integrity sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==
uuid@8.3.2:
version "8.3.2"
resolved "https://registry.yarnpkg.com/uuid/-/uuid-8.3.2.tgz#80d5b5ced271bb9af6c445f21a1a04c606cefbe2"
integrity sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==
vuvuzela@1.0.3:
version "1.0.3"
resolved "https://registry.yarnpkg.com/vuvuzela/-/vuvuzela-1.0.3.tgz#3be145e58271c73ca55279dd851f12a682114b0b"
integrity sha512-Tm7jR1xTzBbPW+6y1tknKiEhz04Wf/1iZkcTJjSFcpNko43+dFW6+OOeQe9taJIug3NdfUAjFKgUSyQrIKaDvQ==
webidl-conversions@^3.0.0:
version "3.0.1"
resolved "https://registry.yarnpkg.com/webidl-conversions/-/webidl-conversions-3.0.1.tgz#24534275e2a7bc6be7bc86611cc16ae0a5654871"
integrity sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==
whatwg-url@^5.0.0:
version "5.0.0"
resolved "https://registry.yarnpkg.com/whatwg-url/-/whatwg-url-5.0.0.tgz#966454e8765462e37644d3626f6742ce8b70965d"
integrity sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==
dependencies:
tr46 "~0.0.3"
webidl-conversions "^3.0.0"
write-stream@~0.4.3:
version "0.4.3"
resolved "https://registry.yarnpkg.com/write-stream/-/write-stream-0.4.3.tgz#83cc8c0347d0af6057a93862b4e3ae01de5c81c1"
integrity sha512-IJrvkhbAnj89W/GAVdVgbnPiVw5Ntg/B4tc/MUCIEwj/g6JIww1DWJyB/yBMT3yw2/TkT6IUZ0+IYef3flEw8A==
dependencies:
readable-stream "~0.0.2"
xdg-basedir@^5.1.0:
version "5.1.0"
resolved "https://registry.yarnpkg.com/xdg-basedir/-/xdg-basedir-5.1.0.tgz#1efba19425e73be1bc6f2a6ceb52a3d2c884c0c9"
integrity sha512-GCPAHLvrIH13+c0SuacwvRYj2SxJXQ4kaVTT5xgL3kPrz56XxkF21IGhjSE1+W0aw7gpBWRGXLCPnPby6lSpmQ==
xtend@^4.0.2, xtend@~4.0.0:
version "4.0.2"
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz#bb72779f5fa465186b1f438f674fa347fdb5db54"
integrity sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==