@theseam/ui-common 2.0.1-beta.110 → 2.0.1-beta.114

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,7 +1,7 @@
1
1
  import { ThemeNames, OutlineThemeNames } from '@theseam/ui-common/models';
2
2
  import { useStoryContext } from 'storybook/preview-api';
3
3
  import * as i0 from '@angular/core';
4
- import { Component, InjectionToken, Injectable, APP_INITIALIZER, NgModule, signal, computed, Injector, Input, ChangeDetectionStrategy, ElementRef, APP_BOOTSTRAP_LISTENER } from '@angular/core';
4
+ import { Component, InjectionToken, Injectable, APP_INITIALIZER, NgModule, signal, computed, Injector, Input, ChangeDetectionStrategy, ElementRef, APP_BOOTSTRAP_LISTENER, ɵgetLContext as _getLContext } from '@angular/core';
5
5
  import * as i1 from '@angular/router';
6
6
  import { Router, NavigationEnd, RouterModule } from '@angular/router';
7
7
  import { filter, take } from 'rxjs/operators';
@@ -594,9 +594,62 @@ const getInjectorFromArgs = (args, argName = INJECTOR_TO_ARGS_PROPERTY_NAME) =>
594
594
  return injector;
595
595
  };
596
596
 
597
+ /**
598
+ * Index of the context slot in Angular's internal `LView` array.
599
+ *
600
+ * Unlike `ng.getComponent`, `ɵgetLContext` is a real (if private) export
601
+ * rather than a devMode-only global, so this helper works in a production
602
+ * build — verified by running the story suite against a built
603
+ * `storybook-static`. What it IS pinned to is Angular's internal `LView`
604
+ * layout: if this slot index ever moves, `getComponentInstance()` returns the
605
+ * wrong object or null rather than failing loudly. Re-verify on a major
606
+ * Angular upgrade, against a production build rather than the dev server.
607
+ */
608
+ const CONTEXT = 8;
609
+ function getComponentInstance(element, componentType) {
610
+ if (!element)
611
+ return null;
612
+ const ctx = _getLContext(element);
613
+ if (!ctx)
614
+ return null;
615
+ if (ctx.component != null) {
616
+ return match(ctx.component, componentType);
617
+ }
618
+ const lView = ctx.lView;
619
+ if (!lView)
620
+ return null;
621
+ // Host component of this node (same as ng.getComponent)
622
+ const atNode = getComponentAtNode(lView, ctx.nodeIndex);
623
+ if (atNode != null) {
624
+ const matched = match(atNode, componentType);
625
+ if (matched)
626
+ return matched;
627
+ }
628
+ // Fallback: owning component view context (same idea as ng.getOwningComponent)
629
+ const owning = lView[CONTEXT];
630
+ return match(owning, componentType);
631
+ }
632
+ function match(value, type) {
633
+ if (value == null)
634
+ return null;
635
+ if (!type)
636
+ return value;
637
+ return value instanceof type ? value : null;
638
+ }
639
+ function getComponentAtNode(lView, nodeIndex) {
640
+ const slot = lView[nodeIndex];
641
+ if (!slot)
642
+ return null;
643
+ // Component host slot is either an LView or an LContainer whose [0]/HOST is the LView
644
+ const childView = Array.isArray(slot) && Array.isArray(slot[1]) ? slot : slot[0];
645
+ if (!Array.isArray(childView))
646
+ return null;
647
+ return childView[CONTEXT] ?? null;
648
+ }
649
+
597
650
  /**
598
651
  * Generated bundle index. Do not edit.
599
652
  */
600
653
 
