@aiquants/contact-map 0.4.0 → 0.6.0

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.
package/dist/index.d.mts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { b as ContactRecordForTree, c as ContactMapTreeNaming, C as ContactMapDirectoryEntry } from "./tree-types-CDq16q63.mjs";
2
2
  export { D as DEFAULT_LIST_LAYOUT_SPEC, d as DEFAULT_TREE_LAYOUT_SPEC, R as ResponsiveLayoutSpec, a as ResponsiveThresholds, e as calculateResponsiveThresholds, g as getHysteresisBreakpointState } from "./tree-types-CDq16q63.mjs";
3
- import { e as SearchResultEntry, C as ContactRecord } from "./wire-CFgYO13H.mjs";
4
- export { d as ContactMapLogger, c as ContactMapOutletContext, b as ContactMapSearchOutletContext, a as ContactMapStreamPhase, f as ContactMapStreamState, F as FieldPerformanceMetric, I as IndexWorkerMetrics, J as JsonSerialized, L as LevenshteinWorkerMetrics, S as SerializedContactStreamRow, g as StreamChunkWire, h as StreamCursor, i as StreamErrorWire, j as StreamLineWire, k as StreamMetadataWire, l as defaultLogger } from "./wire-CFgYO13H.mjs";
3
+ import { e as SearchResultEntry, C as ContactRecord } from "./wire-hAxBVVH6.mjs";
4
+ export { d as ContactMapLogger, c as ContactMapOutletContext, b as ContactMapSearchOutletContext, a as ContactMapStreamPhase, f as ContactMapStreamState, F as FieldPerformanceMetric, I as IndexWorkerMetrics, J as JsonSerialized, L as LevenshteinWorkerMetrics, S as SerializedContactStreamRow, g as StreamChunkWire, h as StreamCursor, i as StreamErrorWire, j as StreamLineWire, k as StreamMetadataWire, l as defaultLogger } from "./wire-hAxBVVH6.mjs";
5
5
  import { z } from "zod";
6
6
  declare const assertContactMapTreeNaming: (naming: ContactMapTreeNaming) => void;
