@aiquants/contact-map 0.2.0 → 0.3.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
@@ -61,6 +61,7 @@ declare const extractDepartmentsFromTitle: (title: string, context: ParserContex
61
61
  declare const StandardDepartmentParser: DepartmentParser;
62
62
  declare const TitleBasedDepartmentParser: DepartmentParser;
63
63
  declare const normalizeSearchInput: (value: string) => string;
64
+ declare const getSearchQuerySpellings: (query: string) => string[];
64
65
  declare const schemaContactRecord: z.ZodObject<{
65
66
  person_id: z.ZodPipeline<z.ZodEffects<z.ZodUnion<[
66
67
  z.ZodString,
@@ -267,4 +268,4 @@ declare const schemaContactRecords: z.ZodArray<z.ZodObject<{
267
268
  updated_at?: string | Date | undefined;
268
269
  updated_by?: string | undefined;
269
270
  }>, "many">;
270
- export { type ContactEntrySource, ContactMapDirectoryEntry, ContactMapTreeNaming, ContactRecord, ContactRecordForTree, type DepartmentChain, type DepartmentParseSource, type DepartmentParser, type DepartmentParserMode, type EmailFieldKey, IncrementalTreeBuilder, type ParserContext, type PhoneFieldKey, type PreferredValueResult, SearchResultEntry, StandardDepartmentParser, TitleBasedDepartmentParser, assertContactMapTreeNaming, buildDirectoryTree, extractContactData, extractDepartmentsFromTitle, formatDate, formatDateTime, getEmailLinkHref, getPhoneDialHref, getPrimaryEmail, getPrimaryPhone, normalizeLabel, normalizeSearchInput, normalizeString, schemaContactRecord, schemaContactRecords, splitDepartment, toDisplayValue };
271
+ export { type ContactEntrySource, ContactMapDirectoryEntry, ContactMapTreeNaming, ContactRecord, ContactRecordForTree, type DepartmentChain, type DepartmentParseSource, type DepartmentParser, type DepartmentParserMode, type EmailFieldKey, IncrementalTreeBuilder, type ParserContext, type PhoneFieldKey, type PreferredValueResult, SearchResultEntry, StandardDepartmentParser, TitleBasedDepartmentParser, assertContactMapTreeNaming, buildDirectoryTree, extractContactData, extractDepartmentsFromTitle, formatDate, formatDateTime, getEmailLinkHref, getPhoneDialHref, getPrimaryEmail, getPrimaryPhone, getSearchQuerySpellings, normalizeLabel, normalizeSearchInput, normalizeString, schemaContactRecord, schemaContactRecords, splitDepartment, toDisplayValue };
package/dist/index.d.ts CHANGED
@@ -61,6 +61,7 @@ declare const extractDepartmentsFromTitle: (title: string, context: ParserContex
61
61
  declare const StandardDepartmentParser: DepartmentParser;
62
62
  declare const TitleBasedDepartmentParser: DepartmentParser;
63
63
  declare const normalizeSearchInput: (value: string) => string;
64
+ declare const getSearchQuerySpellings: (query: string) => string[];
64
65
  declare const schemaContactRecord: z.ZodObject<{
65
66
  person_id: z.ZodPipeline<z.ZodEffects<z.ZodUnion<[
66
67
  z.ZodString,
@@ -267,4 +268,4 @@ declare const schemaContactRecords: z.ZodArray<z.ZodObject<{
267
268
  updated_at?: string | Date | undefined;
268
269
  updated_by?: string | undefined;
269
270
  }>, "many">;
270
- export { type ContactEntrySource, ContactMapDirectoryEntry, ContactMapTreeNaming, ContactRecord, ContactRecordForTree, type DepartmentChain, type DepartmentParseSource, type DepartmentParser, type DepartmentParserMode, type EmailFieldKey, IncrementalTreeBuilder, type ParserContext, type PhoneFieldKey, type PreferredValueResult, SearchResultEntry, StandardDepartmentParser, TitleBasedDepartmentParser, assertContactMapTreeNaming, buildDirectoryTree, extractContactData, extractDepartmentsFromTitle, formatDate, formatDateTime, getEmailLinkHref, getPhoneDialHref, getPrimaryEmail, getPrimaryPhone, normalizeLabel, normalizeSearchInput, normalizeString, schemaContactRecord, schemaContactRecords, splitDepartment, toDisplayValue };
271
+ export { type ContactEntrySource, ContactMapDirectoryEntry, ContactMapTreeNaming, ContactRecord, ContactRecordForTree, type DepartmentChain, type DepartmentParseSource, type DepartmentParser, type DepartmentParserMode, type EmailFieldKey, IncrementalTreeBuilder, type ParserContext, type PhoneFieldKey, type PreferredValueResult, SearchResultEntry, StandardDepartmentParser, TitleBasedDepartmentParser, assertContactMapTreeNaming, buildDirectoryTree, extractContactData, extractDepartmentsFromTitle, formatDate, formatDateTime, getEmailLinkHref, getPhoneDialHref, getPrimaryEmail, getPrimaryPhone, getSearchQuerySpellings, normalizeLabel, normalizeSearchInput, normalizeString, schemaContactRecord, schemaContactRecords, splitDepartment, toDisplayValue };
package/dist/index.js CHANGED
@@ -1 +1 @@
1
- "use strict";var N=Object.defineProperty;var Y=Object.getOwnPropertyDescriptor;var Z=Object.getOwnPropertyNames;var ee=Object.prototype.hasOwnProperty;var te=(e,t)=>{for(var r in t)N(e,r,{get:t[r],enumerable:!0})},ne=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of Z(t))!ee.call(e,s)&&s!==r&&N(e,s,{get:()=>t[s],enumerable:!(o=Y(t,s))||o.enumerable});return e};var re=e=>ne(N({},"__esModule",{value:!0}),e);var Ee={};te(Ee,{DEFAULT_LIST_LAYOUT_SPEC:()=>Te,DEFAULT_TREE_LAYOUT_SPEC:()=>Ce,IncrementalTreeBuilder:()=>O,StandardDepartmentParser:()=>F,TitleBasedDepartmentParser:()=>w,assertContactMapTreeNaming:()=>U,buildDirectoryTree:()=>de,calculateResponsiveThresholds:()=>Pe,defaultLogger:()=>Se,extractContactData:()=>me,extractDepartmentsFromTitle:()=>L,formatDate:()=>be,formatDateTime:()=>V,getEmailLinkHref:()=>ye,getHysteresisBreakpointState:()=>xe,getPhoneDialHref:()=>ge,getPrimaryEmail:()=>fe,getPrimaryPhone:()=>he,normalizeLabel:()=>M,normalizeSearchInput:()=>_e,normalizeString:()=>E,schemaContactRecord:()=>J,schemaContactRecords:()=>Me,splitDepartment:()=>$,toDisplayValue:()=>De});module.exports=re(Ee);var M=(e,t)=>e&&e.trim()||t;var oe={\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(oe))if(e.endsWith(t))return r;return{rank:99,type:"Other"}},B=e=>R(e).rank,ae=["\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=>ae.find(t=>e.endsWith(t)),ie=new Set(["&","Quality","Innovation","R&D","Solutions","Development","Laboratory","and","Food","Beverage"]),se=(e,t)=>t>1&&(e.endsWith("\u652F\u5E97")||e.endsWith("\u672C\u90E8")||e.endsWith("\u4E8B\u696D\u6240")||e.endsWith("\u5DE5\u5834")),le=(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 s=_(e),y=_(t);return!(s&&y&&s!==y)},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 s=e.slice(0,o);if(!ie.has(s)&&t.has(s)){r=s;break}}if(r){let o=r,s=e.slice(r.length),y=/^\s+(and|&)\s+([A-Za-z0-9]+)/i,C=s.match(y);C&&(o=e.slice(0,r.length+C[0].length));let u=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 g=new RegExp(`^\\s+${a}\\.?(?=$|[\\s,])`,"i"),p=u.match(g);if(p){o=e.slice(0,o.length+p[0].length);break}}let m=e.slice(o.length).trim();return[o,...W(m,t)]}return[e]},$=(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/),s=[];for(let y of o){let C=y.trim();C&&s.push(...W(C,t))}return s},L=(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"],s=e.split(/[\s\u3000,()()[\]]+/).filter(Boolean),y=s.length,C=new Set;for(let u=y;u>=1;u--)for(let n=0;n<=y-u;n++){let m=!1;for(let g=n;g<n+u;g++)if(C.has(g)){m=!0;break}if(m)continue;let a=s.slice(n,n+u).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 g=n;g<n+u;g++)C.add(g)}}for(let u=0;u<y;u++){if(C.has(u))continue;let n=s[u];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"),b=p[p.length-1],T=o.find(k=>b.endsWith(k));if(T){for(let k of p){let P=k;o.some(i=>P.endsWith(i))||(P=P+T);let x=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(P),d=o.some(i=>P.endsWith(i)),l=o.includes(P);(x||d&&!l)&&r.push({name:P,index:u})}continue}}let m=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)),g=o.includes(n);(m||a&&!g)&&r.push({name:n,index:u})}return r.sort((u,n)=>u.index-n.index),r.map(u=>u.name)},K=(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=M(e.department,"");if(!o)return null;let s=$(o,t.allKnownDepartments),y=new Map;for(let n of s)y.set(n,(y.get(n)||0)+1);let C=n=>{let m=[],a=[];for(let g=0;g<n.length;g++){let p=n[g];if(p==="\u517C"){a.length>0&&(m.push(a),a=[]);continue}let b=R(p),T=b.rank,k=y.get(p)||0,P=se(p,k);if(a.length===0)a.push(p);else{let x=a[a.length-1],d=R(x),l=d.rank;if(a.includes(p))m.push(a),a=[p];else{let i=!1;if(P)i=!0;else if(d.type===b.type){let h=_(x),f=_(p);h&&f&&h!==f||x.endsWith("\u672C\u90E8")&&p.endsWith("\u672C\u90E8")||x.endsWith("\u90E8\u9580")&&p.endsWith("\u4E8B\u696D\u90E8")||x.endsWith("\u4E8B\u696D\u90E8")&&p.endsWith("\u90E8\u9580")||x.endsWith("\u90E8\u9580")&&p.endsWith("\u672C\u90E8")||d.type==="Other"&&b.type==="Other"?i=!0:i=l<T}else i=T>=10,i&&d.type==="Location"&&b.type==="Organization"&&l>=T&&n.slice(g+1).includes(x)&&(i=!1);i?a.push(p):(m.push(a),a=[p])}}if(P){let x=g+1<n.length?n[g+1]:void 0;le(p,x)&&a.length>0&&(m.push(a),a=[])}}return a.length>0&&m.push(a),m},u=[];if(r==="full"&&u.push(...C(s)),r==="pure_org"){let n=s.filter(m=>R(m).type!=="Location");n.length>0&&u.push(...C(n))}if(e.title){let m=/[^\x20-\x7E]/.test(e.title)?/[\s\u3000]*(?:兼務|兼)[\s\u3000]*/:/[,;]|(?:兼務|兼)/,a=e.title.split(m).filter(Boolean),g=[],p=(d,l)=>{let i=B(d),h=B(l),f=i<h;if(!f){let D=_(d),S=_(l);if(D&&S&&D!==S)f=!0;else if(d.endsWith("\u672C\u90E8")&&l.endsWith("\u672C\u90E8"))f=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u4E8B\u696D\u90E8")||d.endsWith("\u4E8B\u696D\u90E8")&&l.endsWith("\u90E8\u9580"))f=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u672C\u90E8"))f=!0;else{let z=R(d),X=R(l);z.type==="Other"&&X.type==="Other"&&(f=!0)}}return f};for(let d of a){let l=L(d,t);if(l.length===0)continue;let i=[];for(let h of l)if(i.length===0)i.push(h);else{let f=i[i.length-1];if(p(f,h))i.push(h);else{g.push([...i]);let D=!1;for(let S=i.length-2;S>=0;S--){let z=i[S];if(p(z,h)){i=[...i.slice(0,S+1),h],D=!0;break}}D||(i=[h])}}i.length>0&&g.push(i)}let b=[...u],T=d=>a.some(l=>l.includes(d)&&l.length>d.length);for(let d of g){let l=!1;for(let i of u){let h=i.findIndex(f=>d.includes(f));if(h!==-1){let f=i[h],D=d.indexOf(f);if(h>0&&D===0){let S=i.slice(0,h);b.push([...S,...d]),l=!0}else if(D>0&&h===0){let S=d.slice(0,D);b.push([...S,...i]),b.push(d),l=!0}else d.length>i.length-h,l=!0}if(!l){let f=i[i.length-1],D=d[0];p(f,D)&&(b.push([...i,...d]),l=!0)}}l||b.push(d)}let k=[],P=[],x=new Set;for(let d of b){let l=d.join("|");x.has(l)||(x.add(l),P.push(d))}for(let d=0;d<P.length;d++){let l=P[d],i=!1;for(let h=0;h<P.length;h++){if(d===h)continue;let f=P[h];if(f.length>l.length&&f.slice(0,l.length).join("|")===l.join("|")){let D=l[l.length-1];if(!T(D)){i=!0;break}}if(f.length>l.length&&K(l,f)){let D=l[l.length-1];if(!T(D)){i=!0;break}}if(l.length===1&&f.length>0){let D=l[0],S=f[f.length-1];if(D!==S&&S.endsWith(D)){i=!0;break}}}i||k.push(l)}return k.length>0?k:null}if(u.length>0){let n=[];for(let m=0;m<u.length;m++){let a=u[m],g=!1;for(let p=0;p<u.length;p++){if(m===p)continue;let b=u[p];if(b.length>a.length&&K(a,b)){g=!0;break}}g||n.push(a)}return n.length>0?n:null}return null}},w={name:"TitleBased",parse:(e,t,r="full")=>{let o=e.title;if(!o)return null;let s=L(o,t);return s.length>0?[s]:null}};var pe=["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 pe){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}`)}},ce=[F,w],ue=(e,t)=>{let r=M(e.full_name,t),o=M(e.title,"");return o.length>0?`${r} (${o})`:r},v=e=>e.sort((t,r)=>t.label.localeCompare(r.label,"ja")),I=(e,t,r)=>{let o=e.get(t);if(o)return o;let s=r();return e.set(t,s),s},A=e=>encodeURIComponent(e.replace(/\//g,"\uFF0F")),j=e=>e.sort((t,r)=>{let o=!!(t.contact.title&&t.contact.title.trim().length>0),s=!!(r.contact.title&&r.contact.title.trim().length>0);return o&&!s?-1:!o&&s?1:t.label.localeCompare(r.label,"ja")}),H=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}),Q=e=>{let t=v(Array.from(e.children.values())).map(Q),r=j([...e.persons]).map(H);return{name:e.label,type:"directory",absolutePath:e.path,relativePath:e.segment,children:[...r,...t],memberCount:e.personCount}},O=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 s of t)if(!this.processedPersonIds.has(s.person_id)&&s.department){let y=s.department.split(/\u3000/);for(let C of y){let u=C.trim();if(!u||u==="\u517C"||u==="\u4FC2")continue;if(/[^\x20-\x7E]/.test(u)){let m=u.split(" ").filter(a=>a.length>0&&a!=="\u517C"&&a!=="\u4FC2");for(let a of m)this.allDepts.add(a)}else this.allDepts.add(u)}}for(let s of t){let y=s.person_id;if(!Number.isFinite(y)||this.processedPersonIds.has(y))continue;this.processedPersonIds.add(y),o=!0;let C=M(s.company_name,this.naming.uncategorizedCompany),u=ue(s,this.naming.unnamedPerson),n=`company:${A(C)}`,m=I(this.companyMap,n,()=>({label:C,segment:n,path:`/${n}`,departments:new Map,persons:[],personCount:0})),a=[],g={allKnownDepartments:this.allDepts};for(let p of ce){let b=p.parse(s,g,r);if(b&&b.length>0){a=b;break}}a.length===0&&a.push([]);for(let p=0;p<a.length;p++){let b=a[p];if(b.length===0){let l=`person:${y}`,i=`${m.path}/${l}`;m.persons.some(f=>f.contact.person_id===y)||m.persons.push({contact:s,label:u,path:i,segment:l,isPrimary:!0});continue}let T=null,k=m.path;if(b.length>0){let l=b[0],i=`department:${A(l)}`;T=I(m.departments,i,()=>({label:l,segment:i,path:`${k}/${i}`,children:new Map,persons:[],personCount:0})),k=T.path,T.personCount+=1;for(let h=1;h<b.length;h++){let f=b[h],D=`department:${A(f)}`;if(!T)throw new Error("Unexpected null currentDepartmentNode");T=I(T.children,D,()=>({label:f,segment:D,path:`${k}/${D}`,children:new Map,persons:[],personCount:0})),k=T.path,T.personCount+=1}}else continue;let P=`person:${y}`,x=`${T.path}/${P}`;T.persons.some(l=>l.contact.person_id===y)||T.persons.push({contact:s,label:u,path:x,segment:P,isPrimary:p===0})}m.personCount+=1}o&&(this.cachedResult=null)}getSnapshot(){if(this.cachedResult)return this.cachedResult;let t={},r=v(Array.from(this.companyMap.values())).map(o=>{let s=v(Array.from(o.departments.values())).map(Q),y=j([...o.persons]).map(H),C={name:o.label,type:"directory",absolutePath:o.path,relativePath:o.segment,children:[...y,...s],memberCount:o.personCount};return t[o.label]=C,C});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 O(t);return r.appendRecords(e),r.getSnapshot()};var E=e=>{if(typeof e!="string")return null;let t=e.trim();return t.length>0?t:null},me=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=E(e[r]);if(o)return{value:o,fieldKey:r}}return{value:null,fieldKey:null}},fe=e=>q(e,["custom_email","email"]),he=e=>q(e,["custom_mobile_phone_number","mobile_phone_number","company_phone_number"]),ge=e=>{let t=E(e);if(!t)return null;let r=t.replace(/[^0-9+#*]/g,"");return r.length===0?null:`tel:${r}`},ye=(e,t)=>{let r=E(e);return r?t?`https://mail.google.com/mail/?view=cm&fs=1&to=${encodeURIComponent(r)}`:`mailto:${encodeURIComponent(r)}`:null},be=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]},V=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()},De=e=>e==null?"-":typeof e=="string"?E(e)??"-":typeof e=="number"?Number.isFinite(e)?String(e):"-":e instanceof Date?V(e):String(e);var Te={listPanelMinWidth:320,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35},Ce={listPanelMinWidth:280,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35};function Pe(e){let t=e.listPanelMinWidth+e.detailPanelMinWidth+e.handleThickness+e.listPaddingAndBorder+e.detailPaddingAndBorder,r=t+e.scrollbarSafetyBuffer,o=r+e.hysteresisSafetyMargin,s=o-r;return{physicalMinWidth:t,collapseThreshold:r,expandThreshold:o,hysteresisWidth:s}}function xe(e,t,r){return e<=0||!Number.isFinite(e)?!1:t?e>=r.collapseThreshold:e>=r.expandThreshold}var Se={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 G=require("@aiquants/select-box"),ke=/[\u200B\uFEFF]/g,Re=/^[\s\u3000\u00A0]+|[\s\u3000\u00A0]+$/g,_e=e=>{let t=e.replace(ke,"").replace(Re,"");return(0,G.normalizeText)(t,{convertWidth:!0,convertKana:!0,convertCase:!0,convertRomaji:!0})};var c=require("zod"),J=c.z.object({person_id:c.z.union([c.z.string(),c.z.number()]).transform(e=>{if(typeof e=="number")return e;let t=e.trim();return parseInt(t,10)}).pipe(c.z.number()),person_id_redirect_to:c.z.union([c.z.string(),c.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:c.z.string().nullable().optional(),full_name_reading:c.z.string().nullable().optional(),company_name:c.z.string().nullable().optional(),company_name_reading:c.z.string().nullable().optional(),department:c.z.string().nullable().optional(),title:c.z.string().nullable().optional(),address:c.z.string().nullable().optional(),postal_code:c.z.string().nullable().optional(),email:c.z.string().nullable().optional(),custom_email:c.z.string().nullable().optional(),company_phone_number:c.z.string().nullable().optional(),custom_company_phone_number:c.z.string().nullable().optional(),company_fax_number:c.z.string().nullable().optional(),mobile_phone_number:c.z.string().nullable().optional(),custom_mobile_phone_number:c.z.string().nullable().optional(),url:c.z.string().nullable().optional(),contacted_at:c.z.union([c.z.date(),c.z.string()]).nullable().optional(),contacted_by:c.z.string().nullable().optional(),is_in_eight:c.z.boolean().nullable().optional(),is_contact_synced:c.z.boolean().nullable().optional(),is_active:c.z.boolean(),is_incomplete:c.z.boolean().nullable().optional(),created_at:c.z.union([c.z.date(),c.z.string()]).optional(),created_by:c.z.string().optional(),updated_at:c.z.union([c.z.date(),c.z.string()]).optional(),updated_by:c.z.string().optional()}),Me=c.z.array(J);0&&(module.exports={DEFAULT_LIST_LAYOUT_SPEC,DEFAULT_TREE_LAYOUT_SPEC,IncrementalTreeBuilder,StandardDepartmentParser,TitleBasedDepartmentParser,assertContactMapTreeNaming,buildDirectoryTree,calculateResponsiveThresholds,defaultLogger,extractContactData,extractDepartmentsFromTitle,formatDate,formatDateTime,getEmailLinkHref,getHysteresisBreakpointState,getPhoneDialHref,getPrimaryEmail,getPrimaryPhone,normalizeLabel,normalizeSearchInput,normalizeString,schemaContactRecord,schemaContactRecords,splitDepartment,toDisplayValue});
1
+ "use strict";var L=Object.defineProperty;var te=Object.getOwnPropertyDescriptor;var ne=Object.getOwnPropertyNames;var re=Object.prototype.hasOwnProperty;var oe=(e,t)=>{for(var r in t)L(e,r,{get:t[r],enumerable:!0})},ae=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let s of ne(t))!re.call(e,s)&&s!==r&&L(e,s,{get:()=>t[s],enumerable:!(o=te(t,s))||o.enumerable});return e};var ie=e=>ae(L({},"__esModule",{value:!0}),e);var Ie={};oe(Ie,{DEFAULT_LIST_LAYOUT_SPEC:()=>Se,DEFAULT_TREE_LAYOUT_SPEC:()=>xe,IncrementalTreeBuilder:()=>z,StandardDepartmentParser:()=>F,TitleBasedDepartmentParser:()=>I,assertContactMapTreeNaming:()=>U,buildDirectoryTree:()=>he,calculateResponsiveThresholds:()=>ke,defaultLogger:()=>_e,extractContactData:()=>ge,extractDepartmentsFromTitle:()=>w,formatDate:()=>Ce,formatDateTime:()=>G,getEmailLinkHref:()=>Te,getHysteresisBreakpointState:()=>Re,getPhoneDialHref:()=>De,getPrimaryEmail:()=>ye,getPrimaryPhone:()=>be,getSearchQuerySpellings:()=>we,normalizeLabel:()=>M,normalizeSearchInput:()=>Y,normalizeString:()=>O,schemaContactRecord:()=>Z,schemaContactRecords:()=>Fe,splitDepartment:()=>j,toDisplayValue:()=>Pe});module.exports=ie(Ie);var M=(e,t)=>e&&e.trim()||t;var se={\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(se))if(e.endsWith(t))return r;return{rank:99,type:"Other"}},K=e=>R(e).rank,le=["\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=>le.find(t=>e.endsWith(t)),pe=new Set(["&","Quality","Innovation","R&D","Solutions","Development","Laboratory","and","Food","Beverage"]),ce=(e,t)=>t>1&&(e.endsWith("\u652F\u5E97")||e.endsWith("\u672C\u90E8")||e.endsWith("\u4E8B\u696D\u6240")||e.endsWith("\u5DE5\u5834")),ue=(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 s=_(e),h=_(t);return!(s&&h&&s!==h)},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 s=e.slice(0,o);if(!pe.has(s)&&t.has(s)){r=s;break}}if(r){let o=r,s=e.slice(r.length),h=/^\s+(and|&)\s+([A-Za-z0-9]+)/i,C=s.match(h);C&&(o=e.slice(0,r.length+C[0].length));let u=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=u.match(y);if(p){o=e.slice(0,o.length+p[0].length);break}}let m=e.slice(o.length).trim();return[o,...W(m,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/),s=[];for(let h of o){let C=h.trim();C&&s.push(...W(C,t))}return s},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"],s=e.split(/[\s\u3000,()()[\]]+/).filter(Boolean),h=s.length,C=new Set;for(let u=h;u>=1;u--)for(let n=0;n<=h-u;n++){let m=!1;for(let y=n;y<n+u;y++)if(C.has(y)){m=!0;break}if(m)continue;let a=s.slice(n,n+u).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+u;y++)C.add(y)}}for(let u=0;u<h;u++){if(C.has(u))continue;let n=s[u];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"),b=p[p.length-1],T=o.find(k=>b.endsWith(k));if(T){for(let k of p){let P=k;o.some(i=>P.endsWith(i))||(P=P+T);let S=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(P),d=o.some(i=>P.endsWith(i)),l=o.includes(P);(S||d&&!l)&&r.push({name:P,index:u})}continue}}let m=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);(m||a&&!y)&&r.push({name:n,index:u})}return r.sort((u,n)=>u.index-n.index),r.map(u=>u.name)},$=(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=M(e.department,"");if(!o)return null;let s=j(o,t.allKnownDepartments),h=new Map;for(let n of s)h.set(n,(h.get(n)||0)+1);let C=n=>{let m=[],a=[];for(let y=0;y<n.length;y++){let p=n[y];if(p==="\u517C"){a.length>0&&(m.push(a),a=[]);continue}let b=R(p),T=b.rank,k=h.get(p)||0,P=ce(p,k);if(a.length===0)a.push(p);else{let S=a[a.length-1],d=R(S),l=d.rank;if(a.includes(p))m.push(a),a=[p];else{let i=!1;if(P)i=!0;else if(d.type===b.type){let g=_(S),f=_(p);g&&f&&g!==f||S.endsWith("\u672C\u90E8")&&p.endsWith("\u672C\u90E8")||S.endsWith("\u90E8\u9580")&&p.endsWith("\u4E8B\u696D\u90E8")||S.endsWith("\u4E8B\u696D\u90E8")&&p.endsWith("\u90E8\u9580")||S.endsWith("\u90E8\u9580")&&p.endsWith("\u672C\u90E8")||d.type==="Other"&&b.type==="Other"?i=!0:i=l<T}else i=T>=10,i&&d.type==="Location"&&b.type==="Organization"&&l>=T&&n.slice(y+1).includes(S)&&(i=!1);i?a.push(p):(m.push(a),a=[p])}}if(P){let S=y+1<n.length?n[y+1]:void 0;ue(p,S)&&a.length>0&&(m.push(a),a=[])}}return a.length>0&&m.push(a),m},u=[];if(r==="full"&&u.push(...C(s)),r==="pure_org"){let n=s.filter(m=>R(m).type!=="Location");n.length>0&&u.push(...C(n))}if(e.title){let m=/[^\x20-\x7E]/.test(e.title)?/[\s\u3000]*(?:兼務|兼)[\s\u3000]*/:/[,;]|(?:兼務|兼)/,a=e.title.split(m).filter(Boolean),y=[],p=(d,l)=>{let i=K(d),g=K(l),f=i<g;if(!f){let D=_(d),x=_(l);if(D&&x&&D!==x)f=!0;else if(d.endsWith("\u672C\u90E8")&&l.endsWith("\u672C\u90E8"))f=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u4E8B\u696D\u90E8")||d.endsWith("\u4E8B\u696D\u90E8")&&l.endsWith("\u90E8\u9580"))f=!0;else if(d.endsWith("\u90E8\u9580")&&l.endsWith("\u672C\u90E8"))f=!0;else{let N=R(d),ee=R(l);N.type==="Other"&&ee.type==="Other"&&(f=!0)}}return f};for(let d of a){let l=w(d,t);if(l.length===0)continue;let i=[];for(let g of l)if(i.length===0)i.push(g);else{let f=i[i.length-1];if(p(f,g))i.push(g);else{y.push([...i]);let D=!1;for(let x=i.length-2;x>=0;x--){let N=i[x];if(p(N,g)){i=[...i.slice(0,x+1),g],D=!0;break}}D||(i=[g])}}i.length>0&&y.push(i)}let b=[...u],T=d=>a.some(l=>l.includes(d)&&l.length>d.length);for(let d of y){let l=!1;for(let i of u){let g=i.findIndex(f=>d.includes(f));if(g!==-1){let f=i[g],D=d.indexOf(f);if(g>0&&D===0){let x=i.slice(0,g);b.push([...x,...d]),l=!0}else if(D>0&&g===0){let x=d.slice(0,D);b.push([...x,...i]),b.push(d),l=!0}else d.length>i.length-g,l=!0}if(!l){let f=i[i.length-1],D=d[0];p(f,D)&&(b.push([...i,...d]),l=!0)}}l||b.push(d)}let k=[],P=[],S=new Set;for(let d of b){let l=d.join("|");S.has(l)||(S.add(l),P.push(d))}for(let d=0;d<P.length;d++){let l=P[d],i=!1;for(let g=0;g<P.length;g++){if(d===g)continue;let f=P[g];if(f.length>l.length&&f.slice(0,l.length).join("|")===l.join("|")){let D=l[l.length-1];if(!T(D)){i=!0;break}}if(f.length>l.length&&$(l,f)){let D=l[l.length-1];if(!T(D)){i=!0;break}}if(l.length===1&&f.length>0){let D=l[0],x=f[f.length-1];if(D!==x&&x.endsWith(D)){i=!0;break}}}i||k.push(l)}return k.length>0?k:null}if(u.length>0){let n=[];for(let m=0;m<u.length;m++){let a=u[m],y=!1;for(let p=0;p<u.length;p++){if(m===p)continue;let b=u[p];if(b.length>a.length&&$(a,b)){y=!0;break}}y||n.push(a)}return n.length>0?n:null}return null}},I={name:"TitleBased",parse:(e,t,r="full")=>{let o=e.title;if(!o)return null;let s=w(o,t);return s.length>0?[s]:null}};var de=["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 de){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}`)}},me=[F,I],fe=(e,t)=>{let r=M(e.full_name,t),o=M(e.title,"");return o.length>0?`${r} (${o})`:r},B=e=>e.sort((t,r)=>t.label.localeCompare(r.label,"ja")),A=(e,t,r)=>{let o=e.get(t);if(o)return o;let s=r();return e.set(t,s),s},v=e=>encodeURIComponent(e.replace(/\//g,"\uFF0F")),H=e=>e.sort((t,r)=>{let o=!!(t.contact.title&&t.contact.title.trim().length>0),s=!!(r.contact.title&&r.contact.title.trim().length>0);return o&&!s?-1:!o&&s?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=B(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 s of t)if(!this.processedPersonIds.has(s.person_id)&&s.department){let h=s.department.split(/\u3000/);for(let C of h){let u=C.trim();if(!u||u==="\u517C"||u==="\u4FC2")continue;if(/[^\x20-\x7E]/.test(u)){let m=u.split(" ").filter(a=>a.length>0&&a!=="\u517C"&&a!=="\u4FC2");for(let a of m)this.allDepts.add(a)}else this.allDepts.add(u)}}for(let s of t){let h=s.person_id;if(!Number.isFinite(h)||this.processedPersonIds.has(h))continue;this.processedPersonIds.add(h),o=!0;let C=M(s.company_name,this.naming.uncategorizedCompany),u=fe(s,this.naming.unnamedPerson),n=`company:${v(C)}`,m=A(this.companyMap,n,()=>({label:C,segment:n,path:`/${n}`,departments:new Map,persons:[],personCount:0})),a=[],y={allKnownDepartments:this.allDepts};for(let p of me){let b=p.parse(s,y,r);if(b&&b.length>0){a=b;break}}a.length===0&&a.push([]);for(let p=0;p<a.length;p++){let b=a[p];if(b.length===0){let l=`person:${h}`,i=`${m.path}/${l}`;m.persons.some(f=>f.contact.person_id===h)||m.persons.push({contact:s,label:u,path:i,segment:l,isPrimary:!0});continue}let T=null,k=m.path;if(b.length>0){let l=b[0],i=`department:${v(l)}`;T=A(m.departments,i,()=>({label:l,segment:i,path:`${k}/${i}`,children:new Map,persons:[],personCount:0})),k=T.path,T.personCount+=1;for(let g=1;g<b.length;g++){let f=b[g],D=`department:${v(f)}`;if(!T)throw new Error("Unexpected null currentDepartmentNode");T=A(T.children,D,()=>({label:f,segment:D,path:`${k}/${D}`,children:new Map,persons:[],personCount:0})),k=T.path,T.personCount+=1}}else continue;let P=`person:${h}`,S=`${T.path}/${P}`;T.persons.some(l=>l.contact.person_id===h)||T.persons.push({contact:s,label:u,path:S,segment:P,isPrimary:p===0})}m.personCount+=1}o&&(this.cachedResult=null)}getSnapshot(){if(this.cachedResult)return this.cachedResult;let t={},r=B(Array.from(this.companyMap.values())).map(o=>{let s=B(Array.from(o.departments.values())).map(V),h=H([...o.persons]).map(Q),C={name:o.label,type:"directory",absolutePath:o.path,relativePath:o.segment,children:[...h,...s],memberCount:o.personCount};return t[o.label]=C,C});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}},he=(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},ge=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}},ye=e=>q(e,["custom_email","email"]),be=e=>q(e,["custom_mobile_phone_number","mobile_phone_number","company_phone_number"]),De=e=>{let t=O(e);if(!t)return null;let r=t.replace(/[^0-9+#*]/g,"");return r.length===0?null:`tel:${r}`},Te=(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},Ce=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()},Pe=e=>e==null?"-":typeof e=="string"?O(e)??"-":typeof e=="number"?Number.isFinite(e)?String(e):"-":e instanceof Date?G(e):String(e);var Se={listPanelMinWidth:320,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35},xe={listPanelMinWidth:280,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35};function ke(e){let t=e.listPanelMinWidth+e.detailPanelMinWidth+e.handleThickness+e.listPaddingAndBorder+e.detailPaddingAndBorder,r=t+e.scrollbarSafetyBuffer,o=r+e.hysteresisSafetyMargin,s=o-r;return{physicalMinWidth:t,collapseThreshold:r,expandThreshold:o,hysteresisWidth:s}}function Re(e,t,r){return e<=0||!Number.isFinite(e)?!1:t?e>=r.collapseThreshold:e>=r.expandThreshold}var _e={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 E=require("@aiquants/select-box"),Me=/[​]/g,Ee=/^[\s  ]+|[\s  ]+$/g,Oe=/\s+/,We=/^[\p{Script=Latin}\s]+$/u,ze=/\p{Script=Latin}/u,X=Object.freeze({convertWidth:!0,convertKana:!0,convertCase:!0,convertRomaji:!1}),Ne=e=>(0,E.normalizeText)(e.replace(Me,"").replace(Ee,""),X),Le=e=>{if(!We.test(e))return null;let t=(0,E.romajiToKatakana)(e);return ze.test(t)?null:t},J=e=>e.split(Oe).filter(Boolean),Y=e=>{let t=Ne(e),r=Le(t);return r===null?t:r},we=e=>{let t=new Set([...J(e),...J(Y(e))]),r=new Set;for(let o of t)for(let s of(0,E.getNormalizedVariants)(o,X)){let h=s.trim();h&&r.add(h)}return Array.from(r)};var c=require("zod"),Z=c.z.object({person_id:c.z.union([c.z.string(),c.z.number()]).transform(e=>{if(typeof e=="number")return e;let t=e.trim();return parseInt(t,10)}).pipe(c.z.number()),person_id_redirect_to:c.z.union([c.z.string(),c.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:c.z.string().nullable().optional(),full_name_reading:c.z.string().nullable().optional(),company_name:c.z.string().nullable().optional(),company_name_reading:c.z.string().nullable().optional(),department:c.z.string().nullable().optional(),title:c.z.string().nullable().optional(),address:c.z.string().nullable().optional(),postal_code:c.z.string().nullable().optional(),email:c.z.string().nullable().optional(),custom_email:c.z.string().nullable().optional(),company_phone_number:c.z.string().nullable().optional(),custom_company_phone_number:c.z.string().nullable().optional(),company_fax_number:c.z.string().nullable().optional(),mobile_phone_number:c.z.string().nullable().optional(),custom_mobile_phone_number:c.z.string().nullable().optional(),url:c.z.string().nullable().optional(),contacted_at:c.z.union([c.z.date(),c.z.string()]).nullable().optional(),contacted_by:c.z.string().nullable().optional(),is_in_eight:c.z.boolean().nullable().optional(),is_contact_synced:c.z.boolean().nullable().optional(),is_active:c.z.boolean(),is_incomplete:c.z.boolean().nullable().optional(),created_at:c.z.union([c.z.date(),c.z.string()]).optional(),created_by:c.z.string().optional(),updated_at:c.z.union([c.z.date(),c.z.string()]).optional(),updated_by:c.z.string().optional()}),Fe=c.z.array(Z);0&&(module.exports={DEFAULT_LIST_LAYOUT_SPEC,DEFAULT_TREE_LAYOUT_SPEC,IncrementalTreeBuilder,StandardDepartmentParser,TitleBasedDepartmentParser,assertContactMapTreeNaming,buildDirectoryTree,calculateResponsiveThresholds,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 M=(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"}},w=e=>R(e).rank,q=["\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=>q.find(t=>e.endsWith(t)),V=new Set(["&","Quality","Innovation","R&D","Solutions","Development","Laboratory","and","Food","Beverage"]),G=(e,t)=>t>1&&(e.endsWith("\u652F\u5E97")||e.endsWith("\u672C\u90E8")||e.endsWith("\u4E8B\u696D\u6240")||e.endsWith("\u5DE5\u5834")),J=(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 p=_(e),y=_(t);return!(p&&y&&p!==y)},E=(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",...E(o,t)]}if(e.startsWith("\u517C\u52D9 ")||e.startsWith("\u517C\u52D9\u3000")){let o=e.slice(2).trim();return["\u517C",...E(o,t)]}let r="";for(let o=e.length-1;o>0;o--){if(e[o]!==" ")continue;let p=e.slice(0,o);if(!V.has(p)&&t.has(p)){r=p;break}}if(r){let o=r,p=e.slice(r.length),y=/^\s+(and|&)\s+([A-Za-z0-9]+)/i,C=p.match(y);C&&(o=e.slice(0,r.length+C[0].length));let u=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 g=new RegExp(`^\\s+${a}\\.?(?=$|[\\s,])`,"i"),l=u.match(g);if(l){o=e.slice(0,o.length+l[0].length);break}}let m=e.slice(o.length).trim();return[o,...E(m,t)]}return[e]},X=(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/),p=[];for(let y of o){let C=y.trim();C&&p.push(...E(C,t))}return p},A=(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"],p=e.split(/[\s\u3000,()()[\]]+/).filter(Boolean),y=p.length,C=new Set;for(let u=y;u>=1;u--)for(let n=0;n<=y-u;n++){let m=!1;for(let g=n;g<n+u;g++)if(C.has(g)){m=!0;break}if(m)continue;let a=p.slice(n,n+u).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 g=n;g<n+u;g++)C.add(g)}}for(let u=0;u<y;u++){if(C.has(u))continue;let n=p[u];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 l=!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),l=!0):(n.startsWith("\u526F")||n.startsWith("\u517C"))&&n.length>1&&(n=n.slice(1),l=!0),!l)break}if(n.includes("\u30FB")&&!t.allKnownDepartments.has(n)){let l=n.split("\u30FB"),b=l[l.length-1],T=o.find(k=>b.endsWith(k));if(T){for(let k of l){let P=k;o.some(i=>P.endsWith(i))||(P=P+T);let x=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(P),d=o.some(i=>P.endsWith(i)),s=o.includes(P);(x||d&&!s)&&r.push({name:P,index:u})}continue}}let m=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(l=>n.endsWith(l)),g=o.includes(n);(m||a&&!g)&&r.push({name:n,index:u})}return r.sort((u,n)=>u.index-n.index),r.map(u=>u.name)},I=(e,t)=>{let r=0;for(let o of t)r<e.length&&o===e[r]&&r++;return r===e.length},v={name:"Standard",parse:(e,t,r="full")=>{let o=M(e.department,"");if(!o)return null;let p=X(o,t.allKnownDepartments),y=new Map;for(let n of p)y.set(n,(y.get(n)||0)+1);let C=n=>{let m=[],a=[];for(let g=0;g<n.length;g++){let l=n[g];if(l==="\u517C"){a.length>0&&(m.push(a),a=[]);continue}let b=R(l),T=b.rank,k=y.get(l)||0,P=G(l,k);if(a.length===0)a.push(l);else{let x=a[a.length-1],d=R(x),s=d.rank;if(a.includes(l))m.push(a),a=[l];else{let i=!1;if(P)i=!0;else if(d.type===b.type){let h=_(x),f=_(l);h&&f&&h!==f||x.endsWith("\u672C\u90E8")&&l.endsWith("\u672C\u90E8")||x.endsWith("\u90E8\u9580")&&l.endsWith("\u4E8B\u696D\u90E8")||x.endsWith("\u4E8B\u696D\u90E8")&&l.endsWith("\u90E8\u9580")||x.endsWith("\u90E8\u9580")&&l.endsWith("\u672C\u90E8")||d.type==="Other"&&b.type==="Other"?i=!0:i=s<T}else i=T>=10,i&&d.type==="Location"&&b.type==="Organization"&&s>=T&&n.slice(g+1).includes(x)&&(i=!1);i?a.push(l):(m.push(a),a=[l])}}if(P){let x=g+1<n.length?n[g+1]:void 0;J(l,x)&&a.length>0&&(m.push(a),a=[])}}return a.length>0&&m.push(a),m},u=[];if(r==="full"&&u.push(...C(p)),r==="pure_org"){let n=p.filter(m=>R(m).type!=="Location");n.length>0&&u.push(...C(n))}if(e.title){let m=/[^\x20-\x7E]/.test(e.title)?/[\s\u3000]*(?:兼務|兼)[\s\u3000]*/:/[,;]|(?:兼務|兼)/,a=e.title.split(m).filter(Boolean),g=[],l=(d,s)=>{let i=w(d),h=w(s),f=i<h;if(!f){let D=_(d),S=_(s);if(D&&S&&D!==S)f=!0;else if(d.endsWith("\u672C\u90E8")&&s.endsWith("\u672C\u90E8"))f=!0;else if(d.endsWith("\u90E8\u9580")&&s.endsWith("\u4E8B\u696D\u90E8")||d.endsWith("\u4E8B\u696D\u90E8")&&s.endsWith("\u90E8\u9580"))f=!0;else if(d.endsWith("\u90E8\u9580")&&s.endsWith("\u672C\u90E8"))f=!0;else{let O=R(d),H=R(s);O.type==="Other"&&H.type==="Other"&&(f=!0)}}return f};for(let d of a){let s=A(d,t);if(s.length===0)continue;let i=[];for(let h of s)if(i.length===0)i.push(h);else{let f=i[i.length-1];if(l(f,h))i.push(h);else{g.push([...i]);let D=!1;for(let S=i.length-2;S>=0;S--){let O=i[S];if(l(O,h)){i=[...i.slice(0,S+1),h],D=!0;break}}D||(i=[h])}}i.length>0&&g.push(i)}let b=[...u],T=d=>a.some(s=>s.includes(d)&&s.length>d.length);for(let d of g){let s=!1;for(let i of u){let h=i.findIndex(f=>d.includes(f));if(h!==-1){let f=i[h],D=d.indexOf(f);if(h>0&&D===0){let S=i.slice(0,h);b.push([...S,...d]),s=!0}else if(D>0&&h===0){let S=d.slice(0,D);b.push([...S,...i]),b.push(d),s=!0}else d.length>i.length-h,s=!0}if(!s){let f=i[i.length-1],D=d[0];l(f,D)&&(b.push([...i,...d]),s=!0)}}s||b.push(d)}let k=[],P=[],x=new Set;for(let d of b){let s=d.join("|");x.has(s)||(x.add(s),P.push(d))}for(let d=0;d<P.length;d++){let s=P[d],i=!1;for(let h=0;h<P.length;h++){if(d===h)continue;let f=P[h];if(f.length>s.length&&f.slice(0,s.length).join("|")===s.join("|")){let D=s[s.length-1];if(!T(D)){i=!0;break}}if(f.length>s.length&&I(s,f)){let D=s[s.length-1];if(!T(D)){i=!0;break}}if(s.length===1&&f.length>0){let D=s[0],S=f[f.length-1];if(D!==S&&S.endsWith(D)){i=!0;break}}}i||k.push(s)}return k.length>0?k:null}if(u.length>0){let n=[];for(let m=0;m<u.length;m++){let a=u[m],g=!1;for(let l=0;l<u.length;l++){if(m===l)continue;let b=u[l];if(b.length>a.length&&I(a,b)){g=!0;break}}g||n.push(a)}return n.length>0?n:null}return null}},B={name:"TitleBased",parse:(e,t,r="full")=>{let o=e.title;if(!o)return null;let p=A(o,t);return p.length>0?[p]:null}};var Y=["uncategorizedCompany","unnamedPerson"],Z=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 Y){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}`)}},ee=[v,B],te=(e,t)=>{let r=M(e.full_name,t),o=M(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 p=r();return e.set(t,p),p},N=e=>encodeURIComponent(e.replace(/\//g,"\uFF0F")),K=e=>e.sort((t,r)=>{let o=!!(t.contact.title&&t.contact.title.trim().length>0),p=!!(r.contact.title&&r.contact.title.trim().length>0);return o&&!p?-1:!o&&p?1:t.label.localeCompare(r.label,"ja")}),$=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}),U=e=>{let t=L(Array.from(e.children.values())).map(U),r=K([...e.persons]).map($);return{name:e.label,type:"directory",absolutePath:e.path,relativePath:e.segment,children:[...r,...t],memberCount:e.personCount}},F=class{constructor(t){this.companyMap=new Map;this.processedPersonIds=new Set;this.allDepts=new Set;this.cachedResult=null;Z(t),this.naming=t}appendRecords(t){if(!t||t.length===0)return;let r="full",o=!1;for(let p of t)if(!this.processedPersonIds.has(p.person_id)&&p.department){let y=p.department.split(/\u3000/);for(let C of y){let u=C.trim();if(!u||u==="\u517C"||u==="\u4FC2")continue;if(/[^\x20-\x7E]/.test(u)){let m=u.split(" ").filter(a=>a.length>0&&a!=="\u517C"&&a!=="\u4FC2");for(let a of m)this.allDepts.add(a)}else this.allDepts.add(u)}}for(let p of t){let y=p.person_id;if(!Number.isFinite(y)||this.processedPersonIds.has(y))continue;this.processedPersonIds.add(y),o=!0;let C=M(p.company_name,this.naming.uncategorizedCompany),u=te(p,this.naming.unnamedPerson),n=`company:${N(C)}`,m=z(this.companyMap,n,()=>({label:C,segment:n,path:`/${n}`,departments:new Map,persons:[],personCount:0})),a=[],g={allKnownDepartments:this.allDepts};for(let l of ee){let b=l.parse(p,g,r);if(b&&b.length>0){a=b;break}}a.length===0&&a.push([]);for(let l=0;l<a.length;l++){let b=a[l];if(b.length===0){let s=`person:${y}`,i=`${m.path}/${s}`;m.persons.some(f=>f.contact.person_id===y)||m.persons.push({contact:p,label:u,path:i,segment:s,isPrimary:!0});continue}let T=null,k=m.path;if(b.length>0){let s=b[0],i=`department:${N(s)}`;T=z(m.departments,i,()=>({label:s,segment:i,path:`${k}/${i}`,children:new Map,persons:[],personCount:0})),k=T.path,T.personCount+=1;for(let h=1;h<b.length;h++){let f=b[h],D=`department:${N(f)}`;if(!T)throw new Error("Unexpected null currentDepartmentNode");T=z(T.children,D,()=>({label:f,segment:D,path:`${k}/${D}`,children:new Map,persons:[],personCount:0})),k=T.path,T.personCount+=1}}else continue;let P=`person:${y}`,x=`${T.path}/${P}`;T.persons.some(s=>s.contact.person_id===y)||T.persons.push({contact:p,label:u,path:x,segment:P,isPrimary:l===0})}m.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 p=L(Array.from(o.departments.values())).map(U),y=K([...o.persons]).map($),C={name:o.label,type:"directory",absolutePath:o.path,relativePath:o.segment,children:[...y,...p],memberCount:o.personCount};return t[o.label]=C,C});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}},pe=(e,t)=>{let r=new F(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},ue=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=W(e[r]);if(o)return{value:o,fieldKey:r}}return{value:null,fieldKey:null}},de=e=>j(e,["custom_email","email"]),me=e=>j(e,["custom_mobile_phone_number","mobile_phone_number","company_phone_number"]),fe=e=>{let t=W(e);if(!t)return null;let r=t.replace(/[^0-9+#*]/g,"");return r.length===0?null:`tel:${r}`},he=(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},ge=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]},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()},ye=e=>e==null?"-":typeof e=="string"?W(e)??"-":typeof e=="number"?Number.isFinite(e)?String(e):"-":e instanceof Date?ne(e):String(e);var De={listPanelMinWidth:320,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35},Te={listPanelMinWidth:280,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35};function Ce(e){let t=e.listPanelMinWidth+e.detailPanelMinWidth+e.handleThickness+e.listPaddingAndBorder+e.detailPaddingAndBorder,r=t+e.scrollbarSafetyBuffer,o=r+e.hysteresisSafetyMargin,p=o-r;return{physicalMinWidth:t,collapseThreshold:r,expandThreshold:o,hysteresisWidth:p}}function Pe(e,t,r){return e<=0||!Number.isFinite(e)?!1:t?e>=r.collapseThreshold:e>=r.expandThreshold}var Se={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{normalizeText as re}from"@aiquants/select-box";var oe=/[\u200B\uFEFF]/g,ae=/^[\s\u3000\u00A0]+|[\s\u3000\u00A0]+$/g,_e=e=>{let t=e.replace(oe,"").replace(ae,"");return re(t,{convertWidth:!0,convertKana:!0,convertCase:!0,convertRomaji:!0})};import{z as c}from"zod";var ie=c.object({person_id:c.union([c.string(),c.number()]).transform(e=>{if(typeof e=="number")return e;let t=e.trim();return parseInt(t,10)}).pipe(c.number()),person_id_redirect_to:c.union([c.string(),c.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:c.string().nullable().optional(),full_name_reading:c.string().nullable().optional(),company_name:c.string().nullable().optional(),company_name_reading:c.string().nullable().optional(),department:c.string().nullable().optional(),title:c.string().nullable().optional(),address:c.string().nullable().optional(),postal_code:c.string().nullable().optional(),email:c.string().nullable().optional(),custom_email:c.string().nullable().optional(),company_phone_number:c.string().nullable().optional(),custom_company_phone_number:c.string().nullable().optional(),company_fax_number:c.string().nullable().optional(),mobile_phone_number:c.string().nullable().optional(),custom_mobile_phone_number:c.string().nullable().optional(),url:c.string().nullable().optional(),contacted_at:c.union([c.date(),c.string()]).nullable().optional(),contacted_by:c.string().nullable().optional(),is_in_eight:c.boolean().nullable().optional(),is_contact_synced:c.boolean().nullable().optional(),is_active:c.boolean(),is_incomplete:c.boolean().nullable().optional(),created_at:c.union([c.date(),c.string()]).optional(),created_by:c.string().optional(),updated_at:c.union([c.date(),c.string()]).optional(),updated_by:c.string().optional()}),We=c.array(ie);export{De as DEFAULT_LIST_LAYOUT_SPEC,Te as DEFAULT_TREE_LAYOUT_SPEC,F as IncrementalTreeBuilder,v as StandardDepartmentParser,B as TitleBasedDepartmentParser,Z as assertContactMapTreeNaming,pe as buildDirectoryTree,Ce as calculateResponsiveThresholds,Se as defaultLogger,ue as extractContactData,A as extractDepartmentsFromTitle,ge as formatDate,ne as formatDateTime,he as getEmailLinkHref,Pe as getHysteresisBreakpointState,fe as getPhoneDialHref,de as getPrimaryEmail,me as getPrimaryPhone,M as normalizeLabel,_e as normalizeSearchInput,W as normalizeString,ie as schemaContactRecord,We as schemaContactRecords,X as splitDepartment,ye as toDisplayValue};
1
+ var M=(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"}},F=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 p=_(e),h=_(t);return!(p&&h&&p!==h)},E=(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",...E(o,t)]}if(e.startsWith("\u517C\u52D9 ")||e.startsWith("\u517C\u52D9\u3000")){let o=e.slice(2).trim();return["\u517C",...E(o,t)]}let r="";for(let o=e.length-1;o>0;o--){if(e[o]!==" ")continue;let p=e.slice(0,o);if(!J.has(p)&&t.has(p)){r=p;break}}if(r){let o=r,p=e.slice(r.length),h=/^\s+(and|&)\s+([A-Za-z0-9]+)/i,C=p.match(h);C&&(o=e.slice(0,r.length+C[0].length));let u=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"),l=u.match(y);if(l){o=e.slice(0,o.length+l[0].length);break}}let m=e.slice(o.length).trim();return[o,...E(m,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/),p=[];for(let h of o){let C=h.trim();C&&p.push(...E(C,t))}return p},A=(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"],p=e.split(/[\s\u3000,()()[\]]+/).filter(Boolean),h=p.length,C=new Set;for(let u=h;u>=1;u--)for(let n=0;n<=h-u;n++){let m=!1;for(let y=n;y<n+u;y++)if(C.has(y)){m=!0;break}if(m)continue;let a=p.slice(n,n+u).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+u;y++)C.add(y)}}for(let u=0;u<h;u++){if(C.has(u))continue;let n=p[u];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 l=!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),l=!0):(n.startsWith("\u526F")||n.startsWith("\u517C"))&&n.length>1&&(n=n.slice(1),l=!0),!l)break}if(n.includes("\u30FB")&&!t.allKnownDepartments.has(n)){let l=n.split("\u30FB"),b=l[l.length-1],T=o.find(k=>b.endsWith(k));if(T){for(let k of l){let P=k;o.some(i=>P.endsWith(i))||(P=P+T);let S=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(P),d=o.some(i=>P.endsWith(i)),s=o.includes(P);(S||d&&!s)&&r.push({name:P,index:u})}continue}}let m=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(l=>n.endsWith(l)),y=o.includes(n);(m||a&&!y)&&r.push({name:n,index:u})}return r.sort((u,n)=>u.index-n.index),r.map(u=>u.name)},I=(e,t)=>{let r=0;for(let o of t)r<e.length&&o===e[r]&&r++;return r===e.length},v={name:"Standard",parse:(e,t,r="full")=>{let o=M(e.department,"");if(!o)return null;let p=Z(o,t.allKnownDepartments),h=new Map;for(let n of p)h.set(n,(h.get(n)||0)+1);let C=n=>{let m=[],a=[];for(let y=0;y<n.length;y++){let l=n[y];if(l==="\u517C"){a.length>0&&(m.push(a),a=[]);continue}let b=R(l),T=b.rank,k=h.get(l)||0,P=X(l,k);if(a.length===0)a.push(l);else{let S=a[a.length-1],d=R(S),s=d.rank;if(a.includes(l))m.push(a),a=[l];else{let i=!1;if(P)i=!0;else if(d.type===b.type){let g=_(S),f=_(l);g&&f&&g!==f||S.endsWith("\u672C\u90E8")&&l.endsWith("\u672C\u90E8")||S.endsWith("\u90E8\u9580")&&l.endsWith("\u4E8B\u696D\u90E8")||S.endsWith("\u4E8B\u696D\u90E8")&&l.endsWith("\u90E8\u9580")||S.endsWith("\u90E8\u9580")&&l.endsWith("\u672C\u90E8")||d.type==="Other"&&b.type==="Other"?i=!0:i=s<T}else i=T>=10,i&&d.type==="Location"&&b.type==="Organization"&&s>=T&&n.slice(y+1).includes(S)&&(i=!1);i?a.push(l):(m.push(a),a=[l])}}if(P){let S=y+1<n.length?n[y+1]:void 0;Y(l,S)&&a.length>0&&(m.push(a),a=[])}}return a.length>0&&m.push(a),m},u=[];if(r==="full"&&u.push(...C(p)),r==="pure_org"){let n=p.filter(m=>R(m).type!=="Location");n.length>0&&u.push(...C(n))}if(e.title){let m=/[^\x20-\x7E]/.test(e.title)?/[\s\u3000]*(?:兼務|兼)[\s\u3000]*/:/[,;]|(?:兼務|兼)/,a=e.title.split(m).filter(Boolean),y=[],l=(d,s)=>{let i=F(d),g=F(s),f=i<g;if(!f){let D=_(d),x=_(s);if(D&&x&&D!==x)f=!0;else if(d.endsWith("\u672C\u90E8")&&s.endsWith("\u672C\u90E8"))f=!0;else if(d.endsWith("\u90E8\u9580")&&s.endsWith("\u4E8B\u696D\u90E8")||d.endsWith("\u4E8B\u696D\u90E8")&&s.endsWith("\u90E8\u9580"))f=!0;else if(d.endsWith("\u90E8\u9580")&&s.endsWith("\u672C\u90E8"))f=!0;else{let W=R(d),V=R(s);W.type==="Other"&&V.type==="Other"&&(f=!0)}}return f};for(let d of a){let s=A(d,t);if(s.length===0)continue;let i=[];for(let g of s)if(i.length===0)i.push(g);else{let f=i[i.length-1];if(l(f,g))i.push(g);else{y.push([...i]);let D=!1;for(let x=i.length-2;x>=0;x--){let W=i[x];if(l(W,g)){i=[...i.slice(0,x+1),g],D=!0;break}}D||(i=[g])}}i.length>0&&y.push(i)}let b=[...u],T=d=>a.some(s=>s.includes(d)&&s.length>d.length);for(let d of y){let s=!1;for(let i of u){let g=i.findIndex(f=>d.includes(f));if(g!==-1){let f=i[g],D=d.indexOf(f);if(g>0&&D===0){let x=i.slice(0,g);b.push([...x,...d]),s=!0}else if(D>0&&g===0){let x=d.slice(0,D);b.push([...x,...i]),b.push(d),s=!0}else d.length>i.length-g,s=!0}if(!s){let f=i[i.length-1],D=d[0];l(f,D)&&(b.push([...i,...d]),s=!0)}}s||b.push(d)}let k=[],P=[],S=new Set;for(let d of b){let s=d.join("|");S.has(s)||(S.add(s),P.push(d))}for(let d=0;d<P.length;d++){let s=P[d],i=!1;for(let g=0;g<P.length;g++){if(d===g)continue;let f=P[g];if(f.length>s.length&&f.slice(0,s.length).join("|")===s.join("|")){let D=s[s.length-1];if(!T(D)){i=!0;break}}if(f.length>s.length&&I(s,f)){let D=s[s.length-1];if(!T(D)){i=!0;break}}if(s.length===1&&f.length>0){let D=s[0],x=f[f.length-1];if(D!==x&&x.endsWith(D)){i=!0;break}}}i||k.push(s)}return k.length>0?k:null}if(u.length>0){let n=[];for(let m=0;m<u.length;m++){let a=u[m],y=!1;for(let l=0;l<u.length;l++){if(m===l)continue;let b=u[l];if(b.length>a.length&&I(a,b)){y=!0;break}}y||n.push(a)}return n.length>0?n:null}return null}},B={name:"TitleBased",parse:(e,t,r="full")=>{let o=e.title;if(!o)return null;let p=A(o,t);return p.length>0?[p]: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=[v,B],re=(e,t)=>{let r=M(e.full_name,t),o=M(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 p=r();return e.set(t,p),p},N=e=>encodeURIComponent(e.replace(/\//g,"\uFF0F")),K=e=>e.sort((t,r)=>{let o=!!(t.contact.title&&t.contact.title.trim().length>0),p=!!(r.contact.title&&r.contact.title.trim().length>0);return o&&!p?-1:!o&&p?1:t.label.localeCompare(r.label,"ja")}),$=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=K([...e.persons]).map($);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 p of t)if(!this.processedPersonIds.has(p.person_id)&&p.department){let h=p.department.split(/\u3000/);for(let C of h){let u=C.trim();if(!u||u==="\u517C"||u==="\u4FC2")continue;if(/[^\x20-\x7E]/.test(u)){let m=u.split(" ").filter(a=>a.length>0&&a!=="\u517C"&&a!=="\u4FC2");for(let a of m)this.allDepts.add(a)}else this.allDepts.add(u)}}for(let p of t){let h=p.person_id;if(!Number.isFinite(h)||this.processedPersonIds.has(h))continue;this.processedPersonIds.add(h),o=!0;let C=M(p.company_name,this.naming.uncategorizedCompany),u=re(p,this.naming.unnamedPerson),n=`company:${N(C)}`,m=z(this.companyMap,n,()=>({label:C,segment:n,path:`/${n}`,departments:new Map,persons:[],personCount:0})),a=[],y={allKnownDepartments:this.allDepts};for(let l of ne){let b=l.parse(p,y,r);if(b&&b.length>0){a=b;break}}a.length===0&&a.push([]);for(let l=0;l<a.length;l++){let b=a[l];if(b.length===0){let s=`person:${h}`,i=`${m.path}/${s}`;m.persons.some(f=>f.contact.person_id===h)||m.persons.push({contact:p,label:u,path:i,segment:s,isPrimary:!0});continue}let T=null,k=m.path;if(b.length>0){let s=b[0],i=`department:${N(s)}`;T=z(m.departments,i,()=>({label:s,segment:i,path:`${k}/${i}`,children:new Map,persons:[],personCount:0})),k=T.path,T.personCount+=1;for(let g=1;g<b.length;g++){let f=b[g],D=`department:${N(f)}`;if(!T)throw new Error("Unexpected null currentDepartmentNode");T=z(T.children,D,()=>({label:f,segment:D,path:`${k}/${D}`,children:new Map,persons:[],personCount:0})),k=T.path,T.personCount+=1}}else continue;let P=`person:${h}`,S=`${T.path}/${P}`;T.persons.some(s=>s.contact.person_id===h)||T.persons.push({contact:p,label:u,path:S,segment:P,isPrimary:l===0})}m.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 p=L(Array.from(o.departments.values())).map(j),h=K([...o.persons]).map($),C={name:o.label,type:"directory",absolutePath:o.path,relativePath:o.segment,children:[...h,...p],memberCount:o.personCount};return t[o.label]=C,C});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 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},Ce=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}},Pe=e=>U(e,["custom_email","email"]),Se=e=>U(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}`},ke=(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},Re=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()},_e=e=>e==null?"-":typeof e=="string"?O(e)??"-":typeof e=="number"?Number.isFinite(e)?String(e):"-":e instanceof Date?oe(e):String(e);var Ee={listPanelMinWidth:320,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35},Oe={listPanelMinWidth:280,detailPanelMinWidth:260,handleThickness:10,listPaddingAndBorder:0,detailPaddingAndBorder:0,scrollbarSafetyBuffer:20,hysteresisSafetyMargin:35};function We(e){let t=e.listPanelMinWidth+e.detailPanelMinWidth+e.handleThickness+e.listPaddingAndBorder+e.detailPaddingAndBorder,r=t+e.scrollbarSafetyBuffer,o=r+e.hysteresisSafetyMargin,p=o-r;return{physicalMinWidth:t,collapseThreshold:r,expandThreshold:o,hysteresisWidth:p}}function ze(e,t,r){return e<=0||!Number.isFinite(e)?!1:t?e>=r.collapseThreshold:e>=r.expandThreshold}var Le={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},Ie=e=>{let t=new Set([...H(e),...H(he(e))]),r=new Set;for(let o of t)for(let p of ae(o,Q)){let h=p.trim();h&&r.add(h)}return Array.from(r)};import{z as c}from"zod";var ge=c.object({person_id:c.union([c.string(),c.number()]).transform(e=>{if(typeof e=="number")return e;let t=e.trim();return parseInt(t,10)}).pipe(c.number()),person_id_redirect_to:c.union([c.string(),c.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:c.string().nullable().optional(),full_name_reading:c.string().nullable().optional(),company_name:c.string().nullable().optional(),company_name_reading:c.string().nullable().optional(),department:c.string().nullable().optional(),title:c.string().nullable().optional(),address:c.string().nullable().optional(),postal_code:c.string().nullable().optional(),email:c.string().nullable().optional(),custom_email:c.string().nullable().optional(),company_phone_number:c.string().nullable().optional(),custom_company_phone_number:c.string().nullable().optional(),company_fax_number:c.string().nullable().optional(),mobile_phone_number:c.string().nullable().optional(),custom_mobile_phone_number:c.string().nullable().optional(),url:c.string().nullable().optional(),contacted_at:c.union([c.date(),c.string()]).nullable().optional(),contacted_by:c.string().nullable().optional(),is_in_eight:c.boolean().nullable().optional(),is_contact_synced:c.boolean().nullable().optional(),is_active:c.boolean(),is_incomplete:c.boolean().nullable().optional(),created_at:c.union([c.date(),c.string()]).optional(),created_by:c.string().optional(),updated_at:c.union([c.date(),c.string()]).optional(),updated_by:c.string().optional()}),Be=c.array(ge);export{Ee as DEFAULT_LIST_LAYOUT_SPEC,Oe as DEFAULT_TREE_LAYOUT_SPEC,w as IncrementalTreeBuilder,v as StandardDepartmentParser,B as TitleBasedDepartmentParser,te as assertContactMapTreeNaming,De as buildDirectoryTree,We as calculateResponsiveThresholds,Le as defaultLogger,Ce as extractContactData,A as extractDepartmentsFromTitle,Re as formatDate,oe as formatDateTime,ke as getEmailLinkHref,ze as getHysteresisBreakpointState,xe as getPhoneDialHref,Pe as getPrimaryEmail,Se as getPrimaryPhone,Ie as getSearchQuerySpellings,M as normalizeLabel,he as normalizeSearchInput,O as normalizeString,ge as schemaContactRecord,Be as schemaContactRecords,Z as splitDepartment,_e as toDisplayValue};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aiquants/contact-map",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "Reusable contact-map feature package: shared types/schemas, React (Router v7 / v8) UI with virtual scrolling + tree view + incremental Web Worker + fuzzy search + resize panels, and a drizzle (mssql) server layer with DI ports.",
5
5
  "sideEffects": [
6
6
  "**/*.css"
@@ -62,7 +62,7 @@
62
62
  "@aiquants/directory-tree": "^3.12.0",
63
63
  "@aiquants/fuzzy-search": "^2.2.1",
64
64
  "@aiquants/resize-panels": "^2.0.1",
65
- "@aiquants/select-box": "^0.10.0",
65
+ "@aiquants/select-box": "^0.11.0",
66
66
  "@aiquants/swipe-overlay": "^1.2.5",
67
67
  "@aiquants/virtualscroll": "^3.7.0",
68
68
  "@tailwindcss/cli": "^4.1.18",
@@ -88,7 +88,7 @@
88
88
  "@aiquants/directory-tree": "^3.12.0",
89
89
  "@aiquants/fuzzy-search": "^2.2.1",
90
90
  "@aiquants/resize-panels": "^2.0.1",
91
- "@aiquants/select-box": "^0.10.0",
91
+ "@aiquants/select-box": "^0.11.0",
92
92
  "@aiquants/swipe-overlay": "^1.2.5",
93
93
  "@aiquants/virtualscroll": "^3.7.0",
94
94
  "drizzle-orm": ">=1.0.0-beta.4 <2.0.0",