Add comprehensive development roadmap via GitHub Issues

Created 10 detailed GitHub issues covering:
- Project activation and management UI (#1-2)
- Worker node coordination and visualization (#3-4)
- Automated GitHub repository scanning (#5)
- Intelligent model-to-issue matching (#6)
- Multi-model task execution system (#7)
- N8N workflow integration (#8)
- Hive-Bzzz P2P bridge (#9)
- Peer assistance protocol (#10)

Each issue includes detailed specifications, acceptance criteria,
technical implementation notes, and dependency mapping.

🤖 Generated with [Claude Code](https://claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
anthonyrawlins
2025-07-12 19:41:01 +10:00
parent 9a6a06da89
commit e89f2f4b7b
4980 changed files with 1501266 additions and 57 deletions

3
frontend/node_modules/loupe/lib/arguments.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectArguments(args: IArguments, options: Options): string;
//# sourceMappingURL=arguments.d.ts.map

1
frontend/node_modules/loupe/lib/arguments.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"arguments.d.ts","sourceRoot":"","sources":["../src/arguments.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,CAAC,OAAO,UAAU,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAInF"}

7
frontend/node_modules/loupe/lib/arguments.js generated vendored Normal file
View File

@@ -0,0 +1,7 @@
import { inspectList } from './helpers.js';
export default function inspectArguments(args, options) {
if (args.length === 0)
return 'Arguments[]';
options.truncate -= 13;
return `Arguments[ ${inspectList(args, options)} ]`;
}

3
frontend/node_modules/loupe/lib/array.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectArray(array: ArrayLike<unknown>, options: Options): string;
//# sourceMappingURL=array.d.ts.map

1
frontend/node_modules/loupe/lib/array.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"array.d.ts","sourceRoot":"","sources":["../src/array.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,KAAK,EAAE,SAAS,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,UAiB/E"}

16
frontend/node_modules/loupe/lib/array.js generated vendored Normal file
View File

@@ -0,0 +1,16 @@
import { inspectList, inspectProperty } from './helpers.js';
export default function inspectArray(array, options) {
// Object.keys will always output the Array indices first, so we can slice by
// `array.length` to get non-index properties
const nonIndexProperties = Object.keys(array).slice(array.length);
if (!array.length && !nonIndexProperties.length)
return '[]';
options.truncate -= 4;
const listContents = inspectList(array, options);
options.truncate -= listContents.length;
let propertyContents = '';
if (nonIndexProperties.length) {
propertyContents = inspectList(nonIndexProperties.map(key => [key, array[key]]), options, inspectProperty);
}
return `[ ${listContents}${propertyContents ? `, ${propertyContents}` : ''} ]`;
}

3
frontend/node_modules/loupe/lib/bigint.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectBigInt(number: bigint, options: Options): string;
//# sourceMappingURL=bigint.d.ts.map

1
frontend/node_modules/loupe/lib/bigint.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"bigint.d.ts","sourceRoot":"","sources":["../src/bigint.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,UAIrE"}

7
frontend/node_modules/loupe/lib/bigint.js generated vendored Normal file
View File

@@ -0,0 +1,7 @@
import { truncate, truncator } from './helpers.js';
export default function inspectBigInt(number, options) {
let nums = truncate(number.toString(), options.truncate - 1);
if (nums !== truncator)
nums += 'n';
return options.stylize(nums, 'bigint');
}

5
frontend/node_modules/loupe/lib/class.d.ts generated vendored Normal file
View File

@@ -0,0 +1,5 @@
import type { Options } from './types.js';
export default function inspectClass(value: {
new (...args: any[]): unknown;
}, options: Options): string;
//# sourceMappingURL=class.d.ts.map

1
frontend/node_modules/loupe/lib/class.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"class.d.ts","sourceRoot":"","sources":["../src/class.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAIzC,MAAM,CAAC,OAAO,UAAU,YAAY,CAAC,KAAK,EAAE;IAAE,KAAK,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,OAAO,CAAA;CAAE,EAAE,OAAO,EAAE,OAAO,UAY9F"}

15
frontend/node_modules/loupe/lib/class.js generated vendored Normal file
View File

@@ -0,0 +1,15 @@
import inspectObject from './object.js';
const toStringTag = typeof Symbol !== 'undefined' && Symbol.toStringTag ? Symbol.toStringTag : false;
export default function inspectClass(value, options) {
let name = '';
if (toStringTag && toStringTag in value) {
name = value[toStringTag];
}
name = name || value.constructor.name;
// Babel transforms anonymous classes to the name `_class`
if (!name || name === '_class') {
name = '<Anonymous Class>';
}
options.truncate -= name.length;
return `${name}${inspectObject(value, options)}`;
}

3
frontend/node_modules/loupe/lib/date.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectDate(dateObject: Date, options: Options): string;
//# sourceMappingURL=date.d.ts.map

1
frontend/node_modules/loupe/lib/date.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"date.d.ts","sourceRoot":"","sources":["../src/date.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,UAWrE"}

11
frontend/node_modules/loupe/lib/date.js generated vendored Normal file
View File

@@ -0,0 +1,11 @@
import { truncate } from './helpers.js';
export default function inspectDate(dateObject, options) {
const stringRepresentation = dateObject.toJSON();
if (stringRepresentation === null) {
return 'Invalid Date';
}
const split = stringRepresentation.split('T');
const date = split[0];
// If we need to - truncate the time portion, but never the date
return options.stylize(`${date}T${truncate(split[1], options.truncate - date.length - 1)}`, 'date');
}

3
frontend/node_modules/loupe/lib/error.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectObject(error: Error, options: Options): string;
//# sourceMappingURL=error.d.ts.map

1
frontend/node_modules/loupe/lib/error.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../src/error.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,YAAY,CAAA;AAgBlD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,UAuBnE"}

35
frontend/node_modules/loupe/lib/error.js generated vendored Normal file
View File

@@ -0,0 +1,35 @@
import { inspectList, inspectProperty, truncate } from './helpers.js';
const errorKeys = [
'stack',
'line',
'column',
'name',
'message',
'fileName',
'lineNumber',
'columnNumber',
'number',
'description',
'cause',
];
export default function inspectObject(error, options) {
const properties = Object.getOwnPropertyNames(error).filter(key => errorKeys.indexOf(key) === -1);
const name = error.name;
options.truncate -= name.length;
let message = '';
if (typeof error.message === 'string') {
message = truncate(error.message, options.truncate);
}
else {
properties.unshift('message');
}
message = message ? `: ${message}` : '';
options.truncate -= message.length + 5;
options.seen = options.seen || [];
if (options.seen.includes(error)) {
return '[Circular]';
}
options.seen.push(error);
const propertyContents = inspectList(properties.map(key => [key, error[key]]), options, inspectProperty);
return `${name}${message}${propertyContents ? ` { ${propertyContents} }` : ''}`;
}

7
frontend/node_modules/loupe/lib/function.d.ts generated vendored Normal file
View File

@@ -0,0 +1,7 @@
import type { Options } from './types.js';
type ToStringable = Function & {
[Symbol.toStringTag]: string;
};
export default function inspectFunction(func: ToStringable, options: Options): string;
export {};
//# sourceMappingURL=function.d.ts.map

1
frontend/node_modules/loupe/lib/function.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"function.d.ts","sourceRoot":"","sources":["../src/function.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,KAAK,YAAY,GAAG,QAAQ,GAAG;IAAC,CAAC,MAAM,CAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAC,CAAC;AAE9D,MAAM,CAAC,OAAO,UAAU,eAAe,CAAC,IAAI,EAAE,YAAY,EAAE,OAAO,EAAE,OAAO,UAQ3E"}

9
frontend/node_modules/loupe/lib/function.js generated vendored Normal file
View File

@@ -0,0 +1,9 @@
import { truncate } from './helpers.js';
export default function inspectFunction(func, options) {
const functionType = func[Symbol.toStringTag] || 'Function';
const name = func.name;
if (!name) {
return options.stylize(`[${functionType}]`, 'special');
}
return options.stylize(`[${functionType} ${truncate(name, options.truncate - 11)}]`, 'special');
}

7
frontend/node_modules/loupe/lib/helpers.d.ts generated vendored Normal file
View File

@@ -0,0 +1,7 @@
import type { Inspect, Options } from './types.js';
export declare const truncator = "\u2026";
export declare function normaliseOptions({ showHidden, depth, colors, customInspect, showProxy, maxArrayLength, breakLength, seen, truncate, stylize, }: Partial<Options> | undefined, inspect: Inspect): Options;
export declare function truncate(string: string | number, length: number, tail?: typeof truncator): string;
export declare function inspectList(list: ArrayLike<unknown>, options: Options, inspectItem?: Inspect, separator?: string): string;
export declare function inspectProperty([key, value]: [unknown, unknown], options: Options): string;
//# sourceMappingURL=helpers.d.ts.map

1
frontend/node_modules/loupe/lib/helpers.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../src/helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AA+ClD,eAAO,MAAM,SAAS,WAAM,CAAA;AAa5B,wBAAgB,gBAAgB,CAC9B,EACE,UAAkB,EAClB,KAAS,EACT,MAAc,EACd,aAAoB,EACpB,SAAiB,EACjB,cAAyB,EACzB,WAAsB,EACtB,IAAS,EAET,QAAmB,EACnB,OAAgB,GACjB,EAAE,OAAO,CAAC,OAAO,CAAC,YAAK,EACxB,OAAO,EAAE,OAAO,GACf,OAAO,CAkBT;AAMD,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,IAAI,GAAE,OAAO,SAAqB,UAenG;AAGD,wBAAgB,WAAW,CACzB,IAAI,EAAE,SAAS,CAAC,OAAO,CAAC,EACxB,OAAO,EAAE,OAAO,EAChB,WAAW,CAAC,EAAE,OAAO,EACrB,SAAS,SAAO,GACf,MAAM,CAsDR;AAYD,wBAAgB,eAAe,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAU1F"}

159
frontend/node_modules/loupe/lib/helpers.js generated vendored Normal file
View File

@@ -0,0 +1,159 @@
const ansiColors = {
bold: ['1', '22'],
dim: ['2', '22'],
italic: ['3', '23'],
underline: ['4', '24'],
// 5 & 6 are blinking
inverse: ['7', '27'],
hidden: ['8', '28'],
strike: ['9', '29'],
// 10-20 are fonts
// 21-29 are resets for 1-9
black: ['30', '39'],
red: ['31', '39'],
green: ['32', '39'],
yellow: ['33', '39'],
blue: ['34', '39'],
magenta: ['35', '39'],
cyan: ['36', '39'],
white: ['37', '39'],
brightblack: ['30;1', '39'],
brightred: ['31;1', '39'],
brightgreen: ['32;1', '39'],
brightyellow: ['33;1', '39'],
brightblue: ['34;1', '39'],
brightmagenta: ['35;1', '39'],
brightcyan: ['36;1', '39'],
brightwhite: ['37;1', '39'],
grey: ['90', '39'],
};
const styles = {
special: 'cyan',
number: 'yellow',
bigint: 'yellow',
boolean: 'yellow',
undefined: 'grey',
null: 'bold',
string: 'green',
symbol: 'green',
date: 'magenta',
regexp: 'red',
};
export const truncator = '…';
function colorise(value, styleType) {
const color = ansiColors[styles[styleType]] || ansiColors[styleType] || '';
if (!color) {
return String(value);
}
return `\u001b[${color[0]}m${String(value)}\u001b[${color[1]}m`;
}
export function normaliseOptions({ showHidden = false, depth = 2, colors = false, customInspect = true, showProxy = false, maxArrayLength = Infinity, breakLength = Infinity, seen = [],
// eslint-disable-next-line no-shadow
truncate = Infinity, stylize = String, } = {}, inspect) {
const options = {
showHidden: Boolean(showHidden),
depth: Number(depth),
colors: Boolean(colors),
customInspect: Boolean(customInspect),
showProxy: Boolean(showProxy),
maxArrayLength: Number(maxArrayLength),
breakLength: Number(breakLength),
truncate: Number(truncate),
seen,
inspect,
stylize,
};
if (options.colors) {
options.stylize = colorise;
}
return options;
}
function isHighSurrogate(char) {
return char >= '\ud800' && char <= '\udbff';
}
export function truncate(string, length, tail = truncator) {
string = String(string);
const tailLength = tail.length;
const stringLength = string.length;
if (tailLength > length && stringLength > tailLength) {
return tail;
}
if (stringLength > length && stringLength > tailLength) {
let end = length - tailLength;
if (end > 0 && isHighSurrogate(string[end - 1])) {
end = end - 1;
}
return `${string.slice(0, end)}${tail}`;
}
return string;
}
// eslint-disable-next-line complexity
export function inspectList(list, options, inspectItem, separator = ', ') {
inspectItem = inspectItem || options.inspect;
const size = list.length;
if (size === 0)
return '';
const originalLength = options.truncate;
let output = '';
let peek = '';
let truncated = '';
for (let i = 0; i < size; i += 1) {
const last = i + 1 === list.length;
const secondToLast = i + 2 === list.length;
truncated = `${truncator}(${list.length - i})`;
const value = list[i];
// If there is more than one remaining we need to account for a separator of `, `
options.truncate = originalLength - output.length - (last ? 0 : separator.length);
const string = peek || inspectItem(value, options) + (last ? '' : separator);
const nextLength = output.length + string.length;
const truncatedLength = nextLength + truncated.length;
// If this is the last element, and adding it would
// take us over length, but adding the truncator wouldn't - then break now
if (last && nextLength > originalLength && output.length + truncated.length <= originalLength) {
break;
}
// If this isn't the last or second to last element to scan,
// but the string is already over length then break here
if (!last && !secondToLast && truncatedLength > originalLength) {
break;
}
// Peek at the next string to determine if we should
// break early before adding this item to the output
peek = last ? '' : inspectItem(list[i + 1], options) + (secondToLast ? '' : separator);
// If we have one element left, but this element and
// the next takes over length, the break early
if (!last && secondToLast && truncatedLength > originalLength && nextLength + peek.length > originalLength) {
break;
}
output += string;
// If the next element takes us to length -
// but there are more after that, then we should truncate now
if (!last && !secondToLast && nextLength + peek.length >= originalLength) {
truncated = `${truncator}(${list.length - i - 1})`;
break;
}
truncated = '';
}
return `${output}${truncated}`;
}
function quoteComplexKey(key) {
if (key.match(/^[a-zA-Z_][a-zA-Z_0-9]*$/)) {
return key;
}
return JSON.stringify(key)
.replace(/'/g, "\\'")
.replace(/\\"/g, '"')
.replace(/(^"|"$)/g, "'");
}
export function inspectProperty([key, value], options) {
options.truncate -= 2;
if (typeof key === 'string') {
key = quoteComplexKey(key);
}
else if (typeof key !== 'number') {
key = `[${options.inspect(key, options)}]`;
}
options.truncate -= key.length;
value = options.inspect(value, options);
return `${key}: ${value}`;
}

6
frontend/node_modules/loupe/lib/html.d.ts generated vendored Normal file
View File

@@ -0,0 +1,6 @@
import type { Options } from './types.js';
export declare function inspectAttribute([key, value]: [unknown, unknown], options: Options): string;
export declare function inspectNodeCollection(collection: ArrayLike<Node>, options: Options): string;
export declare function inspectNode(node: Node, options: Options): string;
export default function inspectHTML(element: Element, options: Options): string;
//# sourceMappingURL=html.d.ts.map

1
frontend/node_modules/loupe/lib/html.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"html.d.ts","sourceRoot":"","sources":["../src/html.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,YAAY,CAAA;AAElD,wBAAgB,gBAAgB,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,UAMlF;AAED,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,SAAS,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAE3F;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAShE;AAGD,MAAM,CAAC,OAAO,UAAU,WAAW,CAAC,OAAO,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAwB9E"}

42
frontend/node_modules/loupe/lib/html.js generated vendored Normal file
View File

@@ -0,0 +1,42 @@
import { inspectList, truncator } from './helpers.js';
export function inspectAttribute([key, value], options) {
options.truncate -= 3;
if (!value) {
return `${options.stylize(String(key), 'yellow')}`;
}
return `${options.stylize(String(key), 'yellow')}=${options.stylize(`"${value}"`, 'string')}`;
}
export function inspectNodeCollection(collection, options) {
return inspectList(collection, options, inspectNode, '\n');
}
export function inspectNode(node, options) {
switch (node.nodeType) {
case 1:
return inspectHTML(node, options);
case 3:
return options.inspect(node.data, options);
default:
return options.inspect(node, options);
}
}
// @ts-ignore (Deno doesn't have Element)
export default function inspectHTML(element, options) {
const properties = element.getAttributeNames();
const name = element.tagName.toLowerCase();
const head = options.stylize(`<${name}`, 'special');
const headClose = options.stylize(`>`, 'special');
const tail = options.stylize(`</${name}>`, 'special');
options.truncate -= name.length * 2 + 5;
let propertyContents = '';
if (properties.length > 0) {
propertyContents += ' ';
propertyContents += inspectList(properties.map((key) => [key, element.getAttribute(key)]), options, inspectAttribute, ' ');
}
options.truncate -= propertyContents.length;
const truncate = options.truncate;
let children = inspectNodeCollection(element.children, options);
if (children && children.length > truncate) {
children = `${truncator}(${element.children.length})`;
}
return `${head}${propertyContents}${headClose}${children}${tail}`;
}

7
frontend/node_modules/loupe/lib/index.d.ts generated vendored Normal file
View File

@@ -0,0 +1,7 @@
import type { Inspect, Options } from './types.js';
export declare function inspect(value: unknown, opts?: Partial<Options>): string;
export declare function registerConstructor(constructor: Function, inspector: Inspect): boolean;
export declare function registerStringTag(stringTag: string, inspector: Inspect): boolean;
export declare const custom: string | symbol;
export default inspect;
//# sourceMappingURL=index.d.ts.map

1
frontend/node_modules/loupe/lib/index.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAyBA,OAAO,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AA2FlD,wBAAgB,OAAO,CAAC,KAAK,EAAE,OAAO,EAAE,IAAI,GAAE,OAAO,CAAC,OAAO,CAAM,GAAG,MAAM,CAmD3E;AAED,wBAAgB,mBAAmB,CAAC,WAAW,EAAE,QAAQ,EAAE,SAAS,EAAE,OAAO,WAM5E;AAED,wBAAgB,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,OAAO,WAMtE;AAED,eAAO,MAAM,MAAM,iBAAc,CAAA;AAEjC,eAAe,OAAO,CAAA"}

152
frontend/node_modules/loupe/lib/index.js generated vendored Normal file
View File

@@ -0,0 +1,152 @@
/* !
* loupe
* Copyright(c) 2013 Jake Luer <jake@alogicalparadox.com>
* MIT Licensed
*/
import inspectArray from './array.js';
import inspectTypedArray from './typedarray.js';
import inspectDate from './date.js';
import inspectFunction from './function.js';
import inspectMap from './map.js';
import inspectNumber from './number.js';
import inspectBigInt from './bigint.js';
import inspectRegExp from './regexp.js';
import inspectSet from './set.js';
import inspectString from './string.js';
import inspectSymbol from './symbol.js';
import inspectPromise from './promise.js';
import inspectClass from './class.js';
import inspectObject from './object.js';
import inspectArguments from './arguments.js';
import inspectError from './error.js';
import inspectHTMLElement, { inspectNodeCollection } from './html.js';
import { normaliseOptions } from './helpers.js';
const symbolsSupported = typeof Symbol === 'function' && typeof Symbol.for === 'function';
const chaiInspect = symbolsSupported ? Symbol.for('chai/inspect') : '@@chai/inspect';
const nodeInspect = Symbol.for('nodejs.util.inspect.custom');
const constructorMap = new WeakMap();
const stringTagMap = {};
const baseTypesMap = {
undefined: (value, options) => options.stylize('undefined', 'undefined'),
null: (value, options) => options.stylize('null', 'null'),
boolean: (value, options) => options.stylize(String(value), 'boolean'),
Boolean: (value, options) => options.stylize(String(value), 'boolean'),
number: inspectNumber,
Number: inspectNumber,
bigint: inspectBigInt,
BigInt: inspectBigInt,
string: inspectString,
String: inspectString,
function: inspectFunction,
Function: inspectFunction,
symbol: inspectSymbol,
// A Symbol polyfill will return `Symbol` not `symbol` from typedetect
Symbol: inspectSymbol,
Array: inspectArray,
Date: inspectDate,
Map: inspectMap,
Set: inspectSet,
RegExp: inspectRegExp,
Promise: inspectPromise,
// WeakSet, WeakMap are totally opaque to us
WeakSet: (value, options) => options.stylize('WeakSet{…}', 'special'),
WeakMap: (value, options) => options.stylize('WeakMap{…}', 'special'),
Arguments: inspectArguments,
Int8Array: inspectTypedArray,
Uint8Array: inspectTypedArray,
Uint8ClampedArray: inspectTypedArray,
Int16Array: inspectTypedArray,
Uint16Array: inspectTypedArray,
Int32Array: inspectTypedArray,
Uint32Array: inspectTypedArray,
Float32Array: inspectTypedArray,
Float64Array: inspectTypedArray,
Generator: () => '',
DataView: () => '',
ArrayBuffer: () => '',
Error: inspectError,
HTMLCollection: inspectNodeCollection,
NodeList: inspectNodeCollection,
};
// eslint-disable-next-line complexity
const inspectCustom = (value, options, type) => {
if (chaiInspect in value && typeof value[chaiInspect] === 'function') {
return value[chaiInspect](options);
}
if (nodeInspect in value && typeof value[nodeInspect] === 'function') {
return value[nodeInspect](options.depth, options);
}
if ('inspect' in value && typeof value.inspect === 'function') {
return value.inspect(options.depth, options);
}
if ('constructor' in value && constructorMap.has(value.constructor)) {
return constructorMap.get(value.constructor)(value, options);
}
if (stringTagMap[type]) {
return stringTagMap[type](value, options);
}
return '';
};
const toString = Object.prototype.toString;
// eslint-disable-next-line complexity
export function inspect(value, opts = {}) {
const options = normaliseOptions(opts, inspect);
const { customInspect } = options;
let type = value === null ? 'null' : typeof value;
if (type === 'object') {
type = toString.call(value).slice(8, -1);
}
// If it is a base value that we already support, then use Loupe's inspector
if (type in baseTypesMap) {
return baseTypesMap[type](value, options);
}
// If `options.customInspect` is set to true then try to use the custom inspector
if (customInspect && value) {
const output = inspectCustom(value, options, type);
if (output) {
if (typeof output === 'string')
return output;
return inspect(output, options);
}
}
const proto = value ? Object.getPrototypeOf(value) : false;
// If it's a plain Object then use Loupe's inspector
if (proto === Object.prototype || proto === null) {
return inspectObject(value, options);
}
// Specifically account for HTMLElements
// @ts-ignore
if (value && typeof HTMLElement === 'function' && value instanceof HTMLElement) {
return inspectHTMLElement(value, options);
}
if ('constructor' in value) {
// If it is a class, inspect it like an object but add the constructor name
if (value.constructor !== Object) {
return inspectClass(value, options);
}
// If it is an object with an anonymous prototype, display it as an object.
return inspectObject(value, options);
}
// last chance to check if it's an object
if (value === Object(value)) {
return inspectObject(value, options);
}
// We have run out of options! Just stringify the value
return options.stylize(String(value), type);
}
export function registerConstructor(constructor, inspector) {
if (constructorMap.has(constructor)) {
return false;
}
constructorMap.set(constructor, inspector);
return true;
}
export function registerStringTag(stringTag, inspector) {
if (stringTag in stringTagMap) {
return false;
}
stringTagMap[stringTag] = inspector;
return true;
}
export const custom = chaiInspect;
export default inspect;

3
frontend/node_modules/loupe/lib/map.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectMap(map: Map<unknown, unknown>, options: Options): string;
//# sourceMappingURL=map.d.ts.map

1
frontend/node_modules/loupe/lib/map.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"map.d.ts","sourceRoot":"","sources":["../src/map.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,YAAY,CAAA;AAmBlD,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,EAAE,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAIvF"}

22
frontend/node_modules/loupe/lib/map.js generated vendored Normal file
View File

@@ -0,0 +1,22 @@
import { inspectList } from './helpers.js';
function inspectMapEntry([key, value], options) {
options.truncate -= 4;
key = options.inspect(key, options);
options.truncate -= key.length;
value = options.inspect(value, options);
return `${key} => ${value}`;
}
// IE11 doesn't support `map.entries()`
function mapToEntries(map) {
const entries = [];
map.forEach((value, key) => {
entries.push([key, value]);
});
return entries;
}
export default function inspectMap(map, options) {
if (map.size === 0)
return 'Map{}';
options.truncate -= 7;
return `Map{ ${inspectList(mapToEntries(map), options, inspectMapEntry)} }`;
}

3
frontend/node_modules/loupe/lib/number.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectNumber(number: number, options: Options): string;
//# sourceMappingURL=number.d.ts.map

1
frontend/node_modules/loupe/lib/number.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"number.d.ts","sourceRoot":"","sources":["../src/number.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAGzC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAc9E"}

17
frontend/node_modules/loupe/lib/number.js generated vendored Normal file
View File

@@ -0,0 +1,17 @@
import { truncate } from './helpers.js';
const isNaN = Number.isNaN || (i => i !== i); // eslint-disable-line no-self-compare
export default function inspectNumber(number, options) {
if (isNaN(number)) {
return options.stylize('NaN', 'number');
}
if (number === Infinity) {
return options.stylize('Infinity', 'number');
}
if (number === -Infinity) {
return options.stylize('-Infinity', 'number');
}
if (number === 0) {
return options.stylize(1 / number === Infinity ? '+0' : '-0', 'number');
}
return options.stylize(truncate(String(number), options.truncate), 'number');
}

3
frontend/node_modules/loupe/lib/object.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectObject(object: object, options: Options): string;
//# sourceMappingURL=object.d.ts.map

1
frontend/node_modules/loupe/lib/object.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"object.d.ts","sourceRoot":"","sources":["../src/object.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,YAAY,CAAA;AAElD,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CA4B9E"}

22
frontend/node_modules/loupe/lib/object.js generated vendored Normal file
View File

@@ -0,0 +1,22 @@
import { inspectList, inspectProperty } from './helpers.js';
export default function inspectObject(object, options) {
const properties = Object.getOwnPropertyNames(object);
const symbols = Object.getOwnPropertySymbols ? Object.getOwnPropertySymbols(object) : [];
if (properties.length === 0 && symbols.length === 0) {
return '{}';
}
options.truncate -= 4;
options.seen = options.seen || [];
if (options.seen.includes(object)) {
return '[Circular]';
}
options.seen.push(object);
const propertyContents = inspectList(properties.map(key => [key, object[key]]), options, inspectProperty);
const symbolContents = inspectList(symbols.map(key => [key, object[key]]), options, inspectProperty);
options.seen.pop();
let sep = '';
if (propertyContents && symbolContents) {
sep = ', ';
}
return `{ ${propertyContents}${sep}${symbolContents} }`;
}

5
frontend/node_modules/loupe/lib/promise.d.ts generated vendored Normal file
View File

@@ -0,0 +1,5 @@
import type { Options } from './types.js';
type GetPromiseValue = (value: Promise<unknown>, options: Options) => string;
declare let getPromiseValue: GetPromiseValue;
export default getPromiseValue;
//# sourceMappingURL=promise.d.ts.map

1
frontend/node_modules/loupe/lib/promise.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"promise.d.ts","sourceRoot":"","sources":["../src/promise.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AACzC,KAAK,eAAe,GAAG,CAAC,KAAK,EAAE,OAAO,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAA;AAC5E,QAAA,IAAI,eAAe,EAAE,eAAoC,CAAA;AAgBzD,eAAe,eAAe,CAAA"}

18
frontend/node_modules/loupe/lib/promise.js generated vendored Normal file
View File

@@ -0,0 +1,18 @@
let getPromiseValue = () => 'Promise{…}';
try {
// @ts-ignore
const { getPromiseDetails, kPending, kRejected } = process.binding('util');
if (Array.isArray(getPromiseDetails(Promise.resolve()))) {
getPromiseValue = (value, options) => {
const [state, innerValue] = getPromiseDetails(value);
if (state === kPending) {
return 'Promise{<pending>}';
}
return `Promise${state === kRejected ? '!' : ''}{${options.inspect(innerValue, options)}}`;
};
}
}
catch (notNode) {
/* ignore */
}
export default getPromiseValue;

3
frontend/node_modules/loupe/lib/regexp.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectRegExp(value: RegExp, options: Options): string;
//# sourceMappingURL=regexp.d.ts.map

1
frontend/node_modules/loupe/lib/regexp.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"regexp.d.ts","sourceRoot":"","sources":["../src/regexp.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAEzC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAK7E"}

7
frontend/node_modules/loupe/lib/regexp.js generated vendored Normal file
View File

@@ -0,0 +1,7 @@
import { truncate } from './helpers.js';
export default function inspectRegExp(value, options) {
const flags = value.toString().split('/')[2];
const sourceLength = options.truncate - (2 + flags.length);
const source = value.source;
return options.stylize(`/${truncate(source, sourceLength)}/${flags}`, 'regexp');
}

3
frontend/node_modules/loupe/lib/set.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectSet(set: Set<unknown>, options: Options): string;
//# sourceMappingURL=set.d.ts.map

1
frontend/node_modules/loupe/lib/set.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"set.d.ts","sourceRoot":"","sources":["../src/set.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AAWzC,MAAM,CAAC,OAAO,UAAU,UAAU,CAAC,GAAG,EAAE,GAAG,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAI9E"}

15
frontend/node_modules/loupe/lib/set.js generated vendored Normal file
View File

@@ -0,0 +1,15 @@
import { inspectList } from './helpers.js';
// IE11 doesn't support `Array.from(set)`
function arrayFromSet(set) {
const values = [];
set.forEach(value => {
values.push(value);
});
return values;
}
export default function inspectSet(set, options) {
if (set.size === 0)
return 'Set{}';
options.truncate -= 7;
return `Set{ ${inspectList(arrayFromSet(set), options)} }`;
}

3
frontend/node_modules/loupe/lib/string.d.ts generated vendored Normal file
View File

@@ -0,0 +1,3 @@
import type { Options } from './types.js';
export default function inspectString(string: string, options: Options): string;
//# sourceMappingURL=string.d.ts.map

1
frontend/node_modules/loupe/lib/string.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"string.d.ts","sourceRoot":"","sources":["../src/string.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,YAAY,CAAA;AA2BzC,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CAK9E"}

24
frontend/node_modules/loupe/lib/string.js generated vendored Normal file
View File

@@ -0,0 +1,24 @@
import { truncate } from './helpers.js';
const stringEscapeChars = new RegExp("['\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u0600-\\u0604\\u070f\\u17b4\\u17b5" +
'\\u200c-\\u200f\\u2028-\\u202f\\u2060-\\u206f\\ufeff\\ufff0-\\uffff]', 'g');
const escapeCharacters = {
'\b': '\\b',
'\t': '\\t',
'\n': '\\n',
'\f': '\\f',
'\r': '\\r',
"'": "\\'",
'\\': '\\\\',
};
const hex = 16;
const unicodeLength = 4;
function escape(char) {
return (escapeCharacters[char] ||
`\\u${`0000${char.charCodeAt(0).toString(hex)}`.slice(-unicodeLength)}`);
}
export default function inspectString(string, options) {
if (stringEscapeChars.test(string)) {
string = string.replace(stringEscapeChars, escape);
}
return options.stylize(`'${truncate(string, options.truncate - 2)}'`, 'string');
}

2
frontend/node_modules/loupe/lib/symbol.d.ts generated vendored Normal file
View File

@@ -0,0 +1,2 @@
export default function inspectSymbol(value: Symbol): string;
//# sourceMappingURL=symbol.d.ts.map

1
frontend/node_modules/loupe/lib/symbol.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"symbol.d.ts","sourceRoot":"","sources":["../src/symbol.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,OAAO,UAAU,aAAa,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAK3D"}

6
frontend/node_modules/loupe/lib/symbol.js generated vendored Normal file
View File

@@ -0,0 +1,6 @@
export default function inspectSymbol(value) {
if ('description' in Symbol.prototype) {
return value.description ? `Symbol(${value.description})` : 'Symbol()';
}
return value.toString();
}

5
frontend/node_modules/loupe/lib/typedarray.d.ts generated vendored Normal file
View File

@@ -0,0 +1,5 @@
import type { Options } from './types.js';
type TypedArray = Int8Array | Uint8Array | Uint8ClampedArray | Int16Array | Uint16Array | Int32Array | Uint32Array | Float32Array | Float64Array;
export default function inspectTypedArray(array: TypedArray, options: Options): string;
export {};
//# sourceMappingURL=typedarray.d.ts.map

1
frontend/node_modules/loupe/lib/typedarray.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"typedarray.d.ts","sourceRoot":"","sources":["../src/typedarray.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAW,OAAO,EAAE,MAAM,YAAY,CAAA;AAElD,KAAK,UAAU,GACX,SAAS,GACT,UAAU,GACV,iBAAiB,GACjB,UAAU,GACV,WAAW,GACX,UAAU,GACV,WAAW,GACX,YAAY,GACZ,YAAY,CAAA;AAchB,MAAM,CAAC,OAAO,UAAU,iBAAiB,CAAC,KAAK,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,MAAM,CA8BrF"}

38
frontend/node_modules/loupe/lib/typedarray.js generated vendored Normal file
View File

@@ -0,0 +1,38 @@
import { inspectList, inspectProperty, truncate, truncator } from './helpers.js';
const getArrayName = (array) => {
// We need to special case Node.js' Buffers, which report to be Uint8Array
// @ts-ignore
if (typeof Buffer === 'function' && array instanceof Buffer) {
return 'Buffer';
}
if (array[Symbol.toStringTag]) {
return array[Symbol.toStringTag];
}
return array.constructor.name;
};
export default function inspectTypedArray(array, options) {
const name = getArrayName(array);
options.truncate -= name.length + 4;
// Object.keys will always output the Array indices first, so we can slice by
// `array.length` to get non-index properties
const nonIndexProperties = Object.keys(array).slice(array.length);
if (!array.length && !nonIndexProperties.length)
return `${name}[]`;
// As we know TypedArrays only contain Unsigned Integers, we can skip inspecting each one and simply
// stylise the toString() value of them
let output = '';
for (let i = 0; i < array.length; i++) {
const string = `${options.stylize(truncate(array[i], options.truncate), 'number')}${i === array.length - 1 ? '' : ', '}`;
options.truncate -= string.length;
if (array[i] !== array.length && options.truncate <= 3) {
output += `${truncator}(${array.length - array[i] + 1})`;
break;
}
output += string;
}
let propertyContents = '';
if (nonIndexProperties.length) {
propertyContents = inspectList(nonIndexProperties.map(key => [key, array[key]]), options, inspectProperty);
}
return `${name}[ ${output}${propertyContents ? `, ${propertyContents}` : ''} ]`;
}

15
frontend/node_modules/loupe/lib/types.d.ts generated vendored Normal file
View File

@@ -0,0 +1,15 @@
export type Inspect = (value: unknown, options: Options) => string;
export interface Options {
showHidden: boolean;
depth: number;
colors: boolean;
customInspect: boolean;
showProxy: boolean;
maxArrayLength: number;
breakLength: number;
truncate: number;
seen: unknown[];
inspect: Inspect;
stylize: (value: string, styleType: string) => string;
}
//# sourceMappingURL=types.d.ts.map

1
frontend/node_modules/loupe/lib/types.d.ts.map generated vendored Normal file
View File

@@ -0,0 +1 @@
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,OAAO,GAAG,CAAC,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,OAAO,KAAK,MAAM,CAAA;AAElE,MAAM,WAAW,OAAO;IACtB,UAAU,EAAE,OAAO,CAAA;IACnB,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,OAAO,CAAA;IACf,aAAa,EAAE,OAAO,CAAA;IACtB,SAAS,EAAE,OAAO,CAAA;IAClB,cAAc,EAAE,MAAM,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;IACnB,QAAQ,EAAE,MAAM,CAAA;IAChB,IAAI,EAAE,OAAO,EAAE,CAAA;IACf,OAAO,EAAE,OAAO,CAAA;IAChB,OAAO,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,KAAK,MAAM,CAAA;CACtD"}

1
frontend/node_modules/loupe/lib/types.js generated vendored Normal file
View File

@@ -0,0 +1 @@
export {};