7
7
  declare class IncrementalTreeBuilder<T extends ContactRecordForTree = ContactRecordForTree> {
package/dist/index.d.ts CHANGED
@@ -1,7 +1,7 @@
1
1
  import { b as ContactRecordForTree, c as ContactMapTreeNaming, C as ContactMapDirectoryEntry } from "./tree-types-CDq16q63.js";
2
2
  export { D as DEFAULT_LIST_LAYOUT_SPEC, d as DEFAULT_TREE_LAYOUT_SPEC, R as ResponsiveLayoutSpec, a as ResponsiveThresholds, e as calculateResponsiveThresholds, g as getHysteresisBreakpointState } from "./tree-types-CDq16q63.js";
3
- import { e as SearchResultEntry, C as ContactRecord } from "./wire-CFgYO13H.js";
4
- export { d as ContactMapLogger, c as ContactMapOutletContext, b as ContactMapSearchOutletContext, a as ContactMapStreamPhase, f as ContactMapStreamState, F as FieldPerformanceMetric, I as IndexWorkerMetrics, J as JsonSerialized, L as LevenshteinWorkerMetrics, S as SerializedContactStreamRow, g as StreamChunkWire, h as StreamCursor, i as StreamErrorWire, j as StreamLineWire, k as StreamMetadataWire, l as defaultLogger } from "./wire-CFgYO13H.js";
3
+ import { e as SearchResultEntry, C as ContactRecord } from "./wire-hAxBVVH6.js";
4
+ export { d as ContactMapLogger, c as ContactMapOutletContext, b as ContactMapSearchOutletContext, a as ContactMapStreamPhase, f as ContactMapStreamState, F as FieldPerformanceMetric, I as IndexWorkerMetrics, J as JsonSerialized, L as LevenshteinWorkerMetrics, S as SerializedContactStreamRow, g as StreamChunkWire, h as StreamCursor, i as StreamErrorWire, j as StreamLineWire, k as StreamMetadataWire, l as defaultLogger } from "./wire-hAxBVVH6.js";
5
5
  import { z } from "zod";
6
6
  declare const assertContactMapTreeNaming: (naming: ContactMapTreeNaming) => void;
7
7
  declare class IncrementalTreeBuilder<T extends ContactRecordForTree = ContactRecordForTree> {
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var L=Object.defineProperty;var re=Object.getOwnPropertyDescriptor;var oe=Object.getOwnPropertyNames;var ae=Object.prototype.hasOwnProperty;var ie=(e,t)=>{for(var r in t)L(e,r,{get:t[r],enumerable:!0})},se=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of oe(t))!ae.call(e,a)&&a!==r&&L(e,a,{get:()=>t[a],enumerable:!(o=re(t,a))||o.enumerable});return e};var le=e=>se(L({},"__esModule",{value:!0}),e);var $e={};ie($e,{DEFAULT_LIST_LAYOUT_SPEC:()=>ke,DEFAULT_TREE_LAYOUT_SPEC:()=>Re,IncrementalTreeBuilder:()=>z,StandardDepartmentParser:()=>I,TitleBasedDepartmentParser:()=>F,assertContactMapTreeNaming:()=>U,buildDirectoryTree:()=>ye,calculateResponsiveThresholds:()=>_e,createExactMatchRanker:()=>ve,createSearchQueryPattern:()=>ee,defaultLogger:()=>Me,extractContactData:()=>be,extractDepartmentsFromTitle:()=>w,formatDate:()=>Pe,formatDateTime:()=>G,getEmailLinkHref:()=>Ce,getHysteresisBreakpointState:()=>Ee,getPhoneDialHref:()=>xe,getPrimaryEmail:()=>De,getPrimaryPhone:()=>Te,getSearchQuerySpellings:()=>Z,normalizeLabel:()=>E,normalizeSearchInput:()=>Y,normalizeString:()=>O,schemaContactRecord:()=>te,schemaContactRecords:()=>Ae,splitDepartment:()=>j,toDisplayValue:()=>Se});module.exports=le($e);var E=(e,t)=>e&&e.trim()||t;var pe={\u672C\u90E8:{rank:10,type:"Organization"},\u30AB\u30F3\u30D1\u30CB\u30FC:{rank:10,type:"Organization"},\u672C\u793E:{rank:10,type:"Location"},\u30D6\u30ED\u30C3\u30AF:{rank:11,type:"Location"},\u652F\u5E97:{rank:12,type:"Location"},\u7814\u7A76\u6240:{rank:15,type:"Location"},\u5DE5\u5834:{rank:15,type:"Location"},\u4E8B\u696D\u90E8:{rank:18,type:"Organization"},\u90E8\u9580:{rank:18,type:"Organization"},\u7D71\u62EC\u90E8:{rank:19,type:"Organization"},\u90E8:{rank:20,type:"Organization"},\u958B\u767A:{rank:20,type:"Organization"},\u30B0\u30EB\u30FC\u30D7:{rank:22,type:"Organization"},\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8:{rank:25,type:"Organization"},\u63A8\u9032:{rank:20,type:"Organization"},\u4E8B\u696D\u6240:{rank:25,type:"Location"},\u55B6\u696D\u6240:{rank:28,type:"Location"},\u5BA4:{rank:30,type:"Organization"},\u8AB2:{rank:30,type:"Organization"},\u30BB\u30F3\u30BF\u30FC:{rank:30,type:"Location"},\u30D3\u30B8\u30CD\u30B9\u30D7\u30ED\u30C7\u30E5\u30FC\u30B9\u30BB\u30F3\u30BF\u30FC:{rank:30,type:"Location"},\u30C1\u30FC\u30E0:{rank:40,type:"Organization"},\u4FC2:{rank:50,type:"Organization"},Department:{rank:20,type:"Organization"},Dept:{rank:20,type:"Organization"},"Dept.":{rank:20,type:"Organization"},Division:{rank:20,type:"Organization"},Div:{rank:20,type:"Organization"},"Div.":{rank:20,type:"Organization"},Section:{rank:30,type:"Organization"},Sect:{rank:30,type:"Organization"},"Sect.":{rank:30,type:"Organization"},Unit:{rank:30,type:"Organization"},Group:{rank:22,type:"Organization"},Team:{rank:40,type:"Organization"},Branch:{rank:12,type:"Location"},Office:{rank:28,type:"Location"},Center:{rank:30,type:"Location"},Centre:{rank:30,type:"Location"},HQ:{rank:10,type:"Organization"},Headquarters:{rank:10,type:"Organization"}},R=e=>{for(let[t,r]of Object.entries(pe))if(e.endsWith(t))return r;return{rank:99,type:"Other"}},B=e=>R(e).rank,ce=["\u30B0\u30EB\u30FC\u30D7","\u30C1\u30FC\u30E0","Group","Team","\u5BA4","\u8AB2","Unit","Area","\u90E8","Department","Dept","Division","Div","\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8","\u63A8\u9032"],_=e=>ce.find(t=>e.endsWith(t)),ue=new Set(["&","Quality","Innovation","R&D","Solutions","Development","Laboratory","and","Food","Beverage"]),de=(e,t)=>t>1&&(e.endsWith("\u652F\u5E97")||e.endsWith("\u672C\u90E8")||e.endsWith("\u4E8B\u696D\u6240")||e.endsWith("\u5DE5\u5834")),me=(e,t)=>{if(!t)return!0;let r=R(e),o=R(t);if(r.rank<o.rank||e.endsWith("\u672C\u90E8")&&t.endsWith("\u672C\u90E8"))return!1;let a=_(e),m=_(t);return!(a&&m&&a!==m)},W=(e,t)=>{if(!e)return[];if(e==="\u517C")return["\u517C"];if(e==="\u517C\u52D9")return["\u517C"];if(e.startsWith("\u517C ")||e.startsWith("\u517C\u3000")){let o=e.slice(1).trim();return["\u517C",...W(o,t)]}if(e.startsWith("\u517C\u52D9 ")||e.startsWith("\u517C\u52D9\u3000")){let o=e.slice(2).trim();return["\u517C",...W(o,t)]}let r="";for(let o=e.length-1;o>0;o--){if(e[o]!==" ")continue;let a=e.slice(0,o);if(!ue.has(a)&&t.has(a)){r=a;break}}if(r){let o=r,a=e.slice(r.length),m=/^\s+(and|&)\s+([A-Za-z0-9]+)/i,b=a.match(m);b&&(o=e.slice(0,r.length+b[0].length));let c=e.slice(o.length),n=["Department","Dept","Division","Div","Section","Sect","Unit","Group","Team","Branch","Office","Center","Centre","HQ","Headquarters"];for(let i of n){let y=new RegExp(`^\\s+${i}\\.?(?=$|[\\s,])`,"i"),p=c.match(y);if(p){o=e.slice(0,o.length+p[0].length);break}}let f=e.slice(o.length).trim();return[o,...W(f,t)]}return[e]},j=(e,t)=>{let o=e.replace(/[\s\u3000]+(?:兼務|兼)[\s\u3000]+/g,"\u3000\u517C\u3000").replace(/^(?:兼務|兼)[\s\u3000]+/,"\u517C\u3000").replace(/[\s\u3000]+(?:兼務|兼)$/,"\u3000\u517C").split(/\u3000/),a=[];for(let m of o){let b=m.trim();b&&a.push(...W(b,t))}return a},w=(e,t)=>{let r=[],o=["\u90E8","\u8AB2","\u5BA4","\u672C\u90E8","\u652F\u5E97","\u55B6\u696D\u6240","\u30B0\u30EB\u30FC\u30D7","\u30C1\u30FC\u30E0","\u30BB\u30F3\u30BF\u30FC","\u30AB\u30F3\u30D1\u30CB\u30FC","\u4E8B\u696D\u6240","\u5DE5\u5834","\u7814\u7A76\u6240","\u4FC2","\u90E8\u9580","\u4E8B\u696D\u90E8","\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8","\u63A8\u9032","\u958B\u767A","Department","Dept","Division","Div","Section","Sect","Unit","Group","Team","Branch","Office","Center","Centre","HQ","Headquarters"],a=e.split(/[\s\u3000,()()[\]]+/).filter(Boolean),m=a.length,b=new Set;for(let c=m;c>=1;c--)for(let n=0;n<=m-c;n++){let f=!1;for(let y=n;y<n+c;y++)if(b.has(y)){f=!0;break}if(f)continue;let i=a.slice(n,n+c).join(" ");if(!(i==="\u517C"||i==="\u517C\u52D9"||i==="\u4FC2"||i==="of"||i==="&"||i==="Quality"||i==="Innovation"||i==="R&D"||i==="Solutions"||i==="Development"||i==="Laboratory"||i==="and"||i==="Food"||i==="Beverage")&&t.allKnownDepartments.has(i)){r.push({name:i,index:n});for(let y=n;y<n+c;y++)b.add(y)}}for(let c=0;c<m;c++){if(b.has(c))continue;let n=a[c];for(n.endsWith("\u9577")&&n.length>1?n=n.slice(0,-1):n.endsWith("\u7D71\u62EC")&&n.length>2&&(n=n.slice(0,-2));;){let p=!1;if(n.startsWith("\u62C5\u5F53")&&n.length>2||n.startsWith("\u5C02\u4EFB")&&n.length>2||n.startsWith("\u517C\u52D9")&&n.length>2?(n=n.slice(2),p=!0):(n.startsWith("\u526F")||n.startsWith("\u517C"))&&n.length>1&&(n=n.slice(1),p=!0),!p)break}if(n.includes("\u30FB")&&!t.allKnownDepartments.has(n)){let p=n.split("\u30FB"),D=p[p.length-1],x=o.find(k=>D.endsWith(k));if(x){for(let k of p){let C=k;o.some(s=>C.endsWith(s))||(C=C+x);let P=n!=="\u517C"&&n!=="\u4FC2"&&n!=="of"&&n!=="&"&&n!=="Quality"&&n!=="Innovation"&&n!=="R&D"&&n!=="Solutions"&&n!=="Development"&&n!=="Laboratory"&&n!=="and"&&n!=="Food"&&n!=="Beverage"&&t.allKnownDepartments.has(C),d=o.some(s=>C.endsWith(s)),l=o.includes(C);(P||d&&!l)&&r.push({name:C,index:c})}continue}}let f=n!=="\u517C"&&n!=="\u4FC2"&&n!=="of"&&n!=="&"&&n!=="Quality"&&n!=="Innovation"&&n!=="R&D"&&n!=="Solutions"&&n!=="Development"&&n!=="Laboratory"&&n!=="and"&&n!=="Food"&&n!=="Beverage"&&t.allKnownDepartments.has(n),i=o.some(p=>n.endsWith(p)),y=o.includes(n);(f||i&&!y)&&r.push({name:n,index:c})}return r.sort((c,n)=>c.index-n.index),r.map(c=>c.name)},K=(e,t)=>{let r=0;for(let o of t)r<e.length&&o===e[r]&&r++;return r===e.length},I={name:"Standard",parse:(e,t,r="full")=>{let o=E(e.department,"");if(!o)return null;let a=j(o,t.allKnownDepartments),m=new Map;for(let n of a)m.set(n,(m.get(n)||0)+1);let b=n=>{let f=[],i=[];for(let y=0;y<n.length;y++){let p=n[y];if(p==="\u517C"){i.length>0&&(f.push(i),i=[]);continue}let D=R(p),x=D.rank,k=m.get(p)||0,C=de(p,k);if(i.length===0)i.push(p);else{let P=i[i.length-1],d=R(P),l=d.rank;if(i.includes(p))f.push(i),i=[p];else{let s=!1;if(C)s=!0;else if(d.type===D.type){let g=_(P),h=_(p);g&&h&&g!==h||P.endsWith("\u672C\u90E8")&&p.endsWith("\u672C\u90E8")||P.endsWith("\u90E8\u9580")&&p.endsWith("\u4E8B\u696D\u90E8")||P.endsWith("\u4E8B\u696D\u90E8")&&p.endsWith("\u90E8\u9580")||P.endsWith("\u90E8\u9580")&&p.endsWith("\u672C\u90E8")||d.type==="Other"&&D.type==="Other"?s=!0:s=l<x}else s=x>=10,s&&d.type==="Location"&&D.type==="Organization"&&l>=x&&n.slice(y+1).includes(P)&&(s=!1);s?i.push(p):(f.push(i),i=[p])}}if(C){let P=y+1<n.length?n[y+1]:void 0;me(p,P)&&i.length>0&&(f.push(i),i=[])}}return i.length>0&&f.push(i),f},c=[];if(r==="full"&&c.push(...b(a)),r==="pure_org"){let n=a.filter(f=>R(f).type!=="Location");n.length>0&&c.push(...b(n))}if(e.title){let f=/[^\x20-\x7E]/.test(e.title)?/[\s\u3000]*(?:兼務|兼)[\s\u3000]*/:/[,;]|(?:兼務|兼)/,i=e.title.split(f).filter(Boolean),y=[],p=(d,l)=>{let s=B(d),g=B(l),h=s<g;if(!h){let T=_(d),S=_(l);if(T&&S&&T!==S)h=!0;else if(d.endsWith("\u672C\u90E8")&&l.endsWith("\u672C\u90E8"))h=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u4E8B\u696D\u90E8")||d.endsWith("\u4E8B\u696D\u90E8")&&l.endsWith("\u90E8\u9580"))h=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u672C\u90E8"))h=!0;else{let N=R(d),ne=R(l);N.type==="Other"&&ne.type==="Other"&&(h=!0)}}return h};for(let d of i){let l=w(d,t);if(l.length===0)continue;let s=[];for(let g of l)if(s.length===0)s.push(g);else{let h=s[s.length-1];if(p(h,g))s.push(g);else{y.push([...s]);let T=!1;for(let S=s.length-2;S>=0;S--){let N=s[S];if(p(N,g)){s=[...s.slice(0,S+1),g],T=!0;break}}T||(s=[g])}}s.length>0&&y.push(s)}let D=[...c],x=d=>i.some(l=>l.includes(d)&&l.length>d.length);for(let d of y){let l=!1;for(let s of c){let g=s.findIndex(h=>d.includes(h));if(g!==-1){let h=s[g],T=d.indexOf(h);if(g>0&&T===0){let S=s.slice(0,g);D.push([...S,...d]),l=!0}else if(T>0&&g===0){let S=d.slice(0,T);D.push([...S,...s]),D.push(d),l=!0}else d.length>s.length-g,l=!0}if(!l){let h=s[s.length-1],T=d[0];p(h,T)&&(D.push([...s,...d]),l=!0)}}l||D.push(d)}let k=[],C=[],P=new Set;for(let d of D){let l=d.join("|");P.has(l)||(P.add(l),C.push(d))}for(let d=0;d<C.length;d++){let l=C[d],s=!1;for(let g=0;g<C.length;g++){if(d===g)continue;let h=C[g];if(h.length>l.length&&h.slice(0,l.length).join("|")===l.join("|")){let T=l[l.length-1];if(!x(T)){s=!0;break}}if(h.length>l.length&&K(l,h)){let T=l[l.length-1];if(!x(T)){s=!0;break}}if(l.length===1&&h.length>0){let T=l[0],S=h[h.length-1];if(T!==S&&S.endsWith(T)){s=!0;break}}}s||k.push(l)}return k.length>0?k:null}if(c.length>0){let n=[];for(let f=0;f<c.length;f++){let i=c[f],y=!1;for(let p=0;p<c.length;p++){if(f===p)continue;let D=c[p];if(D.length>i.length&&K(i,D)){y=!0;break}}y||n.push(i)}return n.length>0?n:null}return null}},F={name:"TitleBased",parse:(e,t,r="full")=>{let o=e.title;if(!o)return null;let a=w(o,t);return a.length>0?[a]:null}};var fe=["uncategorizedCompany","unnamedPerson"],U=e=>{if(typeof e!="object"||e===null)throw new RangeError(`[contact-map] tree naming must be an object; got ${e===null?"null":typeof e}`);for(let t of fe){let r=e[t];if(typeof r!="string"||r.trim()==="")throw new RangeError(`[contact-map] tree naming.${t} must be a non-blank string; got ${typeof r=="string"?JSON.stringify(r):r===null?"null":typeof r}`)}},he=[I,F],ge=(e,t)=>{let r=E(e.full_name,t),o=E(e.title,"");return o.length>0?`${r} (${o})`:r},$=e=>e.sort((t,r)=>t.label.localeCompare(r.label,"ja")),v=(e,t,r)=>{let o=e.get(t);if(o)return o;let a=r();return e.set(t,a),a},A=e=>encodeURIComponent(e.replace(/\//g,"\uFF0F")),H=e=>e.sort((t,r)=>{let o=!!(t.contact.title&&t.contact.title.trim().length>0),a=!!(r.contact.title&&r.contact.title.trim().length>0);return o&&!a?-1:!o&&a?1:t.label.localeCompare(r.label,"ja")}),Q=e=>({name:e.label,type:"file",absolutePath:e.path,relativePath:e.segment,personId:e.contact.person_id,title:e.contact.title||void 0,isPrimary:e.isPrimary}),V=e=>{let t=$(Array.from(e.children.values())).map(V),r=H([...e.persons]).map(Q);return{name:e.label,type:"directory",absolutePath:e.path,relativePath:e.segment,children:[...r,...t],memberCount:e.personCount}},z=class{constructor(t){this.companyMap=new Map;this.processedPersonIds=new Set;this.allDepts=new Set;this.cachedResult=null;U(t),this.naming=t}appendRecords(t){if(!t||t.length===0)return;let r="full",o=!1;for(let a of t)if(!this.processedPersonIds.has(a.person_id)&&a.department){let m=a.department.split(/\u3000/);for(let b of m){let c=b.trim();if(!c||c==="\u517C"||c==="\u4FC2")continue;if(/[^\x20-\x7E]/.test(c)){let f=c.split(" ").filter(i=>i.length>0&&i!=="\u517C"&&i!=="\u4FC2");for(let i of f)this.allDepts.add(i)}else this.allDepts.add(c)}}for(let a of t){let m=a.person_id;if(!Number.isFinite(m)||this.processedPersonIds.has(m))continue;this.processedPersonIds.add(m),o=!0;let b=E(a.company_name,this.naming.uncategorizedCompany),c=ge(a,this.naming.unnamedPerson),n=`company:${A(b)}`,f=v(this.companyMap,n,()=>({label:b,segment:n,path:`/${n}`,departments:new Map,persons:[],personCount:0})),i=[],y={allKnownDepartments:this.allDepts};for(let p of he){let D=p.parse(a,y,r);if(D&&D.length>0){i=D;break}}i.length===0&&i.push([]);for(let p=0;p<i.length;p++){let D=i[p];if(D.length===0){let l=`person:${m}`,s=`${f.path}/${l}`;f.persons.some(h=>h.contact.person_id===m)||f.persons.push({contact:a,label:c,path:s,segment:l,isPrimary:!0});continue}let x=null,k=f.path;if(D.length>0){let l=D[0],s=`department:${A(l)}`;x=v(f.departments,s,()=>({label:l,segment:s,path:`${k}/${s}`,children:new Map,persons:[],personCount:0})),k=x.path,x.personCount+=1;for(let g=1;g<D.length;g++){let h=D[g],T=`department:${A(h)}`;if(!x)throw new Error("Unexpected null currentDepartmentNode");x=v(x.children,T,()=>({label:h,segment:T,path:`${k}/${T}`,children:new Map,persons:[],personCount:0})),k=x.path,x.personCount+=1}}else continue;let C=`person:${m}`,P=`${x.path}/${C}`;x.persons.some(l=>l.contact.person_id===m)||x.persons.push({contact:a,label:c,path:P,segment:C,isPrimary:p===0})}f.personCount+=1}o&&(this.cachedResult=null)}getSnapshot(){if(this.cachedResult)return this.cachedResult;let t={},r=$(Array.from(this.companyMap.values())).map(o=>{let a=$(Array.from(o.departments.values())).map(V),m=H([...o.persons]).map(Q),b={name:o.label,type:"directory",absolutePath:o.path,relativePath:o.segment,children:[...m,...a],memberCount:o.personCount};return t[o.label]=b,b});return this.cachedResult={tree:r,companyMap:t},this.cachedResult}append(t){this.appendRecords(t)}build(){return this.getSnapshot().tree}reset(){this.companyMap.clear(),this.processedPersonIds.clear(),this.allDepts.clear(),this.cachedResult=null}getUniquePersonCount(){return this.processedPersonIds.size}get size(){return this.processedPersonIds.size}},ye=(e,t)=>{let r=new z(t);return r.appendRecords(e),r.getSnapshot()};var O=e=>{if(typeof e!="string")return null;let t=e.trim();return t.length>0?t:null},be=e=>!e||typeof e!="object"?null:"item"in e?e.item??null:"person_id"in e?e:null,q=(e,t)=>{if(!e)return{value:null,fieldKey:null};for(let r of t){let o=O(e[r]);if(o)return{value:o,fieldKey:r}}return{value:null,fieldKey:null}},De=e=>q(e,["custom_email","email"]),Te=e=>q(e,["custom_mobile_phone_number","mobile_phone_number","company_phone_number"]),xe=e=>{let t=O(e);if(!t)return null;let r=t.replace(/[^0-9+#*]/g,"");return r.length===0?null:`tel:${r}`},Ce=(e,t)=>{let r=O(e);return r?t?`https://mail.google.com/mail/?view=cm&fs=1&to=${encodeURIComponent(r)}`:`mailto:${encodeURIComponent(r)}`:null},Pe=e=>{if(!e)return"-";let t=typeof e=="string"||typeof e=="number"?new Date(e):e;return!(t instanceof Date)||Number.isNaN(t.getTime())?typeof e=="string"?e:"-":t.toISOString().split("T")[0]},G=e=>{if(!e)return"-";let t=typeof e=="string"||typeof e=="number"?new Date(e):e;return!(t instanceof Date)||Number.isNaN(t.getTime())?typeof e=="string"?e:"-":t.toISOString()},Se=e=>e==null?"-":typeof e=="string"?O(e)??"-":typeof e=="number"?Number.isFinite(e)?String(e):"-":e instanceof Date?G(e):String(e);var ke={listPanelMinWidth:320,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35},Re={listPanelMinWidth:280,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35};function _e(e){let t=e.listPanelMinWidth+e.detailPanelMinWidth+e.handleThickness+e.listPaddingAndBorder+e.detailPaddingAndBorder,r=t+e.scrollbarSafetyBuffer,o=r+e.hysteresisSafetyMargin,a=o-r;return{physicalMinWidth:t,collapseThreshold:r,expandThreshold:o,hysteresisWidth:a}}function Ee(e,t,r){return e<=0||!Number.isFinite(e)?!1:t?e>=r.collapseThreshold:e>=r.expandThreshold}var Me={info:(e,...t)=>console.info(`[contact-map] ${e}`,...t),warn:(e,...t)=>console.warn(`[contact-map] ${e}`,...t),error:(e,...t)=>console.error(`[contact-map] ${e}`,...t)};var M=require("@aiquants/select-box"),Oe=/[​]/g,We=/^[\s  ]+|[\s  ]+$/g,ze=/\s+/,Ne=/^[\p{Script=Latin}\s]+$/u,Le=/\p{Script=Latin}/u,X=Object.freeze({convertWidth:!0,convertKana:!0,convertCase:!0,convertRomaji:!1}),we=e=>(0,M.normalizeText)(e.replace(Oe,"").replace(We,""),X),Ie=e=>{if(!Ne.test(e))return null;let t=(0,M.romajiToKatakana)(e);return Le.test(t)?null:t},J=e=>e.split(ze).filter(Boolean),Y=e=>{let t=we(e),r=Ie(t);return r===null?t:r},Z=e=>{let t=new Set([...J(e),...J(Y(e))]),r=new Set;for(let o of t)for(let a of(0,M.getNormalizedVariants)(o,X)){let m=a.trim();m&&r.add(m)}return Array.from(r)},Fe=/[.*+?^${}()|[\]\\]/g,ee=e=>{let t=Z(e);if(t.length===0)return null;let r=t.map(o=>o.replace(Fe,"\\$&")).sort((o,a)=>a.length-o.length);return new RegExp(r.join("|"),"gi")},ve=(e,t)=>{let r=ee(e);if(r===null)return a=>a;let o=a=>t.some(m=>{let b=a[m];return typeof b=="string"&&b.search(r)!==-1});return a=>{let m=[],b=[];for(let c of a)o(c.item)?m.push(c):b.push(c);return[...m,...b]}};var u=require("zod"),te=u.z.object({person_id:u.z.union([u.z.string(),u.z.number()]).transform(e=>{if(typeof e=="number")return e;let t=e.trim();return parseInt(t,10)}).pipe(u.z.number()),person_id_redirect_to:u.z.union([u.z.string(),u.z.number()]).nullable().optional().transform(e=>{if(e==null)return null;if(typeof e=="number")return e;let t=e.trim();if(t.length===0)return null;let r=parseInt(t,10);return Number.isNaN(r)?null:r}),full_name:u.z.string().nullable().optional(),full_name_reading:u.z.string().nullable().optional(),company_name:u.z.string().nullable().optional(),company_name_reading:u.z.string().nullable().optional(),department:u.z.string().nullable().optional(),title:u.z.string().nullable().optional(),address:u.z.string().nullable().optional(),postal_code:u.z.string().nullable().optional(),email:u.z.string().nullable().optional(),custom_email:u.z.string().nullable().optional(),company_phone_number:u.z.string().nullable().optional(),custom_company_phone_number:u.z.string().nullable().optional(),company_fax_number:u.z.string().nullable().optional(),mobile_phone_number:u.z.string().nullable().optional(),custom_mobile_phone_number:u.z.string().nullable().optional(),url:u.z.string().nullable().optional(),contacted_at:u.z.union([u.z.date(),u.z.string()]).nullable().optional(),contacted_by:u.z.string().nullable().optional(),is_in_eight:u.z.boolean().nullable().optional(),is_contact_synced:u.z.boolean().nullable().optional(),is_active:u.z.boolean(),is_incomplete:u.z.boolean().nullable().optional(),created_at:u.z.union([u.z.date(),u.z.string()]).optional(),created_by:u.z.string().optional(),updated_at:u.z.union([u.z.date(),u.z.string()]).optional(),updated_by:u.z.string().optional()}),Ae=u.z.array(te);0&&(module.exports={DEFAULT_LIST_LAYOUT_SPEC,DEFAULT_TREE_LAYOUT_SPEC,IncrementalTreeBuilder,StandardDepartmentParser,TitleBasedDepartmentParser,assertContactMapTreeNaming,buildDirectoryTree,calculateResponsiveThresholds,createExactMatchRanker,createSearchQueryPattern,defaultLogger,extractContactData,extractDepartmentsFromTitle,formatDate,formatDateTime,getEmailLinkHref,getHysteresisBreakpointState,getPhoneDialHref,getPrimaryEmail,getPrimaryPhone,getSearchQuerySpellings,normalizeLabel,normalizeSearchInput,normalizeString,schemaContactRecord,schemaContactRecords,splitDepartment,toDisplayValue});
1
+ "use strict";var L=Object.defineProperty;var ae=Object.getOwnPropertyDescriptor;var ie=Object.getOwnPropertyNames;var se=Object.prototype.hasOwnProperty;var le=(e,t)=>{for(var r in t)L(e,r,{get:t[r],enumerable:!0})},pe=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of ie(t))!se.call(e,a)&&a!==r&&L(e,a,{get:()=>t[a],enumerable:!(o=ae(t,a))||o.enumerable});return e};var ce=e=>pe(L({},"__esModule",{value:!0}),e);var je={};le(je,{DEFAULT_LIST_LAYOUT_SPEC:()=>_e,DEFAULT_TREE_LAYOUT_SPEC:()=>Ee,IncrementalTreeBuilder:()=>N,StandardDepartmentParser:()=>F,TitleBasedDepartmentParser:()=>A,assertContactMapTreeNaming:()=>Q,buildDirectoryTree:()=>De,calculateResponsiveThresholds:()=>Me,createExactMatchRanker:()=>Be,createSearchQueryPattern:()=>ne,defaultLogger:()=>We,extractContactData:()=>Te,extractDepartmentsFromTitle:()=>I,formatDate:()=>ke,formatDateTime:()=>X,getEmailLinkHref:()=>Se,getHysteresisBreakpointState:()=>Oe,getPhoneDialHref:()=>Pe,getPrimaryEmail:()=>xe,getPrimaryPhone:()=>Ce,getSearchQuerySpellings:()=>te,normalizeLabel:()=>E,normalizeSearchInput:()=>ee,normalizeString:()=>O,schemaContactRecord:()=>re,schemaContactRecords:()=>Ke,splitDepartment:()=>U,toDisplayValue:()=>Re});module.exports=ce(je);var E=(e,t)=>e&&e.trim()||t;var ue={\u672C\u90E8:{rank:10,type:"Organization"},\u30AB\u30F3\u30D1\u30CB\u30FC:{rank:10,type:"Organization"},\u672C\u793E:{rank:10,type:"Location"},\u30D6\u30ED\u30C3\u30AF:{rank:11,type:"Location"},\u652F\u5E97:{rank:12,type:"Location"},\u7814\u7A76\u6240:{rank:15,type:"Location"},\u5DE5\u5834:{rank:15,type:"Location"},\u4E8B\u696D\u90E8:{rank:18,type:"Organization"},\u90E8\u9580:{rank:18,type:"Organization"},\u7D71\u62EC\u90E8:{rank:19,type:"Organization"},\u90E8:{rank:20,type:"Organization"},\u958B\u767A:{rank:20,type:"Organization"},\u30B0\u30EB\u30FC\u30D7:{rank:22,type:"Organization"},\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8:{rank:25,type:"Organization"},\u63A8\u9032:{rank:20,type:"Organization"},\u4E8B\u696D\u6240:{rank:25,type:"Location"},\u55B6\u696D\u6240:{rank:28,type:"Location"},\u5BA4:{rank:30,type:"Organization"},\u8AB2:{rank:30,type:"Organization"},\u30BB\u30F3\u30BF\u30FC:{rank:30,type:"Location"},\u30D3\u30B8\u30CD\u30B9\u30D7\u30ED\u30C7\u30E5\u30FC\u30B9\u30BB\u30F3\u30BF\u30FC:{rank:30,type:"Location"},\u30C1\u30FC\u30E0:{rank:40,type:"Organization"},\u4FC2:{rank:50,type:"Organization"},Department:{rank:20,type:"Organization"},Dept:{rank:20,type:"Organization"},"Dept.":{rank:20,type:"Organization"},Division:{rank:20,type:"Organization"},Div:{rank:20,type:"Organization"},"Div.":{rank:20,type:"Organization"},Section:{rank:30,type:"Organization"},Sect:{rank:30,type:"Organization"},"Sect.":{rank:30,type:"Organization"},Unit:{rank:30,type:"Organization"},Group:{rank:22,type:"Organization"},Team:{rank:40,type:"Organization"},Branch:{rank:12,type:"Location"},Office:{rank:28,type:"Location"},Center:{rank:30,type:"Location"},Centre:{rank:30,type:"Location"},HQ:{rank:10,type:"Organization"},Headquarters:{rank:10,type:"Organization"}},R=e=>{for(let[t,r]of Object.entries(ue))if(e.endsWith(t))return r;return{rank:99,type:"Other"}},j=e=>R(e).rank,de=["\u30B0\u30EB\u30FC\u30D7","\u30C1\u30FC\u30E0","Group","Team","\u5BA4","\u8AB2","Unit","Area","\u90E8","Department","Dept","Division","Div","\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8","\u63A8\u9032"],_=e=>de.find(t=>e.endsWith(t)),me=new Set(["&","Quality","Innovation","R&D","Solutions","Development","Laboratory","and","Food","Beverage"]),fe=(e,t)=>t>1&&(e.endsWith("\u652F\u5E97")||e.endsWith("\u672C\u90E8")||e.endsWith("\u4E8B\u696D\u6240")||e.endsWith("\u5DE5\u5834")),he=(e,t)=>{if(!t)return!0;let r=R(e),o=R(t);if(r.rank<o.rank||e.endsWith("\u672C\u90E8")&&t.endsWith("\u672C\u90E8"))return!1;let a=_(e),m=_(t);return!(a&&m&&a!==m)},W=(e,t)=>{if(!e)return[];if(e==="\u517C")return["\u517C"];if(e==="\u517C\u52D9")return["\u517C"];if(e.startsWith("\u517C ")||e.startsWith("\u517C\u3000")){let o=e.slice(1).trim();return["\u517C",...W(o,t)]}if(e.startsWith("\u517C\u52D9 ")||e.startsWith("\u517C\u52D9\u3000")){let o=e.slice(2).trim();return["\u517C",...W(o,t)]}let r="";for(let o=e.length-1;o>0;o--){if(e[o]!==" ")continue;let a=e.slice(0,o);if(!me.has(a)&&t.has(a)){r=a;break}}if(r){let o=r,a=e.slice(r.length),m=/^\s+(and|&)\s+([A-Za-z0-9]+)/i,b=a.match(m);b&&(o=e.slice(0,r.length+b[0].length));let c=e.slice(o.length),n=["Department","Dept","Division","Div","Section","Sect","Unit","Group","Team","Branch","Office","Center","Centre","HQ","Headquarters"];for(let i of n){let y=new RegExp(`^\\s+${i}\\.?(?=$|[\\s,])`,"i"),p=c.match(y);if(p){o=e.slice(0,o.length+p[0].length);break}}let f=e.slice(o.length).trim();return[o,...W(f,t)]}return[e]},U=(e,t)=>{let o=e.replace(/[\s\u3000]+(?:兼務|兼)[\s\u3000]+/g,"\u3000\u517C\u3000").replace(/^(?:兼務|兼)[\s\u3000]+/,"\u517C\u3000").replace(/[\s\u3000]+(?:兼務|兼)$/,"\u3000\u517C").split(/\u3000/),a=[];for(let m of o){let b=m.trim();b&&a.push(...W(b,t))}return a},I=(e,t)=>{let r=[],o=["\u90E8","\u8AB2","\u5BA4","\u672C\u90E8","\u652F\u5E97","\u55B6\u696D\u6240","\u30B0\u30EB\u30FC\u30D7","\u30C1\u30FC\u30E0","\u30BB\u30F3\u30BF\u30FC","\u30AB\u30F3\u30D1\u30CB\u30FC","\u4E8B\u696D\u6240","\u5DE5\u5834","\u7814\u7A76\u6240","\u4FC2","\u90E8\u9580","\u4E8B\u696D\u90E8","\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8","\u63A8\u9032","\u958B\u767A","Department","Dept","Division","Div","Section","Sect","Unit","Group","Team","Branch","Office","Center","Centre","HQ","Headquarters"],a=e.split(/[\s\u3000,()()[\]]+/).filter(Boolean),m=a.length,b=new Set;for(let c=m;c>=1;c--)for(let n=0;n<=m-c;n++){let f=!1;for(let y=n;y<n+c;y++)if(b.has(y)){f=!0;break}if(f)continue;let i=a.slice(n,n+c).join(" ");if(!(i==="\u517C"||i==="\u517C\u52D9"||i==="\u4FC2"||i==="of"||i==="&"||i==="Quality"||i==="Innovation"||i==="R&D"||i==="Solutions"||i==="Development"||i==="Laboratory"||i==="and"||i==="Food"||i==="Beverage")&&t.allKnownDepartments.has(i)){r.push({name:i,index:n});for(let y=n;y<n+c;y++)b.add(y)}}for(let c=0;c<m;c++){if(b.has(c))continue;let n=a[c];for(n.endsWith("\u9577")&&n.length>1?n=n.slice(0,-1):n.endsWith("\u7D71\u62EC")&&n.length>2&&(n=n.slice(0,-2));;){let p=!1;if(n.startsWith("\u62C5\u5F53")&&n.length>2||n.startsWith("\u5C02\u4EFB")&&n.length>2||n.startsWith("\u517C\u52D9")&&n.length>2?(n=n.slice(2),p=!0):(n.startsWith("\u526F")||n.startsWith("\u517C"))&&n.length>1&&(n=n.slice(1),p=!0),!p)break}if(n.includes("\u30FB")&&!t.allKnownDepartments.has(n)){let p=n.split("\u30FB"),D=p[p.length-1],x=o.find(k=>D.endsWith(k));if(x){for(let k of p){let C=k;o.some(s=>C.endsWith(s))||(C=C+x);let P=n!=="\u517C"&&n!=="\u4FC2"&&n!=="of"&&n!=="&"&&n!=="Quality"&&n!=="Innovation"&&n!=="R&D"&&n!=="Solutions"&&n!=="Development"&&n!=="Laboratory"&&n!=="and"&&n!=="Food"&&n!=="Beverage"&&t.allKnownDepartments.has(C),d=o.some(s=>C.endsWith(s)),l=o.includes(C);(P||d&&!l)&&r.push({name:C,index:c})}continue}}let f=n!=="\u517C"&&n!=="\u4FC2"&&n!=="of"&&n!=="&"&&n!=="Quality"&&n!=="Innovation"&&n!=="R&D"&&n!=="Solutions"&&n!=="Development"&&n!=="Laboratory"&&n!=="and"&&n!=="Food"&&n!=="Beverage"&&t.allKnownDepartments.has(n),i=o.some(p=>n.endsWith(p)),y=o.includes(n);(f||i&&!y)&&r.push({name:n,index:c})}return r.sort((c,n)=>c.index-n.index),r.map(c=>c.name)},v=(e,t)=>{let r=0;for(let o of t)r<e.length&&o===e[r]&&r++;return r===e.length},F={name:"Standard",parse:(e,t,r="full")=>{let o=E(e.department,"");if(!o)return null;let a=U(o,t.allKnownDepartments),m=new Map;for(let n of a)m.set(n,(m.get(n)||0)+1);let b=n=>{let f=[],i=[];for(let y=0;y<n.length;y++){let p=n[y];if(p==="\u517C"){i.length>0&&(f.push(i),i=[]);continue}let D=R(p),x=D.rank,k=m.get(p)||0,C=fe(p,k);if(i.length===0)i.push(p);else{let P=i[i.length-1],d=R(P),l=d.rank;if(i.includes(p))f.push(i),i=[p];else{let s=!1;if(C)s=!0;else if(d.type===D.type){let g=_(P),h=_(p);g&&h&&g!==h||P.endsWith("\u672C\u90E8")&&p.endsWith("\u672C\u90E8")||P.endsWith("\u90E8\u9580")&&p.endsWith("\u4E8B\u696D\u90E8")||P.endsWith("\u4E8B\u696D\u90E8")&&p.endsWith("\u90E8\u9580")||P.endsWith("\u90E8\u9580")&&p.endsWith("\u672C\u90E8")||d.type==="Other"&&D.type==="Other"?s=!0:s=l<x}else s=x>=10,s&&d.type==="Location"&&D.type==="Organization"&&l>=x&&n.slice(y+1).includes(P)&&(s=!1);s?i.push(p):(f.push(i),i=[p])}}if(C){let P=y+1<n.length?n[y+1]:void 0;he(p,P)&&i.length>0&&(f.push(i),i=[])}}return i.length>0&&f.push(i),f},c=[];if(r==="full"&&c.push(...b(a)),r==="pure_org"){let n=a.filter(f=>R(f).type!=="Location");n.length>0&&c.push(...b(n))}if(e.title){let f=/[^\x20-\x7E]/.test(e.title)?/[\s\u3000]*(?:兼務|兼)[\s\u3000]*/:/[,;]|(?:兼務|兼)/,i=e.title.split(f).filter(Boolean),y=[],p=(d,l)=>{let s=j(d),g=j(l),h=s<g;if(!h){let T=_(d),S=_(l);if(T&&S&&T!==S)h=!0;else if(d.endsWith("\u672C\u90E8")&&l.endsWith("\u672C\u90E8"))h=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u4E8B\u696D\u90E8")||d.endsWith("\u4E8B\u696D\u90E8")&&l.endsWith("\u90E8\u9580"))h=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u672C\u90E8"))h=!0;else{let w=R(d),oe=R(l);w.type==="Other"&&oe.type==="Other"&&(h=!0)}}return h};for(let d of i){let l=I(d,t);if(l.length===0)continue;let s=[];for(let g of l)if(s.length===0)s.push(g);else{let h=s[s.length-1];if(p(h,g))s.push(g);else{y.push([...s]);let T=!1;for(let S=s.length-2;S>=0;S--){let w=s[S];if(p(w,g)){s=[...s.slice(0,S+1),g],T=!0;break}}T||(s=[g])}}s.length>0&&y.push(s)}let D=[...c],x=d=>i.some(l=>l.includes(d)&&l.length>d.length);for(let d of y){let l=!1;for(let s of c){let g=s.findIndex(h=>d.includes(h));if(g!==-1){let h=s[g],T=d.indexOf(h);if(g>0&&T===0){let S=s.slice(0,g);D.push([...S,...d]),l=!0}else if(T>0&&g===0){let S=d.slice(0,T);D.push([...S,...s]),D.push(d),l=!0}else d.length>s.length-g,l=!0}if(!l){let h=s[s.length-1],T=d[0];p(h,T)&&(D.push([...s,...d]),l=!0)}}l||D.push(d)}let k=[],C=[],P=new Set;for(let d of D){let l=d.join("|");P.has(l)||(P.add(l),C.push(d))}for(let d=0;d<C.length;d++){let l=C[d],s=!1;for(let g=0;g<C.length;g++){if(d===g)continue;let h=C[g];if(h.length>l.length&&h.slice(0,l.length).join("|")===l.join("|")){let T=l[l.length-1];if(!x(T)){s=!0;break}}if(h.length>l.length&&v(l,h)){let T=l[l.length-1];if(!x(T)){s=!0;break}}if(l.length===1&&h.length>0){let T=l[0],S=h[h.length-1];if(T!==S&&S.endsWith(T)){s=!0;break}}}s||k.push(l)}return k.length>0?k:null}if(c.length>0){let n=[];for(let f=0;f<c.length;f++){let i=c[f],y=!1;for(let p=0;p<c.length;p++){if(f===p)continue;let D=c[p];if(D.length>i.length&&v(i,D)){y=!0;break}}y||n.push(i)}return n.length>0?n:null}return null}},A={name:"TitleBased",parse:(e,t,r="full")=>{let o=e.title;if(!o)return null;let a=I(o,t);return a.length>0?[a]:null}};var z=e=>{switch(typeof e){case"string":return JSON.stringify(e);case"bigint":return`${e}n`;case"symbol":return e.toString();case"object":return e===null?"null":H(e);case"function":return H(e);case"number":return Object.is(e,-0)?"-0":String(e);default:return String(e)}},H=e=>{try{return Object.prototype.toString.call(e)}catch{return"[object ?]"}};var ge=["uncategorizedCompany","unnamedPerson"],Q=e=>{if(typeof e!="object"||e===null)throw new TypeError(`[contact-map] tree naming must be an object; got ${z(e)}`);for(let t of ge){let r=e[t];if(typeof r!="string")throw new TypeError(`[contact-map] tree naming.${t} must be a string; got ${z(r)}`);if(r.trim()==="")throw new RangeError(`[contact-map] tree naming.${t} must not be empty or blank; got ${z(r)}`)}},ye=[F,A],be=(e,t)=>{let r=E(e.full_name,t),o=E(e.title,"");return o.length>0?`${r} (${o})`:r},K=e=>e.sort((t,r)=>t.label.localeCompare(r.label,"ja")),$=(e,t,r)=>{let o=e.get(t);if(o)return o;let a=r();return e.set(t,a),a},B=e=>encodeURIComponent(e.replace(/\//g,"\uFF0F")),V=e=>e.sort((t,r)=>{let o=!!(t.contact.title&&t.contact.title.trim().length>0),a=!!(r.contact.title&&r.contact.title.trim().length>0);return o&&!a?-1:!o&&a?1:t.label.localeCompare(r.label,"ja")}),q=e=>({name:e.label,type:"file",absolutePath:e.path,relativePath:e.segment,personId:e.contact.person_id,title:e.contact.title||void 0,isPrimary:e.isPrimary}),G=e=>{let t=K(Array.from(e.children.values())).map(G),r=V([...e.persons]).map(q);return{name:e.label,type:"directory",absolutePath:e.path,relativePath:e.segment,children:[...r,...t],memberCount:e.personCount}},N=class{constructor(t){this.companyMap=new Map;this.processedPersonIds=new Set;this.allDepts=new Set;this.cachedResult=null;Q(t),this.naming=t}appendRecords(t){if(!t||t.length===0)return;let r="full",o=!1;for(let a of t)if(!this.processedPersonIds.has(a.person_id)&&a.department){let m=a.department.split(/\u3000/);for(let b of m){let c=b.trim();if(!c||c==="\u517C"||c==="\u4FC2")continue;if(/[^\x20-\x7E]/.test(c)){let f=c.split(" ").filter(i=>i.length>0&&i!=="\u517C"&&i!=="\u4FC2");for(let i of f)this.allDepts.add(i)}else this.allDepts.add(c)}}for(let a of t){let m=a.person_id;if(!Number.isFinite(m)||this.processedPersonIds.has(m))continue;this.processedPersonIds.add(m),o=!0;let b=E(a.company_name,this.naming.uncategorizedCompany),c=be(a,this.naming.unnamedPerson),n=`company:${B(b)}`,f=$(this.companyMap,n,()=>({label:b,segment:n,path:`/${n}`,departments:new Map,persons:[],personCount:0})),i=[],y={allKnownDepartments:this.allDepts};for(let p of ye){let D=p.parse(a,y,r);if(D&&D.length>0){i=D;break}}i.length===0&&i.push([]);for(let p=0;p<i.length;p++){let D=i[p];if(D.length===0){let l=`person:${m}`,s=`${f.path}/${l}`;f.persons.some(h=>h.contact.person_id===m)||f.persons.push({contact:a,label:c,path:s,segment:l,isPrimary:!0});continue}let x=null,k=f.path;if(D.length>0){let l=D[0],s=`department:${B(l)}`;x=$(f.departments,s,()=>({label:l,segment:s,path:`${k}/${s}`,children:new Map,persons:[],personCount:0})),k=x.path,x.personCount+=1;for(let g=1;g<D.length;g++){let h=D[g],T=`department:${B(h)}`;if(!x)throw new Error("[contact-map] unexpected null currentDepartmentNode");x=$(x.children,T,()=>({label:h,segment:T,path:`${k}/${T}`,children:new Map,persons:[],personCount:0})),k=x.path,x.personCount+=1}}else continue;let C=`person:${m}`,P=`${x.path}/${C}`;x.persons.some(l=>l.contact.person_id===m)||x.persons.push({contact:a,label:c,path:P,segment:C,isPrimary:p===0})}f.personCount+=1}o&&(this.cachedResult=null)}getSnapshot(){if(this.cachedResult)return this.cachedResult;let t={},r=K(Array.from(this.companyMap.values())).map(o=>{let a=K(Array.from(o.departments.values())).map(G),m=V([...o.persons]).map(q),b={name:o.label,type:"directory",absolutePath:o.path,relativePath:o.segment,children:[...m,...a],memberCount:o.personCount};return t[o.label]=b,b});return this.cachedResult={tree:r,companyMap:t},this.cachedResult}append(t){this.appendRecords(t)}build(){return this.getSnapshot().tree}reset(){this.companyMap.clear(),this.processedPersonIds.clear(),this.allDepts.clear(),this.cachedResult=null}getUniquePersonCount(){return this.processedPersonIds.size}get size(){return this.processedPersonIds.size}},De=(e,t)=>{let r=new N(t);return r.appendRecords(e),r.getSnapshot()};var O=e=>{if(typeof e!="string")return null;let t=e.trim();return t.length>0?t:null},Te=e=>!e||typeof e!="object"?null:"item"in e?e.item??null:"person_id"in e?e:null,J=(e,t)=>{if(!e)return{value:null,fieldKey:null};for(let r of t){let o=O(e[r]);if(o)return{value:o,fieldKey:r}}return{value:null,fieldKey:null}},xe=e=>J(e,["custom_email","email"]),Ce=e=>J(e,["custom_mobile_phone_number","mobile_phone_number","company_phone_number"]),Pe=e=>{let t=O(e);if(!t)return null;let r=t.replace(/[^0-9+#*]/g,"");return r.length===0?null:`tel:${r}`},Se=(e,t)=>{let r=O(e);return r?t?`https://mail.google.com/mail/?view=cm&fs=1&to=${encodeURIComponent(r)}`:`mailto:${encodeURIComponent(r)}`:null},ke=e=>{if(!e)return"-";let t=typeof e=="string"||typeof e=="number"?new Date(e):e;return!(t instanceof Date)||Number.isNaN(t.getTime())?typeof e=="string"?e:"-":t.toISOString().split("T")[0]},X=e=>{if(!e)return"-";let t=typeof e=="string"||typeof e=="number"?new Date(e):e;return!(t instanceof Date)||Number.isNaN(t.getTime())?typeof e=="string"?e:"-":t.toISOString()},Re=e=>e==null?"-":typeof e=="string"?O(e)??"-":typeof e=="number"?Number.isFinite(e)?String(e):"-":e instanceof Date?X(e):String(e);var _e={listPanelMinWidth:320,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35},Ee={listPanelMinWidth:280,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35};function Me(e){let t=e.listPanelMinWidth+e.detailPanelMinWidth+e.handleThickness+e.listPaddingAndBorder+e.detailPaddingAndBorder,r=t+e.scrollbarSafetyBuffer,o=r+e.hysteresisSafetyMargin,a=o-r;return{physicalMinWidth:t,collapseThreshold:r,expandThreshold:o,hysteresisWidth:a}}function Oe(e,t,r){return e<=0||!Number.isFinite(e)?!1:t?e>=r.collapseThreshold:e>=r.expandThreshold}var We={info:(e,...t)=>console.info(`[contact-map] ${e}`,...t),warn:(e,...t)=>console.warn(`[contact-map] ${e}`,...t),error:(e,...t)=>console.error(`[contact-map] ${e}`,...t)};var M=require("@aiquants/select-box"),ze=/[​]/g,Ne=/^[\s  ]+|[\s  ]+$/g,we=/\s+/,Le=/^[\p{Script=Latin}\s]+$/u,Ie=/\p{Script=Latin}/u,Z=Object.freeze({convertWidth:!0,convertKana:!0,convertCase:!0,convertRomaji:!1}),Fe=e=>(0,M.normalizeText)(e.replace(ze,"").replace(Ne,""),Z),Ae=e=>{if(!Le.test(e))return null;let t=(0,M.romajiToKatakana)(e);return Ie.test(t)?null:t},Y=e=>e.split(we).filter(Boolean),ee=e=>{let t=Fe(e),r=Ae(t);return r===null?t:r},te=e=>{let t=new Set([...Y(e),...Y(ee(e))]),r=new Set;for(let o of t)for(let a of(0,M.getNormalizedVariants)(o,Z)){let m=a.trim();m&&r.add(m)}return Array.from(r)},$e=/[.*+?^${}()|[\]\\]/g,ne=e=>{let t=te(e);if(t.length===0)return null;let r=t.map(o=>o.replace($e,"\\$&")).sort((o,a)=>a.length-o.length);return new RegExp(r.join("|"),"gi")},Be=(e,t)=>{let r=ne(e);if(r===null)return a=>a;let o=a=>t.some(m=>{let b=a[m];return typeof b=="string"&&b.search(r)!==-1});return a=>{let m=[],b=[];for(let c of a)o(c.item)?m.push(c):b.push(c);return[...m,...b]}};var u=require("zod"),re=u.z.object({person_id:u.z.union([u.z.string(),u.z.number()]).transform(e=>{if(typeof e=="number")return e;let t=e.trim();return parseInt(t,10)}).pipe(u.z.number()),person_id_redirect_to:u.z.union([u.z.string(),u.z.number()]).nullable().optional().transform(e=>{if(e==null)return null;if(typeof e=="number")return e;let t=e.trim();if(t.length===0)return null;let r=parseInt(t,10);return Number.isNaN(r)?null:r}),full_name:u.z.string().nullable().optional(),full_name_reading:u.z.string().nullable().optional(),company_name:u.z.string().nullable().optional(),company_name_reading:u.z.string().nullable().optional(),department:u.z.string().nullable().optional(),title:u.z.string().nullable().optional(),address:u.z.string().nullable().optional(),postal_code:u.z.string().nullable().optional(),email:u.z.string().nullable().optional(),custom_email:u.z.string().nullable().optional(),company_phone_number:u.z.string().nullable().optional(),custom_company_phone_number:u.z.string().nullable().optional(),company_fax_number:u.z.string().nullable().optional(),mobile_phone_number:u.z.string().nullable().optional(),custom_mobile_phone_number:u.z.string().nullable().optional(),url:u.z.string().nullable().optional(),contacted_at:u.z.union([u.z.date(),u.z.string()]).nullable().optional(),contacted_by:u.z.string().nullable().optional(),is_in_eight:u.z.boolean().nullable().optional(),is_contact_synced:u.z.boolean().nullable().optional(),is_active:u.z.boolean(),is_incomplete:u.z.boolean().nullable().optional(),created_at:u.z.union([u.z.date(),u.z.string()]).optional(),created_by:u.z.string().optional(),updated_at:u.z.union([u.z.date(),u.z.string()]).optional(),updated_by:u.z.string().optional()}),Ke=u.z.array(re);0&&(module.exports={DEFAULT_LIST_LAYOUT_SPEC,DEFAULT_TREE_LAYOUT_SPEC,IncrementalTreeBuilder,StandardDepartmentParser,TitleBasedDepartmentParser,assertContactMapTreeNaming,buildDirectoryTree,calculateResponsiveThresholds,createExactMatchRanker,createSearchQueryPattern,defaultLogger,extractContactData,extractDepartmentsFromTitle,formatDate,formatDateTime,getEmailLinkHref,getHysteresisBreakpointState,getPhoneDialHref,getPrimaryEmail,getPrimaryPhone,getSearchQuerySpellings,normalizeLabel,normalizeSearchInput,normalizeString,schemaContactRecord,schemaContactRecords,splitDepartment,toDisplayValue});
package/dist/index.mjs CHANGED
@@ -1 +1 @@
1
- var E=(e,t)=>e&&e.trim()||t;var q={\u672C\u90E8:{rank:10,type:"Organization"},\u30AB\u30F3\u30D1\u30CB\u30FC:{rank:10,type:"Organization"},\u672C\u793E:{rank:10,type:"Location"},\u30D6\u30ED\u30C3\u30AF:{rank:11,type:"Location"},\u652F\u5E97:{rank:12,type:"Location"},\u7814\u7A76\u6240:{rank:15,type:"Location"},\u5DE5\u5834:{rank:15,type:"Location"},\u4E8B\u696D\u90E8:{rank:18,type:"Organization"},\u90E8\u9580:{rank:18,type:"Organization"},\u7D71\u62EC\u90E8:{rank:19,type:"Organization"},\u90E8:{rank:20,type:"Organization"},\u958B\u767A:{rank:20,type:"Organization"},\u30B0\u30EB\u30FC\u30D7:{rank:22,type:"Organization"},\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8:{rank:25,type:"Organization"},\u63A8\u9032:{rank:20,type:"Organization"},\u4E8B\u696D\u6240:{rank:25,type:"Location"},\u55B6\u696D\u6240:{rank:28,type:"Location"},\u5BA4:{rank:30,type:"Organization"},\u8AB2:{rank:30,type:"Organization"},\u30BB\u30F3\u30BF\u30FC:{rank:30,type:"Location"},\u30D3\u30B8\u30CD\u30B9\u30D7\u30ED\u30C7\u30E5\u30FC\u30B9\u30BB\u30F3\u30BF\u30FC:{rank:30,type:"Location"},\u30C1\u30FC\u30E0:{rank:40,type:"Organization"},\u4FC2:{rank:50,type:"Organization"},Department:{rank:20,type:"Organization"},Dept:{rank:20,type:"Organization"},"Dept.":{rank:20,type:"Organization"},Division:{rank:20,type:"Organization"},Div:{rank:20,type:"Organization"},"Div.":{rank:20,type:"Organization"},Section:{rank:30,type:"Organization"},Sect:{rank:30,type:"Organization"},"Sect.":{rank:30,type:"Organization"},Unit:{rank:30,type:"Organization"},Group:{rank:22,type:"Organization"},Team:{rank:40,type:"Organization"},Branch:{rank:12,type:"Location"},Office:{rank:28,type:"Location"},Center:{rank:30,type:"Location"},Centre:{rank:30,type:"Location"},HQ:{rank:10,type:"Organization"},Headquarters:{rank:10,type:"Organization"}},R=e=>{for(let[t,r]of Object.entries(q))if(e.endsWith(t))return r;return{rank:99,type:"Other"}},I=e=>R(e).rank,G=["\u30B0\u30EB\u30FC\u30D7","\u30C1\u30FC\u30E0","Group","Team","\u5BA4","\u8AB2","Unit","Area","\u90E8","Department","Dept","Division","Div","\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8","\u63A8\u9032"],_=e=>G.find(t=>e.endsWith(t)),J=new Set(["&","Quality","Innovation","R&D","Solutions","Development","Laboratory","and","Food","Beverage"]),X=(e,t)=>t>1&&(e.endsWith("\u652F\u5E97")||e.endsWith("\u672C\u90E8")||e.endsWith("\u4E8B\u696D\u6240")||e.endsWith("\u5DE5\u5834")),Y=(e,t)=>{if(!t)return!0;let r=R(e),o=R(t);if(r.rank<o.rank||e.endsWith("\u672C\u90E8")&&t.endsWith("\u672C\u90E8"))return!1;let i=_(e),m=_(t);return!(i&&m&&i!==m)},M=(e,t)=>{if(!e)return[];if(e==="\u517C")return["\u517C"];if(e==="\u517C\u52D9")return["\u517C"];if(e.startsWith("\u517C ")||e.startsWith("\u517C\u3000")){let o=e.slice(1).trim();return["\u517C",...M(o,t)]}if(e.startsWith("\u517C\u52D9 ")||e.startsWith("\u517C\u52D9\u3000")){let o=e.slice(2).trim();return["\u517C",...M(o,t)]}let r="";for(let o=e.length-1;o>0;o--){if(e[o]!==" ")continue;let i=e.slice(0,o);if(!J.has(i)&&t.has(i)){r=i;break}}if(r){let o=r,i=e.slice(r.length),m=/^\s+(and|&)\s+([A-Za-z0-9]+)/i,b=i.match(m);b&&(o=e.slice(0,r.length+b[0].length));let c=e.slice(o.length),n=["Department","Dept","Division","Div","Section","Sect","Unit","Group","Team","Branch","Office","Center","Centre","HQ","Headquarters"];for(let a of n){let y=new RegExp(`^\\s+${a}\\.?(?=$|[\\s,])`,"i"),p=c.match(y);if(p){o=e.slice(0,o.length+p[0].length);break}}let f=e.slice(o.length).trim();return[o,...M(f,t)]}return[e]},Z=(e,t)=>{let o=e.replace(/[\s\u3000]+(?:兼務|兼)[\s\u3000]+/g,"\u3000\u517C\u3000").replace(/^(?:兼務|兼)[\s\u3000]+/,"\u517C\u3000").replace(/[\s\u3000]+(?:兼務|兼)$/,"\u3000\u517C").split(/\u3000/),i=[];for(let m of o){let b=m.trim();b&&i.push(...M(b,t))}return i},v=(e,t)=>{let r=[],o=["\u90E8","\u8AB2","\u5BA4","\u672C\u90E8","\u652F\u5E97","\u55B6\u696D\u6240","\u30B0\u30EB\u30FC\u30D7","\u30C1\u30FC\u30E0","\u30BB\u30F3\u30BF\u30FC","\u30AB\u30F3\u30D1\u30CB\u30FC","\u4E8B\u696D\u6240","\u5DE5\u5834","\u7814\u7A76\u6240","\u4FC2","\u90E8\u9580","\u4E8B\u696D\u90E8","\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8","\u63A8\u9032","\u958B\u767A","Department","Dept","Division","Div","Section","Sect","Unit","Group","Team","Branch","Office","Center","Centre","HQ","Headquarters"],i=e.split(/[\s\u3000,()()[\]]+/).filter(Boolean),m=i.length,b=new Set;for(let c=m;c>=1;c--)for(let n=0;n<=m-c;n++){let f=!1;for(let y=n;y<n+c;y++)if(b.has(y)){f=!0;break}if(f)continue;let a=i.slice(n,n+c).join(" ");if(!(a==="\u517C"||a==="\u517C\u52D9"||a==="\u4FC2"||a==="of"||a==="&"||a==="Quality"||a==="Innovation"||a==="R&D"||a==="Solutions"||a==="Development"||a==="Laboratory"||a==="and"||a==="Food"||a==="Beverage")&&t.allKnownDepartments.has(a)){r.push({name:a,index:n});for(let y=n;y<n+c;y++)b.add(y)}}for(let c=0;c<m;c++){if(b.has(c))continue;let n=i[c];for(n.endsWith("\u9577")&&n.length>1?n=n.slice(0,-1):n.endsWith("\u7D71\u62EC")&&n.length>2&&(n=n.slice(0,-2));;){let p=!1;if(n.startsWith("\u62C5\u5F53")&&n.length>2||n.startsWith("\u5C02\u4EFB")&&n.length>2||n.startsWith("\u517C\u52D9")&&n.length>2?(n=n.slice(2),p=!0):(n.startsWith("\u526F")||n.startsWith("\u517C"))&&n.length>1&&(n=n.slice(1),p=!0),!p)break}if(n.includes("\u30FB")&&!t.allKnownDepartments.has(n)){let p=n.split("\u30FB"),D=p[p.length-1],x=o.find(k=>D.endsWith(k));if(x){for(let k of p){let C=k;o.some(s=>C.endsWith(s))||(C=C+x);let P=n!=="\u517C"&&n!=="\u4FC2"&&n!=="of"&&n!=="&"&&n!=="Quality"&&n!=="Innovation"&&n!=="R&D"&&n!=="Solutions"&&n!=="Development"&&n!=="Laboratory"&&n!=="and"&&n!=="Food"&&n!=="Beverage"&&t.allKnownDepartments.has(C),d=o.some(s=>C.endsWith(s)),l=o.includes(C);(P||d&&!l)&&r.push({name:C,index:c})}continue}}let f=n!=="\u517C"&&n!=="\u4FC2"&&n!=="of"&&n!=="&"&&n!=="Quality"&&n!=="Innovation"&&n!=="R&D"&&n!=="Solutions"&&n!=="Development"&&n!=="Laboratory"&&n!=="and"&&n!=="Food"&&n!=="Beverage"&&t.allKnownDepartments.has(n),a=o.some(p=>n.endsWith(p)),y=o.includes(n);(f||a&&!y)&&r.push({name:n,index:c})}return r.sort((c,n)=>c.index-n.index),r.map(c=>c.name)},F=(e,t)=>{let r=0;for(let o of t)r<e.length&&o===e[r]&&r++;return r===e.length},A={name:"Standard",parse:(e,t,r="full")=>{let o=E(e.department,"");if(!o)return null;let i=Z(o,t.allKnownDepartments),m=new Map;for(let n of i)m.set(n,(m.get(n)||0)+1);let b=n=>{let f=[],a=[];for(let y=0;y<n.length;y++){let p=n[y];if(p==="\u517C"){a.length>0&&(f.push(a),a=[]);continue}let D=R(p),x=D.rank,k=m.get(p)||0,C=X(p,k);if(a.length===0)a.push(p);else{let P=a[a.length-1],d=R(P),l=d.rank;if(a.includes(p))f.push(a),a=[p];else{let s=!1;if(C)s=!0;else if(d.type===D.type){let g=_(P),h=_(p);g&&h&&g!==h||P.endsWith("\u672C\u90E8")&&p.endsWith("\u672C\u90E8")||P.endsWith("\u90E8\u9580")&&p.endsWith("\u4E8B\u696D\u90E8")||P.endsWith("\u4E8B\u696D\u90E8")&&p.endsWith("\u90E8\u9580")||P.endsWith("\u90E8\u9580")&&p.endsWith("\u672C\u90E8")||d.type==="Other"&&D.type==="Other"?s=!0:s=l<x}else s=x>=10,s&&d.type==="Location"&&D.type==="Organization"&&l>=x&&n.slice(y+1).includes(P)&&(s=!1);s?a.push(p):(f.push(a),a=[p])}}if(C){let P=y+1<n.length?n[y+1]:void 0;Y(p,P)&&a.length>0&&(f.push(a),a=[])}}return a.length>0&&f.push(a),f},c=[];if(r==="full"&&c.push(...b(i)),r==="pure_org"){let n=i.filter(f=>R(f).type!=="Location");n.length>0&&c.push(...b(n))}if(e.title){let f=/[^\x20-\x7E]/.test(e.title)?/[\s\u3000]*(?:兼務|兼)[\s\u3000]*/:/[,;]|(?:兼務|兼)/,a=e.title.split(f).filter(Boolean),y=[],p=(d,l)=>{let s=I(d),g=I(l),h=s<g;if(!h){let T=_(d),S=_(l);if(T&&S&&T!==S)h=!0;else if(d.endsWith("\u672C\u90E8")&&l.endsWith("\u672C\u90E8"))h=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u4E8B\u696D\u90E8")||d.endsWith("\u4E8B\u696D\u90E8")&&l.endsWith("\u90E8\u9580"))h=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u672C\u90E8"))h=!0;else{let W=R(d),V=R(l);W.type==="Other"&&V.type==="Other"&&(h=!0)}}return h};for(let d of a){let l=v(d,t);if(l.length===0)continue;let s=[];for(let g of l)if(s.length===0)s.push(g);else{let h=s[s.length-1];if(p(h,g))s.push(g);else{y.push([...s]);let T=!1;for(let S=s.length-2;S>=0;S--){let W=s[S];if(p(W,g)){s=[...s.slice(0,S+1),g],T=!0;break}}T||(s=[g])}}s.length>0&&y.push(s)}let D=[...c],x=d=>a.some(l=>l.includes(d)&&l.length>d.length);for(let d of y){let l=!1;for(let s of c){let g=s.findIndex(h=>d.includes(h));if(g!==-1){let h=s[g],T=d.indexOf(h);if(g>0&&T===0){let S=s.slice(0,g);D.push([...S,...d]),l=!0}else if(T>0&&g===0){let S=d.slice(0,T);D.push([...S,...s]),D.push(d),l=!0}else d.length>s.length-g,l=!0}if(!l){let h=s[s.length-1],T=d[0];p(h,T)&&(D.push([...s,...d]),l=!0)}}l||D.push(d)}let k=[],C=[],P=new Set;for(let d of D){let l=d.join("|");P.has(l)||(P.add(l),C.push(d))}for(let d=0;d<C.length;d++){let l=C[d],s=!1;for(let g=0;g<C.length;g++){if(d===g)continue;let h=C[g];if(h.length>l.length&&h.slice(0,l.length).join("|")===l.join("|")){let T=l[l.length-1];if(!x(T)){s=!0;break}}if(h.length>l.length&&F(l,h)){let T=l[l.length-1];if(!x(T)){s=!0;break}}if(l.length===1&&h.length>0){let T=l[0],S=h[h.length-1];if(T!==S&&S.endsWith(T)){s=!0;break}}}s||k.push(l)}return k.length>0?k:null}if(c.length>0){let n=[];for(let f=0;f<c.length;f++){let a=c[f],y=!1;for(let p=0;p<c.length;p++){if(f===p)continue;let D=c[p];if(D.length>a.length&&F(a,D)){y=!0;break}}y||n.push(a)}return n.length>0?n:null}return null}},$={name:"TitleBased",parse:(e,t,r="full")=>{let o=e.title;if(!o)return null;let i=v(o,t);return i.length>0?[i]:null}};var ee=["uncategorizedCompany","unnamedPerson"],te=e=>{if(typeof e!="object"||e===null)throw new RangeError(`[contact-map] tree naming must be an object; got ${e===null?"null":typeof e}`);for(let t of ee){let r=e[t];if(typeof r!="string"||r.trim()==="")throw new RangeError(`[contact-map] tree naming.${t} must be a non-blank string; got ${typeof r=="string"?JSON.stringify(r):r===null?"null":typeof r}`)}},ne=[A,$],re=(e,t)=>{let r=E(e.full_name,t),o=E(e.title,"");return o.length>0?`${r} (${o})`:r},L=e=>e.sort((t,r)=>t.label.localeCompare(r.label,"ja")),z=(e,t,r)=>{let o=e.get(t);if(o)return o;let i=r();return e.set(t,i),i},N=e=>encodeURIComponent(e.replace(/\//g,"\uFF0F")),B=e=>e.sort((t,r)=>{let o=!!(t.contact.title&&t.contact.title.trim().length>0),i=!!(r.contact.title&&r.contact.title.trim().length>0);return o&&!i?-1:!o&&i?1:t.label.localeCompare(r.label,"ja")}),K=e=>({name:e.label,type:"file",absolutePath:e.path,relativePath:e.segment,personId:e.contact.person_id,title:e.contact.title||void 0,isPrimary:e.isPrimary}),j=e=>{let t=L(Array.from(e.children.values())).map(j),r=B([...e.persons]).map(K);return{name:e.label,type:"directory",absolutePath:e.path,relativePath:e.segment,children:[...r,...t],memberCount:e.personCount}},w=class{constructor(t){this.companyMap=new Map;this.processedPersonIds=new Set;this.allDepts=new Set;this.cachedResult=null;te(t),this.naming=t}appendRecords(t){if(!t||t.length===0)return;let r="full",o=!1;for(let i of t)if(!this.processedPersonIds.has(i.person_id)&&i.department){let m=i.department.split(/\u3000/);for(let b of m){let c=b.trim();if(!c||c==="\u517C"||c==="\u4FC2")continue;if(/[^\x20-\x7E]/.test(c)){let f=c.split(" ").filter(a=>a.length>0&&a!=="\u517C"&&a!=="\u4FC2");for(let a of f)this.allDepts.add(a)}else this.allDepts.add(c)}}for(let i of t){let m=i.person_id;if(!Number.isFinite(m)||this.processedPersonIds.has(m))continue;this.processedPersonIds.add(m),o=!0;let b=E(i.company_name,this.naming.uncategorizedCompany),c=re(i,this.naming.unnamedPerson),n=`company:${N(b)}`,f=z(this.companyMap,n,()=>({label:b,segment:n,path:`/${n}`,departments:new Map,persons:[],personCount:0})),a=[],y={allKnownDepartments:this.allDepts};for(let p of ne){let D=p.parse(i,y,r);if(D&&D.length>0){a=D;break}}a.length===0&&a.push([]);for(let p=0;p<a.length;p++){let D=a[p];if(D.length===0){let l=`person:${m}`,s=`${f.path}/${l}`;f.persons.some(h=>h.contact.person_id===m)||f.persons.push({contact:i,label:c,path:s,segment:l,isPrimary:!0});continue}let x=null,k=f.path;if(D.length>0){let l=D[0],s=`department:${N(l)}`;x=z(f.departments,s,()=>({label:l,segment:s,path:`${k}/${s}`,children:new Map,persons:[],personCount:0})),k=x.path,x.personCount+=1;for(let g=1;g<D.length;g++){let h=D[g],T=`department:${N(h)}`;if(!x)throw new Error("Unexpected null currentDepartmentNode");x=z(x.children,T,()=>({label:h,segment:T,path:`${k}/${T}`,children:new Map,persons:[],personCount:0})),k=x.path,x.personCount+=1}}else continue;let C=`person:${m}`,P=`${x.path}/${C}`;x.persons.some(l=>l.contact.person_id===m)||x.persons.push({contact:i,label:c,path:P,segment:C,isPrimary:p===0})}f.personCount+=1}o&&(this.cachedResult=null)}getSnapshot(){if(this.cachedResult)return this.cachedResult;let t={},r=L(Array.from(this.companyMap.values())).map(o=>{let i=L(Array.from(o.departments.values())).map(j),m=B([...o.persons]).map(K),b={name:o.label,type:"directory",absolutePath:o.path,relativePath:o.segment,children:[...m,...i],memberCount:o.personCount};return t[o.label]=b,b});return this.cachedResult={tree:r,companyMap:t},this.cachedResult}append(t){this.appendRecords(t)}build(){return this.getSnapshot().tree}reset(){this.companyMap.clear(),this.processedPersonIds.clear(),this.allDepts.clear(),this.cachedResult=null}getUniquePersonCount(){return this.processedPersonIds.size}get size(){return this.processedPersonIds.size}},Ce=(e,t)=>{let r=new w(t);return r.appendRecords(e),r.getSnapshot()};var O=e=>{if(typeof e!="string")return null;let t=e.trim();return t.length>0?t:null},Se=e=>!e||typeof e!="object"?null:"item"in e?e.item??null:"person_id"in e?e:null,U=(e,t)=>{if(!e)return{value:null,fieldKey:null};for(let r of t){let o=O(e[r]);if(o)return{value:o,fieldKey:r}}return{value:null,fieldKey:null}},ke=e=>U(e,["custom_email","email"]),Re=e=>U(e,["custom_mobile_phone_number","mobile_phone_number","company_phone_number"]),_e=e=>{let t=O(e);if(!t)return null;let r=t.replace(/[^0-9+#*]/g,"");return r.length===0?null:`tel:${r}`},Ee=(e,t)=>{let r=O(e);return r?t?`https://mail.google.com/mail/?view=cm&fs=1&to=${encodeURIComponent(r)}`:`mailto:${encodeURIComponent(r)}`:null},Me=e=>{if(!e)return"-";let t=typeof e=="string"||typeof e=="number"?new Date(e):e;return!(t instanceof Date)||Number.isNaN(t.getTime())?typeof e=="string"?e:"-":t.toISOString().split("T")[0]},oe=e=>{if(!e)return"-";let t=typeof e=="string"||typeof e=="number"?new Date(e):e;return!(t instanceof Date)||Number.isNaN(t.getTime())?typeof e=="string"?e:"-":t.toISOString()},Oe=e=>e==null?"-":typeof e=="string"?O(e)??"-":typeof e=="number"?Number.isFinite(e)?String(e):"-":e instanceof Date?oe(e):String(e);var ze={listPanelMinWidth:320,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35},Ne={listPanelMinWidth:280,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35};function Le(e){let t=e.listPanelMinWidth+e.detailPanelMinWidth+e.handleThickness+e.listPaddingAndBorder+e.detailPaddingAndBorder,r=t+e.scrollbarSafetyBuffer,o=r+e.hysteresisSafetyMargin,i=o-r;return{physicalMinWidth:t,collapseThreshold:r,expandThreshold:o,hysteresisWidth:i}}function we(e,t,r){return e<=0||!Number.isFinite(e)?!1:t?e>=r.collapseThreshold:e>=r.expandThreshold}var Fe={info:(e,...t)=>console.info(`[contact-map] ${e}`,...t),warn:(e,...t)=>console.warn(`[contact-map] ${e}`,...t),error:(e,...t)=>console.error(`[contact-map] ${e}`,...t)};import{getNormalizedVariants as ae,normalizeText as ie,romajiToKatakana as se}from"@aiquants/select-box";var le=/[​]/g,pe=/^[\s  ]+|[\s  ]+$/g,ce=/\s+/,ue=/^[\p{Script=Latin}\s]+$/u,de=/\p{Script=Latin}/u,Q=Object.freeze({convertWidth:!0,convertKana:!0,convertCase:!0,convertRomaji:!1}),me=e=>ie(e.replace(le,"").replace(pe,""),Q),fe=e=>{if(!ue.test(e))return null;let t=se(e);return de.test(t)?null:t},H=e=>e.split(ce).filter(Boolean),he=e=>{let t=me(e),r=fe(t);return r===null?t:r},ge=e=>{let t=new Set([...H(e),...H(he(e))]),r=new Set;for(let o of t)for(let i of ae(o,Q)){let m=i.trim();m&&r.add(m)}return Array.from(r)},ye=/[.*+?^${}()|[\]\\]/g,be=e=>{let t=ge(e);if(t.length===0)return null;let r=t.map(o=>o.replace(ye,"\\$&")).sort((o,i)=>i.length-o.length);return new RegExp(r.join("|"),"gi")},$e=(e,t)=>{let r=be(e);if(r===null)return i=>i;let o=i=>t.some(m=>{let b=i[m];return typeof b=="string"&&b.search(r)!==-1});return i=>{let m=[],b=[];for(let c of i)o(c.item)?m.push(c):b.push(c);return[...m,...b]}};import{z as u}from"zod";var De=u.object({person_id:u.union([u.string(),u.number()]).transform(e=>{if(typeof e=="number")return e;let t=e.trim();return parseInt(t,10)}).pipe(u.number()),person_id_redirect_to:u.union([u.string(),u.number()]).nullable().optional().transform(e=>{if(e==null)return null;if(typeof e=="number")return e;let t=e.trim();if(t.length===0)return null;let r=parseInt(t,10);return Number.isNaN(r)?null:r}),full_name:u.string().nullable().optional(),full_name_reading:u.string().nullable().optional(),company_name:u.string().nullable().optional(),company_name_reading:u.string().nullable().optional(),department:u.string().nullable().optional(),title:u.string().nullable().optional(),address:u.string().nullable().optional(),postal_code:u.string().nullable().optional(),email:u.string().nullable().optional(),custom_email:u.string().nullable().optional(),company_phone_number:u.string().nullable().optional(),custom_company_phone_number:u.string().nullable().optional(),company_fax_number:u.string().nullable().optional(),mobile_phone_number:u.string().nullable().optional(),custom_mobile_phone_number:u.string().nullable().optional(),url:u.string().nullable().optional(),contacted_at:u.union([u.date(),u.string()]).nullable().optional(),contacted_by:u.string().nullable().optional(),is_in_eight:u.boolean().nullable().optional(),is_contact_synced:u.boolean().nullable().optional(),is_active:u.boolean(),is_incomplete:u.boolean().nullable().optional(),created_at:u.union([u.date(),u.string()]).optional(),created_by:u.string().optional(),updated_at:u.union([u.date(),u.string()]).optional(),updated_by:u.string().optional()}),je=u.array(De);export{ze as DEFAULT_LIST_LAYOUT_SPEC,Ne as DEFAULT_TREE_LAYOUT_SPEC,w as IncrementalTreeBuilder,A as StandardDepartmentParser,$ as TitleBasedDepartmentParser,te as assertContactMapTreeNaming,Ce as buildDirectoryTree,Le as calculateResponsiveThresholds,$e as createExactMatchRanker,be as createSearchQueryPattern,Fe as defaultLogger,Se as extractContactData,v as extractDepartmentsFromTitle,Me as formatDate,oe as formatDateTime,Ee as getEmailLinkHref,we as getHysteresisBreakpointState,_e as getPhoneDialHref,ke as getPrimaryEmail,Re as getPrimaryPhone,ge as getSearchQuerySpellings,E as normalizeLabel,he as normalizeSearchInput,O as normalizeString,De as schemaContactRecord,je as schemaContactRecords,Z as splitDepartment,Oe as toDisplayValue};
1
+ var E=(e,t)=>e&&e.trim()||t;var J={\u672C\u90E8:{rank:10,type:"Organization"},\u30AB\u30F3\u30D1\u30CB\u30FC:{rank:10,type:"Organization"},\u672C\u793E:{rank:10,type:"Location"},\u30D6\u30ED\u30C3\u30AF:{rank:11,type:"Location"},\u652F\u5E97:{rank:12,type:"Location"},\u7814\u7A76\u6240:{rank:15,type:"Location"},\u5DE5\u5834:{rank:15,type:"Location"},\u4E8B\u696D\u90E8:{rank:18,type:"Organization"},\u90E8\u9580:{rank:18,type:"Organization"},\u7D71\u62EC\u90E8:{rank:19,type:"Organization"},\u90E8:{rank:20,type:"Organization"},\u958B\u767A:{rank:20,type:"Organization"},\u30B0\u30EB\u30FC\u30D7:{rank:22,type:"Organization"},\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8:{rank:25,type:"Organization"},\u63A8\u9032:{rank:20,type:"Organization"},\u4E8B\u696D\u6240:{rank:25,type:"Location"},\u55B6\u696D\u6240:{rank:28,type:"Location"},\u5BA4:{rank:30,type:"Organization"},\u8AB2:{rank:30,type:"Organization"},\u30BB\u30F3\u30BF\u30FC:{rank:30,type:"Location"},\u30D3\u30B8\u30CD\u30B9\u30D7\u30ED\u30C7\u30E5\u30FC\u30B9\u30BB\u30F3\u30BF\u30FC:{rank:30,type:"Location"},\u30C1\u30FC\u30E0:{rank:40,type:"Organization"},\u4FC2:{rank:50,type:"Organization"},Department:{rank:20,type:"Organization"},Dept:{rank:20,type:"Organization"},"Dept.":{rank:20,type:"Organization"},Division:{rank:20,type:"Organization"},Div:{rank:20,type:"Organization"},"Div.":{rank:20,type:"Organization"},Section:{rank:30,type:"Organization"},Sect:{rank:30,type:"Organization"},"Sect.":{rank:30,type:"Organization"},Unit:{rank:30,type:"Organization"},Group:{rank:22,type:"Organization"},Team:{rank:40,type:"Organization"},Branch:{rank:12,type:"Location"},Office:{rank:28,type:"Location"},Center:{rank:30,type:"Location"},Centre:{rank:30,type:"Location"},HQ:{rank:10,type:"Organization"},Headquarters:{rank:10,type:"Organization"}},R=e=>{for(let[t,r]of Object.entries(J))if(e.endsWith(t))return r;return{rank:99,type:"Other"}},F=e=>R(e).rank,X=["\u30B0\u30EB\u30FC\u30D7","\u30C1\u30FC\u30E0","Group","Team","\u5BA4","\u8AB2","Unit","Area","\u90E8","Department","Dept","Division","Div","\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8","\u63A8\u9032"],_=e=>X.find(t=>e.endsWith(t)),Y=new Set(["&","Quality","Innovation","R&D","Solutions","Development","Laboratory","and","Food","Beverage"]),Z=(e,t)=>t>1&&(e.endsWith("\u652F\u5E97")||e.endsWith("\u672C\u90E8")||e.endsWith("\u4E8B\u696D\u6240")||e.endsWith("\u5DE5\u5834")),ee=(e,t)=>{if(!t)return!0;let r=R(e),o=R(t);if(r.rank<o.rank||e.endsWith("\u672C\u90E8")&&t.endsWith("\u672C\u90E8"))return!1;let i=_(e),m=_(t);return!(i&&m&&i!==m)},M=(e,t)=>{if(!e)return[];if(e==="\u517C")return["\u517C"];if(e==="\u517C\u52D9")return["\u517C"];if(e.startsWith("\u517C ")||e.startsWith("\u517C\u3000")){let o=e.slice(1).trim();return["\u517C",...M(o,t)]}if(e.startsWith("\u517C\u52D9 ")||e.startsWith("\u517C\u52D9\u3000")){let o=e.slice(2).trim();return["\u517C",...M(o,t)]}let r="";for(let o=e.length-1;o>0;o--){if(e[o]!==" ")continue;let i=e.slice(0,o);if(!Y.has(i)&&t.has(i)){r=i;break}}if(r){let o=r,i=e.slice(r.length),m=/^\s+(and|&)\s+([A-Za-z0-9]+)/i,b=i.match(m);b&&(o=e.slice(0,r.length+b[0].length));let c=e.slice(o.length),n=["Department","Dept","Division","Div","Section","Sect","Unit","Group","Team","Branch","Office","Center","Centre","HQ","Headquarters"];for(let a of n){let y=new RegExp(`^\\s+${a}\\.?(?=$|[\\s,])`,"i"),p=c.match(y);if(p){o=e.slice(0,o.length+p[0].length);break}}let f=e.slice(o.length).trim();return[o,...M(f,t)]}return[e]},te=(e,t)=>{let o=e.replace(/[\s\u3000]+(?:兼務|兼)[\s\u3000]+/g,"\u3000\u517C\u3000").replace(/^(?:兼務|兼)[\s\u3000]+/,"\u517C\u3000").replace(/[\s\u3000]+(?:兼務|兼)$/,"\u3000\u517C").split(/\u3000/),i=[];for(let m of o){let b=m.trim();b&&i.push(...M(b,t))}return i},$=(e,t)=>{let r=[],o=["\u90E8","\u8AB2","\u5BA4","\u672C\u90E8","\u652F\u5E97","\u55B6\u696D\u6240","\u30B0\u30EB\u30FC\u30D7","\u30C1\u30FC\u30E0","\u30BB\u30F3\u30BF\u30FC","\u30AB\u30F3\u30D1\u30CB\u30FC","\u4E8B\u696D\u6240","\u5DE5\u5834","\u7814\u7A76\u6240","\u4FC2","\u90E8\u9580","\u4E8B\u696D\u90E8","\u30D7\u30ED\u30B8\u30A7\u30AF\u30C8","\u63A8\u9032","\u958B\u767A","Department","Dept","Division","Div","Section","Sect","Unit","Group","Team","Branch","Office","Center","Centre","HQ","Headquarters"],i=e.split(/[\s\u3000,()()[\]]+/).filter(Boolean),m=i.length,b=new Set;for(let c=m;c>=1;c--)for(let n=0;n<=m-c;n++){let f=!1;for(let y=n;y<n+c;y++)if(b.has(y)){f=!0;break}if(f)continue;let a=i.slice(n,n+c).join(" ");if(!(a==="\u517C"||a==="\u517C\u52D9"||a==="\u4FC2"||a==="of"||a==="&"||a==="Quality"||a==="Innovation"||a==="R&D"||a==="Solutions"||a==="Development"||a==="Laboratory"||a==="and"||a==="Food"||a==="Beverage")&&t.allKnownDepartments.has(a)){r.push({name:a,index:n});for(let y=n;y<n+c;y++)b.add(y)}}for(let c=0;c<m;c++){if(b.has(c))continue;let n=i[c];for(n.endsWith("\u9577")&&n.length>1?n=n.slice(0,-1):n.endsWith("\u7D71\u62EC")&&n.length>2&&(n=n.slice(0,-2));;){let p=!1;if(n.startsWith("\u62C5\u5F53")&&n.length>2||n.startsWith("\u5C02\u4EFB")&&n.length>2||n.startsWith("\u517C\u52D9")&&n.length>2?(n=n.slice(2),p=!0):(n.startsWith("\u526F")||n.startsWith("\u517C"))&&n.length>1&&(n=n.slice(1),p=!0),!p)break}if(n.includes("\u30FB")&&!t.allKnownDepartments.has(n)){let p=n.split("\u30FB"),D=p[p.length-1],x=o.find(k=>D.endsWith(k));if(x){for(let k of p){let C=k;o.some(s=>C.endsWith(s))||(C=C+x);let P=n!=="\u517C"&&n!=="\u4FC2"&&n!=="of"&&n!=="&"&&n!=="Quality"&&n!=="Innovation"&&n!=="R&D"&&n!=="Solutions"&&n!=="Development"&&n!=="Laboratory"&&n!=="and"&&n!=="Food"&&n!=="Beverage"&&t.allKnownDepartments.has(C),d=o.some(s=>C.endsWith(s)),l=o.includes(C);(P||d&&!l)&&r.push({name:C,index:c})}continue}}let f=n!=="\u517C"&&n!=="\u4FC2"&&n!=="of"&&n!=="&"&&n!=="Quality"&&n!=="Innovation"&&n!=="R&D"&&n!=="Solutions"&&n!=="Development"&&n!=="Laboratory"&&n!=="and"&&n!=="Food"&&n!=="Beverage"&&t.allKnownDepartments.has(n),a=o.some(p=>n.endsWith(p)),y=o.includes(n);(f||a&&!y)&&r.push({name:n,index:c})}return r.sort((c,n)=>c.index-n.index),r.map(c=>c.name)},A=(e,t)=>{let r=0;for(let o of t)r<e.length&&o===e[r]&&r++;return r===e.length},B={name:"Standard",parse:(e,t,r="full")=>{let o=E(e.department,"");if(!o)return null;let i=te(o,t.allKnownDepartments),m=new Map;for(let n of i)m.set(n,(m.get(n)||0)+1);let b=n=>{let f=[],a=[];for(let y=0;y<n.length;y++){let p=n[y];if(p==="\u517C"){a.length>0&&(f.push(a),a=[]);continue}let D=R(p),x=D.rank,k=m.get(p)||0,C=Z(p,k);if(a.length===0)a.push(p);else{let P=a[a.length-1],d=R(P),l=d.rank;if(a.includes(p))f.push(a),a=[p];else{let s=!1;if(C)s=!0;else if(d.type===D.type){let g=_(P),h=_(p);g&&h&&g!==h||P.endsWith("\u672C\u90E8")&&p.endsWith("\u672C\u90E8")||P.endsWith("\u90E8\u9580")&&p.endsWith("\u4E8B\u696D\u90E8")||P.endsWith("\u4E8B\u696D\u90E8")&&p.endsWith("\u90E8\u9580")||P.endsWith("\u90E8\u9580")&&p.endsWith("\u672C\u90E8")||d.type==="Other"&&D.type==="Other"?s=!0:s=l<x}else s=x>=10,s&&d.type==="Location"&&D.type==="Organization"&&l>=x&&n.slice(y+1).includes(P)&&(s=!1);s?a.push(p):(f.push(a),a=[p])}}if(C){let P=y+1<n.length?n[y+1]:void 0;ee(p,P)&&a.length>0&&(f.push(a),a=[])}}return a.length>0&&f.push(a),f},c=[];if(r==="full"&&c.push(...b(i)),r==="pure_org"){let n=i.filter(f=>R(f).type!=="Location");n.length>0&&c.push(...b(n))}if(e.title){let f=/[^\x20-\x7E]/.test(e.title)?/[\s\u3000]*(?:兼務|兼)[\s\u3000]*/:/[,;]|(?:兼務|兼)/,a=e.title.split(f).filter(Boolean),y=[],p=(d,l)=>{let s=F(d),g=F(l),h=s<g;if(!h){let T=_(d),S=_(l);if(T&&S&&T!==S)h=!0;else if(d.endsWith("\u672C\u90E8")&&l.endsWith("\u672C\u90E8"))h=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u4E8B\u696D\u90E8")||d.endsWith("\u4E8B\u696D\u90E8")&&l.endsWith("\u90E8\u9580"))h=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u672C\u90E8"))h=!0;else{let z=R(d),G=R(l);z.type==="Other"&&G.type==="Other"&&(h=!0)}}return h};for(let d of a){let l=$(d,t);if(l.length===0)continue;let s=[];for(let g of l)if(s.length===0)s.push(g);else{let h=s[s.length-1];if(p(h,g))s.push(g);else{y.push([...s]);let T=!1;for(let S=s.length-2;S>=0;S--){let z=s[S];if(p(z,g)){s=[...s.slice(0,S+1),g],T=!0;break}}T||(s=[g])}}s.length>0&&y.push(s)}let D=[...c],x=d=>a.some(l=>l.includes(d)&&l.length>d.length);for(let d of y){let l=!1;for(let s of c){let g=s.findIndex(h=>d.includes(h));if(g!==-1){let h=s[g],T=d.indexOf(h);if(g>0&&T===0){let S=s.slice(0,g);D.push([...S,...d]),l=!0}else if(T>0&&g===0){let S=d.slice(0,T);D.push([...S,...s]),D.push(d),l=!0}else d.length>s.length-g,l=!0}if(!l){let h=s[s.length-1],T=d[0];p(h,T)&&(D.push([...s,...d]),l=!0)}}l||D.push(d)}let k=[],C=[],P=new Set;for(let d of D){let l=d.join("|");P.has(l)||(P.add(l),C.push(d))}for(let d=0;d<C.length;d++){let l=C[d],s=!1;for(let g=0;g<C.length;g++){if(d===g)continue;let h=C[g];if(h.length>l.length&&h.slice(0,l.length).join("|")===l.join("|")){let T=l[l.length-1];if(!x(T)){s=!0;break}}if(h.length>l.length&&A(l,h)){let T=l[l.length-1];if(!x(T)){s=!0;break}}if(l.length===1&&h.length>0){let T=l[0],S=h[h.length-1];if(T!==S&&S.endsWith(T)){s=!0;break}}}s||k.push(l)}return k.length>0?k:null}if(c.length>0){let n=[];for(let f=0;f<c.length;f++){let a=c[f],y=!1;for(let p=0;p<c.length;p++){if(f===p)continue;let D=c[p];if(D.length>a.length&&A(a,D)){y=!0;break}}y||n.push(a)}return n.length>0?n:null}return null}},K={name:"TitleBased",parse:(e,t,r="full")=>{let o=e.title;if(!o)return null;let i=$(o,t);return i.length>0?[i]:null}};var O=e=>{switch(typeof e){case"string":return JSON.stringify(e);case"bigint":return`${e}n`;case"symbol":return e.toString();case"object":return e===null?"null":j(e);case"function":return j(e);case"number":return Object.is(e,-0)?"-0":String(e);default:return String(e)}},j=e=>{try{return Object.prototype.toString.call(e)}catch{return"[object ?]"}};var ne=["uncategorizedCompany","unnamedPerson"],re=e=>{if(typeof e!="object"||e===null)throw new TypeError(`[contact-map] tree naming must be an object; got ${O(e)}`);for(let t of ne){let r=e[t];if(typeof r!="string")throw new TypeError(`[contact-map] tree naming.${t} must be a string; got ${O(r)}`);if(r.trim()==="")throw new RangeError(`[contact-map] tree naming.${t} must not be empty or blank; got ${O(r)}`)}},oe=[B,K],ae=(e,t)=>{let r=E(e.full_name,t),o=E(e.title,"");return o.length>0?`${r} (${o})`:r},L=e=>e.sort((t,r)=>t.label.localeCompare(r.label,"ja")),N=(e,t,r)=>{let o=e.get(t);if(o)return o;let i=r();return e.set(t,i),i},w=e=>encodeURIComponent(e.replace(/\//g,"\uFF0F")),v=e=>e.sort((t,r)=>{let o=!!(t.contact.title&&t.contact.title.trim().length>0),i=!!(r.contact.title&&r.contact.title.trim().length>0);return o&&!i?-1:!o&&i?1:t.label.localeCompare(r.label,"ja")}),U=e=>({name:e.label,type:"file",absolutePath:e.path,relativePath:e.segment,personId:e.contact.person_id,title:e.contact.title||void 0,isPrimary:e.isPrimary}),H=e=>{let t=L(Array.from(e.children.values())).map(H),r=v([...e.persons]).map(U);return{name:e.label,type:"directory",absolutePath:e.path,relativePath:e.segment,children:[...r,...t],memberCount:e.personCount}},I=class{constructor(t){this.companyMap=new Map;this.processedPersonIds=new Set;this.allDepts=new Set;this.cachedResult=null;re(t),this.naming=t}appendRecords(t){if(!t||t.length===0)return;let r="full",o=!1;for(let i of t)if(!this.processedPersonIds.has(i.person_id)&&i.department){let m=i.department.split(/\u3000/);for(let b of m){let c=b.trim();if(!c||c==="\u517C"||c==="\u4FC2")continue;if(/[^\x20-\x7E]/.test(c)){let f=c.split(" ").filter(a=>a.length>0&&a!=="\u517C"&&a!=="\u4FC2");for(let a of f)this.allDepts.add(a)}else this.allDepts.add(c)}}for(let i of t){let m=i.person_id;if(!Number.isFinite(m)||this.processedPersonIds.has(m))continue;this.processedPersonIds.add(m),o=!0;let b=E(i.company_name,this.naming.uncategorizedCompany),c=ae(i,this.naming.unnamedPerson),n=`company:${w(b)}`,f=N(this.companyMap,n,()=>({label:b,segment:n,path:`/${n}`,departments:new Map,persons:[],personCount:0})),a=[],y={allKnownDepartments:this.allDepts};for(let p of oe){let D=p.parse(i,y,r);if(D&&D.length>0){a=D;break}}a.length===0&&a.push([]);for(let p=0;p<a.length;p++){let D=a[p];if(D.length===0){let l=`person:${m}`,s=`${f.path}/${l}`;f.persons.some(h=>h.contact.person_id===m)||f.persons.push({contact:i,label:c,path:s,segment:l,isPrimary:!0});continue}let x=null,k=f.path;if(D.length>0){let l=D[0],s=`department:${w(l)}`;x=N(f.departments,s,()=>({label:l,segment:s,path:`${k}/${s}`,children:new Map,persons:[],personCount:0})),k=x.path,x.personCount+=1;for(let g=1;g<D.length;g++){let h=D[g],T=`department:${w(h)}`;if(!x)throw new Error("[contact-map] unexpected null currentDepartmentNode");x=N(x.children,T,()=>({label:h,segment:T,path:`${k}/${T}`,children:new Map,persons:[],personCount:0})),k=x.path,x.personCount+=1}}else continue;let C=`person:${m}`,P=`${x.path}/${C}`;x.persons.some(l=>l.contact.person_id===m)||x.persons.push({contact:i,label:c,path:P,segment:C,isPrimary:p===0})}f.personCount+=1}o&&(this.cachedResult=null)}getSnapshot(){if(this.cachedResult)return this.cachedResult;let t={},r=L(Array.from(this.companyMap.values())).map(o=>{let i=L(Array.from(o.departments.values())).map(H),m=v([...o.persons]).map(U),b={name:o.label,type:"directory",absolutePath:o.path,relativePath:o.segment,children:[...m,...i],memberCount:o.personCount};return t[o.label]=b,b});return this.cachedResult={tree:r,companyMap:t},this.cachedResult}append(t){this.appendRecords(t)}build(){return this.getSnapshot().tree}reset(){this.companyMap.clear(),this.processedPersonIds.clear(),this.allDepts.clear(),this.cachedResult=null}getUniquePersonCount(){return this.processedPersonIds.size}get size(){return this.processedPersonIds.size}},Re=(e,t)=>{let r=new I(t);return r.appendRecords(e),r.getSnapshot()};var W=e=>{if(typeof e!="string")return null;let t=e.trim();return t.length>0?t:null},Ee=e=>!e||typeof e!="object"?null:"item"in e?e.item??null:"person_id"in e?e:null,Q=(e,t)=>{if(!e)return{value:null,fieldKey:null};for(let r of t){let o=W(e[r]);if(o)return{value:o,fieldKey:r}}return{value:null,fieldKey:null}},Me=e=>Q(e,["custom_email","email"]),Oe=e=>Q(e,["custom_mobile_phone_number","mobile_phone_number","company_phone_number"]),We=e=>{let t=W(e);if(!t)return null;let r=t.replace(/[^0-9+#*]/g,"");return r.length===0?null:`tel:${r}`},ze=(e,t)=>{let r=W(e);return r?t?`https://mail.google.com/mail/?view=cm&fs=1&to=${encodeURIComponent(r)}`:`mailto:${encodeURIComponent(r)}`:null},Ne=e=>{if(!e)return"-";let t=typeof e=="string"||typeof e=="number"?new Date(e):e;return!(t instanceof Date)||Number.isNaN(t.getTime())?typeof e=="string"?e:"-":t.toISOString().split("T")[0]},ie=e=>{if(!e)return"-";let t=typeof e=="string"||typeof e=="number"?new Date(e):e;return!(t instanceof Date)||Number.isNaN(t.getTime())?typeof e=="string"?e:"-":t.toISOString()},we=e=>e==null?"-":typeof e=="string"?W(e)??"-":typeof e=="number"?Number.isFinite(e)?String(e):"-":e instanceof Date?ie(e):String(e);var Ie={listPanelMinWidth:320,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35},Fe={listPanelMinWidth:280,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35};function Ae(e){let t=e.listPanelMinWidth+e.detailPanelMinWidth+e.handleThickness+e.listPaddingAndBorder+e.detailPaddingAndBorder,r=t+e.scrollbarSafetyBuffer,o=r+e.hysteresisSafetyMargin,i=o-r;return{physicalMinWidth:t,collapseThreshold:r,expandThreshold:o,hysteresisWidth:i}}function $e(e,t,r){return e<=0||!Number.isFinite(e)?!1:t?e>=r.collapseThreshold:e>=r.expandThreshold}var Ke={info:(e,...t)=>console.info(`[contact-map] ${e}`,...t),warn:(e,...t)=>console.warn(`[contact-map] ${e}`,...t),error:(e,...t)=>console.error(`[contact-map] ${e}`,...t)};import{getNormalizedVariants as se,normalizeText as le,romajiToKatakana as pe}from"@aiquants/select-box";var ce=/[​]/g,ue=/^[\s  ]+|[\s  ]+$/g,de=/\s+/,me=/^[\p{Script=Latin}\s]+$/u,fe=/\p{Script=Latin}/u,q=Object.freeze({convertWidth:!0,convertKana:!0,convertCase:!0,convertRomaji:!1}),he=e=>le(e.replace(ce,"").replace(ue,""),q),ge=e=>{if(!me.test(e))return null;let t=pe(e);return fe.test(t)?null:t},V=e=>e.split(de).filter(Boolean),ye=e=>{let t=he(e),r=ge(t);return r===null?t:r},be=e=>{let t=new Set([...V(e),...V(ye(e))]),r=new Set;for(let o of t)for(let i of se(o,q)){let m=i.trim();m&&r.add(m)}return Array.from(r)},De=/[.*+?^${}()|[\]\\]/g,Te=e=>{let t=be(e);if(t.length===0)return null;let r=t.map(o=>o.replace(De,"\\$&")).sort((o,i)=>i.length-o.length);return new RegExp(r.join("|"),"gi")},Ue=(e,t)=>{let r=Te(e);if(r===null)return i=>i;let o=i=>t.some(m=>{let b=i[m];return typeof b=="string"&&b.search(r)!==-1});return i=>{let m=[],b=[];for(let c of i)o(c.item)?m.push(c):b.push(c);return[...m,...b]}};import{z as u}from"zod";var xe=u.object({person_id:u.union([u.string(),u.number()]).transform(e=>{if(typeof e=="number")return e;let t=e.trim();return parseInt(t,10)}).pipe(u.number()),person_id_redirect_to:u.union([u.string(),u.number()]).nullable().optional().transform(e=>{if(e==null)return null;if(typeof e=="number")return e;let t=e.trim();if(t.length===0)return null;let r=parseInt(t,10);return Number.isNaN(r)?null:r}),full_name:u.string().nullable().optional(),full_name_reading:u.string().nullable().optional(),company_name:u.string().nullable().optional(),company_name_reading:u.string().nullable().optional(),department:u.string().nullable().optional(),title:u.string().nullable().optional(),address:u.string().nullable().optional(),postal_code:u.string().nullable().optional(),email:u.string().nullable().optional(),custom_email:u.string().nullable().optional(),company_phone_number:u.string().nullable().optional(),custom_company_phone_number:u.string().nullable().optional(),company_fax_number:u.string().nullable().optional(),mobile_phone_number:u.string().nullable().optional(),custom_mobile_phone_number:u.string().nullable().optional(),url:u.string().nullable().optional(),contacted_at:u.union([u.date(),u.string()]).nullable().optional(),contacted_by:u.string().nullable().optional(),is_in_eight:u.boolean().nullable().optional(),is_contact_synced:u.boolean().nullable().optional(),is_active:u.boolean(),is_incomplete:u.boolean().nullable().optional(),created_at:u.union([u.date(),u.string()]).optional(),created_by:u.string().optional(),updated_at:u.union([u.date(),u.string()]).optional(),updated_by:u.string().optional()}),Ve=u.array(xe);export{Ie as DEFAULT_LIST_LAYOUT_SPEC,Fe as DEFAULT_TREE_LAYOUT_SPEC,I as IncrementalTreeBuilder,B as StandardDepartmentParser,K as TitleBasedDepartmentParser,re as assertContactMapTreeNaming,Re as buildDirectoryTree,Ae as calculateResponsiveThresholds,Ue as createExactMatchRanker,Te as createSearchQueryPattern,Ke as defaultLogger,Ee as extractContactData,$ as extractDepartmentsFromTitle,Ne as formatDate,ie as formatDateTime,ze as getEmailLinkHref,$e as getHysteresisBreakpointState,We as getPhoneDialHref,Me as getPrimaryEmail,Oe as getPrimaryPhone,be as getSearchQuerySpellings,E as normalizeLabel,ye as normalizeSearchInput,W as normalizeString,xe as schemaContactRecord,Ve as schemaContactRecords,te as splitDepartment,we as toDisplayValue};
package/dist/server.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- import { d as ContactMapLogger, C as ContactRecord, h as StreamCursor } from "./wire-CFgYO13H.mjs";
1
+ import { d as ContactMapLogger, C as ContactRecord, h as StreamCursor } from "./wire-hAxBVVH6.mjs";
2
2
  import { AnyMsSqlColumn, mssqlSchema } from "drizzle-orm/mssql-core";
3
3
  interface ContactRecordTable {
4
4
  person_id: AnyMsSqlColumn;
@@ -53,9 +53,9 @@ interface QueryOptions {
53
53
  }
54
54
  interface ContactMapServerConfig {
55
55
  db: any;
56
- table?: any;
57
- ensureConnection?: () => Promise<void>;
58
- authenticate?: ContactMapAuthenticate;
56
+ table: any;
57
+ ensureConnection: () => Promise<void>;
58
+ authenticate: ContactMapAuthenticate;
59
59
  logger?: ContactMapLogger;
60
60
  firstBatchSize?: number;
61
61
  nextBatchSize?: number;
@@ -63,13 +63,13 @@ interface ContactMapServerConfig {
63
63
  }
64
64
  type ContactMapServerPorts = ContactMapServerConfig;
65
65
  declare const DEFAULT_STREAM_CHUNK_SIZE = 200;
66
- declare function countActiveContactsQuery(db: any, table: any, ensureConnection?: () => Promise<void>, options?: QueryOptions): Promise<number>;
66
+ declare function countActiveContactsQuery(db: any, table: any, ensureConnection: () => Promise<void>, options?: QueryOptions): Promise<number>;
67
67
  type StreamChunkResult = {
68
68
  records: ContactRecord[];
69
69
  nextCursor: StreamCursor | null;
70
70
  isLast: boolean;
71
71
  };
72
- declare function getContactsStreamChunkQuery(db: any, table: any, cursor?: StreamCursor | null, limit?: number, ensureConnection?: () => Promise<void>, options?: QueryOptions): Promise<StreamChunkResult>;
72
+ declare function getContactsStreamChunkQuery(db: any, table: any, cursor: StreamCursor | null, limit: number, ensureConnection: () => Promise<void>, options?: QueryOptions): Promise<StreamChunkResult>;
73
73
  declare const DEFAULT_STREAM_ERROR_CLIENT_MESSAGE = "stream interrupted by server error";
74
74
  declare function createContactMapStreamHandler(config: ContactMapServerConfig): (args: Request | {
75
75
  request: Request;
package/dist/server.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- import { d as ContactMapLogger, C as ContactRecord, h as StreamCursor } from "./wire-CFgYO13H.js";
1
+ import { d as ContactMapLogger, C as ContactRecord, h as StreamCursor } from "./wire-hAxBVVH6.js";
2
2
  import { AnyMsSqlColumn, mssqlSchema } from "drizzle-orm/mssql-core";
3
3
  interface ContactRecordTable {
4
4
  person_id: AnyMsSqlColumn;
@@ -53,9 +53,9 @@ interface QueryOptions {
53
53
  }
54
54
  interface ContactMapServerConfig {
55
55
  db: any;
56
- table?: any;
57
- ensureConnection?: () => Promise<void>;
58
- authenticate?: ContactMapAuthenticate;
56
+ table: any;
57
+ ensureConnection: () => Promise<void>;
58
+ authenticate: ContactMapAuthenticate;
59
59
  logger?: ContactMapLogger;
60
60
  firstBatchSize?: number;
61
61
  nextBatchSize?: number;
@@ -63,13 +63,13 @@ interface ContactMapServerConfig {
63
63
  }
64
64
  type ContactMapServerPorts = ContactMapServerConfig;
65
65
  declare const DEFAULT_STREAM_CHUNK_SIZE = 200;
66
- declare function countActiveContactsQuery(db: any, table: any, ensureConnection?: () => Promise<void>, options?: QueryOptions): Promise<number>;
66
+ declare function countActiveContactsQuery(db: any, table: any, ensureConnection: () => Promise<void>, options?: QueryOptions): Promise<number>;
67
67
  type StreamChunkResult = {
68
68
  records: ContactRecord[];
69
69
  nextCursor: StreamCursor | null;
70
70
  isLast: boolean;
71
71
  };
72
- declare function getContactsStreamChunkQuery(db: any, table: any, cursor?: StreamCursor | null, limit?: number, ensureConnection?: () => Promise<void>, options?: QueryOptions): Promise<StreamChunkResult>;
72
+ declare function getContactsStreamChunkQuery(db: any, table: any, cursor: StreamCursor | null, limit: number, ensureConnection: () => Promise<void>, options?: QueryOptions): Promise<StreamChunkResult>;
73
73
  declare const DEFAULT_STREAM_ERROR_CLIENT_MESSAGE = "stream interrupted by server error";
74
74
  declare function createContactMapStreamHandler(config: ContactMapServerConfig): (args: Request | {
75
75
  request: Request;
package/dist/server.js CHANGED
@@ -1,4 +1,4 @@
1
- "use strict";var T=Object.defineProperty;var q=Object.getOwnPropertyDescriptor;var I=Object.getOwnPropertyNames;var D=Object.prototype.hasOwnProperty;var U=(r,e)=>{for(var o in e)T(r,o,{get:e[o],enumerable:!0})},$=(r,e,o,a)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of I(e))!D.call(r,s)&&s!==o&&T(r,s,{get:()=>e[s],enumerable:!(a=q(e,s))||a.enumerable});return r};var Q=r=>$(T({},"__esModule",{value:!0}),r);var Z={};U(Z,{DEFAULT_STREAM_CHUNK_SIZE:()=>v,DEFAULT_STREAM_ERROR_CLIENT_MESSAGE:()=>M,countActiveContactsQuery:()=>S,createContactMapServer:()=>z,createContactMapStreamHandler:()=>L,defineContactMapTable:()=>H,getContactsStreamChunkQuery:()=>w});module.exports=Q(Z);var E={info:(r,...e)=>console.info(`[contact-map] ${r}`,...e),warn:(r,...e)=>console.warn(`[contact-map] ${r}`,...e),error:(r,...e)=>console.error(`[contact-map] ${r}`,...e)};var n=require("drizzle-orm"),v=200;async function S(r,e,o,a){if(a?.signal?.aborted)throw new DOMException("The operation was aborted","AbortError");if(o&&await o(),a?.signal?.aborted)throw new DOMException("The operation was aborted","AbortError");return(await r.select({count:n.sql`count(*)`}).from(e).where((0,n.eq)(e.is_active,!0)))[0]?.count??0}async function w(r,e,o=null,a=v,s,u){if(u?.signal?.aborted)throw new DOMException("The operation was aborted","AbortError");if(s&&await s(),u?.signal?.aborted)throw new DOMException("The operation was aborted","AbortError");let p=(0,n.eq)(e.is_active,!0),h=p;if(o){let{contacted_at:y,person_id:g}=o;if(y!==null){let d=n.sql`CAST(${y.slice(0,23)} AS datetime2(3))`,b=(0,n.and)(p,(0,n.or)((0,n.lt)(e.contacted_at,d),(0,n.and)((0,n.eq)(e.contacted_at,d),(0,n.lt)(e.person_id,g)),(0,n.isNull)(e.contacted_at)));b&&(h=b)}else{let d=(0,n.and)(p,(0,n.isNull)(e.contacted_at),(0,n.lt)(e.person_id,g));d&&(h=d)}}let _=await r.select().from(e).where(h).orderBy((0,n.desc)(e.contacted_at),(0,n.desc)(e.person_id)).offset(0).fetch(a);if(u?.signal?.aborted)throw new DOMException("The operation was aborted","AbortError");let l=_.length>0?_[_.length-1]:null,f=l?{contacted_at:l.contacted_at?new Date(l.contacted_at).toISOString():null,person_id:l.person_id}:null,C=_.length<a;return{records:_,nextCursor:f,isLast:C}}var F=100,W=300,M="stream interrupted by server error",B=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;function j(r){let e=r.get("cursor_person_id"),o=r.get("cursor_contacted_at");if(e===null)return o!==null?{ok:!1,message:"cursor_contacted_at requires cursor_person_id"}:{ok:!0,cursor:null};let a=Number.parseInt(e,10);return Number.isSafeInteger(a)?o===null?{ok:!0,cursor:{contacted_at:null,person_id:a}}:B.test(o)?{ok:!0,cursor:{contacted_at:o,person_id:a}}:{ok:!1,message:`Invalid cursor_contacted_at: ${o}`}:{ok:!1,message:`Invalid cursor_person_id: ${e}`}}function L(r){let{db:e,table:o,ensureConnection:a,authenticate:s,logger:u=E,firstBatchSize:p=F,nextBatchSize:h=W,streamErrorClientMessage:_=M}=r;return async l=>{let f=l instanceof Request?l:l.request,C;if(s){let i;try{let c=await s(f,{failureRedirect:null});i=c.user,C=c.cookie}catch(c){return u.error("Authentication infrastructure error:",c),Response.json({error:"\u8A8D\u8A3C\u51E6\u7406\u3067\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002"},{status:500})}if(!i)return Response.json({error:"Unauthorized"},{status:401,headers:C?{"Set-Cookie":C}:void 0})}let y=new URL(f.url),g=j(y.searchParams);if(!g.ok)return Response.json({error:g.message},{status:400});let d=g.cursor,b=p,x=!0,k=null,R=new TextEncoder,m=new AbortController;f.signal.aborted?m.abort():f.signal.addEventListener("abort",()=>{m.abort()},{once:!0});let N=new ReadableStream({async pull(i){if(m.signal.aborted||f.signal.aborted){i.close();return}try{let c=await w(e,o,d,b,a,{signal:m.signal});b=h;let P={records:c.records,nextCursor:c.nextCursor,isLast:c.isLast};if(x&&(x=!1,k=S(e,o,a,{signal:m.signal}).then(A=>{if(!m.signal.aborted)try{let O={type:"METADATA",total:A};i.enqueue(R.encode(`${JSON.stringify(O)}
2
- `))}catch{}}).catch(A=>{u.warn("Non-blocking countActiveContacts failed:",A)})),i.enqueue(R.encode(`${JSON.stringify(P)}
3
- `)),c.isLast||!c.nextCursor){k&&await k,i.close();return}d=c.nextCursor}catch(c){if(m.signal.aborted){try{i.close()}catch{}return}u.error("Streaming error during chunk fetch:",c);try{i.enqueue(R.encode(`${JSON.stringify({error:_})}
4
- `)),i.close()}catch{}}},cancel(){m.abort()}});return new Response(N,{headers:{"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"no-cache, no-transform","X-Content-Type-Options":"nosniff"}})}}function z(r){return{streamLoader:L(r),countActiveContacts:s=>S(r.db,r.table,r.ensureConnection,s),getContactsStreamChunk:(s=null,u,p)=>w(r.db,r.table,s,u,r.ensureConnection,p)}}var t=require("drizzle-orm/mssql-core");function H(r,e){return r.table(e,{person_id:(0,t.bigint)("person_id",{mode:"number"}).identity().notNull(),person_id_redirect_to:(0,t.bigint)("person_id_redirect_to",{mode:"number"}),full_name:(0,t.nvarchar)("full_name",{length:1e3}),full_name_reading:(0,t.nvarchar)("full_name_reading",{length:1e3}),company_name:(0,t.nvarchar)("company_name",{length:1e3}),company_name_reading:(0,t.nvarchar)("company_name_reading",{length:1e3}),department:(0,t.nvarchar)("department",{length:1e3}),title:(0,t.nvarchar)("title",{length:1e3}),address:(0,t.nvarchar)("address",{length:1e3}),postal_code:(0,t.nvarchar)("postal_code",{length:100}),email:(0,t.nvarchar)("email",{length:100}),custom_email:(0,t.nvarchar)("custom_email",{length:100}),company_phone_number:(0,t.nvarchar)("company_phone_number",{length:100}),custom_company_phone_number:(0,t.nvarchar)("custom_company_phone_number",{length:100}),company_fax_number:(0,t.nvarchar)("company_fax_number",{length:100}),mobile_phone_number:(0,t.nvarchar)("mobile_phone_number",{length:100}),custom_mobile_phone_number:(0,t.nvarchar)("custom_mobile_phone_number",{length:100}),url:(0,t.nvarchar)("url",{length:100}),contacted_at:(0,t.datetime2)("contacted_at",{precision:7}),contacted_by:(0,t.nvarchar)("contacted_by",{length:100}),is_in_eight:(0,t.bit)("is_in_eight").default(!0).notNull(),is_contact_synced:(0,t.bit)("is_contact_synced").default(!1).notNull(),is_active:(0,t.bit)("is_active").default(!0).notNull(),is_incomplete:(0,t.bit)("is_incomplete").default(!1).notNull(),created_at:(0,t.datetime2)("created_at",{precision:7}),created_by:(0,t.nvarchar)("created_by",{length:50}),updated_at:(0,t.datetime2)("updated_at",{precision:7}),updated_by:(0,t.nvarchar)("updated_by",{length:50})},o=>[(0,t.primaryKey)({columns:[o.person_id]})])}0&&(module.exports={DEFAULT_STREAM_CHUNK_SIZE,DEFAULT_STREAM_ERROR_CLIENT_MESSAGE,countActiveContactsQuery,createContactMapServer,createContactMapStreamHandler,defineContactMapTable,getContactsStreamChunkQuery});
1
+ "use strict";var N=Object.defineProperty;var z=Object.getOwnPropertyDescriptor;var F=Object.getOwnPropertyNames;var Q=Object.prototype.hasOwnProperty;var B=(e,t)=>{for(var n in t)N(e,n,{get:t[n],enumerable:!0})},W=(e,t,n,s)=>{if(t&&typeof t=="object"||typeof t=="function")for(let a of F(t))!Q.call(e,a)&&a!==n&&N(e,a,{get:()=>t[a],enumerable:!(s=z(t,a))||s.enumerable});return e};var H=e=>W(N({},"__esModule",{value:!0}),e);var re={};B(re,{DEFAULT_STREAM_CHUNK_SIZE:()=>$,DEFAULT_STREAM_ERROR_CLIENT_MESSAGE:()=>I,countActiveContactsQuery:()=>k,createContactMapServer:()=>ee,createContactMapStreamHandler:()=>q,defineContactMapTable:()=>te,getContactsStreamChunkQuery:()=>T});module.exports=H(re);var _=e=>{switch(typeof e){case"string":return JSON.stringify(e);case"bigint":return`${e}n`;case"symbol":return e.toString();case"object":return e===null?"null":L(e);case"function":return L(e);case"number":return Object.is(e,-0)?"-0":String(e);default:return String(e)}},L=e=>{try{return Object.prototype.toString.call(e)}catch{return"[object ?]"}};var P={info:(e,...t)=>console.info(`[contact-map] ${e}`,...t),warn:(e,...t)=>console.warn(`[contact-map] ${e}`,...t),error:(e,...t)=>console.error(`[contact-map] ${e}`,...t)};var O=`an integer from 1 to ${Number.MAX_SAFE_INTEGER}`,R=(e,t,n="")=>{if(typeof t!="number")throw new TypeError(`[contact-map] ${e} must be ${O}${n}; got ${_(t)}`);if(!(Number.isSafeInteger(t)&&t>0))throw new RangeError(`[contact-map] ${e} must be ${O}${n}; got ${_(t)}`)};var o=require("drizzle-orm");var $=200,w=e=>{if(e?.aborted)throw new DOMException("The operation was aborted","AbortError")};async function k(e,t,n,s){return w(s?.signal),await n(),w(s?.signal),(await e.select({count:o.sql`count(*)`}).from(t).where((0,o.eq)(t.is_active,!0)))[0]?.count??0}async function T(e,t,n,s,a,i){R("getContactsStreamChunkQuery limit",s),w(i?.signal),await a(),w(i?.signal);let f=(0,o.eq)(t.is_active,!0),b=f;if(n){let{contacted_at:d,person_id:y}=n;if(d!==null){let l=o.sql`CAST(${d.slice(0,23)} AS datetime2(3))`,S=(0,o.and)(f,(0,o.or)((0,o.lt)(t.contacted_at,l),(0,o.and)((0,o.eq)(t.contacted_at,l),(0,o.lt)(t.person_id,y)),(0,o.isNull)(t.contacted_at)));S&&(b=S)}else{let l=(0,o.and)(f,(0,o.isNull)(t.contacted_at),(0,o.lt)(t.person_id,y));l&&(b=l)}}let g=await e.select().from(t).where(b).orderBy((0,o.desc)(t.contacted_at),(0,o.desc)(t.person_id)).offset(0).fetch(s);w(i?.signal);let u=g.length>0?g[g.length-1]:null,h=u?{contacted_at:u.contacted_at?new Date(u.contacted_at).toISOString():null,person_id:u.person_id}:null,C=g.length<s;return{records:g,nextCursor:h,isLast:C}}var Z=100,J=300,I="stream interrupted by server error",K=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,V=/^(0|[1-9]\d*)$/,X=e=>{if(!K.test(e))return!1;let t=new Date(e);return!Number.isNaN(t.getTime())&&t.toISOString()===e&&t.getUTCFullYear()>=1};function G(e){let t=e.get("cursor_person_id"),n=e.get("cursor_contacted_at");if(t===null)return n!==null?{ok:!1,message:"cursor_contacted_at requires cursor_person_id"}:{ok:!0,cursor:null};let s=V.test(t)?Number(t):Number.NaN;return Number.isSafeInteger(s)?n===null?{ok:!0,cursor:{contacted_at:null,person_id:s}}:X(n)?{ok:!0,cursor:{contacted_at:n,person_id:s}}:{ok:!1,message:`Invalid cursor_contacted_at: ${n}`}:{ok:!1,message:`Invalid cursor_person_id: ${t}`}}function Y(e){if(e.db===void 0||e.db===null)throw new TypeError(`[contact-map] server config db must be the Drizzle database the contact records are read from; got ${_(e.db)}`);if(e.table===void 0||e.table===null)throw new TypeError(`[contact-map] server config table must be the Drizzle table of the contact records; got ${_(e.table)}`);if(typeof e.ensureConnection!="function")throw new TypeError(`[contact-map] server config ensureConnection must be the function that connects the database pool before each query (pass async () => {} for a pool that is always connected); got ${_(e.ensureConnection)}`);if(typeof e.authenticate!="function")throw new TypeError(`[contact-map] server config authenticate must be the function that returns the request's user (to serve the stream without authentication, pass one that always returns a user); got ${_(e.authenticate)}`);for(let t of["firstBatchSize","nextBatchSize"])e[t]!==void 0&&R(`server config ${t}`,e[t]," (leave it out for the default)")}function q(e){Y(e);let{db:t,table:n,ensureConnection:s,authenticate:a,logger:i=P,firstBatchSize:f=Z,nextBatchSize:b=J,streamErrorClientMessage:g=I}=e;return async u=>{let h=u instanceof Request?u:u.request,C=G(new URL(h.url).searchParams);if(!C.ok)return Response.json({error:C.message},{status:400});let d,y;try{let c=await a(h,{failureRedirect:null});y=c.user,d=c.cookie}catch(c){return i.error("Authentication infrastructure error:",c),Response.json({error:"\u8A8D\u8A3C\u51E6\u7406\u3067\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002"},{status:500})}if(!y)return Response.json({error:"Unauthorized"},{status:401,headers:d?{"Set-Cookie":d}:void 0});let l=C.cursor,S=f,v=!0,E=null,A=new TextEncoder,m=new AbortController;h.signal.aborted?m.abort():h.signal.addEventListener("abort",()=>{m.abort()},{once:!0});let U=new ReadableStream({async pull(c){if(m.signal.aborted||h.signal.aborted){c.close();return}try{let p=await T(t,n,l,S,s,{signal:m.signal});S=b;let j={records:p.records,nextCursor:p.nextCursor,isLast:p.isLast};if(v&&(v=!1,E=k(t,n,s,{signal:m.signal}).then(x=>{if(!m.signal.aborted)try{let D={type:"METADATA",total:x};c.enqueue(A.encode(`${JSON.stringify(D)}
2
+ `))}catch{}}).catch(x=>{i.warn("Non-blocking countActiveContacts failed:",x)})),c.enqueue(A.encode(`${JSON.stringify(j)}
3
+ `)),p.isLast||!p.nextCursor){E&&await E,c.close();return}l=p.nextCursor}catch(p){if(m.signal.aborted){try{c.close()}catch{}return}i.error("Streaming error during chunk fetch:",p);try{c.enqueue(A.encode(`${JSON.stringify({error:g})}
4
+ `)),c.close()}catch{}}},cancel(){m.abort()}}),M=new Headers({"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"no-store, no-transform","X-Content-Type-Options":"nosniff"});return d&&M.set("Set-Cookie",d),new Response(U,{headers:M})}}function ee(e){return{streamLoader:q(e),countActiveContacts:a=>k(e.db,e.table,e.ensureConnection,a),getContactsStreamChunk:(a=null,i=$,f)=>T(e.db,e.table,a,i,e.ensureConnection,f)}}var r=require("drizzle-orm/mssql-core");function te(e,t){return e.table(t,{person_id:(0,r.bigint)("person_id",{mode:"number"}).identity().notNull(),person_id_redirect_to:(0,r.bigint)("person_id_redirect_to",{mode:"number"}),full_name:(0,r.nvarchar)("full_name",{length:1e3}),full_name_reading:(0,r.nvarchar)("full_name_reading",{length:1e3}),company_name:(0,r.nvarchar)("company_name",{length:1e3}),company_name_reading:(0,r.nvarchar)("company_name_reading",{length:1e3}),department:(0,r.nvarchar)("department",{length:1e3}),title:(0,r.nvarchar)("title",{length:1e3}),address:(0,r.nvarchar)("address",{length:1e3}),postal_code:(0,r.nvarchar)("postal_code",{length:100}),email:(0,r.nvarchar)("email",{length:100}),custom_email:(0,r.nvarchar)("custom_email",{length:100}),company_phone_number:(0,r.nvarchar)("company_phone_number",{length:100}),custom_company_phone_number:(0,r.nvarchar)("custom_company_phone_number",{length:100}),company_fax_number:(0,r.nvarchar)("company_fax_number",{length:100}),mobile_phone_number:(0,r.nvarchar)("mobile_phone_number",{length:100}),custom_mobile_phone_number:(0,r.nvarchar)("custom_mobile_phone_number",{length:100}),url:(0,r.nvarchar)("url",{length:100}),contacted_at:(0,r.datetime2)("contacted_at",{precision:7}),contacted_by:(0,r.nvarchar)("contacted_by",{length:100}),is_in_eight:(0,r.bit)("is_in_eight").default(!0).notNull(),is_contact_synced:(0,r.bit)("is_contact_synced").default(!1).notNull(),is_active:(0,r.bit)("is_active").default(!0).notNull(),is_incomplete:(0,r.bit)("is_incomplete").default(!1).notNull(),created_at:(0,r.datetime2)("created_at",{precision:7}),created_by:(0,r.nvarchar)("created_by",{length:50}),updated_at:(0,r.datetime2)("updated_at",{precision:7}),updated_by:(0,r.nvarchar)("updated_by",{length:50})},n=>[(0,r.primaryKey)({columns:[n.person_id]})])}0&&(module.exports={DEFAULT_STREAM_CHUNK_SIZE,DEFAULT_STREAM_ERROR_CLIENT_MESSAGE,countActiveContactsQuery,createContactMapServer,createContactMapStreamHandler,defineContactMapTable,getContactsStreamChunkQuery});
package/dist/server.mjs CHANGED
@@ -1,4 +1,4 @@
1
- var L={info:(t,...e)=>console.info(`[contact-map] ${t}`,...e),warn:(t,...e)=>console.warn(`[contact-map] ${t}`,...e),error:(t,...e)=>console.error(`[contact-map] ${t}`,...e)};import{and as R,desc as N,eq as T,isNull as P,lt as A,or as $,sql as O}from"drizzle-orm";var Q=200;async function x(t,e,n,o){if(o?.signal?.aborted)throw new DOMException("The operation was aborted","AbortError");if(n&&await n(),o?.signal?.aborted)throw new DOMException("The operation was aborted","AbortError");return(await t.select({count:O`count(*)`}).from(e).where(T(e.is_active,!0)))[0]?.count??0}async function E(t,e,n=null,o=Q,s,i){if(i?.signal?.aborted)throw new DOMException("The operation was aborted","AbortError");if(s&&await s(),i?.signal?.aborted)throw new DOMException("The operation was aborted","AbortError");let m=T(e.is_active,!0),g=m;if(n){let{contacted_at:b,person_id:f}=n;if(b!==null){let l=O`CAST(${b.slice(0,23)} AS datetime2(3))`,C=R(m,$(A(e.contacted_at,l),R(T(e.contacted_at,l),A(e.person_id,f)),P(e.contacted_at)));C&&(g=C)}else{let l=R(m,P(e.contacted_at),A(e.person_id,f));l&&(g=l)}}let p=await t.select().from(e).where(g).orderBy(N(e.contacted_at),N(e.person_id)).offset(0).fetch(o);if(i?.signal?.aborted)throw new DOMException("The operation was aborted","AbortError");let u=p.length>0?p[p.length-1]:null,_=u?{contacted_at:u.contacted_at?new Date(u.contacted_at).toISOString():null,person_id:u.person_id}:null,h=p.length<o;return{records:p,nextCursor:_,isLast:h}}var F=100,W=300,B="stream interrupted by server error",j=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/;function z(t){let e=t.get("cursor_person_id"),n=t.get("cursor_contacted_at");if(e===null)return n!==null?{ok:!1,message:"cursor_contacted_at requires cursor_person_id"}:{ok:!0,cursor:null};let o=Number.parseInt(e,10);return Number.isSafeInteger(o)?n===null?{ok:!0,cursor:{contacted_at:null,person_id:o}}:j.test(n)?{ok:!0,cursor:{contacted_at:n,person_id:o}}:{ok:!1,message:`Invalid cursor_contacted_at: ${n}`}:{ok:!1,message:`Invalid cursor_person_id: ${e}`}}function H(t){let{db:e,table:n,ensureConnection:o,authenticate:s,logger:i=L,firstBatchSize:m=F,nextBatchSize:g=W,streamErrorClientMessage:p=B}=t;return async u=>{let _=u instanceof Request?u:u.request,h;if(s){let c;try{let a=await s(_,{failureRedirect:null});c=a.user,h=a.cookie}catch(a){return i.error("Authentication infrastructure error:",a),Response.json({error:"\u8A8D\u8A3C\u51E6\u7406\u3067\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002"},{status:500})}if(!c)return Response.json({error:"Unauthorized"},{status:401,headers:h?{"Set-Cookie":h}:void 0})}let b=new URL(_.url),f=z(b.searchParams);if(!f.ok)return Response.json({error:f.message},{status:400});let l=f.cursor,C=m,M=!0,S=null,w=new TextEncoder,d=new AbortController;_.signal.aborted?d.abort():_.signal.addEventListener("abort",()=>{d.abort()},{once:!0});let I=new ReadableStream({async pull(c){if(d.signal.aborted||_.signal.aborted){c.close();return}try{let a=await E(e,n,l,C,o,{signal:d.signal});C=g;let D={records:a.records,nextCursor:a.nextCursor,isLast:a.isLast};if(M&&(M=!1,S=x(e,n,o,{signal:d.signal}).then(k=>{if(!d.signal.aborted)try{let U={type:"METADATA",total:k};c.enqueue(w.encode(`${JSON.stringify(U)}
2
- `))}catch{}}).catch(k=>{i.warn("Non-blocking countActiveContacts failed:",k)})),c.enqueue(w.encode(`${JSON.stringify(D)}
3
- `)),a.isLast||!a.nextCursor){S&&await S,c.close();return}l=a.nextCursor}catch(a){if(d.signal.aborted){try{c.close()}catch{}return}i.error("Streaming error during chunk fetch:",a);try{c.enqueue(w.encode(`${JSON.stringify({error:p})}
4
- `)),c.close()}catch{}}},cancel(){d.abort()}});return new Response(I,{headers:{"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"no-cache, no-transform","X-Content-Type-Options":"nosniff"}})}}function Y(t){return{streamLoader:H(t),countActiveContacts:s=>x(t.db,t.table,t.ensureConnection,s),getContactsStreamChunk:(s=null,i,m)=>E(t.db,t.table,s,i,t.ensureConnection,m)}}import{bigint as q,bit as y,datetime2 as v,nvarchar as r,primaryKey as Z}from"drizzle-orm/mssql-core";function re(t,e){return t.table(e,{person_id:q("person_id",{mode:"number"}).identity().notNull(),person_id_redirect_to:q("person_id_redirect_to",{mode:"number"}),full_name:r("full_name",{length:1e3}),full_name_reading:r("full_name_reading",{length:1e3}),company_name:r("company_name",{length:1e3}),company_name_reading:r("company_name_reading",{length:1e3}),department:r("department",{length:1e3}),title:r("title",{length:1e3}),address:r("address",{length:1e3}),postal_code:r("postal_code",{length:100}),email:r("email",{length:100}),custom_email:r("custom_email",{length:100}),company_phone_number:r("company_phone_number",{length:100}),custom_company_phone_number:r("custom_company_phone_number",{length:100}),company_fax_number:r("company_fax_number",{length:100}),mobile_phone_number:r("mobile_phone_number",{length:100}),custom_mobile_phone_number:r("custom_mobile_phone_number",{length:100}),url:r("url",{length:100}),contacted_at:v("contacted_at",{precision:7}),contacted_by:r("contacted_by",{length:100}),is_in_eight:y("is_in_eight").default(!0).notNull(),is_contact_synced:y("is_contact_synced").default(!1).notNull(),is_active:y("is_active").default(!0).notNull(),is_incomplete:y("is_incomplete").default(!1).notNull(),created_at:v("created_at",{precision:7}),created_by:r("created_by",{length:50}),updated_at:v("updated_at",{precision:7}),updated_by:r("updated_by",{length:50})},n=>[Z({columns:[n.person_id]})])}export{Q as DEFAULT_STREAM_CHUNK_SIZE,B as DEFAULT_STREAM_ERROR_CLIENT_MESSAGE,x as countActiveContactsQuery,Y as createContactMapServer,H as createContactMapStreamHandler,re as defineContactMapTable,E as getContactsStreamChunkQuery};
1
+ var p=e=>{switch(typeof e){case"string":return JSON.stringify(e);case"bigint":return`${e}n`;case"symbol":return e.toString();case"object":return e===null?"null":O(e);case"function":return O(e);case"number":return Object.is(e,-0)?"-0":String(e);default:return String(e)}},O=e=>{try{return Object.prototype.toString.call(e)}catch{return"[object ?]"}};var I={info:(e,...t)=>console.info(`[contact-map] ${e}`,...t),warn:(e,...t)=>console.warn(`[contact-map] ${e}`,...t),error:(e,...t)=>console.error(`[contact-map] ${e}`,...t)};var q=`an integer from 1 to ${Number.MAX_SAFE_INTEGER}`,w=(e,t,r="")=>{if(typeof t!="number")throw new TypeError(`[contact-map] ${e} must be ${q}${r}; got ${p(t)}`);if(!(Number.isSafeInteger(t)&&t>0))throw new RangeError(`[contact-map] ${e} must be ${q}${r}; got ${p(t)}`)};import{and as A,desc as U,eq as N,isNull as j,lt as x,or as H,sql as D}from"drizzle-orm";var z=200,S=e=>{if(e?.aborted)throw new DOMException("The operation was aborted","AbortError")};async function $(e,t,r,o){return S(o?.signal),await r(),S(o?.signal),(await e.select({count:D`count(*)`}).from(t).where(N(t.is_active,!0)))[0]?.count??0}async function v(e,t,r,o,c,a){w("getContactsStreamChunkQuery limit",o),S(a?.signal),await c(),S(a?.signal);let _=N(t.is_active,!0),h=_;if(r){let{contacted_at:u,person_id:C}=r;if(u!==null){let d=D`CAST(${u.slice(0,23)} AS datetime2(3))`,y=A(_,H(x(t.contacted_at,d),A(N(t.contacted_at,d),x(t.person_id,C)),j(t.contacted_at)));y&&(h=y)}else{let d=A(_,j(t.contacted_at),x(t.person_id,C));d&&(h=d)}}let f=await e.select().from(t).where(h).orderBy(U(t.contacted_at),U(t.person_id)).offset(0).fetch(o);S(a?.signal);let i=f.length>0?f[f.length-1]:null,g=i?{contacted_at:i.contacted_at?new Date(i.contacted_at).toISOString():null,person_id:i.person_id}:null,b=f.length<o;return{records:f,nextCursor:g,isLast:b}}var Z=100,J=300,K="stream interrupted by server error",V=/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z$/,X=/^(0|[1-9]\d*)$/,G=e=>{if(!V.test(e))return!1;let t=new Date(e);return!Number.isNaN(t.getTime())&&t.toISOString()===e&&t.getUTCFullYear()>=1};function Y(e){let t=e.get("cursor_person_id"),r=e.get("cursor_contacted_at");if(t===null)return r!==null?{ok:!1,message:"cursor_contacted_at requires cursor_person_id"}:{ok:!0,cursor:null};let o=X.test(t)?Number(t):Number.NaN;return Number.isSafeInteger(o)?r===null?{ok:!0,cursor:{contacted_at:null,person_id:o}}:G(r)?{ok:!0,cursor:{contacted_at:r,person_id:o}}:{ok:!1,message:`Invalid cursor_contacted_at: ${r}`}:{ok:!1,message:`Invalid cursor_person_id: ${t}`}}function ee(e){if(e.db===void 0||e.db===null)throw new TypeError(`[contact-map] server config db must be the Drizzle database the contact records are read from; got ${p(e.db)}`);if(e.table===void 0||e.table===null)throw new TypeError(`[contact-map] server config table must be the Drizzle table of the contact records; got ${p(e.table)}`);if(typeof e.ensureConnection!="function")throw new TypeError(`[contact-map] server config ensureConnection must be the function that connects the database pool before each query (pass async () => {} for a pool that is always connected); got ${p(e.ensureConnection)}`);if(typeof e.authenticate!="function")throw new TypeError(`[contact-map] server config authenticate must be the function that returns the request's user (to serve the stream without authentication, pass one that always returns a user); got ${p(e.authenticate)}`);for(let t of["firstBatchSize","nextBatchSize"])e[t]!==void 0&&w(`server config ${t}`,e[t]," (leave it out for the default)")}function te(e){ee(e);let{db:t,table:r,ensureConnection:o,authenticate:c,logger:a=I,firstBatchSize:_=Z,nextBatchSize:h=J,streamErrorClientMessage:f=K}=e;return async i=>{let g=i instanceof Request?i:i.request,b=Y(new URL(g.url).searchParams);if(!b.ok)return Response.json({error:b.message},{status:400});let u,C;try{let s=await c(g,{failureRedirect:null});C=s.user,u=s.cookie}catch(s){return a.error("Authentication infrastructure error:",s),Response.json({error:"\u8A8D\u8A3C\u51E6\u7406\u3067\u30A8\u30E9\u30FC\u304C\u767A\u751F\u3057\u307E\u3057\u305F\u3002"},{status:500})}if(!C)return Response.json({error:"Unauthorized"},{status:401,headers:u?{"Set-Cookie":u}:void 0});let d=b.cursor,y=_,L=!0,k=null,T=new TextEncoder,l=new AbortController;g.signal.aborted?l.abort():g.signal.addEventListener("abort",()=>{l.abort()},{once:!0});let Q=new ReadableStream({async pull(s){if(l.signal.aborted||g.signal.aborted){s.close();return}try{let m=await v(t,r,d,y,o,{signal:l.signal});y=h;let B={records:m.records,nextCursor:m.nextCursor,isLast:m.isLast};if(L&&(L=!1,k=$(t,r,o,{signal:l.signal}).then(E=>{if(!l.signal.aborted)try{let W={type:"METADATA",total:E};s.enqueue(T.encode(`${JSON.stringify(W)}
2
+ `))}catch{}}).catch(E=>{a.warn("Non-blocking countActiveContacts failed:",E)})),s.enqueue(T.encode(`${JSON.stringify(B)}
3
+ `)),m.isLast||!m.nextCursor){k&&await k,s.close();return}d=m.nextCursor}catch(m){if(l.signal.aborted){try{s.close()}catch{}return}a.error("Streaming error during chunk fetch:",m);try{s.enqueue(T.encode(`${JSON.stringify({error:f})}
4
+ `)),s.close()}catch{}}},cancel(){l.abort()}}),P=new Headers({"Content-Type":"application/x-ndjson; charset=utf-8","Cache-Control":"no-store, no-transform","X-Content-Type-Options":"nosniff"});return u&&P.set("Set-Cookie",u),new Response(Q,{headers:P})}}function _e(e){return{streamLoader:te(e),countActiveContacts:c=>$(e.db,e.table,e.ensureConnection,c),getContactsStreamChunk:(c=null,a=z,_)=>v(e.db,e.table,c,a,e.ensureConnection,_)}}import{bigint as F,bit as R,datetime2 as M,nvarchar as n,primaryKey as re}from"drizzle-orm/mssql-core";function he(e,t){return e.table(t,{person_id:F("person_id",{mode:"number"}).identity().notNull(),person_id_redirect_to:F("person_id_redirect_to",{mode:"number"}),full_name:n("full_name",{length:1e3}),full_name_reading:n("full_name_reading",{length:1e3}),company_name:n("company_name",{length:1e3}),company_name_reading:n("company_name_reading",{length:1e3}),department:n("department",{length:1e3}),title:n("title",{length:1e3}),address:n("address",{length:1e3}),postal_code:n("postal_code",{length:100}),email:n("email",{length:100}),custom_email:n("custom_email",{length:100}),company_phone_number:n("company_phone_number",{length:100}),custom_company_phone_number:n("custom_company_phone_number",{length:100}),company_fax_number:n("company_fax_number",{length:100}),mobile_phone_number:n("mobile_phone_number",{length:100}),custom_mobile_phone_number:n("custom_mobile_phone_number",{length:100}),url:n("url",{length:100}),contacted_at:M("contacted_at",{precision:7}),contacted_by:n("contacted_by",{length:100}),is_in_eight:R("is_in_eight").default(!0).notNull(),is_contact_synced:R("is_contact_synced").default(!1).notNull(),is_active:R("is_active").default(!0).notNull(),is_incomplete:R("is_incomplete").default(!1).notNull(),created_at:M("created_at",{precision:7}),created_by:n("created_by",{length:50}),updated_at:M("updated_at",{precision:7}),updated_by:n("updated_by",{length:50})},r=>[re({columns:[r.person_id]})])}export{z as DEFAULT_STREAM_CHUNK_SIZE,K as DEFAULT_STREAM_ERROR_CLIENT_MESSAGE,$ as countActiveContactsQuery,_e as createContactMapServer,te as createContactMapStreamHandler,he as defineContactMapTable,v as getContactsStreamChunkQuery};