From 0999a981a793acbe44f81439755f45a8fd7b3428 Mon Sep 17 00:00:00 2001 From: lee00678 Date: Tue, 16 Apr 2024 14:40:32 -0700 Subject: [PATCH 1/6] Website | Gallery: Update Basic Grouped Bar Chart Legend --- .../examples/basic-grouped-bar/basic-grouped-bar.component.ts | 4 ++-- .../examples/basic-grouped-bar/basic-grouped-bar.svelte | 4 ++-- .../shared/examples/basic-grouped-bar/basic-grouped-bar.ts | 4 ++-- .../shared/examples/basic-grouped-bar/basic-grouped-bar.tsx | 4 ++-- .../shared/examples/basic-grouped-bar/basic-grouped-bar.vue | 4 ++-- packages/shared/examples/basic-grouped-bar/data.ts | 4 ++++ 6 files changed, 14 insertions(+), 10 deletions(-) diff --git a/packages/shared/examples/basic-grouped-bar/basic-grouped-bar.component.ts b/packages/shared/examples/basic-grouped-bar/basic-grouped-bar.component.ts index af8d50ef8..90f886b63 100644 --- a/packages/shared/examples/basic-grouped-bar/basic-grouped-bar.component.ts +++ b/packages/shared/examples/basic-grouped-bar/basic-grouped-bar.component.ts @@ -1,5 +1,5 @@ import { Component } from '@angular/core' -import { data, colors, ElectionDatum } from './data' +import { data, colors, capitalize, ElectionDatum } from './data' @Component({ selector: 'basic-grouped-bar', @@ -17,7 +17,7 @@ export class BasicGroupedBarComponent { data = data legendItems = Object.entries(colors).map(([n, c]) => ({ - name: n.toUpperCase(), + name: capitalize(n), color: c, })) diff --git a/packages/shared/examples/basic-grouped-bar/basic-grouped-bar.svelte b/packages/shared/examples/basic-grouped-bar/basic-grouped-bar.svelte index 84d11a393..b80051d07 100644 --- a/packages/shared/examples/basic-grouped-bar/basic-grouped-bar.svelte +++ b/packages/shared/examples/basic-grouped-bar/basic-grouped-bar.svelte @@ -1,9 +1,9 @@ + +

The Rise and Rise of A.I. Large Language Models

+ + + + + + + diff --git a/packages/shared/examples/shaped-scatter-plot/shaped-scatter-plot.ts b/packages/shared/examples/shaped-scatter-plot/shaped-scatter-plot.ts new file mode 100644 index 000000000..22b823923 --- /dev/null +++ b/packages/shared/examples/shaped-scatter-plot/shaped-scatter-plot.ts @@ -0,0 +1,43 @@ +import { Axis, BulletLegend, Position, Scale, Scatter, Tooltip, XYContainer, colors } from '@unovis/ts' +import { data, DataRecord, shapes, categories, sumCategories } from './data' + +const shapeScale = Scale.scaleOrdinal(shapes).domain(categories) +const colorScale = Scale.scaleOrdinal(colors).domain(categories) +const container = document.getElementById('vis-container') + +const title = document.createElement('h2') +title.innerText = 'The Rise and Rise of A.I. Large Language Models' +container.append(title) + +const legend = new BulletLegend(container, { + items: categories.map(v => ({ name: v, shape: shapeScale(v) })), +}) + +const scatter = new Scatter({ + x: (d: DataRecord) => +(new Date(d.date)), + y: (d: DataRecord) => d.trainedParam, + color: (d: DataRecord) => colorScale(sumCategories(d.owner)), + shape: (d: DataRecord) => shapeScale(sumCategories(d.owner)), + size: 15, + label: (d: DataRecord) => d.name, + cursor: 'pointer', +}) + +const chart = new XYContainer(container, { + height: 600, + components: [scatter], + tooltip: new Tooltip({ + triggers: { + [Scatter.selectors.point]: (d: DataRecord) => ` + name: ${d.name}
+ owner: ${d.owner}
+ bn parameters: ${d.trainedParam}`, + }, + }), + xAxis: new Axis({ + label: 'Date Released', + tickFormat: Intl.DateTimeFormat('en', { month: 'long', year: 'numeric' }).format, + tickPadding: 0, + }), + yAxis: new Axis({ label: 'Billion Parameters', tickPadding: 0 }), +}, data) diff --git a/packages/shared/examples/shaped-scatter-plot/shaped-scatter-plot.tsx b/packages/shared/examples/shaped-scatter-plot/shaped-scatter-plot.tsx new file mode 100644 index 000000000..254a9118e --- /dev/null +++ b/packages/shared/examples/shaped-scatter-plot/shaped-scatter-plot.tsx @@ -0,0 +1,39 @@ +import React, { useCallback } from 'react' +import { Position, Scale, Scatter, colors } from '@unovis/ts' +import { VisAxis, VisBulletLegend, VisScatter, VisTooltip, VisXYContainer } from '@unovis/react' +import { data, DataRecord, shapes, categories, sumCategories } from './data' + +const shapeScale = Scale.scaleOrdinal(shapes).domain(categories) +const colorScale = Scale.scaleOrdinal(colors).domain(categories) + +export default function ShapedScatterPlot (): JSX.Element { + const legendItems = categories.map(v => ({ name: v, shape: shapeScale(v) })) + const tooltipTriggers = { + [Scatter.selectors.point]: (d: DataRecord) => ` + name: ${d.name}
+ owner: ${d.owner}
+ bn parameters: ${d.trainedParam}`, + } + return ( + <> +

The Rise and Rise of A.I. Large Language Models

+ + + +(new Date(d.date)), [])} + y={useCallback((d: DataRecord) => d.trainedParam, [])} + shape={useCallback((d: DataRecord) => shapeScale(sumCategories(d.owner)), [])} + size={15} + label={useCallback((d: DataRecord) => d.name, [])} + labelHideOverlapping={true} + cursor='pointer' + color={useCallback((d: DataRecord) => colorScale(sumCategories(d.owner)), [])} + /> + + + + + + ) +} diff --git a/packages/shared/examples/shaped-scatter-plot/shaped-scatter-plot.vue b/packages/shared/examples/shaped-scatter-plot/shaped-scatter-plot.vue new file mode 100644 index 000000000..9d6491dd2 --- /dev/null +++ b/packages/shared/examples/shaped-scatter-plot/shaped-scatter-plot.vue @@ -0,0 +1,35 @@ + + + diff --git a/packages/svelte/src-demo/svelte-gallery.svelte b/packages/svelte/src-demo/svelte-gallery.svelte index c89ad0a4f..bfba47781 100644 --- a/packages/svelte/src-demo/svelte-gallery.svelte +++ b/packages/svelte/src-demo/svelte-gallery.svelte @@ -27,6 +27,7 @@ () => import('@unovis/shared/examples/hierarchical-chord-diagram/hierarchical-chord-diagram.svelte'), () => import('@unovis/shared/examples/sunburst-nested-donut/sunburst-nested-donut.svelte'), () => import('@unovis/shared/examples/basic-donut-chart/basic-donut-chart.svelte'), + () => import('@unovis/shared/examples/shaped-scatter-plot/shaped-scatter-plot.svelte'), ] diff --git a/packages/vue/src-demo/App.vue b/packages/vue/src-demo/App.vue index e11f15681..f06dee997 100644 --- a/packages/vue/src-demo/App.vue +++ b/packages/vue/src-demo/App.vue @@ -29,6 +29,7 @@ const imports = [ defineAsyncComponent(() => import('@unovis/shared/examples/hierarchical-chord-diagram/hierarchical-chord-diagram.vue')), defineAsyncComponent(() => import('@unovis/shared/examples/sunburst-nested-donut/sunburst-nested-donut.vue')), defineAsyncComponent(() => import('@unovis/shared/examples/basic-donut-chart/basic-donut-chart.vue')), + defineAsyncComponent(() => import('@unovis/shared/examples/shaped-scatter-plot/shaped-scatter-plot.vue')), ] From c1abe442d12c802d0c8959090eb479bd1da2c244 Mon Sep 17 00:00:00 2001 From: Rebecca Bol Date: Fri, 19 Apr 2024 15:28:42 -0700 Subject: [PATCH 3/6] Shared | Components: Include standalone components in component list unovis/issues-only#41 --- packages/shared/integrations/components.ts | 20 ++++++++++---------- packages/shared/integrations/types.ts | 3 ++- packages/svelte/autogen/index.ts | 12 ++---------- packages/vue/autogen/index.ts | 12 ++---------- 4 files changed, 16 insertions(+), 31 deletions(-) diff --git a/packages/shared/integrations/components.ts b/packages/shared/integrations/components.ts index 9c62da3b8..400e64d1e 100644 --- a/packages/shared/integrations/components.ts +++ b/packages/shared/integrations/components.ts @@ -6,33 +6,33 @@ export function getComponentList ( ): (AngularComponentInput | ReactComponentInput | SvelteComponentInput | VueComponentInput)[] { return [ // XY Components - { name: 'Line', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/line'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, { name: 'Area', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/area'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, { name: 'Axis', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/axis'], dataType: 'Datum[]', angularProvide: 'VisXYComponent', elementSuffix: 'axis' }, { name: 'Brush', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/brush'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, - { name: 'FreeBrush', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/free-brush'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, { name: 'Crosshair', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/crosshair'], dataType: 'Datum[]', angularProvide: 'VisXYComponent', elementSuffix: 'crosshair' }, + { name: 'FreeBrush', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/free-brush'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, { name: 'GroupedBar', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/grouped-bar'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, + { name: 'Line', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/line'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, { name: 'Scatter', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/scatter'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, { name: 'StackedBar', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/stacked-bar'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, { name: 'Timeline', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/timeline'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, { name: 'XYLabels', sources: [coreComponentConfigPath, xyComponentConfigPath, '/components/xy-labels'], dataType: 'Datum[]', angularProvide: 'VisXYComponent' }, // Single components + { name: 'ChordDiagram', sources: [coreComponentConfigPath, '/components/chord-diagram'], dataType: '{ nodes: N[]; links?: L[] }', angularProvide: 'VisCoreComponent' }, { name: 'Donut', sources: [coreComponentConfigPath, '/components/donut'], dataType: 'Datum[]', angularProvide: 'VisCoreComponent' }, - { name: 'TopoJSONMap', kebabCaseName: 'topojson-map', sources: [coreComponentConfigPath, '/components/topojson-map'], dataType: '{areas?: AreaDatum[]; points?: PointDatum[]; links?: LinkDatum[]}', angularProvide: 'VisCoreComponent' }, - { name: 'Sankey', sources: [coreComponentConfigPath, '/components/sankey'], dataType: '{ nodes: N[]; links?: L[] }', angularProvide: 'VisCoreComponent' }, { name: 'Graph', sources: [coreComponentConfigPath, '/components/graph'], dataType: '{ nodes: N[]; links?: L[] }', angularProvide: 'VisCoreComponent' }, - { name: 'ChordDiagram', sources: [coreComponentConfigPath, '/components/chord-diagram'], dataType: '{ nodes: N[]; links?: L[] }', angularProvide: 'VisCoreComponent' }, { name: 'NestedDonut', sources: [coreComponentConfigPath, '/components/nested-donut'], dataType: 'Datum[]', angularProvide: 'VisCoreComponent' }, + { name: 'Sankey', sources: [coreComponentConfigPath, '/components/sankey'], dataType: '{ nodes: N[]; links?: L[] }', angularProvide: 'VisCoreComponent' }, + { name: 'TopoJSONMap', kebabCaseName: 'topojson-map', sources: [coreComponentConfigPath, '/components/topojson-map'], dataType: '{areas?: AreaDatum[]; points?: PointDatum[]; links?: LinkDatum[]}', angularProvide: 'VisCoreComponent' }, // Ancillary components { name: 'Tooltip', sources: ['/components/tooltip'], dataType: null, angularProvide: 'VisGenericComponent', elementSuffix: 'tooltip' }, - { name: 'Annotations', sources: [coreComponentConfigPath, '/components/annotations'], dataType: null, elementSuffix: 'annotations', angularProvide: 'VisGenericComponent' }, + { name: 'Annotations', sources: [coreComponentConfigPath, '/components/annotations'], dataType: null, angularProvide: 'VisGenericComponent', elementSuffix: 'annotations' }, - // Unique cases (you can still generate a wrapper for these components, but most likely it will require some changes) - // { name: 'LeafletMap', sources: [coreComponentConfigPath, '/components/leaflet-map'], dataType: 'Datum[]', angularProvide: 'VisCoreComponent', svelteStyles: ['display:block', 'position:relative'] }, - // { name: 'LeafletFlowMap', sources: [coreComponentConfigPath, '/components/leaflet-map', '/components/leaflet-flow-map'], dataType: '{ points: PointDatum[]; flows?: FlowDatum[] }', svelteStyles: ['display:block', 'position:relative'] }, - // { name: 'BulletLegend', sources: ['/components/bullet-legend'], dataType: null, angularProvide: 'VisGenericComponent', svelteStyles: ['display:block'] }, + // Standalone components + { name: 'LeafletMap', sources: [coreComponentConfigPath, '/components/leaflet-map'], dataType: 'Datum[]', isStandAlone: true, angularProvide: 'VisCoreComponent', svelteStyles: ['display:block', 'position:relative'], vueStyles: ['display:block', 'position:relative'] }, + { name: 'LeafletFlowMap', sources: [coreComponentConfigPath, '/components/leaflet-map', '/components/leaflet-flow-map'], dataType: '{ points: PointDatum[]; flows?: FlowDatum[] }', isStandAlone: true, svelteStyles: ['display:block', 'position:relative'], vueStyles: ['display:block', 'position:relative'] }, + { name: 'BulletLegend', sources: ['/components/bullet-legend'], dataType: null, angularProvide: 'VisGenericComponent', isStandAlone: true, svelteStyles: ['display:block'], vueStyles: ['display:block'] }, ] } diff --git a/packages/shared/integrations/types.ts b/packages/shared/integrations/types.ts index 6a604fcbc..1c52e0f4c 100644 --- a/packages/shared/integrations/types.ts +++ b/packages/shared/integrations/types.ts @@ -18,8 +18,9 @@ export type ComponentInput = { name: string; sources: string[]; kebabCaseName?: string; - dataType?: string; + dataType?: string | null; elementSuffix?: string; + isStandAlone?: boolean; } export type ReactComponentInput = ComponentInput diff --git a/packages/svelte/autogen/index.ts b/packages/svelte/autogen/index.ts index 32883b5c2..13924aa28 100644 --- a/packages/svelte/autogen/index.ts +++ b/packages/svelte/autogen/index.ts @@ -13,23 +13,15 @@ import { getImportStatements, kebabCase, getConfigSummary } from '@unovis/shared // Component Code import { getComponentCode } from './component' - -const coreComponentConfigPath = '/core/component' -const htmlElements = ['BulletLegend', 'LeafletMap', 'LeafletFlowMap'] const skipProperties = ['width', 'height'] -const components = [ - ...getComponentList(), - { name: 'LeafletMap', sources: [coreComponentConfigPath, '/components/leaflet-map'], dataType: 'Datum[]', svelteStyles: ['display:block', 'position:relative'] }, - { name: 'LeafletFlowMap', sources: [coreComponentConfigPath, '/components/leaflet-map', '/components/leaflet-flow-map'], dataType: '{ points: PointDatum[]; flows?: FlowDatum[] }', svelteStyles: ['display:block', 'position:relative'] }, - { name: 'BulletLegend', sources: ['/components/bullet-legend'], dataType: null, svelteStyles: ['display:block'] }, -] as SvelteComponentInput[] +const components = getComponentList() as SvelteComponentInput[] const exports: string[] = [] for (const component of components) { const { configProperties, configInterfaceMembers, generics, statements } = getConfigSummary(component, skipProperties) const importStatements = getImportStatements(component.name, statements, configInterfaceMembers, generics) - const isStandAlone = htmlElements.includes(component.name) + const isStandAlone = component.isStandAlone const componentCode = getComponentCode( component.name, generics, diff --git a/packages/vue/autogen/index.ts b/packages/vue/autogen/index.ts index 08c760068..1b4f131d0 100644 --- a/packages/vue/autogen/index.ts +++ b/packages/vue/autogen/index.ts @@ -13,23 +13,15 @@ import { getImportStatements, kebabCase, getConfigSummary } from '@unovis/shared // Component Code import { getComponentCode } from './component' -const coreComponentConfigPath = '/core/component' -const htmlElements = ['BulletLegend', 'LeafletMap', 'LeafletFlowMap'] const skipProperties = ['width', 'height'] -const components = [ - ...getComponentList(), - { name: 'LeafletMap', sources: [coreComponentConfigPath, '/components/leaflet-map'], dataType: 'Datum[]', vueStyles: ['display:block', 'position:relative'] }, - // eslint-disable-next-line max-len - { name: 'LeafletFlowMap', sources: [coreComponentConfigPath, '/components/leaflet-map', '/components/leaflet-flow-map'], dataType: '{ points: PointDatum[]; flows?: FlowDatum[] }', vueStyles: ['display:block', 'position:relative'] }, - { name: 'BulletLegend', sources: ['/components/bullet-legend'], dataType: null, vueStyles: ['display:block'] }, -] as VueComponentInput[] +const components = getComponentList() as VueComponentInput[] const exports: string[] = [] for (const component of components) { const { configProperties, configInterfaceMembers, generics, statements } = getConfigSummary(component, skipProperties) const importStatements = getImportStatements(component.name, statements, configInterfaceMembers, generics) - const isStandAlone = htmlElements.includes(component.name) + const isStandAlone = component.isStandAlone const componentCode = getComponentCode( component.name, generics, From 1b14287e4c7b6a4aafb0db15183aee2d26317907 Mon Sep 17 00:00:00 2001 From: Rebecca Bol Date: Fri, 19 Apr 2024 15:36:07 -0700 Subject: [PATCH 4/6] React | Autogen: Adding support for standalone components unovis/issues-only#41 --- packages/react/autogen/component.ts | 51 ++++++++++--------- packages/react/autogen/index.ts | 5 +- .../src/components/annotations/index.tsx | 5 +- .../html-components/bullet-legend/index.tsx | 29 ++++++++--- .../leaflet-flow-map/index.tsx | 50 +++++++----------- .../src/html-components/leaflet-map/index.tsx | 34 +++++++------ 6 files changed, 94 insertions(+), 80 deletions(-) diff --git a/packages/react/autogen/component.ts b/packages/react/autogen/component.ts index af6ce7701..a507fd0d5 100644 --- a/packages/react/autogen/component.ts +++ b/packages/react/autogen/component.ts @@ -5,61 +5,66 @@ export function getComponentCode ( generics: GenericParameter[] | undefined, importStatements: { source: string; elements: string[] }[], dataType: string | null = 'any', - elementSuffix = 'component' + elementSuffix = 'component', + isStandAlone = false ): string { const genericsStr = generics ? `<${generics?.map(g => g.name).join(', ')}>` : '' const genericsDefStr = generics ? `<${generics?.map(g => g.name + (g.extends ? ` extends ${g.extends}` : '') + (g.default ? ` = ${g.default}` : '')).join(', ')}>` : '' + const componentType = `${componentName}${genericsStr}` + const refType = isStandAlone ? 'HTMLDivElement' : `VisComponentElement<${componentType}>` + const onDestroy = isStandAlone ? 'c?.destroy()' : `{ + componentRef.current = undefined + c.destroy() + }` return `// !!! This code was automatically generated. You should not change it !!! import React, { ForwardedRef, Ref, useImperativeHandle, useEffect, useRef, useState } from 'react' ${importStatements.map(s => `import { ${s.elements.join(', ')} } from '${s.source}'`).join('\n')} // Utils import { arePropsEqual } from 'src/utils/react' - -// Types -import { VisComponentElement } from 'src/types/dom' - +${isStandAlone ? '' : '\n// Types\nimport { VisComponentElement } from \'src/types/dom\'\n'} export type Vis${componentName}Ref${genericsDefStr} = { - component?: ${componentName}${genericsStr} + component?: ${componentType}; } export type Vis${componentName}Props${genericsDefStr} = ${componentName}ConfigInterface${genericsStr} & { data?: ${dataType}; - ref?: Ref + ref?: Ref;${isStandAlone ? '\nclassName?: string;' : ''} } export const Vis${componentName}Selectors = ${componentName}.selectors // eslint-disable-next-line @typescript-eslint/naming-convention function Vis${componentName}FC${genericsDefStr} (props: Vis${componentName}Props${genericsStr}, fRef: ForwardedRef): JSX.Element { - const ref = useRef>(null) - const componentRef = useRef<${componentName}${genericsStr} | undefined>(undefined) + const ref = useRef<${refType}>(null) + const ${isStandAlone ? `[component, setComponent] = useState<${componentType}>()` : `componentRef = useRef<${componentType} | undefined>(undefined)`} // On Mount useEffect(() => { - const element = (ref.current as VisComponentElement<${componentName}${genericsStr}>) - - const c = new ${componentName}${genericsStr}(props) - componentRef.current = c - element.__component__ = c - - return () => { - componentRef.current = undefined - c.destroy() - } + ${(isStandAlone ? [ + `const c = new ${componentType}(ref.current as HTMLDivElement, props${dataType ? ', props.data' : ''})`, + 'setComponent(c)', + ] : [ + `const element = (ref.current as VisComponentElement<${componentType}>)\n`, + `const c = new ${componentType}(props)`, + 'componentRef.current = c', + 'element.__component__ = c', + ]).join('\n ')} + + return () => ${onDestroy} }, []) // On Props Update useEffect(() => { - const component = componentRef.current + ${isStandAlone ? '' : 'const component = componentRef.current'} ${dataType ? 'if (props.data) component?.setData(props.data)' : ''} - component?.setConfig(props) + component?.${componentName === 'BulletLegend' ? 'update ' : 'setConfig'}(props) }) - useImperativeHandle(fRef, () => ({ get component () { return componentRef.current } }), []) - return + useImperativeHandle(fRef, () => ({ get component () { return component${isStandAlone ? '' : 'ref.current'} } }), []) + return <${isStandAlone ? 'div className={props.className}' : `vis-${elementSuffix}`} ref={ref} /> } // We export a memoized component to avoid unnecessary re-renders diff --git a/packages/react/autogen/index.ts b/packages/react/autogen/index.ts index 25dbef2fe..cf15b7b2f 100644 --- a/packages/react/autogen/index.ts +++ b/packages/react/autogen/index.ts @@ -25,11 +25,12 @@ for (const component of components) { generics, importStatements, component.dataType, - component.elementSuffix + component.elementSuffix, + component.isStandAlone ) const nameKebabCase = component.kebabCaseName ?? kebabCase(component.name) - const pathComponentBase = `src/components/${nameKebabCase}` + const pathComponentBase = `src/${component.isStandAlone ? 'html-' : ''}components/${nameKebabCase}` const pathComponent = `${pathComponentBase}/index.tsx` // `${pathComponentBase}/${nameKebabCase}.component.tsx` exec(`mkdir ${pathComponentBase}`, () => { diff --git a/packages/react/src/components/annotations/index.tsx b/packages/react/src/components/annotations/index.tsx index df8d5b3f0..86cff70da 100644 --- a/packages/react/src/components/annotations/index.tsx +++ b/packages/react/src/components/annotations/index.tsx @@ -17,6 +17,8 @@ export type VisAnnotationsProps = AnnotationsConfigInterface & { ref?: Ref; } +export const VisAnnotationsSelectors = Annotations.selectors + // eslint-disable-next-line @typescript-eslint/naming-convention function VisAnnotationsFC (props: VisAnnotationsProps, fRef: ForwardedRef): JSX.Element { const ref = useRef>(null) @@ -39,10 +41,11 @@ function VisAnnotationsFC (props: VisAnnotationsProps, fRef: ForwardedRef { const component = componentRef.current + component?.setConfig(props) }) - useImperativeHandle(fRef, () => ({ component: componentRef.current }), [componentRef.current]) + useImperativeHandle(fRef, () => ({ get component () { return componentRef.current } }), []) return } diff --git a/packages/react/src/html-components/bullet-legend/index.tsx b/packages/react/src/html-components/bullet-legend/index.tsx index f56ff23e6..c94a93cb9 100644 --- a/packages/react/src/html-components/bullet-legend/index.tsx +++ b/packages/react/src/html-components/bullet-legend/index.tsx @@ -1,18 +1,30 @@ -import React, { useEffect, useRef, useState } from 'react' +// !!! This code was automatically generated. You should not change it !!! +import React, { ForwardedRef, Ref, useImperativeHandle, useEffect, useRef, useState } from 'react' import { BulletLegend, BulletLegendConfigInterface } from '@unovis/ts' -export type VisBulletLegendProps = BulletLegendConfigInterface +// Utils +import { arePropsEqual } from 'src/utils/react' + +export type VisBulletLegendRef = { + component?: BulletLegend; +} + +export type VisBulletLegendProps = BulletLegendConfigInterface & { + data?: null; + ref?: Ref; + className?: string; +} export const VisBulletLegendSelectors = BulletLegend.selectors // eslint-disable-next-line @typescript-eslint/naming-convention -export function VisBulletLegend (props: VisBulletLegendProps): JSX.Element { - const container = useRef(null) +function VisBulletLegendFC (props: VisBulletLegendProps, fRef: ForwardedRef): JSX.Element { + const ref = useRef(null) const [component, setComponent] = useState() // On Mount useEffect(() => { - const c = new BulletLegend(container.current as HTMLDivElement, props) + const c = new BulletLegend(ref.current as HTMLDivElement, props) setComponent(c) return () => c?.destroy() @@ -23,5 +35,10 @@ export function VisBulletLegend (props: VisBulletLegendProps): JSX.Element { component?.update(props) }) - return
+ useImperativeHandle(fRef, () => ({ get component () { return component } }), []) + return
} + +// We export a memoized component to avoid unnecessary re-renders +// and define its type explicitly to help react-docgen-typescript to extract information about props +export const VisBulletLegend: ((props: VisBulletLegendProps) => JSX.Element | null) = React.memo(React.forwardRef(VisBulletLegendFC), arePropsEqual) diff --git a/packages/react/src/html-components/leaflet-flow-map/index.tsx b/packages/react/src/html-components/leaflet-flow-map/index.tsx index 285edede6..5107ea57d 100644 --- a/packages/react/src/html-components/leaflet-flow-map/index.tsx +++ b/packages/react/src/html-components/leaflet-flow-map/index.tsx @@ -1,39 +1,30 @@ -import React, { ForwardedRef, Ref, useEffect, useImperativeHandle, useRef, useState } from 'react' -import { LeafletFlowMap, LeafletFlowMapConfigInterface } from '@unovis/ts' -import { arePropsEqual } from '../../utils/react' +// !!! This code was automatically generated. You should not change it !!! +import React, { ForwardedRef, Ref, useImperativeHandle, useEffect, useRef, useState } from 'react' +import { LeafletFlowMap, LeafletFlowMapConfigInterface, GenericDataRecord } from '@unovis/ts' -export const VisLeafletFlowMapSelectors = LeafletFlowMap.selectors +// Utils +import { arePropsEqual } from 'src/utils/react' + +export type VisLeafletFlowMapRef = { + component?: LeafletFlowMap; +} -export type VisLeafletFlowMapProps< - PointDatum extends Record, - FlowDatum extends Record, -> = LeafletFlowMapConfigInterface & { - data?: { points: PointDatum[]; flows: FlowDatum[] }; +export type VisLeafletFlowMapProps = LeafletFlowMapConfigInterface & { + data?: { points: PointDatum[]; flows?: FlowDatum[] }; ref?: Ref>; className?: string; } -export type VisLeafletFlowMapRef< - PointDatum extends Record, - FlowDatum extends Record, -> = { - component: LeafletFlowMap | undefined; -} +export const VisLeafletFlowMapSelectors = LeafletFlowMap.selectors // eslint-disable-next-line @typescript-eslint/naming-convention -export function VisLeafletFlowMapFC< - PointDatum extends Record, - FlowDatum extends Record, -> ( - props: VisLeafletFlowMapProps, - ref: ForwardedRef> -): JSX.Element { - const container = useRef(null) +function VisLeafletFlowMapFC (props: VisLeafletFlowMapProps, fRef: ForwardedRef>): JSX.Element { + const ref = useRef(null) const [component, setComponent] = useState>() // On Mount useEffect(() => { - const c = new LeafletFlowMap(container.current as HTMLDivElement, props, props.data) + const c = new LeafletFlowMap(ref.current as HTMLDivElement, props, props.data) setComponent(c) return () => c?.destroy() @@ -42,18 +33,13 @@ export function VisLeafletFlowMapFC< // On Props Update useEffect(() => { if (props.data) component?.setData(props.data) - component?.setConfig(props) }) - useImperativeHandle(ref, () => ({ get component () { return component } }), [component]) - return
+ useImperativeHandle(fRef, () => ({ get component () { return component } }), []) + return
} // We export a memoized component to avoid unnecessary re-renders // and define its type explicitly to help react-docgen-typescript to extract information about props -export const VisLeafletFlowMap: (< - PointDatum extends Record, - FlowDatum extends Record, ->(props: VisLeafletFlowMapProps) => JSX.Element | null) = - React.memo(React.forwardRef(VisLeafletFlowMapFC), arePropsEqual) +export const VisLeafletFlowMap: ((props: VisLeafletFlowMapProps) => JSX.Element | null) = React.memo(React.forwardRef(VisLeafletFlowMapFC), arePropsEqual) diff --git a/packages/react/src/html-components/leaflet-map/index.tsx b/packages/react/src/html-components/leaflet-map/index.tsx index 44c3a4aee..0c8096f9d 100644 --- a/packages/react/src/html-components/leaflet-map/index.tsx +++ b/packages/react/src/html-components/leaflet-map/index.tsx @@ -1,26 +1,30 @@ -import React, { ForwardedRef, Ref, useEffect, useImperativeHandle, useRef, useState } from 'react' -import { LeafletMap, LeafletMapConfigInterface } from '@unovis/ts' -import { arePropsEqual } from '../../utils/react' +// !!! This code was automatically generated. You should not change it !!! +import React, { ForwardedRef, Ref, useImperativeHandle, useEffect, useRef, useState } from 'react' +import { LeafletMap, LeafletMapConfigInterface, GenericDataRecord } from '@unovis/ts' -export const VisLeafletMapSelectors = LeafletMap.selectors +// Utils +import { arePropsEqual } from 'src/utils/react' + +export type VisLeafletMapRef = { + component?: LeafletMap; +} -export type VisLeafletMapProps> = LeafletMapConfigInterface & { +export type VisLeafletMapProps = LeafletMapConfigInterface & { data?: Datum[]; ref?: Ref>; className?: string; } -export type VisLeafletMapRef> = { - component: LeafletMap | undefined; -} +export const VisLeafletMapSelectors = LeafletMap.selectors -export function VisLeafletMapFC> (props: VisLeafletMapProps, ref: ForwardedRef>): JSX.Element { - const container = useRef(null) +// eslint-disable-next-line @typescript-eslint/naming-convention +function VisLeafletMapFC (props: VisLeafletMapProps, fRef: ForwardedRef>): JSX.Element { + const ref = useRef(null) const [component, setComponent] = useState>() // On Mount useEffect(() => { - const c = new LeafletMap(container.current as HTMLDivElement, props, props.data) + const c = new LeafletMap(ref.current as HTMLDivElement, props, props.data) setComponent(c) return () => c?.destroy() @@ -29,15 +33,13 @@ export function VisLeafletMapFC> (props: V // On Props Update useEffect(() => { if (props.data) component?.setData(props.data) - component?.setConfig(props) }) - useImperativeHandle(ref, () => ({ get component () { return component } }), [component]) - return
+ useImperativeHandle(fRef, () => ({ get component () { return component } }), []) + return
} // We export a memoized component to avoid unnecessary re-renders // and define its type explicitly to help react-docgen-typescript to extract information about props -export const VisLeafletMap: (>(props: VisLeafletMapProps) => JSX.Element | null) = - React.memo(React.forwardRef(VisLeafletMapFC), arePropsEqual) +export const VisLeafletMap: ((props: VisLeafletMapProps) => JSX.Element | null) = React.memo(React.forwardRef(VisLeafletMapFC), arePropsEqual) From 8f71e4db37f430003c7c262a7458be19b33cf34a Mon Sep 17 00:00:00 2001 From: Rebecca Bol Date: Fri, 19 Apr 2024 17:58:41 -0700 Subject: [PATCH 5/6] Angular | Autogen: Adding support for standalone components closes: unovis/issues-only#41 --- packages/angular/autogen/component.ts | 42 +++++-- packages/angular/autogen/index.ts | 11 +- .../nested-donut/nested-donut.component.ts | 9 +- .../components/tooltip/tooltip.component.ts | 1 - .../bullet-legend/bullet-legend.component.ts | 23 ++-- .../leaflet-flow-map.component.ts | 114 ++++++++++-------- .../leaflet-flow-map.module.ts | 1 + .../leaflet-map/leaflet-map.component.ts | 81 +++++++------ .../leaflet-map/leaflet-map.module.ts | 1 + packages/shared/integrations/components.ts | 4 +- packages/shared/integrations/types.ts | 1 + 11 files changed, 166 insertions(+), 122 deletions(-) diff --git a/packages/angular/autogen/component.ts b/packages/angular/autogen/component.ts index 276bcd356..a15f887c4 100644 --- a/packages/angular/autogen/component.ts +++ b/packages/angular/autogen/component.ts @@ -17,6 +17,16 @@ function getJSDocComments (jsdocStringArray: string[]): string { }).join('\n') } +function checkGeneric (type: string, generics?: GenericParameter[]): string { + // Override the default generic with specified type from generics array + const isFound = type.search(/[<|\s](Datum)>/) + const isValid = generics?.find(t => t.name === 'Datum') + if (isFound !== -1 && !isValid) { + return `${type.slice(0, isFound + 1)}${generics[0].name}${type.slice(isFound + 6)}` + } + return type +} + export function getComponentCode ( componentName: string, generics: GenericParameter[], @@ -24,49 +34,57 @@ export function getComponentCode ( provide: string, importStatements: { source: string; elements: string[] }[], dataType = 'any', - kebabCaseName?: string + kebabCaseName?: string, + isStandAlone = false, + styles = [] ): string { const genericsStr = generics ? `<${generics?.map(g => g.name).join(', ')}>` : '' const genericsDefStr = generics ? `<${generics?.map(g => g.name + (g.extends ? ` extends ${g.extends}` : '') + (g.default ? ` = ${g.default}` : '')).join(', ')}>` : '' + const decoratorProps = isStandAlone ? `template: '
', + styles: ['.${kebabCaseName ?? kebabCase(componentName)}-container { ${styles?.join('; ')} }']` + : 'template: \'\'' + const constructorArgs = isStandAlone + ? `this.containerRef.nativeElement, this.getConfig()${dataType ? ', this.data' : ''}` + : 'this.getConfig()' + // Override the default generic with specified type from generics array return `// !!! This code was automatically generated. You should not change it !!! -import { Component, AfterViewInit, Input, SimpleChanges } from '@angular/core' +import { Component, AfterViewInit, Input, SimpleChanges${isStandAlone ? ', ViewChild, ElementRef' : ''} } from '@angular/core' ${importStatements.map(s => `import { ${s.elements.join(', ')} } from '${s.source}'`).join('\n')} import { ${provide} } from '../../core' @Component({ selector: 'vis-${kebabCaseName ?? kebabCase(componentName)}', - template: '', + ${decoratorProps}, // eslint-disable-next-line no-use-before-define providers: [{ provide: ${provide}, useExisting: Vis${componentName}Component }], }) export class Vis${componentName}Component${genericsDefStr} implements ${componentName}ConfigInterface${genericsStr}, AfterViewInit { + ${isStandAlone ? '@ViewChild(\'container\', { static: false }) containerRef: ElementRef' : ''} ${ configProps .map((p: ConfigProperty) => ` ${getJSDocComments(p.doc ?? [])} - @Input() ${p.name}${p.required ? '' : '?'}: ${p.type}`) + @Input() ${p.name}${p.required ? '' : '?'}: ${checkGeneric(p.type, generics)}`) .join('\n') } - ${dataType ? `@Input() data: ${dataType}` : ''} - + ${dataType ? `@Input() data: ${dataType}\n` : ''} component: ${componentName}${genericsStr} | undefined - public componentContainer: ContainerCore | undefined - + ${isStandAlone ? '' : 'public componentContainer: ContainerCore | undefined\n'} ngAfterViewInit (): void { - this.component = new ${componentName}${genericsStr}(this.getConfig()) + this.component = new ${componentName}${genericsStr}(${constructorArgs}) ${dataType ? ` if (this.data) { this.component.setData(this.data) - this.componentContainer?.render() + ${isStandAlone ? '' : 'this.componentContainer?.render()'} }` : ''} } ngOnChanges (changes: SimpleChanges): void { ${dataType ? 'if (changes.data) { this.component?.setData(this.data) }' : ''} - this.component?.setConfig(this.getConfig()) - this.componentContainer?.render() + this.component?.${componentName === 'BulletLegend' ? 'update' : 'setConfig'}(this.getConfig()) + ${isStandAlone ? '' : 'this.componentContainer?.render()'} } private getConfig (): ${componentName}ConfigInterface${genericsStr} { diff --git a/packages/angular/autogen/index.ts b/packages/angular/autogen/index.ts index 1ddeb2763..07cf30ceb 100644 --- a/packages/angular/autogen/index.ts +++ b/packages/angular/autogen/index.ts @@ -14,12 +14,11 @@ import { getImportStatements, kebabCase, getConfigSummary } from '@unovis/shared import { getComponentCode } from './component' import { getModuleCode } from './module' -const skipProperties = ['width', 'height'] const components = getComponentList() as AngularComponentInput[] for (const component of components) { - const { configProperties, configInterfaceMembers, generics, statements } = getConfigSummary(component, skipProperties, false) - const importStatements = getImportStatements(component.name, statements, configInterfaceMembers, generics, ['ContainerCore']) + const { configProperties, configInterfaceMembers, generics, statements } = getConfigSummary(component, [], false) + const importStatements = getImportStatements(component.name, statements, configInterfaceMembers, generics, component.isStandAlone ? [] : ['ContainerCore']) const componentCode = getComponentCode( component.name, @@ -28,12 +27,14 @@ for (const component of components) { component.angularProvide, importStatements, component.dataType, - component.kebabCaseName + component.kebabCaseName, + component.isStandAlone, + component.angularStyles ) const moduleCode = getModuleCode(component.name, component.kebabCaseName) const nameKebabCase = component.kebabCaseName ?? kebabCase(component.name) - const pathComponentBase = `src/components/${nameKebabCase}` + const pathComponentBase = `src/${component.isStandAlone ? 'html-' : ''}components/${nameKebabCase}` const pathComponent = `${pathComponentBase}/${nameKebabCase}.component.ts` const pathModule = `${pathComponentBase}/${nameKebabCase}.module.ts` diff --git a/packages/angular/src/components/nested-donut/nested-donut.component.ts b/packages/angular/src/components/nested-donut/nested-donut.component.ts index 76ef6d0db..f3ca0bb29 100644 --- a/packages/angular/src/components/nested-donut/nested-donut.component.ts +++ b/packages/angular/src/components/nested-donut/nested-donut.component.ts @@ -79,7 +79,7 @@ export class VisNestedDonutComponent implements NestedDonutConfigInterfac /** Direction of hierarchy flow from root to leaf. * `NestedDonutDirection.Inwards` starts from the outer most radius and works towards center * `NestedDonutDirection.Outwards` starts from the inner most radius the consecutive layers outward. - * Default: `NestedDonutDirection.Inwards` */ + * Default: `NestedDonutDirection.Inwards` */ @Input() direction?: NestedDonutDirection | string @@ -105,7 +105,12 @@ export class VisNestedDonutComponent implements NestedDonutConfigInterfac /** Array of accessor functions to defined the nested groups */ @Input() layers: StringAccessor[] - + /** Configuration properties for individual layers. Accepts an accessor or constant of type: + * { + * backgroundColor?: string; + * labelAlignment?: NestedDonutSegmentLabelAlignment; + * width?: number | string; + * } */ @Input() layerSettings?: GenericAccessor diff --git a/packages/angular/src/components/tooltip/tooltip.component.ts b/packages/angular/src/components/tooltip/tooltip.component.ts index 0b3f79c3a..c172d889b 100644 --- a/packages/angular/src/components/tooltip/tooltip.component.ts +++ b/packages/angular/src/components/tooltip/tooltip.component.ts @@ -65,7 +65,6 @@ export class VisTooltipComponent implements TooltipConfigInterface, AfterViewIni [attr: string]: string | number | boolean; } - component: Tooltip | undefined public componentContainer: ContainerCore | undefined diff --git a/packages/angular/src/html-components/bullet-legend/bullet-legend.component.ts b/packages/angular/src/html-components/bullet-legend/bullet-legend.component.ts index 33c842fe1..819bc4016 100644 --- a/packages/angular/src/html-components/bullet-legend/bullet-legend.component.ts +++ b/packages/angular/src/html-components/bullet-legend/bullet-legend.component.ts @@ -1,10 +1,12 @@ +// !!! This code was automatically generated. You should not change it !!! import { Component, AfterViewInit, Input, SimpleChanges, ViewChild, ElementRef } from '@angular/core' -import { BulletLegend, BulletLegendConfigInterface, BulletLegendItemInterface, BulletShape, GenericAccessor } from '@unovis/ts' +import { BulletLegend, BulletLegendConfigInterface, BulletLegendItemInterface, GenericAccessor, BulletShape } from '@unovis/ts' import { VisGenericComponent } from '../../core' @Component({ selector: 'vis-bullet-legend', template: '
', + styles: ['.bullet-legend-container { }'], // eslint-disable-next-line no-use-before-define providers: [{ provide: VisGenericComponent, useExisting: VisBulletLegendComponent }], }) @@ -14,14 +16,15 @@ export class VisBulletLegendComponent implements BulletLegendConfigInterface, Af /** Legend items. Array of `BulletLegendItemInterface`: * ``` * { - * name: string | number; - * color?: string; - * inactive?: boolean; - * hidden?: boolean; - * pointer?: boolean; + * name: string | number; + * color?: string; + * shape?: BulletShape; + * inactive?: boolean; + * hidden?: boolean; + * pointer?: boolean; * } * ``` - * Default: `[]` */ + * Default: `[]` */ @Input() items: BulletLegendItemInterface[] /** Apply a specific class to the labels. Default: `''` */ @@ -36,7 +39,7 @@ export class VisBulletLegendComponent implements BulletLegendConfigInterface, Af /** Label text ( element) max-width CSS property. Default: `null` */ @Input() labelMaxWidth?: string | null - /** Bullet circle size, mapped to the width and height CSS properties. Default: `null` */ + /** Bullet shape size, mapped to the width and height CSS properties. Default: `null` */ @Input() bulletSize?: string | null /** Bullet shape enum value or accessor function. Default: `d => d.shape ?? BulletShape.Circle */ @@ -53,8 +56,8 @@ export class VisBulletLegendComponent implements BulletLegendConfigInterface, Af } private getConfig (): BulletLegendConfigInterface { - const { items, labelClassName, onLegendItemClick, labelFontSize, labelMaxWidth, bulletSize } = this - const config = { items, labelClassName, onLegendItemClick, labelFontSize, labelMaxWidth, bulletSize } + const { items, labelClassName, onLegendItemClick, labelFontSize, labelMaxWidth, bulletSize, bulletShape } = this + const config = { items, labelClassName, onLegendItemClick, labelFontSize, labelMaxWidth, bulletSize, bulletShape } const keys = Object.keys(config) as (keyof BulletLegendConfigInterface)[] keys.forEach(key => { if (config[key] === undefined) delete config[key] }) diff --git a/packages/angular/src/html-components/leaflet-flow-map/leaflet-flow-map.component.ts b/packages/angular/src/html-components/leaflet-flow-map/leaflet-flow-map.component.ts index 49bbb2b74..9528a0da1 100644 --- a/packages/angular/src/html-components/leaflet-flow-map/leaflet-flow-map.component.ts +++ b/packages/angular/src/html-components/leaflet-flow-map/leaflet-flow-map.component.ts @@ -1,42 +1,37 @@ +// !!! This code was automatically generated. You should not change it !!! import { Component, AfterViewInit, Input, SimpleChanges, ViewChild, ElementRef } from '@angular/core' import { LeafletFlowMap, LeafletFlowMapConfigInterface, + GenericDataRecord, VisEventType, VisEventCallback, Bounds, + MapLibreStyleSpecs, + LeafletMapRenderer, MapZoomState, NumericAccessor, StringAccessor, + GenericAccessor, + LeafletMapPointShape, ColorAccessor, LeafletMapPointDatum, + LeafletMapClusterDatum, LeafletMapPointStyles, Tooltip, - LeafletMapClusterDatum, - GenericDataRecord, } from '@unovis/ts' -import { StyleSpecification } from 'maplibre-gl' import { VisCoreComponent } from '../../core' @Component({ selector: 'vis-leaflet-flow-map', - template: '
', - styles: ['.unovis-leaflet-flow-map-container { width: 100%; height: 100%; position: relative; }'], + template: '
', + styles: ['.leaflet-flow-map-container { width: 100%; height: 100%; position: relative }'], // eslint-disable-next-line no-use-before-define providers: [{ provide: VisCoreComponent, useExisting: VisLeafletFlowMapComponent }], }) -export class VisLeafletFlowMapComponent< - - PointDatum extends GenericDataRecord, - FlowDatum extends GenericDataRecord, -> implements LeafletFlowMapConfigInterface, AfterViewInit { +export class VisLeafletFlowMapComponent implements LeafletFlowMapConfigInterface, AfterViewInit { @ViewChild('container', { static: false }) containerRef: ElementRef - /** Width in pixels or in CSS units. By default, the map will automatically fit to the size of the parent element. Default: `undefined`. */ - @Input() width?: number | string - /** Height in pixels or in CSS units. By default, the map will automatically fit to the size of the parent element. Default: `undefined`. */ - @Input() height?: number | string - /** Animation duration of the data update transitions in milliseconds. Default: `600` */ @Input() duration?: number @@ -87,10 +82,16 @@ export class VisLeafletFlowMapComponent< }; } + /** Width in pixels or in CSS units. By default, the map will automatically fit to the size of the parent element. Default: `undefined`. */ + @Input() width?: number | string + + /** Height in pixels or in CSS units. By default, the map will automatically fit to the size of the parent element. Default: `undefined`. */ + @Input() height?: number | string + /** Animation duration when the map is automatically panning or zooming to a point or area. Default: `1500` ms */ @Input() flyToDuration?: number - /** Padding to be used when the `fitView` function has been called. The value is in pixels. Default: `[150, 150]` */ + /** Padding to be used when the `fitView` function has been called. The value is in pixels, [topLeft, bottomRight]. Default: `[150, 150]` */ @Input() fitViewPadding?: [number, number] /** Animation duration for the `setZoom` function. Default: `800` ms */ @@ -108,11 +109,11 @@ export class VisLeafletFlowMapComponent< /** Fit the view to contain the data points on map config and data updates. Default: `false` */ @Input() fitViewOnUpdate?: boolean - /** MapLibre StyleSpecification settings. Default: `MapLibreArcticLight` */ - @Input() style: StyleSpecification | string | undefined + /** MapLibre `StyleSpecification` settings, or a URL to it. When renderer is set to`LeafletMapRenderer.Raster`, provide a template URL. Default: `undefined` */ + @Input() style: MapLibreStyleSpecs | string | undefined - /** MapLibre StyleSpecification settings for dark theme. Default: `undefined` */ - @Input() styleDarkTheme: StyleSpecification | string | undefined + /** MapLibre `StyleSpecification` settings or URL for dark theme. Default: `undefined` */ + @Input() styleDarkTheme?: MapLibreStyleSpecs | string | undefined /** Tile server access token or API key. Default: `''` */ @Input() accessToken?: string @@ -120,6 +121,9 @@ export class VisLeafletFlowMapComponent< /** Array of attribution labels. Default: `['OpenStreetMap contributors']` */ @Input() attribution?: string[] + /** Rendering mode for map's tile layer. For raster files, use `LeafletMapRenderer.Raster`. Default: `LeafletMapRenderer.MapLibre` */ + @Input() renderer?: LeafletMapRenderer | string + /** Function to be called after the map's async initialization is done. Default: `undefined` */ @Input() onMapInitialized?: (() => void) @@ -138,7 +142,7 @@ export class VisLeafletFlowMapComponent< /** Map Zoom End callback function. Default: `undefined` */ @Input() onMapZoomEnd?: (({ mapCenter, zoomLevel, bounds }: MapZoomState) => void) - /** Map Zoom End callback function. Default: `undefined` */ + /** Map Zoom Click callback function. Default: `undefined` */ @Input() onMapClick?: (({ mapCenter, zoomLevel, bounds }: MapZoomState) => void) /** Point longitude accessor function. Default: `d => d.longitude` */ @@ -151,7 +155,7 @@ export class VisLeafletFlowMapComponent< @Input() pointId?: StringAccessor /** Point shape accessor function or constant value. Default: `d => d.shape` */ - @Input() pointShape?: StringAccessor + @Input() pointShape?: GenericAccessor /** Point color accessor function or constant value. Default: `d => d.color` */ @Input() pointColor?: ColorAccessor> @@ -159,14 +163,13 @@ export class VisLeafletFlowMapComponent< /** Point radius accessor function or constant value. Default: `undefined` */ @Input() pointRadius?: NumericAccessor> - /** Point inner label accessor function. Default: `d => d.point_count ?? ''` */ + /** Point inner label accessor function. Default: `undefined` */ @Input() pointLabel?: StringAccessor> /** Point inner label color accessor function or constant value. * By default, the label color will be set, depending on the point brightness, either to * `--vis-map-point-inner-label-text-color-light` or to `--vis-map-point-inner-label-text-color-dark` CSS variable. - * Default: `undefined` - */ + * Default: `undefined` */ @Input() pointLabelColor?: StringAccessor> /** Point bottom label accessor function. Default: `''` */ @@ -175,30 +178,31 @@ export class VisLeafletFlowMapComponent< /** Point cursor value or accessor function. Default: `null` */ @Input() pointCursor?: StringAccessor> + /** The width of the ring when a point has a `LeafletMapPointShape.Ring` shape. Default: `1.25` */ + @Input() pointRingWidth?: number + /** Set selected point by its unique id. Default: `undefined` */ @Input() selectedPointId?: string - /** Cluster color accessor function or constant value. Default: `undefined` */ + /** Cluster color accessor function or constant value. Default: `undefined` */ @Input() clusterColor?: ColorAccessor> - /** Cluster radius accessor function or constant value. Default: `undefined` */ + /** Cluster radius accessor function or constant value. Default: `undefined` */ @Input() clusterRadius?: NumericAccessor> - /** Cluster inner label accessor function. Default: `d => d.point_count` */ + /** Cluster inner label accessor function. Default: `d => d.point_count` */ @Input() clusterLabel?: StringAccessor> /** Cluster inner label color accessor function or constant value. * By default, the label color will be set, depending on the point brightness, either to * `--vis-map-cluster-inner-label-text-color-light` or to `--vis-map-cluster-inner-label-text-color-dark` CSS variable. - * Default: `undefined` - */ + * Default: `undefined` */ @Input() clusterLabelColor?: StringAccessor> /** Cluster bottom label accessor function. Default: `''` */ @Input() clusterBottomLabel?: StringAccessor> - - /** The width of the cluster point outline. Default: `1.25` */ + /** The width of the cluster point ring. Default: `1.25` */ @Input() clusterRingWidth?: number /** When cluster is expanded, show a background circle to better separate points from the base map. Default: `true` */ @@ -211,7 +215,7 @@ export class VisLeafletFlowMapComponent< @Input() clusteringDistance?: number /** A single map point can have multiple properties displayed as a small pie chart (or a donut chart for a cluster of points). - * By setting the valuesMap configuration you can specify data properties that should be mapped to various pie / donut segments. + * By setting the colorMap configuration you can specify data properties that should be mapped to various pie / donut segments. * * ``` * { @@ -227,7 +231,7 @@ export class VisLeafletFlowMapComponent< * } * ``` * where every data point has the `healthy`, `warning` and `danger` numerical or boolean property. */ - @Input() valuesMap?: LeafletMapPointStyles + @Input() colorMap?: LeafletMapPointStyles /** A TopoJSON Geometry layer to be displayed on top of the map. Supports fill and stroke */ @Input() topoJSONLayer?: { @@ -244,59 +248,67 @@ export class VisLeafletFlowMapComponent< @Input() tooltip?: Tooltip /** Alternative text description of the chart for accessibility purposes. It will be applied as an - * `aria-label` attribute to the div element containing your chart. Default: `undefined`. - */ + * `aria-label` attribute to the div element containing your chart. Default: `undefined`. */ @Input() ariaLabel?: string | null | undefined /** Flow source point longitude accessor function or value. Default:.`f => f.sourceLongitude` */ @Input() sourceLongitude?: NumericAccessor + /** Flow source point latitude accessor function or value. Default: `f => f.sourceLatitude` */ @Input() sourceLatitude?: NumericAccessor + /** Flow target point longitude accessor function or value. Default: `f => f.targetLongitude` */ @Input() targetLongitude?: NumericAccessor + /** Flow target point latitude accessor function or value. Default: `f => f.targetLatitude` */ @Input() targetLatitude?: NumericAccessor + /** Flow source point radius accessor function or value. Default: `3` */ @Input() sourcePointRadius?: NumericAccessor + /** Source point color accessor function or value. Default: `'#88919f'` */ @Input() sourcePointColor?: ColorAccessor + /** Flow particle color accessor function or value. Default: `'#949dad'` */ @Input() flowParticleColor?: ColorAccessor + /** Flow particle radius accessor function or value. Default: `1.1` */ @Input() flowParticleRadius?: NumericAccessor - /** Flow particle speed accessor function or value in angular degrees. Default: `0.07` */ + + /** Flow particle speed accessor function or value. The unit is arbitrary, recommended range is 0 – 0.2. Default: `0.07` */ @Input() flowParticleSpeed?: NumericAccessor + /** Flow particle density accessor function or value on the range of [0, 1]. Default: `0.6` */ @Input() flowParticleDensity?: NumericAccessor - // Events /** Flow source point click callback function. Default: `undefined` */ - @Input() onSourcePointClick?: ((f: FlowDatum, x: number, y: number, event: MouseEvent) => unknown) + @Input() onSourcePointClick?: (f: FlowDatum, x: number, y: number, event: MouseEvent) => void + /** Flow source point mouse over callback function. Default: `undefined` */ - @Input() onSourcePointMouseEnter?: ((f: FlowDatum, x: number, y: number, event: MouseEvent) => unknown) - /** Flow source point mouse leave callback function. Default: `undefined` */ - @Input() onSourcePointMouseLeave?: ((f: FlowDatum, event: MouseEvent) => unknown) + @Input() onSourcePointMouseEnter?: (f: FlowDatum, x: number, y: number, event: MouseEvent) => void - /** Data */ - @Input() data?: { points: PointDatum[]; flows: FlowDatum[] } + /** Flow source point mouse leave callback function. Default: `undefined` */ + @Input() onSourcePointMouseLeave?: (f: FlowDatum, event: MouseEvent) => void + @Input() data: { points: PointDatum[]; flows?: FlowDatum[] } component: LeafletFlowMap | undefined ngAfterViewInit (): void { - const config = this.getConfig() - this.component = new LeafletFlowMap(this.containerRef.nativeElement, config, this.data) + this.component = new LeafletFlowMap(this.containerRef.nativeElement, this.getConfig(), this.data) + + if (this.data) { + this.component.setData(this.data) + } } ngOnChanges (changes: SimpleChanges): void { - if (changes.data) { - this.component?.setData(this.data) - } + if (changes.data) { this.component?.setData(this.data) } this.component?.setConfig(this.getConfig()) } private getConfig (): LeafletFlowMapConfigInterface { - const { width, height, duration, events, attributes, flyToDuration, fitViewPadding, zoomDuration, initialBounds, fitBoundsOnUpdate, fitViewOnInit, fitViewOnUpdate, accessToken, style, styleDarkTheme, attribution, onMapInitialized, onMapMoveZoom, onMapMoveStart, onMapMoveEnd, onMapZoomStart, onMapZoomEnd, onMapClick, pointLongitude, pointLatitude, pointId, pointShape, pointColor, pointRadius, pointLabel, pointLabelColor, pointBottomLabel, pointCursor, selectedPointId, clusterColor, clusterRadius, clusterLabel, clusterLabelColor, clusterBottomLabel, clusterRingWidth, clusterBackground, clusterExpandOnClick, clusteringDistance, valuesMap, topoJSONLayer, tooltip, ariaLabel, sourceLongitude, sourceLatitude, targetLongitude, targetLatitude, sourcePointRadius, sourcePointColor, flowParticleColor, flowParticleRadius, flowParticleSpeed, flowParticleDensity, onSourcePointClick, onSourcePointMouseEnter, onSourcePointMouseLeave } = this - const config = { width, height, duration, events, attributes, flyToDuration, fitViewPadding, zoomDuration, initialBounds, fitBoundsOnUpdate, fitViewOnInit, fitViewOnUpdate, accessToken, style, styleDarkTheme, attribution, onMapInitialized, onMapMoveZoom, onMapMoveStart, onMapMoveEnd, onMapZoomStart, onMapZoomEnd, onMapClick, pointLongitude, pointLatitude, pointId, pointShape, pointColor, pointRadius, pointLabel, pointLabelColor, pointBottomLabel, pointCursor, selectedPointId, clusterColor, clusterRadius, clusterLabel, clusterLabelColor, clusterBottomLabel, clusterRingWidth, clusterBackground, clusterExpandOnClick, clusteringDistance, valuesMap, topoJSONLayer, tooltip, ariaLabel, sourceLongitude, sourceLatitude, targetLongitude, targetLatitude, sourcePointRadius, sourcePointColor, flowParticleColor, flowParticleRadius, flowParticleSpeed, flowParticleDensity, onSourcePointClick, onSourcePointMouseEnter, onSourcePointMouseLeave } + const { duration, events, attributes, width, height, flyToDuration, fitViewPadding, zoomDuration, initialBounds, fitBoundsOnUpdate, fitViewOnInit, fitViewOnUpdate, style, styleDarkTheme, accessToken, attribution, renderer, onMapInitialized, onMapMoveZoom, onMapMoveStart, onMapMoveEnd, onMapZoomStart, onMapZoomEnd, onMapClick, pointLongitude, pointLatitude, pointId, pointShape, pointColor, pointRadius, pointLabel, pointLabelColor, pointBottomLabel, pointCursor, pointRingWidth, selectedPointId, clusterColor, clusterRadius, clusterLabel, clusterLabelColor, clusterBottomLabel, clusterRingWidth, clusterBackground, clusterExpandOnClick, clusteringDistance, colorMap, topoJSONLayer, tooltip, ariaLabel, sourceLongitude, sourceLatitude, targetLongitude, targetLatitude, sourcePointRadius, sourcePointColor, flowParticleColor, flowParticleRadius, flowParticleSpeed, flowParticleDensity, onSourcePointClick, onSourcePointMouseEnter, onSourcePointMouseLeave } = this + const config = { duration, events, attributes, width, height, flyToDuration, fitViewPadding, zoomDuration, initialBounds, fitBoundsOnUpdate, fitViewOnInit, fitViewOnUpdate, style, styleDarkTheme, accessToken, attribution, renderer, onMapInitialized, onMapMoveZoom, onMapMoveStart, onMapMoveEnd, onMapZoomStart, onMapZoomEnd, onMapClick, pointLongitude, pointLatitude, pointId, pointShape, pointColor, pointRadius, pointLabel, pointLabelColor, pointBottomLabel, pointCursor, pointRingWidth, selectedPointId, clusterColor, clusterRadius, clusterLabel, clusterLabelColor, clusterBottomLabel, clusterRingWidth, clusterBackground, clusterExpandOnClick, clusteringDistance, colorMap, topoJSONLayer, tooltip, ariaLabel, sourceLongitude, sourceLatitude, targetLongitude, targetLatitude, sourcePointRadius, sourcePointColor, flowParticleColor, flowParticleRadius, flowParticleSpeed, flowParticleDensity, onSourcePointClick, onSourcePointMouseEnter, onSourcePointMouseLeave } const keys = Object.keys(config) as (keyof LeafletFlowMapConfigInterface)[] keys.forEach(key => { if (config[key] === undefined) delete config[key] }) diff --git a/packages/angular/src/html-components/leaflet-flow-map/leaflet-flow-map.module.ts b/packages/angular/src/html-components/leaflet-flow-map/leaflet-flow-map.module.ts index f3bdeb0ec..c70cedb22 100644 --- a/packages/angular/src/html-components/leaflet-flow-map/leaflet-flow-map.module.ts +++ b/packages/angular/src/html-components/leaflet-flow-map/leaflet-flow-map.module.ts @@ -1,3 +1,4 @@ +// !!! This code was automatically generated. You should not change it !!! import { NgModule } from '@angular/core' import { VisLeafletFlowMapComponent } from './leaflet-flow-map.component' diff --git a/packages/angular/src/html-components/leaflet-map/leaflet-map.component.ts b/packages/angular/src/html-components/leaflet-map/leaflet-map.component.ts index 90f717596..b9457c569 100644 --- a/packages/angular/src/html-components/leaflet-map/leaflet-map.component.ts +++ b/packages/angular/src/html-components/leaflet-map/leaflet-map.component.ts @@ -1,39 +1,37 @@ +// !!! This code was automatically generated. You should not change it !!! import { Component, AfterViewInit, Input, SimpleChanges, ViewChild, ElementRef } from '@angular/core' import { LeafletMap, LeafletMapConfigInterface, + GenericDataRecord, VisEventType, VisEventCallback, Bounds, + MapLibreStyleSpecs, + LeafletMapRenderer, MapZoomState, NumericAccessor, StringAccessor, + GenericAccessor, + LeafletMapPointShape, ColorAccessor, LeafletMapPointDatum, + LeafletMapClusterDatum, LeafletMapPointStyles, Tooltip, - LeafletMapClusterDatum, - LeafletMapRenderer, - GenericDataRecord, } from '@unovis/ts' -import { StyleSpecification } from 'maplibre-gl' import { VisCoreComponent } from '../../core' @Component({ selector: 'vis-leaflet-map', - template: '
', - styles: ['.unovis-leaflet-map-container { width: 100%; height: 100%; position: relative; }'], + template: '
', + styles: ['.leaflet-map-container { width: 100%; height: 100%; position: relative }'], // eslint-disable-next-line no-use-before-define providers: [{ provide: VisCoreComponent, useExisting: VisLeafletMapComponent }], }) export class VisLeafletMapComponent implements LeafletMapConfigInterface, AfterViewInit { @ViewChild('container', { static: false }) containerRef: ElementRef - /** Width in pixels or in CSS units. By default, the map will automatically fit to the size of the parent element. Default: `undefined`. */ - @Input() width?: number | string - /** Height in pixels or in CSS units. By default, the map will automatically fit to the size of the parent element. Default: `undefined`. */ - @Input() height?: number | string - /** Animation duration of the data update transitions in milliseconds. Default: `600` */ @Input() duration?: number @@ -84,10 +82,16 @@ export class VisLeafletMapComponent implements }; } + /** Width in pixels or in CSS units. By default, the map will automatically fit to the size of the parent element. Default: `undefined`. */ + @Input() width?: number | string + + /** Height in pixels or in CSS units. By default, the map will automatically fit to the size of the parent element. Default: `undefined`. */ + @Input() height?: number | string + /** Animation duration when the map is automatically panning or zooming to a point or area. Default: `1500` ms */ @Input() flyToDuration?: number - /** Padding to be used when the `fitView` function has been called. The value is in pixels. Default: `[150, 150]` */ + /** Padding to be used when the `fitView` function has been called. The value is in pixels, [topLeft, bottomRight]. Default: `[150, 150]` */ @Input() fitViewPadding?: [number, number] /** Animation duration for the `setZoom` function. Default: `800` ms */ @@ -105,11 +109,11 @@ export class VisLeafletMapComponent implements /** Fit the view to contain the data points on map config and data updates. Default: `false` */ @Input() fitViewOnUpdate?: boolean - /** MapLibre StyleSpecification settings. Default: `MapLibreArcticLight` */ - @Input() style: StyleSpecification | string | undefined + /** MapLibre `StyleSpecification` settings, or a URL to it. When renderer is set to`LeafletMapRenderer.Raster`, provide a template URL. Default: `undefined` */ + @Input() style: MapLibreStyleSpecs | string | undefined - /** MapLibre StyleSpecification settings for dark theme. Default: `undefined` */ - @Input() styleDarkTheme?: StyleSpecification | string | undefined + /** MapLibre `StyleSpecification` settings or URL for dark theme. Default: `undefined` */ + @Input() styleDarkTheme?: MapLibreStyleSpecs | string | undefined /** Tile server access token or API key. Default: `''` */ @Input() accessToken?: string @@ -138,7 +142,7 @@ export class VisLeafletMapComponent implements /** Map Zoom End callback function. Default: `undefined` */ @Input() onMapZoomEnd?: (({ mapCenter, zoomLevel, bounds }: MapZoomState) => void) - /** Map Zoom End callback function. Default: `undefined` */ + /** Map Zoom Click callback function. Default: `undefined` */ @Input() onMapClick?: (({ mapCenter, zoomLevel, bounds }: MapZoomState) => void) /** Point longitude accessor function. Default: `d => d.longitude` */ @@ -151,7 +155,7 @@ export class VisLeafletMapComponent implements @Input() pointId?: StringAccessor /** Point shape accessor function or constant value. Default: `d => d.shape` */ - @Input() pointShape?: StringAccessor + @Input() pointShape?: GenericAccessor /** Point color accessor function or constant value. Default: `d => d.color` */ @Input() pointColor?: ColorAccessor> @@ -159,14 +163,13 @@ export class VisLeafletMapComponent implements /** Point radius accessor function or constant value. Default: `undefined` */ @Input() pointRadius?: NumericAccessor> - /** Point inner label accessor function. Default: `d => d.point_count ?? ''` */ + /** Point inner label accessor function. Default: `undefined` */ @Input() pointLabel?: StringAccessor> /** Point inner label color accessor function or constant value. * By default, the label color will be set, depending on the point brightness, either to * `--vis-map-point-inner-label-text-color-light` or to `--vis-map-point-inner-label-text-color-dark` CSS variable. - * Default: `undefined` - */ + * Default: `undefined` */ @Input() pointLabelColor?: StringAccessor> /** Point bottom label accessor function. Default: `''` */ @@ -175,29 +178,31 @@ export class VisLeafletMapComponent implements /** Point cursor value or accessor function. Default: `null` */ @Input() pointCursor?: StringAccessor> + /** The width of the ring when a point has a `LeafletMapPointShape.Ring` shape. Default: `1.25` */ + @Input() pointRingWidth?: number + /** Set selected point by its unique id. Default: `undefined` */ @Input() selectedPointId?: string - /** Cluster color accessor function or constant value. Default: `undefined` */ + /** Cluster color accessor function or constant value. Default: `undefined` */ @Input() clusterColor?: ColorAccessor> - /** Cluster radius accessor function or constant value. Default: `undefined` */ + /** Cluster radius accessor function or constant value. Default: `undefined` */ @Input() clusterRadius?: NumericAccessor> - /** Cluster inner label accessor function. Default: `d => d.point_count` */ + /** Cluster inner label accessor function. Default: `d => d.point_count` */ @Input() clusterLabel?: StringAccessor> /** Cluster inner label color accessor function or constant value. * By default, the label color will be set, depending on the point brightness, either to * `--vis-map-cluster-inner-label-text-color-light` or to `--vis-map-cluster-inner-label-text-color-dark` CSS variable. - * Default: `undefined` - */ + * Default: `undefined` */ @Input() clusterLabelColor?: StringAccessor> /** Cluster bottom label accessor function. Default: `''` */ @Input() clusterBottomLabel?: StringAccessor> - /** The width of the cluster point outline. Default: `1.25` */ + /** The width of the cluster point ring. Default: `1.25` */ @Input() clusterRingWidth?: number /** When cluster is expanded, show a background circle to better separate points from the base map. Default: `true` */ @@ -243,30 +248,28 @@ export class VisLeafletMapComponent implements @Input() tooltip?: Tooltip /** Alternative text description of the chart for accessibility purposes. It will be applied as an - * `aria-label` attribute to the div element containing your chart. Default: `undefined`. - */ + * `aria-label` attribute to the div element containing your chart. Default: `undefined`. */ @Input() ariaLabel?: string | null | undefined - - /** Data */ - @Input() data?: Datum[] + @Input() data: Datum[] component: LeafletMap | undefined ngAfterViewInit (): void { - const config = this.getConfig() - this.component = new LeafletMap(this.containerRef.nativeElement, config, this.data) + this.component = new LeafletMap(this.containerRef.nativeElement, this.getConfig(), this.data) + + if (this.data) { + this.component.setData(this.data) + } } ngOnChanges (changes: SimpleChanges): void { - if (changes.data) { - this.component?.setData(this.data) - } + if (changes.data) { this.component?.setData(this.data) } this.component?.setConfig(this.getConfig()) } private getConfig (): LeafletMapConfigInterface { - const { width, height, duration, events, attributes, flyToDuration, fitViewPadding, zoomDuration, initialBounds, fitBoundsOnUpdate, fitViewOnInit, fitViewOnUpdate, accessToken, style, styleDarkTheme, attribution, onMapInitialized, onMapMoveZoom, onMapMoveStart, onMapMoveEnd, onMapZoomStart, onMapZoomEnd, onMapClick, pointLongitude, pointLatitude, pointId, pointShape, pointColor, pointRadius, pointLabel, pointLabelColor, pointBottomLabel, pointCursor, selectedPointId, clusterColor, clusterRadius, clusterLabel, clusterLabelColor, clusterBottomLabel, clusterRingWidth, clusterBackground, clusterExpandOnClick, clusteringDistance, colorMap, topoJSONLayer, tooltip, ariaLabel } = this - const config = { width, height, duration, events, attributes, flyToDuration, fitViewPadding, zoomDuration, initialBounds, fitBoundsOnUpdate, fitViewOnInit, fitViewOnUpdate, accessToken, style, styleDarkTheme, attribution, onMapInitialized, onMapMoveZoom, onMapMoveStart, onMapMoveEnd, onMapZoomStart, onMapZoomEnd, onMapClick, pointLongitude, pointLatitude, pointId, pointShape, pointColor, pointRadius, pointLabel, pointLabelColor, pointBottomLabel, pointCursor, selectedPointId, clusterColor, clusterRadius, clusterLabel, clusterLabelColor, clusterBottomLabel, clusterRingWidth, clusterBackground, clusterExpandOnClick, clusteringDistance, colorMap, topoJSONLayer, tooltip, ariaLabel } + const { duration, events, attributes, width, height, flyToDuration, fitViewPadding, zoomDuration, initialBounds, fitBoundsOnUpdate, fitViewOnInit, fitViewOnUpdate, style, styleDarkTheme, accessToken, attribution, renderer, onMapInitialized, onMapMoveZoom, onMapMoveStart, onMapMoveEnd, onMapZoomStart, onMapZoomEnd, onMapClick, pointLongitude, pointLatitude, pointId, pointShape, pointColor, pointRadius, pointLabel, pointLabelColor, pointBottomLabel, pointCursor, pointRingWidth, selectedPointId, clusterColor, clusterRadius, clusterLabel, clusterLabelColor, clusterBottomLabel, clusterRingWidth, clusterBackground, clusterExpandOnClick, clusteringDistance, colorMap, topoJSONLayer, tooltip, ariaLabel } = this + const config = { duration, events, attributes, width, height, flyToDuration, fitViewPadding, zoomDuration, initialBounds, fitBoundsOnUpdate, fitViewOnInit, fitViewOnUpdate, style, styleDarkTheme, accessToken, attribution, renderer, onMapInitialized, onMapMoveZoom, onMapMoveStart, onMapMoveEnd, onMapZoomStart, onMapZoomEnd, onMapClick, pointLongitude, pointLatitude, pointId, pointShape, pointColor, pointRadius, pointLabel, pointLabelColor, pointBottomLabel, pointCursor, pointRingWidth, selectedPointId, clusterColor, clusterRadius, clusterLabel, clusterLabelColor, clusterBottomLabel, clusterRingWidth, clusterBackground, clusterExpandOnClick, clusteringDistance, colorMap, topoJSONLayer, tooltip, ariaLabel } const keys = Object.keys(config) as (keyof LeafletMapConfigInterface)[] keys.forEach(key => { if (config[key] === undefined) delete config[key] }) diff --git a/packages/angular/src/html-components/leaflet-map/leaflet-map.module.ts b/packages/angular/src/html-components/leaflet-map/leaflet-map.module.ts index d25b4a40a..7ef0bb910 100644 --- a/packages/angular/src/html-components/leaflet-map/leaflet-map.module.ts +++ b/packages/angular/src/html-components/leaflet-map/leaflet-map.module.ts @@ -1,3 +1,4 @@ +// !!! This code was automatically generated. You should not change it !!! import { NgModule } from '@angular/core' import { VisLeafletMapComponent } from './leaflet-map.component' diff --git a/packages/shared/integrations/components.ts b/packages/shared/integrations/components.ts index 400e64d1e..109a5669f 100644 --- a/packages/shared/integrations/components.ts +++ b/packages/shared/integrations/components.ts @@ -31,8 +31,8 @@ export function getComponentList ( { name: 'Annotations', sources: [coreComponentConfigPath, '/components/annotations'], dataType: null, angularProvide: 'VisGenericComponent', elementSuffix: 'annotations' }, // Standalone components - { name: 'LeafletMap', sources: [coreComponentConfigPath, '/components/leaflet-map'], dataType: 'Datum[]', isStandAlone: true, angularProvide: 'VisCoreComponent', svelteStyles: ['display:block', 'position:relative'], vueStyles: ['display:block', 'position:relative'] }, - { name: 'LeafletFlowMap', sources: [coreComponentConfigPath, '/components/leaflet-map', '/components/leaflet-flow-map'], dataType: '{ points: PointDatum[]; flows?: FlowDatum[] }', isStandAlone: true, svelteStyles: ['display:block', 'position:relative'], vueStyles: ['display:block', 'position:relative'] }, + { name: 'LeafletMap', sources: [coreComponentConfigPath, '/components/leaflet-map'], dataType: 'Datum[]', isStandAlone: true, angularProvide: 'VisCoreComponent', angularStyles: ['width: 100%', 'height: 100%', 'position: relative'], svelteStyles: ['display:block', 'position:relative'], vueStyles: ['display:block', 'position:relative'] }, + { name: 'LeafletFlowMap', sources: [coreComponentConfigPath, '/components/leaflet-map', '/components/leaflet-flow-map'], dataType: '{ points: PointDatum[]; flows?: FlowDatum[] }', isStandAlone: true, angularProvide: 'VisCoreComponent', angularStyles: ['width: 100%', 'height: 100%', 'position: relative'], svelteStyles: ['display:block', 'position:relative'], vueStyles: ['display:block', 'position:relative'] }, { name: 'BulletLegend', sources: ['/components/bullet-legend'], dataType: null, angularProvide: 'VisGenericComponent', isStandAlone: true, svelteStyles: ['display:block'], vueStyles: ['display:block'] }, ] } diff --git a/packages/shared/integrations/types.ts b/packages/shared/integrations/types.ts index 1c52e0f4c..85dab314b 100644 --- a/packages/shared/integrations/types.ts +++ b/packages/shared/integrations/types.ts @@ -27,6 +27,7 @@ export type ReactComponentInput = ComponentInput export type AngularComponentInput = ComponentInput & { angularProvide: string; + angularStyles?: string[]; } export type SvelteComponentInput = ComponentInput & { From 81b2546f4e57270ad05b4cf991c44a8abd5e168f Mon Sep 17 00:00:00 2001 From: Rebecca Bol Date: Thu, 25 Apr 2024 14:12:33 -0700 Subject: [PATCH 6/6] CI: Integrating commitlint closes: unovis/issues-only#15 --- .husky/commit-msg | 4 + commitlint.config.ts | 52 ++ package-lock.json | 1932 +++++++++++++++++++++++++++++++++++++++++- package.json | 2 + 4 files changed, 1987 insertions(+), 3 deletions(-) create mode 100755 .husky/commit-msg create mode 100644 commitlint.config.ts diff --git a/.husky/commit-msg b/.husky/commit-msg new file mode 100755 index 000000000..84d34d663 --- /dev/null +++ b/.husky/commit-msg @@ -0,0 +1,4 @@ +#!/bin/sh +. "$(dirname "$0")/_/husky.sh" + +npx --no -- commitlint --edit ${1} \ No newline at end of file diff --git a/commitlint.config.ts b/commitlint.config.ts new file mode 100644 index 000000000..ae7b86b59 --- /dev/null +++ b/commitlint.config.ts @@ -0,0 +1,52 @@ +/* eslint-disable @typescript-eslint/no-var-requires */ +const componentScopes = require('@unovis/shared/integrations/components') + .getComponentList() + .map(c => c.name) + +module.exports = { + parserPreset: { + parserOpts: { + headerPattern: /^\s*(\w*)(?:\s\|\s(\w*))?(?:\s\|\s([\w\s|]+))?: (.*)$/, + headerCorrespondence: ['type', 'scope', 'subscopes', 'subject'], + issuePrefixes: ['#', 'unovis/issues-only#'], + }, + }, + rules: { + 'header-trim': [2, 'always'], + 'type-enum': [2, 'always', [ + 'React', 'Angular', 'Vue', 'Svelte', 'Website', 'Dev', 'Shared', + 'Core', 'Component', 'Container', 'Release', 'CI', 'Misc', + ]], + 'scope-case': [2, 'always', 'pascal-case'], + 'subject-case': [2, 'always', 'sentence-case'], + 'subject-empty': [2, 'never'], + 'validate-scope': [1, 'always'], + }, + plugins: [ + { + rules: { + // eslint-disable-next-line @typescript-eslint/naming-convention + 'validate-scope': c => { + // Allow empty scopes for CI and Release types + if (!c.scope) return [['Release', 'CI'].includes(c.type), 'scope should not be empty'] + + // Check if scope is one of the component scopes + if (c.type === 'Component') { + return [ + componentScopes.includes(c.scope), + `Component scope must be one of [${componentScopes.join(', ')}]`, + ] + } + + // Verify pascal-case for additional scopes + c.subscopes?.split(' | ')?.forEach(s => { + if (s.match(/[A-Z][a-zA-Z0-9]*/) === null) return [false, `${s}: all scopes must be pascal-case`] + }) + + return [true] + }, + }, + }, + ], + helpUrl: 'https://github.com/f5/unovis/pull/375', +} diff --git a/package-lock.json b/package-lock.json index 5db5e16d2..25bb72b16 100644 --- a/package-lock.json +++ b/package-lock.json @@ -18,6 +18,8 @@ "packages/shared" ], "devDependencies": { + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", "@types/node": "^16.11.14", "@typescript-eslint/eslint-plugin": "^5.41.0", "@typescript-eslint/parser": "^5.41.0", @@ -3308,6 +3310,854 @@ "node": ">=0.1.90" } }, + "node_modules/@commitlint/cli": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz", + "integrity": "sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==", + "dev": true, + "dependencies": { + "@commitlint/format": "^19.3.0", + "@commitlint/lint": "^19.2.2", + "@commitlint/load": "^19.2.0", + "@commitlint/read": "^19.2.1", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1", + "yargs": "^17.0.0" + }, + "bin": { + "commitlint": "cli.js" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/cli/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/cli/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@commitlint/cli/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@commitlint/cli/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/cli/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true, + "engines": { + "node": ">=12" + } + }, + "node_modules/@commitlint/config-conventional": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", + "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "conventional-changelog-conventionalcommits": "^7.0.2" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", + "integrity": "sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "ajv": "^8.11.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/config-validator/node_modules/ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/@commitlint/config-validator/node_modules/json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + }, + "node_modules/@commitlint/ensure": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.0.3.tgz", + "integrity": "sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/execute-rule": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz", + "integrity": "sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", + "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/format/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/is-ignored": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", + "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "semver": "^7.6.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/is-ignored/node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@commitlint/lint": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", + "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", + "dev": true, + "dependencies": { + "@commitlint/is-ignored": "^19.2.2", + "@commitlint/parse": "^19.0.3", + "@commitlint/rules": "^19.0.3", + "@commitlint/types": "^19.0.3" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.2.0.tgz", + "integrity": "sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.0.3", + "@commitlint/execute-rule": "^19.0.0", + "@commitlint/resolve-extends": "^19.1.0", + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/load/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/@commitlint/load/node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@commitlint/message": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.0.0.tgz", + "integrity": "sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/parse": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.0.3.tgz", + "integrity": "sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==", + "dev": true, + "dependencies": { + "@commitlint/types": "^19.0.3", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.2.1.tgz", + "integrity": "sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==", + "dev": true, + "dependencies": { + "@commitlint/top-level": "^19.0.0", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/read/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@commitlint/read/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/read/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@commitlint/read/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/resolve-extends": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz", + "integrity": "sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==", + "dev": true, + "dependencies": { + "@commitlint/config-validator": "^19.0.3", + "@commitlint/types": "^19.0.3", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/resolve-extends/node_modules/resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/@commitlint/rules": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.0.3.tgz", + "integrity": "sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==", + "dev": true, + "dependencies": { + "@commitlint/ensure": "^19.0.3", + "@commitlint/message": "^19.0.0", + "@commitlint/to-lines": "^19.0.0", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/rules/node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/@commitlint/rules/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/rules/node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@commitlint/rules/node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/to-lines": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.0.0.tgz", + "integrity": "sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==", + "dev": true, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.0.0.tgz", + "integrity": "sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==", + "dev": true, + "dependencies": { + "find-up": "^7.0.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/top-level/node_modules/find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "dependencies": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "dependencies": { + "p-locate": "^6.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^1.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "dependencies": { + "p-limit": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/top-level/node_modules/path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + } + }, + "node_modules/@commitlint/top-level/node_modules/yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true, + "engines": { + "node": ">=12.20" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@commitlint/types": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", + "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", + "dev": true, + "dependencies": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "engines": { + "node": ">=v18" + } + }, + "node_modules/@commitlint/types/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true, + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/@csstools/convert-colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", @@ -4875,6 +5725,15 @@ "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, + "node_modules/@types/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", + "dev": true, + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -6516,6 +7375,12 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "node_modules/array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, "node_modules/array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", @@ -7789,6 +8654,16 @@ "dev": true, "license": "MIT" }, + "node_modules/compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "dependencies": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, "node_modules/component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -7948,6 +8823,48 @@ "node": ">= 0.6" } }, + "node_modules/conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "dependencies": { + "compare-func": "^2.0.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "dependencies": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "conventional-commits-parser": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/convert-source-map": { "version": "1.7.0", "license": "MIT", @@ -8118,6 +9035,23 @@ "node": ">=10" } }, + "node_modules/cosmiconfig-typescript-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "dev": true, + "dependencies": { + "jiti": "^1.19.1" + }, + "engines": { + "node": ">=v16" + }, + "peerDependencies": { + "@types/node": "*", + "cosmiconfig": ">=8.2", + "typescript": ">=4" + } + }, "node_modules/critters": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz", @@ -9045,6 +9979,18 @@ "node": ">=12" } }, + "node_modules/dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", @@ -9531,6 +10477,18 @@ "url": "https://github.com/fb55/domutils?sponsor=1" } }, + "node_modules/dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "dependencies": { + "is-obj": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -12477,6 +13435,23 @@ "node": ">=0.10.0" } }, + "node_modules/git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "dependencies": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + }, + "bin": { + "git-raw-commits": "cli.mjs" + }, + "engines": { + "node": ">=16" + } + }, "node_modules/gl-matrix": { "version": "3.4.3", "license": "MIT" @@ -12517,6 +13492,30 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "node_modules/global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "dependencies": { + "ini": "4.1.1" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/global-directory/node_modules/ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true, + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/globals": { "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", @@ -13202,6 +14201,15 @@ "node": ">= 6" } }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true, + "engines": { + "node": ">=16.17.0" + } + }, "node_modules/humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -13374,6 +14382,16 @@ "node": ">=6" } }, + "node_modules/import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, "node_modules/imurmurhash": { "version": "0.1.4", "dev": true, @@ -13882,6 +14900,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -14005,6 +15032,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "dependencies": { + "text-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/is-typed-array": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", @@ -14194,6 +15233,15 @@ "node": ">= 10.13.0" } }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true, + "bin": { + "jiti": "bin/jiti.js" + } + }, "node_modules/jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -14347,6 +15395,22 @@ "node >= 0.2.0" ] }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, "node_modules/karma": { "version": "6.3.20", "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.20.tgz", @@ -15025,6 +16089,18 @@ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, + "node_modules/lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "node_modules/lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, "node_modules/lodash.memoize": { "version": "4.1.2", "dev": true, @@ -15035,11 +16111,35 @@ "dev": true, "license": "MIT" }, + "node_modules/lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "node_modules/lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "node_modules/lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, "node_modules/lodash.uniq": { "version": "4.5.0", "dev": true, "license": "MIT" }, + "node_modules/lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -15433,6 +16533,18 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true, + "engines": { + "node": ">=16.10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -15617,8 +16729,12 @@ } }, "node_modules/minimist": { - "version": "1.2.6", - "license": "MIT" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } }, "node_modules/minipass": { "version": "3.3.6", @@ -21449,6 +22565,15 @@ "wordwrap": "cli.js" } }, + "node_modules/split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true, + "engines": { + "node": ">= 10.x" + } + }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -22265,6 +23390,18 @@ "source-map": "^0.6.0" } }, + "node_modules/text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/text-table": { "version": "0.2.0", "dev": true, @@ -22715,6 +23852,18 @@ "node": ">=4" } }, + "node_modules/unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", @@ -27404,6 +28553,571 @@ "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", "dev": true }, + "@commitlint/cli": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/cli/-/cli-19.3.0.tgz", + "integrity": "sha512-LgYWOwuDR7BSTQ9OLZ12m7F/qhNY+NpAyPBgo4YNMkACE7lGuUnuQq1yi9hz1KA4+3VqpOYl8H1rY/LYK43v7g==", + "dev": true, + "requires": { + "@commitlint/format": "^19.3.0", + "@commitlint/lint": "^19.2.2", + "@commitlint/load": "^19.2.0", + "@commitlint/read": "^19.2.1", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1", + "yargs": "^17.0.0" + }, + "dependencies": { + "cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "dev": true, + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + } + }, + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + }, + "yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "dev": true, + "requires": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + } + }, + "yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "dev": true + } + } + }, + "@commitlint/config-conventional": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/config-conventional/-/config-conventional-19.2.2.tgz", + "integrity": "sha512-mLXjsxUVLYEGgzbxbxicGPggDuyWNkf25Ht23owXIH+zV2pv1eJuzLK3t1gDY5Gp6pxdE60jZnWUY5cvgL3ufw==", + "dev": true, + "requires": { + "@commitlint/types": "^19.0.3", + "conventional-changelog-conventionalcommits": "^7.0.2" + } + }, + "@commitlint/config-validator": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/config-validator/-/config-validator-19.0.3.tgz", + "integrity": "sha512-2D3r4PKjoo59zBc2auodrSCaUnCSALCx54yveOFwwP/i2kfEAQrygwOleFWswLqK0UL/F9r07MFi5ev2ohyM4Q==", + "dev": true, + "requires": { + "@commitlint/types": "^19.0.3", + "ajv": "^8.11.0" + }, + "dependencies": { + "ajv": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", + "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", + "dev": true, + "requires": { + "fast-deep-equal": "^3.1.1", + "json-schema-traverse": "^1.0.0", + "require-from-string": "^2.0.2", + "uri-js": "^4.2.2" + } + }, + "json-schema-traverse": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", + "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", + "dev": true + } + } + }, + "@commitlint/ensure": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/ensure/-/ensure-19.0.3.tgz", + "integrity": "sha512-SZEpa/VvBLoT+EFZVb91YWbmaZ/9rPH3ESrINOl0HD2kMYsjvl0tF7nMHh0EpTcv4+gTtZBAe1y/SS6/OhfZzQ==", + "dev": true, + "requires": { + "@commitlint/types": "^19.0.3", + "lodash.camelcase": "^4.3.0", + "lodash.kebabcase": "^4.1.1", + "lodash.snakecase": "^4.1.1", + "lodash.startcase": "^4.4.0", + "lodash.upperfirst": "^4.3.1" + } + }, + "@commitlint/execute-rule": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/execute-rule/-/execute-rule-19.0.0.tgz", + "integrity": "sha512-mtsdpY1qyWgAO/iOK0L6gSGeR7GFcdW7tIjcNFxcWkfLDF5qVbPHKuGATFqRMsxcO8OUKNj0+3WOHB7EHm4Jdw==", + "dev": true + }, + "@commitlint/format": { + "version": "19.3.0", + "resolved": "https://registry.npmjs.org/@commitlint/format/-/format-19.3.0.tgz", + "integrity": "sha512-luguk5/aF68HiF4H23ACAfk8qS8AHxl4LLN5oxPc24H+2+JRPsNr1OS3Gaea0CrH7PKhArBMKBz5RX9sA5NtTg==", + "dev": true, + "requires": { + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + } + } + }, + "@commitlint/is-ignored": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/is-ignored/-/is-ignored-19.2.2.tgz", + "integrity": "sha512-eNX54oXMVxncORywF4ZPFtJoBm3Tvp111tg1xf4zWXGfhBPKpfKG6R+G3G4v5CPlRROXpAOpQ3HMhA9n1Tck1g==", + "dev": true, + "requires": { + "@commitlint/types": "^19.0.3", + "semver": "^7.6.0" + }, + "dependencies": { + "semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "requires": { + "lru-cache": "^6.0.0" + } + } + } + }, + "@commitlint/lint": { + "version": "19.2.2", + "resolved": "https://registry.npmjs.org/@commitlint/lint/-/lint-19.2.2.tgz", + "integrity": "sha512-xrzMmz4JqwGyKQKTpFzlN0dx0TAiT7Ran1fqEBgEmEj+PU98crOFtysJgY+QdeSagx6EDRigQIXJVnfrI0ratA==", + "dev": true, + "requires": { + "@commitlint/is-ignored": "^19.2.2", + "@commitlint/parse": "^19.0.3", + "@commitlint/rules": "^19.0.3", + "@commitlint/types": "^19.0.3" + } + }, + "@commitlint/load": { + "version": "19.2.0", + "resolved": "https://registry.npmjs.org/@commitlint/load/-/load-19.2.0.tgz", + "integrity": "sha512-XvxxLJTKqZojCxaBQ7u92qQLFMMZc4+p9qrIq/9kJDy8DOrEa7P1yx7Tjdc2u2JxIalqT4KOGraVgCE7eCYJyQ==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^19.0.3", + "@commitlint/execute-rule": "^19.0.0", + "@commitlint/resolve-extends": "^19.1.0", + "@commitlint/types": "^19.0.3", + "chalk": "^5.3.0", + "cosmiconfig": "^9.0.0", + "cosmiconfig-typescript-loader": "^5.0.0", + "lodash.isplainobject": "^4.0.6", + "lodash.merge": "^4.6.2", + "lodash.uniq": "^4.5.0" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + }, + "cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "dev": true, + "requires": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + } + } + } + }, + "@commitlint/message": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/message/-/message-19.0.0.tgz", + "integrity": "sha512-c9czf6lU+9oF9gVVa2lmKaOARJvt4soRsVmbR7Njwp9FpbBgste5i7l/2l5o8MmbwGh4yE1snfnsy2qyA2r/Fw==", + "dev": true + }, + "@commitlint/parse": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/parse/-/parse-19.0.3.tgz", + "integrity": "sha512-Il+tNyOb8VDxN3P6XoBBwWJtKKGzHlitEuXA5BP6ir/3loWlsSqDr5aecl6hZcC/spjq4pHqNh0qPlfeWu38QA==", + "dev": true, + "requires": { + "@commitlint/types": "^19.0.3", + "conventional-changelog-angular": "^7.0.0", + "conventional-commits-parser": "^5.0.0" + } + }, + "@commitlint/read": { + "version": "19.2.1", + "resolved": "https://registry.npmjs.org/@commitlint/read/-/read-19.2.1.tgz", + "integrity": "sha512-qETc4+PL0EUv7Q36lJbPG+NJiBOGg7SSC7B5BsPWOmei+Dyif80ErfWQ0qXoW9oCh7GTpTNRoaVhiI8RbhuaNw==", + "dev": true, + "requires": { + "@commitlint/top-level": "^19.0.0", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1", + "git-raw-commits": "^4.0.0", + "minimist": "^1.2.8" + }, + "dependencies": { + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + } + } + }, + "@commitlint/resolve-extends": { + "version": "19.1.0", + "resolved": "https://registry.npmjs.org/@commitlint/resolve-extends/-/resolve-extends-19.1.0.tgz", + "integrity": "sha512-z2riI+8G3CET5CPgXJPlzftH+RiWYLMYv4C9tSLdLXdr6pBNimSKukYP9MS27ejmscqCTVA4almdLh0ODD2KYg==", + "dev": true, + "requires": { + "@commitlint/config-validator": "^19.0.3", + "@commitlint/types": "^19.0.3", + "global-directory": "^4.0.1", + "import-meta-resolve": "^4.0.0", + "lodash.mergewith": "^4.6.2", + "resolve-from": "^5.0.0" + }, + "dependencies": { + "resolve-from": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", + "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", + "dev": true + } + } + }, + "@commitlint/rules": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/rules/-/rules-19.0.3.tgz", + "integrity": "sha512-TspKb9VB6svklxNCKKwxhELn7qhtY1rFF8ls58DcFd0F97XoG07xugPjjbVnLqmMkRjZDbDIwBKt9bddOfLaPw==", + "dev": true, + "requires": { + "@commitlint/ensure": "^19.0.3", + "@commitlint/message": "^19.0.0", + "@commitlint/to-lines": "^19.0.0", + "@commitlint/types": "^19.0.3", + "execa": "^8.0.1" + }, + "dependencies": { + "execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "dev": true, + "requires": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + } + }, + "get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "dev": true + }, + "is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "dev": true + }, + "mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "dev": true + }, + "npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "dev": true, + "requires": { + "path-key": "^4.0.0" + } + }, + "onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "dev": true, + "requires": { + "mimic-fn": "^4.0.0" + } + }, + "path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "dev": true + }, + "signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "dev": true + }, + "strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "dev": true + } + } + }, + "@commitlint/to-lines": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/to-lines/-/to-lines-19.0.0.tgz", + "integrity": "sha512-vkxWo+VQU5wFhiP9Ub9Sre0FYe019JxFikrALVoD5UGa8/t3yOJEpEhxC5xKiENKKhUkTpEItMTRAjHw2SCpZw==", + "dev": true + }, + "@commitlint/top-level": { + "version": "19.0.0", + "resolved": "https://registry.npmjs.org/@commitlint/top-level/-/top-level-19.0.0.tgz", + "integrity": "sha512-KKjShd6u1aMGNkCkaX4aG1jOGdn7f8ZI8TR1VEuNqUOjWTOdcDSsmglinglJ18JTjuBX5I1PtjrhQCRcixRVFQ==", + "dev": true, + "requires": { + "find-up": "^7.0.0" + }, + "dependencies": { + "find-up": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-7.0.0.tgz", + "integrity": "sha512-YyZM99iHrqLKjmt4LJDj58KI+fYyufRLBSYcqycxf//KpBk9FoewoGX0450m9nB44qrZnovzC2oeP5hUibxc/g==", + "dev": true, + "requires": { + "locate-path": "^7.2.0", + "path-exists": "^5.0.0", + "unicorn-magic": "^0.1.0" + } + }, + "locate-path": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-7.2.0.tgz", + "integrity": "sha512-gvVijfZvn7R+2qyPX8mAuKcFGDf6Nc61GdvGafQsHL0sBIxfKzA+usWn4GFC/bk+QdwPUD4kWFJLhElipq+0VA==", + "dev": true, + "requires": { + "p-locate": "^6.0.0" + } + }, + "p-limit": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-4.0.0.tgz", + "integrity": "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ==", + "dev": true, + "requires": { + "yocto-queue": "^1.0.0" + } + }, + "p-locate": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-6.0.0.tgz", + "integrity": "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw==", + "dev": true, + "requires": { + "p-limit": "^4.0.0" + } + }, + "path-exists": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-5.0.0.tgz", + "integrity": "sha512-RjhtfwJOxzcFmNOi6ltcbcu4Iu+FL3zEj83dk4kAS+fVpTxXLO1b38RvJgT/0QwvV/L3aY9TAnyv0EOqW4GoMQ==", + "dev": true + }, + "yocto-queue": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-1.0.0.tgz", + "integrity": "sha512-9bnSc/HEW2uRy67wc+T8UwauLuPJVn28jb+GtJY16iiKWyvmYJRXVT4UamsAEGQfPohgr2q4Tq0sQbQlxTfi1g==", + "dev": true + } + } + }, + "@commitlint/types": { + "version": "19.0.3", + "resolved": "https://registry.npmjs.org/@commitlint/types/-/types-19.0.3.tgz", + "integrity": "sha512-tpyc+7i6bPG9mvaBbtKUeghfyZSDgWquIDfMgqYtTbmZ9Y9VzEm2je9EYcQ0aoz5o7NvGS+rcDec93yO08MHYA==", + "dev": true, + "requires": { + "@types/conventional-commits-parser": "^5.0.0", + "chalk": "^5.3.0" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "dev": true + } + } + }, "@csstools/convert-colors": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/@csstools/convert-colors/-/convert-colors-1.4.0.tgz", @@ -28516,6 +30230,15 @@ "integrity": "sha512-ebDJ9b0e702Yr7pWgB0jzm+CX4Srzz8RcXtLJDJB+BSccqMa36uyH/zUsSYao5+BD1ytv3k3rPYCq4mAE1hsXA==", "dev": true }, + "@types/conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@types/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-loB369iXNmAZglwWATL+WRe+CRMmmBPtpolYzIebFaX4YA3x+BEfLqhUAV9WanycKI3TG1IMr5bMJDajDKLlUQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/cookie": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", @@ -30175,6 +31898,12 @@ "integrity": "sha512-hNfzcOV8W4NdualtqBFPyVO+54DSJuZGY9qT4pRroB6S9e3iiido2ISIC5h9R2sPJ8H3FHCIiEnsv1lPXO3KtQ==", "dev": true }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha512-c5AMf34bKdvPhQ7tBGhqkgKNUzMr4WUs+WDtC2ZUGOUncbxKMTvqxYctiseW3+L4bA8ec+GcZ6/A/FW4m8ukng==", + "dev": true + }, "array-includes": { "version": "3.1.7", "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", @@ -31056,6 +32785,16 @@ "version": "1.0.1", "dev": true }, + "compare-func": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-2.0.0.tgz", + "integrity": "sha512-zHig5N+tPWARooBnb0Zx1MFcdfpyJrfTJ3Y5L+IFvUm8rM74hHz66z0gw0x4tijh5CorKkKUCnW82R2vmpeCRA==", + "dev": true, + "requires": { + "array-ify": "^1.0.0", + "dot-prop": "^5.1.0" + } + }, "component-emitter": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz", @@ -31184,6 +32923,36 @@ "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", "dev": true }, + "conventional-changelog-angular": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-7.0.0.tgz", + "integrity": "sha512-ROjNchA9LgfNMTTFSIWPzebCwOGFdgkEq45EnvvrmSLvCtAw0HSmrCs7/ty+wAeYUZyNay0YMUNYFTRL72PkBQ==", + "dev": true, + "requires": { + "compare-func": "^2.0.0" + } + }, + "conventional-changelog-conventionalcommits": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-conventionalcommits/-/conventional-changelog-conventionalcommits-7.0.2.tgz", + "integrity": "sha512-NKXYmMR/Hr1DevQegFB4MwfM5Vv0m4UIxKZTTYuD98lpTknaZlSRrDOG4X7wIXpGkfsYxZTghUN+Qq+T0YQI7w==", + "dev": true, + "requires": { + "compare-func": "^2.0.0" + } + }, + "conventional-commits-parser": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-5.0.0.tgz", + "integrity": "sha512-ZPMl0ZJbw74iS9LuX9YIAiW8pfM5p3yh2o/NbXHbkFuZzY5jvdi5jFycEOkmBW5H5I7nA+D6f3UcsCLP2vvSEA==", + "dev": true, + "requires": { + "is-text-path": "^2.0.0", + "JSONStream": "^1.3.5", + "meow": "^12.0.1", + "split2": "^4.0.0" + } + }, "convert-source-map": { "version": "1.7.0", "requires": { @@ -31302,6 +33071,15 @@ "yaml": "^1.10.0" } }, + "cosmiconfig-typescript-loader": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig-typescript-loader/-/cosmiconfig-typescript-loader-5.0.0.tgz", + "integrity": "sha512-+8cK7jRAReYkMwMiG+bxhcNKiHJDM6bR9FD/nGBXOWdMLuYawjF5cGrtLilJ+LGd3ZjCXnJjR5DkfWPoIVlqJA==", + "dev": true, + "requires": { + "jiti": "^1.19.1" + } + }, "critters": { "version": "0.0.12", "resolved": "https://registry.npmjs.org/critters/-/critters-0.0.12.tgz", @@ -31920,6 +33698,12 @@ "d3-transition": "2 - 3" } }, + "dargs": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-8.1.0.tgz", + "integrity": "sha512-wAV9QHOsNbwnWdNW2FYvE1P56wtgSbM+3SZcdGiWQILwVjACCXDCI3Ai8QlCjMDB8YK5zySiXZYBiwGmNY3lnw==", + "dev": true + }, "date-format": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/date-format/-/date-format-4.0.14.tgz", @@ -32278,6 +34062,15 @@ "domhandler": "^4.2.0" } }, + "dot-prop": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.3.0.tgz", + "integrity": "sha512-QM8q3zDe58hqUqjraQOmzZ1LIH9SWQJTlEKCH4kJ2oQvLZk7RbQXvtDM2XEq3fwkV9CCvvH4LA0AV+ogFsBM2Q==", + "dev": true, + "requires": { + "is-obj": "^2.0.0" + } + }, "ee-first": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", @@ -34317,6 +36110,17 @@ "integrity": "sha512-Ln0UQDlxH1BapMu3GPtf7CuYNwRZf2gwCuPqbyG6pB8WfmFpzqcy4xtAaAMUhnNqjMKTiCPZG2oMT3YSx8U2NA==", "dev": true }, + "git-raw-commits": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-4.0.0.tgz", + "integrity": "sha512-ICsMM1Wk8xSGMowkOmPrzo2Fgmfo4bMHLNX6ytHjajRJUqvHOw/TFapQ+QG75c3X/tTDDhOSRPGC52dDbNM8FQ==", + "dev": true, + "requires": { + "dargs": "^8.0.0", + "meow": "^12.0.1", + "split2": "^4.0.0" + } + }, "gl-matrix": { "version": "3.4.3" }, @@ -34345,6 +36149,23 @@ "integrity": "sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==", "dev": true }, + "global-directory": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/global-directory/-/global-directory-4.0.1.tgz", + "integrity": "sha512-wHTUcDUoZ1H5/0iVqEudYW4/kAlN5cZ3j/bXn0Dpbizl9iaUVeWSHqiOjsgk6OW2bkLclbBjzewBz6weQ1zA2Q==", + "dev": true, + "requires": { + "ini": "4.1.1" + }, + "dependencies": { + "ini": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", + "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==", + "dev": true + } + } + }, "globals": { "version": "13.17.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.17.0.tgz", @@ -34886,6 +36707,12 @@ "debug": "4" } }, + "human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "dev": true + }, "humanize-ms": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/humanize-ms/-/humanize-ms-1.2.1.tgz", @@ -34984,6 +36811,12 @@ "resolve-cwd": "^2.0.0" } }, + "import-meta-resolve": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.0.0.tgz", + "integrity": "sha512-okYUR7ZQPH+efeuMJGlq4f8ubUgO50kByRPyt/Cy1Io4PSRsPjxME+YlVaCOx+NIToW7hCsZNFJyTPFFKepRSA==", + "dev": true + }, "imurmurhash": { "version": "0.1.4", "dev": true @@ -35345,6 +37178,12 @@ "has-tostringtag": "^1.0.0" } }, + "is-obj": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz", + "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==", + "dev": true + }, "is-path-cwd": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-2.2.0.tgz", @@ -35428,6 +37267,15 @@ "has-symbols": "^1.0.2" } }, + "is-text-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-2.0.0.tgz", + "integrity": "sha512-+oDTluR6WEjdXEJMnC2z6A4FRwFoYuvShVVEGsS7ewc0UTi2QtAKMDJuL4BDEVt+5T7MjFo12RP8ghOM75oKJw==", + "dev": true, + "requires": { + "text-extensions": "^2.0.0" + } + }, "is-typed-array": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.12.tgz", @@ -35565,6 +37413,12 @@ "supports-color": "^7.0.0" } }, + "jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "dev": true + }, "jju": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/jju/-/jju-1.4.0.tgz", @@ -35683,6 +37537,16 @@ "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", "dev": true }, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dev": true, + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, "karma": { "version": "6.3.20", "resolved": "https://registry.npmjs.org/karma/-/karma-6.3.20.tgz", @@ -36170,6 +38034,18 @@ "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", "dev": true }, + "lodash.isplainobject": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", + "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", + "dev": true + }, + "lodash.kebabcase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", + "integrity": "sha512-N8XRTIMMqqDgSy4VLKPnJ/+hpGZN+PHQiJnSenYqPaVV/NCqEogTnAdZLQiGKhxX+JCs8waWq2t1XHWKOmlY8g==", + "dev": true + }, "lodash.memoize": { "version": "4.1.2", "dev": true @@ -36178,10 +38054,34 @@ "version": "4.6.2", "dev": true }, + "lodash.mergewith": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", + "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", + "dev": true + }, + "lodash.snakecase": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lodash.snakecase/-/lodash.snakecase-4.1.1.tgz", + "integrity": "sha512-QZ1d4xoBHYUeuouhEq3lk3Uq7ldgyFXGBhg04+oRLnIz8o9T65Eh+8YdroUwn846zchkA9yDsDl5CVVaV2nqYw==", + "dev": true + }, + "lodash.startcase": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.startcase/-/lodash.startcase-4.4.0.tgz", + "integrity": "sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==", + "dev": true + }, "lodash.uniq": { "version": "4.5.0", "dev": true }, + "lodash.upperfirst": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/lodash.upperfirst/-/lodash.upperfirst-4.3.1.tgz", + "integrity": "sha512-sReKOYJIJf74dhJONhU4e0/shzi1trVbSWDOhKYE5XV2O+H7Sb2Dihwuc7xWxVl+DgFPyTqIN3zMfT9cq5iWDg==", + "dev": true + }, "log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", @@ -36482,6 +38382,12 @@ } } }, + "meow": { + "version": "12.1.1", + "resolved": "https://registry.npmjs.org/meow/-/meow-12.1.1.tgz", + "integrity": "sha512-BhXM0Au22RwUneMPwSCnyhTOizdWoIEPU9sp0Aqa1PnDMR5Wv2FGXYDjuzJEIX+Eo2Rb8xuYe5jrnm5QowQFkw==", + "dev": true + }, "merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -36598,7 +38504,9 @@ } }, "minimist": { - "version": "1.2.6" + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==" }, "minipass": { "version": "3.3.6", @@ -40921,6 +42829,12 @@ "minimist": "^1.2.0" } }, + "split2": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", + "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", + "dev": true + }, "sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -41461,6 +43375,12 @@ } } }, + "text-extensions": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-2.4.0.tgz", + "integrity": "sha512-te/NtwBwfiNRLf9Ijqx3T0nlqZiQ2XrrtBvu+cLL8ZRrGkO0NHTug8MYFKyoSrv/sHTaSKfilUkizV6XhxMJ3g==", + "dev": true + }, "text-table": { "version": "0.2.0", "dev": true @@ -41768,6 +43688,12 @@ "integrity": "sha512-6t3foTQI9qne+OZoVQB/8x8rk2k1eVy1gRXhV3oFQ5T6R1dqQ1xtin3XqSlx3+ATBkliTaR/hHyJBm+LVPNM8w==", "dev": true }, + "unicorn-magic": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/unicorn-magic/-/unicorn-magic-0.1.0.tgz", + "integrity": "sha512-lRfVq8fE8gz6QMBuDM6a+LO3IAzTi05H6gCVaUpir2E1Rwpo4ZUog45KpNXKC/Mn3Yb9UDuHumeFTo9iV/D9FQ==", + "dev": true + }, "union-value": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz", diff --git a/package.json b/package.json index 3b177ef39..913a87bd0 100644 --- a/package.json +++ b/package.json @@ -46,6 +46,8 @@ "version": "sh update-version.sh" }, "devDependencies": { + "@commitlint/cli": "^19.3.0", + "@commitlint/config-conventional": "^19.2.2", "@types/node": "^16.11.14", "@typescript-eslint/eslint-plugin": "^5.41.0", "@typescript-eslint/parser": "^5.41.0",