601
- export { INJECTOR_TO_ARGS_PROPERTY_NAME, STORY_INITIAL_ROUTE_URL, StoryEmptyComponent, StoryEmptyWithRouteComponent, StoryHelperComponentsModule, StoryInitialRouteModule, StoryInitialRouteService, StoryModalContainerComponent, StoryPreferencesAccessorService, addInjectorGetterToArgs, argsToTpl, buttonTypeArgType, getInjectorFromArgs, onStoryBootstrappedTrigger, routeButton, routesArgType, sizeArgType, storyInitialRouteFactory, storyModalDecorator, themeArgType, themeWithOutlineArgType };
654
+ export { INJECTOR_TO_ARGS_PROPERTY_NAME, STORY_INITIAL_ROUTE_URL, StoryEmptyComponent, StoryEmptyWithRouteComponent, StoryHelperComponentsModule, StoryInitialRouteModule, StoryInitialRouteService, StoryModalContainerComponent, StoryPreferencesAccessorService, addInjectorGetterToArgs, argsToTpl, buttonTypeArgType, getComponentInstance, getInjectorFromArgs, onStoryBootstrappedTrigger, routeButton, routesArgType, sizeArgType, storyInitialRouteFactory, storyModalDecorator, themeArgType, themeWithOutlineArgType };
602
655
  //# sourceMappingURL=theseam-ui-common-story-helpers.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"theseam-ui-common-story-helpers.mjs","sources":["../../../projects/ui-common/story-helpers/arg-type-helpers.ts","../../../projects/ui-common/story-helpers/args-to-tpl.ts","../../../projects/ui-common/story-helpers/story-empty.component.ts","../../../projects/ui-common/story-helpers/initial-route-factory.ts","../../../projects/ui-common/story-helpers/initial-route.service.ts","../../../projects/ui-common/story-helpers/story-initial-route.ts","../../../projects/ui-common/story-helpers/route-button.ts","../../../projects/ui-common/story-helpers/routes-arg-type.ts","../../../projects/ui-common/story-helpers/story-empty-with-route.component.ts","../../../projects/ui-common/story-helpers/story-modal-container.component.ts","../../../projects/ui-common/story-helpers/story-helper-components.module.ts","../../../projects/ui-common/story-helpers/story-modal-decorator.ts","../../../projects/ui-common/story-helpers/on-story-bootstrapped-exec.ts","../../../projects/ui-common/story-helpers/on-story-bootstrapped-trigger.ts","../../../projects/ui-common/story-helpers/story-preferences-accessor.service.ts","../../../projects/ui-common/story-helpers/add-injector-to-args.ts","../../../projects/ui-common/story-helpers/theseam-ui-common-story-helpers.ts"],"sourcesContent":["// import { ArgType } from '@storybook/addons'\n\nimport { OutlineThemeNames, ThemeNames } from '@theseam/ui-common/models'\n\ndeclare type ArgType = any\n\nexport const themeArgType: ArgType = {\n options: ThemeNames,\n control: {\n type: 'select',\n },\n description: `Theme style.`,\n}\n\nexport const themeWithOutlineArgType: ArgType = {\n options: [...ThemeNames, ...OutlineThemeNames],\n control: {\n type: 'select',\n },\n description: `Theme style.`,\n}\n\nexport const sizeArgType: ArgType = {\n options: [undefined, 'sm', 'lg'],\n control: {\n type: 'select',\n },\n description: `Size.`,\n}\n\nexport const buttonTypeArgType: ArgType = {\n options: ['button', 'submit'],\n control: {\n type: 'select',\n },\n description: `Button type.`,\n}\n","/* eslint-disable no-prototype-builtins */\nimport { action, HandlerFunction } from 'storybook/actions'\nimport { AngularRenderer, ArgTypes } from '@storybook/angular'\nimport { useStoryContext } from 'storybook/preview-api'\n\nexport interface ArgsTplParts {\n actions: { [prop: string]: HandlerFunction }\n tplfragment: string\n}\n\n/**\n * This is an attempt at simplifying the use of auto-generated args in stories\n * defined with `template`, since Angular doesn't have a way to simply use a\n * spread operator syntax.\n *\n * @experimental\n */\n// export function argsToTplParts(args: any, argTypes: ArgTypes): ArgsTplParts {\n// // console.log({ args, argTypes })\n// const parts: ArgsTplParts = {\n// actions: {},\n// tplfragment: ''\n// }\n\n// Object.keys(argTypes).forEach(k => {\n// // Inputs\n// if (\n// // Is in the inputs category\n// argTypes[k].table.category === 'inputs' &&\n// // Needs a control to be able to change from auto-generated args.\n// argTypes[k]?.hasOwnProperty('control') &&\n// // Assuming the arg might not be in props if there isn't an arg value.\n// args.hasOwnProperty(k)\n// ) {\n// parts.tplfragment += `[${k}]=\"${k}\" `\n// }\n\n// // Outputs\n// if (\n// // Is in the outputs category\n// argTypes[k]?.table?.category === 'outputs'\n// ) {\n// // Without access to props, I don't know if I can get an action into the\n// // template context like this.\n// parts.tplfragment += `(${k})=\"${k}($event)\" `\n// parts.actions[k] = action(k)\n// }\n// })\n\n// return parts\n// }\n\nfunction removeDuplicates(arr: string[]) {\n const seen: { [k: string]: boolean } = {}\n return arr.filter((item) => {\n if (!seen[item]) {\n seen[item] = true\n return true\n }\n return false\n })\n}\n\nexport interface ArgsTplOptions {\n /**\n * Properties to always bind to the template.\n */\n alwaysBind?: string[]\n /**\n * Properties to exclude from bidning to the template.\n */\n exclude?: string[]\n}\n\n/**\n * This is an attempt at simplifying the use of auto-generated args in stories\n * defined with `template`, since Angular doesn't have a way to simply use a\n * spread operator syntax.\n *\n * @experimental\n */\nexport function argsToTpl(options?: ArgsTplOptions) {\n const context = useStoryContext<AngularRenderer>()\n\n const exclude = [\n ...(context?.parameters?.argsToTplOptions?.exclude || []),\n ...(options?.exclude || []),\n ]\n\n const alwaysBind = context?.parameters?.argsToTplOptions?.alwaysBind || []\n\n const props = removeDuplicates([...alwaysBind, ...Object.keys(context.args)])\n\n const parts = props\n .filter((k) => exclude.indexOf(k) === -1)\n .map((k) => {\n // Outputs\n if (\n context.argTypes[k]?.hasOwnProperty('action') &&\n (context.args.hasOwnProperty(k) || alwaysBind.indexOf(k) !== -1)\n ) {\n return `(${k})=\"${k}($event)\"`\n }\n\n // Inputs\n if (context.args.hasOwnProperty(k) || alwaysBind.indexOf(k) !== -1) {\n return `[${k}]=\"${k}\"`\n }\n })\n\n return parts.length > 0 ? parts.join(' ') : ''\n}\n","import { Component } from '@angular/core'\n\n@Component({ template: ``, standalone: true })\nexport class StoryEmptyComponent {}\n","import { StoryInitialRouteService } from './initial-route.service'\n\nexport function storyInitialRouteFactory(\n _storyInitialRouteService: StoryInitialRouteService,\n) {\n return () => _storyInitialRouteService.setInitialRoute()\n}\n","import { Injectable, InjectionToken, Injector } from '@angular/core'\nimport { NavigationEnd, Router } from '@angular/router'\nimport { filter, take } from 'rxjs/operators'\n\nexport const STORY_INITIAL_ROUTE_URL = new InjectionToken<any>(\n 'STORY_INITIAL_ROUTE_URL',\n)\n\n@Injectable()\nexport class StoryInitialRouteService {\n constructor(private _injector: Injector) {}\n\n public setInitialRoute() {\n const _router = this._injector.get(Router)\n const url = this._injector.get(STORY_INITIAL_ROUTE_URL)\n if (_router.navigated) {\n _router.navigateByUrl(url)\n } else {\n _router.events\n .pipe(\n filter((e) => e instanceof NavigationEnd),\n take(1),\n )\n .subscribe(() => {\n _router.navigateByUrl(url)\n })\n }\n }\n}\n","import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'\n\nimport { storyInitialRouteFactory } from './initial-route-factory'\nimport {\n StoryInitialRouteService,\n STORY_INITIAL_ROUTE_URL,\n} from './initial-route.service'\n\n@NgModule()\nexport class StoryInitialRouteModule {\n static forRoot(url: string): ModuleWithProviders<StoryInitialRouteModule> {\n return {\n ngModule: StoryInitialRouteModule,\n providers: [\n StoryInitialRouteService,\n {\n provide: APP_INITIALIZER,\n useFactory: storyInitialRouteFactory,\n deps: [StoryInitialRouteService],\n multi: true,\n },\n { provide: STORY_INITIAL_ROUTE_URL, useValue: url },\n ],\n }\n }\n}\n","// import { button } from '@storybook/addon-knobs'\n\n/**\n * Until I find a way to avoid '@storybook/addon-knobs' from interfering with\n * NgZone I can't import it in the knob when built by ng-packagr.\n */\nexport function routeButton(buttonKnob: any, url: string) {\n return buttonKnob(url, () => {\n location.hash = `#${url}`\n return false\n })\n}\n","// import { ArgType } from '@storybook/addons'\n\ndeclare const __STORYBOOK_ADDONS: any\n\nfunction goToHashUrl(url: string): void {\n location.hash = `#${url}`\n}\n\n// __STORYBOOK_ADDONS.getChannel().on('custom/go-to-hash', (data: { hash: string }) => {\n\n// goToHashUrl(data.hash)\n// })\n\n// __STORYBOOK_ADDONS.getChannel().on('storyArgsUpdated', (data: { hash: string }) => {\n// console.log('storyArgsUpdated')\n// })\n\nexport function routesArgType(routes: string[]) /*: ArgType*/ {\n return {\n options: routes,\n control: {\n type: 'select',\n // Runs in the 'manager', so I am emitting to a channel in the 'preview'.\n onChange: (e: any, a: any) => {\n __STORYBOOK_ADDONS.getChannel().emit('custom/go-to-hash', { hash: e })\n return e\n },\n },\n }\n}\n","import { Component } from '@angular/core'\n\n@Component({ template: `<router-outlet></router-outlet>`, standalone: false })\nexport class StoryEmptyWithRouteComponent {}\n","import { CommonModule } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n Injector,\n Input,\n signal,\n TemplateRef,\n} from '@angular/core'\nimport { of } from 'rxjs'\n\nimport { ModalConfig, ModalRef, MODAL_DATA } from '@theseam/ui-common/modal'\nimport type { ComponentType } from '@theseam/ui-common/models'\nimport { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar'\n\nclass FakeModalRef<T, R = any> implements Partial<ModalRef<T, R>> {\n afterOpened() {\n return of(undefined)\n }\n\n close(_dialogResult?: R): void {\n /* no-op in stories */\n }\n}\n\n/**\n * Renders its content (or an imperatively provided component/template) inside\n * a stand-in modal frame so stories can preview components that are normally\n * opened through the modal service.\n *\n * Three ways to provide content, checked in order:\n * 1. `[component]` input — renders via `ngComponentOutlet`. Kept for\n * compatibility with existing app stories.\n * 2. `[template]` input — renders a `TemplateRef` via `ngTemplateOutlet`.\n * 3. Projected content (`<ng-content>`) — the preferred form for new stories\n * because Storybook's default template auto-binds inputs/outputs.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'story-modal-container-component',\n imports: [CommonModule, TheSeamOverlayScrollbarDirective],\n template: `\n <div class=\"cdk-overlay-container\">\n <div\n class=\"cdk-overlay-backdrop cdk-overlay-dark-backdrop cdk-overlay-backdrop-showing\"\n ></div>\n <div\n class=\"cdk-global-overlay-wrapper\"\n dir=\"ltr\"\n style=\"justify-content: flex-start; align-items: center; pointer-events: auto\"\n seamOverlayScrollbar\n >\n <div\n class=\"seam-modal-container modal-dialog modal-dialog-centered {{\n _modalSizeClass()\n }}\"\n tabindex=\"-1\"\n >\n <div class=\"modal-content\">\n @if (_component(); as c) {\n <ng-container\n *ngComponentOutlet=\"c; injector: _componentInjector()\"\n ></ng-container>\n } @else if (template) {\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n } @else {\n <ng-content></ng-content>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .seam-modal-container[tabindex='-1']:focus {\n outline: 0 !important;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StoryModalContainerComponent<T = unknown, D = any> {\n constructor(private readonly _injector: Injector) {}\n\n @Input()\n set component(c: ComponentType<T> | null | undefined) {\n this._component.set(c ?? null)\n }\n\n @Input()\n set data(d: D | null | undefined) {\n this._data.set(d ?? null)\n }\n\n @Input()\n set modalConfig(config: ModalConfig<D> | null | undefined) {\n this._modalConfig.set(config ?? null)\n }\n get modalConfig(): ModalConfig<D> | null {\n return this._modalConfig()\n }\n\n @Input() template?: TemplateRef<unknown> | null\n\n protected readonly _component = signal<ComponentType<T> | null>(null)\n private readonly _data = signal<D | null>(null)\n private readonly _modalConfig = signal<ModalConfig<D> | null>(null)\n\n protected readonly _componentInjector = computed(() =>\n this._createInjector(this._data()),\n )\n\n // No default size — stories opt into a Bootstrap modal size via\n // `modalConfig.modalSize`, matching how the real ModalService is used.\n protected readonly _modalSizeClass = computed(() => {\n const size = this._modalConfig()?.modalSize\n return size ? `modal-${size}` : ''\n })\n\n private _createInjector(data: D | null): Injector {\n return Injector.create({\n providers: [\n { provide: ModalRef, useClass: FakeModalRef, deps: [] },\n { provide: MODAL_DATA, useValue: data ?? undefined },\n ],\n parent: this._injector,\n })\n }\n}\n","import { CommonModule } from '@angular/common'\nimport { NgModule } from '@angular/core'\nimport { RouterModule } from '@angular/router'\n\nimport { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar'\n\nimport { StoryEmptyWithRouteComponent } from './story-empty-with-route.component'\nimport { StoryModalContainerComponent } from './story-modal-container.component'\n\n@NgModule({\n declarations: [StoryEmptyWithRouteComponent],\n imports: [\n CommonModule,\n RouterModule,\n TheSeamOverlayScrollbarDirective,\n StoryModalContainerComponent,\n ],\n exports: [StoryEmptyWithRouteComponent, StoryModalContainerComponent],\n})\nexport class StoryHelperComponentsModule {}\n","import { componentWrapperDecorator, Decorator } from '@storybook/angular'\n\nimport { ModalConfig } from '@theseam/ui-common/modal'\n\nimport { StoryModalContainerComponent } from './story-modal-container.component'\n\nexport interface StoryModalDecoratorOptions {\n /**\n * Passed through to `StoryModalContainerComponent`'s `modalConfig` input.\n * Commonly used to opt into a Bootstrap modal size, e.g.\n * `{ modalSize: 'lg' }`.\n */\n modalConfig?: ModalConfig\n}\n\n/**\n * Wraps a story's rendered component in `<story-modal-container-component>`\n * so it previews inside a stand-in modal frame. Storybook's default template\n * binds the story's args to the wrapped component, so inputs/outputs (e.g.\n * for the Actions addon) work without extra wiring.\n *\n * Use as an entry in a story's `decorators` array:\n *\n * ```ts\n * const meta: Meta<MyModalComponent> = {\n * title: 'Modal/My',\n * component: MyModalComponent,\n * decorators: [storyModalDecorator({ modalConfig: { modalSize: 'lg' } })],\n * }\n * ```\n */\nexport function storyModalDecorator(\n options?: StoryModalDecoratorOptions,\n): Decorator {\n return (storyFn, storyContext) => {\n const result = componentWrapperDecorator(\n (story) => `\n <story-modal-container-component [modalConfig]=\"_storyModalConfig\">\n ${story}\n </story-modal-container-component>\n `,\n )(storyFn, storyContext)\n\n return {\n ...result,\n props: {\n ...(result.props ?? {}),\n // Prefixed to avoid colliding with a story's own args.\n _storyModalConfig: options?.modalConfig ?? null,\n },\n moduleMetadata: {\n ...(result.moduleMetadata ?? {}),\n imports: [\n ...(result.moduleMetadata?.imports ?? []),\n StoryModalContainerComponent,\n ],\n },\n }\n }\n}\n","import { APP_BOOTSTRAP_LISTENER, ComponentRef } from '@angular/core'\n// import { STORY } from '@storybook/angular/dist/ts3.9/client/preview/angular/app.token'\n// import { StoryFnAngularReturnType } from '@storybook/angular/dist/ts3.9/client/preview/types'\nimport { Observable } from 'rxjs'\nimport { first } from 'rxjs/operators'\n\n/**\n * Can be used to access a stories component after the story has been bootstrapped.\n *\n * Example:\n * ```ts\n * @Component({\n * selector: 'story-example',\n * template: `Touched: {{ exControl.touched }}`\n * })\n * class StoryExampleComponent {\n * exControl = new FormControl('')\n * }\n *\n * export const TouchExample2 = () => ({\n * moduleMetadata: {\n * declarations: [ StoryExampleComponent ],\n * providers: [ onStoryBootstrappedExec((c: StoryExampleComponent) => c.exControl.markAsTouched()) ]\n * },\n * props: { },\n * component: StoryExampleComponent\n * })\n * ```\n */\n// export function onStoryBootstrappedExec<T = any>(callback: (component: T) => void) {\n// function bootstrapped(componentRef: ComponentRef<any>) {\n// const data = componentRef.instance.target.injector.get(STORY, null) as Observable<StoryFnAngularReturnType> | null\n// if (!data) {\n// console.warn(`STORY provider not found.`)\n// return\n// }\n// data?.pipe(first()).subscribe(story => {\n// if (!story.component) {\n// console.warn(`'onStoryBootstrappedExec' only supported on stories that provide 'component' property.`)\n// return\n// }\n\n// let c = null\n// for (let i = 0; i < componentRef.instance.target.length; i++) {\n// const tmp = componentRef.instance.target._embeddedViews[i].nodes?.find((f: any) => f?.instance instanceof story.component)\n// const comp = tmp?.instance\n// if (comp) {\n// c = comp\n// break\n// }\n// }\n\n// if (!c) {\n// console.warn(`Story component instance not found.`)\n// return\n// }\n\n// if (c) {\n// callback(c)\n// }\n// })\n// }\n\n// return {\n// provide: APP_BOOTSTRAP_LISTENER,\n// useValue: bootstrapped,\n// multi: true\n// }\n// }\n","import { APP_BOOTSTRAP_LISTENER, ComponentRef, ElementRef } from '@angular/core'\n\n// TODO: Consider supporting a target selection function, so that complex\n// selections that can't be expressed by a simple selector can be used.\n\n/**\n * Can be used to trigger an event on a target element when the story component has been bootstrapped.\n *\n * Example:\n * ```\n * export const TouchExample1 = () => ({\n * moduleMetadata: {\n * providers: [ onStoryBootstrappedTrigger('input', 'blur') ]\n * },\n * props: { control: new FormControl('') },\n * template: `\n * <input type=\"text\" [formControl]=\"control\">\n * Touched: {{ control.touched }}\n * `\n * })\n * ```\n */\nexport function onStoryBootstrappedTrigger(\n targetSelector: string,\n eventName: string,\n) {\n function bootstrapped(componentRef: ComponentRef<any>) {\n const elementRef = componentRef.injector.get(ElementRef, null)\n const target = elementRef?.nativeElement.querySelector(targetSelector)\n if (!target) {\n // eslint-disable-next-line no-console\n console.warn(\n `Unable to trigger event '${eventName}'. Target '${targetSelector}' not found.`,\n )\n }\n\n const e = document.createEvent('HTMLEvents')\n e.initEvent('blur', false, true)\n target.dispatchEvent(e)\n }\n\n return {\n provide: APP_BOOTSTRAP_LISTENER,\n useValue: bootstrapped,\n multi: true,\n }\n}\n","import { Injectable } from '@angular/core'\nimport { Observable, of } from 'rxjs'\n\nimport { TheSeamPreferencesAccessor } from '@theseam/ui-common/services'\n\nconst ACCESSOR_PREFIX = 'story-pref'\n\n@Injectable()\nexport class StoryPreferencesAccessorService\n implements TheSeamPreferencesAccessor\n{\n /**\n * Gets a preference.\n */\n public get(name: string): Observable<string> {\n // console.log('get', name)\n return of(localStorage.getItem(`${ACCESSOR_PREFIX}-${name}`) || '{}')\n }\n\n /**\n * Update a preference.\n */\n public update(name: string, value: string): Observable<string> {\n // console.log('update', name)\n localStorage.setItem(`${ACCESSOR_PREFIX}-${name}`, value)\n return this.get(name)\n }\n\n /**\n * Delete a preference.\n */\n public delete(name: string): Observable<boolean> {\n localStorage.removeItem(`${ACCESSOR_PREFIX}-${name}`)\n return of(true)\n }\n}\n","import { APP_INITIALIZER, Injector } from '@angular/core'\n\nimport { AngularRenderer, applicationConfig } from '@storybook/angular'\nimport { DecoratorFunction } from 'storybook/internal/csf'\n\nexport const INJECTOR_TO_ARGS_PROPERTY_NAME = '__getInjector'\n\n// TODO: Decide a better way to persist the injector reference than poluting\n// args with a value that isn't really meant to be an arg.\n\n/**\n * Storybook decorator that stores the Angular Injector in\n * args, for retrieval in play function.\n */\nexport const addInjectorGetterToArgs =\n (\n argName: string = INJECTOR_TO_ARGS_PROPERTY_NAME,\n ): DecoratorFunction<AngularRenderer> =>\n (story: any, context: any) => {\n // TODO: Test this more thoroughly.\n let injector: Injector | null = null\n context.args[argName] = () => injector\n return applicationConfig({\n providers: [\n {\n provide: APP_INITIALIZER,\n useFactory: (injectorService: Injector) => () => {\n injector = injectorService\n },\n deps: [Injector],\n multi: true,\n },\n ],\n })(story, context)\n }\n\nexport const getInjectorFromArgs = (\n args: any,\n argName: string = INJECTOR_TO_ARGS_PROPERTY_NAME,\n): Injector => {\n if (!args || typeof args[argName] !== 'function') {\n throw Error(`Injector getter function '${argName}' not found.`)\n }\n const injector = args[argName]()\n if (!injector) {\n throw Error(\n `Injector not found. Did you add 'addInjectorGetterToArgs' to your story dectorators?`,\n )\n }\n\n return injector\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theseam-ui-common-story-helpers.mjs","sources":["../../../projects/ui-common/story-helpers/arg-type-helpers.ts","../../../projects/ui-common/story-helpers/args-to-tpl.ts","../../../projects/ui-common/story-helpers/story-empty.component.ts","../../../projects/ui-common/story-helpers/initial-route-factory.ts","../../../projects/ui-common/story-helpers/initial-route.service.ts","../../../projects/ui-common/story-helpers/story-initial-route.ts","../../../projects/ui-common/story-helpers/route-button.ts","../../../projects/ui-common/story-helpers/routes-arg-type.ts","../../../projects/ui-common/story-helpers/story-empty-with-route.component.ts","../../../projects/ui-common/story-helpers/story-modal-container.component.ts","../../../projects/ui-common/story-helpers/story-helper-components.module.ts","../../../projects/ui-common/story-helpers/story-modal-decorator.ts","../../../projects/ui-common/story-helpers/on-story-bootstrapped-exec.ts","../../../projects/ui-common/story-helpers/on-story-bootstrapped-trigger.ts","../../../projects/ui-common/story-helpers/story-preferences-accessor.service.ts","../../../projects/ui-common/story-helpers/add-injector-to-args.ts","../../../projects/ui-common/story-helpers/get-component-instance.ts","../../../projects/ui-common/story-helpers/theseam-ui-common-story-helpers.ts"],"sourcesContent":["// import { ArgType } from '@storybook/addons'\n\nimport { OutlineThemeNames, ThemeNames } from '@theseam/ui-common/models'\n\ndeclare type ArgType = any\n\nexport const themeArgType: ArgType = {\n options: ThemeNames,\n control: {\n type: 'select',\n },\n description: `Theme style.`,\n}\n\nexport const themeWithOutlineArgType: ArgType = {\n options: [...ThemeNames, ...OutlineThemeNames],\n control: {\n type: 'select',\n },\n description: `Theme style.`,\n}\n\nexport const sizeArgType: ArgType = {\n options: [undefined, 'sm', 'lg'],\n control: {\n type: 'select',\n },\n description: `Size.`,\n}\n\nexport const buttonTypeArgType: ArgType = {\n options: ['button', 'submit'],\n control: {\n type: 'select',\n },\n description: `Button type.`,\n}\n","/* eslint-disable no-prototype-builtins */\nimport { action, HandlerFunction } from 'storybook/actions'\nimport { AngularRenderer, ArgTypes } from '@storybook/angular'\nimport { useStoryContext } from 'storybook/preview-api'\n\nexport interface ArgsTplParts {\n actions: { [prop: string]: HandlerFunction }\n tplfragment: string\n}\n\n/**\n * This is an attempt at simplifying the use of auto-generated args in stories\n * defined with `template`, since Angular doesn't have a way to simply use a\n * spread operator syntax.\n *\n * @experimental\n */\n// export function argsToTplParts(args: any, argTypes: ArgTypes): ArgsTplParts {\n// // console.log({ args, argTypes })\n// const parts: ArgsTplParts = {\n// actions: {},\n// tplfragment: ''\n// }\n\n// Object.keys(argTypes).forEach(k => {\n// // Inputs\n// if (\n// // Is in the inputs category\n// argTypes[k].table.category === 'inputs' &&\n// // Needs a control to be able to change from auto-generated args.\n// argTypes[k]?.hasOwnProperty('control') &&\n// // Assuming the arg might not be in props if there isn't an arg value.\n// args.hasOwnProperty(k)\n// ) {\n// parts.tplfragment += `[${k}]=\"${k}\" `\n// }\n\n// // Outputs\n// if (\n// // Is in the outputs category\n// argTypes[k]?.table?.category === 'outputs'\n// ) {\n// // Without access to props, I don't know if I can get an action into the\n// // template context like this.\n// parts.tplfragment += `(${k})=\"${k}($event)\" `\n// parts.actions[k] = action(k)\n// }\n// })\n\n// return parts\n// }\n\nfunction removeDuplicates(arr: string[]) {\n const seen: { [k: string]: boolean } = {}\n return arr.filter((item) => {\n if (!seen[item]) {\n seen[item] = true\n return true\n }\n return false\n })\n}\n\nexport interface ArgsTplOptions {\n /**\n * Properties to always bind to the template.\n */\n alwaysBind?: string[]\n /**\n * Properties to exclude from bidning to the template.\n */\n exclude?: string[]\n}\n\n/**\n * This is an attempt at simplifying the use of auto-generated args in stories\n * defined with `template`, since Angular doesn't have a way to simply use a\n * spread operator syntax.\n *\n * @experimental\n */\nexport function argsToTpl(options?: ArgsTplOptions) {\n const context = useStoryContext<AngularRenderer>()\n\n const exclude = [\n ...(context?.parameters?.argsToTplOptions?.exclude || []),\n ...(options?.exclude || []),\n ]\n\n const alwaysBind = context?.parameters?.argsToTplOptions?.alwaysBind || []\n\n const props = removeDuplicates([...alwaysBind, ...Object.keys(context.args)])\n\n const parts = props\n .filter((k) => exclude.indexOf(k) === -1)\n .map((k) => {\n // Outputs\n if (\n context.argTypes[k]?.hasOwnProperty('action') &&\n (context.args.hasOwnProperty(k) || alwaysBind.indexOf(k) !== -1)\n ) {\n return `(${k})=\"${k}($event)\"`\n }\n\n // Inputs\n if (context.args.hasOwnProperty(k) || alwaysBind.indexOf(k) !== -1) {\n return `[${k}]=\"${k}\"`\n }\n })\n\n return parts.length > 0 ? parts.join(' ') : ''\n}\n","import { Component } from '@angular/core'\n\n@Component({ template: ``, standalone: true })\nexport class StoryEmptyComponent {}\n","import { StoryInitialRouteService } from './initial-route.service'\n\nexport function storyInitialRouteFactory(\n _storyInitialRouteService: StoryInitialRouteService,\n) {\n return () => _storyInitialRouteService.setInitialRoute()\n}\n","import { Injectable, InjectionToken, Injector } from '@angular/core'\nimport { NavigationEnd, Router } from '@angular/router'\nimport { filter, take } from 'rxjs/operators'\n\nexport const STORY_INITIAL_ROUTE_URL = new InjectionToken<any>(\n 'STORY_INITIAL_ROUTE_URL',\n)\n\n@Injectable()\nexport class StoryInitialRouteService {\n constructor(private _injector: Injector) {}\n\n public setInitialRoute() {\n const _router = this._injector.get(Router)\n const url = this._injector.get(STORY_INITIAL_ROUTE_URL)\n if (_router.navigated) {\n _router.navigateByUrl(url)\n } else {\n _router.events\n .pipe(\n filter((e) => e instanceof NavigationEnd),\n take(1),\n )\n .subscribe(() => {\n _router.navigateByUrl(url)\n })\n }\n }\n}\n","import { APP_INITIALIZER, ModuleWithProviders, NgModule } from '@angular/core'\n\nimport { storyInitialRouteFactory } from './initial-route-factory'\nimport {\n StoryInitialRouteService,\n STORY_INITIAL_ROUTE_URL,\n} from './initial-route.service'\n\n@NgModule()\nexport class StoryInitialRouteModule {\n static forRoot(url: string): ModuleWithProviders<StoryInitialRouteModule> {\n return {\n ngModule: StoryInitialRouteModule,\n providers: [\n StoryInitialRouteService,\n {\n provide: APP_INITIALIZER,\n useFactory: storyInitialRouteFactory,\n deps: [StoryInitialRouteService],\n multi: true,\n },\n { provide: STORY_INITIAL_ROUTE_URL, useValue: url },\n ],\n }\n }\n}\n","// import { button } from '@storybook/addon-knobs'\n\n/**\n * Until I find a way to avoid '@storybook/addon-knobs' from interfering with\n * NgZone I can't import it in the knob when built by ng-packagr.\n */\nexport function routeButton(buttonKnob: any, url: string) {\n return buttonKnob(url, () => {\n location.hash = `#${url}`\n return false\n })\n}\n","// import { ArgType } from '@storybook/addons'\n\ndeclare const __STORYBOOK_ADDONS: any\n\nfunction goToHashUrl(url: string): void {\n location.hash = `#${url}`\n}\n\n// __STORYBOOK_ADDONS.getChannel().on('custom/go-to-hash', (data: { hash: string }) => {\n\n// goToHashUrl(data.hash)\n// })\n\n// __STORYBOOK_ADDONS.getChannel().on('storyArgsUpdated', (data: { hash: string }) => {\n// console.log('storyArgsUpdated')\n// })\n\nexport function routesArgType(routes: string[]) /*: ArgType*/ {\n return {\n options: routes,\n control: {\n type: 'select',\n // Runs in the 'manager', so I am emitting to a channel in the 'preview'.\n onChange: (e: any, a: any) => {\n __STORYBOOK_ADDONS.getChannel().emit('custom/go-to-hash', { hash: e })\n return e\n },\n },\n }\n}\n","import { Component } from '@angular/core'\n\n@Component({ template: `<router-outlet></router-outlet>`, standalone: false })\nexport class StoryEmptyWithRouteComponent {}\n","import { CommonModule } from '@angular/common'\nimport {\n ChangeDetectionStrategy,\n Component,\n computed,\n Injector,\n Input,\n signal,\n TemplateRef,\n} from '@angular/core'\nimport { of } from 'rxjs'\n\nimport { ModalConfig, ModalRef, MODAL_DATA } from '@theseam/ui-common/modal'\nimport type { ComponentType } from '@theseam/ui-common/models'\nimport { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar'\n\nclass FakeModalRef<T, R = any> implements Partial<ModalRef<T, R>> {\n afterOpened() {\n return of(undefined)\n }\n\n close(_dialogResult?: R): void {\n /* no-op in stories */\n }\n}\n\n/**\n * Renders its content (or an imperatively provided component/template) inside\n * a stand-in modal frame so stories can preview components that are normally\n * opened through the modal service.\n *\n * Three ways to provide content, checked in order:\n * 1. `[component]` input — renders via `ngComponentOutlet`. Kept for\n * compatibility with existing app stories.\n * 2. `[template]` input — renders a `TemplateRef` via `ngTemplateOutlet`.\n * 3. Projected content (`<ng-content>`) — the preferred form for new stories\n * because Storybook's default template auto-binds inputs/outputs.\n */\n@Component({\n // eslint-disable-next-line @angular-eslint/component-selector\n selector: 'story-modal-container-component',\n imports: [CommonModule, TheSeamOverlayScrollbarDirective],\n template: `\n <div class=\"cdk-overlay-container\">\n <div\n class=\"cdk-overlay-backdrop cdk-overlay-dark-backdrop cdk-overlay-backdrop-showing\"\n ></div>\n <div\n class=\"cdk-global-overlay-wrapper\"\n dir=\"ltr\"\n style=\"justify-content: flex-start; align-items: center; pointer-events: auto\"\n seamOverlayScrollbar\n >\n <div\n class=\"seam-modal-container modal-dialog modal-dialog-centered {{\n _modalSizeClass()\n }}\"\n tabindex=\"-1\"\n >\n <div class=\"modal-content\">\n @if (_component(); as c) {\n <ng-container\n *ngComponentOutlet=\"c; injector: _componentInjector()\"\n ></ng-container>\n } @else if (template) {\n <ng-container *ngTemplateOutlet=\"template\"></ng-container>\n } @else {\n <ng-content></ng-content>\n }\n </div>\n </div>\n </div>\n </div>\n `,\n styles: [\n `\n .seam-modal-container[tabindex='-1']:focus {\n outline: 0 !important;\n }\n `,\n ],\n changeDetection: ChangeDetectionStrategy.OnPush,\n})\nexport class StoryModalContainerComponent<T = unknown, D = any> {\n constructor(private readonly _injector: Injector) {}\n\n @Input()\n set component(c: ComponentType<T> | null | undefined) {\n this._component.set(c ?? null)\n }\n\n @Input()\n set data(d: D | null | undefined) {\n this._data.set(d ?? null)\n }\n\n @Input()\n set modalConfig(config: ModalConfig<D> | null | undefined) {\n this._modalConfig.set(config ?? null)\n }\n get modalConfig(): ModalConfig<D> | null {\n return this._modalConfig()\n }\n\n @Input() template?: TemplateRef<unknown> | null\n\n protected readonly _component = signal<ComponentType<T> | null>(null)\n private readonly _data = signal<D | null>(null)\n private readonly _modalConfig = signal<ModalConfig<D> | null>(null)\n\n protected readonly _componentInjector = computed(() =>\n this._createInjector(this._data()),\n )\n\n // No default size — stories opt into a Bootstrap modal size via\n // `modalConfig.modalSize`, matching how the real ModalService is used.\n protected readonly _modalSizeClass = computed(() => {\n const size = this._modalConfig()?.modalSize\n return size ? `modal-${size}` : ''\n })\n\n private _createInjector(data: D | null): Injector {\n return Injector.create({\n providers: [\n { provide: ModalRef, useClass: FakeModalRef, deps: [] },\n { provide: MODAL_DATA, useValue: data ?? undefined },\n ],\n parent: this._injector,\n })\n }\n}\n","import { CommonModule } from '@angular/common'\nimport { NgModule } from '@angular/core'\nimport { RouterModule } from '@angular/router'\n\nimport { TheSeamOverlayScrollbarDirective } from '@theseam/ui-common/scrollbar'\n\nimport { StoryEmptyWithRouteComponent } from './story-empty-with-route.component'\nimport { StoryModalContainerComponent } from './story-modal-container.component'\n\n@NgModule({\n declarations: [StoryEmptyWithRouteComponent],\n imports: [\n CommonModule,\n RouterModule,\n TheSeamOverlayScrollbarDirective,\n StoryModalContainerComponent,\n ],\n exports: [StoryEmptyWithRouteComponent, StoryModalContainerComponent],\n})\nexport class StoryHelperComponentsModule {}\n","import { componentWrapperDecorator, Decorator } from '@storybook/angular'\n\nimport { ModalConfig } from '@theseam/ui-common/modal'\n\nimport { StoryModalContainerComponent } from './story-modal-container.component'\n\nexport interface StoryModalDecoratorOptions {\n /**\n * Passed through to `StoryModalContainerComponent`'s `modalConfig` input.\n * Commonly used to opt into a Bootstrap modal size, e.g.\n * `{ modalSize: 'lg' }`.\n */\n modalConfig?: ModalConfig\n}\n\n/**\n * Wraps a story's rendered component in `<story-modal-container-component>`\n * so it previews inside a stand-in modal frame. Storybook's default template\n * binds the story's args to the wrapped component, so inputs/outputs (e.g.\n * for the Actions addon) work without extra wiring.\n *\n * Use as an entry in a story's `decorators` array:\n *\n * ```ts\n * const meta: Meta<MyModalComponent> = {\n * title: 'Modal/My',\n * component: MyModalComponent,\n * decorators: [storyModalDecorator({ modalConfig: { modalSize: 'lg' } })],\n * }\n * ```\n */\nexport function storyModalDecorator(\n options?: StoryModalDecoratorOptions,\n): Decorator {\n return (storyFn, storyContext) => {\n const result = componentWrapperDecorator(\n (story) => `\n <story-modal-container-component [modalConfig]=\"_storyModalConfig\">\n ${story}\n </story-modal-container-component>\n `,\n )(storyFn, storyContext)\n\n return {\n ...result,\n props: {\n ...(result.props ?? {}),\n // Prefixed to avoid colliding with a story's own args.\n _storyModalConfig: options?.modalConfig ?? null,\n },\n moduleMetadata: {\n ...(result.moduleMetadata ?? {}),\n imports: [\n ...(result.moduleMetadata?.imports ?? []),\n StoryModalContainerComponent,\n ],\n },\n }\n }\n}\n","import { APP_BOOTSTRAP_LISTENER, ComponentRef } from '@angular/core'\n// import { STORY } from '@storybook/angular/dist/ts3.9/client/preview/angular/app.token'\n// import { StoryFnAngularReturnType } from '@storybook/angular/dist/ts3.9/client/preview/types'\nimport { Observable } from 'rxjs'\nimport { first } from 'rxjs/operators'\n\n/**\n * Can be used to access a stories component after the story has been bootstrapped.\n *\n * Example:\n * ```ts\n * @Component({\n * selector: 'story-example',\n * template: `Touched: {{ exControl.touched }}`\n * })\n * class StoryExampleComponent {\n * exControl = new FormControl('')\n * }\n *\n * export const TouchExample2 = () => ({\n * moduleMetadata: {\n * declarations: [ StoryExampleComponent ],\n * providers: [ onStoryBootstrappedExec((c: StoryExampleComponent) => c.exControl.markAsTouched()) ]\n * },\n * props: { },\n * component: StoryExampleComponent\n * })\n * ```\n */\n// export function onStoryBootstrappedExec<T = any>(callback: (component: T) => void) {\n// function bootstrapped(componentRef: ComponentRef<any>) {\n// const data = componentRef.instance.target.injector.get(STORY, null) as Observable<StoryFnAngularReturnType> | null\n// if (!data) {\n// console.warn(`STORY provider not found.`)\n// return\n// }\n// data?.pipe(first()).subscribe(story => {\n// if (!story.component) {\n// console.warn(`'onStoryBootstrappedExec' only supported on stories that provide 'component' property.`)\n// return\n// }\n\n// let c = null\n// for (let i = 0; i < componentRef.instance.target.length; i++) {\n// const tmp = componentRef.instance.target._embeddedViews[i].nodes?.find((f: any) => f?.instance instanceof story.component)\n// const comp = tmp?.instance\n// if (comp) {\n// c = comp\n// break\n// }\n// }\n\n// if (!c) {\n// console.warn(`Story component instance not found.`)\n// return\n// }\n\n// if (c) {\n// callback(c)\n// }\n// })\n// }\n\n// return {\n// provide: APP_BOOTSTRAP_LISTENER,\n// useValue: bootstrapped,\n// multi: true\n// }\n// }\n","import { APP_BOOTSTRAP_LISTENER, ComponentRef, ElementRef } from '@angular/core'\n\n// TODO: Consider supporting a target selection function, so that complex\n// selections that can't be expressed by a simple selector can be used.\n\n/**\n * Can be used to trigger an event on a target element when the story component has been bootstrapped.\n *\n * Example:\n * ```\n * export const TouchExample1 = () => ({\n * moduleMetadata: {\n * providers: [ onStoryBootstrappedTrigger('input', 'blur') ]\n * },\n * props: { control: new FormControl('') },\n * template: `\n * <input type=\"text\" [formControl]=\"control\">\n * Touched: {{ control.touched }}\n * `\n * })\n * ```\n */\nexport function onStoryBootstrappedTrigger(\n targetSelector: string,\n eventName: string,\n) {\n function bootstrapped(componentRef: ComponentRef<any>) {\n const elementRef = componentRef.injector.get(ElementRef, null)\n const target = elementRef?.nativeElement.querySelector(targetSelector)\n if (!target) {\n // eslint-disable-next-line no-console\n console.warn(\n `Unable to trigger event '${eventName}'. Target '${targetSelector}' not found.`,\n )\n }\n\n const e = document.createEvent('HTMLEvents')\n e.initEvent('blur', false, true)\n target.dispatchEvent(e)\n }\n\n return {\n provide: APP_BOOTSTRAP_LISTENER,\n useValue: bootstrapped,\n multi: true,\n }\n}\n","import { Injectable } from '@angular/core'\nimport { Observable, of } from 'rxjs'\n\nimport { TheSeamPreferencesAccessor } from '@theseam/ui-common/services'\n\nconst ACCESSOR_PREFIX = 'story-pref'\n\n@Injectable()\nexport class StoryPreferencesAccessorService\n implements TheSeamPreferencesAccessor\n{\n /**\n * Gets a preference.\n */\n public get(name: string): Observable<string> {\n // console.log('get', name)\n return of(localStorage.getItem(`${ACCESSOR_PREFIX}-${name}`) || '{}')\n }\n\n /**\n * Update a preference.\n */\n public update(name: string, value: string): Observable<string> {\n // console.log('update', name)\n localStorage.setItem(`${ACCESSOR_PREFIX}-${name}`, value)\n return this.get(name)\n }\n\n /**\n * Delete a preference.\n */\n public delete(name: string): Observable<boolean> {\n localStorage.removeItem(`${ACCESSOR_PREFIX}-${name}`)\n return of(true)\n }\n}\n","import { APP_INITIALIZER, Injector } from '@angular/core'\n\nimport { AngularRenderer, applicationConfig } from '@storybook/angular'\nimport { DecoratorFunction } from 'storybook/internal/csf'\n\nexport const INJECTOR_TO_ARGS_PROPERTY_NAME = '__getInjector'\n\n// TODO: Decide a better way to persist the injector reference than poluting\n// args with a value that isn't really meant to be an arg.\n\n/**\n * Storybook decorator that stores the Angular Injector in\n * args, for retrieval in play function.\n */\nexport const addInjectorGetterToArgs =\n (\n argName: string = INJECTOR_TO_ARGS_PROPERTY_NAME,\n ): DecoratorFunction<AngularRenderer> =>\n (story: any, context: any) => {\n // TODO: Test this more thoroughly.\n let injector: Injector | null = null\n context.args[argName] = () => injector\n return applicationConfig({\n providers: [\n {\n provide: APP_INITIALIZER,\n useFactory: (injectorService: Injector) => () => {\n injector = injectorService\n },\n deps: [Injector],\n multi: true,\n },\n ],\n })(story, context)\n }\n\nexport const getInjectorFromArgs = (\n args: any,\n argName: string = INJECTOR_TO_ARGS_PROPERTY_NAME,\n): Injector => {\n if (!args || typeof args[argName] !== 'function') {\n throw Error(`Injector getter function '${argName}' not found.`)\n }\n const injector = args[argName]()\n if (!injector) {\n throw Error(\n `Injector not found. Did you add 'addInjectorGetterToArgs' to your story dectorators?`,\n )\n }\n\n return injector\n}\n","import { Type, ɵgetLContext as getLContext } from '@angular/core'\n\n/**\n * Index of the context slot in Angular's internal `LView` array.\n *\n * Unlike `ng.getComponent`, `ɵgetLContext` is a real (if private) export\n * rather than a devMode-only global, so this helper works in a production\n * build — verified by running the story suite against a built\n * `storybook-static`. What it IS pinned to is Angular's internal `LView`\n * layout: if this slot index ever moves, `getComponentInstance()` returns the\n * wrong object or null rather than failing loudly. Re-verify on a major\n * Angular upgrade, against a production build rather than the dev server.\n */\nconst CONTEXT = 8\n\nexport function getComponentInstance<T>(\n element: Element | null | undefined,\n componentType?: Type<T>,\n): T | null {\n if (!element) return null\n\n const ctx = getLContext(element)\n if (!ctx) return null\n\n if (ctx.component != null) {\n return match(ctx.component, componentType)\n }\n\n const lView = ctx.lView\n if (!lView) return null\n\n // Host component of this node (same as ng.getComponent)\n const atNode = getComponentAtNode(lView, ctx.nodeIndex)\n if (atNode != null) {\n const matched = match(atNode, componentType)\n if (matched) return matched\n }\n\n // Fallback: owning component view context (same idea as ng.getOwningComponent)\n const owning = lView[CONTEXT]\n return match(owning, componentType)\n}\n\nfunction match<T>(value: unknown, type?: Type<T>): T | null {\n if (value == null) return null\n if (!type) return value as T\n return value instanceof type ? value : null\n}\n\nfunction getComponentAtNode(lView: any[], nodeIndex: number): unknown {\n const slot = lView[nodeIndex]\n if (!slot) return null\n // Component host slot is either an LView or an LContainer whose [0]/HOST is the LView\n const childView =\n Array.isArray(slot) && Array.isArray(slot[1]) ? slot : slot[0]\n if (!Array.isArray(childView)) return null\n return childView[CONTEXT] ?? null\n}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":["getLContext"],"mappings":"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"}
