efficient-storefront-blocks 0.0.0 → 0.11.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/CHANGELOG.md +397 -0
- package/LICENSE +10 -0
- package/README.md +279 -2
- package/dist/chunks/EditorPreviewCheckout-J27HMNBW.js +4 -0
- package/dist/chunks/PreviewFooter-BMBCVZQC.js +1 -0
- package/dist/chunks/SectionEditorShell-K4OEOAY4.js +1 -0
- package/dist/chunks/SiteEditorProvider-ECGZVKLG.js +1 -0
- package/dist/chunks/StorefrontEditorChrome-T6DTL7T7.js +1 -0
- package/dist/chunks/chunk-3J4FEDNZ.js +2 -0
- package/dist/chunks/chunk-6CP4D6VJ.js +1 -0
- package/dist/chunks/chunk-6XRKNA2E.js +1 -0
- package/dist/chunks/chunk-C2CHF6AL.js +15 -0
- package/dist/chunks/chunk-C2CHF6AL.js.LEGAL.txt +27 -0
- package/dist/chunks/chunk-ENDWECYV.js +1 -0
- package/dist/chunks/chunk-HVOO2GNE.js +1 -0
- package/dist/chunks/chunk-MYSIADXX.js +1 -0
- package/dist/chunks/chunk-NJXX5BI2.js +1 -0
- package/dist/chunks/chunk-RRHBLOH4.js +1 -0
- package/dist/chunks/chunk-TGIEMCNA.js +1 -0
- package/dist/chunks/chunk-THATLL5Z.js +230 -0
- package/dist/chunks/chunk-TOY67YUY.js +153 -0
- package/dist/chunks/chunk-TOY67YUY.js.LEGAL.txt +4 -0
- package/dist/chunks/chunk-UBWM4USZ.js +1 -0
- package/dist/chunks/chunk-Y6SLVHK3.js +1 -0
- package/dist/chunks/fitment-data-BXI7KQRZ.js +1 -0
- package/dist/chunks/gallery-builds-data-SWA6XKFF.js +1 -0
- package/dist/chunks/headers-VF4VTX37.js +1 -0
- package/dist/chunks/render-client-UQ5CUPRL.js +1 -0
- package/dist/contract.d.ts +48 -0
- package/dist/contract.js +1 -0
- package/dist/editor.css +1 -0
- package/dist/index.d.ts +721 -0
- package/dist/index.js +11361 -0
- package/dist/links.d.ts +86 -0
- package/dist/links.js +1 -0
- package/package.json +54 -3
package/dist/links.d.ts
ADDED
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The public types of `efficient-storefront-blocks/links` (published as dist/links.d.ts).
|
|
3
|
+
*
|
|
4
|
+
* Written out, like `contract.public.d.ts`, and kept honest the same way:
|
|
5
|
+
* `types.check.ts` pairs each declaration with the code it describes.
|
|
6
|
+
*
|
|
7
|
+
* This entry is plain data and pure functions. It imports nothing, so a host
|
|
8
|
+
* can load it beside its own UI without the editor.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
/** What a link is. */
|
|
12
|
+
export type LinkKind = "page" | "anchor" | "blog" | "product" | "custom";
|
|
13
|
+
|
|
14
|
+
/** The kinds, in menu order. `needs` names the block set a kind's targets come
|
|
15
|
+
* from; a kind without it is offered everywhere. */
|
|
16
|
+
export const LINK_KINDS: readonly { value: LinkKind; label: string; needs?: "commerce" | "service" }[];
|
|
17
|
+
|
|
18
|
+
/** The kinds a host lists, given whether it offers products and services. */
|
|
19
|
+
export function linkKindsFor(offers: { offersCommerce: boolean; offersService: boolean }): typeof LINK_KINDS;
|
|
20
|
+
|
|
21
|
+
/** A page's path; the Home page (`homepage`) is "/". */
|
|
22
|
+
export function pagePath(slug: string): string;
|
|
23
|
+
/** A blog post's path: `/journal/<slug>`. */
|
|
24
|
+
export function postPath(slug: string): string;
|
|
25
|
+
/** A product's path: `/wheels/<slug>`. */
|
|
26
|
+
export function wheelPath(slug: string): string;
|
|
27
|
+
/** A section anchor on a page: the page's path and `#<hash>`. */
|
|
28
|
+
export function anchorPath(pageSlug: string, hash: string): string;
|
|
29
|
+
/** Anchor name → URL hash id, exactly as the page renders it. */
|
|
30
|
+
export function slugifyAnchor(name: string): string;
|
|
31
|
+
/** The section anchors across a page's documents (published, then draft), in
|
|
32
|
+
* order, each slug once. */
|
|
33
|
+
export function pageAnchors(...docs: unknown[]): { slug: string; name: string }[];
|
|
34
|
+
|
|
35
|
+
/** The built-in listing route every site answers on: "/wheels". */
|
|
36
|
+
export const BUILT_IN_LISTING_PATH: "/wheels";
|
|
37
|
+
/** What the Page list calls the listing page: "Products". */
|
|
38
|
+
export const LISTING_PAGE_LABEL: "Products";
|
|
39
|
+
/** The Page list's name for a listing page; "Products · <page>" when a site has several. */
|
|
40
|
+
export function listingPageLabel(pageTitle: string, listingCount: number): string;
|
|
41
|
+
/** The listing section's props on a page (published document first), or null. */
|
|
42
|
+
export function listingNode(...docs: unknown[]): Record<string, unknown> | null;
|
|
43
|
+
/** Does this page hold the listing? */
|
|
44
|
+
export function isProductListingPage(...docs: unknown[]): boolean;
|
|
45
|
+
/** Every listing page's path; with none and `fallback`, the built-in route. */
|
|
46
|
+
export function productListingPaths(
|
|
47
|
+
pages: readonly { slug: string; docs: readonly unknown[] }[],
|
|
48
|
+
opts: { fallback: boolean },
|
|
49
|
+
): string[];
|
|
50
|
+
|
|
51
|
+
/** Every param a listing link may carry: `type`, then the listing's facets
|
|
52
|
+
* except tyre size. */
|
|
53
|
+
export const LISTING_FILTER_PARAMS: readonly string[];
|
|
54
|
+
/** One filter on a listing link, or none. */
|
|
55
|
+
export type ListingFilter = { param: string; value: string } | null;
|
|
56
|
+
/** The filter a saved link opens the listing on (the type first), or null. */
|
|
57
|
+
export function readListingFilter(url: string): ListingFilter;
|
|
58
|
+
/** Write or clear the filter: every listing param cleared first, the rest kept,
|
|
59
|
+
* a space written as `%20`. */
|
|
60
|
+
export function withListingFilter(url: string, filter: ListingFilter): string;
|
|
61
|
+
/** The listing page a link points at with its filter off — only when that is a
|
|
62
|
+
* listing page; any other link comes back as it is. */
|
|
63
|
+
export function listingTarget(url: string, listingPaths: readonly string[]): string;
|
|
64
|
+
|
|
65
|
+
/** A saved URL → its kind. A listing link with its filter reads as a Page. */
|
|
66
|
+
export function inferLinkKind(url: string, pagePaths: readonly string[], listingPaths?: readonly string[]): LinkKind;
|
|
67
|
+
|
|
68
|
+
/** May this typed address be saved? `/…`, `#…`, http(s), mailto: or tel:. */
|
|
69
|
+
export function isSafeLink(url: string): boolean;
|
|
70
|
+
|
|
71
|
+
/** The Filter list's name for the product type: "Product type". */
|
|
72
|
+
export const PRODUCT_TYPE_FILTER_LABEL: "Product type";
|
|
73
|
+
export type LinkFilterValue = { value: string; label: string };
|
|
74
|
+
export type LinkFilterField = { param: string; label: string; values: LinkFilterValue[] };
|
|
75
|
+
/** One Product Types answer, as much as the filter list reads. */
|
|
76
|
+
export type LinkFieldUsage = {
|
|
77
|
+
kind?: string;
|
|
78
|
+
fieldKey: string;
|
|
79
|
+
filter?: boolean;
|
|
80
|
+
filterOrder?: number | null;
|
|
81
|
+
};
|
|
82
|
+
/** The filters a listing link may offer, with the values this catalogue has. */
|
|
83
|
+
export function listingFilterFields(
|
|
84
|
+
catalogue: readonly unknown[],
|
|
85
|
+
opts: { listing: Record<string, unknown> | null; fieldUsage: readonly LinkFieldUsage[] },
|
|
86
|
+
): LinkFilterField[];
|
package/dist/links.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
var O=["width","profile","rim"];var xe=/^\s*(\d{2,3})\s*\/\s*(\d{2,3})\s*[A-Za-z]*\s*(\d{2}(?:\.\d+)?)\s*$/,we={width:[100,500],profile:[20,100],rim:[10,30]};function T(e){let n=xe.exec(e??"");if(!n)return null;let t={width:Number(n[1]),profile:Number(n[2]),rim:Number(n[3])};return O.every(o=>{let[l,u]=we[o];return t[o]>=l&&t[o]<=u})?t:null}function S(e){if(e.width==null)return"";if(e.profile==null)return String(e.width);let n=`${e.width}/${e.profile}`;return e.rim==null?n:`${n} R${e.rim}`}function z(e){return[S({width:e.width}),S({width:e.width,profile:e.profile}),S(e)]}var y=["alloy-wheel","tyre"],D=["alloy-wheel"],b={"alloy-wheel":"Alloy wheels",tyre:"Tyres"};var qe=y.map(e=>({value:e,label:b[e]}));function F(e){return e==null?[...D]:Array.isArray(e)?y.filter(n=>e.includes(n)):[...D]}var d=e=>e;function c(e){return d(e).kind==="tyre"?"tyre":"alloy-wheel"}function L(e){return d(e).brand??""}function U(e){return d(e).prices??void 0}function M(e){return d(e).inStock!==!1}function v(e){let n=d(e),t=c(e)==="tyre"?n.rimDiameters:n.sizes;return Array.isArray(t)?t.filter(r=>typeof r=="number"&&Number.isFinite(r)):[]}function _(e){return c(e)==="tyre"?[]:(d(e).finishes??[]).filter(n=>typeof n?.family=="string").map(n=>({family:n.family,color:n.color??null}))}function B(e){return _(e).map(n=>n.family)}function W(e){if(c(e)==="tyre")return[];let n=d(e),t=n.categories;return t&&t.length>0?t:n.process?[n.process]:[]}function $(e){return c(e)==="tyre"?[]:d(e).spec?.pcds??[]}function Y(e){return c(e)!=="tyre"?[]:d(e).tyreTypes??[]}function G(e){return c(e)!=="tyre"?[]:d(e).speedRatings??[]}function H(e){if(c(e)!=="tyre")return[];let n=d(e).sizes;return Array.isArray(n)?n.map(t=>T(typeof t=="string"?t:null)).filter(t=>t!==null):[]}var q="homepage";function j(e){return(e??"").toLowerCase().replace(/[^a-z0-9]+/g,"-").replace(/^-+|-+$/g,"")}var x=[{value:"page",label:"Page"},{value:"anchor",label:"Anchor"},{value:"blog",label:"Blog post",needs:"service"},{value:"product",label:"Product",needs:"commerce"},{value:"custom",label:"Custom URL"}];function V(e){return e.offersCommerce&&e.offersService?x:x.filter(n=>!n.needs||(n.needs==="commerce"?e.offersCommerce:e.offersService))}function P(e){return e===q?"/":`/${e}`}function Z(e){return`/journal/${e}`}function X(e){return`/wheels/${e}`}function Q(e,n){return`${P(e)}#${n}`}function A(e){return j(e)}function Te(e){return typeof e=="string"?e.trim():e&&typeof e=="object"&&typeof e.text=="string"?e.text.trim():""}function J(...e){let n=new Set,t=[];for(let r of e)for(let o of r?.content??[]){let l=Te(o?.props?.anchor);if(!l)continue;let u=A(l);!u||n.has(u)||(n.add(u),t.push({slug:u,name:l}))}return t}var Fe=["http","https","mailto","tel"];function ee(e){let n=e.trim();if(!n||/\s/.test(n))return!1;let t=/^([a-z][a-z0-9+.-]*):/i.exec(n);return!t||Fe.includes(t[1].toLowerCase())}function k(e,n){return e.length===0?e:e.filter(t=>t.kind===void 0||t.kind===n)}function ne(e,n){let t=n==="filter"?"filterOrder":"cardOrder",r=new Map;for(let o of e){let l=o[t];if(typeof l!="number"||!Number.isFinite(l))continue;let u=r.get(o.fieldKey);(u===void 0||l<u)&&r.set(o.fieldKey,l)}return o=>o?r.get(o):void 0}function te(e,n,t,r){let o=new Map;for(let s of t){let i=s[r];typeof i=="number"&&o.set(s.fieldKey,i)}if(o.size===0)return e;let l=[],u=[];e.forEach((s,i)=>{let m=n(s);m&&(l.push(i),u.push({item:s,index:i,order:o.get(m)}))}),u.sort((s,i)=>s.order!==void 0&&i.order!==void 0?s.order-i.order||s.index-i.index:s.order!==void 0?-1:i.order!==void 0?1:s.index-i.index);let p=[...e];return l.forEach((s,i)=>{p[s]=u[i].item}),p.every((s,i)=>s===e[i])?e:p}function re(e){return _e(e,"filter")}var Le="collection";function I(e,n){return{tyreSizes:{},brands:{"alloy-wheel":"brand",tyre:"brand"},finishes:{"alloy-wheel":"wheel_finish_ref"},diameters:{"alloy-wheel":"diameter",tyre:"rim_diameter"},collections:{"alloy-wheel":Le},pcds:{"alloy-wheel":"pcd"},tyreTypes:{tyre:"tire_type"},speedRatings:{tyre:"speed_rating"}}[e]?.[n]}function _e(e,n){let t=new Set(e.filter(r=>r[n]===!1).map(r=>r.fieldKey));return r=>!r||!t.has(r)}function Ae(e){return typeof e=="number"&&Number.isFinite(e)&&e>0}function ie(e,n){let t=e?.[n];return Ae(t)?t:null}function oe(e,n,t,r){if(t==null&&r==null)return!0;let o=ie(e,n);return!(o===null||t!=null&&o<t||r!=null&&o>r)}var ke={recommended:"Recommended","price-asc":"Price \xB7 low to high","price-desc":"Price \xB7 high to low",new:"Newest",name:"Name A\u2013Z"},Tn=Object.keys(ke);var se=["tyreSizes","brands","finishes","diameters","collections","pcds","tyreTypes","speedRatings"],Ie={tyreSizes:["tyre"],brands:["alloy-wheel","tyre"],finishes:["alloy-wheel"],diameters:["alloy-wheel","tyre"],collections:["alloy-wheel"],pcds:["alloy-wheel"],tyreTypes:["tyre"],speedRatings:["tyre"]},Ke={diameters:"tyreSizes"};function Re(e){if(e.length===0)return[];let n=se.filter(t=>e.every(r=>Ie[t].includes(r)));return n.filter(t=>{let r=Ke[t];return!r||!n.includes(r)})}function Ee(e){let n=new Set;for(let t of e)n.add(c(t));return[...n]}var le={tyreSizes:[],brands:[],finishes:[],diameters:[],collections:[],pcds:[],tyreTypes:[],speedRatings:[],priceMax:null,inStockOnly:!1,kind:null,sort:"recommended",page:1};function Ce(e,n,t,r=null){if(r!=="kind"&&n.kind&&c(e)!==n.kind)return!1;for(let o of se){if(r===o)continue;let l=n[o];if(l.length===0)continue;let u=l.map(String);if(!ue(e,o).some(p=>u.includes(p)))return!1}return!(r!=="price"&&!oe(U(e),t,null,n.priceMax)||r!=="inStock"&&n.inStockOnly&&!M(e))}var Ne={tyreSizes:"Size",brands:"Brand",finishes:"Colour",diameters:"Size \xB7 diameter",collections:"Collection",pcds:"PCD \xB7 fitment",tyreTypes:"Tyre type",speedRatings:"Speed rating"};function ue(e,n){switch(n){case"tyreSizes":return[...new Set(H(e).flatMap(z))];case"brands":return L(e)?[L(e)]:[];case"finishes":return B(e);case"diameters":return v(e).map(String);case"collections":return W(e);case"pcds":return $(e);case"tyreTypes":return Y(e);case"speedRatings":return G(e)}}function Oe(e){let n=new Map;for(let t of e)for(let r of _(t))r.color&&!n.has(r.family)&&n.set(r.family,r.color);return n}function ae(e,n,t,r=Ee(e),o=[]){let l=i=>De(i,r,o),u=Oe(e),p=Re(r).filter(i=>i!=="tyreSizes").filter(l).map(i=>{let m=n[i].map(String),N=new Set,w=new Map,h=new Map;for(let a of e){let g=ue(a,i);for(let f of g)N.add(f);for(let f of new Set(g))h.set(f,(h.get(f)??0)+1);if(Ce(a,n,t,i))for(let f of new Set(g))w.set(f,(w.get(f)??0)+1)}let be=[...N].map(a=>({value:a,label:i==="diameters"?`${a}\u2033`:a,count:w.get(a)??0,checked:m.includes(a),swatch:i==="finishes"?u.get(a)??null:null})).sort((a,g)=>{if(i==="diameters")return Number(a.value)-Number(g.value);let f=(h.get(g.value)??0)-(h.get(a.value)??0);return f!==0?f:a.value.localeCompare(g.value)});return{key:i,label:Ne[i],options:be}}).filter(i=>i.options.length>ze),s=[];for(let i of p){let m=Ue(i.key,r,o);m!==void 0&&s.push({fieldKey:i.key,filterOrder:m})}return[...te(p,i=>i.key,s,"filterOrder")]}var ze=1;function ce(e){return e.showCollection===!1?["collections"]:[]}function De(e,n,t){return n.length===0||t.length===0?!0:n.some(r=>re(k(t,r))(I(e,r)))}function Ue(e,n,t){if(t.length===0)return;let r;for(let o of n){let l=ne(k(t,o),"filter")(I(e,o));l!==void 0&&(r===void 0||l<r)&&(r=l)}return r}var K={tyreSizes:"tyreSize",brands:"brand",finishes:"colour",diameters:"size",collections:"collection",pcds:"pcd",tyreTypes:"tyreType",speedRatings:"speed"},R="type";var pe="AlloyWheelsListing";var de="/wheels",E="Products";function Me(e,n){return n>1?`${E} \xB7 ${e}`:E}function fe(...e){for(let n of e){let t=(n?.content??[]).find(r=>r?.type===pe);if(t)return t.props??{}}return null}function me(...e){return fe(...e)!==null}function ve(e,n){let t=e.filter(r=>me(...r.docs)).map(r=>P(r.slug));return t.length===0&&n.fallback?[de]:t}var C=[R,...Object.entries(K).filter(([e])=>e!=="tyreSizes").map(([,e])=>e)];function ge(e){let n=e.indexOf("#"),t=n===-1?"":e.slice(n),r=n===-1?e:e.slice(0,n),o=r.indexOf("?");return{path:o===-1?r:r.slice(0,o),query:o===-1?"":r.slice(o+1),hash:t}}function Be(e){try{return decodeURIComponent(e.replace(/\+/g," "))}catch{return e}}function We(e){let n=new URLSearchParams(ge(e).query);for(let t of C){let r=n.get(t);if(r)return{param:t,value:r}}return null}function ye(e,n){let{path:t,query:r,hash:o}=ge(e),l=r.split("&").filter(u=>u&&!C.includes(Be(u.split("=")[0])));return n?.value&&l.push(`${encodeURIComponent(n.param)}=${encodeURIComponent(n.value)}`),`${t}${l.length?`?${l.join("&")}`:""}${o}`}function Pe(e,n){let t=ye(e,null);return n.includes(t)?t:e}function $e(e,n,t=[]){if(!e)return"page";if(e.startsWith("/journal/"))return"blog";if(e.startsWith("/wheels/"))return"product";if(e.includes("#")){let r=e.slice(0,e.indexOf("#"));if(r===""||r==="/"||n.includes(r))return"anchor"}return e==="/"||n.includes(e)||t.includes(Pe(e,t))?"page":"custom"}var he="Product type",Ye="AUD";function Se(e,n){let t=n.listing??{},r=F(t.kinds),o=e.filter(s=>r.includes(c(s))),l=ce(t),u=ae(o,le,Ye,r,n.fieldUsage).filter(s=>!l.includes(s.key)).map(s=>({param:K[s.key],label:s.label,values:s.options.filter(i=>!i.value.includes(",")).map(i=>({value:i.value,label:i.label}))})).filter(s=>s.values.length>0),p=y.filter(s=>r.includes(s)&&o.some(i=>c(i)===s));return p.length>1&&u.unshift({param:R,label:he,values:p.map(s=>({value:s,label:b[s]}))}),u}function Dn(e,n){return Se(e,n)}export{de as BUILT_IN_LISTING_PATH,x as LINK_KINDS,C as LISTING_FILTER_PARAMS,E as LISTING_PAGE_LABEL,he as PRODUCT_TYPE_FILTER_LABEL,Q as anchorPath,$e as inferLinkKind,me as isProductListingPage,ee as isSafeLink,V as linkKindsFor,Dn as listingFilterFields,fe as listingNode,Me as listingPageLabel,Pe as listingTarget,J as pageAnchors,P as pagePath,Z as postPath,ve as productListingPaths,We as readListingFilter,A as slugifyAnchor,X as wheelPath,ye as withListingFilter};
|
package/package.json
CHANGED
|
@@ -1,8 +1,59 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "efficient-storefront-blocks",
|
|
3
|
-
"version": "0.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "0.11.0",
|
|
4
|
+
"description": "The EFFICIENT storefront's website editor — the website builder assembled with the storefront's own sections — for an app that edits a storefront website inside its own page. Built from the efficient-storefront repository's own source.",
|
|
5
5
|
"license": "UNLICENSED",
|
|
6
6
|
"author": "Efficient Pty Ltd",
|
|
7
|
-
"
|
|
7
|
+
"repository": {
|
|
8
|
+
"type": "git",
|
|
9
|
+
"url": "git+https://github.com/Efficient-Pty-Ltd/efficient-storefront.git",
|
|
10
|
+
"directory": "packages/website"
|
|
11
|
+
},
|
|
12
|
+
"publishConfig": {
|
|
13
|
+
"access": "public"
|
|
14
|
+
},
|
|
15
|
+
"type": "module",
|
|
16
|
+
"sideEffects": [
|
|
17
|
+
"**/*.css"
|
|
18
|
+
],
|
|
19
|
+
"exports": {
|
|
20
|
+
".": {
|
|
21
|
+
"types": "./dist/index.d.ts",
|
|
22
|
+
"import": "./dist/index.js",
|
|
23
|
+
"default": "./dist/index.js"
|
|
24
|
+
},
|
|
25
|
+
"./contract": {
|
|
26
|
+
"types": "./dist/contract.d.ts",
|
|
27
|
+
"import": "./dist/contract.js",
|
|
28
|
+
"default": "./dist/contract.js"
|
|
29
|
+
},
|
|
30
|
+
"./links": {
|
|
31
|
+
"types": "./dist/links.d.ts",
|
|
32
|
+
"import": "./dist/links.js",
|
|
33
|
+
"default": "./dist/links.js"
|
|
34
|
+
},
|
|
35
|
+
"./editor.css": "./dist/editor.css"
|
|
36
|
+
},
|
|
37
|
+
"files": [
|
|
38
|
+
"dist/index.js",
|
|
39
|
+
"dist/index.d.ts",
|
|
40
|
+
"dist/contract.js",
|
|
41
|
+
"dist/contract.d.ts",
|
|
42
|
+
"dist/links.js",
|
|
43
|
+
"dist/links.d.ts",
|
|
44
|
+
"dist/editor.css",
|
|
45
|
+
"dist/chunks",
|
|
46
|
+
"README.md",
|
|
47
|
+
"CHANGELOG.md",
|
|
48
|
+
"LICENSE"
|
|
49
|
+
],
|
|
50
|
+
"peerDependencies": {
|
|
51
|
+
"efficient-easel": "^0.101.0",
|
|
52
|
+
"efficient-shell": "^4.131.0",
|
|
53
|
+
"react": ">=19",
|
|
54
|
+
"react-dom": ">=19"
|
|
55
|
+
},
|
|
56
|
+
"scripts": {
|
|
57
|
+
"build": "node build.mjs && cp src/public.d.ts dist/index.d.ts"
|
|
58
|
+
}
|
|
8
59
|
}
|