@sps-woodland/core 8.53.6 → 8.53.8
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/lib/action-bar/action-bar/ActionBar.ve.js +1 -1
- package/lib/action-bar/index.js +1 -1
- package/lib/action-bar/index.umd.cjs +1 -1
- package/lib/action-bar/style.css +1 -1
- package/lib/add-to-list/add-to-list/AddToList.ve.js +1 -1
- package/lib/add-to-list/index.js +1 -1
- package/lib/add-to-list/index.umd.cjs +1 -1
- package/lib/add-to-list/style.css +1 -1
- package/lib/buttons/button/Button.css.d.ts.map +1 -1
- package/lib/buttons/button/Button.ve.js +1 -1
- package/lib/buttons/index.js +1 -1
- package/lib/buttons/index.umd.cjs +1 -1
- package/lib/buttons/style.css +1 -1
- package/lib/cards/card/Card.ve.js +1 -1
- package/lib/cards/card-footer/CardFooter.ve.js +1 -1
- package/lib/cards/card-header/CardHeader.ve.js +1 -1
- package/lib/cards/card-title/CardTitle.ve.js +1 -1
- package/lib/cards/index.js +4 -4
- package/lib/cards/index.umd.cjs +1 -1
- package/lib/cards/style.css +1 -1
- package/lib/content-row/content-row/ContentRow.ve.js +1 -1
- package/lib/content-row/content-row-col/ContentRowCol.ve.js +1 -1
- package/lib/content-row/index.js +3 -3
- package/lib/content-row/index.umd.cjs +1 -1
- package/lib/content-row/row-list-auto-layout/RowListAutoLayout.ve.js +1 -1
- package/lib/content-row/style.css +1 -1
- package/lib/content-tiles/content-tile/ContentTile.ve.js +1 -1
- package/lib/content-tiles/content-tile-list/ContentTileList.ve.js +1 -1
- package/lib/content-tiles/index.js +2 -2
- package/lib/content-tiles/index.umd.cjs +1 -1
- package/lib/content-tiles/style.css +1 -1
- package/lib/core.css +1 -1
- package/lib/dropdowns/dropdown/Dropdown.ve.js +1 -1
- package/lib/dropdowns/index.js +3 -3
- package/lib/dropdowns/index.umd.cjs +1 -1
- package/lib/dropdowns/option-list/Option.ve.js +1 -1
- package/lib/dropdowns/option-list/OptionList.ve.js +1 -1
- package/lib/dropdowns/style.css +1 -1
- package/lib/feedback-block/FeedbackBlock.ve.js +1 -1
- package/lib/feedback-block/index.js +1 -1
- package/lib/feedback-block/index.umd.cjs +1 -1
- package/lib/feedback-block/style.css +1 -1
- package/lib/file-upload/file-upload/FileUpload.ve.js +1 -1
- package/lib/file-upload/index.js +1 -1
- package/lib/file-upload/index.umd.cjs +1 -1
- package/lib/file-upload/style.css +1 -1
- package/lib/filter-tiles/filter-tile/FilterTile.ve.js +1 -1
- package/lib/filter-tiles/filter-tile-set/FilterTileSet.ve.js +1 -1
- package/lib/filter-tiles/index.js +2 -2
- package/lib/filter-tiles/index.umd.cjs +1 -1
- package/lib/filter-tiles/style.css +1 -1
- package/lib/focused-task/focused-task/FocusedTask.ve.js +1 -1
- package/lib/focused-task/index.js +1 -1
- package/lib/focused-task/index.umd.cjs +1 -1
- package/lib/focused-task/style.css +1 -1
- package/lib/growler/Growler.ve.js +1 -1
- package/lib/growler/Sonner.ve.js +1 -1
- package/lib/growler/index.js +2 -2
- package/lib/growler/index.umd.cjs +1 -1
- package/lib/growler/style.css +1 -1
- package/lib/index.js +36 -38
- package/lib/index.umd.cjs +4 -4
- package/lib/insight-card/InsightCard.ve.js +1 -1
- package/lib/insight-card/index.js +1 -1
- package/lib/insight-card/index.umd.cjs +1 -1
- package/lib/insight-card/style.css +1 -1
- package/lib/key-value-set/index.js +2 -2
- package/lib/key-value-set/index.umd.cjs +1 -1
- package/lib/key-value-set/key-value-set/KeyValueSet.ve.js +1 -1
- package/lib/key-value-set/key-value-set-item/KeyValueSetItem.ve.js +1 -1
- package/lib/key-value-set/style.css +1 -1
- package/lib/list-bar/advanced-search/AdvancedSearch.ve.js +1 -1
- package/lib/list-bar/index.js +3 -3
- package/lib/list-bar/index.umd.cjs +1 -1
- package/lib/list-bar/list-bar/ListBar.ve.js +1 -1
- package/lib/list-bar/search-results-bar/SearchResultsBar.ve.js +1 -1
- package/lib/list-bar/style.css +1 -1
- package/lib/matrix/index.js +1 -1
- package/lib/matrix/index.umd.cjs +1 -1
- package/lib/matrix/matrix/Matrix.ve.js +1 -1
- package/lib/matrix/style.css +1 -1
- package/lib/modal/index.js +1 -1
- package/lib/modal/index.umd.cjs +1 -1
- package/lib/modal/modal/Modal.ve.js +1 -1
- package/lib/modal/style.css +1 -1
- package/lib/page-title/index.js +2 -2
- package/lib/page-title/index.umd.cjs +1 -1
- package/lib/page-title/page-subtitle/PageSubtitle.ve.js +1 -1
- package/lib/page-title/page-title/PageTitle.ve.js +1 -1
- package/lib/page-title/style.css +1 -1
- package/lib/photo/index.js +2 -2
- package/lib/photo/index.umd.cjs +1 -1
- package/lib/photo/photo/Photo.ve.js +1 -1
- package/lib/photo/photo-carousel/PhotoCarousel.ve.js +1 -1
- package/lib/photo/style.css +1 -1
- package/lib/product-bar/index.js +3 -3
- package/lib/product-bar/index.umd.cjs +1 -1
- package/lib/product-bar/product-bar/ProductBar.ve.js +1 -1
- package/lib/product-bar/product-bar-overflow-menu/ProductBarOverflowMenu.ve.js +1 -1
- package/lib/product-bar/slack-link/SlackLink.ve.js +1 -1
- package/lib/product-bar/style.css +1 -1
- package/lib/product-bar-vertical/index.js +1 -1
- package/lib/product-bar-vertical/index.umd.cjs +1 -1
- package/lib/product-bar-vertical/product-bar-vertical/ProductBarVertical.ve.js +1 -1
- package/lib/product-bar-vertical/style.css +1 -1
- package/lib/progress-indicators/index.js +1 -1
- package/lib/progress-indicators/index.umd.cjs +1 -1
- package/lib/progress-indicators/progress-bar/ProgressBar.ve.js +1 -1
- package/lib/progress-indicators/progress-bar/progress-bar-step/ProgressBarStep.ve.js +1 -1
- package/lib/progress-indicators/style.css +1 -1
- package/lib/rich-text-editor/index.js +2 -2
- package/lib/rich-text-editor/index.umd.cjs +1 -1
- package/lib/rich-text-editor/rich-text-editor/RTEToolbarButton.ve.js +1 -1
- package/lib/rich-text-editor/rich-text-editor/RichTextEditor.ve.js +1 -1
- package/lib/rich-text-editor/style.css +1 -1
- package/lib/scrollable-container/ScrollableContainer.ve.js +1 -1
- package/lib/scrollable-container/index.js +1 -1
- package/lib/scrollable-container/index.umd.cjs +1 -1
- package/lib/scrollable-container/style.css +1 -1
- package/lib/side-nav/index.js +1 -1
- package/lib/side-nav/index.umd.cjs +1 -1
- package/lib/side-nav/side-nav/SideNav.ve.js +1 -1
- package/lib/side-nav/style.css +1 -1
- package/lib/sorting-header/caret/caret.ve.js +1 -1
- package/lib/sorting-header/index.js +2 -2
- package/lib/sorting-header/index.umd.cjs +1 -1
- package/lib/sorting-header/sorting-header/SortingHeader.ve.js +1 -1
- package/lib/sorting-header/sorting-header-cell/SortingHeaderCell.ve.js +1 -1
- package/lib/sorting-header/style.css +1 -1
- package/lib/style.css +1 -1
- package/lib/tabs/index.js +2 -2
- package/lib/tabs/index.umd.cjs +1 -1
- package/lib/tabs/style.css +1 -1
- package/lib/tabs/tab/Tab.ve.js +1 -1
- package/lib/tabs/tabs/Tabs.ve.js +1 -1
- package/lib/tags/clickable-tag/ClickableTag.ve.js +1 -1
- package/lib/tags/index.js +3 -3
- package/lib/tags/index.umd.cjs +1 -1
- package/lib/tags/split-tag/SplitTag.ve.js +1 -1
- package/lib/tags/style.css +1 -1
- package/lib/tags/tag/Tag.ve.js +1 -1
- package/lib/zero-state/ZeroState.ve.js +1 -1
- package/lib/zero-state/index.js +1 -1
- package/lib/zero-state/index.umd.cjs +1 -1
- package/lib/zero-state/style.css +1 -1
- package/package.json +11 -11
- package/scripts/watch-all.mjs +186 -0
- package/vite.action-bar.config.mjs +31 -28
- package/vite.add-to-list.config.mjs +31 -28
- package/vite.buttons.config.mjs +32 -29
- package/vite.cards.config.mjs +31 -28
- package/vite.config.mjs +26 -25
- package/vite.content-row.config.mjs +31 -28
- package/vite.content-tiles.config.mjs +31 -28
- package/vite.dropdowns.config.mjs +32 -29
- package/vite.editable-table.config.mjs +44 -41
- package/vite.feedback-block.config.mjs +31 -28
- package/vite.file-upload.config.mjs +31 -28
- package/vite.filter-tiles.config.mjs +31 -28
- package/vite.focused-task.config.mjs +31 -28
- package/vite.growler.config.mjs +32 -29
- package/vite.insight-card.config.mjs +31 -28
- package/vite.key-value-set.config.mjs +31 -28
- package/vite.list-bar.config.mjs +31 -28
- package/vite.matrix.config.mjs +31 -28
- package/vite.modal.config.mjs +31 -28
- package/vite.page-title.config.mjs +31 -28
- package/vite.photo.config.mjs +31 -28
- package/vite.product-bar-vertical.config.mjs +31 -28
- package/vite.product-bar.config.mjs +33 -30
- package/vite.progress-indicators.config.mjs +31 -28
- package/vite.rich-text-editor.config.mjs +35 -32
- package/vite.scrollable-container.config.mjs +31 -28
- package/vite.side-nav.config.mjs +31 -28
- package/vite.sorting-header.config.mjs +31 -28
- package/vite.subpaths.config.mjs +57 -54
- package/vite.tabs.config.mjs +34 -31
- package/vite.tags.config.mjs +31 -28
- package/vite.zero-state.config.mjs +31 -28
package/lib/zero-state/index.js
CHANGED
|
@@ -54,7 +54,7 @@ var y = (e, a, t) => {
|
|
|
54
54
|
for (var [p, m] of e.compoundVariants)
|
|
55
55
|
y(p, r, e.defaultVariants) && (t += " " + m);
|
|
56
56
|
return t;
|
|
57
|
-
}, b = i({ defaultClassName: "pkg_sps-
|
|
57
|
+
}, b = i({ defaultClassName: "pkg_sps-woodland_core__version_8_53_8__hash_sa7luu0", variantClassNames: { micro: { true: "pkg_sps-woodland_core__version_8_53_8__hash_sa7luu1", false: "pkg_sps-woodland_core__version_8_53_8__hash_sa7luu2" } }, defaultVariants: {}, compoundVariants: [] }), N = i({ defaultClassName: "pkg_sps-woodland_core__version_8_53_8__hash_sa7luu3", variantClassNames: { micro: { true: "pkg_sps-woodland_core__version_8_53_8__hash_sa7luu4", false: "pkg_sps-woodland_core__version_8_53_8__hash_sa7luu5" } }, defaultVariants: { micro: !1 }, compoundVariants: [] }), S = "pkg_sps-woodland_core__version_8_53_8__hash_sa7luu6", E = i({ defaultClassName: "pkg_sps-woodland_core__version_8_53_8__hash_sa7luu7", variantClassNames: { micro: { true: "pkg_sps-woodland_core__version_8_53_8__hash_sa7luu8", false: "pkg_sps-woodland_core__version_8_53_8__hash_sa7luu9" } }, defaultVariants: { micro: !1 }, compoundVariants: [] }), P = "pkg_sps-woodland_core__version_8_53_8__hash_sa7luua", V = "pkg_sps-woodland_core__version_8_53_8__hash_sa7luub", j = "pkg_sps-woodland_core__version_8_53_8__hash_sa7luuc";
|
|
58
58
|
function k({
|
|
59
59
|
artwork: e,
|
|
60
60
|
heading: a,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
(function(o,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("react"),require("@sps-woodland/core"),require("@sps-woodland/illustrations")):typeof define=="function"&&define.amd?define(["exports","react","@sps-woodland/core","@sps-woodland/illustrations"],l):(o=typeof globalThis<"u"?globalThis:o||self,l(o.ZeroState={},o.
|
|
1
|
+
(function(o,l){typeof exports=="object"&&typeof module<"u"?l(exports,require("react"),require("@sps-woodland/core"),require("@sps-woodland/illustrations")):typeof define=="function"&&define.amd?define(["exports","react","@sps-woodland/core","@sps-woodland/illustrations"],l):(o=typeof globalThis<"u"?globalThis:o||self,l(o.ZeroState={},o.react,o.spsWoodlandCore,o.spsWoodlandIllustrations))})(this,(function(o,l,u,g){"use strict";function O(e){const a=Object.create(null,{[Symbol.toStringTag]:{value:"Module"}});if(e){for(const r in e)if(r!=="default"){const t=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(a,r,t.get?t:{enumerable:!0,get:()=>e[r]})}}return a.default=e,Object.freeze(a)}const n=O(l);function w(e,a,r){return a in e?Object.defineProperty(e,a,{value:r,enumerable:!0,configurable:!0,writable:!0}):e[a]=r,e}function m(e,a){var r=Object.keys(e);if(Object.getOwnPropertySymbols){var t=Object.getOwnPropertySymbols(e);a&&(t=t.filter(function(s){return Object.getOwnPropertyDescriptor(e,s).enumerable})),r.push.apply(r,t)}return r}function v(e){for(var a=1;a<arguments.length;a++){var r=arguments[a]!=null?arguments[a]:{};a%2?m(Object(r),!0).forEach(function(t){w(e,t,r[t])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(r)):m(Object(r)).forEach(function(t){Object.defineProperty(e,t,Object.getOwnPropertyDescriptor(r,t))})}return e}var y=(e,a,r)=>{for(var t of Object.keys(e)){var s;if(e[t]!==((s=a[t])!==null&&s!==void 0?s:r[t]))return!1}return!0},f=e=>a=>{var r=e.defaultClassName,t=v(v({},e.defaultVariants),a);for(var s in t){var i,d=(i=t[s])!==null&&i!==void 0?i:e.defaultVariants[s];if(d!=null){var _=d;typeof _=="boolean"&&(_=_===!0?"true":"false");var p=e.variantClassNames[s][_];p&&(r+=" "+p)}}for(var[c,k]of e.compoundVariants)y(c,t,e.defaultVariants)&&(r+=" "+k);return r},b=f({defaultClassName:"pkg_sps-woodland_core__version_8_53_8__hash_sa7luu0",variantClassNames:{micro:{true:"pkg_sps-woodland_core__version_8_53_8__hash_sa7luu1",false:"pkg_sps-woodland_core__version_8_53_8__hash_sa7luu2"}},defaultVariants:{},compoundVariants:[]}),S=f({defaultClassName:"pkg_sps-woodland_core__version_8_53_8__hash_sa7luu3",variantClassNames:{micro:{true:"pkg_sps-woodland_core__version_8_53_8__hash_sa7luu4",false:"pkg_sps-woodland_core__version_8_53_8__hash_sa7luu5"}},defaultVariants:{micro:!1},compoundVariants:[]}),j="pkg_sps-woodland_core__version_8_53_8__hash_sa7luu6",N=f({defaultClassName:"pkg_sps-woodland_core__version_8_53_8__hash_sa7luu7",variantClassNames:{micro:{true:"pkg_sps-woodland_core__version_8_53_8__hash_sa7luu8",false:"pkg_sps-woodland_core__version_8_53_8__hash_sa7luu9"}},defaultVariants:{micro:!1},compoundVariants:[]}),P="pkg_sps-woodland_core__version_8_53_8__hash_sa7luua",E="pkg_sps-woodland_core__version_8_53_8__hash_sa7luub",V="pkg_sps-woodland_core__version_8_53_8__hash_sa7luuc";function h({artwork:e,heading:a,illustration:r,subHeading:t,micro:s=!1,children:i,className:d,icon:_,...p}){const c=r||e||g.BUILDING_LARGE;return n.createElement("div",{className:b({micro:s})},n.createElement("div",{className:u.cl(S({micro:s}),d),...p},s?n.createElement(n.Fragment,null,_?n.createElement(u.Icon,{className:V,icon:_,"aria-hidden":"true"}):n.createElement("img",{style:{height:"3rem"},src:c})):n.createElement("img",{className:j,src:c,alt:""}),a&&(typeof a=="string"?n.createElement("h1",{className:N({micro:s})},a):u.contentOf(a)),t&&(typeof t=="string"?n.createElement("h2",{className:P},t):u.contentOf(t)),n.createElement("div",{className:E},i)))}u.Metadata.set(h,{name:"ZeroState",props:{artwork:{type:"string"},heading:{type:"string | ReactNodeOrRenderFn"},illustration:{type:"string"},subHeading:{type:"string | ReactNodeOrRenderFn"},micro:{type:"boolean",default:"false"}}}),o.ZeroState=h,Object.defineProperty(o,Symbol.toStringTag,{value:"Module"})}));
|
package/lib/zero-state/style.css
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
.pkg_sps-
|
|
1
|
+
.pkg_sps-woodland_core__version_8_53_8__hash_sa7luu2{padding:1rem}.pkg_sps-woodland_core__version_8_53_8__hash_sa7luu3{margin:auto;padding-top:2rem;padding-right:0;padding-bottom:2rem;padding-left:0;text-align:center}.pkg_sps-woodland_core__version_8_53_8__hash_sa7luu4{align-items:center;display:flex;flex-direction:column;height:100%;justify-content:center;width:auto}.pkg_sps-woodland_core__version_8_53_8__hash_sa7luu6{height:6.25rem;margin-bottom:1rem;width:12.5rem}.pkg_sps-woodland_core__version_8_53_8__hash_sa7luu7{margin-bottom:0}.pkg_sps-woodland_core__version_8_53_8__hash_sa7luu8{color:#4b5356;font-size:1rem;font-weight:600;line-height:1.25rem}.pkg_sps-woodland_core__version_8_53_8__hash_sa7luu9{color:#1f282c;font-size:1.5rem;line-height:1.5rem}.pkg_sps-woodland_core__version_8_53_8__hash_sa7luua{color:#4b5356;font-size:.875rem;line-height:1.25rem;margin-top:.25rem;margin-bottom:0}.pkg_sps-woodland_core__version_8_53_8__hash_sa7luub{margin-top:1rem}.pkg_sps-woodland_core__version_8_53_8__hash_sa7luuc{color:#717779;font-size:3rem;line-height:3rem;padding-bottom:.25rem}@media screen and (min-width:768px){.pkg_sps-woodland_core__version_8_53_8__hash_sa7luu3{width:75%}}@media screen and (min-width:992px){.pkg_sps-woodland_core__version_8_53_8__hash_sa7luu3{width:50%}}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sps-woodland/core",
|
|
3
3
|
"description": "SPS Woodland Design System core library code",
|
|
4
|
-
"version": "8.53.
|
|
4
|
+
"version": "8.53.8",
|
|
5
5
|
"author": "SPS Commerce",
|
|
6
6
|
"license": "UNLICENSED",
|
|
7
7
|
"repository": "https://github.com/SPSCommerce/woodland/tree/main/packages/@sps-woodland/core",
|
|
@@ -712,11 +712,11 @@
|
|
|
712
712
|
"@spscommerce/utils": "^7.0.0 || ^8.0.0 || ^9.0.0",
|
|
713
713
|
"react": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
|
|
714
714
|
"react-dom": "^16.14.0 || ^17.0.0 || ^18.0.0 || ^19.0.0",
|
|
715
|
-
"@sps-woodland/illustrations": "8.53.
|
|
716
|
-
"@sps-woodland/tokens": "8.53.
|
|
717
|
-
"@spscommerce/ds-react": "8.53.
|
|
718
|
-
"@spscommerce/ds-shared": "8.53.
|
|
719
|
-
"@spscommerce/i18n": "8.53.
|
|
715
|
+
"@sps-woodland/illustrations": "8.53.8",
|
|
716
|
+
"@sps-woodland/tokens": "8.53.8",
|
|
717
|
+
"@spscommerce/ds-react": "8.53.8",
|
|
718
|
+
"@spscommerce/ds-shared": "8.53.8",
|
|
719
|
+
"@spscommerce/i18n": "8.53.8"
|
|
720
720
|
},
|
|
721
721
|
"devDependencies": {
|
|
722
722
|
"@ariakit/react": "0.4.15",
|
|
@@ -729,10 +729,10 @@
|
|
|
729
729
|
"postcss-import": "^16.1.1",
|
|
730
730
|
"react": "16.14.0",
|
|
731
731
|
"react-dom": "16.14.0",
|
|
732
|
-
"@sps-woodland/illustrations": "8.53.
|
|
733
|
-
"@sps-woodland/tokens": "8.53.
|
|
734
|
-
"@spscommerce/ds-react": "8.53.
|
|
735
|
-
"@spscommerce/ds-shared": "8.53.
|
|
732
|
+
"@sps-woodland/illustrations": "8.53.8",
|
|
733
|
+
"@sps-woodland/tokens": "8.53.8",
|
|
734
|
+
"@spscommerce/ds-react": "8.53.8",
|
|
735
|
+
"@spscommerce/ds-shared": "8.53.8"
|
|
736
736
|
},
|
|
737
737
|
"dependencies": {
|
|
738
738
|
"@handsontable/react": "^15.3.0",
|
|
@@ -796,7 +796,7 @@
|
|
|
796
796
|
"build:tags-css": "vite build --config vite.tags.config.mjs",
|
|
797
797
|
"build:buttons-css": "vite build --config vite.buttons.config.mjs",
|
|
798
798
|
"build:types": "tsc --emitDeclarationOnly --declaration --declarationDir lib",
|
|
799
|
-
"watch": "
|
|
799
|
+
"watch": "node scripts/watch-all.mjs",
|
|
800
800
|
"clean": "git clean -fdX",
|
|
801
801
|
"pub": "node ../../../scripts/publish-package.mjs"
|
|
802
802
|
}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* Watches every vite config that makes up @sps-woodland/core's dev output —
|
|
4
|
+
* the main entry, the subpaths build (@sps-woodland/core/<family>), and each
|
|
5
|
+
* family's dedicated CSS config — in a single Node process.
|
|
6
|
+
*
|
|
7
|
+
* The old `watch` script (`vite build --watch`) only covered the main entry,
|
|
8
|
+
* so editing a component under src/<family> never showed up live in docs:
|
|
9
|
+
* the subpath JS and the family CSS it depends on were never rebuilt.
|
|
10
|
+
* Running each config through Vite's `build()` API here instead of spawning
|
|
11
|
+
* ~30 separate `vite build --watch` CLI processes also avoids paying Node +
|
|
12
|
+
* Vite startup cost 30 times over.
|
|
13
|
+
*
|
|
14
|
+
* The subpaths config (vite.subpaths.config.mjs) builds every family's JS as
|
|
15
|
+
* entries in one shared Rollup graph. In watch mode, Rollup re-emits every
|
|
16
|
+
* output file in that graph on ANY change, not just files touched by the
|
|
17
|
+
* edited entry — so editing Card.tsx rewrites lib/buttons/**, lib/tabs/**,
|
|
18
|
+
* etc. too. If docs' dev server reads one of those unrelated files mid-write,
|
|
19
|
+
* it gets a torn file and errors (this is what showed up as broken
|
|
20
|
+
* icons/fonts after an unrelated edit). To avoid that, we don't watch
|
|
21
|
+
* vite.subpaths.config.mjs as-is; instead we partition its `entry` map by
|
|
22
|
+
* top-level family folder and run one watcher per family, so an edit to one
|
|
23
|
+
* family's source only ever rewrites that family's own output files. This
|
|
24
|
+
* only affects dev watching — `pnpm run build` (CI) still uses the original
|
|
25
|
+
* single-graph config untouched.
|
|
26
|
+
*
|
|
27
|
+
* Per-family partitioning only isolates edits WITHIN core's own source —
|
|
28
|
+
* shared cross-package dependencies (e.g. @sps-woodland/tokens, which many
|
|
29
|
+
* families' .css.ts files pull sprinkles from) still legitimately invalidate
|
|
30
|
+
* several families at once, since vanilla-extract has to evaluate that
|
|
31
|
+
* module at build time to generate CSS. That's correct invalidation, not a
|
|
32
|
+
* bug — but Vite/Rollup writes output files non-atomically (truncate then
|
|
33
|
+
* write), so when several families rewrite their files around the same
|
|
34
|
+
* moment, docs' dev server can catch one mid-write and error.
|
|
35
|
+
*
|
|
36
|
+
* To close that race without fighting Vite's own bundle-shaping logic (an
|
|
37
|
+
* earlier version of this script deleted entries from the `generateBundle`
|
|
38
|
+
* bundle object to write them atomically itself, which silently broke every
|
|
39
|
+
* config's `cssFileName`-based CSS output — Vite's internal handling for
|
|
40
|
+
* that option apparently depends on those entries surviving to a later
|
|
41
|
+
* stage), every watcher here instead builds into a private temp directory
|
|
42
|
+
* that's a sibling of its real outDir (same filesystem, so renames are
|
|
43
|
+
* atomic), lets Vite/Rollup do 100% of their normal work there untouched,
|
|
44
|
+
* and then — once writeBundle fires — moves each produced file into its
|
|
45
|
+
* real location via fs.renameSync. A reader of the real lib/ tree only ever
|
|
46
|
+
* sees a rename land, never a partial write.
|
|
47
|
+
*/
|
|
48
|
+
import { build, loadConfigFromFile } from "vite";
|
|
49
|
+
import { readdirSync, mkdirSync, mkdtempSync, readdirSync as readDirEntries, renameSync, rmSync } from "node:fs";
|
|
50
|
+
import path from "node:path";
|
|
51
|
+
import { fileURLToPath } from "node:url";
|
|
52
|
+
|
|
53
|
+
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
54
|
+
const coreDir = path.resolve(__dirname, "..");
|
|
55
|
+
|
|
56
|
+
const tempDirsToClean = [];
|
|
57
|
+
|
|
58
|
+
function moveDirContentsAtomically(fromDir, toDir) {
|
|
59
|
+
const entries = readDirEntries(fromDir, { withFileTypes: true });
|
|
60
|
+
for (const entry of entries) {
|
|
61
|
+
const fromPath = path.join(fromDir, entry.name);
|
|
62
|
+
const toPath = path.join(toDir, entry.name);
|
|
63
|
+
if (entry.isDirectory()) {
|
|
64
|
+
moveDirContentsAtomically(fromPath, toPath);
|
|
65
|
+
} else {
|
|
66
|
+
mkdirSync(path.dirname(toPath), { recursive: true });
|
|
67
|
+
renameSync(fromPath, toPath);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
function atomicMovePlugin(realOutDir, tempOutDir) {
|
|
73
|
+
return {
|
|
74
|
+
name: "atomic-move",
|
|
75
|
+
writeBundle() {
|
|
76
|
+
moveDirContentsAtomically(tempOutDir, realOutDir);
|
|
77
|
+
},
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const MAIN_CONFIG = "vite.config.mjs";
|
|
82
|
+
const SUBPATHS_CONFIG = "vite.subpaths.config.mjs";
|
|
83
|
+
|
|
84
|
+
const familyConfigs = readdirSync(coreDir)
|
|
85
|
+
.filter((file) => /^vite\..+\.config\.mjs$/.test(file))
|
|
86
|
+
.filter((file) => file !== MAIN_CONFIG && file !== SUBPATHS_CONFIG)
|
|
87
|
+
.sort();
|
|
88
|
+
|
|
89
|
+
function labelFor(fileName) {
|
|
90
|
+
if (fileName === MAIN_CONFIG) return "core";
|
|
91
|
+
return fileName.replace(/^vite\./, "").replace(/\.config\.mjs$/, "");
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
async function loadUserConfig(fileName) {
|
|
95
|
+
// Load exactly the way `vite build --config <fileName>` would (handles the
|
|
96
|
+
// JSON-import-without-attribute style some of these configs use), rather
|
|
97
|
+
// than a plain Node `import()` which enforces stricter ESM rules.
|
|
98
|
+
const loaded = await loadConfigFromFile({ command: "build", mode: "development" }, path.join(coreDir, fileName), coreDir);
|
|
99
|
+
if (!loaded) {
|
|
100
|
+
throw new Error(`Failed to load vite config: ${fileName}`);
|
|
101
|
+
}
|
|
102
|
+
return loaded.config;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
function startWatcher(name, userConfig) {
|
|
106
|
+
const realOutDir = path.resolve(userConfig.build.outDir);
|
|
107
|
+
const tempOutDir = mkdtempSync(path.join(path.dirname(realOutDir), `.atomic-tmp-${name.replace(/[^a-z0-9-]/gi, "_")}-`));
|
|
108
|
+
tempDirsToClean.push(tempOutDir);
|
|
109
|
+
|
|
110
|
+
return build({
|
|
111
|
+
...userConfig,
|
|
112
|
+
configFile: false,
|
|
113
|
+
plugins: [...(userConfig.plugins ?? []), atomicMovePlugin(realOutDir, tempOutDir)],
|
|
114
|
+
build: {
|
|
115
|
+
...userConfig.build,
|
|
116
|
+
outDir: tempOutDir,
|
|
117
|
+
watch: {},
|
|
118
|
+
},
|
|
119
|
+
}).then((watcher) => {
|
|
120
|
+
const watchers = Array.isArray(watcher) ? watcher : [watcher];
|
|
121
|
+
for (const w of watchers) {
|
|
122
|
+
w.on("event", (event) => {
|
|
123
|
+
if (event.code === "BUNDLE_END") {
|
|
124
|
+
console.log(`[${name}] rebuilt in ${event.duration}ms`);
|
|
125
|
+
event.result?.close?.();
|
|
126
|
+
} else if (event.code === "ERROR") {
|
|
127
|
+
console.error(`[${name}] build error:`, event.error?.message ?? event.error);
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
return watchers;
|
|
132
|
+
});
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function watchConfig(fileName) {
|
|
136
|
+
return startWatcher(labelFor(fileName), await loadUserConfig(fileName));
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
async function watchSubpathsPerFamily() {
|
|
140
|
+
const userConfig = await loadUserConfig(SUBPATHS_CONFIG);
|
|
141
|
+
const entry = userConfig.build.lib.entry;
|
|
142
|
+
|
|
143
|
+
const byFamily = new Map();
|
|
144
|
+
for (const [key, filePath] of Object.entries(entry)) {
|
|
145
|
+
const family = key.split("/")[0];
|
|
146
|
+
if (!byFamily.has(family)) byFamily.set(family, {});
|
|
147
|
+
byFamily.get(family)[key] = filePath;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const results = await Promise.all(
|
|
151
|
+
Array.from(byFamily.entries()).map(([family, familyEntry]) =>
|
|
152
|
+
startWatcher(`subpaths:${family}`, {
|
|
153
|
+
...userConfig,
|
|
154
|
+
build: {
|
|
155
|
+
...userConfig.build,
|
|
156
|
+
lib: {
|
|
157
|
+
...userConfig.build.lib,
|
|
158
|
+
entry: familyEntry,
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
})
|
|
162
|
+
)
|
|
163
|
+
);
|
|
164
|
+
return results.flat();
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
console.log(
|
|
168
|
+
`@sps-woodland/core: watching ${familyConfigs.length + 2} build targets (main, subpaths split per family, ${familyConfigs.length} family CSS configs)...`
|
|
169
|
+
);
|
|
170
|
+
|
|
171
|
+
const allWatchers = (
|
|
172
|
+
await Promise.all([watchConfig(MAIN_CONFIG), watchSubpathsPerFamily(), ...familyConfigs.map(watchConfig)])
|
|
173
|
+
).flat();
|
|
174
|
+
|
|
175
|
+
console.log("@sps-woodland/core: initial builds complete, watching for changes.");
|
|
176
|
+
|
|
177
|
+
function shutdown() {
|
|
178
|
+
for (const w of allWatchers) w.close();
|
|
179
|
+
for (const dir of tempDirsToClean) {
|
|
180
|
+
rmSync(dir, { recursive: true, force: true });
|
|
181
|
+
}
|
|
182
|
+
process.exit(0);
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
process.on("SIGINT", shutdown);
|
|
186
|
+
process.on("SIGTERM", shutdown);
|
|
@@ -6,35 +6,38 @@ import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin";
|
|
|
6
6
|
import { defineConfig } from "vite";
|
|
7
7
|
import pkg from "./package.json" with { type: "json" };
|
|
8
8
|
import { getVanillaExtractPluginProps } from "../../../scripts/vanilla-extract-plugin-props.mjs";
|
|
9
|
+
import { withOutputGlobals } from "../../../scripts/with-output-globals.mjs";
|
|
9
10
|
|
|
10
11
|
const packageVersion = process.env.PREDICTED_VERSION || pkg.version;
|
|
11
12
|
|
|
12
|
-
export default defineConfig(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
13
|
+
export default defineConfig(
|
|
14
|
+
withOutputGlobals({
|
|
15
|
+
plugins: [
|
|
16
|
+
vanillaExtractPlugin(
|
|
17
|
+
getVanillaExtractPluginProps({
|
|
18
|
+
packageName: pkg.name,
|
|
19
|
+
packageVersion,
|
|
20
|
+
})
|
|
21
|
+
),
|
|
22
|
+
],
|
|
23
|
+
build: {
|
|
24
|
+
lib: {
|
|
25
|
+
entry: path.resolve(__dirname, "src/action-bar/index.ts"),
|
|
26
|
+
name: "ActionBar",
|
|
27
|
+
fileName: "index",
|
|
28
|
+
cssFileName: "style",
|
|
29
|
+
},
|
|
30
|
+
outDir: path.resolve(__dirname, "./lib/action-bar"),
|
|
31
|
+
emptyOutDir: false,
|
|
32
|
+
rollupOptions: {
|
|
33
|
+
external: [
|
|
34
|
+
...Object.keys(pkg.peerDependencies || {}),
|
|
35
|
+
/^@sps-woodland\//,
|
|
36
|
+
/^@spscommerce\//,
|
|
37
|
+
/^react/,
|
|
38
|
+
/^react-dom/,
|
|
39
|
+
],
|
|
40
|
+
},
|
|
27
41
|
},
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
rollupOptions: {
|
|
31
|
-
external: [
|
|
32
|
-
...Object.keys(pkg.peerDependencies || {}),
|
|
33
|
-
/^@sps-woodland\//,
|
|
34
|
-
/^@spscommerce\//,
|
|
35
|
-
/^react/,
|
|
36
|
-
/^react-dom/,
|
|
37
|
-
],
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
});
|
|
42
|
+
})
|
|
43
|
+
);
|
|
@@ -6,35 +6,38 @@ import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin";
|
|
|
6
6
|
import { defineConfig } from "vite";
|
|
7
7
|
import pkg from "./package.json" with { type: "json" };
|
|
8
8
|
import { getVanillaExtractPluginProps } from "../../../scripts/vanilla-extract-plugin-props.mjs";
|
|
9
|
+
import { withOutputGlobals } from "../../../scripts/with-output-globals.mjs";
|
|
9
10
|
|
|
10
11
|
const packageVersion = process.env.PREDICTED_VERSION || pkg.version;
|
|
11
12
|
|
|
12
|
-
export default defineConfig(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
13
|
+
export default defineConfig(
|
|
14
|
+
withOutputGlobals({
|
|
15
|
+
plugins: [
|
|
16
|
+
vanillaExtractPlugin(
|
|
17
|
+
getVanillaExtractPluginProps({
|
|
18
|
+
packageName: pkg.name,
|
|
19
|
+
packageVersion,
|
|
20
|
+
})
|
|
21
|
+
),
|
|
22
|
+
],
|
|
23
|
+
build: {
|
|
24
|
+
lib: {
|
|
25
|
+
entry: path.resolve(__dirname, "src/add-to-list/index.ts"),
|
|
26
|
+
name: "AddToList",
|
|
27
|
+
fileName: "index",
|
|
28
|
+
cssFileName: "style",
|
|
29
|
+
},
|
|
30
|
+
outDir: path.resolve(__dirname, "./lib/add-to-list"),
|
|
31
|
+
emptyOutDir: false,
|
|
32
|
+
rollupOptions: {
|
|
33
|
+
external: [
|
|
34
|
+
...Object.keys(pkg.peerDependencies || {}),
|
|
35
|
+
/^@sps-woodland\//,
|
|
36
|
+
/^@spscommerce\//,
|
|
37
|
+
/^react/,
|
|
38
|
+
/^react-dom/,
|
|
39
|
+
],
|
|
40
|
+
},
|
|
27
41
|
},
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
rollupOptions: {
|
|
31
|
-
external: [
|
|
32
|
-
...Object.keys(pkg.peerDependencies || {}),
|
|
33
|
-
/^@sps-woodland\//,
|
|
34
|
-
/^@spscommerce\//,
|
|
35
|
-
/^react/,
|
|
36
|
-
/^react-dom/,
|
|
37
|
-
],
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
});
|
|
42
|
+
})
|
|
43
|
+
);
|
package/vite.buttons.config.mjs
CHANGED
|
@@ -6,36 +6,39 @@ import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin";
|
|
|
6
6
|
import { defineConfig } from "vite";
|
|
7
7
|
import pkg from "./package.json" with { type: "json" };
|
|
8
8
|
import { getVanillaExtractPluginProps } from "../../../scripts/vanilla-extract-plugin-props.mjs";
|
|
9
|
+
import { withOutputGlobals } from "../../../scripts/with-output-globals.mjs";
|
|
9
10
|
|
|
10
11
|
const packageVersion = process.env.PREDICTED_VERSION || pkg.version;
|
|
11
12
|
|
|
12
|
-
export default defineConfig(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
13
|
+
export default defineConfig(
|
|
14
|
+
withOutputGlobals({
|
|
15
|
+
plugins: [
|
|
16
|
+
vanillaExtractPlugin(
|
|
17
|
+
getVanillaExtractPluginProps({
|
|
18
|
+
packageName: pkg.name,
|
|
19
|
+
packageVersion,
|
|
20
|
+
})
|
|
21
|
+
),
|
|
22
|
+
],
|
|
23
|
+
build: {
|
|
24
|
+
lib: {
|
|
25
|
+
entry: path.resolve(__dirname, "src/buttons/index.ts"),
|
|
26
|
+
name: "Buttons",
|
|
27
|
+
fileName: "index",
|
|
28
|
+
cssFileName: "style",
|
|
29
|
+
},
|
|
30
|
+
outDir: path.resolve(__dirname, "./lib/buttons"),
|
|
31
|
+
emptyOutDir: false,
|
|
32
|
+
rollupOptions: {
|
|
33
|
+
external: [
|
|
34
|
+
...Object.keys(pkg.peerDependencies || {}),
|
|
35
|
+
/^@sps-woodland\//,
|
|
36
|
+
/^@spscommerce\//,
|
|
37
|
+
/^@react-aria\//,
|
|
38
|
+
/^react/,
|
|
39
|
+
/^react-dom/,
|
|
40
|
+
],
|
|
41
|
+
},
|
|
27
42
|
},
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
rollupOptions: {
|
|
31
|
-
external: [
|
|
32
|
-
...Object.keys(pkg.peerDependencies || {}),
|
|
33
|
-
/^@sps-woodland\//,
|
|
34
|
-
/^@spscommerce\//,
|
|
35
|
-
/^@react-aria\//,
|
|
36
|
-
/^react/,
|
|
37
|
-
/^react-dom/,
|
|
38
|
-
],
|
|
39
|
-
},
|
|
40
|
-
},
|
|
41
|
-
});
|
|
43
|
+
})
|
|
44
|
+
);
|
package/vite.cards.config.mjs
CHANGED
|
@@ -6,35 +6,38 @@ import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin";
|
|
|
6
6
|
import { defineConfig } from "vite";
|
|
7
7
|
import pkg from "./package.json" with { type: "json" };
|
|
8
8
|
import { getVanillaExtractPluginProps } from "../../../scripts/vanilla-extract-plugin-props.mjs";
|
|
9
|
+
import { withOutputGlobals } from "../../../scripts/with-output-globals.mjs";
|
|
9
10
|
|
|
10
11
|
const packageVersion = process.env.PREDICTED_VERSION || pkg.version;
|
|
11
12
|
|
|
12
|
-
export default defineConfig(
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
13
|
+
export default defineConfig(
|
|
14
|
+
withOutputGlobals({
|
|
15
|
+
plugins: [
|
|
16
|
+
vanillaExtractPlugin(
|
|
17
|
+
getVanillaExtractPluginProps({
|
|
18
|
+
packageName: pkg.name,
|
|
19
|
+
packageVersion,
|
|
20
|
+
})
|
|
21
|
+
),
|
|
22
|
+
],
|
|
23
|
+
build: {
|
|
24
|
+
lib: {
|
|
25
|
+
entry: path.resolve(__dirname, "src/cards/index.ts"),
|
|
26
|
+
name: "Cards",
|
|
27
|
+
fileName: "index",
|
|
28
|
+
cssFileName: "style",
|
|
29
|
+
},
|
|
30
|
+
outDir: path.resolve(__dirname, "./lib/cards"),
|
|
31
|
+
emptyOutDir: false,
|
|
32
|
+
rollupOptions: {
|
|
33
|
+
external: [
|
|
34
|
+
...Object.keys(pkg.peerDependencies || {}),
|
|
35
|
+
/^@sps-woodland\//,
|
|
36
|
+
/^@spscommerce\//,
|
|
37
|
+
/^react/,
|
|
38
|
+
/^react-dom/,
|
|
39
|
+
],
|
|
40
|
+
},
|
|
27
41
|
},
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
rollupOptions: {
|
|
31
|
-
external: [
|
|
32
|
-
...Object.keys(pkg.peerDependencies || {}),
|
|
33
|
-
/^@sps-woodland\//,
|
|
34
|
-
/^@spscommerce\//,
|
|
35
|
-
/^react/,
|
|
36
|
-
/^react-dom/,
|
|
37
|
-
],
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
});
|
|
42
|
+
})
|
|
43
|
+
);
|
package/vite.config.mjs
CHANGED
|
@@ -3,33 +3,34 @@ import { vanillaExtractPlugin } from "@vanilla-extract/vite-plugin";
|
|
|
3
3
|
import { defineConfig } from "vite";
|
|
4
4
|
import { getVanillaExtractPluginProps } from "../../../scripts/vanilla-extract-plugin-props.mjs";
|
|
5
5
|
import pkg from "./package.json";
|
|
6
|
+
import { getPeerDepsExternal } from "../../../scripts/get-peer-deps-external.mjs";
|
|
7
|
+
import { withOutputGlobals } from "../../../scripts/with-output-globals.mjs";
|
|
6
8
|
|
|
7
9
|
const packageVersion = process.env.PREDICTED_VERSION || pkg.version;
|
|
8
10
|
|
|
9
|
-
export default defineConfig(
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
return peerDeps.some((dep) => id === dep || id.startsWith(dep + "/"));
|
|
11
|
+
export default defineConfig(
|
|
12
|
+
withOutputGlobals({
|
|
13
|
+
plugins: [
|
|
14
|
+
vanillaExtractPlugin(
|
|
15
|
+
getVanillaExtractPluginProps({
|
|
16
|
+
packageName: pkg.name,
|
|
17
|
+
packageVersion,
|
|
18
|
+
})
|
|
19
|
+
),
|
|
20
|
+
],
|
|
21
|
+
build: {
|
|
22
|
+
lib: {
|
|
23
|
+
entry: path.resolve(__dirname, "src/index.ts"),
|
|
24
|
+
name: "Core",
|
|
25
|
+
fileName: "index",
|
|
26
|
+
cssFileName: "style",
|
|
27
|
+
},
|
|
28
|
+
outDir: path.resolve(__dirname, "./lib"),
|
|
29
|
+
emptyOutDir: false,
|
|
30
|
+
rollupOptions: {
|
|
31
|
+
// External must match subpath imports like @sps-woodland/core/button
|
|
32
|
+
external: getPeerDepsExternal(pkg),
|
|
32
33
|
},
|
|
33
34
|
},
|
|
34
|
-
}
|
|
35
|
-
|
|
35
|
+
})
|
|
36
|
+
);
|