@@ -54,6 +54,9 @@ class ToggleGroupDirective {
54
54
  optionDirectives;
55
55
  onChange;
56
56
  onTouched;
57
+ _selectedSet;
58
+ _selectedSetSource;
59
+ _selectedSetMultiple;
57
60
  get value() {
58
61
  return this.val;
59
62
  }
@@ -85,17 +88,42 @@ class ToggleGroupDirective {
85
88
  this.disabled = isDisabled;
86
89
  }
87
90
  isSelected(value) {
88
- if (this.multiple) {
89
- const idx = (this.value || []).findIndex((v) => v === value);
90
- return idx !== -1;
91
+ if (value === null || value === undefined) {
92
+ return false;
91
93
  }
92
- else {
93
- // TODO: Clean this up when the directive no longer allows array value type when multiple is false
94
- const v = Array.isArray(this.value) && this.value.length === 1
95
- ? this.value[0]
96
- : this.value;
97
- return v === value;
94
+ return this._selected().has(value);
95
+ }
96
+ /**
97
+ * The current selection as a set, rebuilt only when the value (or `multiple`)
98
+ * changes.
99
+ *
100
+ * `isSelected` is called from templates and from every option's host binding,
101
+ * so it runs several times per option per change detection pass. Hashing the
102
+ * selection once keeps those lookups O(1) instead of scanning the value array
103
+ * on every call.
104
+ *
105
+ * Invalidation is keyed on the `val` reference rather than done in the `value`
106
+ * setter, because `val` is also written directly by the `[value]` input, which
107
+ * does not go through the setter.
108
+ */
109
+ _selected() {
110
+ if (this._selectedSet === undefined ||
111
+ this.val !== this._selectedSetSource ||
112
+ this.multiple !== this._selectedSetMultiple) {
113
+ this._selectedSetSource = this.val;
114
+ this._selectedSetMultiple = this.multiple;
115
+ this._selectedSet = this._buildSelectedSet();
116
+ }
117
+ return this._selectedSet;
118
+ }
119
+ _buildSelectedSet() {
120
+ const val = this.val;
121
+ if (this.multiple) {
122
+ return new Set(val ?? []);
98
123
  }
124
+ // TODO: Clean this up when the directive no longer allows array value type when multiple is false
125
+ const v = Array.isArray(val) && val.length === 1 ? val[0] : val;
126
+ return typeof v === 'string' ? new Set([v]) : new Set();
99
127
  }
100
128
  /**
101
129
  * Toggles an option's selected state by value.
@@ -1 +1 @@
1
- {"version":3,"file":"theseam-ui-common-toggle-group.mjs","sources":["../../../projects/ui-common/toggle-group/toggle-group-parent.ts","../../../projects/ui-common/toggle-group/toggle-group-option.directive.ts","../../../projects/ui-common/toggle-group/toggle-group.directive.ts","../../../projects/ui-common/toggle-group/toggle-group.module.ts","../../../projects/ui-common/toggle-group/theseam-ui-common-toggle-group.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\n\n/**\n * The part of the toggle group that an option needs in order to resolve its own\n * selected state.\n *\n * This exists as a separate token so `ToggleGroupOptionDirective` can reach its\n * parent group without importing `ToggleGroupDirective`, which would create a\n * circular import between the two directives.\n */\nexport interface TheSeamToggleGroupParent {\n isSelected(value: string | undefined | null): boolean\n}\n\nexport const THESEAM_TOGGLE_GROUP_PARENT =\n new InjectionToken<TheSeamToggleGroupParent>('TheSeamToggleGroupParent')\n","import { Directive, HostBinding, inject, Input } from '@angular/core'\n\nimport { THESEAM_TOGGLE_GROUP_PARENT } from './toggle-group-parent'\n\n@Directive({\n selector: '[seamToggleGroupOption]',\n exportAs: 'seamToggleGroupOption',\n})\nexport class ToggleGroupOptionDirective {\n private readonly _group = inject(THESEAM_TOGGLE_GROUP_PARENT, {\n optional: true,\n })\n\n @Input() seamToggleGroupOption: string | undefined | null\n\n @HostBinding('class.lib-toggle-group-option-selected')\n get _checkioSelectedClass() {\n return this._group?.isSelected(this.value) || false\n }\n\n get value(): string | undefined | null {\n return this.seamToggleGroupOption\n }\n}\n","import { BooleanInput, coerceArray } from '@angular/cdk/coercion'\nimport {\n ContentChildren,\n Directive,\n EventEmitter,\n forwardRef,\n Input,\n Output,\n QueryList,\n} from '@angular/core'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport { InputBoolean } from '@theseam/ui-common/core'\n\nimport { THESEAM_TOGGLE_GROUP_PARENT } from './toggle-group-parent'\nimport { ToggleGroupOptionDirective } from './toggle-group-option.directive'\n\nexport const TOGGLE_GROUP_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ToggleGroupDirective),\n multi: true,\n}\n\n@Directive({\n selector: '[seamToggleGroup]',\n exportAs: 'seamToggleGroup',\n providers: [\n TOGGLE_GROUP_VALUE_ACCESSOR,\n {\n provide: THESEAM_TOGGLE_GROUP_PARENT,\n useExisting: forwardRef(() => ToggleGroupDirective),\n },\n ],\n})\nexport class ToggleGroupDirective implements ControlValueAccessor {\n static ngAcceptInputType_disabled: BooleanInput\n static ngAcceptInputType_multiple: BooleanInput\n static ngAcceptInputType_selectionToggleable: BooleanInput\n\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('value') val: string | string[] | undefined | null\n\n @Input() @InputBoolean() disabled = false\n @Input() @InputBoolean() multiple = false\n @Input() @InputBoolean() selectionToggleable = true\n\n // TODO: Add min/max selected inputs to make toggling better for multi select\n\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() readonly change = new EventEmitter<\n string | string[] | undefined | null\n >()\n\n @ContentChildren(ToggleGroupOptionDirective)\n optionDirectives?: QueryList<ToggleGroupOptionDirective>\n\n onChange: any\n onTouched: any\n\n get value(): string | string[] | undefined | null {\n return this.val\n }\n\n set value(value: string | string[] | undefined | null) {\n const _value = this.multiple\n ? value !== null && value !== undefined\n ? coerceArray(value)\n : value\n : value\n\n this.val = this.multiple ? [...((_value as string[]) || [])] : _value || ''\n this.change.emit(this.val)\n if (this.onChange) {\n this.onChange(_value)\n }\n if (this.onTouched) {\n this.onTouched()\n }\n }\n\n writeValue(value: any): void {\n this.value = value\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled\n }\n\n isSelected(value: string | undefined | null) {\n if (this.multiple) {\n const idx = ((this.value as string[]) || []).findIndex((v) => v === value)\n return idx !== -1\n } else {\n // TODO: Clean this up when the directive no longer allows array value type when multiple is false\n const v =\n Array.isArray(this.value) && this.value.length === 1\n ? this.value[0]\n : this.value\n return v === value\n }\n }\n\n /**\n * Toggles an option's selected state by value.\n */\n toggleOptionSelect(value: string | undefined | null): void {\n if (this.isSelected(value)) {\n if (!this.selectionToggleable && this._selectedCount() <= 1) {\n // Unselecting would leave nothing selected.\n return\n }\n this.unselectValue(value)\n return\n }\n\n this.selectValue(value)\n }\n\n private _selectedCount(): number {\n if (this.multiple) {\n return ((this.value as string[]) || []).length\n }\n const v = this.value\n return v === null || v === undefined || v === '' ? 0 : 1\n }\n\n unselectValue(value: string | undefined | null) {\n if (this.multiple) {\n this.value = ((this.value as string[]) || []).filter((v) => v !== value)\n } else {\n this.value = undefined\n }\n }\n\n selectValue(value: string | undefined | null) {\n if (this.multiple) {\n const _value = [...((this.value as string[]) || [])]\n this.value = value ? [..._value, value] : _value\n } else {\n this.value = value\n }\n }\n\n getOptionDirectiveByValue(\n value: string,\n ): ToggleGroupOptionDirective | null | undefined {\n if (!this.optionDirectives || this.optionDirectives.length < 1) {\n return null\n }\n\n return this.optionDirectives.toArray().find((opt) => opt.value === value)\n }\n}\n","import { NgModule } from '@angular/core'\n\nimport { ToggleGroupOptionDirective } from './toggle-group-option.directive'\nimport { ToggleGroupDirective } from './toggle-group.directive'\n\n@NgModule({\n imports: [ToggleGroupDirective, ToggleGroupOptionDirective],\n exports: [ToggleGroupDirective, ToggleGroupOptionDirective],\n})\nexport class TheSeamToggleGroupModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"theseam-ui-common-toggle-group.mjs","sources":["../../../projects/ui-common/toggle-group/toggle-group-parent.ts","../../../projects/ui-common/toggle-group/toggle-group-option.directive.ts","../../../projects/ui-common/toggle-group/toggle-group.directive.ts","../../../projects/ui-common/toggle-group/toggle-group.module.ts","../../../projects/ui-common/toggle-group/theseam-ui-common-toggle-group.ts"],"sourcesContent":["import { InjectionToken } from '@angular/core'\n\n/**\n * The part of the toggle group that an option needs in order to resolve its own\n * selected state.\n *\n * This exists as a separate token so `ToggleGroupOptionDirective` can reach its\n * parent group without importing `ToggleGroupDirective`, which would create a\n * circular import between the two directives.\n */\nexport interface TheSeamToggleGroupParent {\n isSelected(value: string | undefined | null): boolean\n}\n\nexport const THESEAM_TOGGLE_GROUP_PARENT =\n new InjectionToken<TheSeamToggleGroupParent>('TheSeamToggleGroupParent')\n","import { Directive, HostBinding, inject, Input } from '@angular/core'\n\nimport { THESEAM_TOGGLE_GROUP_PARENT } from './toggle-group-parent'\n\n@Directive({\n selector: '[seamToggleGroupOption]',\n exportAs: 'seamToggleGroupOption',\n})\nexport class ToggleGroupOptionDirective {\n private readonly _group = inject(THESEAM_TOGGLE_GROUP_PARENT, {\n optional: true,\n })\n\n @Input() seamToggleGroupOption: string | undefined | null\n\n @HostBinding('class.lib-toggle-group-option-selected')\n get _checkioSelectedClass() {\n return this._group?.isSelected(this.value) || false\n }\n\n get value(): string | undefined | null {\n return this.seamToggleGroupOption\n }\n}\n","import { BooleanInput, coerceArray } from '@angular/cdk/coercion'\nimport {\n ContentChildren,\n Directive,\n EventEmitter,\n forwardRef,\n Input,\n Output,\n QueryList,\n} from '@angular/core'\nimport { ControlValueAccessor, NG_VALUE_ACCESSOR } from '@angular/forms'\n\nimport { InputBoolean } from '@theseam/ui-common/core'\n\nimport { THESEAM_TOGGLE_GROUP_PARENT } from './toggle-group-parent'\nimport { ToggleGroupOptionDirective } from './toggle-group-option.directive'\n\nexport const TOGGLE_GROUP_VALUE_ACCESSOR: any = {\n provide: NG_VALUE_ACCESSOR,\n useExisting: forwardRef(() => ToggleGroupDirective),\n multi: true,\n}\n\n@Directive({\n selector: '[seamToggleGroup]',\n exportAs: 'seamToggleGroup',\n providers: [\n TOGGLE_GROUP_VALUE_ACCESSOR,\n {\n provide: THESEAM_TOGGLE_GROUP_PARENT,\n useExisting: forwardRef(() => ToggleGroupDirective),\n },\n ],\n})\nexport class ToggleGroupDirective implements ControlValueAccessor {\n static ngAcceptInputType_disabled: BooleanInput\n static ngAcceptInputType_multiple: BooleanInput\n static ngAcceptInputType_selectionToggleable: BooleanInput\n\n // eslint-disable-next-line @angular-eslint/no-input-rename\n @Input('value') val: string | string[] | undefined | null\n\n @Input() @InputBoolean() disabled = false\n @Input() @InputBoolean() multiple = false\n @Input() @InputBoolean() selectionToggleable = true\n\n // TODO: Add min/max selected inputs to make toggling better for multi select\n\n // eslint-disable-next-line @angular-eslint/no-output-native\n @Output() readonly change = new EventEmitter<\n string | string[] | undefined | null\n >()\n\n @ContentChildren(ToggleGroupOptionDirective)\n optionDirectives?: QueryList<ToggleGroupOptionDirective>\n\n onChange: any\n onTouched: any\n\n private _selectedSet: Set<string> | undefined\n private _selectedSetSource: string | string[] | undefined | null\n private _selectedSetMultiple: boolean | undefined\n\n get value(): string | string[] | undefined | null {\n return this.val\n }\n\n set value(value: string | string[] | undefined | null) {\n const _value = this.multiple\n ? value !== null && value !== undefined\n ? coerceArray(value)\n : value\n : value\n\n this.val = this.multiple ? [...((_value as string[]) || [])] : _value || ''\n this.change.emit(this.val)\n if (this.onChange) {\n this.onChange(_value)\n }\n if (this.onTouched) {\n this.onTouched()\n }\n }\n\n writeValue(value: any): void {\n this.value = value\n }\n\n registerOnChange(fn: any): void {\n this.onChange = fn\n }\n\n registerOnTouched(fn: any): void {\n this.onTouched = fn\n }\n\n setDisabledState(isDisabled: boolean): void {\n this.disabled = isDisabled\n }\n\n isSelected(value: string | undefined | null): boolean {\n if (value === null || value === undefined) {\n return false\n }\n return this._selected().has(value)\n }\n\n /**\n * The current selection as a set, rebuilt only when the value (or `multiple`)\n * changes.\n *\n * `isSelected` is called from templates and from every option's host binding,\n * so it runs several times per option per change detection pass. Hashing the\n * selection once keeps those lookups O(1) instead of scanning the value array\n * on every call.\n *\n * Invalidation is keyed on the `val` reference rather than done in the `value`\n * setter, because `val` is also written directly by the `[value]` input, which\n * does not go through the setter.\n */\n private _selected(): ReadonlySet<string> {\n if (\n this._selectedSet === undefined ||\n this.val !== this._selectedSetSource ||\n this.multiple !== this._selectedSetMultiple\n ) {\n this._selectedSetSource = this.val\n this._selectedSetMultiple = this.multiple\n this._selectedSet = this._buildSelectedSet()\n }\n return this._selectedSet\n }\n\n private _buildSelectedSet(): Set<string> {\n const val = this.val\n\n if (this.multiple) {\n return new Set((val as string[]) ?? [])\n }\n\n // TODO: Clean this up when the directive no longer allows array value type when multiple is false\n const v = Array.isArray(val) && val.length === 1 ? val[0] : val\n return typeof v === 'string' ? new Set([v]) : new Set()\n }\n\n /**\n * Toggles an option's selected state by value.\n */\n toggleOptionSelect(value: string | undefined | null): void {\n if (this.isSelected(value)) {\n if (!this.selectionToggleable && this._selectedCount() <= 1) {\n // Unselecting would leave nothing selected.\n return\n }\n this.unselectValue(value)\n return\n }\n\n this.selectValue(value)\n }\n\n private _selectedCount(): number {\n if (this.multiple) {\n return ((this.value as string[]) || []).length\n }\n const v = this.value\n return v === null || v === undefined || v === '' ? 0 : 1\n }\n\n unselectValue(value: string | undefined | null) {\n if (this.multiple) {\n this.value = ((this.value as string[]) || []).filter((v) => v !== value)\n } else {\n this.value = undefined\n }\n }\n\n selectValue(value: string | undefined | null) {\n if (this.multiple) {\n const _value = [...((this.value as string[]) || [])]\n this.value = value ? [..._value, value] : _value\n } else {\n this.value = value\n }\n }\n\n getOptionDirectiveByValue(\n value: string,\n ): ToggleGroupOptionDirective | null | undefined {\n if (!this.optionDirectives || this.optionDirectives.length < 1) {\n return null\n }\n\n return this.optionDirectives.toArray().find((opt) => opt.value === value)\n }\n}\n","import { NgModule } from '@angular/core'\n\nimport { ToggleGroupOptionDirective } from './toggle-group-option.directive'\nimport { ToggleGroupDirective } from './toggle-group.directive'\n\n@NgModule({\n imports: [ToggleGroupDirective, ToggleGroupOptionDirective],\n exports: [ToggleGroupDirective, ToggleGroupOptionDirective],\n})\nexport class TheSeamToggleGroupModule {}\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;MAca,2BAA2B,GACtC,IAAI,cAAc,CAA2B,0BAA0B;;MCP5D,0BAA0B,CAAA;AACpB,IAAA,MAAM,GAAG,MAAM,CAAC,2BAA2B,EAAE;AAC5D,QAAA,QAAQ,EAAE,IAAI;AACf,KAAA,CAAC;AAEO,IAAA,qBAAqB;AAE9B,IAAA,IACI,qBAAqB,GAAA;AACvB,QAAA,OAAO,IAAI,CAAC,MAAM,EAAE,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK;IACrD;AAEA,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,qBAAqB;IACnC;wGAdW,0BAA0B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;4FAA1B,0BAA0B,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,yBAAA,EAAA,MAAA,EAAA,EAAA,qBAAA,EAAA,uBAAA,EAAA,EAAA,IAAA,EAAA,EAAA,UAAA,EAAA,EAAA,wCAAA,EAAA,4BAAA,EAAA,EAAA,EAAA,QAAA,EAAA,CAAA,uBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;4FAA1B,0BAA0B,EAAA,UAAA,EAAA,CAAA;kBAJtC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,yBAAyB;AACnC,oBAAA,QAAQ,EAAE,uBAAuB;AAClC,iBAAA;;sBAME;;sBAEA,WAAW;uBAAC,wCAAwC;;;ACEhD,MAAM,2BAA2B,GAAQ;AAC9C,IAAA,OAAO,EAAE,iBAAiB;AAC1B,IAAA,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;AACnD,IAAA,KAAK,EAAE,IAAI;;MAcA,oBAAoB,CAAA;IAC/B,OAAO,0BAA0B;IACjC,OAAO,0BAA0B;IACjC,OAAO,qCAAqC;;AAG5B,IAAA,GAAG;IAEM,QAAQ,GAAG,KAAK;IAChB,QAAQ,GAAG,KAAK;IAChB,mBAAmB,GAAG,IAAI;;;AAKhC,IAAA,MAAM,GAAG,IAAI,YAAY,EAEzC;AAGH,IAAA,gBAAgB;AAEhB,IAAA,QAAQ;AACR,IAAA,SAAS;AAED,IAAA,YAAY;AACZ,IAAA,kBAAkB;AAClB,IAAA,oBAAoB;AAE5B,IAAA,IAAI,KAAK,GAAA;QACP,OAAO,IAAI,CAAC,GAAG;IACjB;IAEA,IAAI,KAAK,CAAC,KAA2C,EAAA;AACnD,QAAA,MAAM,MAAM,GAAG,IAAI,CAAC;AAClB,cAAE,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK;AAC5B,kBAAE,WAAW,CAAC,KAAK;AACnB,kBAAE;cACF,KAAK;QAET,IAAI,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,GAAG,CAAC,IAAK,MAAmB,IAAI,EAAE,CAAC,CAAC,GAAG,MAAM,IAAI,EAAE;QAC3E,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC;AAC1B,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;QACvB;AACA,QAAA,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,IAAI,CAAC,SAAS,EAAE;QAClB;IACF;AAEA,IAAA,UAAU,CAAC,KAAU,EAAA;AACnB,QAAA,IAAI,CAAC,KAAK,GAAG,KAAK;IACpB;AAEA,IAAA,gBAAgB,CAAC,EAAO,EAAA;AACtB,QAAA,IAAI,CAAC,QAAQ,GAAG,EAAE;IACpB;AAEA,IAAA,iBAAiB,CAAC,EAAO,EAAA;AACvB,QAAA,IAAI,CAAC,SAAS,GAAG,EAAE;IACrB;AAEA,IAAA,gBAAgB,CAAC,UAAmB,EAAA;AAClC,QAAA,IAAI,CAAC,QAAQ,GAAG,UAAU;IAC5B;AAEA,IAAA,UAAU,CAAC,KAAgC,EAAA;QACzC,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,SAAS,EAAE;AACzC,YAAA,OAAO,KAAK;QACd;QACA,OAAO,IAAI,CAAC,SAAS,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC;IACpC;AAEA;;;;;;;;;;;;AAYG;IACK,SAAS,GAAA;AACf,QAAA,IACE,IAAI,CAAC,YAAY,KAAK,SAAS;AAC/B,YAAA,IAAI,CAAC,GAAG,KAAK,IAAI,CAAC,kBAAkB;AACpC,YAAA,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,oBAAoB,EAC3C;AACA,YAAA,IAAI,CAAC,kBAAkB,GAAG,IAAI,CAAC,GAAG;AAClC,YAAA,IAAI,CAAC,oBAAoB,GAAG,IAAI,CAAC,QAAQ;AACzC,YAAA,IAAI,CAAC,YAAY,GAAG,IAAI,CAAC,iBAAiB,EAAE;QAC9C;QACA,OAAO,IAAI,CAAC,YAAY;IAC1B;IAEQ,iBAAiB,GAAA;AACvB,QAAA,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG;AAEpB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,OAAO,IAAI,GAAG,CAAE,GAAgB,IAAI,EAAE,CAAC;QACzC;;QAGA,MAAM,CAAC,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,CAAC,MAAM,KAAK,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,GAAG;QAC/D,OAAO,OAAO,CAAC,KAAK,QAAQ,GAAG,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,GAAG,EAAE;IACzD;AAEA;;AAEG;AACH,IAAA,kBAAkB,CAAC,KAAgC,EAAA;AACjD,QAAA,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,EAAE;AAC1B,YAAA,IAAI,CAAC,IAAI,CAAC,mBAAmB,IAAI,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE;;gBAE3D;YACF;AACA,YAAA,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC;YACzB;QACF;AAEA,QAAA,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC;IACzB;IAEQ,cAAc,GAAA;AACpB,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,OAAO,CAAE,IAAI,CAAC,KAAkB,IAAI,EAAE,EAAE,MAAM;QAChD;AACA,QAAA,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK;AACpB,QAAA,OAAO,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,EAAE,GAAG,CAAC,GAAG,CAAC;IAC1D;AAEA,IAAA,aAAa,CAAC,KAAgC,EAAA;AAC5C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,IAAI,CAAC,KAAK,GAAG,CAAE,IAAI,CAAC,KAAkB,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,KAAK,CAAC;QAC1E;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,GAAG,SAAS;QACxB;IACF;AAEA,IAAA,WAAW,CAAC,KAAgC,EAAA;AAC1C,QAAA,IAAI,IAAI,CAAC,QAAQ,EAAE;AACjB,YAAA,MAAM,MAAM,GAAG,CAAC,IAAK,IAAI,CAAC,KAAkB,IAAI,EAAE,CAAC,CAAC;AACpD,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK,GAAG,CAAC,GAAG,MAAM,EAAE,KAAK,CAAC,GAAG,MAAM;QAClD;aAAO;AACL,YAAA,IAAI,CAAC,KAAK,GAAG,KAAK;QACpB;IACF;AAEA,IAAA,yBAAyB,CACvB,KAAa,EAAA;AAEb,QAAA,IAAI,CAAC,IAAI,CAAC,gBAAgB,IAAI,IAAI,CAAC,gBAAgB,CAAC,MAAM,GAAG,CAAC,EAAE;AAC9D,YAAA,OAAO,IAAI;QACb;QAEA,OAAO,IAAI,CAAC,gBAAgB,CAAC,OAAO,EAAE,CAAC,IAAI,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,KAAK,KAAK,KAAK,CAAC;IAC3E;wGAhKW,oBAAoB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAApB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,IAAA,EAAA,oBAAoB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,mBAAA,EAAA,MAAA,EAAA,EAAA,GAAA,EAAA,CAAA,OAAA,EAAA,KAAA,CAAA,EAAA,QAAA,EAAA,UAAA,EAAA,QAAA,EAAA,UAAA,EAAA,mBAAA,EAAA,qBAAA,EAAA,EAAA,OAAA,EAAA,EAAA,MAAA,EAAA,QAAA,EAAA,EAAA,SAAA,EARpB;YACT,2BAA2B;AAC3B,YAAA;AACE,gBAAA,OAAO,EAAE,2BAA2B;AACpC,gBAAA,WAAW,EAAE,UAAU,CAAC,MAAM,oBAAoB,CAAC;AACpD,aAAA;AACF,SAAA,EAAA,OAAA,EAAA,CAAA,EAAA,YAAA,EAAA,kBAAA,EAAA,SAAA,EAqBgB,0BAA0B,EAAA,CAAA,EAAA,QAAA,EAAA,CAAA,iBAAA,CAAA,EAAA,QAAA,EAAA,EAAA,EAAA,CAAA;;AAXlB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAmB,CAAA,EAAA,oBAAA,CAAA,SAAA,EAAA,UAAA,EAAA,KAAA,CAAA,CAAA;AAChB,UAAA,CAAA;AAAf,IAAA,YAAY;AAAmB,CAAA,EAAA,oBAAA,CAAA,SAAA,EAAA,UAAA,EAAA,KAAA,CAAA,CAAA;AAChB,UAAA,CAAA;AAAf,IAAA,YAAY;AAA6B,CAAA,EAAA,oBAAA,CAAA,SAAA,EAAA,qBAAA,EAAA,KAAA,CAAA,CAAA;4FAVxC,oBAAoB,EAAA,UAAA,EAAA,CAAA;kBAXhC,SAAS;AAAC,YAAA,IAAA,EAAA,CAAA;AACT,oBAAA,QAAQ,EAAE,mBAAmB;AAC7B,oBAAA,QAAQ,EAAE,iBAAiB;AAC3B,oBAAA,SAAS,EAAE;wBACT,2BAA2B;AAC3B,wBAAA;AACE,4BAAA,OAAO,EAAE,2BAA2B;AACpC,4BAAA,WAAW,EAAE,UAAU,CAAC,0BAA0B,CAAC;AACpD,yBAAA;AACF,qBAAA;AACF,iBAAA;;sBAOE,KAAK;uBAAC,OAAO;;sBAEb;;sBACA;;sBACA;;sBAKA;;sBAIA,eAAe;uBAAC,0BAA0B;;;MC5ChC,wBAAwB,CAAA;wGAAxB,wBAAwB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,QAAA,EAAA,CAAA;AAAxB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,mBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,SAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,wBAAwB,YAHzB,oBAAoB,EAAE,0BAA0B,CAAA,EAAA,OAAA,EAAA,CAChD,oBAAoB,EAAE,0BAA0B,CAAA,EAAA,CAAA;yGAE/C,wBAAwB,EAAA,CAAA;;4FAAxB,wBAAwB,EAAA,UAAA,EAAA,CAAA;kBAJpC,QAAQ;AAAC,YAAA,IAAA,EAAA,CAAA;AACR,oBAAA,OAAO,EAAE,CAAC,oBAAoB,EAAE,0BAA0B,CAAC;AAC3D,oBAAA,OAAO,EAAE,CAAC,oBAAoB,EAAE,0BAA0B,CAAC;AAC5D,iBAAA;;;ACRD;;AAEG;;;;"}
@@ -4,7 +4,7 @@ import area from '@turf/area';
4
4
  import { convertArea, polygon } from '@turf/helpers';
5
5
  import kinks from '@turf/kinks';
6
6
  import { fileTypeFromBuffer } from 'file-type';
7
- import shp from 'shpjs';
7
+ import { parseShp, parseZip } from 'shpjs';
8
8
  import booleanContains from '@turf/boolean-contains';
9
9
 
10
10
  /**
@@ -763,7 +763,7 @@ async function coerceToArrayBuffer(fileOrBuffer) {
763
763
  return fileOrBuffer;
764
764
  }
765
765
  async function parseShpFile(buffer) {
766
- const geometries = await shp.parseShp(buffer, undefined);
766
+ const geometries = parseShp(buffer);
767
767
  const featCollection = {
768
768
  type: 'FeatureCollection',
769
769
  features: geometries.map((geom) => ({
@@ -775,7 +775,7 @@ async function parseShpFile(buffer) {
775
775
  return featCollection;
776
776
  }
777
777
  async function parseShpZip(buffer) {
778
- let featCollection = await shp.parseZip(buffer, undefined);
778
+ let featCollection = await parseZip(buffer);
779
779
  if (Array.isArray(featCollection)) {
780
780
  if (featCollection.length === 0) {
781
781
  throw Error(`Shape data not found.`);